From 797824d01cb71bf5b78b4960f19be4605cc3fdb7 Mon Sep 17 00:00:00 2001 From: Joywayer Date: Fri, 10 Apr 2026 17:00:08 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- codes/agent/game-docker/README.md | 42 +- .../dlweb/api/common/BaseMethod.php.bak | 2480 ----------------- .../dlweb/api/document/platform.rar | Bin 4265 -> 0 bytes .../game-docker/dlweb/api/document/web.zip | Bin 5666 -> 0 bytes .../api/document/友乐牛牛代理后台业务.rar | Bin 54663 -> 0 bytes 5 files changed, 36 insertions(+), 2486 deletions(-) delete mode 100644 codes/agent/game-docker/dlweb/api/common/BaseMethod.php.bak delete mode 100644 codes/agent/game-docker/dlweb/api/document/platform.rar delete mode 100644 codes/agent/game-docker/dlweb/api/document/web.zip delete mode 100644 codes/agent/game-docker/dlweb/api/document/友乐牛牛代理后台业务.rar diff --git a/codes/agent/game-docker/README.md b/codes/agent/game-docker/README.md index a5e7614..4b6d5e7 100644 --- a/codes/agent/game-docker/README.md +++ b/codes/agent/game-docker/README.md @@ -91,14 +91,44 @@ game-docker/ ### 前置要求 -- Docker Engine 20.10+ -- Docker Compose v2+ +- Linux 服务器(推荐 Ubuntu 22.04 / CentOS 8+,最低 2C 2G) - 域名已解析到服务器 IP(3 个域名:API / DLWEB / wxserver) - 服务器 80 和 443 端口可用 +- Docker 和 Docker Compose(如未安装,`deploy.sh` 会自动安装并配置国内镜像加速) -### 1. 准备环境变量 +### 1. 上传项目到服务器 + +将 `game-docker` 目录上传到服务器 `/opt/youle/` 下: ```bash +# 方式一:从本地直接上传(Windows 使用 scp / WinSCP / SFTP) +scp -r game-docker/ root@your-server-ip:/opt/youle/ + +# 方式二:从 Git 仓库拉取 +ssh root@your-server-ip +mkdir -p /opt/youle +cd /opt/youle +git clone <仓库地址> game-docker +``` + +上传后服务器上的目录结构: + +``` +/opt/youle/game-docker/ +├── .env.example +├── docker-compose.yml +├── deploy.sh +├── init-ssl.sh +├── api/ +├── dlweb/ +├── wxserver_daoqi/ +└── docker/ +``` + +### 2. 准备环境变量 + +```bash +cd /opt/youle/game-docker cp .env.example .env vim .env ``` @@ -128,7 +158,7 @@ WX_PAY_KEY=your-key SSL_EMAIL=your-email@example.com ``` -### 2. 首次申请 SSL 证书 +### 3. 首次申请 SSL 证书 ```bash chmod +x deploy.sh init-ssl.sh @@ -140,7 +170,7 @@ chmod +x deploy.sh init-ssl.sh ./deploy.sh ssl-init ``` -### 3. 启动所有服务 +### 4. 启动所有服务 ```bash ./deploy.sh up @@ -159,7 +189,7 @@ chmod +x deploy.sh init-ssl.sh ./deploy.sh logs cronjob ``` -### 4. 部署命令速查 +### 5. 部署命令速查 | 命令 | 说明 | |------|------| diff --git a/codes/agent/game-docker/dlweb/api/common/BaseMethod.php.bak b/codes/agent/game-docker/dlweb/api/common/BaseMethod.php.bak deleted file mode 100644 index 4919bf6..0000000 --- a/codes/agent/game-docker/dlweb/api/common/BaseMethod.php.bak +++ /dev/null @@ -1,2480 +0,0 @@ - -/** - * Class BaseMethod - * �ӿڶ������ - * @auther Ӧ�� - */ -class BaseMethod -{ - // raw��������ָ���ֶ��Ƿ�ԭʼ���ݴ��䣬Ϊtrue���Բ�����ʽ���ݸ�pdo - const PROPERTYNAME_RAW = 'raw'; - // type���������ƶ��ֶ��������� - const PROPERTYNAME_TYPE = 'type'; - // value���������ֶε�ֵ - const PROPERTYNAME_VALUE = 'value'; - - // type���Կ�ѡֵ - const TYPENAME_STRING = 'string'; // �ַ������� - const TYPENAME_NUMBER = 'number'; // ��ֵ���� - const TYPENAME_DATE = 'date'; // �������� - const TYPENAME_TIMESTAMP = 'timestamp'; // ʱ������� - const TYPENAME_LOB = 'lob'; // ���������� - const TYPENAME_RAW = 'raw'; // Դ�������� - - - // where �ֶ�Ҫ�õ�������Ԫ���� - const CONDITION_NAMES = 'conditions'; // �����ֶ� - const CONDITION_VALUE = 'values'; // ����ֵ - - - // ��ѯ�ֶ�Ҫ�õ�������Ԫ���� - const FIELDNAME_FIELD = 'field'; // Դ�ֶ��� - const FIELDNAME_ALIAS = 'alias'; // ���ֶ�����������Alias - - - // sql����õ�������Ԫ���� - const COMMAND_LINE = 'commandline'; - const COMMAND_VARS = 'commandvars'; - - /** - * @note ������ - * @var int - * @auther Ӧ�� - */ - protected $ErrorCode; - - /** - * @note ������Ϣ - * @var string|mixed - * @auther Ӧ�� - */ - protected $ErrorInfo; - - /** - * @var DatabaseHelper - */ - protected $Database; - - //private $ReferenceCharacter; - private $RefCharLeft; - private $RefCharRight; - - /** - * BaseMethod constructor. - */ - public function __construct() - { - if (0 == strcasecmp('MYSQL', DATABASE_TYPE)) - { - $p = array( - PARAMETERNAME_HOSTNAME => DB_HOSTNAME, - PARAMETERNAME_HOSTPORT => DB_HOSTPORT, - PARAMETERNAME_DATABASE => DB_DATABASE, - PARAMETERNAME_USERNAME => DB_USERNAME, - PARAMETERNAME_PASSWORD => DB_PASSWORD, - PARAMETERNAME_CHARSET => DB_CHARSET, - ); - - $this->Database = new MYSQLHelper(); - $this->Database->FetchStyle = PDO::FETCH_ASSOC; - if (!$this->Database->Connect($p)) - { - $this->ErrorCode = $this->Database->GetErrorCode(); - $this->ErrorInfo = $this->Database->GetErrorInfo(); - - $this->Database = null; - } - - $this->RefCharLeft = '`'; - $this->RefCharRight = '`'; - } - elseif (0 == strcasecmp('SQLSRV', DATABASE_TYPE)) - { - $p = array( - PARAMETERNAME_HOSTNAME => DB_HOSTNAME, - PARAMETERNAME_HOSTPORT => DB_HOSTPORT, - PARAMETERNAME_DATABASE => DB_DATABASE, - PARAMETERNAME_USERNAME => DB_USERNAME, - PARAMETERNAME_PASSWORD => DB_PASSWORD, - ); - - $this->Database = new SQLSRVHelper(); - $this->Database->FetchStyle = PDO::FETCH_ASSOC; - if (!$this->Database->Connect($p)) - { - $this->ErrorCode = $this->Database->GetErrorCode(); - $this->ErrorInfo = $this->Database->GetErrorInfo(); - - $this->Database = null; - } - - $this->RefCharLeft = '['; - $this->RefCharRight = ']'; - } - elseif (0 == strcasecmp('ORACLE', DATABASE_TYPE)) - { - $p = array( - PARAMETERNAME_HOSTNAME => DB_HOSTNAME, - PARAMETERNAME_HOSTPORT => DB_HOSTPORT, - PARAMETERNAME_SERVICE => DB_DATABASE, - PARAMETERNAME_USERNAME => DB_USERNAME, - PARAMETERNAME_PASSWORD => DB_PASSWORD, - ); - - $this->Database = new ORACLEHelper(); - $this->Database->FetchStyle = PDO::FETCH_ASSOC; - if (!$this->Database->Connect($p)) - { - $this->ErrorCode = $this->Database->GetErrorCode(); - $this->ErrorInfo = $this->Database->GetErrorInfo(); - - $this->Database = null; - } - - $this->RefCharLeft = ''; - $this->RefCharRight = ''; - } - else - { - $this->Database = null; - $this->ErrorCode = ERRORCODE_BADPARAMETER; - $this->ErrorInfo = sprintf(ERRORINFO_BADPARAMETER, 'dbtype', DATABASE_TYPE); - } - } - - /** - * BaseMethod destructor - */ - public function __destruct() - { - $this->Database = null; - } - - - /** - * @note pdo�������ݣ��з��ؽ������ - * @param mixed - * @return mixed|null - */ - protected function PDO_Request() - { - if (null == $this->Database) - { - return null; - } - - $return = call_user_func_array(array($this->Database, 'Request'), func_get_args()); - $this->ErrorCode = $this->Database->GetErrorCode(); - $this->ErrorInfo = $this->Database->GetErrorInfo(); - return $return; - } - - /** - * @note pdoִ����䣨�޷��ؽ������ - * @param mixed - * @return mixed|null - */ - protected function PDO_Execute() - { - if (null == $this->Database) - { - return null; - } - $return = call_user_func_array(array($this->Database, 'Execute'), func_get_args()); - $this->ErrorCode = $this->Database->GetErrorCode(); - $this->ErrorInfo = $this->Database->GetErrorInfo(); - return $return; - } - - /** - * @note ���һ��ִ�в���󣬲������Զ���� - * @param string $name - * @return bool|null|string - */ - protected function PDO_LastInsertId($name = null) - { - if (null == $this->Database) - { - return null; - } - else - { - return $this->Database->LastInsertId($name); - } - } - - /** - * @note ����һ������ - * @return bool|null - */ - protected function PDO_BeginTransaction() - { - if (null == $this->Database) - { - return null; - } - else - { - return $this->Database->BeginTransaction(); - } - } - - /** - * @note �ύһ������ - * @return bool|null - */ - protected function PDO_Commit() - { - if (null == $this->Database) - { - return null; - } - else - { - return $this->Database->Commit(); - } - } - - /** - * @note �ع�һ������ - * @return bool|null - */ - protected function PDO_Rollback() - { - if (null == $this->Database) - { - return null; - } - else - { - return $this->Database->Rollback(); - } - } - - - protected function GetRandString($prefix = '') - { - return (empty($prefix) ? '' : $prefix) . rand(1000, 9999); - } - - - /** - * @note ����ʶ�������޶��� - * @param string $Identifiers Ҫ����ı�ʶ�� - * @param bool $Quoted �Ƿ��Ǵ������� - * @param string $SpecialChar Ҫ�ر���(����)���ַ� - */ - protected function GetIdentifiers($Identifiers, $Quoted = false, $SpecialChar = null) - { - if (is_null($Identifiers) || '' == $Identifiers) - { - return ''; - } - elseif ($Quoted) - { - $Length = mb_strlen($Identifiers, USEDCHARSET); - if ("'" == mb_substr($Identifiers, 0, 1, USEDCHARSET)) - { - $Length--; - $Identifiers = mb_substr($Identifiers, 1, $Length, USEDCHARSET); - } - if ("'" == mb_substr($Identifiers, $Length - 1, 1, USEDCHARSET)) - { - $Length--; - $Identifiers = mb_substr($Identifiers, 0, $Length, USEDCHARSET); - } - - return "'" . str_replace("'", "''", $Identifiers) . "'"; - } - elseif (!empty($SpecialChar) && mb_strstr($Identifiers, $SpecialChar, false, USEDCHARSET)) - { - $Identifiers = str_replace($SpecialChar, $this->RefCharLeft . $SpecialChar . $this->RefCharRight, $Identifiers); - return $this->RefCharLeft . $Identifiers . $this->RefCharRight; - } - else - { - return $this->RefCharLeft . $Identifiers . $this->RefCharRight; - } - } - - - /** - * @note ��ȡsql�������� - * @param array|mixed $ands ���ֶ���=�ֶ�ֵ�� - * @param array|mixed $ors ���ֶ���=�ֶ�ֵ�� - * @return array - */ - private function GetWheres($ands = null, $ors = null) - { - if (is_object($ands)) - { - $ands = (array)$ands; - } - if (is_object($ors)) - { - $ors = (array)$ors; - } - - $result = array( - Self::CONDITION_NAMES => '', - Self::CONDITION_VALUE => array(), - ); - - if (!empty($ands) || !empty($ors)) - { - // and���� - $_ands = '1 = 1'; - if (is_array($ands)) - { - foreach ($ands as $k => $v) - { - if (null === $v) - { - continue; - } - - if (is_object($v)) - { - $v = (array)$v; - } - - // 2016-12-17��չ���ֶ�ֵ����ָ��raw���ԣ����rawΪtrue���Բ�����ʽ���ݡ� - $raw = isset($v[Self::PROPERTYNAME_RAW]) ? $v[Self::PROPERTYNAME_RAW] : false; - $type = isset($v[Self::PROPERTYNAME_TYPE]) ? $v[Self::PROPERTYNAME_TYPE] : Self::TYPENAME_RAW; - // ֵ - if (is_array($v)) - { - $v = isset($v[Self::PROPERTYNAME_VALUE]) ? $v[Self::PROPERTYNAME_VALUE] : null; - } - - if ($raw) - { - switch ($type) - { - case Self::TYPENAME_DATE: - { - if (is_numeric($v)) - { - $_ands .= sprintf(' and %s = %s', $this->GetIdentifiers($k), $this->Timestamp2DatetimeFormat($v)); - } - else - { - $_ands .= sprintf(' and %s = %s', $this->GetIdentifiers($k), $this->String2DatetimeFormat($v)); - } - break; - } - - case Self::TYPENAME_TIMESTAMP: - { - if (is_numeric($v)) - { - $_ands .= sprintf(' and %s = %s', $this->GetIdentifiers($k), $v); - } - else - { - $_ands .= sprintf(' and %s = %s', $this->GetIdentifiers($k), $this->Datetime2TimestampFormat($v)); - } - - break; - } - - case Self::TYPENAME_STRING: - { - $_ands .= sprintf(' and %s = %s', $this->GetIdentifiers($k), $this->GetIdentifiers($v, true)); - break; - } - - default: - { - $_ands .= sprintf(' and %s = %s', $this->GetIdentifiers($k), $v); - break; - } - } - } - else - { - switch ($type) - { - case Self::TYPENAME_DATE: - { - if (is_numeric($v)) - { - $_ands .= sprintf(' and %s = %s', $this->GetIdentifiers($k), $this->Timestamp2DatetimeFormat('?')); - } - else - { - $_ands .= sprintf(' and %s = %s', $this->GetIdentifiers($k), $this->String2DatetimeFormat('?', false)); - } - break; - } - - case Self::TYPENAME_TIMESTAMP: - { - if (is_numeric($v)) - { - $_ands .= sprintf(' and %s = ?', $this->GetIdentifiers($k)); - } - else - { - $_ands .= sprintf(' and %s = %s', $this->GetIdentifiers($k), $this->Datetime2TimestampFormat('?', false)); - } - - break; - } - - default: - { - $_ands .= sprintf(' and %s = ?', $this->GetIdentifiers($k)); - break; - } - } - - array_push($result[Self::CONDITION_VALUE], $v); - } - } - } - else - { - $_ands = empty($ands) ? '' : $ands; - } - - // or ���� - $_ors = ''; - if (is_array($ors)) - { - $_ors = '1 = 0'; - foreach ($ors as $k => $v) - { - if (null === $v) - { - continue; - } - - if (is_object($v)) - { - $v = (array)$v; - } - - // 2016-12-17��չ���ֶ�ֵ����ָ��raw���ԣ����rawΪtrue���Բ�����ʽ���ݡ� - $raw = isset($v[Self::PROPERTYNAME_RAW]) ? $v[Self::PROPERTYNAME_RAW] : false; - $type = isset($v[Self::PROPERTYNAME_TYPE]) ? $v[Self::PROPERTYNAME_TYPE] : Self::TYPENAME_RAW; - // ֵ - if (is_array($v)) - { - $v = isset($v[Self::PROPERTYNAME_VALUE]) ? $v[Self::PROPERTYNAME_VALUE] : null; - } - - if ($raw) - { - switch ($type) - { - case Self::TYPENAME_DATE: - { - if (is_numeric($v)) - { - $_ors .= sprintf(' or %s = %s', $this->GetIdentifiers($k), $this->Timestamp2DatetimeFormat($v)); - } - else - { - $_ors .= sprintf(' or %s = %s', $this->GetIdentifiers($k), $this->String2DatetimeFormat($v)); - } - break; - } - - case Self::TYPENAME_TIMESTAMP: - { - if (is_numeric($v)) - { - $_ors .= sprintf(' or %s = %s', $this->GetIdentifiers($k), $v); - } - else - { - $_ors .= sprintf(' or %s = %s', $this->GetIdentifiers($k), $this->Datetime2TimestampFormat($v)); - } - - break; - } - - case Self::TYPENAME_STRING: - { - $_ors .= sprintf(' or %s = %s', $this->GetIdentifiers($k), $this->GetIdentifiers($v, true)); - break; - } - - default: - { - $_ors .= sprintf(' or %s = %s', $this->GetIdentifiers($k), $v); - break; - } - } - } - else - { - switch ($type) - { - case Self::TYPENAME_DATE: - { - if (is_numeric($v)) - { - $_ors .= sprintf(' or %s = %s', $this->GetIdentifiers($k), $this->Timestamp2DatetimeFormat('?')); - } - else - { - $_ors .= sprintf(' or %s = %s', $this->GetIdentifiers($k), $this->String2DatetimeFormat('?', false)); - } - break; - } - - case Self::TYPENAME_TIMESTAMP: - { - if (is_numeric($v)) - { - $_ors .= sprintf(' or %s = ?', $this->GetIdentifiers($k)); - } - else - { - $_ors .= sprintf(' or %s = %s', $this->GetIdentifiers($k), $this->Datetime2TimestampFormat('?', false)); - } - - break; - } - - default: - { - $_ors .= sprintf(' or %s = ?', $this->GetIdentifiers($k)); - break; - } - } - - array_push($result[Self::CONDITION_VALUE], $v); - } - } - } - else - { - $_ors = empty($ors) ? '' : $ors; - } - - if (empty($_ands) && empty($_ors)) - { - $result[Self::CONDITION_NAMES] = ''; - } - elseif (empty($_ands)) - { - $result[Self::CONDITION_NAMES] = $_ors; - } - elseif (empty($_ors)) - { - $result[Self::CONDITION_NAMES] = $_ands; - } - else - { - $result[Self::CONDITION_NAMES] = '(' . $_ands . ') and (' . $_ors . ')'; - } - } - - return $result; - } - - - /** - * @note ��ȡsql����������Ϣ - * @param array|mixed $orders ���ֶ���=�ֶ�ֵ�� - * @return string - */ - private function GetOrders($orders = null) - { - if (empty($orders)) - { - return ''; - } - - if (is_object($orders)) - $orders = (array)$orders; - - if (is_array($orders)) - { - $os = ''; - foreach ($orders as $k => $v) - { - $os .= sprintf(' %s %s,', $this->GetIdentifiers($k, false, '.'), empty($v) ? 'asc' : $v); - } - - $os = mb_substr($os, 0, mb_strlen($os, USEDCHARSET) - 1, USEDCHARSET); - } - else - { - $os = $orders; - } - - return $os; - } - - - /** - * 2017-03-31 ���� - * @note ��ȡsql���ķ�����Ϣ - * @param array|mixed $groups ���ֶ���=�ֶ�ֵ�� - * @return string - */ - private function GetGroups($groups = null) - { - if (empty($groups)) - { - return ''; - } - - if (is_object($groups)) - $groups = (array)$groups; - - if (is_array($groups)) - { - $gs = ''; - foreach ($groups as $k => $v) - { - $gs .= sprintf(' %s,', $this->GetIdentifiers($v, false, '.')); - } - - $gs = mb_substr($gs, 0, mb_strlen($gs, USEDCHARSET) - 1, USEDCHARSET); - } - else - { - $gs = $groups; - } - - return $gs; - } - - - /** - * @note ��ȡsql��ѯ���ı���Ϣ��2017-03-03�������÷������ڴ������������ - * @param array|mixed $tables - * @return string - */ - private function GetSelectTables($tables = null) - { - if (is_object($tables)) - { - $tables = (array)$tables; - } - - if (is_array($tables)) - { - $return = ''; - - foreach($tables as $k => $v) - { - // ���� - if (!empty($k) && !is_numeric($k)) - { - $return .= ',' . $this->GetIdentifiers($v, false, '.') . ' ' . $this->GetIdentifiers($k); - } - else - { - $return .= ',' . $this->GetIdentifiers($v, false, '.'); - } - } - - $sublen = mb_strlen(',', USEDCHARSET); - $return = mb_substr($return, $sublen, mb_strlen($return, USEDCHARSET) - $sublen, USEDCHARSET); - - return $return; - } - else - { - return $this->GetIdentifiers($tables, false, ','); - } - } - - - /** - * @note ��ȡsql��ѯ�����ֶ���Ϣ - * @param array|mixed $fields������=>ԭ�ֶ�/���ʽ�� - * @return array - */ - private function GetSelectFields($fields = null) - { - $fs = array( - Self::FIELDNAME_FIELD => '', - Self::FIELDNAME_ALIAS => '', - ); - - if (is_object($fields)) - { - $fields = (array)$fields; - } - - if (is_array($fields)) - { - foreach($fields as $k => $v) - { - if (is_object($v) || is_array($v)) - { - $arr = $this->GetSelectFields($v); - $fs[Self::FIELDNAME_FIELD] .= ', ' . $arr[Self::FIELDNAME_FIELD]; - $fs[Self::FIELDNAME_ALIAS] .= ', ' . $arr[Self::FIELDNAME_ALIAS]; - continue; - } - elseif (null === $v) - { - continue; - } - - // 2017-03-03�����Ӷ������а���.�Ĵ��� - $nv = mb_strstr($v, '.', false, USEDCHARSET); - if (!empty($nv)) // ����.�����������޶����� - { - $v = $this->GetIdentifiers($v, false, '.'); - - $sublen = mb_strlen('.', USEDCHARSET); - $nv = $this->GetIdentifiers(mb_substr($nv, $sublen, mb_strlen($nv, USEDCHARSET) - $sublen, USEDCHARSET)); - } - else - { - $v = $this->GetIdentifiers($v); - $nv = $v; - } - - // ���� - if (!empty($k) && !is_numeric($k)) - { - $k = $this->GetIdentifiers($k); - - $fs[Self::FIELDNAME_FIELD] .= ', ' . $v . ' ' . $k; - $fs[Self::FIELDNAME_ALIAS] .= ', ' . $k; - } - else - { - $fs[Self::FIELDNAME_FIELD] .= ', ' . $v; - $fs[Self::FIELDNAME_ALIAS] .= ', ' . $nv; - } - } - - $sublen = mb_strlen(', ', USEDCHARSET); - - if (!empty($fs[Self::FIELDNAME_FIELD])) - { - $fs[Self::FIELDNAME_FIELD] = mb_substr($fs[Self::FIELDNAME_FIELD], $sublen, mb_strlen($fs[Self::FIELDNAME_FIELD], USEDCHARSET) - $sublen, USEDCHARSET); - } - - if (!empty($fs[Self::FIELDNAME_ALIAS])) - { - $fs[Self::FIELDNAME_ALIAS] = mb_substr($fs[Self::FIELDNAME_ALIAS], $sublen, mb_strlen($fs[Self::FIELDNAME_ALIAS], USEDCHARSET) - $sublen, USEDCHARSET); - } - } - else - { - $fs[Self::FIELDNAME_FIELD] = $fields; - $fs[Self::FIELDNAME_ALIAS] = $fields; - } - - return $fs; - } - - - /** - * 2016-12-17��չ���ֶ�ֵ����ָ��raw���ԣ����rawΪtrue���Բ�����ʽ���ݡ� - * @note ִ��һ��������� - * @param string $tablename ���� - * @param array $fields �ֶΣ��ֶ���=�ֶ�ֵ�� - * @param bool $replace �Ƿ񸲸Dz��� - * @param array|string $refer ����Ǹ���ʱ, �ο����ֶ� - * @return bool|mixed|null - */ - protected function PDO_Insert($tablename, $fields, $replace = false, $refer = null) - { - if (null == $this->Database) - { - return false; - } - if (is_object($fields)) - { - $fields = (array)$fields; - } - - $ks = ''; - $kss = ''; - $kst = ''; - $ksv = ''; - $ps = ''; - $ss = ''; - $vs = array(); - foreach ($fields as $k => $v) - { - if (null === $v) - { - continue; - } - - if (is_object($v)) - { - $v = (array)$v; - } - - // 2016-12-17��չ���ֶ�ֵ����ָ��raw���ԣ����rawΪtrue���Բ�����ʽ���ݡ� - $raw = isset($v[Self::PROPERTYNAME_RAW]) ? $v[Self::PROPERTYNAME_RAW] : false; - $type = isset($v[Self::PROPERTYNAME_TYPE]) ? $v[Self::PROPERTYNAME_TYPE] : Self::TYPENAME_RAW; - // ֵ - if (is_array($v)) - { - $v = isset($v[Self::PROPERTYNAME_VALUE]) ? $v[Self::PROPERTYNAME_VALUE] : null; - } - - /* ��ʼƴsql�������Ҫ���ֶ��������ֶ�ֵ */ - // ԭʼ���ֶ��� - $ks .= sprintf('%s,', $this->GetIdentifiers($k)); - // ԭ����ѯ��������ֶ������ϲ�����ʱʹ�ã� - $kss .= sprintf('s.%s,', $this->GetIdentifiers($k)); - // Ŀ��������ֶ������ϲ�����ʱʹ�ã� - $kst .= sprintf('t.%s,', $this->GetIdentifiers($k)); - // ��ֵ��ϵ���ϲ�����ʱʹ�� - $ksv .= sprintf('s.%s = t.%s,', $this->GetIdentifiers($k), $this->GetIdentifiers($k)); - - // 2016-12-17��չ���ֶ�ֵ����ָ��raw���ԣ����rawΪtrue���Բ�����ʽ���ݡ� - // �������ֵ - if ($raw) - { - switch ($type) - { - case Self::TYPENAME_DATE: - { - if (is_numeric($v)) - { - // �������ݵ�mask - $ps .= $this->Timestamp2DatetimeFormat($v) . ','; - // ��ѯ���ʱʹ�õ��ֶ��������ϲ�����ʱʹ�ã� - $ss .= sprintf('%s %s,', $this->Timestamp2DatetimeFormat($v), $this->GetIdentifiers($k)); - } - else - { - // �������ݵ�mask - $ps .= $this->String2DatetimeFormat($v) . ','; - // ��ѯ���ʱʹ�õ��ֶ��������ϲ�����ʱʹ�ã� - $ss .= sprintf('%s %s,', $this->String2DatetimeFormat($v), $this->GetIdentifiers($k)); - } - - break; - } - - case Self::TYPENAME_TIMESTAMP: - { - if (is_numeric($v)) - { - // �������ݵ�mask - $ps .= $v . ','; - // ��ѯ���ʱʹ�õ��ֶ��������ϲ�����ʱʹ�ã� - $ss .= sprintf('%s %s,', $v, $this->GetIdentifiers($k)); - } - else - { - // �������ݵ�mask - $ps .= $this->Datetime2TimestampFormat($v) . ','; - // ��ѯ���ʱʹ�õ��ֶ��������ϲ�����ʱʹ�ã� - $ss .= sprintf('%s %s,', $this->Datetime2TimestampFormat($v), $this->GetIdentifiers($k)); - } - - break; - } - - case Self::TYPENAME_STRING: - { - // �������ݵ�mask - $ps .= $this->GetIdentifiers($v, true) . ','; - // ��ѯ���ʱʹ�õ��ֶ��������ϲ�����ʱʹ�ã� - $ss .= sprintf('%s %s,', $this->GetIdentifiers($v, true), $this->GetIdentifiers($k)); - - break; - } - - default: - { - // �������ݵ�mask - $ps .= $v . ','; - // ��ѯ���ʱʹ�õ��ֶ��������ϲ�����ʱʹ�ã� - $ss .= sprintf('%s %s,', $v, $this->GetIdentifiers($k)); - - break; - } - } - } - else - { - switch ($type) - { - case Self::TYPENAME_DATE: - { - if (is_numeric($v)) - { - // �������ݵ�mask - $ps .= $this->Timestamp2DatetimeFormat('?') . ','; - // ��ѯ���ʱʹ�õ��ֶ��������ϲ�����ʱʹ�ã� - $ss .= sprintf('%s %s,', $this->Timestamp2DatetimeFormat('?'), $this->GetIdentifiers($k)); - } - else - { - // �������ݵ�mask - $ps .= $this->String2DatetimeFormat('?', false) . ','; - // ��ѯ���ʱʹ�õ��ֶ��������ϲ�����ʱʹ�ã� - $ss .= sprintf('%s %s,', $this->String2DatetimeFormat('?', false), $this->GetIdentifiers($k)); - } - - break; - } - - case Self::TYPENAME_TIMESTAMP: - { - if (is_numeric($v)) - { - // �������ݵ�mask - $ps .= '?,'; - // ��ѯ���ʱʹ�õ��ֶ��������ϲ�����ʱʹ�ã� - $ss .= sprintf('? %s,', $this->GetIdentifiers($k)); - } - else - { - // �������ݵ�mask - $ps .= $this->Datetime2TimestampFormat('?', false) . ','; - // ��ѯ���ʱʹ�õ��ֶ��������ϲ�����ʱʹ�ã� - $ss .= sprintf('%s %s,', $this->Datetime2TimestampFormat('?', false), $this->GetIdentifiers($k)); - } - - break; - } - - default: - { - // �������ݵ�mask - $ps .= '?,'; - // ��ѯ���ʱʹ�õ��ֶ��������ϲ�����ʱʹ�ã� - $ss .= sprintf('? %s,', $this->GetIdentifiers($k)); - - break; - } - } - - // ���ֶ�ֵ��������б��� - array_push($vs, $v); - } - } - - if (0 == count($vs)) - { - return false; - } - - // ԭʼ���ֶ��� - $ks = mb_substr($ks, 0, mb_strlen($ks, USEDCHARSET) - 1, USEDCHARSET); - // ԭ����ѯ��������ֶ������ϲ�����ʱʹ�ã� - $kss = mb_substr($kss, 0, mb_strlen($kss, USEDCHARSET) - 1, USEDCHARSET); - // Ŀ��������ֶ������ϲ�����ʱʹ�ã� - $kst = mb_substr($kst, 0, mb_strlen($kst, USEDCHARSET) - 1, USEDCHARSET); - // ��ֵ��ϵ���ϲ�����ʱʹ�� - $ksv = mb_substr($ksv, 0, mb_strlen($ksv, USEDCHARSET) - 1, USEDCHARSET); - // �������ݵ�mask - $ps = mb_substr($ps, 0, mb_strlen($ps, USEDCHARSET) - 1, USEDCHARSET); - // ��ѯ���ʱʹ�õ��ֶ��������ϲ�����ʱʹ�ã� - $ss = mb_substr($ss, 0, mb_strlen($ss, USEDCHARSET) - 1, USEDCHARSET); - - $command = ''; - $repcmd = ''; - $inscmd = ''; - $rs = ''; - switch (DATABASE_TYPE) - { - case 'MYSQL': - $repcmd = sprintf('replace into %s(%s) values (%s)', $this->GetIdentifiers($tablename), $ks, $ps); - $inscmd = sprintf('insert into %s(%s) values (%s)', $this->GetIdentifiers($tablename), $ks, $ps); - break; - - case 'ORACLE': - if (is_array($refer) && count($refer)) - { - foreach ($refer as $k => $v) - { - $rs .= sprintf(' s.%s = t.%s and', $this->GetIdentifiers($v), $this->GetIdentifiers($v)); - } - - $rs = mb_substr($rs, 0, mb_strlen($rs, USEDCHARSET) - 3, USEDCHARSET); - } - else - { - $rs = $refer; - } - - if (mb_strlen($rs, USEDCHARSET)) - { - $command = - 'merge into %s t' . PHP_EOL . - 'using (select %s from dual) s' . PHP_EOL . - 'on %s' . PHP_EOL . - 'when matched then' . PHP_EOL . - ' update set %s' . PHP_EOL . - 'when not matched then' . PHP_EOL . - ' insert' . PHP_EOL . - ' (%s)' . PHP_EOL . - ' values' . PHP_EOL . - ' (%s)'; - - $repcmd = sprintf($command, - $this->GetIdentifiers($tablename), - $ss, - $rs, - $ksv, - $kst, - $kss); - } - else - { - $repcmd = ''; - } - - $inscmd = sprintf('insert into %s(%s) values (%s)', $this->GetIdentifiers($tablename), $ks, $ps); - break; - - case 'SQLSRV': - if (is_array($refer) && count($refer)) - { - foreach ($refer as $k => $v) - { - $rs .= sprintf(' s.%s = t.%s and', $this->GetIdentifiers($v), $this->GetIdentifiers($v)); - } - - $rs = mb_substr($rs, 0, mb_strlen($rs, USEDCHARSET) - 3, USEDCHARSET); - } - else - { - $rs = $refer; - } - - if (mb_strlen($rs, USEDCHARSET)) - { - $command = - 'merge into %s t' . PHP_EOL . - 'using (select %s) s' . PHP_EOL . - 'on %s' . PHP_EOL . - 'when matched then' . PHP_EOL . - ' update set %s' . PHP_EOL . - 'when not matched then' . PHP_EOL . - ' insert' . PHP_EOL . - ' (%s)' . PHP_EOL . - ' values' . PHP_EOL . - ' (%s)'; - - $repcmd = sprintf($command, - $this->GetIdentifiers($tablename), - $ss, - $rs, - $ksv, - $kst, - $kss); - } - else - { - $repcmd = ''; - } - - $inscmd = sprintf('insert into %s(%s) values (%s)', $this->GetIdentifiers($tablename), $ks, $ps); - break; - - default: - $this->ErrorCode = ERRORCODE_BADPARAMETER; - $this->ErrorInfo = sprintf(ERRORINFO_BADPARAMETER, 'dbtype', DATABASE_TYPE); - return false; - break; - } - - $command = $replace ? $repcmd : $inscmd; - $return = $this->PDO_Execute($command, $vs); - $this->ErrorCode = $this->Database->GetErrorCode(); - $this->ErrorInfo = $this->Database->GetErrorInfo(); - return $return; - } - - /** - * 2016-12-17��չ���ֶ�ֵ����ָ��raw���ԣ����rawΪtrue���Բ�����ʽ���ݡ� - * @note ִ��һ���޸Ĺ��� - * @param string $tablename ���� - * @param string $fields �ֶΣ��ֶ���=�ֶ�ֵ�� - * @param array $ands ������and�����ֶ���=�ֶ�ֵ�� - * @param array $ors ������or�����ֶ���=�ֶ�ֵ�� - * @return bool|mixed|null - */ - protected function PDO_Update($tablename, $fields, $ands = null, $ors = null) - { - if (null == $this->Database) - { - return false; - } - if (is_object($fields)) - { - $fields = (array)$fields; - } - - $vs = array(); - - if (is_array($fields)) - { - $fs = ''; - foreach ($fields as $k => $v) - { - if (null === $v) - { - continue; - } - - if (is_object($v)) - { - $v = (array)$v; - } - - // 2016-12-17��չ���ֶ�ֵ����ָ��raw���ԣ����rawΪtrue���Բ�����ʽ���ݡ� - $raw = isset($v[Self::PROPERTYNAME_RAW]) ? $v[Self::PROPERTYNAME_RAW] : false; - $type = isset($v[Self::PROPERTYNAME_TYPE]) ? $v[Self::PROPERTYNAME_TYPE] : Self::TYPENAME_RAW; - // ֵ - if (is_array($v)) - { - $v = isset($v[Self::PROPERTYNAME_VALUE]) ? $v[Self::PROPERTYNAME_VALUE] : null; - } - - if ($raw) - { - switch ($type) - { - case Self::TYPENAME_DATE: - { - if (is_numeric($v)) - { - $fs .= sprintf('%s = %s,', $this->GetIdentifiers($k, false, '.'), $this->Timestamp2DatetimeFormat($v)); - } - else - { - $fs .= sprintf('%s = %s,', $this->GetIdentifiers($k, false, '.'), $this->String2DatetimeFormat($v)); - } - break; - } - - case Self::TYPENAME_TIMESTAMP: - { - if (is_numeric($v)) - { - $fs .= sprintf('%s = %s,', $this->GetIdentifiers($k, false, '.'), $v); - } - else - { - $fs .= sprintf('%s = %s,', $this->GetIdentifiers($k, false, '.'), $this->Datetime2TimestampFormat($v)); - } - - break; - } - - case Self::TYPENAME_STRING: - { - $fs .= sprintf('%s = %s,', $this->GetIdentifiers($k, false, '.'), $this->GetIdentifiers($v, true)); - break; - } - - default: - { - $fs .= sprintf('%s = %s,', $this->GetIdentifiers($k, false, '.'), $v); - break; - } - } - } - else - { - switch ($type) - { - case Self::TYPENAME_DATE: - { - if (is_numeric($v)) - { - $fs .= sprintf('%s = %s,', $this->GetIdentifiers($k, false, '.'), $this->Timestamp2DatetimeFormat('?')); - } - else - { - $fs .= sprintf('%s = %s,', $this->GetIdentifiers($k, false, '.'), $this->String2DatetimeFormat('?', false)); - } - break; - } - - case Self::TYPENAME_TIMESTAMP: - { - if (is_numeric($v)) - { - $fs .= sprintf('%s = ?,', $this->GetIdentifiers($k, false, '.')); - } - else - { - $fs .= sprintf('%s = %s,', $this->GetIdentifiers($k, false, '.'), $this->Datetime2TimestampFormat('?', false)); - } - - break; - } - - default: - { - $fs .= sprintf('%s = ?,', $this->GetIdentifiers($k, false, '.')); - break; - } - } - - array_push($vs, $v); - } - } - - if (empty($fs)) - { - return false; - } - $fs = mb_substr($fs, 0, mb_strlen($fs, USEDCHARSET) - 1, USEDCHARSET); - } - else - { - $fs = $fields; - } - - $ws = $this->GetWheres($ands, $ors); - if (empty($ws[Self::CONDITION_NAMES])) - { - $command = sprintf('update %s set %s', $this->GetIdentifiers($tablename, false, ','), $fs); - $return = $this->PDO_Execute($command, $vs); - } - else - { - $command = sprintf('update %s set %s where %s', $this->GetIdentifiers($tablename, false, ','), $fs, $ws[Self::CONDITION_NAMES]); - $return = $this->PDO_Execute($command, $vs, $ws[Self::CONDITION_VALUE]); - } - - $this->ErrorCode = $this->Database->GetErrorCode(); - $this->ErrorInfo = $this->Database->GetErrorInfo(); - return $return; - } - - /** - * @note ִ��һ��ɾ������ - * @param string $tablename ���� - * @param array $ands ������and�����ֶ���=�ֶ�ֵ�� - * @param array $ors ������or�����ֶ���=�ֶ�ֵ�� - * @return bool|mixed|null - */ - protected function PDO_Delete($tablename, $ands = null, $ors = null) - { - if (null == $this->Database) - { - return false; - } - - $ws = $this->GetWheres($ands, $ors); - if (empty($ws[Self::CONDITION_NAMES])) - { - $command = sprintf('delete from %s', $this->GetIdentifiers($tablename)); - $return = $this->PDO_Execute($command); - } - else - { - $command = sprintf('delete from %s where %s', $this->GetIdentifiers($tablename), $ws[Self::CONDITION_NAMES]); - $return = $this->PDO_Execute($command, $ws[Self::CONDITION_VALUE]); - } - - $this->ErrorCode = $this->Database->GetErrorCode(); - $this->ErrorInfo = $this->Database->GetErrorInfo(); - return $return; - } - - - /** - * 2017-03-31 ���ӷ���֧�� - * @note ִ��һ����ѯ���� - * @param string|array $tables ������2017-03-03��������֧�֣� - * @param string|array $fields Ҫ��ѯ���ֶΣ�2016-12-08�����������֧�֣���ʽΪ������=>ԭ�ֶ�/���ʽ�� - * @param array $ands ������and�����ֶ���=�ֶ�ֵ�� - * @param array $ors ������or�����ֶ���=�ֶ�ֵ�� - * @param array $orders �����ֶΣ��ֶ���=����˳�� - * @param array $groups �����ֶΣ��ֶ����������� - * @return bool|mixed|null - */ - protected function PDO_Select($tables, $fields, $ands = null, $ors = null, $orders = null, $groups = null) - { - if (null == $this->Database) - { - return false; - } - - $tables = $this->GetSelectTables($tables); - $fields = $this->GetSelectFields($fields)[Self::FIELDNAME_FIELD]; - if (empty($tables) || empty($fields)) - { - return false; - } - - $gs = $this->GetGroups($groups); - if (!empty($gs)) - { - $gs = ' group by ' . $gs; - } - - $os = $this->GetOrders($orders); - if (!empty($os)) - { - $os = ' order by ' . $os; - } - - $ws = $this->GetWheres($ands, $ors); - if (empty($ws[Self::CONDITION_NAMES])) - { - $command = sprintf('select %s from %s%s%s', $fields, $tables, $gs, $os); - $return = $this->PDO_Request($command); - } - else - { - $command = sprintf('select %s from %s where %s%s%s', $fields, $tables, $ws[Self::CONDITION_NAMES], $gs, $os); - $return = $this->PDO_Request($command, $ws[Self::CONDITION_VALUE]); - } - - //var_dump($command); - $this->ErrorCode = $this->Database->GetErrorCode(); - $this->ErrorInfo = $this->Database->GetErrorInfo(); - return $return; - } - - - /** - * 2016-08-16���ӡ�2017-03-31���ӷ���֧�� - * @note ִ��һ����ѯ���̣���ҳ�� - * @param string|array $tables ������2017-03-03��������֧�֣� - * @param string|array $fields Ҫ��ѯ���ֶΣ�2016-12-08�����������֧�֣���ʽΪ������=>ԭ�ֶ�/���ʽ�� - * @param array $ands ������and�����ֶ���=�ֶ�ֵ�� - * @param array $ors ������or�����ֶ���=�ֶ�ֵ�� - * @param array $orders �����ֶΣ��ֶ���=����˳�� - * @param array $groups �����ֶΣ��ֶ����������� - * @param int $pageindex ҳ��ţ�1Ϊ��һ����ţ� - * @param int $pagesize һҳ��С - * @return bool|mixed|null - * @note Ӧ�� - */ - protected function PDO_Select_Page($tables, $fields, $ands = null, $ors = null, $orders = null, $groups = null, $pageindex = 1, $pagesize = 20) - { - if (null == $this->Database) - { - return false; - } - - // �ɴ������ - if (is_numeric($groups)) - { - $pagesize = $pageindex; - $pageindex = $groups; - $groups = null; - } - - // ��ʼ��� - $start = ($pageindex - 1) * $pagesize + 1; - // ��ֹ��� - $stop = $pageindex * $pagesize; - - // ��ҳ�õ��ֶ��� - $newfieldname = $this->GetIdentifiers($this->GetRandString('nf_')); - // ��ҳ�õı��� - $newtablename = $this->GetIdentifiers($this->GetRandString('nt_')); - - // Ҫ��ѯ�ı� - $tables = $this->GetSelectTables($tables); - // Ҫ��ѯ���ֶ� - $fields = $this->GetSelectFields($fields); - - if (empty($tables) || empty($fields[Self::FIELDNAME_FIELD]) || empty($fields[Self::FIELDNAME_ALIAS])) - { - return false; - } - - $gs = $this->GetGroups($groups); - if (!empty($gs)) - { - $gs = ' group by ' . $gs; - } - - $os = $this->GetOrders($orders); - if (!empty($os)) - { - $os = ' order by ' . $os; - } - - $ws = $this->GetWheres($ands, $ors); - switch (DATABASE_TYPE) - { - case 'MYSQL': - if (empty($ws[Self::CONDITION_NAMES])) - { - $command = - 'select' . PHP_EOL . - ' %s' . PHP_EOL . - 'from' . PHP_EOL . - ' (' . PHP_EOL . - ' select' . PHP_EOL . - ' %s,' . PHP_EOL . - ' @i := @i + 1 %s' . PHP_EOL . - ' from' . PHP_EOL . - ' %s,' . PHP_EOL . - ' (select @i := 0) %s' . PHP_EOL . - ' %s' . PHP_EOL . - ' $s' . PHP_EOL . - ' limit %d' . PHP_EOL . - ' ) %s' . PHP_EOL . - 'where' . PHP_EOL . - ' %s >= %d'; - $command = sprintf($command, - $fields[Self::FIELDNAME_ALIAS], - $fields[Self::FIELDNAME_FIELD], - $newfieldname, - $tables, - $newtablename, - $gs, - $os, - $stop, - $newtablename, - $newfieldname, - $start - ); - //var_dump($command); - $return = $this->PDO_Request($command); - } - else - { - $command = - 'select' . PHP_EOL . - ' %s' . PHP_EOL . - 'from' . PHP_EOL . - ' (' . PHP_EOL . - ' select' . PHP_EOL . - ' %s,' . PHP_EOL . - ' @i := @i + 1 %s' . PHP_EOL . - ' from' . PHP_EOL . - ' %s,' . PHP_EOL . - ' (select @i := 0) %s' . PHP_EOL . - ' where' . PHP_EOL . - ' %s' . PHP_EOL . - ' %s' . PHP_EOL . - ' %s' . PHP_EOL . - ' limit %d' . PHP_EOL . - ' ) %s' . PHP_EOL . - 'where' . PHP_EOL . - ' %s >= %d'; - $command = sprintf($command, - $fields[Self::FIELDNAME_ALIAS], - $fields[Self::FIELDNAME_FIELD], - $newfieldname, - $tables, - $newtablename, - $ws[Self::CONDITION_NAMES], - $gs, - $os, - $stop, - $newtablename, - $newfieldname, - $start - ); - //var_dump($command); - $return = $this->PDO_Request($command, $ws[Self::CONDITION_VALUE]); - } - break; - - case 'ORACLE': - if (empty($ws[Self::CONDITION_NAMES])) - { - $command = - 'select' . PHP_EOL . - ' %s' . PHP_EOL . - 'from' . PHP_EOL . - ' (' . PHP_EOL . - ' select' . PHP_EOL . - ' %s,' . PHP_EOL . - ' row_number() over(%s) %s' . PHP_EOL . - ' from' . PHP_EOL . - ' %s' . PHP_EOL . - //' where' . PHP_EOL . - //' rownum <= %d' . PHP_EOL . - ' %s' . PHP_EOL . - ' ) %s' . PHP_EOL . - 'where' . PHP_EOL . - ' %s between %d and %d'; - $command = sprintf($command, - $fields[Self::FIELDNAME_ALIAS], - $fields[Self::FIELDNAME_FIELD], - $os, - $newfieldname, - $tables, - //$stop, - $gs, - $newtablename, - $newfieldname, - $start, - $stop - ); - //var_dump($command); - $return = $this->PDO_Request($command); - } - else - { - $command = - 'select' . PHP_EOL . - ' %s' . PHP_EOL . - 'from' . PHP_EOL . - ' (' . PHP_EOL . - ' select' . PHP_EOL . - ' %s,' . PHP_EOL . - ' row_number() over(%s) %s' . PHP_EOL . - ' from' . PHP_EOL . - ' %s' . PHP_EOL . - ' where' . PHP_EOL . - //' rownum <= %d and' . PHP_EOL . - ' %s' . PHP_EOL . - ' %s' . PHP_EOL . - ' ) %s' . PHP_EOL . - 'where' . PHP_EOL . - ' %s between %d and %d'; - $command = sprintf($command, - $fields[Self::FIELDNAME_ALIAS], - $fields[Self::FIELDNAME_FIELD], - $os, - $newfieldname, - $tables, - //$stop, - $ws[Self::CONDITION_NAMES], - $gs, - $newtablename, - $newfieldname, - $start, - $stop - ); - //var_dump($command); - $return = $this->PDO_Request($command, $ws[Self::CONDITION_VALUE]); - } - break; - - case 'SQLSRV': - if (empty($ws[Self::CONDITION_NAMES])) - { - $command = - 'select' . PHP_EOL . - ' %s' . PHP_EOL . - 'from' . PHP_EOL . - ' (' . PHP_EOL . - ' select' . PHP_EOL . - //' top %d' . PHP_EOL . - ' %s,' . PHP_EOL . - ' row_number() over(%s) %s' . PHP_EOL . - ' from' . PHP_EOL . - ' %s' . PHP_EOL . - ' %s' . PHP_EOL . - ' ) %s' . PHP_EOL . - 'where' . PHP_EOL . - ' %s between %d and %d'; - $command = sprintf($command, - $fields[Self::FIELDNAME_ALIAS], - //$stop, - $fields[Self::FIELDNAME_FIELD], - $os, - $newfieldname, - $tables, - $gs, - $newtablename, - $newfieldname, - $start, - $stop - ); - //var_dump($command); - $return = $this->PDO_Request($command); - } - else - { - $command = - 'select' . PHP_EOL . - ' %s' . PHP_EOL . - 'from' . PHP_EOL . - ' (' . PHP_EOL . - ' select' . PHP_EOL . - //' top %d' . PHP_EOL . - ' %s,' . PHP_EOL . - ' row_number() over(%s) %s' . PHP_EOL . - ' from' . PHP_EOL . - ' %s' . PHP_EOL . - ' where' . PHP_EOL . - ' %s' . PHP_EOL . - ' %s' . PHP_EOL . - ' ) %s' . PHP_EOL . - 'where' . PHP_EOL . - ' %s between %d and %d'; - $command = sprintf($command, - $fields[Self::FIELDNAME_ALIAS], - //$stop, - $fields[Self::FIELDNAME_FIELD], - $os, - $newfieldname, - $tables, - $ws[Self::CONDITION_NAMES], - $gs, - $newtablename, - $newfieldname, - $start, - $stop - ); - //var_dump($command); - $return = $this->PDO_Request($command, $ws[Self::CONDITION_VALUE]); - } - break; - - default: - $this->ErrorCode = ERRORCODE_BADPARAMETER; - $this->ErrorInfo = sprintf(ERRORINFO_BADPARAMETER, 'dbtype', DATABASE_TYPE); - return false; - break; - } - - $this->ErrorCode = $this->Database->GetErrorCode(); - $this->ErrorInfo = $this->Database->GetErrorInfo(); - return $return; - } - - /** - * 2017-02-17���ӡ�2017-03-31���ӷ���֧�� - * @note ��������IJ������ɶ�Ӧ��sql��䡣 - * @param string $request �Ӳ�ѯ�� - * @param string|array $tablename ����������֧�ֱ����� - * @param bool $ispage �Ƿ���Ҫ��ҳ�� - * @param string $fields Ҫ��ѯ���ֶΣ�����=>ԭ�ֶ�/���ʽ�� - * @param array $ands ������and�����ֶ���=�ֶ�ֵ�� - * @param array $ors ������or�����ֶ���=�ֶ�ֵ�� - * @param array $orders �����ֶΣ��ֶ���=����˳�� - * @param array $groups �����ֶΣ��ֶ����������� - * @param int $pageindex ҳ��ţ�1Ϊ��һ����ţ� - * @param int $pagesize һҳ��С - * @return bool|mixed|null - * @note Ӧ�� - */ - private function GetSelectPageCommand($request, $tablename, $ispage, $fields, $ands = null, $ors = null, $orders = null, $groups = null, $pageindex = 1, $pagesize = 20) - { - $return = array( - Self::COMMAND_LINE => '', - Self::COMMAND_VARS => array(), - ); - - // ��ҳ�õ��ֶ��� - $newfieldname = $this->GetIdentifiers($this->GetRandString('nf_')); - // ��ҳ�õı��� - $newtablename = $this->GetIdentifiers($this->GetRandString('nt_')); - // �Ӳ�ѯ���� - $newrequest = $this->GetIdentifiers($this->GetRandString('nr_')); - - // ���� - $tablename = $this->GetSelectTables($tablename); - // �ֶ��� - $fields = $this->GetSelectFields($fields); - if (empty($tablename) || empty($fields[Self::FIELDNAME_FIELD]) || empty($fields[Self::FIELDNAME_ALIAS])) - { - return $return; - } - - $gs = $this->GetGroups($groups); - if (!empty($gs)) - { - $gs = ' group by ' . $gs; - } - - $os = $this->GetOrders($orders); - if (!empty($os)) - { - $os = ' order by ' . $os; - } - - if ($ispage) - { - // ��ʼ��� - $start = ($pageindex - 1) * $pagesize + 1; - // ��ֹ��� - $stop = $pageindex * $pagesize; - - $ws = $this->GetWheres($ands, $ors); - switch (DATABASE_TYPE) - { - case 'MYSQL': - if (empty($ws[Self::CONDITION_NAMES])) - { - $command = - 'select' . PHP_EOL . - ' %s' . PHP_EOL . - 'from' . PHP_EOL . - ' (' . PHP_EOL . - ' select' . PHP_EOL . - ' %s,' . PHP_EOL . - ' @i := @i + 1 %s' . PHP_EOL . - ' from' . PHP_EOL . - '%s' . - ' %s,' . PHP_EOL . - ' (select @i := 0) %s' . PHP_EOL . - ' %s' . PHP_EOL . - ' %s' . PHP_EOL . - ' limit %d' . PHP_EOL . - ' ) %s' . PHP_EOL . - 'where' . PHP_EOL . - ' %s >= %d'; - $command = sprintf($command, - $fields[Self::FIELDNAME_ALIAS], - $fields[Self::FIELDNAME_FIELD], - $newfieldname, - empty($request) ? '' : ' (' . $request . ') ' . $newrequest . ',' . PHP_EOL, - $tablename, - $newtablename, - $gs, - $os, - $stop, - $newtablename, - $newfieldname, - $start - ); - - $return[Self::COMMAND_LINE] = $command; - $return[Self::COMMAND_VARS] = array(); - } - else - { - $command = - 'select' . PHP_EOL . - ' %s' . PHP_EOL . - 'from' . PHP_EOL . - ' (' . PHP_EOL . - ' select' . PHP_EOL . - ' %s,' . PHP_EOL . - ' @i := @i + 1 %s' . PHP_EOL . - ' from' . PHP_EOL . - '%s' . - ' %s,' . PHP_EOL . - ' (select @i := 0) %s' . PHP_EOL . - ' where' . PHP_EOL . - ' %s' . PHP_EOL . - ' %s' . PHP_EOL . - ' %s' . PHP_EOL . - ' limit %d' . PHP_EOL . - ' ) %s' . PHP_EOL . - 'where' . PHP_EOL . - ' %s >= %d'; - $command = sprintf($command, - $fields[Self::FIELDNAME_ALIAS], - $fields[Self::FIELDNAME_FIELD], - $newfieldname, - empty($request) ? '' : ' (' . $request . ') ' . $newrequest . ',' . PHP_EOL, - $tablename, - $newtablename, - $ws[Self::CONDITION_NAMES], - $gs, - $os, - $stop, - $newtablename, - $newfieldname, - $start - ); - - $return[Self::COMMAND_LINE] = $command; - $return[Self::COMMAND_VARS] = $ws[Self::CONDITION_VALUE]; - } - break; - - case 'ORACLE': - if (empty($ws[Self::CONDITION_NAMES])) - { - $command = - 'select' . PHP_EOL . - ' %s' . PHP_EOL . - 'from' . PHP_EOL . - ' (' . PHP_EOL . - ' select' . PHP_EOL . - ' %s,' . PHP_EOL . - ' row_number() over(%s) %s' . PHP_EOL . - ' from' . PHP_EOL . - '%s' . - ' %s' . PHP_EOL . - //' where' . PHP_EOL . - //' rownum <= %d' . PHP_EOL . - ' %s' . PHP_EOL . - ' ) %s' . PHP_EOL . - 'where' . PHP_EOL . - ' %s between %d and %d'; - $command = sprintf($command, - $fields[Self::FIELDNAME_ALIAS], - $fields[Self::FIELDNAME_FIELD], - $os, - $newfieldname, - empty($request) ? '' : ' (' . $request . ') ' . $newrequest . ',' . PHP_EOL, - $tablename, - //$stop, - $gs, - $newtablename, - $newfieldname, - $start, - $stop - ); - - $return[Self::COMMAND_LINE] = $command; - $return[Self::COMMAND_VARS] = array(); - } - else - { - $command = - 'select' . PHP_EOL . - ' %s' . PHP_EOL . - 'from' . PHP_EOL . - ' (' . PHP_EOL . - ' select' . PHP_EOL . - ' %s,' . PHP_EOL . - ' row_number() over(%s) %s' . PHP_EOL . - ' from' . PHP_EOL . - '%s' . - ' %s' . PHP_EOL . - ' where' . PHP_EOL . - //' rownum <= %d and' . PHP_EOL . - ' %s' . PHP_EOL . - ' %s' . PHP_EOL . - ' ) %s' . PHP_EOL . - 'where' . PHP_EOL . - ' %s between %d and %d'; - $command = sprintf($command, - $fields[Self::FIELDNAME_ALIAS], - $fields[Self::FIELDNAME_FIELD], - $os, - $newfieldname, - empty($request) ? '' : ' (' . $request . ') ' . $newrequest . ',' . PHP_EOL, - $tablename, - //$stop, - $ws[Self::CONDITION_NAMES], - $gs, - $newtablename, - $newfieldname, - $start, - $stop - ); - - $return[Self::COMMAND_LINE] = $command; - $return[Self::COMMAND_VARS] = $ws[Self::CONDITION_VALUE]; - } - break; - - case 'SQLSRV': - if (empty($ws[Self::CONDITION_NAMES])) - { - $command = - 'select' . PHP_EOL . - ' %s' . PHP_EOL . - 'from' . PHP_EOL . - ' (' . PHP_EOL . - ' select' . PHP_EOL . - //' top %d' . PHP_EOL . - ' %s,' . PHP_EOL . - ' row_number() over(%s) %s' . PHP_EOL . - ' from' . PHP_EOL . - '%s' . - ' %s' . PHP_EOL . - ' %s' . PHP_EOL . - ' ) %s' . PHP_EOL . - 'where' . PHP_EOL . - ' %s between %d and %d'; - $command = sprintf($command, - $fields[Self::FIELDNAME_ALIAS], - //$stop, - $fields[Self::FIELDNAME_FIELD], - $os, - $newfieldname, - empty($request) ? '' : ' (' . $request . ') ' . $newrequest . ',' . PHP_EOL, - $tablename, - $gs, - $newtablename, - $newfieldname, - $start, - $stop - ); - - $return[Self::COMMAND_LINE] = $command; - $return[Self::COMMAND_VARS] = array(); - } - else - { - $command = - 'select' . PHP_EOL . - ' %s' . PHP_EOL . - 'from' . PHP_EOL . - ' (' . PHP_EOL . - ' select' . PHP_EOL . - //' top %d' . PHP_EOL . - ' %s,' . PHP_EOL . - ' row_number() over(%s) %s' . PHP_EOL . - ' from' . PHP_EOL . - '%s' . - ' %s' . PHP_EOL . - ' where' . PHP_EOL . - ' %s' . PHP_EOL . - ' %s' . PHP_EOL . - ' ) %s' . PHP_EOL . - 'where' . PHP_EOL . - ' %s between %d and %d'; - $command = sprintf($command, - $fields[Self::FIELDNAME_ALIAS], - //$stop, - $fields[Self::FIELDNAME_FIELD], - $os, - $newfieldname, - empty($request) ? '' : ' (' . $request . ') ' . $newrequest . ',' . PHP_EOL, - $tablename, - $ws[Self::CONDITION_NAMES], - $gs, - $newtablename, - $newfieldname, - $start, - $stop - ); - - $return[Self::COMMAND_LINE] = $command; - $return[Self::COMMAND_VARS] = $ws[Self::CONDITION_VALUE]; - } - break; - - } - - return $return; - } - else - { - $ws = $this->GetWheres($ands, $ors); - switch (DATABASE_TYPE) - { - case 'MYSQL': - if (empty($ws[Self::CONDITION_NAMES])) - { - $command = - 'select' . PHP_EOL . - ' %s' . PHP_EOL . - 'from' . PHP_EOL . - '%s' . - ' %s' . PHP_EOL . - ' %s' . PHP_EOL . - ' %s'; - $command = sprintf($command, - $fields[Self::FIELDNAME_FIELD], - empty($request) ? '' : ' (' . $request . ') ' . $newrequest . ',' . PHP_EOL, - $tablename, - $gs, - $os - ); - - $return[Self::COMMAND_LINE] = $command; - $return[Self::COMMAND_VARS] = array(); - } - else - { - $command = - 'select' . PHP_EOL . - ' %s' . PHP_EOL . - 'from' . PHP_EOL . - '%s' . - ' %s' . PHP_EOL . - 'where' . PHP_EOL . - ' %s' . PHP_EOL . - ' %s' . PHP_EOL . - ' %s'; - $command = sprintf($command, - $fields[Self::FIELDNAME_FIELD], - empty($request) ? '' : ' (' . $request . ') ' . $newrequest . ',' . PHP_EOL, - $tablename, - $ws[Self::CONDITION_NAMES], - $gs, - $os - ); - - $return[Self::COMMAND_LINE] = $command; - $return[Self::COMMAND_VARS] = $ws[Self::CONDITION_VALUE]; - } - break; - - case 'ORACLE': - if (empty($ws[Self::CONDITION_NAMES])) - { - $command = - 'select' . PHP_EOL . - ' %s' . PHP_EOL . - 'from' . PHP_EOL . - '%s' . - ' %s' . PHP_EOL . - ' %s' . PHP_EOL . - ' %s'; - $command = sprintf($command, - $fields[Self::FIELDNAME_FIELD], - empty($request) ? '' : ' (' . $request . ') ' . $newrequest . ',' . PHP_EOL, - $tablename, - $gs, - $os - ); - - $return[Self::COMMAND_LINE] = $command; - $return[Self::COMMAND_VARS] = array(); - } - else - { - $command = - 'select' . PHP_EOL . - ' %s' . PHP_EOL . - 'from' . PHP_EOL . - '%s' . - ' %s' . PHP_EOL . - 'where' . PHP_EOL . - ' %s' . PHP_EOL . - ' %s' . PHP_EOL . - ' %s'; - $command = sprintf($command, - $fields[Self::FIELDNAME_FIELD], - empty($request) ? '' : ' (' . $request . ') ' . $newrequest . ',' . PHP_EOL, - $tablename, - $ws[Self::CONDITION_NAMES], - $gs, - $os - ); - - $return[Self::COMMAND_LINE] = $command; - $return[Self::COMMAND_VARS] = $ws[Self::CONDITION_VALUE]; - } - break; - - case 'SQLSRV': - if (empty($ws[Self::CONDITION_NAMES])) - { - $command = - 'select' . PHP_EOL . - ' %s' . PHP_EOL . - 'from' . PHP_EOL . - '%s' . - ' %s' . PHP_EOL . - ' %s' . PHP_EOL . - ' %s'; - $command = sprintf($command, - $fields[Self::FIELDNAME_FIELD], - empty($request) ? '' : ' (' . $request . ') ' . $newrequest . ',' . PHP_EOL, - $tablename, - $gs, - $os - ); - - $return[Self::COMMAND_LINE] = $command; - $return[Self::COMMAND_VARS] = array(); - } - else - { - $command = - 'select' . PHP_EOL . - ' %s' . PHP_EOL . - 'from' . PHP_EOL . - '%s' . - ' %s' . PHP_EOL . - 'where' . PHP_EOL . - ' %s' . PHP_EOL . - ' %s' . PHP_EOL . - ' %s'; - $command = sprintf($command, - $fields[Self::FIELDNAME_FIELD], - empty($request) ? '' : ' (' . $request . ') ' . $newrequest . ',' . PHP_EOL, - $tablename, - $ws[Self::CONDITION_NAMES], - $gs, - $os - ); - - $return[Self::COMMAND_LINE] = $command; - $return[Self::COMMAND_VARS] = $ws[Self::CONDITION_VALUE]; - } - break; - - } - - return $return; - } - } - - - /** - * 2017-02-17���� - * @note ִ��һ����ѯ���̣���ҳ�� - * ���ע�������ʱ��ʹ�������ӷ�ʽ��ѯ���ݡ�oracle��sqlserver���Ҫʹ���������ӣ���Ҫ�ֶ���ǹ����ֶε����ӷ�ʽ�� - * ���� - * oracle�У� ��1.�ֶ�1 = ��2.�ֶ�2(+) �ȼ� ��1 left join ��2 on ��1.�ֶ�1 = ��2.�ֶ�2 - * sqlserver�У� ��1.�ֶ�1 *= ��2.�ֶ�2 �ȼ� ��1 left join ��2 on ��1.�ֶ�1 = ��2.�ֶ�2 - * @param array $tables �������б� - * @param string $pagetable Ҫ��ҳ�ı�����Ϊ�����ʾ���б�ͬ����ҳ�� - * @param string $fields Ҫ��ѯ���ֶΣ�����=>ԭ�ֶ�/���ʽ�� - * @param array $ands ������and�����ֶ���=�ֶ�ֵ�� - * @param array $ors ������or�����ֶ���=�ֶ�ֵ�� - * @param array $orders �����ֶΣ��ֶ���=����˳�� - * @param array $groups �����ֶΣ��ֶ����������� - * @param int $pageindex ҳ��ţ�1Ϊ��һ����ţ� - * @param int $pagesize һҳ��С - * @return bool|mixed|null - * @note Ӧ�� - */ - protected function PDO_Select_Page_2($tables, $pagetable, $fields, $ands = null, $ors = null, $orders = null, $groups = null, $pageindex = 1, $pagesize = 20) - { - if (null == $this->Database) - { - return false; - } - - // �ɴ������ - if (is_numeric($groups)) - { - $pagesize = $pageindex; - $pageindex = $groups; - $groups = null; - } - - $fields = array_values((array)$fields); - $ands = array_values((array)$ands); - $ors = array_values((array)$ors); - - $commandline = ''; - $commandvars = array(); - $commandfield = array(); - $index = 0; - - foreach ($tables as $tablealias => $tablename) - { - $t = $commandfield; - $commandfield = array(); - foreach ($t as $k => $v) - { - array_push($commandfield, (is_numeric($k) || empty($k) ? $v : $k)); - } - - $fields[$index] = isset($fields[$index]) ? (array)$fields[$index] : array(); - if (!empty($fields[$index])) - { - foreach ($fields[$index] as $k => $v) - { - if (is_numeric($k) || empty($k)) - array_push($commandfield, $v); - else - $commandfield[$k] = $v; - } - } - - $command = $this->GetSelectPageCommand($commandline, - array($tablealias => $tablename), - strcasecmp($tablename, $pagetable) == 0, - $commandfield, - isset($ands[$index]) ? $ands[$index] : null, - isset($ors[$index]) ? $ors[$index] : null, - empty($orders) ? null : $orders[$index], - empty($groups) ? null : $groups[$index], - $pageindex, - $pagesize - ); - - $commandline = $command[Self::COMMAND_LINE]; - $commandvars += $command[Self::COMMAND_VARS]; - - $index++; - } - //OutputDebugMessage($commandline); - //var_dump($commandline); - //var_dump($commandvars); - $return = $this->PDO_Request($commandline, $commandvars); - $this->ErrorCode = $this->Database->GetErrorCode(); - $this->ErrorInfo = $this->Database->GetErrorInfo(); - return $return; - } - - - /** - * 2016-12-08���� - * @note �ַ���ת��Ϊ�����͵ı��ʽ - * @param string $st Ҫת�����ֶλ���ʽ - * @param bool $quoted �Ƿ���Ҫ�������ӣ����� - * @return string - * @note Ӧ�� - */ - protected function String2DatetimeFormat($st, $quoted = true) - { - if ($quoted) - { - $st = $this->GetIdentifiers($st, true); - } - - switch (DATABASE_TYPE) - { - case 'MYSQL': - return "(STR_TO_DATE({$st}, '%Y-%m-%d %H:%i:%s'))"; - break; - - case 'ORACLE': - return "(to_date({$st}, 'yyyy-mm-dd hh24:mi:ss'))"; - break; - - case 'SQLSRV': - return "(convert(datetime, {$st}, 120))"; - break; - - default: - return ""; - break; - } - } - - - /** - * 2016-12-08���� - * @note ����ת��Ϊ�ַ����͵ı��ʽ - * @param string $dt Ҫת�����ֶλ���ʽ - * @param bool $quoted �Ƿ���Ҫ�������ӣ����� - * @return string - * @note Ӧ�� - */ - protected function Datetime2StringFormat($dt, $quoted = true) - { - if ($quoted) - { - $dt = $this->GetIdentifiers($dt, true); - } - - switch (DATABASE_TYPE) - { - case 'MYSQL': - return "(DATE_FORMAT({$dt}, '%Y-%m-%d %H:%i:%s'))"; - break; - - case 'ORACLE': - return "(to_char({$dt}, 'yyyy-mm-dd hh24:mi:ss'))"; - break; - - case 'SQLSRV': - return "(convert(varchar, {$dt}, 120))"; - break; - - default: - return ""; - break; - } - } - - - /** - * 2016-12-08���� - * @note ʱ���ת��Ϊ�����͵ı��ʽ - * @param string $ts Ҫת�����ֶλ���ʽ - * @return string - * @note Ӧ�� - */ - protected function Timestamp2DatetimeFormat($ts) - { - switch (DATABASE_TYPE) - { - case 'MYSQL': - return "(FROM_UNIXTIME({$ts}))"; - break; - - case 'ORACLE': - return "(to_date('19700101', 'yyyymmdd') + {$ts} / 86400 + to_number(substr(tz_offset(sessiontimezone), 1, 3)) / 24)"; - break; - - case 'SQLSRV': - return "(dateadd(S, {$ts} + 8 * 3600, '1970-01-01 00:00:00'))"; - break; - - default: - return ""; - break; - } - } - - - - /** - * 2016-12-08���� - * @note ����ת��Ϊʱ����͵ı��ʽ - * @param string $ds Ҫת�����ֶλ���ʽ - * @param bool $quoted �Ƿ���Ҫ�������ӣ����� - * @return string - * @note Ӧ�� - */ - protected function Datetime2TimestampFormat($ds, $quoted = true) - { - if ($quoted) - { - $ds = $this->GetIdentifiers($ds, true); - } - - switch (DATABASE_TYPE) - { - case 'MYSQL': - return "(UNIX_TIMESTAMP({$ds}))"; - break; - - case 'ORACLE': - return "((to_date({$ds}, 'yyyy-mm-dd hh24:mi:ss') - to_date('19700101', 'yyyymmdd')) * 86400 - to_number(substr(tz_offset(sessiontimezone), 1, 3)) * 3600)"; - break; - - case 'SQLSRV': - return "(datediff(S, '1970-01-01 00:00:00', {$ds}) - 8 * 3600)"; - break; - - default: - return ""; - break; - } - } - - - /** - * 2016-12-08���� - * @note ����ת��Ϊ�ַ����͵ı��ʽ - * @param string $f Ҫת�����ֶλ���ʽ - * @return string - * @note Ӧ�� - */ - protected function Float2StringFormat($f) - { - switch (DATABASE_TYPE) - { - case 'MYSQL': - return "(cast(convert({$f}, decimal(18, 2)) as char))"; - break; - - case 'ORACLE': - return "(to_char({$f}, 'fm99999990.00'))"; - break; - - case 'SQLSRV': - return "(cast(convert(decimal(18, 2), {$f}) as char))"; - break; - - default: - return ""; - break; - } - } - - - /** - * 2016-01-16���� - * @note ��ȡ��ǰ������ϵͳʱ��(����ʽ) - * @param bool $raw �Ƿ񷵻����ݿ���ʽ - * @return string - * @note Ӧ�� - */ - public function GetSystemTime($raw = false) - { - if ($raw) { - switch (DATABASE_TYPE) { - case 'MYSQL': - return 'now()'; - break; - - case 'ORACLE': - return 'sysdate'; - break; - - case 'SQLSRV': - return 'getdate()'; - break; - - default: - return ''; - break; - } - } - else - return date('Y-m-d H:i:s'); - } - - - - /** - * @note ��ȡ����ֵ - * @param bool $always_local - * @return int - */ - public function GetErrorCode($always_local = false) - { - if ($always_local || null == $this->Database) - { - return $this->ErrorCode; - } - else - { - return $this->Database->GetErrorCode(); - } - } - - - /** - * @note ��ȡ������Ϣ - * @param bool $always_local - * @return mixed|string - */ - public function GetErrorInfo($always_local = false) - { - if ($always_local || null == $this->Database) - { - return $this->ErrorInfo; - } - else - { - return $this->Database->GetErrorInfo(); - } - } - - - /** - * @note �û���Ȩ��Ϣת�û��루�û�id�� - * @param string $user_auth_token - * @return string - */ - protected function UserAuthTokenToUserCode($user_auth_token) - { - return $user_auth_token; - } - - - /** - * @note ����һ���µ�id - * @param string $prefix - * @return string - */ - protected function CreateNewIdent($prefix = '', $md5 = false) - { - if (empty($prefix)) - { - $prefix = 'NEW'; - } - - if ($md5) - { - return $prefix . md5(date('YmdHis') . rand(1000, 9999)); - } - else - { - return $prefix . date('YmdHis') . rand(1000, 9999); - } - } - - - /** - * @note �ж�ָ��������, ������û�з��������ļ�¼ - * @param string $tablename - * @param string|array $wheres - * @return bool - * @auther Ӧ�� - */ - // DataExists('ims_bigmarket_market', array('app_id' => 123, 'market_id' => 123)); - protected function DataExists($tablename, $wheres) - { - $result = $this->PDO_Select($tablename, 'count(1) c', $wheres); - if (!$result) - { - return false; - } - - return 0 != $result[0]['c']; - } -} diff --git a/codes/agent/game-docker/dlweb/api/document/platform.rar b/codes/agent/game-docker/dlweb/api/document/platform.rar deleted file mode 100644 index d7f902cae7bcc977247708dc93fa4b22325f00ba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4265 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 LN5nmQ06+%-#^U{N diff --git a/codes/agent/game-docker/dlweb/api/document/web.zip b/codes/agent/game-docker/dlweb/api/document/web.zip deleted file mode 100644 index d3a913724d861df43e7b70692480d52823b615af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5666 zcmZ{oWl$Rcv#x_{p}3VI1p>hx3dNxiw76UGVuj!myaXr?#a)V92wJox6ff>j!9sDj za{ApfbLY<7b9QHTXLsiP^ZwYKd34mVun7SG06t(SY871VE)vO$0RZ@80RW``wr^c+ zyuJCH-8?8l2s=|Fv+T+lk5(h8)bGwLjFt5(B;l^ zla1-hhj^+fpA-iJ6I(Kpca*O0)n;co_0POcyxwn@XPR-9Wo)y5vfJKqc2ZE5ly|_) zz;|%ipfQ`5S?c& z3dR^~G~;IL$D?;E>*}&5aB{(pcnoAmn~uWUSY(Fcz;cdlGEaV00s?m&2H0RfrwWS{ zg0r;@&PkfCBUd6P-`L*sx21}q;G#aLvvO}Qkx}~-T)J=yIU1dge}P}7^~$AKr09E`DySV}S$(c+$rBM} z(~Qv^&qfNv*kK>Wjoj8qajmHgnq5!3or2)0@6^ zl%SEhp+Ovesz;BS=aleF3rXtvp!F}RyleC-t7)h!9s&-{vghtd|91AawLKpH`msec zv&khv9aY|YXa6{G^W#GN_2ZTAAtzJJ<0mp>`Z-kGKRvmo!8lsmwO}h z&a7rn`J?Yt^__Lvr2?863A&Su%h&p_X>ROvRWh@_d655rV%q!;K0vpVTtO?jp{ka=8Vw~&Xd5irzRM=Lptyub&>e$OaCrY_UeU40|P}!^u)nIrGJQ45q zect9}#H*O!+U=U3C;N_y93d!d{PB7Sj80i z;Jws^+`UK!hbdsI4R8^g#WgDoHS`U4g8uj|=ej>fs;)}UpbfG{ez9I03p!^}(fYtMDC!9j)bXQ3T1c1+sxSj#4POp433GS=e;g zI=C%h#BW(H+$I_yzq&u3lytrKV&Hg2>OuX=1~!Xr68}`rRIEQqx&i4@Lm%6AHf7mB3vt4~5M@6m%SAQ^3>6Q;u;64@1(kURJ1X@CoUr14#G{AFq(ob;Z;6`k6=8~_dP_{}gxoYHYEH<+v>PUR( z5wS2Pi|&nHh#T~X|DkR2qHQBuql7-N)?uJ%&JDR`66j)1O|b>vh<$fjj%hmf`Ku6w zR&XFLo2+paQ~itt_6I}tsR4>5@~nZMfbnJaAg zC<`4F8{`)wsDsKKJL-hf)QRX{lk}3-uQ7z2m_T<*zpv#!`=CX^m<7WH{^vPsT8rErDtqwPCgU^Q!8kj7A_?aw2 zJWse?;dbEy!~;sN_)6g6V966d4j3^&Eu-ZYCvTPa)6Lf$f?kBzDjGwEgn z4J9Nbm|e#3#89e>SYh@v?VdQ7S_uJ{fX{JO-8z@}fMG=;x2ybs6-zmBLfW9Km$9h0RMba# z<3HXaI1FMi)am*-!W5Iz0A=Y?!A}b~d7=_O;B1Nr05G+!Ig!}3LB?a_o@81|N!N4E z!5CEMQcPDz>vqc>x+zMfwoOvsdEn}~GZcD2ZlWd|Sfb@!)Oy4x7G`^^AzXY$d1*ztqmGa*4Cm_Xa zfw|2Z1>7($iT2K}$KzLJ78{+#rVEKP@08XYgy%X5!!?B*mpk?R?)7L2=|6*hEn?gR zSVz1Neb&f;DxSf_HpKWXYEH?5r9=`s9c8HF(jK{2e^V(pDS&G_2&mc?1$d3ei+-R0 zV;iKC*O~kr@zR}iF!2}T-KA07M+T*^@{Zk4@J_I3%26Z#eIEq=0>hwLP?TA1q%2gG zDAs;LtUpe;G?BN;gvX+e`9#+L;r1AL&>x8xd7wTR|2WfoH~IJG>|uc^<;S0+6bT#U zq%_^~72~~2dY*N|U(=az8yC9BPouFJ~1$ zgoe$%Xd=?zqYZjP!t$_*JotX7X%Uon7}5BtK_)Ki4x-6i1znS;C~--yRwcJjU@_r; z8`fQW$Jm}M5AVbMjw^)CHOnS#(Ef&$Hv4x_hHmkG_EZx?Bd`>g~a{TTKgKb4+7poSkjz4s#3;65v`uX=ZoZ+Xt(BHa# zrPZ^^o!{n+LQl~ATV7zy>KtP(a+ascLPpAhB##0QaYz(A|DweRdUE#CcTiw46`%-; z4SVAQ=1#~iHQv}=xNFvVrMry5a$-aWVIF^8t%kN-7ddNOff=uOSNDxPV`?K*4b zNk+*9_&kH$J~JK3|Qawtk^bk zuMJ=PcqSqM9d;|DcOI*?z{t&LdR9r4l7Mrwsclu{iBUW#b%iVC=h((0UO&o>4oo!- zlipV`REcdYZK%I|Jhyoyl^T3pW4Gr(s#_${FXW;zwM~N1H4@cy5TY#1!Zx&?n9DHh z9Qd5MPDiip8)UyG3AHEK;Id>}YpPMPm=hu3aNB9i(elPg=xa;`0?#3f(7b*en}0kj zwrSgD%sJT+<3zT_MZbPdrPz2+y_@Y%QB(LtaJN5!IP(DlxrvSLtU|n)3mQDsm<}nO zSkd2?ZfcJdfy0UsRc{dXKDj$p1RvwwqV2@8ox$|u_W)oMyGB~Ui#rDuAI>Y70EX~|tWK_klJJu~t!J~mw&W<$*bdypKJHte zlB_+*JI=qmBb`ct$NFDlw_4@p-nGO9H5GVgmJWV6iWlgcc&!pbj+gIV`7FeC3q6yC{%K8sNyP zb!3AQ2&M!2B>Xrd@$_)XD#YSp3~zH({EnPE2JLbxe8+@$s&H&k7ZrtxRac2deK|xc zY}3>MTv(Bc{c<3XX-<}9W*D}-9F~2|%lEuqtk+I`XHUD`#`CY|)Pc+V`A#Ol(9om&M~0D-hI1PDkRv2ypUnA|;8!xF8Z0)bYP_C4OEVq| zzC`JkFtcqj6A$}{P!nlx>xiz4I@T&aC=XEXUd0PJAc^KlB~A&ynjb+*eF*Tj0u!>m z%;dW_#5e6}X$`6HCQo$9TIFV+8NKL#9>2?+xmUi=4EOe96HUILtSQRiBYa0SC5P>q zu&T1yS0*y;gPUhnA*B18vY01*10Ta)a6F=P<&8hTV+AHJr<7hm=9Cuu1bKmOSwLfm zz5jzI`HI@}a<7LuYq9;4PQ3e8|NMOV!1_KUDg77_Upbr9<G{1a?vTnZCE33Hf795d3x@LqA1iWXJck5F2ih%8e$4A)ECv3>M*6{HH$W~rov zndorqI$ePu4=*UyEZ#q4?l*`oziMVMbn$PaUCCC=NHtSY9;8jwP@fIT-jV*DEpVnH zsC`CN)cgZ%%tx2tz*OVKnmA7&XP^RMc~cU8FF?0a#>kBovy-k(dHk)^>`nF7jO(*F zs`3RTqLe-9uz@(0kCuWb$I_K< zlLcxv(PXk|%@L&kqKnQlq?YV4$DA2)#OlbJj$-(CS{Y~iNDJsf%ge&Jskr`v(s)~1 z_dVJLKsVA#$$(UoUkinSjS{lO=pLM>8v)+}OQ;wd1+P%4nL!PTz5_9lsdauX}l-gRPih zg)P~EuyZ=S7tZT$ecVhcMJ0V)sOD7_dmvwW@>0W(GnFj%-;=UCrQ<|=USsQ_MW!_?=^)sGDX&wdMhu)G zmRm1GD$YaiyAH0mfY;ELOJn3j4N%WB{S|!S1^(M zy}Nh(<8DO09aZR}c5zL61HxxWZ31~PKDdH~a&Vn7!J`iREEd6kTu)Z*-WN-q>-Z!7 z3JfqnVoP`n6kZMBzkCzZUhV8q^$rOptITr;lQ|OZ!0cecrwNR6615`l!TE#Zl)x7I zF-pf4A2vPF!k-%B62HAIm@Oz2goiNHJLDY7gZ(1t$#QOXCco0Bt5maNFUu#y zQBM7EdBvB!)*iX>MP~Vn?7au1O6C>9G4>w5bP`@l#U#t7K79xqwB0f#6Vwz@zwT%H z5Cmm;?lID>>Tqq6N4KQL4Rw#PT79-ADZcoZaQXUEZ2Oc{WqE5cSL+H)>kWazuL9qR zVT2u6s4k$eHC3aD528)+hT8l!WpD1cJe9Pjt@s0|OK5e^xlKk>1a*zGU|xT|G0Mz7)^WbFyyt4S9X< z>O7rHXe1(h&U~gwZL|?wW*R>4m1*FV(wbK_Trp>JOy~O2-;9`hGQ#F^RN9!UE@n@X z&)l;5C#X45O2(>6o~f`QSZva$`X^VusMM?-%W3nE-X!0nBiTj0joDo0a`8xRsu2rt zr3=^DeuMeO8Z)I)Bh1z$ougasGyXdhlU4RFp1?CVsh@MYgn7xYgR4_}i@+GE>pJCA zUzMs|<2l=vdd!0mN7}Xv>6`KDU;Df|f*)(TB5SNhcoNr_^K*Ju58zYCkS^aFoC5~+y65T42>50D*ngBD4~V)=o}|^t*`GwcR7r%MI&6R6q1o*H z`s8`v3BxIQr9Mr|=96(xgUj_N*GJa{+k@?uCZ(4t-F0+=Xn%3hQtI-J=>)ulK%qaF z#Xrl=a_>OY7-omO*AXhX{xYW?r#@p*l@^{lEwbi-B&d7 zG95wCH%Aofckzh?GB0skFS&+-D`ZoHV%y6 z5iZFPN*f@u+)&rDDrNE&Z7``BQ}RCMJKv9R4CMA~3i?_u6$$KpZO&mF1LFD>YU`Zq z^FA*(LDcKL^R|L3;B*ziVD^YGwvF3+#L`j6z$66x?{M}XMf?|G|EK$m>S@y7SH#J$tM+Aer(b9ewwRw}yV26U=T zQtx_om|~Y|4h?6aQfOAFgm$H4<5MmGcx-cc0I)}46c8B<)lAWp6_Ht5y4BXWNvjQT z`&Sye*8#P}O<8FsxUH*yMOAB6?NhL;+OziJHNJw{ff>e9L}23}%*l{*(%=ao5n#wM z=YZn|L4tn={!-C^fc;*8UqC;j^#{LJ4FuJ&1NJarpRObOmn$g^w6C@- z6}Wquhh{*)NoD;2K9B#s`T6^o3HPk_#i7x?RVHNL8wE{z=h{LbLcdu< zDEhBP0dmsP@0Tq`aJOxeCfJxC*uqUwKQ5UbXd4=&iYP9D-Ymh5M7v7BI_D{cG*c!; zPZpa5JPY8YOOrD@vF^FFGew=cf!JTFrkuWg=Cd+=9}_2zQSu%{SX7Y#t0)r-K4IJf zC4>_67`JUbu3Z*_kC{InjqC*_>#xnLDGMnet|^N{2D5krpIEi%Wc+xdp@;=S?@+-z zQo`KhsFhu;OJ$8r@X}t@#nK?jSz_u9v`Idi>=AsqHdPS$OF(vMXk2p5q1tWG{H`v( zp#7*eskY#^4gGj&eYo<0Be-Y_7AE$<3rd8o-AtjdO}L5VCyVs#%Em=$M<7?DuwJYe zEzE8)XC8%dqiVXOhqIrVR=G&mf1Pde@&fdK`8Ab_1*9Dwe$;<678C!9(^~s8VPRkK z>;LzS56koVjwK-~+_WkCjSs)!dDoMp4jg)o?>s}X9#3|7M9>Yagqk53(X=EP4o??* z0z!APcJIE=(Km$NydLV-Fr$JH^&1d;ee{pf-K|Z)#N=&ps4Y}_w*l?>Jvlv62uQ9Z zt@cpF^i|XI2-mt~2sr$w^#RyrYC_=xGlMU}XA%!8w@C_`OTS7`43pIEAF$N*rgHny zSaMGJakIOjXHVvc{20;#SB;CTIkc{qjKkeMg6av(MvQdpvaM#L?kir_Z=X5*m7tG< zp;Anp;%NDRhtR(b3hatsrQKGn!|f zXWK81crk52hruD4dVuN2x<)UE%ARgJ5@>|OoVx*oxYMIpXo0&(n3kku4#PT23bWF) z)|92zI{#VgudK&s!FI)=;=AU zST}Bbyapzk=yCY+t}I6>6^} z$3xO#=y<6JCzB}dTw-IjA*d=?F9elW7(^M5U=Ys6Es4!~E+jyInx7a&wi3<`?bMhCarlDBYy(y`07r3n4(TWNgyN?c1H4QK+o@iJ@?}9ASj*FP#DkCU^2E( z{bL2}!;<7v$STs7B69Z7mw?=GlSQzmX+vR+WqFsgyZ{8(=4bt-ARv!QeP#OatKl2Z zR2zIAK7;uB7eyAJ4Jzz=U%{UY^%0p5MLaBl1-lF3SnwDiwfZ3zfUn+S7skyCTJ8Qm z(K%L=D&DbHfLJ8zQuBnM?k}1dNXGoQSccVR{96q#Av=~YR{@T^Rk0T2zKhzlEZyCo ztRp$1+*Ch%=?4gjyxe)b(n;?)5|@}+0#H(3ZtP)hZmjM1wR7y-@b+ovjvXmSFy-l; zQXNXuT6o#^b$IshW%l!eU{4NEL{kIB&ta}FAgW3(igo279$Xm<@t^CerOiDE9!y8O zP*e)*inFHDF)xJ$X*O~Y&z0GJ701gfAzfibm`kr&?EB% z=zk!;B?RlnXQ#<-On&P9Ga?&_QXc9reqbGGT;0k71Jzq!#3U6RG!SrG}De^30v*f z=f%Y=C}I9#lg#C#6gHX=gAS??6aq-)MS)j|c0`pOtQ{U6_qhEhJ%;p+1kLjy8T5(1kI712@Xf77nNY!)31pzDTzQP zYYNL0>qk1k$s1+95nxr96^o0}wB@Zd@*)agqrlQF^)IHaBspc+D%%d$J=713{b1-dN&zpjs&3nYAJO3B@ z@JtY)o4qm&dk(}Vl*+l2b>WJvolppOBdOH8X8`UI*QMqVV6yfkun$Gr1hQN9J-~=< zeuhT!sGHWnX<1YZt1Mm*SCQz;mlRyYeUdi(Gvt9Bk&&EyNR)tPOE~@NucVTJ4Au`JnNYbcl7KSkf?&@ub2xkO>Fr>)N4xYP zgN8wv1WglWZpu<-8A1Y$wGyGJ>|t$iJByX-X`&&MN7Z7j?<&<6)0@ui<;r_)0y>6~ z`x56H3vN}cd85Iz1EhofClbqOlK!V5k=B6mM<-*7{O!J@wh05V&g0NJd`T2WU6?vQ zl)J-NnN07`)4NRwJ_T6BBZp$Y>EL_kml%-0`8CC@?!!9vjfD#znBZIJti1wftJ3u9 z_P=i3wzO~Ar)ZfgIZ#5zMst>)jg*6?N3Jj7+U$l#fDc;jXTa7exOJ41t@!xu23gfu z*rKD{ad^^g;Q-4~+7^qc=c_M`pz#WBKcEPiIwX(A0zBkaClx`Blx?^o@g5a|K?@AR z{n`Q>#V$UtawSj`^;W4?0}jUq7==hMCgSK0>UbH1lFA$=b}{ayA($k!k&<5+u*C3` zOo~xCY-2y)ZQd&AL?|waS8lTj$IO|Oro3D(MUQhkVR-VGV$(;DHGG+4c(A^ZVxuLe zD>DumE}2Bnr^IH94^>P0;#qQt8z5jaIU+BnY0%X&B_b6>n~s?Z3Rl8;SD#she6kv)2z;JiN>#Icr`y{2 z_HJ-FD)Rr65F!{~@P#Za-z1nsVMa+xDrd`+bhqDgoyy!<=HI2q4%x+SEJk&2(m?es zUTV_XM9jwHVOXNguxZppZuTxgU7oIv}t_IuvR;R=>-O->l27ibafuK^gqJaa~m>~LlqPsv|g zuamj^uX)kHWz|csrnUef+o)&0)P&=x4ePAdceJ=~kqS)jBT#ZF^8J$O4^wq`=Wmp| zRy>?7n9=l*PGetHk}X(PknBj~S!yBbmTHFvb94wog&)z84BH+xmFnJVVCdt8D+q+} zUV}QG`mM*o0GY?9PM?|()KkLe!9$Bz&SWl zxKtj3%w#K)9@>+BIMh@+W8{^9)#i)uc}0MMUo@U)J+NB{&o{0r71c|k_(G;%dh6?> z{5L?aHYM6`V;7*{s$tmfoSzqV!KM|FyJJ`FztX)%q-bP0yqKL5(_UWUo;p`}cvH zjMA&)3h=8GEg(SxpDFSZifHt(F&3EOl53AIo)~1DGO0&BxH_7X53Xa%%qV!IWJ;lR zGO!}$z>FJP=w6k!K?+z!M&elL@Evu6;{J>~1CAx&h)U+4by2Fgl-;WFbGB0L#qc>@ z3*&fK&jP^IYf=b*74ATmdBhaRzgZk#6#FQZ$%1r~4Uyy}W)fAF?9zkyTlO@}`KPMfzs&URFmZuw=9V7O2!0Kh= z`H?}&TRzuWiTjTpUPsUNmts4xi)23w(_pt zX8*vbK&e)a$*$9KOhPscb2J%LLT@tl1oVD0f3Qr3Y4O*-iBG)8CJ;?jZ!s&sa#$O` z$ouoDG7`Tq?<%_%`{UDITyIkK(oByLxYbDb#%0U$4M{f_r-D{;IGAR^??eAx2 zuili;CDSDB&pX+PYw^u3RixkLS?5;g?e|kkBl`?tej`#;dx53HL3)ns;??KfIdW7| zt}ec|b1vT13rtpcgqwZ^b%QfrA9|KvTJm#7_ZzSkhib@j)hr)UT%vV_c12!fsE(Wo zW2Rg!x3RZz^lP`;U1E)W5-Mor?XaFaxE< zoczhXv<>evo*lxie>vQ7-K zm}P#b0@JUXrAjw5%;vw1M#iN1lC<|=5Y_O>VlLfh*1@LDd4Kh8;ElmZjko5W`Tx=n z_4KWbOY7~epVhq|_w+CSE$%);TC!V~had62_r2yhkehrG;7FE{N3zKLJqQaq^F2tc zRis^=+nJAtu(s>kMXL_#f}Jo=tHa?mjOSy|rU&vRE|P~o8fkSiaJOVf!8%*aOB@t# zxCkiaU1LTC9Fx{%!8_KArkM7wnl$7ZA8I=PN^10iKUS`KQxkecQJ&2(7KEa3&?rvH zZCtueTD)|%jz6;L>6;_*X<{qc13eG95T-`X+}2fu-$+3y1X z=7Sr1i_xurKBDi>NE>3`QU_QUiSvV;R#WIv@^P5`a)#Iv?{07|d~`owtHI8wWq;?h zveSpMWhLBiKrp}=5L1z00{gJMD8*06=bTk&c~R`%(Deir8^f++mD$LFB&4FiUBjt~ z1k^sJ5cmq)yIf|}LWEF5ob6_!Ksc7(_CX9{QP8q`xt4*d%Mxoi%61)8p3P1ZRXlhh zT}KVs=B+TliVBEn4z_bLhG}?#!_4vdzW%9JS5Uw?-*yH6KTt>K%O}K%@m$~YA{~G| z0>7UB?!Nq;RT~B?@wR)9@EzKIo)t<2C<%}}UN+Qd0tSJiHAg+x88xF>Xwcj?J{`uB z=b$z6W9T0lu}c2o(20I;Q^o=K4^BJ3j{iLJmy?IntHWO`ubozGo2B-4JLrWa^{W{e5chsehv@|@rZ}QqW{JDZK{3)0^d|vVnJW{9p zdG5n>?A^S(bK#8V__%U0ewZIpQ)$f3tvhz~kV=lwcx3(7({^_7rLWB_k@M`1{fv1Z zZM#04n0$NIi(U>MQQx%W-PN~-_$?k}eW*I~_|}-)w{|JZr)%QXG<7o35-*Q8PX3-U zR~Yka%8i^c(j_O$%adPR=xmRb*a}wD%F>~8zpWzDy%a9csH=a+ptKzLCSHe*Yih`AwN5Vp2`r&9B_O|9#G$23vJ7dJe}w03MNjJGZ|D^hTan z{vt8)?!$(({B_~Cmqccz|1Po5B$^wjr%$NAVzhPTr$J7LuuycfusN@%->2O|&h<+?bY*%M0=z!?VT>O8idV7_^XuRC|ajxy;tL}9R)3=;sp1`eH)rzA$5ILsDqPJ zP$01vUGWfgi(*$&1>N-IC|Fq7Hp*9tP&FQlOLL^l;QJx*=Ctap1le=vmMGa8C|rV2 zeI-%hvaj)}>C-Fna93oRh%@*w_|LoU!h}U~nA2Agk%F@~7Rb5?Fc(RUVu%sH7@p~@ z9tcx9qpXNIk4#h~!8;#t4Wz5~9bN<;zXyE8WQo|8ToY1Rqw6&1tDRBSDmb9e?MTvw z_A?zS@$D4hB#Je7qXc~2DRM+=$ya|M`Fk&3HiphoS!%@#&hXzGv`f&F1YV~0b5Sv! zrv%~vQdH(4t=O+=c8S5Cg#-crl}-n6{jA6qq=qWl)}Kw>_zk=r8IDdo3~5Q-4bsm@7SXe0~VFX++vw z#=Z9){e;8hiGswkJCTjazJ#h8issniK)i>oq4m|Kdn0gm)La=YiH*;F&z1oFA>!m{ zWd`HE{>BwuP!&hp7zW$9%?Y}}LTWBkRd_q4#S@y_q~R2uaP~qBgbDa;Les@va0>hL ztZ{Km#!U$&C41&odAd8T^7X?BSD;KYdI_>QJFlvcXW){@CKn#6?tq%(o##wS;qq&h zi2eW83kaHUs7@UxE<@%!gXVBMaDMRtf;>J`hw~8A0@9nULkwpFn*Z(#p-?mIm%Lgd%Y~tU>klp1bo_+yFSCo+cG1 zX7c*ZpJ&JF_CM1zUGxfoo^l~Mn>fno`K1o63J#7vuDnoDX`U`uUe<4vH-J%=zGL&h zJyQ(;I~)SK6+Eih_0%6U@gM89Q6Tm`3vAO_a+1Oe!s|&EMk;LKq#G7$7@6x&6WTy6 zm0Fs;bb*W)utlv&s+VJN>_>fJtiG$V=6zG&kxO#zgjl+x+@XPlZF^ee!GAk@<0T>Q zAIcD~ga(W9E_2)}a|KKTFn##0W-No=Cj)6eof{)4Z(2?!|m1RCxQhKZd-v`PO zW)9$)ew}CtZ&EE9rW3nP2HR0m()q_r5zS7&HWjPjH?3SF{J0wUxLv>wzA_pgAVbww zF-vCW3Md?w#e-^w^c)0>Ef_fP*%%cv^x6{oXIz5_BNjYaNNFV63!@hmDYoBhMy#9< zb}@IY(w5zC0M#OCXQxe3kO8vo+!;H=-@?diL|m*oA+|3d%+1BG8qn+eZn;m zt9DChJ=wbVG33^`c9}@^H$jO`U*!OjZ(jSKlPnx8-nLWAQGs3tvGXQ%0x$br8h~z4iw%dhfoK z4O2_L42^dAi$*ffC8`eMWty%Oj&N!Uc+;hZ66W_5$Jd-byZwSOwQEcjZ&aJmYBcs1 zF6EKv$@8@_u06SBV9| z%JR;^*6X98+O~5yPrf+SSrmcA1FeMflVr$d3l0Pl28Srf*%gv zBkf19`gSQQ&iFNaXEP*@48V*`&_tVG(y^C&aM#oWF#EBW+u(iuiZ_w^xClgy@(E)s zEymVKDhgr83@qILCO4~8dz)`$)1L-ktUco7B>&NLW#7<;@y-6tP*V<&1&aCXMOA?H zF{d~~MleRYkx>WNQO7X8y98@VJl~VZZ+`#>1wdXJrh`LA`!NZ8TP2N89-c!<#k$Lk z_3*cEKi%04G;&ZkiMIQE*u}3rNscFj zS`Enh{7k~xDs=4#(**U%;cpD6uX3f=1JBmVuT9@=fANK6A|T*Pi^?I$rK$9 zf``=$44m7^BR;XG50cn)MeC+A77b^|gVFOY@KJIAwMP*m zGm@$3qA`Cek~<$*1CjCG_R6%>eB^cx_a^>q8=`n!%K4x>YD6ag5)8{egFB$a;@(Hj z2kowCJ{Wq4O13PW%@2y(ao5ZEKQgOtYiVxb7NQ&!t7Ps`<;|AQD}C6^@MC3bL%t=y z6wEOy`36cT9sP%170_a+$R2qI!(NEcsSG&$&Fkcf!{&T&QyXT}ES2}$YUp%udmwL9 z53f79Z7Y$6ub;_hp?+uKf{#;u%m_X%yfLH$2AK;RdHmBn4L+zJNF}p@{kjywDI$M= z+=n|_F&2{;s~VS2xK}xk)6ZaK59y^VfG* zTOB-He2%|VE3fWuRgczf@?&QCwIF|Glv=8q!bFd15~We3byCIy*;2zHex(#K0f3r zgq@+6(s)`ur>SOPKce|wm)*Tr=(sdALtYWW03-httntq0$`cY(y)<*&O&+OP-+Cra zBx5WDC`|=fM)8A3yot%HU@8&fR|`~NbiN)^o~E~BLmzx+(eUI}Clfbc`mo`DN_6PB z*V$%6@=?4tSxv{aryOPC&KT?;_MWCY3MxKy6jh~y&(;f~Q|v%7%Q|;l zzStnJiBx};(8K7S7EkJ~zL*UWfDDiqO^m*Dg~VBx-9<5VLdAgtB$ZR&YlS{#I9=h) zii-|b+5U~1yEL{G8RAlis2lujipEhK-m^r6*sP~76^GuT^a`|<(B!H%<3ibr!McY3 zwZG5Lij^d)G z{L=3kQs2pRjjM~86Br`s$lPGM=3I%d`O;HiTuVjs)}V-$a2y+{%GSk23sEOTcQ-c~ z6fPdMd05wGoi9ReAM@f7+!>8s#RGINP zOj|CsxvJpbD!!06pxN~bhhHg`bS;njJh#7|5B1Dm3L}1MFq;yGkE^4IxG#%ksAX%{ z+zlLA4^mt4)dm$rR2}~EhsPVZz=R886{Et%uM~XKiY85S?8>_$+ch^iDGYb7Ici_a zbboi!e@p!Cg}%h5!DNQ?cY=WzrzuriyU-fST_;DWqSh>{R(X>u5OGYksITUj2tVDL zCw=Z??WC5O7AFb_^Mt=iB8ddFI>jo=Di#4bo{*84QC$8=5>LT@-b#bYXuy~6(&F=V z*D3-(38`0s<@&9sGVg%Q*SScHh`NVr!z2&iJ%3_O%X%&}E|!nU2Mlx zb^VHUA>GC`{AlNI=Q!zsFordu$?Bkl&6VmrA1e|Cm_Ib=3tViFwcYiUVfc@u!r7dK z(~W1OYV$cB%l~0(gQV^gPo`}*R;@B1*X71cyQxMp);pOhqGl*ZZPuYHEE{|4pRm(~ z;c_|uG~LqTOYicTZDbT#84TzyJ@M@x;$lY<0X~j%X@R4L3(#s&#F8v)!5LSX{S-#_ z|2auZ9T&0$hOMNudX+wP5m>3v4eGYNrYkxY1@xv`K*@$qY{m%l10B62DRr9Krl5=b zF17Mlr=sKnP)ErY!O^BJ<_anbJ7+zNX9X1nje7QRoh}Mz`mhy+k^qia2lQ(QU(--C z;C(v!<9~v;p3LO*>2`{&#R11;>5N=oKf#%7Iq2KX}cs%Ck z9)J|)!v-D)=YGjOaIv>G0_uJ9LN_rSi5-~Qxu{rS^nY#Ly9zre6aC12yED-@8TMO~ z_@|r6pT;-a`HXzLS3EhCq=i?_$N%xnhp1i!9sS~N_p$Qa7G8#orGw4?ocxAD0@xpa3fl?rq9iKkF8BH&f-@s(jN^(DvYk9$vI6C+Cl=~p)Fy5c6} z7+Xz+NBU>mX1QdraNQ3!b04f~J&VS$Q$OHN#>EDZrVl%`S>!YOTw_eRxQfba9 zDI^V-UB335+$weyFAPeB#D_#|n15EpRa@PXAC}B}KK~xvTL-z}(7=hGoQeP&Sjv%e zUGwZQjm9&!{d8+^;@f)w4BVy7nM;509saXUg%mf>GV0_}Hv>UP9cU49`EAuL_V3k9 z{$!Z{L@9X7=4+bon+879Lu8qibghpyySdvw2W0L_c4PG|Tqn!pu#)6&2HA3ypB_4$ z=M(sX7y7A4(6bflB}<)l(!a&;+{ZS)HJR6U;}XjIN}mzl)qEa(%1RD#k|x>p&M!Z= zsDv=2N4?c&z0aXt66|VCDvb2JjuVMe7?tfqFovpdQ`TL5*=ryR&biauY~^QhW%q3h zN>&l3!&K!N7DM%UrF*MLBm95g!|QT=kJq5^`q@XeUW~`gC3~u}v$nqO4}S~FLL&A3 zA^-mO?zbZ3aKIZZB7l`0XZ>kAj9q8P?xawcooS_TYCT5S{{rb~m|*1W|Fv|-%0d1sMs{&5ep4mk z{Nin`v07@6U#wZYVmBG%L$i$iFvd7gYJebNFe zQbL@Yw`N~1Eq52_-}59n(=eA;M)Q?*!3V@=n!{)*Iyg7gs=$0fSeIwezpI91=FWCP znez<}m2WqKW{WF~%zVa1)w^qTL zGQB%-jr5-NCp%B=M~3u`y8P!ZFzuMc+6Z~c03*kw{+_1bnPI5i1H3~|5yqd>GWQi0EKGwsooozMG< z_0aX1T$KpG%|7V3Y8@mtrFPT#*?6{p(pjjtJQAmDtdug%{Um916P2fR`{d5{Ykifb z2OO_L;uSlstN!v=H8n7v+o3j19x`|2^2S|P6HA(5VvuqeU$Cf4_?c@93>1kWQ!#d!onz_qN# z1KwR6Fku?K{aVwRz5Uv@2H{;{2}>4xkNA})?L^98qo40*Iqf^WaBxN*)m*TO(Mv4) zKii9EL4F2|d(Yxtl7^&^3{R7UapRN4RGv?(2`Yk~%JWqvTJcat{MS!xERU7~vDkwu zbz0{b4spYC`MZ3Wu&&QM3k$er=Y6#IXT(7vj0H8Ppy&GVW!?$D4zqs<96BzMii0Aj z^UFZ}_ze#_UDM?8NsJoBXzFqM9pS1Ey7T)kDi8fGpWT|T!k`Ig@Rdy`tT-gA*Vga; zaIYr-K)@3gy4~U&2{iIO&Z}G2~nz2PXm?NUX8yQQ!50~`*$Jz8kKZ+*&T88k@9}k5$$! zZLY|c7q|JvptmtPPH;%>^Ej35>5Fn9Cv$C;#9D(&tvwyy%&9TJCtt>>2MUoMErI{o zM`g5M9biLuGMd?wbqyk z?4G`Gb#wUbaCRd|^tjNO%S8{4W%37{_C^af0|n1QYsseyq9hec5h=eXr(mYTTnSGW zh2gF%zig1~9w>mIUXm7#iC+r^cy+EM+vR?LIe7wQlNfTW>cn||aExZvMF>X9zPu`$ zT`Yh;ySfttSyLfRxMN-Ik7h8GyRmTCZV3`sLJqh=4j?Le6=M(l8Y0AJC-!qhyQ)4u z)9iHEQS>6I%PODPM+mm|)y8?k%P+l^rxs0!Jd;-ot9G39b``Jwbw@6Ukke>(z|2L1UB z7OOW;L=s5lHXbeVk5_{k6fVEFzy))PXP9-`<%hEOfBQ%=8;v;zSu<>DH~Uu`@UMqN zzHoP78>#iPxWA6Lf9$-M*&ce-9(($Po`J+3R(X?XbTu|pWpfJ!DLE}2FzXMm)g0(+ z5iS^a2a0Brp%4~&g=q^r12qM z-J;-GksjZTBIpc?x!UHd0npO|veXz$cH#$Xkl2f{rM9 zco!HYGT!8<2)o;{wxA$3F!X9HW^mnuLApGqIfA`!WqPbe{%)2|zPSRa0W&F1pFpnXrF1d9YxJ zH6%!DAvj4?Ow+`$+GW!0ecVHU9YI9{Ji`MUl8ui~ zlZ_*wUdK)1e$8W!vyhbP3eF3Yug?OK`&*`kqO~kyl)nt2E!`))l@=>BphE~WBzVMh z^@-vKoodyp7-^uJP}3~{hhK}T*$9lj#bAyEUCn;vCVWz4tD`K7s)sXgj39;}0O^_KYPnx&C(6TeTL8m;m_)A!I>*|28D5^l zaWWp4aZi9bd0($t*~VMM;kT`&>GugTo;cm;GPNq1TDa3b&46TZsC>O4;Cx~K^jnh4 zkrBP)A$UO_IV+(1nGs8y2CvckaPXU^cxy=2AiwK<2Efw1-z;&d`j2el@mFj%`~F_A3{ zi}&&pO;RL5e#tXCViPELRu_KD%#5vtdMa1cZ>4z3r?HjKI@zVLVFa2fSf@q=A4wYU z_Ni|MMOd8yz_MZ$?umh)7n6wTrU3#ew57-!nmzlj^P$2N_$X zueHAidVv2RW)`6z>{>WG6ny+lh(o%C8$Q;d`lfy+J`%oGR`p-f{ZTt-F$NOT>Bnl$ zFdl~;(~(}quYt20e{(?+qJ=t&Pg~KeuP|WdL*hS@HOr?3nX5ow1XY1w-5;HOa(mxY zVcS1(;gZLT9nQ1qfS{jNLx&J8BO8*#qAsUiTf;l2B;^pY#JR|ID--Hsf%@}t8N@ld zX(xqb6Rxq(DpFdjnM!yOM+#_;RpaI>D0YO926_LVh0)KG6-uY0%f92{(dPYb5lS*HPlJ$FY0sV(LUvHq(sa-Gx${HGB&Z($^im}U^3`&@Nz%V z`sO#zpMn4a#8eY=!mU8lFh)zy6UH2kCAspGTGNo!<$RR>ZY#s)+uu`!E0TnV{}qSx z8xO@IA>d*lBII;4X|kF4mr(0#tyt&=DU7mR$Z79p^U2O0&N~Q-fc5Z~R^Z$h%6_Z*O8ugoB4gMlS8?-sSojV8nbX(2JW!A`ujYkROKHwy3<;gfkLuz30jfbauLyhKtw%+t2-z6#%QDiM98MFphhY7Y_b0Mrhm?w`d2u z1H)`#wI_FxP}HL$6yRtf-<_&b(0-O4p-3*pIm0dXLrS5}qj0%aJFG}I}V~*+Vzqd_owAW6P)Ck65Vk68k4%B7%kEE zCf?G)O4MJX@qN$F=$FV{X3fR|BbgzOe;xnIpG<-m(jxQg*g9i0jEFbUNnEa4ES@mv zPTZd+CpYY9RJJRQck(VJ9|tG>BP3bsV0q$NU=VZEF-nCVH12{PE}ff&RTe#=uJH+g10Kv@Op`8hZ~iOq*MqBZJ4e zdl=zNAjGE~bhkiHEiT~`A^aR2_iph4fr65~%!e3|Au0T-PqAj7GTSk(oMla!}3?gB0Go1`&9H zKoOUJ8q(}0l&UodM5|9Lk@O&3{dSfSmSo`$Q@3`M;KOC=*4f|no3B+96-*1*t;!$< z1HYbK4}$=Ws(Dwbsrf-ig``;i70H#4m=+uss?h`Hm~l;=w(0GoHdo4tp<92vuLZ6M zQ`#5~4~iG3;6DyO{cCsm!f@c~p`>L2-wh0x>;_^;0Sk$>S2$yS!ZfKivfqqApEmE# zFUu1D<9Y)G+HAim$E~X%n-Diw?X$nq@Tin$Rnf+C936q3AGqv=^YjlOT|(M6aR)fl zD%Mf0O=rm(kmH@+lfRk}OVM=Ow+6%IRmigM7gSTf!m^O%KTTRxlOk?U5&|kkdOFS8 z%cfGmbJ$&oI-udagA|qw^GWo7F2qJ}A-PctSL$IA32*Nhln>OyGcf#x$U~7Z90S0^ z|Mf9%OY02>e-@^?1dDYP?g)%Q4kx4xc4;5Wo^j`4B2vET&Rt(uhp-H+U;6D?; zJB{x_kP-3fdMLP^cu{PPMW&OxRITj=WigJAx;Pt+)QcKRSDBZE>Ei|fej#86z`a33 zAZX+iNiQ|&A$m#|v^Z{l9O%C63`D^y7~`RmFI7Wtf}NGC3qD^K^<7)lRn_KV4x-~; zt~)ZUBS82-+{q99vB6_ga6f842+|cv3sCV=kE|(h^~|7XiQ>B)|8^ zGa2rHnHT$EPXsEr@wd$_J*k+0#i!F)R@7fj6^^W5GU!F(zZYT z$m9HsWUdvm)IQcoL+=!bwpg#J76&E@=Y!QJH??q=hn^PyF%e|bet-B?^YVcFqyhTi zC>R3^$Ffxj_NifPIg)$(GWH=92cI6>Hl~k+c#esHNX^{Eto@UO^eIB;-o*GnVS;-* zh_HvcrC&Q7*Ha9(gL4bpK~|*M^OA^_obK~X6okJfQ`&kC{| zM)0A25O(UDTnc$LaXA9dzwZasB+#R4YLa5lHXGUQ z`A0hVqZ}xSC(0Ztbk3h-{jj0@zm69Yr*vD-2bm%)3I_{`IX0}fhgF{LPg~4Hp0fCl7EB!UXa2EuOfK((ul8}(sFf{nDFYD-IG<+VFwukQU9LdDa9*4nZ zLo0yi8x=}!g1p@L78u8n%+gY!bu1Px&XU)EhU!%^8)fdgjdgr{comYsEF>NJFGBRz zHUYEOspxAG)-kTq=-9a}SkHU?h`oIQfYgmN2R!=q#*B5o3heyGRZs*It$}%&)uHPE zFH%IX4nDW7LN^|RJZTI7%nR0s#6P*b-XyFV zRPdW@L4*4uj?Uw{*XraGe;LvkUtGW!?m1IwEt=iXG*S52^oClIy$Z~LtDQGj%BNBh=3n&_S6&&WG9Dx`*Xpc!N-0E23XR=Jn09%1R?|sRx#EPjOMb=nq zn0;26NL4 zyJ}-5=lAOKmKoYdyYuav%L{eU4{nrBmhWLxk-p0235Ma)TkUDz?t-BJEkM%0>KAoE z_M7ofLK}8sq6c&29)iQ*Q1wbsi69+g?tAaYhgWEDL#QI*D5W`Nb8w{4*Rdb2f<=@( zPMO-fbw1mOj^b~GUAGLgE$W|Bq{6DQxk57F_Tp5Ckyx;BFLO-qVcMj{ftwV})2rB< zBwB_=5O6=ohCG&daK)*^skawxU8@C`S`W_M>a%qKZFjKY+YM*afvvW$?dNk{>jZ3V z>O)+Jm$7BkA|!Km>F;ln7=E8XNv%UR=p6vXZ?E?5W@^%;q{=)O#(%V|C zKQCd7OY#529#U`_MXlrT?z|##>aj*LibMO$WkV2qU4G5iWLT>lH>CZhp=>!sy9F+~ z?tQ)466nL`O$68LERVvx36U+R7zS&&zyxsV$thAp5TC-RghQa)>-|L5e5s6NH zU1sEig+0&q+Wr+o)K<$4@ zg;3n}hJ{>f5=7QFQ>DAo^Cdmyn-B^TSLa=FpXA)!z*@t_A0sCOyn?_x3X9P7tqkdN zHc7sThZrBCVkPs7Um_*~y*~@W5{wI~rtFZujHs20M5+Dy<-ChTUOm#+F%iQT=9N_k zH$&95DgRj?|LzmkmbpWZIR|CrBUqmY{kEIT0iV84uEzW%JM!CJ zaoY<&|3FBYm>GZ-nN-mkL_kWaSTwOAK?DR#TBWyzgHozkRIo4>bigDCC>Z-XHXD;z znbt#6Mkx@7er%y(3B?S0&(B*18>RD2A_g(6cnI2?ELU#;GUMOz&-%1$7cd|8QGYm* zI(JK&6bGDy_gI6`PHlb&63riYNNpj+d87j;-`Popivy!VB#c?W|MV4|eyETMZ)|Dg zGwPg^hiOdSM%2FxSBn#LZC^ye)kDuqGr+{vdC=CM?6*cJ;d;JiGUSkuHRG$J-4?>8 zjp*r2%QkcEZ613G&kfXHzR3!X&-0GMeOuT2b*+Sfx{+E?bY=2 zz;$Jcwa!6&Ri5%aW=``-*P!A+8^?^UfXU5$3_@!xr0Z(LNDk5<-{=*z{!%IpV*fE+ zu#kel(b)E=xu{c{JyP49v~Jo_kZpJ!i6n@e94CSHL(oMHu09jfAs zMlzT7AL9}9AK(kBLq7+C^Jpt?!2a1HY+rF|8`B~0v&!Ly)xcyg*;B&ag(!Eu zn!AA}%$Y6g6)KVlv#+eU-wr-}MXzB-dN`nG|v@|lMPEzolfuC!Yk`r6x zX%z5g^NSKt@p`^jnP+WcbEt`&tdzCQ^=niNi1gDW1qccX7_zexmJcH-J_hZz*-LSaStPd|b#m2I-Ds7Yl17il{x7SerABjFem*D!(!c4KI z2AUz@@=P_9XsX`AnG*`>IRsTFXQ4Sh_89~Am!);|7~E8)x8+-WZe4IW%vhz|6=5rF zz`ZS+GlS$O#*PfwAcaDONIK=rmn&N{h1&p@4KgPsUr89bnT=BZ649waJ`5Z0`DPdc z&7vvr_&XE+%}%*iEA^SO>>s~y{7-rkvT_Fz5I38sOR25Vc&Ykn&ru;8{+|QX9$Q~x z)#`1l?k}koG*tAK)2VS=uDb~sjinf@J?}9zILHpy$@iHkTmQQaK*0Ez?uwJ-Nb@FT z<7q;SkkuWOa`WrgBx?WwK|+%wcSuhaDc3^H#VyUmjjWklte!4sLB3{fTo#Y45{KF+ zz$&cVk2h6tZC@3V@AnAyPuQnf1FtXlvdIM4Y@*+bzy5{JbG)YQ(ycJx-3|L}zL{4} zCs|xd;FmmHE$i|+!QDHJ)dlZ(bliB49By6s|I3A@$`QwF!lOkLA+-To1Lzy%M&_rI zY_C2ijs60Of3e)Rj(hKeqZuO?IJop?TjW+lH=sJbvg42Wn(lJ{7+hZsbG6?2rf|3A zWc*B0$Vq~w2WJrJe*5e^BJ^JSdcO?XRlf`Y>C@}b9=EVWO>Yeo|wM#~8GX zlE(wW6a)rR;*Gd=P(y{}A*P!n`!!7dI?f0jpeyb^)@b`bx=t6JepaHp6O7&DUj>Ld zhISAY0!kcW&5Zih`!i;Xe^qa(au?=OF-E(ER(!%IWe<1rT!>?DPt5Sy*Pp5SnhGzI zWw*kM7MP6VAf4e;EQrj>xfENh`!B}U;YPPM8x6Ssy+K01{%^9M_(8>YnxOQ0gWg$1 zyu8gz3)h_6&C_|1IT0%+x5U+!M#n1 zR)#zuzEVuWk}E7VLF4O5d~l?u>cm5mNSkwJT;qmc#2P&6kl5RF)d5w5izYdP8I3O?N?-=H6 zbI4}mVyXz&*U#d{6F+|x1W^p8<6qwY9vWUAHI zvY^0(Z#F3xJZ2+tdhpgF!rgBnXe{pXEB>3F;h>_p$o5z7E5v4uoT((Z{GazkOppxz zlVlt6n2oia>i_YB%}Fi2TDtWNGF4k~4Qf!^;(VLayW*5uK|xT6sHm7bKRrQkh~uc# z8v822mAXl{9aA=2`oy|nJ6j9R3ihegN*$%teH|Ztc&$)!YN4p~-*UZiO%(HYJzmJk zsQ*$3fja*O-a}OfW8%4MRxSmIzbU9)03R?M+4rhG5*7Fh2o*(c{-oqpq1tlZEzrw* zSJ1j|69S^)N>4M>X>Tgm>O3CyWwk!UWH=Jrsu&q4aDn5F9`A#jmzg%^!aKt!6@jU4 z5()3{6xb-Etcw1AP4({C^}C3?D~bhK-tc*37g^n~Mood8kx`V)U-I4w$$EJEN&^bH zBDgUKYCW30%l>R$vDR|fK<$@zM8tAopShm(rYJ5fy#t@mh*06XQ0xTYK=rn$#&AJ%;K&o$4<-0#Ty1Y_nr zorZ86T3AJ49KrWH?uOqB4&74#1IxOg^n5Fg&Nd;9NqwP6Ac3OCH=ST;J7RHs3I^}9 zpp79sMw-M@acH{%v2ZA!j!C2o=@t&lZDgx2DOrRY4PIpnV|gwYk(g510)(LQH|2uC zT4xHMWzHkI+v=~ekTPcU*fK>aO^ zjYKbNM_9q(rDY>n0LI<1FI|!vaEk}b^7Yhy~*@&(>`}{SNZUrdvU{FI%BANfNR0Jxb*XYmxEPw;=}W32UaG$ zHm{uz*L%Y-%28FA?n@}OW(d4}WkTyaSN4UMe6Ng?`94)o+Ur}GKJC~?fldJP*c(@F zGtlA3+bejt^`LEgC*TVa`r0^m#=p*3@?xuQk!QzsME8|zV zQ1^7+7Zl50yWz+r?C1&Rk8iiKz`1>Y5Pl4EEu&b$f4f6BVgc*CurbCjDOfm!J3dE% zY^?g))z+wv^qT$7n+dmbhxCzV-3Qu*iy4sMdVR+Npy;IKLHpl5IKZ;9!hbWy{{wN> zF_bB!y{6IW^^YtTKJ61!MmdtVn~o>v^Yjv`ymblsdB{elO+eTeB)!@kJjT7DoxELk zGm%(QRV%*Wv4efQWITx?b}YX;&|}lsf5*-M!_aV<+(p;PN(NrYoxr9_ph!^o8xr1Nxb)BDkY5^vuf! zSF&If`$SM<)_Uayj5mxq& zQ$DTrg4{yp&fn3Q45IlnZ0`VcM3>#{vRYTx)AYkp~7^nNE z40De%$Y5Ci^t~lYwwmmv0L6;dC4pRUQGCqOvDj}`toP^f<_{r?r9%tiBSrGXM2H>UZ zgKa72la6)cs5;ymq$NvreU?1*q|aROHo+LX)@uZwC8r?B*7}G`m28GGipE!=K~r*U zoga|dPg#sq0wb(cqGmGZx}IlauneS(mCR@298(wx@2*rA@`;k`S{)~$Tfux7OfAM? z3K_kDP-C;dNbJtB6{TM4lLghd%4epTtht{@q(hW=L?r36;S`0+GCe^dzNVNzd zOBhUC!r2G7AM^PPR!eho`2a#~Jt4FU71m4iYr0_*P6_Og>&fNxWUL#pxXM@gvlcSC z2)7R>fiX&$fg1Po*IXxw25c49PBl{)MOaw?UsQ*()QYJWTJF<3NCQrT3YIU>8Do^_ z0x}+OZ(G$SgHv?KF`GgVpCG~e7o;~O5Xed|OiA0@Ty>blGhsF4can;dwpDgok#=_% z+I6RzSU7Mqwf1BrTyl6?>2bL$1)sTBpLW0A(Fj@bEGo=?DzN~{~@11=amhacNMAC8Gvzj$Dc9> zd78AB@`^uVjX#d5!0Di$y{;f(C@_ZJ`Kp`^S_6(?v-#s?xK9)HbWOb<0pl1yZ_{1Z zyIyV%kGHq4lQHb7P1U_mv8#ut<;Abes_E6i(MM-t+o9b**;gNtM`Y&f&CyocH)iDN z+pEcEC1+#X_9u5!uUA0Yt(R`SS;Ul`ote|d7K5XIW!E7J94FdG=%Zvu(Zq@iMyh_sikWZ@Kfqj(&X}t2e1i zHCHzevNUM^*K%{_i-WA*bxe@btCJW4ew>sqnE&~^MTyh`dLRT3bs~F0nA!6 zkFuerAt1JO??o~$uQh5?sU$+Y5nzH+}~$+YoAwN4w+RQ zU(0PY|Kr~;N7haEqk}W|0-)|ZCfPYPUd_J+Uv~NRc{Zwhu@u_b`Z|79{MrW{eVqp$ z-oM>dY@EBp)kz37oa-6G?@G_FBa2>CQwVNO)bq-cl!`R(0Jh&f35i$SWTXk()w+{X zesJnsr|;;{=!VPDt>=TIqjYiY?9R|PbnYAQLlgJTeX+7O%AU}00~_2qnjNWsxVVPQ zv$vcj#gcDz6%G0T`>eWn$9#Sw|c3aLI#4`9Qr z+%T9S#RFr_%Nvqs0N*bYUab(rZl$K0LKtd{^QSMjJFP19>OG*3+UfL2iKX&I>gm5` zH*9P4KF{kO?`8WbDZ1HiNlUTrx^uakZ2VgC_~BAkv;td^-gm!EPQ?s$?=833ZEmtj zG)r2PHjn5@l&=s6N1_}zp4u{~_d54-X=|A}p8TCzWE?oXhZQRwD|0EN^z#128qO;auX9qn$9@e5iRLbz;Pso9t?ARZ znnz%7HyF6hU!v28h&Az{JAJ$z##$CF+uFleVa(ID)|ARqZBJ&GKuT{*Qn04WIDDErUv&%S1e^7y%JiHk#zQ2jf%q+`mh)lC zJ?B%`h{)DhbR5oyc6#SRML>Rtl89&2FG_QIstWl97zI>?HHC5yHEQZlTXAr!56zxL zFzQehx<)n8tW1p`#q3`ZBvgbotuBx8^_5Q0tLm1H}TPYp>6w%nk}2sJ$>f z3q2@38a;ISE3Jdgav$*QO~}zP`^V>=4~T9SGhYf%UKTY(9*Oe^Pb$SH^fNJh+F20_ znz`3;Nsj^?3n~`p7bg|xKUHRMY<6!Uk8rFJ?mFHVPmm*%jek zIR{8L1dX1-V-py)qK{o4($>CbMUFzMCJuen0HhNlsdy4QYGUuj%Py1LAV>^j?&ir% zR;jcW_|$=If&9hwn&0!IJxOxDpJ24=R`I7Q&Cdi$aLGsD1DBEEqOX89)G3>$OOYSoRz}> z)RGudWCG(I{w;HAFRv9Y+@Y~$w(`8Lji9}jXw=z5 zHHfsSj8iX^vryNwY^L%<#&Zp%Xrqb24V0}x=1#7_;jfo7f^dMs1!v}NIew_iiVBnS zy$uDO9$rvXZy9on)1cS~HNlltgNSOHBmGl zC#1pjs!!GVkC&7e-R_-z@z}>r4i=TqPQlsKnrA1BB1gu%R0^wrY6hZOjeP!aJR50#5{)|#YE^WIf|Q7c%QBGWrMLY z#!2oKUxfXpW>j}M>%!T`y z$~Yn3R3gl~3}crgbu1&HG!4~J6X@9&VW`t@0KI7~H}zL;U_Y}UHf*K@X=y?FxJ%(e z<3;0_pauw(($Ke9w-x9u^4Z%W&~Z=CL2Uc6AzyeFNmcH_zb$Pb$yX~n;*35tJ(eR7 z+tn49Zwsj%p&6ZnOwvCjIQ_XivF!O#<&!Y3HMri@Kt%8^0o8wHrNWrcHu36(ZZob` z3koj3B3Uz6WYQ2rg;*fa7oB1#WD>5giD+Cz$3*p)9rOJs!T%)D(`oLM2?fjq@^_{O zIZQDvu;XsChf47}$uI^1k*(wRWQ;6>fK1lH0(o&1^j^Pc4A%f*zmm$KLv#(IhsCe& z$XiWy0?(h0Q9B<&ZW%PFrtDhzHpH!yIFr-*+&r-wMFku*GX;$i?Swt5(Pm!c13?&e ze~TC*U`+?1IGT|WTE$+nCmCu&RQ2Cm>Tb4>W*c4?#fc;8r3122F3K5pMjSL z(O(1?th9vF<=i2>PoWb@;-!~`?Y^dRk58eBB^d;l<4WUxJ$9-_P*>r zAEZchccYX?jZmg}EtGge5`rNZiC+ZygU}gY&eB&uKkq*PvCmE~B0FM4l4zJn1nN_rb~!o(*@%#sc8&ES z0$kNkz(lqF3CWVxl?a=xRn;DEt0E|qs4b%=QdQc|#o9aXz4qaou92-mMO`13##iXA zD=}BzrxJO%qn}f6Z7dNu94*~~st24PHIs?m;crY=#8X&1?0T6B<+r9W6d(UiP#>mF zZe``BNr^{9%t=;3aa|m1cklQ6V030g_hH=Bq@q{FYl5r?e1GLQkPFnVNbYh^ZlK@j z`4Sd|LgMbJ;S(tVW-e|nDsoQ(QU40oRfX~f8E_JmXuA0=?{6fPZ8BHPchnRPGlN&A zJ%M`tL*1hLTZMT#YadqUi8bXvf3Lq_ywbq#O!Y+lWsSPu6@$=BaKf-4S+tRz&P6O`q!Y^}+0Zt5pL$czfK<%&_-Fk1g4 z_+&NQZ^w>u5V^V8sa$Rt4aoZyZ|^;Ih5WGHe5PjtYwGT6WfCw@>XJhTPcJwS27H(6 z4BJJYH_ZyK`2K=e@9^oM7CA0uoB1@DOVLYh>k4TcPu`qIoNZb_&M@f*|3K;L~t@c?d1I&SJS}Er7%cUXxh|6~U`RS&^$+ zfa;=Na$mexauqUE)gywr(?Jn{x{HQ9{cs+i_ow#OS=812M#WWNsZF15V#l^_`O9MV zxH-}(yh%lDzfhAp8yUdnoVNByVTRpHv2K7$!}tclk$?0cGxca68W`DMiKW363g#%< zs(#KOO7(v)f$9&crCktS=lb3(nqD1L=waqPzrg^)dGCG2S8S}OmTniE?E}&=aQNcq zPd-!&lny{Y$OOD{ug9KY0pXtruw{OsO?OyskU}O+?6VwA7rsTe!3Dd!FKK7T2En2* zs+0NC0;FGt$W*q4XO?*-^O1#ah5hTe!03R09ZJPH4Mu*{($3^7P{}|{;b_#Poum2C zVd$8{2#oS3Q#Uz!m;6B;SCTcco8q4hrO$AD$W*r>EwAm!6i`B%(qI`?s)jGiLS3MX z3PpyuaiUo(cmP`P8ZP1eYezr0PyD2~IG^wfFIe?pvm+$h2j>i`$hvL)RU5$}*t`uqJ`nU+%*D!gNp zKUJwV3Nn2s6W8|SQz1NVV=$(^*(h@v zL{(@Er2-n)Jv0>;^Ci}m7o+BKyKu|&&IS*OfEVyg*3Q#C>ZNMa5%uipGDnPE*s2N? zRYus6g}pTA7JjTY>ZU#Mv;rF%L6eJQh!@ftV?WR@--%ByiijF_>KMJ7v)pL zg(_Z~|G4 z;=q~+nL3iwEe0wi8@+Fw1Mjjiok%oE?h3cu_KIVNL6Y(-wm=w|;J>z{B4r=yr-5lW zc!Lp(z=u%a{v@JIB~8TPlvy*7u9z6iAD?EclW6VLr3C`a7uK+(nbY3zA$8mIxqgtZ z;_3&FU0(dfiZZ`dpVU$7XXNU{_0b&w(Q?7iD0%_tR}9pG4}D3c7}+4+OK^GQQsgAe z8C!GoiCw}i#(V##(Qcb)8uZ6SmL0*ym<{Da`V61c;lc#3X=f4X&|7G7;k%>59et5u zSx}^FVa%65ZNwbb3cF-~&_V09o(*^A}Y26JJ0G_h>Nk z{7wFypM`3=3wa^U&ah5$C4jH=%@m0a)T8C!Rp|tPB5DzE5;=}D*GW7j z6X2TA6J4mrTkraxQhbJB=|#tu%J`}de|l`XevB1VGFT1u)~Mki(7lKj#_wORK62gM zA+S#%+ zX187TjHRb9sWPOzVF+x8*A`E0s3~mrk6rl@P(%<(Ds)PE)%UpkHg~tRknXk7Rt#!p z@3?x$zcXbfb=A~yq)d*!-HjXE0&Ci0#ZCr+7 z)L1)=KcX2URLbQWR`ton!y*h#B9)cZ2-trvvKMYx5sZB$D|8irJ<$OWWf+)xAp3uu zh4m#T$*9gNV}Z)JUeZ{v2EVVQ@q>>qz%X*0v!*A^C*cB@%)M4Z&F9 z#97N4#f+!m)xsKyES65A9SK@@!Rwm=GY@a>1)Q`~!lX^-x zmtlqDJ=1>3vR&3FLYVy`6(HZ0;1a% z@y$>d3d!fjNKk}s=a?wx1S!NMJPdpYGc^g zO0__h@uf7em@I$?UH)UcDQ%k<0-hm;vbZBRJ+7^i%wM5|rCFpM2Kr>^=UQzzG(~qO zKC&!zfda6+OT7Q7TfC_Bmmfm4!xlUyy(;p?UQmdVpocDE&N`v73gItW^iE>>{2nJs z0MgB}SSNVmhf2?!exPkU=y6J=PTpK)ZA3$*$74_IGq%a`Xi?Z7@i*aQT3=azq$YyY zgS(Z76L@k(?O|Xp3SeZ#d#UKNX=Z6%6KdDqFe(@Xo0fQ&X;;K@IT@<%T zHTTk~7)j|I^@#*sq2G+(u+6t87A>*TO*V%@cHlc_$Y@o zvS&))*j;iyH$HX1p^u%Z_N{BT4UJ-u6x+UVT4>l(NueJSvrb=-brzijWK%L~Ty*Nj zclv0pg1(P9SFv$>mf577%iT%!67Qpm;5*8C&PtQH5Ic|@!JkqwR?V6xvop*lhL(mB zrq5$&{HnI2DDt^6@-O;^m+p|jML5gM!HyG#hmVp$SC?$zm5#LDiMNuPIwVtRKR#Wu zSny)nz?X)yA~-TrH=|?R4%iKtF@ALHq8bYhk@`^7yh_2p!2@SViea_+D~FoG>OW!w zgGjvbcds=1`$xXIXq09Ptd`5XU9|t`w^ZFd=xDgUu2@x^MR;c-n0@?|I=n?Mhn=`a zV^x~;*3V_9fb31I*1)A8oP0Jv*S!D7Eu&%%n_1!iNY=0sL4FN+SL<5p_Ol~TDd zlIHhk%M7YuBoD_*EyGiuX$2Gso7l!EP%b>8f-t5j0+=QmA+v^5vwc~5MGPp`qkbv^lF zWM3#d4?MVs{HbU4Ti|}5`-+#{Nn#(x=Ie}4nFb!defU%Ktd|%7B~eaA%fiIIOkh{1 zxq)gbM1~!Y6PXJ9RiiEye!>Sw|AKkmv^)1uSd!QTXhG1fhSr{QxRrP1OVYH_Q;axG zZyJf#x81a}9X5H&H#j~&hxP~2p{3kK!rnA-xJMgKfDDL)l7X{yz_f^L~g>j}q{OLpx! zmIGGkLlfP93K<8zhsL=y=#ai?{v%dd34hyf&a|%?M6|FI&}ZE^O^K-DjbNl%A|gw4~gxQHBw#+Ua0-VIzU@*(h=T{2eHd zG_Am#YsB+z)Up8>iW&O65JD=aSt8`jc5+kPHOmcPg#(g`qol%lvGP<}9#LkdXDZ#}jan{YmIKXA|o8+f}QS80dX)|{z$9;oa(hdbuy`3QfTf9Yfm`w zECnmDKuwjd?o*e1Nfp}qY$IGE9R)q=J;T>>=n3rpRx5j9Ch2L;_d>$BQF_Sp4RA_Bah9e~>vcpL7p1yM1eOFjS15E%dlfw`Th$0CBj)c3ycY}9qIJB-EO#rQw=n=TjZ2TnD z5S?UGH|@<Z~r^;F=7PT`%2Rib0}tYaQK<#;Cu+K`g5m(<1oD#YU&05{L(=7Wn=KC>3~$#sz@9 zv=bCcSf3$TM21W2$qxmFNfH1CSa0W?S4j-jX{4kTp{|5%z+ax!u@>TSW)%0XGiQxK zl*63km4eEIJEJ_D&RY&8O4y8sfjg4eXpbzM#Oz84=-%dFSi|J;($_{B@)g${M}?#* ztqt6A#l1ru%EqG$2FlYNm)<|9h8MAj*@cF!t=48MUmURjQA?HRckSsd(&g>H3Ad1D zsct}2(z!yQ9@CI4Ov$M9oH9$(>Ur-16Bi#$S#tJ-Mu+uu(x%vk=Za~L3$Ts2I11kg zyb(%e1>p`W1_Aeiz$#h759qF{hfdunvr7ek={@4{Cm_9kd19NM9x z4(Bn_;*tUxltKJkx?a&U<01vr6zhaPZ-INOftoC5|Z=-0!BIbOURs9Nzg z{;Yu&^aQOrl{)r*@sDOZ52dy(3ZQyBQ=M$?$0y|{g#SHEE?(*CC2Sq$OF4{xs|a#PBl3mo_3JZK2DuU@$3qlE6r}|(QPU~tT*00#s&u(?=BwQB<~z(j&lEA0_Yj3o za^0YBp(3ZU6zM3K2hh+|N5A2X%CacbeL##r5*o_g97*~U7RjfZoy6$i@uht0(_*&` zKYO-}UFS0bj+H@C>d#8#WXoAqU>5|g3)BCHZYf(U8ItHh^z$iSndZsE;9 zZ|7$6l1ktRpbJwOALKxymsGFoL>E?(2Q%^Dyz1$DCIa?Wq)q-UEZ_1fbchTnWvYeE z^RDT2Hdb~&RldjGmy~Zbd_Baf3j0A$;_rkZH%KmlB4;X*oH@4HWU@hkwKq&%og(6- zcP55EDrD*|=q$rBwAWLZrRLq&PIn6BspQMXNmmC9wU~_JGb44t>>z)>vq4%ys=?32 z&x{wNliMJ|Q~P1qG@4R1&;l#JBr^Iics7}}?>}I9G=?^#g8DPfJ@ypM;C1L~{`ohR zkVnQbXzJ7Uh@TfQSrQb+YL_;`;pgbYsh{1JH9SDwFczBv>iRgLn zw%9XFBvhzdufjDi1>K}3S_A#>h{#+m(ge%q*gq#^Gz1^W|SU zp}KkXGju}@ED?QGYSO#gMQ$h zHN+9|`b1`8HTC-daFoT~5ugr6A*&V=D4uj9ws#qj1+W1+&TE<7y#qIvC6K#llpjUF$pY4Q8SgaWwQQ(ifArH_a zz?HB&5;udGi_ZqL!{gmH&ooD1o=thz>wQl0%_?Sw!)m4exiUPYmT6_GOx{A(sO1Y` zU$-y+{}=iiOSyW~NRSPcR&R7qk0W%1(=hF?oPJ0Z#AH$|CRZf4GCVMlFv!N`JU=4L z0R222$oP+AxT9(Sv>B+452sBK0*C>U_Ti6yeJecLv*}AR(8#-Lh2#?!%l`MgVdlU^xJ=8e~!7BkoM^peTC@8z`~c(NS54 z1r*@4@@90L8Etor>@q6e{7;d>!j355ExLGjg~%(Q#xAe}qD#qF6Xan8F$iK2$t0x0 zRt|^dm`-o&sD#>)rLc_19m$8mhj7x1TCKvR`LbQtH5j5)#Rg%om^8i~EG`{Se!C=wQU*zDV8m< zmSk9f-37Yz|1abm|2z=lOaG$R_Wbwgm--UJxui~hiBYl;t?mY0)m4zW1@zXuL8J5>}{75!R(V!%E81T5C zuV&Nfo4n>#|GNQjIKn*V9gD&pT})90F$*42l=_M#Y683X0eMz}%-zIDfVGq2ZUwMI?Z1}3=>3L@gE=+@)$X@)zF#F$pjR9rgdmPw77Fr?xol;IC!GQ=( zToAh4r41rZl$58Q^U}wzDYl)MzMJ%+r4$PdebW2NU5w?KTk9)^lD>UKhWe>|?^=BW zk;uBWpux#$ZRH?O5*MgiI^Htv^d&_E?wenL;J}*^tnwq;ml2Zl`|F6N?+b1ptYg2s zM@mzkY(KNZ0I9zS-Cz}SFJvWphagp>hg$-PC&lxbqlq?px2NEKryyX-@d3WCZQQev zca-Q#lx%^}&s^r2;GJZgtG=~+ztWjI<6=%Kl}tuOsZbk$n7@Q)0%QjHmn|Xoe6?5Z zp6`U=Md&$Z9S(VCEMu@=y#f>sM^?G%?oT*0pt}|rsjO@zk`ZS3 zlpGkFCuqdrpr$o`yfw?XS{%Kr)(k-t1T|b0I^I2B52}c)nBtSU2AACD9u*hr5<|ym zyzBQAG9_i9)#PxuQWiY4yTHuB?4^3_pLP0(y`KD_GDTF;scCsTerG?f7`7AbGPi_C z6U5@5q%kN>&$euVm&p!JEWRnXciu3ax@#FUeI8%kG_@A;y0p?Rh?V@N#p78La9t{Y zYsoxmpH>FOD5JqRRI&=lbunAvDT}ls+?4ra)ly3l?dO-UE~!hbF9uS&*A_?CzG^aw zEq%<}lk7nvZCX0%>B-G-x#$UCJPba-Cc8}9B7O7Pk99P_U zwj3i8a+H({E36DO!f+!0nT2@VNG2^Ui4y;#K4sKh)jMf>uz`dGrRcF&G=IskN^=c&>Y+13expH$L1^#(> zZkVy6$7+GrmMJz?QxNcEBT`Xa7sRIBG8|Fs^4*aI<4$C;)RoI$bdy!d!I$tk2>QI0 zRl*205^E&=)x;2H`=K3tCe<4zD!$m~+$Pwx%jg!zmDSb4f{3jn=wM1{>ff3*v9Uuln;)DnP8 zK;Zg|4mXtaHdOePr_vCXI3xFQ_~iHih%MIkM@U3F8b*0`qmYe0H z%nhu)t2pgEiW#jm$p3WpqMZ3o`myhKqd5K{mhyA|g;D`qh4oAL6$N>cKD!y8Qk1Ae zn>6j*sDmp1m$4y`#Laz>vEo{JV5RrPohz9I6!35=UH`qEECF2@L=Ha^D9j1H zp?C@5s%(+{0*P~r5*GuqX6p;O-%~oYk5S&yg2qvKOS*U6VRM20=O8Zu^Mir z|0Cc075K*VmEhz=xROAX>Af#vqbsi&W_dWij`tLHRxNx<%1PhQ^o+A+TYp=y4P5$- z1*ef0!_`!m=-9)MLB(#tnO`s0#f_$2AaC2gW~FW%_qf`H%U1Po3Pc3 zF?$)ljA>6l>yRd|B4oiJ0vi3SjuO%NkoiCpbno0$uh5hfcllp2(hyDlkAY!*ygT|o zcwt7Ry8e|%=I3%1-U@F4C$g7V9$wLr#5}Bo-d~tQ5Qa%DB1*KG&OwrfuqWa!!wdEk zREP99qm$@<%Hu-nrEYXC=1*{HH=IXrRH<#BMg;+BfP#C=GP7 z%k3+_2fMiZY{u(+TiN?MK#8;MSc8Jgf-f6KV-b%!1HhgMZ)D2w=lxw^`fdI_)Nz4U z9s6xbF`-k{$mG?v{1}rSxhe2Pm%k%l<2&vNn)@TmEC`d@@#MsI2X%HVs8+UEk!M}*65)aF&^;&t<>^2HC{%zla`=0;yb z!r0Oww)jVQkouq))mW$;c}x;Trq4lBiz#nUYR5=xZNS0I1h)3}h}>Hjeq-?e9d@;gST|9IH9Kf5*2m!dyZk%8}6)8>#6+0`!;-R9R&7fze z?V*|dU8!ym!)Y1agyg!$wfOk5k%iLB5D!{0n0#&Z-d_CkpVt78*4m8;w3W$*YW0z=<+^+#E zB=3paGL;FFb&{6i3JaElvopckuXQBwhawfjuS&s|#U2Y`!4iFG`LO5_$jg~(DIWQG zBKW(4Wsn?SV-}Nrs9e&gB40*-p^55cPxww3MyJUU68lK)(7)aP3{jRPyX=mk*(*0U zq4F&z&aR~a|L8l6(^=Tewy5T^js~LPD1u6;vMAz$<70-obB~(D zm`7c`{e4Oi;M(L(Y#CGeb%uQf$^qzmnbo7-lN=2@FR|~r7{DXtx<)k=DaxeD4{C#j z;!gBmp=3E0z93$X5|TU4Oa&cZ-ggoUn@1P@#9lYR$YAiuEAgE0?xlU%sJqWwXi9Qr*L-$&QQ{3Bi{5i|Q zoi&z{JLI?Sx8-Dka}8$Q0%`)GZEVaLxgn7!izcQ1cAKlhmNZ0JJX2g^-7w-*%K&n4 z0vGk(pX-X;-xumhNp*fr)pmqTK%UEONV;XK^j_hwS?WSTg1pUfQ!3ruLRF+Siz8x6 z%}qP&n1~N~jSf7@9|CwIy&?1tdy5uj#w!Z`=lkS?z&dSjwl_S5%O5CCTZb*o5P9Z* zR+ef(mxv4d@gWxyF>0ysgnavD$AP!mrGrSe$K?6wg z-F9jTq~i5dn4@_q4Ea-xi$!4vCLBsH_T>Xf6gQd8f9zl0Fi#s%0m$R%SaJ(UQF^b+``QruwC=T4qeK zqqkc2xgaf^T9QQe0nLaPN{Bn7e>FG~Q|i56i5_X;28t6O2&h3#$S#)G28DQS6)LT; zkn>|tSRp3`25EhHYm{~o>dDw|3W;$g?ulj^|4FBsv=Z&%eb^}pL-{Vs_XuH-l+;+q&{#jr zwT5Hu61C#i@duI-?PCoTJZ@ZXY`*PjpPr8M6wKht^bpJk2-p%ovhxMw8sgGgC%%BA zujZA1wT1sr*AHnZQp_+|m6F5xhV^Wtp~N}UDhmtd?NQ}*w|fOZh!FLn^7rS$w46jZ zy$kNi=(qY>@E}Scje#45+Z`eI*|sl>F`0#Iemd;M2?SY{X9&)*!kP&(<~^0v*x}ZX zLCx2jZwgLI&$p4k$KsKzP2aQY-7WAF8&t0?@GcYzcPU|!<%-^zP zzph^P7%_>-{naQ~r>K=rsI5a;hRp*aix(7;pJy#E{&y?TE!Nd$SW{Q)Hz(S+NkZb> z;%JoSbZMyZYG=#Txl-$!B3nG;VHpPYPsiC1UH!5fwI>dgIfDUY6!+GR$U*jG){6H+ z3YB^ly)Vixv9dMk-&m=ibhIz;HFd>J^+y@tC*uuoKz}*x#paK&hiAX$Y@;Lg*q5v8 zBl_>c4G$OakY$G6{3l`BzZxn&W5IM1DPk<-ys?{|v;J#PId&7#ZyYXhY}UWVdR?0% z@M2}RQ}M}*8~Ph$e;A1$<3)*7yu{ zd?{g^{m{2|ihC5f@{a<2huSUn1j`;a|M?QoqA&lHPtIe(*K`IHpT~WykS`*U8Y>)0 zDtbrSo{*#7hvMbgd_e_BC*H-g_CJq$y@*?}s8#5`1D?e3PR}HD5@R-ftKB)FyWS6K zI{n)OPuCle8@+|v;i1sJWGs*Wph%UOlmXdURMA!B1p{P|g#_3}5UiBY6Jip&5ZJ_F zu*y$S1lg(+$ZTnwMbIlfFB46ESH$`z;@SF2dJ*VZpj>O-Kr)5Kbfc0|nL4HM*cRz}M z-NwQy?*Vmmq5e=!oB6D-GCns1p@^Yg*d^9iRswZ$EmsP^mMUMM*FGYx)27 z2#F=CCv#2V;0D@{9RCZ=xn)lcD#;9V1OVtW*WlRH-;;%Lh>djzOo@7@IgXD$!jkzK zi#hT~WnsM%z29pNiyZPTXjpCE0-A-^%WChHoA-UkLJA= zh^lDd0xAR2Z*IfD(_tfjAvgX3Z_J5pFj1*T%)N~~{!qM)9-E?JpW!h(#9zLu=%$DE zVTfvkA19+le!hMM2P&cG7Q8aCE@f%PgD$A8Rc&v=HJU{N-DrC4vFuRKiQ?4hswlD4 zo}NTV=alr}=xy6Yf#^sa;ix$nFZaM~|BSg!j=@a9F1pw1-xb^~ z8U8JWr--lef7b)|)8A0z6c1Zr75;LvOXWLRjKX^j$t=+36!d7+LIG(QOqZLIrDpAp zIf#;Bpz?Y1rU4$(b}g{#o23*sQ|Xc8vBow~X7$vCfQC!VC1IVJ5nnDow@D{12Nql& zQU*t?Iy(%eoDJ`~NK|#0a@z3m@T+~4*3Ek9{x(f6e~9-ZjnSGX7io-B#P{(a6#uSO zji_PPZqWuPn4Jp0$Vual-49rA>tkjrH4)93+c~Q4#52WGo&1F4+6dX3#OgQ{CBKsD zME_SP9w{W;Py+P@Z`cye<8;eo)E78^{aL_%3r_7!NlBV(9L{YA^CFKuTT`p1jG>7G zq*`szkORPU$k(e=hq_=Lzi+4aQuyh<+&8Tj|7nOQO${%=5#Q~ZZYKkp(Bxy`hTXry z9Ff-FGP^*R~o?($$NfTu+x_ohqi*f zZyPktyu|rH#YEZAEfmy%=xJWzT9P7t{2C=Xb4qg6jJ5BV=C*H4dm|kFZ>86;FIh5bBOd(-c#2$oT%=3b~wQx9Cy6>nV9Am0?=IB2XD{a$Zn7O$sy8ym7 z0CO!HOV{ZA&4pEBGc#SpY(m=mE+4k5leRxM5Dx~U^Gu%kHP)O8#i=fC;YmmUN59Gu z5u&4PXGK)a^UOa43-NY17P@|w84k93A25N_In{`b=9c%c5@Wb)MEbOLU z-H_e2w@%BxjYl?Hx7g1A*<9maT1(9Sv5)8k3C9)2`iryFCMW62MKT27sl!31M9N0R z(ac|1QE)$t{1;={-Nx&^)wW$fJhxogyzgJvot2U4KGq|w->O+SvFmj291pv9n89Ra zTR3uE;9ei@KhAqDnYFpt%7Gk0p=3gpQ=e>+fM;;B+>u}o8P+0COJ?HHpVLu7X@8-S zW$k$Ct{<^Yf->27{?H$mkWmz{LjQAmbN^!>e>XBNwy>}$x3;qT82`XqH_bGEFlFHz zQQ&i?T{O!sCj)}CG!*ib_@BjEd=&v^wp?Q6!rtiUX9F=xKe_fGQSb;GxW64gPH)ZT z+s=>>g~xS{Xl|SKFy+s6V!6tPr_JN85-VwaCLCLptd-f61_D zfG;^jqwFptM&u%YCr4h?W7Vb}AFQ<5za)vboh37Gn=#$jX`$WrwRUt_-~iy;Z?EkT zk+|RaA`#PZT;HSYv64QOJn{Sn%j;5%yUx3-xb&`AZJ}cGwHrlORJL*-$a55m!<}I3 z$Wev^Srw#TZ5;Mh8pUets#%vUUVy;+#g#S1TA;U@6$Sh|VV}!GcB}YX)w5_pQUGd9 zeMTAx1MCfVC~;G2tGlC{!3g#B%Wr2$yXaLfouQt(s;h3yon{BFz2gc^X|0HinM=l_ z=_wTssNAaNerLhoXB-FhL^Nk#C?Iq7%$m;N%=~V7*Wh?{n?a%1gkTm}`Uje$|x`w^2Ig$Gd;Nu-Rbkf&#eKvas_#zlwoF^0AH?#~gs3_#N`%WKR@=VDtq3b z$<5Z$YhQ1ePJEr_fHL#K+$nAUi{NGvRgUZ(W+AP*y5Ls@$v;D&GnA$F@0dFw7Hjsm zFPAN;F<4ZFMT617{AZVjlrl=_7Zg~710_Ekd5*dJpx ze+MJ-!)d5Z0Nn%pz!VQp#R<~(Vw$M_^|=v=PEmd@v8V<63IX1L9(^U~%5<51fC49UiTk)rqSYO_SRrmZ9g^XPs|Gj?n$4x+v&Z z@{~el1G#C4b<$6&sHGyAf$K@)>J#67Oa`VmK>0sVHx!w+AVzV30_Z>=EPb0SvFJ+E zBd3>D#4g8B^+wv%^sW(Y9AvnDqu+6Lc2*@m!@daNMHp~}$gd*;eVuR^(dLVC!S%t(%&2cjK@ zY>{*F`GjC)pO((Nf;PPw`I=4!5tK-j3J6^#c;ncA+c zpZkd5>w)?VcBOlXcVDT3bWC028vXiV-7!*h`nzex$A7$na;{K#R?~;&{yHwUh{#U^ zXz&B=x3)1&I{7>36>ie{$s0#+7>Ks{p8VW0aJej3w)W-`n=(fSkN)y4cjU$uO9tJ& z^|z+z;lzo!%rzz$I%})9w1A}Ir!_mWoGCwnA@X?XbURe`JDc>oNqK=Fgh9wi@xPtH zB#voy(8epLuhW~`zSZZ=vKe=`tHLeMA@_t9mSu+xuqiOiSB^t}V=0&=p@m^yw`OnQA=i|mf>9C4(v@@`A#I(lL1|b?{SfBg80Luj= z8?^cMvdW&J2e@gTxn82dooG%uUJa4^xr>AY{0nhJn&Wi_ zixMrS?omv-L@!RbW-t5PG-=o5f`IWB>2cpmVPYaHv%O4w(*0R_!#(OhEAfO zai~eRS`b3$R^TM-J&>UlFgj?oD+H{gRGah~^v_MfEWb*BW`&lq3P;uY%+G7NgtUpI98u;iirlm~XHTX^RMAydDX|Qa#3>xOCDn)^wKf zqduC%={|=Au_y+=$_`w*3gryfYX>7Y1^iYTu)}0}J3CXM=~NR+MqS&9y?SQ9!%c&M zwx^lHO|5^~9-+FO4^8|jV^>M$WjaA_l|#BOV%Egd6VZqfu6X%Ia}g+ZV3VKki_#fw zpJ2{BM?KGyY}jgWn&EgUbGl>Y5+$YTTV3kZo75p&lQXeHJ}I&Kg)W50;9H}R1tzo$ zhcPvq!;1CT@{pV$@%1f8*ej}Yoz_}6j#$>3{T#Lhy&L2^F_}wkUsda%8+kCB7t>zZ zeLX%pn_ffYj?Ra_SmsSFC{p&+Fu0@GytU#NiTtyW{gcs<+8PS$e$A`bEox9ZRZKAj zQ&U{kRAQ_TswF*Ocg@PSa@gI%fk`O^*HoDUfS*1|{}U>qyEO%yl_TlqrsTfUj)Fzka0Jq4b_wU~^)-NG(a^;QY(Sv+k0(4DFW7z}2I#+I$kV-l z~XH=94^P6bHF zuCD{u?Q%5Pg7=U?Ib#(lR;%Mg=+eL8b8Dar4#j!#Y${wXq6oHeHR?5rX-26)i zj^3}GOYadP3h!YpLlRk)3T5Y-q8ZC%<-SlV@$cXy$K)_DFtWmHG1a5c3>waIHQ*90 z5xMAYZ?c-(ak{zvy0?>5LD#^AER0TZg7s}tU6`V3CYNtXf6vFDlp}bjobpl0$&dOu-u6+*sG6_NTBjdGw1xz>Ub?}Nw9!;A*?~Ec!=y5Ir#EN z{M)4mh|epMvfEnzB8aoGg9E+GwE~O-kiu}#>P|)-)Ar&ZUYhg(Py8oFT$2<#SRWh0 zo5lATX`2}$qutt~i)ReaYplkfwbGuKrhCO*IBMhZuaF%!E4P7twMm8mY`h>T3--HK!2yfJuCOv91D*uW=|n%of4k%-WOPVm=Pd1ODnx z5wsstzOE?zpV$E+7N9W&rJd36l5f!5iAeXP99J%ke)Aq zqzt6TRO68K`=3O$GYf1H#^9(rgk)Vk*|DQ8DZA8Gt+lto(1gWuiL5A-Yqg$1M;$Ce zTo@VKC&)mJu1GN3_2Ehv-od#Tn4=;{u}coxRig7L7FzoVeqT(!d>6}dXDq&LEo|xf z5;cfP`7=r}>$j{Xc7u~$pc8pR$N^o!4RY7#G!@`8*bo6hcy~#v5EwbRRm-SLOOUJW3r{?iuI?d7klDV^jcw$3{tob0PEL2afg~K~U zsONOj{6I)??7_{i#Y_^$c4Z64m4)F<`u<9(MKE-+*i`1|g);r-YaY{##(m`%vk-}d zwQyFtqR{rLUylzy74@>GqNLlmqsFBLOJm9|bvKDz-*{2S8>e`jqnVHIX_(iDCI5lrz3I+YG$HK^;h*Krs6y%T!6p2eLuGKM&8w-fxG6|}Lts|-6PMZIinDVm&!`?U>-yd(Y+t?ObA z5qBi!p*RYPoK3C%Ddahy5GToAP+2`2bF{XZG-TAmzd3$)<$_-j>Czt=p^zM0FFcOP zFJUFwWd2$}#;fli$i6;rj`QvFSCFfRR$}PHQ(ya1s8T2MKw?DY2=lowpFlW~Z3&ay z%oRx|>w2DdXm3ygadu_K1}!tg0J*kWVgZmiGn#dwn~H*ux+PxWV?0b{sqI3z01Ejt zl4&e8YS2LsYpt$*6Vg7KE;^_d-)D8DZM7skQt0Pyw6=j|^IYm|qxDgtRl5uFhKcgW z%Was!Pga(_TNG9?q&FqHzmQ3Jx;Oggqp?q#Uf8mJR%F|pIVCDnAw8;+#CSwhV>ua5 zmpinP?1h)JQ!sTN?zN(z+2!#EoIfB>h{ruMHwsNO zL8@sHNAxKOky@A|%C;cRuA-BdIgScDS%E@bU!C@Znn8s99VW|5Z_kad$`7m2d@0jiqxkW ziO8Huy*iuUkjFR!>4qqQ<(&X79n+yr%PT#;o08+fka3_um2zh-*Lmgfme@X|;a<1I z2BB*4t31+Ib*B#y=MgxJ=d=Wlk?1$L(Mde01YIqqJfM>pgYM$;nrZ2$5kSmuLc^pF zN%XMva0sS<^zD8STQ{c$KQ0mPi4*4X5`w>e2M^ph$v{s$N^uAm5H?4NZb{-jCp+E^ zoSl;QL+xy)KWNfzw3Tf9FWzKJnTu zZ7SHrV&g~2WQBO^BRKg#FTQ}nnkC~cgK8zL&U?Tki)5;5YR&dkT8eSSy5RPF;}WlO z5Na?m;A>C+mM^*mV5bqJ_W(E3=E7B(f7lX>SZZZ|Js;?Ba! z8LB?Q-;kZ6gemrm;_>_-kqyVivJLso!117Wxq$M`5>UdG?$5>^A<<`!n1 zJ)g?+q&TddEctX$PxZtbXQnJ6%P6TW}~(uvPU1 z$;xJWZ5>;pGv!i`dr{zd@@no2VHh?x7xFHPxmU*$a6~8BCkwkko&i88G6*5nl#Z&n zwqK`3aI&^FvP!(Byly*^h#qpV@fd&O{`Ou95vQ@g*p z-Rb9iYv6xYbN^lye~HDdf2qV<*jrRsTigHIaj%Em&(6K~7ndc33~7vMK4Bx)pA0KI zJG(o>7)0d`SqwV&U89IXEGj?<}5TK)g=pppTe$_v$z@omBgE_rtH=0tGwi zb*-=eJ*aQHl8m%w&Oj7@{S$%9b+4vZ0%bxXQpf^L>kRWl$!zwPDlxod|mg_fP()|!<6Kh z@@FZW!5>TbDysr25*rqk*jvX_=#Rqk(qJfU%s+gZESq2wOqyEhGR4*QX>1iJyV3nZ z`!re_Mp>I{P*C$JfQC>6u~zX8C2JE>h-LdLKI3R;Z->`Efs@?oxq`K@={Yok=qY%i znl`~G9Iuc`yBukRzs3%wwIarJ3*b;hUBoKzjORaCF@Npx-n zk^BwR!o*+()WcDOjT-o3-l;yO8d4JWjV*Vui+cL(E{+c0Zq84iUiSymdcQ8n>+4(f zGh6F9uW{eZH-+HdHJJLvHpcoUG<0-5E1@jsqcj+z)?N#LE*j6y|I{D#L@D5&gszIOhM>4zh;2aC@RKs8993Oa6JQe&-^oFDT zwfz5u6Tw+A-h|b^y5Rogj}Ipf^*8SR{!f1jFZJ5l-%FpY{QtJsuM2;}6Q1>v@c&vV z9u0STeDK4Q`0tP}|Bz4h*td_o)1>>){UC{3bRd#j0Jty! z0LME300Ir%nJPM3*h(EWHUJ<1007g`z}CB^wy)F9&$qhs%&57h#M~}qZ)11>Q)V>0I>6LTND`$84S@;01*LBnny$U0y!^|X0EPfDU!R}yROQqs_+{AIUl?7A_GAE@Bq%?$BKX$VsU}_ z^DuDyVElgr38^4pf`9C5|{qaBCz?INi+MF1F-dj+0Y+-L% zEp%yUAe#gNCz${O0RPW*<-DzqN=$w}5ccubIjQAqSgV5`KHM;~C+u{I9B?C|mUQgI$6~M|Hkte~wi=9^?x_SZhx`O4 zP}$ai+w@DkC|j2f5CS?gSt_z1M?2$;5Gvb?!;<$1#d?G}m2=&6yYTY>KW2{pi(@KK z0G_gIEl#eW3vq#R37XbEyrtp{8C{)1-7TVbqFAatQSlqD>4QyUTA2j`K2^@8G&-Om z`;|%udt#>Mzlu(8l%@HQiQ&*nP`|4qvKfs_;%U(oIU>ueTI)_oXVD)i%%lWF!%u}e zagKo|JK}yE8NMaS#!$_oC&Q+oPw;gPj68C49vau9-JP$^q~UUY5GS2a^;>v8wyEw| zsPQ2xU3TGH`uHH+-*ybfllfMzf?)hh;gKxF$g!;e|Al*4+u9f+6>=CoR*op$w|+Bx zIxn;|YvV@%=Y;HvNLlbkkrl509w7QY83X*yY(s4K4xo?#4<8UP59^zu=&`E~Z#t=d zd6^6UWVYPG(B52I`0xLo&7bMz$Y{*;fHUyVZx}9`?fc2Lcu^Kcc9JyHnHKmP{GR{| zn06fR&f3;+g3UKQYiplx2{STP`d2H{Ky(dIx~rEnn<}`Arq1ZoVG0hKtA4L2`oi;kK)hA^a?)~xoQk{%H;8C1?JKwsM^S;Y<`gr~&C;f?e|Qd!$ybE$#K zNzeS%Ls?k(&#SMM4Oa65mQ9AeflOR^xKLuZ;Onh<#jC|F2>%A?c4Cf#v8ICjQdxMl z>QJLyMp?YRgfA7iScn3!nV^_FUT23HU^Qi+_YCQ`Tk4NU`3k96v&+9~3-w`hA>a@8 z9YOc0CWA1=N7i+0`K#ZmIk%=7N0kC{vF5v?3#f2AP^5N?JR0iWBGsi zZ$3x7QAuVWI;>pNI+CB4K(RfM{z1dwAK_{%SQUdd4qBAODQ%0AkMCBu%Teb79*3-b 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