ReadOauth.php 83 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993
  1. <?php
  2. namespace App\Http\Middleware;
  3. use App\Modules\Book\Services\BookConfigService;
  4. use App\Modules\Channel\Models\YqMoveChannel;
  5. use App\Modules\Channel\Services\ChannelService;
  6. use App\Modules\OfficialAccount\Services\ForceSubscribeService;
  7. use App\Modules\User\Models\YqMove;
  8. use App\Modules\User\Services\ReadRecordService;
  9. use App\Modules\User\Services\UserService;
  10. use App\Modules\YunQi\Services\BookUserService;
  11. use App\Modules\YunQi\Services\YqUserBidRelationService;
  12. use App\Modules\YunQi\Services\YqZsyTestService;
  13. use Closure;
  14. use Cookie;
  15. use App\Libs\ApiClient;
  16. use EasyWeChat\Core\Exception;
  17. use Illuminate\Http\Request;
  18. use Log;
  19. use Redis;
  20. use App\Modules\OfficialAccount\Services\OfficialAccountService;
  21. use Hashids;
  22. use GuzzleHttp\Client;
  23. use App\Jobs\SendTexts;
  24. use DB;
  25. class ReadOauth
  26. {
  27. /**
  28. * 判断是否登陆.
  29. */
  30. public function handle(Request $request, Closure $next)
  31. {
  32. $this->cookieNoCrypt();
  33. $test = 0;
  34. if ($request->has('test') && $request->input('test') == 'bonan') {
  35. $test = 1;
  36. }
  37. $uid_cookie = Cookie::get(env('COOKIE_AUTH_WEB_WECHAT'));
  38. $h5_scheme = env('H5_SCHEME', 'https');
  39. $params = $request->except('_url');
  40. $url = str_replace('http://', $h5_scheme . '://', url()->current() . '?' . http_build_query($params));
  41. //Log::info('-----------------uid' . $uid_cookie);
  42. $send_order_id = $request->input('send_order_id');
  43. if ($send_order_id) {
  44. Cookie::queue('send_order_id', $send_order_id, env('U_COOKIE_EXPIRE'), null, null, false, false);
  45. }
  46. $distribution_channel_id = str_replace('site', '', explode('.', _domain())[0]);
  47. $origin_distribution_channel_id = $distribution_channel_id;
  48. if (!is_numeric($distribution_channel_id)) {
  49. $distribution_channel_id = decodeDistributionChannelId($distribution_channel_id);
  50. }
  51. if (!$distribution_channel_id) {
  52. return response()->error('WAP_SYS_ERROR');
  53. }
  54. //禁止访问的site
  55. $not_allow_access_site = env('NOT_ALLOW_ACCESS_SITE', '');
  56. if ($not_allow_access_site) {
  57. $not_allow_access_site_arr = explode(',', $not_allow_access_site);
  58. if (in_array($distribution_channel_id, $not_allow_access_site_arr)) {
  59. return response($this->notAccessPage())->header('Content-Type', 'text/html');
  60. }
  61. }
  62. if (!$uid_cookie && $test == 0) {
  63. //$url = str_replace('http://','https://',url()->current())."?".http_build_query($params);
  64. $uri = $request->input('_url');
  65. if (strpos($uri, '/yun/') !== false) {
  66. $uri_send_order_id = (int)str_ireplace('/yun/', '', $uri);
  67. Cookie::queue('send_order_id', $uri_send_order_id, env('U_COOKIE_EXPIRE'), null, null, false, false);
  68. }
  69. $this->share($request);
  70. Cookie::queue('auth_redirect', urlencode($url), env('U_COOKIE_EXPIRE'));
  71. //$params['redirect_url'] = urlencode(env('PUBLIC_BASE_API').'oauthCallBack');
  72. //$params['redirect_url'] = urlencode('http://47.96.174.172:8093/oauthCallBack');
  73. $domain = _domain();
  74. $params['redirect_url'] = urlencode($h5_scheme . '://' . $domain . '/oauthCallBack');
  75. $params['timestamp'] = time();
  76. //$office_info = $this->getOfficialAccount(_domain());
  77. //$params['gzh_app_id'] = $office_info['appid'];
  78. $params['gzh_app_id'] = env('WECHAT_AUTH_APPID');
  79. $params['sign'] = $this->getSign($params, env('OAUTH_KEY'));
  80. $redirect = env('AUTH_URL') . '?' . http_build_query($params);
  81. $auth_v2_url = $this->authV2($request, $distribution_channel_id);
  82. if ($auth_v2_url) {
  83. return redirect()->to($auth_v2_url);
  84. }
  85. $redirect_V2 = $this->auth($request, $distribution_channel_id);
  86. if ($redirect_V2) {
  87. return redirect()->to($redirect_V2);
  88. }
  89. return redirect()->to($redirect);
  90. }
  91. //禁止明文访问
  92. if ($this->isForbidPrimaryNumberChannleID($origin_distribution_channel_id, $uid_cookie)) {
  93. return response('<html><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no"><title>该网站地址暂停访问</title></head><body style="padding:0;margin:0;font-size:0"><div style="width:300px;height:100px;margin: 20px auto"><p style="font-size:20px;color:red;text-align:center">该网站地址暂停访问,请联系客服微信获取新地址:wuxinchao12</p></body></html>');
  94. }
  95. if ($request->has('appid') && $request->has('openid')) {
  96. Log::info('param is:');
  97. Log::info($params);
  98. $uri = $request->input('_url');
  99. $openid = $request->get('openid');
  100. $appid = $request->get('appid');
  101. /* $user_info = ForceSubscribeService::getUserInfo($appid,$openid);
  102. Log::info('appid user id to userinfo');
  103. Log::info($user_info);*/
  104. $back = $request->get('back', '');
  105. if ($openid && $appid && $distribution_channel_id && $uid_cookie) {
  106. $this->apidAndOpenId($distribution_channel_id, $appid, $openid, $uid_cookie);
  107. $channel = ChannelService::getById($distribution_channel_id);
  108. $is_yq_move = $this->isQyMove($channel, $distribution_channel_id);
  109. if ($is_yq_move) {
  110. $move_user = YqMove::where('zsy_uid', $uid_cookie)->select('zsy_uid')->first();
  111. if (!$move_user) {
  112. if (!$back) {
  113. $yq_home = $this->getYqChannleIdByAppid($appid);
  114. Log::info('$this->getYqChannleIdByAppid($appid) is : ');
  115. Log::info($yq_home);
  116. if ($yq_home) {
  117. $params['zsy_channel_id'] = encodeDistributionChannelId($distribution_channel_id);
  118. $params['pa'] = $uri;
  119. $back_url = $yq_home . 'move?' . http_build_query($params);
  120. Log::info('$yq_home - $back_url is: ' . $back_url);
  121. return redirect()->to($back_url);
  122. }
  123. }
  124. $this->moveUserFromYq($distribution_channel_id, $appid, $openid, $uid_cookie);
  125. }
  126. }
  127. }
  128. }
  129. //云栖测试
  130. $qy_test_url = $this->yqTest($request,$uid_cookie,$distribution_channel_id);
  131. if($qy_test_url){
  132. Log::info('url is: '.$qy_test_url);
  133. //return redirect()->to($qy_test_url);
  134. }
  135. //只能推送的统计
  136. $this->smartPush($request, $uid_cookie);
  137. //数据分析 长篇推短片的统计
  138. $this->dataAnalysis($request, $uid_cookie);
  139. //from where的临时统计
  140. $this->tempFromWhere($request, $uid_cookie);
  141. //统计访问site数字的uid记录下
  142. //$this->recordPrimaryNumberChannleIDUser($origin_distribution_channel_id,$uid_cookie);
  143. $response = $next($request);
  144. $stats = $request->get('stats', 0);
  145. if ($request->has('fromtype') && $request->input('fromtype')) {
  146. try {
  147. $from = $request->input('fromtype', 'main');
  148. Cookie::queue('from', $from, env('U_COOKIE_EXPIRE'), null, null, false, false);
  149. if (!$stats) {
  150. Redis::sadd('push:distribution_channel_id:' . $distribution_channel_id . 'from:' . $from . ':date:' . date('Y-m-d'), $uid_cookie);
  151. Redis::sadd('push:distribution_channel_id:alluv:from:' . $from, $uid_cookie);
  152. Redis::hincrby('push:distribution_channel_id:allpv', $from, 1);
  153. Redis::hincrby('customer:push:click:distribution_channel_id:' . $distribution_channel_id . 'from:' . $from, date('Y-m-d'), 1);
  154. Redis::sadd('wap_from_stats' . date('Y-m-d'), $distribution_channel_id . '-' . $from);
  155. }
  156. } catch (\Exception $e) {
  157. Log::info($e);
  158. }
  159. }
  160. $from = $request->get('fromtype');
  161. $inner_order_id = $request->get('inner_order_id');
  162. if (!$from) {
  163. $from = Cookie::get('from');
  164. $this->innerSendOrderIdFromFromtype($uid_cookie, 1, $from, $inner_order_id);
  165. } else {
  166. $this->innerSendOrderIdFromFromtype($uid_cookie, $stats, $from, $inner_order_id);
  167. }
  168. //内部派单
  169. if ($inner_order_id) {
  170. $this->innerSendOrderIdStats($uid_cookie, $inner_order_id, $stats);
  171. }
  172. //from_title_image
  173. $this->fromTitleImage($request, $uid_cookie);
  174. if ($test) {
  175. Cookie::queue(env('COOKIE_AUTH_WEB_WECHAT'), 9, env('U_COOKIE_EXPIRE'), null, null, false, false);
  176. }
  177. return $response;
  178. }
  179. private function share(Request $request)
  180. {
  181. if ($request->has('fromtype') && 'readershare' == $request->get('fromtype')) {
  182. $bid = $request->get('bid');
  183. try {
  184. if ($bid) {
  185. $bid_arr = Hashids::decode($bid);
  186. isset($bid_arr[0]) && $bid = $bid_arr[0];
  187. }
  188. } catch (\Exception $e) {
  189. }
  190. $fromflag = $request->get('fromflag', 0);
  191. $cid = $request->get('fromcid', 0);
  192. Cookie::queue('reader_share_bid', $bid . '-' . $fromflag, 60);
  193. Cookie::queue('reader_share_cid', $cid, 60);
  194. }
  195. }
  196. private function isQyMove($channel, $distribution_channel_id)
  197. {
  198. $is_yq_move = 0;
  199. // 新站
  200. if (isset($channel->is_yq_move) && $channel->is_yq_move) {
  201. $is_yq_move = 1;
  202. }
  203. // 已经迁移过的站,回复也要有老站
  204. $yqMoveChannel = YqMoveChannel::get_yq_move_channel($distribution_channel_id, 1);
  205. if (!empty($yqMoveChannel)) {
  206. //\Log::info('old_has_move_site:'.$distribution_channel_id);
  207. $is_yq_move = 1;
  208. }
  209. return $is_yq_move;
  210. }
  211. private function innerSendOrderIdFromFromtype($uid, $stats, $from, $inner_order_id)
  212. {
  213. //$inner_send_order_id = ReadRecordService::getInnerSendOrderId($uid);
  214. $inner_send_order_id = false;
  215. if (!$inner_send_order_id) {
  216. if ($from && (starts_with($from, 'custom') || starts_with($from, 'template')) && count(explode('_', $from)) == 2) {
  217. if (!$inner_order_id) {
  218. $this->innerSendOrderIdStats($uid, $from, $stats);
  219. }
  220. }
  221. }
  222. }
  223. private function innerSendOrderIdStats($uid, $inner_order_id, $stats)
  224. {
  225. try {
  226. ReadRecordService::setInnerSendOrderId($uid, $inner_order_id);
  227. if (!$stats) {
  228. Redis::sadd('push:inner_send_order_id:uv:' . $inner_order_id, $uid);
  229. Redis::hincrby('push:inner_send_order_id:pv', $inner_order_id, 1);
  230. }
  231. } catch (\Exception $e) {
  232. }
  233. }
  234. private function cookieNoCrypt()
  235. {
  236. $cookie_key = ['send_order_id', 'from', 'send_order_continue', 'send_order_flag'];
  237. foreach ($cookie_key as $v) {
  238. $temp = Cookie::get($v);
  239. if ($temp && strlen($temp) > 150) {
  240. try {
  241. $temp = decrypt($temp);
  242. } catch (\Exception $e) {
  243. }
  244. if ($v == 'from') {
  245. Cookie::queue('from', $temp, env('U_COOKIE_EXPIRE'), null, null, false, false);
  246. //Cookie::queue($v, $temp);
  247. } else {
  248. Cookie::queue($v, $temp, env('U_COOKIE_EXPIRE'), null, null, false, false);
  249. }
  250. }
  251. }
  252. }
  253. /**
  254. * 公众号签名@华灯初上
  255. * @param $params
  256. * @return string
  257. */
  258. protected function getSign($params, $key)
  259. {
  260. $url = $this->arr_to_url($params, false);
  261. $url = $url . '&key=' . $key;
  262. $sign = md5($url);
  263. return $sign;
  264. }
  265. /**
  266. * 公众号签名@华灯初上
  267. * @param $array
  268. * @param bool $has_sign
  269. * @return string
  270. */
  271. protected function arr_to_url($array, $has_sign = false)
  272. {
  273. ksort($array);
  274. reset($array);
  275. $arg = "";
  276. while (list ($name, $val) = each($array)) {
  277. if ($name == 'sign' && !$has_sign) continue;
  278. if (strpos($name, "_") === 0)
  279. continue;
  280. if (is_array($val))
  281. $val = join(',', $val);
  282. if ($val === "")
  283. continue;
  284. $arg .= $name . "=" . $val . "&";
  285. }
  286. $arg = substr($arg, 0, count($arg) - 2);
  287. return $arg;
  288. }
  289. private function apidAndOpenId($distribution_channel_id, $appid, $openid, $uid)
  290. {
  291. $appid_info = OfficialAccountService::officialAccountByAppid(['appid' => $appid]);
  292. if (!$appid_info)
  293. return false;
  294. if ($appid_info->distribution_channel_id != $distribution_channel_id) {
  295. return false;
  296. }
  297. //ForceSubscribeService::
  298. $res = ForceSubscribeService::forceSubscribeUsersByUid(['uid' => $uid]);
  299. if ($res) return false;
  300. $forcesubuser = ForceSubscribeService::forceSubscribeUsersByOpenid(['openid' => $openid]);
  301. if ($forcesubuser) {
  302. return false;
  303. }
  304. $send_order_id = ReadRecordService::getSendOrderId($uid);
  305. if ($send_order_id) {
  306. try {
  307. Redis::hset('force_subscribe_from_send_order_id', $appid . '_' . $uid, $send_order_id);
  308. } catch (\Exception $e) {
  309. }
  310. }
  311. $user_info = ForceSubscribeService::getUserInfoAll($appid, $openid);
  312. $forcesubuserdata = [
  313. 'appid' => $appid,
  314. 'uid' => $uid,
  315. 'distribution_channel_id' => $distribution_channel_id,
  316. 'last_interactive_time' => date('Y-m-d H:i:s'),
  317. 'openid' => $openid,
  318. 'official_account_id' => 1
  319. ];
  320. if ($user_info) {
  321. isset($user_info['province']) && !empty($user_info['province']) && $forcesubuserdata['province'] = $user_info['province'];
  322. isset($user_info['nickname']) && !empty($user_info['nickname']) && $forcesubuserdata['nickname'] = $user_info['nickname'];
  323. isset($user_info['city']) && !empty($user_info['city']) && $forcesubuserdata['city'] = $user_info['city'];
  324. isset($user_info['country']) && !empty($user_info['country']) && $forcesubuserdata['country'] = $user_info['country'];
  325. isset($user_info['headimgurl']) && !empty($user_info['headimgurl']) && $forcesubuserdata['headimgurl'] = $user_info['headimgurl'];
  326. isset($user_info['sex']) && !empty($user_info['sex']) && $forcesubuserdata['sex'] = $user_info['sex'];
  327. }
  328. ForceSubscribeService::addForceSubscribeUsers($forcesubuserdata);
  329. ForceSubscribeService::tempForceSubscribeUsersLastTimeUpdate([
  330. 'openid' => $openid,
  331. 'last_interactive_time' => date('Y-m-d H:i:s')
  332. ]);
  333. return true;
  334. }
  335. private function getYqChannleIdByAppid($appid)
  336. {
  337. $client = new Client(['timeout' => 3.0]);
  338. $url = 'http://help.imycmh.com/help/getLinkByAppid?appid=' . $appid;
  339. Log::info('getYqChannleIdByAppid url is: ' . $url);
  340. try {
  341. $result = $client->request('get', $url)->getBody()->getContents();
  342. $result = json_decode($result, 1);
  343. Log::info('getYqChannleIdByAppid result is.: ');
  344. Log::info($result);
  345. if (isset($result['data']['link']) && !empty($result['data']['link'])) {
  346. return $result['data']['link'];
  347. }
  348. } catch (\Exception $e) {
  349. }
  350. return '';
  351. }
  352. private function moveUserFromYq($distribution_channel_id, $appid, $openid, $uid)
  353. {
  354. /*//is_yq_move
  355. $channel = ChannelService::getById($distribution_channel_id);
  356. if(!$channel->is_yq_move){
  357. return ;
  358. }
  359. $move_user = YqMove::where('zsy_uid',$uid)->select('zsy_uid')->first();
  360. if($move_user){
  361. return ;
  362. }*/
  363. $client = new Client(['timeout' => 3.0]);
  364. $url = 'http://help.imycmh.com/getUserInfoByOpenid?openid=' . $openid;
  365. try {
  366. $result = $client->request('get', $url)->getBody()->getContents();
  367. if (!$result) {
  368. return;
  369. }
  370. $result = json_decode($result, 1);
  371. $result_data = isset($result['data']) ? $result['data'] : '';
  372. if (!$result_data) {
  373. return;
  374. }
  375. if (isset($result_data['uid']) && !empty($result_data['uid'])) {
  376. //$result_data['read_count'] = 53;
  377. if ($result_data['read_count'] > 50) {
  378. //不补偿
  379. $pay_for_balance = 500;
  380. $data = [
  381. 'yq_uid' => $result_data['uid'],
  382. 'zsy_uid' => $uid,
  383. 'yq_distribution_channel_id' => $result_data['user']['distribution_channel_id'],
  384. 'zsy_distribution_channel_id' => $distribution_channel_id,
  385. 'read_count' => $result_data['read_count'],
  386. 'yq_balance' => $result_data['user']['balance'],
  387. 'is_pay' => 0,
  388. 'pay_for_balance' => $pay_for_balance,
  389. 'openid' => $openid,
  390. 'appid' => $appid
  391. ];
  392. $special = env('YQ_MOVE_SPECIAL');
  393. if ($special && in_array($distribution_channel_id, explode(',', $special))) {
  394. //特殊梳理
  395. $yq_charge_amount = $result_data['order_amoun'];
  396. if ($yq_charge_amount > 30) {
  397. $pay_for_balance = 3000;
  398. } else {
  399. $pay_for_balance = $yq_charge_amount * 100;
  400. }
  401. if ($pay_for_balance < 500) {
  402. $pay_for_balance = 500;
  403. }
  404. if ($pay_for_balance > 3000) {
  405. $pay_for_balance = 3000;
  406. }
  407. $pay_for_balance = (int)$pay_for_balance;
  408. $balance = $pay_for_balance + $result_data['user']['balance'];
  409. $data['pay_for_balance'] = $pay_for_balance;
  410. $data['is_pay'] = 1;
  411. YqMove::create($data);
  412. UserService::addBalance($uid, $balance, 0, $balance);
  413. $flag = false;
  414. if (in_array($distribution_channel_id, [160, 4236, 4237, 4241])) {
  415. //特殊 回复老站
  416. $flag = true;
  417. }
  418. $this->movePush($distribution_channel_id, $pay_for_balance, $appid, $result_data['user']['distribution_channel_id'], $openid, $flag);
  419. } else {
  420. $data['is_pay'] = 1;
  421. YqMove::create($data);
  422. UserService::addBalance($uid, $pay_for_balance, 0, $pay_for_balance);
  423. $this->movePush($distribution_channel_id, $pay_for_balance, $appid, $result_data['user']['distribution_channel_id'], $openid, true);
  424. }
  425. } else {
  426. //补偿
  427. $yq_charge_amount = $result_data['order_amoun'];
  428. if ($yq_charge_amount > 30) {
  429. $pay_for_balance = 3000;
  430. } else {
  431. $pay_for_balance = $yq_charge_amount * 100;
  432. }
  433. if ($pay_for_balance < 500) {
  434. $pay_for_balance = 500;
  435. }
  436. if ($pay_for_balance > 3000) {
  437. $pay_for_balance = 3000;
  438. }
  439. $pay_for_balance = (int)$pay_for_balance;
  440. YqMove::create([
  441. 'yq_uid' => $result_data['uid'],
  442. 'zsy_uid' => $uid,
  443. 'yq_distribution_channel_id' => $result_data['user']['distribution_channel_id'],
  444. 'zsy_distribution_channel_id' => $distribution_channel_id,
  445. 'read_count' => $result_data['read_count'],
  446. 'yq_balance' => $result_data['user']['balance'],
  447. 'is_pay' => 1,
  448. 'pay_for_balance' => $pay_for_balance,
  449. 'openid' => $openid,
  450. 'appid' => $appid
  451. ]);
  452. $balance = $pay_for_balance + $result_data['user']['balance'];
  453. UserService::addBalance($uid, $balance, 0, $balance);
  454. $this->movePush($distribution_channel_id, $pay_for_balance, $appid, $result_data['user']['distribution_channel_id'], $openid);
  455. }
  456. }
  457. } catch (\Exception $e) {
  458. }
  459. }
  460. private function movePush($distribution_channel_id, $pay_for_balance, $appid, $old_channel_id, $openid, $need_old = false)
  461. {
  462. $move_not_need_push_channel_id = env('MOVE_NOT_NEED_PUSH_CHANNEL_ID');
  463. if ($move_not_need_push_channel_id && in_array($distribution_channel_id, explode(',', $move_not_need_push_channel_id))) {
  464. return;
  465. }
  466. $data = [];
  467. if ($pay_for_balance) {
  468. if ($need_old) {
  469. $format = "亲爱的用户:\r\n由于原小说站进行网站维护中,为了让您能够继续阅读更多优质小说,我们将在新站中补偿您%s书币,以表达我们诚挚的歉意\r\n\r\n<a href='%s'>点此进入新站</a>\r\n\r\n<a href='%s'>继续老站阅读</a>";
  470. $url = env('PROTOCOL') . '://site' . encodeDistributionChannelId($distribution_channel_id) . '.' . env('CUSTOM_HOST') . '.com/';
  471. $content = sprintf($format, $pay_for_balance, $url);
  472. } else {
  473. $format = "亲爱的用户:\r\n由于原小说站进行网站维护中,为了让您能够继续阅读更多优质小说,我们将在新站中补偿您%s书币,以表达我们诚挚的歉意\r\n\r\n<a href='%s'>点此进入新站</a>";
  474. $url = env('PROTOCOL') . '://site' . encodeDistributionChannelId($distribution_channel_id) . '.' . env('CUSTOM_HOST') . '.com/';
  475. //$old_url = env('PROTOCOL') . '://site' . encodeDistributionChannelId($old_channel_id) . '.chunnuan555.com/continue';
  476. $old_url = 'http://site' . encodeDistributionChannelId($old_channel_id) . '.imycmh.com/continue';
  477. $content = sprintf($format, $pay_for_balance, $url, $old_url);
  478. }
  479. } else {
  480. $fromat = "亲爱的用户:\r\n%s新增全新站点,新站拥有海量优质小说,同时原先站点可继续看书\r\n<a href='%s'>点此进入新站</a>\r\n\r\n<a href='%s'>继续老站阅读</a>";
  481. $new_url = env('PROTOCOL') . '://site' . encodeDistributionChannelId($distribution_channel_id) . '.' . env('CUSTOM_HOST') . '.com/';
  482. //$old_url = env('PROTOCOL') . '://site' . encodeDistributionChannelId($old_channel_id) . '.chunnuan555.com/continue';
  483. $old_url = 'http://site' . encodeDistributionChannelId($old_channel_id) . '.imycmh.com/continue';
  484. $offical = DB::table('official_accounts')->where('appid', $appid)->select('nickname')->first();
  485. $offical_name = '网站';
  486. if ($offical && $offical->nickname) {
  487. $offical_name = $offical->nickname;
  488. }
  489. $content = sprintf($fromat, $offical_name, $new_url, $old_url);
  490. }
  491. $data['openid'] = $openid;
  492. $data['appid'] = $appid;
  493. $data['content'] = $content;
  494. $data['type'] = 'one_task';
  495. $data['task_id'] = 1;
  496. $data['send_time'] = date("Y-m-d H:i:s");
  497. $send_data = array(
  498. 'send_time' => date("Y-m-d H:i:s"),
  499. 'data' => $data
  500. );
  501. Log::info('movePush info');
  502. Log::info($send_data);
  503. $delay = 0;
  504. $job = (new SendTexts($send_data))->onConnection('rabbitmq')->delay($delay)->onQueue('send_texts_list');
  505. dispatch($job);
  506. }
  507. private function smartPush(Request $request, $uid)
  508. {
  509. $bid = $request->get('bid');
  510. $fromsource = $request->get('fromsource');
  511. if (!$fromsource || !$bid) {
  512. return;
  513. }
  514. if ($fromsource != 'smart_push') {
  515. return;
  516. }
  517. $decode_bid_array = Hashids::decode($bid);
  518. if (!$decode_bid_array)
  519. return;
  520. $decode_bid = 0;
  521. if (isset($decode_bid_array[0]) && !empty($decode_bid_array[0])) {
  522. $decode_bid = $decode_bid_array[0];
  523. }
  524. if (!$decode_bid)
  525. return;
  526. //记录pv uv
  527. try {
  528. $uv_key = sprintf('%s_%s_uv', $decode_bid, 'smart_push');
  529. Redis::sadd($uv_key, $uid);
  530. Redis::HINCRBY('smart_push_test_book', $decode_bid, 1);
  531. ReadRecordService::setSmartPush($uid, $decode_bid);
  532. } catch (\Exception $e) {
  533. Log::info($e);
  534. }
  535. }
  536. protected function notAccessPage()
  537. {
  538. return '<html><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no"><title>网站正在维护中</title></head><body style="padding:0;margin:0;font-size:0"><div style="width:300px;height:100px;margin: 20px auto"><p style="font-size:20px;color:red;text-align:center">网站正在维护中,请联系客服</p><img src="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEAYABgAAD/4QAiRXhpZgAATU0AKgAAAAgAAQESAAMAAAABAAEAAAAAAAD/2wBDAAIBAQIBAQICAgICAgICAwUDAwMDAwYEBAMFBwYHBwcGBwcICQsJCAgKCAcHCg0KCgsMDAwMBwkODw0MDgsMDAz/2wBDAQICAgMDAwYDAwYMCAcIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz/wAARCADXANkDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD6f/4ORv8AgtB8YP8Agkz4u+ENn8L7TwXeQeOrTVZtRXX9Nlu9rWz2ix+WY5otoPnvnOcnHSvzIb/g8q/ayU/8gH4K/wDhP3n/AMm19Af8HwjY+IH7OOP+gb4h/wDRmnV+jn/BKPSfhj8MP+CIPwh+IXjfw/4Xh0Xwx8No9d1zVJ9ES6kgtLa3eaeZlSN5ZCsaM2FDO2MAEnFVYqx+MX/EZZ+1l/0Afgr/AOE/e/8AybSf8Rlv7WX/AEAfgt/4T95/8m1+sn/EQL/wTZH/ADPng8/90y1j/wCVtWdJ/wCC+H/BOHXdVtbG08beD5rq8mSCGP8A4Vnq43uzBVGTp2OSQOaNBH5J/wDEZZ+1l/0Afgr/AOE/ef8AybX7K/8ABvB/wUr+I3/BVH9ivxJ8RPiVD4Zstc0vxxdeHbeLQrKS1tvs0Vjp86llkkkYvvuZcndjG3gY58H/AODuv4YeG/BP/BJm3udH8OaDpN03jrSomlstPhgcqYbsldyqDgkA49qr/wDBlsgk/wCCV/jsNz/xdTUT/wCUnR6LAeb/APBNz/g4l+PX7Wn/AAWj0n9n3xNp/wAOY/A974i8Q6ZJNp+kXEWoeTY2l/NCRK1wyZ3W0e47ORnpnI/cPn0P5V8Xf8FrP2Ide/aB/wCCaPxQ8K/BPwTpUvxU13+zW0c6a1npF5IyatZzXBW7kaJUPkJMW3SDcNy/MWAP4DD/AIN8/wDgpKv/ADIPi0f91M0f/wCWNIR/WUxKjn+VfnF/wcb/APBV34nf8EpPgT8OfFHwxtPCd5feKtfn0y9j16wlu4vKS2MilBHLEVbcOSSeK/n7/YFu/ip8G/8Agsr8HPh34617xPa694b+LGkaHrulza615HDPFqcUU0LNHK8UgDBlJVmU9iRX7tf8HR//AATn+Mn/AAUU/Zx+GHh/4M+Df+Ey1bw94ln1HUIf7WsdO+zQNatGG3Xc0StljjCkn1FOwz6C/wCCSH7dnjb9uT/gk14d+NvjGHQLfxlq9rrk0semWrwWIa0vbuCHbGzu2NkCZyxyc9K+Gf8Ag3z/AODgf46f8FQ/25tQ+HPxIsvh9aaBaeEr3XIzoukT2tw9xDPaxoC73Eg2bZnJG0HIHPavsr/gir+yF8RP2SP+CM3hX4T/ABC8O/8ACP8Aj/TrTX4rnSv7Qtbvy2ub+9mgHnQSPCd0c0Z4c43YOCCB+ef/AAbR/wDBF39pj/gn3/wUM1Lxz8XvhoPCPhW48GX+kR33/CRaVf7rqW4s3SPy7W5lk5WKQ7iu0Y5IyMgHof8AwcE/8HBHxy/4Jfft06f8OPhzY/D240C68JWOts2uaTPdXBnmuLqN8PHcRgLthTAwec888fDX/EZL+1l/0CPgz/4Tt3/8mV/Td4i+E/hjxfqbXureHdB1W8ZFj8+80+K4k2jOF3OpOBk8dOTXx58AP+Cr37Dv7T37RGm/CbwL4g8Ka58QNYubizs9J/4QHULXzZbeOSWZfOmsUhXakMhyzgHbgZJAIM8q/wCDbj/gr58VP+CsnhH4tX/xOtfB9rN4JvtLttOXQdPks1ZbiO6aQyeZNIWOYVxgjGD1r9OGbaO/4Csnwz4A0PwWsh0fR9J0n7QQZfsVnHb+ZjIXdsA3Y3NjPTJ9a/Nj/gr3/wAF2f2X9I/Zh/aK+C9v8WJbT4t23h3XPC8OlR+HdZSSLV1glhWFbkWvkBhMABKJdgOG345qSS//AMHIX/BW/wCKn/BJ74d/CrVvhfZ+Ebq48ZalqFpqC69ps12gSCKB0KeXLHtOZGzknPHTBr8nv+Iyj9rP/oC/Bn/wnrz/AOTK+Lv2SP2Iv2jv+Cquo65pPwx0nWviXN4Niiu7+3v/ABPa2y2CTsyo6/briMHcY2B2ZPyjOOK9s/4hd/26j/zQz/y9PD3/AMn1RR7L/wARlH7Wf/QF+DP/AIT15/8AJlI3/B5N+1oy/wDIF+DPTr/wj13/APJlfIv7Yn/BFP8Aaa/YC+Ea+O/i58NP+ER8KSX8WmLff8JFpN/m5lV2jj8u1upJORG5ztwNvJHFfK4ODTDQ/vR+Fnim68YfDLw1q14q/bNW0u1vJ/LjKx+ZJCrtgc4GScc9O5r8sP8Ag4+/4LffGb/gk/8AGv4a+H/hjZ+B7nT/ABZodzqN6dd0ya8k82O4EahDHNHtXaeQQf6V+T3/AAbH/F7xZ4p/4LefBLT9S8UeI9R0+RddV7a61OaaFgugaiVyjMRwQCOOMCvpz/g9wYD9qb4H/wDYp33/AKVipJPJP+Iyj9rTdzonwX4/6l+7/wDkynf8RlP7WIH/ACBfgv8A+E9ef/Jtftp/wTph+F3wc/4Ir/Bj4ieOtD8M2eg+GfhRpWt65qcuhpdyQ28OnRyzTMscTyyEKGYhVZmOeCTXmA/4ODP+CbZzu+IHhJh6f8Kz1j/5XU9Bn5N/8RlH7WP/AEA/gt/4T15/8m0v/EZP+1kVz/YvwX9cf8I9ef8AybX64+F/+C8n/BOfxp4m07R9L8beEbrUtWuorK0h/wCFbasnmyyOERdzacFGWYDJIAzyRXg3/B5B8NfDfgv/AIJeeC7nRvD2h6PdP8T9PheWxsIrd3Q6XqxKlkUErlQcdMgHtQI+qv8Ag32/4KN/EH/gp/8AsO3/AMR/iNbeGrXXrfxZfaKkeh2UlrbfZ4be0kTKSSSEvumfJ3AYwMcEn7sxX5N/8Gbn/KJrWPb4h6p/6S6fX6w+af7v60MbP58f+D4f/koP7OP/AGDvEP8A6M0+vuX4HH/jk0vv+zdNa/8ATNd18N/8Hw//ACUH9nH/ALB3iH/0Zp9fe37Lvg/VviH/AMGstt4e0HTrzWNc1/4A6pp2m2FnE01xfXM2lXMcUMaLks7u6qqjkkgUdBvY/klJ4FdJ8HBn4veFf+wxZ/8Ao9K99/4cm/tcgf8AJufxc/8ACdn/APia3/hZ/wAEXf2stI+J3hy7uf2d/i1Db2uqWs0sjeHpwqKsyEknHQAE1QH7uf8AB4r/AMokLb/sftK/9EXlc1/wZbnH/BLDx1yF3fFbUBk/9grR66X/AIPFDu/4JHWxHOPHulf+ibyub/4Mto/N/wCCV/jsf9VV1E/+UnR6QdT5q+NP/B5p8SvhP8ZPF3heL4LeBb+Hw1rd7pUdy+rXUbXCwTvErlQCASFyQOMk1zqf8Hs/xQnUEfAvwDtzjP8AbV3/AC25r9B/+C7v/BKL4d+Nv+CZHxck+D/7Ovw/u/i9qT6bPpl14Z8FWK6/PK2sWb3Ukc0UQmLGDzy7BslC+cgmvlv/AINiP+CQC+Gvhn8XI/2nP2btFfUJNU00+H/+Fg+C7a7mEPlXHnfZzdRMQu7y9wXAztJ5pWAoJ/wRy8O33wwX/gpVJ4117/hNW04ftBnwWbSEaWb3y/7Y/s37R/rfI8z915mN+w55avpv/ghB/wAF8vF3/BXn43+OvC3iL4e+G/Btr4T0OHV4Z9Nv5rmSdnuBEUYSAYGGzkdx71+RfxG/bY8ZfCv/AILoax8LPEHxY8W6D+zfoHxjl8N6l4LuvEl1D4MsvDMWqmCXTpNOMn2RdOW0DRNbmPyfKym3bxX0x/wcA/tf/s//AAO+CHgDUP2H/HXw5+HfjC+1yaHxJdfBq6g8P6jc6eLfKJdyad5TvCJdpCyErvwQM0Af0EeO9ek8M+CdY1S3WOSbTbGe6RX+6zRxs4B9iQK/nhP/AAe4fFBVXd8DfAJYjPGs3Y/9lr8xLX/gqF+1T4juo9Pj/aM+P97JfsLdbc/EDVnFwX+UJtNxhs5xg9c4ro5f+CJX7XaP837Ofxa/Dw/Mf5ChaCP6fP8AgiL/AMFOfEX/AAVb/Y7vfihr3hfR/CN1ZeKbvQTZWFzJcQmKCC2lEhaTB3EzspHTCg18B/G//git4Z/4IQWviL9tzwr448QfELxT8K7l9WtvDWsWMVnYX76lN/Z8iySxEyKEW+dxgctGoOATXcf8G7v7QXgf/glN+wVqPwy/aV8U6J8EPiBeeML3XofD3jG6XS9QlsJre0jiuhFJhvLd4JlDYwTGw7V+Xf7RX7OH/BST9oGTxVouraX+1j418A+IL2WRdOvdR1fUNI1C18/zYD5LyNE8Y2xuowQNqkdBQM+qIv8Ag9u+Jzx7h8CvAfHf+27v/wCJr13wh/wbQeB/+Cs/hLT/ANp/xB8UfFXg/Wvj5Avjq/0TTtLguLTSZ78faHt4pHbe6ozlQWGSB0ryr/ggf+zJ8Hf2GfCPxMtf28Phv8N/Aup+IrzT5vBqfFzw5Z+deQxJcC8Nn9sjZtqtJb79mBlkzXztoP8AwU78UfDT/gufpml+G/j54q0H9mfRvi5Bb2OlaZ4vubfwZZeGk1FQIorWOUWqWC2wwEVBGE4xigR+3f8AwRz/AOCEnhf/AII+eNfHGseG/iB4g8ZnxzZWllPHqVhDbC1EDyOGUxkkkmQgg4xivvaSQRLub7q9eK+Wrf8A4LV/siwDYv7Rnwk29AD4ig4/EmvT9U+Pnhn48/sgeIvHvw68Uaf4i8PX2g6lPpeuaPdeZDJJAk0ZeKVf4o5Y2GQchkPcUMGeY/8ABVv/AIJxaF/wVf8A2aLf4W654s1PwnYR67ba2L3T7RLmZ3gimUR7XIAUiYknr8o/H+YP/guT/wAEv/D/APwSW/a80n4aeH/FWr+MbTUfCVr4ie91C1jt5Y5Jrq7gMQWMkFQtsrbjzliPQ19s/wDBqZ+3P8bP2i/+CoN14f8AiF8Yvip480FPBOpXg03xF4sv9Us1mSa0CS+VPKyb1DMA2MjccHmuE/4PN38v/gqx4U29/hlpmeOv/Ex1SmM/Rf8A4JQ/8Gzfgf8AYZ/aV+F/x+0f4p+K9f1TR9OmvU0i80y3it5vt2mTWzAyK24BFumYYHJUZ4zXxn/we5nP7UXwPH/Up3v/AKWLXj3/AAbe/t9fHX4zf8Fifgz4N8XfGn4seKPB94msx3Gh6t4tv7zTZlh0O/khVreSUxkI8UbKCuFZFIwRXsP/AAe5/wDJ0HwP/wCxUvv/AEsWl1EfotB/yqgn/s21v/TEa/kur+ub4f8AgbWvif8A8Guek+G/Dul32ua/r37PKWGnafZQtNc31xJomyOKNF5Z2YgADkk1/N5/w5K/a6z/AMm5/Fv/AMJ6f/CmNHjH7LH/ACc98N/+xp0z/wBK4q/o+/4PSVA/4JZeCMf9FU07P/gq1evxZ/Z4/wCCNP7V3hP9oDwLqmpfs9/Faz0/TfEWnXN1cSeH5wkESXUbO7ccKqgknsATX7Tf8Ho8iyf8EsPA5Vg3/F1NO6f9gnV6AZrf8Gbn/KJvWP8Asomqf+kun1+sFfk//wAGbn/KJvWP+yiap/6S6fX6wbqUtgZ/Pn/wfDADx/8As4Z/6B3iD/0Zp1c7+wf/AMHcHhT9jX9jH4a/Cm8+CPiDX7jwHoVvpEmow+JIYI71ohjzFQ25Kg9cEnHqetftb+27/wAErvgL/wAFG9T8O3nxo8Cf8JnceE47iHSWOt6jp4tFnMZlGLW4iDbjFHy2SNvGMnPgmqf8GzH7B+haZcXl58E7W1s7WNpp55/GeurHCijLOzNfYCgAkknAA5xQGp8Txf8AB754MjjCr+z34oAHp4rg/wDkalk/4PgPBsiFf+Ge/E3P/U1wf/I1fX/hb/g3a/4J3eOr2S10L4XeG9buYk8ySKw8f6zcvGnTcwS/JAzxk8ZNVvEH/Bvp/wAE4vCOtTabq3w58I6XqFtt861u/iJq0E8W5Qy7kbUAwyrAjI5BB71JJ+Sn/BZ//g5N8N/8FW/2NP8AhVum/CnWvBd3H4gs9bW/u9civYyIEmUx7FhQ5Pm9SccV+iH/AAZavj/glj47GcZ+Kuoj/wApOj16f/w4W/4Jo/8AQk+A/wDw5eqf/LGvrX9gj9k/4F/sY/CLUPC/wC0zSdJ8H3usy6pdw6drlxrELX7wwROxlmmmZXMUMA2BgAADtBbJpFI+Mv2Lf+DmTw/+2L/wUo039nC1+EetaHqGoaxq+k/25Nr0U8MZ0+3u5y/krApIcWpUDdxvBycc+g/8FnP+C7Gi/wDBHjxv4D0nVvhvq3jr/hOrG7vIpbPV47EWn2d4kKkPE5bPmA5BHToa7D9nb/glb+xd8FP2v7H4pfDvw34ZtPi9Df395bXlt43v724+03MU8d2RaSXjxEmOWcFfKwgJIClQR1n/AAUI/wCCe/7LH7bvibwzdftC6LoOrap4dtZ4dG/tDxXeaK0UMjI0u1ILmESAsqZJDY4GQDRzCufij+2J/wAG/OvftZ/s/wDxO/bnt/iZpGi6H8QNE1L4xReE5tGkmu7K3uYZNSFibhZVRnVW8vzAgBIztHSvi/8A4I5f8EhNU/4LCfFbxh4V0nxxp/gebwjo8WrPc3mmPfLdK84i2gLIm0jOc5OfSv61dA/Zl+GOufsfW3wf0zSra++EF34WHha30221O4lhuNHa3+ziFbpZDMymE7fMEhcg53Z5rgP2K/8Agkd+zz/wTr8X614g+DXw9HgzVvENmun6hONb1LUPtECyCQJturiVVwwByoB7ZxxRcdz+Tv8AbT/YYu/+Can/AAUwb4N6h4ktfFl14T1TRZZNUt7NrOOf7TDa3YAjZnK7RMF+8c7c8ZxX9VX/AAV2/wCCnFh/wSY/Zhs/idqXhG+8aWl74ittA/s+11BLKRGnhuJfN3sjjA8jG3Azv68V/Pf/AMHLHwl8f6l/wXI+KfiHw14R8VahFANAuLO+stGnuYfMj0awwVYIyNtdcHqMgg96+gv+CYP7Rvxb/wCCxP7Sd58J/wBvPUNQ8T/BWx0S48S2tlr+kQ+D7UaxBLDDbSC7sorOVmEVxdAReaVYEkoSgKgHa+Nf+Cfmo/8AB2LrbftNeF/FFn8FdL0uFfAD6Bqlk2tTySWRNy1z50bwqAwvlULsJHlk55Ar6X/4Jwf8HMnh39rD9sjwH+zba/CPWtF1C6kuNCGuSa9FNAjWFnNI0nk+SGw4tiAN+RuHJxz9/fsEfssfBP8AY6+DFx4R+Aum6Xpfgu41WbUpodP1u41iI3jpEkjGaaaZg2yOL5N+BgHAzz/Mf/wQFH/HRP8ADdu//CT+Ih/5TNToA+x/+D3Zvs/xV/Z2566Rro/8jWNfN9r/AMGyPiS9/wCCXf8Aw1B/wtvQRpq/D5vHp8PnQpvOMa2hufs3n+djdgbd+zGecYr+gH/goT/wT9/Zd/ba1/wvc/tDaLoOrah4dtrmLRP7R8V3mitHFK0Zm2rBcwiQFljyWDY4GRnnpLfwp+zrB+ycfgdHr3ggfCxvDh8Jf2IPFn/MMMJgNv8AaPtH2jmMld/mb++7PNDA/lt/4I2f8EadW/4LF+NvH2kaV4803wG3gWys7yWS80qS/F59oeVNqhZE27TEepOcj0NfpX4e/wCCvWj/APBFPwlH/wAE/dW8D33j7XPBqP4cl8Z2Oopp9ncvrTNfLKLV45HUQjUlQgyEsYSQQGAEX/BWXwnov/BE7wx4L1j/AIJ6xJ4R1/4gXN3YeNG8Pzt41a5tbZIpLUSR3xvVtwHlmIZAhbJBLAYHtX7Ff/BNb4W/8FCP+CdGl/tVftCfD+68SftM6zpeq6zrHiO7vL/R7h7zTLi5t7CRrC2lhtE8u3s7QbRAFcIGcMXYswPnvwJ/wTmv/wDg1E11v2ovE3iqz+NGm3MbeB/+Ef0qxbRrhJL3EwuDPI8y7U+yEFdnJccjHMnj79hC7/4O1tej/aW8L+I7X4K6f4ajX4dSaFq9m2tTzy2bG9a6WaJ4VCsupKuwrkGInOGGPN/+CN37ZfxK/wCC/P7Xdx8C/wBrjxM3xa+FcGgXXimPQzYW2hBdStpIY4J/P0yO2n+VLiYbDJsO/JUkKR+5X7Lf7OP7Pf8AwS/8BXHw8+Ha+G/hrouoak+vzaVfeJZZpZbmWOOFp83s8kuGS3jUAHb+7OBnNJAj+aX/AINtfDH/AAhP/BwX8KdFMiTNpN/4msjIgKrJ5Wh6om4AkkA7c4yfqa+pP+D3D5/2pfgf/wBipfckf9PYrwj/AIIV+Bdb+G//AAcFeDfFniHRdX0HwvZ634pkn1jUrKS00+FZdL1RIi88gEah3dFUlhuZ1A5IFf0C/tWf8E3/ANlz/gqr4k0fXviR4b0f4nX/AITtm06zudP8U30C2McjeYUYWNzGhLMM/OCeOOKNw3PyI/Yx/wCDvjwh+yl+yD8Mfhfc/A/xFrVx8P8Awxp/h+W/i8SQwpePbW6RNKqGAlQxXcASSM9a9Li/4PePBUCbV/Z88UY5/wCZqt//AJHr7c/4hfv2F8f8kNP/AIWniD/5OrF8Xf8ABuP/AME9fh9HC2vfCrRdDS4JWFtQ+IGt2olIxkKZNQAJGeg9RRsGx8fy/wDB734KmTa37Pfigj0/4SqD/wCR6+Nf+C3v/BxX4c/4K4/skaH8NdK+FmteCLjRfFdr4lF9d65FexyiK0vLcxbFiQgn7UGznA2dOa/Zbw3/AMG037AvjHSY9Q0n4O2WqWE2fLurPx1r00MmCVO11vyGwwIODwQR1Bqr4t/4Nu/+CffgKxW6134S6Xotq7iJZ7/x9rttEXIyF3PfgbiASB1IBPahBc8t/wCDNvn/AIJNax7fEPVM/wDgJp9frJXiP7Bn7LHwU/Y8+Clx4S+A+naXpfgmXU5tQkhsNcuNYiN5IkayHz5ppm3bY48oHwMA4Gefbs0mDGzbtny/e7V+Uv7f/wDwXk+EPxi8b/Fr9ibTtB+JEfxY+IS6h8ItO1S602zTw/Fq2qRNp1vNLMt0062qzXCF3W3aQIGKxscKf1amLbPl+91HFflx/wAFBv8Agh18FPg/qnxf/bK0uTxmfjD4BttS+LGmLcaqj6QdZ02F9QthJb+UGa38+3j3R+YCVyNwzmgk+Pf2H/glqv8AwaVeKtc+JX7SDaf4u0P4tWieGNJh+HErand21zA/2pmnS9WyRYyg2go7sW/hA5r8xP8Agrb+1r4Z/wCCmf8AwVL8cfE7wLZ6xpfh74g3Oj2unw+III7e7gaHTbKxczLDJKqgywuRtdjtKngkgfpv/wAE5fjPq3/B1F478SfDn9qCSzXw/wDC3To/EuiHwZF/Y9x9qmkFtJ5zOZg6+X0AAwT+A/NH/gsV+yz4T/4Jv/8ABVjx58Nvh6NSbw14Dm0e503+1boXNwXl0uyvW8xwqhh50z8BR8uB70yj7CT/AIMuv2p3X5vGvwBXnGDrmq5/TTa+of2KP2zPCf8AwaifCy8/Z3/aMs9e8WeOPGGryfEazvPh1BHqelpp1zDDYRxyyXslnItwJtMuCVWJlCNGd5LFV+Oz/wAHh/7XJYt5Pwl+n/CNy/8AyTX2Z/wTw/ZA8I/8HRfwR1T9oD9ppdWXx54T1qb4e2P/AAhtz/ZNimm2sEF/GXidZi03nalcZbcAV8sbflJIB5R8DP8AgmV47/4JIftT2/8AwUO+JWqeEtW+Ceh3l94rm0jw7dT3XimS116OayskW3mhhtfNSTU7cyg3IVVWQqzkKrdH+3J8Prr/AIO3td8O+Lv2a2tvCmn/AAVgm0bXYviQ50ua4lvmWWFrYWQvVdAtvIG3sjAsuAwzj9k/2i/2CvA/7WP7EN38AfFja4vgS80/T9Lk+xXghv8AybCaCa3xKVYbt1rFuO0gjcMDPHFf8E2P+CTnws/4JR6L4s0n4W/8JUbPxpc211fnW9RW8bfBHIqbCsabRiR89c8cjpQB8D/Bj/g5W+A3/BLX4S+G/wBm34geFvixqnjn4DabB4C8QXvh7SrC40m8v9OQWtxLayTXsMrwNJExRpIo2KkEop4rpT/wej/ss/8AQj/Hv/wQ6V/8sq/HH9o34L6J+0f/AMHIPjT4f+Jft3/CP+NvjzdaHqP2OYQ3HkXGstE/luVYK21zg4OPSvpf/g5B/wCCInwT/wCCV3wA+HfiT4Xr4wbU/FXiGbTbw6xqy3kawpbNKNgWNMEsByc8UAj9AvDv/B5R+y/4p1+w0u18F/HiG41C5jtYmk0PSxGrOwUbsalnGSM4qf8A4PHkY/8ABJbRDKdzr8RtL5+lnqAz+PNfLH/BGv8A4N9/gB+1v/wSy8F/HzxW/jxfHUyaxfyLY61Hb2JksNQu44P3ZhJA2W8e75uTk5GeMj/gn5+3N40/4Obfjjc/s7/tKtoa+AbHSJvG1uPB9sdJvotQtJIYIgZneYNGY7yfcmzOQp3DaQQDkP8AggN/wcLfBD/glr+xBefDj4h+HfiZqmvXHiy911ZfD2l2dza+RNBaxoC813CwcGB8gKRgryeg+Ff+CY37b/g39iz/AIKveE/jh4otfEV94O0DWNW1G4ttLtYptRkS5tLyCIJHJLHHu3XCbsyAAbsEkAHvP+DhD/gnn8Of+CY37dVh8OvhqNebQLjwlZa051jUFurg3E011GwDKiDZthTAxnO7nkAfsn8Nf+DRX9kvxn8NfD2sXE3xUFxqmmW15KIvEcQQNJErttzbnjJPemB+Vn/Bxb/wWG+Ff/BXXxr8KdS+G+jeONHh8D2OpWuoDxLY21s8zXEls0flCC4mBAET53bcZHXqL/7Nf/Bpz+0Z+1d+z74L+JfhnxX8GbPw/wCO9Gttc0+DUtZ1GO8ignjEiCVY7B0V9pGQrsAe5r9XT/wZ5fsiqP8AWfFpvb/hJIf/AJHr5I+BH/Ba/wCNP7LX/BVzwb+xb4TXwe3wd8E/Eay+F2nSXukvLrH9kQ3qWYL3AlCtP5IP7zywC3O3HFID6x/4N0f+CH/xf/4JF/Ef4oat8SNb+H2rWfjbTbCzsl8Nahc3LRSQSzOxkE9tDgFZBjaTnnI6V+nPxa8J3Pjb4UeJtDs2h+2a1pN3YwGeRljEksLou9gCQuWGSASB0B6V+dX/AAch/wDBWL4uf8Erfhj8KdY+GEfhn7R4x1S/s9R/tvTWvFVYYYHjCBZE25Lvk89B9a9x/wCCXf7cPjf9rr/gjp4c+Ofi46N/wm+qaLruoTmwtDBZ+ZZ3t9DDtiLMQNlvHn5jk5PGcAvYNj8o/wBjL/gnt42/4Nbvi837TX7QWoeGPFXgG60+XwWtj4AuptS1c3t4ySxyeVeQ2kXlBbWTcfN3AlcK2Tif9tb9h7xZ/wAHVXxXtf2jv2d7zw/4W8D+HdLj+H1zZfEKeXTNV/tC0klvJJEjs4ryJoDHqEAVjKHLCQFAAC2f/wAE+f29fHn/AAcz/HST9nH9pFdFX4d2ulT+MlbwjZtpOoLe2bRQw/vnaVTHtupMrs5JXkYwf2p/4J1/8E4vAP8AwS8+Ct78O/hifEknh3VNcl1+dtZvFu5xcSwwQuA6ogCbbePAwTndzzwAedf8FSf2BfHH7bv/AASa8RfAnwrqHh/T/F+sadoVpFcateTRaaj2V7ZXExZ44pH2lbZ9uIySxGQO35t/sQfGHS/+DSbwzrnw8/aSjvvF2ufFy7i8S6NN8N4k1S0t7e2Q2zpcNfNZOshdgQEV1xzuB4rU/wCCUX/Bw9+0F+2f/wAFfvC/wQ8YN4BXwVquqa9aXI0/RmgvWSzsL+4h2yGZh9+2j3HbyMjvkeR/8HuBz+1B8Demf+EVvuCcf8vi0AfeP7OH/B2h+zf+1H8f/BXw18P+EfjVZ69491u00DTrjUNF02O0huLmZYo2lZL92VAzDJVGIHY1vf8ABxN/wSO+J/8AwVw+Gfwx0P4c6l4L0m48Gare318/iS+ntY5Y5oYkQRmGCYltyMSCFGMda/nB/wCCPQ/42u/s2/8AZStA/wDThDX9GP8Awci/8FW/ir/wSr+Fnwu1r4XyeFxdeMNYvrG/GtaebxRHFBE6FAHQqQzHJJOcimB88/sq/wDBaj4Vf8G9fwG0L9j/AONmg+PvEHxN+EP2j+2NQ8F2NpfaHcf2lcS6xB9nmubm2mbbb6hCr74ExIsgG5QHbm/22/21vCf/AAda/DKw/Z1/ZzsfEPhPxv4U1aL4h3l38Q7eHTdKfT7SC4sJI0kspbyVpzLqduVUxBNqSEuCAGvfB7/glV8K/wDgtX/wT9vv21vjRJ4lHxk8daHrGo6mvh/UF0/RhJpDXOm2nl27RyMq+Rp9uXHmHc+88AgD8YP+Cc//AAUg8f8A/BLz416h8QvhiPDjeIdU0ObQJxrNk15B9nlmt532orpht9tHhs9Nwwc0gP6if+CBP/BNfx1/wS0/Ylvvhr8QtR8K6pr1x4svddWfw9dT3Nn5E0FrGoLTQwvvBgbI2YxjBPQfcu36/nXwd/wb2/8ABRb4hf8ABTb9hi/+IvxKHh9fEFv4uvtEQaPZNaW/2eK3tJEyrO53bp3yc8jHHHP3hu/zmhgz5x/bt/4Kw/Av/gmvqvhq0+MnjKbwjN4uiuJtKCaLfaj9rWAxiX/j2hkCbTLH98gndwDjNeN/DL/g46/Y4/aB+KHhvwH4b+Kk+r+IPG2q2ugaZYSeEdWjS9urqVYIomeS2VFV3dVJchQDyQMmvzh/4PhlLfEL9m8DknTvEH/o3T6/J3/glGmz/gqb+zUD/wBFW8L/APp3taEI/tfstBsdMmaS1s7O1dhhmhhWNmHoSoGag8VaZoun6ffatqNjp8iWsLXFxNJarK4SNck9CzYVeB14Ar4f/wCC8P8AwV+8Qf8ABIL4QeA/FGg+C9H8aSeMdYn0uSDUb2W1W2EcAlDqYwS2eQQcdj9fzPsP+Dzb4ifFu+h8KzfBHwXZw+JpF0mS4TXLlmgW4PlFwCmCQGJwfSqGfoQP+Dmb9gRkyfiRCD6HwFquf/SOvzv/AOCtn7MPjz/g4E/aL0r4yfsY6SfiB8LfDvhqDwXqV/Hew+GhDq8Fzc3k0Bt757eV8QX1o3mBCh3gBiVIX28f8GRfw3Uc/HXx1x/1ArXj/wAiV558Vv23dQ/4NIfEcf7NvgPQbD4yaP40tl+JU2s6/ctpl1az3bNpzWqxwB1KKmlxuGJBJmYYwBUgfo//AMFO/wBkD4nftE/8ELtY+DvgfR5L74oXXhrw1YQaf/acNszT2l7p0tyv2h5Fi+VIJjuL4bbgE5Gfgb/gjd8Rof8Ag3L8HePPD37aGp3Hwz1v4qX9nqnheENJ4i/tCC0jkiuHLaeLhYtrTQjEhVmB4BCmvM5v+D274lW77X+A3ghW7g67dA+v/POu0+Enw9i/4PDLDUPFvj24k+Ctz8DHTR7KDw8g1VNUXUN0zvIZyhQobZQAuc7znpQB5v8ACr/gj/8AtBftDf8ABZ/w3+1Z4P8AA8Oq/Arxh8Wrf4kaT4hOuWFu9zoU2prex3ZtJJluULW5D+U0QkGcFAeK+jv+D2ok/shfBbP/AEONz/6RNXOfsuf8HAnir9k39t3wD+w3p/w38O6t4b+HvjGy+D1v4on1OaO+vLa2u001b14QpRZWRRIUB2hjgHFdL/wezRs37IXwYXq3/CZ3I/8AJFqAMD/gg1/wXk/ZV/Yq/wCCVnw5+GPxO+I1xoPjDQZ9We/09fDep3qwifVLq4iPmQ27xtmORG+VjjODgjFfof8AsQ/8Fjv2YP29/jZJ4H+DXi6PX/FFvpk2qyW48NX2m7LSNo0kbzJoI1OGljG0HJznsa/G3/gkh/wa5+B/+Ckn7APgj4yax8V/FfhjUfFUuoxy6bZ6VbzwW/2a/uLVdruwY7lhDHPQsR2r9K/+CTX/AAbjeD/+CTv7UN18TtB+J3iTxdd3mg3OgtY6hpkFvEqTSwSGQOjk5BgAxjHzGi4an6Lal4Y0/U5mmuNPsbubACmaFXPHQZINfBmqf8HPn7EvhLWbzS7r4uXkN1p072s0a+ENZZUdGKsARakEAg8jij/gp5/wUo/am/ZJ/aNg8MfBn9lfWPjR4PbQ7fUZNetI7wrHdPJOslsDCjKSixxtgc/vBxyK+PX/AODMXwL8THbxFqXxo8b6TqOvsdRurIaFbMLOab948WTJk7GYrk/3aLhfsfqH+wr/AMFO/gv/AMFKbDxHe/BrxZN4qtPCM9vBqjyaTeaf9nedZGjAFxFGWyIn5XIG3nGRX8lX/BZO5ktP+CuP7RkkTtHJH8RdZZWU4KkXknINf0+f8EdP+CM2gf8ABHTw54/03w/431vxsvj25srmeTULGK0+yfZkmUBQjNu3ecSc4xtHvXyz+1x/waI+A/2tv2oviB8Tr74zeMNHvPH2vXevT2MGi20sdo9xK0hjVi4LKpJAJGcUc2oH8zN9rl5qqot1eXVysZyollZ9vrjJr+gb/gkt/wAF0/2Xv2Xf+CJvhX4N+N/iPcaR8QtO0LX7K504eHdTuFilur6/mhXzooGiO5J4zkNgbucEGviD/gvF/wAEHfDH/BH7wN8ONW0H4ha740k8dajfWU0eo6fFararbxQuCuxm3FjIQc+1e8/8Eqv+DWPwP/wUP/YD+H/xk1b4s+K/DN/4yS+ebTbPSre4gtvs9/c2g2uzhjuEAbkdWIqgPy7/AGHf2Lvip+3j8YZPAvwd0d9c8XR6dLqb2q6nBp2LaJkV3Ms0kacNIg27snd04JGl+23+x98aP+CeXxTtfA/xes9Q8M+KNQ0qPWYLNNbiv1e0kklijfzLeWROXglG0nI2cjBFfsj8Uv8AgnVo/wDwameF/wDhqHwP4m1L4ua1eSp4I/sLXrWPTbURXoMzT+ZCWcsn2QALjB3nnivye/4K3f8ABUDWv+Ctn7Sel/EzXvC+keD77TPDtv4cSx0+6kuI3SG4uZxKXkAO4m5YYAwAi9yaQH6tf8Fcv+C337Lf7Sv/AARs8VfCz4d+PhqXxOvtN8PQ2dtF4c1GzkaW1v7GW5xcSWyRqVjinOfM+YZAJLYPjv8AwbN/8Fbv2ff2B/gX8T9K+O3jSTSNY8QeIbW90tJ9DvtWZ4UtjG7h4YZQnzYGCQemMivzw/4JLfsOaX/wUZ/b+8B/BnWdev8AwzY+MF1EyalZwJNNbfZdOurwbUYhTua3CnJ4DH0r2f8A4Lx/8EfvDv8AwR9+KvgHw3oPjDWvGkfjLR7jU5bjUbOO1a3aKcRhFEbHIIOcmmAfB34s+G/jr/wcs+FfGvg28XUPCfiz4/2mq6Pcrbvbie0m1pHiYRyKrplGHysoI6ECv67LzSbTV4dtxaW10V5UTRCTbx2yDX4c/wDBID/g2I8Ev4U/Zu/aaX4reK11hYNA+IJ0T+yrf7MZwIbz7N5m7d5ZYbN2M45619pf8F3f+CxXiL/gj98NPh7rnh/wXonjSXxtql5p8sWpXktqtqsEKSBl8sHJO8g5xjFIDrv2n/8AgvF+yb+xB8afEHwn+Ivj6Xw34s8NiEalpcPhfUrqKEXNvHdR4eC3eJg8U8bHaxwWIODkDU/Yp/4K6/st/wDBRj4u3ngf4Q+JbfxT4k03SZNZuLSTwreWKx2cUsMLP5lxbopw88ShQc/N0wCR/J//AMFJP219T/4KK/to+MvjLrGhWHhrUvGQsfO02yneeC2+y2FvZrtdwGO5bdWORwWI7V2//BIr/gqNrX/BJH9pHWPiVoPhTSfGN9q/hu48NvZajdSW8caTXNrcGUNGCdwNqq4Ixhz6UAf2gado1rpEWy1t4LWMtv2QxrGue5wBjPv7CrOw+o/Kvjj/AIIhf8FNNc/4Kv8A7Hl58Ttc8K6X4Qu7XxNd6D9hsLl7iExwQ28gkLOA24mcjHT5R619j4b+9+lKQSPxC/4O7/2JPi/+2L4++BMvwr+GvjD4gR+HbHWo9TfRNMkvFsWmksTEshUYUsEcgHstfZH/AASL/wCCVXwl+HX7DXwL1rxp8AfAGjfGDQdFsNQv9S1Pwpax6/Y6pE3mieSZo/OW4SQKwYtuUgdMV93zxRysd31HtRHKsUP+yOOnT0osFj8S/wDg9pi8r9k/4Ijt/wAJbe/+kdcT/wAEb/HH7A/h3/gkL4HPxYb9m+3+NlnY65LeT+IbLTz4giuBqd+1mzSyJ528Q/ZzGc5CiPbwBXdf8Htkiv8AsofBHHT/AIS28/8ASKviz/gmV/wav6x/wUe/Yi8EfGm0+Nmm+EIfGX27ZpMvhaS9e0+y39zZHMwukDbjbl/ujG/HOMk3A+WfgD+3H+3Z+1N45/4Rf4b/ABj/AGkvG3iJbV7w6bpPi3U7q5EKEB5Niy52qWUE/wC0K8z/AG+NM/aK0L4s6dH+0o/xObxxJo0b2J8c3FxPqX9nedOI/La4YuIfOFxgDjcH75r9evDX/BN64/4NTryT9qTV/F9v8crcr/whQ8N2Wmt4ekja/wASfaftLyXAwgtSNnlfN5mdw28u8S/sPy/8Hc2ow/tI6R4kh+Atp4TQfDV9AvrA+Ipbt7Qm/N4twj2oVWGqLH5ZQ4MBO479qsD6L/4KM/8ABJn4b+Ov+CD97efB39nfwLe/GDVvCfhefTLrw54RtP7enka6017mSOWOMS7zB55dgdxTzM5BOfFv+DZ/XbL/AII/fDj4t6T+1Jd2/wAA9S8calp134ftfG8g0mXWIbeKdJpIFlwZFRpYwxHTevrXtf8AwTC/4OKdP+Nn7angH9kSP4T3ljdaSLzwk3io+IlkhmOj6fcE3AtfswIE32LhDL8nm/ebbz6p/wAFyP8Agg3qX/BYbx98PtY0/wCJ9l8PV8DabeWBin0F9SN6Z5Y33BhcRbNvl4xg5zSA/Bm++OXg0/8AByK/xI/4SjQz4APx7HiH/hIBdK2n/wBnHWvO+1eaCV8ryvn3dMV+g3/B1z+2/wDB39tr9n34O+H/AIS/FHwP471i28YyvcwaPqkd01mktsYUlkCZKpvZRkjqa8z/AGtf+DP3Wv2Wf2YfiJ8UJvj7pevL8P8Aw5feIH05PBz2xvRawPMYhJ9sYIWCY3bWx6HpXx1/wQ5/4JP3n/BWD47+ItJs/HVn4Gb4e2Vpr5luNJbURe/6UqCIATRbOmd2W69O9Gm4WP6m/wBh39kLQf2F/wBmDwj8GfBs95B4f8D2IhkuHl8y4vruaR7i5lZmHHmSyO/ygAeZgBQAB1nxv8X2fwX+Hd5rVxe6tJNGvl2sLX7/AL+ZuEU8jjPJPYA11mn3iLr2sSMwVVkiJJPCjylr87f+C037Ymk3PhPQdH8K63b3y3UVwJ5rVy3k4IEnb7wVNvPeQV5+OrclPmW50YSj7WqqaPmP9p7/AIKofGTwz4huLfw78S9ejk85khSBLdllfJ+7ujJ2DoM9QMnk1D+z7+1X+1t8T9Wja9+Lfi42K8s4trNCw+gg/Lv61wf7H/7NzfFG7/4WB4jheS3u5D/ZtnIMqsCnAbn1xn6V9haVo/8AYGnN9jjjiRV6KQoxjoBXzv8AadROzbPsqWSwcbtI+HvjX/wVe/aZ8DeMryxtfjF4qt49PuWiZTbWRZ1Hc5gPtWj+yt/wWP8A2gD+1D4b0/xZ8Vte1jQZNShiurW5t7QQz27uqvu2RK3yqxIII5HfpXkP7begw2/xFu7hV8uS6ZvMAGMmvC9JOqXvjTw5Lo1je6hrEtzbi3t7O3aaadtxVkVF5YnA4HrXRQx83K7Zy4zK4xjywSuf1IfFv9mL4Z/tTyQaR8UvAfgn4lQ+HNt3p3/CRaJbagLYXClS6pIhVHbysEqBkKvFeK/Gj9ub9lf9gr4VeL/hHo/xI+E/wm1jwlpN6tn4Usb2DSZNJuZ4Huk8u3Tb5bu8wlG0AlpNw5NV/wDglh+2zeftlaL48/tLS7zSdU8IQ6fZ3cdwQy7nN7wowGGChGG56V/Of/wc2sbf/guX8dNufll0X/0xafX1NN80U0fK4ijKjUdOW6PXP+CHv/BQi3+Pv7Zs2g/tofF6fx58H4/DV5dRaZ8Vdek1bQhqiSQCCQQ3jPF9oWNpwjEbgGfB5Nfu1+zv+xX+wb+1j4Rm8R/DP4Q/s1eOtCtb1tPlv9H8J6Zd28dyiRyNCWWLG4JLGxX0dfUV/L//AMEf/wDgmnd/8FX/ANqu6+Fdn4yt/A80egXWtnUZtMbUFYQSQp5XliWL7xmB3buNvQ54/qC/4Inf8Etr/wD4JJfsq6v8M77xpa+PG1LxXc+I01GDSzpyxLNa2kHlGNpZCSptmbdu5EgGOM1Rifz+f8G8+nwaR/wcffD+ztYY7e1tda8WQxRRrtSJF0fVVVQBwAAAAB0Ffdv/AAdyfsJ/Gb9sD9on4P6h8Lvhf418fWOjeG7y3vrjRNLlvI7SVrlWVHKAhWK8gHkivyk/Yp/bdtf+Cbv/AAVn/wCF1Xnhu48XQ+Dde8QZ0mC+Fk90bqC9sh+9KOF2m4DfdOduOK/VGX/g940GUeZ/wzbrHbk+OIx3z/z4+1AH3ZPbeMP2af8Ag2nlt5P7e8D+PvAnwDIby5JLHU9D1C20fsylXimjkQHIIKkV+bv/AAbBeItQ/wCCqHxd+Lmj/tL6heftAaT4R0axvdDsviHO3iO30ieWeVJJbdLsyLE7qiqzIAWCgE44r9hbxG/4Kq/8EmJ/sKjwR/w0F8N28gTn+0f7D/tOxONxURmby/N7BN23tX5OeGfhK3/BniLjxzrd8Pj5H8b8aAllYQnw22jmyzcGUu5uvN3+dt27V27c5OcBAfLX/BcH/gi/8Xta/wCCoXxPuPgX+zn4o/4VW/8AZP8AYn/CJ+GDDo/GkWQuPIWFRGP9J8/dtHMm/POa+FP2hP8AgnP8dv2TfA1v4m+Jnwn8deBfD91fJpsN/rOlyWsEty8byLEGYDLFIpGA9EPpX9d37EH/AAUNtf20P+CbGl/tFW/hO48O2+paXrGpf2DJqK3Ukf8AZ11d27J54jQHzDaFgdny7+jY5/n0/wCC1/8Awca6b/wV0/ZP0P4a2nwl1DwDNpHiq18StfzeI01JZxDaXlv5Pli2iIyboNu3HHl4xzTA/Uf/AIM2f+UTGsf9lE1T/wBJLCv1ir8nf+DNn/lEzrH/AGUTVP8A0ksK/WKoJPxj/wCDrb/gpb8cv+CeXjb4JxfBv4gX3gmLxZZaxLqyQWFpdLePbvZCIn7RFJt2iVx8uOvOa+uPgV+0X8TPiJ/wb3L8VIdZ1LV/i9efBvUvEFnqVvZxy3lxrCafcSwSJCqbHk85UIQIQxAG05wfDf8Ag5B/4Ir/ABc/4K3+K/hJd/DHUPA2nweBbTVINQPiHUbi0LtcvaNH5Yigl3ACF85xjjrX3B/wTW/Zy179kz9gj4T/AAx8Uy6dN4i8DeHbbStQk0+ZprV5o8gmN2VWZe4JUH2qkNH8m3/BQ79sf9r79pnwN4e0/wDaQuviBc6Dpl89xo48Q+FE0eNbny9r7HW2hLtsOCuTgEHHSu3/AGOf+Ch37fHwK/Zv8N+FfgrqXxSt/hnpf2r+xk0jwRFqNkvmXU0s+ydrOQv/AKRJNnLna25eMYH6nf8AB7XD5X7J/wAEfmZv+KuvOrZ/5c//AK1fXn/BrwCf+CFfwM5I51/P/hQanQPyPzC/4Jo/Hn41f8FFv2jZvh7/AMFALrxHqXwETSJ9VEXjjSV8K6WNXieMWh+2RxWreZtkn2x+bhhu+U7eNH/gqD8Vfit/wTY/aB0PwP8A8E6Zde0/4J6p4dh1vWIvAOnDxfpjeIZLq6huC91JHdlJza29gGhEgAQRtsG/LfqT/wAF9f8Agnd4+/4Kd/sLj4Z/Dy88OWevHxNYav5mu3kttaLBBHOr/NHHI24mRcALzzzXwR+wv+2N4T/4NVPhDefs+ftIQ65r3jrxdrMnxEspvANump6aNMuYYbCNZJLmS1YT+dplxlRGyhTGQxJIAB9cfsRfsvfsLfBHxF4D+M8N98J/D3xwh05dT1PVrnx2Y72HVLyzaO/MttJd+WkjNPcK0bRgIWICqQMfe3w4+N/gv4x2t1ceD/F3hfxXb2LKlzJo2qwX625bO0OYmYKTg4zjODX8rv8AwUa/4ID/ABq+EPwP+In7VWr6x8OW+HGp3ieKYbO31K5fWBa6rfxLbIYfswiEi/bIi483aoV8M2AD96f8GRqeb8E/2hF/6jmi+3/LC7oCx+j3/BVX9on4f+K/2BP2g/Ael+OfBupeONQ8D67o1r4dtdatptWur57KaNbRLVXMzTtIQgiClyxAAzxX8uP7HPxj/aW/4Jd/F3T9W8M2/jr4Sr44u7TRb671Lw35KalCJ0cwq13ARkZz8mG/Cv1wvP8Ag2y/aAl/4LaN+0bHrHwt/wCEHb4v/wDCeC2/ta6/tQWH9qfa9vlfZfL87y/4fMxu/i716J/weDO8fwX/AGbvvDHxJBGT0/cDH9aOlgR9v/8ABRr4pax8PPAXiO30zTde3XEkElvqenWhuY7WRYc4lAyAMhRzjIY4ORX5HftfeL/EPxk074dx6nM194k8QW93aRRWYdDOfO3D7xZlYxqc5J6cZxX7PfHr9qIfCL4uato3laTL+5t7hjcSMrqGTHI3AY+Xivxb/bT/AGt9P0//AIK36H4g1FdOt9G0vXLVWWBdtvbq8QhkYDOOBIWJ9a+TzPEuU/ZR6M9jKcC1U9vLax67+yJ408RT+DfGHhLWLHUoYvCbNa6deyPuS6twAFKEKrDHTBxgV5F8QZvFng/XF1TwtoEfiKcX0du9hqE9wZJY2Xc0yOX2qgJC4wTkE9K+8LvQtPsNA1aWOS1t2unARlcL5yYBzk/wnNcf4Ls9K1HV7i1eO38+0wDyMEYzkHvXin6DTw83HkufDf7YPw0vtb8B2/ioeH5vDskIX7TZl/M2EgByDzlc4OeK81/Yp06ZvjrotzFHNI1pPtLRMVKpJgM2e3BNfod+1fo9j4n+EeqaWsa4uIwMoNxzyMf0r4w/Zp8Lf8In8SNaslVo7eG1XTbiWNiju6x7ZOexJ3AkVtCqkrGdWMIO8+h+kP8AwQ71+10HSf2gPEetanZ2Niz6Ze3d9eXKwwQR/wDExYySSuQFUA5LMQAK/GH/AIOF/gh40/aD/wCCufxm8feAfCPijxx4E1Q6VPZeJPD+lT6npF3HDo1jHK8d1ArQuqPHIjFWIVkYHBBA/UzQ/DNh4c/4JHftsx2CSKJPh3IX3Puzi01DGP1r2T/gg0Mf8G1Xgduw8L+Kzj1/4meq19tl828PFs/Os4qqrjalSOzf6I/HL/g0n+Jnhv4R/wDBU6+1bxZ4h0LwzpX/AAgupw/bNWv4rK3MjXFmVTzJGVdxwcDOTg+lf1KfDn4s+FvjBozan4R8SaB4p02OdrZrzSNQhvrdZV2lozJEzLuAZSVzkBhxyK/iu/4Jv/8ABOrx1/wVD+PM3wz+Hl54ZsfEUOkT615uvXUttaeRC8aON0UUrb8ypgbcYzyMCv6gP+Dev/gmv8QP+CWH7Fmt/Dn4j3nhe+1zUvGd5r8cug3Utzam3ms7KFAWkiibeGt5MjbgDbyc8djWp5p/Pt/wSK/Zy8E/td/8F4NB+HPxG0GDxR4L8Sa94oGo6ZNNLClz5NhqVxFl4mSQbZYY2+Vh90Z44r2L/g6n/wCCf/wf/wCCfnx2+E+i/B7wVaeCtM8QeH7281GGC9urr7TKlwqKxNxLIRhePlIFcp/wb88f8HJ3gX/sPeLv/TTq9fqv/wAHF3/BDr4w/wDBWT42fDbxB8NdT8A2OneEdEutOvl8QalcWkjyyziRTGIreUFQB1ODn1oKPsv/AIJL+JtN8G/8Ef8A9nvVdYv7HS9L034Y6Jc3d5eTrBb2sS2ERaSSRiFRQOSSQAKxP2x/D37Fn/BQLQ9D034w+Lvg/wCNrHw3cS3Wmw3HjqG2W1kkQI7AwXUZbKhRhsgYBGDzX5mftC/8F1Pgz+y9/wAEu/Gv7FXiLSfH9x8W/Avw7vPhNqF7Y6bby6FJq9vYvp8kkU73Cytb+cpIcwq23nYDxX5Sf8EyP+CRnxM/4K0eMfFmifDHUPBmm3ng2ygv71vEF7NaxvHM7IgjMUMpLZU5yBx3pcobn9QcvxH/AGYP2Vv2CPE3wx+F/wAQPhRoPhXRfDWsxaRo9r4ytrrynuEuZ3VWkuHkcvNNI2CTy+BxgD+NQjaMH0r9V/GX/Bn7+1F8N/B2r+ItQ8SfBV7HQbGfUbhYddv2laOGNpGCA2IBbCnAJAzjkda+M/8Agm7/AME1vHn/AAVZ+PWqfD34a3nhfTte0vQpvEM0mvXk1ra/Z4p7eBgGiilJffcxkDaBgNz0y1YD+gb/AIM2f+UTGsf9lE1T/wBJLCv1ir4Z/wCDfn/gnD4+/wCCXP7Dt/8ADb4jXvhrUNeufFd7riyaDdS3NqIJoLSNAXkijbeGhfI24wRya+49vuKhkiXLMkZ2jLelfzu/8FK/+Dpb9pb9kX9vr4tfDPwrp/wvm8O+CfElzpWnvqGhXEt00MbYXzHW5UM3uFGa/oiuNxjO3r9K/l7/AOC03/BCf9pzxR+2H+0Z8drX4fWcnwtj1HVfFzasfEemq40yGJriSfyDP5/EaMdmzecYCk4BcQR8v/8ABTD/AILifGb/AIKufD3wz4f+J9n4GtdP8J6jJqVkdD0yW0kaV4/LO8yTybl284ABz3ruv2Hv+Dlf9oj9gD9l/wAL/CPwJY/Dabwr4T+1mxbVdGnuLtvtN3Ndyb5FuEB/eTvjCjChRyRk9t/wbM/8FAvgZ/wT5+PvxO1r43a5Homj+IPDttZaaz6Hc6r5s63IdhthikKYXnJAB9c8V6p+3r/wTL+K/wDwVb/b88QftY/s++E9P8V/s7+LrrS7/SNdbUbTSTPBpdna2N8fsVy8Vynl3NjdJhogX8vcu5WUllHGn/g8h/a2H/MM+Dv/AITtz/8AJdfXn7Av7IfhH/g6V+Dmo/tA/tLSaxY+PPCOry/Dyzj8EXS6Tp66bbQw38bPFNHcM0xm1K4y28KUCDaCpJ+sv+IlX/gn2Sd3j61ySTz8P9U5/wDJOrmmf8HPf7B2gxldP+KE1kjOHZLfwTq8SseBkhbQAnA6+w9KQH1R+0l+wB4J/ay/YevP2f8AxVN4gh8C32m6bpcktjdJDqHlWM1vNARK0bLu3W0e47MEbuBnj8bP+Ch3ji+/4NRPFHhnwr+zE1vfaT8aLabV9ebx2n9ryxzWLLFCIDCbcIpW5csGDEkLgrg5+Gf+Cgn/AASi/ap+Enhj4jftDaxot7Y/B281V9ftdYj8V2js1jqN8q2cgtkuDMu/7VD8pQMu/wCYDBx9E/8ABtN/wVi+Af7C3ww+K1j+0F4wms9Q8Rarp8+jrd6Fe60WhjhnWTDRQyiMBnTgkE+nU0Af0Af8E9/jprn7TP7C3wh+I3iYaeviDx34S03XNRWxiMVsk9xbpK6xoWYqoLYALE8dTXH/APBR7/gmN8O/+CmfhzwXpfxGm8U29r4H1oa5px0W/jtHefZtxIXik3LjsAp96+P/ANpj/gvJ+y1+25+y945+Bvwb+IF5qnxK+Knh688HeDdJTw5qWmR3WqXsLW1nAJ5YEhgDTSIA7uiJnJZQCR8i/wDBID4deOP+Den4teK/Gf7Y8l14D8L/ABI0uDw54buRqY8RLd36TrPJGUsWnaLEQY75Aq9t3NDA+xf+Cq3w/wDBviL9snWNY8QaLY6jeaf4XtJVkuAzFADJ5fGQvDb+o7/Svwi/bW8YN4m+Jd/cW4VN13KkYRsrGqBVA/DFfrz/AMHBHxxf4U/tWSWJ8yNde8LafcJMo3JLGss6DBHXLgj8K/FTx7rknjnWPtVvG0n+l3AO1Djlgcn0Hv7V8fODWLnKWx9VQkvqajHc/SL/AIJ7/tu3nx2/Z7/4RfVrGPXvEHguGGJ43k2z3lmPlSZTjkrgIwI6hT3r6A8JeMtcvGVbbwlBoNivyvJPOC7+6hR6epFfm3/wTn+DHjPQPjpp/jbQbibTYNNRkuEeMst/C334SuRlGx36EA9q/SDxP411jVdJaaTS5NPt9gDSK3mbf5H9K8rFSgqrUWfXZRiubCctaNpLr3NTXvGVrc3TWMjrNIVJKLyFx6184yXS6R4nuJEHlSajcPOwB4HXn6nBP1Ne9fD7waNYt45rKN7i6uXVN2NzEn+lU/iz+xdrWifG22bS9P1PxDYX0EbW9taQlvKfkvGxXoQTwemCM1goycuZbHHjKy1iztPDzSf8Oh/21ZPmPmfDluoJ/wCXbUc/pX5O/su/8HGPx8/Y9/Y7034D+E7H4cN4J0mxv9PgfUdHnmvhHeTTzy7pVuEUsGuHwdgxwCDjJ/aD4v8Awj1j4Mf8Egf2vG17SbXQ4dS+HcyW8ZuQ7b1t70FXIJAbMseB1yw9a+a/+CQv/BYj9lP4Pf8ABIfwP8EPGPia3tvi3Jpes6O2nv4Uvbndd3t/etaobhLdovmWeH5t+FzgkYOPvMr/AN2ifnuYf7xI+T/+DOldn/BXLUFXt4A1Xr/18WX9a+8v+DhL/gv18cv+CWv7cuh/D34cWvw/ufD+oeDrLX5f7c0ma6uPtEt3eQuA6TxjZttk4xnLHnpj5h/4JI/sV/Eb/g3w/asb49ftYaDD8NfhbdaDdeFE1e31CDXXOo3LQywRG3sHmmG5baY79mwbcEgkZ/cP9j/9sH4Of8FLvhzefED4W3Vn4w8Pafqb6DLqF5oUtrL9piiilaMLdRJIVVbiMggbcswB4NeluciP4/f2T/28fGH7GH7Yum/HTwfHoNx420m51C8t01G1eax8y9gnt590SujEbLmTaAwwQvXFfdqf8HkH7WhkXdpvwdC55/4py5OP/Juv20/Zy/4LIfsjftZftOab8H/A2vWOrfEDVbi7tbfTZPBt3bI8lpDNPOPOlt1iGyOCU8sAcYGSRnp/27P+CmP7MP8AwTb8aaBofxg1LTfC+oeJrN7/AE+OLwncagJYUk8t2LW8Dhfm4wcHjPNAz+Vr4DTx/wDBS/8A4KweEf8AhZGIR8cviVa/8JH/AGN/ouw6lfr54t95fy+ZW27t2OOtf1Mf8E0P+CKPwf8A+CUfjDxRrfwuuvG1zdeMLOCw1Aa7qkV4ixwu8imMJDGVbLnJJIOBgDrXrkX7QPwks/2RV+PcMOnRfDmHw0PGkesR6Iyzrpog+0i4WHyxMGEfzBdocema+VU/4OmP2IY7ML/wtzUEkx0Pg3WTt9v+PXtQB9sftPSLL+zD8RmX5l/4RfU+Rz0tJa/m/wD+DLmFj/wVQ8aNtOF+FuosfYf2ppI/mRXyt/wXG/ba8P8A7Xv/AAVH+KXxG+FnizVtU8B+IxpI025VbqwWfydHsrab9xKEdcTQyr8yjOMjIIJ+P9M8R6hosnmWV5dWcm0oXt5TExU4yCVwccDj2pKLBH98u/8AebejelG4elflJ/wZ5apd6/8A8EotVnvry6vJo/iHqiq88zSMB9ksOAWJwOTx05Nfq3vqbEn5l/8ABwT/AMFv/HX/AASA8S/C6z8G+EfB/iiLx5a6nNdnXDcq1u1q9mqiPyXXIYXDE5z90YxyD6h8Tf2k9U/bF/4N1PiP8Uta0+w0nVvHfwL8Q6xdWdkXNvbPJpF2SibyW2j3JNfUvxn/AGTvhZ+0ZdafdfET4a+AfHtxpKPHZS+I/D9pqjWSOVLrEZ42MYYqpYLgEqM9K+Lv+Cmf/BQ/9lv4Mf8ABP8A/aD+Bei/Ej4beGPE2k/DzxF4U07wbYyR2b2d22mXEMVlFbooVCXdVVFAGSAKQH4Q/wDBAL/gkN4Q/wCCvXxf+IHhvxd4o8TeFbbwfolvqUE2jLA8k7yT+UVYSow2gDPGDkV9gftG/wDBZHxn/wAEAPFHiL9iH4feEPC/jrwP8MLUWtlr/iOSePVrxdXt11aYyiB0iGyTUZUXao+WNM5OSfxz+DH7SnxG/Zr1PULz4d+PPGngG81SJbe8uPDutXOly3UancqSNA6llDc4JxnmrFv8T/Enx5/aI0fxD448Qa34017WNUsYr/UtdvpNRvL5EMUKLLLMWaQLEiRgMSAihegArQo+iv8Agh9/wTf8M/8ABU79tv8A4Vb4q13XvDuljw7eax9t0cRNcK8DQqqkSqy7T5hzxnIGCK/YAf8ABlH8DRMI2+MHxX5/6Y6eOvv5Ne1f8F0v+CfF/wDDn9iaPUv2PfhHZ+Cfi8fElnA+p/C7RINB14aayT/aIzc2axTeQzLDvTdtYhMg448//wCCIX7cM37AH7Kev+Df24vinq3gf4uap4uuNa0qy+JeuTz6tNoj2dnFBNG0zO32c3NteKvON8cnHrIHzP8ADn/gp74o/wCCvfxwi/4Jy+MPD+g+F/hxrV1c+E5fFejNK2uLB4fWS9t5QsrNBvlfS4lk+TAWV9oBxj47/wCC/f8AwRu8E/8ABIT4gfDPR/CPizxT4oh8cadfXlzJrSQK1u1vLAiiPyVXgiU5zzwK/VH/AIKNfFD9lf46fspeONL/AGL5vhHfftXa1JbXHhG6+Gun2tj4ymm+3QTajJa3dukdwrmwF6ZWWQFojMGyGYHx7/gkfc6L+z/4U8bQ/wDBTL+z28S6hd2j+Az8ckXXLsWaJL9sFi18Jmji8wwFwhVWbZnJHABy/wCyx/wQD8A/s0/8E/fAX7b2k+OPGWp+OPAXgmz+MFp4euobZdJub+0tV1FbR2CCXyDIgQkMH2kkHOKufs5fHvUP+DubXNU+FvxdsbH4XaX8JrYeK9PvPBZaa4vZ52Fq0UoujImza5b5cHIHOM15bN4B/aYb/go23jCH/hbH/DCH/Ce/2oFTUbkfDxfAP23zD/oQf7L/AGUNP58ryvL8kY2Y4r37/grXrHg/47/DTwnaf8E030YfEK01WSXxh/wo6JNF1M6V5JEX2x7EQu9v5+0qrkqHIOM80Aav7av7Xv7MPhr44337IP7Xf/CeeItW+EcOm2PhT4oWELNq17BeadbXAW6W3GVmQyJH/qpo5cK7IjbifedE/wCDfj9lfwPdNGuqfGbfBLlo2eCRQwJ4yLEdPr26nqdz/gmF+wFZeIP+CU2j+Jv2l/hHoviL4/w2Otz6xr3j/QYNU8Ulobu7Fk0t5cq9wxjt0txES/yIkYXAVcfzXN/wU2/aSzn/AIaE+OGTyT/wnWqZJPJ/5b1jLD05u8kawr1IqybP6mfBn/BOz4F+Cba2tdJvviVbJEAqRizj9c5J+x85z1618+/Bj9tn9hr9o7462Hwv8L/FD4l33jDU7i4s7fT28PSwrJJAkjygu1gFGFic5J7evFfzzp/wU3/aSjkD/wDDQnxw3LyD/wAJ1qn/AMfr9Av+CBf/AAS0/aS+En/BW74O/Ebx/wDCDx3pPhGG51G9v9d1GzP2YCfSr1UkeTJ+/JKgyepcetY/UaHWKNv7QxPSb+8/UT9pz4//ALIH/BNrxD4dX4hfEH4jeGbnxLFNPpwTRXuVnWFkWQkR2RAwXQc9c+1ebwf8F0f2Bba+a5i+OHxQ85n3bU8MXKlj6cWA6/Wv08+MP7H3wl/aCubC6+IPwx+H/jmbS43jspPEPh+11NrNXKl1iM8bbAxVSQuMlR6CvzT/AOCq3jP/AIJ4/Dv9kb9oDwXoOk/sy6F8XtH8L63pNhYWHhnTrbWLLWEt5Y0iiKQB0nWYAAqQQ3Q960jhaKVlFHNLE1pv35N/MoeG/wBpnwB/wcpW3xK/Z9+HetfED4c/CHwnZ6dquua+sMH9reMJnnkEdu0cu/yrVXhjkyT5kjKgKxqpV+Sv/wDgz2+D/wACdPufHdl8V/idfXvguJ9et4J7exWGeS1UzojkR52lkAOOcZ6V8e/8Gln7avwo/Y2+LHxsvPix4+8N+A7XxBpGlwadLq9x5C3jxz3DSKnByV3KT9RXff8ABRG//a1/ak/4KZ+JPih8BfEfxu8U/sr63qWl3FjqvhfxBfjwrd6fDaWsOpbY0lWIxLPFeJKNmCySZB5ztGnGC5Y7ESk27s6D4Af8FE/EX/B1R8Qf+GYfitoWi/DXwra2knjddW8ItLJqDXNntiSE/aWePy2F25Py5yq4I5r9cv8AglX/AMEyPDv/AASe/Z31L4a+EPEXiHxRpOoeIp/ETXWrxwrOkssFtC0Q8pVXYBbBgSM5cj0rm/2Hviv+wv40+OP2P9ndf2f1+IC6dOx/4QrQ7Gz1H7EGjEoLwQo3lbvLyM4ztr8jf+Dtj9s34wfs7/8ABTDwzonw/wDit8SPA+jXXw7069lsNA8S3um20k7X+pI0pjhkVd5VEBbGSEX0GLjq7Aj9Df2Jf+DaX4a/sP8A7emh/HzQ/H/xC1rxDot5qd6un6hFZrYytf2tzbSA7Iw+FW5Zhg9VXPGa7v8A4K2/8EGfAv8AwV5+JXhHxH4x8Z+MvCs/g3TZdNt4tFjtmS4SSUSln81GO4HjjjFfzRfAj9sv9s39pr4o6b4L+H/xo/aI8WeLNWWZrLS9O8capJcXIiieaTavn87Y43Y+ymvoM/s7/wDBVz+/+2J+HifVv/kinawz+k3/AIYI0Qf8E1W/Zq/tzWv+Eb/4QL/hABq7Rxfbvsv2P7J5+3b5fmbOcYxmvzVb/gyk+B7Ju/4W98WF+sOnnH/kGvkD/gnb8B/+ClWi/t8fBm9+In/DU7+A7XxppM3iEa14j1KbTf7PW7jNx9oSSco0XlhtwYEEZGDX9CX7TH7Z/wAJv2MdG0q9+Knj7w54Es9elkhsJtXufJS8kQKXVDjkgOpPsc9M0AfkR8W/+DNj4LfDf4Q+K/EkHxZ+KV1N4f0a91KKOSGwWOV4YHkVWIiztLJg4wcdx1r8uP8Agg3/AMEt/Cv/AAVm/a/1z4b+LfEmv+GNN0nwbc+JkutHWJrh5YryytxGfNVl2kXTEkDOUAz1r2z/AIKw/wDBVfxH44/4LS+Jrj4c/tAeMrr4D6hrHh6MQaP4tvY/DlxZf2dp0d+vkLIImiaQXIlXZhiZNwOTn7l/4Kv+IvhT8d/2ddJ0f/gm+PBn/C8rTxHBe60fgnaw6Pr6+HVt7qO486ayWKVrP7XJp4ZCxUyGEkHAIYH6T/8ABLP/AIJo+HP+CUf7Otz8MfCfiLXvE+kXmuXOvNd6wkK3CSTRQRGMeUqrtHkKeRnLnnAFfTW418A/8G4/gr48+B/2B9Qs/wBoz/hYn/CfN4xv5oP+EzvprzUTYG3sxFh5nd/K8xZdoJwDuwMGvv7d7VLA+B/+C0//AAXO0n/gjvr3w907VPhvqfjxfiBb39xG9prMen/Yvsr26lSGik37vPByCMbe+a/K/wDa6/4ITat+35+z/wDFD9vWx+JWm+G9H8beHNW+Ksfg6fRXurm0ijtZrr7EbsTKrMRFt8zywMnO3HFfs1/wUb/Y0/ZP/at13wncftJWvgy5v9DiuU0D+3fFs+hsschi8/y1juYRLykOSQ2OOmefwS/4KIftmftY/ArxB8YPgj8IbzxtB+yVotvqXhrQ7fTvCcOpaMPDDQvGwTU3tpJZIPIeT/SDcM23LeZkZpWFY/KqY5kNfrl/wSf/AODX7xB+3n+yj8Nfj5ZfGHRvDdr4gvLm6j0afw7LdSQ/YdTntSDKs6g7zbFvujAcDnGa/LPwF8GvF3xcvbq18J+FPEfie6s4xNcw6Ppk189vGTtDusSsVUnABOOa/qO/4ISfHLwz+zN/wQy+HfhXxl4v8O+APH2gaf4ill0TX9St9N1Swlk1fUZ7cyWtwyyKXR4pFDphldDgqwzRR9Lf8FcP+Cl2n/8ABKv9lRfinqHhG78aRHXLXRv7Nt9QWxkBuFmYSeY0cgwPJPG3nPWvyj8cfsSXX/B3PrUP7R/h3xJa/Aux8G24+HEug6naNr093LaO2oG7E0bQKqMuqJGEKkgwsc4YAeN/8Eof+Chvin/gsH+1BN8H/wBtj4h6P42+DA0O48QLp2uGx8OWw1S2aFLeT7VZrbS7gksw2GXa24kqxAI0P+CvH7cOrf8ABGD9o7Qfhj+wv480PwJ8ItZ8M2/irVbLQZbLxLbSa5NdXlrPM1zeC6kRzbW1mpjEgUBFO0FixQj6/wD+CV3/AAav6/8A8E4v2+vAHxmvPjRoviy18GNftJpUHhyW0kuvtOn3NmMSG4cLtNwG5U5C475r2/8A4Lr/APBCrWv+CwvxE+HeraX8SdL8Br4G0+9snjutHk1BrwzyROHG2VNu3yiOc5yK+B/+CN//AAVq/ba+KH/BQz4ZWf7QHjDxhY/BPUlv59c1DxB4PstE0jyv7LupLR5L77JEI1e4FvsIkUOzIozuAP0N/wAHC3/BTX9oD4V/Ej4Zr+x/44vde0u+06+Pic+DdGsfFUcFwskP2cTN5Fx5DFDJgZXcATg44APsP9pr4AT/ALK//Bvh8Qfhjeajb6zdfD/4G6j4ekv4YDBHeta6PJD5oQklQxTOCTjNfkr/AMGTT5/a4+NBbn/ijbX/ANLlr5w+LX/BT/8A4KWfHD4XeIvBfiy5+LWreGvFmnXGkarZN8MraEXdrPGY5Y98enq67lYjcjBhngg814r+xf41/bJ/4J6+LNa1z4O+Fvit4N1TxBZpYahOngV703ECv5ipi5tZVXDDOVAPvjigD92v+Cn3/ByroP7F37afjH9nG++Eusa/cwQ2WmtrsOvxW8bf2jYwyhxAYGPyfaQCN/zFCeM1+T//AAVx/wCDcPWv+CT37K1v8TdS+LGkeNo7jxBa+Hxp9roMtk6NNFPIJDI07jAFuRjbzu6jv8zftGaP+1R+1V+0BffFn4ieB/ilr3jy8NrPdaw/gmW13G1hjihYxw2yRDZHCg+4M7Mtkkmv0U/4Iu/tb/EL/gvd+11qHwT/AGtvEB+L/wAMLHw5d+LLfRJrK20ZYtTtp7eGG5E2nR28x2x3VwuwyFCJDlSQpAB+KWM/ka/tW/ar/bQtP+CeP/BMm5+MV54fuvFVr4H8O6RM+lQ3YtJLvz3tLUDzGRgu0zhiSpyFI69PnXx//wAEJf8Agmr8Lte/sjxT4H+H3hrU2iE32TVPiJqVjcGNs4cJJqCttOGwwGPlPocfm1+yT+1v+0h+2T+2jo3wR/aivvFF/wDska3fX1hr9tr/AIdi0HRn0+1gnm07zNUjgglRRcQWZVxcAyMEUl95DK9wR7un/B734VlUD/hnXxJ82QP+Kth5/wDJWvw5/bj/AGg4/wBq/wDbH+JnxQtdKn0O38f+I7zXotPnnE8lkLiVpBGZAAG27sZAAOOlfen/AAcw/skfsz/skeL/AIPxfs02fhGzsNasdVfXv7C8TS64HljktRB5hkuJjHhZJMAFd2T128fbmlf8EVP2Xrj/AIN6m+OMnwpsT8UV+CMnioa1/bWp5/tRdIaVbnyftPkZ80B9nl7Ceq44oJPy1/4Iy/8ABG/Vv+Cv3i/x5pOn+P8AT/AMngWxs7ySa60l78XYuJJYwFCyx7dvl5zznIFfpN4c/wCCuem/8EU/DEf/AAT51fwPffEHWfByP4bl8a2Oqrp1rctrbNfLKLR4pGXyV1NUIMp3GEkbQwA/JP8A4Jz/ALW/7Tn7K/iHxVdfs33Xiq11DXLa3i14aF4Yh1tmijdzD5iSW8wjG5nwQFzkjJAwP3g/Yp/4Jj/Df9uf/gnRpP7Tv7Rnw5v9d/ac1TTdW1nWfEGqz3+jXxvNPuruGwkexgkgt4/Lt7W0VVEAV1jUsG3EswNb/gi7/wAG3evf8Eov2xZfihqXxZ0jxvbP4fvNC+wW2hS2MimaSBhJvaZxhfJIxjv14q1/wW4/4Nzdc/4K2/tbaT8TNP8Airo/ge20rwra+HTY3GhS38krQ3N3OZd6zIACLkLtwfudea/FdP8Ag5u/bkyf+L7XnzEt/wAivonU8/8APn+lKf8Ag5p/bkl4/wCF7Xx46DwvonP/AJJ04opH62/8EpP+DWzxB/wTh/b28B/Ga8+Mmi+LrPweNQV9Mg8OTWct19q065sxtkadwu03AY5U5CEcZyPor/gsx/wX00f/AII7/E3wX4b1T4aap48bxlpc+px3FrrUdgLYRSiIoQ0L7s5zkEfSvpj4RftxfCm/+FvhubVvi78NTqlxpdrLemXxRYI5naFDLuUSDB3k5GBjpx0r8HP+Dy/4seFPjB+0d8Fbzwl4n8O+KLWz8M30c82kalDfJAxu1IVjEzBSRyAetEgPrv8AZM/4PAfDf7V37UXw7+GNr8Cte0Wf4g+I7Dw9HqEnimK4Wxa6nSESmMWy7wpfcV3DIHUVx/8AwexzNP8As9/AJtv3vEWqZAHraQd6/n6+Dvxc8QfAL4seG/G/hLUP7J8UeEtSg1bSb3yIpzaXUEgkik2Sq0bbWUHDqynHINft7/wQy8far/wcOePfiD4Y/bIu/wDhcvh/4Zaba6t4btZYU0MaZc3MkkM8gbTFtnk3RxoNshZV25AB5qYsZ82fsS/8GzWtftqf8E4dL/aMt/i/pfhux1DS9Y1I6HN4ekuZohp11d27J54nUHebQsDsG3eBhsZPgv8AwRM/4Kn6d/wSW/au1z4mal4L1Dxxa6x4SufDaafa6kti8LzXdlcecXaNwQPshXGAcuDnjB/qV+H2i/s1/sbfA0/AXSfEngDwP4R0e2urFvDF74sWO4tYr55LmdHNxcG5XzTcvICWztlBUgbcfjP/AMF+P+CWn7Kvwq/Yy8O3X7Jvg7Q9c+JE3jC0t7+28I+Jb7xRqCaSbK9Mzvb/AGm4KxeclqDLsGGZF3Dfg1e+jEfr1/wSI/4Kaaf/AMFZv2Xbn4pab4PvvBNvZ6/daC2n3WoJfM7QRQSeaJFROD54G0rwVPUEV9UY/wB2vy4/4NGfhz4h+FX/AAS21jS/FHh/XPDept4/1OZbTVbCWynaNrSww4SRVYqcEAgYyCOoNfqTmpkI/LP/AIOJ/wDgib8Vf+CvHjH4VXnw4174d6Hb+A7TU7fUB4nvLu3a4a6ktGQxC3tZwQBAwJYqRkYBzmvor4a/sB+MPBn/AAQ+uf2arjUvDbeOpPhVqXgUXsVzO2kfbrmxnt0lMhiEvk75VJbytwXPyE8H5T/4OZ/+Cwvxo/4JX+Mfg7afCi+8O2lv42s9Wm1IanpCXxZ7d7RYyhZht4mfPrkV+Xb/APB3X+2JGxVtZ+H24cEHwtHx/wCRKLDP1O/4N5f+CFHxc/4JJ/HP4g+JviN4m+Heu6f4u0GDS7SPw3fXtxLFIlx5paUT2sIC7eAQWOT0A5rwv/gsf/wbEfHn/gof/wAFI/iR8YvBni74P6Z4a8X/ANl/Y7XXNT1GG+j+zaXaWcnmJDYyoMyW7kbZGypUnByB8Rn/AIO8f2xP+gz8P/8Awlo//jlJ/wAReP7Yn/QY+H//AIS0f/xyjUVz0O4/4Muf2pZid3xB+ALZ9dZ1c/8AuNpYv+DLz9qRIzGfiB8A/LZSMDWtX6kcf8w31xXni/8AB3b+2If+Yz8P/U48LRf/AByv2q/4NyP+CjnxM/4KZfsN+KPiB8UrrRrrXtI8c3eg276bp62cYtYrHT51BRSQW33Mh3dcEDtQmM+O/jV/wU08B/8ABXb9l64/4J3/AA80rxfonxq1yysvCsGt+Jba3g8LLd6BJDe3btPBPNdCOSPS5xEwtSxd4wyoCzL9T/8ABut/wR7+Jn/BIrwB8T9I+I2u+B9cuPG2p2F5Yv4Zvbq4jiSCKdHEvn28BBJlXAUMODyDXj3/AAUj/wCCXPwr/wCCNvwI+In7Z/wXtddsPjd4HvU1TTLrWdSOo6b5+q38Wn3Ze2YKGDQX9wF5+Virc7efzVH/AAdz/tjPjbrHw/OTgf8AFLRc/wDj9AH9Pv7Svx00v9l/9nzxv8SNcttSvtF8B6Hea/fwaeiPdS29rC00ixK7opcqhwGZQT3Fflqv/B6h+y8qc+APj8Tj/oDaR/8ALKvpH4yfGvXv2k/+Dbfxb8QfE0ltceJPG3wCvNa1N7WDyonubjRHkkKIMhQWY8DgV/H2q4QbuBRESP7af2Zv24PCv/BRv/gntN8XvBWn+ItJ8N+KdK1eK1ttahhhvozbPcWrl1hllQZeFiMOeCM4PA/l3/4IEf8ABSjwH/wSv/bW1D4l/ELSfFutaLd+E7zQUtvDtrb3F4J5ri0kRis88KeWFgcEh85K/KeSF/ZH/wCDg39or9i/9lbS/gz4G1LwjB4J0qK9ht47zQUurlVu5pp5syFgT880mMjgYHatD/g3Y/4J8/Dj/gpT+3pqnw6+J0GrXfh228IX2sRLpt+bOb7TFcWiId4Byu2WTjHcHtQM+4v2wP2A/Fv/AAdR/FQftLfADUvDXg7wPpOnReBnsfiFPNp+rG+szJcSSCOxivIvJK3sQVjKGJV8oAAW/Wn/AIKZfsNeLf21P+CU/jD4E+G9Q8O6d4r17R9J0+2utVnmj02OS0u7SeQs8cUkgVlt2CkRk5K5A5x3v7AH/BPr4df8E0fgvcfDr4X2+sWvhy81eXWpU1O+a9mNzNHFG+HIGF2wJgY65Pev53fiR/wdofteeFviL4g0u21rwCLfTdSubWEP4XjLbElZVyd45wBQB8v/APBU3/gjj8Sv+CQuqeDtO+JGveA9cm8d215c2DeGru6uFiW2aFZBKZ7eEqT5y4wGBw3Tv/SL+y58C9Y/ag/4NuvBfw38O3Gm2evePvgdBoFhPqMjx2cM1zpfko8rIjuEBfJKoxwOAa/mZ/4KN/8ABWD4vf8ABU/VPCmofFi80C8m8Fw3Nvpn9maYliqrcGNpd+0ncSYUxnpg+tf1h/8ABGP/AJRLfs4f9k70b/0kjoYj49/4N3P+CHXxc/4JGfEP4oat8RvEnw/1y18b6dYWdinhm/vLh4XgmmdzKLi1gAGJAAVLHORgV03/AAUE/wCDiz4L/s1ftEePv2aPEHhX4pXnjtoYtA/tCx0+xk0kz6lZRSQMZHvEm2KLqMOfKJG1sBsDP6ZZDHb/AEr+TP8A4L2RMf8Ag5O8dLtO5vE/hXA9f+JZpdAHrLf8GWH7UB2gfED4BqQBkf2zq55/8FtLH/wZZftRRuD/AMLA+AXX/oM6v/8AK2v6dGDE/dr8R/8Ag4x/4Ls/tAf8EyP27dD8B/DC+8K2/hvUPBdjrkkepaIt5L9plvL+FyHLAhStvHx0GPc00+wz8P8A9j39gDxV+29+21pfwG8K6l4Z03xfrF3qVnBeatLNFpyPY21xcS7njieQBltnCkRnJK5xzj9BD/wZbftSCPaPiB+z+B7azq3P/lNrxH/g2f8AE914z/4L7fCHVr3yzearc+I7y4KLtUySaHqjtgdhknAr9Xf+Dlf/AILTfGz/AIJa/G34Y6D8KdQ8M2un+KtCur/UE1TSVvmaWO4EaFSWBUbcjFOTaA/Nr9pD/g0p/aK/Zc/Z78cfEjxD42+Cl5oXgLQ7zxBfw6bq2pyXk0FtC8zrEslgiFyEIAZ1GT1r37/gySjz8ffj8q9T4c0vHv8A6TPX6bfHT42a9+0n/wAG2Hi74g+KJLWbxH42+Al3repvbQiGFri40d5ZCiDhRuY4HavzJ/4MjZMfH/4+H08OaZ/6VT0Aeof8Fi/+DYb49/8ABRH/AIKQ/Eb4xeDfF3wh0vw14u/swWdrrup6hDfx/ZdKs7OTzEhsZUGZLdyu1zlSpOCSBwP7Gv7FXij/AINQvidd/tFftCah4d8aeC/F2ly/Dq1svhzPPf6tHf3csN/FLJHfRWcX2cRaZcKWEpcO8YCkElNL/gtj/wAHGX7Sn7CP/BT/AOJ3wn8Aal4Nh8J+F/7KNhHf6At1cJ9o0iyupA0hYFv3s8hGRwCB2FfnB/wUL/4Ls/Hr/gpv8E9P8AfFK88KXPh/S9ah16BNN0UWUwuYoZ4VJcMcrsuJBjHUg9qFfYD+pn/gmp/wUh8D/wDBVL4BT/E74f6T4s0fQ7PWrjQWt/EMEEF2ZoYoZGbbDNMm0idcHfk4PAr6L3fX86/J3/gza/5RMaz/ANlF1T/0j0+v1j2L71LBn89//B8Odvj/APZvP/UP8Qf+jNOr9MP+CUPizwl8Ev8AghV8IfHniqG1t9A8H/DJNe1e7+wi4khtba3knncKql3Kxox2qCTjA5r80P8Ag+K/5Hz9m/8A7B3iH/0Zp1fc/wAEf+VTW+/7Nz1n/wBM13UkksX/AAc4/sFqnzfEglvX/hBNUH/tpVnTf+DmD9hPXdStrGz+IbSXV5KkEKDwLqnzuxCqObXHJIr+Seui+EH/ACVnwv8A9he0/wDRyVoUf04/8HfegWek/wDBIqOSCzs7eZvHWkhmigWMn91d8cCsX/gyzG7/AIJY+Ov+yrah/wCmnR66f/g8Sb/jUTD/ANj3pX/oq7rlf+DLx/I/4JV+PHxu2/FTUTj/ALhOkVIH5G/sA/tZ+Dv2Pv8Agvx/wn3xS1y6074f+GPGfir+0pnt59QSETW+pW8P7iNXdszSxj5VOM5OACa+3f8AgsZ8Orj/AIOPfG3gLxB+xjp9r8R9D+FVjd6d4pll2eG/sFxeSRyW6bdQ8hpdyQSHMYcLjnBIB9/+Jn/Bm58Ifiz8SfEXim8+L3xLtrzxLqdzqs8MVlZBInnlaVlXKE4BY4z2xX2J/wAEiv8Agjr4R/4I+eGvHGj+E/GHiTxZD46u7S7uG1iCGNrZrdJVATygAQwlOcjjA96Yan8ivxw8DeMv2e/ix4m+Hviqe6sPEHg3ULjQtVsUv/Phtp7dzFJEGRjGyqVIypKkdOK+/wD/AINkv+CifwX/AOCeP7QvxN174168dD0nxD4bg0/TnXRbjUvOnW6EjLtgikK4UZywAPrXk37VvwKsP2of+DiH4g/DbVL+80vTfH3xzvfD9zeWqq09rHdaw8LSIGBUsobIzxkV7d/wXy/4IH+Bf+CQ3wT8BeKfCvjjxd4suvFuuTaTcQ6xBbxxwIluZQ6eUoO7IxzkYoA9U/bm/wCCZPxc/wCCx/8AwUOvP2ov2cfCdj4y+BfjK90l9G1p9Ws9HeddPgt7G8zaXTxXEey4tbhfmjG4KGXcrKT+oH/Bxf8AsB/Ez9uz9gqz8G/Bbw3Zap4ui8Z2OrSwJfW2ls1pHBepI3myvGpw80fyliTnIHGa/G//AIJXf8HM3xG/YL/Zy+HvwI0L4b+B9e0XR9Rmgj1O+ubpbqX7bfyXDlgjBfla4ZRgdFHfNf1ORthmVjuYE87etAH5+/8ABuP+xD8Wv2Bf+Cf2o+Bvi9ov9h+LZvGV/qsNsNWt9RBtZbezRH8yCSRBl4pflLAgjJHPOdrn/Byr+wn4a1q80+++Ifl31jO9vcIPAuqNskRirDP2TBwwIyMj69a8e/4Lif8ABxp8QP8AglJ+2nZ/DPwz8PfBXirS7rwxZ68bvU7m5huFkmmuI2T9223aPJBHGfmPWv5mfHHiV/GfjLVtYkjjhk1a9mvXjQkqjSOXIGecAnHPpQB+oP8AwdAf8FKfgX/wUU8c/B27+CPiD/hILXwrp2q2+rN/Yd1pfkPNLbNEMTxR78iJzlQQPqa/oG/4IxHP/BJb9nH/ALJ3o3/pJHX8VNpH5soDKWX2OK/bz/gj5/wcyfEax8Zfs4fsxr8NvBP/AAjpvtC8A/2wbq6+3C3aSK1Nxt3eX5oU7sY2546UmgPa/wDg9p1S60j4Mfs/yWt1cWzNrmsBjFK0e7/R7brgivyd+Bf/AAQx/ak/av8A2dbD41eDfA9trngLVLW6vrfVpfE2nwTPFaSSwysY5Z1mBRreQAFcnaMDBFf0tf8ABXb/AII5+F/+CwXhLwTo/i7xf4k8JReBry7vbZ9Ht4JGuTcJEhDiUHAURgjHqc9q9K/Ys/YC0X9iz9gDSf2f9H17WNY0HR7DU9Oi1S9iiS8dL64uZ3YqoCZRrlgOMEKue9CQWP4o5vFuqyuzf2rqLbuSTcvk/Xmvqf8AYs/4I0/tKf8ABSL4RXXjz4W+DIfF/h2w1WXQp7q58R2NnJHcxRwytHsuZkfaFuI2yAQSfUEV+w6f8GT/AMGxhT8aPiaG6Y+wWP8A8RX6Gf8ABJ//AIJieH/+CTn7POofDXwt4k1zxTpWqeI5/ET3uqxQxzJLNb20DRgRgDYBbIQeuWbsBVRA/mD/AOCJP7RHg3/gn1/wVx+H/jn4r6nJ4b8N+BrjWrTWLmO1lvjbSvpd7Zqqpbq7vmaVRlVIwc5wK/oG1H/g6C/YR1aZXuvidcXTIMAzeCNWkIHoCbXiv5Xf2g42k+Pfjpscf8JBqB/8mZK/RL/ggP8A8EGvA3/BXv4SfELxH4s8ceLPCtx4P1i20y3g0eC2kSdZYTIXcyqeQRjAxVPuB+mP/BRH/g45/Y7+Ov8AwT3+NHw/8H/Em+vvEfi7wRquiaPYjwpqlsk1zPaSRQx73t1jQFmUZYhQO9fmv/wa/wD/AAUq+DP/AATc+L/xc1b4weLJvCuneKtFsbPTXTSLzUTcSx3EjSArbxSFcKwOWwDnAJPFfA37c/wB0/8AZU/bL+KXwz0q+u9U03wB4o1Dw/b3l0FWa6S2uHiEjhflDMFyQOK8pPAqZOwH9sFl+0H8Ov23P+CdXiz4rfD+aHXvCvinwxrhsdTuNNe1nuTbrdWkpKTIsi4lgdRuA+VRjjFfyD/sOfsC/FD/AIKMfFHUPBHwj8Ow+JvFGm6TLrc9rLqdtp6x2kcsELSb7iREJElxENoO75s4wDX9KX/BCZSf+DY7wuBnP/CLeM+B/wBhXWK/np/4JMf8FQPEX/BJb9oPWfiT4X8M6D4r1PWPDk/hqSz1WaWOGOKa4tbgygxENuBtVXB4w57gURA/pI/4Nsf2Fvih/wAE8/8Agn1qHgP4teH4PDXii68ZX+rpZxajbX4+yyW9pGjmS3d0yWhf5d2QAMgZFfoNhv736V8Y/wDBDL/gpl4k/wCCrP7Gd58TvFHhvQ/C+o2vie80IWelSSyQNHDDbSLJmQltxM5B5x8or7QzUyBn89v/AAfFHHjz9m//ALB/iH/0Zp1ff37KXgTWPin/AMGudh4X8O6dc6v4g8S/APUtK0uwt13TXt1PpVzFDEg7s7sqj3Ir4F/4PgYw3j/9m/dnb/Z/iHOP+uunVwf7Dv8Awd32/wCxb+yB8OfhQ37Ps3iY+AdDt9HOq/8ACbrZ/bjEMeYIvsD7AfTe31pWJPhEf8EEP2x3GR+zz8QvxtYx/wCz1ufDP/gg/wDthaP8R/D95c/s/fECG3tdTtppXa3iwiLKpJPz9gDX6TN/wfFWrH/k2G4/8OGP/lbTf+I4m1HT9mG4H0+Ia/8Aysqij6i/4PETn/gkVD6f8J5pWPf9zd1zP/Blou//AIJY+OgRkf8AC1tRP/lJ0evzc/4LF/8ABy3D/wAFYf2QV+FcfwYm8AtHr1prY1I+LBqgPkJMvleV9jh+95ud2/jb0NfpJ/wZa8f8EsPHY9fipqI/8pOkUgPzy/aB/Z5/4KoXnx78cTeG7z9rRPDsviHUH0tbLxpqUVstqbmQw+Ui3YCp5e3aAAAMYFfqB/wbQfDr9qbwD8PPi4v7UM3xbm1S51LTW8P/APCda5c6nIIViuPO+zmaWQqu5o923AJ25zjj7I/4Kc/tur/wTb/YY8dfGhvDLeMh4JFix0ZdR/s77Z9pv7az/wBf5Uuzb9o3/wCrbOzHGcjw/wD4Imf8FoB/wWT8I/EHWF+G7fDlfAd7ZWXktr/9rte/aI5n37hbQbNvlYxhs5zkdKAPwT1Mbv8Ag6wb/s5Qf+pAK/qg+Nf7M3w5/aY021sPiR8P/BPxAsdNnNzaWviXQrXVobWQrtLxpcI4RivBKgEjjNfyO/tjfHtf2Vv+Dgv4kfE2TSW15Ph/8b7/AMQnTVuvspv/ALLq7zeT5ux/L3bMbtjYznB6V+/v/BFD/g4Bj/4LG/F7xr4Wj+Esnw5/4Q/R4tWN03icat9r3z+V5ez7JBsxndu3NnpgdaYI/Jz/AILj/wDBFr40XP8AwU2+IniL4E/s+6npfwutbfSrrSJvCWkW+naVA0WmWpuJIUhKKhFwsxYqAS4Y9TmvRv8Ag1C/bf8AjR+0l/wU41fQ/iF8Xvil460O38Balex6d4i8WX+qWiTrdWKrKIp5nQOFdwGxkBjzzX9DHxjjDfCbxVx839jXg/8AID1/HX/wRl/4Kfw/8Ekv2q7/AOKMngmTx99t8M3WgLpiauNL2mee2l83zfJm4UQEbdnO7qMcgWP64/jD+wp8E/2ifGS+IPiB8H/hX4615YEtRqPiHwnp+qXfkpkrF5s8LvsUsxCg4BY+pr4H/wCDhj/gnt8Afgn/AMEefjP4n8GfAz4OeE/Eml2mmtZato3gvTbC+sy+rWMbGOaKFXQsjup2kZDEdCa+WJf+D46FomK/swzZxxn4igf+4w1+sX7fP7Js3/BUn/gnR4i+GUfiBfA7fEzS9Nn/ALRex/tL+zdtzaXuDEJIvMJEPl5Drjdu7baVtQtqfjn/AMGd/wCyT8Kf2nPhx8eJPiT8MPh38QpdG1PRk0+TxN4bstWexWSK8Mgia4jcoGKISFwDtHpXlPi7/gl18Wv2Zv8AgurN8Y5Pg3qngn9nvwD8XU8Tya5a6dDZaFonh601FZmukSPCx28dtGXwq8KvTPFe+2vjH/iDWVvDctr/AMNGn4+D+1PPjl/4RH+wv7MPlbNpF95/m/bc7sx7PKxht2V88/a+/wCDw6H9rT9lP4kfC/8A4Z5m8O/8LC8M6h4d/tP/AITsXX9n/ard4RN5X9np5m3fnbvXOMZFAH69J/wXu/Y4D/8AJw3w9/8AAmX/AOIqT/h/h+xv/wBHCfD3/wACZP8A4iv5s/8Agid/wRkb/gsb40+IGix/EZfh0fAljaXpmbQTrAvhPLJHtCi4gMe3yyc5bOQMDGT4j/wU4/Yob/gnN+3B46+C7+Jh4xbwW9mh1ddP+wLd/aLK3u/9T5suzaJwn32ztzxnALAz+gj/AILI/wDBQy1/b/8A2TbXwT+xH8WtW8YfGq38QWuqSWXw81m5sdYTSo4p0uZDJG0TeSHkgDLuwSycHHH4g/tN/tUft3fsZ+P7fwr8UvjJ+0x4J8RXlgmqQ2GpfEDVlmktneSNJQFuSNpeKRfqhr6U/wCDOj5v+Ct99nP/ACIGq45/6eLOv1S/4LM/8G4E3/BXP9rPSfiYPjJH8Po9M8MWvhv+zj4TOrM/k3N1N53m/bIAM/acbdvGzOTnilYD5w/b8h/Y6/ba/wCCZ2sfDz9m3w38DvGH7UXirTdHbSbPwp4WsofE+oXUN3aXWpOk6wJJ5n2WK8eVt4LIsgOckH2j/g03/Yn+LH7EfwA+Lml/FjwLrvgTUNc8RWd1YQanGqNdRJbMjMu0nIDEA/WvyU/4Nt/DDeCP+Dgb4VaN5zXDaRe+JrBpimzzTFomqJu25O3JXOMnGep6n9vP+C1n/BfdP+CO/wAUfA/hmT4Tt8RV8Z6VcaoLlfE39kfYhFMIvL2/ZJ9+c5zlcdMHrRsB/N3/AMFjP+UsP7SP/ZSdd/8AS6auD/ZY/Ya+Lf7b2r6xp/wn8B6746vPD8EdzqEWmIrNaRyMVRm3MOpVgMelV/2zfj4v7WH7WnxJ+J0ektoK/ELxLf8AiEaa10Lo2H2qd5vJ80Im/bvxu2rnHQV+vX/BkWgP7QHx7Vv+hd0v/wBKZ6p7B0P1I/4IXfAzW/2WP+CJ3w78F/GDw7J4V1Hw/Y+IJPEWlazCrfZbaXV9RuD5yfMrI1vIrkHIKt05xX51/wDBaL4Tfszf8FCP2VtD8E/sJ+A/g/4y+Llh4otta1az+HHhWxsdWh0OO1u4p5ZJI4Ym+zi5nsVZd333jyDjI/br9qjbH+y78SP+xW1Qn2/0SWv5C/8Agiv/AMFTY/8AgkP+1DrnxMm8DN8Qv7Z8J3PhpNNXWRpZhM13Z3HnGUwTZAFqV27OfMzkYwYigP6EP+DXD9lD4jfsd/8ABN/VPCfxQ8H6v4J8SS+N9R1CPT9SRVme3ktrJUlAUn5S0bge6mv0ir5K/wCCOv8AwU/j/wCCsX7KVx8Tk8EyeAVh8Q3egjS21capuMEUEvmiXyYfvCfG3ZxsPzHNfWe7/OaUtxM8J/bI/wCCZPwN/wCCgmo+H7v4xfD+x8cXHhaOeLSmub67t/sazFDKAIJYwdxiT72T8teK/wDENt+xGf8Amgmh/wDg51T/AOSqKKIiE/4htv2JP+iB6H/4OtU/+SqP+Ibf9iT/AKIHof8A4OtU/wDkqiiqHcP+Ibb9iT/ogeh/+DrVP/kqvo39kL9iH4W/sF/De+8IfCPwja+C/DepanJrFzZW91cXCy3bxRQtKWnkdsmOGJcAgfIOM5ooqZCNz9o79mzwT+1z8Gta+HvxG0C38TeDfEXkDUdMmmlhjuvJnjuIstEyuNssUbDDDlecjIPH/sdf8E7fgz+wBo+v6f8AB/wLY+CbTxRPDc6pHbXdzcC7kiVljJ8+SQjaHbhcD5icZ5oooiB5L8WP+CAv7Ifx0+J3iDxp4s+C2j6t4m8VahNquq3zatqUTXl1M5kllKx3KopZmJIUAZJ4r0D9jv8A4JWfAL/gn/4p1nXPg/8ADux8E6p4gtEsdQnt9QvLo3MKPvVCJ5pFXDc5UAn1xxRRVGh71rei2/iHRrrT7uPzbW+he3nTJXzI3BVlyMEZBI4IPpXxIv8AwbYfsRqgX/hQui/L/wBRzVj/AO3VFFZmYH/g2w/YiKkf8KF0XkY/5Dmrf/JVfbOiaNb+HtIs7Czj8mzsYUt4I9xbZGihVGTknAAGSSaKKqJUTxH9sr/gmL8Cv+CguraBefGL4f2Pja68LxzwaW9xfXdr9kSYoZVAgljDbjGh+bOMcY5z4t/xDZ/sQ44+Aui/+DrVf/kqiipJPZf2O/8Agl18B/8Agn/rOvah8Hvh7Y+CbzxPDFb6nJb6heXP2qOJmaNSJ5pAMFmPygHnvXH/ALRX/BD/APZY/a1+M2tfEL4ifCPS/E3jLxE0Tajqc2qahC90YoUhjysVwiDbHGi/Ko4Ud6KKANb9k/8A4I8/s2/sN/FNvG/wo+F+neD/ABU1jLprX8GpX9wxt5WRnj2TTunJRTnbkY4NfSzrheOtFFAHy/8AAX/gjJ+zL+zP+0BZ/FPwL8J9K8O+P9Pmuri21iLUb6WSF7qKWGdgkk7R/PHNKv3cAOcY4rf/AGxv+CWnwE/b+8R6Jq3xg+Hdh421Hw7bSWenTz395bG2hdg7KBBNGDlhn5gTRRVy0NDx4/8ABtp+xH/0QXQ//B1qv/yVXs37G/8AwS5+Av8AwT81/XNU+D3w7sfBN/4kt47XUpre/vLk3UUbFkUieaQLhmJ+UAnvRRUXMz27xV4ZsPGvhnUdH1K3W803VrWWzu4GJVZoZFKOhIwQGUkcEHntXxan/Btz+xKgAHwD0L051nVD/wC3VFFAH0h+yd+xd8Mv2GfhlL4N+FHhOz8HeGZr+TVHsbeeadWuZFRHl3TO75KxxjG7GFGAK9Q8pfSiigD/2Q==" width=300px ></div></body></html>';
  539. }
  540. private function fromTitleImage(Request $request, $uid)
  541. {
  542. $from_title_image = $request->get('from_title_image');
  543. if ($from_title_image) {
  544. $key = 'smart_push_from_title_image:' . $from_title_image;
  545. try {
  546. Redis::hincrby($key, 'click_num', 1);
  547. Redis::sadd('smart_push_from_title_image_click_uv:' . $from_title_image, $uid);
  548. } catch (\Exception $e) {
  549. }
  550. }
  551. }
  552. //短片推唱片
  553. private function dataAnalysis(Request $request, $uid)
  554. {
  555. if (!$request->has('ru')) {
  556. return;
  557. }
  558. $su = $request->get('ru');
  559. if (!$su) return;
  560. $su_array = explode('_', $su);
  561. if (count($su_array) !== 2) {
  562. return;
  563. }
  564. $data = [];
  565. $arr = ['title' => 1, 'over' => 2];
  566. if (isset($arr[$su_array[0]])) {
  567. $data['type'] = $arr[$su_array[0]];
  568. $data['material_id'] = $su_array[1];
  569. $data['uid'] = $uid;
  570. $data['created_at'] = $data['updated_at'] = date('Y-m-d H:i:s');
  571. try {
  572. DB::table('data_analysis_visit_stats')->insert($data);
  573. } catch (\Exception $e) {
  574. }
  575. }
  576. }
  577. /**
  578. * 临时统计
  579. * @param Request $request
  580. * @param $uid
  581. */
  582. private function tempFromWhere(Request $request, $uid)
  583. {
  584. $temp_from_where = env('TEMP_FROM_WHERE');
  585. if (!$temp_from_where) {
  586. return;
  587. }
  588. $from_where = $request->get('fromwhere');
  589. if (!$from_where) {
  590. return;
  591. }
  592. $url = $request->get('_url', '0');
  593. if (stripos($url, 'reader') !== false) {
  594. $temp_from_where_start_end = explode(',', $temp_from_where);
  595. if (count($temp_from_where_start_end) == 2) {
  596. if (time() > $temp_from_where_start_end[0] && time() < $temp_from_where_start_end[1]) {
  597. try {
  598. Redis::sadd('temp_from_where:' . $from_where, $uid);
  599. } catch (\Exception $e) {
  600. }
  601. return;
  602. }
  603. }
  604. }
  605. return;
  606. }
  607. private function recordPrimaryNumberChannleIDUser($distribution_channel_id, $uid)
  608. {
  609. if (!is_numeric($distribution_channel_id)) {
  610. return;
  611. }
  612. try {
  613. Redis::sadd('recordPrimaryNumberChannleIDUser', $uid);
  614. } catch (\Exception $e) {
  615. }
  616. }
  617. /**
  618. * 禁止site+数字站点的访问 保留已经充值过的用户和4267站点所有用户
  619. * true禁止 false 不禁止
  620. * @param $distribution_channel_id
  621. * @return bool
  622. */
  623. private function isForbidPrimaryNumberChannleID($distribution_channel_id, $uid)
  624. {
  625. $forbid_primary_number_channel_id = env('FORBID_PRIMARY_NUMBER_CHANNEL_ID', '14,2,4267');
  626. if (is_numeric($distribution_channel_id) &&
  627. !in_array($distribution_channel_id, explode(',', $forbid_primary_number_channel_id)) &&
  628. !DB::table('orders')->where('uid', $uid)->where('status', 'PAID')->first()
  629. ) {
  630. return true;
  631. }
  632. return false;
  633. }
  634. /**
  635. * 特殊渠道的授权登陆
  636. * @param Request $request
  637. * @return string
  638. */
  639. private function authV2(Request $request, $channel_id)
  640. {
  641. if (!$request->has('auth')) return '';
  642. $auth = $request->get('auth');
  643. if ($auth != 'v2') {
  644. return '';
  645. }
  646. $h5_scheme = env('PROTOCOL', 'https');
  647. $domain = _domain();
  648. $params['redirect_url'] = urlencode($h5_scheme . '://' . $domain . '/oauthCallBackV2');
  649. $params['timestamp'] = time();
  650. $info = specialChannelAuthInfo();
  651. if (!$info || !isset($info[$channel_id])) {
  652. return '';
  653. }
  654. $appid = $info[$channel_id];
  655. if (!$appid) {
  656. return '';
  657. }
  658. $params['gzh_app_id'] = $appid;
  659. $params['sign'] = $this->getSign($params, env('OAUTH_KEY'));
  660. $redirect = env('AUTH_URL') . '?' . http_build_query($params);
  661. return $redirect;
  662. }
  663. /**
  664. * @param Request $request
  665. * @param $channel_id
  666. * @return string
  667. */
  668. private function auth(Request $request, $channel_id)
  669. {
  670. $appid = env('WECHAT_AUTH_APPID');
  671. $h5_scheme = env('PROTOCOL', 'https');
  672. $domain = _domain();
  673. $params['redirect_url'] = urlencode($h5_scheme . '://' . $domain . '/oauthCallBack');
  674. $params['timestamp'] = time();
  675. $info = specialChannelAuthInfoV2();
  676. if ($info && isset($info[$channel_id]) && !empty($info[$channel_id])) {
  677. $appid = $info[$channel_id];
  678. }
  679. $params['gzh_app_id'] = $appid;
  680. $params['sign'] = $this->getSign($params, env('OAUTH_KEY'));
  681. $redirect = env('AUTH_URL') . '?' . http_build_query($params);
  682. return $redirect;
  683. }
  684. private function yqTest(Request $request, $uid,$channel_id)
  685. {
  686. if (!$request->has('fromtype')) return '';
  687. $from_type = $request->get('fromtype');
  688. if(empty($from_type)){
  689. return '';
  690. }
  691. if($from_type == 'main'){
  692. return '';
  693. }
  694. if($request->has('r') ){
  695. return '';
  696. }
  697. //Log::info('1111111111111111111111111111111');
  698. $param = $request->except('_url');
  699. if (isset($param['bid'])) unset($param['bid']);
  700. if(isset($param['cid'])) unset($param['cid']);
  701. //unset($param['from_type']);
  702. $other_str = 'r=1';
  703. if($param){
  704. $other_str = http_build_query($param).'&'.$other_str;
  705. }
  706. //$uri = $request->input('_url');
  707. $bid = $request->get('bid');
  708. if (!$bid) return '';
  709. try {
  710. $bid_arr = Hashids::decode($bid);
  711. isset($bid_arr[0]) && $bid = $bid_arr[0];
  712. } catch (\Exception $e) {
  713. return '';
  714. }
  715. //Log::info('222222222222222222222222222222');
  716. if (!$bid) return '';
  717. //Log::info('333333333333333333333333333333');
  718. //用户是否在样本中
  719. $yq_book_user = BookUserService::selectUser($uid);
  720. if (!$yq_book_user) {
  721. return '';
  722. }
  723. $flag = $yq_book_user->flag;
  724. if(empty($flag)){
  725. return '';
  726. }
  727. //Log::info('44444444444444444444444444444');
  728. //如果是group_1 不错操作
  729. if($flag == 'group_1'){
  730. YqUserBidRelationService::create($uid,$bid,'GROUP_1',0);
  731. if ($yq_book_user->type == 'INIT'){
  732. BookUserService::updateUser($uid, ['type'=>'GROUP_1']);
  733. }
  734. return '';
  735. }
  736. //Log::info('5555555555555555555555555555');
  737. if($flag != 'group_2'){
  738. return '';
  739. }
  740. //Log::info('66666666666666666666666666666');
  741. //用户的类型是初始类型 区域还没获取
  742. if ($yq_book_user->type == 'INIT') {
  743. if(isset($_SERVER['HTTP_X_FORWARDED_FOR']) && $_SERVER['HTTP_X_FORWARDED_FOR']){
  744. $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
  745. }else{
  746. $ip = get_client_ip();
  747. }
  748. $area = $this->getIpArea($ip);
  749. $area = $area ? $area : 'unknown';
  750. $type = $this->isLimit($area);
  751. $data = ['area' => $area, 'type' => $type];
  752. if ('ENABLE' == $type) {
  753. $yq_zsy_test = YqZsyTestService::getByBid($bid);
  754. if ($yq_zsy_test) {
  755. YqUserBidRelationService::create($uid,$bid,'GROUP_2',$bid);
  756. //书在测试列表中
  757. $data['bid'] = $bid;
  758. BookUserService::updateUser($uid, $data);
  759. return '';
  760. }
  761. //Log::info('7777777777777777777777777');
  762. //书不在在测试列表中
  763. //获取随机获取一本书,获取不到则返回
  764. $redirect_bids = YqZsyTestService::getRandomBooks($uid,1);
  765. $redirect_bid = 0;
  766. if ($redirect_bids && isset($redirect_bids[0])) {
  767. $redirect_bid = $redirect_bids[0];
  768. }
  769. if (!$redirect_bid) {
  770. BookUserService::updateUser($uid, $data);
  771. return '';
  772. };
  773. //Log::info('88888888888888888888888888');
  774. //Log::info($redirect_bids);
  775. $redirect_book_info = BookConfigService::getBookById($redirect_bid);
  776. if ($redirect_book_info) {
  777. $redirect = $this->getBookReaderUrl($redirect_bid,$channel_id);
  778. if($redirect){
  779. $data['bid'] = $redirect_bid;
  780. }
  781. YqUserBidRelationService::create($uid,$bid,'GROUP_2',$redirect_bid);
  782. BookUserService::updateUser($uid, $data);
  783. return $redirect.'&'.$other_str;
  784. }
  785. //Log::info('9999999999999999999999999');
  786. return '';
  787. }
  788. if ('DISABLED' == $type) {
  789. //禁止访问的区域
  790. BookUserService::updateUser($uid, $data);
  791. BookUserService::popUser($uid);
  792. return '';
  793. }
  794. //Log::info('aaaaaaaaaaaaaaaaaaaaaaaaaaaaa');
  795. }
  796. if($yq_book_user->type == 'DISABLED'){
  797. return '';
  798. }
  799. //Log::info('bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb');
  800. $yq_zsy_test = YqZsyTestService::getByBid($bid);
  801. //如果书在测试样本中 不跳转
  802. if ($yq_zsy_test) {
  803. YqUserBidRelationService::create($uid,$bid,'GROUP_2',0);
  804. return '';
  805. }
  806. //Log::info('ccccccccccccccccccccccccccccc');
  807. // 用户符合条件 且看的书不样本中
  808. $relate_info = YqUserBidRelationService::getByUidAndBid($uid,$bid);
  809. if($relate_info && $relate_info->to_bid){
  810. //已经有对应关系
  811. //如果有阅读记录
  812. $record_url = $this->readerRecpord($uid,$relate_info->to_bid,$channel_id);
  813. if($record_url) return $record_url.'&'.$other_str;
  814. //没有阅读记录
  815. $book_url = $this->getBookReaderUrl($relate_info->to_bid,$channel_id);
  816. //Log::info('dddddddddddddddddddddddddd');
  817. //Log::info($book_url.'&'.$other_str);
  818. return $book_url.'&'.$other_str;
  819. }else{
  820. //没有对应关系
  821. //随机获取一本书
  822. $redirect_bids = YqZsyTestService::getRandomBooks($uid,1);
  823. $redirect_bid = 0;
  824. if ($redirect_bids && isset($redirect_bids[0])) {
  825. $redirect_bid = $redirect_bids[0];
  826. }
  827. if (!$redirect_bid) {
  828. return '';
  829. };
  830. //Log::info('eeeeeeeeeeeeeeeeeeeeeeeeeeeee');
  831. $redirect = $this->getBookReaderUrl($redirect_bid,$channel_id);
  832. if($redirect){
  833. $data['bid'] = $redirect_bid;
  834. //更新对应关系
  835. BookUserService::updateUser($uid, $data);
  836. //Log::info('ffffffffffffffffffffffff');
  837. YqUserBidRelationService::create($uid,$bid,'GROUP_2',$redirect_bid);
  838. return $redirect.'&'.$other_str;
  839. }
  840. //Log::info('gggggggggggggggggggggggggggggggg');
  841. return '';
  842. }
  843. }
  844. private function getBookReaderUrl($bid,$channel_id){
  845. $redirect_book_info = BookConfigService::getBookById($bid);
  846. if ($redirect_book_info) {
  847. //Log::info('getBookReaderUrl');
  848. //Log::info($redirect_book_info);
  849. $redirect = sprintf(
  850. 'https://site%s.iycdm.com/reader?bid=%s&cid=%s',
  851. encodeDistributionChannelId($channel_id),
  852. Hashids::encode($bid),
  853. $redirect_book_info->first_cid
  854. );
  855. return $redirect;
  856. }
  857. return '';
  858. }
  859. private function readerRecpord($uid,$bid,$channel_id){
  860. $record_info = null;
  861. try {
  862. $record_info = ReadRecordService::getRecordByUidBid($uid, $bid);
  863. } catch (\Exception $e) {
  864. return '';
  865. }
  866. if (!$record_info) return '';
  867. $record_info_arr = explode('_', $record_info);
  868. if (isset($record_info_arr[0])) {
  869. $cid = $record_info_arr[0];
  870. if(!$cid) return '';
  871. $redirect = sprintf(
  872. 'https://site%s.iycdm.com/reader?bid=%s&cid=%s',
  873. encodeDistributionChannelId($channel_id),
  874. Hashids::encode($bid),
  875. $cid
  876. );
  877. return $redirect;
  878. }
  879. return '';
  880. }
  881. private function isLimit($area)
  882. {
  883. if($area == 'unknown'){
  884. return 'DISABLED';
  885. }
  886. $limit_area = ['上海', '北京','杭州','南京','广州'];
  887. foreach ($limit_area as $a) {
  888. Log::info('$area: '.$area.',$a: '.$a.PHP_EOL);
  889. if (mb_strpos($area, $a) !== false) {
  890. return 'DISABLED';
  891. }
  892. }
  893. return 'ENABLE';
  894. }
  895. private function getIpArea($ip)
  896. {
  897. $client = new Client(['timeout' => 3.0]);
  898. $url = 'http://apis.juhe.cn/ip/ip2addr?key=5cb679e201b214cf70106e4bf09ab576&ip=' . $ip;
  899. $result = null;
  900. try {
  901. $result = $client->request('get', $url)->getBody()->getContents();
  902. } catch (\Exception $e) {
  903. return '';
  904. }
  905. if (!$result) return '';
  906. $result = json_decode($result, 1);
  907. $area = '';
  908. if (isset($result['result']) && !empty($result['result']) && isset($result['result']['area'])) {
  909. $area = $result['result']['area'];
  910. }
  911. return $area;
  912. }
  913. }