From f2d94ea4998b35f2ef0e48d2bd4043320bca0aa5 Mon Sep 17 00:00:00 2001 From: HFO4 <912394456@qq.com> Date: Tue, 11 Sep 2018 20:42:07 +0800 Subject: [PATCH] add: policy adding form for Onedrive --- application/index/controller/Admin.php | 10 +- application/index/model/AdminHandler.php | 5 +- application/index/view/admin/add_policy.html | 10 ++ .../index/view/admin/add_policy_onedrive.html | 155 ++++++++++++++++++ application/index/view/admin/edit_policy.html | 122 ++++++++++++++ application/index/view/admin/policy_list.html | 4 + static/img/onedrive.png | Bin 0 -> 27078 bytes static/js/admin/add_policy.js | 18 ++ 8 files changed, 318 insertions(+), 6 deletions(-) create mode 100644 application/index/view/admin/add_policy_onedrive.html create mode 100644 static/img/onedrive.png diff --git a/application/index/controller/Admin.php b/application/index/controller/Admin.php index e5f16bb4..95fbb7d8 100644 --- a/application/index/controller/Admin.php +++ b/application/index/controller/Admin.php @@ -451,6 +451,12 @@ class Admin extends Controller{ ]); } + public function PolicyAddOnedrive(){ + return view('add_policy_onedrive', [ + 'options' => $this->siteOptions, + ]); + } + public function About(){ $verison = json_decode(file_get_contents(ROOT_PATH . "application/version.json"),true); return view('about', [ @@ -524,9 +530,5 @@ class Admin extends Controller{ $code = input("get.code"); $this->adminObj->oneDriveCalllback($code); } - - public function uploadTest(){ - $this->adminObj->oneDriveTest(); - } } diff --git a/application/index/model/AdminHandler.php b/application/index/model/AdminHandler.php index 730a75ce..0fac613f 100644 --- a/application/index/model/AdminHandler.php +++ b/application/index/model/AdminHandler.php @@ -147,7 +147,7 @@ class AdminHandler extends Model{ } catch (Exception $e) { return ["error"=>1,"msg"=>$e->getMessage()]; } - return ["error"=>200,"msg"=>"设置已保存"]; + return ["error"=>200,"msg"=>"设置已保存","id"=>Db::name('policy')->getLastInsID()]; } public function editPolicy($options){ @@ -724,7 +724,7 @@ class AdminHandler extends Model{ 'offline_access', 'files.readwrite.all', ], Option::getValue("siteURL")."Admin/oneDriveCalllback"); - echo "继续绑定账号"; + echo "正在跳转至Onedrive账号授权页面,如果没有跳转,请点击这里。"; Db::name("policy")->where("id",$policyId)->update([ "sk" => json_encode($onedrive->getState()), @@ -754,6 +754,7 @@ class AdminHandler extends Model{ Db::name("policy")->where("id",$policyId)->update([ "sk" => json_encode($onedrive->getState()), ]); + echo ""; } } diff --git a/application/index/view/admin/add_policy.html b/application/index/view/admin/add_policy.html index b2cc41e2..5dedd067 100644 --- a/application/index/view/admin/add_policy.html +++ b/application/index/view/admin/add_policy.html @@ -82,6 +82,16 @@ +
+
+ Card image cap +
+
Onedrive 中转
+

支持 Onedrive Bussiness 和个人版。配置说明

+ 添加 +
+
+
diff --git a/application/index/view/admin/add_policy_onedrive.html b/application/index/view/admin/add_policy_onedrive.html new file mode 100644 index 00000000..56e397b7 --- /dev/null +++ b/application/index/view/admin/add_policy_onedrive.html @@ -0,0 +1,155 @@ +{extend name="header_admin" /} +{block name="title"}添加上传策略- {$options.siteName}{/block} +{block name="content"} +
+
+ + + + +
+
+

添加上传策略

+
+ + +
+
+ 添加Onedrive上传策略 +
+
+
+ +
+
+ +
+
+
上传策略的名称,用于区别不同策略
+
+ +
+
+ +
+
+
点击这里获取下一步要用到的应用机密和此处的应用ID
+
+ + + + + + +
+
+ +
+
+ +
+
同上一项一起获取
+
+ +
+
+ +
+
+ +
+ + + +
+
+
允许上传的单个文件的最大尺寸
+
+ +
+
+ +
+
+ + +     + + +
+
是否对存储的文件自动重命名。推荐开启,重命名不会影响用户端文件名展示,开启后可以避免文件重名
+
+
+
+ +
+
+ +
+
你可以使用变量对照表中的字段填写
+
+
+
+ +
+
+
+ + Onedrive根目录 + +
+ +
+
文件存放的目录,你可以使用目录变量对照表中的字段填写
+
+ + +
+
+
+
+
+

+
+
+
+ +
+ + + + +
+
+
+ + +
+ +
+ +{/block} +{block name="js"} + +{/block} \ No newline at end of file diff --git a/application/index/view/admin/edit_policy.html b/application/index/view/admin/edit_policy.html index 3078c954..29266716 100644 --- a/application/index/view/admin/edit_policy.html +++ b/application/index/view/admin/edit_policy.html @@ -928,6 +928,128 @@ {/case} + {case value="onedrive"} + +
+
+ 添加Onedrive上传策略 +
+
+
+ +
+
+ +
+
+
上传策略的名称,用于区别不同策略
+
+ +
+
+ +
+
+
点击这里获取下一步要用到的应用机密和此处的应用ID
+
+ + +
+
+ +
+
+ +
+
同上一项一起获取
+
+ +
+
+ +
+
+ +
+ + + +
+
+
允许上传的单个文件的最大尺寸
+
+ +
+
+ +
+
+ {eq name="$policy.autoname" value="1"} + + +     + + + {else/} + + +     + + + {/eq} +
+
是否对存储的文件自动重命名。推荐开启,重命名不会影响用户端文件名展示,开启后可以避免文件重名
+
+
+
+ +
+
+ +
+
你可以使用变量对照表中的字段填写
+
+
+
+ +
+
+
+ + Onedrive根目录/ + +
+ +
+
文件存放的目录,你可以使用目录变量对照表中的字段填写
+
+ + + +
+
+ +
+ {/case} {/switch}
diff --git a/application/index/view/admin/policy_list.html b/application/index/view/admin/policy_list.html index 9ad84000..f02c990d 100644 --- a/application/index/view/admin/policy_list.html +++ b/application/index/view/admin/policy_list.html @@ -45,6 +45,9 @@ + @@ -82,6 +85,7 @@ {case value="upyun"}又拍云{/case} {case value="s3"}Amazon S3{/case} {case value="remote"}远程{/case} + {case value="onedrive"}Onedrive{/case} {default /}其他 {/switch} diff --git a/static/img/onedrive.png b/static/img/onedrive.png new file mode 100644 index 0000000000000000000000000000000000000000..a1116adb25a9a6be52c9c03c834ac36c7d060ff7 GIT binary patch literal 27078 zcmeI52UJtb*XU8NdM${EB1jcP1Pv`f2=yu;0s_*cgCT^T1V|wCSV3A)lrA9Bq=ZQC zpdz4DX`zIobPN!XUh~4OUjFy;zV+Vs-dk@ivOFd;d-k50-^}bYXJ*bK;FhKe{n2wr z>FDU_Rc|Qi(9!L`N=LU({pbC(81pkN`)FTBoNgGQ=;%(Nx37Hz)?Ds%bTS!sdWL92 zjhoU?BwPq$g|vhTxx<}ksp;rs72KU5PzM;A+Y)ADhmhl;lvVL?+gZu+7)WS{XgDdt zZ0&A%y1;ZjHT9sL4p6WakAnPBS$Aog0XPf|;dX~RB2d!qay-A%dS*R~INu*$sw3 z^ZrvIte}6|adLHW{FRRtR2b$6gVR({w8D%2V-cKek!U2!7Wpsr{!{#~wMW}o|J68u ztHQSAU)5mlcK@QbE%{CD*RJqe3(3;@pR}S241z|w=pm7g^1t=6TYr?ETTyYlSAn=M z8Q3ALkQkJJtnf~izuNmRYcM4U8YWNEl%n-S08ms<6eKMwE-ebYEFvW>BJzWg-%{?d zp+W2WRuDAg2PMLUwjm(h@LhpeWE11b_gotpV0xaVY>q1Of#}h>HLv!Q$dT5ecbZEBSZz|1hnD zgt~5bB%0~p2EG*%N;Cgw_mCE`mavipLSXIi5d8=ASO- zPmi*#^XmYYhCsJ{k34j{`@*bbh5r`&SF!%o{9VoNKb!NvhTu2*KdAqE9vE8~Vz=)9 zo2g$@{kstq(i)9{xWKO3(0a&!Wn}(l_3vss&C3dJ`)WtK{{szyg1G(fHG`y;1g)2Y zL;&JaFe`v1kk%8yQr40HuqDVEVkrW)23te^Xy*UVo8hls47G(IY+zRM!hh84kBI-D zTJFE*5C7K&&_8zJrt3SNEZ#H6-*u|EBsHgYP+nL^Q+fO^X z{+3=$Wcwp5y8Zv}xKgq|bbplZ)cs3UA7O`<7yCWC9nn8%ZO?wBf5o9oo2bL& zB_$+)60*WOqjzfDvU7(y8YUY zTswg59^AvVJD(lWJzP70>>k|1wL703(mh-|fb1UJ!?in~9nw8qJAmvS+{3jypB>UY zTswg59^AvVJD(lWJzP70>>k|1wL703(mh-|fb1UJ!?in~9nw8qJAmvS+{3jypB>UY zTswg59^AvVJD(lWJzP70>>k|1wL703(mh-|fb1UJ!?in~9nw8qJAmvS+{3jypB>UY zTswg59^AvVJD(lWJzP70>>k|1wL703(mh-|fb1UJ!?in~9nw8qJAmvS+{3jypB>UY zTswg59^AvVJD(lWJzP70>>k|1wL703(mh-|fb1UJ71z8hT4 z?^Hj=+q5%od2X--vvwm%sKGwFnDm9^!Mk539x{6#Il{M3=hBf+2uUM1T}h8H{zqo< z{TlmKxlb!zJJ$5m&nE--L4)Ce$5>3Qj0ywwuk&hDpeP<&Pa1-+n3zR0jc*PynDaV_ zqbQB51E?9wi=>ftho5L=d-Co)9o-YiUzgZ%I=bJlU;Osb{dj$(mHv;5^$;E14;Obe ztIkvuhvZUVGZe6_&HFn^9*EHomMo`SdxS#N_64p(0gu^}5DXct{+V#6>=Q4gLdn zJzcPyT4j}Al9O#4k80VaLDcld2BA?n%6Mpc5fo-uVTD?VKl8P&ODW9RMD~!6*mikL zdl^%*6-s9ZH3e8BDKiu#!S3eP#wZ8Y=nOMp=wcnMd$WkDrj>t0)jb+bNQjq-O7n1m zkC1}c>|?@)Qhd+6wN)aae?HXxlxaV~2l}4-z)hv*1Xj;sza#uwE#VKFoDcru2kAcG z_!aVQoWP+_@)>xc#emU8!N+xR6*bTI)d?-y#tt~55{A3L;VfQvz$-~;?oRun^2{8w zetop|SL~E}r}943&(u4gp&P5m^v@)y}+)`GoxkkDP{EW3~3y`OufXY_(4x*{C((D!42oni+u*Q97dBA&oBMc z0eM?`?I%?!8%OCDs!!ZsPy-L?MeM^z2I>eN%&F%(SP;K^br}vWJHwN;L~jSG|2*EHWQt% z&H2e3qMgmhQW>ALffBUyW!@@TAxbDD{?k~>Cr`2CR^9KoM~h`^Q|6CVdZORGpWA1k z1;i0HZdNA2MhjQs)JfvOa_JEC0PA#HK~NKj0W9{qm4rIOUp&<0GU^lo%Ej!B+>F^ zmGc$T&Z^&@e)QFq*B#ir@96s|A@L5n+HmM~xxJ=zLR`#zP+mQ=-un6gG5GEKb8u%b z;xt=fkF9cz2xVoWC{m#Ey}#0TJbn4#$dU zL1osOV!F*5NSs?QiXYmvnaCz3b)d9 z)n>}db1hKM^b=y|aLMiLc||H&OUci23%c~I6WUuSl5M#1d?B9f16?@Vr^%>q!F~LM zba|*6&f#RM8K(=@*}M|ULO=#DQMfrDp3UrP5`Nu?Vi*G-PpLiQE);b}+DC0B;&DOx zd4bwD9OC$MuO=_!KF&{_13PMU54yjqj9-VmSmv6)F&;LC^~r8^TX1@$R&OK) z9w*hE)d0+8!*9|=5g17o6+2bNk0R)TW-8kF6Wk`8zH`3EINtp1YWw%XE=d&`>FKzd zkkWOPJNyYAjs?_Am9xI*hlh$(3}p3|BS+zft#9x{EU?~lTtZg{*ZEtpeXCW-{0%5n zoHbARLQ>G@g05g@-H=Zx3t4_j?6IKK)0hMW%wWc>1U6kpJaU>MP|du7XeY6iD&KdD z_8Y`|3nhI-2Gf^>UYZB6j4SwFb8M3X>b3j%lcal*_FM&hx;*hxXjBby-Z6HZweB@ zo##}8rXN4PB!Tt*GHw$dCk-wp*!ZGdN7}rK*zaB*N=B_U_Eq_Km=?`d_r7s$7+T{W z2z{JXQ!(grz(l?N6GI8s-E*=i^zyf*YOad>VSa4p*#wW*KKW}g5E(D%D`j-oO&Nfn z;L(zns4!H2>p^~vsjs|qT@p`)Wp6pyvDOM@F{^=p@e4uVPIv~7g0y0^zj16ls{xE# z#KSk5VgX?;O3AN3qh=QRP-)}7sqZZqT}qZqtq@Z;34P4ig$Ey>Iq-gUQ&(c;T%@Fh zZ`Gxz$jMWQZVt86Y|_I^k8$NGt{(TiRyCdpUNiE!-{oLwu{KZaO-){DtSm$qGB>Q& zzkekobg5;^S=zXHMYl=aLFPn3#=Us4sVEsq0O@m4B3MOTElAx=oPQxRui@fM!B35F z0tmYt;Hd_1`sG%;sIfEz#A)F@+PCpeL08dc?ftp~mq(fg`=?K?KI^ewsT^iLL zT4WjFbVDhjC#&6IG2JDYE^+0y&7VaWMW092ma!$dimq?4Cd!>ftKqU12FnB;d)97c zQo1u!hiA^fUGcXQnqTS+>AdRjcb)S$P_YhK)DWr<%z@S(9C)qnn635Z@uBOSk(x-t2Xy#+PK5I-SG6ew@b%VS&KTXpE(ywY1FR>`NSI#vGfPr;W ztnVvekXD-Ol|FUgoIoc};XsKo)PRh5otVzlvzc#Z!0?R@K%J006;b&uu@nZ!%+aUl+Id8V>?uX0=e{V;Y34 zkjIJ5QD;0S0tH*RD-F(^?;3Kbjq{>J@Nv2Il^2^k0-SBeL2k?UL+ogCi}OP|)ub82 z=JF%&p7F!ZoR(eiT|b$1)iFb4bWjx==cmioADPN|@vS?9s{@1~KEOZXIlnCxRF z1rYU9xMGz;de_Xtr3DSGP6cYXb9CCKgUT7%?}%c5Yy#0}Gp|vLHh;udT+NdmnTryH z$!Ns6iGQ79ll0>U?w_IdwY#>~+_FQK@4*wgdl$sK(xbYdSzv?UTqzolSW7SaCixpCx$BhA?Go zTcjkQDm_{gFWe$re8<{$jD;XPTzIRum3BKyFeN#U=SEBeZYvz+%D>TeaUTLV8%CZdZKe5`h$vML8YG zxWKBg(HA9~kgohZY|M5oO_*}S*w|4nt)AKhJzA!7Goag;Iu$-P4c{!e8cWO*^agS0 z=9g8M^G0laQkTifUght9C4}b>_aI2|Q0IZDv`F^{J)54k+|~>#q_@qlZe@BEs(xQlm%}`syf$2OrplvYw0@Q5)sH`1 z(ngziA>?ujhZ&GX**)jD*3`9C%J+2{>E^Aaw-6|%x@>GQL%xbe&g<`%d$DsRa;$Ds z#lOIwrU{kVDhn)jt{#MnS*!JzWECXx@u^vqy_rq337&L572a?wufd!4ud7*jg*dcU zciV5hqqfJGy~O_NR|c)i(fOhHFD@0et@>L@nHxpy1{*;Jn2oM5W;yTnkmYmWlK^U7 zz67wkFIC#k(rJ_E?&deye(^9NuF8h5g?2}{EP1`gO(@2|sqWxtbb@|DLzL-=07FUH zQqx>nXGq=YnG?Yg#hVQVvCn!L`S7Ca^(`Yd=C9$ls{LC!&!T*`M$+PtS1xVzwtAU& zzrs}Cwj_9E3h;w$eW}S|Y&e0&!MgD(@j6#x$BVqwF>gxVCyGMXY~x|ZIhLD;SVT?5 z*k^sCgpS1Ad#5qr?G3LB4AExv`NZgv#uWj4NSOH$@UAX9TON5GVLOo*H**sdmkOv(;xwMFZH#V(SWkaFo4 zsu=PP+2H2neVU3*S}skKB|+TPCqi;QY`oLR=rl%P^OW<8H^-{t4ZU9usJw;udFp(c z?+PJ *onL|-3&mXxs({b+{PIGs(ciC2c*Sh*zlN+s%477JywnFCT5@HUY?l)M_& zdzVc}_|RBg67TKMipW6=L+6#1w_7+ZCPU~2 ztLJQxe(EXb>#s*|TyG~J0b(H3u~6n5_ro=Sn)T@w#rk6wtCP_-ast9)qcNC;o2AMaRvrc%n@g zhFEB#YT|WMKYU!;L9H2t1Js+ctZlHC6vZ2_wcD_%IHFz@71a_NSopJkE;)L@8oIuf z8YjS~Ad`2+rc2br%VA@bK2Am&PB3ZW9G3G@LnI(ZOGCOqDqWHnF=wBbYPh}&?vsd3 z8k%Wmtr~iq<#BEqf80Txl0KBPP^?2~H!uiosyw_p7SYW$i12}_A z9+wMqMJIrtf6oNg(H^g`(@B~$Ax|OxLJf>6*GjUDI`09~PS`I{(p@<;-!to)Nu1VA zK8)0iMz)?6Y$?sGZF>+ekfkhJ3#l=3i1fadaMFZf4sEQ0?Rehk{Zg!D_r#cyIpg=lnec2&9y|vzFr<~Ac%8ER1Q{H&RmDrNMTehULD$X=%uhTGi;i8x$ z(`PD^dGeC19ad-Z=&5^MiI~13v5n7X^qG!fw!GSJQ9ayxL}Nil zClt+iMR@KqMi9eXaOb#+=X2|qk>qY%xMNeBHa0)mpW`>M0qhM41=%xY?Ok9MmM?qLZdR=yw9FW)M=Vg)f>kEiB&i>O-V+ga#j{;>MT^o3ya!OUW?jG?e)x zYPnHjBD>yUR!PANarOI`D-851JgPqsILt(Ro#tc6y?7OQTMN>YlYoTu*|UdLS}h9( zsgBOhiC%B`4jErF=k1DJtSod*_OF~!S9Q2TK6D+|_47jF^*f)&CIDK9L9lAJitqer z0Y@ky#7f?+Z{=k}Ro62IAF?W6w4#nM{PDns(&kotAN<4661`TJjr9m$-gmViSzhhF z#AMz{wAJ9sk)_*Lj3daWo|-U&vieSjzcs)7Fxn@cJSHYT5dX3Kyp15umEWQu`%Qv0}YZ`DyA358tW=utmNBkKE6>@ ze-DPJHMgA-f5yn4uJZc zZ5aRxM%^Tv#M?QwX$r$j>)dU07s7*6%SGmQ|CPqZ z7`Ik*w+q${R<{at@wwWyRhk$PZ}e5+BGhYP)MOZm#Le_{@{O8G$viK~p38s-SZqN3 z-Mvhnv_m(1Jxs>JKRXXU7*(Emnt7V9TBJ|z&2ZY7tdE9kC-+ht9M_}Zn{GFQMV5d4 zT552+2$OHbBRB!#f9?^AUkWY6cz>mF1xb36{SWqEAF~cNR<~(m#eD)DaE~T92I9Nf z$(xlG>i9lpWZ;Zlzl-d3{dgIf>KE$Pk2Y9cokOz&vijTn!A@!)h+5fA#&2gI&hd(8 zWF5-4AEOGvpPnx{>6}UP;F9PmffFxursS;qeCJ7SLUA1ReWhOq^x>NJT|uopLaw8I zSuUX@b7bK&O$s0-J*HO&i3phX%9}OMrd;^EZ1+p` z3rLW{)JYN}207kw3m-QbL)5c#YH_`8r&;U63mB4=2k~X*+q7mlS(tbz;(Iw;yzg93 zH@GRWpM*%4m(5+i^uB@3-&V$2_fa*moh)4$BdWg|22L~}x=xYVy$)mt*-(1YUxH({ z$T1(|HKXvEfpW((mZw5KcSrlW`J}n)CEy<62YZ+mK+xWvMjeVJPw;V>(^6{&HX#BG z^c%L+FOO2G^Vf6@;^ zw@kP7ITIOAnDzB}MF7dN_w*uQ&ER<$kzTq~yv0YUw)`=ikzAuCT|=zUdd&PZKd+=S zFcs}&plcF8{(UXjs-AU#!zzEoJ*01Hm>BV98TpbbH(Wh6-@4LA4->iqk z0|Cnx*Rq>ABOME09ArWPizd9hHB?Xzwfpbj;$?`D9^jR4skUCaI zr^Wi_j9Ws}`0wyv&a {`gH(Im~Q+X{m?Pq!97#=CVNb^T&9TTuKqFAC$W|!lPwg zyP0TZj2-=WU;fY&H?*@Rk)F6eVG_gosYB#!jh)#kCm3_0VIgAT21P-NcF*_wzEIMc z8`JHz7*JAnk@5CuiPj4i@3GA#&fA~6q~{%87xcB`^T-nj;1yKGSONd(^h&;LO_}*R zSjZ4AL+rBH@dGe&149e&ugeF$L^;#X|8MqWfibMI4Yv|d%1pJ8bD9Fs(`IMZy3 zB7d)*=QLt%o_eSs?x`7_ZzDAlQ1CPrK`Ieo#6Rm{HDxP2C*3x7*F{6XsQ<|wCT6jz zmn|ZM^p3lg#i8Dxv!CHExpwx+F2Ael@i4-XTZQ$_rf)M`aR{$$5f$mo#pl@8_f*h5 zJXPZEHh~Y7@y`YmXWT^hMenen^98=VrCss=3)2g z-`HrZn*E9!`QAJ6MskZ^2M)$2ojemZ?ztNKEq}m%!kt{DeV z3nliN0m+NiJuvIh^Icucr$0XFz@@!tX*u2`&~T2)WC5}MxUj~r1CtCSl^r=ab9eA` ztBk>WmbcjIo&!v}n_WGyX#GWcj>)n}e-+D|4Ii%R!vn``IIGpiAG$5wYx8t_M4eE> zUhngZOYR>&J{?2M+W%@YCH`K*e!k-u!XW&`5&>!eN6 zhTK>v!;Qhv028@F>0G%m*Lxc+b!QDCR}Ym572^+Fows3K$2|TRYhsCnpX(77RfOBC z7t}1Do(dl=O$~Qf85UDEzA(A*WuXm0dPH4Y93$RVKk?;p5y?=S&7uUZh21QkyLTjo zQ5UeU?{=Suy;*WqRnhw8 zh};67kMx->nF|!t&xBCfF-k2kj=5pI-%JE}K@FFE;%0wANJfN@9%^ch2#2fU>n9oo_&`@Kv47O&Tcpik{nh*P z#QJ(#(zRE8b)(gecd{1@`}e`_7~vYG3}EHwP|I@J4Akr&r|PQi!iFw?HMNc}B}2eeFLdCuLbl}V8q*vPc`>_dwU>K|B&o;3+YtcK!Lz7 zMO4~uWkh~NGVc)+CFYyQ2NoaI7a`&oN-82^OI9b>s>=HlqEA(8G#sGJsB%}C#JL$d zU9Ht=SSB2oSsyH`gUf#RwKB2Ng84VxS~fQot*9SNV^IfNg1gvtS7?v@$9?Bz7t(!3 zPX_-Ky0)s|_5v(14jlFAAI-clkx`GK*sAjlFU8c3BwuSuM9YTR#c{r+dr4X;s*<>Q z32h-MlbNwTm0ofTd13=$M^3n%4|h}x#A6U=1|_blI5;ciGwbS~_7qBZw%jxvm@!`# z>A5vqld9Zs!V#5)-Oyi8S++3N4j-@dQO!G3R0E&#*0t}t6`oXPS@!DV zdNT^ptzKw13ez_B$&almr<8PLVmV|pV>l8hVsdkF=z4Km5vM5BFX(`XM$uR z6%3bqyZD2fToheg%y&v-z6#&5RB zVQ;^_U>kVDq2t@IMHwZmzB##l`nWA4LH*2Hj`pB=Ti!M)x6|5tFDV1B_(&I8n?!gKH#7wTgx?Q54JJZ9DC2D?=h1`NcZ*D7}?VQ zT4X;A$jOg$`M~I$`LZkPBMQKNwwShrLObDLM)u|tIB>rDL`8Nt|03-eMgC~c<;=D2 zbZPAMi6TPLa>8+N@6n~vZn{`d9s&;dWRKZTYBkI_>clcOi9jcp)Y7v)Tc`djd z)e;?lnTNLbNL2d(ok2!F-}VYaeqIp;fpt=|c^>7p1d9P@!<_N8RU`Ev+R+V#+%~Sf z7cr8VIY16A@V-!OcC`L@SsC1G%r#xUGU(F*gti<1Hj9h4h~S0bEiVHaqL$} zev36hY_AS59M`o|+1iZu136eymm5X>DNq1bH=xHv=6l~-Gi3`8nI=ZLH))G<=m%U{ zU4xRc@+;3n13n7vD-uoWh%I?EJa8Ly!BL%|?$txu=HUT~AGRv10HLBI>lfU6Suk>L zhPd**bVan&h|E}3BsX_`Fm1D>1LsD5q0lMo0$X$*-rw(Qcv>WAf5phM7s*J#IeBe> z{XQcu2M!^>_i_-X&J$q;Ip&@;&p)iIc0A?7lZ1_=bO3_uT;0n=-p%)Q91o0DnorK1 zYrzLxS!qg*O~|n5ikhM@mFJ3jw!XsK^qb|md6|0q(7$O67m!W;W^nLM(J@q4rEiZO z?qdkH-)*tl)ucD8Qh~MyP4;S$^xYchU68-MzQ|xpT;gv^UpIIp?0tvKNUfMV97HC+ zk63B+?UY|y3|T%s5e;Rysx|1V8=%>P^(CxtL6)d2ocmnb#vmikP;v^uK=@gqRN4g{PJLeOVjVJvYjR!pv~RB)E4}#K z10;D7)WwhR&e&>+G~nES_)Aq}p>Sh*h zaP7e{GgjX+sV2$`bJO#w^;c!N&Z%(F_S>+lUp-WwukT;K@v_v799O#Xj4aJe2+Dud zKGb95ys6G6U8H=)rYc2TEdZvjD{jVCC|Q(Dl;l&e)4VPNXJjlo_wh?&`fY@|-l(fv z_-vG423%`#vffCwji`kWI(^90*dav^YSZhoCP{e*-*D9!Nmjj@&@i#quhi?Yvbp4I zU|6g#JH0^~@>@6XBg9!a%>?%e)C_QjX2ZxD_;irHWhfzFV{=$jW->T1aZ>9r-=Iac zwvN4y!uGNl-d( zRe(lu5zm|k8Sp2!<*4V6&sz#Y^1eL%YMZ0X9=F&U*3Sj_ zs`Lah@gP~3#l;MR{(44bq)A|&(1`*7bGM?i$+f!e;D zO5Xa-cJ+$U5+PK+`2n{Jap9yP>Pj-o$LHEjzN~i#XvY$p8L{Jc49)Zcq5|pR`;LRZ zonjbjU^p~N=Uv}Q`&&GJ9B