From 701cce675645d92a6c3ead9b01e194185b69cf0c Mon Sep 17 00:00:00 2001 From: xevidos Date: Wed, 18 Jul 2018 15:28:30 -0400 Subject: [PATCH 1/2] Removed auto update plugin, Implemented update script. --- common.php | 2 +- components/update/class.update.php | 365 +++++++------- components/update/controller.php | 105 ++-- components/update/dialog.php | 144 +++--- components/update/init.js | 15 + components/update/update.php | 465 ++++++++++++++++++ config.example.php | 6 +- plugins/Codiad-AutoUpdate-master/README.md | 31 -- .../class.autoupdate.php | 331 ------------- .../Codiad-AutoUpdate-master/controller.php | 70 --- plugins/Codiad-AutoUpdate-master/dialog.php | 108 ---- plugins/Codiad-AutoUpdate-master/init.js | 91 ---- plugins/Codiad-AutoUpdate-master/plugin.json | 6 - plugins/Codiad-AutoUpdate-master/screen.png | Bin 30742 -> 0 bytes 14 files changed, 811 insertions(+), 928 deletions(-) create mode 100644 components/update/update.php delete mode 100755 plugins/Codiad-AutoUpdate-master/README.md delete mode 100755 plugins/Codiad-AutoUpdate-master/class.autoupdate.php delete mode 100755 plugins/Codiad-AutoUpdate-master/controller.php delete mode 100755 plugins/Codiad-AutoUpdate-master/dialog.php delete mode 100755 plugins/Codiad-AutoUpdate-master/init.js delete mode 100755 plugins/Codiad-AutoUpdate-master/plugin.json delete mode 100755 plugins/Codiad-AutoUpdate-master/screen.png diff --git a/common.php b/common.php index aead3d2..3e73c65 100755 --- a/common.php +++ b/common.php @@ -12,7 +12,7 @@ ////////////////////////////////////////////////////////////////// class Common { - + ////////////////////////////////////////////////////////////////// // PROPERTIES ////////////////////////////////////////////////////////////////// diff --git a/components/update/class.update.php b/components/update/class.update.php index bfd433e..a240748 100755 --- a/components/update/class.update.php +++ b/components/update/class.update.php @@ -6,186 +6,187 @@ * [root]/license.txt for more. This information must remain intact. */ -class Update -{ - - ////////////////////////////////////////////////////////////////// - // PROPERTIES - ////////////////////////////////////////////////////////////////// - - public $remote = ""; - public $commits = ""; - public $archive = ""; - - ////////////////////////////////////////////////////////////////// - // METHODS - ////////////////////////////////////////////////////////////////// - - // -----------------------------||----------------------------- // - - ////////////////////////////////////////////////////////////////// - // Construct - ////////////////////////////////////////////////////////////////// - - public function __construct() - { - ini_set("user_agent", "Codiad"); - $this->remote = "https://codiad.telaaedifex.com/update/?v={VER}&o={OS}&p={PHP}&w={WEB}&a={ACT}"; - $this->commits = "https://gitlab.telaaedifex.com/api/v4/projects/3/repository/commits/"; - $this->archive = "https://gitlab.telaaedifex.com/xevidos/codiad/-/archive/master/codiad-master.zip"; - } - - ////////////////////////////////////////////////////////////////// - // Set Initial Version - ////////////////////////////////////////////////////////////////// - - public function Init() - { - $version = array(); - if (!file_exists(DATA ."/version.php")) { - if (file_exists(BASE_PATH."/.git/HEAD")) { - $remote = $this->getRemoteVersion("install_git"); - $local = $this->getLocalVersion(); - $version[] = array("version"=>$local[0]['version'],"time"=>time(),"optout"=>"true","name"=>""); - saveJSON('version.php', $version); - } else { - $remote = $this->getRemoteVersion("install_man"); - $version[] = array("version"=>$remote[0]["commit"]["sha"],"time"=>time(),"optout"=>"true","name"=>""); - saveJSON('version.php', $version); - } - } else { - $local = $this->getLocalVersion(); - - if (file_exists(BASE_PATH."/.git/HEAD")) { - $current = getJSON('version.php'); - if ($local[0]['version'] != $current[0]['version']) { - $remote = $this->getRemoteVersion("update_git", $local[0]['version']); - $version[] = array("version"=>$local[0]['version'],"time"=>time(),"optout"=>"true","name"=>""); - saveJSON('version.php', $version); - } - } else { - if ($local[0]['version'] == '' && $local[0]['name'] == $_SESSION['user']) { - $remote = $this->getRemoteVersion("update_man", $local[0]['version']); - $version[] = array("version"=>$remote[0]["commit"]["sha"],"time"=>time(),"optout"=>"true","name"=>$_SESSION['user']); - saveJSON('version.php', $version); - } - } - - $local = $this->getLocalVersion(); - if (!isset($local[0]['optout'])) { - $remote = $this->getRemoteVersion("optout", $local[0]['version']); - $this->OptOut(); - } - } - } - - ////////////////////////////////////////////////////////////////// - // Clear Version - ////////////////////////////////////////////////////////////////// - - public function Clear() - { - $version[] = array("version"=>"","time"=>time(),"optout"=>"true","name"=>$_SESSION['user']); - saveJSON('version.php', $version); - } - - ////////////////////////////////////////////////////////////////// - // Clear Version - ////////////////////////////////////////////////////////////////// - - public function OptOut() - { - $current = getJSON('version.php'); - $version[] = array("version"=>$current[0]['version'],"time"=>$current[0]['time'],"optout"=>"true","name"=>$current[0]['name']); - saveJSON('version.php', $version); - } - - ////////////////////////////////////////////////////////////////// - // Check Version - ////////////////////////////////////////////////////////////////// - - public function Check() - { - $local = $this->getLocalVersion(); - $remote = $this->getRemoteVersion("check", $local[0]['version']); - - $nightly = true; - $archive = Common::getConstant('ARCHIVEURL', $this->archive); - $latest = ''; - - foreach ($remote as $tag) { - if ($latest == '') { - $latest = $tag["name"]; - $archive = $tag["zipball_url"]; - } - if ($local[0]['version'] == $tag["commit"]["sha"]) { - $local[0]['version'] = $tag["name"]; - $nightly = false; - break; - } - } - - $search = array("\r\n", "\n", "\r"); - $replace = array(" ", " ", " "); - - $message = ''; - $merge = ''; - $commits = json_decode(file_get_contents(Common::getConstant('COMMITURL', $this->commits)), true); - foreach ($commits as $commit) { - if ($local[0]['version'] != $commit["sha"]) { - if (strpos($commit["commit"]["message"], "Merge") === false) { - $message .= '- '.str_replace($search, $replace, $commit["commit"]["message"]).'
'; - } else { - $merge .= '- '.str_replace($search, $replace, $commit["commit"]["message"]).'
'; - } - } else { - break; - } - } - - if ($message == '') { - $message = $merge; - } - - return "[".formatJSEND("success", array("currentversion"=>$local[0]['version'],"remoteversion"=>$latest,"message"=>$message,"archive"=>$archive,"nightly"=>$nightly,"name"=>$local[0]['name']))."]"; - } - - ////////////////////////////////////////////////////////////////// - // Get Local Version - ////////////////////////////////////////////////////////////////// - - public function getLocalVersion() - { - if (file_exists(BASE_PATH."/.git/HEAD")) { - $tmp = file_get_contents(BASE_PATH."/.git/HEAD"); - if (strpos($tmp, "ref:") === false) { - $data[0]['version'] = trim($tmp); - } else { - $data[0]['version'] = trim(file_get_contents(BASE_PATH."/.git/".trim(str_replace('ref: ', '', $tmp)))); - } - $data[0]['name'] = ""; - if (file_exists(DATA ."/version.php")) { - $data[0]['optout'] = "true"; - } - } else { - $data = getJSON('version.php'); - } - return $data; - } - - ////////////////////////////////////////////////////////////////// - // Get Remote Version - ////////////////////////////////////////////////////////////////// - - public function getRemoteVersion($action, $localversion = "") - { - $remoteurl = Common::getConstant('UPDATEURL', $this->remote); - $remoteurl = str_replace("{OS}", PHP_OS, $remoteurl); - $remoteurl = str_replace("{PHP}", phpversion(), $remoteurl); - $remoteurl = str_replace("{VER}", $localversion, $remoteurl); - $remoteurl = str_replace("{WEB}", urlencode($_SERVER['SERVER_SOFTWARE']), $remoteurl); - $remoteurl = str_replace("{ACT}", $action, $remoteurl); - - return json_decode(file_get_contents($remoteurl), true); - } +class Update { + + ////////////////////////////////////////////////////////////////// + // CONSTANTS + ////////////////////////////////////////////////////////////////// + + CONST VERSION = "v.2.8.5"; + + ////////////////////////////////////////////////////////////////// + // PROPERTIES + ////////////////////////////////////////////////////////////////// + + public $remote = ""; + public $commits = ""; + public $tags = ""; + public $archive = ""; + public $version = ""; + public $protocol = ""; + + ////////////////////////////////////////////////////////////////// + // METHODS + ////////////////////////////////////////////////////////////////// + + // -----------------------------||----------------------------- // + + ////////////////////////////////////////////////////////////////// + // Construct + ////////////////////////////////////////////////////////////////// + + public function __construct() { + ini_set("user_agent", "Codiad"); + + $this->archive = "https://gitlab.telaaedifex.com/xevidos/codiad/-/archive/master/codiad-master.zip"; + $this->commits = "https://gitlab.telaaedifex.com/api/v4/projects/3/repository/commits/"; + $this->tags = "https://gitlab.telaaedifex.com/api/v4/projects/3/repository/tags/"; + //$this->protocol = $this->CheckProtocol(); + } + + ////////////////////////////////////////////////////////////////// + // Set Initial Version + ////////////////////////////////////////////////////////////////// + + public function Init() { + + $version = array(); + } + + ////////////////////////////////////////////////////////////////// + // Clear Version + ////////////////////////////////////////////////////////////////// + + public function Clear() { + $version[] = array("version"=>"","time"=>time(),"optout"=>"true","name"=>$_SESSION['user']); + saveJSON('version.php', $version); + } + + ////////////////////////////////////////////////////////////////// + // Clear Version + ////////////////////////////////////////////////////////////////// + + public function OptOut() { + $current = getJSON('version.php'); + $version[] = array("version"=>$current[0]['version'],"time"=>$current[0]['time'],"optout"=>"true","name"=>$current[0]['name']); + saveJSON('version.php', $version); + } + + ////////////////////////////////////////////////////////////////// + // Check Version + ////////////////////////////////////////////////////////////////// + + public function Check() { + /* + $local = $this->getLocalVersion(); + $remote = $this->getRemoteVersion("check", $local[0]['version']); + + $nightly = true; + $archive = Common::getConstant('ARCHIVEURL', $this->archive); + $latest = ''; + + foreach ($remote as $tag) { + if ($latest == '') { + $latest = $tag["name"]; + $archive = $tag["zipball_url"]; + } + if ($local[0]['version'] == $tag["commit"]["sha"]) { + $local[0]['version'] = $tag["name"]; + $nightly = false; + break; + } + } + + $search = array("\r\n", "\n", "\r"); + $replace = array(" ", " ", " "); + + $message = ''; + $merge = ''; + $commits = json_decode(file_get_contents(Common::getConstant('COMMITURL', $this->commits)), true); + foreach ($commits as $commit) { + if ($local[0]['version'] != $commit["sha"]) { + if (strpos($commit["commit"]["message"], "Merge") === false) { + $message .= '- '.str_replace($search, $replace, $commit["commit"]["message"]).'
'; + } else { + $merge .= '- '.str_replace($search, $replace, $commit["commit"]["message"]).'
'; + } + } else { + break; + } + } + + if ($message == '') { + $message = $merge; + } + */ + + $archive = $this->archive; + $current_version = self::VERSION; + $nightly = false; + $response = $this->getRemoteVersion("check"); + + + + + //return "[".formatJSEND("success", array("currentversion"=>$local[0]['version'],"remoteversion"=>$latest,"message"=>$message,"archive"=>$archive,"nightly"=>$nightly,"name"=>$local[0]['name']))."]"; + return "[".formatJSEND("success", array("currentversion"=>$current_version,"remoteversion"=>$response["name"],"message"=>$response["message"],"archive"=>$archive,"nightly"=>$nightly,"name"=>$response["author_name"]))."]"; + } + + ////////////////////////////////////////////////////////////////// + // Get Local Version + ////////////////////////////////////////////////////////////////// + + public function Download(){ + + + } + + ////////////////////////////////////////////////////////////////// + // Get Local Version + ////////////////////////////////////////////////////////////////// + + public function getLocalVersion(){ + + return getJSON('version.php');; + } + + ////////////////////////////////////////////////////////////////// + // Get Remote Version + ////////////////////////////////////////////////////////////////// + + public function getRemoteVersion($action="check", $localversion = "") { + + //$remoteurl = Common::getConstant('UPDATEURL', $this->remote); + if ( $this->protocol === "none" ) { + + return; + } + + switch( $this->protocol ) { + + case( "curl" ): + + $curl = curl_init(); + curl_setopt($curl, CURLOPT_URL, $this->tags); + //curl_setopt($curl, CURLOPT_POSTFIELDS, ""); + curl_setopt($curl, CURLOPT_HEADER, 0); + curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); + curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0); + curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13'); + $content = curl_exec($curl); + curl_close($curl); + + $response = json_decode( $content, true ); + //Return latest release + return $response[0]; + break; + + case( "fopen" ): + + break; + } + + return json_decode(file_get_contents($remoteurl), true); + } } diff --git a/components/update/controller.php b/components/update/controller.php index 2bbec7a..d2223d2 100755 --- a/components/update/controller.php +++ b/components/update/controller.php @@ -1,47 +1,62 @@ Init(); -} - - ////////////////////////////////////////////////////////////////// - // Clear Version - ////////////////////////////////////////////////////////////////// - -if ($_GET['action']=='clear') { - if (checkAccess()) { - $update->Clear(); - } -} - - ////////////////////////////////////////////////////////////////// - // OptOut - ////////////////////////////////////////////////////////////////// - -if ($_GET['action']=='optout') { - if (checkAccess()) { - $update->OptOut(); - } -} + /* + * Copyright (c) Codiad & daeks (codiad.com), distributed + * as-is and without warranty under the MIT License. See + * [root]/license.txt for more. This information must remain intact. + */ + + + require_once('../../common.php'); + require_once('class.update.php'); + + ////////////////////////////////////////////////////////////////// + // Verify Session or Key + ////////////////////////////////////////////////////////////////// + + checkSession(); + + $update = new Update(); + + ////////////////////////////////////////////////////////////////// + // Set Initial Version + ////////////////////////////////////////////////////////////////// + + if ($_GET['action']=='init') { + $update->Init(); + } + + ////////////////////////////////////////////////////////////////// + // Clear Version + ////////////////////////////////////////////////////////////////// + + if ($_GET['action']=='clear') { + if (checkAccess()) { + $update->Clear(); + } + } + + ////////////////////////////////////////////////////////////////// + // OptOut + ////////////////////////////////////////////////////////////////// + + if ($_GET['action']=='optout') { + if (checkAccess()) { + $update->OptOut(); + } + } + + ////////////////////////////////////////////////////////////////// + // Update Codiad + ////////////////////////////////////////////////////////////////// + + if ($_GET['action']=='update') { + if (checkAccess()) { + $update->Download(); + echo Common::getConstant('BASE_URL') . "/components/update/update.php"; + } else { + + echo "#"; + } + } + diff --git a/components/update/dialog.php b/components/update/dialog.php index 3ef6fd5..9520933 100755 --- a/components/update/dialog.php +++ b/components/update/dialog.php @@ -1,65 +1,89 @@ - -
- - Check(), true); - ?> -
- - - -
- - -
- -
-
- -

- - . - - -

- -
'.get_i18n("Download Codiad").' '; - } - ?> - - + +
+ + Check(), true); + + ?> + + + " target="_blank" style="display: none;"> + + +
+ + +
+ +
+
+ +

+ + . + + +

+ +
+ The update will open a new tab. Please allow popups from Codiad.

'; + echo ' '; + echo ' '; + } + ?> + + + diff --git a/components/update/init.js b/components/update/init.js index 01ccdfe..3924f7c 100755 --- a/components/update/init.js +++ b/components/update/init.js @@ -51,6 +51,21 @@ .attr('src', archive); $.get(_this.controller + '?action=clear'); codiad.modal.unload(); + }, + + ////////////////////////////////////////////////////////////////// + // Update Codiad + ////////////////////////////////////////////////////////////////// + + update: function () { + var _this = this; + console.log( $.get(_this.controller + '?action=update', function( response ){ + + if( ! ( response === "" || response === null || response === "#" ) ) { + window.open( window.location.protocol + "//" + response, "_self" ) + } + })) + //codiad.modal.unload(); } }; diff --git a/components/update/update.php b/components/update/update.php new file mode 100644 index 0000000..43e8642 --- /dev/null +++ b/components/update/update.php @@ -0,0 +1,465 @@ +archive = $update->archive; + $this->path = Common::getConstant('BASE_PATH'); + $this->protocol = $this->check_protocol(); + + //Trigger update + $this->update(); + } + + function check_protocol() { + + if( extension_loaded( 'curl' ) ) { + + //Curl is loaded + return "curl"; + } elseif( ini_get('allow_url_fopen') ) { + + //Remote get file is enabled + return "fopen"; + } else { + + //None are enabled exit. + return "none"; + } + } + + function copyr( $source, $dest ) { + // Check for symlinks + if (is_link($source)) { + return symlink(readlink($source), $dest); + } + + // Simple copy for a file + if (is_file($source)) { + return copy($source, $dest); + } + + // Make destination directory + if (!is_dir($dest)) { + mkdir($dest); + } + + // Loop through the folder + $dir = dir( $source ); + while (false !== $entry = $dir->read()) { + // Skip pointers + if ($entry == '.' || $entry == '..') { + continue; + } + + // Deep copy directories + $this->copyr("$source/$entry", "$dest/$entry"); + } + + // Clean up + $dir->close(); + return true; + } + + ////////////////////////////////////////////////////////////////// + // Download latest archive + ////////////////////////////////////////////////////////////////// + + function download() { + + switch( $this->protocol ) { + + case( "curl" ): + + $filepath = $this->path . "/update.zip"; + if( file_exists( $filepath ) ) { + unlink( $filepath ); + } + $curl = curl_init(); + curl_setopt($curl, CURLOPT_URL, $this->archive); + //curl_setopt($curl, CURLOPT_POSTFIELDS, ""); + curl_setopt($curl, CURLOPT_HEADER, 0); + curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); + curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0); + curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13'); + $raw_file_data = curl_exec($curl); + curl_close($curl); + + file_put_contents( $filepath, $raw_file_data ); + return ( filesize( $filepath ) > 0 ) ? true : false; + break; + + case( "fopen" ): + + break; + } + } + + function extract() { + + if ( ! extension_loaded( 'zip' ) ) { + + echo ""; + return false; + } + + $zip = new ZipArchive; + if ( $zip->open( $this->path . "/update.zip" ) === TRUE ) { + + $zip->extractTo( $this->path ); + $zip->close(); + + return true; + } else { + + return false; + } + } + + function remove_directory( $path ) { + + $files = glob($path . '/*'); + foreach ($files as $file) { + + is_dir($file) ? $this->remove_directory($file) : unlink($file); + } + rmdir($path); + return; + } + + function update() { + + echo ""; + if ( ! $this->download() ) { + + echo ""; + return; + } + + echo ""; + if ( ! $this->extract() ) { + + echo ""; + return; + } + + echo ""; + + $src = $this->path . "/codiad-master/"; + $src_folder = $this->path . "/codiad-master"; + $dest = $this->path . "/"; + + $this->copyr( $src, $dest ); + + + echo ""; + $this->remove_directory( $src ); + } +} + +?> + + + + + Codiad Update + + + + +

+ Telaaedifex Codiad Updater +

+
+ Starting Update ... +
+ + +archive = $update->archive; + $this->path = Common::getConstant('BASE_PATH'); + $this->protocol = $this->check_protocol(); + + //Trigger update + $this->update(); + } + + function check_protocol() { + + if( extension_loaded( 'curl' ) ) { + + //Curl is loaded + return "curl"; + } elseif( ini_get('allow_url_fopen') ) { + + //Remote get file is enabled + return "fopen"; + } else { + + //None are enabled exit. + return "none"; + } + } + + ////////////////////////////////////////////////////////////////// + // Download latest archive + ////////////////////////////////////////////////////////////////// + + function download() { + + switch( $this->protocol ) { + + case( "curl" ): + + $filepath = $this->path . "/update.zip"; + $curl = curl_init(); + curl_setopt($curl, CURLOPT_URL, $this->archive); + //curl_setopt($curl, CURLOPT_POSTFIELDS, ""); + curl_setopt($curl, CURLOPT_HEADER, 0); + curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); + curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0); + curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13'); + $raw_file_data = curl_exec($curl); + curl_close($curl); + + file_put_contents( $filepath, $raw_file_data ); + return ( filesize( $filepath ) > 0 ) ? true : false; + break; + + case( "fopen" ): + + break; + } + } + + function extract() { + + if ( ! extension_loaded( 'zip' ) ) { + + echo ""; + return false; + } + + $zip = new ZipArchive; + if ( $zip->open( $this->path . "/update.zip", ZipArchive::OVERWRITE ) === TRUE ) { + + $zip->extractTo( $this->path ); + $zip->close(); + + return true; + } else { + + return false; + } + } + + function update() { + + echo ""; + if ( ! $this->download() ) { + + echo ""; + } + + echo ""; + if ( ! $this->extract() ) { + + echo ""; + } + + echo ""; + try { + + exec( "cp -a " ); + } catch ( exception $e ) { + + echo ""; + return; + } + + echo ""; + exec( "rm -rf " . $this->path . "/update.zip;rm -rf " . $this->path . "/codiad-master" ); + } +} + +?> + + + + + Codiad Update + + + + +

+ Telaaedifex Codiad Updater +

+
+ Starting Update ... +
+ + + \ No newline at end of file diff --git a/config.example.php b/config.example.php index d33939c..1b3664c 100755 --- a/config.example.php +++ b/config.example.php @@ -52,8 +52,8 @@ define("WSURL", BASE_URL . "/workspace"); //define("MARKETURL", "http://market.codiad.com/json"); // Update Check -define("UPDATEURL", "https://codiad.telaaedifex.com/update/?v={VER}&o={OS}&p={PHP}&w={WEB}&a={ACT}"); -define("ARCHIVEURL", "https://gitlab.telaaedifex.com/xevidos/codiad/-/archive/master/codiad-master.zip"); -define("COMMITURL", "https://gitlab.telaaedifex.com/api/v4/projects/3/repository/commits/"); +//define("UPDATEURL", "https://codiad.telaaedifex.com/update/?v={VER}&o={OS}&p={PHP}&w={WEB}&a={ACT}"); +//define("ARCHIVEURL", "https://gitlab.telaaedifex.com/xevidos/codiad/-/archive/master/codiad-master.zip"); +//define("COMMITURL", "https://gitlab.telaaedifex.com/api/v4/projects/3/repository/commits/"); ?> diff --git a/plugins/Codiad-AutoUpdate-master/README.md b/plugins/Codiad-AutoUpdate-master/README.md deleted file mode 100755 index e00eaa0..0000000 --- a/plugins/Codiad-AutoUpdate-master/README.md +++ /dev/null @@ -1,31 +0,0 @@ -# WARNING - -It is tested on Ubuntu 12.04 and Windows 2008R2 with Apache 2.x but may mess up your system. -All files during the upgrade are stored at /backup if there is some failure. - -# Auto Update - -This plugin hooks into the current update check and provides the possibility to automatically update your system. - -# Requirements - -- Write Permission for webserver user for whole codiad directory -- Installed ZIP Extension for PHP -- Installed OPENSSL Extension for PHP -- Environment variable ```allow_url_fopen``` has been set to ```On``` - -# Installation - -- Download the zip file and extract it to your plugins folder -- Enable this plugin in the plugins manager in Codiad - -# Change Update URL - -- Define UPDATEURL in your config.php -- UPDATEURL needs syntax like https://api.github.com/repos/Codiad/Codiad/tags -- Update Channel is only available if update.codiad.com is used - -# WARNING - -It is tested on Ubuntu 12.04 and Windows 2008R2 with Apache 2.x but may mess up your system. -All files during the upgrade are stored at /backup if there is some failure. diff --git a/plugins/Codiad-AutoUpdate-master/class.autoupdate.php b/plugins/Codiad-AutoUpdate-master/class.autoupdate.php deleted file mode 100755 index 7853db0..0000000 --- a/plugins/Codiad-AutoUpdate-master/class.autoupdate.php +++ /dev/null @@ -1,331 +0,0 @@ -remote = "https://codiad.telaaedifex.com/update/?v={VER}&o={OS}&p={PHP}&w={WEB}&a={ACT}"; - $this->commits = "https://gitlab.telaaedifex.com/api/v4/projects/3/repository/commits/"; - $this->archive = "https://gitlab.telaaedifex.com/xevidos/codiad/-/archive/master/codiad-master.zip"; - $this->type = ""; - } - - ////////////////////////////////////////////////////////////////// - // Set Initial Version - ////////////////////////////////////////////////////////////////// - - public function Init() { - $version = array(); - if(!file_exists(DATA ."/version.php")) { - if(file_exists(BASE_PATH."/.git/HEAD")) { - $remote = $this->getRemoteVersion("install_git", $this->type); - $local = $this->getLocalVersion(); - $version[] = array("version"=>$local[0]['version'],"time"=>time(),"optout"=>"true","name"=>""); - saveJSON('version.php',$version); - } else { - $remote = $this->getRemoteVersion("install_man", $this->type); - $version[] = array("version"=>$remote[0]["commit"]["sha"],"time"=>time(),"optout"=>"true","name"=>""); - saveJSON('version.php',$version); - } - } else { - $local = $this->getLocalVersion(); - - if(file_exists(BASE_PATH."/.git/HEAD")) { - $current = getJSON('version.php'); - if($local[0]['version'] != $current[0]['version']) { - $remote = $this->getRemoteVersion("update_git", $this->type, $local[0]['version']); - $version[] = array("version"=>$local[0]['version'],"time"=>time(),"optout"=>"true","name"=>""); - saveJSON('version.php',$version); - } - } else { - if($local[0]['version'] == '' && $local[0]['name'] == $_SESSION['user']) { - $remote = $this->getRemoteVersion("update_man", $this->type, $local[0]['version']); - $version[] = array("version"=>$remote[0]["commit"]["sha"],"time"=>time(),"optout"=>"true","name"=>$_SESSION['user']); - saveJSON('version.php',$version); - } - } - - $local = $this->getLocalVersion(); - if(!isset($local[0]['optout'])) { - $remote = $this->getRemoteVersion("optout", $this->type, $local[0]['version']); - $this->OptOut(); - } - } - - if(!file_exists(DATA."/config/".get_called_class().".php")) { - mkdir(DATA."/config"); - $settings = array("type"=>"stable"); - saveJSON("/config/".get_called_class().".php",$settings); - } - } - - ////////////////////////////////////////////////////////////////// - // Clear Version - ////////////////////////////////////////////////////////////////// - - public function Clear() { - $version[] = array("version"=>"","time"=>time(),"optout"=>"true","name"=>$_SESSION['user']); - saveJSON('version.php',$version); - } - - ////////////////////////////////////////////////////////////////// - // Clear Version - ////////////////////////////////////////////////////////////////// - - public function OptOut() { - $current = getJSON('version.php'); - $version[] = array("version"=>$current[0]['version'],"time"=>$current[0]['time'],"optout"=>"true","name"=>$current[0]['name']); - saveJSON('version.php',$version); - } - - ////////////////////////////////////////////////////////////////// - // Check Version - ////////////////////////////////////////////////////////////////// - - public function Check() { - - if($this->type == 'undefined' || $this->type == '') { - $data = getJSON("/config/".get_called_class().".php"); - $this->type = $data['type']; - } - - $local = $this->getLocalVersion(); - $remote = $this->getRemoteVersion("check", $this->type, $local[0]['version']); - - $settings = array("type"=>$this->type); - saveJSON("/config/".get_called_class().".php",$settings); - - $nightly = true; - $archive = Common::getConstant('ARCHIVEURL', $this->archive); - $latestversion = ''; - $latestname = ''; - - if(file_exists(BASE_PATH."/.git/FETCH_HEAD")) { - $autoupdate = '-1'; - } else { - if(is_writeable(BASE_PATH) && is_writeable(COMPONENTS) && is_writeable(THEMES)) { - if(extension_loaded('zip') && extension_loaded('openssl') && ini_get('allow_url_fopen') == 1) { - $autoupdate = '1'; - } else { - $autoupdate = '-1'; - } - } else { - $autoupdate = '0'; - } - } - - $local[0]['tag'] = $local[0]['version']; - - foreach($remote as $tag) { - if($latestversion == '') { - if($tag['name'] != 'latest') { - $latestname = $tag["name"]; - } else { - $latestname = 'Latest Commit from Repository'; - } - $latestversion = $tag["commit"]["sha"]; - $archive = $tag["zipball_url"]; - } - if($local[0]['version'] == $tag["commit"]["sha"]) { - if($tag['name'] != 'latest') { - $local[0]['tag'] = $tag["name"]; - } - $nightly = false; - break; - } - } - - $search = array("\r\n", "\n", "\r"); - $replace = array(" ", " ", " "); - - $message = ''; - $merge = ''; - $commits = json_decode(file_get_contents(Common::getConstant('COMMITURL', $this->commits)),true); - foreach($commits as $commit) { - if($local[0]['version'] != $commit["sha"]) { - if(strpos($commit["commit"]["message"],"Merge") === false) { - $message .= '- '.str_replace($search,$replace,$commit["commit"]["message"]).'
'; - } else { - $merge .= '- '.str_replace($search,$replace,$commit["commit"]["message"]).'
'; - } - } else { - break; - } - } - - if($message == '') { - $message = $merge; - } - - return "[".formatJSEND("success",array("currentname"=>$local[0]['tag'], "currentversion"=>$local[0]['version'],"remoteversion"=>$latestversion,"remotename"=>$latestname,"message"=>$message,"archive"=>$archive,"nightly"=>$nightly,"autoupdate"=>$autoupdate,"name"=>$local[0]['name']))."]"; - } - - ////////////////////////////////////////////////////////////////// - // Get Local Version - ////////////////////////////////////////////////////////////////// - - public function getLocalVersion() { - if(file_exists(BASE_PATH."/.git/HEAD")) { - $tmp = file_get_contents(BASE_PATH."/.git/HEAD"); - if (strpos($tmp,"ref:") === false) { - $data[0]['version'] = trim($tmp); - } else { - $data[0]['version'] = trim(file_get_contents(BASE_PATH."/.git/".trim(str_replace('ref: ', '', $tmp)))); - } - $data[0]['name'] = ""; - } else { - $data = getJSON('version.php'); - } - return $data; - } - - ////////////////////////////////////////////////////////////////// - // Get Remote Version - ////////////////////////////////////////////////////////////////// - - public function getRemoteVersion($action, $type, $localversion = "") { - $remoteurl = Common::getConstant('UPDATEURL', $this->remote); - $remoteurl = str_replace("{OS}", PHP_OS, $remoteurl); - $remoteurl = str_replace("{PHP}", phpversion(), $remoteurl); - $remoteurl = str_replace("{VER}", $localversion, $remoteurl); - $remoteurl = str_replace("{WEB}", urlencode($_SERVER['SERVER_SOFTWARE']), $remoteurl); - $remoteurl = str_replace("{ACT}", $action, $remoteurl); - - if($type == 'latest') { - $remoteurl = $remoteurl.'&l'; - } - - return json_decode(file_get_contents($remoteurl),true); - } - - ////////////////////////////////////////////////////////////////// - // Download Version - ////////////////////////////////////////////////////////////////// - - public function Download() { - if(file_exists('../../'.$this->commit.'.zip')) { - unlink('../../'.$this->commit.'.zip'); - } - file_put_contents('../../'.$this->commit.'.zip', fopen(str_replace('master', $this->commit, $this->archive), 'r')); - - $data = 'commit.'"; - -function delTree($dir) { - $files = array_diff(scandir($dir), array(".","..")); - foreach ($files as $file) { - (is_dir("$dir/$file")) ? delTree("$dir/$file") : unlink("$dir/$file"); - } - return rmdir($dir); -} - -function cpy($source, $dest, $ign, $frc){ - if(is_dir($source)) { - $dir_handle=opendir($source); - while($file=readdir($dir_handle)){ - if(!in_array($file, array(".",".."))) { - if(!in_array($file, $ign) || in_array($file, $frc)){ - if(is_dir($source."/".$file)){ - if(!file_exists($dest."/".$file)) { @mkdir($dest."/".$file); } - cpy($source."/".$file, $dest."/".$file, $ign, $frc); - rmdir($source."/".$file); - } else { - copy($source."/".$file, $dest."/".$file); - unlink($source."/".$file); - } - } else { - if(array_key_exists($file, $frc)) { - if(is_dir($source."/".$file)){ - if(!file_exists($dest."/".$file)) { @mkdir($dest."/".$file); } - cpy($source."/".$file."/".$frc[$file], $dest."/".$file."/".$frc[$file], $ign, $frc); - } else { - copy($source."/".$file, $dest."/".$file); - unlink($source."/".$file); - } - } - } - } - } - closedir($dir_handle); - } else { - copy($source, $dest); - unlink($source); - } -} - -// Getting current codiad path -$path = rtrim(str_replace($commit.".php", "", $_SERVER["SCRIPT_FILENAME"]),"/"); -$ignore = array(".git", "config.json", "data", "workspace", "plugins", "themes", "backup", "config.php", $commit.".php",$commit.".zip", "Codiad-".$commit); -$force = array("themes" => "default", "themes" => "README.md"); - -$zip = new ZipArchive; -$res = $zip->open($path."/".$commit.".zip"); -// open downloaded archive -if ($res === TRUE) { - // extract archive - if($zip->extractTo($path) === true) { - // delete old files except some directories and files - if(!file_exists($path."/backup")) { mkdir($path."/backup"); } - cpy($path, $path."/backup", $ignore, $force); - - // move extracted files to path - cpy($path."/Codiad-".$commit, $path, array(), array()); - - // store current commit to version.json - $version = array(); - $version[] = array("version"=>$commit,"optout"=>"true","name"=>"'.$_SESSION['user'].'","time"=>"'.time().'"); - file_put_contents($path."/data/version.php", ""); - - // cleanup and restart codiad - @$zip->close(); - delTree($path."/backup"); - rmdir($path."/Codiad-".$commit); - unlink($path."/".$commit.".zip"); - unlink($path."/".$commit.".php"); - header("Location: ".str_replace($commit.".php","",$_SERVER["SCRIPT_NAME"])); - } else { - echo "Unable to extract ".$path."/".$commit.".zip to path ".$path; - } - $zip->close(); -} else { - echo "Unable to open ".$path."/".$commit.".zip"; -} - -?>'; - $write = fopen('../../'.$this->commit.'.php', 'w') or die("can't open file"); - fwrite($write, $data); - fclose($write); - - @session_unset(); @session_destroy(); session_start(); - echo formatJSEND("success",null); - } - -} diff --git a/plugins/Codiad-AutoUpdate-master/controller.php b/plugins/Codiad-AutoUpdate-master/controller.php deleted file mode 100755 index 050ff0d..0000000 --- a/plugins/Codiad-AutoUpdate-master/controller.php +++ /dev/null @@ -1,70 +0,0 @@ -Init(); - } - - ////////////////////////////////////////////////////////////////// - // Clear Version - ////////////////////////////////////////////////////////////////// - - if($_GET['action']=='clear'){ - if(checkAccess()) { - $update->Clear(); - } - } - - ////////////////////////////////////////////////////////////////// - // Test Write Access - ////////////////////////////////////////////////////////////////// - - if($_GET['action']=='test'){ - if(checkAccess()) { - $update->Test(); - } - } - - ////////////////////////////////////////////////////////////////// - // Download Version - ////////////////////////////////////////////////////////////////// - - if($_GET['action']=='download'){ - if(checkAccess()) { - $update->commit = $_GET['remoteversion']; - $update->Download(); - } - } - - ////////////////////////////////////////////////////////////////// - // OptOut - ////////////////////////////////////////////////////////////////// - - if($_GET['action']=='optout'){ - if(checkAccess()) { - $update->OptOut(); - } - } - -?> diff --git a/plugins/Codiad-AutoUpdate-master/dialog.php b/plugins/Codiad-AutoUpdate-master/dialog.php deleted file mode 100755 index f3af1f2..0000000 --- a/plugins/Codiad-AutoUpdate-master/dialog.php +++ /dev/null @@ -1,108 +0,0 @@ - - -
- - type = $_GET['type']; - } - $vars = json_decode($update->Check(), true); - ?> - - - - - - remote == Common::getConstant('UPDATEURL', $update->remote)) { ?> - - - - - -
-
- -
- - -
- -
-
- -

- - .
- Force Update Codiad'; - } - } ?> - -
Note: Your installation is a nightly build. Codiad might be unstable.
- -
Update Codiad  '; - } else { - if($vars[0]['data']['autoupdate'] == '-1') { - echo ' '; - } else { - echo '  '; - } - } - } - ?> - - - - - -
 
-   - - diff --git a/plugins/Codiad-AutoUpdate-master/init.js b/plugins/Codiad-AutoUpdate-master/init.js deleted file mode 100755 index 6348595..0000000 --- a/plugins/Codiad-AutoUpdate-master/init.js +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright (c) Codiad & daeks, distributed - * as-is and without warranty under the MIT License. See - * [root]/license.txt for more. This information must remain intact. - */ - - (function (global, $) { - - var codiad = global.codiad, - scripts= document.getElementsByTagName('script'), - path = scripts[scripts.length-1].src.split('?')[0], - curpath = path.split('/').slice(0, -1).join('/')+'/'; - - $(window) - .load(function() { - codiad.autoupdate.init(); - }); - - codiad.autoupdate = { - - controller: curpath + 'controller.php', - dialog: curpath + 'dialog.php', - - ////////////////////////////////////////////////////////////////// - // Initilization - ////////////////////////////////////////////////////////////////// - - init: function () { - var _this = this; - $.get(_this.controller + '?action=init'); - $('#sb-right a[onclick="codiad.update.check();"]').attr("onclick", "codiad.autoupdate.check();"); - }, - - ////////////////////////////////////////////////////////////////// - // Update Check - ////////////////////////////////////////////////////////////////// - - check: function (type) { - var _this = this; - $('#modal-content form') - .die('submit'); // Prevent form bubbling - codiad.modal.load(500, this.dialog + '?action=check&type='+type); - $('#modal-content').html('
Checking...

'); - }, - - ////////////////////////////////////////////////////////////////// - // Update System - ////////////////////////////////////////////////////////////////// - - update: function () { - var _this = this; - var remoteversion = $('#modal-content form input[name="remoteversion"]') - .val(); - var remotename = $('#modal-content form input[name="remotename"]') - .val(); - codiad.modal.load(350, this.dialog + '?action=update&remoteversion=' + remoteversion + '&remotename=' + remotename); - $('#modal-content form') - .live('submit', function (e) { - e.preventDefault(); - var remoteversion = $('#modal-content form input[name="remoteversion"]') - .val(); - $('#modal-content').html('
Downloading & Installing...

'); - $.get(_this.controller + '?action=download&remoteversion=' + remoteversion, function(data) { - var response = codiad.jsend.parse(data); - codiad.modal.unload(); - if (response != 'error') { - window.open('./' + remoteversion + '.php','_self'); - } else { - codiad.message.error('Update failed'); - } - }); - }); - }, - - ////////////////////////////////////////////////////////////////// - // Download Archive - ////////////////////////////////////////////////////////////////// - - download: function () { - var _this = this; - var archive = $('#modal-content form input[name="archive"]') - .val(); - $('#download') - .attr('src', archive); - $.get(_this.controller + '?action=clear'); - codiad.modal.unload(); - } - - }; - -})(this, jQuery); \ No newline at end of file diff --git a/plugins/Codiad-AutoUpdate-master/plugin.json b/plugins/Codiad-AutoUpdate-master/plugin.json deleted file mode 100755 index a547edc..0000000 --- a/plugins/Codiad-AutoUpdate-master/plugin.json +++ /dev/null @@ -1,6 +0,0 @@ -[ { "author" : "daeks", - "version": "1.2", - "name" : "Codiad AutoUpdate", - "image" : "https://raw.github.com/daeks/Codiad-AutoUpdate/master/screen.png", - "url" : "https://github.com/daeks/Codiad-AutoUpdate" - } ] diff --git a/plugins/Codiad-AutoUpdate-master/screen.png b/plugins/Codiad-AutoUpdate-master/screen.png deleted file mode 100755 index 5ba0d184585071f40d15d3695b3e404ba38a7ecf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30742 zcmcG#WmH?y)-D`MfwovFZE-0ShayD^flw%}MT%Q-iaWun;nL#n1gCg$TAbiPiUxO0 z&=BB;o^#&sJ9nJ%j`xmn?~ja~tew4l&G|fYK0EZSiY(y+$_D@dfKXmeN*w^W!-M%e zzK4q`xjXPw6?4IIRhN|nln+sF-IiHNC`$kUmC^X<_c)l}_nqW)T>${1-?tyEC#(vA z0DxzSyp)8dm(kulz8iH{I`?(vDodSt@;AEQfjl}|KkkG+nvMy+H|apDVw!Beb{F`} z_MpYb#BtK<;DnNahj@i^CrjDa{rc>D4v=bRC&{BL+9%xme1<7Jo&GmY9=&Nyb(PKl zc?7TZ4^E07T)H=?cj5(&5aX9A6w1-9bmX>{jZKZkjgZT!iHUh>CMKrbJG__1@i0$J zcLB+7H8u0v6nR=*QTqI@>jR@Uu!7O4)>DDT^W|_u>?e0I!w1B0sbCST97IzKOGblG ztmz;>5t2?PfNKY#&IY3&Ogs%9Fa9+*z>_O@{eF zFZHk;b9uc26zM8oWwFssWmDGCY1GmDw?_c>O#7Nv zYSp{kUl)wVB$L!r(p3Pt5JNqfRDw*}cKmo=Ju0psiRTVErtU*65O;&I(gW|a{V8nv z92}_Q_(yV*=DDA~L8nahsNKDZ1-#FH2UK|Tc@oyO#jke45*gL<$&H~1%p77ga~UWQ z!uyHrXwUy7?%nHqCYU+{QPDeC5%=DGNGVNJORel)BoRr{0(3|{H1oJ8NT9CjRzdz< zWRIRv|_^?^0&3mM&1QIltwy)W8aQbjX!_T1FyL7QM&Tu zTZ2=C`rZJrG3}@a$R_%542-_mmIL~;K~S}!i))+Lc$-)&V|K0bMwAi+e}_2IQ2U!e zefZ_pvF4~|gdri`Skb?oF>(3ug<|*OjJKvWg#Uyi?UmPb z+4FIDN?KnfZf0pp9!Im2jmtBqW@ zsooGPTGw|`t{amh#F@K!erJZ6N8ogzCz;sHw0!i!nxPhEj_vw&0Uf}mZ#xIMEL}qf zeRTd}`RVY@O+D07>x-Fyo0J;Q6bImm>&DRNl>hm2_x+~m$-Ly#X;<_C4`HUrT5_9G zTt_<$eqs%|mo`2X>jpnzbXy*-Kxat~Tx2kLjMSw%W=Q49vZAH9MZhnBk!Ld}*Hj zTc``q^n;ZA@jN0dE%H4`rPDMne+|{| zHiMaLiM8i}OEmMnz4OQ4q_L03J!x}{igP#)K(_mUbQQ&37@z8OOgWiE(A=}|3M)fD zysIVRfUKb*KQ}m~y(sOCN-dM5(#rUE)4XTQJR84W{h%Dh?LCl{t?zBt(G#R?f$UtByPQ_LF?$t{CsDwqpClk+C10)K7HsSE{@u9n7z?%(WcRUDRC3>((>)| zN8cm{#t(dh_mlYL=~M?cNIl2!xtp`{AyfI^GT`X*gOjs8jjy(4z;35cqs5aKn}+fo zn9)=*Sz!&F+|0cW_o0Ibh}#xqx)F?61e}`bF?u8oh;li5^v>PyhwNM8?2`^tsxK~NKp%s!zXDlN$dnZbh9K7Y{RY≦oIQx zWv}~qKBQ<6X{jfelC)u|M#~kPqTgol2Dveu2y@&g&(9YMTYRrWY})Bm@8T5RzvsH% z8)$x(t!Ojhc#tbFx0+2(F)gVb;sDyE5Ov&sg9Te8$Pe#bz>=jf z4aRD|SbZKyL81F5z~h2b?8MMVO515vOV;} zGwQ79d$}5Q(~KO-&B+W!eR%dYf%Bt!ttZeyq69jJ6wd-MaN4*TU=FZ+%N)hs5 zEa@zsGimFbVuLQ<*5w3-k*`{gVmn2xl-E8e?KZbvl2OqPTqMVn=&7*xb8g4 ziGM?^P~1iWnKJTGR`J=T^AaIZBGiXEt2A$@N=r|gbjgqA6fqjMHp}2Ot3rQpbJN+8%^lFF^Jl%>bJY)!uji!6hd5@Iq%Sm_u!%fFZmHlasEiyq zjOw}7Xps_8KOG}%vXl6w8Xa~RYQ5hTQ08~4`5f8~PSY!eFs^r59H!7|Q*9J_AvAUU zb!CqD?l8X?47lF+bjvBtXq~NmgDZH?2;=+{t7zMu#6zQBJOVanet>wLTc_U)B^_yO zb6q|zTj=+DLo}w((y4Os`vj$lb+tuPNmX7DZ9gSm?Pw^6?5uY@+ssrJ&rkY;98Pg< zp!jnLA04GCbjdhBJf%ARffm#qHD(^87FfT)-pDfF!&#HU#@n2_F?g;@I>@!8g@2Il zGx~-)ZlC~vTcIc?=i^gOo!4YWUe65OMx`~?)lKgcg@qsF4H@NB5eEddW}j&vb-?tO z!|~vUX>?bbR7S`zH|44^rJHh$hR5j;YZEn6=>r9~UJT0U{Zfj{)2uOu^dFWti#0LJ@znJbDw5KZx8>9hpnO7zEu0hI! zsyA{TMC)$m;PSSG-OoGuKhKGVFO*Z<$o3v}KtUISQWVmSGI%CK%13d!{Fh6$ZjL1dQ6aaf2hJ9LWFuOK=+EC z`%3J5qBFm*S>wt$b3r+{A0!V4A4vTmP{9qq4n6{C>Fk6LmeMR1ECNpYvo>$m!*q-5hG#DJevgGI&;joirRlsKK zvmYn%DGaKnRTmEuJM-8kZ<$dFHlDAalMHa)z+;FRk@fgx<24wq8Y$-crp)4%@o9^! zd@ArB65)G@x>2UVwy4>4q|K_mMSAqIVFjw0phhs#vH@l~YOQ%ac(+yFARwS^j?D#% zPq#+(^JHb-6P`~DI)7c)dpPPNN((uI2N(nU$$s6%!(Url<0A(jw4AM;i_!$FA2fXV zwDAj$bjpaT*j)nAoR*k+kw^P1citCq-;N_Ff914T^Rpt1_xkbxF45+7!J&Cv&DZGt z=_#CI#c3u2>4aF7r=+HiI}o-X;z%6rqc0ZEuvPv zSHNi?KRp#Fc;omdH$EO~Pc&WPfiR&;cn{EHHwhi3O6pAMfLz&XD96RcH8(tR8p2kE zLJ#-q;es$>*L8vxQqGRjuSk(9$>P5{+!&qU|k=CDG(AR3x_S)kOvGOTmWe;^Xz?ln%8@5 zW_J3?3kvL4KNY#(#aP?>4p>TBs?UxHyddi}W-G(ZZ&n$-%~+r-&bD{!-42auEq7Tj zxa)Zi&(MkDNd9d%G-4){61ln+3H}*543Ueta0ZP#pSOIYQwcVf$rx|;CUj*F7BP&e z`Z+8UFgG6>$E&pEtXjzmxOZ=~#B^?dqECM5Cxg7eQrfBC>Y z8q6c~s(A=~Vb6W)ma_#Pem=gO0Bk@E7;Vr_@zSz)<1TK{Wji2{ z3BZ0RiSYpR+6Z@_|6J`~eE(47X9VTn+9}A%N8niPQnfB?3Ri}x)BX99Hl&u8RzVvw z0SYZ7X$P#{$2=1AfXKxE@Dtr;rn)C`P$*a=@E6;2jKz7la#@pyV!!*BQqj9H%K)k^ zh%qoeb8?%mr|0PmtRZ@z4z9F0Id*j^Vl({oicyJYXEVF}joW4n;zOG@T>?87S5M!R zn3Q4g3|np7Npr*M#=>dk>V$+I_--$EZf-7H+XIOV9G>P_&p(wefUyQyg26hayA*m9 zBJoqL=ny?Xp3m$-RtY?6Y`H7^WJ>IKcdkIngr^*MV(8XETJeyp*gff{MYAbnGk#zH zWSHW|4sNl2^GCiUhSx*FIIR8^l7Sj>$koG;bqYPo`qNUUda#d zYk5vHSf7gzkIDCBy{Dd=QLY$aD6X|yU(h?+Tf*{e*+ux3vP7`6wuq2gdvN_c!$^UZGPAS%NB|QnDz?hEzvo7_KH1X zs(oA{pJw##h${)!E7pV--}jn(CozEYJ(dQv^* zf%E*@&7s=PIquJ4c9pdwlyS&^awe+Cvh^hFMR_ij$B`$)TWdY33aJwf6}6}rpu|57 z_~GlVZ_avQYHHq>+dyhmrxQGZ`B7*;|328`g@C)*^Hz6{lBd6(-@!kM(vKnnJ$w25 zJWt4$WRz4?iMT&yeXRP-dgVn_tFrb@I;^>NanHUw&9oUf{@Rv=EBhvw*yoF-VT%?8 zE|33sdtP(%+(~|v_PqzokH;ph$p{m)U@i+QJ3&&~<6{KNAI`3gcPi{l?LD$*;YhcH_Yz1#(wKYd zUM!r(3Op+_!dg@TUq+9gsUGRHAUX*d_)Uk(SZelNYs|HlkB7^tGP1NSxw3~FWO$mk zrephUo`d|{5cEvTWNpVPV?ex<`Z3OwYN-I9od?z1U~hF1=+NW=;(EeK=)mT^ zyeR+j;de+h5$HX>Nb{Ias*#ZFI-iVuL}~Pn%f$G1Vg8*}U|fh#4b0wh(M+C{J|H3@ zLdPfo1Q|P=#ulxpLZNee}cT{AJmy3HvaRFr*;cs zo8WNpXysC^d&+py|HVgIsdrGztjGEB5c)f-RLoDO$vU%d`pQ{0vn;I278lo|nA}EQ z;dGP> z2a7Cf#p}AVs^KVF4{`b^61~1wQzfLR$jG1-j<^vaS>;W;c;~7 z7TBw^w5-4HW@V;So{8(8jlf4IjyaiLsHm%?J3&8>p`09jTz2|$hPSr*Og?Se`)GV2 zh>6pX^oHm_zCMfv4Q^aJ+#mGL*Z)i(ra2bd5l7VE;L-9z!3JpmMT_hn76kCcn7ifp z`^p)b{Vv$^fz6pRVNFYkf$&MTyOcc-%4PGZAY})zsIob{PH4^?_to4pEstG+v9}eH zGmR-TL>v$;PKa#{{qt{vp59O3T=u#CBuV5**A|vYxm11C{`ls;L}RIyWQZGh%|~dy zMm+i>SMRg^&ZeXsM`LBrB#1H5D2*b~n3zo4!xn+{ZQ!v6m&{0R^ksu*&T@5a?RtFu zhV|CGv%qNe*>e;$sb;8S-G+KPXT|g8$zBEzh90~8JX3tIb@W85>P z8)?9(Jaq&>glhyYpRwP4=9`r35wCXPpGFk)`(v>1o!9IU!NRR*1QaFo%kR8{uDgR8 z6YVrXzpDLl-ts`=9(K~an+CStZPfHnytYv?0%Pe8A3u8i{x`;Z$>C&5QkL*!N@Bcb z3=76HziySJyA3x661@J0ga03S(1z9Tiqz03SG1|c!Pf%s|&>Yr$_#$3;jPp2>*izHTeBd$D@O( zLa^1o*fp}h==ZUIjUc9BC4wW*6;#uJ^@k7N1A>EtZ7|4C6BE{MsiJAe+y>-9x&Gng z0rzPB2QB@#bM@bi?LT!fuJ?lE3KNI{JZ?O1a=tROYxDES%w0PxvRu+Gc@i$LWWX7T?O@%|6sN{QO`0OFUPKF(%*xp`fSIwO6jvTepS z-&PTOYBwsr{>d)E2THp==h?<8V6Jb3!=ry163=Gy%a$X+Dq+fB*bxHmeIka>@$-CX zb%L1kcTW|Ghf(IL_h82$eB$X$uF^_l_5^IfO802O<}5@NYip-zN;DS9rqgegnyEc) z2qB&QPPG%#SO*)+SL`YYa+oO_0NVJj8(U7<2QLC6VD4P5BQ8v@3W^km!d?ABNCq$T zVGru|z2c`MlN~SA`z?pVuOGxU+Zq;B({3K~m$iilelJk22l*8s^@1NL-S$|!espO} zq*2XKxQ<`VaO?dC{g!t(48S_tS4uU9{dw^odx#J0G`sm%=#HVdvXV7o7O3>ckIaIm zsoRBZkwWdu6CO!V1=*<#{TS<-jp1@ab5br(o{E=Y&z{&MI6z($=PJwVzv9|czl!}z z{G77L0KVyXzz&f~BrKnw!9)UrXOF?`;P(y}HSxnD;uTds%G%0nId89IS~&AYsQ*m}^8kjZ1lk#PXA9p4RSyg8pEI z2kd%5A_sw!0RNpJHlw1y&p}|Ds8RbW=1&Er-Y0sG`d15SX;l3AW_R!irsGA3WJQwqucZ{I z8YSg}jt{646E_-TfBUW~P8WG|VdGaug|;*_ivMshp0IB_JNSfSMC=yThTm6rmICDLi=PwPa%;wPNo8sjS1-r}noh5&r0u4q)y!HR)$LA8xnG6meyZ~)@ze7- zUm&9TR^|jMBX%a+>ETCO`BMk zQ9m#s3h%OSu51saaJB4J)tn;kb@QUQYpFb$On}kQSQT3w&$TlF`JVV6oX7kHc#CqKN>a>Qn&!l+C-MDM+_qx@v>r4o4p12Wf?l6S32vLyofV z+oQlLmp;1UKgk@nKRjmoyg$d6myN!Fswt0cG0u`Cli2C%+wYdD1$@_pj?Z%crpV-f ze`k>}O-J>qU_XuWn4>hcXL3;WAN6=4k=k<`s)bIqrgMLA0~bxCXqm~V;#GH0_V58i z<>)xlcABkmHFgR)CNfsvAxLX+mNt~?+-|;WEeaK7c7R%Pt|9amijIto9ClPb%+)!c zTEt}S6%rq)8VM2Vm1qjvR2IVzIt*QC=K{#OCCVGG>JUj<3iY7*0(>I}TfZ+Fw75LK z_fxIK@hXGQ^cmlR7#{V|Ols6Mt5wpz&sUB%Dp{-OU&3SD;Etm14Ex0qYyfUn2|--U zV)jG0%?i*1tx&6k=*16Io#ur2S6f6)y-Z9`Xfnayeo$DGMs13a=9XTvN)ThIh*#z7fgyj+{P+}#XVgFa>*Dk~2lf@{`u z)dR_R(F*K^EtFc-$hv*q_}&(D|>BGtJdQt73B?#D`vTs&%WTJYy+ zE{Gp1Q?1`>hVB^|FU4hIMNsuj;#uVKt*1BXut}|I>b0azHlj^9WkpcX>X+rC_m%DL zb*9A4#T{rf16bx*B<*S9%4oNVp6PI;&usr(>;E#x+dkKRROAbar^j}jzLP~=Ha%Pm zK{fG!S2gz9`vws*;H&<9!SqxvpPKZ9tH%|N$*?u`b>4W6KZv2{KH=^PyY5?c1a5jg z%h;3eeLu*ENe}-@0QKISEwwWdx3=L&H=d}s6 zc7oN))+B8u^y`gSvykkrjm`aO4h`x$3q@6&+*I!K^6>(O(H8VuSEA~n)So8v`^1PB z+VK4@_r?-CUG-Akc3^yl{cA+^n7;p>oR}>tF$lGWHd!}K&(+WFiZcd7CZy`(bE>B5 zXTVcG;xiQ@`-B)YrC64~jgR*lV#e z6geFH1SC>l{X*8wKR58`b>qpFaJqIw%Qi>ee+3LvM8Q>P2Fl3(w&d@TvbNZd8PHk) z`rWEZ8ry$IP0x+9ZT}|W|0l@tpJ>R%Ux#t|6joQqrdi^} z5KWy-(NCH2M)~fMwBb6oZean;N%TzAf1I?x&-tRwZ2xEKMMc5bFQb_@{Tl|-y7Gd2 z#l*4gGL%)I+g6bLisV%_BT2Jkaqe|pzDvvO!aJ47%YCxo$3%DX@c=P~*$+%sNixBo ztsRe8^Ba{>JjlWrea%O(LcH+Fn(dGBSmP5qRkIaaSX?;ztC$t z825ZQ1g@;dwJFm$wGpUu>%zzD{=(I8($U&V-s$aXCUD|_NjAK_8TysL(UsztM6`*8 z+`nq!*U?jk!jy>t^iats?RJJ`G&CP%L!{h=ih)NG+mEQ;2^$FN9}=~F>u;*Fh1Z6T zVgbI7a81I`CE9o&ADTO3KXw`m#@- zuEtB+^5TX>|mXCl1?yRmPEe3K-F&a}M{24mq<{51 zfGqq{FHZ0w+B+Uyx)NgYpf*CfKYGs1H|Q_&VH$X%-qtINAgQ8{&dC1ZY@1a{>yXVM z9hhp3qtvmVS}0LBN3mm{s}qh_1h@N+VK>}M_f0S%(mK!3!4kTY@rYBt;Rjpk=E5{2 zVtFH0<`}|w!-FvckXro|DW~t7LNSZH#w`9|XFIi`0+-=?L=R{(WyU7o)Wc-i_$J@@ zhnjrlo9Cqg(0`KjdBB!jCLnp>)HGM&E?rmXOx4mB_z+^pq?+2I(yNhMjaNYr|CN~q9 zDC`Js4gTr3dE)H$$3sV0z)bi{O}v(VN?QYV$+?3K)rtO?g4?pPZ++-?VK{A!pH|wK zb5(o};sF7~(kJ>t#Cb4$;;;2<9;L3oW!A1NCVsD!q`JKej~h%;B5Sk7))cA@{q|sS zd*foaal#Z@z-yu>%9)th4sv~vAB-@+kmje14|vH$6+MZ|Ds^54c>Tx14ER^xLqtpr ztFxaiEG(33eX#lX5ym7aJ^t@_)V~uj6_tJLTlop;oAQ0^*pt5zW_rV)-~N&+g8!F% z?tklt(OsU6p|Wf`(6s#Jep7~wtn7*7GyS3Y6IOQ*kb-AqL`b7JCYjcOh*y~}v3ZZN zeXq+`IRlr{XAPr0!qU@G-rx6|{67z+Q5000!i7X!n8$$BdeNLgeF9w2~4rgZ`|jawo}kV?Rf>snPn~D#eU} zkxI4IZ~<~yJoCl*Ma5QcG@PtMR(>B(wx=$aPF2NXb&AoED>wD#kkwwk`pfT%{V|1D zuM{;B9vA!p)gqg|FK+J#KcJEYUom~qyImK0?f>L9egkWPbbC1!apKDLTn6&Q@o^(@ zY#OU)zNj22Us{@$p#7UGd$&P5KL!s37+G7i{c8&$Ka1l;%}X+U>Fcnq{Y^UR9la98vzq;6fpBK!Ws5tQ#0`bAvND3()BR7K zed-+95yuV}4XB6s*10g>HTeZB*`=ll5&y|KD)U!YT*XW z0Io)*%%j#QQ^W&WsaqS&;u01L(-E&+Ek6&1VBZ8q%^tgz!4N|kp8F*){JwY$C+Fth zI92>9$;_@kaNQXeZj23<&B&hZavFl~zeyY`hA*(FUPahVo2lp<8L5yNqbV9YJc_%@ zA`DuEUHv7DuO^=5NYiC=Sq+`9Yd^``H;?J~g zb?ph1GqmO6#V+_pycy?D*;`g#+vuW-f4j<6bnT@rf$L#yj%`PzDZ;J=c3VriZvIC; zpk*PC9O*8NRTbyc-T9hrZH8VQxBR&+q>B6Yc#-AX!`Og;WZeFKo1-n5DMUnJIY8}u zp9|hF4CMcMS94+z=zwI}M;ED# zcjEs)#RvCC>g4l#PgIi`f}Kn7HgwnC$v8Yqo|sZ)v8H`jdhvSTAkE6Zp%k<5o(_B1 zX@)f)oMUr&oKb83jR5%FWh_%!WAR?S9nZ7xR-uvP>>bdcE`Q* zxovOr!K-T<3?^B9J&B#o*^|Ry`(ruJdQ7tcJAsQpqgI22(X^)zIN^A`$+o?> zm#=N?7r%hshZHIi09o!lBr+k#6Ys9MK}`asERd@zXS*p6Qr=)6dkjAoj_@2{(sq-`7)hFEc0YI9!AE8pyr2*;JqVP}m z%vd0{aFep#Q~QcUGlM&+HtMd&YRfg0Z+ond5q3N#gUhG4NLkQb-|>4RF1-}2PdVQG zwU#W7l#n{h_{NpwR*kiup!5VTav;118_QfE0WMDSpLM+OnZbiUl=yAem{lH!iK1Em z`iSGU^o49pn#}OIDw*?0ho7+}yz=Avz_fDkCZC@F%@o(#BA-V?oU@x7*A+C=SZ4fE zbY9TUTb)Be-Tz6@wn{=p3aHNTW}wym*&r#rb)Ip7sv}_0_+X&ATtn$!9X?b;d0y`t z7uD~=#?i;o=2j!$zL8u|wqB!NpUHs_2|-;hIDQwiur;={A~xz%GVx>WGWTRBbZ)K@I z$pUSqNYMb>VX>sina@N6lRfJ(a-f(-4)4u2o3+bkEzo}c)qI7qbTvle)`s57le%cT zem?JaTAHRMzO&w2@~^pedDI>kZ=bI^+>$OLQ&Dixe9q8v_!}QF;Roe9Ci8S@d+29Q z_W#o|c&jPFT~q%^>~x?H(T-QUTH9HwurltJ=Nmq=??P<@!RH-t6#4ulZ*(gH0kvE( z`r``O9dBH}zS1*lYT6pfW-bODJ-*7M^4QX_jo|bDFhuQr{)dIr0=?bK$nSH?*Vt03 zge!CUl$={)JL*%ZzPQhQG4v$F{Nks-)-X6_|L6L_+B*g65c_L%{;|`6X|*q2n|CrO z*xbl{@Is!63lnX&>qGfr4&xm<-$ShQSI!?*kQ1ECz3HB-&7an;nVZc-{n0;tjrH`{ zJ^Mu$D$ROUJzrW5WMR_Jsw$3ihzulD8|Ok93JLN`@r3(n7yN=I)5({@VI*)sVhx>u&x5cV6My;@Ubp}tgFgK7< z2}k|{i@B~xBnv^%lyD04_C7{Lr^rqh&;#Ch`nbDe0&(;zEudWd#V|&p`9&t;(fdmqdJIy# z7yJ>UJFCGx<7im?h`*XY>Kl683`SBP6k^U1VCn6lkCVgurG%&ZBmL=bFSv~fKVMVc z-uS|N@Am2c%Q1Q-4E06KPZ_vIUYM_c!Xw5oU_m}UNlZQ-ljp!R7b_pjJo<&qNG?7; z-tDN14E7NRe?S`yZlDJ7^XEmU3kwJcAPyQ_H#UnP8Q+Ob6Dly;!Dxqt=42^)M%fUV zT!bUD^WpE8D`4`VM;Uhs0f2|Jx9U%BZpW6Br!Cj09Teo>QWFjMCJ~Dk{c&uTfKQ7U z{RX|kQ*I->?gtJknIPrc+}AbR%Wi?drNyp$m_Oo3U~((3y)?D8cMh7}-QBki_&T@( z`@C6Q*jqQtIMDA@K1w`_r43_7@%llK&wo|KD{P{}DSY zEdmOXJ@#g0FK6^lhCTc{t|HvMF_k&J48l%&sy8*F!h5B`*S6%}Eh2^~{@I7>pq7=D zwZQ-b#QUgNX63QA!SCyaHICBx*Fn~WK6nBSn*FeG1$(LwMN&89wvH^t6RV=%A5T`~@>x2B#4LI%58Qzac#*0RR&E@8a^-rQ8493alpQGO=FIiE0MG1aKO#wcYnn#mr&;?xvA5yIY2EOe{sKc$ zdLu+1m>h!`{!aV9um{kVWPu7uK!p3Hir=Z}YpNccB1eS?K+)!&8w`Q<2= z$E{DUz@T@HE;u8dm-G8Znf$cg+&W0&<%AR}j$dHz_xn2Eno`D>>qqQuFDA=tzJ`GJ zccXOf5KJxkuWA3h9X0(M1Z&_Dh%q$xvXf(T3(p5%4tsBth#GVrPMiBGldp0$(l{9? z=E6yv9adl&_ExC2r=+m9;UmM58S1ULM8CMy5$LLnF?vauRUEU^-hOd?P$a**8yq(o zR-mO!>CQQ12nSz@QBcL0}|b69C{ww!UWukkx$ z>7$Imr6A*r{71!xjxFrPt?VkHx?Y55Y`1k2J<()YD3}y%Sz)Eh(TOOms`_lYM>u0c zpwFUB`%Ft$K3>L3vu)|)sG7j97Sb}M!IpjEcElWsDyh3AfA>%HS z+%10NyCP!Xf;sjpxrcX>3bcx&buy>T+DJLY*K}K&>~y4r1p5)@#}ukID^}XI8cH{} zS}{c&Or*>~SM6Yxo2~vx+p*TMO}f>CDqwF~8gY7NF8b6Yq;YWe!iNW<8sRuJyrza@ zNgH7k{FPNpT{7O+=h`FZiHiZIR7Ay7Y>$BUbAC+gi5gZNn8Ur(G)>MAr|czdtO-^5 zB<6^Irozx>>A9-0AGxVty?ShF+F5~bho44l%6wS0=?XxE4){4AMR|^4IhGB>>U%mt zJ`iEhaD|WDT`WslZ>iTY))d<%Gg;{ieCu2v@pz~pcrhecYgG-9dsZapz4z#ii`4$+Wnq{jq~f4d z!~5ZTs0c|Mt7@LZ0@Iz3J&(A^{hnx6#0{d}N=e)`T1T6TC1@o^94fRG#TPH{O={7o zWt@6F>Dw0^6nL!m@g?|yJg%=u#)8-5AS2K;O7l_QJOUdKc%L!)4*9;uw^!b(&7~04 zs&e+6%sXt^a`C>g-y>&b2&$%{w^nsb9pG|RA?_1*>oZO=LNfv=$5xJW(+u`H3Wn2Z8#i5&E zhplX{va!bJ{1xh`rjYNaowjel?ihpoSyjS)xz^+LMAuA_M266khUO%Qin1*CL+048 zshQBk;pRUgXw$<-_@?spM+Xqbo65;*z$d{}J;w*qZi(quf6 zYEOhm|A@?pr~#)M3%L8|tad(g^d3ZZ+NZ}f04nxi;F706!bwMxNAtEwERycvWNKIknOKInC=+j(xqdAfbeE_56OLk` z$Gc^+1q0ITXHZxc^1k?GQMxG#^26GG)&iXN8g%44xxY)+8~%a)OGh0yBnRKv&T{?pK8E903v-mnP)Dqgq}kZiE0| zrV)N|Wie_sye>8yCo9S}i`*&fx=!w?oPS{KCl%;{kAAkjAEjYm#v66soT~=H?{)l{ zw@{VIR{tl_u48QlYn#K`5cduzXqzXD8R~BLE~gX{Y;CP~Kc0Y4tu*g5`^D)sqVKM# z=wjLRo&`*oR)AiIj_Dzq_fE!z(DrDBzq{}AnhXyShfXvCvi=EnP{5v(KEt=}7AY%H zxD&OiExvx(DPmTzp-u!;Tp*~kY3a8j(4c$vtY?}8;ysiKM=c#)9&rUkIi;72OtRA9 zEPDvq^_(!izP6Ydm;I(^*1USsQ+6F`VV`Hkskq~v2ikvLS;pIapD%!0hE}J4$MLmI zSwNkLsr*GOdZ)+UyZYLUx44vl^1c2QxD5V41!{l!n>yHP@obp$gu}n$jj5lt+l=5g zCv-U1H)vaSAQ#n6d_uh7#InFoq55eZkFeWkpm^#e1n2uJm%S2&IWA8#Gi-O__z=3! zM?A8il%3pSLOrP+p|sladNKRP3I&_~r{W+etZ+WVK8_Z&z1RykVAG#ed*c%^W%5C1 zR4&rjoZUl(0lDlWY^xhZGfz@{|525!ka{k8TdID|G2%#Z{^wD2NwH(Fu+k9AA{*Z@ zdPm&h0ClpFDBhs)j8~k=&(-Xi7w!9t31VWhHHz&88{Fo!3~KSk?(m&n>-Rik^?2My zYb)+aJ8=h(TC$6WsUZalt6U?frR&T4RsO4ze(%y&hcoCvdhaUyD5Toa+LO$a66I7Y zeaL~5>pd=37hMFZ%-TLSzFZkP`_y8??l7e-leer5E3f5xYbVAS|Euwpm$Kuy_(5tU zf@vzV2PLLOaen0*lRfF^V?Z6Z-C>Se1|F9f%orOsD{P0Xg%Uix^G#KG z;WY=te4lu0>w{wLF)dG(uR2YSoWtTxAr{#CyarN`ccyr6o1T4ZjVM>dz=>2_)|}F2 zhFp|Q#XxA-rm~-@o2}pHMmi04iQV%7kqf>-QM#xeOK%H)p9)AAw(<*Va5g7*Anm zd(`2SzV^Lpc|8PWIn7bSDJYTajlwb4p-uVtC*R!s4~a}%*s@#8 zWZ&md-+4)jdBRvf61=2a4k_eTcLdHXYZ2xTVLJ`Csa~Ou1~WBKdWH~>#|P@-xGSuj zUAf%G6vYABLH^M%YPdcD!&xL$Wg3UKVcXTz!2BBDOQ+t^q@z#A~y<=Q8m< zEGf-XaL~Os_qZ1b*azn3*)jsnr9~b=-i)J`Kulr+d~|7^xi1YDhrAQ`{vb?riBdFy zSXFswj=7zwLNXvzG#0{2Rh(D!HEN*5pTLD0G_}h!@Wy2t$0$PvOBA}179iZr{RefV z^X2S77QxkagG%Ltzymb7xC5pnz7cM5i&u9r1whyGJH6Hg+a0f}Hei$YCqP#tF|Q=| zVIrS!Q`#T|UKiw()f?dPucgf&2>hximq-Q`9{Jn}=`vax5QIWH$s7~C_^mkW?NK*k); z#3R_S9D;bUqZ8cMNxU$eOTu0*k1M)Wk%0|z&@1G3Wz*14YY4Q6&9>qYn0hNUEezG* zp^n(f>^8WzQ$0w$QR2zCTN3b?#A1x}z1d!W$Eegubu};tr+wNe0K>hQz>nLVGJ`uu z?U&)A=Mh97QdaC2^LuvmSv0CWa8a{yMmr|BW zGuJq2#o+RUfd3Yda7r&dq9lzUV?tz>WOMQCgFgHNQqp4}<>lvyTC@bj6WTU>+8Epe`!`wF+FudNj z3i=b49?Togr_Hr$&s8*alY8kiqcnjpFB9khS+AFD#sMqJcX{leL^By$bYVp_GjLXm zV_`ObU`Y(1I~4rs_mg;pg22gm`eap(=U7*~Gyni5{y*bgNr}*H?wxdp+NJ5{++sKy z`9wT@y0=>U%Dm~iifi`*v+E_BBN~h1XC_Gn3JxD{MNl4GSOM_(c5JN1A{Rbl5TkSt zrL&bD=6|1nN0uaXx+R`DiE*wj!AkSq<7b}}rp6uKIm!oE%dNJm;%dyC<#5hB7ncd}Z5asG1DLI^ioVmv zFLs@>2IYZuXgyWTvW6W|vy|p3;PtH;a@H?SymBDy!8`V6l!iCc07Gamm@pt@ zuW#T3oMf+-!2Dqc(47}f_-?$Oaf0SYFvc*2)$8j&)|(8a&kftXlv`lC1qhgw zO%4^1^~FcJ+PB(U>JcS^FnEv8esscwK{cJLU``lLewN6Q9nExOB8Q+Las!)IsjG&b0E=PQ^6 zo$at)zz&_aoi8Bf3s9WF?*jT+6;TKkDE{96;dlB8W%# zcNy87%dg5$r~j+BGmnQV{{Q_*C>51GTTuxilx-}@9>$*Ch-8iIyAhS0WG7UXvCF<2 zWjFQ_iHvP9gfNyFX67D!zmMO&zwhrpzW3h8VUToVyt% zIXSH}jw%8p!v%up7MX7PJypeDtiHP$b&wPn_rWLXoYhr~+mA6dBlcM4q~|lJ&rQ3( zM{ciIEtgk1h5H8xsgum7W^z=81`-SmL7+GMz%A9Lqde|x{1|@GW;2R8;q-!sTvl5( z+VOENRYA%)C9vyAt?((ubUd2ob)pEL3!4YG^>~v^SChybddLyQUdWZM?|;s?RD4oD zgxnGls*MkqCMHc7EA9_e8;7ewTZ3ZNZmpq^lO^xfAD>2q*Gj;>G|R{1j{D%p4_5B; zRASslp$iA+9xcs{FW&(YYA0kW{u>ZEbt7*>_~!nC4RbTi+9xscZAKs81T5Comj>28 zx#54U)0eQbk_0n&EfA~MIHD0PWO2pTX3OpU#3%S`rzvxt=?UZR;t1ZzRIcc$it52q z02x9Hio@xVx7hfOkj@7=c>C1&>Pg37(}CQzFIjh>>?(`ODJfAGO=K2- z%3$^Hs-E(X3GhsbcON$9tC)}`ThMN8xv8CYqtU8E;S813=vZxX4pyjSD{T?B>pCdfDa$5yX0h zRoQ&J)QYV9r9MraNN)Wuym8C#snEu?BDvdPk=YbyLIDQJ=;%Z5KAM~!k-vV@sEH2mJs$uY+zqCr~(oOTo7+78G~%%2kW zq**Ji3|mie6r$gEuJ{yLy_W*_^NGxEC-wXK83-D&H4IFl(#q*?T@iwXplBGKb!r=x z6T0_(!_X%fRJHSRplkQ&nedAWLM?XL=V(*-9!qXtrRcSdV&+jCQdo6_pZn(IcLs5C zVJwc5vGSKS9aOKFN)6ZrpT9|9V%M1eA`?#I+X3@s*RSdig8p0vxS~AfX+Jx{1DC%9 z+EZXo&{Z)IS1HQ+xnwl)(?T)vNHo~tc_eG63zJhh-})D2wZC`fPpT4y8JUhaleJSd ziH>%aQ9tR2DLsGrrNu~C+t0J8ao+f?lu61@z}>}t3gnvr+E}bDU0}NaCYs;}p$^z6 zgJ(vUR0uN5$0Y=T=)?SLR_>Sc5g2)u1Lk{qOg*3W-zYmePnlE36H25UP5+E2C=AIs zzI;mw5b-+~slG=|{WcT;Dn(U8Q`7frkxm=SNZu|1!Q$~Xt#wI@FJ59P$?^3Rg}!+! zmMdvj9gDLQ?{asHFG zZ%7BZF);QsFeC$d#`b>@-)PqaZnnE;?fy|t%j(V0ad>XS5%O`q#5N9R@+N>m7U%^W zExs#>s*$ruG+o)gH>*>RGIqP2hP&@}W9=ln&@L5gP-YGSu_`pu@;l>J*Zxp4cE_JW zKp*pfCeK?{sPDOTonK?B#2@5P4}q=rOl6DZW2^jGUKFj1!`)as4YpIhbs8&oLCo2< zyq$?RO(D4(d^`8oeDKyPfds3))p=zA0cnwYqEW{1Rf5jx(-G7Rz=(;i5i<5ik-`P_ zX=#Z%eYtIm6lO{~Ge5P=S@kikmZRq`K(3hn=z^lB_G>_1>T&Zg%i`J98_X<>KG&^0 zcTs3V`JJv&C2Tis6K6j8;7<8%Azb?A)AW$Nw0-Q@Vkb7Q8>myoKFyzD-CKBd@>0cn z)spGPq1r9JKb+4Gi{YPp1oS^4u7Hnh-Ae!~go66wx*P#bp2>(?g#yl4NmNORe8l{) zY6k3HP>D`Uo=8KFRQ7Y=sre^KjY7+&_j&LpZ9ApwoJ!pe7jXgh6O|wYe|TmTa-%M3 zPvf1alPRB07OUM7XJdJyt&3QSyaMC<+{vQam1prGB?&r;c-d?~6Ye<80;4#y_L)u` zyM`X5D5nSxa!UE$F24_P$8|@Y$%S0;*Vr&rJFilLYj}GkN{s7~dT|RH*L&yDP6q}V zLf~kr9h1i^JHri}NqagfCGbYz>|UhuqAkvFN~SC8DFy52)y*qQ>Z^@kK}@bMeSeJl z$=pg6dHh;eg@?FeRL7XMTJzz-wuckup4sR3t67^khHRJY+&kIpC!0sKe03GluoT;K zp@8nXC=iP*!YB8>H5;$syY_jDvz2m%vu-S{`)D{I<6caiv(TkfWT24EM9w3@cejF% z?RthvF({#;Egj1fRMTH`ZC_s;R(ZYE>DBvd` zr~5}U?!HC_! zORIL(ZcujZ4ku(rRC~yohfn$EL2q-*mrrzi06o;ypSF63<1;5)@FQElqZG8Wlt|Kf zvlncb{k52XZe9l7`RN+L{Wluj;~p%M7Y@yp*<|c8aZORUudFno7H1Q%dHhd^?k;}P z#Y<}_o4a2tE*(5mP7?CJx0j=i8g!#=m<8(FuO2P1L{~|pE1R|Q&tL7;86-a}72M#Z zxr=R)-2(JqnTCb(7cZ1g1Hw0w$vOPj7SikM_`@Y5g~8I3kiEm9T%tQ29rD)$7~^lf z%Y#)U@mdna!-a3zel>uujn&ax$s2r2eWkTbH>ZX7i1XDhbqm0a<%22fdNl_*zx4oJ zXLqiAy%5D2FQ33^W8du zlQL%UdM(mHfTCP2J~{B?`mU~iiz2Lu7j|2WYi$T@{UF%1n-0D<&bRLSrut&i`cxk2 zEaK#Nr<5D9dpv}02$?F~sFZ;1GZxvC{D@c3{rf81!uW|F7PBR`mjDPMfFPvEMm%PHb5XiI{U z_OgwM)TM~g=u^GAL@zBj2;)KI-Z(vM@TnSI5V2S{FqSvkD$t}8%CZ%nIFWf-p%C$O z@tl9#gX=|=(FQv27WOu7U2pVt#oyz{5rMhTi(I>cvfCy+g3D$9_+07hO((fr;eTN5$})f^9oGQdZo#n5AjjZZ|0u0`t zt9%ysD-a+&eMei!>-z)TL5)2yPFx>%%?b5{BQZ6BXK0@uL~Gvey(m-$x{X{m5*uLR zH|6!Y4iFgAV{_0l?W6+eB>-O@JqGW72b(@GhMtGo@qk}O^E$Na-x@9E488ajIImB` zm`@u-{=E775-JMJ4FkXaSFtbDVllA)4@NGixOzi-W0w-`%ZJ`O2VyW*q`DVWT(iT$ zhD7?v-GK^c4qdA8mo6dEu40OUmc$cb5t=>X2CyycasRTN@%j&fltK+cQ4GV zLE*Ji!lH#tG@L7cM9ck#YD*+?P-^Fk{C&;ZLps|W5E>C+BlxGwlZdFkcFWYt`ysps zUOo25Iiv$r)Xog;Onb>k08K=V1=;IiOvUKvy3b?88@ zZ4+)z+;bC*9Z3~zJnr~&MrN`xo}jGUl;dM2ai7EPTEk}@*)tE}v$w70arfJZ*`{2bIvDv*4f{?@p}u6CRbN$OYwlmp>-v`)VsrG zb5nVrsTMMVuqTT8Umz$``F$6yfp7QvlEMmtlx&n#f+yCVkOyA!zF3+(QI#`Wu|+CO zRW`d2&zdUueIPWZ+pEddmCLBctxqPdx{)Dct)+1STn3XyxjVmh#w;)G=kMHkC0Y)X zv0^?zR}6SJju7~^^M3)=tzfJj>q*0q#gu|=+vN>|Q(3dg;^ewf21|J?Q}wJ($X^sD z*e6E5j)0vqc*~W|A0^6`tQ+Yw1orD>50WeD!pb%ubKbz?ydW;rx-56W!k^=zvxt49 z_B(Xt%&zE0uif#YIc)Gr1pf;K$_a(lrzu6->gA$VyC*chq&m`#hTEgT)&h>*?ZGQ= zRWbf&S$?Upf_Dkc*Nn$j@@1>)eq4M*<%3 z8Am)C%7ukG;eRgOO64w_dU<>$(jwKyw8#voc-{)FOQzfgM*HU+>U#ZFZ^;X8(5xn; z<*vT1^LR5J#5wOE0pw8Ug?~+^Rh7ds=IcmRKwr$KyPcdo>C=~6RXV(h;`N+1t0H0_ zQ#9o@qkH4}(3O)icUPdL!Q1y?2sFZ&xYOK?7o#jq^%fJVq7a`Fo!XatNRorI#G>i9 z1LJmgYI~A~FtS~~2h1K1{C19s@eNfjXkxuc`@ZDlrhO>EKBX?o-(kE2HRDM%-2S()d{%HNJqtK1-1%cTV>r|4|2a{hD{OD2Oe4@p2zD=tdfPU<0o+I6rCTkbQAYfAlYUsOfr_p^jGj8;p9;>E!6gRl;}J zSrH34jigvL4FE`7Z@T$@oX{T(oi$WZ4p0sKrlz^rR#5q-{fd}`ya#*gPSPayAee25 zkapf`BX`*2A!Qx{f)5L1)>mJVE!+mM|Mu zhOolZHLa2cl0og2P22gK+$15DF#zl~v{8aF-85X}jS%6mGIY zf(E+Jx!+ukUWRsL^!`>m=SZDsYhxaf%zHf!{SuHf8I2QK2aQMf4K9rO=Z&cS5EQ7( zes%3*U!EAR<(yPhp8be-V?l&XDl>D0w?v2*jA76Z7u+9veIs|SS;n#k>2JaLZ?qS7{8izM)pmzyz94FxMa4IwijFL&xaf@_Epwjj7f3V z9q{Yzo7C#+v`(f%U%>h4$B8Q(e)lE@m*$Oo5DUV6!Tny~2yyP=e zZmoPNzmO&sve%Xfl21Z5a&Lz9><`fC#WTQ@OB}RZ_E^?S&kQSA6Ws-=zc-kfL-VUD z5w=-#mo>^h&)RD^KBeD19yF&&OE^C0R_m$H-P+&QHYec=0Zh6}EnhWM?K`>@SB#QY znoD%Z4v7m9ueME^jxu&0zf_%9H4N=t{TSzCYUTKXv-oOu(T6>_Pc`kg92z7pXOG1t z`#L{!o{8NpquoT~CD9SW(oHGQ{q=VnP%Q|6e&U_yu*VOW0!0)c@=YX$&UExkpvIE1 zC_$nnFLA4?nVVI5OZa9A7b_K3Zvpk4u3PHDdNT`11mPtkS@L_IA&9tV-cCZIorxR8 z3o_b4_OT4D43)hnzFoz0cUY$Ub>b{W{HNKn-KFVw2tdc#cYG;QvSS;)eOQ{be;NDI z;vjy*t>eVg!*v5TzX`Wve`n$|D73k(pWj=>;7W@~Ts}Gfs$n~<_u$r;qj_#mF{!7P zIMFnLAk6HTh2RhFsR2ytdPFU#Fq~&29GEp=Z>21U`_UR>9y%=>=?*ZNf}WoC;8=%M zakRlbx-Py0w9-&TVBRwHZc>^$d$z%qR?xGv|8&~=SG4<|YlEa4LA=*PLezS=wGF-; zweue92e8^mJOxkDUCvnK05Haw}XR(MgXTVSrxe>6$hO!nh)c5TGKKHpUU)DyjX zlGP|z#*{|6njW9hmow$*LJf^RjhF7%%+i{DnT-!9%4#kiXl=R8-Cg-vK6>IB_AG*_ z-d)h%Hl!ygRyMN}Xe(K^uh5Lb4YAwtH`Gh)In7ET^G-srG$q`}QU~ll({Fo!&P1(; z|4Ni#LHgcB(t|#ZE~xsLev^z|=MuOAmRx!oyI7Z(P$E&JHY*qPbn&}!-3|AF>&=PR zx_x_;4r1Nkhp}9x2$OeFgBp$3hzd9}=yd%WE0CQPVU#kDPjm3A9$SV<%H6?Q?WP~Hv1-%_Pf6@ z0LyDi0iL9Dd_34XWK};}8%Virn8D@QJxdtV)2>g)nQ(fylV@YDnxP$F;#=yC8f^ge zj-2*JXj2zsYVt*L-d!KLNt{YNK@kM3oW=vQ^><#=rdXKC=EK)A`PL zn?Z3Yvsr`ESxW-^V|7E&gK4Xf(~+gW$SJZb(S0%HF$3vx_c5+PRj4~ELj*N6!wF6(IYn|-}^jfv;m!twH zX#Wpat;X*`p!YKp=>6RGiyT%AC8Zu4rVBkhRVoW4ko;8T-|r+DS18A3c;;RzP*A)4 zFa4kHrhYeG;)(hC3ekTd@Oba{`<0Kkk`{%skU%@!xBQPeszV8-34gO?urNHnB=bge zcdfe+r=Ad}ViMThEJr|)6;JKDocczZRfUs$T7chbpITU zF+iDQngUYDRneh%ovM(#OD2U(%G5R~DTZu+u&vV;?QEvNsiL}z284bKkgdg)vu|jC zU9dix7s$Um7Jsr2$*-mqWW0J83h-zq!@nLj&uIP^nu)c|LLlZ(Hcggq6WR-4>$_Hy zm5&63g$t=JFpvJ8u5mma5NnwB2FURG_BLD+9b`a0HO%W-9Lx|WfZc*H?ziJ+jMO<= z2Xhq^?7v=E^4|#(XGij};9opp_%xKJb=si+&hdYrE&NME;QymPEVQ=N5+tuM6IR5C zw&V7He3^nhQ4Nk56@nTRJKc&q}cwH>Q^hw0%JO(^N$ z{Ntp_bk&K4xv@jyX~<5MCmT9|WJ>4}#7cgM-!WM!d1OX%Jn!62@g7q~^?U{6+~by4 z5a@d7hFu%HHBsamnHKyubx`&(;urA)NhMX5EKVRDY@)_7yT`c1)Z2*E zZec91)|z6>t$`f-tf+&%f8`y;9sQaR5eW!8$I+fC1i=# z$*QSf?Wgk7{Z^T&SKhM*UZZ{H`qS@`>+3LvusFEBawDN`rq zd&y{%amK;wqXOH?JjoOpNX|$%lq6A}@x8dRh1y*1@#E>>DQR1-e&m$sX8!&-B&%?@ zj~55y_GL#pPm5RL%{ICN{i%l#ogOj+Gg)1dO{OINyT<*QZy{s(N7fRPY$)3g1OkS4m8LA} zo}8#tcO_uuU$BxtPM%!iXBULW&D0qlz}41{TR)||>X*a{xWC@#;I?ZbTIY~CIm^tI zG!a3fZ5na4ue*94vrQ>*&xMgqQg(~{S+*-J=Uew66_l<26r%_3B7ZF2$s~4ked@(`)do^H2&*mWj(#rqhB5ee7UPw?afi#yE9o+k#~P@F(F!8rX_SB=nSQj>ZG*XWxX`L>nzD*TGu`KF3beHX%CpOD@e@^OrsIU4J$u*J%>Up6qIWo;%rC;;Wi3spkP2>tvzhmgbI;zp zpgem-l@)@N@5VO^k9h6nR$B}z6-*jr&WK1#|B7!c%bmW%5*jlLRTT=0s8>iCtIO3J zo|SREkB>BhZA53Oe~*7_D?7EGmT(=ss5Ku)pSHScrkUuxYG0FKB7$HgC(HLunG|XV z`s4oy9-8d_7HG?xu+GU-QnMd_?_BY@w1j!Im{)`vJdSY4>HE%qZN5euTj3eNglqdeSe7C#|1m6*A`nsXH#PBj(Hsr&_{_PfNn>&lmDv!tIg_QNwK zs)7b>ZUdgU8Z@Uj!fDiP8ZHOT(kfWGrHMqx*)>tmh1gkVCB52=9B2-48mz6UvZQ_~ z>bSey?+f)DdSGZ#)-6UuAMGHQC!C)U(II$9~< zWh{njOj#Z~5^!*N?F%vAOE1;#7zaIn!*PJsv3%S)QfqK5-f7t8bgTRwnhhO;>$=h{ zi)gO=;>1wE~k(;#a!{x8SxQggdF*31?Q<$NgLm7 z)>+@TK0Z02xaN~RS=_#4Sg}0ak|R67r@$VTZ0oo$tDFEiv0R`YSxaJ!O- z_d&FOV8N218fWc@{;JLUq&CA^-HDNT@!Gw^Neiceq5v$D*R)MA3FthNfhTuMY)e`Z z>976DS%>AX6z=;SzA9^8jcx01hMhT z|C~7XUyx_T3pyjYL1NVZXiJGV2Z;-3|D9s%IrHy3Re+9b`^{~Atc04=OAcRV99Ugh?;U47vG6i>NKM;<;plz@?fi0q-?QuaY_ zb=a-{`4KaD?)hN)C)k-g7HfZVzyFGWfnz zZfrQO-_c^>{V=YZkE}jMmf{f<;-rMlDk+e(W94!CEz91&(Z_SDgl`{=vFNS9lvW=@r(ckHZtjxlx|SQIR_A)H^IK0do2a{Ve6 zmLUU17wk4`VoyF#ttoWL9TypQWqhH!NMP@;MHV4+NC@ryHE3OH#%p(hA6ySn2ASq={1C8u758!^zNp?;Svra4^a*SSubjRb5pH? zw#1stT<$ymLap})HraVdTU$PcS<;&MTG?rr2@Y>WcrB{vu_W*n!hGe0$}_d|K6Cj8 zG;F@zYfj<%@F?uj)t?6His^7RNb6&iyf5F2nfgR|1vL&g;_b&GIr9`Yc~z_aGNP-V zIEC$|h%GbG>>Rmav~zTfE$(K+m!P$P>9X1J-84g9AJ7PKMFHF9xQC5_;r-tq)}8ce zdyUA!RAS(*5b{nQdUQcLw;+p*&0Rj?mf7J@$rFhwexEH{3={Neg+sDGpIQ|pN~X3_ zU}j(m@m#6wJ*$wQ$ae4THl87EoINH2E2$8ozntTr_7rgTH{{8s7LAMM(>b_{`Y1bq zgNQ(PXa^Nz7heB3?`}G~zO~QqiCwp|vHNI@MZ^y=f}{AowqDoEQWNGrE9x1qauP*E zlO2YuOC7()Iue?3v_nTHFKql_N)uV>O7@jjZa!OkE0|O)Ce)ihSaBUfeTU0V+r@cy zl3p~p7MPOsUPNUJ!T8^Dxx(dWMg{`3>{=*5bF@663%njp&KWSy;H~I>8zn&n9McG`Fvd(*{A{nb~BXt5tzxorbp`oEJ;#*y|v6U$6XbG#49 zR;(ZUBAhhta>|I}UY)bHnLr8Jj3opqPjtIq%alnOZXHn^l`SFaDi;b)75L}ouS=`g zOs9_WuLj?~jd3h7)%jY_4w^6j z0;!G9$xGU9*W8Xys|p8;zI+d%bLf@a6BJnf;)|BkSWVuX`ty=|lhg~#58Ni&uj79- zbSF+-y6NNgs7h;f&~#H>d+;Gw!KF2|KfT@v~w?$4^Z=?m)j2X5$S$xma;E&C(Lb35hC&95pN-mUrT|@BLpdgLQ-t# z6T&94p{5KUrVgtSKa9af;GPnSaHk?vdFoa(ASWWy(bmfAwutx% zPIx#F{M}lG^h?YiiObK&L*DAi@Qu4m>q_E<8ni@c$~3VT^nJfJPytUDJ(j_uz$M(o z@9CdkKF(YM{b3FRt>_b^+`Qwr3+(B1-m~W{GE|Ox2F>p-B%lh`nU!Pr$W~ceNw+VJ zy8ZN{IegmuLGognrLd$$Z#Ts4AqShb%*n+~qY?au+7l69&SW)hx05Z6#bWG{v)SlP ziN~qT?s9DnIsUIm1{|iGa)hhI#TIt#q&Yc*E?cfNE{~P1>2)gEUwTZF{Ag26Q<-$+ z5Cb+PrH7m>-D&f3a^gt{oLRfKs+YWQzU^Y}(UA*qU*J>uyK%cz+?e5$`GlLLE4w55 zn|G@i#(cG0y?eol?^U>&kbgkLV+4ZNM|IC(J*wENyV@T&%%BtLwu(|?N$K0s$4GAf z$Eh*6jZglbV8uf7GbHbOcOp8n7N#|p2GJY)e9OaRbdwt7cj0T??`Q|bUo6<_qiqLh zZw)R&;p9~gap{VTcXvQ@DfX)Wen-9r-@c$xMPBov&)8NkS-lOuGG;GX21lw=t6aXH zRYB@!b$iJtJ4EN^taEqEEqv9j7N+LZ1j^9iAak*q^ zWlv^Ux^TLD)=K2UFPkGz8~N^-b!_u@Bi!&3;v+1O;27|PW2{@g=+gsVSU7X*Va{)d zlEo1NmY@&qW^&48!X8xL*q8+{XHg7T3U_K=2xKp+02X8-le`E=EbB$fI*8A`xs3jd zj$AU{RKc6^mE%-OO6@?pApgbU>%4KHzrl0=!Zcsw8=R}nFo-ZYUZGVLF5en25$xFB z8m6qAZg|*jSK;0JO2b`)UweCld0)wJ4_}G;=19pX?VFq<+d(muJ67ji6WLXrCF`%7 zg&uSw^hMaC{ObeiraZAPi&tA?kfq|y9AAVB5W-Z&Ej70;V0S;+TOyn1TYcrG=&iU@ zEiF}P4#`<%F%`ztU9`TG51p7w7VkJY6d#c)L{++W-zxp;;*hRwDxz zPKznj;cKrB&8m$PeB$@hf3Ytsq1i7JunFl%Sk#4)*Av0a1=%Ki*xn8^J6#FFg0F5FcIwfF0(FSXwXZ zNa;3+tkfb7VgrY=HYEP>v^!akNA`5i4h)=3 z(m>KSoB!5bL&Uf32a9UWv&YWu~EWC|RgGB^+f4pdQbSuQg zpBp#?ZZ{5T6i3IOo;MdduTp6720L%s845_y%F?-U#LA1wa=KkV5^?(?CB)SORv{sC z<7DPXW_d98KcLyM9swtEOZTM}PNrgHF2O&ghO=Rw9Xz$Nv+l``4o~f`gp8;3XVb05 zA?<1}d$dbcT1cMg03O z>|7B;NF{u*7tYFt{@OW|m7`x8IhiVk#NIz@L)(W>wbs;~UcbP9rgdOI#5NsePYJir zA8{<2q4u6zzt>O;>M(UU!z!{mER@e~W>#c}dSJ+WJrbyeLSG6-g5DPAS0+`IMg6Ov%0u9X$E~X$mVVb;xHgyDs@KT}88Qe>aAzpp(zjBDt^oHe#s0UeIDR zb^Ghes&2ft{nrlB`ro;#{$IAx`Ok|58CVz^DxaK627Sh=tu|eE9ZvTwRCnR}KP&ow zsluxnfSD9vNdg1#4)ajDsO_m`q@hJ@&tHogoz>y&JRm8~P>gkXb-IKP&1omnaxSl0 ze0sS^nZv0Vf-2O`s|? Date: Wed, 18 Jul 2018 15:28:56 -0400 Subject: [PATCH 2/2] Updated version number --- components/update/class.update.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/update/class.update.php b/components/update/class.update.php index a240748..16039d4 100755 --- a/components/update/class.update.php +++ b/components/update/class.update.php @@ -12,7 +12,7 @@ class Update { // CONSTANTS ////////////////////////////////////////////////////////////////// - CONST VERSION = "v.2.8.5"; + CONST VERSION = "v.2.8.7"; ////////////////////////////////////////////////////////////////// // PROPERTIES