From 5c41c928a63640c6143f0e13595a7bea8ae443f8 Mon Sep 17 00:00:00 2001 From: Andy Dixon Date: Tue, 23 Jul 2024 16:21:39 +0100 Subject: [PATCH] Initial Commit --- .gitignore | 1 + .idea/.gitignore | 8 + .idea/New folder.iml | 8 + .idea/modules.xml | 8 + .idea/php.xml | 19 + cms/config.php | 10 + cms/core/checkbrand.php | 8 + cms/core/checkpath.php | 64 + cms/core/cleaner.php | 109 + cms/core/createsession.php | 31 + cms/core/fileload.php | 179 ++ cms/core/folderload.php | 111 + cms/core/forgotpassword.php | 35 + cms/core/ftpclear.php | 67 + cms/core/ftpconnect.php | 34 + cms/core/ftpcreate.php | 82 + cms/core/ftpstart.php | 10 + cms/core/ftpvars.php | 8 + cms/core/getpage.php | 11 + cms/core/getpath.php | 25 + cms/core/getsaveusers.php | 98 + cms/core/geturi.php | 14 + cms/core/login.php | 41 + cms/core/logout.php | 14 + cms/core/restore.php | 180 ++ cms/core/save.php | 525 ++++ cms/core/sessionConfiguration.php | 25 + cms/core/upload.php | 120 + cms/core/urldissect.php | 19 + cms/css/main.css | 589 ++++ cms/css/neocms-main.css | 589 ++++ cms/css/neocms-ui.css | 2751 +++++++++++++++++ cms/css/ui.css | 2751 +++++++++++++++++ cms/functions/checkbrand.php | 11 + cms/functions/checkpath.php | 66 + cms/functions/cleaner.php | 111 + cms/functions/createsession.php | 35 + cms/functions/fileload.php | 181 ++ cms/functions/folderload.php | 111 + cms/functions/forgotpassword.php | 35 + cms/functions/ftpclear.php | 67 + cms/functions/ftpconnect.php | 34 + cms/functions/ftpcreate.php | 82 + cms/functions/ftpstart.php | 10 + cms/functions/ftpvars.php | 8 + cms/functions/getpage.php | 13 + cms/functions/getpath.php | 27 + cms/functions/getsaveprefs.php | 35 + cms/functions/getsaveusers.php | 98 + cms/functions/geturi.php | 16 + cms/functions/login.php | 49 + cms/functions/logout.php | 14 + cms/functions/restore.php | 180 ++ cms/functions/save.php | 525 ++++ cms/functions/upload.php | 120 + cms/functions/urldissect.php | 21 + cms/images/apple-touch-icon-precomposed.png | Bin 0 -> 5998 bytes cms/images/embed.png | Bin 0 -> 1637 bytes cms/images/icon.png | Bin 0 -> 4494 bytes cms/images/loading.gif | Bin 0 -> 676 bytes cms/images/neocms_sprite1.png | Bin 0 -> 43854 bytes cms/images/prompt.gif | Bin 0 -> 651 bytes cms/images/uploading.gif | Bin 0 -> 3538 bytes cms/index.php | 77 + cms/js/codemirror/css/csscolors.css | 47 + cms/js/codemirror/css/jscolors.css | 55 + cms/js/codemirror/css/xmlcolors.css | 51 + cms/js/codemirror/js/codemirror.js | 474 +++ cms/js/codemirror/js/editor.js | 1420 +++++++++ cms/js/codemirror/js/highlight.js | 70 + cms/js/codemirror/js/mirrorframe.js | 84 + cms/js/codemirror/js/parsecss.js | 144 + cms/js/codemirror/js/parsedummy.js | 39 + cms/js/codemirror/js/parsehtmlmixed.js | 76 + cms/js/codemirror/js/parsejavascript.js | 385 +++ cms/js/codemirror/js/parsesparql.js | 153 + cms/js/codemirror/js/parsexml.js | 295 ++ cms/js/codemirror/js/select.js | 612 ++++ cms/js/codemirror/js/stringstream.js | 146 + cms/js/codemirror/js/tokenize.js | 59 + cms/js/codemirror/js/tokenizejavascript.js | 205 ++ cms/js/codemirror/js/undo.js | 423 +++ cms/js/codemirror/js/util.js | 157 + cms/js/dash.js | 701 +++++ cms/js/lib/jquery-ui.js | 2564 +++++++++++++++ cms/js/lib/jquery.js | 354 +++ cms/js/main.js | 292 ++ cms/js/neocms.js | 2041 ++++++++++++ cms/js/tiny_mce/langs/en.js | 173 ++ .../tiny_mce/plugins/deflist/editor_plugin.js | 38 + cms/js/tiny_mce/plugins/file/editor_plugin.js | 38 + .../tiny_mce/plugins/images/editor_plugin.js | 38 + .../tiny_mce/plugins/links/editor_plugin.js | 37 + .../tiny_mce/plugins/paste/editor_plugin.js | 1 + cms/js/tiny_mce/plugins/paste/js/pastetext.js | 36 + cms/js/tiny_mce/plugins/paste/js/pasteword.js | 51 + cms/js/tiny_mce/plugins/paste/langs/en_dlg.js | 5 + .../tiny_mce/plugins/tables/editor_plugin.js | 38 + .../tiny_mce/plugins/video/editor_plugin.js | 38 + .../themes/advanced/editor_template.js | 1 + cms/js/tiny_mce/themes/advanced/langs/en.js | 62 + .../tiny_mce/themes/advanced/langs/en_dlg.js | 51 + .../themes/advanced/skins/default/content.css | 80 + .../themes/advanced/skins/default/dialog.css | 414 +++ .../themes/advanced/skins/default/ui.css | 876 ++++++ cms/js/tiny_mce/tiny_mce.js | 1 + cms/js/tiny_mce/utils/validate.js | 220 ++ cms/js/ui.js | 2040 ++++++++++++ cms/login.php | 83 + cms/settings/acct.php | 75 + cms/settings/dashcheck.php | 37 + cms/settings/dashfoot.php | 11 + cms/settings/dashnav.php | 29 + cms/settings/ftpinfo.php | 56 + cms/settings/index.php | 79 + cms/templates/deflist-editor.html | 26 + cms/templates/editor.html | 10 + cms/templates/file-browser.html | 10 + cms/templates/html-editor.html | 12 + cms/templates/image-editor.html | 38 + cms/templates/link-editor.html | 18 + cms/templates/prompt.html | 8 + cms/templates/table-editor.html | 44 + cms/templates/upload.html | 24 + cms/templates/video-editor.html | 15 + index.html | 127 + 126 files changed, 26257 insertions(+) create mode 100644 .gitignore create mode 100644 .idea/.gitignore create mode 100644 .idea/New folder.iml create mode 100644 .idea/modules.xml create mode 100644 .idea/php.xml create mode 100644 cms/config.php create mode 100644 cms/core/checkbrand.php create mode 100644 cms/core/checkpath.php create mode 100644 cms/core/cleaner.php create mode 100644 cms/core/createsession.php create mode 100644 cms/core/fileload.php create mode 100644 cms/core/folderload.php create mode 100644 cms/core/forgotpassword.php create mode 100644 cms/core/ftpclear.php create mode 100644 cms/core/ftpconnect.php create mode 100644 cms/core/ftpcreate.php create mode 100644 cms/core/ftpstart.php create mode 100644 cms/core/ftpvars.php create mode 100644 cms/core/getpage.php create mode 100644 cms/core/getpath.php create mode 100644 cms/core/getsaveusers.php create mode 100644 cms/core/geturi.php create mode 100644 cms/core/login.php create mode 100644 cms/core/logout.php create mode 100644 cms/core/restore.php create mode 100644 cms/core/save.php create mode 100644 cms/core/sessionConfiguration.php create mode 100644 cms/core/upload.php create mode 100644 cms/core/urldissect.php create mode 100644 cms/css/main.css create mode 100644 cms/css/neocms-main.css create mode 100644 cms/css/neocms-ui.css create mode 100644 cms/css/ui.css create mode 100644 cms/functions/checkbrand.php create mode 100644 cms/functions/checkpath.php create mode 100644 cms/functions/cleaner.php create mode 100644 cms/functions/createsession.php create mode 100644 cms/functions/fileload.php create mode 100644 cms/functions/folderload.php create mode 100644 cms/functions/forgotpassword.php create mode 100644 cms/functions/ftpclear.php create mode 100644 cms/functions/ftpconnect.php create mode 100644 cms/functions/ftpcreate.php create mode 100644 cms/functions/ftpstart.php create mode 100644 cms/functions/ftpvars.php create mode 100644 cms/functions/getpage.php create mode 100644 cms/functions/getpath.php create mode 100644 cms/functions/getsaveprefs.php create mode 100644 cms/functions/getsaveusers.php create mode 100644 cms/functions/geturi.php create mode 100644 cms/functions/login.php create mode 100644 cms/functions/logout.php create mode 100644 cms/functions/restore.php create mode 100644 cms/functions/save.php create mode 100644 cms/functions/upload.php create mode 100644 cms/functions/urldissect.php create mode 100644 cms/images/apple-touch-icon-precomposed.png create mode 100644 cms/images/embed.png create mode 100644 cms/images/icon.png create mode 100644 cms/images/loading.gif create mode 100644 cms/images/neocms_sprite1.png create mode 100644 cms/images/prompt.gif create mode 100644 cms/images/uploading.gif create mode 100644 cms/index.php create mode 100644 cms/js/codemirror/css/csscolors.css create mode 100644 cms/js/codemirror/css/jscolors.css create mode 100644 cms/js/codemirror/css/xmlcolors.css create mode 100644 cms/js/codemirror/js/codemirror.js create mode 100644 cms/js/codemirror/js/editor.js create mode 100644 cms/js/codemirror/js/highlight.js create mode 100644 cms/js/codemirror/js/mirrorframe.js create mode 100644 cms/js/codemirror/js/parsecss.js create mode 100644 cms/js/codemirror/js/parsedummy.js create mode 100644 cms/js/codemirror/js/parsehtmlmixed.js create mode 100644 cms/js/codemirror/js/parsejavascript.js create mode 100644 cms/js/codemirror/js/parsesparql.js create mode 100644 cms/js/codemirror/js/parsexml.js create mode 100644 cms/js/codemirror/js/select.js create mode 100644 cms/js/codemirror/js/stringstream.js create mode 100644 cms/js/codemirror/js/tokenize.js create mode 100644 cms/js/codemirror/js/tokenizejavascript.js create mode 100644 cms/js/codemirror/js/undo.js create mode 100644 cms/js/codemirror/js/util.js create mode 100644 cms/js/dash.js create mode 100644 cms/js/lib/jquery-ui.js create mode 100644 cms/js/lib/jquery.js create mode 100644 cms/js/main.js create mode 100644 cms/js/neocms.js create mode 100644 cms/js/tiny_mce/langs/en.js create mode 100644 cms/js/tiny_mce/plugins/deflist/editor_plugin.js create mode 100644 cms/js/tiny_mce/plugins/file/editor_plugin.js create mode 100644 cms/js/tiny_mce/plugins/images/editor_plugin.js create mode 100644 cms/js/tiny_mce/plugins/links/editor_plugin.js create mode 100644 cms/js/tiny_mce/plugins/paste/editor_plugin.js create mode 100644 cms/js/tiny_mce/plugins/paste/js/pastetext.js create mode 100644 cms/js/tiny_mce/plugins/paste/js/pasteword.js create mode 100644 cms/js/tiny_mce/plugins/paste/langs/en_dlg.js create mode 100644 cms/js/tiny_mce/plugins/tables/editor_plugin.js create mode 100644 cms/js/tiny_mce/plugins/video/editor_plugin.js create mode 100644 cms/js/tiny_mce/themes/advanced/editor_template.js create mode 100644 cms/js/tiny_mce/themes/advanced/langs/en.js create mode 100644 cms/js/tiny_mce/themes/advanced/langs/en_dlg.js create mode 100644 cms/js/tiny_mce/themes/advanced/skins/default/content.css create mode 100644 cms/js/tiny_mce/themes/advanced/skins/default/dialog.css create mode 100644 cms/js/tiny_mce/themes/advanced/skins/default/ui.css create mode 100644 cms/js/tiny_mce/tiny_mce.js create mode 100644 cms/js/tiny_mce/utils/validate.js create mode 100644 cms/js/ui.js create mode 100644 cms/login.php create mode 100644 cms/settings/acct.php create mode 100644 cms/settings/dashcheck.php create mode 100644 cms/settings/dashfoot.php create mode 100644 cms/settings/dashnav.php create mode 100644 cms/settings/ftpinfo.php create mode 100644 cms/settings/index.php create mode 100644 cms/templates/deflist-editor.html create mode 100644 cms/templates/editor.html create mode 100644 cms/templates/file-browser.html create mode 100644 cms/templates/html-editor.html create mode 100644 cms/templates/image-editor.html create mode 100644 cms/templates/link-editor.html create mode 100644 cms/templates/prompt.html create mode 100644 cms/templates/table-editor.html create mode 100644 cms/templates/upload.html create mode 100644 cms/templates/video-editor.html create mode 100644 index.html diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9c71b3d --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/cms/.idea/ diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..13566b8 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/New folder.iml b/.idea/New folder.iml new file mode 100644 index 0000000..c956989 --- /dev/null +++ b/.idea/New folder.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..ed380a0 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/php.xml b/.idea/php.xml new file mode 100644 index 0000000..f324872 --- /dev/null +++ b/.idea/php.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/cms/config.php b/cms/config.php new file mode 100644 index 0000000..ad7bfff --- /dev/null +++ b/cms/config.php @@ -0,0 +1,10 @@ + ["password"=>"password","isAdmin"=>1], + "user" => ["password"=>"password","isAdmin"=>0], +]; diff --git a/cms/core/checkbrand.php b/cms/core/checkbrand.php new file mode 100644 index 0000000..65a30da --- /dev/null +++ b/cms/core/checkbrand.php @@ -0,0 +1,8 @@ +/'; + $aspreg = '/<%(.|\n|\r)+?\%>/'; + $jsreg = '/]*>\s*[^<](.|\n)*?<\/\s*script>/'; + $prereg = '/]*>(.|\n)*?<\/\s*pre>/'; + $codereg = '/]*>(.|\n)*?<\/\s*code>/'; + $cssreg = '/]*>(.|\n)*?<\/\s*style>/'; + + $stufflen = strlen($stuff); + + try { + + //grab php + preg_match_all($phpreg, $stuff, $code['PHP']); + $stuff = preg_replace($phpreg, '----||PHPGO3SHERE||----', $stuff); + + //grab asp + preg_match_all($aspreg, $stuff, $code['ASP']); + $stuff = preg_replace($aspreg, '----||ASPGO3SHERE||----', $stuff); + + //grab on-page js + preg_match_all($jsreg, $stuff, $code['JS']); + $stuff = preg_replace($jsreg, '----||JSGO3SHERE||----', $stuff); + + //grab on-page CSS + preg_match_all($cssreg, $stuff, $code['CSS']); + $stuff = preg_replace($cssreg, '----||CSSGO3SHERE||----', $stuff); + + } catch (Exception $e) { + + $message = 'Error: There may be too much on page Javascript or CSS. Please try moving them to external files and/or validating your HTML.'; + output(); + + } + + $stuff = stripslashes($stuff); + $stuff = trim($stuff); + + //grab pre + preg_match_all($prereg, $stuff, $code['PRE']); + $stuff = preg_replace($prereg, '----||PREGO3SHERE||----', $stuff); + + //grab code + preg_match_all($codereg, $stuff, $code['CODE']); + $stuff = preg_replace($codereg, '----||CODEGO3SHERE||----', $stuff); + + function lower($matches) { + + } + + //fix uppercase tags + $stuff = preg_replace_callback('/<(\/|)[A-Z]+[A-Z0-9]*\b/', function($matches){return strtolower($matches[0]);}, $stuff); + + //fix attribute quotes + $stuff = preg_replace('/(<(?!meta)[^>]*\s[A-Za-z]+=)([^>\'\"\s]+)(\s*[^>]*)/', '$1"$2"$3', $stuff); + + // fix self-closing tags + if (preg_match('/XHTML/', $doctype)) { + $stuff = preg_replace("/(%]*[^\/%])(>)/i", "$1/>", $stuff); + $stuff = preg_replace("//", "
", $stuff); + } + + $nstuff = htmlentities($stuff, ENT_QUOTES, $encode); + if ($nstuff == '') $nstuff = htmlentities($stuff, ENT_QUOTES, 'ISO-8859-15'); + $stuff = $nstuff; + + $stuff = str_replace("<", "<", $stuff); + $stuff = str_replace(">", ">", $stuff); + $stuff = str_replace("&", '&', $stuff); + $stuff = str_replace("'", "'", $stuff); + $stuff = str_replace(""", '"', $stuff); + + // remove TinyMCE stuff + preg_match_all('/(?:<[^>]*)(_mce_[^=]+=(?:\"|\'|)[^\"]*(?:\"|\'|)\s*)/', $stuff, $mces); + foreach ($mces[1] as $mce) { + $stuff = str_replace($mce, "", $stuff); + } + + // add back original code + + $replace = array('CODE', 'PRE', 'CSS', 'JS', 'ASP', 'PHP'); + + foreach ($replace as $r) { + $rreg = '/\-\-\-\-\|\|' . $r . 'GO3SHERE\|\|\-\-\-\-/'; + $c = 0; + + preg_match_all($rreg, $stuff, $newcode); + foreach ($newcode[0] as $ncode) { + $stuff = preg_replace($rreg, $code[$r][0][$c], $stuff, 1); + $c++; + } + $c = 0; + + } + + // remove extra line breaks + $stuff = preg_replace("/\r\n/", "\n", $stuff); + + if ($stuff != '' || $stufflen == 0) return $stuff; + else $message = 'Error: Some characters couldn’t be recognized. Try switching to UTF-8 encoding and be sure all special characters are properly encoded.'; + +} diff --git a/cms/core/createsession.php b/cms/core/createsession.php new file mode 100644 index 0000000..d6c73cf --- /dev/null +++ b/cms/core/createsession.php @@ -0,0 +1,31 @@ +read())) { + + if (!preg_match($neocmspath, $path)) $entries[] = $entry; + + } + + $dir->close(); + + foreach ($entries as $entry) { + + $fullname = $path . $entry; + $pathname = str_replace('../..', '', $path); + + $exFolders = preg_replace('/,\s*/', '/|', $_SESSION['neoCMSExFolders']); + $exFolders = str_replace('-', '\-', $exFolders); + $exFolders = str_replace('.', '\.', $exFolders); + $exFolders = '/' . str_replace('/', '\/', $exFolders) . '\//'; + + if ($entry != '.' && $entry != '..' && is_dir($fullname) && is_readable($fullname) && (!preg_match($exFolders, $fullname) || $_SESSION['neoCMSExFolders'] == '')) findfiles($fullname, $pattern); + elseif ($entry != '.' && $entry != '..' && is_file($fullname) && preg_match($pattern, $entry)) { + + if (!in_array($pathname, $matches)) { + + if (preg_match('/\.html|\.htm|\.php|\.cfm|\.phtml|\.shtml|\.asp/', $fullname)) { + + $content = file_get_contents($fullname); + + if (checkContent($content)) $matches[] = $fullname; + + } else $matches[] = $fullname; + + } + + } + + } + + } + + function checkContent($content) + { + + global $type; + + if (stristr($content, '[^<]+ 0) { + + foreach ($matches as $match) { + + $fname = str_replace('../../', '', $match); + $flink = siteURL() . $fname; + + if (preg_match('/\.bmp|\.gif|\.jpeg|\.jpg|\.png/i', $fname)) { + + if (!strstr($imghtml, 'neoCMSImgUL')) $imghtml = '
    '; + + if (($_SESSION['neoCMSImagePath'] == null || $_SESSION['neoCMSImagePath'] == '') || strstr($fname, $_SESSION['neoCMSImagePath'])) $imghtml = str_replace('', '
  • ' . $fname . ' Thumbnail

    ' . $fname . '

  • ', $imghtml); + + } elseif (preg_match('/\.html|\.htm|\.php|\.phtml|\.cfm|\.shtml|\.asp/i', $fname)) { + + if (!strstr($pagehtml, 'neoCMSPagesUL')) $pagehtml = '
      '; + + $pagehtml = str_replace('', '
    • ' . $fname . '
    • ', $pagehtml); + + } else { + + if (!strstr($filehtml, 'neoCMSFileUL')) $filehtml = '
        '; + + if (($_SESSION['neoCMSFilePath'] == null || $_SESSION['neoCMSFilePath'] == '') || strstr($fname, $_SESSION['neoCMSFilePath'])) $filehtml = str_replace('', '
      • ' . $fname . '
      • ', $filehtml); + + } + + } + + $matches = $imghtml . $pagehtml . $filehtml; + + $script = ""; + echo $script; + + } else { + + $script = ''; + echo $script; + + } + + $endscript = ""; + echo $endscript; + + } + + } + +} diff --git a/cms/core/folderload.php b/cms/core/folderload.php new file mode 100644 index 0000000..7530056 --- /dev/null +++ b/cms/core/folderload.php @@ -0,0 +1,111 @@ +read())) { + + if (!preg_match('/(\/neocms\-js\/|\/neocms\-images\/)/', $path)) $entries[] = $entry; + + } + + $dir->close(); + + foreach ($entries as $entry) { + + $fullname = $path . $entry; + $pathname = str_replace('../..', '', $path); + + $exFolders = preg_replace('/,\s*/', '|', $_SESSION['neoCMSExFolders']); + $exFolders = str_replace('-', '\-', $exFolders); + $exFolders = str_replace('.', '\.', $exFolders); + $exFolders = '/' . str_replace('/', '\/', $exFolders) . '/'; + + if ($entry != '.' && $entry != '..' && is_dir($fullname)) { + + if (preg_match($pathpatt, $path) && !in_array($pathname, $matches) && is_writable($path)) $matches[] = $pathname; + if (!preg_match($exFolders, $fullname) || $_SESSION['neoCMSExFolders'] == '') findfiles($fullname, $pattern, $pathpatt); + + } elseif (($entry == '.' || $entry == '..') && is_dir($fullname)) { + + if (preg_match($pathpatt, $path) && !in_array($pathname, $matches) && is_writable($path)) $matches[] = $pathname; + + } elseif (is_file($fullname) && preg_match($pattern, $entry)) { + + if (!in_array($pathname, $matches) && is_writable($path)) $matches[] = $pathname; + + } + + } + + } + + findfiles("../../$pathdefault", $pattern, $pathpatt); + + if (sizeof($matches) > 0) { + + foreach ($matches as $match) { + + $script = ''; + echo $script; + + } + + } else { + $script = ''; + echo $script; + } + + $endscript = ''; + echo $endscript; + + } + + } + +} + +?> \ No newline at end of file diff --git a/cms/core/forgotpassword.php b/cms/core/forgotpassword.php new file mode 100644 index 0000000..d9e93eb --- /dev/null +++ b/cms/core/forgotpassword.php @@ -0,0 +1,35 @@ +window.top.window.forgotReset("' . $getmessage . '");'; + echo $script; + + } +} + +?> \ No newline at end of file diff --git a/cms/core/ftpclear.php b/cms/core/ftpclear.php new file mode 100644 index 0000000..52a830e --- /dev/null +++ b/cms/core/ftpclear.php @@ -0,0 +1,67 @@ +'; + + $fftp = ''; + + include_once('ftpvars.php'); + include_once('ftpconnect.php'); + + ftpconnect(); + + if ($ftpconn) { + + $ftpdoc = tmpfile(); + if (!$ftpdoc) { + $ftpdocp = tempnam(dirname(__FILE__) . '/../settings/tmp', 'Ftpdoc'); + chmod($ftpdocp, 0777); + $ftpdoc = fopen($ftpdocp, 'w+'); + } + + fwrite($ftpdoc, $ftpvars); + rewind($ftpdoc); + + $path = urldissect($_SERVER['SCRIPT_NAME'], false, 1); + + $remotefile = $ftpwd . $path . 'ftpvars.php'; + + if (ftp_fput($ftpconn, $remotefile, $ftpdoc, FTP_BINARY)) { + + $getmessage = "Your FTP information has been successfully cleared."; + $savescript = ''; + echo $savescript; + + } else { + $getmessage = 'Error: neocms could not find this page: ' . $remotefile . ''; + $savescript = ''; + echo $savescript; + } + + fclose($ftpdoc); + if (isset($ftpdocp)) unlink($ftpdocp); + } + + echo ''; + + } + +} + +?> \ No newline at end of file diff --git a/cms/core/ftpconnect.php b/cms/core/ftpconnect.php new file mode 100644 index 0000000..9c9c30d --- /dev/null +++ b/cms/core/ftpconnect.php @@ -0,0 +1,34 @@ +Error: FTP is not enabled for your install of PHP. More info here."; + $savescript = ''; + echo $savescript; + + } + + } + +} + +?> \ No newline at end of file diff --git a/cms/core/ftpcreate.php b/cms/core/ftpcreate.php new file mode 100644 index 0000000..6240809 --- /dev/null +++ b/cms/core/ftpcreate.php @@ -0,0 +1,82 @@ +'; + + include_once('ftpconnect.php'); + ftpconnect(); + + if ($ftpconn) { + + $ftpdoc = tmpfile(); + if (!$ftpdoc) { + $ftpdocp = tempnam(dirname(__FILE__) . '/../settings/tmp', 'Ftpdoc'); + chmod($ftpdocp, 0777); + $ftpdoc = fopen($ftpdocp, 'w+'); + } + + fwrite($ftpdoc, $ftpvars); + rewind($ftpdoc); + + $path = urldissect($_SERVER['SCRIPT_NAME'], false, 1); + + $remotefile = $ftpwd . $path . 'ftpvars.php'; + + if (ftp_fput($ftpconn, $remotefile, $ftpdoc, FTP_BINARY)) { + + $getmessage = "Your FTP information was successfully saved."; + $savescript = ''; + echo $savescript; + + } else { + $getmessage = "Error: There is an error in your FTP credentials. Please try entering them again."; + $savescript = ''; + echo $savescript; + } + + fclose($ftpdoc); + if (isset($ftpdocp)) unlink($ftpdocp); + } + + echo ''; + + } else { + + $getmessage = 'Error: All fields are required.'; + $savescript = ''; + echo $savescript; + + echo ''; + + } + + } + +} + +?> \ No newline at end of file diff --git a/cms/core/ftpstart.php b/cms/core/ftpstart.php new file mode 100644 index 0000000..61acbcb --- /dev/null +++ b/cms/core/ftpstart.php @@ -0,0 +1,10 @@ + \ No newline at end of file diff --git a/cms/core/ftpvars.php b/cms/core/ftpvars.php new file mode 100644 index 0000000..f7af05b --- /dev/null +++ b/cms/core/ftpvars.php @@ -0,0 +1,8 @@ + \ No newline at end of file diff --git a/cms/core/getpage.php b/cms/core/getpage.php new file mode 100644 index 0000000..b01b544 --- /dev/null +++ b/cms/core/getpage.php @@ -0,0 +1,11 @@ + $val) { + + if (strstr($key, '-A')) $admin[str_replace('-A', '', $key)] = $val; + elseif (!strstr($key, 'neoCMSSess') && !strstr($key, 'neoCMSUserMessage')) { + + $num = explode('-', $key); + $users[$num[1]][$num[0]] = $val; + + } + + } + + $adminscript = ''; + echo $adminscript; + + foreach ($users as $user) { + + $userscript = ''; + echo $userscript; + + } + + if ($_GET['neoCMSUserMessage'] != '0') { + + $m = $_GET['neoCMSUserMessage']; + + if ($m == '1') $getmessage = "Your account settings were successfully saved."; + elseif ($m == '2') $getmessage = "Your new account has been successfully created."; + elseif ($m == '3') $getmessage = "Error: This account has already been created."; + elseif ($m == '4') $getmessage = "Account successfully deleted."; + elseif ($m == '5') $getmessage = "Error: There was an error deleting this account."; + else $getmessage = "Error: There was an error saving."; + + $savescript = ''; + echo $savescript; + + $_SESSION['neoCMSUserid'] = $admin['neoCMSUsername']; + } + + echo ''; + } + } +} + +?> \ No newline at end of file diff --git a/cms/core/geturi.php b/cms/core/geturi.php new file mode 100644 index 0000000..89692a9 --- /dev/null +++ b/cms/core/geturi.php @@ -0,0 +1,14 @@ +window.top.window.location="../";'; + echo $script; + } else { + $script = ''; + echo $script; + } +} + +} else { + + $script = ''; + echo $script; + +} diff --git a/cms/core/logout.php b/cms/core/logout.php new file mode 100644 index 0000000..a4f9618 --- /dev/null +++ b/cms/core/logout.php @@ -0,0 +1,14 @@ + \ No newline at end of file diff --git a/cms/core/restore.php b/cms/core/restore.php new file mode 100644 index 0000000..f8709fb --- /dev/null +++ b/cms/core/restore.php @@ -0,0 +1,180 @@ +Error: There was an error restoring your page. Please try again.'; + + if (@file_exists($pageurl)) { + + function loadfile($url, $incpath, $inc) + { + + global $message, $pagepath; + + // read the file + + $doc = fopen($url, "r"); + $content = stream_get_contents($doc); + fclose($doc); + + $reginclude = '/(?:include\b|include_once\b|require\b|require_once\b)(?:\s*\(*[^;\?>]*)(?:\"|\')([^\"\'<>]*)(?:(\"|\')\)*(;|[\s\t\r\n]*\?>))/i'; // php include regexp + if (!preg_match($reginclude, $content)) $reginclude = '/(?:)/i'; // SSI regexp + + // read the backup + $pagename = (strstr($url, $_SERVER['DOCUMENT_ROOT'])) ? explode($_SERVER['DOCUMENT_ROOT'], $url) : explode('../../', $url); + $pagename = trim($pagename[1], '/'); + $pagename = str_ireplace('/', '-', $pagename); + + $pageext = explode('.', $pagename); + $pagename = preg_replace('/(\.php|\.asp|\.html|\.htm|\.phtml|\.shtml|\.cfm)/', '', $pagename); + $backup = dirname(__FILE__) . '/../backups/' . $pagename . '_Bak.' . $pageext[1]; + + if (@file_exists($backup)) { + + $backdoc = fopen($backup, "r"); + $backcontent = stream_get_contents($backdoc); + + fclose($backdoc); + + echo "File Found: $backup\n\n"; + + editfile($content, $backcontent, $url, $incpath, $inc); + + } + + if (preg_match($reginclude, $content)) { + + preg_match_all($reginclude, $content, $includes); + + foreach ($includes[1] as &$value) { + + if (@file_exists($_SERVER['DOCUMENT_ROOT'] . $value) && $value != '') { + + $incfile = $_SERVER['DOCUMENT_ROOT'] . $value; + $incpath = false; + + } elseif (!stristr($value, 'http://')) { + + $incfile = "$pagepath/$value"; + + if ($incpath) { + + $incpathreg = preg_replace('/\//', '\/', $incpath); + $incpathreg = '/(^' . $incpathreg . '\/|\/' . $incpathreg . '\/)/'; + + $incorigpath = preg_replace($incpathreg, '', $value, 1); + + $newinc = "$pagepath/$incpath/$incorigpath"; + + $incfile = (@file_exists($newinc)) ? $newinc : $incfile; + + $incpatharr = explode('/', $incorigpath); + array_pop($incpatharr); + $incpath = (sizeof($incpatharr) > 0) ? $incpath . implode('/', $incpatharr) : false; + + } else { + + $incpatharr = explode('/', $value); + array_pop($incpatharr); + $incpath = (sizeof($incpatharr) > 0) ? $incpath . implode('/', $incpatharr) : false; + + } + + } else $incpath = false; + + if (!preg_match('/\/$/', $incfile)) loadfile($incfile, $incpath, true); + + } + + } + } + + function editfile($content, $backcontent, $url, $incpath, $inc) + { + + global $ftpconn, $ftpwd; + + if ($content != $backcontent && ((!stristr($content, '[^<]+Error: neocms could not find this page: ' . $remotefile . ''; + + fclose($restdoc); + if (isset($restdocp)) unlink($restdocp); + + } elseif (is_writable($url)) { + //restores file + $restdoc = fopen($url, "w"); + fputs($restdoc, $backcontent); + fclose($restdoc); + } else $message = "Error: You do not have permission to edit this page. Try saving your FTP info here."; + + } + + } + + loadfile($pageurl, false, false); + + $message = 'Your page was successfully restored.'; + $script = ''; + echo $script; + + } else { + $message = 'Error: neocms could not find this page: ' . $url . ''; + $script = ''; + echo $script; + } + + if ($ftpconn) ftp_close($ftpconn); + + } +} + +?> \ No newline at end of file diff --git a/cms/core/save.php b/cms/core/save.php new file mode 100644 index 0000000..5e7676a --- /dev/null +++ b/cms/core/save.php @@ -0,0 +1,525 @@ + $post) { + + $post = thecleaner($post); + if (preg_match("/^edit/", $key)) $edit[$key] = $post; + + } + + } + + function loadfile($url, $incpath, $f) + { + + global $message, $includes, $pagepath, $ftpconn, $ftpwd, $doctype, $encode, $edit; + + $ssi = false; + + $pagename = (strstr($url, $_SERVER['DOCUMENT_ROOT'])) ? explode($_SERVER['DOCUMENT_ROOT'], $url) : explode('../../', $url); + $pagename = trim($pagename[1], '/'); + $pagename = str_ireplace('/', '-', $pagename); + $pagefile = $pagename; + + if (@file_exists($url)) { + + // read the file + $doc = fopen($url, "r"); + $content = stream_get_contents($doc); + fclose($doc); + + if ((!stristr($content, '[^<]+]*>/', $content)) { + preg_match_all('/]*>/', $content, $dtarr); + $doctype = $dtarr[0][0]; + } + if (preg_match('/(?:]*charset=\"*)([^\"<]+)/', $stuff)) { + preg_match_all($charreg, $stuff, $enc); + $encode = $enc[1][0]; + } + + if ($f) cleanpost(); + + $elereg = '/<[^>]*class=(?:\"|\'|)[^>]*(\bneocms\b|\bneocmsRepeatArea\b)[^>]*?(?:\"|\'|)[^>]*>/'; + $reginclude = '/(?:include\b|include_once\b|require\b|require_once\b)(?:\s*\(*[^;\?>]*)(?:\"|\')([^\"\'<>]*)(?:(\"|\')\)*(;|[\s\t\r\n]*\?>))/i'; // php include regexp + if (!preg_match($reginclude, $content)) $reginclude = '/(?:)/i'; // SSI regexp + + // create a backup + $pageext = explode('.', $pagename); + $pagename = preg_replace('/(\.php|\.asp|\.html|\.htm|\.phtml|\.shtml|\.cfm)/', '', $pagename); + $backup = dirname(__FILE__) . '/../backups/' . $pagename . '_Bak.' . $pageext[1]; + + if ($ftpconn) { + + $backdoc = tmpfile(); + if (!$backdoc) { + $backdocp = tempnam(dirname(__FILE__) . '/../settings/tmp', 'Back'); + chmod($backdocp, 0777); + $backdoc = fopen($backdocp, 'w+'); + } + + fwrite($backdoc, $content); + rewind($backdoc); + + $path = urldissect($_SERVER['SCRIPT_NAME'], false, 2); + + $remotefile = $ftpwd . $path . 'backups/' . $pagename . '_Bak.' . $pageext[1]; + + echo "Backup File: $remotefile\n\n"; + + if (ftp_fput($ftpconn, $remotefile, $backdoc, FTP_BINARY)) echo "Uploaded Backup: $remotefile!\n\n"; + else $message = 'Error: neocms failed creating backup for: ' . $remotefile . ''; + + fclose($backdoc); + if (isset($backdocp)) unlink($backdocp); + + } elseif (is_writable($url)) { + + $backdoc = fopen($backup, "w+"); + fwrite($backdoc, $content); + fclose($backdoc); + + } else $message = 'Error: You do not have permission to edit this page: ' . $pagefile . ". Try saving your FTP info here."; + + // clean up content + + if (preg_match($reginclude, $content)) { + + preg_match_all($reginclude, $content, $includes[$url]); + + $incArr = preg_split($reginclude, $content); + $incfiles = $includes[$url][1]; + $neoCon = array(); + + foreach ($incArr as $k => $v) { + + $docroot = $_SERVER['DOCUMENT_ROOT']; + + if (@file_exists($docroot . $incfiles[$k]) && $incfiles[$k] != '') { + + $neoCon[$k] = $v; + + $incfile = $docroot . $incfiles[$k]; + $incpath = false; + + } elseif (!stristr($incfiles[$k], 'http://')) { + + $neoCon[$k] = $v; + + $incfile = "$pagepath/$incfiles[$k]"; + + if ($incpath) { + + $incpathreg = str_replace('/', '\/', $incpath); + $incpathreg = '/(^' . $incpathreg . '\/|\/' . $incpathreg . '\/)/'; + + $incorigpath = preg_replace($incpathreg, '', $incfiles[$k], 1); + + $newinc = "$pagepath/$incpath/$incorigpath"; + + $incfile = (@file_exists($newinc)) ? $newinc : $incfile; + + $incpatharr = explode('/', $incorigpath); + array_pop($incpatharr); + $incpath = (sizeof($incpatharr) > 0) ? $incpath . implode('/', $incpatharr) : false; + + } else { + + $incpatharr = explode('/', $incfiles[$k]); + array_pop($incpatharr); + $incpath = (sizeof($incpatharr) > 0) ? $incpath . implode('/', $incpatharr) : false; + + } + + } else $incpath = false; + + if (!preg_match('/\/$/', $incfile)) $neoCon[$incfile] = loadfile($incfile, $incpath, false); + + } + + return $neoCon; + + } else return $content; + } + } else return false; + + } + + function output() + { + + global $message; + + $script = ''; + echo $script; + + } + + function conArray($content) + { + + $conArray = false; + + foreach ($content as $con) { + + if (is_array($con)) $conArray = true; + + } + + return conArray; + + } + + function makeEdits($conpost) + { + + global $edit, $eles, $inc, $count; + + $commreg = '//'; + + preg_match_all($commreg, $conpost, $comments); + + $conpost = preg_replace($commreg, '', $conpost); + + $elereg = '/<[^>]*class\s*=\s*(?:\"|\'|)[^\"|\']*(\bneocms\b|\bneocmsRepeatArea\b)[^\"|\'|=]*?(?:\"|\'|)[^>]*>/'; + + preg_match_all($elereg, $conpost, $neocmseles); + + if ($neocmseles[0]) { + + $newsplice = ''; + + foreach ($neocmseles[0] as $neocmsele) { + + $splice = explode($neocmsele, $conpost, 2); + + $newsplice = $splice[0]; + + $post = $splice[1]; + + $rest = ''; + + preg_match_all("/^<([^>\s]*)\b/i", $neocmsele, $eleTag); + + $eleTag = $eleTag[1][0]; + + if (stristr($eleTag, 'img')) { + + if (isset($edit["editImg$count"])) { + + $editStr = array(); + + $editIncom = $edit["editImg$count"]; + $editIncom = explode(',', $editIncom); + foreach ($editIncom as $eikey => $eipost) { + $eipost = explode('::', $eipost); + $editStr[$eipost[0]] = $eipost[1]; + } + + $editContent = ''; + + if (isset($editStr['link']) && $editStr['link'] != '') { + + if (preg_match('/(]*>)$/', $newsplice)) { + + preg_match_all('/(]*href=(?:\"|\'))([^\"\s]*)((?:\"|\')[^>]*>)$/', $newsplice, $lastlink); + $newlink = $lastlink[1][0] . $editStr['link']; + if ($editStr['rel'] != '') $newlink .= '" rel="' . $editStr['rel']; + $newlink .= $lastlink[3][0]; + + $newsplice = preg_replace('/(]*>)$/', "$newlink", $newsplice); + + } else { + + $newsplice .= ']*>)$/', $newsplice)) $newsplice = preg_replace('/(]*>)$/', '', $newsplice); + if (preg_match('/^(<\/a>)/', $post)) $post = preg_replace('/^(<\/a>)/', '', $post); + + } + + $editContent .= '' . $editStr['alt'] . ']*>/i'; + + preg_match_all($eleTagReg, $post, $tags); + + $contents = preg_split($eleTagReg, $post); + + $track = 1; + + foreach ($tags[0] as $tag) { + + if (strpos($tag, ' 1) { + + foreach ($tags[0] as $tag) { + + if (isset($edit["editVid$count"])) $rest .= $contents[0]; + else $rest .= $tag . $contents[0]; + + array_shift($contents); + + } + + } else { + + if (isset($edit["editVid$count"])) $rest = $contents[0]; + else $rest = $tags[0][0] . $contents[0]; + + } + + } + + $neocmsele = preg_replace('/neocms\b|neocmsRepeatArea\b/', '$0--D0n3--', $neocmsele); + + if (isset($edit["edit$count"])) $newsplice .= $neocmsele . "\n" . $edit["edit$count"] . "\n" . $rest; + elseif (isset($edit["editImg$count"]) && stristr($eleTag, 'img')) $newsplice .= $post; + elseif (isset($edit["editVid$count"]) && (stristr($eleTag, 'embed') || stristr($eleTag, 'object'))) $newsplice .= "\n" . $edit["editVid$count"] . "\n" . $rest; + elseif (sizeof($splice) <= 1) $newsplice .= $post; + else $newsplice .= $neocmsele . $post; + + $conpost = $newsplice; + + $count++; + + $rest = ''; + } + + $newsplice = preg_replace('/--D0n3--/', '', $newsplice); + + } else $newsplice = $conpost; + + foreach ($comments[0] as $com) { + + $newsplice = preg_replace('//', $com, $newsplice, 1); + + } + + return $newsplice; + + } + + function editFile($content, $url) + { + + global $message, $includes, $edit, $inc; + + $fileedits = array(); + + if (is_array($content)) { + + foreach ($content as $conkey => $conpost) { + + if (is_array($conpost)) $content[$conkey] = editFile($conpost, $conkey); + else $content[$conkey] = makeEdits($conpost); + + } + + foreach ($content as $ckey => $cpost) { + + if (preg_match('/^(\d+)$/', $ckey)) { + + if (isset($includes[$url][0][$inc])) $fileedits[$url] .= $cpost . $includes[$url][0][$inc]; + else $fileedits[$url] .= $cpost; + $inc++; + } else $fileedits["$ckey"] = $cpost; + + } + } else $fileedits[$url] = makeEdits($content); + + $inc = 0; + + return $fileedits; + + } + + function cleanFilecon($files) + { + + global $filecon; + + foreach ($files as $fkey => $fpost) { + + if (is_array($fpost)) cleanFilecon($fpost); + else { + + if (!$filecon[$fkey]) $filecon[$fkey] = $fpost; + + } + + } + + } + + function flatten($ar) + { + $toflat = array($ar); + $res = array(); + + while (($r = array_shift($toflat)) !== NULL) { + foreach ($r as $v) { + if (is_array($v)) { + $toflat[] = $v; + } else { + $res[] = $v; + } + } + } + + return $res; + } + + $conArr = loadfile($pageurl, false, true); + + if (is_array($conArr)) { + $missing = array_search(false, $conArr); + if ($conArr[$missing] == '') $missing = false; + } elseif ($conArr) $missing = false; + + if ($missing === false) { + + cleanFilecon(editFile($conArr, $pageurl)); + + if (preg_match('/successfully/', $message)) { + + foreach ($filecon as $fkey => $fpost) { + + if ($fpost != '') { + + if (@file_exists($fkey)) { + + if ($ftpconn) { + + $doc = tmpfile(); + if (!$doc) { + $docp = tempnam(dirname(__FILE__) . '/../settings/tmp', 'Doc'); + chmod($docp, 0777); + $doc = fopen($docp, 'w+'); + } + $remotefile = ''; + + fwrite($doc, $fpost); + rewind($doc); + + $incs = flatten($includes); + + if (strstr($fkey, $_SERVER['DOCUMENT_ROOT'])) { + + $nfkey = explode($_SERVER['DOCUMENT_ROOT'], $fkey); + $nfkey = $nfkey[1]; + + if (in_array($nfkey, $incs)) $remotefile = $ftpwd . $nfkey; + else { + $path = urldissect($_SERVER['SCRIPT_NAME'], false, 3); + $fkey = explode('../../', $fkey, 2); + + $remotefile = $ftpwd . $path . $fkey[1]; + } + + } else { + + $path = urldissect($_SERVER['SCRIPT_NAME'], false, 3); + $fkey = explode('../../', $fkey, 2); + + $remotefile = $ftpwd . $path . $fkey[1]; + + } + + if (ftp_fput($ftpconn, $remotefile, $doc, FTP_BINARY)) echo "Uploaded: $remotefile!\n\n"; + else $message = 'Error: neocms publish this page: ' . $remotefile . ''; + + fclose($doc); + if (isset($docp)) unlink($docp); + + } elseif (is_writable($fkey)) { + + $doc = fopen($fkey, "w"); + fwrite($doc, $fpost); + fclose($doc); + + } else $message = "Error: You do not have permission to edit this page. Try saving your FTP info here."; + + } else $message = 'Error: neocms is unable find this page.'; + + } + + } + } + + } else $message = 'Error: neocms is unable find this page: ' . $missing . ''; + + output(); + + } else output(); + + if ($ftpconn) ftp_close($ftpconn); + } +} else { + $message = 'Error: neocms is unable find your session.'; + output(); +} + +?> diff --git a/cms/core/sessionConfiguration.php b/cms/core/sessionConfiguration.php new file mode 100644 index 0000000..80b7932 --- /dev/null +++ b/cms/core/sessionConfiguration.php @@ -0,0 +1,25 @@ +window.top.window.getGlobals("' . $getpath . '", "' . $gethtml . '", "' . $getfile . '", "' . $getfilepath . '", "' . $getexfolders . '", "' . $getimagepath . '");'; + echo $script; + + } + +} \ No newline at end of file diff --git a/cms/core/upload.php b/cms/core/upload.php new file mode 100644 index 0000000..79dd51a --- /dev/null +++ b/cms/core/upload.php @@ -0,0 +1,120 @@ +Error: There was an error uploading your image. Please try again."; + list($fileWidth, $fileHeight) = getimagesize($file['tmp_name']); + + if (preg_match('/(.jpg|.png|.gif)$/i', $fileName) && $fileSize < 5000000) { + + if (move_uploaded_file($file['tmp_name'], $uploadfile)) { + $alert = "Your file was successfully uploaded."; + } elseif ($ftpconn) { + + $path = urldissect($_SERVER['SCRIPT_NAME'], false, 3); + $uploadfile = str_ireplace('../../', '', $uploadfile); + + $remotefile = $ftpwd . $path . $uploadfile; + $tempfile = fopen($file['tmp_name'], 'r'); + + if (ftp_fput($ftpconn, $remotefile, $tempfile, FTP_BINARY)) $alert = "Your file was successfully uploaded."; + + } + + } else { + $alert = "Error: You may only upload .jpg, .gif, or .png image files, under 5.0 MB in size."; + $fileName = ""; + } + + $script = ''; + echo $script; + + } else { + + $script = ''; + echo $script; + + } + + } else { + + $file = $_FILES['neoCMSUpload']; + + $uploaddir = ($_POST['neoCMSFolder']) ? '../..' . $_POST['neoCMSFolder'] : '../../'; + $uploaddir = ($_SESSION['neoCMSFilePath']) ? '../../' . $_SESSION['neoCMSFilePath'] : $uploaddir; + $uploadfile = $uploaddir . basename($file['name']); + + if (!@file_exists($uploadfile) || $_GET['over']) { + + $fileName = $file['name']; + $fileSize = $file['size']; + $alert = "Error: There was an error uploading your image. Please try again."; + + if (!preg_match('/(\.html|\.php|\.js|\.css|\.htm|\.shtml|\.asp|\.cfm|\.phtml)$/i', $fileName) && $fileSize < 100000000) { + + if ($ftpconn) { + + $path = urldissect($_SERVER['SCRIPT_NAME'], false, 3); + $uploadfile = str_ireplace('../../', '', $uploadfile); + + $remotefile = $ftpwd . $path . $uploadfile; + $tempfile = fopen($file['tmp_name'], 'r'); + + if (ftp_fput($ftpconn, $remotefile, $tempfile, FTP_BINARY)) $alert = "Your file was successfully uploaded."; + else { + $alert = "Error: You do not have permission to upload files to this folder."; + $script = ''; + echo $script; + } + + } elseif (move_uploaded_file($file['tmp_name'], $uploadfile)) { + $alert = "Your file was successfully uploaded."; + } else { + $alert = "Error: You do not have permission to upload files to this folder."; + $fileName = ""; + } + } else { + $alert = "Error: You may not upload .html, .htm, .php, .js, or .css files, under 100 MB in size."; + $fileName = ""; + } + + $script = ''; + echo $script; + + } else { + + $script = ''; + echo $script; + + } + + } + + if ($ftpconn) ftp_close($ftpconn); + + } + +} + +?> \ No newline at end of file diff --git a/cms/core/urldissect.php b/cms/core/urldissect.php new file mode 100644 index 0000000..5bfca32 --- /dev/null +++ b/cms/core/urldissect.php @@ -0,0 +1,19 @@ + \ No newline at end of file diff --git a/cms/functions/checkpath.php b/cms/functions/checkpath.php new file mode 100644 index 0000000..b93eedc --- /dev/null +++ b/cms/functions/checkpath.php @@ -0,0 +1,66 @@ + \ No newline at end of file diff --git a/cms/functions/cleaner.php b/cms/functions/cleaner.php new file mode 100644 index 0000000..b89dbca --- /dev/null +++ b/cms/functions/cleaner.php @@ -0,0 +1,111 @@ +/'; + $aspreg = '/<%(.|\n|\r)+?\%>/'; + $jsreg = '/]*>\s*[^<](.|\n)*?<\/\s*script>/'; + $prereg = '/]*>(.|\n)*?<\/\s*pre>/'; + $codereg = '/]*>(.|\n)*?<\/\s*code>/'; + $cssreg = '/]*>(.|\n)*?<\/\s*style>/'; + + $stufflen = strlen($stuff); + + try { + + //grab php + preg_match_all($phpreg, $stuff, $code['PHP']); + $stuff = preg_replace($phpreg, '----||PHPGO3SHERE||----', $stuff); + + //grab asp + preg_match_all($aspreg, $stuff, $code['ASP']); + $stuff = preg_replace($aspreg, '----||ASPGO3SHERE||----', $stuff); + + //grab on-page js + preg_match_all($jsreg, $stuff, $code['JS']); + $stuff = preg_replace($jsreg, '----||JSGO3SHERE||----', $stuff); + + //grab on-page CSS + preg_match_all($cssreg, $stuff, $code['CSS']); + $stuff = preg_replace($cssreg, '----||CSSGO3SHERE||----', $stuff); + + } catch (Exception $e) { + + $message = 'Error: There may be too much on page Javascript or CSS. Please try moving them to external files and/or validating your HTML.'; + output(); + + } + + $stuff = stripslashes($stuff); + $stuff = trim($stuff); + + //grab pre + preg_match_all($prereg, $stuff, $code['PRE']); + $stuff = preg_replace($prereg, '----||PREGO3SHERE||----', $stuff); + + //grab code + preg_match_all($codereg, $stuff, $code['CODE']); + $stuff = preg_replace($codereg, '----||CODEGO3SHERE||----', $stuff); + + function lower($matches) { + + } + + //fix uppercase tags + $stuff = preg_replace_callback('/<(\/|)[A-Z]+[A-Z0-9]*\b/', function($matches){return strtolower($matches[0]);}, $stuff); + + //fix attribute quotes + $stuff = preg_replace('/(<(?!meta)[^>]*\s[A-Za-z]+=)([^>\'\"\s]+)(\s*[^>]*)/', '$1"$2"$3', $stuff); + + // fix self-closing tags + if (preg_match('/XHTML/', $doctype)) { + $stuff = preg_replace("/(%]*[^\/%])(>)/i", "$1/>", $stuff); + $stuff = preg_replace("//", "
        ", $stuff); + } + + $nstuff = htmlentities($stuff, ENT_QUOTES, $encode); + if ($nstuff == '') $nstuff = htmlentities($stuff, ENT_QUOTES, 'ISO-8859-15'); + $stuff = $nstuff; + + $stuff = str_replace("<", "<", $stuff); + $stuff = str_replace(">", ">", $stuff); + $stuff = str_replace("&", '&', $stuff); + $stuff = str_replace("'", "'", $stuff); + $stuff = str_replace(""", '"', $stuff); + + // remove TinyMCE stuff + preg_match_all('/(?:<[^>]*)(_mce_[^=]+=(?:\"|\'|)[^\"]*(?:\"|\'|)\s*)/', $stuff, $mces); + foreach ($mces[1] as $mce) { + $stuff = str_replace($mce, "", $stuff); + } + + // add back original code + + $replace = array('CODE', 'PRE', 'CSS', 'JS', 'ASP', 'PHP'); + + foreach ($replace as $r) { + $rreg = '/\-\-\-\-\|\|' . $r . 'GO3SHERE\|\|\-\-\-\-/'; + $c = 0; + + preg_match_all($rreg, $stuff, $newcode); + foreach ($newcode[0] as $ncode) { + $stuff = preg_replace($rreg, $code[$r][0][$c], $stuff, 1); + $c++; + } + $c = 0; + + } + + // remove extra line breaks + $stuff = preg_replace("/\r\n/", "\n", $stuff); + + if ($stuff != '' || $stufflen == 0) return $stuff; + else $message = 'Error: Some characters couldn’t be recognized. Try switching to UTF-8 encoding and be sure all special characters are properly encoded.'; + +} + +?> \ No newline at end of file diff --git a/cms/functions/createsession.php b/cms/functions/createsession.php new file mode 100644 index 0000000..cd3f585 --- /dev/null +++ b/cms/functions/createsession.php @@ -0,0 +1,35 @@ + \ No newline at end of file diff --git a/cms/functions/fileload.php b/cms/functions/fileload.php new file mode 100644 index 0000000..345d258 --- /dev/null +++ b/cms/functions/fileload.php @@ -0,0 +1,181 @@ +read())) { + + if (!preg_match($neocmspath, $path)) $entries[] = $entry; + + } + + $dir->close(); + + foreach ($entries as $entry) { + + $fullname = $path . $entry; + $pathname = str_replace('../..', '', $path); + + $exFolders = preg_replace('/,\s*/', '/|', $_SESSION['neoCMSExFolders']); + $exFolders = str_replace('-', '\-', $exFolders); + $exFolders = str_replace('.', '\.', $exFolders); + $exFolders = '/' . str_replace('/', '\/', $exFolders) . '\//'; + + if ($entry != '.' && $entry != '..' && is_dir($fullname) && is_readable($fullname) && (!preg_match($exFolders, $fullname) || $_SESSION['neoCMSExFolders'] == '')) findfiles($fullname, $pattern); + elseif ($entry != '.' && $entry != '..' && is_file($fullname) && preg_match($pattern, $entry)) { + + if (!in_array($pathname, $matches)) { + + if (preg_match('/\.html|\.htm|\.php|\.cfm|\.phtml|\.shtml|\.asp/', $fullname)) { + + $content = file_get_contents($fullname); + + if (checkContent($content)) $matches[] = $fullname; + + } else $matches[] = $fullname; + + } + + } + + } + + } + + function checkContent($content) + { + + global $type; + + if (stristr($content, '[^<]+ 0) { + + foreach ($matches as $match) { + + $fname = str_replace('../../', '', $match); + $flink = siteURL() . $fname; + + if (preg_match('/\.bmp|\.gif|\.jpeg|\.jpg|\.png/i', $fname)) { + + if (!strstr($imghtml, 'neoCMSImgUL')) $imghtml = '
          '; + + if (($_SESSION['neoCMSImagePath'] == null || $_SESSION['neoCMSImagePath'] == '') || strstr($fname, $_SESSION['neoCMSImagePath'])) $imghtml = str_replace('', '
        • ' . $fname . ' Thumbnail

          ' . $fname . '

        • ', $imghtml); + + } elseif (preg_match('/\.html|\.htm|\.php|\.phtml|\.cfm|\.shtml|\.asp/i', $fname)) { + + if (!strstr($pagehtml, 'neoCMSPagesUL')) $pagehtml = '
            '; + + $pagehtml = str_replace('', '
          • ' . $fname . '
          • ', $pagehtml); + + } else { + + if (!strstr($filehtml, 'neoCMSFileUL')) $filehtml = '
              '; + + if (($_SESSION['neoCMSFilePath'] == null || $_SESSION['neoCMSFilePath'] == '') || strstr($fname, $_SESSION['neoCMSFilePath'])) $filehtml = str_replace('', '
            • ' . $fname . '
            • ', $filehtml); + + } + + } + + $matches = $imghtml . $pagehtml . $filehtml; + + $script = ""; + echo $script; + + } else { + + $script = ''; + echo $script; + + } + + $endscript = ""; + echo $endscript; + + } + + } + +} + +?> \ No newline at end of file diff --git a/cms/functions/folderload.php b/cms/functions/folderload.php new file mode 100644 index 0000000..d8e1fff --- /dev/null +++ b/cms/functions/folderload.php @@ -0,0 +1,111 @@ +read())) { + + if (!preg_match('/(\/neocms\-js\/|\/neocms\-images\/)/', $path)) $entries[] = $entry; + + } + + $dir->close(); + + foreach ($entries as $entry) { + + $fullname = $path . $entry; + $pathname = str_replace('../..', '', $path); + + $exFolders = preg_replace('/,\s*/', '|', $_SESSION['neoCMSExFolders']); + $exFolders = str_replace('-', '\-', $exFolders); + $exFolders = str_replace('.', '\.', $exFolders); + $exFolders = '/' . str_replace('/', '\/', $exFolders) . '/'; + + if ($entry != '.' && $entry != '..' && is_dir($fullname)) { + + if (preg_match($pathpatt, $path) && !in_array($pathname, $matches) && is_writable($path)) $matches[] = $pathname; + if (!preg_match($exFolders, $fullname) || $_SESSION['neoCMSExFolders'] == '') findfiles($fullname, $pattern, $pathpatt); + + } elseif (($entry == '.' || $entry == '..') && is_dir($fullname)) { + + if (preg_match($pathpatt, $path) && !in_array($pathname, $matches) && is_writable($path)) $matches[] = $pathname; + + } elseif (is_file($fullname) && preg_match($pattern, $entry)) { + + if (!in_array($pathname, $matches) && is_writable($path)) $matches[] = $pathname; + + } + + } + + } + + findfiles("../../$pathdefault", $pattern, $pathpatt); + + if (sizeof($matches) > 0) { + + foreach ($matches as $match) { + + $script = ''; + echo $script; + + } + + } else { + $script = ''; + echo $script; + } + + $endscript = ''; + echo $endscript; + + } + + } + +} + +?> \ No newline at end of file diff --git a/cms/functions/forgotpassword.php b/cms/functions/forgotpassword.php new file mode 100644 index 0000000..d9e93eb --- /dev/null +++ b/cms/functions/forgotpassword.php @@ -0,0 +1,35 @@ +window.top.window.forgotReset("' . $getmessage . '");'; + echo $script; + + } +} + +?> \ No newline at end of file diff --git a/cms/functions/ftpclear.php b/cms/functions/ftpclear.php new file mode 100644 index 0000000..52a830e --- /dev/null +++ b/cms/functions/ftpclear.php @@ -0,0 +1,67 @@ +'; + + $fftp = ''; + + include_once('ftpvars.php'); + include_once('ftpconnect.php'); + + ftpconnect(); + + if ($ftpconn) { + + $ftpdoc = tmpfile(); + if (!$ftpdoc) { + $ftpdocp = tempnam(dirname(__FILE__) . '/../settings/tmp', 'Ftpdoc'); + chmod($ftpdocp, 0777); + $ftpdoc = fopen($ftpdocp, 'w+'); + } + + fwrite($ftpdoc, $ftpvars); + rewind($ftpdoc); + + $path = urldissect($_SERVER['SCRIPT_NAME'], false, 1); + + $remotefile = $ftpwd . $path . 'ftpvars.php'; + + if (ftp_fput($ftpconn, $remotefile, $ftpdoc, FTP_BINARY)) { + + $getmessage = "Your FTP information has been successfully cleared."; + $savescript = ''; + echo $savescript; + + } else { + $getmessage = 'Error: neocms could not find this page: ' . $remotefile . ''; + $savescript = ''; + echo $savescript; + } + + fclose($ftpdoc); + if (isset($ftpdocp)) unlink($ftpdocp); + } + + echo ''; + + } + +} + +?> \ No newline at end of file diff --git a/cms/functions/ftpconnect.php b/cms/functions/ftpconnect.php new file mode 100644 index 0000000..9c9c30d --- /dev/null +++ b/cms/functions/ftpconnect.php @@ -0,0 +1,34 @@ +Error: FTP is not enabled for your install of PHP. More info here."; + $savescript = ''; + echo $savescript; + + } + + } + +} + +?> \ No newline at end of file diff --git a/cms/functions/ftpcreate.php b/cms/functions/ftpcreate.php new file mode 100644 index 0000000..6240809 --- /dev/null +++ b/cms/functions/ftpcreate.php @@ -0,0 +1,82 @@ +'; + + include_once('ftpconnect.php'); + ftpconnect(); + + if ($ftpconn) { + + $ftpdoc = tmpfile(); + if (!$ftpdoc) { + $ftpdocp = tempnam(dirname(__FILE__) . '/../settings/tmp', 'Ftpdoc'); + chmod($ftpdocp, 0777); + $ftpdoc = fopen($ftpdocp, 'w+'); + } + + fwrite($ftpdoc, $ftpvars); + rewind($ftpdoc); + + $path = urldissect($_SERVER['SCRIPT_NAME'], false, 1); + + $remotefile = $ftpwd . $path . 'ftpvars.php'; + + if (ftp_fput($ftpconn, $remotefile, $ftpdoc, FTP_BINARY)) { + + $getmessage = "Your FTP information was successfully saved."; + $savescript = ''; + echo $savescript; + + } else { + $getmessage = "Error: There is an error in your FTP credentials. Please try entering them again."; + $savescript = ''; + echo $savescript; + } + + fclose($ftpdoc); + if (isset($ftpdocp)) unlink($ftpdocp); + } + + echo ''; + + } else { + + $getmessage = 'Error: All fields are required.'; + $savescript = ''; + echo $savescript; + + echo ''; + + } + + } + +} + +?> \ No newline at end of file diff --git a/cms/functions/ftpstart.php b/cms/functions/ftpstart.php new file mode 100644 index 0000000..61acbcb --- /dev/null +++ b/cms/functions/ftpstart.php @@ -0,0 +1,10 @@ + \ No newline at end of file diff --git a/cms/functions/ftpvars.php b/cms/functions/ftpvars.php new file mode 100644 index 0000000..f7af05b --- /dev/null +++ b/cms/functions/ftpvars.php @@ -0,0 +1,8 @@ + \ No newline at end of file diff --git a/cms/functions/getpage.php b/cms/functions/getpage.php new file mode 100644 index 0000000..6c95841 --- /dev/null +++ b/cms/functions/getpage.php @@ -0,0 +1,13 @@ + \ No newline at end of file diff --git a/cms/functions/getpath.php b/cms/functions/getpath.php new file mode 100644 index 0000000..631505c --- /dev/null +++ b/cms/functions/getpath.php @@ -0,0 +1,27 @@ + \ No newline at end of file diff --git a/cms/functions/getsaveprefs.php b/cms/functions/getsaveprefs.php new file mode 100644 index 0000000..00cce9b --- /dev/null +++ b/cms/functions/getsaveprefs.php @@ -0,0 +1,35 @@ +window.top.window.userBar("' . $getmessage . '");'; + echo $savescript; + + } + + $script = ''; + echo $script; + + } + +} \ No newline at end of file diff --git a/cms/functions/getsaveusers.php b/cms/functions/getsaveusers.php new file mode 100644 index 0000000..81766b5 --- /dev/null +++ b/cms/functions/getsaveusers.php @@ -0,0 +1,98 @@ + $val) { + + if (strstr($key, '-A')) $admin[str_replace('-A', '', $key)] = $val; + elseif (!strstr($key, 'neoCMSSess') && !strstr($key, 'neoCMSUserMessage')) { + + $num = explode('-', $key); + $users[$num[1]][$num[0]] = $val; + + } + + } + + $adminscript = ''; + echo $adminscript; + + foreach ($users as $user) { + + $userscript = ''; + echo $userscript; + + } + + if ($_GET['neoCMSUserMessage'] != '0') { + + $m = $_GET['neoCMSUserMessage']; + + if ($m == '1') $getmessage = "Your account settings were successfully saved."; + elseif ($m == '2') $getmessage = "Your new account has been successfully created."; + elseif ($m == '3') $getmessage = "Error: This account has already been created."; + elseif ($m == '4') $getmessage = "Account successfully deleted."; + elseif ($m == '5') $getmessage = "Error: There was an error deleting this account."; + else $getmessage = "Error: There was an error saving."; + + $savescript = ''; + echo $savescript; + + $_SESSION['neoCMSUserid'] = $admin['neoCMSUsername']; + } + + echo ''; + } + } +} + +?> \ No newline at end of file diff --git a/cms/functions/geturi.php b/cms/functions/geturi.php new file mode 100644 index 0000000..003f3b0 --- /dev/null +++ b/cms/functions/geturi.php @@ -0,0 +1,16 @@ + \ No newline at end of file diff --git a/cms/functions/login.php b/cms/functions/login.php new file mode 100644 index 0000000..35607b4 --- /dev/null +++ b/cms/functions/login.php @@ -0,0 +1,49 @@ +window.top.window.location="../";'; + echo $script; + } + + } elseif (isset($_GET['error'])) { + + if ($_GET['error'] == 'login') $message = "Incorrect username or password"; + elseif ($_GET['error'] == 'domain') $message = "Domain not registered. Please contact."; + + $script = ''; + echo $script; + } + +} else { + + $script = ''; + echo $script; + +} + +?> diff --git a/cms/functions/logout.php b/cms/functions/logout.php new file mode 100644 index 0000000..a4f9618 --- /dev/null +++ b/cms/functions/logout.php @@ -0,0 +1,14 @@ + \ No newline at end of file diff --git a/cms/functions/restore.php b/cms/functions/restore.php new file mode 100644 index 0000000..f8709fb --- /dev/null +++ b/cms/functions/restore.php @@ -0,0 +1,180 @@ +Error: There was an error restoring your page. Please try again.'; + + if (@file_exists($pageurl)) { + + function loadfile($url, $incpath, $inc) + { + + global $message, $pagepath; + + // read the file + + $doc = fopen($url, "r"); + $content = stream_get_contents($doc); + fclose($doc); + + $reginclude = '/(?:include\b|include_once\b|require\b|require_once\b)(?:\s*\(*[^;\?>]*)(?:\"|\')([^\"\'<>]*)(?:(\"|\')\)*(;|[\s\t\r\n]*\?>))/i'; // php include regexp + if (!preg_match($reginclude, $content)) $reginclude = '/(?:)/i'; // SSI regexp + + // read the backup + $pagename = (strstr($url, $_SERVER['DOCUMENT_ROOT'])) ? explode($_SERVER['DOCUMENT_ROOT'], $url) : explode('../../', $url); + $pagename = trim($pagename[1], '/'); + $pagename = str_ireplace('/', '-', $pagename); + + $pageext = explode('.', $pagename); + $pagename = preg_replace('/(\.php|\.asp|\.html|\.htm|\.phtml|\.shtml|\.cfm)/', '', $pagename); + $backup = dirname(__FILE__) . '/../backups/' . $pagename . '_Bak.' . $pageext[1]; + + if (@file_exists($backup)) { + + $backdoc = fopen($backup, "r"); + $backcontent = stream_get_contents($backdoc); + + fclose($backdoc); + + echo "File Found: $backup\n\n"; + + editfile($content, $backcontent, $url, $incpath, $inc); + + } + + if (preg_match($reginclude, $content)) { + + preg_match_all($reginclude, $content, $includes); + + foreach ($includes[1] as &$value) { + + if (@file_exists($_SERVER['DOCUMENT_ROOT'] . $value) && $value != '') { + + $incfile = $_SERVER['DOCUMENT_ROOT'] . $value; + $incpath = false; + + } elseif (!stristr($value, 'http://')) { + + $incfile = "$pagepath/$value"; + + if ($incpath) { + + $incpathreg = preg_replace('/\//', '\/', $incpath); + $incpathreg = '/(^' . $incpathreg . '\/|\/' . $incpathreg . '\/)/'; + + $incorigpath = preg_replace($incpathreg, '', $value, 1); + + $newinc = "$pagepath/$incpath/$incorigpath"; + + $incfile = (@file_exists($newinc)) ? $newinc : $incfile; + + $incpatharr = explode('/', $incorigpath); + array_pop($incpatharr); + $incpath = (sizeof($incpatharr) > 0) ? $incpath . implode('/', $incpatharr) : false; + + } else { + + $incpatharr = explode('/', $value); + array_pop($incpatharr); + $incpath = (sizeof($incpatharr) > 0) ? $incpath . implode('/', $incpatharr) : false; + + } + + } else $incpath = false; + + if (!preg_match('/\/$/', $incfile)) loadfile($incfile, $incpath, true); + + } + + } + } + + function editfile($content, $backcontent, $url, $incpath, $inc) + { + + global $ftpconn, $ftpwd; + + if ($content != $backcontent && ((!stristr($content, '[^<]+Error: neocms could not find this page: ' . $remotefile . ''; + + fclose($restdoc); + if (isset($restdocp)) unlink($restdocp); + + } elseif (is_writable($url)) { + //restores file + $restdoc = fopen($url, "w"); + fputs($restdoc, $backcontent); + fclose($restdoc); + } else $message = "Error: You do not have permission to edit this page. Try saving your FTP info here."; + + } + + } + + loadfile($pageurl, false, false); + + $message = 'Your page was successfully restored.'; + $script = ''; + echo $script; + + } else { + $message = 'Error: neocms could not find this page: ' . $url . ''; + $script = ''; + echo $script; + } + + if ($ftpconn) ftp_close($ftpconn); + + } +} + +?> \ No newline at end of file diff --git a/cms/functions/save.php b/cms/functions/save.php new file mode 100644 index 0000000..e3cab6f --- /dev/null +++ b/cms/functions/save.php @@ -0,0 +1,525 @@ + $post) { + + $post = thecleaner($post); + if (preg_match("/^edit/", $key)) $edit[$key] = $post; + + } + + } + + function loadfile($url, $incpath, $f) + { + + global $message, $includes, $pagepath, $ftpconn, $ftpwd, $doctype, $encode, $edit; + + $ssi = false; + + $pagename = (strstr($url, $_SERVER['DOCUMENT_ROOT'])) ? explode($_SERVER['DOCUMENT_ROOT'], $url) : explode('../../', $url); + $pagename = trim($pagename[1], '/'); + $pagename = str_ireplace('/', '-', $pagename); + $pagefile = $pagename; + + if (@file_exists($url)) { + + // read the file + $doc = fopen($url, "r"); + $content = stream_get_contents($doc); + fclose($doc); + + if ((!stristr($content, '[^<]+]*>/', $content)) { + preg_match_all('/]*>/', $content, $dtarr); + $doctype = $dtarr[0][0]; + } + if (preg_match('/(?:]*charset=\"*)([^\"<]+)/', $stuff)) { + preg_match_all($charreg, $stuff, $enc); + $encode = $enc[1][0]; + } + + if ($f) cleanpost(); + + $elereg = '/<[^>]*class=(?:\"|\'|)[^>]*(\bneocms\b|\bneocmsRepeatArea\b)[^>]*?(?:\"|\'|)[^>]*>/'; + $reginclude = '/(?:include\b|include_once\b|require\b|require_once\b)(?:\s*\(*[^;\?>]*)(?:\"|\')([^\"\'<>]*)(?:(\"|\')\)*(;|[\s\t\r\n]*\?>))/i'; // php include regexp + if (!preg_match($reginclude, $content)) $reginclude = '/(?:)/i'; // SSI regexp + + // create a backup + $pageext = explode('.', $pagename); + $pagename = preg_replace('/(\.php|\.asp|\.html|\.htm|\.phtml|\.shtml|\.cfm)/', '', $pagename); + $backup = dirname(__FILE__) . '/../backups/' . $pagename . '_Bak.' . $pageext[1]; + + if ($ftpconn) { + + $backdoc = tmpfile(); + if (!$backdoc) { + $backdocp = tempnam(dirname(__FILE__) . '/../settings/tmp', 'Back'); + chmod($backdocp, 0777); + $backdoc = fopen($backdocp, 'w+'); + } + + fwrite($backdoc, $content); + rewind($backdoc); + + $path = urldissect($_SERVER['SCRIPT_NAME'], false, 2); + + $remotefile = $ftpwd . $path . 'backups/' . $pagename . '_Bak.' . $pageext[1]; + + echo "Backup File: $remotefile\n\n"; + + if (ftp_fput($ftpconn, $remotefile, $backdoc, FTP_BINARY)) echo "Uploaded Backup: $remotefile!\n\n"; + else $message = 'Error: neocms failed creating backup for: ' . $remotefile . ''; + + fclose($backdoc); + if (isset($backdocp)) unlink($backdocp); + + } elseif (is_writable($url)) { + + $backdoc = fopen($backup, "w+"); + fwrite($backdoc, $content); + fclose($backdoc); + + } else $message = 'Error: You do not have permission to edit this page: ' . $pagefile . ". Try saving your FTP info here."; + + // clean up content + + if (preg_match($reginclude, $content)) { + + preg_match_all($reginclude, $content, $includes[$url]); + + $incArr = preg_split($reginclude, $content); + $incfiles = $includes[$url][1]; + $neoCon = array(); + + foreach ($incArr as $k => $v) { + + $docroot = $_SERVER['DOCUMENT_ROOT']; + + if (@file_exists($docroot . $incfiles[$k]) && $incfiles[$k] != '') { + + $neoCon[$k] = $v; + + $incfile = $docroot . $incfiles[$k]; + $incpath = false; + + } elseif (!stristr($incfiles[$k], 'http://')) { + + $neoCon[$k] = $v; + + $incfile = "$pagepath/$incfiles[$k]"; + + if ($incpath) { + + $incpathreg = str_replace('/', '\/', $incpath); + $incpathreg = '/(^' . $incpathreg . '\/|\/' . $incpathreg . '\/)/'; + + $incorigpath = preg_replace($incpathreg, '', $incfiles[$k], 1); + + $newinc = "$pagepath/$incpath/$incorigpath"; + + $incfile = (@file_exists($newinc)) ? $newinc : $incfile; + + $incpatharr = explode('/', $incorigpath); + array_pop($incpatharr); + $incpath = (sizeof($incpatharr) > 0) ? $incpath . implode('/', $incpatharr) : false; + + } else { + + $incpatharr = explode('/', $incfiles[$k]); + array_pop($incpatharr); + $incpath = (sizeof($incpatharr) > 0) ? $incpath . implode('/', $incpatharr) : false; + + } + + } else $incpath = false; + + if (!preg_match('/\/$/', $incfile)) $neoCon[$incfile] = loadfile($incfile, $incpath, false); + + } + + return $neoCon; + + } else return $content; + } + } else return false; + + } + + function output() + { + + global $message; + + $script = ''; + echo $script; + + } + + function conArray($content) + { + + $conArray = false; + + foreach ($content as $con) { + + if (is_array($con)) $conArray = true; + + } + + return conArray; + + } + + function makeEdits($conpost) + { + + global $edit, $eles, $inc, $count; + + $commreg = '//'; + + preg_match_all($commreg, $conpost, $comments); + + $conpost = preg_replace($commreg, '', $conpost); + + $elereg = '/<[^>]*class\s*=\s*(?:\"|\'|)[^\"|\']*(\bneocms\b|\bneocmsRepeatArea\b)[^\"|\'|=]*?(?:\"|\'|)[^>]*>/'; + + preg_match_all($elereg, $conpost, $neocmseles); + + if ($neocmseles[0]) { + + $newsplice = ''; + + foreach ($neocmseles[0] as $neocmsele) { + + $splice = explode($neocmsele, $conpost, 2); + + $newsplice = $splice[0]; + + $post = $splice[1]; + + $rest = ''; + + preg_match_all("/^<([^>\s]*)\b/i", $neocmsele, $eleTag); + + $eleTag = $eleTag[1][0]; + + if (stristr($eleTag, 'img')) { + + if (isset($edit["editImg$count"])) { + + $editStr = array(); + + $editIncom = $edit["editImg$count"]; + $editIncom = explode(',', $editIncom); + foreach ($editIncom as $eikey => $eipost) { + $eipost = explode('::', $eipost); + $editStr[$eipost[0]] = $eipost[1]; + } + + $editContent = ''; + + if (isset($editStr['link']) && $editStr['link'] != '') { + + if (preg_match('/(]*>)$/', $newsplice)) { + + preg_match_all('/(]*href=(?:\"|\'))([^\"\s]*)((?:\"|\')[^>]*>)$/', $newsplice, $lastlink); + $newlink = $lastlink[1][0] . $editStr['link']; + if ($editStr['rel'] != '') $newlink .= '" rel="' . $editStr['rel']; + $newlink .= $lastlink[3][0]; + + $newsplice = preg_replace('/(]*>)$/', "$newlink", $newsplice); + + } else { + + $newsplice .= ']*>)$/', $newsplice)) $newsplice = preg_replace('/(]*>)$/', '', $newsplice); + if (preg_match('/^(<\/a>)/', $post)) $post = preg_replace('/^(<\/a>)/', '', $post); + + } + + $editContent .= '' . $editStr['alt'] . ']*>/i'; + + preg_match_all($eleTagReg, $post, $tags); + + $contents = preg_split($eleTagReg, $post); + + $track = 1; + + foreach ($tags[0] as $tag) { + + if (strpos($tag, ' 1) { + + foreach ($tags[0] as $tag) { + + if (isset($edit["editVid$count"])) $rest .= $contents[0]; + else $rest .= $tag . $contents[0]; + + array_shift($contents); + + } + + } else { + + if (isset($edit["editVid$count"])) $rest = $contents[0]; + else $rest = $tags[0][0] . $contents[0]; + + } + + } + + $neocmsele = preg_replace('/neocms\b|neocmsRepeatArea\b/', '$0--D0n3--', $neocmsele); + + if (isset($edit["edit$count"])) $newsplice .= $neocmsele . "\n" . $edit["edit$count"] . "\n" . $rest; + elseif (isset($edit["editImg$count"]) && stristr($eleTag, 'img')) $newsplice .= $post; + elseif (isset($edit["editVid$count"]) && (stristr($eleTag, 'embed') || stristr($eleTag, 'object'))) $newsplice .= "\n" . $edit["editVid$count"] . "\n" . $rest; + elseif (sizeof($splice) <= 1) $newsplice .= $post; + else $newsplice .= $neocmsele . $post; + + $conpost = $newsplice; + + $count++; + + $rest = ''; + } + + $newsplice = preg_replace('/--D0n3--/', '', $newsplice); + + } else $newsplice = $conpost; + + foreach ($comments[0] as $com) { + + $newsplice = preg_replace('//', $com, $newsplice, 1); + + } + + return $newsplice; + + } + + function editFile($content, $url) + { + + global $message, $includes, $edit, $inc; + + $fileedits = array(); + + if (is_array($content)) { + + foreach ($content as $conkey => $conpost) { + + if (is_array($conpost)) $content[$conkey] = editFile($conpost, $conkey); + else $content[$conkey] = makeEdits($conpost); + + } + + foreach ($content as $ckey => $cpost) { + + if (preg_match('/^(\d+)$/', $ckey)) { + + if (isset($includes[$url][0][$inc])) $fileedits[$url] .= $cpost . $includes[$url][0][$inc]; + else $fileedits[$url] .= $cpost; + $inc++; + } else $fileedits["$ckey"] = $cpost; + + } + } else $fileedits[$url] = makeEdits($content); + + $inc = 0; + + return $fileedits; + + } + + function cleanFilecon($files) + { + + global $filecon; + + foreach ($files as $fkey => $fpost) { + + if (is_array($fpost)) cleanFilecon($fpost); + else { + + if (!$filecon[$fkey]) $filecon[$fkey] = $fpost; + + } + + } + + } + + function flatten($ar) + { + $toflat = array($ar); + $res = array(); + + while (($r = array_shift($toflat)) !== NULL) { + foreach ($r as $v) { + if (is_array($v)) { + $toflat[] = $v; + } else { + $res[] = $v; + } + } + } + + return $res; + } + + $conArr = loadfile($pageurl, false, true); + + if (is_array($conArr)) { + $missing = array_search(false, $conArr); + if ($conArr[$missing] == '') $missing = false; + } elseif ($conArr) $missing = false; + + if ($missing === false) { + + cleanFilecon(editFile($conArr, $pageurl)); + + if (preg_match('/successfully/', $message)) { + + foreach ($filecon as $fkey => $fpost) { + + if ($fpost != '') { + + if (@file_exists($fkey)) { + + if ($ftpconn) { + + $doc = tmpfile(); + if (!$doc) { + $docp = tempnam(dirname(__FILE__) . '/../settings/tmp', 'Doc'); + chmod($docp, 0777); + $doc = fopen($docp, 'w+'); + } + $remotefile = ''; + + fwrite($doc, $fpost); + rewind($doc); + + $incs = flatten($includes); + + if (strstr($fkey, $_SERVER['DOCUMENT_ROOT'])) { + + $nfkey = explode($_SERVER['DOCUMENT_ROOT'], $fkey); + $nfkey = $nfkey[1]; + + if (in_array($nfkey, $incs)) $remotefile = $ftpwd . $nfkey; + else { + $path = urldissect($_SERVER['SCRIPT_NAME'], false, 3); + $fkey = explode('../../', $fkey, 2); + + $remotefile = $ftpwd . $path . $fkey[1]; + } + + } else { + + $path = urldissect($_SERVER['SCRIPT_NAME'], false, 3); + $fkey = explode('../../', $fkey, 2); + + $remotefile = $ftpwd . $path . $fkey[1]; + + } + + if (ftp_fput($ftpconn, $remotefile, $doc, FTP_BINARY)) echo "Uploaded: $remotefile!\n\n"; + else $message = 'Error: neocms publish this page: ' . $remotefile . ''; + + fclose($doc); + if (isset($docp)) unlink($docp); + + } elseif (is_writable($fkey)) { + + $doc = fopen($fkey, "w"); + fwrite($doc, $fpost); + fclose($doc); + + } else $message = "Error: You do not have permission to edit this page. Try saving your FTP info here."; + + } else $message = 'Error: neocms is unable find this page.'; + + } + + } + } + + } else $message = 'Error: neocms is unable find this page: ' . $missing . ''; + + output(); + + } else output(); + + if ($ftpconn) ftp_close($ftpconn); + } +} else { + $message = 'Error: neocms is unable find your session.'; + output(); +} + +?> diff --git a/cms/functions/upload.php b/cms/functions/upload.php new file mode 100644 index 0000000..79dd51a --- /dev/null +++ b/cms/functions/upload.php @@ -0,0 +1,120 @@ +Error: There was an error uploading your image. Please try again."; + list($fileWidth, $fileHeight) = getimagesize($file['tmp_name']); + + if (preg_match('/(.jpg|.png|.gif)$/i', $fileName) && $fileSize < 5000000) { + + if (move_uploaded_file($file['tmp_name'], $uploadfile)) { + $alert = "Your file was successfully uploaded."; + } elseif ($ftpconn) { + + $path = urldissect($_SERVER['SCRIPT_NAME'], false, 3); + $uploadfile = str_ireplace('../../', '', $uploadfile); + + $remotefile = $ftpwd . $path . $uploadfile; + $tempfile = fopen($file['tmp_name'], 'r'); + + if (ftp_fput($ftpconn, $remotefile, $tempfile, FTP_BINARY)) $alert = "Your file was successfully uploaded."; + + } + + } else { + $alert = "Error: You may only upload .jpg, .gif, or .png image files, under 5.0 MB in size."; + $fileName = ""; + } + + $script = ''; + echo $script; + + } else { + + $script = ''; + echo $script; + + } + + } else { + + $file = $_FILES['neoCMSUpload']; + + $uploaddir = ($_POST['neoCMSFolder']) ? '../..' . $_POST['neoCMSFolder'] : '../../'; + $uploaddir = ($_SESSION['neoCMSFilePath']) ? '../../' . $_SESSION['neoCMSFilePath'] : $uploaddir; + $uploadfile = $uploaddir . basename($file['name']); + + if (!@file_exists($uploadfile) || $_GET['over']) { + + $fileName = $file['name']; + $fileSize = $file['size']; + $alert = "Error: There was an error uploading your image. Please try again."; + + if (!preg_match('/(\.html|\.php|\.js|\.css|\.htm|\.shtml|\.asp|\.cfm|\.phtml)$/i', $fileName) && $fileSize < 100000000) { + + if ($ftpconn) { + + $path = urldissect($_SERVER['SCRIPT_NAME'], false, 3); + $uploadfile = str_ireplace('../../', '', $uploadfile); + + $remotefile = $ftpwd . $path . $uploadfile; + $tempfile = fopen($file['tmp_name'], 'r'); + + if (ftp_fput($ftpconn, $remotefile, $tempfile, FTP_BINARY)) $alert = "Your file was successfully uploaded."; + else { + $alert = "Error: You do not have permission to upload files to this folder."; + $script = ''; + echo $script; + } + + } elseif (move_uploaded_file($file['tmp_name'], $uploadfile)) { + $alert = "Your file was successfully uploaded."; + } else { + $alert = "Error: You do not have permission to upload files to this folder."; + $fileName = ""; + } + } else { + $alert = "Error: You may not upload .html, .htm, .php, .js, or .css files, under 100 MB in size."; + $fileName = ""; + } + + $script = ''; + echo $script; + + } else { + + $script = ''; + echo $script; + + } + + } + + if ($ftpconn) ftp_close($ftpconn); + + } + +} + +?> \ No newline at end of file diff --git a/cms/functions/urldissect.php b/cms/functions/urldissect.php new file mode 100644 index 0000000..51a6d5e --- /dev/null +++ b/cms/functions/urldissect.php @@ -0,0 +1,21 @@ + \ No newline at end of file diff --git a/cms/images/apple-touch-icon-precomposed.png b/cms/images/apple-touch-icon-precomposed.png new file mode 100644 index 0000000000000000000000000000000000000000..f541d83a22add633519217747df5ce116f9c74b2 GIT binary patch literal 5998 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 literal 0 HcmV?d00001 diff --git a/cms/images/embed.png b/cms/images/embed.png new file mode 100644 index 0000000000000000000000000000000000000000..ce1c563dfc6585c6ee26e49fae9be0dd91283cb1 GIT binary patch literal 1637 zcmV-r2AcVaP)HqO^9WPgPxk?W|ce#c@e;*x*uhx$Fxd0FD%e;IT?C&IxPsdoC zpN4kkIjLCD&Ix0fox_UuHo$v!q>K#DkkN(YunX-9;<*nv4fnMX7;Ke?b)4I^H{$#> z^!nuby(pKYNn{Q-!YL4qk>3HF%ok;SG7N!szbM-06!Gs#Yvh@)H~PNbfOB$~C!s+^ z%v^jQ+y7oPLOD}C2u3H7iGC#Qo?O3LF~-639Xreb*=CF^`M7RBdeQlc!Pi zJ8r-^In0C8KGLY!IdaGr!$Nt|!{>~Q=6t#S5o7qCV7WW%8G1?<)7B|EPUK)2;j!O{ zb8?u!WNi}Lwu16v478m*yff-siqdRLX_80Ca_bneZF|T(ACyrWCBqEnhfrGde_h99 zD~%xghV_>vIouz_WghzgG8I4BNS-~z+)|dz5w!#7nF3Bw3B$?ga>`o3DG~gnv_pQ! zZ&=sG$RmTvk^0WpuMIdShk0PqqM=nHDgXAdlwC59Gxb!8Ii;*xDr0gX3-i0T!NtlW zsii=XQ>JNG;`~?B%ad-6Nt7t9VG<=u4wEQRa+pMklEWlQlpH2OkSI}dm_&(^!z4=d z=ngagg3CKmEBd^&jXbv9OuW@%{(-AA%Rh9XJX^-qC?_7(N`Bb?PmneKt@c~!9=Lut zh3sODo^l?4YbRG_3gyf=px?Z9Lhx7W#4a56ycG z!38&F^5_O+ z&nY}D7zqDuJd^3@`%*Z$rF#<4cWN`zy)yvFsds=>%sl7oM13aX-^+D2*S8=G;EhJ= zNRBh;)<8Bj!iYn9cl7^A?LL$Mfst})Jn7(gT1*MD$a(kS>Y$9p{_?Yn#F5`GdIubl z-q})zIQAqv z2X(GW3J=Dbooe!i?8j)h?m);1COf9y!#;x|tXZ)xIl<&*0hy!>ljq*q6NNLS-!1Eo z8X}TY%2&xd^T>%trRkk{#*C47X*?+}8+>oBXPs%7`*7`{jA93Gz`)xLIL6NVE%M&N z=hIU%Czw|eb)gifFkjE{I>Cb8u5g+HYG_|sB<1#vF-H%1lu%5+r6*xE8OVzwo8;|0 z;~FRjLV7#Mc&JOeAZN^YGMeL4wm!hyhwBJg)I#OKpZgU!nw9hZZFcYq*@2^57x7rM z7mtNI&$@@-=dddtv-XgFwTvg_t^)FXP};_cYhYm=bBc?W@(X1Vjq3n5s1fdQG;SC4 z9%1px^YdTeX;=oO)zWwpb4Pr8CE|u~<@+TVWDl}TD{%CY#G|>vPEp>F{iwLULM>QQ z>Ke@Tl~j!;YGcjkBT1dds86tHG&g`UDv=4JF~8K*iFQ&xKCO`_@eS%?P4 jvQtRjko~B*{x84)X2CGiA{dP*00000NkvXXu0mjfpKmSK literal 0 HcmV?d00001 diff --git a/cms/images/icon.png b/cms/images/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..417fccd1e91ce3e4b8498c58715c6d4315539760 GIT binary patch literal 4494 zcmeHKdsGu=77tn;B2rWY>mrU3cj=KyW+v~Ephys+Mq@xFSXX8y6Bx~lWFP_SBBFJr z)Mtejtq&}^=s|o{4`NG^a;UgyyFONHZ2_%SR}WQ-E<($G6W(Wg&K}O${zuM9=9~NY zefR#pd+*7&S-UW9jPE309*;Lh9k0@XX8`y0@dCe7o_7)8aUnY~iPaHK$Y!@1850e$ zSvDG?U5t^(bA4mhF88m6{5pONoH-|c#D=?HeX=t%Z*tC|+%nUt4e6oS)Ml4*O7o4H z#d(Lw%KHn}EiL~RDhPRUFFyO3Pg?%;DN&wt=h@!fR2bLw_qgOeWZt~sX;oVX-eXKWy`tcK1yz=1jJT@>fFy`LV~f-}si}AH4O-Q!{BtU~pW`CrwTD-6O} z^c{OUH`c5_v!fYrM8l462-5{jJ-Eg9$nk*ECDZCu#V_uL{<^q+AHQh9G2e-bAZ?!S z#iw~)HLaG$mY?6>9au2(Q{kCkQ2*C5bC=ehsorX?${6wQeYrEr?^Z~1Z~p1wds~7O zBj()xye=bd=gW1MCa2s}7x`V>-YMQlj&;pCXl)o7b9Q!D@$KbnrW}5KcHz0?&piD7 zb2pEpE7qK^s;D}fbLDhLhsX7G_RGlfD}|uyG8s@^Nty*XWi<;3gO#KOF0&1k9gi0| z%Vi^|)ieu{bSh&}@>{E_`4D4J@|Q_8h{hH}r!n!_b~+(@VIq~ino=0}v!Z+>T{r+R z(<}kG%qEKicPaU9TpX-9v5*hBP1w~+ev(ED#aQh$Bo>GT2psETGBJLXFBEAv7;&9y zZVv=_Q}WYT)`km(PN!4g6bY>MR3WNRD1-X{nOSoW*V;Tq1jiI6)l%27$ zjMV~hm;`CfV3mA6&_liPnQaAq-TXzb(UVa;IaUgtUn^15*ds6&5wO^xpkYEz$Y2zc8AX&_qM)S204TM^!4ejV=AZz$fB`rtVI(k;7Qr+n zm&0NVQNVIiE`p_)m=uGBL9UPvfLLT_Kvfc^fl+Z#1^{I=C@@McBVmM+NMW%Ak;0@= zs(?`gt&kZ=iG(7>ZYTqV&$Zgk1UOE{Or+96n@>kz?TJ>aNy+Def;i7UwFWelfnW(0!O{Q}!NfQs!!c1JD#cMbE zD2@!Uw;C8@*8j5R+6Rj4KJ<9T0rt;wi@JL%fllv!>wYyc?q-4@cU#~D)t!Qa$fOPK zI006-ib^9asWg}$Jq6nF89zBj5@YsGBP&yyvLi9Bl7Qqq%bcl);D$9zYpi*psY~n;5;>MhgFnk4U${ zfDr@yx@BN=fk`Or8-+c5aYN^K{Pdi|@3;ei9^Pa~{0`GKOxKVY7?SaDbq&)sBnF0L zJX~G>H@bZLFH^Jy`~z}=tI~|7HYK=bd6DzuRPGBGuRW$J2dqZf;`I(5Z}fQX>%lAD zGZ6^AS+yqC`+;}x>*KIzy8FT4Eem%p>{=!@{Q*; z2u~4pZT{$I?VZ+lmW?ey<6mXfSkBhITzfL2He&_PblX^UXGhqmy+0~fMF-d-L!YkQ zH?P$0Y073I@+~Fdx~e-t``h0>_S6;esO?-y z_&;R%JHi%M{PSvC_L7kL{JTkqud1&;Ogwu1(buwxe&XGY?;pLsD#YKLms}pCFHEnx z<5RoMUb*1#RpLZaQ&wmlxm{PLI{5Yee!r=_5T4%nRHD6 literal 0 HcmV?d00001 diff --git a/cms/images/loading.gif b/cms/images/loading.gif new file mode 100644 index 0000000000000000000000000000000000000000..520b7e8beba770cc63a5211af039acc79dd1fd12 GIT binary patch literal 676 zcmZ?wbhEHbRApdhI3mc5I-5&e@mNwcoFKokPtsn}w$f>sH!#?epzE z;J5f(am`YjrZx7n_ont73i$v3KLgP~@jthpYe=xOV}PrXo&hr>P^02c7FGrZK?WU= zAs}Zku&O=yEWnXGFT;u>>Gi%v$r=H<_kS>1)V%+{$C<%>kEl@ZlA@C#ZCJIcDk%4* zSaSHUTDQhaAwcK+XC{k^b?DTQcj?yGGI#;6%O+p0$N%n z)S=#fuzBenaR~c>oL*PX(V<>)t5z`01SAywCv{ zD%=L<2NoDqaJ=c;<&-4Bgzz3HP$a>DA_tF&MK2_{RL+;|W$>FP@A&p|t4p#650YJ= O5Ft?uC^(4IVhsR8JH-?L literal 0 HcmV?d00001 diff --git a/cms/images/neocms_sprite1.png b/cms/images/neocms_sprite1.png new file mode 100644 index 0000000000000000000000000000000000000000..745e2b2bff0c1aaf114316c16344a09918a5fe6e GIT binary patch literal 43854 zcmeFYWl$Z>7B&h5f(5tWu(9Co?iPXu_l>)|1PksK+#!VE?!h4hC%C)2>mBkQc~9N1 z>ei{c-@lUzFngwZP50`h&ssZF;e#X+0v-Yc1O$?_l$a6(1k5yW?FRQ6_>HPR_zU>c z>!G6Vq-5YqV&`CMVs2$j;^b~;Ok(V2ZUPLPvsTbT?jm_}zm3TY4N^6j!N>-ru9G#3JWKFAt zX!loN5bO9S8XPiDvDG&0rqAu(xRtOegmSGxiYR0Tj0$hxJgb&1&Rrs2^OrN}na9n| zU5&IEcxZL-cD5i&zYhPxN#bZ82RZhG&I}=#hD{nWT;YoW$@7*I$Qwe2QbT)_G3zG; z1Z1GOsHlRpsOUd;1neW-JCot+a_0aD;yU96B5e$=w%TcxKzQ$CkzGv7Nt}&|+Y8pZo z_D!)Z#!+LnrAMQ5O5;BBA*jQ@E^d`)h?%@1kX#9sG%pI_TLo&tN3tHV)T?!(C&j)j zQ1bgSgty$-3IPZMrvc9$$2LQ27YS*Y5wBVq>mHerppZnFGnOV`WU z{bs0kBcrgnp+x3?^f*h#Uw;}T)ZdU!elrmJz!qeP<|deD`}37(z0h;&yp|_%5sFY! zlV%$vGO}MNx^cN@OLKX1z3)iP{XOLGPY%OOS|dq-5ZCVFu^E|6HH7 zot)gi$lEyng9`vZ7~Kr)7?~NE7_F@t|31UfN!$e>@{a}mA7?nK0E)_}WbA0`>;N_v zcQLkcBKtcDBk;fG+c`T}{n?HYn92)vc~KVB&*EvN9W880j_HMh3=GYeq$ ze~ff8H~BZS{$p(~PyTG@?+XE@|BLQ_jQ;1|{|p93$;t7E*@B&4mM1O74|;h&kC83d z+=%DTCA*0sHw!BlC%pl)0V_QlHy1l_#b!d!X=H4~%)!CN#>K(?H&W6zj!p(PVB;53 z0C5I$fDS8|9n4{3z(LQ(W@JFmX2`})&&^?MK+n#?4K`w7;^JUqX8jupc?WYqDh;gu zzN!~eMgS>p6J`@;WECx0tPGq?fC+#OnA;fHx;p;*k&3ysv9goF z3qP4TS(rK5I5}CFx!5?kSlRwPNY&WE5s<|fs?1CbtXzMdyc`SR54qeLJ5qQ7*pId+Fl(Mn?U!VT^Xl4FKnMg?f zs0EJ!_^&NE8n_r6{aGhK>#s*(GXon_W59m=Lty`T-~9g|3??ib+)NytZ1n8RCQQHy za&XXd8yR!|xiaD~V&UdslvOUU>yQ}_>ly%?SU zi~s&{4*wV50FeIQOa3eV{*PV%W7mJhf&Xgo|D@}G?E0@b@Lvu7pLG5I#x8_^CsW2Y zKm_Cpq)M?PswhC3_1aKYQtVH{1#v6d>v5y!=2yq^7?GZo)cA%ZbD8 zz~Z2w5KFC2`9MIBKuC)TtGLY_w0e4}{BC@H*0nrN(S}7YgXi=^g+oAi2l^?VTR>x- zgB^Vpr@05yGquOvo>xa>ZEoJ9tMVbd(2$>=s9nF<RGmrQtDi-Tsxq>nd-_@rB92@bwA(io*(&e#Plc-~rSU>=N{o=VH?u0vJ6Y z=RBu&N+e{b(YNa}(&1fc<4$h4<|8k9aW(xs-Y}nxjLgH2gA*3GhLbl|g@`S%2hgez zj2jyp4fKm{9Y2drjfuBM7#y^!1FG}0iWVd&C@82ha2y>R0;x@Z*4Cs)cIY#`ee*g1 z5`xwB4ql6Hi?H2{ z-O)iGg)=ls)u>H!rsF0gBxt{(gOSKum8(4oTthq!Tz8d~k=X*);x)SP8Bz5EzvX>{ z{^lh2xhanKXk6q-u8)ri2g_T{Ftll;*8wjJ0X_eqr#<7qkb+e5VugCUTs_~>MOtEqPCX_(IjSQx>Z7KjLD-33aPPsC8HRPVps zY&!3Ux#GsZee+paP7B%<Ok;b59dGp~0^u?G@cb6_nbIvH6ns<_Ly{d1t$I-&Fn1!a z^R?6tz^1#~#dWbAqfM6hWKeJMFmT@V3iP)1PQ39(IW8_vYggOw;2IE_FhBrQ#Z>9kxoambUpC$YoJnbj&Mf@>>?*MH zIe*|tBEt}0gNeayELom_w+5Vdm6MLBjgmLd>`;s~W(Q;58yNp^p$@s@7?2+n85uIH;_-pi7Vjg4FG z_DTXpNGatr-|OlUZD;ukSWcH&J5w-Ye8JNc%1+L{MjfEq*Gi|@DFb*XV3PYHl{vD? zpOOXgs+r+z{Rd5(rHFaY)m`!<-+bmU00AsQ_`{;*;b=7f$Y(q}Vwuz^%;-o|lwLY# zw>1~?TwzFoAJ`%_lY%@gM-#?1ot>RouUt8`vobP}ek9Rr!M$#M&z{C{r&s* zI#pLP`uDJ`HVa%ybhk*!+79N)&SsrQF6R`tzdtR0lGb8W#1($j2%G|C~F=GToMAMA0CSL!F3Lm}PV`O51UooVj zJG0ePSzc%G5d5B3&?^8>txL}w)(b;-oueY!u8Tyni-e^5Q&t-NjXS9DwMA;_t11B@ z`ds~XOh4&pg5FMY&$9fh?ai--2E>cQH3k+R9DLU!2LT%{xi2+LpS#2SPZ0rWTW0Y4 zi^Jdlru1}+4+FRDPR-Uc|;&q(;# z*E;xS%4L_UU5<@Ucl#;K>v&UT-r<{rY8CeD5}#2lOhR-800w+&x*WJTOGq`|V?Sg<(&anJ1_9Tz9;@Ku>QZ ze%ir$ps(efL689kePCb}VOW^b;wlFRV4~DHtY)$?Lhr267UVAOck}Y|yXCh(kd6BS zx|z`y4WW~rb@*Z`h^)X+fAr@q>5RVF!wE@c1rgdb+1MJIy%u^_6a`Di*DR0IW-=SI z+QuX0p@l}rV`@4&Cu!7HUBFJrGPZVK>`n{}4D5cTfvq>rOS5gm{bcKNE@ATPOUJ`4 z3X|njE#JclsLpm-Sh#~Tg&F+Xb@7rPV1^<@Rdsd4_0s*8f7S);l+^>p-b)h9pAs^Lih-wi0jzVj*xlq0la530bH4PJT}XPO;4I znU5A4B7c!*6l!}8rt~|D8j5$^1XV^?mUrks)MK1?W5{-@Yj?wF!}AP%BebTl}VdpTYw3>HBv& zK(-39SJHrw>@*&IRrc$YVPShzI^MUNYBO!#u!G6v`U7#xyl+ z1EGWvC*ZL~P5U;qIoUi6Y?-c@uMQsofw(CrWp>;icJ5M~sqAcuq_WXs4kyuFuzAZ( zgw~k{Rlj^p#nM=e3RQqvNo`NItdSICoPp`2JDu4ik0D6u*MO{`qa!CREq&qG?(_JT z&y6XbN`5O*P1oF-zuC;#$l1e#kM=aT70r8K&?UU#Z>|dg zM0R5f8N54QFvfQndu20MLv7%h#`cSb>Zv84gq!58dt(pPzK#VAdoyQo(%j5TOr;Z( zo}R8REj>WWV_SCg2sl_6obTy##rJTdFn6=M_(-fKOf|58ZALeI=$z@BnVy-`x0?Id z$A~UY6s7BW(!Gm%+Ue2dL{~|zAp$s)??324ZD?AOU?6Us_FfC6LQgEQlwCCa)>=|h z;(oiCJn-w+24I#;7a!#GRV_I^Hew|k?~j^q=9g6+A8zac31gN4WV`8t8k^n&j)cZc z5;QFj0|;kG-K!ROmGH2s-q3vrd4XHZ`UQsx=|k%?no~V0#O+;vm^xyMZ)~2NB~vrN z*3uW-Ej7CzzSJ0_kEv^>ZBf(-#DliJZxHHBP#tNh?Sf5@O+BrRx}8Ovnbw+e6zx0y zay&>Y=eJUFazF$MLkcao8FuvE1wKgRUBTDV(t@TYygqxLUxn1v)cN`O0OuCe_fSM> z`)Du`?AN;CEi5eN5|5-B8ZX&f0@6#|z{EJC86v@ydQ5>{$A0?2&E3 zmacx;M{>a@nZcW8_3C=T(YDj2J88MWo~(Yk?KIz^R6rGzU^b7ts=lXBQhcWOb-*f} z1P}ppFG5|5`Ur9IyGM_9=z;oT?? z+1k&Ka4L9r7uNmk>xff{Itt1QE_uhu*yp^+LFkHPOTr$(=Bkt28+ct9LNHR=C`=Iu ze`Xm0gxS$@Uzko6`TSaclcRqt`4&~ro8>N9lgGb_m)E4Ntg}Rus{CAO7Ul%gDqeE-C4=62i2z zB9KmX+NW28zHy+tQw5SxQ-@AYs^llAsHrLI>V9~KX`u?ibhX@*7)tq z@)8oSa}+|(&K$m#l<*d!Z{`L;qD`;6A#w?rT!%D~S}0O!&i@02Mnb4+4?YDeoyQAwkULx$RBckFE4dJiV~n!^4Jk zXsFiK(>?x4jCsLFwNDxQ6V!{Yfj@u#R6RT%<~`=y#5oKK3TmR*rYXIYewutAbyL=# z=T>ac`&QZM-EojLkXO7p%%z50gxfR~07`s)K+@EPg6UFKwiq8Dj{*HfuzBakKT(g#;074#Cv*~W(@rA} z%##zP(IyLY$->QXHz${V2M=zHIV5n#r1UriVj|CS^72&MEo~8*WzxGgK92J2N}Zn+ zQxDKi?Clu^Xs#S@PF7j>dbL1fd}yYYlXpNY5^bM)))JgIZMquTfx88_gG%#BgVF-X zker|;gaq$_xa3v`Fqq`o+3`-hoB%Iq4b^^S>0C4eNrB5Zf#EEjn%vc&A7)07>w#DZ z`@QBDrX=IBay>!1!M({`9dbr%O-($2ir3w45j=64?aoWK0OSj%uVV>Tl8l-4e?S1| zGDp~R^bIfn1BjxhuMx-C{wNW_H#NvX^wTE1AAHrJS!redVPx{C{eDh$es#!AZg(2( zc;Pn5Ti?>|=RIz(8grDWvL2*ab(bCTXC!E-h_)KW?JdiE>tV>EOV>qMvO=?QPZ#in zW!&TaT$0jyC{^a@XeHV@eadJJ`{poP&D7#4^xT!hd$_Uh`fWBkr$<1x5e2E+Eml#V ze0>slx!8;Ok`0HfnzUfzU9ZX|`EZ~^V?&@guL`&%`D9w)WgI9}|G?KIsVx3_=1-;uI!t*B7w8j$B^OMhUCn|`#Cg>h`^xr75!`2*wy zEZz5*p8H>a$i4!fea8pji5x{BYh`%-1Q)?InEC{HatZiWlvLW6oUyto`Y%AC)6`y& zcR|7=?t^k!>*fa;#A^3*6Bbrh$cF7qPq*tu*B5WtxZ;oalF0yJ&g9h8*=|wR84#LQ z>38^Jd!DwqpEo?54FantMTG;r)z{+U)d_jQ&8+7KDir<;g_2yQ^0qsRveqljv$M0E z#b!=mD3E;6(9q0Of?-Dl?&%oY9~|QEQAI}EeSHb~PASjAKPXVPNWHfvg%lT?#1Ps> zmC>FSx0HK+dYr8`m0u9|w%RcN?#+X938t>(lU8WRZoQN#cA1xi^AjNpL=KOG@`KTQ zg{)+zO;Jfl+tT_bJSjs@jN@tAr)Fw$a&olZR!<}cwYIj_nh%ribJRiK&Mpm~bWxBv z>U12Ob#OFxXo;|t-xM}Oc92k@_~qSdd}e=H*S1p5hzEWEN&#VhLPMF5bWjY!{O9xX zIF*lA1xEV6N040et8>O&|rD2&q`VY!T_hJIR&v=~XTUCCcFI z!(MoXjFhqiUqWeXYkD9^Iap|{{_T@jOh(;`zb$_)PBohVJ@zv?0X>H>uwr!8K2|fE zg6pTaeh!uyAKGYDC$*8&%@Z1kXJC6aENO}Hlasafrdw7J;Vy}JO6qx0L4{|sT*WtC z^25a{of8hx(Cy*U)1=g#VKKm3lTejaf5vLP7L=jZ3K zN)n9F#|`UI@!k8MH#Rp-T9crDe--gS{4mS?9n`~OKk}ooNIKG%? zCL<$bI24y1wL!;`JCc-ed9?M5!!|>dr6xcOj3X%j+Jz)zv_YAF5$L4G16N#0C#~5O zY3wHfiLB&5W$KP6s74wn29Na!1W%|*7Z}oh6P#*}9pbOlpL>^fOu&VgBn8cNk*)I^KC1A3CC_| z#o zQ7G3{*Ba9j&e-;4EKd@!%3BQ?&ww%(WoMIkC^mXt+f0?|49?YB&Q=(_3V4mQ_LH{U zs5b)l4IvNar-+C*L|!MtOJ3(g@p$*~Sr38Sj$2~a+g!-_99Am;;F90a@I^Ej*?!hI z*?x$9n#p{e+)IEM0!P~pG8~6-t9kj+X5k5lcY@Zr;2AS(p%ZYr1e_wsj~xU%c;u|* zw%-GKh}`ONnG2{s&1<$AdDFbQUW$U`EW|si*!%#mv&=J_0x3c{e8SVvsX57Jgseb3 zf^pBgx4v>LPfk5Y^vLs1#qb}6Wui%D$tVIC%T4U8@s3+O{4pdcq!1I3I(J#9ayf3Z z;EK-2@N9pqDRbyJWMm15rnU*&+ZC-nKTUGmjM5hL|N52R($exV_UXySKL@98{zDVC zOaoVEr;>ub)Oqh4=W+dow`}+=$uH?iWH(S94_{3 zq8*w{c7cS2f=Di8I7u9v2o0w6c@!;l9aNt~CFUn+YqTouz?f_iAdD*zqYje4x62o? z#L)_?xG5j~+1o1&4=(~r>=a)YU4uK8Mk^?|z6h%u<+{n2lj0^R{eoYXxh`!UY)c|G zjKOpvLVS$rx!L55VmJI21I?atycFdPZ#&iT-GAZt@$u^%XT&GVe!(M3_W-Ovs>ujJgf7B1)yHrQ zJ2cy`Z$@vwb_YaBYi)cU7w=pb>?PAjTTMrZo&XU%4;Fmz+np%#mU8GWVhqV zZQajL$IlXjO8|#ksX&D)) zm2V|wxuzqT1Oi@M4y!VnnwsfuIC8I`%wW`0(c;M)*D2JYirF#B&K;eyM6DCoW`sLp zb;f2Na@P`svdM~3Yc2#FO^B;CEyu^l*QVHOMp7b3=sv;ApP*}YcV|sU%Z+sSA9=G4 zKuSkLa*U&lGjd(agqAm(>2#lKH(ws=lRJEw}?kcBAPZKCk%PwOP_*OH5I-o~n z!xKD_d?bCO;^IUQEJPwCEkqzw@whTpG$yLDK@#A*iY`(whHqjd_uBTlMP z$VHY_ZvX|N$7LgfjJ@xYw|3m4OuD}=dEE^Veb$NbD^Em;q`ZIiaF3&x|J{qXUC+_8 z+1p^_Q?ZwOr&m}#{dOe1Jcq_{GS#n_D<##o)-G>{wGjL-9D7M-_=S;8K{!+ND|z1H z@9~`xYjbE`rVL_iu{!)v@p&Alvk3TDbip-%o7`DgKc8SM&Z%y;;oT)3q_;TpjF%<8 zSQJalp?x~sN6YPYfbseYZ%B>N8?HU0^IK%Q;Y8U-Ok2HS9EJz^^YVokXz8=EEa_4@ zxek`#iE=jQ(#AGYxpaE~PUVvMz1agvDcPDJpn|99IbxExn*@@1xEH>B-E~ zvONXg-n$E$(jek69Grk_6`RfENKnnrwC7`dxFZ+!;g-KDeR2_=%&7?~FN&ttlU*CP zoq2!ff|u+=n^Me4>3FLaFRV$xSiU;rhj9}`T+H?p3yz$0(*vr$zz&|YqIKW{J))#J z0aj;Kfh+hub)bu|IY9v`0-b?@Wm>bzbC9eg7D+9!B-c`#Ju3P6v7UR-!+D!{TwMyw zS=z#L;%_)o)If!wJy_XRww)hKwdsscF9&^xoRx75%<(0grL0%G&bAD!gWzbO-wdDI zpd$72dfLos^IzF~zQA?W1T0`(de-ADg20?wcQ+a*lYKYR*s-p9{U_jNm@>onR~LBX zx$<@F_Y>n6xrVxA;rQo!-E<|DsX-q7m|Jr-j3e+X{@gICsp!w!f?!MNx33NQOt-}t@0EQdU z#p>>pfcKr)vhPU;?8CJ0quOUG$cKOS0_5ShUCmjJrH?}-CMJ%lKnp&sqU2$qJv|=# zZUaUeT#Zy*TDl3C;ju%HiygGZ09(7oap+i8QF+>3m`NrlFI+??g zw!fLyl!%KT=|tEo_FHN4YX;iK`hJ|#3wX;17yUlushMmO`J6=u>46jz(fU(fro4Be zoeeu9_EXGUFNR}qLJJM(T8R7~cJRb&DSN2-(JSi}Ple zHLB|Dkgwea66<$C1OZc`d7cd^*-$e)5q>ODC^GCj+T~%|G$L;EtmR=}f=|okjr=tF z@&xv;$Y9^Ytjym=pLaIF9Pl;7GRl7;###^r1RQZ6JAHEa`>$1P)+?JTmSAN?ouBwx znHzcDOWM?G(amX6JuqBu7m9iz5F|UrSpK8P=3|++fqp+%VNHBef z5g23ptaY+I5q-7fr5B4<`JNnGBqQXnQX;ek=Gv30!lH3!m(QE4z`PJU^WI->C2d|Z ztuE@^{CsjkMx|+mkuD(Tdg=8LgF^NBuq_*VRxx!4Ln_AfAUJd*%=%Ktmtk{w1fuDP zG^72)`ehrIJNy0^QbhwoAW>$!TkH=4~6>RNaMuscyM4UO{z4*$>y=Gh8{pGz0;;kKqh6E z>JtgZ>~z6(D>GWywlY#8598q|m2Axbq5Xh?f%$~<8!uEuuhoN{R;|qFbgc&y2j~1^ zLLLJS8UiRTdQvkmyjXgB#R@+m63sTi1OuU1?I0=0#e6})8slwvc=$_40oxrny0@OT z_OH$$MEN~gtL2U~u4}+cM9t|>eb+$J;g-OdG}AUhkGM}C`r$~?=`uzd_x)Bux!Weg_W4;j(%GYBU*17 zgt9HPpKiBh{GG9>qAY*9&{VPLy1Ke~J_NW~0MRNSmx({Xd^&N<`E;`LC*w0|NpI%Vd<5Hx<-Mzw#D-Eq+3NoHg963TXv{<_FEL+gU14q$TPmf=+}AX}JE{BU z>nY!}hbEY@G^El3&tq)1Qr(7*rlA#!eCOeaQEHe!|4WWHKElFd4}ldVvEt zZHdmehQL5QeZhS@gYV?WE2sS_q^~%3CEvb%;j#w-K5Bi*^Egsgacx%pv-Qy~dSkp* z)$n=mYkIUgVl_(woS3D+91(NI#0cXY(Kz2$ovtKMutKR#k++q{wY>3h6iL!(gV|4k zGUL9x^%*6modu(Wga=FO5R3w!QGxt|nZ_Pj{=hnnBX-b{gcm8$cLRXJ(feY~Bb0s#|*1_#}6+;%@xXN~`|FQ6))^>k4L?2VitP2#zL zUHQ29RIp>Tl4HG02E;#+dlVR6B7`7ZPsFk4(LH}8dreNI%`@i;98wCfNz1A421_mO z2g~hQ6tYPWFZ{VWUS9rAEZKY6c7K$o*Y5K^ohw#69Gls8sRg@eLs3SYYRx*d!G@wC zx-jVa0`^lJR3wW33K=dvd)dc6ifWkkHl@KEd;&^s#)cExzQzsBAqv+0(KghdWfbHA z*RHJI_wOv>s5ME^MhbiP z#%%2SiI9?C>~f~(q7ZEdES9s9nsRJk5C#ND=&v?8b9Iu&qz6Me>5wC6)AHWE zs>Tr3cyqq^D?-cbS#4|%ky?bMUj~TGb1-VTLKy;9xdY}*FZ1$k5{->qw=qpd>Hk_z;#Jonm(ubi5 z=7_|Hw7DGW;^NNK15XgZf6=>$JYeRFf482*_IkobT#yqF>yrq91t)#(ybAqN(4*OJ zs_yDJym}3RLUDHlKxZdI)X}kP$GyS#Qx)dZGz9ew4qGhG{eL008Vf)Gj;*94|JsE9uE!<&H~Z|v7O{ip$?5 zkXl?;#=sEm;TS>4%kd$^=eYG+Ght5*&hOjr12;LtwCyPM};ZstaPZv3C9sJL0b0>0F7zu#84}VaI%;X*1N7nk`q=dG?($QzRy&}{FKQt~ z@&iEe;9h>c#abid2%X_#X-jzp{rFkBf?Vm{-ZucHnpV=?Do~u7>-pf<7GV8Q9M>c> zFy%X0h^2tMV>aJUX4U-dM?_H;?K0N%G7pfaN2e-9}|Ti%&~Rd z9tYOsyIlZP$@%t;hUQBERVt%)0~1YW@7>eg<$f`sf@RS&Y=-*)8VDgqR*4@aXLNv9 z1?Vs3K0o_A3rjZVT5Q!gA$5|m22IfA07kZp7?AaQxz5*Fj}<8aVM13Ng>3Fs)Mx^6 zUzD=d?AqGej_c$7wQb{bZKp4WOoT`tmO50z=B$bgembhs{EdadV>p!BeMcWotzgs$#TL@-)2uZJ|ZJqg*A3T0c^^WrhNik(6Pz zCVsfpeaQ2pH+%`3S@46+uRF@d!@7Axl!3qiO?7pyeU-^YML5#7^4bp|;iXGQ54|4% zq&JdDmIlwm9+-pU7w%%3rHq%=pElcbr!WE6*Ha7S^y4g7MC0n{#dq%u>=|-6B zpPisMSkpk&THTkKFbdB$OgP{*1>JIqTKUc$kh?J(c89pQyOYDRx}l|%qVd@_?H2Bk ze+9BbzROAFvE$Ua=PUW5BX)N?KIXr5&YkbZE|dHsxZ?X5uht_X9ptqs|H!=yBwyo@=S9s?q^Z zs82dMUS`rf-#e8QHZ>)UDJ$*pcL(DmC_2-HIDAkQ;pN%(0NsDW>B&k?mIU%XpdeCO zocF9__Hi)S zGi-ZIl`|Aj(g{)Bk7FPV@uJuO$ekx!y9aqLp9m<2M|I`bPXeOrjO(Qm*6~dBs!mQw z(4qNzI_r`hUHtDdW_hZ_eTnouPhjOrvA|2Q+`4EF$oX6W9Br`$<+XQZtx6XzEJdWoJ5{yvNR{K1>R_ zFXTz0^hOa5HXpam*L;ad|5cEzi}wiBq)mVh+&6Yg!xtmIPv;K+Fl}822EL6z%4#wx zxTvV2f;nBJ@D3AeiL6`F^V`>a2REGW_p*eIdCI4d!UXxK@8}_uUlDit#i4HN!Mo#V zIgOy-jI-rfbfPDQ9MOX^ulJ`>vc)-xL5kIYsI=Uyh1-jmk}G)wK4L6=_%KuxB}gQ4 zt|%|0#vL%5DyphgcB>*l^Is=mhk=@Fh{V~}=B7B=*-Hq=Zix+;?9i>^vS`id`btK* z34U39^N!3RuNi`cRntCLDlVUF-N+DczE%ThyYNFWb<}~wj%Q{x zp>gUGw{%1%G88fIQkmiWXA{nm+24uzX~OAi8sd= zOU#)rst@?Z7l-)tc+cv%^~;PVwKtQ*EM&il{zzG_78FB{-%uVD=WIryFeA0ff9O|N znJ7Y=<||NMsRB26xjx6hKvD}m2&0yhC?thd*A%1#AmEgQb@^gDDiSEI{)@1j4!Y0g zT<_|Rse5}1=lFkyw8hWpU6Ceddgi%SO9wddDL%G13iJVG5>}RbmQmrlL%m>QjfRF9 zb#hu_(h}@I9D6~79Xba5M|xeIYsaOsx#8c*51-h483_(SPH?1NGcwshMG_XP=Udj< z&I2@i7W~hpd#k7*dbn4~Fupwb3>_Zu+}LP)f-uxvFaaetdI{h-ED&L@IDE)>DV?>!ogP-Y zj%gnDT1v$1M6(>wH^n&ZylY#|Y5M{gjTXPIXS{E`1-Kjh0K{bACsTYH-ph9$47*Pl z!;w3(ygl30_PO1JAmDS0p;j&wyT*}@M>POMqXo!S<&JDue)v5cxweOg zX#r^#oo3CuGI>A>ffh#cmh3V{wddO#$Qg%j;h>2R?+8;Y>Abj0V6^m5;^>s&-&9E- zZaI9Pn-2~{JA1LsfHtK7>a*S#ZL64nm&$ILOHGb|fbbHOU2OFN(B+TT>!rcH-zAXh zfJXolCCh42vAOtu0m2?Y{&%L!i2)I1Tq)>#dF&_j35ema8Fhb6m1+SIpx|PYa~=>g z1rvF^<7qSkns~#p>BG*EurO*f=a9ym<`3ppBH=atM^{(JS1SYNWP<5!Wkd|*>U<8w z14iHv^OTiRk>%(Y3vjtR*5WrT0HA}g-Pqnvjh*5dI*Zo*+Sju2pjSnSW#TQXMrETq z(+WY_^)e3;_LQ-RUP!*-OX9abU2Zy-D<1Kd8N@?vvQa3iY%T`khUy2_m_=O`W%;DOG#M!h+Po_hyciXw({6|XU=yecv$0%N`2A9}W147a z_=}L}BiEo;KYQb#3Oei416|V_%Oq~tF^YKAp$IH~d=N1YDrFBOw=J(i9T%q|mieq8 zLlzV?#USD-|M?xkRf13d1!8-^a&qq+O6HovB~_pkp?KO;nmKseZgDc}i2Js)K~A7(44!sQtkTNP)TSSU;F`GT@vN$NxgY5HzFd#JuU?N&yxE@}+5G}lo^ogbbZO8)=V~LXAgYyI#`TZ*|=QGCK#@%X7+*V!Z z$xS!$7^+M+(2$AGNX7 zyuWqv{rg8UJgMCtPRi%hu8++C6#Dhn^aTnfj0n|!>4Xnhodk_fOkB!wE_UZd3*hP8 zCYF0q&`ePp0=Ap){1@xk2w!iv+q)V^dO!=hMcwFFYJteFT^| zL)*yoC-6xZEPk(5S`NeF%}7SRWzHQFOp@UaF$y=Y9_Lme0?`kNpcy?{GBgc$B2(9l zfJO&5Tc~|xTxnRUNn7^kE*!>$7mfXhlk7#R}c#qST`!NDrLK7sO28t z^f_=_P=Fq7?lopvsX`fv2KoBlI#;L2I*HgiWV=g*b}{?+hrAHa75rs6;?>FMi<{+74k{}-A*7%#ct=Nf zu^u`(uu4H;B8|jI&0J2+Y)m#U5oqTQv>z-jE#&WI3hwUQGCbfdW>-|$iD>OjX)Y7Z zk0^&uHSsEpK{oSH2KF;$+WyH)=HZHhidmDSq~tz)`0#DYgO#bN`brTl7ViTh_#qn& z-}`KUib^~wbz!Yg+w$kErsc5U^Mm?o(6p{+sq{!10OGacOii8?2|iLE-G3}m70>$} z9~Y-yp%1BC_^7}-jq(u)A|o%NGZ{jPV|lxe$eJ$6T` zvj)Cj!@$tEfv)SZOQGxg=*+^x(r_^@+qf1++W<7YpWHuY3T<#2Htx|jW-me3M z{X6t)ta8KWz7ix0nf-3^X{Bm&GyJMmI&&#Z2+e$+Se;L+`BXv5_J!SRT$&_*|LY2LtP_*XMQYvZMzZ8}KuG@O zC=CIg_g0poAywgTO{$s^Tv>H>Sm|3*EK?hAB@0+i6Ea2|S5TJi4kA#@Oh6YS{21)@ z-MuaeUhl&3asg9DFzMjAfAa=S+@nx@s&Vw0AT4zd)mFgMe-44MAQ)43F1}1m>w(c{ zW-V_V<;dy(Ve2cSvh22KU%E?_?w0P71_6~45Rgu#8)<3j5Cs&FQVbfT1?dt6lpz*G48ly_ygpP=Xv(tYp*reoO4sZ`Cj=|ZTZ@ggM-7TPoM0jm3bSEM;JSU zN-l#^-9=hQazw6SMX(I0geB{yInbD3QN6n+u7`c|A`6>Gfq^I7b>J@3bq<<$Wl4fK z#U{q19n~y+C4otMi)SQ)I4|jojl&T)Sq!-<4;Jgmez`X?w|Kd>g*MvwKHs@}v(l5q z(Ep}sW$eqR;nWI?d7t)~cB&LqDb;ZzcG!3haq#qQjm3b$5-+D3Jt7M2ubS2FLjzgv zr(UwZQtn^z_&pUfOLuTr@jmg*`-W(apm2JIJyG3J^eW-w$%dyqW> z8)T0lytpc%_jv=LbdNd?Q(tCF`-?(?7#r)Z*^cBLffC4|-qY^IQVFn^v;4Otfa+Ah z#-8kHl6E{BluduR6WIWYN%gJI4Go!J1J97$Ugl($tuO4AoZ(6Hc#Ego*1~+{2k#8A zm=prquCqMm^z!n0nU>Zy&iFjA&%m>NWKPmFJ<{*fgO0fSfmE+f1=KT9*`Am3%^g6G?7>CCni#GN7O7POXH_x zXzqhQWaEX<+28%0ybAcWA;1(a=ObqBY1Kre?nKR%B^IZfxbY<))!#as;AzIC*ZWCB zY&U%76(nuC#r1s|E^~qCqqOezz&8zvokWI@fEBGiX6OLi9cq(uP%%H^V*!>AJN;y% zzjx~%5T%#)dij>2kzxZW5I&_~I4D|QY9mW`k7W&0|4k7xUgNQaPE+q`FVMXn2CN&+ zGC?Z@xRyYj1a<_CwBO4_nbRns)+Rj84y^7tn`-nItE;Ok_f^kO!y}Cj9hp$T-fq-3 z^+VMpj&JWDQBkTnS~&N7TP0&h!@NyBv5fyUiDIxW}VQeh}|r6R{MXXeH!3A@JNbh~CI9mh;VxsGh&2}uHW z*MOwzrpis~Y~p#a+Kj+x?ek z^jA`!dv6n?+;H)gmlG0ZCE?SJ!7*eX6yA0JZj|~lU$2XFKwa(L5ciwDj_|&}R;IK2*uEW9J*ph0Jee!t9|B{~_!P!OK(k?`n8`goN#gcm2?j90Is+S`>P zMNTGNnmRy2w_bJ{6C3NcyKoyF9bMOlLX=FOi>+~pQazT#pQ~z5 z2Mt6eH@EUUIdkXibpJuyGJ(a@B&jL!p~gPPCeKG=N$-0W<1kVRCRM_*8+W?I5g%Jx zT09Nqw8El~6$nY z5}0LwJoF_G7sSq^${Y^U8)7dQR>&TDg=5cOB0}>9)zcV@9}_cd=LhAhy96m8k8PKK z`G!2awT+NHpY=U=+ahFWwC1O3im0T68eTvtVsPkgAf=!%aF!x4r$3lKSo`_wh>t+a? zIkomd#q^wIp%7P>cM1}N%@Kv1&#L)9cB3Mm?@D@opY_l6T_I$+Y6v0>fC(PaB{8b zYww)mC2W|!p$weNTwD&)!2;Ge=gj>4uIa6Tqxgu}^>1+N?;qASy>l~v#C-SHouvXJ zjUN(r>xiU`jM#+*OPHbJ9m^9yq3Q1HQ-1jHbv~9~1<`oqhEW(ij5I#8&SImQ0uv%D zPHbZgLV~0G^XT5Ry8`y7R<7QoT@qr4GotD=Mm471s%Q2MZGOu)Qr2dy?aB!=nxvvL z2fguMixwr$a*^ZiKA5_X|9XNhB=PLmT%g?bDc-h(lx4ShCDW?4hhGCEuxR*NC*7}X zG##HHZ%2zsT6#K{=o|^y;OT5GJy>ZoZ_jo1wVk{x5uAwNc&29_7ua$rU`;+`d1mn6 zmARqdR9N#?$n|*3BvZlz^Xu2IwlfV9Qqt1vQ!-@aNDrr7g+aZOlfq(LE-fqoC|C<}alRI;MZ6 z6IiljZSl?Sc2A0GhTmnkW>s6cj!M$!DMY z#h1HKxKW9!;{5=@*{{!>1=;z;TSg^$l`9?q>KJ0m3i3_g*Ws2?U9}a!#ciB16 z+rWrG6G4G$P7%z2NE~f3ktUpjejcJaqr;%)iRO_|FuVA27`~_deTfM2JPpWl}`1MQMxaleFXsMZZePE4^aZ+HnjP>k9qDB|Ow&fKzZ$a)2 z%2zpIhCB+_MTmt_1&_`{nEgvAioGRB?aGO=sZMOm^6FS(>?)9upf$3+O%4C9zz|L-LlhQ9^nCcWkdP2>l=JNQM6Iu8 zlZ58}w6n0EpwCBH;dHim;DmNY6dwuPslAgF=PLKhP%;ohg`mk4z}Au{t{Qm2t-0K9=*JBq@!x-l zm+xMD8`sxRkHm)uy5EY9Vm#D^vz#fPZ#l4vkV9B8c{b2|Px`HMod8uB5xjm?XeC%t zH(JM1?cm9TXdLLP#ie1YJiTE{O!D84Bo2R}umBS{oRm3+2^|G=>4B3F-eX6Zylur&h8Cr~b4%%fEk^_iXR%te;NwTkg*`QyyXcH+W))x)Q1y zvm<|LrF3i3JWQ^Ii~RS~=UI~e{UuyTds}AMNbddr?@ha|syz4zcB^au{dRHY|9)fK zQ0ZC>o1Y}k`hWg*-yxUfjc!T((*M5lQ$?+5#^C{Y;3y*u(3-DMTu!eA;{YMy?4xw* zBpL&Hb8Dn)VhP5Mx2$Yaho?O<;3NM{GP=F_=ZDAby?2h!EU>%y9X$wwtB2?cH|_o= zZS@Zi#Gd}=I$*rsi2eHa68ew^FDp(||Z|NPX-M#EJy z+G-$Rwn={^S1pv^PnPkmBk;ywxrrCzti$i!p&c8@ut_QDX&XN!1J4Rk=`u?vARw^v zD<3ai%!Sa!#RVCS3WtHJi4Nfhv_0)1Xjo;A;}uvVynK9oNaGMt%C<8nN}ZKBnfxVrKyC(^~w&6!u)4PpWp@S}by9c<&d zgR5G)y5V3>V{KzI4~|CQI#X!d4AXT;VQApYP=Yo$H}_@ecT`GBN^AlGRz+C%U%iID zK3Y}~#Emz5oR9JvdGD^ugf!y80L|vLp2MDJ`TdmuBKSG8$^x)IRcviJpy%+o>T8L~ z7t7z>&wYTgvICtGBsH|j#VK3Vi7M~y+g-3<$$1*MzN!Ps$WN$3;;2M$k#0fS+S)ru zlPBrP z5z3HB;vy(NZKbu{v$wrz*W1GYBZ*t-G)YEBM|b1TV;h^6-d;SjpbHUXWed-J;(^Qh zNU?y|ny!+P5(6(U;jJedt_B$&)Lw^v()qw7E>023FjiHnR!3Y)>mN}3WDlT@$7wW2fe)NMMY$fn1_z}o&0jnJOuoMRDJTf_CD1eLU z!-lmd`Wfml`(jy;rwTI36N`khsi!yh_m{Q?+`sO2dSD0Aytjd8N5d1!Fq**djMp~{ zya8mCLOl~6qw4l=DO^Y)du?s4uK!h7XlT;Qm*E<3BpGF7W*9});o@H2)ERhphct3% zd3`+=6idw9-1s0i76f^R-5jjFA@l#OsehM-tE6%~RX&GyT575#Fl~JR1fZ#S11?01 zy?jmW@FWVj35n=sXh6uI1ka1s9t|pj@0k*$B_$=`8FHz&xczUBM&@hJO*9p~StnXrN3% zYFl$b`GtI!#qn$x@Bkb{o)_p9g2I>$T8?3DkwlQ{ z;yv!mlvh>7hWEt*jetp5__~aY4B5J?msbb8B{uu%X-|pAZXl2#k3FAM~<=#y!Bs_EM=tV7O@|yIAX@2Px+_sO>B11 zWnJsuTb0CbIPxDfvlAYEev}JyF2>8($H#na=o3=Q?_@t4M=3;1Pw#TyVAQ@!+-HX& zmCr08o?1-LAnWz(=pPwkz02KDoPtrpzycluqAWB5i2*vT{uBr%1I+-L7U8ZVAH&_d zxPX*Mp926N<0SlNzhAZs)ciaX#E87SJbnlx0bs5p9EF_h6foIi^Hdu(A&E>1>>06k zsQ9$6ovo%Ng6S2jm?ql)ZLky7-_G}WTeXh1pUS28{AqO5#;#!2h9EX#pkno{!RHG_ z#Ct}wHFpjQ1P2EPKgnoF4Cdk`XP#u}BNHMY#@3UlndU5RO94DdwfVfK9f^!599HKbf(5Qb@h|M z*6YVv@(^)gBM~b+1eZXhp+Q7VO-+Y?GdQTIWr+SLNqgYvv71OJOl%9VvH8t3cQ4-A&mJbDL? ze~zLc#9U_7cJ}x0mDw1jxma7mkk8FUJF&G&BL3E}luat`@!^q7A8$XY`M}12v+`%5 zZnrYI494uCT>w--YceqK)g1h2er`U%KzYLc_k69ebO-P(W+^FSw>ptT$7l$x=Fmwd zlWx__6c3qii_~Am%Y?E1IBXvPLZKKw#M)?SqS%ZNn$8D}D#Lzqvj7V>GcZ3Yx9+(H zS&-f*m!pmGu={V78NrN*$FNe1d+?JEJ8~aD`Zy3gg4C4?J$fA-szJpgRwGhtoyYBA zYUcEC*Ge$T3rc+&8#22@9fy6UR~QJEkiZd`Z)XUKh2`ZmvvEML%XMKNr)N1UF&ZII8;&7$@Ea_t2**cF8)9{&whUvH68lPT#n|)krT=&aT z>I5e0LJxa((a6{SH@C>==jV}}?(1p#e@w2xfONjRi%!Q_Pg^^bNcNlQqO+5#> zijf7w^r`4iJX8(Xv0Gm~*_?Q2{A7KE2c}f*WW%XO|RChN%e;a+Z zzua#H3KYWetJ+%egVjM5fem=Q6L*Q2bvLop)%ku*FO+6r-k|SfVPXlbeIzN|?|7@Y zb}G49lUQl^KlvlNWZXZApsT{v=3lGov|&_*a8tWpQ{M4 zG&h>pHt9Kd{VRGI)F=*~PoJf@Jt0pHdT5Y;G=%OvRcj$4g^J8jUkw&K;EL@{e(~b@ zn>Qv)^~al&SZ_2w)D|@~Os&-e2BMEY3h7L!-QfG1Y#7D3?3!8afA^Pfr2RcP$+`1_ zEv9!S@Yn?Mnwz|n;2Z^!Y<=MAM1@Ukhs}?4k+&hp9j6V-y8jM^x_R8|aMAh9-hB!y zw*58E&NIHv53FAXPKw`r&z7BiQ)EsH0hMCVUm*Q2`U3;Kf}5>dq*rAR4QiU*5RBDi zGCm4dl;_=-+s$p$z1HI|OfYl3235*;*7cW^J|2IOhRmcY9v&rEA0Ib&J9sy07uPp7 zG;q&Q8{YdU_2@fAcsNJ4A8dxvCSRUN3}HfDppwRG!uegla2PCW**P6ukd`eIRfU!& zAYcA`c8|>n+6Xt1q37h}gk$10WM>~AYJLCD9Z5>$afAx6$r7)6O8TaI5Xuw(7Sx^{ zN|6zK`p{g;>C&}ZLah7+M~v1d-53SQc(XiSt=DB=pI+g2{LUX)87L~v9J}tvcndYy z#I27gYb>O9w10lv>gu7qxy$gz{qw-@oEaEL1B7V5+uuKM>Ti1ol zDk@6rx&z7_Oto5Qlvb@lHd8}!*)id33wHtEdE*bb(OJN{C#-1$5*`ol{?Snhzsts0 zdCVDW3{xtviQnugmzbD-dDBbFa%3$<1Z@JGe;}dt_NY8trdRhY>kp_0x{|HqAn)Vv z%o(<~v8b!|FQvx&(}`ODS6rBn85_0Iuz2Be@Pu^@bvo?Xw711HB!P1<3{Pq{_u|!H zGyIv?OgA3rnO{Dd67J=&Ny%>>+*9d`e~6`S(^`*?vw<$Js&xDI!v>e$?(UD5UTt?3 z28y_QN8><_akEd>|A<>7OKR2imI1B_8UkQA(QSRm4AYGOwrlgEc zpuLp`3E0ljQEFq&`Y#`$>JZ46e0?R5`I6A%K641O;_knrjAznEpV}c!21Lc;T_zdNlW~KcR2jQEkXqTsI?XV~r8+sYI zjjsw8{FGbk6({!@%GipiW0(I)do&>SU0;UshZ>y53Z7gzO;$h1G&3-Wf*)@3`h#D9 zeO%znhLLQ)wVSa^I@;P>4*me@IXSb#1l)Da4S)ad7UgBhVqx-OP(EL~Cu9-#4}bQI2}%bfC1j~Lt=w}}+i|*nn8h)ncyV-k znie+SPRQ+lmRTrL1rWAERr*HKO97I{osG}^3XqCGO@s^r?j9aJa!(c(f8slxD-3k< zp^M@2QlKC0!j@tH=^c#<-ne&fOquzGlG33M<>X-M+XtUj1S|$r5W$@?Jg!_{)s#NG4ubT#)zxTGr-`8${Aq}D z@){b1$o9m1D+Z0YD*|Zba(C|F{Ikawvu57%CZvi-2Ei_9y_P|r%=l}-c`A(uHzc2IL?y~zQa~SqEzi&9j;zCaRkM$5-0}Sh?@wxQfo0|`sBzR{guA=D;$CYn ze+Z0*K?UVFE*NWS6~5@|=GFqyNx*T8Kj3_~YYg@X$__$5ti;jmpc1;^jMy0m4SJ^c zf81+|R1?a#=7FBvcM-}?w;48@3oaWe)Z7%NZ+R-@4+!A#s;L5+YUzWHQw0ozWxI{uW-&k z2`x(r*8psLun7}D%284^UJF~q03<^QIap%+eh0R;!c@RxBDj~vTdbSId?sE4<&sF4 z3Vq;pgtbv;N5?$$ecFEI--A9RFMM?j58+DV&$oGbJCMG-^3l7uP~q!%R3BVdR>G2c zPc*sx2-d76=v{n3+5(Tc?{3$&N56C=m}lW{ZEbmu?jm+~cACNFF|LcwAD=$(fCQdC zWe4V7Y^haGlX6bZyC;6)*}Xl@b(#3Wd(H{$U+_y_1hU}B0nnl+{WITYW@d(^h&23# z5G(`82n&~AuJMD5A|S(>ZsQSnj!!L$4^OBQz>snn=GgJhe=1&=A1nYUm<1l*(128w zQs~hfJc?l%^1H2WVDSaM!0s=WXqYI-83bu5bj{7@5T0{dVJHJ@e5}Uk6gd%JHHW7# zm^B}Uj+(%H!4xbC@>qt1z2eevc#UFxUOxp%RO>rG2)5p6V(7l zWjlL&tuT~56rx&#jYCdLPg+FAGa7j<3n`uewvUSe%Na>`STz-EZ zJ_o=R3mcnWz(+(g1_|n@>^We%ohTxY5lRSq*C+%j;(jnLFL7<`JnCZY*JL{9xZ{>{ zv1MbjmdzU@g=^1cU1p^I_M-0ZPUhbu4*(&quz>>tITldk7SZ9s+DE^ypY+G^zgz%) z9Bgc@%%J5y+SnfDO-2q5RX1>pem%V7XjrW0_Ea5*Tt`puz4&Zf8yY0m$2J)NR7H0r z@h7ZsAz{#6NS6`uR3fdwjUWmN3i?nX54%XY*Sa2b($Q;NX4(FM465)oH8qQjY6w9Q z*baqwK>+XXOso0U29_ zM#BB~*P-q0ZRCY*OxE->9zyoXz`}ywl}L{idw7`>EJ7J?jSh7iL2B}A!+WCkM5)(a z%s`_DLST8Vsf9)E!Z{g_VGiI`;^2#*SY>2tnzay+ayO#s^01Wfmnc37N3l0zbmhIRtd@57MKd@QyK66{St=LIPArx*m$NASkUMTH};&okY z+Zlo^dzZS>7L-1ps?9bEETy(ibdpmMbOaTGcOY_bphhPaDDe;sfu^>F(;=6~jDjZEXz?SxQ5Myitcy~BI!s*E-phkn~bpGcn( z(#HJ$ZCyuD+OUTkKS|XcN&hqo0A0xjQ+j%OWW>k8!HHSy>gvJ*^+OAor8|}g!I(6i z@8JPQ;~wfQ_vidAmx7p$08?c_DqNCkZ&)76FqgGaIJ8S@s z`@CY}!ZYrWEfYvHq0%q4k1un+qu5dEDY0x&Wq*Uf8X2f!1|uVUH>*ZD+dZt3&saVE z%2QD4I`p6WZUVLzliy3gn~qO|pCmDG-`-uM4ytYxMp`~y~HIQHw174XlV}FS4~@3P*}YZuzGfGM0IwYfI>oj zb-|WJkdZJy?;&vBgC4gbgw>XHNx^rN8TMSWPyXNq4#mi0-sHgmhC#f&%`p$r_IXEin#u-zCrCmI%aLe6MwJ|d@}pg>GVx0RGO127m8M&>nb zh)PN#eqlpGLc+$U4|r_|0089*w3nBcZ0pKOO3hte9~A14u^P5x3fZUUfen1_8}!IA z5-Lk|6b3={#32#Dy|9zS^uov4dYL$6twO}9rl9MfL!v?ukpK_QX*C0aZSk{WVAwZx z*wEg3(hl}ei%BwT;4lfvmz4lbAJoY^KUL^|nzKQ%lq+7fT%VYj*n$4ougj~k%jPJX za?F44-u2WOg%2ZvtP&jzL%6jcW>-ir+z9#gzHA5to_d1wnOMbRW1FK-e=iERi5?AU zYS-Lx<20UHpa1p4s=LvH@~k@{zr33a;ta)19Jaw5YEGxcHn=<^w@? zjP5+>e{lPZn{&|?d5JOPmV)oaxfOY_CVE!4oB<^5?(gp+ z)s(WR_`&z}1Qjw46VSJ_S1gqU{W|O(`930Whb2jIc zbH=WsCu{|`E|0Pd^(`g*$4EC)B3V}zNz4>1G6tAB@e_r+IdwY93 zgUDeEc6xbv`CKNmq$Cv}S6%0Sk4+t&W*R6n_s_rzNe&9P!lgQ1-vS~?44@3{0Gfq* zDkKZkK)|T=T)l>jJy2=&+Q2TrmA1dT8&X=z2WE${;4feWPy}?KifJr6!DuP~>_aG^ z>g#~n_&g~oc)RK9Yrz-SJCdC|7twjPdy^B{za;hgq|>;omKpDpPQDF{njD2qKr*t* z`t5AMzIxSq(7{iYl*s)V4M8IaC$gGJDuqYklOX%KB z>Usn2*kJ?BRs(Qkfv{FE)Csi@5_ThtI0O-6!`0>4%jGcWbv;|GT&QQjrVw>}H7pp( z>)5(wWj5zGf4lahbk1DT;u8}i z8L;(SlnPqQEZVHyevq9>VZ&J{8%GF{Z8X}^xswk1f8M0Inr(UYiG`-yI2KPVL9UQ1 zGIj!O6pzpHxSY>*rIjsmTm`+0$S#(6fj%O+f@wqM?+ww*GoG-=e6IRB;iZF@30AL- zevTCq(Af=<$kM*TBP{QfCBmXDweqGxA%U>D&N*UEU3c(?qi^xg@mS@rpJ>=?K5CV1t8Z1c*8 zWeZ&&ROMsS;CW4UbFEVJ^Vw1t`S6vb3&CSGfLYkAZre8rCki}+%50p4YTZ+kl+Vkf zWoBd@C+A9v0s*PH@lxOqh;|_1q_A2UDW-;I-jWqRKfl&i2H>N5?(P*mN0e3+5Ckl52?+`g6dQ^0cM?-j*t$DIR)J!L z586~=yVxO(o($Rn|B5aMlVHqk9tYMJnkD)LkpS48r%$SII`j*Se7w&b8$IeMzbBa1 zF!}>5lI0kyK|Ku z`x^j#5ylxG+Wr0bpG|3qIDLB}x`Z4PoymPMDVpa-4r8M7#9sLKMjJpJF=$_L-w1HL z_=R(j#V*3uUg&uN;<*=7_x>CkAQNlwHYcH>an$h#Wo#@|EDa!XvmM9@v3w2vbMuAv zXwl&`Xmdg1Ft!)Esj<)ivV`jrom8`5L^jaMeoL_PDTiS^6jIeH4%}Ejf?lotBi9yp;L4GUo3hhdAPhu~ogz{z1 zgxw41s^&uKoHFr2&wM4UAd=*DIT7J>cGCste9)+yjg^Fkx{&hTC@2mCDSsALocqBZgO??vnRWXTm=zN zP5=Bnttv%*Dt0|}x;Z-2M8j82&*prbsfhi()Z3F|27WR=`s?6VP_t%Zui@(I%9^V` zm7}wov%u7>WUHJ1aeL-EfpJD_TO&?@aYoCJe3Z2>Vj+=V_@t)Nn@1aQ#B~(;qt@@{ zvca|xCgL#ComG!)yERBLF`+{GiMC9GEGU$e(4ksqi}ZtI2*l4XE*P;OvsL=L{)Tch6m95UR^$zy?;a(>FDUFx0bl}E%Ebp0{F>z>lQVf8pFSfpBNvX^1>f{h#>|W z@@Bw0VG_V`33?y}CGo!`u;CtATew;Z~lceAaoUAvY9Elx-|INA8=g&yG} zca$q|y-TSs2f_*5F>G{%1m>_k7zPi{C}ngBi6|Fq=PDV6hbBw8-bW)BK_m4-pu5Ur z(7rMi*T&QO^69>@Y4F?eTV=;5Y27@cKWd$M`&H?he=YAYE5{`@4p58Ohl5-1!S*bD zC<6mGx7v|lrj)NBy1X2~xoT1e;1BeB5B`FrD?BNGlwH6NPLkN6!SJ4OG{e1Sa< zppRv;oo7TV(yVQ*t=6|*HFb#9cscLh*pR+tO?b2|=jMwtBEY6r7F7tHBDgxD3q@=%J;iJh^OzPQGKMc zSQxxF_kJ%tvXK1TD15P%z6n*WXec$50U6$5R15hD-%%^u1>Cu!O3X%rjJKtnfyUc8Z-Ey7J%0NYNrm3Unv2JtCD5RwiJ1HP&heL1(^GJXWvN<48 zV-+@dGG`k?APHlVl{K50h2U!58jf=Uu&yh-tH`u*;!hcWCm&NoV`Gbi{sZ<*J)r(5 zC@Mn26+AGYWo>QUZCS%&e~-@*2HSc&;0_CLHwEu#u*G*kwsf~`7*-_{Gcy__PM?+yME1*i3JP$RRjvOcg)JaBmcIr=lmgHTaXfA1UH+jGJXY7+)G3NjdY z;L->e1^tg4J6PV`RponL0GCKQQ0+8{Yhk+)Ay7>f+?2l`RxZbjv-&5mez$TrfK}7y zZT$toq^N8y*~0v9gf?}xQy&%Lk|9FvB(}vhl8$7kFrxPK#pXzmY}I} zELk4bH|v1>x;SHeA74Vd0JW|TtE1Xqrvi$)7HKQh0k-Cso+_~C@MO_ z(*BI4WCq#`Kme<#l>j#>`|*6q?C<()soyiiG!tt4e|M8W_(OIC0JN^~ses#qnA&~D z866MYG2+`K$h;RC0`u$ZT(M$IwJl4rxdu8>m7izl4h}DfUlZcfNUG!1=7bu42pvgs zyw6h`Ebt6&VjCqbZb5^|#XdfhWIP5SpO~BUIEvc|i@W=u zhQ+;X*wIsP1HXKIrYz&soQr}rP_>CS7O>-_s5}yrk<>m7_ha$v-5ogQvlTAJX7^5o zdO$$K9o0C<-z`9-4}VYy2#^A-KfLD!JF}qRHE>UnGcce4&xa5s>QQdSlIZS1#%*Bk z^<|hMNN>|YlY`=(=~^}JMs*x=k;7A1fCPs^z!H67aS_=gfG0$RMDpE#W5Wz3zJC3k z_%l{$;Unfto)O_GwB@*^A0M4;RTXP3k>S5a1R@5_o#h0w&jUo0~j* ziBVC_P|KnqT$(PbxqnY`=%$a|BStszTJWV##9H;%&`6-^^*}yP*cQ!dRrwfrI^ZlN z$dj2xMXP_U6XhIJq(Oas+upvQCst#%=K8M=pRd0Daq9&MJaIJ^#*ZIZRi>q--TIxL znw`xTI}MdFn}t~dy)5sQDO^23GS)=LP!RRxDS}is!c_pY1&}JHDR$|y-%m%qOjYvo zAo5)No7&m5Th61-#Y!Xk@;L43!pyDRyW6+po9YFK#H^ljQ-S05bHq`Te54dhXtf_LK1~OI$6v*X}98fi&?;`%gGsrw* zn>g)w)l%~mPwH??^~6V{b!L%E%UCZM^RQuld61A`O(gOoPh@u$2S@$0hU7wy(Ud%0 zfAVqttJn?Y>7Cjj7Iglb9HAzbp)4=&5^aION<}l)%8R8trk$`RqvGQuAQD2@wBc(j zh*?iI*{FM1j&8=rnx2~LVEZF zE3U-jHVUt9+l|xK;_|vasB0U2OVF?`7TG*RJXFHb;7{P|{ZwUs8r7%X_pO;KzGPKg zXrvL^=jF?S@ef4}6f;}uEw4R4x?P{C!>=-ocfXHE-q~DtASpMyhv_`S!P|riWV!FiDIoVknol6+z~F4}6n4=&#%Z0e^EXGrcONH4 znGU;g(Rzn6bSpH}tvq(Zr#^n+_Rz|rdt`^4GX)nIoE*Ho)emV7c6XmEzEf35WqFC> zm#c<{c^@4edw@UTm^|`rW=g0>V_Bbgjuj23Yry57`>vfWxxd&~9_*klXX+D|Q(C!G zzeJb5^YKM%wdxWpqt>aDapJ+8_rc12WaA2|f;Kqu15=(D*#*K5MZD3_7eJ|a&0$OM zsi;yG@ca^Y10GhAGjKyiDnTqQnJlfWNJvSUv+3g#9awW8*7K?|#(Xy$;J_K~v{J7h z;fTJ}_K$mRimJL;$S$}qV$~n<(y5SpQ$pxi>$S$WC;X`PIu)ff2k0;GYFMZtb z{iNnCKiPo(yZ8onz1Y+CS>pzM!YNnQ1+sR>M?M7K!=ZJyzurZ+IqrZh2C`-wzT8^}_wIIN*9`(6n4t{jUg!d`C{dy~%vD;vcWVmx+Z z@!)!TwJ+|xw9K%-hJs$Xf}*LLSqaOL$R&UvLnTxtzXcLhqe%C#=3{Dr+d!lXEjwjhqlj_>-*)--fOnregL@? zkM!}RP4=mCyldeJC*7_cBEdbgp@FE2cQd@OK*msPEqK=D;#p(Yi-EB&dY;C~5c&9q zFEv`4n^rs6)q%4rupa>Ltzp0K7BE{JB6j4C;<)mkmR}cZsMwq--5uTD9Ytwo+xAlN zDbasKFUQwRFYR|7SPVd#@QR9yLl&fkl_h$GRpb6hC|c3Sr#9NV)-72}4n2&@z65e^ z;@k+s6Ar zQN&-#3&$=*ue9kOHH&-#<9eAli_5nQY=jrL3{_pSI(b6w6 zK#|+_r2~)@>TM+7Xl;}znK(N=JqAiMWD3K~tay}~_Aj2A+3@4lD+);97^S6YA;DwY zbo1;B>F!o#VQ0@6`^ahi=#k_F!JPDS+6te(_{)fK7du+J?;fsUADv%4GUl_4#W$bY z;X}CQFWya`OP%!I#)@>K&S~IGlN!xuH6|OEDCGbasJu8@s(UCL=<`j3c{mrqu$X;3 zT--8;vL(LWqQm zCGp`M*B;>Nj1YudlRF%_p+i2HVs${(l?#g6m(s)e7thgen3`kG=`;X{|Ll?0H;T@SBivu8yzJ#s&+)lA@9i#&x81l<6pDh{m()m zAv;Nya=Mx2=Ve(kDd`Nwe3?xz8ImE~o5qKw_4DmWwLm~=(RBx-m|f?>C<9~TI6w_E zNYm+VJt+#EV|#-|X*D2#B1tkgfTE?CZ)INa#mC_epPJDWtqV6n%K@L?Tzr4M<-|gk z&;DoUIby_nv{wd<4S25oLSJ2GzxsejM^bWfD3Qzw0x}F@bQC049Y`F2rp5w6fF@4h zqb}!o+c})D(F}D0^0kl{=_dT-^DVr`hYiQLQ3_!;`X4KMdI}?*GQd-l3|e?G8^wH$ zYDw=?q{eyhf{#aT`R=hG=0?qeiuVMFq1plH4ILAc2{v7%EXCTI1-WoCGvlDo{f#Ii zdFKsa4DcEW|{)`R{1#=23tB?eSZ z%@lyy3F;LYFyj4v!KSVN%?fDs+x}EExwf~suwbnjU}ONVgtw5~xDkQmw)UXO033qU zZcR`(;hIHI;H~G)c)W?F$xKx`anHP(*wWJ98q!RYPVx8;zkwRd${fjtEzq$w`K@5aWH)2tmG9rNA1oXU~= zO6b^_0aV2#a9S;94$*TG>XOmB6bJ-W*BvE!U1~1>yLWeo^NA$@l1KI?p#(qxGtq7k zJ@8a~Y1F;{t+CFttd^h1tAS(=MX523){6h6MyS$p0_T#azO}be0KH|ds`rq$HkGb5 zexr?x6g$*VCcbiZWbSoB>4KSxOh|$dy6{%$PQqdiDu3DNnZfbC?(gZkXJ}oc3q2)P zNrBR6L94>Ud0b|mo|W9Son2i}q5NV|Zn~bTbS;USaa{A7Ga4#t8L&l^R8+W*Vp+Eb zq2d{@GP%`hmVbn?v2Wg#y(kJ9mxd&FN`|oAH2{i{EEM2x^t68YMUjf`9SwD$ReKZ( zR6@xgoDOFsf-W0O1V*pGF3@7{caM96ng^f9jY=&%$tcuF%q8Ms&J|DIlZ7A5!5_V` zmehg-fz%j|8He_LWzUj(3@xegJJKx)*@jRkI@UM!y-n6cX$4gX-*3TR_fW02{XUt3 zihgu|K9U{@xbFF+HB7}@)d+R&fV|`ti`%e$62k`vCmFEQv0 z_`2%}K)JS#4*Z?~FGo5@!=OI#t+@aT`8kcE%Jglj(^g&Nk#@PC>qJ^C?IWO)`>Z8KK=*9F;;On;?da;m4=6*w$CR!EIH2jq!^A$j6< zw65gZEe=Cadd;p~&V>;Hubkc-N+uv@FhJrE39CK_ichV=;Q?D=(3jqZgG)+`>q3Ep z4@X5)gHq@at$Y*AG|Hg22pW`YKp<8*-kSbd@8tlsW-E|SK(PWyB9P9&38dC{pA9tJ zNGJwukDO_0_;$+UebVuRFK`ZE3Sc{M>d`}Ow-?QZ%d^tBNw4VDjg}LZLOL))T z#yW_wPf0O{ZdLZC@@K-+F|y-R(>wV56^TBeS9$b9#!xT8<+vfNlfdY$mIpO2(@t8M zcx}B;s62)%ZOL>`>({r1#A5|qB~#r>_j}YErnd30)m-n2-SXdX_zvwA>s%8ifu+}X zrH7nu>P#Bcx-x!ZuS8NCfEpcUS>767vVHdek&Mh0oX zOGR1FQn2yx+TcjW!ryj!KRrRi-cNs zGFF3xP@+~F?_Z|B0|f@}Gdv!wW&l`j25AfJHoE?OB}g(@jD30BM}AtpVH~uLvE3Xk z|E$#2{2KXXHvMdD-PST3Z}E~%#M1wZweI%nrZD$KwjIi#$t9j)&1dyq@^ zWw~omll=iM4wzt+rF`*TWhC^Yd~+w84Uf1Mm$O7u;bsTTaHQJYPVp>i%O#2J!XTNU zlU=c&|8DlxITk3{t9xWb4&y!!r{+a#8lj)5G($P7sJVt8*xte*XS1T{+A`PiKInma zX;Yoz26Hn3TK4&^KI1bYV^3a+sdeVsLTb6-yW2~>4{Ya$>CoD)5(;ZRCwZ)kV@7nL zZJ2TzKhBd}>^C;>egy92w{-e-KR4knOZEvse~Yx#ecwH6YledSkhN3g5{vonCAEyaDda7{@t!S11OaE&mJ_K$H*=coUc5{I)OQhft#~23?)e`<8ex&u1DD zkHkNXl_Y$l@v^OT#WRnFiml97KWA?J|zZKAdlnA1!YELq>!Y(_4(M(uod}+)KLgSWM|{yMuPBP?$LT zap~8@SMz4~ZrW~EB{oY0NE;Xy5XJfY>ibZwn#qFf)!)QS-9bI2`|XhDAZ1Tb zVB8LJhTao5O(GVmp_{kUGrBN`w;RNFD}72 zN+|7UapBOc{9>-FR>u!-%lYtU#Y1wbX&WiY%BPs8r6W}ceKa)(V(vF#X9AbX;r-qP z9_bn%+Q3Z3sm7Hf+7$A`R!Fzz78l>j>f)pRpO&r!8p^f}4?|>Ms*%PnDJio1EQL^% zkO-5(7s{SBGR6`qkq9MODj^1C%Rb0xL8?JBmYA~52+6+v_w@bFoMR5>%)HO@yzg`0 z&vjqdb=P-_oc|PA)W(Lz&L+=oZZ#Y3647)&mw>P?vh27+WJ4+O)e?DQ!g~7RyIjuk zkgco@&f3V8Ka4L@J_=sY@ogi$+ z4sgcU$Fu#lykJU@51&;eAX}h68S`|`G;wG>HdSHq`-Ynp+9&G?>1vN5b*MfBT9Wz7 z-!?qGRJ1za5l;A2WBj4mQ{vR)ALbltAto8>$WL$1JR=62m6#QimgGXSy06ue9m7&& z48oMp^%sTHW=G56 zfD6bEHejW7{A1@hB`yn4c`F7Uwj7dW5gXbz{1fVxd!tcx&w$zcUzwqARW3=zC%m;- zOKj}Z;<$aAn`QFmVvVrz_vg(G(eCThZ3y=2ogEvORag)aan&rS#j7~Va`T5p-cT(> z^m}=69rrywW>q%mXU_{q>sx@_13jk}O&8*lY5c5Cq4d+tBgTr*AWQeb9T1 z#{f&51kYyZB5EMc;GaT+$+9_9oETiHapm(f`{r4I-S?1cHaMOt{n+8_fBhl5^JbZ) zajQ07Tx_v91E;Z9SGx)SvZmYc+$pKNKjebTa#Hzi|N3>Oq^2&MfG6Iqjd4a(W655_ z-2LZ9TfiL4FkI*TEmgv*I0vLtM07HzMX@5kS9bavvE*3V=#Ho4IcWNI=Z zrtF3%CMHmp4r?}C8P&lv_Nl8KE_L_I^&ooL@0m{i8wAFP$N$g0@;0!h#eV>HAQt+b zKsItr@VqRseO%VDDltD_8f>KDxXdV=dk0uIDKYa}y0#qaq%9xtCjoQOa2_tpaJbse7~3NBOf0&U0Cnq<<#z<@W8lS;S`P zo_OlY{^}}qdClx95rqUJ$4}|1b}ZkFI%QeLo+bSDi@DeMB62YN*KmEf2LF9dsga(K z`|CqyAw4xwck15iCSY!~;u0P`dgRxS2^j_LJ-ye{SsurCd&hM3+rxs$*DjARUgZSy zdNmH2`zFpNi`Gf5MKp=kXQJew{RlifeWkiE`3^+vTwS~Oog|l|xcQpe4i$=EiNb>0 zPnzwrZzX~IOuHDzv=2r6_xH%HC{(pRfza*c?Y&u9RTVUdz0QFA8!c?00EIiAz65~c zZZ-YO)8F;Hp#cq0J@f)kSZ||>H%!;zPA1xy6&0N@Hr@dyG8kk$VQu0xHuA7*^K;4P zMzTVCKX0~8jQpI1+?#pg1mUK5Y}=?fJ3XN_NQzB5<$5(}6YFfe{DgyO4eYFx?1HksN%(4YKJ*oM8x)tsou3S<2w zT;Hi(CCHYXksCZgUF+GTTUu{Z(yuc3bjy--7ogE{v9Fhxxy4|ohvudA(Mu(fODICt z+Z_y*g$`%8VY`1Pk^|5(ef4T(ROAvJf%f$F#teMX^YZYRBwJZpj@qpqvTPB*L(~TN zQn0s0^wnq`f$ndH!H7Zhj038hNvDrQqfhgV3g^D(=dG<{;7?5b30MjeHa~sYdV_9@ z9zN`oOb2uIl$@MoXmF-Lh+NsIKgJZUgNrl?ka|md`)P_TM$xA%%T!iqd0}I9L0&r3^VIeNm1-p`C*-Qj#z%VmWz7E(>|I-keL|{VC!Ik&* zU1&Pt7;7pU4c(}Lj?WK@oOV!_D}lO_36nvo?t0lJZo?FMWbKK~ONj*fA-nAlkbE}l zg$->K++qAio9GpFP^DfP^#lQ+xL)u5^!nHA2W8l{*9w@L3JykxZ1L4kH~MpkF08>U z-+vPStOTLTRqPG`fGjNXAm_4BTTaZd`3Ke(E!=; z`!%Sgs;-`2T+9VV<%MNs?%U;&1I;l;W@g+>;Yv~xAM?~oCX)+`iw$IjrfLFYx%QU& z1{&eP10Pz&%xk!zdcF+!UJ9ImhUv_58Yn+nk{S%a>s%5dK;F4Rr=*Gb(0l3WapU7| zaKD>f%Q2QsZtwYh+u!x-hEb-N(_`Y&^qJ7@IeLWFNk#mhCq5e;)G`F(*Y^C=+NDR9 zN!0PK_oObG@7o>;%&jl(XE9#k+6bQFZ}IhE&CaVb%pvDT9f)Iyp`s)GWw%_-%OmS% zBqHRSaWInl$kj`o%NEnxp^TZ>0`X)HD44;6@D}7a7+(;;GRW=4dO7@n78_Yw_MT*C zKvj@1n|J2S8LJ4Y%ZGpTW5rWC^39C2gG|Lf1tkc+lbLT>7UrP$G=)hdZI^X3%v>7_ zc5?EXiWZ#s!d5BkD)`8ss;Kd?y~F{>CB>$C<{v+RSuR3H`WgJZVr-6%&X9I9nQ*I@ zVA?Lvc9c!Yf1`i?kMDaLE1+=t!JPbhR`{d<_rze?lhizlds-|Ku!4{ZdEdK1H3;(^ zp9(K{jWi8u`?$Fk&~$itc^kuYTs-rj(Ai)2I3ojCtp+QbTSsat za`e^I7O!m$eOSH#b2aTt$cfNAb)bgc6^wp!mLajkzn&3shG9Lue|O>fCXT85^Uvy; zFm!O(N1;#<%o3xiMY2S0_Wk>;$)uQq0y$6p8cEEI)5VJkSfzpGW=R(_m4wMKo70!w z)>>gdo7VEp5g455Nqg7d(_%gnadjQJxVZQYkPiI^<+Ar5owE@Ue!zv17V1q&dp1go zYYUxAVeQ9nj_S@15!d-+$zi(M(OVCi}ENO!L*zO z4;LdNl)Feh9ya7ccc8M~OHGXd5}2xnhKvBGwIH_X+aFr(|Vu zBjgVrB*N;0*I_h;Vz1!G58iuWjqu`(Zv$X6oAwwQ!%R+29tT7j=pX_-J1j3={PyCS zvH_<|pgPjSvlr1rmZ=DsolVh^-ls+#?^%qmZ< z-V3~XRP%*5X5-?_9J{+j1m!3A^H+fFbA*fpt~KG@J4yf_*YsReW*K*2s4ULYa#K* z`_I0=&b-s{f+ZOZm3#~C6SRs4&yzN1NSD%TD8u`0&C8#_3i#ds0)ZE|+J|Ju3qdVq zN9N`>Ev5EeM?<5(>Z_Tzw_@vPxs6Z@$St*Ehj~@PsDX*xTDX z=T|&etE(X+%~Iq0_KP>5c1rE==ukx)WKdK$tcw7YZIv9Z&2M@p|Lbz9QAX+;6@ zP*K=8?40#6@~eE1)OoQGXR@EgG5QOnarTOey9F&OexYK~*J8Ba;s~kgofEP6@;-lR zn)#qo2VG>9U|d1vEx?K)rl+UJ`iiiaQ@hIRXUzVtT149`CFUDlFkOvagF1egyj zKl~C+B{-+1rofvVz+Mj4sN*@tlBBp1D^nSf4C8yc6ApJ+5Zk(S`}%n#cAgOqr8O%0 z2kbOL&P~QXKg4GH^YUP8cxs?0Di-lf6_;7n$Fh?b&le?&utEk74V)GGF^F=XAA4yb zb0xE-)6+z1WmaQ!dmKHOy^K)bp3n1`38ERzt4(mEz^;KPe}b$a*5&sV2`S^6M<^N0 zq$mIHmO&5Z>1XCZVNz&5c+7HNy%K_Jo(t8{rIh97B7lvI3hIV+(@VZ!o9|pxeAkEV z2fp3i-C=IUY{YQADD|Gur~9!Nx8BZ(ROcMB>&Gex)6iW$_Y){=1D>V(h}x>oxGpOL zuBVCyD(Y7Ab@+1DKm3NXH0O9;CLnw9LlX;ccF=FvDemG@{(t0? z{O{_H7-*uajRnFRFPVJHC@Ao#N`Yz*>;uvek??}S)ipIp1cgc!TQ8z&YikQ|-7Lx3 z+;1N_c;VGaQ;$b@zVD?J{o~W)h5iSno+(Lt9W3dkCzVrl;&kn5jLYiNo=lxUmiE%! zzWT5;tc(tvQ+p(huK#BCz7iM48VQ|W`W7dRZR4KA{VeAD=kLwS%M(Xuu6o2So*iO8 z?HMv(sT9gNM@KJAO-4$>P!EoJJUvTUPIb4Nt_aJdTW;y;ip;0&&ikqeIBhx3yL%gb z?q0CX5JVN5wVS(%dZ+sHNhMlNRaY;u^vV|%?Oy2l-h51FIpGfLHk|9<77@PA)v z7^^$EM--v!7Ferla*M8@DFV-HS%a-nK;H> zzwAv8qv>uhUd-)sPoPskX=o`gGSjuS09u5F&v4#bF5dR&j+fxV1kGAR6e3wxxRG092ay+I_Prbc4inu zby5)oklDv!PB)7yE7P)%M|AjQ!=-xMy3tw9F=Xc6;B^<9VWqtX(=SFB7BdsG_@ZjE zidt_kQl<;VO*{0lWBOlK7cLD%b_^d~-~6IlY7y}uBO~OL#7naXT+@-i1Fs|f_nDI( z0tSh;wux2>pZzbMp0XRUsU_g#xX7+YG&1Wc`~%;HCVHFVeqbg8=@JOqQL-yiaz+TJ zH~Zs540HMlL;gR3f>!TO8r(uLSn6lg6*xn<`(~sX#?)N~6+JjUNj`UsT}h!Uud5=Doc3G^GxB{Ep%P literal 0 HcmV?d00001 diff --git a/cms/images/prompt.gif b/cms/images/prompt.gif new file mode 100644 index 0000000000000000000000000000000000000000..9e1c6f2d3a1035088ea67ea5a4ecaca239469a43 GIT binary patch literal 651 zcmZ?wbhEHbWMsI&{w$sW2#k%5O-xKuQ&Y{&&6AUplai7W5)w>JP0h^AQc_YZEiJ9B zts^5Nt*oqke0*G7Ts%BHoSmH$6BA=&WBvX8-Q3)QgM*`@qGDoV;^X7v;^HDABBG{k*w~bmlw@UP|NsB5tE(#^ zA)%n4U}R*(%*-4T5~87@p{}kjBqU^LXsD;BXJBB!$;l}wC@3v0t*EHT$jIpF=_M>I zEFvP}>+2g35FjotuA`$PB_+kg#N_Jg%F4>h!NI}D$ETvAl9rYRv;q`Bv;>MjSr{1@ z;u&;6mVn}ff&E1TV-us3hnJ^)n3|fao26B(jh~}|t+{Wwg+r)uP@ubyVT_TPiFdTA zb(C|2Kg0SB8#mg;Z{4dRhmRaRcKpQ2Q>V|IJ$L@X#Y>m3T)lSv z#?4!|@7%q2|G~pYkDok!_WZ@mSFhi^eRm}84gt+= zywVy0CnhX(X6KQRGI?--k)?xQK5C0X(L<*W0Xdt1l>v;bU7GxIYa%8pu}Y`BrFOxELh1U%CbmpM%RK>4Xc}3VtH8@tN|C0 BvaJ9B literal 0 HcmV?d00001 diff --git a/cms/images/uploading.gif b/cms/images/uploading.gif new file mode 100644 index 0000000000000000000000000000000000000000..4567fe9311e2bca4cf540a969f97494f7955832c GIT binary patch literal 3538 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 literal 0 HcmV?d00001 diff --git a/cms/index.php b/cms/index.php new file mode 100644 index 0000000..dabaa59 --- /dev/null +++ b/cms/index.php @@ -0,0 +1,77 @@ + + + + + + + + + + neoCMS + + + + + + + + + + + + + + + + +
              + +
              +
              + + +

              neocms

              + + +
              +
              + + + + + \ No newline at end of file diff --git a/cms/js/codemirror/css/csscolors.css b/cms/js/codemirror/css/csscolors.css new file mode 100644 index 0000000..42010a2 --- /dev/null +++ b/cms/js/codemirror/css/csscolors.css @@ -0,0 +1,47 @@ +.editbox { + margin: .4em; + padding: 0; + font-family: monospace; + font-size: 10pt; + color: black; +} + +pre.code, .editbox { + color: #666666; +} + +.editbox p { + margin: 0; +} + +span.css-at { + color: #770088; +} + +span.css-unit { + color: #228811; +} + +span.css-value { + color: #770088; +} + +span.css-identifier { + color: black; +} + +span.css-important { + color: #0000FF; +} + +span.css-colorcode { + color: #004499; +} + +span.css-comment { + color: #AA7700; +} + +span.css-string { + color: #AA2222; +} diff --git a/cms/js/codemirror/css/jscolors.css b/cms/js/codemirror/css/jscolors.css new file mode 100644 index 0000000..17773b3 --- /dev/null +++ b/cms/js/codemirror/css/jscolors.css @@ -0,0 +1,55 @@ +.editbox { + margin: .4em; + padding: 0; + font-family: monospace; + font-size: 10pt; + color: black; +} + +pre.code, .editbox { + color: #666666; +} + +.editbox p { + margin: 0; +} + +span.js-punctuation { + color: #666666; +} + +span.js-operator { + color: #666666; +} + +span.js-keyword { + color: #770088; +} + +span.js-atom { + color: #228811; +} + +span.js-variable { + color: black; +} + +span.js-variabledef { + color: #0000FF; +} + +span.js-localvariable { + color: #004499; +} + +span.js-property { + color: black; +} + +span.js-comment { + color: #AA7700; +} + +span.js-string { + color: #AA2222; +} diff --git a/cms/js/codemirror/css/xmlcolors.css b/cms/js/codemirror/css/xmlcolors.css new file mode 100644 index 0000000..8cb95bc --- /dev/null +++ b/cms/js/codemirror/css/xmlcolors.css @@ -0,0 +1,51 @@ +.editbox { + margin: .4em; + padding: 0; + font-family: monospace; + font-size: 10pt; + color: black; +} + +.editbox p { + margin: 0; +} + +span.xml-tagname { + color: #A0B; +} + +span.xml-attribute { + color: #281; +} + +span.xml-punctuation { + color: black; +} + +span.xml-attname { + color: #00F; +} + +span.xml-comment { + color: #A70; +} + +span.xml-cdata { + color: #48A; +} + +span.xml-processing { + color: #999; +} + +span.xml-entity { + color: #A22; +} + +span.xml-error { + color: #F00; +} + +span.xml-text { + color: black; +} diff --git a/cms/js/codemirror/js/codemirror.js b/cms/js/codemirror/js/codemirror.js new file mode 100644 index 0000000..329f296 --- /dev/null +++ b/cms/js/codemirror/js/codemirror.js @@ -0,0 +1,474 @@ +/* CodeMirror main module + * + * Implements the CodeMirror constructor and prototype, which take care + * of initializing the editor frame, and providing the outside interface. + */ + +// The CodeMirrorConfig object is used to specify a default +// configuration. If you specify such an object before loading this +// file, the values you put into it will override the defaults given +// below. You can also assign to it after loading. +var CodeMirrorConfig = window.CodeMirrorConfig || {}; + +var CodeMirror = (function () { + function setDefaults(object, defaults) { + for (var option in defaults) { + if (!object.hasOwnProperty(option)) + object[option] = defaults[option]; + } + } + + function forEach(array, action) { + for (var i = 0; i < array.length; i++) + action(array[i]); + } + + // These default options can be overridden by passing a set of + // options to a specific CodeMirror constructor. See manual.html for + // their meaning. + setDefaults(CodeMirrorConfig, { + stylesheet: "", + path: "", + parserfile: [], + basefiles: ["util.js", "stringstream.js", "select.js", "undo.js", "editor.js", "tokenize.js"], + iframeClass: null, + passDelay: 200, + passTime: 50, + lineNumberDelay: 200, + lineNumberTime: 50, + continuousScanning: false, + saveFunction: null, + onChange: null, + undoDepth: 50, + undoDelay: 800, + disableSpellcheck: true, + textWrapping: true, + readOnly: false, + width: "", + height: "300px", + autoMatchParens: false, + parserConfig: null, + tabMode: "indent", // or "spaces", "default", "shift" + reindentOnLoad: false, + activeTokens: null, + cursorActivity: null, + lineNumbers: false, + indentUnit: 2 + }); + + function addLineNumberDiv(container) { + var nums = document.createElement("DIV"), + scroller = document.createElement("DIV"); + nums.style.position = "absolute"; + nums.style.height = "100%"; + if (nums.style.setExpression) { + try { + nums.style.setExpression("height", "this.previousSibling.offsetHeight + 'px'"); + } catch (e) { + } // Seems to throw 'Not Implemented' on some IE8 versions + } + nums.style.top = "0px"; + nums.style.overflow = "hidden"; + container.appendChild(nums); + scroller.className = "CodeMirror-line-numbers"; + nums.appendChild(scroller); + return nums; + } + + function CodeMirror(place, options) { + // Backward compatibility for deprecated options. + if (options.dumbTabs) options.tabMode = "spaces"; + else if (options.normalTab) options.tabMode = "default"; + + // Use passed options, if any, to override defaults. + this.options = options = options || {}; + setDefaults(options, CodeMirrorConfig); + + var frame = this.frame = document.createElement("IFRAME"); + if (options.iframeClass) frame.className = options.iframeClass; + frame.frameBorder = 0; + frame.src = "javascript:false;"; + frame.style.border = "0"; + frame.style.width = '100%'; + frame.style.height = '100%'; + // display: block occasionally suppresses some Firefox bugs, so we + // always add it, redundant as it sounds. + frame.style.display = "block"; + + var div = this.wrapping = document.createElement("DIV"); + div.style.position = "relative"; + div.className = "CodeMirror-wrapping"; + div.style.width = options.width; + div.style.height = options.height; + + if (place.appendChild) place.appendChild(div); + else place(div); + div.appendChild(frame); + if (options.lineNumbers) this.lineNumbers = addLineNumberDiv(div); + + // Link back to this object, so that the editor can fetch options + // and add a reference to itself. + frame.CodeMirror = this; + this.win = frame.contentWindow; + + if (typeof options.parserfile == "string") + options.parserfile = [options.parserfile]; + if (typeof options.stylesheet == "string") + options.stylesheet = [options.stylesheet]; + + var html = [""]; + // Hack to work around a bunch of IE8-specific problems. + html.push(""); + forEach(options.stylesheet, function (file) { + html.push(""); + }); + forEach(options.basefiles.concat(options.parserfile), function (file) { + html.push(" + + + + + +
              + +
              + +

              neocms

              +
              +

              1.01
              + Copyright **NAME HERE**

              +

              neoCMS is developed by **NAME HERE**.

              +
              +
              +
              + +
              + Login +
                +

              1. + +

                Required

              2. +

              3. + +

                Required

              4. +
              5. + +

                Forgot your password?

                +

              6. +
              +
              +

              Submit your username to receive an
              email with your new password.

              + +

              Back to login

              +

              +
              +
              + +
              +
              + +
              + +
              + + + + + \ No newline at end of file diff --git a/cms/settings/acct.php b/cms/settings/acct.php new file mode 100644 index 0000000..94adb4c --- /dev/null +++ b/cms/settings/acct.php @@ -0,0 +1,75 @@ + + + + + + + neoCMS Settings :: User Info + + + + + + + + + + +
              +
              +
              +

              +
                +
              • +
              • +
              +
                + +
              • +
              +
              +
              +

              Add New User Only the account owner has administrative privileges +

              +
              +
              +

              New User

              +
                +
              • Please enter a name
              • +
              • Please enter a valid email
              • +
              • Please enter a username
              • +
              • “Medium” or “strong” required. +
              • +
              • n/a “Medium” or “strong” required. +
              • +
              • Must match password
              • +
              • save or cancel
              • +
              +
              +
              +
              + + \ No newline at end of file diff --git a/cms/settings/dashcheck.php b/cms/settings/dashcheck.php new file mode 100644 index 0000000..ce055b4 --- /dev/null +++ b/cms/settings/dashcheck.php @@ -0,0 +1,37 @@ + \ No newline at end of file diff --git a/cms/settings/dashfoot.php b/cms/settings/dashfoot.php new file mode 100644 index 0000000..021cd4f --- /dev/null +++ b/cms/settings/dashfoot.php @@ -0,0 +1,11 @@ +
              +
              +
              +

              Thanks for using neoCMS™

              +

              © Neogate Technologies

              +
              + + + + + \ No newline at end of file diff --git a/cms/settings/dashnav.php b/cms/settings/dashnav.php new file mode 100644 index 0000000..1db5bcf --- /dev/null +++ b/cms/settings/dashnav.php @@ -0,0 +1,29 @@ +
              +
              + +

              NeoCMS

              + +
              +
              +
              +
              + +
              +
              +
              + +
              + +
              \ No newline at end of file diff --git a/cms/settings/ftpinfo.php b/cms/settings/ftpinfo.php new file mode 100644 index 0000000..ea2dac7 --- /dev/null +++ b/cms/settings/ftpinfo.php @@ -0,0 +1,56 @@ + + + + + + + neoCMS Settings :: FTP Info + + + + + + + + + + +
              +
              + +

              Please Note: FTP information is not required for most installations of + neocms. If you are encountering file permission issues, save your FTP info here and try publishing/uploading + again. neocms will write your FTP information to an unreadable file on this server.

              + +
              + +

              Your FTP Info

              +
                +
              • Please enter your server – no “ftp.” +
              • +
              • Please your FTP username +
              • +
              • Please enter your FTP password +
              • +
              • Please enter the path to your site +
              • +
              +
              +

              saveClear all FTP + info

              +
              +
              + + + \ No newline at end of file diff --git a/cms/settings/index.php b/cms/settings/index.php new file mode 100644 index 0000000..fd465e6 --- /dev/null +++ b/cms/settings/index.php @@ -0,0 +1,79 @@ + + + + + + + neoCMS Settings :: Preferences + + + + + + + + + + +
              +
              +
              +

              Your neocms file path

              +
                +
              • +
              +

              This is where your neocms files are located. This is also the path you’ll follow to login to + your site’s neocms account to begin editing your site content. Note: + neocms discovers this based on what you name your neocms folder.

              +
              +
              +

              HTML Editing

              + +

              Set this preference to “on” if you want users to be able to directly edit the HTML + markup, or “off” if you do not want users to be able to edit the HTML.

              +
              +
              +

              Exclude Folders

              +

              Enter a comma separated list of folder names or paths you do not want listed in the neocms file + browser. Do not use a “/” at the end fo the path. Ex: “wordpress, .svn, + functions/important”

              +
                +
              • +
              +
              +
              +

              File Uploads

              + +

              Set this preference to “on” if you want users to be able to upload files, or “off” + if you do not want users to upload files. There is a 100MB limit on all uploads.

              +
                +
              • +

                To specify a file folder, enter the relative path here. Leave it blank if you want neocms to + auto-discover folders.

                + +
              • +
              +
              +
              +

              Image Uploads

              + +

              To specify an image folder, enter the relative path here. Leave it blank if you want neocms to + auto-discover folders.

              + +
                +
              • +
              +
              +

              save

              +
              +
              + + \ No newline at end of file diff --git a/cms/templates/deflist-editor.html b/cms/templates/deflist-editor.html new file mode 100644 index 0000000..a8d1a38 --- /dev/null +++ b/cms/templates/deflist-editor.html @@ -0,0 +1,26 @@ +
              +
              +
              +
              +
              +
              +
              +

              +
              +

              A "definition list" is a series of terms and definitions. More than one definition may be associated + with a single term.

              +
              +
              +
              +
              + done + cancel +
              +
              +
              +
              +
              +
              +
              +
              \ No newline at end of file diff --git a/cms/templates/editor.html b/cms/templates/editor.html new file mode 100644 index 0000000..a6c54a5 --- /dev/null +++ b/cms/templates/editor.html @@ -0,0 +1,10 @@ + \ No newline at end of file diff --git a/cms/templates/file-browser.html b/cms/templates/file-browser.html new file mode 100644 index 0000000..d52ca1d --- /dev/null +++ b/cms/templates/file-browser.html @@ -0,0 +1,10 @@ +
              + cancel +

              Loading…

              + +
              +
              \ No newline at end of file diff --git a/cms/templates/html-editor.html b/cms/templates/html-editor.html new file mode 100644 index 0000000..6c4b3fe --- /dev/null +++ b/cms/templates/html-editor.html @@ -0,0 +1,12 @@ +
              +

              Maximize this windowEdit HTML

              +
              + done + cancel +
              +
              + +
              +
              \ No newline at end of file diff --git a/cms/templates/image-editor.html b/cms/templates/image-editor.html new file mode 100644 index 0000000..ce7fa65 --- /dev/null +++ b/cms/templates/image-editor.html @@ -0,0 +1,38 @@ +
              +

              Edit Image

              +
              +

              Upload A New Image

              +

              First select the folder you want to upload to:

              +
              + +

              Then, upload an image from your computer:

              + +
              +
              +

              Or Choose An Existing Image

              +

              To use an image that already exists on the web, enter the URL of the image below:

              + +

              « apply

              +
              +
              +
                +
              • +
              • +
              • browse +
              • +
              • +
              +
              + done + cancel +
              +
              \ No newline at end of file diff --git a/cms/templates/link-editor.html b/cms/templates/link-editor.html new file mode 100644 index 0000000..0ad46ad --- /dev/null +++ b/cms/templates/link-editor.html @@ -0,0 +1,18 @@ +
              +

              Edit Link

              +
              + +
              +
              \ No newline at end of file diff --git a/cms/templates/prompt.html b/cms/templates/prompt.html new file mode 100644 index 0000000..b598f3c --- /dev/null +++ b/cms/templates/prompt.html @@ -0,0 +1,8 @@ +
              +

              +

              +
              + + cancel +
              +
              \ No newline at end of file diff --git a/cms/templates/table-editor.html b/cms/templates/table-editor.html new file mode 100644 index 0000000..7e24065 --- /dev/null +++ b/cms/templates/table-editor.html @@ -0,0 +1,44 @@ +
              +

              Insert Table

              +
              + + + + + + + + + + + +
                
                
              +
              +
              +

              Table Options

              +
              +
                +
              • +
              • +
              +
                +
              • +
              • +
              +
                +
              • +
              • +
              +
              +
              +
              + insert + cancel +
              +
              \ No newline at end of file diff --git a/cms/templates/upload.html b/cms/templates/upload.html new file mode 100644 index 0000000..00d6fba --- /dev/null +++ b/cms/templates/upload.html @@ -0,0 +1,24 @@ +
              +

              Upload A File

              +

              To upload a file, first select the folder you want to upload to:

              +
              +
                +
              • + +
              • +
              • +

                Then, select the file from your computer:

                + +
              • +
              • + done + cancel +
              • +
              +
              +
              \ No newline at end of file diff --git a/cms/templates/video-editor.html b/cms/templates/video-editor.html new file mode 100644 index 0000000..93583c0 --- /dev/null +++ b/cms/templates/video-editor.html @@ -0,0 +1,15 @@ +
              +

              Insert Video

              +
              +

              Video Embed

              +

              Edit the embed code, or paste here to replace with a new video.

              +
              + + « apply +
              +
              +
              + done + cancel +
              +
              \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 0000000..1555012 --- /dev/null +++ b/index.html @@ -0,0 +1,127 @@ + + + + Default page + + + + + + + + + + + +
              +

              You Are All Set to Go!

              +

              All you need to do is add the class neocms to any div which contains editable content!

              +

              Update cms/core.php to manage credentials

              + +
              + + \ No newline at end of file