From bea43137b58cbd9cca790d61cfb205bd17d3f3ef Mon Sep 17 00:00:00 2001 From: groverlynn Date: Sat, 29 Oct 2022 22:21:33 +0200 Subject: [PATCH] UI Improvement --- .../RimeIcon.appiconset/Contents.json | 4 +- .../RimeIcon.appiconset/rime-1024.png | Bin 26719 -> 30885 bytes .../RimeIcon.appiconset/rime-128.png | Bin 4154 -> 4806 bytes .../RimeIcon.appiconset/rime-16 1.png | Bin 2075 -> 0 bytes .../RimeIcon.appiconset/rime-16.png | Bin 0 -> 540 bytes .../RimeIcon.appiconset/rime-256.png | Bin 6452 -> 9320 bytes .../RimeIcon.appiconset/rime-32 1.png | Bin 2352 -> 0 bytes .../RimeIcon.appiconset/rime-32.png | Bin 2352 -> 1075 bytes .../RimeIcon.appiconset/rime-512.png | Bin 11986 -> 17987 bytes .../RimeIcon.appiconset/rime-64.png | Bin 2899 -> 2358 bytes INSTALL.md | 27 +- Makefile | 14 +- README.md | 2 +- Sparkle | 2 +- Squirrel.xcodeproj/project.pbxproj | 25 +- SquirrelApplicationDelegate.h | 22 +- SquirrelApplicationDelegate.m | 127 +- SquirrelConfig.h | 32 +- SquirrelConfig.m | 177 +- SquirrelInputController.h | 9 +- SquirrelInputController.m | 339 +- SquirrelPanel.h | 38 +- SquirrelPanel.m | 3618 ++++++++++------- action-install.sh | 8 +- en.lproj/Localizable.strings | 15 +- input_source.m | 19 +- librime | 2 +- macos_keycode.h | 342 +- macos_keycode.m | 155 +- main.m | 30 +- plum | 2 +- rime.pdf | Bin 327840 -> 45752 bytes zh-Hans.lproj/Localizable.strings | 15 +- zh-Hant.lproj/Localizable.strings | 15 +- 34 files changed, 3013 insertions(+), 2026 deletions(-) delete mode 100644 Assets.xcassets/RimeIcon.appiconset/rime-16 1.png create mode 100644 Assets.xcassets/RimeIcon.appiconset/rime-16.png delete mode 100644 Assets.xcassets/RimeIcon.appiconset/rime-32 1.png diff --git a/Assets.xcassets/RimeIcon.appiconset/Contents.json b/Assets.xcassets/RimeIcon.appiconset/Contents.json index acfdfc399..7c8a1bdd1 100644 --- a/Assets.xcassets/RimeIcon.appiconset/Contents.json +++ b/Assets.xcassets/RimeIcon.appiconset/Contents.json @@ -1,13 +1,13 @@ { "images" : [ { - "filename" : "rime-16 1.png", + "filename" : "rime-16.png", "idiom" : "mac", "scale" : "1x", "size" : "16x16" }, { - "filename" : "rime-32 1.png", + "filename" : "rime-32.png", "idiom" : "mac", "scale" : "2x", "size" : "16x16" diff --git a/Assets.xcassets/RimeIcon.appiconset/rime-1024.png b/Assets.xcassets/RimeIcon.appiconset/rime-1024.png index 7d21cc7c9525dd3df589e3690e189ed17908792f..8a872cf81260cfea6df1b3f856d3a1250bdfa020 100644 GIT binary patch literal 30885 zcmeFZd0dS9|1kWSl2FRQQM5Caq?#5j(}oT;t;`%G(!Ob5M%u?gaipAU(!QbPL=jP1 zXo#4!ITC55NvmQ~X@A~V4)^!IU%&f)?$`at^Urg8onyvzeU|sWecqorzt7Tm^{P#) z5JIadCcjY;S_WU2p%u&FBT7Q?G<>Y|GdUcHkia_pe*#KP7e#3KGmqb`gRCvg$xgoB z$_~!HjxNe4z5QS`LVAWL{T!S;U4o^v((u4Fj1E}9|@b>$;tWV&-bOMU0oOJM0 zQB@}4I4uoycKSKaj~?K)w7IjBii?+vw~J3uAdFT0Io8kJH^?{8-S>a8^v~D--3CBg z3yYt7{FktJd;i=bFlf&SK;vJ6{FkExe-H6qkQTpWUY z1Ah1Q_4>i7eLp~!R?|=>NpH1qaPsiMkx=-LDK5V`1i9#M2EM5&sltC6zpJT}HPp#! zBqh=gGKutksD-byhik~sq3TMi@LKzKRba6enWU;nQu}X1L28^Gf*k%|2Rl2FU3~+* z9ROtyZwEIQ6+a)h&C)*!NjCEJ@(qBE0Xp^nd`>Yk+85yK>fr@10;$Hkr73%iG*xvp zHI>wqRhPiEupm=>0)rfUoLnfs>2C(|D0_G~lQkSQwAD1UcPKfkgLrDFX}c&nx~gd^ zk<^`BRJGKc9i7#*e$4;P*NKh`0Y3k`LOA<6!5aS!JV$jcEmaqFCneP#>JCbpsv6Ep zI_j#W)gT4$jU>8k(9K zN{%k-I!dl29S1cXM=gyVt{S-DFUbEc(BYlJC0*`nm=MI|R7was%4^Z^)s_{|x*1F)5(sidXusH&yz;z-ic*7$+^e+j$>Sq*H|cM<U0M@@Ohe{U1MPx~LxQNa!DcR5q}A4PEK z-G3NkVCK>zu<-cTpS}hD@zXoG_yDB>!1svT)qO+A{|x1~UB919AL$If?{avT++1*H zox}|q{p#S(fjoA$$?t?Maj}11yL$T1xbc+gjS?BE_5FW4Nxu49{hH8K?NzaVi;~>b zcy_PbH%KS%`JNuy-Mhkuwec<>Loo&R^*|0M}73ICr- zNujRsi-M+t3z~A%&e$*}Xl7u* z`Kzfi%fF+ind(3>)JYW=?3YKq6<*0goks`2E+b?t0wH=c4vgAG_YUMxN;AIj( zAF4m~pg?xmP`2E2ayDth3ZtRnny!|sJ?}>peWtQpkocL~u2Jie1QoFe8^+dnr_Way zOlgpzUCk2Yj}N|EMvDMFgvS#qmgKWxN?`*vN}8q%}a9kbWaz$G4r z&hJ$IuSck3A60}tTbV!5joLL79qiU58J{*E8hW7^6+a#|wT<@k9O9lHW*$u=SN2?^ zj5ch!a7v<}k1@Yebca*J!d67iLH18JXf+<08CIZ3W`(|406xYN4AAy_>i5>%*Q9TF z#7|2S3-_8_m>fBhSbV?WO2mqR%%2GHh*9%7zNQb-s&(k=9=PQQO{!SxOOE}a7x2av z*-!hJ+aB}_99rN#l%Ke4DnF4&IClfDu2VOG>{!?)#kVtNJqmL6uUN=y$-qSTXROR@ zlcGE@Giv@AFY@$sJFfHjW=k87lo_{+IMrZKrhZTSZOGq-=pge40L{;L522{QA)9$x z$ynTi6SGR1eJwQ?#HO{gpk$drBFCH3l~J+CnrzwK^S)&xZ}Ih?6x?w~XX56<2m8fA zN@fD*JjFnkUH<7R0o~|{Ci+@%tqROm7$jE2_PlSaF(({M__1a2s@B}m`%#Za-k8zG zMh$i8JyFLh-O)~?LwU+#CylYG9A$-*(zC7tELHW^k$9eLqgCi2tG4CQ!pefm&r!#R z)-UuE%ePOgFhGp?&Lpx~&wRlPeuD(Enf>iG#cXNg2I~^TRSY2oq`iEY%0DYFtFwhI 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 z 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

FnKIB72JR4oiU`2JZ5im_|0UoCzfepK{QLhe z%0VamFPPE)cL{Kt|1Y|vTF@OU3tM{xSvy%G$9}aIS%dCDk&VJ*(kSu;(NsYH5*0Fb Wox;DGx?X_(A{?>#CGThAjsFJoZg9l_ literal 26719 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 ZylWM*{v_?93jG&AsRz>!^nRXO`+v;GsnP%d diff --git a/Assets.xcassets/RimeIcon.appiconset/rime-128.png b/Assets.xcassets/RimeIcon.appiconset/rime-128.png index c24666c32b0ee8008f61b8096ec77fa940bad247..9c44d83e422a83fc46dd39c12f9bd1e5431fa845 100644 GIT binary patch literal 4806 zcmaJ_Rag{Uv^_Hn9S-4ubcra9w8YRol(aO`A|)Mzfc&I{3_T2jfRr=>A|w2Oij;%` z(kL;~f|PjY|GxWhpYHj-efGnC+h?tH*4|0RC~aCQRw@7ht*(xSDKVq}3kovg-KXp{ zL`;-^I@W;zP&57)5KvIW0sup(u7>K}(4y_)2p_g7>|l?}XsXMd^zGTO8&T!u%h2vk z{oMH%=9VeJ%ty&R7HTziNKGLV48pT@9+A`&oN0Bb+V$;NWh^0qw{A=i|DDI)Tvf+h zXtqUGSD(W0OsC*qUG_Qu3+&*GO8Wd7CVjui-)$vS`LhYC^@%V~p zf2%)0X4;t=H_}LIy#5th73c$*ly3uD?6%-hx(Hff5P>Xq`QP$hIG-PTJL_m8g9>^q zxnvl;=`Yy^k>DPX1K#&}%AVaM1=m0zaD$WsVdy`=3JNEOlXBNh$8Ffnjfix;TNPB&crp+}?f6jQ z+ZCi#fd_3fSc0Mt!CR=`h>mmT(1Zr$0)bZnq3kWJ?H#gw;PMLo=9rBdb7$^vN}f(A zi4i#AZ0T-O|E@~9C*#pM+lu|`8VsJxw9!OvcYKYkoR_G?(Hn`rkh$RCsXa&_hu;X}5 zZz3ln&E%34zq@l;xpPpP1w_HuG9ezevMMl(bicNXYgeq1=syc-pkAb62bU8byi-+> zdewE;1VeLAQacym7)`tPg;@2%N;Aw<0qkv-#Q`}Zwj`f&%DvcN24@AT*G(Lcn(no|d*zalLcg8^{r|)DdU-RxrB0OM!;> zcFgM(rQ{7y-Cgg8skW4c#f zY1&qNteYek1IT;&#^zI*I{Z?vDknVYT0Ns$$kEx?c?m-@Bwt5ZzEqsGKts{jdA%9; zyfLp)mD!5F#?JW-Ii9`?Q|a(>w_1Iaz6 zNui6NO7P%@?*#`3lMN0Ix=>S7vo-p-RwpWhzRr@QWi8NFH@M<0C$6hWq}Q#MAL0-(aOP@rk@9CydHr9J{LSM-vh zW)|k!JhSoh=g*?)N4i-Eq~?1yMiwt4Oxu9%n|xmd1%*yytz}f@1i3e9!>m-w^D6mq z4GL>m>j|Z2R0U1U=aMQW1Vk#Xk<3qy{d;u?ib<2Jb{keNBl;}g)92yCMT%oFB%G$~ z21dYXzRi^X+07*#eo0zxC+?{ExgBfC!j9yRu99KEI&H{H zrZCMp>M7KXI-$3ATC;s_p7hD)x2qdiP3faKM4A@kSa9OX-f1L^U&>T=vW+z$f}$$XfBD5Kd!M3TnAW{^z{ zCHf12D5V-!xjtVTcnJHUEeai8iku<6t}(h5RNOgw@-7m?{o+9(A><9oLyZ;_v$I=k zawzYr3KR3iDYjv22*#?1-U22E_OstR#jK<}O0H?^vH{WExH9we>nLgTU zMTMUqZ`*qa9}{uZpP89yep_q2*9YPEKH6lwFMEQ;+yK5w`Z8UY6xzt={~2doHB; z)vH&AgtOs7*~7lRK8)O_HZ^dO$Q3P!J{#}3p`@hL6MlKRzA7GOVVqU2Slxq=2wwS@ z^2$dRpXj}JLb%Wsmx|y|R;|aJ3jQnqGJK5eoA>?Q_Ui4~N7^mUDJB~m8=2B@ z4vC{oZO&_oVFzn*-#;tHTt@!dnySG>oXn9;$^~JiM4T$|Z{=K^x zvv_*Ap55Ku&1}LZl+bLXxc~2q-M8l>V#&@kk2zRaUjI2=FR|_7z`nEG^RB{<&V3-h zdWjCHu!u++hjQeJ@W!<}VVHALXl%*K{>h`dh{)6Lxzsq@FIEfJ$ET*GFGlX{(!kYL zuD_276{^W_rR1M$?ziXt*Q7tGE)H>4B>DGS?7g7_kmO#!GIo1=nj(XAF-cE@Z*!VW0q^ztQ zy@ZEwZ3O!cSyMv+8lNKe_BB0zZ+~?#1X&UlQ6`w2_UF%^jon@HD$Pt7_YK|8#KVwZ zQeru=*;1s#ua=gURsan>Sx#hodwE6()z?qiItriillvqqBNLw7g|Wj0!ajB7iaESh zy!h(!RQh{BhheSfU5;*Zvg$=xEzQ2mVEUg-xMWS4UL9%HZqMJ#--@G8>zx;-e7Kf& zGG=;W{x0>WFeg&-$WJ7D)Z9dZeh!1Vbq7wdVqrao0Lsv~_p@pG_ z?iP>hS@-XSuGja6FivCRkFSNb)x(frjU*OdSEl`x&b~YRNP)-oT`hwvf3|_Z!|u}` zg>hXWyPPl%iM$+3f+=`m48-?0%AQ{Coe^GLap($uPz0AW`bEoONsaN(37#tG(DALUTYM!8Sf4 z<};&H9SzCR5?}nulP6EarKI@dP#5JF(J>Y6?Xpwz^TmXpKc97Vb@dwymdE!klRX{e zJC9W6VWCO3ZTEe!5_XAo`Ryv%Atx`NuPcxpAeqm<8N}M$+&q(?e=W?*>!Y;1{N@|~ z)hCD3b+(WBb?wJA*)7_Ay-A2qRO<<~Do9mC^Kblggdrza_wW6qRaP+3S`u|U^8m;q zN0;)&21G<`hs>h~q{m^C&a}pq*H@FX{IwYY6IFs{qI%a8QQx_MzO_GL7ERbM z0j-1yxf3`jLRCIK>bRkr-N}F+9(AI}haWGS5jN~A8@$m+n)2#%5xu;?FwmE6X#9cX zATJuG&dwG%_UF4RJsOi;d4#mqPM1cvonNK3`T;Rm?DOR%oeb{LnfRN9sEtAwe0%-D zzo_h!6mZ=3ysl+}H@?$M;Yc^h+HR4ddRv?LLt5)*NqIK}DbzilhU!U7X7yFGSg`Xs z+!QuMQnes9T>puXWx$Ap=B$h|ZG>8ow)Q>%Q5`2bB)Jo5n0})qG9Y#R zR11h=*ZXz&88Z2kR^>*BMB`3=E`~_aT-`r;&P}n6s%(~ENcvQ1dh_+Y`n{DE=X;p@ z=z1Ci(#VPjH!;Dxkz2ne-CbZdB4K<^V%I>y{UM;N%hT7_UeRv}-$8Vpel9L$gM_0W zy~}<&S>-P=7>u8~I?1k|oay%Vwx~76Topb^lm~L2e|0J7iEe>S%1qvPly!M!@p46k z$(Sb$*y_I<1j9{}9MJQdPZGoUeqN5j5wrG_2#639y(7LudAG<175l8oh zEjv5=i)znZt&RbPBy%9kvO3R`JMfWGpqlYk}kP*fMY|=V`9FbzLj0IiY-Q1knNpb3$oU_mj zi15p5Jz}A`u5Nhn@C{B-kF^CI2m*-K_&<-oAFAkUjd1~{O~RugK|wy=US0xydo^G?wD$f%hYF_qxJ+=G$p&%30VSL65;>a=LCs))Fd3qp)P9r;@$K5X- zebYseVja5qg&7n%c5G5HSjjA-;t-B66`m#k6-$HbF=`1t#Wn}5;p$IbI)`C#QgIuC zmqxt@@fhIcT0jbCg7NU_W>L71`$Okfb+%9o;V+3P4U4JF> zp3vUuiBn}WERzOE=ENUPu{DPZm1_W=>}ZvV99)_`8TdKg>7mKkkkteAYy0RqD;&s)cd)qq&WoCx z+EEO>Xen>Urm*lg@NU_>gYMOH5OVk%w_{u9E9R|a067`dyKNT|R{tD;t-R$$)%jO8 z#hI;$AK-$#%EYU`RvPlm1Ip1>r1jvnP2(*=Fakp9Qib9zoagpC!&|3~27wVRohuA}*$Yt|m&OUd{3G F{{TCZ{Nn%s literal 4154 zcmb_f30PCtw%$n$lNb~k1tq4`0m&Q)3A02I83hy+1P;jwq(Bmq5I~?D9Eu{fr2?WC z3RP4T3kb-oMdVxuK|N7Tj{~od} zB*=G$(HtWHzzn|?f>7*^=q>|2?Dw<>)Pvm&r|q zzEGAzgG91;n3j-jU2=uvm143!UjqWwH2dCq9Qsp8QZShYFFH zA1YWr=?;5xrzEOWaz34&o}NxiXVYYg1Ui$)Da*~$}TDw#4-_HUr4UjM-XmfgU>DIXu?l9DpzLaAD&#=@9P$Oo;J z;hA!n9ttaEX$m2{OpVd}NEeNq@1uYrl}r&XlO?~eRmgkFWEO|UATJ7pgc7MPh{eAf z0t+A&>`u|ujmpHnoNyMK&tdaf3@XEk&tSYW4U~x_;>-`4VkPGM!4%Vt2vR}+(O4wp zi)D%w2n$(~0wut7xio=7o=PO&N0uy8V2&|%>n2;0Ig)J0Q;do4y43S7IcHz7qFOUh-bhXuuf2VYjOo(CpuUDa1 z=)#3r5S1l_T&RqA4A;d)#HBiOIXn(5WU^Qg?>$>OUvX zVv3yN*-R0Y!DC=)6Z0TyJe%Q6<+9_MTs9of;OdI`j@1XrbNH+&IsSL#C((t8kTe0t zR!}&?QHoRb8PoZSnSq8q zXoy$UnR8Hhhh@iOB?wG42sEY=r!O=7+_cb;V(24WRQ&Z<-fx#4u(i&=G5Ge%-G5xT z-`0A*^>%sN`N4#5cRxJg`Q5#?^D&iK58fVqIuPz)9)7Dty%AqkQ3YzuKncDo6oeZg zD{&!nQXIQsC3!cokf?`W->rvc-HLLL z<-@reQc&%6bfsoNT*wcg+~k_ciM5LStIewiXXXfT8h>%$H956wpM`*2$#ZAS5EE4-Uk z-OC5B{U3*xsPXmsMt=u(ppewCuLX2&9bCJggl_f1mHk3MT=Dm6{!v=;L$JOPy3Ye- z@X;MFYl+A&dH7KWd9y#*K_EGREk7Qj;avWwclo?&Z|w(+lL;}!-dB=LJuTTFAK?z! zw1zpWTkz+>-D*!Q^_A%^5Kz-pY)r=Px!@0dgaGN0O|G6vQkyK{J12UXl&8l2sHz;D# zz>2XwG0CZDUl;DmLSaqIz3SpyU!>zu^Tl&AD$n8~d`al1n&)$#JfmEPt{kF)veLbI z&!TKcKQ{#-cV}D(TQmJGHTS@DAlBNDSGz6!mh07CyzsEN6=;TSZ-7|(i(oHd_ahmd z5B#a5?;I51X|qLl&gL8r{NmYnAWmAK=MkTZmJ|_28Xj5HA18P-=vq~kS1zH11%mbh}6ce(gU<6)v5Kf2#hPC<4rKow9XUav+<(`rfq70 zuZKM#Oe3I1+h=d^#Z*%IeLfuGI}@C^w$ep)ETv#3a<26Izjfoih&v6hb+$Cn0SW)` zXkXj+0pJQNR=skTdW`^BL~8FZclK-Ago|@m|7{qDoF59geYJG17g8?{k6?gs`!^+x(4q3SdTroNE#gMblpzShZ+|Dx``(q2cNnXT^ z@~1!RGoRgcizS0g5b1~J&W_s*jj<^*eooO(N&+4xuUDMR^c%i-l?pF#uW0o>*~W!P zs+P+yZ#NIlbOh#_CDl#y@Mkz0we{u{w0zI?ExgpR^8JNPUql|yTCKi)iC|)s7-lc6 zk19}qYLKxE*QLL)<;eDA))U;0!@nJ`Lw%9iNH4GXrXV1wx&VKnMM@5``RXRu(*dk& zDa=|v^m>7Qj)gg(;>@^1j~&$TMS6hyY7RX8^Erq%^Z8AdiQUIHx9H`Q9&Y4ya;;~dd6|uSSsf0VOE*3t z23Ry!0&e%ptHj2$u0Ywe`+h?8rhxvJetkdk%I;N!A$Hw1iG*Rqf7TdrmjzOtXB}ng zNVK!RmLxL=+hZPEnH>gZUbLGyGe9H<0qGiGRGVdnCHc#6ic=e!k>tIUb*X^s89=#lAN_R7G{JZ_W7<-$gV|keawJ54~3$X7ufwI8)Kd*<|?Uq;1(&KkIbr@RwcbjB}R5g!Ha!uMeW<;kj{(hZWto z(0Zf#KVt9BdO}^%;z9GW zGr_yM`(&G^m67y3wjG~ypgkMcXcbINN-gjQk52wlYdqlNeCL;wcL<1w7ClwdZUV^d z#dU}I_1~ngNtGw^ z+6Z6X`lQt1c*n6}gIGY`Zm+fCuKTfcb~YXnbkuBm)L)szL%E=WRbUZ%tZre{tLt=A zKy3-BD0y?d-F|MY8Ca+HnQMRQp(mzKTP>y=0#n-;DH^9V(RygGsUg;Rbt2d?4Kf`T zAMw#%+XIcZpSG_&ykyPZ8el7NCw{gCU9+~=aV+$~nr+OoLc>kL@O%)G(n;{it7W7< zdWNe-5)iQ_?V4R<7iE4wPLkE+*5i=b!u$0eWNP~Lp)Cep$I{M38(rLb?riQ3L4V=d zYfIc#QDl1<)`IO-3nV`YE=Eem5^h<~VJ_D4hp%TICsY;q4;UIDx^v3E98Yv-mV%gZ a;-hc!Q_Mg8maF@B@3$;SP`5O0<39nNrCewL diff --git a/Assets.xcassets/RimeIcon.appiconset/rime-16 1.png b/Assets.xcassets/RimeIcon.appiconset/rime-16 1.png deleted file mode 100644 index 119930f708412156be3bdab913742a914925febd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2075 zcmb_deQeZZ9PVN^-N*(}1j9$D-PDQp`h9n;yDi&p$7Z-O$BZLU!rS)kUEN*VwcYNv z7)2Pk#VA>f!~lu=1EUK{j8PJ^L_*}lugE~anGB*tUE&sC5SbbieS3F1hZ(pKFW2^M z`@Fy3^Zb5K-*=#;d0lDAiV_UNN}C$Pt?0VMJMJn%=QY><0_aj~HEwb+Y|%a5QGo5) zcOQlo4e4#|ZhLgSq?kz`P)!;7(n$-UF|4X4Z2_eNy0{Eux)CBSj~pg&T@4XW2~j#~ z)x)^n*lWX$z0GY(Z-*kPL`^kbm6lL|By<6uP9_XTN{5I{TnUZ6#}t8QAZ|y9sPz)! z?a>yz-n1bu`e;(2X&MiRJ|@5@Y(N9@qc}^mEJX(?#!s@W#0e75;JF`x656UJwT2_P zbm%Tb#9h~tC@Pgo`BI$Ev||(_iXug`6w8tbK{`E#3(} z>~cc{BAZo_wDMsMCs!#{Gb#-%it*8&stiz7@;Ix@PGpj+3I!7|2@TglSSF9P;-+gl zaq}jj^RI76fT|mf=5x%;C7H~paNLG&BqLXldC^W=j|Hh#=$Ku$0voy!&2mqTCDq#y zxTf7^nu*z7waik+S>8wEl~JJRh9~0TIa6R5xG+R`eIpt4=i69L;yH<>Nm`I-Itz`O zs;>3S3k^tI@CGRIjS5`wpI}vyG}BH3Bw0^_7^EyCM&S8EO7&*Kv{7Qjj?1u!Mx`dh zae<-0rf`Trs(reyN-ETNO%2kdAPXAF170A3#zPVfWCi*GF9QGU{IIEXdA;@KXPvH^ z3X1VhRwf96LPLfW1i+K3>;)423<+dSfr6llw2-X{Vza^4(Z>c7bEA5!RF9R)0zu?t zQUj_=@_s*0%8(ODjTQkb$^l-`c+bxni%5;SgPPZq`$9It&fF-W;~7^-K=IrjA{4L9 zP$hDY_4(?tkj%OHsW?PIZ_)g0cE{A*6tH1!4ApJ{_M&b^-vQmXCeJdeAajgL(jtw@ zrip-*IoeMKIGG7>P^JSxepdXv4(WbJy?Ctk3tl<8paBW-g z%eTI%p|(G<^u+Yy;lZO1POt5I@z|TS#QM979yraeAo~Zu9jbVxj7WY|v6_r*-f>Dk zG;rd3{@_E&(?_FUzvetYlREtIO!dSUAAI$~#ffW=b+^>6B*z;*tQ)Bt?r1LfG#K`8 z*(X;NCT5uGi^C_M77NeRRUO$R?>S<(uKA(r>g3YV;?9!2pKm)me(C3Owrc;@?*2!{ zqRZa>37f2pTxc%%bqU4v?Rw|sVE>=13&+=;pDO(9{r=*qV}n}D@$}TtWXJxkkxM%} z#uksNKlYq_rX+s-_a|45{ld-M*-|=v@1i%3uZl1`zZ>0sW!Z&iODcE#Hn2B-zHIZA zRXyCR*UugpEIC!N{m|9UPhKBUmM`xFUE`56^#}SUE-Qa*cLlRc{%K@^6cSvMDr2^MK&TYrFMOy?CW*TTv)DT0tT zSO`G{|3y$!++2bnh}dtXMN&lngcge^2EXpEMt4%&oy``86n9_-&hYZgIq#Vxq?9~m z=>S3q6~6`E0IvW6c>cWxNZ=Rn6Zi@srSy+S@kik73;(z4z)cuXx+cu!a`N`}_Fs_q zVZdiVHk(aZtyWzn8jr`0Wm%4j8;yojtJM_Xi4Q-#sMM4!lFv0%5`DJY)j;dx#FTrQV{fI_*8a(g%&ic+a0W3kv7klXE60c9eQ zI2Q^9`u)BFTnJhLcdAayvfTN6?zY=)cRHP(CX>mf)9JXjZ99X(;21LTKI}n|c0QlK zsn_cfA%rjtLl}kuAS#uLUMv=$@pozA4DLf@&rk2v@AsWvulE}``S)H(_f1L}nD_vY zN~LJES`V>UEOI`dNvG2hfYE4l(RKZDI2^okx%_-Kn*q4tF8lyKY&ILZ-EQ1*9FE5$ zwr!(n8p&i*k4B@!<8k);y(-~*xC9;e#PuI{Z8z}0vXD}Shv^;g8h9BJtDXyB$Kx>F esmH}r$N3Mw7X}CEttF=b0000 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 diff --git a/Assets.xcassets/RimeIcon.appiconset/rime-32.png b/Assets.xcassets/RimeIcon.appiconset/rime-32.png index 0c358b5badd9cf8046b338663bdd425576a27b62..0a1894f8d0c2b0953b2a486e92e5f5a5e8468316 100644 GIT binary patch delta 1034 zcmV+l1oiu{60-=9IDZ4>Nkl`~(V=j-QZ1HKX00etA{vkQRrH*}oj@Ba-z20-IK1V8|jrqARd z{0e}LXHX`SQH4T5?eFh5Y}*c>V-wTYrjSlde$gH{juUNdZK+zVrgwLDohXVrbS=x$ z`F!32AV_Ke1Apec>$>6Q=B8>ko7T?GjvYl&d$XT)cub_=C&Zzen3!mg3`t7MvH~PR znayS;N%i>nC{w9aJvl!#G*lz$lT?o5m}&i`UkXOs1KYL%z`DJ?rPey?6;B}q6W132 zAf+4#g1`olwr$%oriM+uWD2~5%-5D`k`zKj0EE`sTz|wh^?FvqYPBi=Fqg|&{q%Z~ z>$=);oTyT%KuXy&g2{!Ske173l*?rf4Gm#@eEg;UF*!MD0Z8B7-I1i}rz52Oc9trY zN(7Leo11I)&=Dk~E_veo{CpFDRVtMt09F^anfzu z4oEh9-+xyClsPvxHs;^o-%FCw!oouG2A%e+gdG6V>9o4Kx{@S$d3hNuFE9J9>(*n3 z)hLRj@B0y2)w3};I9OjRM~9l!^+4f;>Ar3&JoANNSS$3Bt}L?1b_k0^TgiXo~qSqilnGiDyUYglv1Knso?PNaPZ;b!K?$7 z&aHK(;74P(TwPslkPJvRyKoeTL!q@6VHgGgERs6iB4JrpEn-n5g14JgA?`m-|xos zvgv5ax;3TWzR=lA_`^q=?g9V+zC)|Ge=Ellzz^M`E=9Q-Pp|FnpzN>1P3Ty*!fKGP`}w+-wY}r+wsq6Q zF-R6=B7cDab51ZCfxv=@{KUZ!flM8W0W~;T0*L%&!x006fZugp1v8MSO|SRe-SfTA z^FHr;-`6+ua$g#pFgn3tFbvMgcI3k|q90Gk!C$qq@+LgR%h|7}21DXd{fIGasvl)A z#5MX{Zq4nS!wOQs#EB9QOrd}b(FVhe)R4>xB|t-XQ0xoZ(awX1P{b$N(L#%paLSp$ z>&vcGKtW}$OQk0wAcV5KBg}vRBe1 z)hj(BboB8<1khclGs@AgmOvm%p=w!WFpY>I{i0P@g$(d~ph~5R0J6%U%!zt7GMlLY zPLmXuB>DSlmDeX3p=c91UQ(oFTfQ8Tn-kaNYqF+Q}Rm+B!=qDVHHj% zn-f$uE+~K;haH7kn|wYIDis8hW2_j-*+h&MMIPhKK)`6;%G($UFlHOqH{T%%rFw1k z`MsSkN&<}W7b`=MR-OZ94Df=0F&3J`cp6wSks*1(N|B<6vGzrqtN7r{#`zzNs;d%V zL{X$T3uERn4<|xZRx6G1z|3GCg5fBJx6u|4t@m@dMc8bg3X4|}c|!`olE}#KL&9Cb za)RFNc2v;I3`8_?+t-gDPsALVU+x7k=wpiC%dScut(;RpdNK6w3EB&Plzf#dd%SpP zu!T31B1SL-w9Ugn`^|(Evzd9)W(GWAOQHLc?^is{Qqgw&cj6<~2wpB&4B!fiqyHhD zC+f{!o&Bcs;M?_ori1J2W^bS2e{aF?vj^5#Sj_M(xNz&k=%xWLqT3D#LZ=kCsiYKb zM+^p|HOGH(?=aY=XkmGV}HWx={0k!5{J#K&TmaVuAG-A?03DDn7?^` zu>Sn4)k%xenDJ#Blw3z!@tHTSRFur=Y-?*ixcT{lLuKU+#SNDZnY+K9zUxE4GTI9DfYv!?`;{KXm2|ms?*TCU(?c`z{0I#9otE`p+*fSd}=`Xg$#|`R3Vqu>_TT zVtIT_yNKV&N*f=Wvt{>?lQCz|L2Ev_xMISc-MGYJ56uI4)nhesY-77U;aJP0x-E0d@>ee9*nvCf z0oP1RrXAg}KECOxTkNr>(1CTAKTS?nu489LQT3m%C^Oyw diff --git a/Assets.xcassets/RimeIcon.appiconset/rime-512.png b/Assets.xcassets/RimeIcon.appiconset/rime-512.png index a0c224363e9d43b25be471825a54467852d21ba9..b591f683e2852c0efe1a06c1121f44b72c020e07 100644 GIT binary patch literal 17987 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 diff --git a/INSTALL.md b/INSTALL.md index 48b60c427..04dfb0dff 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -61,9 +61,11 @@ Choose one of the following options. ``` sh export BUILD_UNIVERSAL=1 -make -C librime xcode/deps/boost +export BOOST_ROOT="$(pwd)/librime/deps/boost_1_83_0" -export BOOST_ROOT="$(pwd)/librime/deps/boost_1_78_0" +export CMAKE_GENERATOR=Ninja + +bash librime/install-boost.sh ``` Let's set `BUILD_UNIVERSAL` to tell `make` that we are building Boost as @@ -96,8 +98,14 @@ port install boost -no_static * Make sure you have updated all the dependencies. If you cloned squirrel with the command in this guide, you've already done it. But if not, this command will update submodules. -``` +``` sh git submodule update --init --recursive + +export BUILD_UNIVERSAL=1 +export CMAKE_GENERATOR=Ninja + +make -C librime +make deps ``` * With all dependencies ready, build `Squirrel.app`: @@ -109,11 +117,14 @@ make To build only for the native architecture, and/or specify the lowest supported macOS version, pass variable `ARCHS`/`MACOSX_DEPLOYMENT_TARGET` to `make`: ``` sh -# for Universal macOS App, targetting Ventura -make ARCHS='arm64 x86_64' MACOSX_DEPLOYMENT_TARGET='13.0' +# for Universal macOS App +make ARCHS='arm64 x86_64' MACOSX_DEPLOYMENT_TARGET='10.15' + +# for Mac computers with Apple Silicon +make ARCHS='arm64' MACOSX_DEPLOYMENT_TARGET='10.15' -# for ARM macOS App, targetting Ventura -make ARCHS='arm64' MACOSX_DEPLOYMENT_TARGET='13.0' +# for Intel-based Mac +make ARCHS='x86_64' MACOSX_DEPLOYMENT_TARGET='10.15' ``` ## Install it on your Mac @@ -123,7 +134,7 @@ make ARCHS='arm64' MACOSX_DEPLOYMENT_TARGET='13.0' Just add `package` after `make` ``` -make package ARCHS='arm64' MACOSX_DEPLOYMENT_TARGET='13.0' +make package ARCHS='arm64' MACOSX_DEPLOYMENT_TARGET='10.14' ``` Define or echo `DEV_ID` to automatically handle code signing and [notarization](https://developer.apple.com/documentation/security/notarizing_macos_software_before_distribution) (Apple Developer ID needed) diff --git a/Makefile b/Makefile index 98783ab2a..b5b418568 100644 --- a/Makefile +++ b/Makefile @@ -3,8 +3,8 @@ all: release install: install-release -# Change to `xcode/dist-with-icu` if boost is linked to icu libraries. -RIME_DIST_TARGET = xcode/dist +# Change to `dist-with-icu` if boost is linked to icu libraries. +RIME_DIST_TARGET = install RIME_BIN_DIR = librime/dist/bin RIME_LIB_DIR = librime/dist/lib @@ -39,7 +39,7 @@ $(RIME_LIBRARY): $(MAKE) librime $(RIME_DEPS): - $(MAKE) -C librime xcode/deps + $(MAKE) -C librime deps librime: $(RIME_DEPS) $(MAKE) -C librime $(RIME_DIST_TARGET) @@ -67,7 +67,7 @@ plum-data: $(MAKE) copy-plum-data opencc-data: - $(MAKE) -C librime xcode/deps/opencc + $(MAKE) -C librime deps/opencc $(MAKE) copy-opencc-data copy-plum-data: @@ -88,9 +88,9 @@ _=$() $() export CMAKE_OSX_ARCHITECTURES = $(subst $(_),;,$(ARCHS)) endif -ifdef MACOSX_DEPLOYMENT_TARGET +# https://cmake.org/cmake/help/latest/envvar/MACOSX_DEPLOYMENT_TARGET.html +MACOSX_DEPLOYMENT_TARGET ?= 10.15 BUILD_SETTINGS += MACOSX_DEPLOYMENT_TARGET="$(MACOSX_DEPLOYMENT_TARGET)" -endif release: $(DEPS_CHECK) bash package/add_data_files @@ -170,5 +170,5 @@ clean: clean-deps: $(MAKE) -C plum clean - $(MAKE) -C librime xcode/clean + $(MAKE) -C librime clean $(MAKE) clean-sparkle diff --git a/README.md b/README.md index 6b5c8ec03..08b2214e9 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,7 @@ 安裝輸入法 --- -本品適用於 macOS 12.0+ +本品適用於 macOS 10.15+ 初次安裝,如果在部份應用程序中打不出字,請註銷並重新登錄。 diff --git a/Sparkle b/Sparkle index 8fb9c83ad..9684a433e 160000 --- a/Sparkle +++ b/Sparkle @@ -1 +1 @@ -Subproject commit 8fb9c83adf6f74364ee57bf314ceee2fa77d0ac2 +Subproject commit 9684a433ee0b55da607791c56f501975f5e11ae5 diff --git a/Squirrel.xcodeproj/project.pbxproj b/Squirrel.xcodeproj/project.pbxproj index 6898ec0ae..ac6c0b5d0 100644 --- a/Squirrel.xcodeproj/project.pbxproj +++ b/Squirrel.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 51; + objectVersion = 54; objects = { /* Begin PBXBuildFile section */ @@ -303,8 +303,8 @@ 44AC95171430CF6000C888FB /* SquirrelApplicationDelegate.m */, 44AC95181430CF6000C888FB /* SquirrelInputController.h */, 44AC95191430CF6000C888FB /* SquirrelInputController.m */, - A47C48DE105E8CE8006D528B /* macos_keycode.m */, A44571AB0DBF42C200F793F9 /* macos_keycode.h */, + A47C48DE105E8CE8006D528B /* macos_keycode.m */, 32CA4F630368D1EE00C91783 /* Squirrel_Prefix.pch */, 4443A8391828CC5100731305 /* input_source.m */, 29B97316FDCFA39411CA2CEA /* main.m */, @@ -505,7 +505,8 @@ 29B97313FDCFA39411CA2CEA /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 1220; + BuildIndependentTargetsInParallel = YES; + LastUpgradeCheck = 1510; }; buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "Squirrel" */; compatibilityVersion = "Xcode 10.0"; @@ -600,12 +601,13 @@ C01FCF4B08A954540054247B /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_OBJC_ARC = YES; CODE_SIGN_IDENTITY = "-"; COMBINE_HIDPI_IMAGES = YES; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 0.17.2; + CURRENT_PROJECT_VERSION = 0.16.2u; DEAD_CODE_STRIPPING = YES; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", @@ -631,7 +633,7 @@ "$(inherited)", "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_1)", ); - MACOSX_DEPLOYMENT_TARGET = 12.0; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; OTHER_CODE_SIGN_FLAGS = "--deep"; OTHER_CPLUSPLUSFLAGS = ( "-DLEOPARD", @@ -650,11 +652,12 @@ C01FCF4C08A954540054247B /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_OBJC_ARC = YES; CODE_SIGN_IDENTITY = "-"; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 0.17.2; + CURRENT_PROJECT_VERSION = 0.16.2u; DEAD_CODE_STRIPPING = YES; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", @@ -679,7 +682,7 @@ "$(inherited)", "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_1)", ); - MACOSX_DEPLOYMENT_TARGET = 12.0; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; OTHER_CODE_SIGN_FLAGS = "--deep"; OTHER_CPLUSPLUSFLAGS = ( "-DLEOPARD", @@ -722,6 +725,7 @@ DEAD_CODE_STRIPPING = YES; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; @@ -743,7 +747,7 @@ /usr/local/lib, ); LIBRARY_SEARCH_PATHS = "$(SRCROOT)/lib"; - MACOSX_DEPLOYMENT_TARGET = 12.0; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; ONLY_ACTIVE_ARCH = YES; SDKROOT = macosx; SYSTEM_HEADER_SEARCH_PATHS = /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks/Tk.framework/Headers; @@ -777,6 +781,7 @@ CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/Release"; DEAD_CODE_STRIPPING = YES; ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; @@ -795,8 +800,8 @@ /usr/lib, ); LIBRARY_SEARCH_PATHS = "$(SRCROOT)/lib"; - MACOSX_DEPLOYMENT_TARGET = 12.0; - ONLY_ACTIVE_ARCH = YES; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; + ONLY_ACTIVE_ARCH = NO; SDKROOT = macosx; SYSTEM_HEADER_SEARCH_PATHS = /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks/Tk.framework/Headers; }; diff --git a/SquirrelApplicationDelegate.h b/SquirrelApplicationDelegate.h index 4f3e421d6..a4bbc061e 100644 --- a/SquirrelApplicationDelegate.h +++ b/SquirrelApplicationDelegate.h @@ -2,6 +2,7 @@ @class SquirrelConfig; @class SquirrelPanel; +@class SquirrelOptionSwitcher; // Note: the SquirrelApplicationDelegate is instantiated automatically as an outlet of NSApp's instance @interface SquirrelApplicationDelegate : NSObject @@ -13,17 +14,18 @@ @property(nonatomic, readonly, strong) SquirrelConfig *config; @property(nonatomic, readonly) BOOL enableNotifications; --(IBAction)deploy:(id)sender; --(IBAction)syncUserData:(id)sender; --(IBAction)configure:(id)sender; --(IBAction)openWiki:(id)sender; +- (IBAction)deploy:(id)sender; +- (IBAction)syncUserData:(id)sender; +- (IBAction)configure:(id)sender; +- (IBAction)openWiki:(id)sender; --(void)setupRime; --(void)startRimeWithFullCheck:(BOOL)fullCheck; --(void)loadSettings; --(void)loadSchemaSpecificSettings:(NSString *)schemaId; +- (void)setupRime; +- (void)startRimeWithFullCheck:(BOOL)fullCheck; +- (void)loadSettings; +- (void)loadSchemaSpecificSettings:(NSString *)schemaId; +- (void)loadSchemaSpecificLabels:(NSString *)schemaId; -@property (nonatomic, readonly) BOOL problematicLaunchDetected; +@property(nonatomic, readonly) BOOL problematicLaunchDetected; @end @@ -34,4 +36,4 @@ @end // also used in main.m -extern void show_message(const char* msg_text, const char* msg_id); +extern void show_message(const char *msg_text, const char *msg_id); diff --git a/SquirrelApplicationDelegate.m b/SquirrelApplicationDelegate.m index db1479ab6..0ac1b683a 100644 --- a/SquirrelApplicationDelegate.m +++ b/SquirrelApplicationDelegate.m @@ -8,7 +8,7 @@ @implementation SquirrelApplicationDelegate --(IBAction)deploy:(id)sender +- (IBAction)deploy:(id)sender { NSLog(@"Start maintenance..."); [self shutdownRime]; @@ -16,23 +16,23 @@ -(IBAction)deploy:(id)sender [self loadSettings]; } --(IBAction)syncUserData:(id)sender +- (IBAction)syncUserData:(id)sender { NSLog(@"Sync user data"); rime_get_api()->sync_user_data(); } --(IBAction)configure:(id)sender +- (IBAction)configure:(id)sender { - [[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:[@"file://" stringByAppendingString:(@"~/Library/Rime").stringByStandardizingPath]]]; + [[NSWorkspace sharedWorkspace] openURL:[NSURL fileURLWithPath:[@"~/Library/Rime/" stringByExpandingTildeInPath]]]; } --(IBAction)openWiki:(id)sender +- (IBAction)openWiki:(id)sender { [[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:kRimeWikiURL]]; } -void show_message(const char* msg_text, const char* msg_id) { +void show_message(const char *msg_text, const char *msg_id) { @autoreleasepool { id notification = [[NSClassFromString(@"NSUserNotification") alloc] init]; [notification performSelector:@selector(setTitle:) @@ -47,37 +47,32 @@ void show_message(const char* msg_text, const char* msg_id) { } } -static void show_status_message(const char *msg_text_long, const char *msg_text_short, const char* msg_id) { - SquirrelPanel* panel = NSApp.squirrelAppDelegate.panel; +static void show_status_message(const char *msg_text_long, const char *msg_text_short, const char *msg_id) { + SquirrelPanel *panel = NSApp.squirrelAppDelegate.panel; if (panel) { NSString *msgLong = msg_text_long ? @(msg_text_long) : nil; NSString *msgShort = msg_text_short ? @(msg_text_short) : nil; - [panel updateStatusLong: msgLong statusShort: msgShort]; + [panel updateStatusLong:msgLong statusShort:msgShort]; } } -void notification_handler(void* context_object, RimeSessionId session_id, - const char* message_type, const char* message_value) { +void notification_handler(void *context_object, RimeSessionId session_id, + const char *message_type, const char *message_value) { if (!strcmp(message_type, "deploy")) { if (!strcmp(message_value, "start")) { show_message("deploy_start", message_type); - } - else if (!strcmp(message_value, "success")) { + } else if (!strcmp(message_value, "success")) { show_message("deploy_success", message_type); - } - else if (!strcmp(message_value, "failure")) { + } else if (!strcmp(message_value, "failure")) { show_message("deploy_failure", message_type); } return; } - // off? id app_delegate = (__bridge id)context_object; - if (app_delegate && ![app_delegate enableNotifications]) { - return; - } // schema change - if (!strcmp(message_type, "schema")) { - const char* schema_name = strchr(message_value, '/'); + if (!strcmp(message_type, "schema") && + app_delegate && [app_delegate enableNotifications]) { + const char *schema_name = strchr(message_value, '/'); if (schema_name) { ++schema_name; show_status_message(schema_name, schema_name, message_type); @@ -85,23 +80,29 @@ void notification_handler(void* context_object, RimeSessionId session_id, return; } // option change - if (!strcmp(message_type, "option")) { + if (!strcmp(message_type, "option") && app_delegate) { Bool state = message_value[0] != '!'; - const char* option_name = message_value + !state; - struct rime_string_slice_t state_label_long = rime_get_api()->get_state_label_abbreviated(session_id, option_name, state, NO); - struct rime_string_slice_t state_label_short = rime_get_api()->get_state_label_abbreviated(session_id, option_name, state, YES); - - if (state_label_long.str || state_label_short.str) { - const char *short_message = state_label_short.length < strlen(state_label_short.str) ? NULL : state_label_short.str; - show_status_message(state_label_long.str, short_message, message_type); + const char *option_name = message_value + !state; + if ([[app_delegate panel].optionSwitcher containsOption:@(option_name)]) { + if ([[app_delegate panel].optionSwitcher updateGroupState:@(message_value) ofOption:@(option_name)]) { + [app_delegate loadSchemaSpecificSettings:[app_delegate panel].optionSwitcher.schemaId]; + } + } + if ([app_delegate enableNotifications]) { + RimeStringSlice state_label_long = rime_get_api()->get_state_label_abbreviated(session_id, option_name, state, NO); + RimeStringSlice state_label_short = rime_get_api()->get_state_label_abbreviated(session_id, option_name, state, YES); + if (state_label_long.str || state_label_short.str) { + const char *short_message = state_label_short.length < strlen(state_label_short.str) ? NULL : state_label_short.str; + show_status_message(state_label_long.str, short_message, message_type); + } } } } --(void)setupRime +- (void)setupRime { - NSString* userDataDir = (@"~/Library/Rime").stringByStandardizingPath; - NSFileManager* fileManager = [NSFileManager defaultManager]; + NSString *userDataDir = (@"~/Library/Rime").stringByStandardizingPath; + NSFileManager *fileManager = [NSFileManager defaultManager]; if (![fileManager fileExistsAtPath:userDataDir]) { if (![fileManager createDirectoryAtPath:userDataDir withIntermediateDirectories:YES @@ -117,12 +118,12 @@ -(void)setupRime squirrel_traits.distribution_code_name = "Squirrel"; squirrel_traits.distribution_name = "鼠鬚管"; squirrel_traits.distribution_version = - [[NSBundle mainBundle].infoDictionary[@"CFBundleVersion"] UTF8String]; + [[NSBundle mainBundle].infoDictionary[@"CFBundleVersion"] UTF8String]; squirrel_traits.app_name = "rime.squirrel"; rime_get_api()->setup(&squirrel_traits); } --(void)startRimeWithFullCheck:(BOOL)fullCheck +- (void)startRimeWithFullCheck:(BOOL)fullCheck { NSLog(@"Initializing la rime..."); rime_get_api()->initialize(NULL); @@ -138,21 +139,21 @@ - (void)shutdownRime { rime_get_api()->finalize(); } --(void)loadSettings { +- (void)loadSettings { _config = [[SquirrelConfig alloc] init]; if (![_config openBaseConfig]) { return; } _enableNotifications = - ![[_config getString:@"show_notifications_when"] isEqualToString:@"never"]; + ![[_config getString:@"show_notifications_when"] isEqualToString:@"never"]; [self.panel loadConfig:_config forDarkMode:NO]; if (@available(macOS 10.14, *)) { [self.panel loadConfig:_config forDarkMode:YES]; } } --(void)loadSchemaSpecificSettings:(NSString *)schemaId { +- (void)loadSchemaSpecificSettings:(NSString *)schemaId { if (schemaId.length == 0 || [schemaId characterAtIndex:0] == '.') { return; } @@ -164,7 +165,7 @@ -(void)loadSchemaSpecificSettings:(NSString *)schemaId { [self.panel loadConfig:self.config forDarkMode:NO]; } if (@available(macOS 10.14, *)) { - if ([schema openWithSchemaId:schemaId baseConfig:self.config] && + if ([schema openWithSchemaId:schemaId baseConfig:self.config] && [schema hasSection:@"style"]) { [self.panel loadConfig:schema forDarkMode:YES]; } else { @@ -174,47 +175,63 @@ -(void)loadSchemaSpecificSettings:(NSString *)schemaId { [schema close]; } +- (void)loadSchemaSpecificLabels:(NSString *)schemaId { + if (schemaId.length == 0 || [schemaId characterAtIndex:0] == '.') { + return; + } + SquirrelConfig *defaultConfig = [[SquirrelConfig alloc] init]; + [defaultConfig openWithConfigId:@"default"]; + SquirrelConfig *schema = [[SquirrelConfig alloc] init]; + if ([schema openWithSchemaId:schemaId baseConfig:defaultConfig] && + [schema hasSection:@"menu"]) { + [self.panel loadLabelConfig:schema]; + } else { + [self.panel loadLabelConfig:defaultConfig]; + } + [schema close]; + [defaultConfig close]; +} + // prevent freezing the system --(BOOL)problematicLaunchDetected +- (BOOL)problematicLaunchDetected { BOOL detected = NO; - NSString* logfile = - [NSTemporaryDirectory() stringByAppendingPathComponent:@"squirrel_launch.dat"]; + NSString *logfile = [NSTemporaryDirectory() stringByAppendingPathComponent:@"squirrel_launch.dat"]; //NSLog(@"[DEBUG] archive: %@", logfile); - NSData* archive = [NSData dataWithContentsOfFile:logfile + NSData *archive = [NSData dataWithContentsOfFile:logfile options:NSDataReadingUncached error:nil]; if (archive) { - NSDate* previousLaunch = [NSKeyedUnarchiver unarchivedObjectOfClass:NSDate.class fromData:archive error:NULL]; + NSDate *previousLaunch = [NSKeyedUnarchiver unarchivedObjectOfClass:NSDate.class fromData:archive error:NULL]; if (previousLaunch && previousLaunch.timeIntervalSinceNow >= -2) { detected = YES; } } - NSDate* now = [NSDate date]; - NSData* record = [NSKeyedArchiver archivedDataWithRootObject:now requiringSecureCoding:NO error:NULL]; + NSDate *now = [NSDate date]; + NSData *record = [NSKeyedArchiver archivedDataWithRootObject:now requiringSecureCoding:NO error:NULL]; [record writeToFile:logfile atomically:NO]; return detected; } --(void)workspaceWillPowerOff:(NSNotification *)aNotification +- (void)workspaceWillPowerOff:(NSNotification *)aNotification { NSLog(@"Finalizing before logging out."); [self shutdownRime]; } --(void)rimeNeedsReload:(NSNotification *)aNotification +- (void)rimeNeedsReload:(NSNotification *)aNotification { NSLog(@"Reloading rime on demand."); [self deploy:nil]; } --(void)rimeNeedsSync:(NSNotification *)aNotification +- (void)rimeNeedsSync:(NSNotification *)aNotification { NSLog(@"Sync rime on demand."); [self syncUserData:nil]; } --(NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender +- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender { NSLog(@"Squirrel is quitting."); rime_get_api()->cleanup_all_sessions(); @@ -224,15 +241,15 @@ -(NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender //add an awakeFromNib item so that we can set the action method. Note that //any menuItems without an action will be disabled when displayed in the Text //Input Menu. --(void)awakeFromNib +- (void)awakeFromNib { - NSNotificationCenter* center = [NSWorkspace sharedWorkspace].notificationCenter; + NSNotificationCenter *center = [NSWorkspace sharedWorkspace].notificationCenter; [center addObserver:self selector:@selector(workspaceWillPowerOff:) name:NSWorkspaceWillPowerOffNotification object:nil]; - NSDistributedNotificationCenter* notifCenter = [NSDistributedNotificationCenter defaultCenter]; + NSDistributedNotificationCenter *notifCenter = [NSDistributedNotificationCenter defaultCenter]; [notifCenter addObserver:self selector:@selector(rimeNeedsReload:) name:@"SquirrelReloadNotification" @@ -242,10 +259,9 @@ -(void)awakeFromNib selector:@selector(rimeNeedsSync:) name:@"SquirrelSyncNotification" object:nil]; - } --(void)dealloc +- (void)dealloc { [[NSNotificationCenter defaultCenter] removeObserver:self]; [[NSDistributedNotificationCenter defaultCenter] removeObserver:self]; @@ -258,9 +274,8 @@ -(void)dealloc @implementation NSApplication (SquirrelApp) --(SquirrelApplicationDelegate *)squirrelAppDelegate { +- (SquirrelApplicationDelegate *)squirrelAppDelegate { return (SquirrelApplicationDelegate *)self.delegate; } @end - diff --git a/SquirrelConfig.h b/SquirrelConfig.h index c4bd50145..69b77d98b 100644 --- a/SquirrelConfig.h +++ b/SquirrelConfig.h @@ -3,6 +3,29 @@ typedef NSDictionary SquirrelAppOptions; typedef NSMutableDictionary SquirrelMutableAppOptions; +@interface SquirrelOptionSwitcher : NSObject + +@property(nonatomic, strong, readonly) NSString *schemaId; +@property(nonatomic, strong, readonly) NSArray *optionNames; +@property(nonatomic, strong, readonly) NSArray *optionStates; +@property(nonatomic, strong, readonly) NSDictionary *> *optionGroups; +@property(nonatomic, strong, readonly) NSDictionary *switcher; + +- (instancetype)initWithSchemaId:(NSString *)schemaId + switcher:(NSDictionary *)switcher + optionGroups:(NSDictionary *> *)optionGroups; + +// return whether switcher options has been successfully updated +- (BOOL)updateSwitcher:(NSDictionary *)switcher; + +- (BOOL)updateGroupState:(NSString *)optionState ofOption:(NSString *)optionName; + +- (BOOL)containsOption:(NSString *)optionName; + +- (NSMutableDictionary *)mutableSwitcher; + +@end + @interface SquirrelConfig : NSObject @property(nonatomic, readonly) BOOL isOpen; @@ -12,12 +35,14 @@ typedef NSMutableDictionary SquirrelMutableAppOptions; - (BOOL)openBaseConfig; - (BOOL)openWithSchemaId:(NSString *)schemaId baseConfig:(SquirrelConfig *)config; +- (BOOL)openUserConfig:(NSString *)configId; +- (BOOL)openWithConfigId:(NSString *)configId; - (void)close; - (BOOL)hasSection:(NSString *)section; - (BOOL)getBool:(NSString *)option; -- (NSInteger)getInt:(NSString *)option; +- (int)getInt:(NSString *)option; - (double)getDouble:(NSString *)option; - (NSNumber *)getOptionalBool:(NSString *)option; - (NSNumber *)getOptionalInt:(NSString *)option; @@ -26,7 +51,12 @@ typedef NSMutableDictionary SquirrelMutableAppOptions; - (NSString *)getString:(NSString *)option; // 0xaabbggrr or 0xbbggrr - (NSColor *)getColor:(NSString *)option; +// file path (absolute or relative to ~/Library/Rime) +- (NSColor *)getPattern:(NSString *)option; + +- (NSArray *)getList:(NSString *)option; +- (SquirrelOptionSwitcher *)getOptionSwitcher; - (SquirrelAppOptions *)getAppOptions:(NSString *)appName; @end diff --git a/SquirrelConfig.m b/SquirrelConfig.m index d816f1b40..3c40058e6 100644 --- a/SquirrelConfig.m +++ b/SquirrelConfig.m @@ -2,6 +2,81 @@ #import +@implementation SquirrelOptionSwitcher { + NSString *_schemaId; + NSDictionary *_switcher; + NSDictionary *> *_optionGroups; + NSArray *_optionNames; +} + +- (instancetype)initWithSchemaId:(NSString *)schemaId + switcher:(NSDictionary *)switcher + optionGroups:(NSDictionary *> *)optionGroups{ + self = [super init]; + if (self) { + _schemaId = schemaId; + _switcher = switcher; + _optionGroups = optionGroups; + _optionNames = [switcher allKeys]; + } + return self; +} + +- (NSString *)schemaId { + return _schemaId; +} + +- (NSArray *)optionNames { + return _optionNames; +} + +- (NSArray *)optionStates { + return [_switcher allValues]; +} + +- (NSDictionary *)switcher { + return _switcher; +} + +- (BOOL)updateSwitcher:(NSDictionary *)switcher { + if (switcher.count != _switcher.count) { + return NO; + } + NSMutableDictionary *updatedSwitcher = + [[NSMutableDictionary alloc] initWithCapacity:switcher.count]; + for (NSString *option in _optionNames) { + if (switcher[option] == nil) { + return NO; + } + updatedSwitcher[option] = switcher[option]; + } + _switcher = [updatedSwitcher copy]; + return YES; +} + +- (BOOL)updateGroupState:(NSString *)optionState ofOption:(NSString *)optionName { + NSArray *optionGroup = _optionGroups[optionName]; + if (!optionGroup || ![optionGroup containsObject:optionState]) { + return NO; + } + NSMutableDictionary *updatedSwitcher = [_switcher mutableCopy]; + for (NSString *option in optionGroup) { + updatedSwitcher[option] = optionState; + } + _switcher = [updatedSwitcher copy]; + return YES; +} + +- (BOOL)containsOption:(NSString *)optionName { + return [_optionNames containsObject:optionName]; +} + +- (NSMutableDictionary *)mutableSwitcher { + return [_switcher mutableCopy]; +} + +@end + @implementation SquirrelConfig { NSMutableDictionary *_cache; RimeConfig _config; @@ -44,6 +119,18 @@ - (BOOL)openWithSchemaId:(NSString *)schemaId return _isOpen; } +- (BOOL)openUserConfig:(NSString *)configId { + [self close]; + _isOpen = !!rime_get_api()->user_config_open(configId.UTF8String, &_config); + return _isOpen; +} + +- (BOOL)openWithConfigId:(NSString *)configId { + [self close]; + _isOpen = !!rime_get_api()->config_open(configId.UTF8String, &_config); + return _isOpen; +} + - (void)close { if (_isOpen) { rime_get_api()->config_close(&_config); @@ -67,8 +154,8 @@ - (BOOL)getBool:(NSString *)option { return [self getOptionalBool:option].boolValue; } -- (NSInteger)getInt:(NSString *)option { - return [self getOptionalInt:option].integerValue; +- (int)getInt:(NSString *)option { + return [self getOptionalInt:option].intValue; } - (double)getDouble:(NSString *)option { @@ -76,7 +163,7 @@ - (double)getDouble:(NSString *)option { } - (NSNumber *)getOptionalBool:(NSString *)option { - NSNumber* cachedValue = [self cachedValueOfClass:[NSNumber class] forKey:option]; + NSNumber *cachedValue = [self cachedValueOfClass:[NSNumber class] forKey:option]; if (cachedValue) { return cachedValue; } @@ -97,7 +184,6 @@ - (NSNumber *)getOptionalInt:(NSString *)option { return _cache[option] = @(value); } return [_baseConfig getOptionalInt:option]; - } - (NSNumber *)getOptionalDouble:(NSString *)option { @@ -118,7 +204,7 @@ - (NSString *)getString:(NSString *)option { return cachedValue; } const char *value = - _isOpen ? rime_get_api()->config_get_cstring(&_config, option.UTF8String) : NULL; + _isOpen ? rime_get_api()->config_get_cstring(&_config, option.UTF8String) : NULL; if (value) { return _cache[option] = @(value); } @@ -138,9 +224,72 @@ - (NSColor *)getColor:(NSString *)option { return [_baseConfig getColor:option]; } +- (NSColor *)getPattern:(NSString *)option { + NSColor *cachedValue = [self cachedValueOfClass:[NSColor class] forKey:option]; + if (cachedValue) { + return cachedValue; + } + NSColor *pattern = [self patternFromFile:[self getString:option]]; + if (pattern) { + _cache[option] = pattern; + return pattern; + } + return [_baseConfig getPattern:option]; +} + +- (NSArray *)getList:(NSString *)option { + NSMutableArray *strList = [[NSMutableArray alloc] init]; + RimeConfigIterator iterator; + rime_get_api()->config_begin_list(&iterator, &_config, option.UTF8String); + while (rime_get_api()->config_next(&iterator)) { + [strList addObject:[self getString:@(iterator.path)]]; + } + rime_get_api()->config_end(&iterator); + return strList; +} + +- (SquirrelOptionSwitcher *)getOptionSwitcher { + NSMutableDictionary *switcher = [[NSMutableDictionary alloc] init]; + NSMutableDictionary *> *optionGroups = [[NSMutableDictionary alloc] init]; + RimeConfigIterator switchIter; + rime_get_api()->config_begin_list(&switchIter, &_config, "switches"); + while (rime_get_api()->config_next(&switchIter)) { + int reset = [self getInt:[@(switchIter.path) stringByAppendingString:@"/reset"]]; + NSString *name = [self getString:[@(switchIter.path) stringByAppendingString:@"/name"]]; + if (name) { + if ([self hasSection:[@"style/!" stringByAppendingString:name]] || + [self hasSection:[@"style/" stringByAppendingString:name]]) { + switcher[name] = reset ? name : [@"!" stringByAppendingString:name]; + optionGroups[name] = @[name]; + } + } else { + NSMutableArray *optionGroup = [[NSMutableArray alloc] init]; + BOOL hasStyleSection = NO; + RimeConfigIterator optionIter; + rime_get_api()->config_begin_list(&optionIter, &_config, [@(switchIter.path) stringByAppendingString:@"/options"].UTF8String); + while (rime_get_api()->config_next(&optionIter)) { + NSString *option = [self getString:@(optionIter.path)]; + [optionGroup addObject:option]; + hasStyleSection |= [self hasSection:[@"style/" stringByAppendingString:option]]; + } + rime_get_api()->config_end(&optionIter); + if (hasStyleSection) { + for (NSUInteger i = 0; i < optionGroup.count; ++i) { + switcher[optionGroup[i]] = optionGroup[reset]; + optionGroups[optionGroup[i]] = optionGroup; + } + } + } + } + rime_get_api()->config_end(&switchIter); + return [[SquirrelOptionSwitcher alloc] initWithSchemaId:_schemaId + switcher:switcher + optionGroups:optionGroups]; +} + - (SquirrelAppOptions *)getAppOptions:(NSString *)appName { - NSString * rootKey = [@"app_options/" stringByAppendingString:appName]; - SquirrelMutableAppOptions* appOptions = [[SquirrelMutableAppOptions alloc] init]; + NSString *rootKey = [@"app_options/" stringByAppendingString:appName]; + SquirrelMutableAppOptions *appOptions = [[SquirrelMutableAppOptions alloc] init]; RimeConfigIterator iterator; rime_get_api()->config_begin_map(&iterator, &_config, rootKey.UTF8String); while (rime_get_api()->config_next(&iterator)) { @@ -188,4 +337,18 @@ - (NSColor *)colorFromString:(NSString *)string { } } +- (NSColor *)patternFromFile:(NSString *)filePath { + if (filePath == nil) { + return nil; + } + NSFileManager *fileManager = [NSFileManager defaultManager]; + [fileManager changeCurrentDirectoryPath:[@"~/Library/Rime" stringByStandardizingPath]]; + NSString *patternFile = [filePath stringByStandardizingPath]; + if ([fileManager fileExistsAtPath:patternFile]) { + NSColor *pattern = [NSColor colorWithPatternImage:[[NSImage alloc] initByReferencingFile:patternFile]]; + return pattern; + } + return nil; +} + @end diff --git a/SquirrelInputController.h b/SquirrelInputController.h index 5e718b325..92d8c0197 100644 --- a/SquirrelInputController.h +++ b/SquirrelInputController.h @@ -2,6 +2,11 @@ #import @interface SquirrelInputController : IMKInputController -- (BOOL)selectCandidate:(NSInteger)index; -- (BOOL)pageUp:(BOOL)up; + +- (BOOL)perform:(NSUInteger)action onIndex:(NSUInteger)index; + @end + +#define kSELECT 0x1 +#define kDELETE 0x2 +#define kCHOOSE 0x3 diff --git a/SquirrelInputController.m b/SquirrelInputController.m index 02f0ef8a4..73d34ac4f 100644 --- a/SquirrelInputController.m +++ b/SquirrelInputController.m @@ -7,12 +7,13 @@ #import #import -@interface SquirrelInputController(Private) --(void)createSession; --(void)destroySession; --(void)rimeConsumeCommittedText; --(void)rimeUpdate; --(void)updateAppOptions; +@interface SquirrelInputController (Private) +- (void)createSession; +- (void)destroySession; +- (void)rimeConsumeCommittedText; +- (void)updateStyleOptions; +- (void)rimeUpdate; +- (void)updateAppOptions; @end const int N_KEY_ROLL_OVER = 50; @@ -22,7 +23,7 @@ @implementation SquirrelInputController { NSString *_preeditString; NSRange _selRange; NSUInteger _caretPos; - NSArray *_candidates; + NSArray *_candidates; NSUInteger _lastModifier; NSEventType _lastEventType; RimeSessionId _session; @@ -39,11 +40,11 @@ @implementation SquirrelInputController { } /*! - @method - @abstract Receive incoming event - @discussion This method receives key events from the client application. + @method + @abstract Receive incoming event + @discussion This method receives key events from the client application. */ -- (BOOL)handleEvent:(NSEvent*)event client:(id)sender +- (BOOL)handleEvent:(NSEvent *)event client:(id)sender { // Return YES to indicate the the key input was received and dealt with. // Key processing will not continue in that case. In other words the @@ -64,7 +65,7 @@ - (BOOL)handleEvent:(NSEvent*)event client:(id)sender } } - NSString* app = [_currentClient bundleIdentifier]; + NSString *app = [_currentClient bundleIdentifier]; if (![_currentApp isEqualToString:app]) { _currentApp = [app copy]; @@ -133,11 +134,12 @@ - (BOOL)handleEvent:(NSEvent*)event client:(id)sender } break; case NSEventTypeKeyDown: { // ignore Command+X hotkeys. - if (modifiers & OSX_COMMAND_MASK) + if (modifiers & OSX_COMMAND_MASK) { break; + } int keyCode = event.keyCode; - NSString* keyChars = event.charactersIgnoringModifiers; + NSString *keyChars = event.charactersIgnoringModifiers; if (!isalpha(keyChars.UTF8String[0])) { keyChars = event.characters; } @@ -145,9 +147,9 @@ - (BOOL)handleEvent:(NSEvent*)event client:(id)sender // sender, modifiers, keyCode, keyChars); // translate osx keyevents to rime keyevents - int rime_keycode = osx_keycode_to_rime_keycode( - keyCode, keyChars.UTF8String[0], modifiers & OSX_SHIFT_MASK, - modifiers & OSX_CAPITAL_MASK); + int rime_keycode = osx_keycode_to_rime_keycode(keyCode, keyChars.UTF8String[0], + modifiers & OSX_SHIFT_MASK, + modifiers & OSX_CAPITAL_MASK); if (rime_keycode) { int rime_modifiers = osx_modifiers_to_rime_modifiers(modifiers); handled = [self processKey:rime_keycode modifiers:rime_modifiers]; @@ -165,10 +167,8 @@ - (BOOL)handleEvent:(NSEvent*)event client:(id)sender return handled; } --(BOOL)processKey:(int)rime_keycode modifiers:(int)rime_modifiers +- (BOOL)processKey:(int)rime_keycode modifiers:(int)rime_modifiers { - // TODO add special key event preprocessing here - // with linear candidate list, arrow keys may behave differently. Bool is_linear = NSApp.squirrelAppDelegate.panel.linear; if (is_linear != rime_get_api()->get_option(_session, "_linear")) { @@ -187,9 +187,9 @@ -(BOOL)processKey:(int)rime_keycode modifiers:(int)rime_modifiers if (!handled) { BOOL isVimBackInCommandMode = rime_keycode == XK_Escape || - ((rime_modifiers & kControlMask) && (rime_keycode == XK_c || - rime_keycode == XK_C || - rime_keycode == XK_bracketleft)); + ((rime_modifiers & kControlMask) && (rime_keycode == XK_c || + rime_keycode == XK_C || + rime_keycode == XK_bracketleft)); if (isVimBackInCommandMode && rime_get_api()->get_option(_session, "vim_mode") && !rime_get_api()->get_option(_session, "ascii_mode")) { @@ -200,16 +200,15 @@ -(BOOL)processKey:(int)rime_keycode modifiers:(int)rime_modifiers // Simulate key-ups for every interesting key-down for chord-typing. if (handled) { - bool is_chording_key = - (rime_keycode >= XK_space && rime_keycode <= XK_asciitilde) || - rime_keycode == XK_Control_L || rime_keycode == XK_Control_R || - rime_keycode == XK_Alt_L || rime_keycode == XK_Alt_R || - rime_keycode == XK_Shift_L || rime_keycode == XK_Shift_R; + BOOL is_chording_key = + (rime_keycode >= XK_space && rime_keycode <= XK_asciitilde) || + rime_keycode == XK_Control_L || rime_keycode == XK_Control_R || + rime_keycode == XK_Alt_L || rime_keycode == XK_Alt_R || + rime_keycode == XK_Shift_L || rime_keycode == XK_Shift_R; if (is_chording_key && rime_get_api()->get_option(_session, "_chord_typing")) { [self updateChord:rime_keycode modifiers:rime_modifiers]; - } - else if ((rime_modifiers & kReleaseMask) == 0) { + } else if ((rime_modifiers & kReleaseMask) == 0) { // non-chording key pressed [self clearChord]; } @@ -218,38 +217,38 @@ -(BOOL)processKey:(int)rime_keycode modifiers:(int)rime_modifiers return handled; } -- (BOOL)selectCandidate:(NSInteger)index { - BOOL success = rime_get_api()->select_candidate_on_current_page(_session, (int) index); - if (success) { - [self rimeUpdate]; - } - return success; -} - -- (BOOL)pageUp:(BOOL)up { +- (BOOL)perform:(NSUInteger)action onIndex:(NSUInteger)index { BOOL handled = NO; - if (up) { - handled = rime_get_api()->change_page(_session, True); - } else { - handled = rime_get_api()->change_page(_session, False); + if (index == NSPageUpFunctionKey && action == kSELECT) { + handled = rime_get_api()->process_key(_session, XK_Page_Up, 0); + } else if (index == NSPageDownFunctionKey && action == kSELECT) { + handled = rime_get_api()->process_key(_session, XK_Page_Down, 0); + } else if (index >= 0 && index < 10) { + if (action == kSELECT) { + handled = rime_get_api()->select_candidate_on_current_page(_session, (int)index); + } else if (action == kCHOOSE) { + handled = rime_get_api()->choose_candidate_on_current_page(_session, (int)index); + } else if (action == kDELETE) { + handled = rime_get_api()->delete_candidate_on_current_page(_session, (int)index); + } } - if (handled) { + if (handled && action != kCHOOSE) { [self rimeUpdate]; } return handled; } --(void)onChordTimer:(NSTimer *)timer +- (void)onChordTimer:(NSTimer *)timer { // chord release triggered by timer int processed_keys = 0; if (_chordKeyCount && _session) { // simulate key-ups for (int i = 0; i < _chordKeyCount; ++i) { - if (rime_get_api()->process_key(_session, - _chordKeyCodes[i], - (_chordModifiers[i] | kReleaseMask))) + if (rime_get_api()->process_key(_session, _chordKeyCodes[i], + (_chordModifiers[i] | kReleaseMask))) { ++processed_keys; + } } } [self clearChord]; @@ -258,12 +257,13 @@ -(void)onChordTimer:(NSTimer *)timer } } --(void)updateChord:(int)keycode modifiers:(int)modifiers +- (void)updateChord:(int)keycode modifiers:(int)modifiers { //NSLog(@"update chord: {%s} << %x", _chord, keycode); for (int i = 0; i < _chordKeyCount; ++i) { - if (_chordKeyCodes[i] == keycode) + if (_chordKeyCodes[i] == keycode) { return; + } } if (_chordKeyCount >= N_KEY_ROLL_OVER) { // you are cheating. only one human typist (fingers <= 10) is supported. @@ -288,7 +288,7 @@ -(void)updateChord:(int)keycode modifiers:(int)modifiers repeats:NO]; } --(void)clearChord +- (void)clearChord { _chordKeyCount = 0; if (_chordTimer) { @@ -299,13 +299,13 @@ -(void)clearChord } } --(NSUInteger)recognizedEvents:(id)sender +- (NSUInteger)recognizedEvents:(id)sender { //NSLog(@"recognizedEvents:"); return NSEventMaskKeyDown | NSEventMaskFlagsChanged; } --(void)activateServer:(id)sender +- (void)activateServer:(id)sender { //NSLog(@"activateServer:"); NSString *keyboardLayout = [NSApp.squirrelAppDelegate.config getString:@"keyboard_layout"]; @@ -322,7 +322,7 @@ -(void)activateServer:(id)sender _preeditString = @""; } --(instancetype)initWithServer:(IMKServer*)server delegate:(id)delegate client:(id)inputClient +- (instancetype)initWithServer:(IMKServer *)server delegate:(id)delegate client:(id)inputClient { //NSLog(@"initWithServer:delegate:client:"); if (self = [super initWithServer:server delegate:delegate client:inputClient]) { @@ -332,7 +332,7 @@ -(instancetype)initWithServer:(IMKServer*)server delegate:(id)delegate client:(i return self; } --(void)deactivateServer:(id)sender +- (void)deactivateServer:(id)sender { //NSLog(@"deactivateServer:"); [NSApp.squirrelAppDelegate.panel hide]; @@ -340,24 +340,24 @@ -(void)deactivateServer:(id)sender } /*! - @method - @abstract Called when a user action was taken that ends an input session. - Typically triggered by the user selecting a new input method - or keyboard layout. - @discussion When this method is called your controller should send the - current input buffer to the client via a call to - insertText:replacementRange:. Additionally, this is the time - to clean up if that is necessary. + @method + @abstract Called when a user action was taken that ends an input session. + Typically triggered by the user selecting a new input method + or keyboard layout. + @discussion When this method is called your controller should send the + current input buffer to the client via a call to + insertText:replacementRange:. Additionally, this is the time + to clean up if that is necessary. */ --(void)commitComposition:(id)sender +- (void)commitComposition:(id)sender { //NSLog(@"commitComposition:"); // commit raw input if (_session) { - const char* raw_input = rime_get_api()->get_input(_session); + const char *raw_input = rime_get_api()->get_input(_session); if (raw_input) { - [self commitString: @(raw_input)]; + [self commitString:@(raw_input)]; rime_get_api()->clear_composition(_session); } } @@ -367,47 +367,47 @@ -(void)commitComposition:(id)sender // > though we specified the showPrefPanel: in SunPinyinApplicationDelegate as the // > action receiver, the IMKInputController will actually receive the event. // so here we deliver messages to our responsible SquirrelApplicationDelegate --(void)deploy:(id)sender +- (void)deploy:(id)sender { [NSApp.squirrelAppDelegate deploy:sender]; } --(void)syncUserData:(id)sender +- (void)syncUserData:(id)sender { [NSApp.squirrelAppDelegate syncUserData:sender]; } --(void)configure:(id)sender +- (void)configure:(id)sender { [NSApp.squirrelAppDelegate configure:sender]; } --(void)checkForUpdates:(id)sender +- (void)checkForUpdates:(id)sender { [NSApp.squirrelAppDelegate.updater performSelector:@selector(checkForUpdates:) withObject:sender]; } --(void)openWiki:(id)sender +- (void)openWiki:(id)sender { [NSApp.squirrelAppDelegate openWiki:sender]; } --(NSMenu*)menu +- (NSMenu *)menu { return NSApp.squirrelAppDelegate.menu; } --(NSArray*)candidates:(id)sender +- (NSArray *)candidates:(id)sender { return _candidates; } --(void)dealloc +- (void)dealloc { [self destroySession]; } --(void)commitString:(NSString*)string +- (void)commitString:(NSString *)string { //NSLog(@"commitString:"); [_currentClient insertText:string @@ -418,15 +418,16 @@ -(void)commitString:(NSString*)string [NSApp.squirrelAppDelegate.panel hide]; } --(void)showPreeditString:(NSString*)preedit - selRange:(NSRange)range - caretPos:(NSUInteger)pos +- (void)showPreeditString:(NSString *)preedit + selRange:(NSRange)range + caretPos:(NSUInteger)pos { //NSLog(@"showPreeditString: '%@'", preedit); if ([_preeditString isEqualToString:preedit] && - _caretPos == pos && _selRange.location == range.location && _selRange.length == range.length) + NSEqualRanges(_selRange, range) && _caretPos == pos) { return; + } _preeditString = preedit; _selRange = range; @@ -434,8 +435,8 @@ -(void)showPreeditString:(NSString*)preedit //NSLog(@"selRange.location = %ld, selRange.length = %ld; caretPos = %ld", // range.location, range.length, pos); - NSDictionary* attrs; - NSMutableAttributedString* attrString = [[NSMutableAttributedString alloc] initWithString:preedit]; + NSDictionary *attrs; + NSMutableAttributedString *attrString = [[NSMutableAttributedString alloc] initWithString:preedit]; if (range.location > 0) { NSRange convertedRange = NSMakeRange(0, range.location); attrs = [self markForStyle:kTSMHiliteConvertedText atRange:convertedRange]; @@ -449,22 +450,33 @@ -(void)showPreeditString:(NSString*)preedit [_currentClient setMarkedText:attrString selectionRange:NSMakeRange(pos, 0) replacementRange:NSMakeRange(NSNotFound, 0)]; - } --(void)showPanelWithPreedit:(NSString*)preedit - selRange:(NSRange)selRange - caretPos:(NSUInteger)caretPos - candidates:(NSArray*)candidates - comments:(NSArray*)comments - labels:(NSArray*)labels - highlighted:(NSUInteger)index +- (void)showPanelWithPreedit:(NSString *)preedit + selRange:(NSRange)selRange + caretPos:(NSUInteger)caretPos + candidates:(NSArray *)candidates + comments:(NSArray *)comments + highlighted:(NSUInteger)index + pageNum:(NSUInteger)pageNum + lastPage:(BOOL)lastPage { //NSLog(@"showPanelWithPreedit:...:"); _candidates = candidates; NSRect inputPos; [_currentClient attributesForCharacterIndex:0 lineHeightRectangle:&inputPos]; - SquirrelPanel* panel = NSApp.squirrelAppDelegate.panel; + SquirrelPanel *panel = NSApp.squirrelAppDelegate.panel; + if (@available(macOS 14.0, *)) { // avoid overlapping with cursor effects view + if (_lastModifier & OSX_CAPITAL_MASK) { + if (NSHeight(inputPos) > NSWidth(inputPos)) { + inputPos.size.height += 26; + inputPos.origin.y -= 26; + } else { + inputPos.size.width += 33; + inputPos.origin.x -= 33; + } + } + } panel.position = inputPos; panel.inputController = self; [panel showPreedit:preedit @@ -472,8 +484,10 @@ -(void)showPanelWithPreedit:(NSString*)preedit caretPos:caretPos candidates:candidates comments:comments - labels:labels highlighted:index + pageNum:pageNum + lastPage:lastPage + turnPage:NSNotFound update:YES]; } @@ -481,11 +495,11 @@ -(void)showPanelWithPreedit:(NSString*)preedit // implementation of private interface -@implementation SquirrelInputController(Private) +@implementation SquirrelInputController (Private) --(void)createSession +- (void)createSession { - NSString* app = [_currentClient bundleIdentifier]; + NSString *app = [_currentClient bundleIdentifier]; NSLog(@"createSession: %@", app); _currentApp = [app copy]; _session = rime_get_api()->create_session(); @@ -497,13 +511,14 @@ -(void)createSession } } --(void)updateAppOptions +- (void)updateAppOptions { - if (!_currentApp) + if (!_currentApp) { return; - SquirrelAppOptions* appOptions = [NSApp.squirrelAppDelegate.config getAppOptions:_currentApp]; + } + SquirrelAppOptions *appOptions = [NSApp.squirrelAppDelegate.config getAppOptions:_currentApp]; if (appOptions) { - for (NSString* key in appOptions) { + for (NSString *key in appOptions) { BOOL value = appOptions[key].boolValue; NSLog(@"set app option: %@ = %d", key, value); rime_get_api()->set_option(_session, key.UTF8String, value); @@ -511,7 +526,7 @@ -(void)updateAppOptions } } --(void)destroySession +- (void)destroySession { //NSLog(@"destroySession:"); if (_session) { @@ -521,38 +536,68 @@ -(void)destroySession [self clearChord]; } --(void)rimeConsumeCommittedText +- (void)rimeConsumeCommittedText { RIME_STRUCT(RimeCommit, commit); if (rime_get_api()->get_commit(_session, &commit)) { NSString *commitText = @(commit.text); - [self commitString: commitText]; + [self commitString:commitText]; rime_get_api()->free_commit(&commit); } } -NSString *substr(const char *str, int length) { - char substring[length+1]; - strncpy(substring, str, length); - substring[length] = '\0'; - return [NSString stringWithCString:substring encoding:NSUTF8StringEncoding]; +- (void)updateStyleOptions +{ + // update the list of switchers that change styles and color-themes + SquirrelOptionSwitcher *optionSwitcher; + SquirrelConfig *schema = [[SquirrelConfig alloc] init]; + if ([schema openWithSchemaId:_schemaId baseConfig:NSApp.squirrelAppDelegate.config] && + [schema hasSection:@"style"]) { + optionSwitcher = [schema getOptionSwitcher]; + } else { + optionSwitcher = [[SquirrelOptionSwitcher alloc] initWithSchemaId:_schemaId switcher:@{} optionGroups:@{}]; + } + [schema close]; + NSMutableDictionary *switcher = [optionSwitcher mutableSwitcher]; + NSSet *prevStates = [NSSet setWithArray:optionSwitcher.optionStates]; + for (NSString *state in prevStates) { + NSString *updatedState; + NSArray *optionGroup = [optionSwitcher.switcher allKeysForObject:state]; + for (NSString *option in optionGroup) { + if (rime_get_api()->get_option(_session, option.UTF8String)) { + updatedState = option; + break; + } + } + updatedState = updatedState ? : [@"!" stringByAppendingString:optionGroup[0]]; + if (![updatedState isEqualToString:state]) { + for (NSString *option in optionGroup) { + switcher[option] = updatedState; + } + } + } + [optionSwitcher updateSwitcher:switcher]; + [NSApp.squirrelAppDelegate.panel setOptionSwitcher:optionSwitcher]; } --(void)rimeUpdate +- (void)rimeUpdate { //NSLog(@"rimeUpdate"); [self rimeConsumeCommittedText]; + BOOL switcherMenu = rime_get_api()->get_option(_session, "dumb"); RIME_STRUCT(RimeStatus, status); if (rime_get_api()->get_status(_session, &status)) { // enable schema specific ui style - if (!_schemaId || strcmp(_schemaId.UTF8String, status.schema_id) != 0) { + if (!switcherMenu && (!_schemaId || strcmp(_schemaId.UTF8String, status.schema_id))) { _schemaId = @(status.schema_id); + [self updateStyleOptions]; + [NSApp.squirrelAppDelegate loadSchemaSpecificLabels:_schemaId]; [NSApp.squirrelAppDelegate loadSchemaSpecificSettings:_schemaId]; // inline preedit _inlinePreedit = (NSApp.squirrelAppDelegate.panel.inlinePreedit && !rime_get_api()->get_option(_session, "no_inline")) || - rime_get_api()->get_option(_session, "inline"); + rime_get_api()->get_option(_session, "inline"); _inlineCandidate = (NSApp.squirrelAppDelegate.panel.inlineCandidate && !rime_get_api()->get_option(_session, "no_inline")); // if not inline, embed soft cursor in preedit string @@ -567,70 +612,54 @@ -(void)rimeUpdate const char *preedit = ctx.composition.preedit; NSString *preeditText = preedit ? @(preedit) : @""; - NSUInteger start = substr(preedit, ctx.composition.sel_start).length; - NSUInteger end = substr(preedit, ctx.composition.sel_end).length; - NSUInteger caretPos = substr(preedit, ctx.composition.cursor_pos).length; - NSRange selRange = NSMakeRange(start, end - start); - if (_inlineCandidate) { + NSUInteger start = [[NSString alloc] initWithBytes:preedit length:ctx.composition.sel_start encoding:NSUTF8StringEncoding].length; + NSUInteger end = [[NSString alloc] initWithBytes:preedit length:ctx.composition.sel_end encoding:NSUTF8StringEncoding].length; + NSUInteger caretPos = [[NSString alloc] initWithBytes:preedit length:ctx.composition.cursor_pos encoding:NSUTF8StringEncoding].length; + if (_inlineCandidate && !switcherMenu) { const char *candidatePreview = ctx.commit_text_preview; NSString *candidatePreviewText = candidatePreview ? @(candidatePreview) : @""; if (_inlinePreedit) { - if ((caretPos >= NSMaxRange(selRange)) && (caretPos < preeditText.length)) { - candidatePreviewText = [candidatePreviewText stringByAppendingString:[preeditText substringWithRange:NSMakeRange(caretPos, preeditText.length-caretPos)]]; + if ((caretPos >= end) && (caretPos < preeditText.length)) { + candidatePreviewText = [candidatePreviewText stringByAppendingString:[preeditText substringWithRange:NSMakeRange(caretPos, preeditText.length - caretPos)]]; } - [self showPreeditString:candidatePreviewText selRange:NSMakeRange(selRange.location, candidatePreviewText.length-selRange.location) caretPos:candidatePreviewText.length-(preeditText.length-caretPos)]; + [self showPreeditString:candidatePreviewText + selRange:NSMakeRange(start, candidatePreviewText.length - (preeditText.length - end) - start) + caretPos:caretPos <= start ? caretPos : candidatePreviewText.length - (preeditText.length - caretPos)]; } else { - if ((NSMaxRange(selRange) < caretPos) && (caretPos > selRange.location)) { - candidatePreviewText = [candidatePreviewText substringWithRange:NSMakeRange(0, candidatePreviewText.length-(caretPos-NSMaxRange(selRange)))]; - } else if ((NSMaxRange(selRange) < preeditText.length) && (caretPos <= selRange.location)) { - candidatePreviewText = [candidatePreviewText substringWithRange:NSMakeRange(0, candidatePreviewText.length-(preeditText.length-NSMaxRange(selRange)))]; + if ((end < caretPos) && (caretPos > start)) { + candidatePreviewText = [candidatePreviewText substringWithRange:NSMakeRange(0, candidatePreviewText.length - (caretPos - end))]; + } else if ((end < preeditText.length) && (caretPos < end)) { + candidatePreviewText = [candidatePreviewText substringWithRange:NSMakeRange(0, candidatePreviewText.length - (preeditText.length - end))]; } - [self showPreeditString:candidatePreviewText selRange:NSMakeRange(selRange.location, candidatePreviewText.length-selRange.location) caretPos:candidatePreviewText.length]; + [self showPreeditString:candidatePreviewText + selRange:NSMakeRange(start - (caretPos < end), candidatePreviewText.length - start + (caretPos < end)) + caretPos:caretPos < end ? caretPos - 1 : candidatePreviewText.length]; } } else { - if (_inlinePreedit) { - [self showPreeditString:preeditText selRange:selRange caretPos:caretPos]; + if (_inlinePreedit && !switcherMenu) { + [self showPreeditString:preeditText selRange:NSMakeRange(start, end - start) caretPos:caretPos]; } else { - NSRange empty = {0, 0}; // TRICKY: display a non-empty string to prevent iTerm2 from echoing each character in preedit. - // note this is a full-shape space U+3000; using half shape characters like "..." will result in + // note this is a full-width EM space U+2003; using narrow characters like "..." will result in // an unstable baseline when composing Chinese characters. - [self showPreeditString:(preedit ? @" " : @"") selRange:empty caretPos:0]; + [self showPreeditString:(preedit ? @" " : @"") selRange:NSMakeRange(0, 0) caretPos:0]; } } // update candidates - NSMutableArray *candidates = [NSMutableArray array]; - NSMutableArray *comments = [NSMutableArray array]; - NSUInteger i; - for (i = 0; i < ctx.menu.num_candidates; ++i) { + NSMutableArray *candidates = [[NSMutableArray alloc] initWithCapacity:ctx.menu.num_candidates]; + NSMutableArray *comments = [[NSMutableArray alloc] initWithCapacity:ctx.menu.num_candidates]; + for (int i = 0; i < ctx.menu.num_candidates; ++i) { [candidates addObject:@(ctx.menu.candidates[i].text)]; - if (ctx.menu.candidates[i].comment) { - [comments addObject:@(ctx.menu.candidates[i].comment)]; - } - else { - [comments addObject:@""]; - } - } - NSArray* labels; - if (ctx.menu.select_keys) { - labels = @[@(ctx.menu.select_keys)]; - } else if (ctx.select_labels) { - NSMutableArray *selectLabels = [NSMutableArray array]; - for (i = 0; i < ctx.menu.page_size; ++i) { - char* label_str = ctx.select_labels[i]; - [selectLabels addObject:@(label_str)]; - } - labels = selectLabels; - } else { - labels = @[]; + [comments addObject:@(ctx.menu.candidates[i].comment ? : "")]; } - [self showPanelWithPreedit:(_inlinePreedit ? nil : preeditText) - selRange:selRange - caretPos:caretPos + [self showPanelWithPreedit:(_inlinePreedit && !switcherMenu ? nil : preeditText) + selRange:NSMakeRange(start, end - start) + caretPos:(switcherMenu ? NSNotFound : caretPos) candidates:candidates comments:comments - labels:labels - highlighted:ctx.menu.highlighted_candidate_index]; + highlighted:ctx.menu.highlighted_candidate_index + pageNum:ctx.menu.page_no + lastPage:ctx.menu.is_last_page]; rime_get_api()->free_context(&ctx); } else { [NSApp.squirrelAppDelegate.panel hide]; diff --git a/SquirrelPanel.h b/SquirrelPanel.h index 159b2a8ad..589974e30 100644 --- a/SquirrelPanel.h +++ b/SquirrelPanel.h @@ -1,38 +1,46 @@ #import #import "SquirrelInputController.h" - @class SquirrelConfig; +@class SquirrelOptionSwitcher; @interface SquirrelPanel : NSPanel // Linear candidate list, as opposed to stacked candidate list. @property(nonatomic, readonly) BOOL linear; +// Tabled candidate list, a subtype of linear candidate list with tabled layout. +@property(nonatomic, readonly) BOOL tabled; // Vertical text, as opposed to horizontal text. @property(nonatomic, readonly) BOOL vertical; // Show preedit text inline. @property(nonatomic, readonly) BOOL inlinePreedit; // Show first candidate inline @property(nonatomic, readonly) BOOL inlineCandidate; - +// Store switch options that change style (color theme) settings +@property(nonatomic, strong) SquirrelOptionSwitcher *optionSwitcher; // position of input caret on screen. @property(nonatomic, assign) NSRect position; -// position of input caret on screen. + @property(nonatomic, assign) SquirrelInputController *inputController; --(void)showPreedit:(NSString*)preedit - selRange:(NSRange)selRange - caretPos:(NSUInteger)caretPos - candidates:(NSArray*)candidates - comments:(NSArray*)comments - labels:(NSArray*)labels - highlighted:(NSUInteger)index - update:(BOOL)update; +- (void)showPreedit:(NSString *)preedit + selRange:(NSRange)selRange + caretPos:(NSUInteger)caretPos + candidates:(NSArray *)candidates + comments:(NSArray *)comments + highlighted:(NSUInteger)index + pageNum:(NSUInteger)pageNum + lastPage:(BOOL)lastPage + turnPage:(NSUInteger)turnPage + update:(BOOL)update; + +- (void)hide; --(void)hide; +- (void)updateStatusLong:(NSString *)messageLong + statusShort:(NSString *)messageShort; --(void)updateStatusLong:(NSString*)messageLong statusShort:(NSString*)messageShort; +- (void)loadConfig:(SquirrelConfig *)config + forDarkMode:(BOOL)isDark; --(void)loadConfig:(SquirrelConfig*)config - forDarkMode:(BOOL)isDark; +- (void)loadLabelConfig:(SquirrelConfig *)config; @end diff --git a/SquirrelPanel.m b/SquirrelPanel.m index 892471dd4..3215d53d6 100644 --- a/SquirrelPanel.m +++ b/SquirrelPanel.m @@ -3,35 +3,172 @@ #import "SquirrelConfig.h" #import +@implementation NSBezierPath (BezierPathQuartzUtilities) +- (CGPathRef)quartzPath { +// if (@available(macOS 14.0, *)) { +// return self.CGPath; +// } + // Need to begin a path here. + CGPathRef immutablePath = NULL; + // Then draw the path elements. + NSUInteger numElements = self.elementCount; + if (numElements > 0) { + CGMutablePathRef path = CGPathCreateMutable(); + NSPoint points[3]; + BOOL didClosePath = YES; + for (NSUInteger i = 0; i < numElements; i++) { + switch ([self elementAtIndex:i associatedPoints:points]) { + case NSMoveToBezierPathElement: + CGPathMoveToPoint(path, NULL, points[0].x, points[0].y); + break; + case NSLineToBezierPathElement: + CGPathAddLineToPoint(path, NULL, points[0].x, points[0].y); + didClosePath = NO; + break; + case NSCurveToBezierPathElement: + CGPathAddCurveToPoint(path, NULL, points[0].x, points[0].y, + points[1].x, points[1].y, + points[2].x, points[2].y); + didClosePath = NO; + break; +// case NSBezierPathElementQuadraticCurveTo: +// CGPathAddQuadCurveToPoint(path, NULL, points[0].x, points[0].y, +// points[1].x, points[1].y); +// didClosePath = NO; +// break; + case NSClosePathBezierPathElement: + CGPathCloseSubpath(path); + didClosePath = YES; + break; + } + } + // Be sure the path is closed or Quartz may not do valid hit detection. + if (!didClosePath) { + CGPathCloseSubpath(path); + } + immutablePath = CFAutorelease(CGPathCreateCopy(path)); + CGPathRelease(path); + } + return immutablePath; +} + +@end + +@implementation NSMutableAttributedString (NSMutableAttributedStringMarkDownFormatting) + +- (void)formatMarkDown { + NSRegularExpression *regex = [[NSRegularExpression alloc] initWithPattern:@"((\\*{1,2}|\\^|~{1,2})|((?<=\\b)_{1,2})|<(b|strong|i|em|u|sup|sub|s)>)(.+?)(\\2|\\3(?=\\b)|<\\/\\4>)" options:NSRegularExpressionUseUnicodeWordBoundaries error:nil]; + NSInteger __block offset = 0; + [regex enumerateMatchesInString:self.string options:0 range:NSMakeRange(0, self.length) + usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) { + result = [result resultByAdjustingRangesWithOffset:offset]; + NSString *tag = [self.string substringWithRange:[result rangeAtIndex:1]]; + if ([tag isEqualToString:@"**"] || [tag isEqualToString:@"__"] || + [tag isEqualToString:@""] || [tag isEqualToString:@""]) { + [self applyFontTraits:NSBoldFontMask range:[result rangeAtIndex:5]]; + } else if ([tag isEqualToString:@"*"] || [tag isEqualToString:@"_"] || + [tag isEqualToString:@""] || [tag isEqualToString:@""]) { + [self applyFontTraits:NSItalicFontMask range:[result rangeAtIndex:5]]; + } else if ([tag isEqualToString:@""]) { + [self addAttribute:NSUnderlineStyleAttributeName + value:@(NSUnderlineStyleSingle) range:[result rangeAtIndex:5]]; + } else if ([tag isEqualToString:@"~~"] || [tag isEqualToString:@""]) { + [self addAttribute:NSStrikethroughStyleAttributeName + value:@(NSUnderlineStyleSingle) range:[result rangeAtIndex:5]]; + } else if ([tag isEqualToString:@"^"] || [tag isEqualToString:@""]) { + [self superscriptRange:[result rangeAtIndex:5]]; + [self enumerateAttribute:NSFontAttributeName inRange:[result rangeAtIndex:5] options:0 + usingBlock:^(id value, NSRange range, BOOL *stop) { + NSFont *font = [[NSFontManager sharedFontManager] convertFont:value toSize:[value pointSize] * 7 / 12]; + [self addAttribute:NSFontAttributeName value:font range:range]; + }]; + } else if ([tag isEqualToString:@"~"] || [tag isEqualToString:@""]) { + [self subscriptRange:[result rangeAtIndex:5]]; + [self enumerateAttribute:NSFontAttributeName inRange:[result rangeAtIndex:5] options:0 + usingBlock:^(id value, NSRange range, BOOL *stop) { + NSFont *font = [[NSFontManager sharedFontManager] convertFont:value toSize:[value pointSize] * 7 / 12]; + [self addAttribute:NSFontAttributeName value:font range:range]; + }]; + } + [self deleteCharactersInRange:[result rangeAtIndex:6]]; + [self deleteCharactersInRange:[result rangeAtIndex:1]]; + offset -= [result rangeAtIndex:6].length + [result rangeAtIndex:1].length; + }]; + if (offset != 0) { // repeat until no more nested markdown + [self formatMarkDown]; + } +} + +- (void)annotateRuby { + NSRegularExpression *regex = [[NSRegularExpression alloc] initWithPattern:@"(\\uFFF9)\\s*(\\w+?)\\s*((\\uFFFA)(.+?)(\\uFFFB))" + options:0 error:nil]; + NSInteger __block offset = 0; + [regex enumerateMatchesInString:self.string options:0 range:NSMakeRange(0, self.length) + usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) { + result = [result resultByAdjustingRangesWithOffset:offset]; + if (@available(macOS 12.0, *)) { + NSString *rubyString = [self.string substringWithRange:[result rangeAtIndex:5]]; + NSFont *rubyFont = [self attribute:NSFontAttributeName atIndex:[result rangeAtIndex:5].location effectiveRange:NULL]; + rubyFont = [[NSFontManager sharedFontManager] convertFont:rubyFont toSize:[rubyFont pointSize] / 2]; + NSColor *rubyColor = [self attribute:NSForegroundColorAttributeName atIndex:[result rangeAtIndex:5].location effectiveRange:NULL]; + NSDictionary *rubyAttrs = @{NSFontAttributeName: rubyFont, NSForegroundColorAttributeName: rubyColor}; + NSArray *rubySubStrings = [rubyString componentsSeparatedByString:@" "]; + NSRange baseRange = [result rangeAtIndex:2]; + if (rubySubStrings.count > baseRange.length) { + rubySubStrings = @[rubyString]; + } + for (NSUInteger i = 0; i < rubySubStrings.count; ++i) { + CTRubyAnnotationRef rubyAnnotation = CTRubyAnnotationCreateWithAttributes(kCTRubyAlignmentDistributeSpace, kCTRubyOverhangNone, kCTRubyPositionBefore, (__bridge CFStringRef)rubySubStrings[i], (__bridge CFDictionaryRef)rubyAttrs); + [self addAttribute:CFBridgingRelease(kCTRubyAnnotationAttributeName) value:CFBridgingRelease(rubyAnnotation) range:NSMakeRange(baseRange.location + i, 1)]; + } + [self deleteCharactersInRange:[result rangeAtIndex:3]]; + [self deleteCharactersInRange:[result rangeAtIndex:1]]; + offset -= [result rangeAtIndex:3].length + [result rangeAtIndex:1].length; + } else { + NSFont *rubyFont = [self attribute:NSFontAttributeName atIndex:[result rangeAtIndex:5].location effectiveRange:NULL]; + rubyFont = [[NSFontManager sharedFontManager] convertFont:rubyFont toSize:[rubyFont pointSize] / 2]; + [self superscriptRange:[result rangeAtIndex:5]]; + [self addAttribute:NSFontAttributeName value:rubyFont range:[result rangeAtIndex:5]]; + [self addAttribute:NSBaselineOffsetAttributeName value:@(rubyFont.ascender) range:[result rangeAtIndex:5]]; + [self deleteCharactersInRange:[result rangeAtIndex:6]]; + [self deleteCharactersInRange:[result rangeAtIndex:4]]; + [self deleteCharactersInRange:[result rangeAtIndex:1]]; + offset -= [result rangeAtIndex:6].length + [result rangeAtIndex:4].length + [result rangeAtIndex:1].length; + } + }]; +} + +@end + static const CGFloat kOffsetHeight = 5; static const CGFloat kDefaultFontSize = 24; static const CGFloat kBlendedBackgroundColorFraction = 1.0 / 5; static const NSTimeInterval kShowStatusDuration = 1.2; -static NSString *const kDefaultCandidateFormat = @"%c.\u00A0%@"; +static NSString *const kDefaultCandidateFormat = @"%c. %@"; +static NSString *const kTipSpecifier = @"%s"; +static NSString *const kFullWidthSpace = @" "; @interface SquirrelTheme : NSObject -@property(nonatomic, assign) BOOL native; -@property(nonatomic, assign) BOOL memorizeSize; - @property(nonatomic, strong, readonly) NSColor *backgroundColor; -@property(nonatomic, strong, readonly) NSColor *highlightedBackColor; -@property(nonatomic, strong, readonly) NSColor *candidateBackColor; +@property(nonatomic, strong, readonly) NSColor *backgroundImage; +@property(nonatomic, strong, readonly) NSColor *highlightedStripColor; @property(nonatomic, strong, readonly) NSColor *highlightedPreeditColor; @property(nonatomic, strong, readonly) NSColor *preeditBackgroundColor; @property(nonatomic, strong, readonly) NSColor *borderColor; @property(nonatomic, readonly) CGFloat cornerRadius; -@property(nonatomic, readonly) CGFloat hilitedCornerRadius; -@property(nonatomic, readonly) CGFloat surroundingExtraExpansion; -@property(nonatomic, readonly) CGFloat shadowSize; +@property(nonatomic, readonly) CGFloat highlightedCornerRadius; +@property(nonatomic, readonly) CGFloat separatorWidth; @property(nonatomic, readonly) NSSize edgeInset; -@property(nonatomic, readonly) CGFloat borderWidth; @property(nonatomic, readonly) CGFloat linespace; @property(nonatomic, readonly) CGFloat preeditLinespace; @property(nonatomic, readonly) CGFloat alpha; -@property(nonatomic, readonly) BOOL translucency; -@property(nonatomic, readonly) BOOL mutualExclusive; +@property(nonatomic, readonly) CGFloat translucency; +@property(nonatomic, readonly) CGFloat lineLength; +@property(nonatomic, readonly) BOOL showPaging; +@property(nonatomic, readonly) BOOL rememberSize; +@property(nonatomic, readonly) BOOL tabled; @property(nonatomic, readonly) BOOL linear; @property(nonatomic, readonly) BOOL vertical; @property(nonatomic, readonly) BOOL inlinePreedit; @@ -45,142 +182,219 @@ @interface SquirrelTheme : NSObject @property(nonatomic, strong, readonly) NSDictionary *commentHighlightedAttrs; @property(nonatomic, strong, readonly) NSDictionary *preeditAttrs; @property(nonatomic, strong, readonly) NSDictionary *preeditHighlightedAttrs; +@property(nonatomic, strong, readonly) NSDictionary *pagingAttrs; +@property(nonatomic, strong, readonly) NSDictionary *pagingHighlightedAttrs; +@property(nonatomic, strong, readonly) NSDictionary *statusAttrs; @property(nonatomic, strong, readonly) NSParagraphStyle *paragraphStyle; @property(nonatomic, strong, readonly) NSParagraphStyle *preeditParagraphStyle; +@property(nonatomic, strong, readonly) NSParagraphStyle *pagingParagraphStyle; +@property(nonatomic, strong, readonly) NSParagraphStyle *statusParagraphStyle; -@property(nonatomic, strong, readonly) NSString *prefixLabelFormat, *suffixLabelFormat; -@property(nonatomic, strong, readonly) NSString *statusMessageType; +@property(nonatomic, strong, readonly) NSAttributedString *symbolBackFill; +@property(nonatomic, strong, readonly) NSAttributedString *symbolBackStroke; +@property(nonatomic, strong, readonly) NSAttributedString *symbolForwardFill; +@property(nonatomic, strong, readonly) NSAttributedString *symbolForwardStroke; -- (void)setCandidateFormat:(NSString *)candidateFormat; -- (void)setStatusMessageType:(NSString *)statusMessageType; +@property(nonatomic, strong, readonly) NSArray *labels; +@property(nonatomic, strong, readonly) NSArray *candidateFormats; +@property(nonatomic, strong, readonly) NSArray *candidateHighlightedFormats; +@property(nonatomic, strong, readonly) NSString *statusMessageType; - (void)setBackgroundColor:(NSColor *)backgroundColor - highlightedBackColor:(NSColor *)highlightedBackColor - candidateBackColor:(NSColor *)candidateBackColor + backgroundImage:(NSColor *)backgroundImage + highlightedStripColor:(NSColor *)highlightedStripColor highlightedPreeditColor:(NSColor *)highlightedPreeditColor preeditBackgroundColor:(NSColor *)preeditBackgroundColor borderColor:(NSColor *)borderColor; -- (void)setCornerRadius:(CGFloat)cornerRadius - hilitedCornerRadius:(CGFloat)hilitedCornerRadius - srdExtraExpansion:(CGFloat)surroundingExtraExpansion - shadowSize:(CGFloat)shadowSize - edgeInset:(NSSize)edgeInset - borderWidth:(CGFloat)borderWidth - linespace:(CGFloat)linespace - preeditLinespace:(CGFloat)preeditLinespace - alpha:(CGFloat)alpha - translucency:(BOOL)translucency - mutualExclusive:(BOOL)mutualExclusive - linear:(BOOL)linear - vertical:(BOOL)vertical - inlinePreedit:(BOOL)inlinePreedit - inlineCandidate:(BOOL)inlineCandidate; - -- (void) setAttrs:(NSMutableDictionary *)attrs - highlightedAttrs:(NSMutableDictionary *)highlightedAttrs - labelAttrs:(NSMutableDictionary *)labelAttrs - labelHighlightedAttrs:(NSMutableDictionary *)labelHighlightedAttrs - commentAttrs:(NSMutableDictionary *)commentAttrs - commentHighlightedAttrs:(NSMutableDictionary *)commentHighlightedAttrs - preeditAttrs:(NSMutableDictionary *)preeditAttrs - preeditHighlightedAttrs:(NSMutableDictionary *)preeditHighlightedAttrs; - -- (void) setParagraphStyle:(NSParagraphStyle *)paragraphStyle - preeditParagraphStyle:(NSParagraphStyle *)preeditParagraphStyle; +- (void) setCornerRadius:(CGFloat)cornerRadius + highlightedCornerRadius:(CGFloat)highlightedCornerRadius + separatorWidth:(CGFloat)separatorWidth + edgeInset:(NSSize)edgeInset + linespace:(CGFloat)linespace + preeditLinespace:(CGFloat)preeditLinespace + alpha:(CGFloat)alpha + translucency:(CGFloat)translucency + lineLength:(CGFloat)lineLength + showPaging:(BOOL)showPaging + rememberSize:(BOOL)rememberSize + tabled:(BOOL)tabled + linear:(BOOL)linear + vertical:(BOOL)vertical + inlinePreedit:(BOOL)inlinePreedit + inlineCandidate:(BOOL)inlineCandidate; + +- (void) setAttrs:(NSDictionary *)attrs + highlightedAttrs:(NSDictionary *)highlightedAttrs + labelAttrs:(NSDictionary *)labelAttrs + labelHighlightedAttrs:(NSDictionary *)labelHighlightedAttrs + commentAttrs:(NSDictionary *)commentAttrs + commentHighlightedAttrs:(NSDictionary *)commentHighlightedAttrs + preeditAttrs:(NSDictionary *)preeditAttrs + preeditHighlightedAttrs:(NSDictionary *)preeditHighlightedAttrs + pagingAttrs:(NSDictionary *)pagingAttrs + pagingHighlightedAttrs:(NSDictionary *)pagingHighlightedAttrs + statusAttrs:(NSDictionary *)statusAttrs; + +- (void)setParagraphStyle:(NSParagraphStyle *)paragraphStyle + preeditParagraphStyle:(NSParagraphStyle *)preeditParagraphStyle + pagingParagraphStyle:(NSParagraphStyle *)pagingParagraphStyle + statusParagraphStyle:(NSParagraphStyle *)statusParagraphStyle; + +- (void)setLabels:(NSArray *)labels; + +- (void)setCandidateFormat:(NSString *)candidateFormat; + +- (void)setStatusMessageType:(NSString *)statusMessageType; @end @implementation SquirrelTheme -- (void)setCandidateFormat:(NSString *)candidateFormat { - // in the candiate format, everything other than '%@' is considered part of the label - NSRange candidateRange = [candidateFormat rangeOfString:@"%@"]; - if (candidateRange.location == NSNotFound) { - _prefixLabelFormat = candidateFormat; - _suffixLabelFormat = nil; - return; - } - if (candidateRange.location > 0) { - // everything before '%@' is prefix label - NSRange prefixLabelRange = NSMakeRange(0, candidateRange.location); - _prefixLabelFormat = [candidateFormat substringWithRange:prefixLabelRange]; - } else { - _prefixLabelFormat = nil; - } - if (NSMaxRange(candidateRange) < candidateFormat.length) { - // everything after '%@' is suffix label - NSRange suffixLabelRange = NSMakeRange(NSMaxRange(candidateRange), - candidateFormat.length - NSMaxRange(candidateRange)); - _suffixLabelFormat = [candidateFormat substringWithRange:suffixLabelRange]; - } else { - // '%@' is at the end, so suffix label does not exist - _suffixLabelFormat = nil; +static NSArray * formatLabels(NSAttributedString *format, NSArray *labels) { + NSRange enumRange = NSMakeRange(0, 0); + NSMutableArray *formatted = [[NSMutableArray alloc] initWithCapacity:labels.count]; + NSCharacterSet *labelCharacters = [NSCharacterSet characterSetWithCharactersInString:[labels componentsJoinedByString:@""]]; + if ([[NSCharacterSet characterSetWithRange:NSMakeRange(0xff10, 10)] + isSupersetOfSet:labelCharacters]) { // 01..9 + if ([format.string containsString:@"%c\u20dd"]) { // ①..⑨⓪ + enumRange = [format.string rangeOfString:@"%c\u20dd"]; + for (NSString *label in labels) { + unichar chars[] = {[label characterAtIndex:0] == 0xff10 ? 0x24ea : [label characterAtIndex:0] - 0xff11 + 0x2460, 0x0}; + NSMutableAttributedString *newFormat = [format mutableCopy]; + [newFormat replaceCharactersInRange:enumRange withString:[NSString stringWithCharacters:chars length:2]]; + [formatted addObject:[newFormat copy]]; + } + } else if ([format.string containsString:@"(%c)"]) { // ⑴..⑼⑽ + enumRange = [format.string rangeOfString:@"(%c)"]; + for (NSString *label in labels) { + unichar chars[] = {[label characterAtIndex:0] == 0xff10 ? 0x247d : [label characterAtIndex:0] - 0xff11 + 0x2474, 0x0}; + NSMutableAttributedString *newFormat = [format mutableCopy]; + [newFormat replaceCharactersInRange:enumRange withString:[NSString stringWithCharacters:chars length:2]]; + [formatted addObject:[newFormat copy]]; + } + } else if ([format.string containsString:@"%c."]) { // ⒈..⒐🄀 + enumRange = [format.string rangeOfString:@"%c."]; + for (NSString *label in labels) { + if ([label characterAtIndex:0] == 0xff10) { + unichar chars[] = {0xd83c, 0xdd00, 0x0}; + NSMutableAttributedString *newFormat = [format mutableCopy]; + [newFormat replaceCharactersInRange:enumRange withString:[NSString stringWithCharacters:chars length:3]]; + [formatted addObject:[newFormat copy]]; + } else { + unichar chars[] = {[label characterAtIndex:0] - 0xff11 + 0x2488, 0x0}; + NSMutableAttributedString *newFormat = [format mutableCopy]; + [newFormat replaceCharactersInRange:enumRange withString:[NSString stringWithCharacters:chars length:2]]; + [formatted addObject:[newFormat copy]]; + } + } + } else if ([format.string containsString:@"%c,"]) { //🄂..🄊🄁 + enumRange = [format.string rangeOfString:@"%c,"]; + for (NSString *label in labels) { + unichar chars[] = {0xd83c, [label characterAtIndex:0] - 0xff10 + 0xdd01, 0x0}; + NSMutableAttributedString *newFormat = [format mutableCopy]; + [newFormat replaceCharactersInRange:enumRange withString:[NSString stringWithCharacters:chars length:2]]; + [formatted addObject:[newFormat copy]]; + } + } + } else if ([[NSCharacterSet characterSetWithRange:NSMakeRange(0xff21, 26)] + isSupersetOfSet:labelCharacters]) { // A..Z + if ([format.string containsString:@"%c\u20dd"]) { // Ⓐ..Ⓩ + enumRange = [format.string rangeOfString:@"%c\u20dd"]; + for (NSString *label in labels) { + unichar chars[] = {[label characterAtIndex:0] - 0xff21 + 0x24b6, 0x0}; + NSMutableAttributedString *newFormat = [format mutableCopy]; + [newFormat replaceCharactersInRange:enumRange withString:[NSString stringWithCharacters:chars length:2]]; + [formatted addObject:[newFormat copy]]; + } + } else if ([format.string containsString:@"(%c)"]) { // 🄐..🄩 + enumRange = [format.string rangeOfString:@"(%c)"]; + for (NSString *label in labels) { + unichar chars[] = {0xd83c, [label characterAtIndex:0] - 0xff21 + 0xdd10, 0x0}; + NSMutableAttributedString *newFormat = [format mutableCopy]; + [newFormat replaceCharactersInRange:enumRange withString:[NSString stringWithCharacters:chars length:2]]; + [formatted addObject:[newFormat copy]]; + } + } else if ([format.string containsString:@"%c\u20de"]) { // 🄰..🅉 + enumRange = [format.string rangeOfString:@"%c\u20de"]; + for (NSString *label in labels) { + unichar chars[] = {0xd83c, [label characterAtIndex:0] - 0xff21 + 0xdd30, 0x0}; + NSMutableAttributedString *newFormat = [format mutableCopy]; + [newFormat replaceCharactersInRange:enumRange withString:[NSString stringWithCharacters:chars length:2]]; + [formatted addObject:[newFormat copy]]; + } + } } -} - -- (void)setStatusMessageType:(NSString *)type { - if ([type isEqualToString: @"long"] || [type isEqualToString: @"short"] || [type isEqualToString: @"mix"]) { - _statusMessageType = type; - } else { - _statusMessageType = @"mix"; + if (enumRange.length == 0) { + enumRange = [format.string rangeOfString:@"%c"]; + for (NSString *label in labels) { + NSMutableAttributedString *newFormat = [format mutableCopy]; + [newFormat replaceCharactersInRange:enumRange withString:label]; + [formatted addObject:[newFormat copy]]; + } } + return [formatted copy]; } - (void)setBackgroundColor:(NSColor *)backgroundColor - highlightedBackColor:(NSColor *)highlightedBackColor - candidateBackColor:(NSColor *)candidateBackColor + backgroundImage:(NSColor *)backgroundImage + highlightedStripColor:(NSColor *)highlightedStripColor highlightedPreeditColor:(NSColor *)highlightedPreeditColor preeditBackgroundColor:(NSColor *)preeditBackgroundColor borderColor:(NSColor *)borderColor { _backgroundColor = backgroundColor; - _highlightedBackColor = highlightedBackColor; - _candidateBackColor = candidateBackColor; + _backgroundImage = backgroundImage; + _highlightedStripColor = highlightedStripColor; _highlightedPreeditColor = highlightedPreeditColor; _preeditBackgroundColor = preeditBackgroundColor; _borderColor = borderColor; } -- (void)setCornerRadius:(double)cornerRadius - hilitedCornerRadius:(double)hilitedCornerRadius - srdExtraExpansion:(double)surroundingExtraExpansion - shadowSize:(double)shadowSize - edgeInset:(NSSize)edgeInset - borderWidth:(double)borderWidth - linespace:(double)linespace - preeditLinespace:(double)preeditLinespace - alpha:(double)alpha - translucency:(BOOL)translucency - mutualExclusive:(BOOL)mutualExclusive - linear:(BOOL)linear - vertical:(BOOL)vertical - inlinePreedit:(BOOL)inlinePreedit - inlineCandidate:(BOOL)inlineCandidate { +- (void) setCornerRadius:(CGFloat)cornerRadius + highlightedCornerRadius:(CGFloat)highlightedCornerRadius + separatorWidth:(CGFloat)separatorWidth + edgeInset:(NSSize)edgeInset + linespace:(CGFloat)linespace + preeditLinespace:(CGFloat)preeditLinespace + alpha:(CGFloat)alpha + translucency:(CGFloat)translucency + lineLength:(CGFloat)lineLength + showPaging:(BOOL)showPaging + rememberSize:(BOOL)rememberSize + tabled:(BOOL)tabled + linear:(BOOL)linear + vertical:(BOOL)vertical + inlinePreedit:(BOOL)inlinePreedit + inlineCandidate:(BOOL)inlineCandidate { _cornerRadius = cornerRadius; - _hilitedCornerRadius = hilitedCornerRadius; - _surroundingExtraExpansion = surroundingExtraExpansion; - _shadowSize = shadowSize; + _highlightedCornerRadius = highlightedCornerRadius; + _separatorWidth = separatorWidth; _edgeInset = edgeInset; - _borderWidth = borderWidth; _linespace = linespace; + _preeditLinespace = preeditLinespace; _alpha = alpha; _translucency = translucency; - _mutualExclusive = mutualExclusive; - _preeditLinespace = preeditLinespace; + _lineLength = lineLength; + _showPaging = showPaging; + _rememberSize = rememberSize; + _tabled = tabled; _linear = linear; _vertical = vertical; _inlinePreedit = inlinePreedit; _inlineCandidate = inlineCandidate; } -- (void) setAttrs:(NSMutableDictionary *)attrs - highlightedAttrs:(NSMutableDictionary *)highlightedAttrs - labelAttrs:(NSMutableDictionary *)labelAttrs - labelHighlightedAttrs:(NSMutableDictionary *)labelHighlightedAttrs - commentAttrs:(NSMutableDictionary *)commentAttrs - commentHighlightedAttrs:(NSMutableDictionary *)commentHighlightedAttrs - preeditAttrs:(NSMutableDictionary *)preeditAttrs - preeditHighlightedAttrs:(NSMutableDictionary *)preeditHighlightedAttrs { +- (void) setAttrs:(NSDictionary *)attrs + highlightedAttrs:(NSDictionary *)highlightedAttrs + labelAttrs:(NSDictionary *)labelAttrs + labelHighlightedAttrs:(NSDictionary *)labelHighlightedAttrs + commentAttrs:(NSDictionary *)commentAttrs + commentHighlightedAttrs:(NSDictionary *)commentHighlightedAttrs + preeditAttrs:(NSDictionary *)preeditAttrs + preeditHighlightedAttrs:(NSDictionary *)preeditHighlightedAttrs + pagingAttrs:(NSDictionary *)pagingAttrs + pagingHighlightedAttrs:(NSDictionary *)pagingHighlightedAttrs + statusAttrs:(NSDictionary *)statusAttrs { _attrs = attrs; _highlightedAttrs = highlightedAttrs; _labelAttrs = labelAttrs; @@ -189,12 +403,128 @@ - (void) setAttrs:(NSMutableDictionary *)attrs _commentHighlightedAttrs = commentHighlightedAttrs; _preeditAttrs = preeditAttrs; _preeditHighlightedAttrs = preeditHighlightedAttrs; + _pagingAttrs = pagingAttrs; + _pagingHighlightedAttrs = pagingHighlightedAttrs; + _statusAttrs = statusAttrs; + NSMutableDictionary *symbolAttrs = [pagingAttrs mutableCopy]; + if (@available(macOS 12.0, *)) { + NSTextAttachment *attmBackFill = [[NSTextAttachment alloc] init]; + attmBackFill.image = [NSImage imageWithSystemSymbolName:@"arrowtriangle.backward.circle.fill" accessibilityDescription:nil]; + NSMutableDictionary *attrsBackFill = [symbolAttrs mutableCopy]; + attrsBackFill[NSAttachmentAttributeName] = attmBackFill; + _symbolBackFill = [[NSAttributedString alloc] initWithString:@"\uFFFC" attributes:attrsBackFill]; + + NSTextAttachment *attmBackStroke = [[NSTextAttachment alloc] init]; + attmBackStroke.image = [NSImage imageWithSystemSymbolName:@"arrowtriangle.backward.circle" accessibilityDescription:nil]; + NSMutableDictionary *attrsBackStroke = [symbolAttrs mutableCopy]; + attrsBackStroke[NSAttachmentAttributeName] = attmBackStroke; + _symbolBackStroke = [[NSAttributedString alloc] initWithString:@"\uFFFC" attributes:attrsBackStroke]; + + NSTextAttachment *attmForwardFill = [[NSTextAttachment alloc] init]; + attmForwardFill.image = [NSImage imageWithSystemSymbolName:@"arrowtriangle.forward.circle.fill" accessibilityDescription:nil]; + NSMutableDictionary *attrsForwardFill = [symbolAttrs mutableCopy]; + attrsForwardFill[NSAttachmentAttributeName] = attmForwardFill; + _symbolForwardFill = [[NSAttributedString alloc] initWithString:@"\uFFFC" attributes:attrsForwardFill]; + + NSTextAttachment *attmForwardStroke = [[NSTextAttachment alloc] init]; + attmForwardStroke.image = [NSImage imageWithSystemSymbolName:@"arrowtriangle.forward.circle" accessibilityDescription:nil]; + NSMutableDictionary *attrsForwardStroke = [symbolAttrs mutableCopy]; + attrsForwardStroke[NSAttachmentAttributeName] = attmForwardStroke; + _symbolForwardStroke = [[NSAttributedString alloc] initWithString:@"\uFFFC" attributes:attrsForwardStroke]; + } else { + NSFont *symbolFont = [NSFont fontWithDescriptor:[[NSFontDescriptor fontDescriptorWithName:@"AppleSymbols" size:0.0] + fontDescriptorWithSymbolicTraits:NSFontDescriptorTraitUIOptimized] + size:[labelAttrs[NSFontAttributeName] pointSize]]; + symbolAttrs[NSFontAttributeName] = symbolFont; + if (_vertical || !_linear) { + symbolAttrs[NSBaselineOffsetAttributeName] = @([pagingAttrs[NSBaselineOffsetAttributeName] doubleValue] - symbolFont.leading); + } + + NSMutableDictionary *symbolAttrsBackFill = [symbolAttrs mutableCopy]; + NSMutableDictionary *symbolAttrsBackStroke = [symbolAttrs mutableCopy]; + NSMutableDictionary *symbolAttrsForwardFill = [symbolAttrs mutableCopy]; + NSMutableDictionary *symbolAttrsForwardStroke = [symbolAttrs mutableCopy]; + if (@available(macOS 10.13, *)) { + symbolAttrsBackFill[NSGlyphInfoAttributeName] = [NSGlyphInfo glyphInfoWithCGGlyph:0xE92 forFont:symbolFont baseString:@"◀"]; + symbolAttrsBackStroke[NSGlyphInfoAttributeName] = [NSGlyphInfo glyphInfoWithCGGlyph:0xE95 forFont:symbolFont baseString:@"◁"]; + symbolAttrsForwardFill[NSGlyphInfoAttributeName] = [NSGlyphInfo glyphInfoWithCGGlyph:0xE93 forFont:symbolFont baseString:@"▶"]; + symbolAttrsForwardStroke[NSGlyphInfoAttributeName] = [NSGlyphInfo glyphInfoWithCGGlyph:0xE94 forFont:symbolFont baseString:@"▷"]; + } else { + symbolAttrsBackFill[NSGlyphInfoAttributeName] = [NSGlyphInfo glyphInfoWithGlyphName:@"gid4966" forFont:symbolFont baseString:@"◀"]; + symbolAttrsBackStroke[NSGlyphInfoAttributeName] = [NSGlyphInfo glyphInfoWithGlyphName:@"gid4969" forFont:symbolFont baseString:@"◁"]; + symbolAttrsForwardFill[NSGlyphInfoAttributeName] = [NSGlyphInfo glyphInfoWithGlyphName:@"gid4967" forFont:symbolFont baseString:@"▶"]; + symbolAttrsForwardStroke[NSGlyphInfoAttributeName] = [NSGlyphInfo glyphInfoWithGlyphName:@"gid4968" forFont:symbolFont baseString:@"▷"]; + } + _symbolBackFill = [[NSAttributedString alloc] initWithString:@"◀" attributes:symbolAttrsBackFill]; + _symbolBackStroke = [[NSAttributedString alloc] initWithString:@"◁" attributes:symbolAttrsBackStroke]; + _symbolForwardFill = [[NSAttributedString alloc] initWithString:@"▶" attributes:symbolAttrsForwardFill]; + _symbolForwardStroke = [[NSAttributedString alloc] initWithString:@"▷" attributes:symbolAttrsForwardStroke]; + } } -- (void) setParagraphStyle:(NSParagraphStyle *)paragraphStyle - preeditParagraphStyle:(NSParagraphStyle *)preeditParagraphStyle { +- (void)setParagraphStyle:(NSParagraphStyle *)paragraphStyle + preeditParagraphStyle:(NSParagraphStyle *)preeditParagraphStyle + pagingParagraphStyle:(NSParagraphStyle *)pagingParagraphStyle + statusParagraphStyle:(NSParagraphStyle *)statusParagraphStyle { _paragraphStyle = paragraphStyle; _preeditParagraphStyle = preeditParagraphStyle; + _pagingParagraphStyle = pagingParagraphStyle; + _statusParagraphStyle = statusParagraphStyle; +} + +- (void)setLabels:(NSArray *)labels { + _labels = labels; +} + +- (void)setCandidateFormat:(NSString *)candidateFormat { + // validate candidate format: must have enumerator '%c' before candidate '%@' + if (![candidateFormat containsString:@"%@"]) { + candidateFormat = [candidateFormat stringByAppendingString:@"%@"]; + } + if (![candidateFormat containsString:@"%c"]) { + candidateFormat = [@"%c" stringByAppendingString:candidateFormat]; + } + NSRange candidateRange = [candidateFormat rangeOfString:@"%@"]; + NSRange labelRange = [candidateFormat rangeOfString:@"%c"]; + if (labelRange.location > candidateRange.location) { + candidateFormat = kDefaultCandidateFormat; + candidateRange = [candidateFormat rangeOfString:@"%@"]; + } + labelRange = NSMakeRange(0, candidateRange.location); + NSRange commentRange = NSMakeRange(NSMaxRange(candidateRange), candidateFormat.length - NSMaxRange(candidateRange)); + // parse markdown formats + NSMutableAttributedString *format = [[NSMutableAttributedString alloc] initWithString:candidateFormat]; + NSMutableAttributedString *highlightedFormat = [format mutableCopy]; + [format addAttributes:_labelAttrs range:labelRange]; + [highlightedFormat addAttributes:_labelHighlightedAttrs range:labelRange]; + [format addAttributes:_attrs range:candidateRange]; + [highlightedFormat addAttributes:_highlightedAttrs range:candidateRange]; + if (commentRange.length > 0) { + [format addAttributes:_commentAttrs range:commentRange]; + [highlightedFormat addAttributes:_commentHighlightedAttrs range:commentRange]; + } + [format formatMarkDown]; + [highlightedFormat formatMarkDown]; + // add placeholder for comment '%s' + candidateRange = [format.string rangeOfString:@"%@"]; + commentRange = NSMakeRange(NSMaxRange(candidateRange), format.length - NSMaxRange(candidateRange)); + if (commentRange.length > 0) { + [format replaceCharactersInRange:commentRange withString:[kTipSpecifier stringByAppendingString:[format.string substringWithRange:commentRange]]]; + [highlightedFormat replaceCharactersInRange:commentRange withString:[kTipSpecifier stringByAppendingString:[highlightedFormat.string substringWithRange:commentRange]]]; + } else { + [format appendAttributedString:[[NSAttributedString alloc] initWithString:kTipSpecifier attributes:_commentAttrs]]; + [highlightedFormat appendAttributedString:[[NSAttributedString alloc] initWithString:kTipSpecifier attributes:_commentHighlightedAttrs]]; + } + _candidateFormats = formatLabels(format, _labels); + _candidateHighlightedFormats = formatLabels(highlightedFormat, _labels); +} + +- (void)setStatusMessageType:(NSString *)type { + if ([type isEqualToString:@"long"] || [type isEqualToString:@"short"] || [type isEqualToString:@"mix"]) { + _statusMessageType = type; + } else { + _statusMessageType = @"mix"; + } } @end @@ -202,22 +532,31 @@ - (void) setParagraphStyle:(NSParagraphStyle *)paragraphStyle @interface SquirrelView : NSView @property(nonatomic, readonly) NSTextView *textView; +@property(nonatomic, readonly) NSTextStorage *textStorage; +@property(nonatomic, readonly) NSEdgeInsets insets; @property(nonatomic, readonly) NSArray *candidateRanges; -@property(nonatomic, readonly) NSInteger hilightedIndex; +@property(nonatomic, readonly) NSUInteger highlightedIndex; @property(nonatomic, readonly) NSRange preeditRange; @property(nonatomic, readonly) NSRange highlightedPreeditRange; +@property(nonatomic, readonly) NSRange pagingRange; @property(nonatomic, readonly) NSRect contentRect; -@property(nonatomic, readonly) BOOL isDark; -@property(nonatomic, strong, readonly) SquirrelTheme *currentTheme; -@property(nonatomic, readonly) NSTextLayoutManager *layoutManager; -@property(nonatomic, assign) CGFloat seperatorWidth; +@property(nonatomic, readonly) NSMutableArray *candidatePaths; +@property(nonatomic, readonly) NSMutableArray *pagingPaths; +@property(nonatomic, readonly) NSUInteger pagingButton; @property(nonatomic, readonly) CAShapeLayer *shape; +@property(nonatomic, readonly, strong) SquirrelTheme *currentTheme; +@property(nonatomic, readonly) BOOL isDark; + +- (void)drawViewWithInsets:(NSEdgeInsets)insets + candidateRanges:(NSArray *)candidateRanges + highlightedIndex:(NSUInteger)highlightedIndex + preeditRange:(NSRange)preeditRange + highlightedPreeditRange:(NSRange)highlightedPreeditRange + pagingRange:(NSRange)pagingRange + pagingButton:(NSUInteger)pagingButton; + +- (NSRect)contentRectForRange:(NSRange)range; -- (void) drawViewWith:(NSArray *)candidateRanges - hilightedIndex:(NSInteger)hilightedIndex - preeditRange:(NSRange)preeditRange - highlightedPreeditRange:(NSRange)highlightedPreeditRange; -- (NSRect)contentRectForRange:(NSTextRange *)range; @end @implementation SquirrelView @@ -230,13 +569,23 @@ - (BOOL)isFlipped { return YES; } +- (BOOL)wantsUpdateLayer { + return YES; +} + - (BOOL)isDark { - if ([NSApp.effectiveAppearance bestMatchFromAppearancesWithNames:@[NSAppearanceNameAqua, NSAppearanceNameDarkAqua]] == NSAppearanceNameDarkAqua) { - return YES; + if (@available(macOS 10.14, *)) { + if ([NSApp.effectiveAppearance bestMatchFromAppearancesWithNames:@[NSAppearanceNameAqua, NSAppearanceNameDarkAqua]] == NSAppearanceNameDarkAqua) { + return YES; + } } return NO; } +- (BOOL)allowsVibrancy { + return YES; +} + - (SquirrelTheme *)selectTheme:(BOOL)isDark { return isDark ? _darkTheme : _defaultTheme; } @@ -245,235 +594,292 @@ - (SquirrelTheme *)currentTheme { return [self selectTheme:self.isDark]; } -- (NSTextLayoutManager *)layoutManager { - return _textView.textLayoutManager; -} - - (instancetype)initWithFrame:(NSRect)frameRect { self = [super initWithFrame:frameRect]; if (self) { self.wantsLayer = YES; + self.layer.geometryFlipped = YES; self.layer.masksToBounds = YES; + self.layerContentsRedrawPolicy = NSViewLayerContentsRedrawOnSetNeedsDisplay; + } + + if (@available(macOS 12.0, *)) { + NSTextLayoutManager *textLayoutManager = [[NSTextLayoutManager alloc] init]; + textLayoutManager.usesFontLeading = NO; + NSTextContainer *textContainer = [[NSTextContainer alloc] + initWithSize:NSMakeSize(NSViewWidthSizable, CGFLOAT_MAX)]; + textContainer.lineFragmentPadding = 0; + textLayoutManager.textContainer = textContainer; + NSTextContentStorage *contentStorage = [[NSTextContentStorage alloc] init]; + [contentStorage addTextLayoutManager:textLayoutManager]; + _textView = [[NSTextView alloc] initWithFrame:frameRect + textContainer:textLayoutManager.textContainer]; + _textStorage = _textView.textContentStorage.textStorage; + } else { + NSLayoutManager *layoutManager = [[NSLayoutManager alloc] init]; + layoutManager.backgroundLayoutEnabled = YES; + layoutManager.usesFontLeading = NO; + layoutManager.typesetterBehavior = NSTypesetterLatestBehavior; + NSTextContainer *textContainer = [[NSTextContainer alloc] + initWithContainerSize:NSMakeSize(NSViewWidthSizable, CGFLOAT_MAX)]; + textContainer.lineFragmentPadding = 0; + [layoutManager addTextContainer:textContainer]; + _textStorage = [[NSTextStorage alloc] init]; + [_textStorage addLayoutManager:layoutManager]; + _textView = [[NSTextView alloc] initWithFrame:frameRect + textContainer:textContainer]; } - _textView = [[NSTextView alloc] initWithFrame:frameRect]; _textView.drawsBackground = NO; _textView.editable = NO; _textView.selectable = NO; - self.layoutManager.textContainer.lineFragmentPadding = 0.0; - _defaultTheme = [[SquirrelTheme alloc] init]; - _darkTheme = [[SquirrelTheme alloc] init]; + _textView.wantsLayer = NO; + _shape = [[CAShapeLayer alloc] init]; + _defaultTheme = [[SquirrelTheme alloc] init]; + if (@available(macOS 10.14, *)) { + _darkTheme = [[SquirrelTheme alloc] init]; + } return self; } -- (NSTextRange *)convertRange:(NSRange)range { +- (NSTextRange *)getTextRangeFromRange:(NSRange)range API_AVAILABLE(macos(12.0)) { if (range.location == NSNotFound) { return nil; } else { - id startLocation = [self.layoutManager locationFromLocation:[self.layoutManager documentRange].location withOffset:range.location]; - id endLocation = [self.layoutManager locationFromLocation:startLocation withOffset:range.length]; + NSTextContentStorage *contentStorage = _textView.textContentStorage; + id startLocation = [contentStorage locationFromLocation:contentStorage.documentRange.location withOffset:range.location]; + id endLocation = [contentStorage locationFromLocation:startLocation withOffset:range.length]; return [[NSTextRange alloc] initWithLocation:startLocation endLocation:endLocation]; } } // Get the rectangle containing entire contents, expensive to calculate - (NSRect)contentRect { - NSMutableArray *ranges = [_candidateRanges mutableCopy]; - if (_preeditRange.length > 0) { - [ranges addObject:[NSValue valueWithRange:_preeditRange]]; - } - CGFloat x0 = CGFLOAT_MAX; - CGFloat x1 = CGFLOAT_MIN; - CGFloat y0 = CGFLOAT_MAX; - CGFloat y1 = CGFLOAT_MIN; - for (NSUInteger i = 0; i < ranges.count; i += 1) { - NSRange range = [ranges[i] rangeValue]; - NSRect rect = [self contentRectForRange:[self convertRange: range]]; - x0 = MIN(NSMinX(rect), x0); - x1 = MAX(NSMaxX(rect), x1); - y0 = MIN(NSMinY(rect), y0); - y1 = MAX(NSMaxY(rect), y1); - } - return NSMakeRect(x0, y0, x1-x0, y1-y0); -} - -// Get the rectangle containing the range of text, will first convert to glyph range, expensive to calculate -- (NSRect)contentRectForRange:(NSTextRange *)range { - __block CGFloat x0 = CGFLOAT_MAX; - __block CGFloat x1 = CGFLOAT_MIN; - __block CGFloat y0 = CGFLOAT_MAX; - __block CGFloat y1 = CGFLOAT_MIN; - [self.layoutManager enumerateTextSegmentsInRange:range type:NSTextLayoutManagerSegmentTypeStandard options:NSTextLayoutManagerSegmentOptionsRangeNotRequired usingBlock:^(NSTextRange *_, CGRect rect, CGFloat baseline, NSTextContainer *tectContainer) { - x0 = MIN(NSMinX(rect), x0); - x1 = MAX(NSMaxX(rect), x1); - y0 = MIN(NSMinY(rect), y0); - y1 = MAX(NSMaxY(rect), y1); - return YES; - }]; - return NSMakeRect(x0, y0, x1-x0, y1-y0); + if (@available(macOS 12.0, *)) { + [_textView.textLayoutManager ensureLayoutForRange:_textView.textContentStorage.documentRange]; + return [_textView.textLayoutManager usageBoundsForTextContainer]; + } else { + [_textView.layoutManager ensureLayoutForTextContainer:_textView.textContainer]; + return [_textView.layoutManager usedRectForTextContainer:_textView.textContainer]; + } } -// Will triger - (void)drawRect:(NSRect)dirtyRect -- (void) drawViewWith:(NSArray *)candidateRanges - hilightedIndex:(NSInteger)hilightedIndex - preeditRange:(NSRange)preeditRange - highlightedPreeditRange:(NSRange)highlightedPreeditRange { +// Get the rectangle containing the range of text, will first convert to glyph or text range, expensive to calculate +- (NSRect)contentRectForRange:(NSRange)range { + if (@available(macOS 12.0, *)) { + NSTextRange *textRange = [self getTextRangeFromRange:range]; + __block NSRect contentRect = NSZeroRect; + [_textView.textLayoutManager + enumerateTextSegmentsInRange:textRange + type:NSTextLayoutManagerSegmentTypeStandard + options:NSTextLayoutManagerSegmentOptionsRangeNotRequired + usingBlock:^(NSTextRange *segRange, CGRect segFrame, CGFloat baseline, NSTextContainer *textContainer) { + contentRect = NSUnionRect(contentRect, segFrame); + return YES; + }]; + CGFloat lineSpacing = [[_textStorage attribute:NSParagraphStyleAttributeName + atIndex:NSMaxRange(range) - 1 effectiveRange:NULL] lineSpacing]; + contentRect.size.height += lineSpacing; + return contentRect; + } else { + NSTextContainer *textContainer = _textView.textContainer; + NSLayoutManager *layoutManager = _textView.layoutManager; + NSRange glyphRange = [layoutManager glyphRangeForCharacterRange:range + actualCharacterRange:NULL]; + NSRange firstLineRange = NSMakeRange(NSNotFound, 0); + NSRect firstLineRect = [layoutManager lineFragmentUsedRectForGlyphAtIndex:glyphRange.location + effectiveRange:&firstLineRange]; + if (NSMaxRange(glyphRange) <= NSMaxRange(firstLineRange)) { + CGFloat startX = [layoutManager locationForGlyphAtIndex:glyphRange.location].x; + CGFloat endX = NSMaxRange(glyphRange) < NSMaxRange(firstLineRange) + ? [layoutManager locationForGlyphAtIndex:NSMaxRange(glyphRange)].x : NSWidth(firstLineRect); + return NSMakeRect(NSMinX(firstLineRect) + startX, NSMinY(firstLineRect), + endX - startX, NSHeight(firstLineRect)); + } else { + NSRect finalLineRect = [layoutManager lineFragmentUsedRectForGlyphAtIndex:NSMaxRange(glyphRange) - 1 + effectiveRange:NULL]; + return NSMakeRect(NSMinX(firstLineRect), NSMinY(firstLineRect), + textContainer.size.width, NSMaxY(finalLineRect) - NSMinY(firstLineRect)); + } + } +} + +// Will triger - (void)updateLayer +- (void)drawViewWithInsets:(NSEdgeInsets)insets + candidateRanges:(NSArray *)candidateRanges + highlightedIndex:(NSUInteger)highlightedIndex + preeditRange:(NSRange)preeditRange + highlightedPreeditRange:(NSRange)highlightedPreeditRange + pagingRange:(NSRange)pagingRange + pagingButton:(NSUInteger)pagingButton { + _insets = insets; _candidateRanges = candidateRanges; - _hilightedIndex = hilightedIndex; + _highlightedIndex = highlightedIndex; _preeditRange = preeditRange; _highlightedPreeditRange = highlightedPreeditRange; + _pagingRange = pagingRange; + _pagingButton = pagingButton; + _candidatePaths = [[NSMutableArray alloc] initWithCapacity:candidateRanges.count]; + _pagingPaths = [[NSMutableArray alloc] initWithCapacity:pagingRange.length > 0 ? 2 : 0]; self.needsDisplay = YES; } -// A tweaked sign function, to winddown corner radius when the size is small -double sign(double number) { - if (number >= 2) { - return 1; - } else if (number <= -2) { - return -1; - } else { - return number / 2; - } -} - // Bezier cubic curve, which has continuous roundness -CGMutablePathRef drawSmoothLines(NSArray *vertex, NSSet * __nullable straightCorner, CGFloat alpha, CGFloat beta) { - beta = MAX(0.00001, beta); - CGMutablePathRef path = CGPathCreateMutable(); - if (vertex.count < 1) +static NSBezierPath * drawRoundedPolygon(NSArray *vertex, CGFloat radius) { + NSBezierPath *path = [NSBezierPath bezierPath]; + if (vertex.count < 1) { return path; - NSPoint previousPoint = [vertex[vertex.count-1] pointValue]; - NSPoint point = [vertex[0] pointValue]; + } + NSPoint previousPoint = vertex.lastObject.pointValue; + NSPoint point = vertex.firstObject.pointValue; NSPoint nextPoint; - NSPoint control1; - NSPoint control2; - NSPoint target = previousPoint; - NSPoint diff = NSMakePoint(point.x - previousPoint.x, point.y - previousPoint.y); - if (!straightCorner || ![straightCorner containsObject:[NSNumber numberWithUnsignedInteger:vertex.count - 1]]) { - target.x += sign(diff.x/beta)*beta; - target.y += sign(diff.y/beta)*beta; - } - CGPathMoveToPoint(path, NULL, target.x, target.y); - for (NSUInteger i = 0; i < vertex.count; i += 1) { - previousPoint = [vertex[(vertex.count+i-1)%vertex.count] pointValue]; - point = [vertex[i] pointValue]; - nextPoint = [vertex[(i+1)%vertex.count] pointValue]; - target = point; - if (straightCorner && [straightCorner containsObject:[NSNumber numberWithUnsignedInteger:i]]) { - CGPathAddLineToPoint(path, NULL, target.x, target.y); + NSPoint startPoint; + NSPoint endPoint = previousPoint; + CGFloat arcRadius; + CGVector diff = CGVectorMake(point.x - previousPoint.x, point.y - previousPoint.y); + if (ABS(diff.dx) >= ABS(diff.dy)) { + endPoint.x += diff.dx / 2; + endPoint.y = point.y; + } else { + endPoint.y += diff.dy / 2; + endPoint.x = point.x; + } + [path moveToPoint:endPoint]; + for (NSUInteger i = 0; i < vertex.count; ++i) { + startPoint = endPoint; + point = vertex[i].pointValue; + nextPoint = vertex[(i + 1) % vertex.count].pointValue; + arcRadius = MIN(radius, MAX(ABS(point.x - startPoint.x), ABS(point.y - startPoint.y))); + endPoint = point; + diff = CGVectorMake(nextPoint.x - point.x, nextPoint.y - point.y); + if (ABS(diff.dx) > ABS(diff.dy)) { + endPoint.x += diff.dx / 2; + arcRadius = MIN(arcRadius, ABS(diff.dx) / 2); + endPoint.y = nextPoint.y; + point.y = nextPoint.y; } else { - control1 = point; - diff = NSMakePoint(point.x - previousPoint.x, point.y - previousPoint.y); - target.x -= sign(diff.x/beta)*beta; - control1.x -= sign(diff.x/beta)*alpha; - target.y -= sign(diff.y/beta)*beta; - control1.y -= sign(diff.y/beta)*alpha; - - CGPathAddLineToPoint(path, NULL, target.x, target.y); - target = point; - control2 = point; - diff = NSMakePoint(nextPoint.x - point.x, nextPoint.y - point.y); - control2.x += sign(diff.x/beta)*alpha; - target.x += sign(diff.x/beta)*beta; - control2.y += sign(diff.y/beta)*alpha; - target.y += sign(diff.y/beta)*beta; - - CGPathAddCurveToPoint(path, NULL, control1.x, control1.y, control2.x, control2.y, target.x, target.y); - } - } - CGPathCloseSubpath(path); + endPoint.y += diff.dy / 2; + arcRadius = MIN(arcRadius, ABS(diff.dy) / 2); + endPoint.x = nextPoint.x; + point.x = nextPoint.x; + } + [path appendBezierPathWithArcFromPoint:point toPoint:endPoint radius:arcRadius]; + } + [path closePath]; return path; } -NSArray *rectVertex(NSRect rect) { - return @[ - @(rect.origin), - @(NSMakePoint(rect.origin.x, rect.origin.y+rect.size.height)), - @(NSMakePoint(rect.origin.x+rect.size.width, rect.origin.y+rect.size.height)), - @(NSMakePoint(rect.origin.x+rect.size.width, rect.origin.y)) - ]; +static NSArray * rectVertex(NSRect rect) { + return @[@(rect.origin), + @(NSMakePoint(rect.origin.x, rect.origin.y + rect.size.height)), + @(NSMakePoint(rect.origin.x + rect.size.width, rect.origin.y + rect.size.height)), + @(NSMakePoint(rect.origin.x + rect.size.width, rect.origin.y))]; } -BOOL nearEmptyRect(NSRect rect) { - return rect.size.height * rect.size.width < 1; +static inline BOOL nearEmptyRect(NSRect rect) { + return NSHeight(rect) * NSWidth(rect) < 1; } // Calculate 3 boxes containing the text in range. leadingRect and trailingRect are incomplete line rectangle -// bodyRect is complete lines in the middle -- (void)multilineRectForRange:(NSTextRange *)range leadingRect:(NSRect *)leadingRect bodyRect:(NSRect *)bodyRect trailingRect:(NSRect *)trailingRect extraSurounding:(CGFloat)extraSurounding bounds:(NSRect)bounds { - NSSize edgeInset = self.currentTheme.edgeInset; - NSMutableArray *lineRects = [[NSMutableArray alloc] init]; - [self.layoutManager enumerateTextSegmentsInRange:range type:NSTextLayoutManagerSegmentTypeStandard options:NSTextLayoutManagerSegmentOptionsRangeNotRequired usingBlock:^(NSTextRange *_, CGRect rect, CGFloat baseline, NSTextContainer *tectContainer) { - if (!nearEmptyRect(rect)) { - NSRect newRect = rect; - newRect.origin.x += edgeInset.width; - newRect.origin.y += edgeInset.height; - newRect.size.height += self.currentTheme.linespace; - newRect.origin.y -= self.currentTheme.linespace / 2; - [lineRects addObject:[NSValue valueWithRect:newRect]]; - } - return YES; - }]; - - *leadingRect = NSZeroRect; - *bodyRect = NSZeroRect; - *trailingRect = NSZeroRect; - - if (lineRects.count == 1) { - *bodyRect = [lineRects[0] rectValue]; - } else if (lineRects.count == 2) { - *leadingRect = [lineRects[0] rectValue]; - *trailingRect = [lineRects[1] rectValue]; - } else if (lineRects.count > 2) { - *leadingRect = [lineRects[0] rectValue]; - *trailingRect = [lineRects[lineRects.count-1] rectValue]; - CGFloat x0 = CGFLOAT_MAX; - CGFloat x1 = CGFLOAT_MIN; - CGFloat y0 = CGFLOAT_MAX; - CGFloat y1 = CGFLOAT_MIN; - for (NSUInteger i = 1; i < lineRects.count-1; i += 1) { - NSRect rect = [lineRects[i] rectValue]; - x0 = MIN(NSMinX(rect), x0); - x1 = MAX(NSMaxX(rect), x1); - y0 = MIN(NSMinY(rect), y0); - y1 = MAX(NSMaxY(rect), y1); - } - y0 = MIN(NSMaxY(*leadingRect), y0); - y1 = MAX(NSMinY(*trailingRect), y1); - *bodyRect = NSMakeRect(x0, y0, x1-x0, y1-y0); - } - - if (extraSurounding > 0) { - if (nearEmptyRect(*leadingRect) && nearEmptyRect(*trailingRect)) { - expandHighlightWidth(bodyRect, extraSurounding); - } else { - if (!(nearEmptyRect(*leadingRect))) { - expandHighlightWidth(leadingRect, extraSurounding); +// bodyRect is the complete line fragment in the middle if the range spans no less than one full line +- (void)multilineRectForRange:(NSRange)charRange leadingRect:(NSRectPointer)leadingRect bodyRect:(NSRectPointer)bodyRect trailingRect:(NSRectPointer)trailingRect { + if (@available(macOS 12.0, *)) { + NSTextRange *textRange = [self getTextRangeFromRange:charRange]; + CGFloat lineSpacing = [[_textStorage attribute:NSParagraphStyleAttributeName atIndex:charRange.location effectiveRange:NULL] lineSpacing]; + NSMutableArray *lineRects = [[NSMutableArray alloc] initWithCapacity:2]; + NSMutableArray *lineRanges = [[NSMutableArray alloc] initWithCapacity:2]; + [_textView.textLayoutManager + enumerateTextSegmentsInRange:textRange + type:NSTextLayoutManagerSegmentTypeStandard + options:NSTextLayoutManagerSegmentOptionsMiddleFragmentsExcluded + usingBlock:^(NSTextRange *segRange, CGRect segFrame, CGFloat baseline, NSTextContainer *textContainer) { + if (!nearEmptyRect(segFrame)) { + segFrame.size.height += lineSpacing; + [lineRects addObject:[NSValue valueWithRect:segFrame]]; + [lineRanges addObject:segRange]; } - if (!(nearEmptyRect(*trailingRect))) { - expandHighlightWidth(trailingRect, extraSurounding); + return YES; + }]; + if (lineRects.count == 1) { + *bodyRect = lineRects[0].rectValue; + } else { + CGFloat containerWidth = _textView.textContainer.size.width; + NSRect leadingLineRect = lineRects.firstObject.rectValue; + leadingLineRect.size.width = containerWidth - NSMinX(leadingLineRect); + NSRect trailingLineRect = lineRects.lastObject.rectValue; + if (NSMaxX(trailingLineRect) == NSMaxX(leadingLineRect)) { + if (NSMinX(leadingLineRect) == NSMinX(trailingLineRect)) { + *bodyRect = NSUnionRect(leadingLineRect, trailingLineRect); + } else { + *leadingRect = leadingLineRect; + *bodyRect = NSMakeRect(0.0, NSMaxY(leadingLineRect), containerWidth, + NSMaxY(trailingLineRect) - NSMaxY(leadingLineRect)); + } + } else { + *trailingRect = trailingLineRect; + if (NSMinX(leadingLineRect) == NSMinX(trailingLineRect)) { + *bodyRect = NSMakeRect(0.0, NSMinY(leadingLineRect), containerWidth, + NSMinY(trailingLineRect) - NSMinY(leadingLineRect)); + } else { + *leadingRect = leadingLineRect; + if (lineRanges.lastObject.location > lineRanges.firstObject.endLocation) { + *bodyRect = NSMakeRect(0.0, NSMaxY(leadingLineRect), containerWidth, + NSMinY(trailingLineRect) - NSMaxY(leadingLineRect)); + } + } } } - } - - if (!nearEmptyRect(*leadingRect) && !nearEmptyRect(*trailingRect)) { - leadingRect->size.width = NSMaxX(bounds) - leadingRect->origin.x; - trailingRect->size.width = NSMaxX(*trailingRect) - NSMinX(bounds); - trailingRect->origin.x = NSMinX(bounds); - if (!nearEmptyRect(*bodyRect)) { - bodyRect->size.width = bounds.size.width; - bodyRect->origin.x = bounds.origin.x; + } else { + NSLayoutManager *layoutManager = _textView.layoutManager; + NSRange glyphRange = [layoutManager glyphRangeForCharacterRange:charRange + actualCharacterRange:NULL]; + NSRange leadingLineRange = NSMakeRange(NSNotFound, 0); + NSRect leadingLineRect = [layoutManager lineFragmentUsedRectForGlyphAtIndex:glyphRange.location + effectiveRange:&leadingLineRange]; + CGFloat startX = [layoutManager locationForGlyphAtIndex:glyphRange.location].x; + if (NSMaxRange(leadingLineRange) >= NSMaxRange(glyphRange)) { + CGFloat endX = NSMaxRange(glyphRange) < NSMaxRange(leadingLineRange) + ? [layoutManager locationForGlyphAtIndex:NSMaxRange(glyphRange)].x : NSWidth(leadingLineRect); + *bodyRect = NSMakeRect(startX, NSMinY(leadingLineRect), + endX - startX, NSHeight(leadingLineRect)); } else { - CGFloat diff = NSMinY(*trailingRect) - NSMaxY(*leadingRect); - leadingRect->size.height += diff / 2; - trailingRect->size.height += diff / 2; - trailingRect->origin.y -= diff / 2; + CGFloat containerWidth = _textView.textContainer.size.width; + NSRange trailingLineRange = NSMakeRange(NSNotFound, 0); + NSRect trailingLineRect = [layoutManager lineFragmentUsedRectForGlyphAtIndex:NSMaxRange(glyphRange) - 1 + effectiveRange:&trailingLineRange]; + CGFloat endX = NSMaxRange(glyphRange) < NSMaxRange(trailingLineRange) + ? [layoutManager locationForGlyphAtIndex:NSMaxRange(glyphRange)].x : NSWidth(trailingLineRect); + if (NSMaxRange(trailingLineRange) == NSMaxRange(glyphRange)) { + if (glyphRange.location == leadingLineRange.location) { + *bodyRect = NSMakeRect(0.0, NSMinY(leadingLineRect), containerWidth, + NSMaxY(trailingLineRect) - NSMinY(leadingLineRect)); + } else { + *leadingRect = NSMakeRect(startX, NSMinY(leadingLineRect), + containerWidth - startX, NSHeight(leadingLineRect)); + *bodyRect = NSMakeRect(0.0, NSMaxY(leadingLineRect), containerWidth, + NSMaxY(trailingLineRect) - NSMaxY(leadingLineRect)); + } + } else { + *trailingRect = NSMakeRect(0.0, NSMinY(trailingLineRect), endX, + NSHeight(trailingLineRect)); + if (glyphRange.location == leadingLineRange.location) { + *bodyRect = NSMakeRect(0.0, NSMinY(leadingLineRect), containerWidth, + NSMinY(trailingLineRect) - NSMinY(leadingLineRect)); + } else { + *leadingRect = NSMakeRect(startX, NSMinY(leadingLineRect), + containerWidth - startX, NSHeight(leadingLineRect)); + if (trailingLineRange.location > NSMaxRange(leadingLineRange)) { + *bodyRect = NSMakeRect(0.0, NSMaxY(leadingLineRect), containerWidth, + NSMinY(trailingLineRect) - NSMaxY(leadingLineRect)); + } + } + } } } } // Based on the 3 boxes from multilineRectForRange, calculate the vertex of the polygon containing the text in range -NSArray * multilineRectVertex(NSRect leadingRect, NSRect bodyRect, NSRect trailingRect) { +static NSArray * multilineRectVertex(NSRect leadingRect, NSRect bodyRect, NSRect trailingRect) { if (nearEmptyRect(bodyRect) && !nearEmptyRect(leadingRect) && nearEmptyRect(trailingRect)) { return rectVertex(leadingRect); } else if (nearEmptyRect(bodyRect) && nearEmptyRect(leadingRect) && !nearEmptyRect(trailingRect)) { @@ -481,418 +887,434 @@ - (void)multilineRectForRange:(NSTextRange *)range leadingRect:(NSRect *)leading } else if (nearEmptyRect(leadingRect) && nearEmptyRect(trailingRect) && !nearEmptyRect(bodyRect)) { return rectVertex(bodyRect); } else if (nearEmptyRect(trailingRect) && !nearEmptyRect(bodyRect)) { - NSArray * leadingVertex = rectVertex(leadingRect); - NSArray * bodyVertex = rectVertex(bodyRect); - return @[bodyVertex[0], bodyVertex[1], bodyVertex[2], leadingVertex[3], leadingVertex[0], leadingVertex[1]]; + NSArray *leadingVertex = rectVertex(leadingRect); + NSArray *bodyVertex = rectVertex(bodyRect); + return @[leadingVertex[0], leadingVertex[1], bodyVertex[0], bodyVertex[1], bodyVertex[2], leadingVertex[3]]; } else if (nearEmptyRect(leadingRect) && !nearEmptyRect(bodyRect)) { - NSArray * trailingVertex = rectVertex(trailingRect); - NSArray * bodyVertex = rectVertex(bodyRect); - return @[trailingVertex[1], trailingVertex[2], trailingVertex[3], bodyVertex[2], bodyVertex[3], bodyVertex[0]]; - } else if (!nearEmptyRect(leadingRect) && !nearEmptyRect(trailingRect) && nearEmptyRect(bodyRect) && NSMaxX(leadingRect)>NSMinX(trailingRect)) { - NSArray * leadingVertex = rectVertex(leadingRect); - NSArray * trailingVertex = rectVertex(trailingRect); - return @[trailingVertex[0], trailingVertex[1], trailingVertex[2], trailingVertex[3], leadingVertex[2], leadingVertex[3], leadingVertex[0], leadingVertex[1]]; + NSArray *trailingVertex = rectVertex(trailingRect); + NSArray *bodyVertex = rectVertex(bodyRect); + return @[bodyVertex[0], trailingVertex[1], trailingVertex[2], trailingVertex[3], bodyVertex[2], bodyVertex[3]]; + } else if (!nearEmptyRect(leadingRect) && !nearEmptyRect(trailingRect) && + nearEmptyRect(bodyRect) && NSMaxX(leadingRect) > NSMinX(trailingRect)) { + NSArray *leadingVertex = rectVertex(leadingRect); + NSArray *trailingVertex = rectVertex(trailingRect); + return @[leadingVertex[0], leadingVertex[1], trailingVertex[0], trailingVertex[1], + trailingVertex[2], trailingVertex[3], leadingVertex[2], leadingVertex[3]]; } else if (!nearEmptyRect(leadingRect) && !nearEmptyRect(trailingRect) && !nearEmptyRect(bodyRect)) { - NSArray * leadingVertex = rectVertex(leadingRect); - NSArray * bodyVertex = rectVertex(bodyRect); - NSArray * trailingVertex = rectVertex(trailingRect); - return @[trailingVertex[1], trailingVertex[2], trailingVertex[3], bodyVertex[2], leadingVertex[3], leadingVertex[0], leadingVertex[1], bodyVertex[0]]; + NSArray *leadingVertex = rectVertex(leadingRect); + NSArray *bodyVertex = rectVertex(bodyRect); + NSArray *trailingVertex = rectVertex(trailingRect); + return @[leadingVertex[0], leadingVertex[1], bodyVertex[0], trailingVertex[1], + trailingVertex[2], trailingVertex[3], bodyVertex[2], leadingVertex[3]]; } else { return @[]; } } -// If the point is outside the innerBox, will extend to reach the outerBox -void expand(NSMutableArray *vertex, NSRect innerBorder, NSRect outerBorder) { - for (NSUInteger i = 0; i < vertex.count; i += 1){ - NSPoint point = [vertex[i] pointValue]; - if (point.x < innerBorder.origin.x) { - point.x = outerBorder.origin.x; - } else if (point.x > innerBorder.origin.x+innerBorder.size.width) { - point.x = outerBorder.origin.x+outerBorder.size.width; - } - if (point.y < innerBorder.origin.y) { - point.y = outerBorder.origin.y; - } else if (point.y > innerBorder.origin.y+innerBorder.size.height) { - point.y = outerBorder.origin.y+outerBorder.size.height; - } - [vertex replaceObjectAtIndex:i withObject:@(point)]; +static inline NSColor * hooverColor(NSColor *color, BOOL darkTheme) { + if (@available(macOS 10.14, *)) { + return [color colorWithSystemEffect:NSColorSystemEffectRollover]; } -} - -CGPoint direction(CGPoint diff) { - if (diff.y == 0 && diff.x > 0) { - return NSMakePoint(0, 1); - } else if (diff.y == 0 && diff.x < 0) { - return NSMakePoint(0, -1); - } else if (diff.x == 0 && diff.y > 0) { - return NSMakePoint(-1, 0); - } else if (diff.x == 0 && diff.y < 0) { - return NSMakePoint(1, 0); + if (darkTheme) { + return [color highlightWithLevel:0.3]; } else { - return NSMakePoint(0, 0); - } -} - -CAShapeLayer *shapeFromPath(CGPathRef path) { - CAShapeLayer *layer = [CAShapeLayer layer]; - layer.path = path; - layer.fillRule = kCAFillRuleEvenOdd; - return layer; -} - -// Assumes clockwise iteration -void enlarge(NSMutableArray *vertex, CGFloat by) { - if (by != 0) { - NSPoint previousPoint; - NSPoint point; - NSPoint nextPoint; - NSArray *original = [[NSArray alloc] initWithArray:vertex]; - NSPoint newPoint; - NSPoint displacement; - for (NSUInteger i = 0; i < original.count; i += 1){ - previousPoint = [original[(original.count+i-1)%original.count] pointValue]; - point = [original[i] pointValue]; - nextPoint = [original[(i+1)%original.count] pointValue]; - newPoint = point; - displacement = direction(NSMakePoint(point.x - previousPoint.x, point.y - previousPoint.y)); - newPoint.x += by * displacement.x; - newPoint.y += by * displacement.y; - displacement = direction(NSMakePoint(nextPoint.x - point.x, nextPoint.y - point.y)); - newPoint.x += by * displacement.x; - newPoint.y += by * displacement.y; - [vertex replaceObjectAtIndex:i withObject:@(newPoint)]; - } - } -} - -// Add gap between horizontal candidates -void expandHighlightWidth(NSRect *rect, CGFloat extraSurrounding) { - if (!nearEmptyRect(*rect)) { - rect->size.width += extraSurrounding; - rect->origin.x -= extraSurrounding / 2; - } -} - -void removeCorner(NSMutableArray *highlightedPoints, NSMutableSet *rightCorners, NSRect containingRect) { - if (highlightedPoints && rightCorners) { - NSSet *originalRightCorners = [[NSSet alloc] initWithSet:rightCorners]; - for (NSNumber *cornerIndex in originalRightCorners) { - NSUInteger index = cornerIndex.unsignedIntegerValue; - NSPoint corner = [highlightedPoints[index] pointValue]; - CGFloat dist = MIN(NSMaxY(containingRect) - corner.y, corner.y - NSMinY(containingRect)); - if (dist < 1e-2) { - [rightCorners removeObject:cornerIndex]; - } - } + return [color shadowWithLevel:0.3]; } } -- (void) linearMultilineForRect:(NSRect)bodyRect leadingRect:(NSRect)leadingRect trailingRect:(NSRect)trailingRect points1:(NSMutableArray **)highlightedPoints points2:(NSMutableArray **)highlightedPoints2 rightCorners:(NSMutableSet **)rightCorners rightCorners2:(NSMutableSet **)rightCorners2 { - // Handles the special case where containing boxes are separated - if (nearEmptyRect(bodyRect) && !nearEmptyRect(leadingRect) && !nearEmptyRect(trailingRect) && NSMaxX(trailingRect) < NSMinX(leadingRect)) { - *highlightedPoints = [rectVertex(leadingRect) mutableCopy]; - *highlightedPoints2 = [rectVertex(trailingRect) mutableCopy]; - *rightCorners = [[NSMutableSet alloc] initWithObjects:@(2), @(3), nil]; - *rightCorners2 = [[NSMutableSet alloc] initWithObjects:@(0), @(1), nil]; - } else { - *highlightedPoints = [multilineRectVertex(leadingRect, bodyRect, trailingRect) mutableCopy]; - } -} - -- (CGPathRef)drawHighlightedWith:(SquirrelTheme *)theme highlightedRange:(NSRange)highlightedRange backgroundRect:(NSRect)backgroundRect preeditRect:(NSRect)preeditRect containingRect:(NSRect)containingRect extraExpansion:(CGFloat)extraExpansion { - NSRect currentContainingRect = containingRect; - currentContainingRect.size.width += extraExpansion * 2; - currentContainingRect.size.height += extraExpansion * 2; - currentContainingRect.origin.x -= extraExpansion; - currentContainingRect.origin.y -= extraExpansion; - - CGFloat halfLinespace = theme.linespace / 2; - NSRect innerBox = backgroundRect; - innerBox.size.width -= (theme.edgeInset.width + 1) * 2 - 2 * extraExpansion; - innerBox.origin.x += theme.edgeInset.width + 1 - extraExpansion; - innerBox.size.height += 2 * extraExpansion; - innerBox.origin.y -= extraExpansion; - if (_preeditRange.length == 0) { - innerBox.origin.y += theme.edgeInset.height + 1; - innerBox.size.height -= (theme.edgeInset.height + 1) * 2; - } else { - innerBox.origin.y += preeditRect.size.height + theme.preeditLinespace / 2 + theme.hilitedCornerRadius / 2 + 1; - innerBox.size.height -= theme.edgeInset.height + preeditRect.size.height + theme.preeditLinespace / 2 + theme.hilitedCornerRadius / 2 + 2; - } - innerBox.size.height -= theme.linespace; - innerBox.origin.y += halfLinespace; - NSRect outerBox = backgroundRect; - outerBox.size.height -= preeditRect.size.height + MAX(0, theme.hilitedCornerRadius + theme.borderWidth) - 2 * extraExpansion; - outerBox.size.width -= MAX(0, theme.hilitedCornerRadius + theme.borderWidth) - 2 * extraExpansion; - outerBox.origin.x += MAX(0, theme.hilitedCornerRadius + theme.borderWidth) / 2 - extraExpansion; - outerBox.origin.y += preeditRect.size.height + MAX(0, theme.hilitedCornerRadius + theme.borderWidth) / 2 - extraExpansion; - - double effectiveRadius = MAX(0, theme.hilitedCornerRadius + 2 * extraExpansion / theme.hilitedCornerRadius * MAX(0, theme.cornerRadius - theme.hilitedCornerRadius)); - CGMutablePathRef path = CGPathCreateMutable(); - - if (theme.linear){ - NSRect leadingRect; - NSRect bodyRect; - NSRect trailingRect; - [self multilineRectForRange:[self convertRange:highlightedRange] leadingRect:&leadingRect bodyRect:&bodyRect trailingRect:&trailingRect extraSurounding:_seperatorWidth bounds:outerBox]; - - NSMutableArray *highlightedPoints; - NSMutableArray *highlightedPoints2; - NSMutableSet *rightCorners; - NSMutableSet *rightCorners2; - [self linearMultilineForRect:bodyRect leadingRect:leadingRect trailingRect:trailingRect points1:&highlightedPoints points2:&highlightedPoints2 rightCorners:&rightCorners rightCorners2:&rightCorners2]; - - // Expand the boxes to reach proper border - enlarge(highlightedPoints, extraExpansion); - expand(highlightedPoints, innerBox, outerBox); - removeCorner(highlightedPoints, rightCorners, currentContainingRect); - - path = drawSmoothLines(highlightedPoints, rightCorners, 0.3*effectiveRadius, 1.4*effectiveRadius); - if (highlightedPoints2.count > 0) { - enlarge(highlightedPoints2, extraExpansion); - expand(highlightedPoints2, innerBox, outerBox); - removeCorner(highlightedPoints2, rightCorners2, currentContainingRect); - CGPathRef path2 = drawSmoothLines(highlightedPoints2, rightCorners2, 0.3*effectiveRadius, 1.4*effectiveRadius); - CGPathAddPath(path, NULL, path2); - } +static inline NSColor * disabledColor(NSColor *color, BOOL darkTheme) { + if (@available(macOS 10.14, *)) { + return [color colorWithSystemEffect:NSColorSystemEffectDisabled]; + } + if (darkTheme) { + return [color shadowWithLevel:0.3]; } else { - NSRect highlightedRect = [self contentRectForRange:[self convertRange:highlightedRange]]; - if (!nearEmptyRect(highlightedRect)) { - highlightedRect.size.width = backgroundRect.size.width; - highlightedRect.size.height += theme.linespace; - highlightedRect.origin = NSMakePoint(backgroundRect.origin.x, highlightedRect.origin.y + theme.edgeInset.height - halfLinespace); - if (NSMaxRange(highlightedRange) == _textView.string.length) { - highlightedRect.size.height += theme.edgeInset.height - halfLinespace; - } - if (highlightedRange.location - ((_preeditRange.location == NSNotFound ? 0 : _preeditRange.location)+_preeditRange.length) <= 1) { - if (_preeditRange.length == 0) { - highlightedRect.size.height += theme.edgeInset.height - halfLinespace; - highlightedRect.origin.y -= theme.edgeInset.height - halfLinespace; - } else { - highlightedRect.size.height += theme.hilitedCornerRadius / 2; - highlightedRect.origin.y -= theme.hilitedCornerRadius / 2; - } - } - NSMutableArray *highlightedPoints = [rectVertex(highlightedRect) mutableCopy]; - enlarge(highlightedPoints, extraExpansion); - expand(highlightedPoints, innerBox, outerBox); - path = drawSmoothLines(highlightedPoints, nil, 0.3*effectiveRadius, 1.4*effectiveRadius); - } + return [color highlightWithLevel:0.3]; } - return path; -} - -- (NSRect)carveInset:(NSRect)rect theme:(SquirrelTheme *)theme { - NSRect newRect = rect; - newRect.size.height -= (theme.hilitedCornerRadius + theme.borderWidth) * 2; - newRect.size.width -= (theme.hilitedCornerRadius + theme.borderWidth) * 2; - newRect.origin.x += theme.hilitedCornerRadius + theme.borderWidth; - newRect.origin.y += theme.hilitedCornerRadius + theme.borderWidth; - return newRect; } // All draws happen here -- (void)drawRect:(NSRect)dirtyRect { - CGPathRef backgroundPath = CGPathCreateMutable(); - CGPathRef highlightedPath = CGPathCreateMutable(); - CGMutablePathRef candidatePaths = CGPathCreateMutable(); - CGMutablePathRef highlightedPreeditPath = CGPathCreateMutable(); - CGPathRef preeditPath = CGPathCreateMutable(); - SquirrelTheme * theme = self.currentTheme; - - NSPoint textFieldOrigin = dirtyRect.origin; - textFieldOrigin.y += theme.edgeInset.height; - textFieldOrigin.x += theme.edgeInset.width; +- (void)updateLayer { + NSBezierPath *backgroundPath; + NSBezierPath *borderPath; + NSBezierPath *textContainerPath; + NSBezierPath *highlightedPath; + NSBezierPath *highlightedPreeditPath; + NSBezierPath *candidateBlockPath; + NSBezierPath *candidateHorzGridPath; + NSBezierPath *candidateVertGridPath; + NSBezierPath *pageUpPath; + NSBezierPath *pageDownPath; + + SquirrelTheme *theme = self.currentTheme; + NSRect backgroundRect = self.bounds; + NSRect textContainerRect = NSInsetRect(backgroundRect, theme.edgeInset.width, theme.edgeInset.height); + + NSRange visibleRange; + if (@available(macOS 12.0, *)) { + visibleRange = NSMakeRange(0, _textStorage.length); + } else { + NSRange containerGlyphRange = {NSNotFound, 0}; + [_textView.layoutManager textContainerForGlyphAtIndex:0 effectiveRange:&containerGlyphRange]; + visibleRange = [_textView.layoutManager characterRangeForGlyphRange:containerGlyphRange actualGlyphRange:NULL]; + } + NSRange preeditRange = NSIntersectionRange(_preeditRange, visibleRange); + NSRange candidateBlockRange = NSIntersectionRange(NSUnionRange(_candidateRanges.firstObject.rangeValue, theme.linear && _pagingRange.length > 0 ? _pagingRange : _candidateRanges.lastObject.rangeValue), visibleRange); + NSRange pagingRange = NSIntersectionRange(_pagingRange, visibleRange); - // Draw preedit Rect - NSRect backgroundRect = dirtyRect; - NSRect containingRect = dirtyRect; + NSRect preeditRect = NSZeroRect; + NSRect candidateBlockRect = NSZeroRect; + NSRect pagingLineRect = NSZeroRect; + if (preeditRange.length > 0) { + preeditRect = [self contentRectForRange:preeditRange]; + if (candidateBlockRange.length > 0) { + preeditRect.size.height += theme.preeditLinespace; + } + } + if (candidateBlockRange.length > 0) { + candidateBlockRect = NSInsetRect([self contentRectForRange:candidateBlockRange], 0.0, -theme.linespace / 2); + if (preeditRange.length == 0) { + candidateBlockRect.origin.y += theme.linespace / 2; + } + } + if (!theme.linear && pagingRange.length > 0) { + pagingLineRect = [self contentRectForRange:pagingRange]; + pagingLineRect.origin.y -= theme.pagingParagraphStyle.paragraphSpacingBefore; + pagingLineRect.size.height += theme.pagingParagraphStyle.paragraphSpacingBefore; + } + [NSBezierPath setDefaultLineWidth:0]; // Draw preedit Rect - NSRect preeditRect = NSZeroRect; - if (_preeditRange.length > 0) { - preeditRect = [self contentRectForRange:[self convertRange:_preeditRange]]; - if (!nearEmptyRect(preeditRect)) { - preeditRect.size.width = backgroundRect.size.width; - preeditRect.size.height += theme.edgeInset.height + theme.preeditLinespace / 2 + theme.hilitedCornerRadius / 2; - preeditRect.origin = backgroundRect.origin; - if (_candidateRanges.count == 0) { - preeditRect.size.height += theme.edgeInset.height - theme.preeditLinespace / 2 - theme.hilitedCornerRadius / 2; + if (preeditRange.length > 0) { + preeditRect.size.width = textContainerRect.size.width; + preeditRect.origin = textContainerRect.origin; + // Draw highlighted part of preedit text + NSRange highlightedPreeditRange = NSIntersectionRange(_highlightedPreeditRange, visibleRange); + if (highlightedPreeditRange.length > 0 && theme.highlightedPreeditColor != nil) { + NSRect innerBox = NSInsetRect(preeditRect, theme.separatorWidth / 2, 0); + if (candidateBlockRange.length > 0) { + innerBox.size.height -= theme.preeditLinespace; + } + NSRect leadingRect = NSZeroRect; + NSRect bodyRect = NSZeroRect; + NSRect trailingRect = NSZeroRect; + [self multilineRectForRange:highlightedPreeditRange leadingRect:&leadingRect bodyRect:&bodyRect trailingRect:&trailingRect]; + leadingRect = nearEmptyRect(leadingRect) ? NSZeroRect + : NSIntersectionRect(NSOffsetRect(leadingRect, _insets.left, theme.edgeInset.height), innerBox); + bodyRect = nearEmptyRect(bodyRect) ? NSZeroRect + : NSIntersectionRect(NSOffsetRect(bodyRect, _insets.left, theme.edgeInset.height), innerBox); + trailingRect = nearEmptyRect(trailingRect) ? NSZeroRect + : NSIntersectionRect(NSOffsetRect(trailingRect, _insets.left, theme.edgeInset.height), innerBox); + NSArray *highlightedPreeditPoints; + NSArray *highlightedPreeditPoints2; + // Handles the special case where containing boxes are separated + if (NSIsEmptyRect(bodyRect) && !NSIsEmptyRect(leadingRect) && !NSIsEmptyRect(trailingRect) + && NSMaxX(trailingRect) < NSMinX(leadingRect)) { + highlightedPreeditPoints = rectVertex(leadingRect); + highlightedPreeditPoints2 = rectVertex(trailingRect); + } else { + highlightedPreeditPoints = multilineRectVertex(leadingRect, bodyRect, trailingRect); } - containingRect.size.height -= preeditRect.size.height; - containingRect.origin.y += preeditRect.size.height; - if (theme.preeditBackgroundColor != nil) { - preeditPath = drawSmoothLines(rectVertex(preeditRect), nil, 0, 0); + highlightedPreeditPath = drawRoundedPolygon(highlightedPreeditPoints, MIN(theme.highlightedCornerRadius, theme.preeditParagraphStyle.maximumLineHeight / 3)); + if (highlightedPreeditPoints2.count > 0) { + [highlightedPreeditPath appendBezierPath:drawRoundedPolygon(highlightedPreeditPoints2, MIN(theme.highlightedCornerRadius, theme.preeditParagraphStyle.maximumLineHeight / 3))]; } } } - containingRect = [self carveInset:containingRect theme:theme]; - // Draw highlighted Rect - for (NSUInteger i = 0; i < _candidateRanges.count; i += 1) { - NSRange candidateRange = [_candidateRanges[i] rangeValue]; - if (i == _hilightedIndex) { - // Draw highlighted Rect - if (candidateRange.length > 0 && theme.highlightedBackColor != nil) { - highlightedPath = [self drawHighlightedWith:theme highlightedRange:candidateRange backgroundRect:backgroundRect preeditRect:preeditRect containingRect:containingRect extraExpansion:0]; + // Draw candidate Rect + if (candidateBlockRange.length > 0) { + candidateBlockRect.size.width = textContainerRect.size.width; + candidateBlockRect.origin.x = textContainerRect.origin.x; + candidateBlockRect.origin.y += textContainerRect.origin.y; + candidateBlockRect = NSIntersectionRect(candidateBlockRect, textContainerRect); + candidateBlockPath = drawRoundedPolygon(rectVertex(candidateBlockRect), theme.highlightedCornerRadius); + + // Draw candidate highlight rect + if (theme.linear) { + CGFloat gridOriginY = NSMinY(candidateBlockRect); + CGFloat tabInterval = theme.separatorWidth * 2; + if (theme.tabled) { + candidateHorzGridPath = [NSBezierPath bezierPath]; + candidateVertGridPath = [NSBezierPath bezierPath]; } - } else { - // Draw other highlighted Rect - if (candidateRange.length > 0 && theme.candidateBackColor != nil) { - CGPathRef candidatePath = [self drawHighlightedWith:theme highlightedRange:candidateRange backgroundRect:backgroundRect preeditRect:preeditRect containingRect:containingRect extraExpansion:theme.surroundingExtraExpansion]; - CGPathAddPath(candidatePaths, NULL, candidatePath); + for (NSUInteger i = 0; i < _candidateRanges.count; ++i) { + NSRange candidateRange = NSIntersectionRange([_candidateRanges[i] rangeValue], visibleRange); + if (candidateRange.length == 0) { + break; + } + NSRect leadingRect = NSZeroRect; + NSRect bodyRect = NSZeroRect; + NSRect trailingRect = NSZeroRect; + [self multilineRectForRange:candidateRange leadingRect:&leadingRect bodyRect:&bodyRect trailingRect:&trailingRect]; + leadingRect = nearEmptyRect(leadingRect) ? NSZeroRect + : NSInsetRect(NSOffsetRect(leadingRect, _insets.left, theme.edgeInset.height), -theme.separatorWidth / 2, 0); + bodyRect = nearEmptyRect(bodyRect) ? NSZeroRect + : NSInsetRect(NSOffsetRect(bodyRect, _insets.left, theme.edgeInset.height), -theme.separatorWidth / 2, 0); + trailingRect = nearEmptyRect(trailingRect) ? NSZeroRect + : NSInsetRect(NSOffsetRect(trailingRect, _insets.left, theme.edgeInset.height), -theme.separatorWidth / 2, 0); + if (preeditRange.length == 0) { + leadingRect.origin.y += theme.linespace / 2; + bodyRect.origin.y += theme.linespace / 2; + trailingRect.origin.y += theme.linespace / 2; + } + if (!NSIsEmptyRect(leadingRect)) { + leadingRect.origin.y -= theme.linespace / 2; + leadingRect.size.height += theme.linespace / 2; + leadingRect = NSIntersectionRect(leadingRect, candidateBlockRect); + } + if (!NSIsEmptyRect(trailingRect)) { + trailingRect.size.height += theme.linespace / 2; + trailingRect = NSIntersectionRect(trailingRect, candidateBlockRect); + } + if (!NSIsEmptyRect(bodyRect)) { + if (NSIsEmptyRect(leadingRect)) { + bodyRect.origin.y -= theme.linespace / 2; + bodyRect.size.height += theme.linespace / 2; + } + if (NSIsEmptyRect(trailingRect)) { + bodyRect.size.height += theme.linespace / 2; + } + bodyRect = NSIntersectionRect(bodyRect, candidateBlockRect); + } + if (theme.tabled) { + CGFloat bottomEdge = NSMaxY(NSIsEmptyRect(trailingRect) ? bodyRect : trailingRect); + if (ABS(bottomEdge - gridOriginY) > 2 && ABS(bottomEdge - NSMaxY(candidateBlockRect)) > 2) { // horizontal border + [candidateHorzGridPath moveToPoint:NSMakePoint(NSMinX(candidateBlockRect) + theme.separatorWidth / 2, bottomEdge)]; + [candidateHorzGridPath lineToPoint:NSMakePoint(NSMaxX(candidateBlockRect) - theme.separatorWidth / 2, bottomEdge)]; + [candidateHorzGridPath closePath]; + gridOriginY = bottomEdge; + } + CGPoint leadOrigin = (NSIsEmptyRect(leadingRect) ? bodyRect : leadingRect).origin; + if (leadOrigin.x > NSMinX(candidateBlockRect) + theme.separatorWidth / 2) { // vertical bar + [candidateVertGridPath moveToPoint:NSMakePoint(leadOrigin.x, leadOrigin.y + theme.linespace / 2 + theme.paragraphStyle.maximumLineHeight - theme.highlightedCornerRadius)]; + [candidateVertGridPath lineToPoint:NSMakePoint(leadOrigin.x, leadOrigin.y + theme.linespace / 2 + theme.highlightedCornerRadius)]; + [candidateVertGridPath closePath]; + } + CGFloat tailEdge = NSMaxX(NSIsEmptyRect(trailingRect) ? bodyRect : trailingRect); + CGFloat tabPosition = pow(2, ceil(log2((tailEdge - leadOrigin.x) / tabInterval))) * tabInterval + leadOrigin.x; + if (NSIsEmptyRect(trailingRect)) { + bodyRect.size.width += tabPosition - tailEdge; + } else if (NSIsEmptyRect(bodyRect)) { + trailingRect.size.width += tabPosition - tailEdge; + } else { + bodyRect = NSMakeRect(NSMinX(candidateBlockRect), NSMinY(bodyRect), NSWidth(candidateBlockRect), NSHeight(bodyRect) + NSHeight(trailingRect)); + trailingRect = NSZeroRect; + } + } + NSArray *candidatePoints; + NSArray *candidatePoints2; + // Handles the special case where containing boxes are separated + if (NSIsEmptyRect(bodyRect) && !NSIsEmptyRect(leadingRect) && + !NSIsEmptyRect(trailingRect) && NSMaxX(trailingRect) < NSMinX(leadingRect)) { + candidatePoints = rectVertex(leadingRect); + candidatePoints2 = rectVertex(trailingRect); + } else { + candidatePoints = multilineRectVertex(leadingRect, bodyRect, trailingRect); + } + NSBezierPath *candidatePath = drawRoundedPolygon(candidatePoints, theme.highlightedCornerRadius); + if (candidatePoints2.count > 0) { + [candidatePath appendBezierPath:drawRoundedPolygon(candidatePoints2, theme.highlightedCornerRadius)]; + } + _candidatePaths[i] = candidatePath; + } + } else { // stacked layout + for (NSUInteger i = 0; i < _candidateRanges.count; ++i) { + NSRange candidateRange = NSIntersectionRange([_candidateRanges[i] rangeValue], visibleRange); + if (candidateRange.length == 0) { + break; + } + NSRect candidateRect = NSInsetRect([self contentRectForRange:candidateRange], 0.0, -theme.linespace / 2); + candidateRect.size.width = textContainerRect.size.width; + candidateRect.origin.x = textContainerRect.origin.x; + candidateRect.origin.y += textContainerRect.origin.y; + if (preeditRange.length == 0) { + candidateRect.origin.y += theme.linespace / 2; + } + candidateRect = NSIntersectionRect(candidateRect, candidateBlockRect); + NSArray *candidatePoints = rectVertex(candidateRect); + NSBezierPath *candidatePath = drawRoundedPolygon(candidatePoints, theme.highlightedCornerRadius); + _candidatePaths[i] = candidatePath; } } } - // Draw highlighted part of preedit text - if (_highlightedPreeditRange.length > 0 && theme.highlightedPreeditColor != nil) { - NSRect innerBox = preeditRect; - innerBox.size.width -= (theme.edgeInset.width + 1) * 2; - innerBox.origin.x += theme.edgeInset.width + 1; - innerBox.origin.y += theme.edgeInset.height + 1; - if (_candidateRanges.count == 0) { - innerBox.size.height -= (theme.edgeInset.height + 1) * 2; + // Draw paging Rect + if (pagingRange.length > 0) { + NSRect pageDownRect = NSOffsetRect([self contentRectForRange:NSMakeRange(NSMaxRange(pagingRange) - 1, 1)], + _insets.left, theme.edgeInset.height); + pageDownRect.size.width += theme.separatorWidth / 2; + NSRect pageUpRect = NSOffsetRect([self contentRectForRange:NSMakeRange(pagingRange.location, 1)], + _insets.left, theme.edgeInset.height); + pageUpRect.origin.x -= theme.separatorWidth / 2; + pageUpRect.size.width = NSWidth(pageDownRect); // bypass the bug of getting wrong glyph position when tab is presented + if (theme.linear) { + pageDownRect = NSInsetRect(pageDownRect, 0.0, -theme.linespace / 2); + pageUpRect = NSInsetRect(pageUpRect, 0.0, -theme.linespace / 2); + } + if (preeditRange.length == 0) { + pageDownRect = NSOffsetRect(pageDownRect, 0.0, theme.linespace / 2); + pageUpRect = NSOffsetRect(pageUpRect, 0.0, theme.linespace / 2); + } + pageDownRect = NSIntersectionRect(pageDownRect, textContainerRect); + pageUpRect = NSIntersectionRect(pageUpRect, textContainerRect); + pageDownPath = drawRoundedPolygon(rectVertex(pageDownRect), + MIN(theme.highlightedCornerRadius, MIN(NSWidth(pageDownRect), NSHeight(pageDownRect)) / 3)); + pageUpPath = drawRoundedPolygon(rectVertex(pageUpRect), + MIN(theme.highlightedCornerRadius, MIN(NSWidth(pageUpRect), NSHeight(pageUpRect)) / 3)); + _pagingPaths[0] = pageUpPath; + _pagingPaths[1] = pageDownPath; + } + + // Draw borders + backgroundPath = drawRoundedPolygon(rectVertex(backgroundRect), + MIN(theme.cornerRadius, NSHeight(backgroundRect) / 3)); + textContainerPath = drawRoundedPolygon(rectVertex(textContainerRect), + MIN(theme.highlightedCornerRadius, NSHeight(textContainerRect) / 3)); + if (theme.edgeInset.width > 0 || theme.edgeInset.height > 0) { + borderPath = [backgroundPath copy]; + [borderPath appendBezierPath:textContainerPath]; + borderPath.windingRule = NSEvenOddWindingRule; + } + + // set layers + _shape.path = [backgroundPath quartzPath]; + _shape.fillColor = [[NSColor whiteColor] CGColor]; + _shape.cornerRadius = MIN(theme.cornerRadius, NSHeight(backgroundRect) / 3); + CAShapeLayer *textContainerLayer = [[CAShapeLayer alloc] init]; + textContainerLayer.path = [textContainerPath quartzPath]; + textContainerLayer.fillColor = [[NSColor whiteColor] CGColor]; + textContainerLayer.cornerRadius = MIN(theme.highlightedCornerRadius, NSHeight(textContainerRect) / 3); + [self.layer setSublayers:nil]; + self.layer.cornerRadius = MIN(theme.cornerRadius, NSHeight(backgroundRect) / 3); + CALayer *panelLayer = [[CALayer alloc] init]; + [self.layer addSublayer:panelLayer]; + if (theme.backgroundImage) { + CAShapeLayer *backgroundImageLayer = [[CAShapeLayer alloc] init]; + if (theme.vertical) { + const CGAffineTransform rotate = CGAffineTransformMakeRotation(-M_PI / 2); + backgroundImageLayer.path = CFAutorelease(CGPathCreateCopyByTransformingPath([textContainerPath quartzPath], &rotate)); + backgroundImageLayer.fillColor = [theme.backgroundImage CGColor]; + [backgroundImageLayer setAffineTransform:CGAffineTransformMakeRotation(M_PI / 2)]; } else { - innerBox.size.height -= theme.edgeInset.height + theme.preeditLinespace / 2 + theme.hilitedCornerRadius / 2 + 2; - } - NSRect outerBox = preeditRect; - outerBox.size.height -= MAX(0, theme.hilitedCornerRadius + theme.borderWidth); - outerBox.size.width -= MAX(0, theme.hilitedCornerRadius + theme.borderWidth); - outerBox.origin.x += MAX(0, theme.hilitedCornerRadius + theme.borderWidth) / 2; - outerBox.origin.y += MAX(0, theme.hilitedCornerRadius + theme.borderWidth) / 2; - - NSRect leadingRect; - NSRect bodyRect; - NSRect trailingRect; - [self multilineRectForRange:[self convertRange:_highlightedPreeditRange] leadingRect:&leadingRect bodyRect:&bodyRect trailingRect:&trailingRect extraSurounding:0 bounds:outerBox]; - - NSMutableArray *highlightedPreeditPoints; - NSMutableArray *highlightedPreeditPoints2; - NSMutableSet *rightCorners; - NSMutableSet *rightCorners2; - [self linearMultilineForRect:bodyRect leadingRect:leadingRect trailingRect:trailingRect points1:&highlightedPreeditPoints points2:&highlightedPreeditPoints2 rightCorners:&rightCorners rightCorners2:&rightCorners2]; - - containingRect = [self carveInset:preeditRect theme:theme]; - expand(highlightedPreeditPoints, innerBox, outerBox); - removeCorner(highlightedPreeditPoints, rightCorners, containingRect); - highlightedPreeditPath = drawSmoothLines(highlightedPreeditPoints, rightCorners, 0.3*theme.hilitedCornerRadius, 1.4*theme.hilitedCornerRadius); - if (highlightedPreeditPoints2.count > 0) { - expand(highlightedPreeditPoints2, innerBox, outerBox); - removeCorner(highlightedPreeditPoints2, rightCorners2, containingRect); - CGPathRef highlightedPreeditPath2 = drawSmoothLines(highlightedPreeditPoints2, rightCorners2, 0.3*theme.hilitedCornerRadius, 1.4*theme.hilitedCornerRadius); - CGPathAddPath(highlightedPreeditPath, NULL, highlightedPreeditPath2); - } - } + backgroundImageLayer.path = [textContainerPath quartzPath]; + backgroundImageLayer.fillColor = [theme.backgroundImage CGColor]; + } + backgroundImageLayer.cornerRadius = MIN(theme.cornerRadius, NSHeight(backgroundRect) / 3); + [panelLayer addSublayer:backgroundImageLayer]; + } + CAShapeLayer *backgroundLayer = [[CAShapeLayer alloc] init]; + backgroundLayer.path = [textContainerPath quartzPath]; + backgroundLayer.fillColor = [theme.backgroundColor CGColor]; + backgroundLayer.cornerRadius = MIN(theme.cornerRadius, NSHeight(backgroundRect) / 3); + [panelLayer addSublayer:backgroundLayer]; + if (theme.preeditBackgroundColor && + (preeditRange.length > 0 || !NSIsEmptyRect(pagingLineRect))) { + backgroundLayer.fillColor = [theme.preeditBackgroundColor CGColor]; + if (!candidateBlockPath.empty) { + [textContainerPath appendBezierPath:candidateBlockPath]; + textContainerPath.windingRule = NSEvenOddWindingRule; + backgroundLayer.path = [textContainerPath quartzPath]; + backgroundLayer.fillRule = kCAFillRuleEvenOdd; + CAShapeLayer *candidateLayer = [[CAShapeLayer alloc] init]; + candidateLayer.path = [candidateBlockPath quartzPath]; + candidateLayer.fillColor = [theme.backgroundColor CGColor]; + [panelLayer addSublayer:candidateLayer]; + } + } + if (@available(macOS 10.14, *)) { + if (theme.translucency > 0) { + panelLayer.opacity = 1.0 - theme.translucency; + } + } + if (_highlightedIndex < _candidatePaths.count && theme.highlightedStripColor) { + CAShapeLayer *highlightedLayer = [[CAShapeLayer alloc] init]; + highlightedPath = _candidatePaths[_highlightedIndex]; + highlightedLayer.path = [highlightedPath quartzPath]; + highlightedLayer.fillColor = [theme.highlightedStripColor CGColor]; + CAShapeLayer *candidateMaskLayer = [[CAShapeLayer alloc] init]; + candidateMaskLayer.path = [candidateBlockPath quartzPath]; + candidateMaskLayer.fillColor = [[NSColor whiteColor] CGColor]; + highlightedLayer.mask = candidateMaskLayer; + [self.layer addSublayer:highlightedLayer]; + } + NSColor *buttonColor = theme.linear ? theme.highlightedStripColor : theme.highlightedPreeditColor; + if (pagingRange.length > 0 && buttonColor) { + CAShapeLayer *pagingLayer = [[CAShapeLayer alloc] init]; + switch (_pagingButton) { + case NSPageUpFunctionKey: { + pagingLayer.path = [pageUpPath quartzPath]; + pagingLayer.fillColor = [hooverColor(buttonColor, self.isDark) CGColor]; + } break; + case NSBeginFunctionKey: { + pagingLayer.path = [pageUpPath quartzPath]; + pagingLayer.fillColor = [disabledColor(buttonColor, self.isDark) CGColor]; + } break; + case NSPageDownFunctionKey: { + pagingLayer.path = [pageDownPath quartzPath]; + pagingLayer.fillColor = [hooverColor(buttonColor, self.isDark) CGColor]; + } break; + case NSEndFunctionKey: { + pagingLayer.path = [pageDownPath quartzPath]; + pagingLayer.fillColor = [disabledColor(buttonColor, self.isDark) CGColor]; + } break; + } + pagingLayer.mask = textContainerLayer; + [self.layer addSublayer:pagingLayer]; + } + if (theme.highlightedPreeditColor) { + if (!highlightedPreeditPath.empty) { + CAShapeLayer *highlightedPreeditLayer = [[CAShapeLayer alloc] init]; + highlightedPreeditLayer.path = [highlightedPreeditPath quartzPath]; + highlightedPreeditLayer.fillColor = [theme.highlightedPreeditColor CGColor]; + highlightedPreeditLayer.mask = textContainerLayer; + [self.layer addSublayer:highlightedPreeditLayer]; + } + } + if (theme.tabled) { + CAShapeLayer *horzGridLayer = [[CAShapeLayer alloc] init]; + horzGridLayer.path = [candidateHorzGridPath quartzPath]; + horzGridLayer.strokeColor = [[theme.backgroundColor blendedColorWithFraction:kBlendedBackgroundColorFraction ofColor:(self.isDark ? [NSColor lightGrayColor] : [NSColor blackColor])] CGColor]; + horzGridLayer.lineWidth = theme.edgeInset.height / 2; + horzGridLayer.lineCap = kCALineCapRound; + [panelLayer addSublayer:horzGridLayer]; + CAShapeLayer *vertGridLayer = [[CAShapeLayer alloc] init]; + vertGridLayer.path = [candidateVertGridPath quartzPath]; + vertGridLayer.strokeColor = [[theme.backgroundColor blendedColorWithFraction:kBlendedBackgroundColorFraction ofColor:(self.isDark ? [NSColor lightGrayColor] : [NSColor blackColor])] CGColor]; + vertGridLayer.lineWidth = theme.edgeInset.width / 2; + vertGridLayer.lineCap = kCALineCapRound; + [panelLayer addSublayer:vertGridLayer]; + } + if (theme.borderColor && !borderPath.empty) { + CAShapeLayer *borderLayer = [[CAShapeLayer alloc] init]; + borderLayer.path = [borderPath quartzPath]; + borderLayer.fillColor = [theme.borderColor CGColor]; + borderLayer.fillRule = kCAFillRuleEvenOdd; + [panelLayer addSublayer:borderLayer]; + } + [_textView display]; +} - [NSBezierPath setDefaultLineWidth:0]; - backgroundPath = drawSmoothLines(rectVertex(backgroundRect), nil, theme.cornerRadius*0.3, theme.cornerRadius*1.4); - _shape.path = CGPathCreateMutableCopy(backgroundPath); - - [self.layer setSublayers: NULL]; - CGMutablePathRef backPath = CGPathCreateMutableCopy(backgroundPath); - if (!CGPathIsEmpty(preeditPath)) { - CGPathAddPath(backPath, NULL, preeditPath); - } - if (theme.mutualExclusive) { - if (!CGPathIsEmpty(highlightedPath)) { - CGPathAddPath(backPath, NULL, highlightedPath); - } - if (!CGPathIsEmpty(candidatePaths)) { - CGPathAddPath(backPath, NULL, candidatePaths); - } - } - CAShapeLayer *panelLayer = shapeFromPath(backPath); - panelLayer.fillColor = theme.backgroundColor.CGColor; - CAShapeLayer *panelLayerMask = shapeFromPath(backgroundPath); - panelLayer.mask = panelLayerMask; - [self.layer addSublayer: panelLayer]; - - if (theme.preeditBackgroundColor && !CGPathIsEmpty(preeditPath)) { - CAShapeLayer *layer = shapeFromPath(preeditPath); - layer.fillColor = theme.preeditBackgroundColor.CGColor; - CGMutablePathRef maskPath = CGPathCreateMutableCopy(backgroundPath); - if (theme.mutualExclusive && !CGPathIsEmpty(highlightedPreeditPath)) { - CGPathAddPath(maskPath, NULL, highlightedPreeditPath); - } - CAShapeLayer *mask = shapeFromPath(maskPath); - layer.mask = mask; - [panelLayer addSublayer: layer]; - } - if (theme.borderWidth > 0 && theme.borderColor) { - CAShapeLayer *borderLayer = shapeFromPath(backgroundPath); - borderLayer.lineWidth = theme.borderWidth * 2; - borderLayer.strokeColor = theme.borderColor.CGColor; - borderLayer.fillColor = NULL; - [panelLayer addSublayer: borderLayer]; - } - if (theme.highlightedPreeditColor && !CGPathIsEmpty(highlightedPreeditPath)) { - CAShapeLayer *layer = shapeFromPath(highlightedPreeditPath); - layer.fillColor = theme.highlightedPreeditColor.CGColor; - [panelLayer addSublayer: layer]; - } - if (theme.candidateBackColor && !CGPathIsEmpty(candidatePaths)) { - CAShapeLayer *layer = shapeFromPath(candidatePaths); - layer.fillColor = theme.candidateBackColor.CGColor; - [panelLayer addSublayer: layer]; - } - if (theme.highlightedBackColor && !CGPathIsEmpty(highlightedPath)) { - CAShapeLayer *layer = shapeFromPath(highlightedPath); - layer.fillColor = theme.highlightedBackColor.CGColor; - if (theme.shadowSize > 0) { - CAShapeLayer *shadowLayer = [CAShapeLayer layer]; - shadowLayer.shadowColor = NSColor.blackColor.CGColor; - shadowLayer.shadowOffset = NSMakeSize(theme.shadowSize/2, (theme.vertical ? -1 : 1) * theme.shadowSize/2); - shadowLayer.shadowPath = highlightedPath; - shadowLayer.shadowRadius = theme.shadowSize; - shadowLayer.shadowOpacity = 0.2; - CGMutablePathRef maskPath = CGPathCreateMutableCopy(backgroundPath); - CGPathAddPath(maskPath, NULL, highlightedPath); - if (!CGPathIsEmpty(preeditPath)) { - CGPathAddPath(maskPath, NULL, preeditPath); +- (BOOL)convertClickSpot:(NSPoint)spot toIndex:(NSUInteger *)index { + if (NSPointInRect(spot, self.bounds)) { + if (_pagingPaths.count > 0) { + if ([_pagingPaths[0] containsPoint:spot]) { + *index = NSPageUpFunctionKey; // borrow function-key unicode for readability + return YES; } - CAShapeLayer *shadowLayerMask = shapeFromPath(maskPath); - shadowLayer.mask = shadowLayerMask; - layer.strokeColor = [NSColor.blackColor colorWithAlphaComponent:0.15].CGColor; - layer.lineWidth = 0.5; - [layer addSublayer: shadowLayer]; - } - [panelLayer addSublayer: layer]; - } - [_textView setTextContainerInset:NSMakeSize(textFieldOrigin.x, textFieldOrigin.y)]; -} - -- (BOOL)clickAtPoint:(NSPoint)_point index:(NSInteger *)_index { - if (CGPathContainsPoint(_shape.path, nil, _point, NO)) { - NSPoint point = NSMakePoint(_point.x - self.textView.textContainerInset.width, - _point.y - self.textView.textContainerInset.height); - NSTextLayoutFragment *fragment = [self.layoutManager textLayoutFragmentForPosition:point]; - if (fragment) { - point = NSMakePoint(point.x - NSMinX(fragment.layoutFragmentFrame), - point.y - NSMinY(fragment.layoutFragmentFrame)); - NSInteger index = [self.layoutManager offsetFromLocation: self.layoutManager.documentRange.location toLocation: fragment.rangeInElement.location]; - for (NSUInteger i = 0; i < fragment.textLineFragments.count; i += 1) { - NSTextLineFragment *lineFragment = fragment.textLineFragments[i]; - if (CGRectContainsPoint(lineFragment.typographicBounds, point)) { - point = NSMakePoint(point.x - NSMinX(lineFragment.typographicBounds), - point.y - NSMinY(lineFragment.typographicBounds)); - index += [lineFragment characterIndexForPoint:point]; - for (NSUInteger i = 0; i < _candidateRanges.count; i += 1) { - NSRange range = [_candidateRanges[i] rangeValue]; - if (index >= range.location && index < NSMaxRange(range)) { - *_index = i; - break; - } - } - break; - } + if ([_pagingPaths[1] containsPoint:spot]) { + *index = NSPageDownFunctionKey; // borrow function-key unicode for readability + return YES; + } + } + for (NSUInteger i = 0; i < _candidatePaths.count; ++i) { + if ([_candidatePaths[i] containsPoint:spot]) { + *index = i; + return YES; } } - return YES; - } else { - return NO; } + return NO; } @end @@ -901,28 +1323,40 @@ @implementation SquirrelPanel { SquirrelView *_view; NSVisualEffectView *_back; - NSRect _screenRect; - CGFloat _maxHeight; + NSScreen *_screen; + NSSize _maxSize; + CGFloat _textWidthLimit; - NSString *_statusMessage; - NSTimer *_statusTimer; - NSString *_preedit; NSRange _selRange; NSUInteger _caretPos; - NSArray *_candidates; - NSArray *_comments; - NSArray *_labels; + NSArray *_candidates; + NSArray *_comments; NSUInteger _index; - NSUInteger _cursorIndex; - NSPoint _scrollDirection; - NSDate *_scrollTime; + NSUInteger _pageNum; + NSUInteger _turnPage; + BOOL _lastPage; + + BOOL _mouseDown; + NSPoint _scrollLocus; + BOOL _initPosition; + + NSString *_statusMessage; + NSTimer *_statusTimer; +} + +- (BOOL)isFloatingPanel { + return YES; } - (BOOL)linear { return _view.currentTheme.linear; } +- (BOOL)tabled { + return _view.currentTheme.tabled; +} + - (BOOL)vertical { return _view.currentTheme.vertical; } @@ -935,193 +1369,258 @@ - (BOOL)inlineCandidate { return _view.currentTheme.inlineCandidate; } -NSAttributedString *insert(NSString *separator, NSAttributedString *betweenText) { - NSRange range = [betweenText.string rangeOfComposedCharacterSequenceAtIndex:0]; - NSAttributedString *attributedSeperator = [[NSAttributedString alloc] initWithString:separator attributes:[betweenText attributesAtIndex:0 effectiveRange:nil]]; - NSUInteger i = NSMaxRange(range); - NSMutableAttributedString *workingString = [[betweenText attributedSubstringFromRange:range] mutableCopy]; - while (i < betweenText.length) { - range = [betweenText.string rangeOfComposedCharacterSequenceAtIndex:i]; - [workingString appendAttributedString:attributedSeperator]; - [workingString appendAttributedString:[betweenText attributedSubstringFromRange:range]]; - i = NSMaxRange(range); ++ (NSColor *)secondaryTextColor { + if (@available(macOS 10.10, *)) { + return [NSColor secondaryLabelColor]; + } else { + return [NSColor disabledControlTextColor]; } - return workingString; } -+ (NSColor *)secondaryTextColor { - return [NSColor secondaryLabelColor]; ++ (NSColor *)accentColor { + if (@available(macOS 10.14, *)) { + return [NSColor controlAccentColor]; + } else { + return [NSColor colorForControlTint:[NSColor currentControlTint]]; + } } - (void)initializeUIStyleForDarkMode:(BOOL)isDark { SquirrelTheme *theme = [_view selectTheme:isDark]; - theme.native = YES; - theme.memorizeSize = YES; - theme.candidateFormat = kDefaultCandidateFormat; - - NSColor *secondaryTextColor = [[self class] secondaryTextColor]; - NSMutableDictionary *attrs = [[NSMutableDictionary alloc] init]; + NSColor *secondaryTextColor = [SquirrelPanel secondaryTextColor]; + NSColor *accentColor = [SquirrelPanel accentColor]; + NSFont *userFont = [NSFont fontWithDescriptor:getFontDescriptor([NSFont userFontOfSize:0.0].fontName) + size:kDefaultFontSize]; + NSFont *userMonoFont = [NSFont fontWithDescriptor:getFontDescriptor([NSFont userFixedPitchFontOfSize:0.0].fontName) + size:kDefaultFontSize]; + NSMutableDictionary *defaultAttrs = [[NSMutableDictionary alloc] init]; + // prevent mac terminal from hijacking non-alphabetic keys on non-inline mode + defaultAttrs[IMKCandidatesSendServerKeyEventFirst] = @(YES); + + NSMutableDictionary *attrs = [defaultAttrs mutableCopy]; attrs[NSForegroundColorAttributeName] = [NSColor controlTextColor]; - attrs[NSFontAttributeName] = [NSFont userFontOfSize:kDefaultFontSize]; + attrs[NSFontAttributeName] = userFont; - NSMutableDictionary *highlightedAttrs = [[NSMutableDictionary alloc] init]; - highlightedAttrs[NSForegroundColorAttributeName] = [NSColor selectedControlTextColor]; - highlightedAttrs[NSFontAttributeName] = [NSFont userFontOfSize:kDefaultFontSize]; + NSMutableDictionary *highlightedAttrs = [defaultAttrs mutableCopy]; + highlightedAttrs[NSForegroundColorAttributeName] = [NSColor selectedMenuItemTextColor]; + highlightedAttrs[NSFontAttributeName] = userFont; + // Use left-to-right embedding to prevent right-to-left text from changing the layout of the candidate. + attrs[NSWritingDirectionAttributeName] = @[@(0)]; + highlightedAttrs[NSWritingDirectionAttributeName] = @[@(0)]; NSMutableDictionary *labelAttrs = [attrs mutableCopy]; + labelAttrs[NSForegroundColorAttributeName] = accentColor; + labelAttrs[NSFontAttributeName] = userMonoFont; + NSMutableDictionary *labelHighlightedAttrs = [highlightedAttrs mutableCopy]; + labelHighlightedAttrs[NSForegroundColorAttributeName] = [NSColor alternateSelectedControlTextColor]; + labelHighlightedAttrs[NSFontAttributeName] = userMonoFont; - NSMutableDictionary *commentAttrs = [[NSMutableDictionary alloc] init]; + NSMutableDictionary *commentAttrs = [defaultAttrs mutableCopy]; commentAttrs[NSForegroundColorAttributeName] = secondaryTextColor; - commentAttrs[NSFontAttributeName] = [NSFont userFontOfSize:kDefaultFontSize]; + commentAttrs[NSFontAttributeName] = userFont; + + NSMutableDictionary *commentHighlightedAttrs = [defaultAttrs mutableCopy]; + commentHighlightedAttrs[NSForegroundColorAttributeName] = [NSColor alternateSelectedControlTextColor]; + commentHighlightedAttrs[NSFontAttributeName] = userFont; + + NSMutableDictionary *preeditAttrs = [defaultAttrs mutableCopy]; + preeditAttrs[NSForegroundColorAttributeName] = [NSColor textColor]; + preeditAttrs[NSFontAttributeName] = userFont; + preeditAttrs[NSLigatureAttributeName] = @(0); + + NSMutableDictionary *preeditHighlightedAttrs = [defaultAttrs mutableCopy]; + preeditHighlightedAttrs[NSForegroundColorAttributeName] = [NSColor selectedTextColor]; + preeditHighlightedAttrs[NSFontAttributeName] = userFont; + preeditHighlightedAttrs[NSLigatureAttributeName] = @(0); + + NSMutableDictionary *pagingAttrs = [defaultAttrs mutableCopy]; + pagingAttrs[NSForegroundColorAttributeName] = theme.linear ? accentColor : [NSColor controlTextColor]; + + NSMutableDictionary *pagingHighlightedAttrs = [defaultAttrs mutableCopy]; + pagingHighlightedAttrs[NSForegroundColorAttributeName] = theme.linear + ? [NSColor alternateSelectedControlTextColor] : [NSColor selectedMenuItemTextColor]; + + NSMutableParagraphStyle *preeditParagraphStyle = [[NSParagraphStyle defaultParagraphStyle] mutableCopy]; + NSMutableParagraphStyle *paragraphStyle = [[NSParagraphStyle defaultParagraphStyle] mutableCopy]; + NSMutableParagraphStyle *pagingParagraphStyle = [[NSParagraphStyle defaultParagraphStyle] mutableCopy]; + NSMutableParagraphStyle *statusParagraphStyle = [[NSParagraphStyle defaultParagraphStyle] mutableCopy]; + + preeditParagraphStyle.lineBreakMode = NSLineBreakByWordWrapping; + preeditParagraphStyle.alignment = NSTextAlignmentLeft; + paragraphStyle.alignment = NSTextAlignmentLeft; + pagingParagraphStyle.alignment = NSTextAlignmentLeft; + statusParagraphStyle.alignment = NSTextAlignmentLeft; + + // Use left-to-right marks to declare the default writing direction and prevent strong right-to-left + // characters from setting the writing direction in case the label are direction-less symbols + preeditParagraphStyle.baseWritingDirection = NSWritingDirectionLeftToRight; + paragraphStyle.baseWritingDirection = NSWritingDirectionLeftToRight; + pagingParagraphStyle.baseWritingDirection = NSWritingDirectionLeftToRight; + statusParagraphStyle.baseWritingDirection = NSWritingDirectionLeftToRight; + + NSMutableDictionary *statusAttrs = [commentAttrs mutableCopy]; + statusAttrs[NSParagraphStyleAttributeName] = statusParagraphStyle; + + preeditAttrs[NSParagraphStyleAttributeName] = preeditParagraphStyle; + preeditHighlightedAttrs[NSParagraphStyleAttributeName] = preeditParagraphStyle; + + [theme setAttrs:attrs + highlightedAttrs:highlightedAttrs + labelAttrs:labelAttrs + labelHighlightedAttrs:labelHighlightedAttrs + commentAttrs:commentAttrs + commentHighlightedAttrs:commentHighlightedAttrs + preeditAttrs:preeditAttrs + preeditHighlightedAttrs:preeditHighlightedAttrs + pagingAttrs:pagingAttrs + pagingHighlightedAttrs:pagingHighlightedAttrs + statusAttrs:statusAttrs]; - NSMutableDictionary *commentHighlightedAttrs = [commentAttrs mutableCopy]; - - NSMutableDictionary *preeditAttrs = [[NSMutableDictionary alloc] init]; - preeditAttrs[NSForegroundColorAttributeName] = secondaryTextColor; - preeditAttrs[NSFontAttributeName] = [NSFont userFontOfSize:kDefaultFontSize]; - - NSMutableDictionary *preeditHighlightedAttrs = [[NSMutableDictionary alloc] init]; - preeditHighlightedAttrs[NSForegroundColorAttributeName] = [NSColor controlTextColor]; - preeditHighlightedAttrs[NSFontAttributeName] = [NSFont userFontOfSize:kDefaultFontSize]; - - NSParagraphStyle *paragraphStyle = [NSParagraphStyle defaultParagraphStyle]; - NSParagraphStyle *preeditParagraphStyle = [NSParagraphStyle defaultParagraphStyle]; - - [theme setAttrs:attrs - highlightedAttrs:highlightedAttrs - labelAttrs:labelAttrs - labelHighlightedAttrs:labelHighlightedAttrs - commentAttrs:commentAttrs - commentHighlightedAttrs:commentHighlightedAttrs - preeditAttrs:preeditAttrs - preeditHighlightedAttrs:preeditHighlightedAttrs]; [theme setParagraphStyle:paragraphStyle - preeditParagraphStyle:preeditParagraphStyle]; + preeditParagraphStyle:preeditParagraphStyle + pagingParagraphStyle:pagingParagraphStyle + statusParagraphStyle:statusParagraphStyle]; + + [theme setLabels:@[@"1", @"2", @"3", @"4", @"5", @"6", @"7", @"8", @"9", @"0"]]; + [theme setCandidateFormat:kDefaultCandidateFormat]; } - (instancetype)init { - self = [super initWithContentRect:_position styleMask:NSWindowStyleMaskNonactivatingPanel backing:NSBackingStoreBuffered defer:YES]; + self = [super initWithContentRect:_position + styleMask:NSWindowStyleMaskNonactivatingPanel | NSWindowStyleMaskBorderless + backing:NSBackingStoreBuffered + defer:YES]; + if (self) { self.alphaValue = 1.0; - // _window.level = NSScreenSaverWindowLevel + 1; - // ^ May fix visibility issue in fullscreen games. - self.level = CGShieldingWindowLevel(); - self.hasShadow = YES; + self.level = kCGCursorWindowLevel - 10; + self.hasShadow = NO; self.opaque = NO; + self.displaysWhenScreenProfileChanges = YES; self.backgroundColor = [NSColor clearColor]; NSView *contentView = [[NSView alloc] init]; - _view = [[SquirrelView alloc] initWithFrame:self.contentView.frame]; - _back = [[NSVisualEffectView alloc] init]; - _back.blendingMode = NSVisualEffectBlendingModeBehindWindow; - _back.material = NSVisualEffectMaterialHUDWindow; - _back.state = NSVisualEffectStateActive; - _back.wantsLayer = YES; - _back.layer.mask = _view.shape; - [contentView addSubview:_back]; + _view = [[SquirrelView alloc] initWithFrame:self.contentView.bounds]; + if (@available(macOS 10.14, *)) { + _back = [[NSVisualEffectView alloc] init]; + _back.blendingMode = NSVisualEffectBlendingModeBehindWindow; + _back.material = NSVisualEffectMaterialHUDWindow; + _back.state = NSVisualEffectStateActive; + _back.wantsLayer = YES; + _back.layer.mask = _view.shape; + [contentView addSubview:_back]; + } [contentView addSubview:_view]; [contentView addSubview:_view.textView]; - + self.contentView = contentView; [self initializeUIStyleForDarkMode:NO]; - [self initializeUIStyleForDarkMode:YES]; - _maxHeight = 0; + if (@available(macOS 10.14, *)) { + [self initializeUIStyleForDarkMode:YES]; + } + _maxSize = NSZeroSize; + _initPosition = YES; } return self; } -- (NSPoint)mousePosition { - NSPoint point = NSEvent.mouseLocation; - point = [self convertPointFromScreen:point]; - return [_view convertPoint:point fromView:nil]; -} - - (void)sendEvent:(NSEvent *)event { switch (event.type) { - case NSEventTypeLeftMouseDown: { - NSPoint point = [self mousePosition]; - NSInteger index = -1; - if ([_view clickAtPoint: point index:&index]) { - if (index >= 0 && index < _candidates.count) { - _index = index; + case NSEventTypeLeftMouseDown: + case NSEventTypeRightMouseDown: { + NSPoint spot = [_view convertPoint:self.mouseLocationOutsideOfEventStream + fromView:nil]; + NSUInteger cursorIndex = NSNotFound; + if ([_view convertClickSpot:spot toIndex:&cursorIndex]) { + if ((cursorIndex >= 0 && cursorIndex < _candidates.count) || + cursorIndex == NSPageUpFunctionKey || cursorIndex == NSPageDownFunctionKey) { + _index = cursorIndex; + _mouseDown = YES; } } } break; case NSEventTypeLeftMouseUp: { - NSPoint point = [self mousePosition]; - NSInteger index = -1; - if ([_view clickAtPoint: point index:&index]) { - if (index >= 0 && index < _candidates.count && index == _index) { - [_inputController selectCandidate:index]; + NSPoint spot = [_view convertPoint:self.mouseLocationOutsideOfEventStream + fromView:nil]; + NSUInteger cursorIndex = NSNotFound; + if (_mouseDown && [_view convertClickSpot:spot toIndex:&cursorIndex]) { + if (cursorIndex == _index || cursorIndex == _turnPage) { + [_inputController perform:kSELECT onIndex:cursorIndex]; + } + } + _mouseDown = NO; + } break; + case NSEventTypeRightMouseUp: { + NSPoint spot = [_view convertPoint:self.mouseLocationOutsideOfEventStream + fromView:nil]; + NSUInteger cursorIndex = NSNotFound; + if (_mouseDown && [_view convertClickSpot:spot toIndex:&cursorIndex]) { + if (cursorIndex == _index && (cursorIndex >= 0 && cursorIndex < _candidates.count)) { + [_inputController perform:kDELETE onIndex:cursorIndex]; } } + _mouseDown = NO; } break; case NSEventTypeMouseEntered: { self.acceptsMouseMovedEvents = YES; } break; case NSEventTypeMouseExited: { self.acceptsMouseMovedEvents = NO; - if (_cursorIndex != _index) { - [self showPreedit:_preedit selRange:_selRange caretPos:_caretPos candidates:_candidates comments:_comments labels:_labels - highlighted:_index update:NO]; - } } break; case NSEventTypeMouseMoved: { - NSPoint point = [self mousePosition]; - NSInteger index = -1; - if ([_view clickAtPoint: point index:&index]) { - if (index >= 0 && index < _candidates.count && _cursorIndex != index) { - [self showPreedit:_preedit selRange:_selRange caretPos:_caretPos candidates:_candidates comments:_comments labels:_labels - highlighted:index update:NO]; + NSPoint spot = [_view convertPoint:self.mouseLocationOutsideOfEventStream + fromView:nil]; + NSUInteger cursorIndex = NSNotFound; + if ([_view convertClickSpot:spot toIndex:&cursorIndex]) { + if (cursorIndex >= 0 && cursorIndex < _candidates.count && _index != cursorIndex) { + [_inputController perform:kCHOOSE onIndex:cursorIndex]; + _index = cursorIndex; + [self showPreedit:_preedit selRange:_selRange caretPos:_caretPos + candidates:_candidates comments:_comments highlighted:cursorIndex + pageNum:_pageNum lastPage:_lastPage turnPage:NSNotFound update:NO]; + } else if ((cursorIndex == NSPageUpFunctionKey || cursorIndex == NSPageDownFunctionKey) && _turnPage != cursorIndex) { + _turnPage = cursorIndex; + [self showPreedit:_preedit selRange:_selRange caretPos:_caretPos + candidates:_candidates comments:_comments highlighted:_index + pageNum:_pageNum lastPage:_lastPage turnPage:cursorIndex update:NO]; } } } break; + case NSEventTypeLeftMouseDragged: { + _mouseDown = NO; + _maxSize = NSZeroSize; // reset the remember_size references after moving the panel + [self performWindowDragWithEvent:event]; + } break; case NSEventTypeScrollWheel: { + SquirrelTheme *theme = _view.currentTheme; + CGFloat scrollThreshold = [theme.attrs[NSParagraphStyleAttributeName] maximumLineHeight] + [theme.attrs[NSParagraphStyleAttributeName] lineSpacing]; if (event.phase == NSEventPhaseBegan) { - _scrollDirection = NSMakePoint(0, 0); - } else if (event.phase == NSEventPhaseEnded || (event.phase == NSEventPhaseNone && event.momentumPhase != NSEventPhaseNone)) { - if (_scrollDirection.x > 10 && ABS(_scrollDirection.x) > ABS(_scrollDirection.y)) { - if (_view.currentTheme.vertical) { - [self.inputController pageUp:NO]; - } else { - [self.inputController pageUp:YES]; - } - } else if (_scrollDirection.x < -10 && ABS(_scrollDirection.x) > ABS(_scrollDirection.y)) { - if (_view.currentTheme.vertical) { - [self.inputController pageUp:YES]; - } else { - [self.inputController pageUp:NO]; - } - } else if (_scrollDirection.y > 10 && ABS(_scrollDirection.x) < ABS(_scrollDirection.y)) { - [self.inputController pageUp:YES]; - } else if (_scrollDirection.y < -10 && ABS(_scrollDirection.x) < ABS(_scrollDirection.y)) { - [self.inputController pageUp:NO]; + _scrollLocus = NSZeroPoint; + } else if ((event.phase == NSEventPhaseNone || event.momentumPhase == NSEventPhaseNone) && + _scrollLocus.x != NSNotFound && _scrollLocus.y != NSNotFound) { + // determine scrolling direction by confining to sectors within ±30º of any axis + if (ABS(event.scrollingDeltaX) > ABS(event.scrollingDeltaY) * sqrt(3)) { + _scrollLocus.x += event.scrollingDeltaX * (event.hasPreciseScrollingDeltas ? 1 : 10); + } else if (ABS(event.scrollingDeltaY) > ABS(event.scrollingDeltaX) * sqrt(3)) { + _scrollLocus.y += event.scrollingDeltaY * (event.hasPreciseScrollingDeltas ? 1 : 10); } - _scrollDirection = NSMakePoint(0, 0); - } else if (event.phase == NSEventPhaseNone && event.momentumPhase == NSEventPhaseNone) { - if (_scrollTime && [_scrollTime timeIntervalSinceNow] > 1.0) { - _scrollDirection = NSMakePoint(0, 0); + // compare accumulated locus length against threshold and limit paging to max once + if (_scrollLocus.x > scrollThreshold) { + [_inputController perform:kSELECT onIndex:(theme.vertical ? NSPageDownFunctionKey : NSPageUpFunctionKey)]; + _scrollLocus = NSMakePoint(NSNotFound, NSNotFound); + } else if (_scrollLocus.y > scrollThreshold) { + [_inputController perform:kSELECT onIndex:NSPageUpFunctionKey]; + _scrollLocus = NSMakePoint(NSNotFound, NSNotFound); + } else if (_scrollLocus.x < -scrollThreshold) { + [_inputController perform:kSELECT onIndex:(theme.vertical ? NSPageUpFunctionKey : NSPageDownFunctionKey)]; + _scrollLocus = NSMakePoint(NSNotFound, NSNotFound); + } else if (_scrollLocus.y < -scrollThreshold) { + [_inputController perform:kSELECT onIndex:NSPageDownFunctionKey]; + _scrollLocus = NSMakePoint(NSNotFound, NSNotFound); } - _scrollTime = [NSDate now]; - if ((_scrollDirection.y >= 0 && event.scrollingDeltaY > 0) || (_scrollDirection.y <= 0 && event.scrollingDeltaY < 0)) { - _scrollDirection.y += event.scrollingDeltaY; - } else { - _scrollDirection = NSMakePoint(0, 0); - } - if (ABS(_scrollDirection.y) > 10) { - if (_scrollDirection.y > 10) { - [self.inputController pageUp:YES]; - } else if (_scrollDirection.y < -10) { - [self.inputController pageUp:NO]; - } - _scrollDirection = NSMakePoint(0, 0); - } - } else { - _scrollDirection.x += event.scrollingDeltaX; - _scrollDirection.y += event.scrollingDeltaY; } - } + } break; default: break; } @@ -1129,124 +1628,177 @@ - (void)sendEvent:(NSEvent *)event { } - (void)getCurrentScreen { - // get current screen - _screenRect = [NSScreen mainScreen].frame; - NSArray *screens = [NSScreen screens]; - - NSUInteger i; - for (i = 0; i < screens.count; ++i) { - NSRect rect = [screens[i] frame]; - if (NSPointInRect(_position.origin, rect)) { - _screenRect = rect; - break; + _screen = [NSScreen mainScreen]; + NSArray *screens = [NSScreen screens]; + for (NSUInteger i = 0; i < screens.count; ++i) { + if (NSPointInRect(_position.origin, [screens[i] frame])) { + _screen = screens[i]; + return; } } } -- (CGFloat)getMaxTextWidth:(SquirrelTheme *)theme { - NSFont *currentFont = theme.attrs[NSFontAttributeName]; - CGFloat fontScale = currentFont.pointSize / 12; - CGFloat textWidthRatio = MIN(1.0, 1.0 / (theme.vertical ? 4 : 3) + fontScale / 12); - return theme.vertical - ? NSHeight(_screenRect) * textWidthRatio - theme.edgeInset.height * 2 - : NSWidth(_screenRect) * textWidthRatio - theme.edgeInset.width * 2; -} - -// Get the window size, the windows will be the dirtyRect in SquirrelView.drawRect -- (void)show { +- (void)getTextWidthLimit { [self getCurrentScreen]; + NSRect screenRect = _screen.visibleFrame; SquirrelTheme *theme = _view.currentTheme; + CGFloat textWidthRatio = MIN(1.0, 1.0 / (theme.vertical ? 4 : 3) + [theme.attrs[NSFontAttributeName] pointSize] / 144.0); + _textWidthLimit = (theme.vertical ? NSHeight(screenRect) : NSWidth(screenRect)) * textWidthRatio - theme.separatorWidth - theme.edgeInset.width * 2; + if (theme.lineLength > 0) { + _textWidthLimit = MIN(theme.lineLength, _textWidthLimit); + } + if (theme.tabled) { + CGFloat tabInterval = theme.separatorWidth * 2; + _textWidthLimit = floor((_textWidthLimit + theme.separatorWidth) / tabInterval) * tabInterval - theme.separatorWidth; + } + _view.textView.textContainer.size = NSMakeSize(_textWidthLimit, CGFLOAT_MAX); +} - NSAppearance *requestedAppearance = theme.native ? nil : [NSAppearance appearanceNamed:NSAppearanceNameAqua]; - if (self.appearance != requestedAppearance) { - self.appearance = requestedAppearance; +// Get the window size, it will be the dirtyRect in SquirrelView.drawRect +- (void)show { + if (@available(macOS 10.14, *)) { + NSAppearance *requestedAppearance = [NSAppearance appearanceNamed: + (_view.isDark ? NSAppearanceNameDarkAqua : NSAppearanceNameAqua)]; + if (self.appearance != requestedAppearance) { + self.appearance = requestedAppearance; + } } //Break line if the text is too long, based on screen size. - CGFloat textWidth = [self getMaxTextWidth:theme]; - CGFloat maxTextHeight = theme.vertical ? _screenRect.size.width - theme.edgeInset.width * 2 : _screenRect.size.height - theme.edgeInset.height * 2; - _view.textView.textContainer.containerSize = NSMakeSize(textWidth, maxTextHeight); - - NSRect windowRect; - // in vertical mode, the width and height are interchanged + SquirrelTheme *theme = _view.currentTheme; + NSTextContainer *textContainer = _view.textView.textContainer; + NSEdgeInsets insets = _view.insets; + CGFloat textWidthRatio = MIN(1.0, 1.0 / (theme.vertical ? 4 : 3) + [theme.attrs[NSFontAttributeName] pointSize] / 144.0); + NSRect screenRect = _screen.visibleFrame; + CGFloat textHeightLimit = (theme.vertical ? NSWidth(screenRect) : NSHeight(screenRect)) * textWidthRatio - insets.top - insets.bottom; + + // the sweep direction of the client app changes the behavior of adjusting squirrel panel position + BOOL sweepVertical = NSWidth(_position) > NSHeight(_position); NSRect contentRect = _view.contentRect; - if (theme.memorizeSize && ((theme.vertical && NSMidY(_position) / NSHeight(_screenRect) < 0.5) || - (!theme.vertical && NSMinX(_position)+MAX(contentRect.size.width, _maxHeight)+theme.edgeInset.width*2 > NSMaxX(_screenRect)))) { - if (contentRect.size.width >= _maxHeight) { - _maxHeight = contentRect.size.width; - } else { - contentRect.size.width = _maxHeight; - _view.textView.textContainer.containerSize = NSMakeSize(_maxHeight, maxTextHeight); + NSRect maxContentRect = contentRect; + if (theme.lineLength > 0) { // fixed line length (text width) + if (_statusMessage == nil) { // not applicable to status message + maxContentRect.size.width = _textWidthLimit; + } + } + if (theme.rememberSize) { // remember panel size (fix the top leading anchor of the panel in screen coordiantes) + if ((theme.vertical ? (NSMinY(_position) - NSMinY(screenRect) <= NSHeight(screenRect) * textWidthRatio + kOffsetHeight) + : (sweepVertical ? (NSMinX(_position) - NSMinX(screenRect) > NSWidth(screenRect) * textWidthRatio + kOffsetHeight) + : (NSMinX(_position) + MAX(NSWidth(maxContentRect), _maxSize.width) + insets.right > NSMaxX(screenRect)))) && + theme.lineLength == 0) { + if (NSWidth(maxContentRect) >= _maxSize.width) { + _maxSize.width = NSWidth(maxContentRect); + } else { + maxContentRect.size.width = _maxSize.width; + [textContainer setSize:NSMakeSize(_maxSize.width, textHeightLimit)]; + } + } + if (theme.vertical ? (NSMinX(_position) - NSMinX(screenRect) < MAX(NSHeight(maxContentRect), _maxSize.height) + insets.top + insets.bottom + (sweepVertical ? kOffsetHeight : 0)) + : (NSMinY(_position) - NSMinY(screenRect) < MAX(NSHeight(maxContentRect), _maxSize.height) + insets.top + insets.bottom + (sweepVertical ? 0 : kOffsetHeight))) { + if (NSHeight(maxContentRect) >= _maxSize.height) { + _maxSize.height = NSHeight(maxContentRect); + } else { + maxContentRect.size.height = _maxSize.height; + } } } + _initPosition |= NSIntersectsRect(self.frame, _position); + NSRect windowRect; if (theme.vertical) { - windowRect.size = NSMakeSize(contentRect.size.height + theme.edgeInset.height * 2, - contentRect.size.width + theme.edgeInset.width * 2); - // To avoid jumping up and down while typing, use the lower screen when typing on upper, and vice versa - if (NSMidY(_position) / NSHeight(_screenRect) >= 0.5) { - windowRect.origin.y = NSMinY(_position) - kOffsetHeight - NSHeight(windowRect); + windowRect.size = NSMakeSize(NSHeight(maxContentRect) + insets.top + insets.bottom, + NSWidth(maxContentRect) + insets.left + insets.right); + if (_initPosition ) { + // To avoid jumping up and down while typing, use the lower screen when typing on upper, and vice versa + if (NSMinY(_position) - NSMinY(screenRect) > NSHeight(screenRect) * textWidthRatio + kOffsetHeight) { + windowRect.origin.y = NSMinY(_position) + (sweepVertical ? insets.left : -kOffsetHeight) - NSHeight(windowRect); + } else { + windowRect.origin.y = NSMaxY(_position) + (sweepVertical ? 0 : kOffsetHeight); + } + // Make the right edge of candidate block fixed at the left of cursor + windowRect.origin.x = NSMinX(_position) - (sweepVertical ? kOffsetHeight : 0) - NSWidth(windowRect); + if (!sweepVertical && _view.preeditRange.length > 0) { + NSRect preeditRect = [_view contentRectForRange:_view.preeditRange]; + windowRect.origin.x += round(NSHeight(preeditRect) + [theme.preeditAttrs[NSFontAttributeName] descender] + insets.top); + } } else { - windowRect.origin.y = NSMaxY(_position) + kOffsetHeight; - } - // Make the first candidate fixed at the left of cursor - windowRect.origin.x = NSMinX(_position) - windowRect.size.width - kOffsetHeight; - if (_view.preeditRange.length > 0) { - NSSize preeditSize = [_view contentRectForRange:[_view convertRange:_view.preeditRange]].size; - windowRect.origin.x += preeditSize.height + theme.edgeInset.width; + windowRect.origin.x = NSMaxX(self.frame) - NSWidth(windowRect); + windowRect.origin.y = NSMaxY(self.frame) - NSHeight(windowRect); } } else { - windowRect.size = NSMakeSize(contentRect.size.width + theme.edgeInset.width * 2, - contentRect.size.height + theme.edgeInset.height * 2); - windowRect.origin = NSMakePoint(NSMinX(_position), - NSMinY(_position) - kOffsetHeight - NSHeight(windowRect)); + windowRect.size = NSMakeSize(NSWidth(maxContentRect) + insets.left + insets.right, + NSHeight(maxContentRect) + insets.top + insets.bottom); + if (_initPosition) { + if (sweepVertical) { + // To avoid jumping left and right while typing, use the lefter screen when typing on righter, and vice versa + if (NSMinX(_position) - NSMinX(screenRect) > NSWidth(screenRect) * textWidthRatio + kOffsetHeight) { + windowRect.origin.x = NSMinX(_position) - kOffsetHeight - NSWidth(windowRect); + } else { + windowRect.origin.x = NSMaxX(_position) + kOffsetHeight; + } + windowRect.origin.y = NSMinY(_position) - NSHeight(windowRect); + } else { + windowRect.origin = NSMakePoint(NSMinX(_position) - insets.left, + NSMinY(_position) - kOffsetHeight - NSHeight(windowRect)); + } + } else { + windowRect.origin = NSMakePoint(NSMinX(self.frame), NSMaxY(self.frame) - NSHeight(windowRect)); + } } - if (NSMaxX(windowRect) > NSMaxX(_screenRect)) { - windowRect.origin.x = NSMaxX(_screenRect) - NSWidth(windowRect); + if (NSMaxX(windowRect) > NSMaxX(screenRect)) { + windowRect.origin.x = (_initPosition && sweepVertical ? NSMinX(_position) - kOffsetHeight : NSMaxX(screenRect)) - NSWidth(windowRect); } - if (NSMinX(windowRect) < NSMinX(_screenRect)) { - windowRect.origin.x = NSMinX(_screenRect); + if (NSMinX(windowRect) < NSMinX(screenRect)) { + windowRect.origin.x = _initPosition && sweepVertical ? NSMaxX(_position) + kOffsetHeight : NSMinX(screenRect); } - if (NSMinY(windowRect) < NSMinY(_screenRect)) { - if (theme.vertical) { - windowRect.origin.y = NSMinY(_screenRect); - } else { - windowRect.origin.y = NSMaxY(_position) + kOffsetHeight; - } + if (NSMinY(windowRect) < NSMinY(screenRect)) { + windowRect.origin.y = _initPosition && !sweepVertical ? NSMaxY(_position) + kOffsetHeight : NSMinY(screenRect); } - if (NSMaxY(windowRect) > NSMaxY(_screenRect)) { - windowRect.origin.y = NSMaxY(_screenRect) - NSHeight(windowRect); + if (NSMaxY(windowRect) > NSMaxY(screenRect)) { + windowRect.origin.y = (_initPosition && !sweepVertical ? NSMinY(_position) - kOffsetHeight : NSMaxY(screenRect)) - NSHeight(windowRect); } - if (NSMinY(windowRect) < NSMinY(_screenRect)) { - windowRect.origin.y = NSMinY(_screenRect); + + if (theme.vertical) { + windowRect.origin.x += round(NSHeight(maxContentRect) - NSHeight(contentRect)); + windowRect.size.width -= round(NSHeight(maxContentRect) - NSHeight(contentRect)); + } else { + windowRect.origin.y += round(NSHeight(maxContentRect) - NSHeight(contentRect)); + windowRect.size.height -= round(NSHeight(maxContentRect) - NSHeight(contentRect)); } - [self setFrame:windowRect display:YES]; + // rotate the view, the core in vertical mode! if (theme.vertical) { - self.contentView.boundsRotation = -90; - _view.textView.boundsRotation = 0; - [self.contentView setBoundsOrigin:NSMakePoint(0, windowRect.size.width)]; - [_view.textView setBoundsOrigin:NSMakePoint(0, 0)]; - } else { - self.contentView.boundsRotation = 0; - _view.textView.boundsRotation = 0; - [self.contentView setBoundsOrigin:NSMakePoint(0, 0)]; - [_view.textView setBoundsOrigin:NSMakePoint(0, 0)]; - } - BOOL translucency = theme.translucency; - [_view setFrame:self.contentView.bounds]; - [_view.textView setFrame:self.contentView.bounds]; - if (translucency) { - [_back setFrame:self.contentView.bounds]; - _back.appearance = NSApp.effectiveAppearance; - [_back setHidden:NO]; + [self setFrame:[_screen backingAlignedRect:windowRect options:NSAlignMaxXOutward | NSAlignMaxYInward | NSAlignWidthNearest | NSAlignHeightNearest] display:YES]; + [self.contentView setBoundsRotation:-90.0]; + [self.contentView setBoundsOrigin:NSMakePoint(0.0, NSWidth(windowRect))]; } else { - [_back setHidden:YES]; + [self setFrame:[_screen backingAlignedRect:windowRect options:NSAlignMinXInward | NSAlignMaxYInward | NSAlignWidthNearest | NSAlignHeightNearest] display:YES]; + [self.contentView setBoundsRotation:0.0]; + [self.contentView setBoundsOrigin:NSZeroPoint]; + } + NSRect frameRect = self.contentView.bounds; + NSRect textFrameRect = NSMakeRect(NSMinX(frameRect) + insets.left, NSMinY(frameRect) + insets.bottom, + NSWidth(frameRect) - insets.left - insets.right, + NSHeight(frameRect) - insets.top - insets.bottom); + [_view.textView setBoundsRotation:0.0]; + [_view setBoundsOrigin:NSZeroPoint]; + [_view.textView setBoundsOrigin:NSZeroPoint]; + [_view setFrame:frameRect]; + [_view.textView setFrame:textFrameRect]; + + if (@available(macOS 10.14, *)) { + if (theme.translucency > 0) { + [_back setFrame:frameRect]; + [_back setAppearance:NSApp.effectiveAppearance]; + [_back setHidden:NO]; + } else { + [_back setHidden:YES]; + } } - self.alphaValue = theme.alpha; - [self invalidateShadow]; + [self setAlphaValue:theme.alpha]; [self orderFront:nil]; + _initPosition = NO; // voila ! } @@ -1256,32 +1808,172 @@ - (void)hide { _statusTimer = nil; } [self orderOut:nil]; - _maxHeight = 0; + _maxSize = NSZeroSize; + _initPosition = YES; +} + +- (void)setLayoutForRange:(NSRange)charRange + withReferenceFont:(NSFont *)refFont + paragraphStyle:(NSParagraphStyle *)style { + BOOL verticalLayout = _view.currentTheme.vertical; + CGFloat refFontHeight = refFont.ascender - refFont.descender; + CGFloat lineHeight = MAX(style.lineHeightMultiple > 0 ? refFontHeight * style.lineHeightMultiple : refFontHeight, + style.minimumLineHeight); + lineHeight = style.maximumLineHeight > 0 ? MIN(lineHeight, style.maximumLineHeight) : lineHeight; + if (@available(macOS 12.0, *)) { + NSUInteger i = charRange.location; + NSRange runRange = NSMakeRange(i, 0); + while (i < NSMaxRange(charRange)) { + NSDictionary *attrs = [_view.textStorage attributesAtIndex:i + longestEffectiveRange:&runRange inRange:charRange]; + NSNumber *baselineOffset = attrs[NSBaselineOffsetAttributeName]; + CGFloat offset = (baselineOffset ? baselineOffset.doubleValue : 0.0) + lineHeight / 2 - refFontHeight / 2; + NSNumber *superscript = attrs[NSSuperscriptAttributeName]; + if (verticalLayout) { + CTRubyAnnotationRef rubyAnnotation = (__bridge CTRubyAnnotationRef)(attrs[CFBridgingRelease(kCTRubyAnnotationAttributeName)]); + offset = rubyAnnotation ? 0.0 : offset; + } + if (superscript) { + NSFont *runFont = verticalLayout ? [attrs[NSFontAttributeName] verticalFont] : attrs[NSFontAttributeName]; + offset += superscript.integerValue == 1 ? runFont.descender / 3 : runFont.ascender / 3; + } + [_view.textStorage addAttribute:NSBaselineOffsetAttributeName + value:@(offset) range:runRange]; + i = NSMaxRange(runRange); + } + } else { + NSLayoutManager *layoutManager = _view.textView.layoutManager; + NSRange glyphRange = [layoutManager glyphRangeForCharacterRange:charRange actualCharacterRange:NULL]; + NSUInteger i = glyphRange.location; + NSRange lineRange = NSMakeRange(i, 0); + while (i < NSMaxRange(glyphRange)) { + NSRect rect = [layoutManager lineFragmentRectForGlyphAtIndex:i effectiveRange:&lineRange]; + NSRect usedRect = [layoutManager lineFragmentUsedRectForGlyphAtIndex:i effectiveRange:NULL]; + CGFloat alignment = usedRect.origin.y - rect.origin.y + (verticalLayout ? lineHeight / 2 : lineHeight / 2 + refFont.xHeight / 2); + // typesetting glyphs + NSUInteger j = lineRange.location; + while (j < NSMaxRange(lineRange)) { + NSPoint runGlyphPosition = [layoutManager locationForGlyphAtIndex:j]; + NSUInteger runCharLocation = [layoutManager characterIndexForGlyphAtIndex:j]; + NSRange runRange = [layoutManager rangeOfNominallySpacedGlyphsContainingIndex:j]; + NSDictionary *attrs = [_view.textStorage attributesAtIndex:runCharLocation effectiveRange:NULL]; + NSFont *runFont = attrs[NSFontAttributeName]; + NSFont *systemFont = [NSFont systemFontOfSize:runFont.pointSize]; + NSString *baselineClass = attrs[CFBridgingRelease(kCTBaselineClassAttributeName)]; + NSNumber *baselineOffset = attrs[NSBaselineOffsetAttributeName]; + CGFloat offset = baselineOffset ? baselineOffset.doubleValue : 0.0; + NSNumber *superscript = attrs[NSSuperscriptAttributeName]; + if (verticalLayout) { + NSNumber *verticalGlyph = attrs[NSVerticalGlyphFormAttributeName]; + if (verticalGlyph ? verticalGlyph.boolValue : YES) { + runFont = runFont.verticalFont; + systemFont = systemFont.verticalFont; + } + } + CGFloat runFontHeight = runFont.ascender - runFont.descender; + CGFloat systemFontHeight = systemFont.ascender - systemFont.descender; + if (superscript) { + offset += superscript.integerValue == 1 ? refFont.ascender / 3 : refFont.descender / 3; + } + if (verticalLayout) { + if ([baselineClass isEqualToString:CFBridgingRelease(kCTBaselineClassRoman)] || !runFont.vertical) { + runGlyphPosition.y = alignment - offset + refFont.xHeight / 2; + } else { + runGlyphPosition.y = alignment - offset + ([runFont.fontName isEqualToString:@"AppleColorEmoji"] ? (runFontHeight - systemFontHeight) / 3 : 0.0); + runGlyphPosition.x += [runFont.fontName isEqualToString:@"AppleColorEmoji"] ? (runFontHeight - systemFontHeight) * 2 / 3 : 0.0; + } + } else { + runGlyphPosition.y = alignment - offset + ([baselineClass isEqualToString:CFBridgingRelease(kCTBaselineClassIdeographicCentered)] ? runFont.xHeight / 2 - refFont.xHeight / 2 : 0.0); + } + [layoutManager setLocation:runGlyphPosition forStartOfGlyphRange:runRange]; + j = NSMaxRange(runRange); + } + i = NSMaxRange(lineRange); + } + } +} + +- (BOOL)shouldBreakLineWithRange:(NSRange)range { + [_view.textStorage fixFontAttributeInRange:range]; + if (@available(macOS 12.0, *)) { + NSTextRange *textRange = [_view getTextRangeFromRange:range]; + NSUInteger __block lineCount = 0; + [_view.textView.textLayoutManager + enumerateTextSegmentsInRange:textRange + type:NSTextLayoutManagerSegmentTypeStandard + options:NSTextLayoutManagerSegmentOptionsRangeNotRequired + usingBlock:^(NSTextRange *segRange, CGRect segFrame, CGFloat baseline, NSTextContainer *textContainer) { + ++lineCount; + return YES; + }]; + return lineCount > 1; + } else { + NSRange glyphRange = [_view.textView.layoutManager glyphRangeForCharacterRange:range + actualCharacterRange:NULL]; + NSUInteger loc = glyphRange.location; + NSRange lineRange = NSMakeRange(loc, 0); + NSUInteger lineCount = 0; + while (loc < NSMaxRange(glyphRange)) { + [_view.textView.layoutManager lineFragmentUsedRectForGlyphAtIndex:loc + effectiveRange:&lineRange]; + ++lineCount; + loc = NSMaxRange(lineRange); + } + return lineCount > 1; + } +} + +- (BOOL)shouldUseTabsInRange:(NSRange)range maxLineLength:(CGFloat *)maxLineLength { + [_view.textStorage fixFontAttributeInRange:range]; + if (@available(macOS 12.0, *)) { + NSTextRange *textRange = [_view getTextRangeFromRange:range]; + CGFloat __block rangeEdge; + [_view.textView.textLayoutManager + enumerateTextSegmentsInRange:textRange + type:NSTextLayoutManagerSegmentTypeStandard + options:NSTextLayoutManagerSegmentOptionsRangeNotRequired + usingBlock:^(NSTextRange *segRange, CGRect segFrame, CGFloat baseline, NSTextContainer *textContainer) { + rangeEdge = NSMaxX(segFrame); + return YES; + }]; + [_view.textView.textLayoutManager ensureLayoutForRange:_view.textView.textContentStorage.documentRange]; + NSRect container = [_view.textView.textLayoutManager usageBoundsForTextContainer]; + *maxLineLength = MAX(MIN(_textWidthLimit, NSWidth(container)), _maxSize.width); + return NSMinX(container) + *maxLineLength > rangeEdge; + } else { + NSUInteger glyphIndex = [_view.textView.layoutManager glyphIndexForCharacterAtIndex:range.location]; + CGFloat rangeEdge = NSMaxX([_view.textView.layoutManager lineFragmentUsedRectForGlyphAtIndex:glyphIndex effectiveRange:NULL]); + NSRect container = [_view.textView.layoutManager usedRectForTextContainer:_view.textView.textContainer]; + *maxLineLength = MAX(MIN(_textWidthLimit, NSWidth(container)), _maxSize.width); + return NSMinX(container) + *maxLineLength > rangeEdge; + } } // Main function to add attributes to text output from librime - (void)showPreedit:(NSString *)preedit selRange:(NSRange)selRange caretPos:(NSUInteger)caretPos - candidates:(NSArray *)candidates - comments:(NSArray *)comments - labels:(NSArray *)labels + candidates:(NSArray *)candidates + comments:(NSArray *)comments highlighted:(NSUInteger)index + pageNum:(NSUInteger)pageNum + lastPage:(BOOL)lastPage + turnPage:(NSUInteger)turnPage update:(BOOL)update { - if (update) { _preedit = preedit; _selRange = selRange; _caretPos = caretPos; _candidates = candidates; _comments = comments; - _labels = labels; _index = index; + _pageNum = pageNum; + _lastPage = lastPage; } - _cursorIndex = index; - + + [self getTextWidthLimit]; NSUInteger numCandidates = candidates.count; - if (numCandidates || (preedit && preedit.length)) { + if (numCandidates > 0 || (preedit && preedit.length)) { _statusMessage = nil; if (_statusTimer) { [_statusTimer invalidate]; @@ -1297,202 +1989,229 @@ - (void)showPreedit:(NSString *)preedit return; } - SquirrelTheme *theme = _view.currentTheme; - [self getCurrentScreen]; - CGFloat maxTextWidth = [self getMaxTextWidth:theme]; + if (numCandidates == 0) { + _index = index = NSNotFound; + } + _turnPage = turnPage; + if (_turnPage == NSPageUpFunctionKey) { + turnPage = pageNum ? NSPageUpFunctionKey : NSBeginFunctionKey; + } else if (_turnPage == NSPageDownFunctionKey) { + turnPage = lastPage ? NSEndFunctionKey : NSPageDownFunctionKey; + } - NSMutableAttributedString *text = [[NSMutableAttributedString alloc] init]; - NSUInteger candidateStartPos = 0; + SquirrelTheme *theme = _view.currentTheme; + _view.textView.layoutOrientation = theme.vertical + ? NSTextLayoutOrientationVertical : NSTextLayoutOrientationHorizontal; + if (theme.lineLength > 0) { + _maxSize.width = MIN(theme.lineLength, _textWidthLimit); + } + NSEdgeInsets insets = NSEdgeInsetsMake(theme.edgeInset.height + theme.linespace / 2, + theme.edgeInset.width + theme.separatorWidth / 2, + theme.edgeInset.height + theme.linespace / 2, + theme.edgeInset.width + theme.separatorWidth / 2); + + NSTextStorage *text = _view.textStorage; + [text setAttributedString:[[NSMutableAttributedString alloc] init]]; NSRange preeditRange = NSMakeRange(NSNotFound, 0); NSRange highlightedPreeditRange = NSMakeRange(NSNotFound, 0); + NSMutableArray *candidateRanges = [[NSMutableArray alloc] initWithCapacity:numCandidates]; + NSRange pagingRange = NSMakeRange(NSNotFound, 0); + NSMutableParagraphStyle *paragraphStyleCandidate; + // preedit if (preedit) { - NSMutableAttributedString *line = [[NSMutableAttributedString alloc] init]; + NSMutableAttributedString *preeditLine = [[NSMutableAttributedString alloc] init]; if (selRange.location > 0) { - [line appendAttributedString: - [[NSAttributedString alloc] - initWithString:[preedit substringToIndex:selRange.location] - attributes:theme.preeditAttrs]]; + [preeditLine appendAttributedString:[[NSAttributedString alloc] + initWithString:[preedit substringToIndex:selRange.location] + attributes:theme.preeditAttrs]]; } if (selRange.length > 0) { - NSUInteger highlightedPreeditStart = line.length; - [line appendAttributedString: - [[NSAttributedString alloc] - initWithString:[preedit substringWithRange:selRange] - attributes:theme.preeditHighlightedAttrs]]; - highlightedPreeditRange = NSMakeRange(highlightedPreeditStart, line.length - highlightedPreeditStart); + NSUInteger highlightedPreeditStart = preeditLine.length; + [preeditLine appendAttributedString:[[NSAttributedString alloc] + initWithString:[preedit substringWithRange:selRange] + attributes:theme.preeditHighlightedAttrs]]; + highlightedPreeditRange = NSMakeRange(highlightedPreeditStart, + preeditLine.length - highlightedPreeditStart); } if (NSMaxRange(selRange) < preedit.length) { - [line - appendAttributedString: - [[NSAttributedString alloc] - initWithString:[preedit substringFromIndex:NSMaxRange(selRange)] - attributes:theme.preeditAttrs]]; - } - [text appendAttributedString:line]; - - [text addAttribute:NSParagraphStyleAttributeName - value:theme.preeditParagraphStyle - range:NSMakeRange(0, text.length)]; - - preeditRange = NSMakeRange(0, text.length); - if (numCandidates) { - [text appendAttributedString:[[NSAttributedString alloc] - initWithString:@"\n" - attributes:theme.preeditAttrs]]; - } - candidateStartPos = text.length; - } - - NSMutableArray *candidateRanges = [[NSMutableArray alloc] init]; - // candidates - NSUInteger i; - for (i = 0; i < candidates.count; ++i) { - NSMutableAttributedString *line = [[NSMutableAttributedString alloc] init]; - - NSDictionary *attrs; - NSDictionary *labelAttrs; - NSDictionary *commentAttrs; - if (i == index) { - attrs = theme.highlightedAttrs; - labelAttrs = theme.labelHighlightedAttrs; - commentAttrs = theme.commentHighlightedAttrs; + [preeditLine appendAttributedString:[[NSAttributedString alloc] + initWithString:[preedit substringFromIndex:NSMaxRange(selRange)] + attributes:theme.preeditAttrs]]; + } + // force caret to be rendered horizontally in vertical layout + if (caretPos != NSNotFound) { + [preeditLine addAttributes:@{NSVerticalGlyphFormAttributeName: @NO} + range:NSMakeRange(caretPos - (caretPos < NSMaxRange(selRange)), 1)]; + } + preeditRange = NSMakeRange(0, preeditLine.length); + [text appendAttributedString:preeditLine]; + + insets.top = theme.edgeInset.height; + if (numCandidates > 0) { + [text appendAttributedString:[[NSAttributedString alloc] initWithString:@"\n" attributes:theme.preeditAttrs]]; } else { - attrs = theme.attrs; - labelAttrs = theme.labelAttrs; - commentAttrs = theme.commentAttrs; - } - - CGFloat labelWidth = 0.0; - - if (theme.prefixLabelFormat != nil) { - NSString *labelString; - if (labels.count > 1 && i < labels.count) { - NSString *labelFormat = [theme.prefixLabelFormat stringByReplacingOccurrencesOfString:@"%c" withString:@"%@"]; - labelString = [NSString stringWithFormat:labelFormat, labels[i]]; - } else if (labels.count == 1 && i < [labels[0] length]) { - // custom: A. B. C... - char labelCharacter = [labels[0] characterAtIndex:i]; - labelString = [NSString stringWithFormat:theme.prefixLabelFormat, labelCharacter]; - } else { - // default: 1. 2. 3... - NSString *labelFormat = [theme.prefixLabelFormat stringByReplacingOccurrencesOfString:@"%c" withString:@"%lu"]; - labelString = [NSString stringWithFormat:labelFormat, i+1]; - } + insets.bottom = theme.edgeInset.height; + goto typesetter; + } + } - [line appendAttributedString: - [[NSAttributedString alloc] - initWithString:labelString - attributes:labelAttrs]]; - // get the label size for indent - if (!theme.linear) { - NSMutableAttributedString *str = [line mutableCopy]; - if (theme.vertical) { - [str addAttribute:NSVerticalGlyphFormAttributeName value:@(1) range:NSMakeRange(0, str.length)]; - } - labelWidth = [str boundingRectWithSize:NSZeroSize options:NSStringDrawingUsesLineFragmentOrigin].size.width; - } + // candidate items + NSUInteger candidateBlockStart = text.length; + NSUInteger lineStart = text.length; + if (theme.linear) { + paragraphStyleCandidate = [theme.paragraphStyle copy]; + } + CGFloat tabInterval = theme.separatorWidth * 2; + for (NSUInteger idx = 0; idx < candidates.count; ++idx) { + // attributed labels are already included in candidateFormats + NSMutableAttributedString *item = (idx == index) ? [theme.candidateHighlightedFormats[idx] mutableCopy] : [theme.candidateFormats[idx] mutableCopy]; + NSRange candidateRange = [item.string rangeOfString:@"%@"]; + // get the label size for indent + CGFloat labelWidth = theme.linear ? 0.0 : ceil([item attributedSubstringFromRange:NSMakeRange(0, candidateRange.location)].size.width); + + [item replaceCharactersInRange:candidateRange withString:candidates[idx]]; + + NSRange commentRange = [item.string rangeOfString:kTipSpecifier]; + if (idx < comments.count && [comments[idx] length] != 0) { + [item replaceCharactersInRange:commentRange withString:[@" " stringByAppendingString:comments[idx]]]; + } else { + [item deleteCharactersInRange:commentRange]; } - NSUInteger candidateStart = line.length; - NSString *candidate = candidates[i]; - NSAttributedString *candidateAttributedString = [[NSAttributedString alloc] - initWithString:candidate - attributes:attrs]; - CGFloat candidateWidth = [candidateAttributedString boundingRectWithSize:NSZeroSize options:NSStringDrawingUsesLineFragmentOrigin].size.width; - if (candidateWidth <= maxTextWidth * 0.2) { - // Unicode Word Joiner - candidateAttributedString = insert(@"\u2060", candidateAttributedString); - } - - [line appendAttributedString:candidateAttributedString]; - - // Use left-to-right marks to prevent right-to-left text from changing the - // layout of non-candidate text. - [line addAttribute:NSWritingDirectionAttributeName value:@[@0] range:NSMakeRange(candidateStart, line.length-candidateStart)]; - - if (theme.suffixLabelFormat != nil) { - NSString *labelString; - if (labels.count > 1 && i < labels.count) { - NSString *labelFormat = [theme.suffixLabelFormat stringByReplacingOccurrencesOfString:@"%c" withString:@"%@"]; - labelString = [NSString stringWithFormat:labelFormat, labels[i]]; - } else if (labels.count == 1 && i < [labels[0] length]) { - // custom: A. B. C... - char labelCharacter = [labels[0] characterAtIndex:i]; - labelString = [NSString stringWithFormat:theme.suffixLabelFormat, labelCharacter]; - } else { - // default: 1. 2. 3... - NSString *labelFormat = [theme.suffixLabelFormat stringByReplacingOccurrencesOfString:@"%c" withString:@"%lu"]; - labelString = [NSString stringWithFormat:labelFormat, i+1]; + [item formatMarkDown]; + [item annotateRuby]; + if (!theme.linear) { + paragraphStyleCandidate = [theme.paragraphStyle mutableCopy]; + paragraphStyleCandidate.headIndent = labelWidth; + } + [item addAttribute:NSParagraphStyleAttributeName + value:paragraphStyleCandidate + range:NSMakeRange(0, item.length)]; + + // determine if the line is too wide and line break is needed, based on screen size. + if (lineStart != text.length) { + NSUInteger separatorStart = text.length; + NSMutableAttributedString *separator = [[NSMutableAttributedString alloc] initWithString:theme.linear ? (theme.tabled ? [kFullWidthSpace stringByAppendingString:@"\t"] : kFullWidthSpace) : @"\n" attributes:theme.commentAttrs]; + if (theme.tabled) { + CGFloat widthInTabs = (ceil([text attributedSubstringFromRange:candidateRanges.lastObject.rangeValue].size.width) + theme.separatorWidth) / tabInterval; + NSUInteger numPaddingTabs = pow(2, ceil(log2(widthInTabs))) - ceil(widthInTabs); + [separator replaceCharactersInRange:NSMakeRange(2, 0) withString:[@"\t" stringByPaddingToLength:numPaddingTabs withString:@"\t" startingAtIndex:0]]; } - [line appendAttributedString: - [[NSAttributedString alloc] - initWithString:labelString - attributes:labelAttrs]]; - } - - if (i < comments.count && [comments[i] length] != 0) { - CGFloat candidateAndLabelWidth = [line boundingRectWithSize:NSZeroSize options:NSStringDrawingUsesLineFragmentOrigin].size.width; - NSString *comment = comments[i]; - NSAttributedString *commentAttributedString = [[NSAttributedString alloc] - initWithString:comment - attributes:commentAttrs]; - CGFloat commentWidth = [commentAttributedString boundingRectWithSize:NSZeroSize options:NSStringDrawingUsesLineFragmentOrigin].size.width; - if (commentWidth <= maxTextWidth * 0.2) { - // Unicode Word Joiner - commentAttributedString = insert(@"\u2060", commentAttributedString); + [separator addAttribute:NSVerticalGlyphFormAttributeName value:@(NO) + range:NSMakeRange(0, separator.length)]; + NSRange separatorRange = NSMakeRange(separatorStart, separator.length); + [text appendAttributedString:separator]; + [text appendAttributedString:item]; + if (theme.linear && (ceil(item.size.width) > _textWidthLimit || [self shouldBreakLineWithRange:NSMakeRange(lineStart, text.length - lineStart)])) { + [text replaceCharactersInRange:separatorRange withString:theme.tabled ? [kFullWidthSpace stringByAppendingString:@"\n"] : @"\n"]; + lineStart = separatorStart + (theme.tabled ? 2 : 1); } - - NSString *commentSeparator; - if (candidateAndLabelWidth + commentWidth <= maxTextWidth * 0.3) { - // Non-Breaking White Space - commentSeparator = @"\u00A0"; - } else { - commentSeparator = @" "; + } else { // at the start of a new line, no need to determine line break + [text appendAttributedString:item]; + } + // for linear layout, middle-truncate candidates that are longer than one line + if (theme.linear && ceil(item.size.width) > _textWidthLimit) { + if (idx < numCandidates - 1 || theme.showPaging) { + [text appendAttributedString:[[NSAttributedString alloc] initWithString:@"\n" attributes:theme.commentAttrs]]; } - [line appendAttributedString:[[NSAttributedString alloc] - initWithString:commentSeparator - attributes:commentAttrs]]; - [line appendAttributedString:commentAttributedString]; + NSMutableParagraphStyle *paragraphStyleTruncating = [paragraphStyleCandidate mutableCopy]; + paragraphStyleTruncating.lineBreakMode = NSLineBreakByTruncatingMiddle; + [text addAttribute:NSParagraphStyleAttributeName value:paragraphStyleTruncating range:NSMakeRange(lineStart, item.length)]; + [candidateRanges addObject:[NSValue valueWithRange:NSMakeRange(lineStart, text.length - lineStart - 1)]]; + lineStart = text.length; + } else { + [candidateRanges addObject:[NSValue valueWithRange:NSMakeRange(text.length - item.length, item.length)]]; } + } - NSAttributedString *separator = [[NSMutableAttributedString alloc] - initWithString:(theme.linear ? @" " : @"\n") - attributes:attrs]; - - NSMutableAttributedString *str = [separator mutableCopy]; - if (theme.vertical) { - [str addAttribute:NSVerticalGlyphFormAttributeName value:@(1) range:NSMakeRange(0, str.length)]; + // paging indication + if (theme.showPaging) { + NSMutableAttributedString *paging = [[NSMutableAttributedString alloc] + initWithAttributedString:(pageNum > 0 ? theme.symbolBackFill : theme.symbolBackStroke)]; + [paging appendAttributedString:[[NSAttributedString alloc] + initWithString:[NSString stringWithFormat:@" %lu ", pageNum + 1] attributes:theme.pagingAttrs]]; + [paging appendAttributedString:[[NSAttributedString alloc] + initWithAttributedString:(lastPage ? theme.symbolForwardStroke : theme.symbolForwardFill)]]; + if (_turnPage == NSPageUpFunctionKey) { + [paging addAttributes:theme.pagingHighlightedAttrs range:NSMakeRange(0, 1)]; + } else if (_turnPage == NSPageDownFunctionKey) { + [paging addAttributes:theme.pagingHighlightedAttrs range:NSMakeRange(paging.length - 1, 1)]; } - _view.seperatorWidth = [str boundingRectWithSize:NSZeroSize options:0].size.width; - NSMutableParagraphStyle *paragraphStyleCandidate = [theme.paragraphStyle mutableCopy]; - if (i == 0) { - paragraphStyleCandidate.paragraphSpacingBefore = theme.preeditLinespace / 2 + theme.hilitedCornerRadius / 2; - } else { - [text appendAttributedString:separator]; - } + [text appendAttributedString:[[NSAttributedString alloc] initWithString:theme.linear ? (theme.tabled ? [kFullWidthSpace stringByAppendingString:@"\t"] : kFullWidthSpace) : @"\n" attributes:theme.commentAttrs]]; + NSUInteger pagingStart = text.length; + CGFloat maxLineLength; + [text appendAttributedString:paging]; if (theme.linear) { - paragraphStyleCandidate.lineSpacing = theme.linespace; + if ([self shouldBreakLineWithRange:NSMakeRange(lineStart, text.length - lineStart)]) { + [text replaceCharactersInRange:NSMakeRange(pagingStart - 1, 1) withString:theme.tabled ? @"\n\t" : [@"\n" stringByAppendingString:kFullWidthSpace]]; + lineStart = pagingStart; + pagingStart += 1; + } + if ([self shouldUseTabsInRange:NSMakeRange(pagingStart, paging.length) maxLineLength:&maxLineLength]) { + paragraphStyleCandidate = [theme.paragraphStyle mutableCopy]; + if (theme.tabled) { + maxLineLength = ceil(maxLineLength / tabInterval) * tabInterval - theme.separatorWidth; + } else { + [text replaceCharactersInRange:NSMakeRange(pagingStart - 1, 1) withString:@"\t"]; + } + CGFloat candidateEndPosition = ceil([text attributedSubstringFromRange:NSMakeRange(lineStart, pagingStart - 1 - lineStart)].size.width); + NSMutableArray *tabStops = [[NSMutableArray alloc] init]; + for (NSUInteger i = 1; tabInterval * i < candidateEndPosition; ++i) { + [tabStops addObject:[[NSTextTab alloc] initWithType:NSLeftTabStopType location:tabInterval * i]]; + } + [tabStops addObject:[[NSTextTab alloc] initWithType:NSRightTabStopType location:maxLineLength]]; + paragraphStyleCandidate.tabStops = tabStops; + } + [text addAttribute:NSParagraphStyleAttributeName + value:paragraphStyleCandidate + range:NSMakeRange(lineStart, text.length - lineStart)]; + } else { + NSMutableParagraphStyle *paragraphStylePaging = [theme.pagingParagraphStyle mutableCopy]; + if ([self shouldUseTabsInRange:NSMakeRange(pagingStart, paging.length) maxLineLength:&maxLineLength]) { + [text replaceCharactersInRange:NSMakeRange(pagingStart + 1, 1) withString:@"\t"]; + [text replaceCharactersInRange:NSMakeRange(pagingStart + paging.length - 2, 1) withString:@"\t"]; + paragraphStylePaging.tabStops = @[[[NSTextTab alloc] initWithType:NSCenterTabStopType location:maxLineLength / 2], + [[NSTextTab alloc] initWithType:NSRightTabStopType location:maxLineLength]]; + } + [text addAttribute:NSParagraphStyleAttributeName + value:paragraphStylePaging + range:NSMakeRange(pagingStart, paging.length)]; + insets.bottom = theme.edgeInset.height; } - paragraphStyleCandidate.headIndent = labelWidth; - [line addAttribute:NSParagraphStyleAttributeName - value:paragraphStyleCandidate - range:NSMakeRange(0, line.length)]; + pagingRange = NSMakeRange(text.length - paging.length, paging.length); + } - NSRange candidateRange = NSMakeRange(text.length, line.length); - [candidateRanges addObject: [NSValue valueWithRange:candidateRange]]; - [text appendAttributedString:line]; +typesetter: + [text ensureAttributesAreFixedInRange:NSMakeRange(0, text.length)]; + if (preedit) { + [self setLayoutForRange:preeditRange + withReferenceFont:(theme.vertical ? [theme.preeditAttrs[NSFontAttributeName] verticalFont] : theme.preeditAttrs[NSFontAttributeName]) + paragraphStyle:theme.preeditParagraphStyle]; + } + if (numCandidates > 0) { + NSRange candidateBlockRange = NSMakeRange(candidateBlockStart, (!theme.linear && pagingRange.length > 0 ? pagingRange.location : text.length) - candidateBlockStart); + [self setLayoutForRange:candidateBlockRange + withReferenceFont:(theme.vertical ? [theme.attrs[NSFontAttributeName] verticalFont] : theme.attrs[NSFontAttributeName]) + paragraphStyle:theme.paragraphStyle]; + if (!theme.linear && pagingRange.length > 0) { + [self setLayoutForRange:pagingRange + withReferenceFont:theme.pagingAttrs[NSFontAttributeName] + paragraphStyle:theme.pagingParagraphStyle]; + } } // text done! - [_view.textView.textContentStorage setAttributedString:text]; - if (theme.vertical) { - _view.textView.layoutOrientation = NSTextLayoutOrientationVertical; - } else { - _view.textView.layoutOrientation = NSTextLayoutOrientationHorizontal; - } - [_view drawViewWith:candidateRanges hilightedIndex:index preeditRange:preeditRange highlightedPreeditRange:highlightedPreeditRange]; + [self setAnimationBehavior:caretPos == NSNotFound + ? NSWindowAnimationBehaviorUtilityWindow : NSWindowAnimationBehaviorDefault]; + [_view drawViewWithInsets:insets + candidateRanges:candidateRanges + highlightedIndex:index + preeditRange:preeditRange + highlightedPreeditRange:highlightedPreeditRange + pagingRange:pagingRange + pagingButton:turnPage]; [self show]; } @@ -1517,25 +2236,34 @@ - (void)updateStatusLong:(NSString *)messageLong statusShort:(NSString *)message - (void)showStatus:(NSString *)message { SquirrelTheme *theme = _view.currentTheme; - NSMutableAttributedString *text = [[NSMutableAttributedString alloc] initWithString:message attributes:theme.attrs]; - [text addAttribute:NSParagraphStyleAttributeName - value:theme.paragraphStyle - range:NSMakeRange(0, text.length)]; - - [_view.textView.textContentStorage setAttributedString:text]; - if (theme.vertical) { - _view.textView.layoutOrientation = NSTextLayoutOrientationVertical; - } else { - _view.textView.layoutOrientation = NSTextLayoutOrientationHorizontal; - } - NSRange emptyRange = NSMakeRange(NSNotFound, 0); - NSArray *candidateRanges = @[[NSValue valueWithRange: NSMakeRange(0, text.length)]]; - [_view drawViewWith:candidateRanges hilightedIndex:-1 preeditRange:emptyRange highlightedPreeditRange:emptyRange]; - [self show]; - + NSEdgeInsets insets = NSEdgeInsetsMake(theme.edgeInset.height, theme.edgeInset.width + theme.separatorWidth / 2, + theme.edgeInset.height, theme.edgeInset.width + theme.separatorWidth / 2); + _view.textView.layoutOrientation = theme.vertical ? + NSTextLayoutOrientationVertical : NSTextLayoutOrientationHorizontal; + + NSTextStorage *text = _view.textStorage; + [text setAttributedString:[[NSMutableAttributedString alloc] initWithString:message attributes:theme.statusAttrs]]; + + [text ensureAttributesAreFixedInRange:NSMakeRange(0, text.length)]; + [self setLayoutForRange:NSMakeRange(0, text.length) + withReferenceFont:(theme.vertical ? [theme.statusAttrs[NSFontAttributeName] verticalFont] : theme.statusAttrs[NSFontAttributeName]) + paragraphStyle:theme.statusParagraphStyle]; + + // disable remember_size and fixed line_length for status messages + _initPosition = YES; + _maxSize = NSZeroSize; if (_statusTimer) { [_statusTimer invalidate]; } + [self setAnimationBehavior:NSWindowAnimationBehaviorUtilityWindow]; + [_view drawViewWithInsets:insets + candidateRanges:@[] + highlightedIndex:NSNotFound + preeditRange:NSMakeRange(NSNotFound, 0) + highlightedPreeditRange:NSMakeRange(NSNotFound, 0) + pagingRange:NSMakeRange(NSNotFound, 0) + pagingButton:NSNotFound]; + [self show]; _statusTimer = [NSTimer scheduledTimerWithTimeInterval:kShowStatusDuration target:self selector:@selector(hideStatus:) @@ -1547,67 +2275,101 @@ - (void)hideStatus:(NSTimer *)timer { [self hide]; } -static inline NSColor *blendColors(NSColor *foregroundColor, - NSColor *backgroundColor) { - if (!backgroundColor) { - // return foregroundColor; +static inline NSColor * blendColors(NSColor *foregroundColor, + NSColor *backgroundColor) { + if (!backgroundColor) { // return foregroundColor; backgroundColor = [NSColor lightGrayColor]; } - return [[foregroundColor blendedColorWithFraction:kBlendedBackgroundColorFraction ofColor:backgroundColor] + return [[foregroundColor blendedColorWithFraction:kBlendedBackgroundColorFraction + ofColor:backgroundColor] colorWithAlphaComponent:foregroundColor.alphaComponent]; } -static NSFontDescriptor *getFontDescriptor(NSString *fullname) { - if (fullname == nil) { +static inline NSColor * inverseColor(NSColor *color) { + if (color == nil) { return nil; + } else { + return [NSColor colorWithColorSpace:color.colorSpace + hue:color.hueComponent + saturation:color.saturationComponent + brightness:1 - color.brightnessComponent + alpha:color.alphaComponent]; } +} - NSArray *fontNames = [fullname componentsSeparatedByString:@","]; - NSMutableArray *validFontDescriptors = [NSMutableArray arrayWithCapacity:fontNames.count]; +static NSFontDescriptor * getFontDescriptor(NSString *fullname) { + if (fullname == nil) { + return nil; + } + NSArray *fontNames = [fullname componentsSeparatedByString:@","]; + NSMutableArray *validFontDescriptors = [[NSMutableArray alloc] initWithCapacity:fontNames.count]; for (__strong NSString *fontName in fontNames) { fontName = [fontName stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]; if ([NSFont fontWithName:fontName size:0.0] != nil) { // If the font name is not valid, NSFontDescriptor will still create something for us. // However, when we draw the actual text, Squirrel will crash if there is any font descriptor // with invalid font name. - [validFontDescriptors addObject:[NSFontDescriptor fontDescriptorWithName:fontName - size:0.0]]; + NSFontDescriptor *fontDescriptor = [NSFontDescriptor fontDescriptorWithName:fontName size:0.0]; + NSFontDescriptor *UIFontDescriptor = [fontDescriptor fontDescriptorWithSymbolicTraits:NSFontDescriptorTraitUIOptimized]; + [validFontDescriptors addObject:([NSFont fontWithDescriptor:UIFontDescriptor size:0.0] != nil ? UIFontDescriptor : fontDescriptor)]; } } if (validFontDescriptors.count == 0) { return nil; - } else if (validFontDescriptors.count == 1) { - return validFontDescriptors[0]; } - NSFontDescriptor *initialFontDescriptor = validFontDescriptors[0]; - NSArray *fallbackDescriptors = [validFontDescriptors - subarrayWithRange:NSMakeRange(1, validFontDescriptors.count - 1)]; - NSDictionary *attributes = @{NSFontCascadeListAttribute : fallbackDescriptors}; + NSFontDescriptor *emojiFontDescriptor = [NSFontDescriptor fontDescriptorWithName:@"AppleColorEmoji" size:0.0]; + NSArray *fallbackDescriptors = + [[validFontDescriptors subarrayWithRange:NSMakeRange(1, validFontDescriptors.count - 1)] + arrayByAddingObject:emojiFontDescriptor]; + NSDictionary *attributes = @{NSFontCascadeListAttribute: fallbackDescriptors}; return [initialFontDescriptor fontDescriptorByAddingAttributes:attributes]; } -static void updateCandidateListLayout(BOOL *isLinearCandidateList, SquirrelConfig *config, NSString *prefix) { - NSString* candidateListLayout = [config getString:[prefix stringByAppendingString:@"/candidate_list_layout"]]; +static CGFloat getLineHeight(NSFont *font, BOOL vertical) { + if (vertical) { + font = font.verticalFont; + } + CGFloat lineHeight = font.ascender - font.descender; + NSArray *fallbackList = [font.fontDescriptor objectForKey:NSFontCascadeListAttribute]; + for (NSFontDescriptor *fallback in fallbackList) { + NSFont *fallbackFont = [NSFont fontWithDescriptor:fallback size:font.pointSize]; + if (vertical) { + fallbackFont = fallbackFont.verticalFont; + } + lineHeight = MAX(lineHeight, fallbackFont.ascender - fallbackFont.descender); + } + return lineHeight; +} + +static void updateCandidateListLayout(BOOL *isLinearCandidateList, BOOL *isTabledCandidateList, SquirrelConfig *config, NSString *prefix) { + NSString *candidateListLayout = [config getString:[prefix stringByAppendingString:@"/candidate_list_layout"]]; if ([candidateListLayout isEqualToString:@"stacked"]) { - *isLinearCandidateList = false; + *isLinearCandidateList = NO; + *isTabledCandidateList = NO; } else if ([candidateListLayout isEqualToString:@"linear"]) { - *isLinearCandidateList = true; + *isLinearCandidateList = YES; + *isTabledCandidateList = NO; + } else if ([candidateListLayout isEqualToString:@"tabled"]) { + // `tabled` is a derived layout of `linear`; tabled implies linear + *isLinearCandidateList = YES; + *isTabledCandidateList = YES; } else { // Deprecated. Not to be confused with text_orientation: horizontal NSNumber *horizontal = [config getOptionalBool:[prefix stringByAppendingString:@"/horizontal"]]; if (horizontal) { *isLinearCandidateList = horizontal.boolValue; + *isTabledCandidateList = NO; } } } static void updateTextOrientation(BOOL *isVerticalText, SquirrelConfig *config, NSString *prefix) { - NSString* textOrientation = [config getString:[prefix stringByAppendingString:@"/text_orientation"]]; + NSString *textOrientation = [config getString:[prefix stringByAppendingString:@"/text_orientation"]]; if ([textOrientation isEqualToString:@"horizontal"]) { - *isVerticalText = false; + *isVerticalText = NO; } else if ([textOrientation isEqualToString:@"vertical"]) { - *isVerticalText = true; + *isVerticalText = YES; } else { NSNumber *vertical = [config getOptionalBool:[prefix stringByAppendingString:@"/vertical"]]; if (vertical) { @@ -1616,46 +2378,80 @@ static void updateTextOrientation(BOOL *isVerticalText, SquirrelConfig *config, } } --(void)loadConfig:(SquirrelConfig *)config forDarkMode:(BOOL)isDark { +- (void)loadLabelConfig:(SquirrelConfig *)config { + SquirrelTheme *theme = [_view selectTheme:NO]; + [SquirrelPanel updateTheme:theme withLabelConfig:config]; + if (@available(macOS 10.14, *)) { + SquirrelTheme *darkTheme = [_view selectTheme:YES]; + [SquirrelPanel updateTheme:darkTheme withLabelConfig:config]; + } +} + ++ (void)updateTheme:(SquirrelTheme *)theme withLabelConfig:(SquirrelConfig *)config { + int menuSize = [config getInt:@"menu/page_size"] ? : 5; + NSMutableArray *labels = [[NSMutableArray alloc] initWithCapacity:menuSize]; + NSString *selectKeys = [config getString:@"menu/alternative_select_keys"]; + if (selectKeys) { + NSString *keyCaps = [[selectKeys uppercaseString] + stringByApplyingTransform:NSStringTransformFullwidthToHalfwidth reverse:YES]; + for (int i = 0; i < menuSize; ++i) { + labels[i] = [keyCaps substringWithRange:NSMakeRange(i, 1)]; + } + } else { + NSArray *selectLabels = [config getList:@"menu/alternative_select_labels"]; + if (selectLabels) { + for (int i = 0; i < menuSize; ++i) { + labels[i] = selectLabels[i]; + } + } else { + NSString *numerals = @"1234567890"; + for (int i = 0; i < menuSize; ++i) { + labels[i] = [numerals substringWithRange:NSMakeRange(i, 1)]; + } + } + } + [theme setLabels:labels]; +} + +- (void)loadConfig:(SquirrelConfig *)config forDarkMode:(BOOL)isDark { SquirrelTheme *theme = [_view selectTheme:isDark]; - [[self class] updateTheme:theme withConfig:config forDarkMode:isDark]; + NSSet *styleOptions = [NSSet setWithArray:self.optionSwitcher.optionStates]; + [SquirrelPanel updateTheme:theme withConfig:config styleOptions:styleOptions forDarkMode:isDark]; } -+(void)updateTheme:(SquirrelTheme *)theme withConfig:(SquirrelConfig *)config forDarkMode:(BOOL)isDark { ++ (void)updateTheme:(SquirrelTheme *)theme withConfig:(SquirrelConfig *)config styleOptions:(NSSet *)styleOptions forDarkMode:(BOOL)isDark { + // INTERFACE BOOL linear = NO; + BOOL tabled = NO; BOOL vertical = NO; - updateCandidateListLayout(&linear, config, @"style"); + updateCandidateListLayout(&linear, &tabled, config, @"style"); updateTextOrientation(&vertical, config, @"style"); - BOOL inlinePreedit = [config getBool:@"style/inline_preedit"]; - BOOL inlineCandidate = [config getBool:@"style/inline_candidate"]; - BOOL translucency = [config getBool:@"style/translucency"]; - BOOL mutualExclusive = [config getBool:@"style/mutual_exclusive"]; - NSNumber *memorizeSizeConfig = [config getOptionalBool:@"style/memorize_size"]; - if (memorizeSizeConfig) { - theme.memorizeSize = memorizeSizeConfig.boolValue; - } - + NSNumber *inlinePreedit = [config getOptionalBool:@"style/inline_preedit"]; + NSNumber *inlineCandidate = [config getOptionalBool:@"style/inline_candidate"]; + NSNumber *showPaging = [config getOptionalBool:@"style/show_paging"]; + NSNumber *rememberSize = [config getOptionalBool:@"style/remember_size"]; NSString *statusMessageType = [config getString:@"style/status_message_type"]; NSString *candidateFormat = [config getString:@"style/candidate_format"]; + // TYPOGRAPHY NSString *fontName = [config getString:@"style/font_face"]; - CGFloat fontSize = [config getDouble:@"style/font_point"]; + NSNumber *fontSize = [config getOptionalDouble:@"style/font_point"]; NSString *labelFontName = [config getString:@"style/label_font_face"]; - CGFloat labelFontSize = [config getDouble:@"style/label_font_point"]; + NSNumber *labelFontSize = [config getOptionalDouble:@"style/label_font_point"]; NSString *commentFontName = [config getString:@"style/comment_font_face"]; - CGFloat commentFontSize = [config getDouble:@"style/comment_font_point"]; - NSNumber *alphaValue = [config getOptionalDouble:@"style/alpha"]; - CGFloat alpha = alphaValue ? fmin(fmax(alphaValue.doubleValue, 0.0), 1.0) : 1.0; - CGFloat cornerRadius = [config getDouble:@"style/corner_radius"]; - CGFloat hilitedCornerRadius = [config getDouble:@"style/hilited_corner_radius"]; - CGFloat surroundingExtraExpansion = [config getDouble:@"style/surrounding_extra_expansion"]; - CGFloat borderHeight = [config getDouble:@"style/border_height"]; - CGFloat borderWidth = [config getDouble:@"style/border_width"]; - CGFloat lineSpacing = [config getDouble:@"style/line_spacing"]; - CGFloat spacing = [config getDouble:@"style/spacing"]; - CGFloat baseOffset = [config getDouble:@"style/base_offset"]; - CGFloat shadowSize = fmax(0,[config getDouble:@"style/shadow_size"]); - + NSNumber *commentFontSize = [config getOptionalDouble:@"style/comment_font_point"]; + NSNumber *alpha = [config getOptionalDouble:@"style/alpha"]; + NSNumber *translucency = [config getOptionalDouble:@"style/translucency"]; + NSNumber *cornerRadius = [config getOptionalDouble:@"style/corner_radius"]; + NSNumber *highlightedCornerRadius = [config getOptionalDouble:@"style/hilited_corner_radius"]; + NSNumber *borderHeight = [config getOptionalDouble:@"style/border_height"]; + NSNumber *borderWidth = [config getOptionalDouble:@"style/border_width"]; + NSNumber *lineSpacing = [config getOptionalDouble:@"style/line_spacing"]; + NSNumber *spacing = [config getOptionalDouble:@"style/spacing"]; + NSNumber *baseOffset = [config getOptionalDouble:@"style/base_offset"]; + NSNumber *lineLength = [config getOptionalDouble:@"style/line_length"]; + // CHROMATICS NSColor *backgroundColor; + NSColor *backgroundImage; NSColor *borderColor; NSColor *preeditBackgroundColor; NSColor *candidateLabelColor; @@ -1666,246 +2462,139 @@ +(void)updateTheme:(SquirrelTheme *)theme withConfig:(SquirrelConfig *)config fo NSColor *candidateTextColor; NSColor *highlightedCandidateTextColor; NSColor *highlightedCandidateBackColor; - NSColor *candidateBackColor; NSColor *commentTextColor; NSColor *highlightedCommentTextColor; NSString *colorScheme; if (isDark) { - colorScheme = [config getString:@"style/color_scheme_dark"]; + for (NSString *option in styleOptions) { + if ((colorScheme = [config getString:[NSString stringWithFormat:@"style/%@/color_scheme_dark", option]])) break; + } + colorScheme = colorScheme ? : [config getString:@"style/color_scheme_dark"]; } if (!colorScheme) { - colorScheme = [config getString:@"style/color_scheme"]; + for (NSString *option in styleOptions) { + if ((colorScheme = [config getString:[NSString stringWithFormat:@"style/%@/color_scheme", option]])) break; + } + colorScheme = colorScheme ? : [config getString:@"style/color_scheme"]; } BOOL isNative = !colorScheme || [colorScheme isEqualToString:@"native"]; - if (!isNative) { - NSString *prefix = [@"preset_color_schemes/" stringByAppendingString:colorScheme]; - config.colorSpace = [config getString:[prefix stringByAppendingString:@"/color_space"]]; - backgroundColor = [config getColor:[prefix stringByAppendingString:@"/back_color"]]; - borderColor = [config getColor:[prefix stringByAppendingString:@"/border_color"]]; - preeditBackgroundColor = [config getColor:[prefix stringByAppendingString:@"/preedit_back_color"]]; - textColor = [config getColor:[prefix stringByAppendingString:@"/text_color"]]; - highlightedTextColor = - [config getColor:[prefix stringByAppendingString:@"/hilited_text_color"]]; - if (highlightedTextColor == nil) { - highlightedTextColor = textColor; - } - highlightedBackColor = - [config getColor:[prefix stringByAppendingString:@"/hilited_back_color"]]; - candidateTextColor = - [config getColor:[prefix stringByAppendingString:@"/candidate_text_color"]]; - if (candidateTextColor == nil) { - // in non-inline mode, 'text_color' is for rendering preedit text. - // if not otherwise specified, candidate text is also rendered in this color. - candidateTextColor = textColor; - } - candidateLabelColor = - [config getColor:[prefix stringByAppendingString:@"/label_color"]]; - highlightedCandidateLabelColor = - [config getColor:[prefix stringByAppendingString:@"/label_hilited_color"]]; - if (!highlightedCandidateLabelColor) { - // for backward compatibility, 'label_hilited_color' and 'hilited_candidate_label_color' - // are both valid - highlightedCandidateLabelColor = - [config getColor:[prefix stringByAppendingString:@"/hilited_candidate_label_color"]]; - } - highlightedCandidateTextColor = - [config getColor:[prefix stringByAppendingString:@"/hilited_candidate_text_color"]]; - if (highlightedCandidateTextColor == nil) { - highlightedCandidateTextColor = highlightedTextColor; - } - highlightedCandidateBackColor = - [config getColor:[prefix stringByAppendingString:@"/hilited_candidate_back_color"]]; - if (highlightedCandidateBackColor == nil) { - highlightedCandidateBackColor = highlightedBackColor; - } - candidateBackColor = - [config getColor:[prefix stringByAppendingString:@"/candidate_back_color"]]; - commentTextColor = - [config getColor:[prefix stringByAppendingString:@"/comment_text_color"]]; - highlightedCommentTextColor = - [config getColor:[prefix stringByAppendingString:@"/hilited_comment_text_color"]]; + NSArray *configPrefixes = isNative ? [@"style/" stringsByAppendingPaths:styleOptions.allObjects] : + [[NSArray arrayWithObject:[@"preset_color_schemes/" stringByAppendingString:colorScheme]] + arrayByAddingObjectsFromArray:[@"style/" stringsByAppendingPaths:styleOptions.allObjects]]; + + // get color scheme and then check possible overrides from styleSwitcher + for (NSString *prefix in configPrefixes) { + // CHROMATICS override + if (@available(macOS 10.12, *)) { + config.colorSpace = [config getString:[prefix stringByAppendingString:@"/color_space"]] ? : config.colorSpace; + } + backgroundColor = [config getColor:[prefix stringByAppendingString:@"/back_color"]] ? : backgroundColor; + backgroundImage = [config getPattern:[prefix stringByAppendingString:@"/back_image"]] ? : backgroundImage; + borderColor = [config getColor:[prefix stringByAppendingString:@"/border_color"]] ? : borderColor; + preeditBackgroundColor = [config getColor:[prefix stringByAppendingString:@"/preedit_back_color"]] ? : preeditBackgroundColor; + textColor = [config getColor:[prefix stringByAppendingString:@"/text_color"]] ? : textColor; + highlightedTextColor = [config getColor:[prefix stringByAppendingString:@"/hilited_text_color"]] ? : highlightedTextColor; + highlightedBackColor = [config getColor:[prefix stringByAppendingString:@"/hilited_back_color"]] ? : highlightedBackColor; + candidateTextColor = [config getColor:[prefix stringByAppendingString:@"/candidate_text_color"]] ? : candidateTextColor; + highlightedCandidateTextColor = [config getColor:[prefix stringByAppendingString:@"/hilited_candidate_text_color"]] ? : highlightedCandidateTextColor; + highlightedCandidateBackColor = [config getColor:[prefix stringByAppendingString:@"/hilited_candidate_back_color"]] ? : highlightedCandidateBackColor; + commentTextColor = [config getColor:[prefix stringByAppendingString:@"/comment_text_color"]] ? : commentTextColor; + highlightedCommentTextColor = [config getColor:[prefix stringByAppendingString:@"/hilited_comment_text_color"]] ? : highlightedCommentTextColor; + candidateLabelColor = [config getColor:[prefix stringByAppendingString:@"/label_color"]] ? : candidateLabelColor; + // for backward compatibility, 'label_hilited_color' and 'hilited_candidate_label_color' are both valid + highlightedCandidateLabelColor = [config getColor:[prefix stringByAppendingString:@"/label_hilited_color"]] ? : + [config getColor:[prefix stringByAppendingString:@"/hilited_candidate_label_color"]] ? : highlightedCandidateLabelColor; // the following per-color-scheme configurations, if exist, will // override configurations with the same name under the global 'style' section - - updateCandidateListLayout(&linear, config, prefix); + // INTERFACE override + updateCandidateListLayout(&linear, &tabled, config, prefix); updateTextOrientation(&vertical, config, prefix); - - NSNumber *inlinePreeditOverridden = - [config getOptionalBool:[prefix stringByAppendingString:@"/inline_preedit"]]; - if (inlinePreeditOverridden) { - inlinePreedit = inlinePreeditOverridden.boolValue; - } - NSNumber *inlineCandidateOverridden = - [config getOptionalBool:[prefix stringByAppendingString:@"/inline_candidate"]]; - if (inlineCandidateOverridden) { - inlineCandidate = inlineCandidateOverridden.boolValue; - } - NSNumber *translucencyOverridden = - [config getOptionalBool:[prefix stringByAppendingString:@"/translucency"]]; - if (translucencyOverridden) { - translucency = translucencyOverridden.boolValue; - } - NSNumber *mutualExclusiveOverridden = - [config getOptionalBool:[prefix stringByAppendingString:@"/mutual_exclusive"]]; - if (mutualExclusiveOverridden) { - mutualExclusive = mutualExclusiveOverridden.boolValue; - } - NSString *candidateFormatOverridden = - [config getString:[prefix stringByAppendingString:@"/candidate_format"]]; - if (candidateFormatOverridden) { - candidateFormat = candidateFormatOverridden; - } - - NSString *fontNameOverridden = - [config getString:[prefix stringByAppendingString:@"/font_face"]]; - if (fontNameOverridden) { - fontName = fontNameOverridden; - } - NSNumber *fontSizeOverridden = - [config getOptionalDouble:[prefix stringByAppendingString:@"/font_point"]]; - if (fontSizeOverridden) { - fontSize = fontSizeOverridden.integerValue; - } - NSString *labelFontNameOverridden = - [config getString:[prefix stringByAppendingString:@"/label_font_face"]]; - if (labelFontNameOverridden) { - labelFontName = labelFontNameOverridden; - } - NSNumber *labelFontSizeOverridden = - [config getOptionalDouble:[prefix stringByAppendingString:@"/label_font_point"]]; - if (labelFontSizeOverridden) { - labelFontSize = labelFontSizeOverridden.integerValue; - } - NSString *commentFontNameOverridden = - [config getString:[prefix stringByAppendingString:@"/comment_font_face"]]; - if (commentFontNameOverridden) { - commentFontName = commentFontNameOverridden; - } - NSNumber *commentFontSizeOverridden = - [config getOptionalDouble:[prefix stringByAppendingString:@"/comment_font_point"]]; - if (commentFontSizeOverridden) { - commentFontSize = commentFontSizeOverridden.integerValue; - } - NSNumber *alphaOverridden = - [config getOptionalDouble:[prefix stringByAppendingString:@"/alpha"]]; - if (alphaOverridden) { - alpha = fmin(fmax(alphaOverridden.doubleValue, 0.0), 1.0); - } - NSNumber *cornerRadiusOverridden = - [config getOptionalDouble:[prefix stringByAppendingString:@"/corner_radius"]]; - if (cornerRadiusOverridden) { - cornerRadius = cornerRadiusOverridden.doubleValue; - } - NSNumber *hilitedCornerRadiusOverridden = - [config getOptionalDouble:[prefix stringByAppendingString:@"/hilited_corner_radius"]]; - if (hilitedCornerRadiusOverridden) { - hilitedCornerRadius = hilitedCornerRadiusOverridden.doubleValue; - } - NSNumber *surroundingExtraExpansionOverridden = - [config getOptionalDouble:[prefix stringByAppendingString:@"/surrounding_extra_expansion"]]; - if (surroundingExtraExpansionOverridden) { - surroundingExtraExpansion = surroundingExtraExpansionOverridden.doubleValue; - } - NSNumber *borderHeightOverridden = - [config getOptionalDouble:[prefix stringByAppendingString:@"/border_height"]]; - if (borderHeightOverridden) { - borderHeight = borderHeightOverridden.doubleValue; - } - NSNumber *borderWidthOverridden = - [config getOptionalDouble:[prefix stringByAppendingString:@"/border_width"]]; - if (borderWidthOverridden) { - borderWidth = borderWidthOverridden.doubleValue; - } - NSNumber *lineSpacingOverridden = - [config getOptionalDouble:[prefix stringByAppendingString:@"/line_spacing"]]; - if (lineSpacingOverridden) { - lineSpacing = lineSpacingOverridden.doubleValue; - } - NSNumber *spacingOverridden = - [config getOptionalDouble:[prefix stringByAppendingString:@"/spacing"]]; - if (spacingOverridden) { - spacing = spacingOverridden.doubleValue; - } - NSNumber *baseOffsetOverridden = - [config getOptionalDouble:[prefix stringByAppendingString:@"/base_offset"]]; - if (baseOffsetOverridden) { - baseOffset = baseOffsetOverridden.doubleValue; - } - NSNumber *shadowSizeOverridden = - [config getOptionalDouble:[prefix stringByAppendingString:@"/shadow_size"]]; - if (shadowSizeOverridden) { - shadowSize = shadowSizeOverridden.doubleValue; - } - } - - if (fontSize == 0) { // default size - fontSize = kDefaultFontSize; - } - if (labelFontSize == 0) { - labelFontSize = fontSize; - } - if (commentFontSize == 0) { - commentFontSize = fontSize; - } - NSFontDescriptor *fontDescriptor = nil; - NSFont *font = nil; - if (fontName != nil) { - fontDescriptor = getFontDescriptor(fontName); - if (fontDescriptor != nil) { - font = [NSFont fontWithDescriptor:fontDescriptor size:fontSize]; - } - } - if (font == nil) { - // use default font - font = [NSFont userFontOfSize:fontSize]; - } - NSFontDescriptor *labelFontDescriptor = nil; - NSFont *labelFont = nil; - if (labelFontName != nil) { - labelFontDescriptor = getFontDescriptor(labelFontName); - if (labelFontDescriptor == nil) { - labelFontDescriptor = fontDescriptor; - } - if (labelFontDescriptor != nil) { - labelFont = [NSFont fontWithDescriptor:labelFontDescriptor size:labelFontSize]; - } - } - if (labelFont == nil) { - if (fontDescriptor != nil) { - labelFont = [NSFont fontWithDescriptor:fontDescriptor size:labelFontSize]; - } else { - labelFont = [NSFont fontWithName:font.fontName size:labelFontSize]; - } - } - NSFontDescriptor *commentFontDescriptor = nil; - NSFont *commentFont = nil; - if (commentFontName != nil) { - commentFontDescriptor = getFontDescriptor(commentFontName); - if (commentFontDescriptor == nil) { - commentFontDescriptor = fontDescriptor; - } - if (commentFontDescriptor != nil) { - commentFont = [NSFont fontWithDescriptor:commentFontDescriptor size:commentFontSize]; - } - } - if (commentFont == nil) { - if (fontDescriptor != nil) { - commentFont = [NSFont fontWithDescriptor:fontDescriptor size:commentFontSize]; - } else { - commentFont = [NSFont fontWithName:font.fontName size:commentFontSize]; - } - } - - NSMutableParagraphStyle *paragraphStyle = - [[NSParagraphStyle defaultParagraphStyle] mutableCopy]; - paragraphStyle.paragraphSpacing = lineSpacing / 2; - paragraphStyle.paragraphSpacingBefore = lineSpacing / 2; - - NSMutableParagraphStyle *preeditParagraphStyle = - [[NSParagraphStyle defaultParagraphStyle] mutableCopy]; - preeditParagraphStyle.paragraphSpacing = spacing / 2 + hilitedCornerRadius / 2; + inlinePreedit = [config getOptionalBool:[prefix stringByAppendingString:@"/inline_preedit"]] ? : inlinePreedit; + inlineCandidate = [config getOptionalBool:[prefix stringByAppendingString:@"/inline_candidate"]] ? : inlineCandidate; + showPaging = [config getOptionalBool:[prefix stringByAppendingString:@"/show_paging"]] ? : showPaging; + rememberSize = [config getOptionalBool:[prefix stringByAppendingString:@"/remember_size"]] ? : rememberSize; + statusMessageType = [config getString:[prefix stringByAppendingString:@"style/status_message_type"]] ? : statusMessageType; + candidateFormat = [config getString:[prefix stringByAppendingString:@"/candidate_format"]] ? : candidateFormat; + // TYPOGRAPHY override + fontName = [config getString:[prefix stringByAppendingString:@"/font_face"]] ? : fontName; + fontSize = [config getOptionalDouble:[prefix stringByAppendingString:@"/font_point"]] ? : fontSize; + labelFontName = [config getString:[prefix stringByAppendingString:@"/label_font_face"]] ? : labelFontName; + labelFontSize = [config getOptionalDouble:[prefix stringByAppendingString:@"/label_font_point"]] ? : labelFontSize; + commentFontName = [config getString:[prefix stringByAppendingString:@"/comment_font_face"]] ? : commentFontName; + commentFontSize = [config getOptionalDouble:[prefix stringByAppendingString:@"/comment_font_point"]] ? : commentFontSize; + alpha = [config getOptionalDouble:[prefix stringByAppendingString:@"/alpha"]] ? : alpha; + translucency = [config getOptionalDouble:[prefix stringByAppendingString:@"/translucency"]] ? : translucency; + cornerRadius = [config getOptionalDouble:[prefix stringByAppendingString:@"/corner_radius"]] ? : cornerRadius; + highlightedCornerRadius = [config getOptionalDouble:[prefix stringByAppendingString:@"/hilited_corner_radius"]] ? : highlightedCornerRadius; + borderHeight = [config getOptionalDouble:[prefix stringByAppendingString:@"/border_height"]] ? : borderHeight; + borderWidth = [config getOptionalDouble:[prefix stringByAppendingString:@"/border_width"]] ? : borderWidth; + lineSpacing = [config getOptionalDouble:[prefix stringByAppendingString:@"/line_spacing"]] ? : lineSpacing; + spacing = [config getOptionalDouble:[prefix stringByAppendingString:@"/spacing"]] ? : spacing; + baseOffset = [config getOptionalDouble:[prefix stringByAppendingString:@"/base_offset"]] ? : baseOffset; + lineLength = [config getOptionalDouble:[prefix stringByAppendingString:@"/line_length"]] ? : lineLength; + } + + // TYPOGRAPHY refinement + fontSize = fontSize ? : @(kDefaultFontSize); + labelFontSize = labelFontSize ? : fontSize; + commentFontSize = commentFontSize ? : fontSize; + NSDictionary *monoDigitAttrs = @{NSFontFeatureSettingsAttribute: + @[@{NSFontFeatureTypeIdentifierKey: @(kNumberSpacingType), + NSFontFeatureSelectorIdentifierKey: @(kMonospacedNumbersSelector)}, + @{NSFontFeatureTypeIdentifierKey: @(kTextSpacingType), + NSFontFeatureSelectorIdentifierKey: @(kHalfWidthTextSelector)}] }; + + NSFontDescriptor *fontDescriptor = getFontDescriptor(fontName); + NSFont *font = [NSFont fontWithDescriptor:(fontDescriptor ? : getFontDescriptor([NSFont userFontOfSize:0].fontName)) + size:MAX(fontSize.doubleValue, 0)]; + + NSFontDescriptor *labelFontDescriptor = [(getFontDescriptor(labelFontName) ? : fontDescriptor) + fontDescriptorByAddingAttributes:monoDigitAttrs]; + NSFont *labelFont = labelFontDescriptor ? [NSFont fontWithDescriptor:labelFontDescriptor size:MAX(labelFontSize.doubleValue, 0)] + : [NSFont monospacedDigitSystemFontOfSize:MAX(labelFontSize.doubleValue, 0) weight:NSFontWeightRegular]; + + NSFontDescriptor *commentFontDescriptor = getFontDescriptor(commentFontName); + NSFont *commentFont = [NSFont fontWithDescriptor:(commentFontDescriptor ? : fontDescriptor) + size:MAX(commentFontSize.doubleValue, 0)]; + + NSFont *pagingFont; + if (@available(macOS 12.0, *)) { + pagingFont = [NSFont monospacedDigitSystemFontOfSize:MAX(labelFontSize.doubleValue, 0) weight:NSFontWeightRegular]; + } else { + pagingFont = [NSFont fontWithDescriptor:[[NSFontDescriptor fontDescriptorWithName:@"AppleSymbols" size:0] + fontDescriptorWithSymbolicTraits:NSFontDescriptorTraitUIOptimized] + size:MAX(labelFontSize.doubleValue, 0)]; + } + + CGFloat fontHeight = getLineHeight(font, vertical); + CGFloat labelFontHeight = getLineHeight(labelFont, vertical); + CGFloat commentFontHeight = getLineHeight(commentFont, vertical); + CGFloat lineHeight = MAX(fontHeight, MAX(labelFontHeight, commentFontHeight)); + CGFloat separatorWidth = ceil([[NSAttributedString alloc] initWithString:kFullWidthSpace + attributes:@{NSFontAttributeName: commentFont}].size.width); + + NSMutableParagraphStyle *preeditParagraphStyle = [theme.preeditParagraphStyle mutableCopy]; + preeditParagraphStyle.minimumLineHeight = fontHeight; + preeditParagraphStyle.maximumLineHeight = fontHeight; + preeditParagraphStyle.paragraphSpacing = MAX(spacing.doubleValue, 0); + + NSMutableParagraphStyle *paragraphStyle = [theme.paragraphStyle mutableCopy]; + paragraphStyle.minimumLineHeight = lineHeight; + paragraphStyle.maximumLineHeight = lineHeight; + paragraphStyle.paragraphSpacing = MAX(lineSpacing.doubleValue / 2, 0); + paragraphStyle.paragraphSpacingBefore = MAX(lineSpacing.doubleValue / 2, 0); + paragraphStyle.tabStops = @[]; + paragraphStyle.defaultTabInterval = separatorWidth * 2; + + NSMutableParagraphStyle *pagingParagraphStyle = [theme.pagingParagraphStyle mutableCopy]; + pagingParagraphStyle.minimumLineHeight = pagingFont.ascender - pagingFont.descender; + pagingParagraphStyle.maximumLineHeight = pagingFont.ascender - pagingFont.descender; + + NSMutableParagraphStyle *statusParagraphStyle = [theme.statusParagraphStyle mutableCopy]; + statusParagraphStyle.minimumLineHeight = commentFontHeight; + statusParagraphStyle.maximumLineHeight = commentFontHeight; NSMutableDictionary *attrs = [theme.attrs mutableCopy]; NSMutableDictionary *highlightedAttrs = [theme.highlightedAttrs mutableCopy]; @@ -1915,6 +2604,9 @@ +(void)updateTheme:(SquirrelTheme *)theme withConfig:(SquirrelConfig *)config fo NSMutableDictionary *commentHighlightedAttrs = [theme.commentHighlightedAttrs mutableCopy]; NSMutableDictionary *preeditAttrs = [theme.preeditAttrs mutableCopy]; NSMutableDictionary *preeditHighlightedAttrs = [theme.preeditHighlightedAttrs mutableCopy]; + NSMutableDictionary *pagingAttrs = [theme.pagingAttrs mutableCopy]; + NSMutableDictionary *pagingHighlightedAttrs = [theme.pagingHighlightedAttrs mutableCopy]; + NSMutableDictionary *statusAttrs = [theme.statusAttrs mutableCopy]; attrs[NSFontAttributeName] = font; highlightedAttrs[NSFontAttributeName] = font; @@ -1924,29 +2616,71 @@ +(void)updateTheme:(SquirrelTheme *)theme withConfig:(SquirrelConfig *)config fo commentHighlightedAttrs[NSFontAttributeName] = commentFont; preeditAttrs[NSFontAttributeName] = font; preeditHighlightedAttrs[NSFontAttributeName] = font; - attrs[NSBaselineOffsetAttributeName] = @(baseOffset); - highlightedAttrs[NSBaselineOffsetAttributeName] = @(baseOffset); - labelAttrs[NSBaselineOffsetAttributeName] = @(baseOffset); - labelHighlightedAttrs[NSBaselineOffsetAttributeName] = @(baseOffset); - commentAttrs[NSBaselineOffsetAttributeName] = @(baseOffset); - commentHighlightedAttrs[NSBaselineOffsetAttributeName] = @(baseOffset); - preeditAttrs[NSBaselineOffsetAttributeName] = @(baseOffset); - preeditHighlightedAttrs[NSBaselineOffsetAttributeName] = @(baseOffset); - - NSColor *secondaryTextColor = [[self class] secondaryTextColor]; - - backgroundColor = backgroundColor ? backgroundColor : [NSColor windowBackgroundColor]; - candidateTextColor = candidateTextColor ? candidateTextColor : [NSColor controlTextColor]; - candidateLabelColor = candidateLabelColor ? candidateLabelColor : - isNative ? secondaryTextColor : blendColors(candidateTextColor, backgroundColor); - highlightedCandidateTextColor = highlightedCandidateTextColor ? highlightedCandidateTextColor : [NSColor selectedControlTextColor]; - highlightedCandidateBackColor = highlightedCandidateBackColor ? highlightedCandidateBackColor : [NSColor selectedTextBackgroundColor]; - highlightedCandidateLabelColor = highlightedCandidateLabelColor ? highlightedCandidateLabelColor : - isNative ? secondaryTextColor : blendColors(highlightedCandidateTextColor, highlightedCandidateBackColor); - commentTextColor = commentTextColor ? commentTextColor : secondaryTextColor; - highlightedCommentTextColor = highlightedCommentTextColor ? highlightedCommentTextColor : commentTextColor; - textColor = textColor ? textColor : secondaryTextColor; - highlightedTextColor = highlightedTextColor ? highlightedTextColor : [NSColor controlTextColor]; + pagingAttrs[NSFontAttributeName] = linear ? labelFont : pagingFont; + statusAttrs[NSFontAttributeName] = commentFont; + + NSFont *refFont = CFBridgingRelease(CTFontCreateForString((CTFontRef)font, (CFStringRef)kFullWidthSpace, CFRangeMake(0, 1))); + labelAttrs[CFBridgingRelease(kCTBaselineClassAttributeName)] = CFBridgingRelease(kCTBaselineClassIdeographicCentered); + labelHighlightedAttrs[CFBridgingRelease(kCTBaselineClassAttributeName)] = CFBridgingRelease(kCTBaselineClassIdeographicCentered); + labelAttrs[CFBridgingRelease(kCTBaselineReferenceInfoAttributeName)] = @{CFBridgingRelease(kCTBaselineReferenceFont): refFont}; + labelHighlightedAttrs[CFBridgingRelease(kCTBaselineReferenceInfoAttributeName)] = @{CFBridgingRelease(kCTBaselineReferenceFont): refFont}; + + attrs[NSBaselineOffsetAttributeName] = baseOffset; + highlightedAttrs[NSBaselineOffsetAttributeName] = baseOffset; + labelAttrs[NSBaselineOffsetAttributeName] = baseOffset; + labelHighlightedAttrs[NSBaselineOffsetAttributeName] = baseOffset; + commentAttrs[NSBaselineOffsetAttributeName] = baseOffset; + commentHighlightedAttrs[NSBaselineOffsetAttributeName] = baseOffset; + preeditAttrs[NSBaselineOffsetAttributeName] = baseOffset; + preeditHighlightedAttrs[NSBaselineOffsetAttributeName] = baseOffset; + pagingAttrs[NSBaselineOffsetAttributeName] = baseOffset; + statusAttrs[NSBaselineOffsetAttributeName] = baseOffset; + + preeditAttrs[NSParagraphStyleAttributeName] = preeditParagraphStyle; + preeditHighlightedAttrs[NSParagraphStyleAttributeName] = preeditParagraphStyle; + statusAttrs[NSParagraphStyleAttributeName] = statusParagraphStyle; + + labelAttrs[NSVerticalGlyphFormAttributeName] = @(vertical); + labelHighlightedAttrs[NSVerticalGlyphFormAttributeName] = @(vertical); + pagingAttrs[NSVerticalGlyphFormAttributeName] = @(NO); + + // CHROMATICS refinement + NSColor *secondaryTextColor = [SquirrelPanel secondaryTextColor]; + NSColor *accentColor = [SquirrelPanel accentColor]; + + if (@available(macOS 10.14, *)) { + if (theme.translucency > 0 && + ((backgroundColor.brightnessComponent >= 0.5 && isDark) || + (backgroundColor.brightnessComponent < 0.5 && !isDark))) { + backgroundColor = inverseColor(backgroundColor); + borderColor = inverseColor(borderColor); + preeditBackgroundColor = inverseColor(preeditBackgroundColor); + candidateTextColor = inverseColor(candidateTextColor); + highlightedCandidateTextColor = [inverseColor(highlightedCandidateTextColor) highlightWithLevel:highlightedCandidateTextColor.brightnessComponent]; + highlightedCandidateBackColor = [inverseColor(highlightedCandidateBackColor) shadowWithLevel:1 - highlightedCandidateBackColor.brightnessComponent]; + candidateLabelColor = inverseColor(candidateLabelColor); + highlightedCandidateLabelColor = [inverseColor(highlightedCandidateLabelColor) highlightWithLevel:highlightedCandidateLabelColor.brightnessComponent]; + commentTextColor = inverseColor(commentTextColor); + highlightedCommentTextColor = [inverseColor(highlightedCommentTextColor) highlightWithLevel:highlightedCommentTextColor.brightnessComponent]; + textColor = inverseColor(textColor); + highlightedTextColor = [inverseColor(highlightedTextColor) highlightWithLevel:highlightedTextColor.brightnessComponent]; + highlightedBackColor = [inverseColor(highlightedBackColor) shadowWithLevel:1 - highlightedBackColor.brightnessComponent]; + } + } + + backgroundColor = backgroundColor ? : [NSColor controlBackgroundColor]; + borderColor = borderColor ? : isNative ? [NSColor gridColor] : nil; + preeditBackgroundColor = preeditBackgroundColor ? : isNative ? [NSColor windowBackgroundColor] : nil; + candidateTextColor = candidateTextColor ? : [NSColor controlTextColor]; + highlightedCandidateTextColor = highlightedCandidateTextColor ? : [NSColor selectedMenuItemTextColor]; + highlightedCandidateBackColor = highlightedCandidateBackColor ? : isNative ? [NSColor alternateSelectedControlColor] : nil; + candidateLabelColor = candidateLabelColor ? : isNative ? accentColor : blendColors(highlightedCandidateBackColor, highlightedCandidateTextColor); + highlightedCandidateLabelColor = highlightedCandidateLabelColor ? : isNative ? [NSColor alternateSelectedControlTextColor] : blendColors(highlightedCandidateTextColor, highlightedCandidateBackColor); + commentTextColor = commentTextColor ? : secondaryTextColor; + highlightedCommentTextColor = highlightedCommentTextColor ? : [NSColor alternateSelectedControlTextColor]; + textColor = textColor ? textColor : [NSColor textColor]; + highlightedTextColor = highlightedTextColor ? : [NSColor selectedTextColor]; + highlightedBackColor = highlightedBackColor ? : isNative ? [NSColor selectedTextBackgroundColor] : nil; attrs[NSForegroundColorAttributeName] = candidateTextColor; highlightedAttrs[NSForegroundColorAttributeName] = highlightedCandidateTextColor; @@ -1956,52 +2690,56 @@ +(void)updateTheme:(SquirrelTheme *)theme withConfig:(SquirrelConfig *)config fo commentHighlightedAttrs[NSForegroundColorAttributeName] = highlightedCommentTextColor; preeditAttrs[NSForegroundColorAttributeName] = textColor; preeditHighlightedAttrs[NSForegroundColorAttributeName] = highlightedTextColor; - - [theme setStatusMessageType:statusMessageType]; - - [theme setAttrs:attrs - highlightedAttrs:highlightedAttrs - labelAttrs:labelAttrs - labelHighlightedAttrs:labelHighlightedAttrs - commentAttrs:commentAttrs - commentHighlightedAttrs:commentHighlightedAttrs - preeditAttrs:preeditAttrs - preeditHighlightedAttrs:preeditHighlightedAttrs]; + pagingAttrs[NSForegroundColorAttributeName] = linear ? candidateLabelColor : textColor; + pagingHighlightedAttrs[NSForegroundColorAttributeName] = linear ? highlightedCandidateLabelColor : highlightedTextColor; + statusAttrs[NSForegroundColorAttributeName] = commentTextColor; + + NSSize edgeInset = vertical ? NSMakeSize(MAX(borderHeight.doubleValue, 0), MAX(borderWidth.doubleValue, 0)) : + NSMakeSize(MAX(borderWidth.doubleValue, 0), MAX(borderHeight.doubleValue, 0)); + + [theme setCornerRadius:MIN(cornerRadius.doubleValue, lineHeight / 2) + highlightedCornerRadius:MIN(highlightedCornerRadius.doubleValue, lineHeight / 3) + separatorWidth:separatorWidth + edgeInset:edgeInset + linespace:MAX(lineSpacing.doubleValue, 0) + preeditLinespace:MAX(spacing.doubleValue, 0) + alpha:(alpha ? MIN(MAX(alpha.doubleValue, 0.0), 1.0) : 1.0) + translucency:(translucency ? MIN(MAX(translucency.doubleValue, 0.0), 1.0) : 0.0) + lineLength:lineLength.doubleValue ? MAX(lineLength.doubleValue, separatorWidth * 5) : 0.0 + showPaging:showPaging.boolValue + rememberSize:rememberSize.boolValue + tabled:tabled + linear:linear + vertical:vertical + inlinePreedit:inlinePreedit.boolValue + inlineCandidate:inlineCandidate.boolValue]; + + [theme setAttrs:attrs + highlightedAttrs:highlightedAttrs + labelAttrs:labelAttrs + labelHighlightedAttrs:labelHighlightedAttrs + commentAttrs:commentAttrs + commentHighlightedAttrs:commentHighlightedAttrs + preeditAttrs:preeditAttrs + preeditHighlightedAttrs:preeditHighlightedAttrs + pagingAttrs:pagingAttrs + pagingHighlightedAttrs:pagingHighlightedAttrs + statusAttrs:statusAttrs]; [theme setParagraphStyle:paragraphStyle - preeditParagraphStyle:preeditParagraphStyle]; + preeditParagraphStyle:preeditParagraphStyle + pagingParagraphStyle:pagingParagraphStyle + statusParagraphStyle:statusParagraphStyle]; [theme setBackgroundColor:backgroundColor - highlightedBackColor:highlightedCandidateBackColor - candidateBackColor:candidateBackColor + backgroundImage:backgroundImage + highlightedStripColor:highlightedCandidateBackColor highlightedPreeditColor:highlightedBackColor preeditBackgroundColor:preeditBackgroundColor borderColor:borderColor]; - NSSize edgeInset; - if (vertical) { - edgeInset = NSMakeSize(borderHeight + cornerRadius, borderWidth + cornerRadius); - } else { - edgeInset = NSMakeSize(borderWidth + cornerRadius, borderHeight + cornerRadius); - } - - [theme setCornerRadius:cornerRadius - hilitedCornerRadius:hilitedCornerRadius - srdExtraExpansion:surroundingExtraExpansion - shadowSize:shadowSize - edgeInset:edgeInset - borderWidth:MIN(borderHeight, borderWidth) - linespace:lineSpacing - preeditLinespace:spacing - alpha:alpha - translucency:translucency - mutualExclusive:mutualExclusive - linear:linear - vertical:vertical - inlinePreedit:inlinePreedit - inlineCandidate:inlineCandidate]; - - theme.native = isNative; - theme.candidateFormat = (candidateFormat ? candidateFormat : kDefaultCandidateFormat); + [theme setCandidateFormat:candidateFormat ? : kDefaultCandidateFormat]; + [theme setStatusMessageType:statusMessageType]; } + @end diff --git a/action-install.sh b/action-install.sh index 8f17d2e4e..e06071daa 100755 --- a/action-install.sh +++ b/action-install.sh @@ -2,14 +2,14 @@ set -e -rime_version=1.8.5 -rime_git_hash=08dd95f +rime_version=1.9.0m +rime_git_hash=434e898 rime_archive="rime-${rime_git_hash}-macOS.tar.bz2" -rime_download_url="https://github.com/rime/librime/releases/download/${rime_version}/${rime_archive}" +rime_download_url="https://github.com/groverlynn/librime/releases/download/${rime_version}/${rime_archive}" rime_deps_archive="rime-deps-${rime_git_hash}-macOS.tar.bz2" -rime_deps_download_url="https://github.com/rime/librime/releases/download/${rime_version}/${rime_deps_archive}" +rime_deps_download_url="https://github.com/groverlynn/librime/releases/download/${rime_version}/${rime_deps_archive}" mkdir -p download && ( cd download diff --git a/en.lproj/Localizable.strings b/en.lproj/Localizable.strings index 5e91f7017..54e4d7228 100644 --- a/en.lproj/Localizable.strings +++ b/en.lproj/Localizable.strings @@ -4,13 +4,8 @@ "deploy_start" = "Deploying Rime input method engine."; "deploy_success" = "Squirrel is ready."; "deploy_failure" = "Error occurred. See log file $TMPDIR/rime.squirrel.INFO."; -"ascii_mode" = "A"; -"!ascii_mode" = "中"; -"full_shape" = "Full shape"; -"!full_shape" = "Half shape"; -"ascii_punct" = ".,"; -"!ascii_punct" = "。,"; -"simplification" = "Simplified"; -"!simplification" = "Traditional"; -"extended_charset" = "CJK extended"; -"!extended_charset" = "CJK baseset"; + +"problematic_launch" = "Problematic launch detected! \ + Squirrel may be suffering a crash due to imporper configuration. \ + Revert previous modifications to see if the problem recurs."; +"say_voice" = "Alex"; diff --git a/input_source.m b/input_source.m index 9118fe62f..58b659a44 100644 --- a/input_source.m +++ b/input_source.m @@ -1,18 +1,18 @@ #import static const unsigned char kInstallLocation[] = - "/Library/Input Methods/Squirrel.app"; + "/Library/Input Methods/Squirrel.app"; static NSString *const kHansInputModeID = - @"im.rime.inputmethod.Squirrel.Hans"; + @"im.rime.inputmethod.Squirrel.Hans"; static NSString *const kHantInputModeID = - @"im.rime.inputmethod.Squirrel.Hant"; + @"im.rime.inputmethod.Squirrel.Hant"; #define HANS_INPUT_MODE (1 << 0) #define HANT_INPUT_MODE (1 << 1) void RegisterInputSource(void) { CFURLRef installedLocationURL = CFURLCreateFromFileSystemRepresentation( - NULL, kInstallLocation, strlen((const char *)kInstallLocation), NO); + NULL, kInstallLocation, strlen((const char *)kInstallLocation), NO); if (installedLocationURL) { TISRegisterInputSource(installedLocationURL); CFRelease(installedLocationURL); @@ -29,13 +29,13 @@ void ActivateInputSource(int enabled_modes) { inputSource, kTISPropertyInputSourceID)); //NSLog(@"Examining input source: %@", sourceID); if (([sourceID isEqualToString:kHansInputModeID] && - ((enabled_modes & HANS_INPUT_MODE) != 0)) || + ((enabled_modes & HANS_INPUT_MODE) != 0)) || ([sourceID isEqualToString:kHantInputModeID] && - ((enabled_modes & HANT_INPUT_MODE) != 0))) { + ((enabled_modes & HANT_INPUT_MODE) != 0))) { TISEnableInputSource(inputSource); NSLog(@"Enabled input source: %@", sourceID); CFBooleanRef isSelectable = (CFBooleanRef)TISGetInputSourceProperty( - inputSource, kTISPropertyInputSourceIsSelectCapable); + inputSource, kTISPropertyInputSourceIsSelectCapable); if (CFBooleanGetValue(isSelectable)) { TISSelectInputSource(inputSource); NSLog(@"Selected input source: %@", sourceID); @@ -80,10 +80,11 @@ int GetEnabledInputModes(void) { CFBooleanRef isEnabled = (CFBooleanRef)(TISGetInputSourceProperty( inputSource, kTISPropertyInputSourceIsEnabled)); if (CFBooleanGetValue(isEnabled)) { - if ([sourceID isEqualToString:kHansInputModeID]) + if ([sourceID isEqualToString:kHansInputModeID]) { input_modes |= HANS_INPUT_MODE; - else if ([sourceID isEqualToString:kHantInputModeID]) + } else if ([sourceID isEqualToString:kHantInputModeID]) { input_modes |= HANT_INPUT_MODE; + } } } } diff --git a/librime b/librime index 8911db66b..434e89835 160000 --- a/librime +++ b/librime @@ -1 +1 @@ -Subproject commit 8911db66b0e5d43c2c3e47ffec06bfd10201daae +Subproject commit 434e89835214d5522c2bb10678fb15f75236d4f4 diff --git a/macos_keycode.h b/macos_keycode.h index 839bc7605..ef88b3dbd 100644 --- a/macos_keycode.h +++ b/macos_keycode.h @@ -4,11 +4,11 @@ // masks -#define OSX_CAPITAL_MASK 1 << 16 -#define OSX_SHIFT_MASK 1 << 17 -#define OSX_CTRL_MASK 1 << 18 -#define OSX_ALT_MASK 1 << 19 -#define OSX_COMMAND_MASK 1 << 20 +#define OSX_CAPITAL_MASK 1 << 16 +#define OSX_SHIFT_MASK 1 << 17 +#define OSX_CTRL_MASK 1 << 18 +#define OSX_ALT_MASK 1 << 19 +#define OSX_COMMAND_MASK 1 << 20 // key codes // @@ -18,218 +18,218 @@ // ---------------------------------------- // alphabet -#define OSX_VK_A 0x0 -#define OSX_VK_B 0xb -#define OSX_VK_C 0x8 -#define OSX_VK_D 0x2 -#define OSX_VK_E 0xe -#define OSX_VK_F 0x3 -#define OSX_VK_G 0x5 -#define OSX_VK_H 0x4 -#define OSX_VK_I 0x22 -#define OSX_VK_J 0x26 -#define OSX_VK_K 0x28 -#define OSX_VK_L 0x25 -#define OSX_VK_M 0x2e -#define OSX_VK_N 0x2d -#define OSX_VK_O 0x1f -#define OSX_VK_P 0x23 -#define OSX_VK_Q 0xc -#define OSX_VK_R 0xf -#define OSX_VK_S 0x1 -#define OSX_VK_T 0x11 -#define OSX_VK_U 0x20 -#define OSX_VK_V 0x9 -#define OSX_VK_W 0xd -#define OSX_VK_X 0x7 -#define OSX_VK_Y 0x10 -#define OSX_VK_Z 0x6 +#define OSX_VK_A 0x0 +#define OSX_VK_B 0xb +#define OSX_VK_C 0x8 +#define OSX_VK_D 0x2 +#define OSX_VK_E 0xe +#define OSX_VK_F 0x3 +#define OSX_VK_G 0x5 +#define OSX_VK_H 0x4 +#define OSX_VK_I 0x22 +#define OSX_VK_J 0x26 +#define OSX_VK_K 0x28 +#define OSX_VK_L 0x25 +#define OSX_VK_M 0x2e +#define OSX_VK_N 0x2d +#define OSX_VK_O 0x1f +#define OSX_VK_P 0x23 +#define OSX_VK_Q 0xc +#define OSX_VK_R 0xf +#define OSX_VK_S 0x1 +#define OSX_VK_T 0x11 +#define OSX_VK_U 0x20 +#define OSX_VK_V 0x9 +#define OSX_VK_W 0xd +#define OSX_VK_X 0x7 +#define OSX_VK_Y 0x10 +#define OSX_VK_Z 0x6 // ---------------------------------------- // number -#define OSX_VK_KEY_0 0x1d -#define OSX_VK_KEY_1 0x12 -#define OSX_VK_KEY_2 0x13 -#define OSX_VK_KEY_3 0x14 -#define OSX_VK_KEY_4 0x15 -#define OSX_VK_KEY_5 0x17 -#define OSX_VK_KEY_6 0x16 -#define OSX_VK_KEY_7 0x1a -#define OSX_VK_KEY_8 0x1c -#define OSX_VK_KEY_9 0x19 +#define OSX_VK_KEY_0 0x1d +#define OSX_VK_KEY_1 0x12 +#define OSX_VK_KEY_2 0x13 +#define OSX_VK_KEY_3 0x14 +#define OSX_VK_KEY_4 0x15 +#define OSX_VK_KEY_5 0x17 +#define OSX_VK_KEY_6 0x16 +#define OSX_VK_KEY_7 0x1a +#define OSX_VK_KEY_8 0x1c +#define OSX_VK_KEY_9 0x19 // ---------------------------------------- // symbol // BACKQUOTE is also known as grave accent or backtick. -#define OSX_VK_BACKQUOTE 0x32 -#define OSX_VK_BACKSLASH 0x2a -#define OSX_VK_BRACKET_LEFT 0x21 -#define OSX_VK_BRACKET_RIGHT 0x1e -#define OSX_VK_COMMA 0x2b -#define OSX_VK_DOT 0x2f -#define OSX_VK_EQUAL 0x18 -#define OSX_VK_MINUS 0x1b -#define OSX_VK_QUOTE 0x27 -#define OSX_VK_SEMICOLON 0x29 -#define OSX_VK_SLASH 0x2c +#define OSX_VK_BACKQUOTE 0x32 +#define OSX_VK_BACKSLASH 0x2a +#define OSX_VK_BRACKET_LEFT 0x21 +#define OSX_VK_BRACKET_RIGHT 0x1e +#define OSX_VK_COMMA 0x2b +#define OSX_VK_DOT 0x2f +#define OSX_VK_EQUAL 0x18 +#define OSX_VK_MINUS 0x1b +#define OSX_VK_QUOTE 0x27 +#define OSX_VK_SEMICOLON 0x29 +#define OSX_VK_SLASH 0x2c // ---------------------------------------- // keypad -#define OSX_VK_KEYPAD_0 0x52 -#define OSX_VK_KEYPAD_1 0x53 -#define OSX_VK_KEYPAD_2 0x54 -#define OSX_VK_KEYPAD_3 0x55 -#define OSX_VK_KEYPAD_4 0x56 -#define OSX_VK_KEYPAD_5 0x57 -#define OSX_VK_KEYPAD_6 0x58 -#define OSX_VK_KEYPAD_7 0x59 -#define OSX_VK_KEYPAD_8 0x5b -#define OSX_VK_KEYPAD_9 0x5c -#define OSX_VK_KEYPAD_CLEAR 0x47 -#define OSX_VK_KEYPAD_COMMA 0x5f -#define OSX_VK_KEYPAD_DOT 0x41 -#define OSX_VK_KEYPAD_EQUAL 0x51 -#define OSX_VK_KEYPAD_MINUS 0x4e -#define OSX_VK_KEYPAD_MULTIPLY 0x43 -#define OSX_VK_KEYPAD_PLUS 0x45 -#define OSX_VK_KEYPAD_SLASH 0x4b +#define OSX_VK_KEYPAD_0 0x52 +#define OSX_VK_KEYPAD_1 0x53 +#define OSX_VK_KEYPAD_2 0x54 +#define OSX_VK_KEYPAD_3 0x55 +#define OSX_VK_KEYPAD_4 0x56 +#define OSX_VK_KEYPAD_5 0x57 +#define OSX_VK_KEYPAD_6 0x58 +#define OSX_VK_KEYPAD_7 0x59 +#define OSX_VK_KEYPAD_8 0x5b +#define OSX_VK_KEYPAD_9 0x5c +#define OSX_VK_KEYPAD_CLEAR 0x47 +#define OSX_VK_KEYPAD_COMMA 0x5f +#define OSX_VK_KEYPAD_DOT 0x41 +#define OSX_VK_KEYPAD_EQUAL 0x51 +#define OSX_VK_KEYPAD_MINUS 0x4e +#define OSX_VK_KEYPAD_MULTIPLY 0x43 +#define OSX_VK_KEYPAD_PLUS 0x45 +#define OSX_VK_KEYPAD_SLASH 0x4b // ---------------------------------------- // special -#define OSX_VK_DELETE 0x33 -#define OSX_VK_ENTER 0x4c -#define OSX_VK_ENTER_POWERBOOK 0x34 -#define OSX_VK_ESCAPE 0x35 -#define OSX_VK_FORWARD_DELETE 0x75 -#define OSX_VK_HELP 0x72 -#define OSX_VK_RETURN 0x24 -#define OSX_VK_SPACE 0x31 -#define OSX_VK_TAB 0x30 +#define OSX_VK_DELETE 0x33 +#define OSX_VK_ENTER 0x4c +#define OSX_VK_ENTER_POWERBOOK 0x34 +#define OSX_VK_ESCAPE 0x35 +#define OSX_VK_FORWARD_DELETE 0x75 +#define OSX_VK_HELP 0x72 +#define OSX_VK_RETURN 0x24 +#define OSX_VK_SPACE 0x31 +#define OSX_VK_TAB 0x30 // ---------------------------------------- // function -#define OSX_VK_F1 0x7a -#define OSX_VK_F2 0x78 -#define OSX_VK_F3 0x63 -#define OSX_VK_F4 0x76 -#define OSX_VK_F5 0x60 -#define OSX_VK_F6 0x61 -#define OSX_VK_F7 0x62 -#define OSX_VK_F8 0x64 -#define OSX_VK_F9 0x65 -#define OSX_VK_F10 0x6d -#define OSX_VK_F11 0x67 -#define OSX_VK_F12 0x6f -#define OSX_VK_F13 0x69 -#define OSX_VK_F14 0x6b -#define OSX_VK_F15 0x71 -#define OSX_VK_F16 0x6a -#define OSX_VK_F17 0x40 -#define OSX_VK_F18 0x4f -#define OSX_VK_F19 0x50 +#define OSX_VK_F1 0x7a +#define OSX_VK_F2 0x78 +#define OSX_VK_F3 0x63 +#define OSX_VK_F4 0x76 +#define OSX_VK_F5 0x60 +#define OSX_VK_F6 0x61 +#define OSX_VK_F7 0x62 +#define OSX_VK_F8 0x64 +#define OSX_VK_F9 0x65 +#define OSX_VK_F10 0x6d +#define OSX_VK_F11 0x67 +#define OSX_VK_F12 0x6f +#define OSX_VK_F13 0x69 +#define OSX_VK_F14 0x6b +#define OSX_VK_F15 0x71 +#define OSX_VK_F16 0x6a +#define OSX_VK_F17 0x40 +#define OSX_VK_F18 0x4f +#define OSX_VK_F19 0x50 // ---------------------------------------- // functional -#define OSX_VK_BRIGHTNESS_DOWN 0x91 -#define OSX_VK_BRIGHTNESS_UP 0x90 -#define OSX_VK_DASHBOARD 0x82 -#define OSX_VK_EXPOSE_ALL 0xa0 -#define OSX_VK_LAUNCHPAD 0x83 -#define OSX_VK_MISSION_CONTROL 0xa0 +#define OSX_VK_BRIGHTNESS_DOWN 0x91 +#define OSX_VK_BRIGHTNESS_UP 0x90 +#define OSX_VK_DASHBOARD 0x82 +#define OSX_VK_EXPOSE_ALL 0xa0 +#define OSX_VK_LAUNCHPAD 0x83 +#define OSX_VK_MISSION_CONTROL 0xa0 // ---------------------------------------- // cursor -#define OSX_VK_CURSOR_UP 0x7e -#define OSX_VK_CURSOR_DOWN 0x7d -#define OSX_VK_CURSOR_LEFT 0x7b -#define OSX_VK_CURSOR_RIGHT 0x7c +#define OSX_VK_CURSOR_UP 0x7e +#define OSX_VK_CURSOR_DOWN 0x7d +#define OSX_VK_CURSOR_LEFT 0x7b +#define OSX_VK_CURSOR_RIGHT 0x7c -#define OSX_VK_PAGEUP 0x74 -#define OSX_VK_PAGEDOWN 0x79 -#define OSX_VK_HOME 0x73 -#define OSX_VK_END 0x77 +#define OSX_VK_PAGEUP 0x74 +#define OSX_VK_PAGEDOWN 0x79 +#define OSX_VK_HOME 0x73 +#define OSX_VK_END 0x77 // ---------------------------------------- // modifiers -#define OSX_VK_CAPSLOCK 0x39 -#define OSX_VK_COMMAND_L 0x37 -#define OSX_VK_COMMAND_R 0x36 -#define OSX_VK_CONTROL_L 0x3b -#define OSX_VK_CONTROL_R 0x3e -#define OSX_VK_FN 0x3f -#define OSX_VK_OPTION_L 0x3a -#define OSX_VK_OPTION_R 0x3d -#define OSX_VK_SHIFT_L 0x38 -#define OSX_VK_SHIFT_R 0x3c +#define OSX_VK_CAPSLOCK 0x39 +#define OSX_VK_COMMAND_L 0x37 +#define OSX_VK_COMMAND_R 0x36 +#define OSX_VK_CONTROL_L 0x3b +#define OSX_VK_CONTROL_R 0x3e +#define OSX_VK_FN 0x3f +#define OSX_VK_OPTION_L 0x3a +#define OSX_VK_OPTION_R 0x3d +#define OSX_VK_SHIFT_L 0x38 +#define OSX_VK_SHIFT_R 0x3c // ---------------------------------------- // pc keyboard -#define OSX_VK_PC_APPLICATION 0x6e -#define OSX_VK_PC_BS 0x33 -#define OSX_VK_PC_DEL 0x75 -#define OSX_VK_PC_INSERT 0x72 -#define OSX_VK_PC_KEYPAD_NUMLOCK 0x47 -#define OSX_VK_PC_PAUSE 0x71 -#define OSX_VK_PC_POWER 0x7f -#define OSX_VK_PC_PRINTSCREEN 0x69 -#define OSX_VK_PC_SCROLLLOCK 0x6b +#define OSX_VK_PC_APPLICATION 0x6e +#define OSX_VK_PC_BS 0x33 +#define OSX_VK_PC_DEL 0x75 +#define OSX_VK_PC_INSERT 0x72 +#define OSX_VK_PC_KEYPAD_NUMLOCK 0x47 +#define OSX_VK_PC_PAUSE 0x71 +#define OSX_VK_PC_POWER 0x7f +#define OSX_VK_PC_PRINTSCREEN 0x69 +#define OSX_VK_PC_SCROLLLOCK 0x6b // ---------------------------------------- // international -#define OSX_VK_DANISH_DOLLAR 0xa -#define OSX_VK_DANISH_LESS_THAN 0x32 - -#define OSX_VK_FRENCH_DOLLAR 0x1e -#define OSX_VK_FRENCH_EQUAL 0x2c -#define OSX_VK_FRENCH_HAT 0x21 -#define OSX_VK_FRENCH_MINUS 0x18 -#define OSX_VK_FRENCH_RIGHT_PAREN 0x1b - -#define OSX_VK_GERMAN_CIRCUMFLEX 0xa -#define OSX_VK_GERMAN_LESS_THAN 0x32 -#define OSX_VK_GERMAN_PC_LESS_THAN 0x80 -#define OSX_VK_GERMAN_QUOTE 0x18 -#define OSX_VK_GERMAN_A_UMLAUT 0x27 -#define OSX_VK_GERMAN_O_UMLAUT 0x29 -#define OSX_VK_GERMAN_U_UMLAUT 0x21 - -#define OSX_VK_ITALIAN_BACKSLASH 0xa -#define OSX_VK_ITALIAN_LESS_THAN 0x32 - -#define OSX_VK_JIS_ATMARK 0x21 -#define OSX_VK_JIS_BRACKET_LEFT 0x1e -#define OSX_VK_JIS_BRACKET_RIGHT 0x2a -#define OSX_VK_JIS_COLON 0x27 -#define OSX_VK_JIS_DAKUON 0x21 -#define OSX_VK_JIS_EISUU 0x66 -#define OSX_VK_JIS_HANDAKUON 0x1e -#define OSX_VK_JIS_HAT 0x18 -#define OSX_VK_JIS_KANA 0x68 -#define OSX_VK_JIS_PC_HAN_ZEN 0x32 -#define OSX_VK_JIS_UNDERSCORE 0x5e -#define OSX_VK_JIS_YEN 0x5d - -#define OSX_VK_RUSSIAN_PARAGRAPH 0xa -#define OSX_VK_RUSSIAN_TILDE 0x32 +#define OSX_VK_DANISH_DOLLAR 0xa +#define OSX_VK_DANISH_LESS_THAN 0x32 + +#define OSX_VK_FRENCH_DOLLAR 0x1e +#define OSX_VK_FRENCH_EQUAL 0x2c +#define OSX_VK_FRENCH_HAT 0x21 +#define OSX_VK_FRENCH_MINUS 0x18 +#define OSX_VK_FRENCH_RIGHT_PAREN 0x1b + +#define OSX_VK_GERMAN_CIRCUMFLEX 0xa +#define OSX_VK_GERMAN_LESS_THAN 0x32 +#define OSX_VK_GERMAN_PC_LESS_THAN 0x80 +#define OSX_VK_GERMAN_QUOTE 0x18 +#define OSX_VK_GERMAN_A_UMLAUT 0x27 +#define OSX_VK_GERMAN_O_UMLAUT 0x29 +#define OSX_VK_GERMAN_U_UMLAUT 0x21 + +#define OSX_VK_ITALIAN_BACKSLASH 0xa +#define OSX_VK_ITALIAN_LESS_THAN 0x32 + +#define OSX_VK_JIS_ATMARK 0x21 +#define OSX_VK_JIS_BRACKET_LEFT 0x1e +#define OSX_VK_JIS_BRACKET_RIGHT 0x2a +#define OSX_VK_JIS_COLON 0x27 +#define OSX_VK_JIS_DAKUON 0x21 +#define OSX_VK_JIS_EISUU 0x66 +#define OSX_VK_JIS_HANDAKUON 0x1e +#define OSX_VK_JIS_HAT 0x18 +#define OSX_VK_JIS_KANA 0x68 +#define OSX_VK_JIS_PC_HAN_ZEN 0x32 +#define OSX_VK_JIS_UNDERSCORE 0x5e +#define OSX_VK_JIS_YEN 0x5d + +#define OSX_VK_RUSSIAN_PARAGRAPH 0xa +#define OSX_VK_RUSSIAN_TILDE 0x32 #define OSX_VK_SPANISH_LESS_THAN 0x32 #define OSX_VK_SPANISH_ORDINAL_INDICATOR 0xa -#define OSX_VK_SWEDISH_LESS_THAN 0x32 -#define OSX_VK_SWEDISH_SECTION 0xa +#define OSX_VK_SWEDISH_LESS_THAN 0x32 +#define OSX_VK_SWEDISH_SECTION 0xa -#define OSX_VK_SWISS_LESS_THAN 0x32 -#define OSX_VK_SWISS_SECTION 0xa +#define OSX_VK_SWISS_LESS_THAN 0x32 +#define OSX_VK_SWISS_SECTION 0xa -#define OSX_VK_UK_SECTION 0xa +#define OSX_VK_UK_SECTION 0xa // conversion functions diff --git a/macos_keycode.m b/macos_keycode.m index fc7f428a9..9912525e8 100644 --- a/macos_keycode.m +++ b/macos_keycode.m @@ -3,8 +3,7 @@ #import -int osx_modifiers_to_rime_modifiers(unsigned long modifiers) -{ +int osx_modifiers_to_rime_modifiers(unsigned long modifiers) { int ret = 0; if (modifiers & OSX_CAPITAL_MASK) @@ -25,93 +24,92 @@ int osx_modifiers_to_rime_modifiers(unsigned long modifiers) int osx_keycode, rime_keycode; } keycode_mappings[] = { // modifiers - {OSX_VK_CAPSLOCK, XK_Caps_Lock}, - {OSX_VK_COMMAND_L, XK_Super_L}, // XK_Meta_L? - {OSX_VK_COMMAND_R, XK_Super_R}, // XK_Meta_R? - {OSX_VK_CONTROL_L, XK_Control_L}, - {OSX_VK_CONTROL_R, XK_Control_R}, - {OSX_VK_FN, XK_Hyper_L}, - {OSX_VK_OPTION_L, XK_Alt_L}, - {OSX_VK_OPTION_R, XK_Alt_R}, - {OSX_VK_SHIFT_L, XK_Shift_L}, - {OSX_VK_SHIFT_R, XK_Shift_R}, + { OSX_VK_CAPSLOCK, XK_Caps_Lock }, + { OSX_VK_COMMAND_L, XK_Super_L }, // XK_Meta_L? + { OSX_VK_COMMAND_R, XK_Super_R }, // XK_Meta_R? + { OSX_VK_CONTROL_L, XK_Control_L }, + { OSX_VK_CONTROL_R, XK_Control_R }, + { OSX_VK_FN, XK_Hyper_L }, + { OSX_VK_OPTION_L, XK_Alt_L }, + { OSX_VK_OPTION_R, XK_Alt_R }, + { OSX_VK_SHIFT_L, XK_Shift_L }, + { OSX_VK_SHIFT_R, XK_Shift_R }, // special - {OSX_VK_DELETE, XK_BackSpace}, - {OSX_VK_ENTER, XK_KP_Enter}, + { OSX_VK_DELETE, XK_BackSpace }, + { OSX_VK_ENTER, XK_KP_Enter }, //OSX_VK_ENTER_POWERBOOK -> ? - {OSX_VK_ESCAPE, XK_Escape}, - {OSX_VK_FORWARD_DELETE, XK_Delete}, + { OSX_VK_ESCAPE, XK_Escape }, + { OSX_VK_FORWARD_DELETE, XK_Delete }, //{OSX_VK_HELP, XK_Help}, // the same keycode with OSX_VK_PC_INSERT - {OSX_VK_RETURN, XK_Return}, - {OSX_VK_SPACE, XK_space}, - {OSX_VK_TAB, XK_Tab}, + { OSX_VK_RETURN, XK_Return }, + { OSX_VK_SPACE, XK_space }, + { OSX_VK_TAB, XK_Tab }, // function - {OSX_VK_F1, XK_F1}, - {OSX_VK_F2, XK_F2}, - {OSX_VK_F3, XK_F3}, - {OSX_VK_F4, XK_F4}, - {OSX_VK_F5, XK_F5}, - {OSX_VK_F6, XK_F6}, - {OSX_VK_F7, XK_F7}, - {OSX_VK_F8, XK_F8}, - {OSX_VK_F9, XK_F9}, - {OSX_VK_F10, XK_F10}, - {OSX_VK_F11, XK_F11}, - {OSX_VK_F12, XK_F12}, - {OSX_VK_F13, XK_F13}, - {OSX_VK_F14, XK_F14}, - {OSX_VK_F15, XK_F15}, - {OSX_VK_F16, XK_F16}, - {OSX_VK_F17, XK_F17}, - {OSX_VK_F18, XK_F18}, - {OSX_VK_F19, XK_F19}, + { OSX_VK_F1, XK_F1 }, + { OSX_VK_F2, XK_F2 }, + { OSX_VK_F3, XK_F3 }, + { OSX_VK_F4, XK_F4 }, + { OSX_VK_F5, XK_F5 }, + { OSX_VK_F6, XK_F6 }, + { OSX_VK_F7, XK_F7 }, + { OSX_VK_F8, XK_F8 }, + { OSX_VK_F9, XK_F9 }, + { OSX_VK_F10, XK_F10 }, + { OSX_VK_F11, XK_F11 }, + { OSX_VK_F12, XK_F12 }, + { OSX_VK_F13, XK_F13 }, + { OSX_VK_F14, XK_F14 }, + { OSX_VK_F15, XK_F15 }, + { OSX_VK_F16, XK_F16 }, + { OSX_VK_F17, XK_F17 }, + { OSX_VK_F18, XK_F18 }, + { OSX_VK_F19, XK_F19 }, // cursor - {OSX_VK_CURSOR_UP, XK_Up}, - {OSX_VK_CURSOR_DOWN, XK_Down}, - {OSX_VK_CURSOR_LEFT, XK_Left}, - {OSX_VK_CURSOR_RIGHT, XK_Right}, - {OSX_VK_PAGEUP, XK_Page_Up}, - {OSX_VK_PAGEDOWN, XK_Page_Down}, - {OSX_VK_HOME, XK_Home}, - {OSX_VK_END, XK_End}, + { OSX_VK_CURSOR_UP, XK_Up }, + { OSX_VK_CURSOR_DOWN, XK_Down }, + { OSX_VK_CURSOR_LEFT, XK_Left }, + { OSX_VK_CURSOR_RIGHT, XK_Right }, + { OSX_VK_PAGEUP, XK_Page_Up }, + { OSX_VK_PAGEDOWN, XK_Page_Down }, + { OSX_VK_HOME, XK_Home }, + { OSX_VK_END, XK_End }, // keypad - {OSX_VK_KEYPAD_0, XK_KP_0}, - {OSX_VK_KEYPAD_1, XK_KP_1}, - {OSX_VK_KEYPAD_2, XK_KP_2}, - {OSX_VK_KEYPAD_3, XK_KP_3}, - {OSX_VK_KEYPAD_4, XK_KP_4}, - {OSX_VK_KEYPAD_5, XK_KP_5}, - {OSX_VK_KEYPAD_6, XK_KP_6}, - {OSX_VK_KEYPAD_7, XK_KP_7}, - {OSX_VK_KEYPAD_8, XK_KP_8}, - {OSX_VK_KEYPAD_9, XK_KP_9}, + { OSX_VK_KEYPAD_0, XK_KP_0 }, + { OSX_VK_KEYPAD_1, XK_KP_1 }, + { OSX_VK_KEYPAD_2, XK_KP_2 }, + { OSX_VK_KEYPAD_3, XK_KP_3 }, + { OSX_VK_KEYPAD_4, XK_KP_4 }, + { OSX_VK_KEYPAD_5, XK_KP_5 }, + { OSX_VK_KEYPAD_6, XK_KP_6 }, + { OSX_VK_KEYPAD_7, XK_KP_7 }, + { OSX_VK_KEYPAD_8, XK_KP_8 }, + { OSX_VK_KEYPAD_9, XK_KP_9 }, //OSX_VK_KEYPAD_CLEAR -> ? - {OSX_VK_KEYPAD_COMMA, XK_KP_Separator}, - {OSX_VK_KEYPAD_DOT, XK_KP_Decimal}, - {OSX_VK_KEYPAD_EQUAL, XK_KP_Equal}, - {OSX_VK_KEYPAD_MINUS, XK_KP_Subtract}, - {OSX_VK_KEYPAD_MULTIPLY, XK_KP_Multiply}, - {OSX_VK_KEYPAD_PLUS, XK_KP_Add}, - {OSX_VK_KEYPAD_SLASH, XK_KP_Divide}, + { OSX_VK_KEYPAD_COMMA, XK_KP_Separator }, + { OSX_VK_KEYPAD_DOT, XK_KP_Decimal }, + { OSX_VK_KEYPAD_EQUAL, XK_KP_Equal }, + { OSX_VK_KEYPAD_MINUS, XK_KP_Subtract }, + { OSX_VK_KEYPAD_MULTIPLY, XK_KP_Multiply }, + { OSX_VK_KEYPAD_PLUS, XK_KP_Add }, + { OSX_VK_KEYPAD_SLASH, XK_KP_Divide }, // pc keyboard - {OSX_VK_PC_APPLICATION, XK_Menu}, - {OSX_VK_PC_INSERT, XK_Insert}, - {OSX_VK_PC_KEYPAD_NUMLOCK, XK_Num_Lock}, - {OSX_VK_PC_PAUSE, XK_Pause}, + { OSX_VK_PC_APPLICATION, XK_Menu }, + { OSX_VK_PC_INSERT, XK_Insert }, + { OSX_VK_PC_KEYPAD_NUMLOCK, XK_Num_Lock }, + { OSX_VK_PC_PAUSE, XK_Pause }, //OSX_VK_PC_POWER -> ? - {OSX_VK_PC_PRINTSCREEN, XK_Print}, - {OSX_VK_PC_SCROLLLOCK, XK_Scroll_Lock}, + { OSX_VK_PC_PRINTSCREEN, XK_Print }, + { OSX_VK_PC_SCROLLLOCK, XK_Scroll_Lock }, - {-1, -1} + { -1, -1 } }; -int osx_keycode_to_rime_keycode(int keycode, int keychar, int shift, int caps) -{ +int osx_keycode_to_rime_keycode(int keycode, int keychar, int shift, int caps) { for (struct keycode_mapping_t *mapping = keycode_mappings; mapping->osx_keycode >= 0; ++mapping) { @@ -128,20 +126,15 @@ int osx_keycode_to_rime_keycode(int keycode, int keychar, int shift, int caps) if (keychar >= 0x20 && keychar <= 0x7e) { return keychar; - } - else if (keychar == 0x1b) { // ^[ + } else if (keychar == 0x1b) { // ^[ return XK_bracketleft; - } - else if (keychar == 0x1c) { // ^\ + } else if (keychar == 0x1c) { // ^\ return XK_backslash; - } - else if (keychar == 0x1d) { // ^] + } else if (keychar == 0x1d) { // ^] return XK_bracketright; - } - else if (keychar == 0x1f) { // ^_ + } else if (keychar == 0x1f) { // ^_ return XK_minus; } return XK_VoidSymbol; } - diff --git a/main.m b/main.m index 2a1a556f3..fba429e0b 100644 --- a/main.m +++ b/main.m @@ -20,7 +20,7 @@ int main(int argc, char *argv[]) { if (argc > 1 && !strcmp("--quit", argv[1])) { NSString *bundleId = [NSBundle mainBundle].bundleIdentifier; NSArray *runningSquirrels = - [NSRunningApplication runningApplicationsWithBundleIdentifier:bundleId]; + [NSRunningApplication runningApplicationsWithBundleIdentifier:bundleId]; for (NSRunningApplication *squirrelApp in runningSquirrels) { [squirrelApp terminate]; } @@ -29,8 +29,8 @@ int main(int argc, char *argv[]) { if (argc > 1 && !strcmp("--reload", argv[1])) { [[NSDistributedNotificationCenter defaultCenter] - postNotificationName:@"SquirrelReloadNotification" - object:nil]; + postNotificationName:@"SquirrelReloadNotification" + object:nil]; return 0; } @@ -56,8 +56,8 @@ int main(int argc, char *argv[]) { if (argc > 1 && !strcmp("--sync", argv[1])) { [[NSDistributedNotificationCenter defaultCenter] - postNotificationName:@"SquirrelSyncNotification" - object:nil]; + postNotificationName:@"SquirrelSyncNotification" + object:nil]; return 0; } @@ -65,8 +65,8 @@ int main(int argc, char *argv[]) { // find the bundle identifier and then initialize the input method server NSBundle *main = [NSBundle mainBundle]; IMKServer *server __unused = - [[IMKServer alloc] initWithName:(NSString *)kConnectionName - bundleIdentifier:main.bundleIdentifier]; + [[IMKServer alloc] initWithName:(NSString *)kConnectionName + bundleIdentifier:main.bundleIdentifier]; // load the bundle explicitly because in this case the input method is a // background only application @@ -74,16 +74,18 @@ int main(int argc, char *argv[]) { // opencc will be configured with relative dictionary paths [[NSFileManager defaultManager] - changeCurrentDirectoryPath:main.sharedSupportPath]; + changeCurrentDirectoryPath:main.sharedSupportPath]; if (NSApp.squirrelAppDelegate.problematicLaunchDetected) { NSLog(@"Problematic launch detected!"); - NSArray *args = @[ - @"Problematic launch detected! \ - Squirrel may be suffering a crash due to imporper configuration. \ - Revert previous modifications to see if the problem recurs." - ]; - [NSTask launchedTaskWithLaunchPath:@"/usr/bin/say" arguments:args]; + NSArray *args = @[@"-v", NSLocalizedString(@"say_voice", nil), + NSLocalizedString(@"problematic_launch", nil)]; + if (@available(macOS 10.13, *)) { + [NSTask launchedTaskWithExecutableURL:[NSURL fileURLWithPath:@"/usr/bin/say"] + arguments:args error:nil terminationHandler:nil]; + } else { + [NSTask launchedTaskWithLaunchPath:@"/usr/bin/say" arguments:args]; + } } else { [NSApp.squirrelAppDelegate setupRime]; [NSApp.squirrelAppDelegate startRimeWithFullCheck:NO]; diff --git a/plum b/plum index 3d06432dd..6f502ff6f 160000 --- a/plum +++ b/plum @@ -1 +1 @@ -Subproject commit 3d06432dda5fd1738bebda298c574b6ed2d512d8 +Subproject commit 6f502ff6fa87789847fa18200415318e705bffa4 diff --git a/rime.pdf b/rime.pdf index 48c079546440a4e05f9cdba4131646bb783a1b08..be69811f27f7ae35ba101b204cbdd315f0366617 100644 GIT binary patch delta 38032 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 tL6(FD_V~~%R zpr9meYtZ8*Bv3+mA~!N9$vBe7X(*s1ZPY;8;Dl6%7Y}OjUncik4nlV%`{{TNgrdt=esyKZH zaxn?G%4XfVRkfj%@Q0I;iz_sX7-PI8xwiLupkHl@d}1ff1@sDI#Rf z-y@_CyKDx!NEr;&9|yhhU|=jtcbq9i(7~*T!)*b;m~hZfDhlq-6p{v~S!zPyaw8278>gZrR90sihH%v7ZoM8HJGg2K%{a4gqiQB;G?7$NPp$r5PO0xx?--88R zfEN5T@j-`EWoq2xPkG|BH0UK1LUHOX`yoTG23<&(7n8uxii=5L+#r)^1e8I~ls^y* z9(CZcQi2S)gH#b^Fc?u&XC4FTlgVISFa4e=QAXT&Py@~)2CYI zECn{u1*VXZ5eyhHad*|FG-u#L(((Wu2ey|MK>9s%19gg7I5jr9BPnT=66kPR&XmDG z@DeNmY^I7ELL1Bia`S@wqzCcA4(niW%yi162HV1=z;?+go(Md+!jF5^KCJ^Z4a5b& zs_8TugN{(?;K(Dmgo4shG6^i=(!f;;oj^iL7-TAihSDh%3WJd{XF50_t%OFW!ekN| zrO;^vI>Mlqpx`@9LMh;AdICZN8p)v231BczbtmOI0IyUZGyP2UHP=tjbY^Ni^#TmD z&Ckdz*Hi$=)3mkP?cjPXgR49UZh5#Zl(g7@&|+Ds)6(Mn52gMmJp?`flRI`xMR*lp z#n|C31y+%|7i};<=&(GnAsR}c6Vh*KNtOWBNWH-Dfx-+F1Tg>E6-N3+qaqYKLIzHx zg#LF|GT5X>KM*Zu)ejxamOf}343|h%z{WxEz|iVR1(nU7FcPQ7nn(RIl|ms=A9BoT zqcVbU&}+ehmcgk(s%RT@zn1=oH|my57-udY3fB$z%4Y=L*7s{`?GUf zCyZ*^bAqJaT&KR=BD?>C>Ez<`M>SVIy?^yP^~?{>NFtOQ<8F&)&-mul$JgFpA&L=8 zm+SeKwKuw5d-eSOwVjSd1|{ck->H0O#pF@<0SIk*LN-baz|0&odP7x z$m>FMLd)|n-#h!kp@$UWIN*Mb;K3)2Krvq2oC*G}hT~Mz{ z=h1ge*CTUZm#^MeDZKVJEK=5Q?V9m2*0I~-rQR0HEXvva3FA3)U;lc=&54xe%T64* z{ZX;#`N--6ZTPIwil$%1P0O~n8y6VgdM3Pkskn3(ar?mj+kcveYi9Z@XLLO_VPN;( z)8uuSla|;Ew7+cq=OAm3&G($$yTghZ2e^AglZe!fA9llpODb7A_IDrATSe-G#y|Kh zF?hS-oyzqCx*vJ#<)KRo_pq&=)31HKwN0n8i_(wQR8X|1I-ef2cFoG4n$JbAv8^rI zA1$DKQ;FquqCgempSQ+cE5xyD1#KG-Suz}dtq>n?a|}@u^#3Y(aonA=`-D4hS+t_j<(nDPe~&v>1qoUqZ#AilV@LHqHixfAO( z`FYh>uaB58zuz*uV(3Kf2;L#qYkel{qfe>JSe8GIDZ~mE6;+Z-Zc$n;JG`N>*RyBP z0may3TJ1`gYjpduU6$Xx8GN;VP_X2Leb(~5OQ+rQe_y{+&|Q1#y~@W8n|j%&&JJ_81*oU_jFjL*Bg=y~Z{`}LK1B+ZSfn_eCm z?nQ33;Ka?=8zwrxb)PnBb{t(Ua*Ua8>pk@Q7IXhGYt6ut^V@$sb75Pz3umWKZa#Ow z_2rJU1ICVRTt83$rO#JU0Zm*+px7rC59(gDyjHg!H+9{M>VHtD$CQ6?=hiybsF2yR z9<%wfb~-^98R4M9-KOh7tlbzaAEzq{1%dnqo%!Q7=^K8+n%HaVR95Txy_ETV&X4Lo zX5Oq);j$C^w)7ldk1^>|fAXDm>(=c0?d)5U(&rnY+JX4Y^-G$fE5F4A3vS$>)O%fA zwDK};{bYZ>CbI1WyY=$*+YX$)-(l#PTk-ooxnlGlxbZUmSAx8^zY!1G*dSPV@jb3# zczx?89+uA+(wps3bc~$A5@RIe_cj=@a~N|(-RH(W_vQNJhJ!^ve=O;+8@+-YY-j%N z=9DFg9t+6eW6>Kc*vqf+mi^n{8K2y-?aJc2`?p*=H0W5F`f$t|TlU-Zd7FB)f;k+R z-p@X4*!Va1j;!BcMD3AHd%^wt(mwxwkoc_e*bhfmkPCKm3#IcbU;fs8@!M~;YkyuK z{?R?VGWhM7q3Gn5nz2V)y!`$TljkPJg_pno)~5>W+A+y0-Rxxa#@M5W68-0G|5;P= z$(^Y!uaBMd$u-|L^nCHD)BQ=8CcpH-y{SFcf7ZwH-O@dgrDZ$MSnPe*_usvUe~*2| zedFlqf}Vv-l(PEIj~!St|F|t|TtDcG+t~g_GuIxz)>!=7lHcB=Pp#W!)Kt@cL6_0( zOdoU^N2nAOOz5@wgK2eow5-dRT9-Mso{+wJf8}Y*aoq(YLmhPA;E+gvwwx>JpyHtiNC(k1OkSVdJN_?(Kf%-)(8HbWGf>q(5J>=8a2@ zdu={pn%I^b$QMk@A3vh$3;3KsgAR^Wn+{HX51zEI-=zJ5cHw)g_D$)1`vZ21py5*9 zWjHdp9X^7!ycT!5bOPs+Xh1>hxkYnN?C(Bd)HM23PUYTh>woN?f0Er~&xRFC7S5{d zzPT{5Y})Z-63G$Ki};A=I>glyP8qpZp`>H*{q{efKC}lh?x_Dgod2*v~{f%PphMPBc=*_Qj zsh{lkChopRZz+&Sily?eUKV`NBXxPmvF8e)GKv zJqHvn{MVazUS0J57uU=Cd}5w_|K^oTv-aFPb?Vz?%Vwy%7xiQITwPf>!Mz>bLfT5+ zwmC{X`o_MN;$B$z?b5e;?=IW3=hCF!&3AsC$G7()mvJQO0cCCMUk-2BeNMl_J)?8x zySt!sCF2W)d5tRbzrHuUphsR^;iUcaN)i2Hy>5BJN`jD)*A=NONNhgTeV)DYP`6p? zOQS05jUY5o68LQtoN1hvjQuUU@)`=8e@&lq>E5QXofBUM_;X*+f1NN&&Jr@GyjQeJ zG7K17zgkUOcI?;>{<6;4ddT5=`=<7J7q&7N>xc9zYFF?AYx)>TdvnwFX2PWU^+N}K zX007qxaSPJoA_9C?F`z*#g+4~?mD^f_DieehJsL=S*I48tXE2xoZq^OeSkMh1MTX5 zV=-%Za5#2&YL8a&es$ZlYuLP5Te_g%kiv2PA@(=-)*e;6V^j9o*J~Sx6b#wBw|0YG za9g_N_ORij#*XZ=q)Xi}@o>$kJqu7%Ya+n`~4j(zWYC9n7M z+sFCs!|cQM?W@xU{s8o}PQwQ zY&gCYD*bVz>cWaXE)irO2Jamq`tn4r#kEJ&2C$O*F&TSL)T+IE7hSnWEaM%L>!Kp`)hf#ylZ+5Pca_1GY0B<$KksIz2gP#@eR-l~t9OUgu3PW9ydu54apTdZ!Xd-H9P(b>HtS9a zYJrkQ?R$MWqG7Z4?V8|?8_#d}TppowUei_`@|p;ki{<3odztn2`M>PKsyC)lyXRUp z2O=-pOQ+x7ixtkPbq8qF9C-M}ck6QM7IbV^Xu17m?YVp9%zd@<^Bd1)P4^D@KyYIC zb9G0sfrhs)YuC8(fpe#Lb;h(HOXhqzq;B)(&Fhb@EUZ0kb%$EXT6kBWh;{d0T-;?u zlL5ot#ijyOhff>Ug~b_JH$PugujQPEs9i8DF+@0v7<(??krx47y9G&Ikn!c zHGK5)*X8n}@CHe}=li8vR;$3oYS5}cK4elopq9_|lI5qi0V%z-2_4dYKnb;a~^`8%T#$BmCy zQ1z|LRUduRq22DcZ{EFMdbvT9#+QdfPj?OrPDX;u%F-xno2b9>QX-Q2!j z3z&5dN(S2B{PC-06n?Vzou8M^JHNN+)Sz=0KHmG;jVZ4jK2WxUc`S70RpoCd8+5;O zuD+o=c)782@A<4=$_v}B3%@^qdEw?WBvJXEmu6nt`N?N_CnI-$u>E-A z?uR_-AuY|A;kzTW@({Q8OW1Fmg(WzvUJ<|WAh(QacYnzU^uN@Db{qS~E#Vrwj>YsxLblbdT+zR=zcW%w=q?*g> zGaFwnzPI)Bou8iR33hEML>v6Bnd ztv@wj$$)Ip@^G+T1FS@u;MHwJ38oTLm$T7XYYxde5_vf~~qyC+-EpYPENg;db zbz`4x)NlWRZdf8GA$_8Zl$GcyX8aCkJP+w7pj6 zADV8mOgk{@&7xKfhjm#}yKbvD&qhueHgq}r{H)?m#&0cGuQOEryY0F@7#H*I?b@?q z_k{)96RYI4R6jQ@y{bNT^ap(GVM~`z#M0w)H{JM(?0}CioN_Ymo~f4N_qde%ueC(3 zE5%K=b*#TwJbPf90cKOjuPY(GGCGH#KipikBmdyEA;^ndab;x2Kl=W37@kn<3KOpG zu52Ve1FtUJH2$=)$K{EK4D-5Ij%a8txT)z>uv^UCbH44iNhP$6bB12++iK#upSG?W zl;p3Nc=_50ZQjl$FVKMH`SlcebH{y&B%w|pEmY@duE|v z=ZjmILPs*3Of4HGa0O^Fr^<^{ee6+B=CQXIjrH_~ccqV6~;VZKt03MchxeRSKGl zON7hprfHT|D^-)*elfez;TDTGoOf)lzv}!K&!0W_!J5cBw(D-qftAYj*M&VM ze5oDL)k&P`~1JvslCufJDl=j9E$|KY0d-rn`g*G%5;dC@aizI}kw z-mU)!2TCGhtmBvi-H-{356sxDzF2(lW9eR^*tJaPEFH#(Ng`)6SMw0ur;#{SEv*ehV#+Ewm}y#6QiG{n}&KbWE| zQM9@29B3*Tc^7ngU$H_~1d;Ob5LdNnOvTuGbCD(QW6N&dm%g`cC$#h;E` zvo%j+9kXJ)cKdC(nYdS_XyD5%F{`5WbVB0R-rQTc@|5!z!K(hz-f!L;shx0bgNMP*TkaQDj<7A)7f!Kn>Mx#ub@6!4 zsSnx)4|UqXp4M&lsHtn}EjcKzGwm4bh2x}kMGpHo{mki$IvZYD7swYD2s@7I$PacL z7wBbFkn-k!J)I-W6DrSaxW+J39f#|6eYtCyWtR6J=)KZyyUy+@-83n@?1zu0&13vrPmJ%SENuDWtRYJdwceLE=fwWjygJCv zHz(XE91hZdVPT`n8TS=5wWM_{qZj;RzEx_u&^kW8+Z_L{Gm zfBA-TUVq9*^JRU6KZZZ~?Bqtb=-jdXpI9y}U$bMX@}oA$^>sM#)lEKr>CEq&et*An z+3UXvkC?}dw>6o(X5}k8wug7^h}vH5+aDeH>8Cw<9xcAUV)8emR&6~VS<#8SVL|Wf z%(rC=46&7K%GCY&vrkff-;w-9S#bERUxqJSf1i4myNaf`aO3`lvFCnUeN@qC&)7K? zYqrc=*mrlC#)`k(`Nq&!K0ZCe`uw+N`LkzT>${yR_`$gT!t{AOpRnBiLN8Z`mps!3 z9lyKEgZ_KVdXfIUqnr1~bryt2*GfulPMUz;$v=o2m>QMf% zQts&fGj_~vrFq%P_o-G6+Ve%Xh099Ue|kX^bM0PP{G*JEmoZ-cPJ8M!I{G)YbnudG zQ#MFSFSb4Q;e~l`-g|4qyTs=&p8R_04&h2itw${sf~ z-(L87QMaux-(<|)z39g4Yt9^b%Oj~6)0aDQrK816*uf9F_n}KtZ6^j{#r&{(0j?{bNzjZ*9w4ef#yUySHb}_{O=l zp!3;;?uE`Dt(f}8q~;r*Z+2&O`Kj+)yyINCB2GHJMfl6^Pp8{=U-+u+jdi;h{ygOi zP48tdZtjzqsF?uGUa)e@q?>)0QIEfnJUb_`>tc`Iaq8Rqe{8XM{6G7WXKf(9_IX*~ z{+&PnBstS~Xr1HSjzKHtZ|}``_3EC>$7dvdi+y-k_vZT_%51;iUc3EM{o-r4VxMo> zanpPLlecb1om1Yjy>#LCF2DOS9d|q+mxwB&1$=gN6gSDlx@~x*2fAQm#g+~%Scbl)CzjeuTO66F4UHkd9SMIv= zPX5&8(=Cbbtv?(J_WbRXhK~e`)W}d3mz@ z`|-1E*PUWgg)r&9GGO-X!ABO&UsPUDW-y+U%+E7?|I=HGuIwNmKexEF&-%9nvtPW` zbjfnh8GY=+p0<}x_Po$p^^y11cb~g%+#LGqinXH-j@PW%_?h|gf*U=|S3XLfT5Eo5 z(v;YONUI;meT}}XUA`gl>f0-SK5yF^8R)yI=rf(OX8ZegMAPcf&AZ|6`LXAGc|Vs7 zB;Eh=bSE>-x`(N#Q;o8lfH?Le=%{hADn`;}#yCw`?ThjRsO)TnaU2t+q>z8%h&yL*c zazK6k;-!k`o~I3da}0N7n;t!M$0sW{zDYg1djIarmpUt2P2VjWAldvqhr^YA_SSui z>E%PoyZ*B`+q7-HG4CVv+p<=Z-<&Z2qq3RtXz9-%4E^B*U(?@vx$~ukrCSedJ^bU@ zg}p(D`vQIL?BMht#xptbSW%J8j9S$oZ`f`PqHn-A{(reM}W^1K#@cG-6?UDHP}j z{n^H^mg&dE3y&<@O&qmw6YFW>c>vgd#SyT$JvTT@!Tq+8{z zXDSmwGUR)8=0VM(P6G?O4)}Dx>is@t#h;0OU41}Z z_`|ey@2p?CsQ1l_@0Nbn+kUX9#gE&gw~l&mzIuIKpQvQ|oVlZa_^tVZcS{pn+Yem& zh3DJ*A2XMd=dK=mct|I7^=se!6uUy6J(_>=-mJGHA2`l@(0ui#Z!Y^jx;B#kmeBZ7 z-g3tJ1)AxGojb%EzF(^NViQTTV_)x|&br8L?{EJ<060L$zf!w1nVV*xGJ~aO&Sd_L zyFO;dimYp^mv`3ieAZ0v4Sia9%FLBf(QO{$DSMgAwbvGJ>-KD!&0U{uS(@%1Et8t0 zWP5o&q-hrKSQ*>R-8)Kkd}v+o9xQXsrLCpaQ>)i*C~CbBYka|eOr&7S(~A433X4VA^qr?-)bFcn$MoGJlf;+ z(3x61ugudPqq*H~-J0*ml_o1sUfu5e%w6?vrq5$ER;;USk>c^C!91Tu-qFcQW3+XS zxu)~9q#s&iwrHE@md0un&sOz(4JPiH&)IjYUpneks~^&|ojvW_N;PBpvd~tyh4;Bi zvqwFdCe2oNn@(d@du&aSmFX>6?Hnaio$2*l2g#;xig;_M`PEL{;6bO+Nbe zvF=$!U9>gAJinyhIU4(q|w$!v% z?bgl>p9WR$_)HlWYprSLn?_xF@QhNO+RVh`G*3<4TGcdmbV|*Q2w%IdpVKs_-s3fC z{cACij_J+oO)^{E>!D0zdUsNd=9O*h`kl=*cSXn27+tGohx=nRuS@T7n*F_HTV6fR zG=Ju~W^Eq3xz+M)R~OG=n!8CvylpYltjW%;d2L$OIZZX@vzmu)l*$(l4-F9xA|5J` zkimlog<(KoAUHHYL|8BY6MHpTA^N*70HPAaML}NQ9 zoxfKjAD;76l3FIx(agT;yDsWEV%gEeOSQ9eEK^#vLo7`rG*dLRr|up^E!8?ZS^7}g zH_gsv>Z#EZ>4=tSuT?#VTefG4Shi+%D$-+F^jh1~QtQlaS$Hh#@L+!T?De%n+s*ce z6wUU!>9N-DY^lihv`e$JeeJ8)lemY!rFK&)Of}ny?oM6d@9KQEb9-I-@-|a{&GJ;u z@({}s&)2iM^5?|L!(Bx@QdFZkuj@<1Q_3UyNU65?Qq^m8dKFiuaED%UXKy=B$l4d(glSg;b=z{ zNxgdTyjrVeN6%~Ls=Ut1qE}t}l0wv#!qS)^4ow)#-{fEAM!vr(7F2PKyf) zWdaj;K)1)YpinkopF^KK?36B@9Xr&jV=Eu~ibpBy+z!tvEs{|w+1{(Yb9wu{gNaLs z=QK}$ROwu<@0?cFv1;w}WZJgpvh2rs)DGcYk?$m$R{f3_jeO{*rbhO^cCCXyEIM}Q zt)xdAzxw>`Bum$!vX;M>XGm(yC3G1%H?N%6TRUi8@^{nfKT14kBt7fV?5CWCx7t;A zn6-)JpYloNG8LVap0CQZS>4meq-pE3Ur;C;xHLOQwvB2)qAc}jVnS-+pXu3yJ8y~=lblWl*5$9lCpcr{biQ97+n)%va7-MuvbszW+oA-yW; zIcvHG|M|b6E7|Asp_r#q4o6VJ;NlVGNV-Vbu;&w z>s8FOrEgWQ@_YUsIe)r}=X{~fq_w`?eJd3eD^t^SNKVo_r?L-?_f2c`85!dGZoQu> zZ&m5DI+vR7R;qi<$~LL)Rb}T@NsDQBtI{lb-S4K8RW{nIyZN_d>LV+|x}#P0rQMyX zPS!hBBAQMOU+Y43swtfw*RB(l@OQ5+7U7NPDC_KyjQ;VRg{oHCP5kNRA$4vY+3nX^ z+Dy+*)Ts!G`C)c5M?|PzRR78h)Cs!W3?yi&3Ua7r`?(CH@OHWo67v9W8=T$yo;-QN+Pwz^lm#cTbN<8b*DoaA&ZFN=mrP@VX zP$&{!RX4n?@%21;rI&PTrgdvzkgn7Sjkd@LpZBdI)gD~eeQ(wK*ByR+DtlRCseP{^ zp46_qzWOB|uj-WgtZeOQo6DRxG+Nq`(wlUvS@+(-^cJ3J(K%1LdJ6qRDzZD=^K)8N z)2Wx5c&pc3hC(7*rn0FI_g?xu zMrGTT-j_;sZ}D7Z->I5aZ9HUGw7Xr~!z8@AtI=5*om0zF_3m{U>vb%>Q$Ln*R{C6# zQfcY%?&=06XF)J)tS-IRJf&gz z*3c}=E}xyUY|ndkqtRKc=iSndRb}+qsWJ~`*sMs7Czer3 z?N^9(_r&AbtHr{rwWHTZuY9(yJN@hG+?DBWrB?f1{i(jumG@{>YKL@3E42FYc3Gim zt?sK!XR9(eM6qxILxckc3>Yd{m_Whl7nhC+U;4A8qhx#cJ*O|}y=i&Ymo0CP`TwHz zOL?c9w$HiFREyNAq(__d>)O-9z18EnX&Ua;F4YQe@m6hIJNbMu)w!By)HN>A;>pFO z{GDATJJBK%u9NakNOgp(b~4-BXWr;}$h^Nh8YEK9vR@wQ`PIWyW<<6}X}|A2X>avq zX_nq|Q*xfw?kyUP8XD2S@=6!A|mN&U~bK@_NE)@9@VQsTlyY4Y6D}&sr1|< zHZYs^C;4nOFxB9PY!Mq6`|(e!!OQIjc`~E7U-l|0>noaA~GtKtY z_gbcESIs+lWhCFOMmnZ5#l1A?7qzr}hp$ZBvf0>Wh{x-_gCJIr@vcNGorP#!bI!&pd#HFjeMu_9kViLhiSODWM+5h`{m7gt8q2+ zC->g_-0Hr5-3jsN)f0YE)lMlr6^-)lJG<-c9;-4+rc~U+&0~os{W`K)?o$5HNx)sA z%Pp!01YpUC3@K@i9quo+XwMh50ajkx9WzH@ivi=oIkn^8T<5M%GJO(}otlgm;`w!d z@Oi8{y=BoUGMH8~y_fDF?Tu@_THUeDtV++x+_0?l`onWVTukfl>r*ymXIYOK&!(ie z;~w;)R#|`eJ?0}rL@N3s;^`XqiiW$2XN!lZXryPjn2NfEi*!4+c-o@Er93^jXp6Rm zrxuOR7uK%bg}BzMF?WxyB3jYnE`G0jDzC`$iAad1mSx(#-KTD*8twOv22Cw7Z&!5E zY;>*C^!!VhYc_knJYMRtp_LW$r=bqmHHKTpFJ;7_^C7#``TWw?1CwAK!Nw># z&zH4B%$Gvy^-BX?zyY{l>c$uvxHP0CzclQ2o~jGIV(I{4o~ore zTE9yzoepr)jBR)eOROCbYH4bMzriXCwKS`0ak17gAqz`^)lw;go21TJK^v)BS`}6- zD$`PXRWZ0cW$`7#H?TCm^P_bJ9p+GhYR!vbN3v6NlRP)sO;dB5E|j&mwpVugz@CFu5(;lxU(P(WP@@{JAR&^4rd%b5gjWcW}%*Uwu3u64&EPaAHS zXWWUhF}{zY+6y?m=L|j%BqncgJ5uAjvah?WT>}21V@17j4T6Ka7DD=kW;J- zmhkfJ{Vu?VektFvdFkg6u5_=x+gvnk>5YQ%~ z#}UEw9XIyRr$xBZZXCXWZ2<|Up>ziPql2Rjoqj0MijDlt506hAg0i)=(q?kh?8}l$ zJ`Kyd1p$lTtqxp4nl(^bszmvTs%l`9;wOsJWSJzg-9mpMJ_Z39b|^GL9mhu~YC__-nvG@=7W+K>iN2z`t%$Q?14wGcG}W0})|t_=E^xyV#38 zC(+NF+AJ>e!V`GYS&F%_Zy64OrNa13riqmqRU3<0QU#=e-H~q_8tS?ELX3{OEHmg~ z=W^!(gvw1g&u*YkGb3q6<16<_wpC5k)m#w`Y+^*cclBqK8vRrv-N;t@=*z^E{D6|g zWXEER;gopu$UC+?KWKA}B-i_as$<-Ti-%KXO(lMt3t@~(6i}HkgJ^M;0ra2zz*HcW zI0?N5#Ft7GQGVl*N+D7hq?kcSQ$OVZ$6)?J@jLPd5`mi{_%k$vqW7qEii+lltm z!R!%}RN^cE(S* zyK)iSn!ltjNcaJ`j7`dIZH_!3B%D&CPv=}Fc6>>0;y%W=Voia!Fu>Kj@lMo*Z@}O< zptxO$&dXPbmU2GPF2MMM>7A6Zm&s!K@oZfT2P#evuK;Bw1{)dlOUH@;56;?{V%Y|) zEDh=7K)c5TkgaMlssFY`UVYc9MkI#rbG;8A4hc^UK#f zySN>8&w3ML^}D00Pw9|d#PHyv!onJ==E`OE(xvk>7-6hBrY00pot7ywY5$+)2!QQ= ztOYV`rIfZ4lDmtsLR%Q9hRpMyCfvSxfj~K=+D=sRIz{tUs`&x>VM@!zbOZ#tTr8*ln%V5Xc6CSDWaR|H z#mX=SGXC+ey-C9jUTdN zfh;|XQwiSNneY&pIcHouFb>Wj(m=Is7Mle~O0!`kP_oQA+kjoeESdz6+hv0V_*2WA zL;yyu?5h26k%BZeI44?yp14d$CD#qkwi*F7?8q$-+cUm?DVH6Z;r9&Q@DjEZ=!{=z zwX`oPFXESo)2sC}|Y2_Yl9 zUYtR@&rK!gBRDvdhb&OdLlnu{0GISQl|LbFXjLEBdI7`s)J8GH`RR%f_xk}`Bj(pR zpzurdeK+u&{F-18_TUudH-K)nZvXLYofZFzYi+8&n`uooKAg`w-1eF-t0?u>$lB|C z$;E2!;@gBZ-#dg~wX~h7U8URgcDITf<9oF@tI;3Aeq9(_=>OGK-(U&UZ9Om$rQ800 z^@Q#Sd_|qx`i|AiHOD!_mCMN+@yIPRmhXe8TDXYc?kk9;M3URMpUa+~q zl5{XK&KHy_5D&p5SjszW>j}tqgZTlc>!8eml+y`lhL-W1c`J%lxyBv=Iag)&faMN{ zN`_DT+kz8-!5c0epu@N+NrAy?^O`_)V{7&Q{oNY7=^s8dmeWt$X>1Qa7D!{P^<{v@ zzvVx4#^&LRZ)Qxpt=^S!FkLm7W`eY)JvI?##SdVpy$7`+5NgM>T>c&dLPt2eg ztvS_iClo!Yv@A_ll$@F5CIMejS|7_7mFyW2PLQpU2AYQCB4B)J+w5$X92g`oDP6k^ zI3?)@BlrT+-A>^BMh7T>l^C7qeXvrruH_|zXol?Z$B^ZlGZ3L23l}&+qvQU3fb4QL z5Aw5zv-a|tfpVePW1+-w%d-+-!M-yWyNkt+ZMD2ZXS-k3RnBNtV=o+oDP@T_8wx5F z+YIhz$k*80B?qb5e59?Rnc|EE&y39-;y^Mh4%FGm$?-)|n6<)7f8-O(r`IK5TXn-N zT!Hq+ERQCR?Ujh?w76ARUzPNxyv*iCqlDfeuzkY$pmCeL6(8J}Oy~kI?*S-OE|4UA z!aPQBJd7A75z&x7VF_{g9d1nrWJv<~CvBKA2xUCgIzs9%&;dfU-B6ngj#s)BUOYAm z-cb=E8hf4FTfRv~$0WZtm8(&UXY^uBp|9eQwDLvgO6Qxegx`hb$18#SS%q>hOK6Sy zdRcBK(!wbs?o}UfN9Z0M3aF8i8QzQGHf3(`mN8-y_RggNVC_Vi0S_aE)bBvLj_u2r zuk4q15dxES`p2$g4tJbQ^@O!*K`xdGv^7Sk^55#@{(EhV( z?7~;p8vF|}lAkS;R>%l4vovGk*j}TDnQelOnFH~(PMJHAr$nv$bh~6Oi3ITtFi0K$ z;^vHExyk}EkeR;#2?*{9?W>0Lg1!JpV{Qsb<=a=7hts7Sc*8gifRdRhyC~O8VE}HKu_P{qqGtu$imV;pWTwe1vYbd?oZ(~hW9k1? zi{&xSvKCcc5-Xdc89F*yAhid;8hM|xCbfd*O=z)_=D#+ACQHd_gK``3?f9nbAkh4G zB_%3$K(*_1S>8m12zJL-s@%FX)+}w0rysK)UbmF6@5Xk>HSZE%ssP8*aB;Kc?fIG@UR2b84n?R4O{@Q83^@FC}? ztDJWJHWU@>xrR4U26iZD-^XI4DnyT2EFWPIU*N<(syf0m;}yyRvD-KBxi zp|+9g*F$Gfsd&YJ7|!APharY@5TBKtBeK6$Z3m(y$dyVvgzZIlW9AU_IIEfnjS2rG z9%s&Oi~)V?CP-oTa*5-d2yKcd=j@{e4HP=4iMn!f?q^gw3-HAT)eZlYb(C{v3oGoW z&YPcSy>C+JJ(We@(Uacw<1|XydNOnJ&f@&19IlxvKTti{9S5}UZqD0~XTOAGv^blC zI(ZW;z}l+;;Sv-tdpzqd2D*b$CZX%S*g?j! zIu$}0D|vQah|_go)3a&NDIKG*0X9!ejCE z<7=Fu6=ckYb8DRM>eg0Tn7gt7UgP|4vpyxV49jC-(N&aDW0dT`D)A@d*0`N;Vq6`+ za(p^MD}jc_Nz+w|aEi7fPDFk8OXG!Ls2G63b{#gwn%As~QuFl0%}aU6j5uo@dblRy zBuP)htfGITaZ=&2@)~E;)3=>I(NMXn_y}m~H9!dPgQl;Xe&IorwNYhZ(2VsN)*XQ6erq1W zjd>TKxlKq4XtsGiS-T{+o8ShTfl!n9jJ7@)G}(8{ss=RY6^Hr^nydOW%O9Ez=^kbW zMl?6HC~Ou@cu<)}vUAbtjT6mkb3|CD`iiEytqK)b2UmD{fEhItLf~OG{jF#wk_A&6D*s&r*i~MAa6_#?@5*lKrJOJ=klId zSS+Cc-m}m@AZOlF;5I}lmYBzTZX^Dxhu&OJ-V+`rdY|*2NP&aN-aX;OHc{U_G4eUo zyhiP-IE1;~6Ei@{NJ`o68Hc>;|L%FxQ<}t6_rx(!K>507NPr?B)je~U`G3cr%hN34 z+|asb(@tY*$DZtIVNSo;Q#?edasAHpb!g0KW&nHTh7i@yz&rkJk=iJono zn6&FX+q8H>G~AY{iqF_^n=Gx@(KZwKRVZ=W;4tZ+-rly;{ah`?sl&cPl^BaSjQ&x*g~xNZ# zCZM%NX9NNGz$soAt40P&eg?cCL~MEtZMAvEX}y<8f8eL1PbTNU{8h3*hQ+nMts&H= zh`AU6%MV1a@UZKXRxdXqmfklRq)xc&pB_l0Nt zvJZ%xh0ZgD7V&V~Y}9KI#)s>ymIj9v=egv=RfxTjnZm!3D{|e|Uzr}XT?0Zw4w1m6 zn<%xRGT}*W4GRv8pxlul&`v1WxnpO8f{sLtECatt?zYC<+EWsGPpe;}J=DwGsaZC2iF_PzvX!=FGb zHnsE^+^(4LVdWH-){_EXx?$VVUb$gMA{sxi!oh)~rZ1bY8!~8C$Yoi|$y)?B!YXLh zmdHOefK5wvAobgI&2rTt(SI-z3Dbb8{w#%|1N#NqTvh#qon+%S4}-+Rwlbi2*^+ep zqcouX#zP_epqnFC-t(PC3qc|+g|De7Ho6|M zkZ)n_0f&=?E?7=#9(G7#<7kg~4?se1XT@9GDb^G{j0C9)71HWHQ9)4h!C`n;%N8t` zJrDd@1$h=mp5Y|?^8-_%0<~xc6b|wa`Pu$Z+{Q88;&?!ThwrjVc`5Gk1?L8rv<2WO zGwwM&A$>KGeQBpdwut--Q6tr`zrC26$gpby;1xEje*prFYyf$ixs49^kSbk{GcZwl z(`!Zv#<4m~<#owi$#5VL>3GDgp5YqBX?yZ_2V7hO;PAZ z3`~r)M*q*FSyx}|)5%#amOM&|2YV_YZ3A!{h%UL1*%JLB`~ObBi2QwdWWePxpuU+v z+V|kMQF+$OTn-qq%giE}E;Q!*T|%!};qc-UpN_J6d;m+l>4)nSIt%86v4r=JcK75q zbUW$FnlrxcRBs~>yl-o_l*zCVp3OB!W8vUwln-26%uS$HYg`<=X(XE3%q6pwIoAg= zJRJqCp9Vp_K~^bP`inr_36lmguy~ERaOlssAU18B;1-Sp?^of4aT%o2=30k*iTwd8 z5+A%$l#CnMYa2Dni`JF53YAI=Kt&)nJ;K%)3z!&HQ7KDSm)h#sA`Gb!r&N4zM%K@zxo3L-5m6u`{uirz| zgxFj6(X$U-8w}uuIv*2nl@pptWd}SE2XY0FlLnC$C{9{-FdhdQ?NaL~l3%=Q$Krc| z$&rv2By^)2IL)V{=>Z0C>@)hnwUaEKirL+-U?*}YtJaI^MX;;in zWT0o#Ad3QkY0}TbCW+c)SP3r<{Zq=-kOVbr>6P0aR*Y%3EEi?_#>1o^KmsN(D?jT$ zQkoRp4-YCW0?u5)%DQ&G4wghuTDcmb`H&SYa`CC_T; z5LJNajTz7X8LWy*FaV+wj22B|9MsU7Mg<^#bRY+Afotahr$bQ<042Ocq5G*XNRs=U zM{{>xJDLY}soUR?AhmAml$V06n|npPaN@7l*T&o9GvK7XUZd!2H3#q3AYAj`&GZHg zqj%#IT<6kZNA^lN->EZl3op+8gi$)Tp%%Q}ueEuZR$j-GhdTSs5_&khNf$ZCWRzjTQfZ>ItOK1BXsJFiQ7Hz zQJA`NzQC7q)I6Fl0VmAu+0s^)CzPddCE8LIJV7>YLYk%Db^`sWLZd>fz{@P0-OWN}fw9 zQ^qIHr7f!v<}Wlgt;*d}T;^J@C5c#*z4~}||27scb2KkjM4yTS(SAa-bX8j4MM8=L z=HM}))XksiD>+|Ppi$uDSz6h;l7v%TfpaP8aX&JG;l>R&9BHcMp%wiqm7gHMI#?I8A*1xQCnPIsmv6vT0 zW_4z;5J&#Ice|mW6j*0+&yXaZ5Dj+i?3A(ww;Y)(+>#$t+*1`U$PC{1>`!_|%g z>9CNjzhV#vS^ZjbHjtOFyHo~~{P7=lO%|E^?SI+S$=`p3y@{Q<9iVfL2^(vk)*tYE zZ~N(L5tgi+h*v)vyRlKuJmWvuU?=FJ}Y)C{7G+nr0Z%0KU+=(O8P< zIX#oPLx?-Mh5Vv%98r{xiWTLuH?T0S!8<879p6As|6Rz;omXO^-|6qH@OogkSHRCi z<>jJHlgXC@U^(+ z<+;HWtI_^JFEH4U8(Vo#8Y2!rkC1;SUdxcg8C0Zu-*hc!V`li_iJEciV? z-$o}uiNDOCPtK=2cmmo)%EGlG)p^(;|DSp;)1z(q)GX$#9T=G zd6ckbaU#KVFIlZwoT9jN%bOe*2Sr>AnRGG}d1Qe&lqDtcH4~1N?Hi6W_ub`YdU0F? zWO-TNHa>G+Vd9Dk&>!T;?-tqC3hb)<3bxhBJ)Hh%l8c^OkrAy%gB0V@TfNTTQCZa? zH0~H&Wadr``pqp+4%vu}8<3kRm~k9{>)1BaTnQfR#}7arJkGf8@hv$W!o_XRVpB>$ zzb2OYFMN3@w(TvSLp>U++1m+nXOa?-Y+;W7%E6^8O75E7u#m9eI!e2FOU%x6c_46< zr6eM9|7PV#4>wUNI%p0=gNUg1CWuyvf!d%2a9YA2z!&6TwRT)njgEI@hYAN7rZZ7M zS-0aE$VEDpgV)(i2{9*r*qaL%Kp_)jU+6yDMH5exvKy{G0r|?%B391K-QHHFW zfW_eqGAR300shO&3OkyrpPK~M6iE*(y#Vujm=;SW(nbc(-}LVtVHJ2 zR4ABf9+w_eBOPEyh{(X}yuH$1s1E5xF{uCJaQAbaxPYP9W8B;*e}8)vxxWRp-uwk=2Df9JW2Tq9bGfN zE$A+iq210f>|a>pd>83`PQ28KshmsjWXE6*6|7f@fBi)4-Alv?04yTm6YG~LZz6Kw zO>a@HUf!mFZpa&Th?bDPoWj%zdHhhP3(&wD$);6?a|rDwB$*XEJdmxszCRdeyhA7Y znQ-L;VxPA(h18Eq?zlvMy^P=m!ZlFms%2%dr4S~Xclur-wZ;2EgtLkmt z|Fkw*QFYmTeMyM`=HZ%`F_u8qy9W4W0D=^ov}UEDMaPzA<%Yx>XO_KLznTK%9YIyK z!D^;p^f!z!dU|kf{Fy(NId@J_%L?=={7H|!EIWa%l@;~qNdTuf^kmNT2}X9*m8kBD zxhVqfqMz(h<02K6?KA!2=~i||$M(-j_D0iPNMoY^aSisY9$rcCzB2QPQTd;41S;=W z5uBL81UdV^7D9)>N@=D-F8{;HJ1+CI#d!el zf9c;_D3gubYdQ2RAW2>8@DM0q7nj7any!PzHUT-)_YhmyBJ^San}bUns|S6~Eq z^OUbsbx&%H8|nS|i=Qux(S0`Onyv(x+COO7>VS@Z80&RI><~jmHz)|x_lm)`5t#A= zt($CQTxe|`Si+8azj!1F<6)z8kvdJW2Tn+n(1n}syCHSEpUJh!pE+zCh;_)$2n4nJ zWl9?Q1I?x+UC|yyu0Ie!gJf~3qD&X%Afo){Sw>c8?N%xDp}Nj)TOyX9#9lSA#YkMg zB>tboo-u+th9D9%=_L zlA!;{?wiWt@kr2qU~vm%F~=mFlt6EP&~4Dw`XB+@bL>PgDE@Tx3c%b5{s64}!)4u( zpB{nY(D9RD*t1~XRRn0la!s3*O-IvZHW4r=rKv_TNC*NKYChUo-QV2Zif3W(tZPIx zi30dZNT!O?ARk}HX9}QGIE?)*q5#~i&|U8d-8`~R+Fqj2HQGX7R1AILu$q1kI^O^k zVMKz%IDqQw=01PID^7B(AMeuJK)y{~?(2&+9>qe&2}JsPYX`W&+5ipoJ^R^qE9wu| zM+)yFusSK?qyp+Wh}NLe8u026Os^zj_ChQDrV3#Y&(NurMYpGN$0E;!gG*=7+&Y%B z`5AfZ&!?5dt5^eg;?jNd^j1LP9LpuSUc#CeHR0G6QT28+y2e0;!%(?_xia$0wRA2P z_DaEYdzWIWNn^}!E-e7`ynBppe)C{w4`I2((*U@jk-0}uIsESEesqG4sU?A&ro(CE0eun+xEwMv#{Jcb3=J)b_$b{d z8^Gu*qXLPwzfbcLls-XRdK|LxM=U*==arus(UWnR`+X4IbHVQ}YxyDT>vTToJLvf<)8+Rt)0~yM^!uoKTN>2?eWzZX!c9N^zfZbDygR6^ zu8YRpFYsbaVRCC!rd%>K!^}}LbK!gu$Tp9eHH%C4KiB!3_5u9NJNuiDG!`U`P8NWm ze5}$*O?*DgJ?)x#e)dpArri}(!Rq0s9x>I^%wO7!EARB&l@gOy4yeCI7f=tB!a}65 ztN9{PK!xS+Q3_Qn2iPzVsEdSkTCfXU@Cu`vFS&S*QRUQ&EN81!sRDV$G_65|eg8E| zv6j<Re6zFc?LdQNx zKitv!0_iSgDnJL(jXy}SOZgkS!sfQgmWi^f;#bzmER$a79_&D}Yc+H?rJ}2}=(Y6; z<#+_&iv%%LLD^61n){2W6EL z>7Df2E}BHDYD39f0Z@DzEy5xYHG`mNRQg(`P6z=%2sTkr?f4@Xq8}UpDe4_Ew><5q zY5}1GEg_ky8Yt*t-oO>5Mzv9jNxT{VYfgQhmwZEz6H~`y5+)Jn*^Tunj-<Q8}`6OcyO{~yq{tK}&Dler|1=UrtTV)ld;KLyqZY)N9 z{)`@H)*{FyUF_ZTp3qAZjP~!H{smv0b zmxox7LI*Y!vOg1|%$#+^Oh8gPpW{3NvIq#sPc!fbpl&FQ06GX#=8i>U>_UY%85mgu zTQvC0&*1gf6YNR>;hB$?#;pTT|mANIJ|*(ObUK3aMU~-;RS#VfMy903gG|= zQBVsebPI!DfCfGTKnY@08dY;s{4WIfW&ZvN!&>Pj`!_1pv0xkurG7t9Cl3A#v^L=O zqdx%SRE6UwX*kT%9=p1}0CVK5Q7dl0GE0=sO!!_K%0Jb?MFf>yywZ_4HmL}&e`vG?!Z|0Jt6_~zGT>7!sXt_J?0YI2MOAVkK%6M ztKO)q~sWe&p8LxqPl7)8nAgK<8Te7;J2ZrR?67f@__ zVeO~8aazNXfLrZ+Evd)OEjr)o7DsIJ7s3`D2SM}EkrN>=xA`t`9Wc$uEzhHQn9j4X zpU)$Qo?`Jk#)swj(#O$w?dkUj@9bT(JX-Q9LrD!g?K3e&hW?7r{fAaTI+Tn819J=v z!)M;CL%28D4~hWW8*vE8*ywPKmIMzhJ!?YXb+LG@%hVGv6@1Bx4G28N!)9q<78T)3 z_BhD3?=9l@xH{`>sbTz_hx4Y$EQR}93{$#iQ+3P!y60X=14S>0yD%czuWt8k(5k%O z=JGfk2-c2YQ#Y5Dn%b{$3lW24&GJb5_kng@&8m&}wX}C2Hzl;&MfQwaCwpi+uwaBw z*@3FFv%%ZG3J9zHFkd_s)YLN1(FhOG<5nM1A#I05h=!yuYJFuE0%*quLet{5!|m59{pSW8@`22PwZ zv+WGx5L|dxANWn9zk^YL2>+Q0oydnl|&)j#w;!)A~1MWp$AX?F`^4$$hC~B_g zzwTK%7|h9=&nm($w-U7!Cu#=t5SZDPYVJwc;sj+yRITd8@^yGAJ#v&XhSH&0*mDr@;RY7xcBe-Ciy6%#BzOVT!p6t zA>3MF^^Vo*DPs)eJNeDWLKETR^OIpsG>{VC;2howQ)cL{qw6F2hpGLxuhYnFTNs5U zJ1xnnILAJM(9@T7W|C0-Dxy|;$v`WA^T^Z{CkZv6&tS(dFNDaBonmCZWzZm_ zV8-dj9w>^U$Ua{M$X(}@tAZi}=eJJ%add|(RS`W$K^)t@ajKET@kSHSlJOJOS0BO^ zEG?PZU}AzI9K%wy`wDFH$Z`?ScY4WL)u5nzn|7-FD9bY64~iE+U|x* z4A6!ODxW_QYNDQ6MFU16LHa~ZM=f#!@ibB6h(bUw-TF+l=u1!o5$B zm`5Bx$!}9gqvc9XEyWN7Unjlhka>~}*+C!fMbfMz8%5BwecIkKhIWHlX`M3$PMKi|8HWxE3e}=UJ1GK@fO@9h>aXR^4ns_5Bn?R z2M}^d3uPPRa8I~owpVANEk$K=-KsRaM$FWIp+_crc7fF05ju;sS2@m=Xz&Wdq3H^7 z1^r{t1GuZ@|58}N0=sgX>#1Rn_$ZH;-wYW`2;8#g-!?caQtGUf`H$I#)xh_8?h4Ln zrJ|IIMi5WO&X6?YBRJ%iP7qsvDf|8MgPJsHwQ$;F*h}jq#-5vtiop+kTb*6>4X`U< zhojSG+4-9Jw!Tv2Dj_g&7p;}+HWnNmoKpo%3G4&iX0iu81F)ea7 zW?&NW5HTsmL<_}!o+|s^%r8GnY+Pd(1chwRLJl{rX6X$KIm#LiOdh4J zM?wEcREMN_+X=S=QwYIu?~A9c)?c#m)T=8;ryt3J96>e1#L5w|uxtbsMiX7ea#>Wi z1Mr<1l%aTXTh>T}gL$OokAL+LTjjCbifm4z&4H`(@02&XSr9m7`9d--H*^1PPB(*U z&bo2ux1{Awc5_?=pHH-be%RCS1@PGLBw(`yOLus%G|Dis8KTSymQ*nEnxurIU>{1; z21Wg6)^;+$DXZ--;tCgJY zXy$qBIMWR*3p5Q`G~HP1-YNA^(cZu$7oP?~oll&uEkbq&OGR^Pn>*2`u@eUJct)Zn zF*xLwR6S$fcW?{@*#^&H~%hBB;9A-dd2PM>I^dum@KGmjRTt<`y@1W}gd=ZiH z$jYE|)6fV22pA>wMKDS$K5S*ubFJI8cB#Y^VAxen^-2;J=vSW8TS~WY<2v3+i<5gC zJ0R*l?YVY>@6gn35#AD>LK7nuW<^zAth(Aoc zdaUk6hd6zTH5-q;!`{IhZif?C7w|@B^u4|7UI$TBD7&k+y9u8~^_y!%PMr}M;@$Z1 zAxk^s*+t+_fLTgamVl!+=t4jiYA~!A!4Ei3D;NK74|k>dUu(n=KM?h6XsilJ8om3g zLF~a!oBYs21|mhlsOHn5ao~wq1cv%iI2vfkO4JXy6FjBfH`#2{od0ci+{k}mc>A$7 z512{yEXwxYisZx(Y}I^4dsm&&{NG3(TPrbB41J)9ILdBc0vVx#^Nlsf-{#vue3j>Raw8V0O%zY3v`2a11aH}-og9U(twycQ@1gD zZYJj8k+a;&Dx>voqF<%Oy-L~BC%CQA!L>N*;$peugFT3M6KF;RB2hM_5i*G zOu-weRL->2B52BMyf1Tj#=IY?rDU`$;8KcOOWHi4m&kI+FC!Ayw=ct6*#JC1!@r3{ z?biMqH#6R7F9L|hbrC;0@*qc)ToO=k2SAzt82TMP`w{^d_B8xRVPJ?dl~`)M%&{pv zk;zczgJs#&e4jx7)ZZ`0`@Ge*c-lfTKTEa?%1@+fmSYWtliJ&GXFAeD2UxQ#U|c)K zB^Qu-lZ6sGwZJuM0xsywqHJw_hPC9stKLJFs+j~y;IQ@{DZ$usqm2p%VmNXkSz!h3 zbuKNETloU1)gN1>BCD~g6p?JH`^o@>fd7ScH#dBVCn0i^@hmO~D}q*gNaujFqzm}8^ugOEm%GXry;%TLz-*Gm+18c zjbC^<`SncxJV=Bz1uOY|OX>wDqr}OKfi%uJw;4TC0SiNjrU}~YY_xcldS!;8dQH!PdKP`M4+=(o%$lSg=&BTMV9F|&ra%zYDXchU zDZ5Vo02Qr!nVX7{w|0a&7mC!T>iTFG{F;iUo=Q*l5SS`qtxRH7GpNeWRnfNRnwMQq zW2K-7;UNiOZJiP12oM{0s4c8grWSn>i#dWhk944zSVXshUV{X?VX!WR!kiC92ZyLC z^PHYLz=VWy*eB?A8{)jt4|AKhSC+hG`($U{>mvT6#GwHt`klnLu^<$|TU|cwV`|w$ zFIN&T%W2`38XwHO3wzM|d7@TQBktjn85o#B@FjcC0+@tv0NHp+YVRZTcj0#HU>RW> z%UqKyF^V668)Bg>-hc;?-;iAeJf&G;tADEPVkIw5hnfSDTWGq$CMyA-xGq z)Dprg@X@~ffT~vrU0RnJ5^vUbMl66AV`sIv2w`IBsDt9r$GXF0Kp|j3DT0?a|0_FM zdv0fvP=8#NX-!nECz_zdv4gW(cad6`lD6cfwGJQkXp3Wll$5V!7@g+X3}O(cvOX^? z^Sq`AWNLPfY2z6kO(TvbHHdNmUg2W+-~WI5onXB4P&cz%N=Cc!q*pM!9Mum1@c_rB znF7c!XXFP*{pOftDU<6j{(40YjC)|ABNfa3)j(frP zLq4tD?7bZnWzS@bW#yF+6|9vliZOGvN1ei#`Lei}YKYuYdt{oMw zLKl3r<$s646ZU}ORItlUi9cr^P<7@35o!$X#TMo6#5z$Qyk!ioGfih0B8eR&vdn?eGP*4rG9S2+QM{pG-{{m91a8zeCvxRxNB4Mf~kyRuMfm2_27iSI826)gaaFauN1ihJ^wh8Pd9-zEG-)f*!mI9IELO0QGD z3L5*UUzraK$|&A&C=C>o8q+NGR8UM!*SKof?Gfx8OROBgq^yN}Fodu7qNM8paOj6$ z`XvmtiHG?jnHT?GVGeH;C9saXS^F<20&F0rH{>@*p~X)S%ylG7$t0X3I$Z(@GBIWP zlfa5Jh$Gt5!&rs!Bx@qR?33W}4Rq4}OwF#t4P^GhO$}0(eGm&q5uk02VBnM$(_zs7 z3tNFk?3w7PSr>$KxxX1Xs;_097|AI2s^Ss$a<oRk)~z6Sa!-$BPhx=gx~*^ouh8oqHlz?*ylJHl0CYLqC5czY zw&0KPPCLk6x}H<{^v|fK8#TpbkPs#NBLmP>A~*?>YW_FS7f{_11kHl z&PzQ}&QF{5vwJ^#MN7^lAOC2RP!C!K@5$9b_yU@iJ&oDF$OUleSKoK^W#gIaWEAx( z*mrbpJV#LC`=aP303pDA^vBxBd+q{ksj;dxhQ+Le^v7@#Bk<|s=SHczVx15I+G53E3^v$7V8ahg^@#n1Y(*5J_e;o8`1 zqKiG6Y&4?HfCF(EMcF6jo0ymKQbh)R&S2BXB0$=?5=KyT?q^87XMKqCNObhzNh=fG&va45aJ2!8nyLzSHXf>$T7(21N*Af6Ld&D+V@qTXui}2+^6|l7 zGinZNJqm6jmXpa!$d;9E0W4-2!yBNZ32;+^^(sJ>985!@y$dxow9{^~oZ{LPFq zikZ5zznG0xe1+t6!5whjeWhAJ0k(40xy7BRHpE|0a$H=4i}AGU47r9Qe2(#P6D&6u zpb^>T?ZFyhv%Q?{zG!%UcBK7;_L}2v0PIV=o`!HW%zI5c1$u}_x}V;S%-!jBW7qC% z*Q@8BQgyNEc=CH95(~p*!vh2wk(#4yGsU4)l*5YIpjRY`;Wu^-4`Dpb0{SJJDy6B$ zv6wY(9#^TV0)3!gaa7^lshG3&zB_1x;9)Uc2Fx!IXit%e+u!08BYtpB`#|5BmZcHX zFM3$qeDg-bMlWH;-qA7+hNmPwAA$AHM4Hlrxga^g0J@^vW%Pd0FCZHFf#5Paj08Z@ z6h*&e0wF$u0+48H!-#O@cg9c0BYQ|7O8jfNa;AJr;dM^LebI-M{uOX z-GHM~m!KTK$#J8@g*njkIjw8U+GjPkI^hnVa}FOvfeR%iz+`Es^w5Jl3^%qE+2*M{ zRgCorrvU9bA97OZ#P|cUE{}qBM%`jC`(TT`uR83+lPJD7tjaS4a4s3uY~v z%aM_za@_KHk9)0A`&)#sO*wg3O#iRw#pOzuTavZ`li5MiH(MZj745cQ{?rAJKN8j+ zWy?tQiN-lZ=u|udvf!t4?>UXD`>A1AF!}J0M%GufAaPlQ@}avFVR2vHQ~AXQRn?g&G&OXLmg;9AJBes(7XEQb43*7>9G{X& zLmCnmizZAg+1`MH2DKDrK?_&uXn>7w!&nrS$%amp)4&<0E^i9qrXICv9h=gA!0^6e z>Pv9WkmPE(@!4>kHXL(5Xt-ft!)XV+P^t_6x+IOoc>tzL(1FM&8H$5sBlpi&g-tbn zuqc2p!`-+t6|7W*L)C3VESX|U;tvc!f-M3wRNuL@G-tAysS7kkWTzE0F5-$8q|A;@Ik$kvF??fXaA}zq_Lb+m>!X77h z35XIVa3umyA=Y5SG#r8>WEO!u|86~ixyE`Ct16LgULZFZgN&;cgHuulOUqJyT^8y300d=X1-e_J@iw6*cT;n z#K5EjPqj`;hS;pfd$cW-?RO1Wuo2K}9hp#?m5eM(1o0{2w2`*a!QXBY<1L(#|3LnDL6Wn)2( zRQ4DOp$cpU3L|XDR$p>UXUt<4H_i`ebFL~b zBgkvzu1R5#_B(C_GOI!&*a<5boWThnE*TSs2^8E;9R^;DWr#pkOF5_sKm+izJs#ho z!P7V*f6FS%rF?7g)J4?y&XTafsedsSvnwT9SXldEsr5u*7P3eDSiW!%DXqy{!ffy9 z^~;Ps-BF&OJSSz~QDC(>m|!ThA4qIYSW^(+Y7n{Z6Zm~BLW3Y5ceCJgBMFZ;IjLZE zD=u@LYE^1^wk`o=3?=3Nl^oIqe1FuX9sb@$j)3EG6n3+RM%OTb;gbf5D2A9q0qHZ zMyMu0j2q?~aX2Vv9CT^OokEdjMKp<68pJ*WSsjUT8BiM;%ngSDul)sfU6At@0D8(< zK*KJoRlzj%6ri`Fz_WaUh&DkWQUZCSxh@*CN;7~!@Pkg;Bpyh&g8=0~ZYSFGK<7GH z!vKH5YZt6%P42E>A!pKF9*_!Eg0Jc&Ypt-TMk}}0YJeo9AhND`Z-vZ%qs*>9s3PH@ zHI27msv4yEXApjxDMM(t?erPONrc3USh{2xm&}Wgd?ZWDGU)E=_iGUO^-e6*Q5Z6O zLkXE!PK{&-=M|B$CHJ~NGNM5vKQrGK+;G*5x9uxDuOD=K4y8v;#at@+7X1+#y2=Bd zAcP49aY~+1u5@x8qvE?dF|m_kkgzp~YeI)iI@r?zGc@72u*1xpB<+BdxI>zE`10FV z-;$tv;_RH%8Pg7{UWZ+Fp0&qgJ6_up+^+HVF$CPXsCY-Xu7R#P<#p9p$}FFx&G%&C zlQo}?-vZNOu{|a0r!xRoREuW?S8=9y1Q@hhO&6s?u}7<|=|eKAnvM_66`vXWX4bS& zJ^tSAfKv32xk56AU!rdG zq=!vpan7q(Sl)Z_7eQ9}%{>;W8cOnYd7KuBb`LhhV^*-t&n^1a4#}B(Q@I&(IZH*q zp}z~NM3$<>9H6mD5oddwm0mb^Bb?rCa2`Ejq8kkel*q!ijLID5IU=gL!IphNeco+Q zSQO~XQLEP--B^)9x@~0^=yPV^zv_m*}7r z(??Qt1!tw|bNEK?MA*~`(io53iddIXSAgTHDJcOC0lB^cx3&wk+8@DJFoFjMD4|%I z(}&OB2h*HLC^i^#N^lHb8MTUS#%w@YZ^voUm{(9rOx5pq#0irwM0MzDb|LT{ps(Gx zo*0v;7~0I%TURN%>!3@?iVn`j9q$D!4EO}Ojyom;8X;h!A(EhT>Qf-jD&d zefyU}2)z{C!WFO*0-`&>YXQ#I0LlPxIr$$a{0r=_g8u&UmpQ^8iv5zSpWONFeJIg) zQr#xC=}dZ6NnuKY*6|9GPL2dcMFhUU4Aaf+i{c2qF0MKUJXT8yc&1bLl)Hh-#Y?K| z@)%0^h()ldg5;5{x0x!jC|hreLZ#sVU1^LT3nT1l`LLCqn<`+vXuGaig51Ktpbo43 zNqAGg9qGFm?)d2`9kth{eAwb&rslk4MW7ft)rjauwk=0YZZ&|o$R}4^a}_(f4%HPR zyMQ*~6|`A|u%czx6LNTHN$5v9i&kxgx2)8z(to3?XvpVCPrT@S@G%;dLVF673q;&qz{ny zph(yU)gUeX#{#oX&z!s;!R@CX-_Q8Ak!TQmW6s#)D@+TYNY-ZX}si8&mSP&T%(czL|up(fCAR?vGtK zZl|67`!a(_WTG0%kZ_E`jBluK1@SX@{admt_O!+xq>&o8Ob7%aSc9~8E{I`yMnRDM)HYw71$ zkcMekqM>y@dseyfJM!miV{iDi0h!Rlw$s0r+{8>3UJ);XJ*ue2+7t{XDdEFE#d@;S z2+j~Z%7dSA^XP3fXE~a*GLZ0<~WcYu!Mla=g~&xJWc2T4fWM)i^u;9@S%0PJWv|al4Q%H#@CyvG~E6 z{r;QpMdysma`y!z>dDo#K!=@HtdQz%|AIQ!H5#AfbSZ_C(`!t-``T&L%cfV*%TzbH zYw#c^*Q2N~D3=Y+QhFKkf?D9pi2s4Vm5qh8TtW)C6>#`uEdF*`$ByToBREnjm2j#>56$A&RU9Sp)Fh zqe^EggX!A-FaLlQJMz}%=*O07UMg~->$8`ZE}b`3S3)}16dUvMb%pGuPWxZ-e2c_c z{Vhjw7EC56yb~{J<}=_JRoZQ>O~^g?G_WcPcms!;U$e%{Lmno?bt9@L(&^(`MtZAt zEUm&Ngv;H1Wwf|4QPK^8-_7lB#QFQLEy;g&^8ZW}_CIW(1b+R59tk24ccIb&CjMQk zuco(@flen+X+lUz%9N5+;!RC}0006|Anpig2@MG$Drywid}XBOcu{ab5kY}1@_SrJ z=Ps3}KCY?1D~8dW|GRZQB) zoSo*M#~p%(-exbFN2?=5*%=c~!(kWu=CThjVQM_Deg2wOC>r^M$HL#j#XTPRJgutK z*az*0LcXpwG*pr{&JPi_;#SNNQ>~?cBvGu%g%iu{z|-=Ovf89VO4hHGZ?mdZiK}La zpK&C{Uv*qDm$}ebFU2_~8M>(>)i^@Nwj+p)R=h%CjkK8<+gR2Q}RfnvGYA>!6pM#!*qUgUyBJfLuW_-)csaWIn8fkjZ?TC?hH|UNFWqvzUsQ zQL2s*$}<(KntyYliZC(CZOv<^}0tE*i#{-AcZzNRR!5$NrQ9W>~C^$IR8KRtAQwyn>2>+jt zh)8f|%!uh_Dn``S&qx)S2PFxos49xTVz2CBH3zky?KrQ$Tw&E5P<2)1nezz;sm$1{ zW}a82!aN5<%e371l!U8l=0Q!_$PQ^?@h3jCrg~=iFX>G<~ zR6`u&iDp7o)Fh%p){!>D3C%-ZzhOFt#6`@_UK}B=zBvph70OjHd~5h7B&VRh7t2Cr zyG+O$L-LrNa@t5@N@_-nImt|@tP-*pV=@<+JR*i*fF(W;`|cEY3qbth__)pUJ+gaBUEhyYh;BPpNnaT4|LKvs&dT>G)W$| z6gdVVvL%f~o6567iI>u47A1%&jNPCUq$kVE0kQNx8~^6lYN&EzI?Lt#h- z`Kt{KhDUb^nB2^}A=X+p_}?*#(|4|=zHQ;ot1O|^pzi3`>#=#OOKZfWAC)#6Xk ztD-4CM9_B>N2usqf)V>XBQqU|_&g%{y|2`XZ%(0>c>K1+M0uP4i`NqN8C07%ox-%% zP%x_Ej>VAToiRksi?&u3pN!(PSTOCwkK-kYFj_@KIDs9z22IGfO=uTEQ6s0^J07|% z1-?ocv0Wycc-Pq5dSK1xRsNXnsl2mU%<^AukqRU$lF!ZXnM^0%6l=3kyO|i@&$XiR z%ns+KIs9`G(ggXdLC!z(aXDmjqBqEgg6OYJjb&b}2<4i>IQH%fR5Pz%^A$y?8C!L} z`eAQzK0^-mnV*Vt*Knae#OXXl9(r%is0k7~D3RjKS$Ck=3};^PnTpLU!}(`Hqs*g! z2-&o(nN!4}u~A5aV?>#k*db)|NQ;kaP5map|}In_(5HVathNLw+g4NaSzVh_U=Ltgm;ySSJPLtEGB ztn$(ly48zC!7|#1o0B17F^&X(f>q8xBE;at=&R3MDjpbXg_v05E_MkYEE1U;qRfYybfbd>{b{7{LcHxF7@=K)?bGGC)8S0}z~G0v3E= zgA7KH!3Zz_0R|DcV1ox(Z~_o)P=N&)cpw897(oUaNB~W+K?FK50u5wf0g54sg!-6Z zgAgoWgAtIx03g_40u?v`1`e=51Q=uhf({i0Mz8@49$*rZlQR=X66wS^lRWdN z7+Jq?j*Em)a3H(ApdB=-{8<&FHEaA6H4%M9XEm<@E6|_>74QNVEGnpLq=FyFkYy&5 zQ7{t{v(}A(9BL#YQc6SU zWO01dm|Z0DY#bw2MTxi~qA<~FCmIhq9ts+X?m^Y~Vze@a;`Qj*s`?aJtwDxRcXrG; z)q*znrco>+F=(5c!Z~ehe4?n@YbN1bEM^TZajHkK$Jj6 zI}e*eStrz@y+a9K%w0iPZ`@ydjOpVSCul5J2U#4^mvY1CC=^VTfjLZDt_3k2NSZ7tbK_$H@+=(Z52luaXqGj38Gk*kwP>e#TnE`~1`;>JrGanc;jy5$JOX4oGQJk!X#S zzF;@W7mLQ@l_XY`k7UBd*o@FY@tZIuvQB#iV$<+oY_s+m8k=YoNbH7Y2bnQ!U9))P zRM}c_4n!(1j~cAuxIJFrg4cR7NoVm?dCt`#VOGrSSr&#k2N2U53X9;?bzYwV0*=OwYwAFy73 zUNZ_Vkx4N&-4;{XGq6Qr-KNEFPr($;hVY zRH~Wa*5coU4rD)hy_oe)hUl2Dp2W<)}5KCc=EJJa0b zeh$Go__Q@>ONXA!D2~vLX8}<2xb#a5MUhG-)xZP)Qma#%Mwo zriUEt5uaklu~Ay}@qFe6el}Opyp|e!YU-IH#wR=#6;?Ad&F3}c86EoE#n?IHn8{X| zk&}BNb6K61b#%m#Fh+T4CVV9ht}N|Fo(Ul)K^Je6cXdj$|8;GqvW8bW>k_df+QBAGSfFG;%C*TrZ01L zz>{uoC@5-_Zp2c$YP@BM+v`atseNjGPKa`;D6a&SO`p>!)e|Z1SBK@ zeWTKWJRCn3yNtywc5f(Ej%Eez9#$wQglKcjM}|4ox-Z5k%$K~OF>}+wh?9G@yuZ<7PUk)W1ASWNHu5^*}-L5#(4>OOHm$Kq$Wu-U1W>|TXwL7=(O2G zeuO1>Zcbm zMe7Z2V3bWn3_U7B4{<{)WRdova8Dwp%SY&|bQCiRr4Z?zEQ;tfGBma*CUVnd#6rQM zbLLW}(xW8iqoE8-HFZ+-k60`X_F|#gyM$bxOv!F3Zwzy3U0YukuIyhzs_`t)xDMb6 zLKn?Q`{8fm8i9fX`R1*fV7e&i(mXUyT`bY?j;45{_MdUaRz#AlxR@4*CQ-+SHWDp8 zoK{xcczhhDRt}20#+Vm1m{u~J9fsB^Ge!!#A(oK4#%@|P@(6jSfmc#W?w%p3thyPz z{gR@T18=i_dO3EG487hIe!d}*#K=vfeCXA2kF{C}6^T4X8LC-BjUKg*n!C~k4nN+)eZy9QBy?EXY;GEQs70b0$7hsnytIz` z?8J)w!SbSDLH27#suV8@#6u(1lCg|5m&4nbZ*qr`d}c=a^MwzMP;f9MZ$%`fa@3`s zP;vafn0$O+IDVJS@IU@v{HQH{&sR~8dW<|!Ao)`{v za>=ZkC;mK%h(zT0Y6_8X_=FxlHE~5kCX+e4qR2z@u#ud7M3lIS1j$nJC38?jQ(AeV zl2WM+b!HnCrG}zT%a5vuMWNIK_N^=Qc*ydgXlp3*g=iL{sXQcIP(LAlrLS2b7bQqh zA}duIKE#D#~_IO%#2z2}PwS z5tfvtMwO`uvS@g5jrmfEi!TI;pMc zl+-Ika$7>5WWEes59XpOb4+fnpU<46)hH9q!boc>Lh3E5K-v4Kdn%7q$|2N^cu^KU z!baNlU=`ZvvW3*Nc0LSaVd8>v23I_&6v0k6t}(?fy`*#PT&2-oF8SlI&0IGhK&@5V zO=zX6+mztUViel;A#<5On5rb`B_gW?(dD~A6ylSZ5D98kh$Gx8hkKzA_FXzd1ShMa z&{UE$FP#$-$Qp^0wvY*3#1@K5KVh9h=>0tCtZIv*GQCSAq-Hi0hQgYgBr0&IiZs&5 zhR!xtJxP>WB~(sT+gjDALemyy*(KW|mZhYYEECVL1PSrBNBS&eK}MGpWl24dT))n? zh264*xCMt+663}=RXT5ZkZPh(YtL?&k}hggQE5~mOQT9HsVGciVuWhT!eL5tYxzjD z!l&voPH;%4+FyS~^Bk{ZT~N+{$B|A9SnVi?jLllDuKIdjc)L2(YL z)j1@$NYjczwBl-1Qu9QLW@g5WF-_*6|3IYkjCF~r3aN6#vf8E})}S4$2RBMqfyAk^ zgf$^@ip|G_Q-^9cI}%hT$HV6^9~uMWtBkz;1C;2%8X&H!S;kP59(qFzZ}tp*28I04eiXMo4LSTSgN8v zpdyM#xKIurGbVD-B6GkPS#qo*2do4w#3EK?=p+^sa)~O{gp(k0P*&V^PhN}a-*gV> zPesKXR8Mme)8}47yzhQX!i*9n>O1a%T?e6&yobFQGYn z4H}s!9?l)iFH{%XZ)`J2BCz@hE`wofOB=cK;I1MXoQAd`>VP;QRIVaJoFOz%%Bzv^ zDA%?X2~o5Yx$RheQJ9(WoLnVCNo!OI5!N1f#Rwv;3Tc!%ZWt-OsHTsdO!I`23DtuM zE>0E?gGrk%CXYMe(jYI>-w`R%oFrMOl{;mk9yGQKh0C|PDOl>44+&lXusLYegbWYpVw#50 z6^Jx6*8hZPs2$i9K^}#nq@jbe4MTHF_)5qzN+@FGQ8mH|X)F|Mp;uHaRKb#qHlbK@ zc|%eLH?-A|1L9O@j7=r~@+x-hAj&*!;ZS5soKq>%l*M)hg(8NxilL|%JN7jwLVM5& zl2{n=JSd5?r6ixu6VaLVAP6ZI%cwHp6PuWOh9)jy498&UB!S0qPNU&5w6PtQTs2-4mhHgh`>IrPe1GyV=;TgPgpb$#bH9aWSP-)>2 z?{_f6={?fl^);Bk<=eqX(Z7(WVfb@X3Og7Df77YL4n|6X%z=ZX4-qxTbiq>YO`&$c ziaBIR0(Vf3g8AA}jj&pR7pqLL<-iXyk;SG;}ggqmf>@EgN2$)DbCb_`^$BmQRL40>!67ExXdtEs^1bp4E1K zyev;yjHJrGYAQ21b(U(7slsF9hdPLTJFjTOo-|bs)1jtoNTf)pY`KIuqh-vT4K{~} z{>1bbPic{?4NHUymWXdx7Z%*aV_cm%`q zDXu=-gzBv5AKA!-4pq)oH6#ot za&IC?rFxRaR>9Vkzm``jsKsuiG>uWs#`BClBg`hY%pDK164OYOBxfr% zLVCE%;e_-<4D^GOiFHfR59*eo2^Df6d#f>YnyG2cW$>&=Oa-NaX3vbSq1t#Xv0uPP1O*TpPCR86Dk4SgsQ z|ClHB`7G`pod?#HmRTrA7x6FEJ#a3 zr=mlV+a-#KSo&@-*{_uJityw3UQ4AGscWK0A+kx6-B-g+r~C-kCnP8s zEYDF#XI{5a3#DMITEwZhPN28p%F)U~e9k)Rcu$UcOs4}E=^*NgFvLp<b3_&RvC(_=de_DwRq6i)KH6rt&&izV+|v*t+EcOLsdj+ zIJJ}xv;NzRS@c{jjAgeRSjXbqDUBmRa1lqB{50VghJa1E#06} zbxJ5&3X*8!VzuP1s8iE}qJvTbNk1i1mWh;XrANxaaiJ4R2eVK*cuj1|(bd7&Q5DEV zWX5npLlYuTg*5oewT}=W4#-3^p>r^+|NZBnZaMISag>cPuY92O~%4z^Z!f6;~8& zRS$>~BVE{{7S*zH4kAlZh>Pfu%XXs^Wf3B?(fnX`pjLr-Fb zZyq#~35`p61;^6x5NpV^P^C4rS~_6~Yl!7zn#v57^S@elH>r?3)C2eBvcykJzfnTd zdM`%}*L_Mn)KZ39Ce&Mn^wAa#7;+M3Al1XjU|@{OSu4s_9qJk;dw4E31!$ zhN?pKg{tM%J|yIlS4u(-A%z;3W9Dke0ZC!W6ZfMiE>c%^q}dxG&na_~xk4=uS+7ZA zLa9cE!XGmdt+SWfnh9DvJ`fql$Yp+r?A3ihXRRWXf56LBluN8wNh7+Fs-mbYSd|6G zViiGBW^{@uRzxMOY7R+xQxY5#hesE3nyv%Rr(Tvwxd@HzQyog)+pA~CC4PBRfEVpy4rkVICVh)ao7mATdY5+&}Ogfmj% zVMf$X)Y4BBim12JnEk|vl7mwuf=*QF+@C!0Kd{pY)jL1MlpEwSEoSAOIN3%o)m_sk=O$+NYAQR(aNRT# z%_h!~QMYVr#^UN;L}-+d?CL?D*QTH`2^+SEd`3P}j8Vi)IbJncC?C*t6n9k&1w|@O z)G%$Q8>!JAQzJKY2RE5JsN#ks%!B#V%&GB>R|WHcU%hdvt&D~vREVC^0(nrXaL9rx zzG-<%P7+LXyh2GhULq1mr`iy|QqU!a9`9m?^FX4pOWfPYEIwQ5z}2Y5B`iU_z&e=5 zWAsOeAB=P{aqczobb2s7(H_K5K9I>obo!5r4vJ>c9c7(&_`n{>R25G`F5Of#R$p{5 zMG>hV&@Ex2y{Drv=_{SHlm=q)B!P6`htUD$B5Zl(FpOA!*lyUN3L;@2CTx6-Kw;2& zk`+ogi|+Oe!|CAUm=zt&d+>;NbcVS~`k+iz6c`l$Kaip`f+VfPSy2*>AZ)#1d5v{2 zi8hrzLK5?qJO?RA)tF>+LqUiKGY1_ixltwf{Tx&;4UQW55<|1`$N6Ptc;^-T6~*(0 zf1hD!9{Apf!QZ1=B9hZ4E>aBSb_}j9K3;iw`5_*cCKz)TKXEUnc9AeH-N?AhQ(?Td zgA-#9b-?&5?AC9&&_j6eakD8QsgY4^j-+NX@)$=ta{6>5vC?Pc+gOv_<7kL6szhe! zGGRly{rSX{UF~#&!r9UZg&2waF)^XjB6F6ff>=t}kV>b}f-<>15fdSM*mMmgnl8Xo&$E-^h=W6y*S={r?bF=SEr0N7q z7Ws*`AKRW%^{O07T~T*gmE956qgws@eY)B%NveKU3+=1g?hMVC zR?{9cj@~0B6g@A#i4|cQ_3BnJD+XR9Cf=Cv1irjPynplzij%4mdOylnB0hFPFL9zV z&CG5IDU;TFF$@*^RfeIS&M68O z`2iFF2EK$eLK1|*fG|jCb{jgZ3;+NC0000W0001b(Rt-@9BuTWdCM6X_#P&HStd&p zpM>d2Q)9=@Wb!31mvNb$MGt#qw&`Y{A**+*atYngbF;&w!Obxvi$VLUx}rV+;?;9` zpcK@fRvB>}&r}tR)Yu!LQc0E1$C-9k8Lg+^lKZMQQrsLs^o!-jy{M>22Pax1n(sn} z`MXMnT~@uNhd#Cd5Ws`$M^I$zg>j0hnD+lXhaz7N9|fv4FCOU3qQmlV~!?@>G} zJ6c1KNUP>grqku8vE`~4|BDK6i>OC$hH59IS#w_3)yAn8bCN? z{`DqVngmNWU|*MumX+0V1NAOtS|%(t#YQa0S&ZYAXx)mLdocIAL!uu;d91Bkv5;yN z!Z?J{6?}!bv%M}OVnloifp2kG27d8Q>ec90km~PQcMf3ME}yxI;`E_Gq2$?(+NokJU{RAa;Fy{+!on;O2t&nDG-Y(y#bG!FhehC zzRWC&TwUft1p@#_K)AnC9rhthDVpeVLcmF=`vh{poMqyng0={L6+qp}3FU^zU6)1m z$abMz;EGm0x~vgSCKwPit>`{e;05jblS5@jijI=MC|Sj^#fm&9ELI5%)x7`bh0sEpyboX#ma zrWJ}opn=Nc`Li*J&5cXcH|ZOgp6*+`_5F`>K@1cw_P7Gr;d61R&_@Hv0^C(a(nN)q zvgXx13DDvHYacV+dTEnqJoi9KvaXf5;99_se7FC{AJM=HFpEBLVl;t>7x{*lLF-b) z0h?C=o$Dcc-R!8SvIwp@b2oeglTUY437xc8eH$d|J4WTg`&Tt!rQK!XmC`x>Npsm^3VUph4a5pL}Kp zPx)m;!wvH0u*^xAwkBey5fTX%51jUcGN)AZr4A|BrES9gWkFCXIjZZ_$2>N^xU8 z@!>yLx&EaWg2c=Z`vG9@f*&0ik)BvoAj^v62?eW*H@w7abEEdGvG@Urncf5FlU%|{1;Ri| z3?J5+-~8#MBD7~#fb1HFcI%-V?5ms*QbnQ4Pf zFN~M5EOq)XOh=BF5qjXhV#HTwM@DMvn2L(exIn?=fZ7cDh!3(2Ah_58ub~S|M#O<) zH3is#jVUjEx_kWja!ncqnJdDWGE*{i@`$kHgH;guo~kAz9zGFsYy`&2KA|B0x2iINXDbiEQoH= zK9PhUibslnAx-=zfcIJ+xk-L!kM)*ti44W4$o?MWl z3lWhFW;}#y*$Ii*R@tSPis{~VAFi(y8p!K4yg`sHHz({l9g~x1eG+X2#^jBZGT+6yF_|D@u51 z=;=qehTFfXabWOzPoG6kWVYrnYo+vEK6TiV(7TtlCZ}a=5{sb0Oxfjo7Qx^9RKQM% z>kvc~rWpA!0qFHaR!d-+t60IZzy90Hr}NEI5>9Kn6IQwy>Kr?)NO#Zk&uzn2t*JKK zB~qUwmp1)N6)pfTC#8$4rHTZjAg2|?8|Qn|)L4|g^q=5ts}{=lOWy!jP9JepwnuHK z1R7iAMl3fHo9;>kBSnG*sma2L5$iSuk){tANZW+91>|Pvkd||&&7xDyasWy818MX= zH@gV;1P{k{g`_gkan13HUAW8W7OlalstSM-F3%{0I!fW6YWcEFv$8E-&Tp1gdAo<~E?)-w z1)pIaDbd+p<>{U^9ooheNJt>x8Juyvf zY>1G@Cq_^bKyjN}EB+joK&sLD(_wd~sq_=EPfTiFm=&EMtpMpjxZnLW32DY@HS;Fg z5+mq`Y2y|LGAeiEbiy?^e#a}1P@z9bHSS4&Rc4cAV2>`7ML$fQZQY>IeQ@N4L^UIT z0?5<0-2rT-PDK^^#U$LWuDp?JaMqRk71eM-MFrA^+DP~_WnkRyh9O*G zCI;^-+VYvh=fTcVs94|hSTA%okYa}As#KDA(umg`(4TBBwUQV0W???{d z$JWXI+EV-_NWKU=cc(rhREtmrR~Lf?x&Hqs9#ElTq2nVDEX&T_@j+W@{L8FsGP^lc zwgk4ki&%)-E?|!yAC}XxMwL^k{I_zkl%uLNJERNz4iQ33j9lXTlzRZ~_}#H2%6_=q z_C|*)5xuhknfq-CJ-)fAh@B()itSUw$hAR145#`_9rBHvD9980ac5yiSVABqXHpGo|dIV9)2UW(R+*pA)SEnez$ZW z;5od~;7UpR@ih2gn>M5!p{T}RNJT5FVJu1QwpAR3(DFZ88?Ram)^dS8@PAr6S%JVUtm>nX!ZavrMo9;4)R6n;~36Axi^?#?BT#8v+%u%LweR9o2k zj~)gd4UiJ#d!d%+^COG;&Mz>6)|tuWKKxz)F43%|y{Zt=YK;R%q>7vkbWj3LX{kYE zYDmHl1)AHfHB4Ulbz+@^!9h5cSio@VS`iO$%Vih}%SUATDht86Z!r^Wz{9 z*{x4H+2FyU?~W0?5g(qd&vX5$ut+4=`>Q>EMX3U>GB}Udk;`3F|ACS zN-iDni>OsV=!sQP&wkz`@nIZa8 zG@L40=!jc|=B8pRaK{NP!$2gfHn+pPg;@o}SGQ@w6{oe|c=RNN(J! zJEV;3G@Q#T^i3un1a(d+*6r3ej-s|}6w|jiXw8OruFk4+Px8_BcLx=4nnpQ3#!;~y zoh2&cyzEJba{>5&6V&wTXHFh;F;c-6wGA)uX8p&8_NrQA3FH)Xc;&{J+a9S92>~}@ zmwo)SC%3xUz=~hlId{ypGe~YfV~Eqvu#_qS5mdL40R9NBfh&F-`$;r1RU%4DCa z6I0O)javXL5aJ83FfE^oW?Akz3ExkBBpx-c8)BcWW|5*v0#c>m7LcrNMyPydG3k;V z9-+4puspT2u9;j}LTKFTeic=LHtFc>K{D7GyZ+;Rq+zvzV-P#$Auoi)T9-jOB@9fO zauyVdUfT647L4Kx&212=O0R?)8uX7mij4f$Mzw(=hRKWFE##*Zjd>|wcfGA+h5n?;E`uD~vG*F2UAP10 zAsy3#munWiPl`YqJMfgu6HXg3S^;(C%Av4sLbmB);)W}u5I}`VJw`tXd`O2S=LYCD zY=UFTf91*);6@MU>zi~~;8Y`quA)A$ry_QGwpcn5WW*?0#$oO9B(TYt%0op%hSrH& z1zvuN=aDaofgWSK5`^iQwd_no0k;QZYU7Ccy*Rx(*aNGDhh>@2q=C#7WKlbCrX1^? zA)I{*h-8o0#nH8x;XErYE3@+Y*RwdO#IDGb_fR@F*a?liu)w5|gzq0E z{;JsV1>T5BEKC59mm2jRtH@0zL1-23B2H8>!7l#v_jKqq9YsEr)Scus!(NQmG<2C} z!2RuMMa*IVN7#pO-%UFhl7av@WH^LEwuAQPL$bHN$u)SCHt_u@J!uqSxq!MJP;suU zg=)nGk#bSss(U%e1+M^74@`Hb3DX{Bu;D?E+ShUG#cAGFu!T1i4;&|@=@j?T$A+Yc zp$AHrKc;6Q>hcGjj=rC5wVRRxrZu$U3jx&Jf487^mgnVS#Tm)VaSSJnGn$maI_Bu{)w+DKk1|Vsq@px+hVn6<>LL#z62k;(;KH`E z4)ZybA867dnu%+4UIv>%-bXys@AVq288y5NiluR-)`w;)Y^^3wg5~RuT_P`p-5v$5{9=z3nujm z1kwRWjwn%$Ie;4LV?x#(F0LY*qx}1!IE)(V&KN#Mi7wo{Q-09rIXut9>IaI$2Cf&R zAeRt>IYTE?TUysV18c|^rV2S!>ZluokHid-rN0eoJKeCQ)Yz{T)T=#+L!cUFk}gnA z)&f-$Z}Q#9cM{a2N7M`Q5K+BlzrNv;;n(z~nk9Rx@U{uEDEeJ;{TKnp;B!V0owEPfs}t> zOi5;haFtjjI2P{3_JfMP>mB9$9`SfK?l$e&G$)zOi+Ou<^*wGf;HuUBjSbT6xb}P^&`$b z%^b9jhqk1fO%wdBjH> z*9}LJx93r`;IfS~={v@7!X6h)a&ckAIMLfsk!qwYX6^}FwQoT*g$F${ftppB zC0&rESg3@?Z;SH-+1OVhuNQ z4hu~ZD5FR8K#DmYgR+Bu5B_o;tH~1Z0})=IUSDm8Dy5x^*@Ee8eV~E4;JNgbwveU{ zIsoT9W30yVKP5;s4yW1V$t^HgQOU=_-4XnOEhTr8EL8!wc8X~>Ua#3tpkM)Dz4Jp0 z*V4_piXrySzA>2boAXQxn<{JW#QXwvo2Mv7JS_j zN8VSavR`KBB8CqT|CC6lhO@wbJS*wr(7dXuuuiS6|s=-e2zqKJHPbu+hURTU1uA7nVG-a7pYiDs@|- z2^Yd0vYrk0K4*Kuq+R~TwOYf66IZk8K{_w$iZ?&4OinU=pO3h2WT*Hsp1ws)Ppe&Q zeun_QDY&=rqMqRZ3LgDaS|c#95nNROV74|Zv4oXd76{w=fXUEqsB`jQ=FKXIoi76F z+M`>E2Sh?cKo?=DQDG`XfRImZegGY8p>umk@6ZM6Vzd1D*Eh)-k`{Lf$YQxfT4|>o zXmzOPw04-wbVv;KuPNUX+`gsvFM1Wy;`A#q3d!@*?f1T5Xr?UVr8`6%Go)kJ(hE#u z^QCA)t~Jke;1gUOo3X z&HCTSp%`?!7wD6#rYc(gJX=Go62c-d$=L)){T`#J>C_S4j{YU9F2Ghih^~Upv0Nkn z8)pH%5jevCtgOX4)UuNg^bUwM8F2sk%*XWB1VaD@{jiNs0s@kcLHz73X5lP8p@(ka%4hv1w0xsq06qIm9XEmI7NhALqb&3% zPs_Ows%tW!0*EY}gWU?U@>kE)?^5ZIGIGNtP~mr1G@71bxg14?c^h&zP79>LI_g)@ zl+uR%Z0Z%|5cozckgJhC?i!LXFIGJj*Qh#14mZ#qR?&~ho@kZdkp9)Ao4L&f(BR}@ z8@TAEGstXF?xp<#{;;BHiDeMUlPtpOpIwXtFUcuA*F4W_azpJ;NX5o#J2qcEML`O{ ze{gotxWGOk?Q$V8x! zpWehFRPoWWpnLczRccTN0cP?yQ8)nz+M^4>!jjSBU&t3@yu#PVDaUOjiBQ?kAIMeT`V2aIk7a&X=15j?j=4%CGMKCYUjE1^j;;Tfl6W<=L%-MUU z71)Ghuz|A5#=@rkp8Ojge2zb;4l<@b$7LHAajVX;CO-yaajzx7)$8nxxh(Wrj8E z7FV&8F^xyb`h0>&y$96_QEi1r*DPepKyAZzE^sXtxGZwX43c70hg#RD4N~JPPwbn7 zv?MG7@lyQ-PDmmO0q8ZGs9C~gq2zWxvP{LSUypM@dzt0$LiKEYt;*dt1zLh~1|9{2 z8zuovbi7omhG4q;0JjqCm3tdA%M79A1+{a26ftWN5U5e+jf_U&vHR-k-625Ae0qZb z5R9AqsJ?O=Q$j@Mt~8p(J#jwNWRhId4T zUTFb%4$L948fAUnr{$&*&yG20MUG4)0?xx`OB(3}K2wbPaZG5-0n17awIT_gpc5*a zSM?y~{qO89{Q1#|F(I#STN+NTuCzW2)s{ma0$F>e)c^r7g}H7!#N;x>%7DnOI}$Ez z?ZT6F))a|46>R}0S`qN&Lv$Z%aABAwqat?#0F}NM6o`I<=P77)96lq-o|eUgJev%h zAN!~khQ5>tToDUtgsw4O6Rmn|_ygFSS-jK`B@hKpmp}}us>lnLPtirACu;#3;CHSv z@|P;HFlyiZ2Sj^%M*8f|`VJ}IyqbIIBy9pahfqkz)V9TCsl`U_G2)JLL`;df)9x1! zM&6k;NwD^F37$uh^(7rKyrNZl*@1_N_IItmt2*B+tzO$W18BTSqFj+|7jmw?h3A%q?ZicN?g zv*>m~^f~x){Gb?i?dGODw7Wn@ZJeB)IlWJehhr&G)%{_(qNBvz&*0GTV_W+FJ;t38 z@{ek#w{P)V%TDil;{wErD(wk~d0&Z-t{yvl7X}h&6SQ{lXM#m>IV2mz=SIj?4}V+R zWz)W#RV>5a$~GvsL+q}PY(y-`YnsJqwF&>ZAY?r;wI5-?jxN|&YL^n9kUv=o3eW`( z>>IZy4!{R2n5?nBxgu4#3&9Ah{6_{4+5y}YaTZR0mhbdw;GX@eh({ZMHd!~2u<$v{ z-Hdcja$UT5q)Vuc97~*F+5-W#1AYu^rl@gAaA)T=3{adhT~Oag!(B-z3_`d1Wu^Is zofS@sN5Zd=0f70H5d9z0ZUAxkp4TSmq-lfR)}9_`XsKrWoTzVkL9b)$cjwTz3f&Wp zM<3`}#H`#Px|#BN=F~6O zgz~!p$nHf3V_dl&5r92853T0cn?w&SFo+nV@Dt!#w#1OMAtNaY9IyzHY+Z-D@l>ky zqz-_UapAnOz0}AYYo2{o-wt1uxr_jU3EslJ@ERzdG&1wYI5Rf5tWi69n45;Q3x#e$ zXH;#69_DXaZsYnF@+OuH;47U=v+YSG+7KxPJT4J-6F`$sxuZ7{h{F6yQq1d0n<2Nn z)VfBjs;u!|XBNT9gXf8V9kB6>`wz+*H&zUo5WDMXyz!w7z#q`5gk&xFSRst#PH=A- zP5#cucL6B9oRhEp7UrXxxxT4SnDS;5$`I*&2!L`0yDpuuA;wHbwYL=!{7SDjl#yXuML56+B<97`lfNKFS7=Gtt5=iBr6@7`2GD(O7s(W( zelqNVCGwS0yajcb3C2BS1hnxeU|@cJmuio>?~YU<0W9fW!N4_#I()*oPGngH2C^-R zFqfiLh(e$f6AK~=1ibJH!$}L`{?=W;JTi5wqXwR~qvLlqa1Vt=AYy&O#h`4-N7NED zqiA~OBRmhkPt+QJ;AaTJP35^T&S6$VwrOOaIl(PG(QU%t0uJ(z)Gzqk1R3JP@u4r+ zm{6HwgZC{OT{nE>m!TQK#a3Ai=_McGSC|6IwjETg5}>bm@Wcke5Ca)MMB0N?WunZW z?51-At`IX&;l#~i+427-pd+;vglxmv?31vnLS#<4bl78p(cm0E z*hF<>E@_Y6TK<3iIknM(Cb+k>#UWq>))9!HmT^xIy^AD4_Vsk0$FH~Wh`Wz5hxNhp z>`(lOXvH>o@0M`VAQ#9H3@yw4Oq8fEudDM$4+~PGSamTI^(|%v^CG=m6OOXu39SEt zz%@VDnGrD+6TsB^3MO3HFm~D#o9!b>{ zIrLhD@va@wTt^8>3IaJGfY9?|%|6h&DwG)AS6L-#Yl()pibMuMje-g7K6*N+bIi{c zwBf+uF3xNi#8ON6v+UNWMJbxCqTDU_hj-rzBrfc^?%cs%>&`y$8USgsW|n1c!ql8-T;@enE+!|0;tW{ zJoq!aStMQ6&i?$b5!~+0={P_v{nRb=uk)KZK@iBfd}rvB(C9AF_SbSQF$JpvbXO8E zhVu!h-bHUNJ!tTmw%Rf>vA9EivBq1F%>)HF_Qr%~=2TcoH*BwZ(mfjj!$;)T5v;y% z%+`e)!MdxLNb`CCl}{~jbyz1iTRx>hs{4OH#qOpmH}3=dh>ez|vjr8lRTYu?t}TQR z7G*<5Y_XVBSt+QVSpeoRQ7&UcH~zF_L~bwufpP^|6JBalnq_nLx2>JR$=Rgwlg?<1 zLUY9U>EtbIhQO|~ST>&Hm_u%@lqu)P=OlJ5V{*en>y3_1^jM}AMo=s==oB4F_YNaj zz^rD72H;AY+3)nx)20r+oA@^DXzoTKnVY*@Kfr{J|<9=MDi~u|Ycu;aQ=7v=wGK{5qyG|xD?;0UCbZx ztdT#k#|hR#V=$}}ck zKa!>clVGfJC~s=aRTF(YQDc$G4%k;zNG!(h(=aMI&a#Xd9zKyh1`~yF_KWQ9hXa41 zRP-nzLLhs+9%if@9{Or&uoN@BO!f#xl;gGUIkzcMMQq#?2kg2Vfx`z`!fZrsQ%q<| zS)zgZR-7vGGjyShiiu#K-g)CiBgdO#1#X3G9py+0uyIxlOa|kL7nOoA&&QRFy)e9eWo0{K1qn* zjs|qn!{R@pj)tD8?`_$S&@V_eA3#nMd?d+o&)|rSzClY^<$gt-wgUbcJ zA^_a=>03HORAeR_OR-z3VNGHxGC|bn-}%`(i8{FL9_L(<8-38vrvMDA3rw|83tQ8K z6{Cjd6<*=Cix_=opXT(}C!J`RkgV*Xb7}$EURC+E0|O&8F}7jjuo%MyKvkB-0Ogk5 z6^6_pY5@cH7jAbw1Ii^$Al^>+&)JSGq5K)2zE=nVD4hVSTK!jd~(SucVFXb;<1kY(Hx0FTup6Wn) zfwTY)wR!6U8089L4aAru+zq^7Gb)C1SbPk|0pSYVue2~*h!-}gPzoG5`#$Shyrz9s z#3i4M|0EU{$Q#{P@YIq)Yjt;?vVc1RjRm1hg$VUDAu9@mQ>L}E2-5oO&A|Worp1)K zP2D4z9f9LaBuLG&B8BKNmTV!?-eTIlIALP>67z<)#vK=d$2g<2c0C139}2!WKyb0q zWu8E9YVs&rgwue$Y#3K}BHVH{d1FP#RT$S1>{J3Gvj!BAm77Iy*hAnhb%Vul5Ca5d zsuMUa-b<{{{RdMuF%VdTwMl`W3CX$ix%&Xvs8WSnl=z|O(AqLoxhB9twlXf+1kT86 z!$b<=Jw1t{DgdP5w@1n>8Z{xknY_=+zue9s56DKZ?26MLl*F}KjXR3f`(bI82gCgY z5_Sxb4}hz8PZa0?p}!%ALwex09&T^<&5 zy_HQKsc&UISqn&x?{8seQ6d*|sXQg^(vsk^#3(=~y;vYqu9!2Yg)1jt@8b{?N25xI zh8ZjdSu&$2Ux3-6L6rt#P~vFQ(0*ti_%g%tIPZ)77WL6TvS6>r94AsL9DrW z;A@@SRzaR02X}v>yn1Fu zw_sKa?)|kK(^nI)Op=B?%X9r;4Mp#gg-DfbaungP{lE}#nrU?&64_c`Kj)^Yww4y; zNU%>NRgHSVy)aOt5$On|b?FC>B7hYl#!s}|7);xfQ1tBvjLc`vttS1XqbPy3A`PBd zpfj|b;|o(vFQTy4Kk~Ud@|ZAj>@i;rO_+z4m|LyXH;H#LU>H(f$1u9Lk zfuWW6&uDHW#p=n1H@Doh8Z_K3c!V3y_Hgx^wD?~J=K%`5O%2G*7wK5kFB4}mvuJ>l z_e9gca7i3GwT>djU!G*_65?4qL8a(k`HDYcvx2!O8wA?c7j(mdWQThzj?0|>K3Qjw ze;t$v;c#@SQ~wXxf^gXNq?EuEFcG2{!6riK2ZW7X&}&b=GQ^C^t--)V1Mn3gXoYSg zHk|T)G(#G+ruV5~vKYSw2N5@K3c_e+9!01FK`z7*8?u8EnnrxF9F$CJWXhH%jKJAt z0;J5hAR`Yv+Oqf#)}0f$b1)hY22Csxlt+sAQeu$rf9$>63jRJI`cdz*0I=Zh;ovx` z*S%TCwGS+u7#Ywq07Ibi=YU}r;->MPs!>Sd#O-r|bIA0%+?KT|(VgYoXX|lg!b`4S z@#VI?z9s+KgesVa0KJs5xw^#LhzFth!}E_W&44YE3J z-^{ThFn1@J3%-8MZGlv3xu`Dm|EoWn?RIfCGVI9ZbC-9daho->9k3xW*5?3Ji~diz1>Ni3;xs!WKqiJMPVAt<`A9J z7lStrmvU_FG(6#{rKf_Xnf8mZI1s38&?i&|{-q6%5am|sDHZAv+Mt}~-=ldhgPe$A z&}uM{b1@(y6$bLWCc60lB0$ol#P&uQsHvNoNr={y_!n92zhJ9KxJqD;<&sQ=hOr!s zAv|R^1mMhdLm(=AFoG$tZ&hQGgw`e8y&sa?o2=15`tgp9J32ihgL%VjVt7b!Q~w*_ zX9p|H=EHc+2Tn0AwNhsXiK)zh11*->U=R*P0)T8RzMPw@Q-{Z z7}-dONV{XXD)9V!5O0)EL`N8wAHmB_ehObaXO@sadeuSXnK2HaS1RxO<#EzA$_*Cf^#>w5Bq zYFVHfB##+bR{1nOlp>JbBAiz;Hf578wP-WI4~+GMi~|AFG$0H-R7?7T*3BNQ=`pY$i+;p|_((BN-q|4XVvmd9;e@CRT<1rxlu z0V2f+=y-dDn2)x`+3#L|vK zbPiV4ui^ntqwE-KEKK1OiRc-igcjGSp2iby;JZOP#$!D!P`KD3)Z!vB)fg=IV) zzP5l3y=H++qIQd>Q$a!kN7~~zKFtDCYGq}?!3E)rSp@4?#)Av>6Fs1+xUNLAVo|)& zxEO>XT2>a!fbv@wsI}EYAiC3==SpTfxmabW7W|Fwud6ILm?9im;rb?v1s3I@WeB9XM*1@mN;V)lDW}$B%$%}BM{gvPr~8?l%8jdQb;vp@__&D| zXVP^TN7h})cblczaCcyHG%>qB^-dT^;q_e?VBAcPdbobf`V_@-+3EOfd7O7$1ZWxo z)PAwGrhHy)yQ4L34z8-E1F%!XW3V8uO+9Ojq@xgqoL&dG=->`)E!Dg-+BLo&$WGgY zdRC6j$PO=eV2fXFViERHImK#HF`7G&a5Tx`H;xDd%$ADxi`RNb_oW!G39cR%jds0j zG0E&&kZ}hz>glX0>lyO$YRf=hHmjyA!Yab4Rh+%w6gBP5j15oYiJl)$Z9>w%O4|`( zq#Z`O(cX4Du+tu4cmr=&XlX|S4(LEL!wG}|srt+wERYg(DDcHyn+7CMq00{td0o?^ zzd&+F#$D5{@_<-G&}HiFsDd0*x&{vKUM%)f#9(H6yb~IDpm{TQh92E&AA^J1G8RDa zz+(P-kjC1Bn};#j0Gf-54+TYae7Zsk8=Lw0%x#K!wbSJbXl{gI+;)k&Y-K;PTbBW?^|iuXG(r<_|d`9JzEg*jJ9)SRn)R6oF+`?ph;M{_P^&vfm)#q{Y0B0{X*$&S16{*;AH|UWl^D}xs(thIJpZF)d;p{*v8^%zQf5Q8H3vH~ zWv(D4sM0%V!EWo~gjADk>$D17jHR>Nstloj0CDR}^J#9SWEQOtqWZujq`vzQWNtkP zA*<@QU?lXF^jH!h^&D=MNaO|~#olhKv)~c8vUMN@?M=BsNZr_N&4z;(4E32~#dc5^ z_F>{!M*T_q{Q^HH7U{yVzEZ}8dXbH@`t!)AoS^k9h^%b=N2XDTkM~m9(E3ebNf(pb zFSRTPzSS)1b97RO#?sd>Wi3*{E2|ocm)9>%tNQATq5}h)jJSksj;w5AwEi4ca%}#h zWSpk>2aXU(yiddJX`=oQ<5!(A_$44q?@M^p54HEz5Xxs~E`%1pohM@ozHSsgZSOD1 zDyfz4i_X;lz}nb*3cu7$>+z)yFzV-YkVz`?ef@w2EQ-Y3*MneCs(ls9L0bA=B&^N{ zIEcqnZeDd)wa<77e4vc0$KG{JHbJCaD^zOKx-5t#=w7;lG=YLT7lffPN97_85_e%- zyivj-!bJdxd3T&Ccfc<@u%O4b492N!F`(!#-%V2@fB33ZS@09-w7@amB@BhkY83tdr#(<9>ZReMbgh{ zG1Nyjzd)plQmZ(KGi{p@zqB9Uis}unN3{tQA#eKY78q3JziSA?grBDDbkyB9T*lYx zH{OAqKme$&QHv)Q2VS=Ru>cHy`U$`x84|OlP@zWu2oVbzL|??ca>paP&8^F0KWIDO zFLmzf1lrfa5bAJ(77had2LMA&FTwZ-Lg2r?ER>33@d~DK)US8}uqH&-Db3(lxCGO3 zuFKTl7e=3azL4 ztNEntQN=(b$DdGrnMvOfOvFV27OrBf)1|K?u{}ohWdc~y^`*#cc6x=D`vKp+phUf< zh8MUENZ^s~x;%0W6pq}PEqj*E^eDrO1p-9QHEESx_pLRbp7FGK+SciddXXI(e@++7T0Euw|F*++IwK=jn(EV;Qlt*1P_G4V$ zn2}*MyNO9pG9u!|QrUWouV(RNsjSME&>rU`uR@V9&{CL~+kONaq(Ar#L52zm{IID= z3hR)_;PAPP)Kw5nh9MmC#f6Y$;L;T7*6*DXx^{<&A^0p@n;py_O(q%aGF){Ek~RBb z5T-gBb?~*D%8wYqWUw&770{!eE(93GjWK_b$&2s#nvVK|rC{|q0s=qrG1(={&Hks3 z(1xC(4k8V?#F_t>zrm+njJ98fODfmBH|3~GizOUZaemv$VV(@)oy^9HU;F|Q7~F^V z=6g#{E_7RitUZ`wBJx=U0H{#EBSAXM@(+}sD7jzKOWF@KmY-dL@FyOb`@F?hNjvr_ zAYYVQ{Y45ag!GGmuJdU^zUHoc59F&y$3Oe{VqxKLczjKk@2y4X9#XB?zNq61+1PJz zODMj6d;XZvE4~z`^dJjm#pqwWiK|Y;jH&=1czoIF_jOP&yuG(ht7j}df*EPSPnw)g<>d|F?Hr6ziNTm$D_>Mc!WQ?IKI*#tF-Ci z*8Ld(^qK(xRg6iHX2m-2HAucOg6ng7FX5C32k#PsFNxYM$RXWKB$3>?KL9rfLT@|W z_cFq-{g?M*+_dNOUh{E)pfUge@y8Uvv17+seTs+egLHWM*SN|)tX&Uca({14vA?hr zfbKiT09ly78iS-S%<56otPHBAyGKqEK*tddGEzqZF9w3zg5K+zoc5!yz{fN#reFY- z4(+0WL^_-}f#7H-Y*x`1)V-{1XgRZh#GnJ`Z6SXiZNE}2z$9hyj8-*F=e~%BvoUoq zYub$Sex(^o*JO^ad-){HPk32VUDmPUd0D=g|6x~|0nPB-UA;Ku)nnDV`(u!eWUvP`s+r zoFT@|cU82*TvCkzF|WX=3k^R5VA)=tbudpn7vyTegT!1rfMDN2ae!Q8FF}=z8weNp zK%9ne^*=%*V6XBCXmIN_FnuIfFOInewOXOKD=YRQDIY+l)$$f_HA*dNmJP_#YnY{( z&1g-`j7~s{I-VHA`CR$x;`5@%EuJ~A(Naf1yCT6&Ma9UvoG7?C7KN$_6&7p#liY(? zt2Sbc!s6P6_(-s3??d)}CEGhO&sT3AP7--_9%!IaS9Apf5pp#xwD_}I%_4=|){6cm z%zIXA#1N7hEA8kAt*?6I7=>i3uKp-+YgJ_b0mn$yz%E#PQ;lH`7~u|)(g3AKwJ+f} zq1wbsf%jAhVHdTWBI`K$ggsdMn21OdOFcL_K~V~sB$L!PGl3K*^U0CaRMbCGU}#KK z3u|gPl7umoBf(GxwFs35g@OggHBb~oJaD%Rxh)Che8o=?Sp%<~t}l(rgVoc@)LNl* z#Zm!AVMjatBa$%DX(@mPknbN22aLq&zc5=q0MSo~F5U);>#VOYrkY z+Q?ER0E3V#kr#KFs&tHowVP9deH7D=Qn`l09F)jD^ZA@~ghQf-Nzf3%D;lal1w^w* zBH=eb8wp~DQ9P0MhfmyCND%KqB#<`D0zDtW9OLbrcodC`?b1;_^Zy?lX?s@Jkd62- zh6!jy@W-Sn5?8$C-lK%I=%D3AE6N-I)U9F5CL&_)nbel2KqTe3l|adW=p-SK z5FVOWIRMuivIqtY1dal-(6%H}2#~wB?1TX#Qf-a?08phZpKbtlL0irHe~Pm;Wb0p# z+3N4?|3}$kKK@f5TPtqAt=MXv(*MG+MK}3Z16wNzex>-Qq2T^k-w#l)KeGAR`spk7 zeToI>zw`P~!Tg1_)?6Q7QL|QaeE9bbK8*kU_~M?q-Mu)lry;ui6P+GP%YI*ip0V|0 zo}8`$k*Yu*otVDM;W2sW&-FWO*7>cJ(^?G?=9nkB?Knz#h{_I-0(rc49c~vdFx3Ix z;l0Il8WK_J1>cS6_|EU=ZRfC^QhnY>QM5u=clJZ8GI1wZXn||CPnB`zhj#5CPHD*g z{lP)OU!Txt&G^<$?oH{z`a^;LiRvbSse-!F%MC`Ej)TtPagZ(-X#qPG$|Za-d=sKu(SmMMYi?%)-UvbG)oM&$#@S)y*pYG0Wl{ z;^Tvv?Pa)OU_v-vRTk$17huW)F~Efencj)tZ#r32;d}8IGY@)eGQ~97cYg|EIK}RX zG0cjh+Z}|dAmqLh!QlAY(m=5NobZL*X>a)H8A#dvV0G~uv)z%$X_cW?DYifrZBi9ERQcD zM0zFjGa^Vu#9=MZ>#Qr{4R}R*IwIt~VJQK0165If@`?r@5pa~=8F>(I+kmdYIT(i( zk^(raXrD8zi=Di%L?z{(hzm=B3R6|JSL9HIDXQ2b5rhPi2%5ZwWdth5WT(TN6qY=# zYtWfbBD}Y-;z++sT3AN0qRv>sB7!8Nux7UWP@5`Xtc`7C_f;0Z?-5+u5U`JmrLw!} zEMZnJ?3M_WJyG#)m(Pf@9FGN1Cx~fuP&n@bB?)nzUpMghoL^vU>u(WS@vi!YbM_p5 z;+O0I$K550?uli)sHzx;c0Sl9AIVdskuUYm?F&o{@#vkqY6*)IZ}~@gEg_+)BL4aO zf@Wa80t5}=eWK;@G1D)t209ua2mFxDQ4cGBp;2zqSymTs;i|yaow<3^(+KiT)4cHY z7(`OTR6*+irgko%IGEzLt(clqX;q$tJX$Egf+~{>sv3IH)GF_>K)DkdQ<b2S=E& zA9npw`UAf%J)6=T#@YXDC#oR#(g=wNN0d-8t)DBh%G}|bm|kbA!23w@KfDe@Dq?|F zNWx@-Zg6oTQ2A)(guyE-clNlUWB{U$=gaTF98C}j;uiLF_}VntxkZP-jke z7|cyl^s6i5kxZ_z1&ms|BPqz9Da#Xh3_4EbzZH%a+*uOE@7u(OoiuWG2B9oYj^vp;1V)P=(Ne>1~t4H?6#!PUa zdPQet@CCNW6f>deg?nMvl%&pmEnaYz7+1byeJhXE@F-0=%V8#MtQxaD#Mas8uT2?C zf4mMMo1mxkWRjK2Ey0ha`v=$t7Gz+n4g?6cz5IZ0f|yLWhmBN$ZT@AFi;XlYwxzSY zkV$NV<4oFq^q#V8F@IC4G$U2_E*~x*f`L0P;}u&_Uu{ig!`e}l}1f2Gt;_i zJA%xVc+4%R1xR{*#cCNCGrV!xya@sl669j~eDHl1kQ9<}^?t%oE-NN|eO$4l$y{z7 z2P8)Nvi2Esm2ZH#Z0drNytw560ak#SmZc4}<0%h$S5c_O!LlPyaOK32E|g$dDe!u!t*=*EqQu}*IW-#C0W7zXT|90C zulKn}VPs#k`V7(@Wi5F7pqj%l_(!$v#ikb6O~R1@uLTo#?smZCHIi7&2b|hq8xM34 zcuXCE1DUN;Vw}lD-~lDPYecZOPYFE5E;4iiZ<$`L@;0-vU31?d1SfD@B`7J+ZSJ@L zFMUnuuE0N`q${w=XJW24_Ohn30BnK3I$~*J1@0qcmRi7>dMtfJGhQAvZ#QVqJ2}i5wx!e|iPih|p z%@+X@e~%c{5B)m|!Li6y>jeDGy%Gh>&Ca3FnE-#Ey$#DwngaaIfOkZ~31Z-Hj~bHR zEGauEtxV^)WvSXQ{0&&_^N8T@`E;!4GAQg6@ApPGr;YcUZ{Mh`&8F`AjeJ!@1Idhf zznSsD8P?z8`;D!<%(%>^sp0SUvJ>w{f4}+DcObu*PyPl&HATvWTfZ*;uAk}H-hN*1 zBz<4MgvMKd4Y($u{r9O*eA&h9+W8a$hdL=?y{C%lheD$CQ%#>x`$QhePYE*RlWJI> z^Yh#LkV{1N1?tK_=@%n`t)D8m>(`h0gh`@<{VLBV2402R0W9ENKcRx0Jb47sCmc<@ z%SEyM!S6@)zE{9!)o(qz-?S&O5F&7o-NaK`W+ACoE`cHT#;pIA!G9&n8iEiVEx4b* zb~xILTOa^;9|VMlatr%=!l8+rE>E>hYi(r(gKxxue6sYs8#;7cT}}fD+!I9n`Yjx8 z91SyZ9cE4;EKp_(IijC?M|9UmmtKNnoVKZobrBmvr1iqk8UicaiB^0{-O}OQu_m?y zfZC%t^S50Uf#}_S{ocu@6O6J0vB*r#RyRI5q z!3x=-9%vZLU{rrnWltXABo^_JZSD$xz!vNeds!X3I)5C2jOULq%#WSh|Gk(|>VE>w zc{S&!6u1;u)LC_Cq4Ntiw3OWVd8eH6YW@p*-X>41<<~Q)*4T!_#uz!H3I)LfYiK`~ zhQY?|hC=yn_ro2;m&#~vd97_*DoSbCH|9^zFGUAK0+^!*I$t=JKy8aOLIkG?#R?+# z1;Ywaoyf1?n2B}(5T#uGQecdPDZC#K+^mx1sv_oKsa2M#j1E*Xf{7}J?M2BhX#kbu z{rhS3n4Ox{y%J!LdFF4Q+2$TQp%Mgw-cWAO^U``bT`rXcoCp4Ei){uIoPQTVCuD2O z=LVC5hH$U-a-az!Fu9Eca^hO98mjw&9$`AVLqW_|3%s(TVlT&?dorX=b(3xm$)Uj3 z9nyV|hi$oxG&7m{A$K0=SIEGOOAJae?HWlS%Lc1QXtGbU?IE zv*D3fCVR!f1n4lUI%Gv-=}Ov8G%SdszB9}bndqW9v4{%qfO=kfu=dJ$NNB78GqR;p z?@L>BYS`q2A=afhwwG3mhXRGwqJWQQk3=)hA-}*G0~9E?lP^Q+uR-(LBp4oJOdq^YdZw`f@(|zbmCG9 z|35_sF1_C;?@_(4I!)Oywj=Y2zI7|T|D2AStp3Gn2$^f9u>-_AOjrWhje6>j+Q}A7 zG_Lj3(#Sq|Ic6TTh*a#Dfq7zwe~ah@P!802d~W;O;9(*7$MwW5gum)NeruDk>$u#? z5zv@g8qRD*(q)OX#^m3ryM}~*uC@b;apYoxK2&qoNS@v$`uwECvmvGf--GE-@{c(*q z)#ulCC7;Sa+MrmocRNw-Qaf_u(#<*uPIve<(#I;V)v4N=>Cnf^Qjalf&y{&U zDxfN*I`on$(avw%p$u4;U!8=a%}q@*`ah=13}-1{TqIDE@qsutWdj^Zn9>##8Dc1x z7m_J=+!rX1G6d{n2bJWVM?w*Cd!4*w5G{^)-iLUbDZGtGQK$*z< z?XzOd;8=mhGU6P4a6; z+@Hcb1S51KM@f<3ykwnB(lG#R{@oh{@CxpNXO8ziN67U;F&Nu*QcgE8VlVkxfTF_I zim~T~JmZCyS($$j>xtTBU!*o#q(5p-Rq;ieyk0taNfKZHKs~K}IZ?Z5goyW%tr4g} zJ=*#ZFtBBqLJsR8`2`e}B55{zTSDG=`yxs3yXmB>9Uu z2@>>?iUJA4wpQqe-0q#U$wrwC&2|fc2!J8EkIK+alW;qDpKi%3&2bJhIfwSKh0IBB zXiZO|!wi$=4!{F`&fglM#b04sDSAbvWG61zRpx-u|p= z>b+z1OaUJAWdpVwiq)p24+}i2ZVcqgjYJg@rAr2-&){r^EV)uMZUmuI>;6gu0$tgdJQ`QOvVr2aH*$)3a_SawPHhhlmJ}m z^|b3}0=p|i$^u7P(J26P8iSoKiO|&n$rOd^8Fa!f2%$lGNq8zJjQSm_Gk=-}VT54X zb+t$Y+0IJ>62M)9>-xD2M0C%Wr})8vB>?sd_R7!3t_Q8vx!s%K#Z~Z+x3~()o2w%Q^&4p#i`FETd(g~rEzQ|jch#LZ^V zJg@TLt-hlRF)Ob(wiA;f%n-kbfs_Fu_krcVf~<=qqlZ7OhL$^_{LbwN}4 z6=mH4rkd1)hN9x7{HwZ=YH5^_KOg1g!!Yzxog)l3>l#&a;+v#hxY5oupy12-;O-p_%!^{245;)~I$5E}2p~C^zeoQR4%Jr#Nz1TIG&J|+ z6jH@s35F^FD{W<#6!N-{>4t+dejaA3LX5ij53@VuV@_f#jL_0ey*dp5xO*&==@^EaVEJ;Lg;vM-U2yHc$3lkQ}h!_F~|Uj;8h7)Of1Ae2?1lAAr6t z>gY0kf`;aP!rb-amgh$gRIn&I=i7!QoxZ%Dxi22FtNUib@Lia>4_?u@Pp8V)q zY43fbSUuQJ3#$Ti+a!VRt8U|6T@CL(!BgGTCJw!ONz741>tzz#s=}Ww>qDgkpj2GfF9@IC3cZ`-PUl3%v*B&A#+-*Z?X$ z#&@T$>=vk_n4ZDnZ23vT9KBwSuAQUH6X63&cc?63n~qOln9wc;sDV1fa5Vop`8Z2q z2z&=Wh3a4}%`ED?x8C>unU;OlD1qm1Wk&)rL%bFf{7>q7{lMu;O zmt<~g-Gg^^Krl@hZmYE50K^R~Olh+~R-^#I$QiMP!=O&pI2kHH3VUN{6^6@I+yZ@E z{n&f-Vocq6&kM?Nf8a?OIiuT2z|-0h-$1(|Qy zd=ZKq`lT@Do68&!6CF&1!&~jaV);!F&DBP*#_?YGZgQ!jvyoltz!bD@M>1U-BLG$5 z*c2f;rSq)0u-k62%=J>B^c|@ zYOpbSPGX=u4e3_i5Pz@$*R_0FI9-kIT@i_T(P0FgR`s#|Au|t-ZKMNDKUX;mYs3<{ z1>abHG%+brhd+vJoFEb49p;rp>G`TBZRU>7Jx7SyQ{YIU^E1cc8qg3r<9k0z~?#6H zte5Pl9H9#KQdw2V>S4Rx55eL&N?(&sQRyY-(p}T@sc!3gsp#ES9w3IS)m-?&i>AJq z0*;Ja(IDHE!+-)83){0XHTaELnxHJ8NB{}~_}MU@4pa$Lz%TI?f=#)y%fC+!wS!t;PlNnx zeNOOO{vX}nx4x<{ojjwf_08)S$w>nySl^O^jWKfoDVQRfJ9|q}rO<&zS z+P)I&6ZZI=;?#VSKbQ`}_o}NfS=f6bRy{$yHrsI@^D;1q-GI>ki?KVC*&F)^+?(`PM4J6pZ6?lFOCoL=|o2q=biFAo?G|QH{QyfTIk(khd$D~gLv*izrP!9b3Q_uklxbo!8n8Y zICiH{FX?x?9MD_+e%O73b;2v0xr7WO77&KxTX2xVfxQ1zY$ku<2^2uy5d@5H`}oo8d%=3J#|w5zaf=MlJ9BiI8!o&)!yq_F)QS z#fAtZ!b`t{;jevfurua;geSN0MiG!CblI{CzbZxZ0{jArPw^rvl^G{-#OzM(d6Xb~ z#N+7|j_$|UEav`>xGH+WkYb;V*{L+woyOm*W@UBf4wpiD=Z@j@)vp2<1kDeWLe*Z` ztcOAo`%q1>cDYQrm@Py>Y$hZhgS*B|Naj_|g$WT;F99*(>^#LETzhB(SLIXvbgf5R zRrDrQr{a0lga@~)Cp#nUCIl<4?@gIC6C3tH=g9U0Dt0#V_yD$0NWw3iF356s=cPOzVL@<*!$LFtvlSDci zu=5KuT4u6&+KuvJ%~s>H^Ve~lNlU{GbZx0wT8{bxc<(G=UW)ge`UeCm0M+)(+@ZBDF)vC*6Ib81*+=^K0 z@gP{{*=#o`6a8$7H`g|}`a5)69{}5{-Uz%OYac&`Z2^D_TF<=P0nar)>QaTHEw&_< zl0^-Lku1eNpkmnhz%ED>y;qs&o9}=Q(=yTLm>>89aZj1(v#cgB(+>B8TBIS)_rw|^$Azc=XRky$+t_MUr#&-R0?VC0-~zFoA0c_B=gcH z%5q?Bxd%xv*0LY?EbFnbjM*+&>v31)aVkcHFHGil4~q9RItd}U`jilImn23!g6HWn zn>d@)+;v1@wiHUkk|hQ*{Lh$s+qD5n%uJ9s#42O&bIV|)GfVbX=&1gBIG+e05a{f8 zauR3!GGw6mO7(fz{CZZlo@hNgt~B=F2Y8JJ=13p? zUk~mRJ|mFqK32eT+|PyTgq?pNn^To+@1tDnUT2?%=4s+!t{n?m>odPibG!FI(A=|0M>0nhlp;(L~+ty%DfBbP$ zZ#2bOD|18405jM|UNAKVOS8gPoG2V0EICt@GEqVq0?R>d2k-qlWBs>&eTTf!Kw#Y^ z;cRRRkXFE&>P;%sfMp7Hq)7q_2<(}a6$f@}vc)2eax2_>o(8T#5e@BR9k$_`dZXd=30D;GbF-?I=qN}j=LCs$+vS0(>M-eRSRqSMTa#Y=c{R-}liUavN(O|%lu5$r|`ZBEh&rQTc z<=p_hsk$X9&J~-{uhW&d_94)C6!?pzeWW+1Op0jRdwc^r z#ZxckWh+D<)NEI2 z--?2)d4>#+0=5L`4hlJe251Fsruz}-819C!Q2dEVPN3M{FnyJ{E%73Reh*2+5!0Rifcr98!Rni0zMoo10sO5{6+c@ z@FkqPqaG*tP-p!l=it0&hR%Ap5v6w=1&u@D2t&}&+mPQzv!4(oq|O?Jz`XH(@1OU5 zxcU8!T9zY!5&%kkKyddbjlwZFQ#*F|!;36#vg$Yp^NY*Jc5vK7In$k6eW}y({E7^X zVI1Sie5*vt3H6wJhfgj}Sg04w?in|N6A+nZk3zfiQ}$-N*7g7)+Eu&oC{cT8A{yY2 zNfSfr*o|^4=!SbP@G2s#G~jV-UcQ*0DQ2D(k+QI6(i@uh8X4m%qO;&(zgLiFl@KdJ z@pR7qAQH&x2J_nOp}}k`qH|^(995dCzo$h-t_Wc2^->nWf}H&y{f<-?G4~K}H}X+~ z9IPHSbPLY7wp)b2vIsBUA`Ze0aOy20_aN1Ki?}gsy5npLYnVmE!$nv-zQI8EAGipH z2z$+onBac`1~BMFn5R$Y{X_fZMVJx_jY`1?J7IZ1Js9EWVe<+j+;#=bv3}R*!U(pJ zPeg?g!6XTx-Y~*hO!N>2FTF5A-4d~^g%O17vbYT+r0WE6wPP4quF=ae41BaHpb_5`sH&le^~CRO8fupNBk7YX=9>tVpVw;WgKIl2 z6UcL%;IyWwdn+3D&=Q|48a{fM7;@kFNTT|p;f69mqTGR;_6J~M!H=Ph!>8eM6b~~z z^Ph)XoAC0(d+BMo3y)pN&}cZbwDt^7r}%Vv;7>CgD96P?T#;gck+4Fj@Pd${O3Wz^ z9%L5y3+_pz#S@HCh`Am(#J=7Zs0%P^59k|#Wi!Bm$+6S_^z)w#|7NZrw5_zA0-Dor z6UmFm&!BY)2s!tu#v*G+ed`C`OjZKeY52Yb14mwDMT)OK{Q7`3q(otIr@b;4@9t^7 z=uqdd?D4UNDZP>05#W8Dp#=J@;cF&Im_-0I-VR8d9w7Qc!n_aZ&EH8iK)DWryjJ|(fDVG#n>{N$0FwK~U&>Rc*z z3st}h4D7U$8F~hJJ24|DqY}Mw#>q#4&E5~t?28^h20c47Bl(Wib8#_LCXp_Lh!1Do zk!fG6N;-!j{jd!*Wq*lYkU;MOZpA-jhWc2)Qid}&YO;eh(L&_v6q_dI03>BttG*G; zCV>q|a6*ebJ%+?fPJ+p*fR`&dp{n)6q{lEG zXuw$$9%ATFE=I*LA20L;m_He&kO9C9RSGy`X3kKw#&U)*B7C*Mk#+(>A32OuygV@I z-nXYu(5SPD0D{JS)nK55R#P9)9H&$^KzkJ(?*DM*3)ZhGLiX)Lj{i1G?Y}n~ouL?3 zN^(#y?*urzFyzbaP;*^p6ByF6X+$L1+nif(l!Cb7liWq?sN zfBL6&-7P`&LZ3NODV4!1Ow6Q2vCnr;cc`7njovQ|R#_XpFs!(K1xcBvTI<4nU%D(J z%`em#LROxmvVSxeW4%3ct|_~`WAcz7aiJ46i2ueujL5z$@%Z)nto zu=d44UAEKJh`)5C+Qujux{x9!<09umLlPCALM_hlyU@UfD&SnWmiS#eIw-w`UQi5_ zm`#^9U54|tw}Uxs`9cP6C^X>0&g1@@gkw4-*pPZAw#()-Kni`PjQd9yR@{3s@%0~Fu0bo@ZxXB@5fw43ik6!WpYvH(3wheYI z1fGlPymAt_zGa6AiW)bXxGI4pBrza53#AyQJf})!#X?U(i&PlouRQs~P|`UR;wl!p z?PC!o8f^V$q5mvp|8%qPFuoF!ou^NKQCSOBM~XZG{JH;HCM&P~FQ=-3E&8Q_M&yW_#fF^! zd0vHt%=EIpaklvK^C(dgRwK_vGcp66Jy5W5wHy(HnLLmqweVUhD>l2$f>VT0rbqa>MHHUx|Uz!ZH6AM1A6;5M_Qn0QHyM$1RR)rkfV-sH|)Mv?c3Z=Z$ z*_O^*p^8K9A@{dJ*}X2j?tXt<5L>{9E@8x zIJhC@Dm31%?q*$uPZJ3GXAfd20pM!7lr*S7zb|^<6|4`C2e2ZDuPZ~e4w$P^;YDx8 zxl9InREXP%jL;MYHc`W{@9*pGH!QSV3ms8KFq2lq2(%_C{2rXfYrdC*=~Ux;5~T^A z@S~7kB}_RZmH`oYyI!#-B=GZ!a6l%uyeiVi4HFh&9%I8R1?qtAyV`_9jD!`8jcVIf zAw;9$?24xhLL;n&FvL|?adZL9bTuT4JJFS1718osoe>2<&DACoVj!&GNHCmSaV!Gf z#}z~n$sep}9&A2XzQUnUa0NXBOuy9#494rNB4T0DZguwwf&+YXL~$H+Og?s=Hm_<- ztZc@(Sok+3SggT9I1CnR_!G#ZT4Yh||FpOVARz{QEx$b%YU6pVwq1e-pT-H;vq)7t z=?VtB^qVTUW6J8Jj#@Cjg?P9i{}8*$3EqoRy_jIwfiA4E#a{~0Vg=0OkVx!?hl)cm zB>vV5f{S4%;RjZtZGt@T5XcndS4g;4aNu62gxA2jRcY1lI%tqk3=Ef?>7Hwez-VNF z^+hOamQ#U7{@8#5U9m*~t+mGut0QoO3e>q-jhMQwkl2qYfRIow;)f|Bk-&8>8vTv7)FGs=w z==B0Bbrgm=&+-50I&`26b@Xcxg4+0tI_*k7$I{uMJE46 z(FFKby_QVOivd!9{_$w)EDZ}QiK4qB^iqnWq+loMSI42JB#j|=iy!u^{o+)IO9#=$ zDJ^1W);fB3T6}957f1A*7D$x@%|t&n3UY8=8uBm7HDE4jS9VC95G=B;_$pIG&5VNb zr6tml1^5qru3(Sfc>8kUPw_i4!=^s8=;zTZ<$BDAgTy{~0R_JR*Ql2JIvB0Pfkb}|BoncZ_ktmmG4 zv#{G7s*7u9+$;TDKJ)F7y&6>WVzxGr0Qn!Y5eC%uU}K;>bW8gT;FJ7===X>hDfZgZ zHGBWwU|XIn^#`aW_R0X~nL+w)Z=OpBPFM3R zv|!PFW}aF+gGw3ZZEQPggy})COC3rp3gi~cOCrj?P~z~uP?rM!eezh^k|)Ki;RAfe zaQhv36nryiM_RgZFY}*zd_l%JCt{8Hn!;qbPPml#-FqZm3t-bUaAC z;X~<`7yoBn-5*gex01BSOBbY*-6&Wjzr#oBO)mdbkRRO6{|W)S8{LdtE7_8P%f6RTPSw zDsfYXCKb0)@!IbGnXq?Z=c2l$RGib9PEGVo#W^jv*ot!+ovu^HXF4(`KI-;UiT~>L zy=)nu>KbpA!H~vRZB0>qo~5#ay6UR5cvTngbn$o>f7KN!<5OKZ+&HTe7b;6aKE_>j zaYeG_x;jLRyINm$D8bn$V!SR z;-xr5ycD<61hG-{T4t@<$ChS3qU7j>7{$9dQ#AaGf0$MCntD&VG+3q5HsmyFltsBX z{7(8o>{+~vCy~8_TTh~;NS2L6dcH+Yif55bFDb?7+xbsI3LutsVI`<@Lg!Qszov~lTl6a4JUq0y9jC5_8dx#eUYGULW)7{Iqaj%zJ^f+ke3G88WYLOGg=~DS0a%! z8quKQB}!9e`EVzuG{Q9$7ls9^p;N>WiUz|{aX)dDN*u3OY#i)(bv-uX_|`@>9@U~K zgQ)Wh7w*gi4Mkm8w@N?7q?+P0_2VUVY-s!4B7@utHxXIYYy6M5hqSIJ_gh{ut&!U& ztu-3kDWy?S9{aEnQ6UxY#AeezMs~YXVR>yzcDLT&ikF_gB!*hDiJl_6)+zcY@6^gG zPEv`NYR0EZjYoA<6;id)hg3mpyj77IaxB8)(9uzd8)tRi&)<2zup)e-aJ-HYdN=!x zN0sVRt;e?b-qJ^g%!f&>zkE<4%ttiLo9aHyM|9rIM=SiCqzpeJ;m;U{kfJxSea9AR z&mlP>JqhPoLJZl{%cd!2)90V${Gn8pQzWfhGkht%dlkM6hvr4;;1E$!FDA|JOIG2f z>@G)H(LRnhZr7ua+f`*a(BkeV39D4~o~cb&9bb7&cKr@(m*h%kWvV zSH~^A+`fkLR7GY@yjY!9iM{yct_V&>K>l}qWFljbsZ3uhJ3?NfE|y_MP8<*K5jl@I z)PuCs`Gj>kRKq+^NAzqDOF?_467_l*g4nUtF6aAZ94Bcg{PoC?kav=Cl+c(ZGjwez zm~z?lnXgDR+RH6#xq-^8fO8x4jx zO*fTY{Y=oQYYCaD9-S$bmXxKS;({rV`qXI;EJa16;EbjpnvnCE$rr{ja;7%qq9IPE zX3_9OL#)Y^Of<5ZO!=izrVSxtXF@}vDR!|T5(;P9@~A=@DrQtsVR@rLF*H&$#K#bY zW=!2g-Qc3lC)7BphPKcUqR>+jZPSj{Zl>KwA(gaI;!YzTJt$ViAQ$t!WnriqIFzaJ z_)|l}QrLh21r7w?L=#~{C6cPp8J|@$!8Frm)k#Tz=U0)%eK%y3V?^edMHGcanFUK8 zGMiT-vl$ANj3|bC$jC+6hFFg9?8KSnRHjGN6@4nOTzF`AiqMrvxjk@GMnseW0}31{ zBhc6oMTCcB&NG%bGJVCQ8 z!AlA6nUrO+6lM1uS2~H?7X1+Eq7Z&g&Z&yD3;XTmh6u%FS`@Ep#Va&JvYL2Jqb3$@ z;-k)fPGd$&rZESJOe@{TB54Wn@ry}%4{Z^kT21`mm>R>oQuaHA6B! z)*6xHA9aPuOx;$m1ZpMtM~Q^|X+4 zdZ;Ej4zg;Jby`Rw&K#N_rAMN?A2dJ8vC#Y|x$6BW>7y96{=-@n|8Qb2!tL`=NK-GR zM2JOdF1x?bJqabIudv|~A~a@<;xrX`9wXCqQcn-ybvhsvkQHS_ZT+AG2CS|ZD-jgp84f;5$9&?oruBZLz ztMv9NT}D5_s6;I?lT}mKUUJW2^U(AO+keg6n5*-cr}MqS664$xuTjP46`ps*i2Gvx z<^PWz{^$SouXo!U%xb8rUN;f%yH{ozS2#p|yreVRCYtQMS`P6ZEN5bgVt6LrtF^pZ z5)!uualfPT>d9=;UGkXGFOrKeiS&*vD$`MTigx3Jogv0-JlE>V@mqIdD>|&%;_h^b zxb2e;l`10f6a6tqm@<-~YU4x=D#f&)i3hdiir2sVnpee#O68)S9MpO!F4KsYL|QJn zG!K%YxJ-1#eQoZKj>b-bw5a&n@nR2Ows$1LP9Wa6JnT&VM+Dts5Oiy5CO zsv_AQQtozZI+w3DRNCi?XD^8^b;u%O@hqCB(|g(3&q~SOb}CY`u+`XWh^Nf2C|}V@ zG(1x)$t4d@@>*vvRVT`G72$m@h_7OJghp(VaBJF!m6Gi7%1nr~9ir^ga+j9M?oM~y z$*qh#xf`WS!V<;4wni?A#LmsmR!W|tMJ`z}PeYN~&C@wFJU2Yg;)dr#WD~R@o+o8Q z=2XkhN3n!XDP`vOdE#0keSHbd>}fb@xg~{%WO4k8XT_u+;Vqqz@=M+e`s2UOJAxFc zt>F^ILt<*fv5Javke~$1tIdic{K`R=WjEdRJ-mxhY-G)v?b#!T^SsUMvo@QoJ&I?% z-@hc1OvS{5>}$xEII1bw*Kp*%gwx+7PUA02s@;Ut$5_RFN%+fTyo=+w+~;4<@O{zxAhM@$IG6Bivfz@QAEoE76n{L4a$u~a%wIV~f5Ux5Y>tRO zyMxSr=r|icisL+RoXx4g(ShUm8^^*JeJZQs8Og8NqVyxAzQZ%9Od7ZEuziOu(yf`Y z;{6Ecnx+q-$?Z9uw0(zl&(nPgCpXD0?K_lVKf~67N<4`r!kUsI1y%GVy0!j8I%%Sz zYZivEr=j`Nuo3Kq8%ZIVzfN<$h~$tLWld#tu%9{YIkepm1JOk}Jb5|ow!^83 z@ukI7*LRK7et+n+cwGH7_LwsLJcOnnjbF*c8T!M5%)iLz)Fm5EVvItg`7Br1zd z_mI$QC(=+XF585ke{PhTE=3)oiP|uR241`d@8Ki$lK28MMf!+n6pJiosW#KP<33XMrWM!-fUHjP3y@PF^P}R<7V0j zH?od7QQK4|Lh_|WtIKLt=9K%+JPu0|Rq1W2%!sWu!s2P|pU6t?e;d{KvrL5MDKXu1 zZpe+AHhho-Ir7p-B6c^eC~h^gZgqJT!%$Ecp+xf9^$H~`5uua}Iml2)LWi6Qc{XnG zHZB#fz)R8PaUD$haSyd)NdlQ*=y6Q|K9g*-h zo|x&K7&_v@*@U$5Xhf(|U+W_B1YJIZQXyFpeBb*N(v8Z!udDh~QBvx7B_k4cQmIC_ zDw$V4$C^oy6-IQtVr3rGZ7y4P>WC;t^PRJlj1X%xtxp}JR%PTal8ECN>g>}8;pow9qtYb3@ixA6~slqoOWnxcVrXK7@36qLf}9qtqiTg_KsfGCAaWQeK>%LXJ1@ zC!8?Em8py-BWRMPNHk=>;ajD8o#|&2&8SfeKIpsnxKzsZ(5pT1ykb-p7xprB1|JKl(RSt}egvzJ_R(Tto`;uu$4n?yKdPE#=fAhKzwp_-p12in@sWpk0` zl3M3sj{^4)kC1*Ei)Lx`Ar6UhX-~_sM$?~`{2)<9uyrPKNY0wc1f4ch9Y>8s zRx65{e547@W-8K*e2BOhO>`49UvxCHgsT$Ht+|D3#hmqdzq#w?(fOHJ&qhA8n$c!q zVx0=bm@YDM=Q-%5h>2j4Xorq9X@wbuE>x?ggsPTNB^w&%=on#iFV@mCS02L4Yb7YXMyj{`6bY0YuJUEp1HF-bEka#4f z5+SF2A?LP>L*DuR$xvCdF3ESit=RCC-0VRL$=3AZ`jF6wJ+8zaX@X2W$1fqt^+mXg z#Sa;SimqUtNTVAPb&5Y4UmA(T^oWZ5nBZ&ja4l#gSx%!{9z~mzf6H04(n_NePI)37 zBH_u&+1YqBO(wT|MWa@bRwY9A2x*>^R|k8;S&-6K8zV5HK$4lznVI=en3>r~FLWY` zigMk60R;}s``CvQdS|0|iaHamIYhjZlt|EQOr;pT=NINW^R?sWS4c!{(uln_+GZ7U z)G8L!X(vOfnB!6*oo6~zM!h1d`G%AEa9nNX)tsA$+`S9!<$Cxw6P2y6VOyiPaPqv+0Xigv8w`3MZmY_(W$oL;qaQ&Nu*M&UNMm;F zM0}6lln{;Ykxb?Cqrr=mKCP2a36kH7Fe+G;pvXD^IY7q0w3NdM`#UpC%kv>RxJL7_HUFnoX;%46HAu~?JNaX+ZN^zx4kSs50|DCbyG)_#1q z4P*7lPST>ur1hrUHCFLVHPX%kdkvO+ktIzIWx^y)*?crd(9w~jOk$(Rqd#U)Rjq2Z zt$r=oPn7QIHxV79g0c=}XwR{-BX7_j)rw9lXeE(Wa9Sg3#a#_f+n9O9nh-zZd83s~ z-lz?Fp|eI;)TJ7)nhcU<$hg!-lW$WDQ#Dmnl#=39QKpJm4f+U;WUV8fBUO}-IM)!> z+AJ1Rqq$WvA@xgfgHmY(iAI*#Tk$cSh)GV>YFu%T#hocr2sv1xjgTowLczO&GNY>| zX)=XfPN^T_1DUc~Tn4iFu^9?ax^*S|!nV}hDrG-Lr z(P*n`KWbvg<_|rp>bcDEXND}|(L;nHB*O70tj8Q3IEwxHEY#>$#g-azh)_i;;%^+E zLY8SaE=ou;RR$$0TvBGK>yl)+-m=OV#%wC886qm$YL1e7u{M)Y%D9KHDp1(n(w9MU zAMdzCYKy6e!J)@p`j4bXMQ{s`qlM5k6H_G;dvKJQAd$wWnqke%Tb%J(!J4t3(8Z4I z^TZR!6N{f9k&43^sUS(wk1TE2vSaI-qL1QnZ7nBM+qZJv5l$%ca3T~n95*7|jLX>_ zRb^a>Wt}$Id26R))2U!=8W*;t#1$mv96E>Y6{$TH7b{ZOC5^=KRB1AbtW||nP84lk zEo3n~-J~i?lQrbk$kM=?wL_!E#B?HvT0st?PSH4I#v!DPqbh0~vxt(QPZX8*GNwv0 zkG5hOvs5ZZDXmg2CekQrAJhj)!;e_(K~u4*jDvO%`=+RN`3@iK~77d&pE2N;!C85rt;3gwInhjOxaa23kwnGvOxhLj;^ zNSP>=iv}sI4I4x3r!#KN)|<3RMfIjV#4)*uWHCLJD;MYK%yRQq*Opty#MkO4=F&A^ zls?`v^)7bdDT5mswQ4P*jFkL$k(7cRQmQ5+7Cj3g$~SowwJ2}7C{w;?=psu|sv<8f z%3wGmf-;u*#h`3P;i5_)X?{YJ%x93a+9X8@%^dBf^-E2fG)ZR|rGp%VL?NbytipWf zA2C_BC-*~V-%==Q;-qNY`57U;Ts-!#dC<3wh!Zj)t*ADN>d=ECf>xI^Sm(#T*rAn7 ziY+eg#S~4xRTIxhQ`tv3<1ucCW|RoxC<<}oa1dD^%Cr`KXWkj=oRlG=h`0!CX6#{) zrm48=8)-zPhBj^teO{DJO}(}ucWk0dR7B#FkWWyMUdL|6SUqli*R4UXUaaM8tw(7+%J1OtKr5wY}WeG~u>n*$>DHV49rwb2o)0m2!I422LJ%1I$A_>-^CIK)Yg$@WQBBFDxC=aAEWh2>_R9maaNCLpex!Q)XAVDVT zlLSB*FaX5$EHiDQ#Uuc5Nqz=fi91}aQh?xc4>1_H-`A%R2K=JYDA2)te9RWa~ z4hWy)y2^J%0ATE~=dD7LfW%o^2mprV@_HtvKo#>e9s4YHn1C-ElsD0~&9Sz8pB(}~ zxqnG(ub)tvkxVSHI8AG!0s(-_nvR>Qv^pRFJa+w9*kSX05CBDTCCVpJ<-RLYTCgb5 zK>#?9ygmmT&1L(UHg^ZE>`k->zz`?}{izr8ke_G1t}QrD%JH!^xw)1iV-Ns_S+@*Z z3F}J`0QD!3B__w=5rby(Dgmjyh#i7O8-?{@ikkREu|tw$vz2y%lrnQR3{PuV=CRT({pw#;h3_62z>L5pqg6#^AtLrMC9oH zZ<>^LYLOU_0Du^4+$966Rc-X+ayg180U!?OCvPLlx;6!dW^GR&3cej2J_(s{BmfXh zqRUc8{E~?UD_A7}5O>*AA}R+e^t7}#N?``_NCJS^XJ+NdfA$2K0KjwY4zy?$0{{RQ z7w!N5REL4HwEq7LXe#Lb|GvCSn&1Dwg1JH5328VQ#qcjo_%4CYy8oNAih`BQqyMAWmH!{{0BgQMSw-;w@5bygJSqib zaJcpVYtj~n|Gx}BdlSOw5&r*4G?dioFTF|sD?x%pa5fb8nHn)!@NjKsUJ}7Y6OM7HKb{i+OVR$`COA-xvIU3Nob;VhSz!ag^uh{}p8iGfssb zGWY&J6!6c*;1EQxF*8%|hpVIh@6@>J9`Kj{XH=s4m$$|f{^!0)Kk63M`vqOP=9K$C zj{r__7jE@zVE^lbg`x4bB996?{m0aF^qmWBCp`a~OnneFVYW^5ldAlOj@dUG#{cYP z%5Ya7VRx= z-n`fUQZ(w>+mKdO|8E*n8S(xHau5XI{c)Ct$uHT^xj%#hrrN#zGk~zhnwRY!^^_5jQ($-nrvP|6vf>sZ@hjg}e+5rCXWMC6A5MQyo@7EbxAS+I;`0o95H6Y~W^%HMb z-Ve`{(K-S`!sG7uXd~3fa*Gj6_j8jV>Hg(1Hk#BpYu?O?w-?a<#L1Gs-YR^FH@ zbGNts;C=lQFt)$kwZDvzl|*Sj#i&kMX^f+s{T=a`Vpp89pTjrgcElN)i~Usd+qcRa zD0@Xub|DPxzlKQNCSgcuc>UXAEa$N+Z~e?_sDB#`k$fV<8qN9%fXRBQm`=Jj<_FBK ze$ci*6w6|FCSPhzx~A&CWgBiH2)GB@@}>T$!HXY|#GU>^SE2r3BK54*ai1YrAGUU` zGnv(V=18e?`bXa#upf@;e#o5u-mgX+0%> zzt6G}9gd@qAmdnL{soPa0JAMqSpB{Hht1t~=p!d!i26|17(|_@J`yLmzL7f#}DyBipfq{ zT#Js5KT(+^?75>D@4_|y8oyqGR;Kq!0FtoA|AW?niry99%6_p+tptibW&o}6KS1TG zz*c3AzvF!nI{j*0{KtI1HpR3ks#z3l{3VfUjIl?yhIw6mnZ76+KXBfB(pfZ|w4Q7- z&Pb5Ruakj~z~4zj3W0K47<|W|dF0yoEn*ZzTFMVKgD;S1_d0oCT9&(=-gspWBZ2A0l6HT{;B_tyAp7quYEqTMYag6<5m z5mx8^HGYM;-W8zE(t&QZl%^rXPp%tw5y}?h$5AshnD$iZ4XI}F_ZM|@(~S_k6hoC@ zid4=9WDzKS=PkA!GGizZ8a+>xO5z5Jf15UbYQ)lR6#p}>)Y_mxv4UA`3%;ZHDPs&H z=;sPJV`D_(7eB6)>}v4U}}To6H0!k@cDd016kC)%uV@S{kM$dRj9#xxxKQjTVl zTqa)jdr7&#!QXByvb}33Nau3!_uqx(Y#>%H7ZJ}#J1;i)W!0*0);zy$8~kFPt!n}U zQ~-lygI}ERiAZGd^C6Sq2dq}+sQCqUpeAU}6p4Z-IxYeH%%LFN?zUAU0Dpf%e2Z?Z zv}D9A9Z$G#sI*GR#Q@L^IBrP5gy=|Jc3A;ZpkqC?c{B8)cX)AlbOq(2<5C z0WFT4$TpO#1wQJak}?NdOrl0*k&RXiLUp38;c}YKtB2C$l-jw zUzusZ_GHYpxp%!EWv?R@@`1h2=(bNd=4nZWM9=#s{@?hSIoBDW!$tZ@RxGG#q{A-b z{nXa7AA-cB@xHagD;VtgF>H#b@qRupFA#~k(9H61-`F*}&clVrTVPqOXce{jF?e)wyy z*A@vCKHe8!QXh9v_YUb~kM~1(AFpoH+|P!{CC3G5vbB^&L#9J(qfaT%A4t}Yw~pHT zsD7YruA^+p`y^CGL&9zxp7Q>G@@vA*-V3Mag)Ex|L3#fl8vHwzEDWiuH+^)bNS<=` zQMt+c3V)`Bw!wTP?`y#bj&HB&{dOep!)VK!KvUkgLcwWbLwO%^9_bo^MAph9gUA?& zgH2P)`<1kMPlXx)@^7k3xV%4`jl5l9hzHb+BCv^!+O=IQ@0*M5*Ogb&5WSUVfP&ta z_h;g3avd-AH7(vnLq*xF(|6hjP~OMZ9d%s+FPK6iEbkxC-H?Y=!w4TFy{@P#~ObKJBv|Xqs56H=#+a41IC;C156H+Hk{?*L^+y@eo^8Dl4jCx}Ur|JbH)Sxv!vI zv14j$9Wh@i_m8{+na9}C#ei`i83pBS`j1R*aNlnuS!+kp@qRwt$KfTA==e@VDu~Q`f?GFvvPk2CTCeB>D zl#B%n#=c5%KV7ASvZ#C5uegw174fnR_T%4%Nw@j>sb3%A*R%D;j7pjPJL&cP9UQHI z8Nfx%x_*L-Fd%k`6XN=|tBeWPzX=*SLkVBB=&|*Iq6L8Yus`uwdD8~UVWWv_@QwAm z=I#kPVjz*89)H*s>z!er&kI3zm`kgVVD_zW0ABd-uIiIrAIJ%ciZUFWMfEvF*jLRl z3-Cn@Wa>8p%s=y(A@$+c6^}+{(V`=Vhx#fGx&K$&rJ=rHB8^|tgv>7~ZJ#~`A7&5( z+YnEuZ?Yld8FYkn+P^h@N?V{~boq}Uyc5$mp_cI}w^L{7PpcKukKd+5LnQ@DA6vDo zQ!z6~ppNv_yj0714ooHbeDvdcI@r;H7`aA2|5YLYh=|If-?BE_fP~tBnA@o5CTzsnV2Yn?wD&s&Og*bBjjZ*pNo31p! zwcyNMkNW%_ZZwjpBiz&M`BWhg8`pgPhfz?|5)b0}$)}yf041>qXXh`RZoH#mnY5F?zWJ4lLcdgaqTbf#D{(-z=FcxD%l|0{ZFrRC^ZqWb zQxT;JEY5starTDrTMs7l>DT-c4elXa%%|T1g*vPp_|#y*e8y{P3(S{Bu*92eG2L&{ z=`%dQ%MbXUoIu(4Z~1O2x=Ll)`ev3-LeqUnyk6O^{H|Cbk}F^AHTxn0_Wg^_RKDEW z;)V;aPbt5m_hcvK6HQ-SrWB_vp!~+{6>F+-2XJR{oX@<;S8!y^(35@12l&C!C7<&) zd-17WLOWugl6<34ZxRt!j{K-gQ7lgY)j-EksPHx?%H*CM2h19VWxzjP~v^^Q1^ z141XbRv;hp+egn9>G-N!D}v0&PYY@2BZ_MtP^R$s9WCHJi^$LMEw6r=5-bCKaj7@{ zZ^$`~>F;zkUX8z6hw1etFuC81ugF>ixr-4oz9JOr{%)o*S+k2@pj_hk5^0rcr1vUo zCgJV?$RZV=$mWWPiqB<=&C>hC?{C%l=F+O2C4Tx!{1~9IdO~QM>LvW{3?n|piG+#1 z>8UHmAU+S=N*P7GdPC^5do3f?zBXG{v|-AM!ylkPLM)}9CHZLh0~=?4hARHTN06Lk zW_en-!f)Gzo3Y8vGoWq4rc)}+DL)~daV$egD&uy722 zmAWt!G_RA5a85X6Hp3?DR92$F2Wdp(V%0;VBa;5(qv3ziKvnXv@nekp*YFIxxCTF! z4@tPM8T_Zxz=Sy`4gO~oXdhwP$}HOfs4b;pXxDXBn&%iZvAOk%_lBi+Dc~3) zCDGsu`Du<{$#<>RRfB(>VmHB?zh4v16IioX$r}8R7(+7|)y#LNcJ4WUlA6iX;75(f zJffWDbPawePizuh;1E5>R1PsPWB|g~;QLqhrle0U{@UwfK--c6b}tXw;7@FMy9&Ha zgwO_GfjpAlWwyF_P=mkCYyUdG8vGxlYb4abyOhr~__;-L^Pqsib8?C$tZPPtuDc5kVUK5%H#V&maHH;PbF-QU@dn0E$L~FUZuQKjVzl zLxZofBJ&fuLBUgHY4ES|4nfeLKhWT#S%DsAM+H_k9^4i^H2D17?$3qmAEzh` z8H;GfiiQ|_YX(1K*v!g2^lrAJ_z1qQ1B{o(U}fe!SYtq&Tto2d?TxJMd%q$82m`+e zaTY?~C4UI9Kj2Hmg`Yd}Yex+5$Lllm(F;BF-w)Q3S=^Y0aX%UQdw5mwzUJdE10UA! z1EN~FDAgr?Kf-0zlzo52x8#59Sv8x`_k|F)fAulCv2*np?uvlwxPSuW|@+s}imFc_h83XwxmzhRiN2&l%}Lm6=bQu}mJ=ald_r z%JNN+{1P+`iTA{>G9^JXI_u;qZNPiJG0a!@=K=EF{jCEjvUc~jwPWb26`XOtt|;5? zp)szD*zQw{5;8jCcEVwS`WzxY3&w^?qr5|6!uT$B{|05Y;1ce{?&S(`m>WyrVkG@} zXL+D`wDHQ7qbbW_9x0h(_c{UY>e;3))?Tsu!&9y=bUU3pcHd;|*Y?zrrT%G@tUB9( z6DdB~y@XF>QW19AVm)!LQya4TTc)MaOq2~3GeeRPAGvX2)hp+p%WT@Z|x&mI(gC1h7t9MMOBz;X%D-f(ix6|iT%e+F7=$Xhd)*+ zP!D_iiFQNo)T0_D*!WJNGaev|nR%p4!u)@UfW(^4uo4|A+L@ejT?!Wox(Ij?>A{;)2p6-w#s@-?8h^RoE z*5~2Z|8wmAJenIMCeSvL-ILfOSvHGwGub^h3QiAR!RsqC`sQ zFQC#A@ho)g{>{%+0F=Q|!6v)^mI;H1dQzIV0pn)E9Y!GUWcT6-D(iXkWnc8zebz{b zQ3bMxod#p2=C)=Fm4h`u6xs*pKYMABZnfq1!q1pNbaJ4jvlZbV<&A%A2W1aR=xAivgG*1H8HSq<;DK+7O>SUJ?(t+>^?}{$Y1TYiaPEG0=?L`8 z*LqTgwTn0RJ3RCkg*BON$mbVu{J`Ga1xOd7@zshQAN*dWQ?o)Qt721uiT^yNikTxUOxp%3(GG zKLML!hgPaP#>$h8!Uy->OC-+!FNVvzD8H=3{VTH7C@i=yiT`X`K-&?&Jt-i1F@BCC zM1P9ke%L_cg_P6IRY|+J0xOace>u+yK|Ltob(ar-I5QBL~z2+6E%U#2(}BU1TC z+xM3&hOMh8X3N!xFX>XvPmw$}{P zTzXQFw%>GF1QVTEzf2BU+8&!npq*Pj-D&u{N81Z&g;5&f&A5>^pV^orl=(N*^723 z=D|7h5n!$$@@(H&c1btZ-%c^bpEfnXv`yjporhZhTPd~Qo8l#h7}>402TEGL``%=l zxV74MNVIb|^K_&6pgQhNy{?H{sfufcW>d-aUCq&=!oBFI|SaL0#yJJH_5_g@!6 z(7tKc2kEN?QWE9aOS0;HS4(e*5)W|pW>h>*QU4Ir?P&HDU7uvL_5RGdMJ@Z6z1LIF z7NZn6i^a;`ZM2xEKZrS@$zJyc2{PG#X1Gv+xLZs1)i(Lw1|4FyUm`$)w>~G|OzIjh+Ai9b;5nZ3_hzk3nK(%h}$??AaUZkXCt=yb@eOCpa z;f9n!pyv59AV0%y7KTDP2@xi4|&Ba8ZFE zh=drW2J1CX9)zv`wS1h`w`f2H4GY$C@p;x$th*E*T>6G3t+L)Xz2i7ckS7`INx{jj zI6%Z3tcTT`eFHAS`u9(aIXrz~y<{!sK@96*R@;FKptZPofpe8$Ra-43C#^zB3Dwls zW1Hlwp+k&VeVwF^8ZQk)S<0&a?8kIa?oEMks)ec#sCKz>C?nvgULKl5$7?-k3!>&z zuTVb4p8BDF?u~pjdeGEYme|J1L3LuK{xxcv1p;#mfEuay-oX2Rv=Q~0Q1v_{w+gRF zg_RLeAJb?^Bu!s~gyf%oPMB))%y!kDo+%`cY^O(^wF8wE&z6rhGEP5) zx1{fsNUCS9+Vt<_;)OU+(V^4yC`zvd(eApTBS)G3(LaSyYGjYBVEW!gr_=*b0X{DM z;jMrbdE*4>aZRM}DcZhmCnx=+z|ZN3aW!;ol726}mK|mXB>5lo zwj045rzj9jJ)?=fd;ph9{?}ezB8mf&38t6e4y!^pxGG0H)B_u>HGAG;qlL7f1&$ju!e}QK)!M zLIJv?QL5#=9&#&Px9MPtsMAL<#7-{#xE%hzAHty8@H9;PX>LFP|_I^YmQLXD0O4O(EXTZ4I2~Ap*x- zGindW!%>`t&a2BHjeFmU znDe34wAnm0or$X=X5N>N8i;7L&kZ{uONb@XJb93)cJoUhLvow{O$7a^<};h8GN-FL znEc;sk$25kb{JmWC(-dC&bt&i+vs)|gccFR4 zT;*S7xZRxj2ElJ*fGjt}M2TQz(H1|! z{KO?#2Wt6*-k*2MFK>xdLP1%Ad|rMLBb@Znvj1_hP?w)c6T;#0_%xBA!O(4XDPqgt zLZKy}Hvme%x03uU&s6m@ph~1w-J2~K%b(Z6y8&U8-78Nfhe9BYXg?s+%Kxs^a#ADv zwqD|ORbDb#Dbc9}6_x+@+ccwJ!OJ_D^3P=QHK>mlkn++hY5^4=%1@x!m6X4p>k9rS zZ%+5|6h^#UaHXC6J-sTq0bnh&k;OLoeOCQDVqc`^E9fg0TZy5b{O*?gXf~H!wOOR( zvC_=Kqp@Bc`X4w!efc2sI@0 z!^FqWr@4xB5O9K5pvQ;!iqe%swD~*Ui%c|OuHNqD7;m_Yb^LW&fl}DOt>tRo-x5gz zaDX@-q<5bH3_y3|-#xqnH!#nXjYn}suhz2oFWpfZdq;LVO0XJ0282~(292da7);G90CjrhGf)to*Sx`~aEh$jI->kkM-@R6?g z$hQoa(M5pf((sXzxj($#hy~c9deyMaH(VRAC}gn1AF+%ma*hl-X{>xE%U|GYWB+R} zo2y{gTs~x2hDZVz9tDZg$hf>M!2=n-SpxA<%`+7o!&l@#VPl=IJ@JKSW=geH5a^zs zxfXs*S$=AT@7^z+v#zBmDg3B+H$o(2f!~A=s5gc9_-m`!6J$3`!b|**thERa`mB)( z4>pamj@pug#`!C#o|1JU&(@|6`|PJYkR@h@zTwcEz|YbD)^=% zlQ2$uF~O@fr?loXY~UbRn!+LYsXsZm)=CGS88bUvZ~VrDQS zo*?ibwP$K9Q9;9ciH4djOmG3ebL)%BN z?r!O|*t9-uv#bh@mcWnWxER3f;7b{;Ap?HztxZ9wmRyweKPyZ#XB#&-hXLZ!Y1$tn{!|+S)_bun*z!p#o8{DLi11exCE3*4L)4%^kn{!|N z2>N$y)vIb%uY_xb{#`z)0Ht#NeeKXZf!J_~Gq%&KYM*$pEgem%L`6NPBVhjBVTJW9 zQQx$C;O9kXOBWNxLU3uzQFz57e(dDmU1gI?O)dWYuZc70#l_*@@p!i@r@rTdjK;tJ z%8h1}lYie2pw3)G5a{RMeKxmGl5=vUzI$RfYRkZNn^0U%MY4rp?|VAe)~oaF-VC-h z|ITf`n_XcDg$zOe{#}P~$s6|d??d8D4YS<4J~1Dg{>)aJKphxwCg9{5kQOaE?7i9YQOl42C36rO+INVh;}PEDaO|L##uD0d8~N*#F9 za!JZvq}EE<1qARW5F)!e74q+9p0m6&$9}U`?=CC)lYd_pDa20k?>?%?+F+nS6DUki zn|=9rcgP1y2F1VYW$A`(;x4R2SUrFfkZxg$G^*y^;&R< zoXNjab9KsUeii>-Fc&Hibu*3retH7V@Arj3o=G(ELNtd@*P)^UUvhp%pUdyXYWNO$ zi72I|geAC$HA{ayPqSuID+6b(iS$?0PSaSbyJqg)L^g%ZBGA?9=PecibOiSU8}T@l zQU8+)u432#15Wme4gRrasdK63v2j(DQg>X0;*-Q=GMKY#L(}jf(l+Cq~s&0R zu#v^)3mDT{#EEnxhj1K}v zPmFbYm70o(p{WeBROfDile4>AYn0+}NSp!?Xq3Gj!zNj9l!$3b{3kZ#2}yv;8~}dU zeaq-t^lk;1?};i@X;HOETDqtSG?d#U@|{syWDp6Ad#2OS+jA#e zNkZ0aBSaB|eV;Ii1Y0{zT*HG+Fy|60G1<}AQf;R+41I+Leuu#(Mr;^N)cM1Ljk>;B z(WGSmhyn6=0zXqI0J!pD_J6pbR#vN(pEBjwcz${~yQL~$XBpQ>r1nMf?!!&K82BJ! zUIVvQRAS@jHFb9c#>!{_-ZcH%MdbN6oDy)?vdEa3=}0Y$60=!`V$JZpCV$kE#)E|B zH9!!oV@UU6rtrzLXh3miCpM<5Yl5!hy=76`Y$98VtHSM^Wx|2QEKsSg9*hJF| z`W9@${nryQ6*lnd(ROQ+;IE{M{0%xw{E3Y z^&~WG6y_fwS7_ZjtE2%`4I5=OViWJoe!mvsoe0|6H*Abp?Vz8mGCFLBjbby7OoHDC z_^=VDW(aX4B0p@5mQ`eeso`RafF?pdSV9zA#3j=|(0=S;LnD;k3}fRmbc3?u({f~s zUQ(d-cZ)i4bSIwQIb%~G5n$v7k?`&oeJM4iiwJ1Unop0Z*{UBlX9~DC1&AR@o5N<% z#X7nU*>l1bIcyXFoKlNjavV0P%n8dkmvQ<1KW!)mUiDj^!)kNqP2~l3gz4#%4Eh2vh zWlAC$alj6?h-NnlG&aWs8%07?dE2@)oEGg|wcU6qXWWWlgHCG02BzVqJCuw1lGqpY zRkFSoed;<89W-nnPXlH{gK5@lQ9<8|CW-ZbC4kZn8xIQryL|AkA{5OspEdFtTLk!V zF?J7Z(HI!NCaun)z!A162HdSSEjmkX?tq&1mDU+-HlFA(qJ#^c7Io#K^kjE6#qzKT z@k0avdT}YCGEull2c(WgcIld_KyV?nCdTw!K;WVh$pna3Hd8uWyGmUIrMpN7$5__u zZjGeZMuJ;BWraF0Hfy8K-#oU7_I|Z(qKMK?7Dga{Axvbi4^);NaRW8KW=-Q5 zqq+pRY;Iy-qOHP} z-C#qoTz4@P#+&NYJUmOK5nlg|?L62JI5K`7I{0Xh;Fu4zKc~S_e7ZFY8&Q6*(UD=1 zWuvS#sMl};trWfRHbVb(xsfh=BohKZ!e(a2YKCtVj&BLI#R6mnKfbu($lRyaXcQLD z@Ha4rr;V9U%>7W7bt)W_Re9`zdaK8QwkJ98!9JXvL}=?=%3<19Gz3+9Q#&G?7Dgop z;f+JxkrEM@(?bPl$(#|I3b-^!e|odB&5<0?0Ll>0U~zJeiz!N~5s#2!h&44{T<7jN zNl8zg5PoD|@ko-IB>oWUpdy*mO`C})YS9ni%U{}~u5Gjuj;CA$!e(^lavt{Hqqi|4 zSn2do(o651lUr08IPddOd-Urwy(zlULx4G(l+Mqm&T^61hJUdA?VU}mPCTkBDX|U- z9KWqAkG1;_NMPkP;>* zl3M#x4Z>5R_E0oD{U1(6b96k+7D)*yMR&!sdR#ndJQ@Fo?P;1G515fDJ+hHHs6*Zx zQE?*P2@Zxj`)5O*Mvx7E95+OhyuUy#T9QhWl50qR!xk59xd68a92LK66ZO_Y{&K( zQHl`E&j$aD^QeU*kVya(&g1!#760^a;YcwOB-wkQwpu49JUI*i#5LqPocG&DA~Olv z+RN~UkB>YO7vy-zH`z#o5sG)X$`h8vdB7A(M^d7%KX=+N9cg`?3aC%|fC8!b?_-Mm zLH&0B%2Qs2=ESd6`+(K9aS1<&iDqbt7Xr>1%zH6g*L&m7a>_flee!&9!^vp(E>KO<*S1tnB_smVJR)BiL*06$@fN^LO{QfuU>>P{J9zuyE&k=fBdSDOuZ!mC^+ROzlRnXd=E1zg zL%K;8F#@1@GV>*E=XX-3x`iGghnK6&!~_+c5Gr!zH*SjtrrGBUupyo_5o4{XZPwH7cX^dlLWsQN;D zmbCK${U5k=v|^7%QY&^!H==V_j63(GNSkCo;@)jhmpApY|K zn&qF;xc`h~N5=>s6#kf)8J_VB&0*?15JVC9#@dn0AF+J613rN(;e-U{zi={jz>%6f z&?oS4iWm>RN1(|r4?p94Hk6(mNm}*O%##aLS=VlK8LycKoV_c6tsUvkx<;i4R`_*8 z3jf@q0N40f{#!H+J2~Mbll(qdiso5vG9VX*p*YXCDx>crA|P9l&eg43j zGuyIUs+|5ek9??r#fRxf(4YyMHQ92>?@P&}T5iY|a2}_?5PuS7i%_knwm;bNs5|p$ zGL&c*kU7|qbe!)|`dLAId_@1IX7?V?XPz5sXgWWrzU7(0J&&v-+1hU|15Gi&z|6xm zOKRQBGv{zmh?&PCD&Vn4>hMpp6kOk8oChL`L%)&hoE=IZSQH)^=KzeSPbSYaY4=jl zs8#KeC|_X^tk+!oMj8B9|41A#K0wdY6kv5XcM@eiZ_wjl%T^(hI9Q5luJkC}pQ36> z{DAoG@=xOF!PJR{_6p4tYM!1IoL*&&Q)Tz`gfE?4oO%#E{Hgq@M^F01u$x!*4o0>_AbW>7oPG9^PV2Jrl~a- z{>l)Lq-C9X3CdOQ^bA&}M{f+iJHpc=1bV0{5Fk81Jx1>TLM5rh*_~oN6GX$C1c{vI zFTr}$#F*n$-(UiYt~^QSATyP|mCj7MTs;A+ zv6T&{N|_`D;>l^FePw1-kN=qiZLFy$l=4?kG~#D{^Z5g8t*;&vF$06^@mw?m!y!#^ zJ&BV=66}HI)cTj9qHkczQj`RHVg^$7nA$FA52LVyK6PGR5!?uqOWBi^CxrbjoH`|K zBvNITB$T=7yu&HU)EZSQK`BbG2QKQM8XPK2a%;^j*waO*wTij^LyAle_TYXi+E+$7 zYY+_fcnSb8ucEV1u*aD985bho5bQB~5GW6`u@8HSl7M1sF@e!It_L^}#Q;7)!M`_m z=XvWH6k79{S^m@wJ$aG}7by>FITj@memUBANaiHgC`#H9&+C1QFit2MV2^z^ew^%q zfJbHygR|$M$({uyC_0{!nvS99SU^%t_N2qgLIz@OM6yQ)kt8V9)w7|ltApFg|d7B(f3dnJja2PQ;Wc1nVLwggaGjk#c7*)x)tf%!1~Dto}mJUb52 zFHjq&B=TP1us9y^R|;hh2SK%#ic~>gNKZ+5H$Q~a@%32VkM4ZmpO!t2%M<|^!{Y}n z5Z%oP^g3bvq-0NKUD+Kq%C?`;Bzsc)wW5v?Aa9(K%qo1Gs4#Z2C)_Waf0XQjkt2wX z^TX38^^sAXnCu~G+Tc=?J#!<~Rcr@bw#lBR(>%FE)ll$!(8p8xt#W=#v23oO&jjn!`q{>lmwEC4O_;H5pVdO^s zBj*0;uP1%%$g95|`LGS8o7f-xdLTy%((BPcl(cT-Uu^jG^s9N+|6h-nc81cT;tGB} z_v?#o6;{oMv0slS1)lh2aHxCy^+!q#Mii)cU%*n@|wqGVB$#h)V-jF05D zR+BA7Ngrn{V+2z#Hatlmxo$gSY*$Wbdb3@4k{VpaMLK)QVdcF`D;77s-g+EdJ%DE+ zj4G0hw;nr2wiwuRtXj_hdM3l#iMziPz@AKU9L*In-o$7A>rwxpx|a4)em$+=ql|zQ z6}dL)*E5M7FgV>3SfeC(`|a^^L0zSZpPT-A1jbGs!?_0`RbiB*Gt$E|OF0jWO>A-l z2l@5vQp~@Rjr(5@u86H9+Q7CbY0@SR$%Q5T^;nC>y~OnH{(9a&gk<^|-TC!U;Xk^% zo0Sj)d&GAn%G`q=i%dmH6ZQGDU{edQdXl=Fl2&gKQqd%#_sf*-NOiw@B=3yt`6)mv zHj}xYuT!l%jU%e2#3$(zvW_8CTf0Z(F4yyCa!fQ3QRmCt=Xs65-ee>7Bq@+2g*}g? z%u~{+!tEuQ+LLkdfqq*Mo7y7*jV3fj;tL|^4N!`$v$_%_tfa*s00ek7K#eR`QqbA` zfBu+?+B2n9ySqKw(4h<}kQ(BxyU*+Ph&6x7Vl6VE`K|M*f<)3OvzQ>%cAu27kq^Qnb zQ*X~8Eo)@&cJlJzfnAVc+1ddTqNAcE@ zm?7ZVU*!q1R-Mv|B@t{JbZj1nJ9-dH(jhEc5TLvIJX^6O`Oo`>NuHUvw+FYCNA-^a}5RkF63HT%wRmx^{?6eu_KYurY@BXb<^DigG9b zdtB0Zc}kAVmG4oRQ=UC59Pr6jYCsakBv5KxBQ;B^OuFz>e;Xf~`s(}jw^ewWgpTfZ zd53!3x1S7dlJRyWb2t4uj5h=)wNb#r2C1DQg*wSzN#EX$9!*(J){&C%S z&lPPSaN&vpc8i}>pujT!`|v7L5b@(Bc5y}`KZ+ftnl|2mj>@AS_o5K2q0!RX&udju z*M8pI`s@3-cxqbAN=i-D(L1Z{L9#!il^DFer$%Utsg!4ai6uX2t zx}K$@7S`<}L>vf^GA%JRKp=FVB~zuFuX8o8N`%)p(rQ3Kl56<^4UBFXj|9SgaGY8R z5iv&$ef|HlP85hgZ*7)aiR3sUPXL}W4N|xCp*7}Q%auY9SueUP9ab8mcpXTS8rJ%O zbbD~$&iq3V&qN3b32G#`=a@114tM95hNN6qjEwm4WmyeG!P}}!+D9kw^Xl}gdBtU z!xb{?NKiEkxq!io4;O;g5Bv|J38bJ+s=eNY&P)8U1SxQ#Z`OF6M(LN-S|C;ZOZV8z zmeihfq7(05%A0^TU;-R|l|+*2js|SoprU5hp!6Dqiy<7Hz11=|Y zVO=T)ZC&VyXqKRmhD0gPd6)6b^v;cYKPFKa-sq_kF_w!Opzd~ zrzwmdJIbpYKIyPW)W}BMCSpwVyDm0|n2Q7}-;Q@CLMLd-5oaXjpp)6tpQ!Lv6Pc6G9Rr z)Jg`C{k=GR>VkJCfAi0 zh!J$tpH1#LjGYhfV8&-~#p<@;@O3#bM>gQylY7@DnQT0KS zpwGx-nXqL{@W|*=*;_2n+-^rkVILCOgixkS4Hy{_Z6S_3xJZwTD$3Hd$S3G6MbkxDvcarwP}f!fnzg1N85f#Mv<@sENEO<{4mLCQ!C*_k7d-jSvMW4 z8QG&D`Oheb3jl4rn@A%(4uOi@$cJCx;*Hc-r=f6guf{+ z@nw|1(XO1B;Q!6Y#t30hIw zc%;SLL*D0+ovTa3aXF={8#y1u!$+QaD!|l7ZP)|il76&ws|4Xt1}|f)LgYv8QziTM zaxBY_JTQdd9Mr3cECQ<)_{wFj^P`$Bpjq@6IBxQo^HbSw`JxY4Qu?#~( z-#t23C-4aaZF5pQu?n%k4h1y#XmsLj5xVlxA(_`62`C?>Yv1Co$*YnF<|BPCmiVc? z$!OAvEd(OAx6Nt$Af8`D3Q1k_(Wg!~C!x2QjBv-F=pspCpO4xa?LeO(<|BfPWGL*# zcbb%BK9bHy%)LYv?N_1ADXCwQa6+l_Gjp<`s3d&;9u0=EmX-cNfkLA64w z>TU9<0?3KUi1dwPGR0>Kw|7URA}K!@+T>>&d-O!FVcHHK)tv){U?yK(c!B2hp9s}ws|dTz z-tZBx7Rc?#6DqaknNt%)E+*TV5+3ETZIH%g=(h6q9{;M~dPYBcA1oQ&*JjT7&moHMU?!Qs!=)lQgm5D}jg6gCI_Aau(crArx z0M3`UqTep(G{@H*iI6Dy-d-U^Se_B=ByfZqFDg5cv3WJqPH0{u3wtAOC)T#FCs(9o zB1w<|BQdlbG2c5i4s2Klc#7WSAKP|%q=1b(Z4ytV&sXyVNshp-Mbf9tNJpW6BtDe9KPgL|AtvHN!tW<}|JZ>TK*%Sx zFq6eYj##IQ%!TNFQnTBnFpJgU8hrMXocb5?PVz=SiA5Jo_Jnm53VxCz zzy&5W*o0XTk57)Q{X`s}h(R|D-YQwNFMT-fp#BKFRAieTwgKaALNp27xvy62xKIiP zrL@~!h*FfXe`bk%&8>T~f+m%E!QZ!tg&%(pewHS&&If4f9exQ65JVc^%o?TS?-4)B zjUXVo(niS`EDvqmcCtP_z64iR&}%V9qr@S{BDG7ks!?M3AEjkQvVgKaP3q0+NshV2 z%K9Yuq{!?$VXvNY=&?R&PsiGA&UK>{^b!O$&2|b*$|Nj&+bA`>XE~72DyI6hy?^$S zloq;BuFY!Dr;ExZrOjGB%$!85_Lis%<#0TI2nGzr=j$i^30e@f&$FqZwBXk?e+y2s ztSd7oB{U;akQ17Q0u-Wo4VD`~ev0+2gOd`Ckz|bJg;RizNr`>inzFx?yf@+arKCs+ zCC*ZNLGbr!ox(D>5Qh+dpRNYYFyRrG65w~UH8m1)E+zL_JuQL0`2+%*VW=_QZgEl z@lrzSKHDp;3Du$Wl{|@faC^mX z(XT|jLtDNmfPT7&vJ(3=sYDi%5y7v-0K*`YseUD@jb{lQ1*o>&uT;Qi)IigMJIAlo zq+$`tfNH&}i0zb+B~a2|-bgV1i$G-;Ydr)lMz9DJD>R({yz&Y*0<|gBWPK9Sgli9= zIGOMEfK|j&kJE_tk4^jm!s8&W3dFvI)iY_ z8Pn33Ot;?wb#s3??$&ZgG)-*Xl#ec7!aht^)M0Ips!$~d6dL$U;=EA9Wwmd@k-d${CK?vozOPcKgP$#isl2Z5&ymklXVP-r*qImuAv#x{g(wtN^R9RYVfW9}OL|Y* zrKn6|N(+(E@dJ`S2($dcJTov0Mbi;C!;C3wOmV&hIMfjQiEBjZ@fJvN^Xn_~q~&Ww zc}eZDR3=;W7uT+Pf0k(yU~C9hzJ-W-&z59SEm4sM?J6UR60UgH1DS=+<4_PDXG77% zSI^+E?-fmU@fVaIBdQwKbiNF+4FGYBsJ&Oud(kcH5fUKWJta!JUl~ytT2l$n_JI!- zO$kruWLl$1p5;VSRE?0&TM&eN2>-6KU7ZQib4Bw^P$P2a*tTx5p`=NbZ^Nc3lCvYJ zDUA8>QWnE^1hdoBeOK-P%yeCboMm{#zcZOTqGxq`G+RxE04l|k>5UTb|Eehx0onRZ z!ugc(m9QSroNgA2BIwJ~MaUTPa&Ivc5K;oKe;R!PaEO|;=y8r>^h8;|fL(1o=6a&& z?`vvElU%s8qH4|zTpi4G&vXEdH&bH6f2N4edalI9B@y#)%Y&t%rUVC73Yc8+XQJ{0 zJV{tHQQFYPA`AtSr}J?e+!Q!akc&0cbPRs`L>=GJWg4%*bUsn!qr{HSxWqPvnwlUc zBKtb+nckr$LKndi$Zl5y_Ziu5CA&~l=wEQkA=+I~HSLvD!|=x>x$O;8xs_Bk{R%>` zpuYF<@urBS5Q(4pn`*Lv;i0Hu)u`lIZnHxdilXxl4b3nEj4Tg~zXM!mIx~uoF(n+< zmCUU${715;gNP_P9mcyaG;aj=(kkEk(KGn&f#%FMaVQ)VrRy{4S}Gqsl?c%V(P?q? z@g#AgEF05KWsVh`C{v+5=MwK&m=gs!A#QJ+*7m7#bdKeFe$0i$M|S)yP5?n;O&aMl zuBx4$00i~&CN_NX%*8hT9tIKF>#AH$VrUn>KScjGIz9dv;R==V+Y`9M#lKTBF%1DxcA& zSv_MH;^gbf${O|6X%ac{m3IJrqvArRp*g8vFO@Y*=qO3Tk5|2cYIYAn6rHd~&O*76 zcvRBLPdryAQ7RBQ*lAZ3xYJJKKw$pz%ehm3)+67EG4q}wrEU!;&Bs+|x*#e^1C=6y z=xQgS4b-n@@PQ9L9ZATjZMSCz0_6nY9A<>L+*^XIleqb$H$2SI7_oQe>pWxnKKbXX z5M>6RG*C-1>|^{%Cy3tCQHr+#)WhKLk_HrAk-1Qn@*(6Q_dqSuLMNzjei?|><6PxN zn)yr>uu{yxg&`Q~hXSbUi?bEAI||%Qc9wQ`j6wxpbQYlmO6Mss&xgd`fI65 z`(wrfqM>!`ucd}EkxF~^#KM?}Pz2hiT|!$)I;>rUT_8f?39JdFnuz7L(hhX_mRk7$ z<7?Bp1zAhMc#1f@mU{2*gI#7Mbem7_K^a`5X80~|>p?Zpr8Wh92z{g;lwNSHhR^=i zdr*p5h(|~p5m`-^vlQOQ>yNpIst*dJJ`D91C{>-MLB*<$xAuh}8cpMq zXJuQ)5p=2~Md+nz>r(3T_x(~);Ct>cm4Hkg4}!Utnfj~d8j2~e6)a9yQw^uS4Prx1 z1I&dRQd9t2aQ;5ylzU`UCCbG2Vy7BpQkvl@QY%*fj|ziNmmpGsP2y`Bf#grwapbRC zpb|yaaF0?En3NGNR6~2>@(b1VOixCn0Hi|#`JrlpAdSFFMg1}I`Suy3(jGe@6wjoN zDiV!ciBzff8gEho-R>>JN@YnF6y!V=qRE*>f9VZPyOEQRt#4S7XYd8$s_G;HgBORCS-c{3uK-VJ4cJ>bIzc zf21k|{O!vWq^fPHiW-*R7lb~7 zRE3)?K;eO;szg+0wq{ZlJ$8}DA$*XT9S=Knq^ftIrC7oXGw4NCmtEl#%r#IfSgivA zydsuXX&c`esU2cb6>2{n&;4F*<}s?GD2{oiqS&&*!KkW|<|URK#x_u(cp#-A$mjM5 z26Zkb2h50PldZ=g!AYdXX_ct_q} zH!G>IMpf4=)-TiksERL(=_5FsM$s^HY^YJyqt5i(NJ+nPWbAa|0yckDGs(8Z2go>7 z@pLzdGALP^z8zIP0eR)~z3b3$IYLzo?J8_4_~ec+9W%tIN|w+#N~!ic!L6pc8(4b2 zAiRF6+Q;{YszMw-KB{88#Sm&z2?ulU82`p+icVDFsM5(B%|8S|rqsah&#HB)>SV}b znO>^GafwY7lqBZy`*H{A}W(5^65X+0<1Uf8NJ>c^=H zANdp_@}>Gz1%x0g{J%OzoT{qixk1H+Afla9RZX3rA|r4Ye0QpXrXJKWTS3ZH^$L9w zP>E?^$l|J0b(_rRA3&BbRXx*HnBqg4pj1U^{w+UDRqy}(%vaZ-rYd9H$di_qK6g-4 z)o{_ja|%kg{=+%e;TYdk6_a%-;Z8LvY0rkWqPwZeOuA~stmK-iAcF{I{m@d(l&W}F zfg)vC@dWcUmnsZMRfP)Ea}I9s*>b0`fi?pVp561 z8>{a2qZ?3FkS<|WxBv}R4SxcMZKQ{?5C2r1FFjS(&3bCK4Uu9;3% zkaD~)^PVo7?NlKJgGYIT*j1;B^H(ur->6`9s<@S!F~y(-u0ZS%3Zsu&b4JkVA2BwUy!G2qC~IQM3@#&m4rOu<4vn!v%_cH66>jgg%eKlfEr^% zZ@ny@Y+!sBE}@@!s*tB0DN#Wr=?7iPQ-zWG52$RBIpDif^$(W@iH&mU>Ea`5I>I*f zsS=nLz`5&BmFF_b>Zc00JsBTL)IC*dm%USUrRVZ`&Z#mbB8W(TQQB^Q||GJK^jLQ>k+Ln2s=>UP_g! zEGwx9QXr6u85H)~R;pgRqp2L0s{6j({@hWlI6rr~uvw~(I@E}k5J6k2T7)1BH-Lkp}@MWu&c@~&*nb*PBX z5!+xDQsJe9LiyQJg?NPgxVUGQo2BYi^(1Y`cnXMO0&l6}5Gl&uf&qUe)hiC#4nHqmw593< z(**Ru04Ph<56Bup%xF53R4r9@{7LkvQpGfgq$OO|Mbo3_)TI?9?oyAeJiDf>k1o(L+mBZt}W&z_p}2$5I6*?)dC7 zW2quGLJztOxs#~#gtst~Du8N&Qz`a{{i*4?-)kCP-m+BPgfg&U4W4B9Dpgq@Hl#|G zn1d`?P{IJPyi#>}M<^>*0%>_SS&qI@MRZG5X^zerF)UY>s>cY6uH$fbj1X|MR9({@ zZZaptUQ3F`{9E#DslxMuV4&y9eW~g^Vk~y-tOxdzPp;pwyx_?Fr7tbEd?s%^{!;Q% z(~Snxwq^Am^ouIz6p)g@TB+UaI6!djq}T^)FM2D)H zaWJ?X#mz|_QRwS}sv*R;4pptJJE_rF3@}rlAl#UZOE(QQ6+y%4?aySPlu!`D8b}Js zUDm(?a{G9vQPP7%SQ;Z9sz4o&P@7ih$%m??JLL-Kt+wp@>B|KxuOlwRp$drLu%2F_ zX!}!S(7`wkRm>lWu#J{l?Jp@QcVMmxJH*xkimY*EFj2MQs5|{O)h1Fv0TBqzUx}(C z+VK`qq`DIWV78P~D8QlBC9cA3s;9dssyufe54ABxXzx%Mij{NVe^9%IiYm=IH~$e| z7pTH9UEpAz9MV8NI|05$P_)L0DtWT|1{FD9cN)&mIspy+2%@U6%p0gjhtwS$tn5dv zUw(_CibnEy={^7$aG;2d(x*@8rI94i>I-&|5m61hM#p53IQXoH~YULU7 zK2$|2OnamwY{_m+MVh1{Vi{klId{WU8|-Z4%LDeL31m4wbs_&LS6^?4D)kQWGtsy=xjvh!SFn^3}`3XU^? z#|}jjnA%XafyK(2QmFEi%?W-2SHu+b;ewb|#{dCv%ZU}lvvLbnck1hJ%{Av@6{;TW zU+l!8u{G1*gINKEs$a&0>zsjlq3X)#X7Y$g!kK!#8`BDY4_HPnH5`WvRcS)YSy2pC z16>!kex95RRWJVGT%+_@n$#)!tXY zGliNIhpNC}$z+kM`l>io4NoNp$HNy6RW!6~Jr|O62ew0%AsYmNo*{-5IgLk&L)8pl zLf`ySY^lqIXm^6CkcTR+_`cmmRH0XxglX4F)ngw~JiUS=18t4sv?%>+q- z>I$eOs?M+Tumv0@QKgakSHkp69N~SL`d|`O@P0{(oRz2cgsA!<>9W{Lj&rC&TZm`1 z5IIy;Sfc8u-&QuV4pk7k{*bsB{3z&9HI_ry!LHz_;&P~J0wLOIey7Euid#E3YR%Rx zy@x94(T=T%=kESc719N!tgYS6{1^?YJ5-(M*odb$R2k=x7-OhnrcWXBJ0YTqmIIx? zF>;EiLS^(sMJP3AHspw^Zrva2JwU3ma|PlEuOD$5(L7WM)1Cf(V3(Pq&dO0uq|XM4 z5r?Xa!csh6z;ef-Dwp7Z@fHIi|DqP3EdX1>^`wCY> zdn2mS;u`ah!v#f3U*2<~N-~YDAR*I+d&|CWs8~oL8V;El`UEGc{HP+!427aYL&Zc? zEy^VMKcoiqDgPPLe$#VA6%sDEpzDS#38E?~#ffVRVuz^W4>=urHyH}gM^u5#vmPNL z6?8yws0u^S82HRW>QKrKRi2b-#M;_rcc>a%)@4we!!>xQG8ANZ$(I+KJ5&KDtGm11 z@s+S~u^g&uX)~YJiAgUgbTsG^_Ac3g5%iDx6LsXsO z`k6sgl|}>#iAGivqN)Hdnq=m%O`_`E76w-Wr^(yfkf^e_uX^w8NKw^MZh>kms&0>e zpc}J1oro(Dmv_Mqd*?OHoJI`={#DM8x-Bg2!DsNhu z?dtKah|7RcK5Z|eiexGZj3KICrYF%M-tk=z%nxb}AgT_IhslAu)EfCx(GOKeCV)G+ zEszH9l0eX^kV94K#q>+yp$dkvptK5v&!K9$y=j;6gbVs~*mS+PKU5+3dO%96WT-q; z)xH5GQ;4;8V^@kXAF8gf?k$tBOs8-URqJvSHbCovd&66dhHthlR681h$rqB_Q{qrX zv_oR?xgWMOVC1HLCP7r4dv(5QuKW^Jz0T*|!kV<)6TT^`go}h3PZCvzmP>@=ufK+G zJMLVu9ToW12coJA%S|#|VH$QsRWfZ8$~>a#f{kldBdUJ&x?Co!eYpO;9^Hs4ewK(x z6v_)Bss`Y$g`jLuj1ti@qRKvx$KKE3Kvad>yt;?&l7gthLGjDt$I`b$)d&3YC*l4K zaJ_=$BA`m^hpHbf3x%Ou?Eg?TjoCqnuRjE;VC#H>r zDtu8G$EQ$*U{Gvy#l?1HN<&pA-n5)%sG=tOP)mX4Llwv}u(~(i+Z4cts#h%H_V|Y$ zn2jQ4TpRPG4oi$pg{rso41rz+=+)Xxs%%ttQ=zJ0%_N{IR832>GFrM&RYf(*0F{X4 z*`rW(T9JF+LX{xGH+gKFvsM@cFUg}qmDjHD&RY#o5nw*Phz1xyp^EM$45ukA5bc{= znK6E$ifH$=_qxA?rvlfF3N%z5Tcx!jI_PGoS_a)hgWiwV{F+Ed#U)Xlp=#i?e+@Yr zZxY~w4s=5X-#E6lX-x}Cs6^vpQ8(+bhij;^M;43NHB|l2Y&AKIPCl>zGE_0pzQ?kJ zpv8vdHUC4rA84pT|Mz)5Gqn|x4``?Ym^TPS#)S(Nue@nsEOrf5s1*TSiw*@>LsgV# z$spH4)xor8V9{0)T#90-1%8n6KV?+cr^pnlPJ&Qqn@6cjd?RFQcSgQS545r*5YvS! zBHT7ro9Gr|RH#y6B5NTN7A0|Kp{iw24WB%$(4|K!ROt_cyh0Ttz~Ph0_{B$JhbnP+ z(EHkU)hNw+sLI5VaSIQm@}Y`SaJW|DxC6qW%J>NO5?k={0vciUWwmy=HSO&6 zp{fJ&tRGI7CGQ436R(qye5is~W=zma_n|5coFi7CdLZ8oshg~7ZS?10xZ*CPLlv>5 zW##AgSsx_S((d>&Ko8` z6ybr~U$G2yI^k_ORJoBPKs)HwvTKLp$|`APE>S%XnAsUZrhKTvYE*dTz{)*f=%Ff- z^I3gTt$WT$gPNq5s7}UEHAgnZ3_cV9S7xZf4_KW_*HHCaWmUJZ2OK<`re_|+tcI%B z7HOs=Q1fc2It4G?LJb9CsH&k$6ih8Zo(xsOf(voyeeba#3(|KMZU&$b@Lr#8sKRyd zsAi{%sMG5BB2kQ?DubcP8}RyXi0p={`g7iPyhBw}*bgeTMA2gN@4`@3Ler2X%sYmv zgUW8E(A^~rRfX=54S;S&LzQHYL#nQe=mx9?V;E#IRDmMLw4T4d0g<`CG*nqhb2#sh z{6Ka?3PV^4=aYw+hAKT|nYI*vAb#^>G*lh%xY^DPRW~~xKomw6HB^~q&$MqPLlr2P zc=ydv6+N4}YAErc3e2=roxiRje}VlJQ3W!R;B$V_P#m7$-NL#ZoG7#KuVpsMH?gEM{oH((}2Z^IE)6NqmzSrZk; zo4Gs-Y=|lu4h`7%2VNhlSOd`i2fq$g!t7=YKn_*6nHq-_tertrfxjZk&O2_}Mxjbn zVH&`X`gHykHCKm~i@rMqXm0UHra=L|!*fQ{EEVjk=q@Z7AiFB6u;fgByS}h1stRZO zT3-htyTp1@R9Vl!`cu{!E2<>kn~4pPC|Zt+s#+uLs@<>{j-;YW4ZfN^Wfd;L%~liK-RKXn~W$PeUuIPvNQ&dZG#zxwGd(z0!aks_Kw>OOTJjLlqN&o$t-i z5vyB5R9y$67a%?ys!&up+b9l%Llw*;!Wv0QJXGaKsLalRINroNRLO|+jR0pQ{u%_s(5RTG@|$Q+UCP^o8d9zsrV-|1iYoC`Lw{l)5mgzUUy-oC_``@`y)?l?6|_cUv=4bps}k}r zpVSc$JydxXzYnea8xfsyr~)&`($SQ?Fx0-c zyZP%w)i5Bu2w3MGsut(*fDG76l+hw=PXp}^iDO~ZQ&joydxQzQaSSX!;4NHK^;GLL z4?1IzMU_}yDy$b(gcibS{H&<@bA`-q`uBej4P@l9!9I=36obZPYfVyA{laM_o>o`Z5zWl$6k`UebO0%;{(rI)K*dB(8xmDP zB5N=PQFSN?sO0{bM8}AzYMfQH0K5onbmkTtbNh^_TC>TaB?o_zTM$(O5_pauTVfee zrIAD1E<5)J9-@jj^}?M&4H8w7`W@)w0Fb2hsi=a1z(YYy2Rud9H=02;NYlz^-C{-6 zm+-3)d40nAHF9+)GFVhSW(+-8F*UkWb81}HdZFLJMC^(eRWzQjdMpxE8L@}X7uf?6se4~{gNh_+ny^E@#-MD+^@XuUpQC0N?#=(h^MH?R(SW#s*Rq`{qM2f`m1H1SX zRgV+bO}l=ts0sp!t=FpV+GK-K^=%rJgL$U8;bjEHw=OFSn8BHfk|Josl66?K(92<^ zo4{9gJgPp9jq&!Vf;nL*d4%SEzVH0m2i)q+v`=tos99cg*e;Oz|^?Q?;B_ADxb zR2{&&6PiRdoq)4}IEGYxc3X;Sqzc)6$D&A8q-eC9n1Ds9_p2FxQ>cE}0l zTn~e!D!MynIuDG0Hu@$xlDNfVQg!s&9<2MBFjbDEK%fFf_>@wG%OQX?7lLF`k^ZQ0 zA5A0iHczRNB+eek(Xpaoj@ho>XKaiUKQ)OlCsi2XnoplgAOJ&?s?B%aQh%t^Csj4b zVR94YgOxhp$(LWb=7Z$F0ixVgYEBXbas|{zlp`ip*ANLx6$;3jN>yeys4YFf9KfOY zPKl7E>PI>Ba=T`#R6PPELS>A%L4qq)6hv<#y^1terRu9cBt45ic2=e8nldh831+FP z=sHpp4e<^zmMYKknp;YW53f{7w_IU&2hQk>y5m4|Z>n9B>VS7cW0?^dMEMtum3*ZN z!i|`s(@ykfm=TH}qBNmxgQX;;3Z0c|X**eUj^WLCg@#hz7J8dX{%HLH03$2or+2oF=n9v`X%kcKYbw0z1vS&68vu6a4mXS8_AQZB<^Sw7)OkJLaEA2$rGSBRH~khR%;mys;N|!g*=v%r|xYEx;1%P zr7CD3n7c|9l|d@!LqIUz=>hmA+G3TwQWXnp zW_F^e)yb1O;bvMbb&;0ht(!gYB$R^*Ri_AR?YDbES$$EYyNyc>@QnBOV(NA!t z>KDxQ0g2g=QUr-=oT*g3o)50_Qu$h`I!!d;>?eIvm8wCr##CM1erafNL~`R-5(yMy z%MGqb5Yx(4s>oCU%%kbGpXWQ^YVlgN&QLH@P;C(+U<-~VXQt2K)c;#km$}`&+yXh$bVV_ z{s~K!3xO>2ej$n{xh7Oe)fnyPT}>oaTyZ0IUDDx{p<4!l2AN_mPLU1-^x-{9QQO|$ zMqEUkl}8ZLN-N6yjZ~qgCVl;sSbl3BVPGg8?-ff51$I2~7dGYKm-p3>D*jw4M9z^a zko}kX9WaPgQ7THVvo}(e-Gr!VG9ItgOb^0 z#NIKQIdgleJXz`$#+>Rri!kkW+p9DWpn~V@(!6;U7kfc}T+MXtv;8jZk3% zUFeqsx81-3%so)JQl*$y2o1Z38bpRZ&)`uNpKkfjxV>48+n`Las)-_;|ELlTHj6a} z4174m>6;WqmClzgN{fPJ+MMtNzb6w@Fzde?q%ZJMHFa*b{gpe(L7$ILxyZc3Yr)oj zR0V$xgD96IIt_-;7)aHTzS~F@Yx_#7PV*&H1JnXq>-uGr8`*@)MX7q?OeOfN#DpqU zocM<0J|&bYRRs3pWu%F#%Tg8fSCq)5@M2b~V&PJq#k5j23Mp!%Pl~8iwFM0J18|ip zsOe=+nJB%~7p|4@cZ&rv|T5F(|&Xi?YBdooGY!R2)VP?RL6 z0aJpS#~|Tn%tyh;xV&jL^s3rLqcAgYlaL<4sH#G^??zO)R5Ir0-Kd9D$k`F8`XD9n zqW8oi=0hS6N!4*I`JE6{qmfiu37*~JgN~C_O*+w?`|w9n6{9J!lMn5ZDnOTO<_6mZ?#|Pe#>{XXa%oI552??Y*smdhlAu*j(5lZ^PYXx;O zMOvgbexzsN1@~dVHw-owl4{eHXRHf4sXB#klQqqq&i_diq1S)c1VLD7?AEc zsnpF7iY%J?^R>rk^_p}fN~#rcyKz;jAVCU!<$(a|ddB(_ZJqjEc8`$B7xOT5I%vRe zoJv&%^h_hh5*WdjD!kA2C2XmZU5nj|e)>CM$#8RfHdv~T%Ah@K4ri?Oah4}Y^h4S2 zLIkw22TSTBC__+7#7UKU1sUzTE(6{(sR9w)p`?_m+`meb#|#&XQmVp-;Q=z-AEQ_h z87MlW_ccAO_$Nl)OpWjYF5#rg3?m({--%C|RAG2T0N0-Tcf(4r-lPh);<(A{!%tGh zhk&J`6B#s2%NxRn)%P_%2JBh(t}9jTjb>55;~Xs~lk>c1f?huLz;3BJ$(DY&(>BwB(+*y$ z;u%ubikc@Z8cwjQm#Pa*j4p(21ib=~%+C^-svPVBRucyH3;vc7owhQYI(@c`~f2*iT9Y$;1KL}sfy-nS}507pQ$zf&ND?-KR1@28;?AQNFAuX4%ssrL$EDu^Z=`DneUc4xrj ztA&)k2GHh^H-w2d;x1#VfC!q>yA+b%odDdydliYeWEO-?4o=;t;3!MZ129#fX^(`4 zbIBv^+>9HM{zI?{&zL2bs-r%q!P8Qeve%0QyinlJhZe(9bzQi93|=&`xsj#n1r0Mr zsZ>4Id&XLnPfArFHM56oD&s{G0UhRnd^>!xQ>viCFUs%fI}MbfRJ9!O0JQa?HmN#9 z8q#ZrFmqDX_1X$lzQkox^=`Wor$X7olPcp%>PvLwxJ@i4Rbn)R!A7`7snU-eY0SC_ zPVjPmE_!-Ys=%NYq_h+nUWb*cGQmiRr9}TJ_(!Rdnna@(DOCdh`xlNVoBz&UmL2EbEa^q!Z}PJM!^$bs)Ux2 zA_00J@t)j3R_D4Ut?!qs%~~i_nBO(Onij}g_kPABkRksRDHvS zxaJa0fr_Py;pJ>2o<7gBsv1ipF{{^jWnd*)))TYe7a6UC)Cl$8P9g zBw}TGFW07$h(&k4AuV7a-+?3FY6sA^twmbSOKJnItt92wA&=2~k8`#aCWLV-Sq7$H zvt~I;O6F&=C63{q09kvlf4f%$gE+plI+8{G&+ zn*V@95QYocavXU*ytUR9RfmZd&*x{E^PcdS-)-h1| zLq{XBwK4}D3KptkSZ&&O!Z7f8TFwr}F;*+>N;}Ol0 zPoJq`5>7Xx(BjkPz_T)@P9X>~`6RnmQrw*hSc(l=hgJNXnY+4?_lgEFfVHPO?7u1Z zjz?mLC3W-($%L+_{}{Bj(xHnKHL>$%lVNOq-zz|ALRH$>Uqs`Fdx4IWO&MY>9-03K z9*!)8fMvH-1_{gp4XngL|7GiH%nOjBIo~uSpxh^Py*P!OaSP=lM$vL&7)?oE>}VJs zn0-Msix3InTLHpsj3v%H<)7~B_3_^ot-NIN*H@W~U49GBSm|pu`cx|rF2o)B?cW7$ z+7Us|ivD1Rbgbfh@t9D(Ce`xd*L*O4&#s?tSXvDbp9oZ334Hr5Cn3{KRfCs$_q#_Ahf<%1NCqpf{G z@Dff&4cJ=9mLoOqQI(Nd81(bRff5tf|5uBGT*fQtn?P~`;&f1z#X6ZgS6BX{tIMOb z1|OKe@hb+%F92I5GhbzDNEm=0MjcpJa#uyd17Ho`1wzjab}YHU-r!?CDO`fl^mR z4EV^lPKS2p((Jv{%-ruaQ_0j>*(T-SRJN|*o1+L4Kpn_BwMviccq@@DGGb#M zhyH>J#9FP3)%0#J#TRi#MKg?rCgxCFLSr8BK+Is^RegM!!8lBU`JNOM!T zXX9342MbckoHW3205||~jZT+Q23Be$kih6IM%L_D&5Y+w-~jm>OxjSAU;*7#betRR z|BV#S3$2rJq9&!T_fXO1$C&O^!N+0wO@P3YH#lybVIrPc8=_ttlPm6+E9Sd3@hj%^ zGO*n1r)4|I;L%F&GA~_KBfdqYV>_g1CT^VIq!QNA2~}hpqB&@vPID|F@1#}Vsal5} zSC)vFK_n3@1Q%`$u0AAn5YhE{c1nN%OCQ7sY^08&2rcH22RopHE7YtOdoS%={@fgp zm95q~bBf-5N9cF-({>*rii1>Tv&dKY$s|%={qJG__V4Rgf*b$D7?>A#(mZ3!DIUMh z_wE8=i8K^GBYrt97OX-uW7-(vADOt7P(4?%4julQ0Kl-i&RG&LLi)^|g_JxNVVejU zW-ckp{**pLzv6|z6_D+aLwk~VZUc9(-N+ZhMiNF6c)CF^BDi8ovfr->Bwi*o0yvJK z6QIZSSL#K^2K)JPbOC9T-}t=b!~lPWPiXxzQXth?QJl@;aJ&FneL;xXB4L(Nz#>6H zVw-r6KE#Vsnd1)7U1%T=De`T|^$m3-tHy5wt*c?LuY)$_?0fkd0`m)jn^w^^!!=N) z?v<2G3{*EScXe@}g-vKuZYgxGj-4z|ajz5&#dEr@kT{G##R3L?C7oz0n!eBZApWq76Ocr^C`=EiS3|GTh<;o8(jd>tJw@4q3 zyNoB=PVf!pe4xxgH<&mrQDQh%VhrVB9Z}< z0fqrID_`^<7~!L#zi5P1ME;_pMb+LH(-Wp6aw)|U`DfTih-UaF+=^5O!=Av)HWM@P z%M=Mgza!N0-a-HKc;mkep`XBq@E&2reov|A<00(NNso*lPN^1Q6^$R~_~CTxOJK>? zm%xuEdkjX|OY_8a0pU6i_ zpegRh5EF5QGK`RhJ@~{t_S%S%BHbuWFr;B zqvze5j7Sz^ficmsI*SOCP$I-a@H9AtXh`&=^d%T1Qn4RGh@z1SCE5nxYsL$v1kGv; z?sVBMzRcwphsv0mN{GorCo-)_M-;@XFkBHyP?}7ncX(k#IY%PW6uyVLFXsda!LKQi zPw2%T<}Kr53>VTY{~)bKxp73|3^Oh$%!7pZ5=P{q_0kajjX`d&aO__WA0<4@J<7cy zAsFFDaX5b(kQLLN8v|a3&^<^I<_HZ#x^9Ps6c%C&g^_LHn)rukN@OKg_$QZN<~aF0JM6ph!zr%*0?UPw z&)Rk$$O-w2zEMZ-Fqe9=B&14L=(w24_i9FnC?~E?%-PUNb*K7@&iqo!%!8C+e(9w% z7xkhh%8&$+FqL6+feJ-GPDeK5|70I7!?LXOR?@;6BP~pNNRqI|oR82{K@Q=cJmC(r zhN}eMqqcEigfQ`|TGRQkLkH(xe^%xrlFD2%b18_;o88II&9anezBZ^0oi^5(%^6jg zw`M#<%g#mmn4v9w7>V<+R%wXm(}l=H=j%E1OJjYYJ;Tm5jZ-RLDA7yI3*}2xq7oGm zziQQrSe_pODIv`9R@v6S@iNkw!n!|(pX|Y}IX}CgsZxCg2KrJis(Ov_B+-Ngu@ltz zFXTnrAH(x+X~*heS<2#9I7K?qP!pACVIJ#zm41{9VSJy`pAPiK*BNjdf$|7+RT0&f z!11SOZH_PgDe6D-Vmtm%+vmwK8D{i74GjxF#%C2`_(2thf3;DDf3`Y zJq=2b8ZT42zmyBH$p0Z^5z#D!pcpr5@^4a?{85JD525@WeznG0*pjkRBmb73H#SoV zTPaEYF8@#lIq`pZ-w!6wo@b|D1CL->R#f@j1TNxdL(5^0!i(@4-ZP4cbY z6yyt{g48|ALVtHMKgI_BXahCi03g%$QtFcm+dKN?Bg z8;(B>nh-vgO$c|GWzDsQmW2I;mOw-QIlJudk%kJ5ZS45s33(= zNNl zFnpT$0~CM>8M0+0g$0F74I2aa3lYta_M=AbYpWsvUw z>O@;Km`wLcoKxJZ!i`I`U7JQLv!DlCK?U7XVKLmUbpEVFTOjX6oMO$!oXm=bZAv;$SRM7h-kw)xx`gw+bJaT$yi-SJXb==qfv^d7>2_cCR+5!f| z%ZSz&@fjVzebDL97SM0Z8CF^IW9-lt(LnG-GPFf&BiJpy&6OK1R`Spm-hlghc<)?I z+@~PkY3YKGjA-Rl>OBRT`%H9juLHAv*p++WVBEUdz_dhL$o4S9%a*yp-&0sN!I|mC zw?iC*B8avi?nuhrAY7H@4{afy^Te%T(7(ic3U#e@fuSl;d{x|@3of)p(TX1wuVhSc zXp33vhqTV$jtgzUyGrWIJpYO=>vUy8TY%oztORZ0s1r|ERrX*;KM9cKQyll*| z+KwFB0^6T>eNoC&a5YGWfkCci0J@Gum@iMk!j_=uNYh~YXAA1`LTEf(610W&(xxL< zpx+W(P@pXcaK7n{PBA>x5`eZ~=Te{{d!-b#MRR3?(5ez8&=!*g^+%_+L|%?_Q}}^u zgN$_)1{4k2!eiy7(;ZTg^5ZJ@mlMZ6d6z<4d?X;+U6`9f0r+ym?%`isJtyQhg8h220tSMyG`F@>0?lUH`n zPC5qg3vE$hm0q5Z2B{{d=w1reXT1Qe48;W+7*P4p7DPTO(E4qy?6dpfNA*Z(i;9!( z8UF>lB(%jiDs}WETtLUA(13b?u&_Z%WZwcH6QkIq!7_b4 zTk!P?!IN<*fQM^MrBlF1p>3~aBN(X#QseT!BzQPQD)Noa7LqikWEAr@B9dj=B@~xJ zrYHiUF`8Rvi^Ind2V|CP>uezft6fa;@~_ep>~Kjnug(?_q z%tC7eM&o>qvjxl>r5E`th3H6g`uUjE5j%@~r7*}tL06;P$4?^8R|?LS=4c#e3+R?i zNAS7vzTBuF_)4MCj`jdkC4jTV=x9MW1+s#p7e8lCz6Z1K+#6@CR=v&9x)1Qr^;QYZ|1K{}rWBjar8V$M8aQDjYDf?vb% z{MxPM>w%dq;9$m^(748IK|Ru?#0vDdjLdU#gKv&G4!&BRLJLlIyp(A7OGf^i}!TVN^V zUuR9LV%YM5rGQA@5fp3$OM#AHWzKJ%1D1l$#gOCCvdk6=jO=wN-{NGp5dX%&5KlW} zDYJ!fPXG~0xN2=uP+=)tgvc4837(lP+EcIF;zK8<7#XI(51v_A_vTKy;v#imDJ*EE z;$H(b)ojruls+I}yJWV=a^W6QW{Y9W2~kF`U6)~6jHv;md^1~EI!|L!t9K-sEn43> zFmx{v7X&_GDO9ivq$%0?+{w6!0AZ!D&BJYrQz$=h(|{`i=!v% zo>J%}_}#D?$!fL;nZ$9*6JyrZY$5a?gA-UfIc-l0T_yq_dREGstlwsf6VGy}02Y1{ ziOm)n4%~`vDDss<=~MVecGy1^y=6FNkIf$w0U> zJyShkI|_QAN)^;r`_|8?~bxF zX@oJvSIrh}DrR#YAbOXpiMWfu#}Op)UzoyV%@*=ND<*%nUFpNzwC*ql%66Y-i>jBo zvbZ%{_>%S^@qGgjgUuF-O3BIcP_Um8k7Ncgv~Glq0YV#-gZRB((N@kDJVv`o(nU@Ye+8&K#OaVG$X)rdZ5KLQj)2=EK7 zgeafkYythQ-7Fj$+iM1oWXp?%qa6n--=t2coGr+ibhA_IAi>$9^FfbiRw>N&N^}$F z6S_X^e1L{)J{KmXhXsw#dE7;(jzHZnmB+ z3>2k5G2D0kkNRNrgy<@$li!?P0or2wZs^<9_YB&iY;h14m(^5^8$I$pe>GJHwVct0q{*h&=xEC)lV1t zf(H9QTZrhC@!103OBT6#w(w{PBavu8`z8_37M0alhY6bQ{86-gh|o(vqioL832bs z%R$*^3-QR=_oPRU<=H|QLO{tTY--g>i3gxa!%}<)un9gvA~N~XiSoNO0T7x!yt^={ zS!!Bm3#)Q~6@{*dH|KwrkU+@?*6F=_UI9wrEvsvdqpFSHc>UT=yX;XA1@g<;{InrX+A-GIG0_Ad4bJT!vwjkt=VlCm-Nam~=XA2K@kz9pro%hBg5c|#9 z0!y=eN7?2M$uBX%c;UJvDIU0YxLSSfhO+bUY(XNgYW67t1{1g@9jf^U zv*d<3eJCm+226lD7v74(qS6l^YKHnHaCsz4Akp(bzNd+gFX39x%5HKp`PFRD?b(9e z;g?`^eX4o~8vT*}P`YJtRc8zOaTNzMj2LQc%n#Sj7Su}eBfa+UTA z%@)tkaECC}gqtk}O_J(#sP^QWErhTPcOi=WKmP$Rm!L~sd_Tfmg2Yq&6*HG$LA{0` z4Qt@y)pBj-5}2$>Aa9+_C0JZ0NB3S`49ym_QilOBO06etq}gIKaQh|_bNgj3A%v1K z)s<68jswNlY;g_JBmKd7c&Ye~w8mUQ?&_<~^EF#=Vsk0%>Z2yk5m5WqF8WKabTdR? zESXDan-6~Sl}=$Tq568kl^7PxC3L;^)gi%h5Z4abY>}40r|sAA!Y#DYoXr*hB?LAf z90Zu{%q56IEL&MSNvF94H?ctyiw6<_ZZ3hV%AmT+gv@HPMFTS-e{4wEf?vQL6vQUz z7>OV7oopd>#CUK*QVZfB*pn>+gVqq_lT%TNK=V-I5)jCxRF<7=QMvwXpk#ovc!Jx> z7L?mPJe5zHJDRs9Th#Ts_8bVNqGi?~F5w2+fG)bUH43QEZ1Hs@$`;QUZyT{j%3bRi0F2^Y$2sB7xT1q14%34vc;IjK5STy>-i2vWDkU~h*0Zgi;wIM z`vX(_dEM(}i$MeBl9Dlp#`0y098t09jGvZ92vh>;-8K%|9ldz)Y}zPpi?LIHyGgP8G++Uc0|zC z3Baa&62i&L%5Ba1rscuBqqf=wTB zHg>_BL5yA}mHbzH5-wIr&@xoMO?(oHh&A=FRim~*pHOED??Ya_G2iBqPr{V`5m#a# z5k=60&zlQc=TV3i?D0F z0b*n>zVk^CosL_AmsDy`^Ni4;@t*@6l#wa>NPJ^H33^GkzLZSh=musB@~EqP1MZDc z6ekHf3Nc$0(MB$S-=r_eC*59Cv02ifA4|o160F$;6gEY*M6F3vQK!^+PXg+GO7sAH zL|JBz2-5Nt{~c7|mO+-Bg?to#jp9!vGg~B^ot>orvtxqULQ0j>U$-ptWeYqt=YbBEuP}omdN1b0rCzqc6p#B7 z_XS;$=ku*ETVz#*R*fL{0aF`{b>J{t7>H|^1Lph_H(r~i4~|*b`fsovU$y`(d^N~H z!Jb0zGR0>enjuN=wmVfa2|s{Z3VNET*`oV2)FXmJvjskTVg$IUOadyJ)Zyw}Bt%#F zzRnh;W7djVFKh2^-fcVgKTHC?uKbm8d$M9#-lNPUl)fviu2O|d)7j!;_;}2@-y?#v z#q)mS+qGck%6)|d1HJi#cICj-Z%pVglfcpHdRj?{ue;65g&>2JBqnq;Ewi2SS=ro5 z!p#od0OhOdD2gb;!B-kWldMGzrER!ka&)MRZt3?hR zXDOI6lTaGFctQ?ZCHu`H3Cv8wH(PXKtcU0xEw!61yx^}> zHgTreLTs+3Kta*Mc*i(q5)Us>=4{^9`A&@ziivVVeNe_N1aKgEq1v6Xt0xwQbWSez+kN?a3<9VM& z%TPgU=cqK3;0wB|irRqUt_5r44k+W9QM`psnJt*RT5qAhF_qcEo%TU3==>_f^GI<4 zP}TE1|Kb;v*jLl`YoCzTGD@M$7Zx{8I!7FcD%6-JSCO$&(qyxay9-0RR8-nWYK z;252X1mtCQNacia{H|N8N-a=PJ(DeX%Zf-+HysJuhIpclWl}hF5CvSpMuPBe)w422 z0`)5wZYd>0_?=oop8-Vi7zt?Bxx1ANt`_GaYOfgbY@1Qp0yXjxfNB{zEE{7aXb2yZ z*$Pm$Si3plvQN|1wUvLAKX-@C#z@dv92#)T78%obTA_>lD1_#}Y1_y}6DY|@K$u_= z>qV@YRxP-lNJhf4u;}rYoybVAs;y^hroVhx5=Jr-B0}eV7yPf!tqJJGY0P6JOe|OQ zTt~iaj*);$y%(&Pi)_L5A&-$z1X0ON+J+o@m;*dkz%dd=w4{G<_+^Xeh+IdSgrjnZ zjPhS^*`kAMaXC^}93uo51Eol~#1j}`ct6bSpO)@ri%3!Y2b4t17X7=DU+MZ(+>ns} zEqb{Y)k*{{b~kFtfqQe=Mo ziYD?^aUBF;VU#U|g;9%`T(p=HO|~FaJy*LSs%e9Ep#5Zv1OBS7if^*TwTiB%5V05D zf;TwQ;7NjhHre8i&I|w&MHA(!t>)ad67g~7$rkZS9w7nox2S+C!2yrJ()DGleL40g zTNspi?8j;@`-zfhh$yMJp0dSfBWlkY5HRHfS`(ayXXs87Tp)6R$?}sTlr4(3)qLm^ zs_vgV#!z!iI02_kw(vVUq<~_wg+j5tVoWRB2o=hCitCm}=z{_C%3~uC*>D)8j9V$m z*@u^T_F!%SPGFT3+c2B6pZQV?`G`%n;Diii3y6({ywL`j(UmP`%{QOWruW;9Q)=JX zVpO)UZw40D5ig}6!B#f!O`fJppt42IX4peyc^$5gi>e4dlo}w3&XGptE@KDE@C^l zL=e&Ifdwa4`r%E9aLIon)L(D16*mTV~#RoP+~g5=D_ z6X?no1r`T81wIYgz|0vV9kmy#nAhmuU#<&wr3KoO7 zhd{z9izXroK^1cTk@j#G=C7#*lIqD8bdrv2F@cpeDymZ)oBy#zujL$o_R175@ns;9 zFfrLmRCiT7!-zPxz$rmv3;!Lr5EzWWNWt-mqfU!kB4*#eUhU&9S{)AeZyp;l=r=>KbOKYY;TlBD^ z%reng1TL$APwxHd5v8aVlD->Ixn>?)LM#w{CoF}2A7FI(T5=7jhn~J9n zp*>;?jetIrHPiw?Y(cE*{8JLf5`_?3Bve)~N3+|<7KsHBLC_0wn=M&6GS7>X0Va8z zEBf;73hz%MI4FqB;Q_EaVhaW%(PGWj{LaJ{Kf`^;_1?tjz7%M|Uyu`+FeR~t2%Ezd zXte-=4E+K|?1CWt6C}1+F{v!+FEmXI0uYkJmPG)7Gxiu5VvBz|<)nr!YqCph@$T46 zKyt7NDWa)!)7D)AqS(T^K53I?QH9VGTac$IIglYPJ{2b=wg^cdGgZ`OrqwdB1^U5O zBF80R;SMEaVvCHx1N_7yRx4!mC+3PRCfZQ{VKCGFCd^rD$q)QRB(^xDCnMpTbU#qQ z=uxQ#%iUL12Xsx`O#EOHTeyb9uNMInTNrr7vq|-qW9}hr(uzPWwpbteLyDLS^?|l; zpch+sfyc;j{VR@-&Ib$7s*;g{*|14wgS}7%o&`^_#jO8-pMR9P zwHr~AzbE+MLSmZJ`X~-5a~9_T>F~bgPuT7`tS!*y@~AP|JJMQUwvDdtLgH|-MH-L+ z>FRPOVRE2c{W1eTkAR>~_#*-r>|zW3t7p;OH_R!Oj+V#Gjw9Ku#TI9*OmH|vctf#8 zgh9`uFqKFHa$^fgu5jmU9b5SKg*oY&tW9yCJ(FoM*pfW8Fh@Q;wh$O0ttApb3wrS4 znf*Xy3*HXUO^QlrnMt|B>!!n_PK$nIi&8_m${I^9iZh&xT_Y^ByrL!%TgGIIKN-$` zbn-wiIo*x&_lbLA2E!ynuB4zF_ z>~6$^^xpO%k%RIpdyq8@8>t!MLl*=Uj$pFg9yF5J%Zcre0irKOCWgtnWD7KT2V^{u zSSd$MV7CLw7GishSH6IE7cA)x8jat{oG;tgablYysAm7>#oR5>*_WpWGBwvir6_$s_qVdd{-gPCK}W@_HYx zfebqB044Q9UZ<8ljcj50{MrCqGE2q*@LvR$@o5LvolV6jBM&_2p$RlVXq!=f+JRr< z%P0d-`Dmg3Q1m6GR(k~Sgt|o*Xkk7o7 zfOsfdJZk=^O+F1sMA^dqurBG*_YSDsQfh|me!Fxgm4hRa=}ZRTgmUt3v+6LQd-%<^ErO9QntX-)_t0Pj%;A`eb4`sEglg76s=(d zbF5smYcWTL*DeKYF15SC4vI^Q=FEo-lP$=*kiTU=Lg6^rL6HEQD1|kVEpq)RWDA_b zivp{lB3s<7hc_BA;AKwSZ;EU&qqG<#0i6D)LFp&vH<2x>-zC*rBH4lfz6HlT&sm+l z7lmL4OILtvex8R|8I7jw&cF^dl9V2?NnjBKf;HMGTUe2+35>jPZ-xi3gWNEM z0DrOtxV~YHHb7qDURI4M`$(fX*#dF%%VY~EKWLy>s}oPQ2*@};tR|TM zVE*ntbGy~5c|VPgmLVDFPHB2#~xkP8cS zV4FQx`~s_K^kxkLcHqf`Rf;erTObnt83iyqf)00Vuv^YvBU>PW5%g<*nah$(kl?3A zwy27pHr5~Ww}3r${8Z)THV5aX;Pkw>7`<3z3-tT+di>vdLA$e870mp#z}o0F_}I00 zY-{21y);=1n znh7y=p@mFgM_ED(AB7fuvfZ9Y=Hn}062ljAS&+V0GG~EAHwzhR7SQl@%Pd$43bPQF z&1G?dWzld}a-&n>g)gv577eBM6}|wBEdD`$w={eaJ{Ia6i(S=Nm|-mNuvp-IuX$pD zHDa*_-KzjIdl4zX0(5<5GVFh)A6`g(+=j-L^RRp)Lg1EX0LwgC~ zDm=qhA$V4iH&y|K&9v8#?NxE3y^L2yPP$nY;w_rc3shAczFtwPia%Atts zRJY116$5X(9$oY4y}}t4IUN|h?ilN~7Ah1q zT1MEQLU2yueJ{^`3QqYH+VIt+r61Tl0;FSRvabqVPU0_^TK#O=${oZF1( z(^mR5`{I6al=*8Z;a>zJ|D{j>M(G7unJ8fMI>=u1^ZxK`<(TuoCQ; zDcB1E=l;Ofaf3Z`2m9zr;RuAq+oktVgc&;t!{D4S52Y}IcZD5WaA9*Ng%5_sIAEtU z=qO>Jbi;DZ8wS8{n2aRTn1THmy;(ZUcHje&)18HVofMUUnD>)Tg|CSH*CVEC#%(&p z{+bh;{z9?+OEKH1V#C)vDb($XrS+sJuSDU7ubvCP;9~O*`T}vALb30YqB2t=Wr$?# zFKosnkj6NK?-{MJ*e3-Hd}~thW6YAmn8rGEt?_bn4EIP1+>RX@DLjBt87bUfkF|-B z;$?j$7b)JqKNbU+1KCvW4MKJ@Lq-@W8k!}tWE5bu^+i@xI5IARWT%v53}s4&kV^*1 zGTF;Wu}vCBFH%HzGAad>LA!h7ga|k5Ov>hnQ}*_xvU^%(-q^}s{42vCvdmeekiJ09 z)K}XV&Ar=OQ0obr5$$DdS-D7I!;i~`MT$js*$U_QSxGkIa8 zK;JJTFv&?TYdCCNm!%=5kwW?wmlYWWiogY5Hd4F}mjy+5L$V`91`3PIs0&z^T@&iE z2{}>>pG2z`I>?;b1Q15rU=i)z$I`B6ncTNxy*xM;QaCE4U_T%Q<{{_!C|Yn?x<^sW zAa{2Z;&K#1ZWPr_qrj9=6lYmPFp4|4C>~!?{H7?Ta-Aq3(6Upafa;k5hm95Qyey`f;*vNA*QvSqys#Ybd>2EU>{D5r7>TW0K=R48z`jF(VsNe43uJ2m(m z6g&)y_5{VbA#!;S6jLRG)n&E<#U}%b*6Fg~3n;!qNf8AU#Q+qT;GdWVe?sB+6Q$fw z{9zOBg{7v;p!38JwaO>JgHM>iJ&`hR;!Xcd3wJ_Omxc30BV3lr6Y+{CG`1`cJV9m4 zx_Bq7w-Z>i6YwlMp~Pi@>%`C23CnAp$jdr$g^-ZeTN+#j5l(zls5wED#B$;>Wj1mG zr*Q&cEz=PvjuB4eZ(06tf||Vv2QCwAHv#_i;CtG0a2d{S;tQ7r<0ihkth7y>bXlTJ z%ttn{^=l$yYoZ>y%yKn>(`8Jl2?$#tq$Y-Knn+8UNWo<#(L_fLvX*NgmyjEvA_1B( zEbTiJoSTXIWhORUCc?LDmcmz;LDG~7A-p}Pum*%2iO=)s-=EXcmzaE}MIHmo&S6Z0 zOyGH$#4+)JFD9b%%X&94K~ykH?l3`in6(KLQdYqP_a|Ti4C$AUi&+p~qK{s}A@CCY z*CnnXGdP!M7qg|}64ACoXyOv{cS}sNB_L8uXfI|>pd~6Ed3Z51FH0cC4B}V<7c$#N zW#*bPdka!#cB#S=p<-s|$R{(&u!K(kn7J8UWfI%Rtd%O1*{Qb1%%(!2Gy8`n&iRHw z)zGXy)M8lTO#i5fIv5flovvQXtwsS66F&skwvQna8wB@q!N^$5|sprYE!~k zXl7JtRwRnml$h3&bCwdN(yXw;XAhcrqXfp84T%z-#yd$*C=mdl1nQo|q&o@3xeb5q zB>20NplY_0z)x{zQwPnNO;L9ezYB4`&TJ@VmhdF{dnA$mlnyh~k~3SznPJeJnd3=# zB2R)&CjkRA{$Hv=&)$6F%m#20_{o`N-z30wC5QL4nthW9aZqLih?xQWWJ{4PGaH|s zSzbi51x~{0&2SP+S_e^?EaBj$8OI^fYBr9pX7@OWW!_kpXf=CT)l5J&19B2lT}!i8 zDX3Hgsxf#HEv*841zcdNM;;bW?#HE~7z$6y8Bo1`Wq$`Ow)7hDlXur;;lSHmyn9TFp3=H%5TXMPePbb_{0NJJd80YV}|LVLO(5xdZi1BrY?I|U>{ zoq=epuGEGk+S?ytofIu0Ai&(|BS0=%10TW4Xzh9g%Z(O0kDzz7SUiFN(pugT+_%mV z&gr&E8fIt2ankzG5&ueQCFqFfO6$BFak#XKbur?&GV`e===3TX&c%Wx6hS+&I$(GsievxvSv=&=Z2r&{_I zartV=R>V#ZVQI@VgLi0iVJIYoRyYkgD1eQK>ria4^ho+#qkt#v>V=Yio`RMfk{ zTx0D-(CS)?Wa1uu*D{fb*c%h^pe5oaN<=BWW+aIqKoX&nuf;zi7Hvf2`?cUAf@wd8 zVizMY500AKKulmuI7DzMb>uNn5wR0CAbC8=VKW4XAWCcjeu(K}6W&Ag-`MIrL=%v0 zdxz+gY*8H|Ugi*LDO(*5LEW2Oe=u+R$8Qt;g4+>vxG@75H^PS8FjELqQ*N#)1oBqQ?G!L)eWH6jir2IGrh3(`T88LX0~hv@#)h zNC}~9xCkI2D&vw|QR1>w;I!HNWt;!N)Z4na&c1Yuyq=^GxhA;Wr6BAG@a z_lQ!4TpDf-4M+YLE(V_u#3_9sc3a^Zd*RakKxAe}YxTS1v$;Y`gKz42;b_nMKoB(X z3x`2uFx*$^frt&haP}jbfU$5*c_6ZNU~`4DOXh^@^gxgvPz@+s@`Q^$5Fm_jD0^@| zGbZ{#WTnA{GlJEF+Yk-zoQ?oL5O81Xj?sL2a5;EzKavlGXqlkc9UMsq2kZmkUco~IzN(x760e&Dz6t24$d?3*31JTzxYvHgT2+#O>&vq&91CfQy)U04% zr_8Q_FggZe7%dQ07EaFsK~F29pR*t>+(dwoX?p^(JOd{X_8~up^P&j^Neq|cF`S5s zNMQn@-@=`Br{vGV{gZaNaM=U8O&};=xK~8O5gLc1TMzdV0@ck?%vFi|PS7di%D!;l zyopPWNO9A(;@q;u1^pKXz+;>TXdK1Q#tlv&cH+4D*Kz06JkGm5fuQc=A{rn;kejOS zu_2cJ9us%?0?(nwhis2MKI40I|eq z{|BA^!=0Hq$2H_}Oc)9iJ@8!uA>`RKlqR?epFz?W76@Fz>6wfo&4~5>4M^i&zN~3!4JOTbes2~*V6^u zhvuN}&OUU{sC%;yttxe2_M!9C4cCXRrn;W`(7ftS=|cxs*DJ?U*^ST30E9Z~;~?;Z z1@!bI^*?CdvG3+2_gzD z*P+uxGeIeP5T?+if<55ldRUh0a$i045AvLvdN?fCRpQ`QR$O~PczSpP|DPU$-l8rF z>S2q$32*;WdGg@o^YCoWL#5^can}uD9vHmq;;}p|;kojVo=zUh#MfDhJV3wKq4jtG z1F(D71n*xrf0631+r{3Y11A|Ckm3*?Bwrm5JoNf^kg>08e+QzkOZpDFZtuW@yaRH( z168_%#VvY?icsQphuon9Q@X)k9Tc@*oVfM;kh*+2(SpM(AJ96(?p@f0x#=Lv$RJgXHjUL=FrBaxk0h#7tpIc3c!nvV+SxDC2*5VhWS8@9c(3gGvm3ru+f~&K(a;T?p1C0bxj{eN zkc>V1miFQ~EVd1Zm0cs-z`iLv6;N$$ph|66MRr-zhHhjR0BvY1ySmv>L<@1*kgsHe zO=V{t8@?198YsIgY}ganu*}yGI@#s$8d#RT=Nc-`PW0B$AGGUKYiLWmg;_(xsa4sk|wPh9%C9d#Pb9aYy4oD#=|#fPZt>VQEOx-8QEozIFH2 zG=%N$2-A=pa|f1&yzg#5X~@UB*GNMSdbfNuWM=PfjfQ9v->oY;Lt)=BO77VDUE0gf zf7kpoB)|tlgE%H1G+6YmH_-4e!izEhbA>l0y-GZTUn8Cxo`L?vOR2!( zdF%|DFdlo(Fv{niBvWkF3H6-~%(*Z|8fN^}o~Q$y)|iEU%hnnCbFR8Z>(q&xQWZq{}O*G7RqWcqv13iFqx< zP==r?12He@WN0Yntv#WiV?EH*UWen!WXxMI8H5FJLQICl$Yj9w^0aQuqX3S1$b5Op z|MFhu&@*j$dM1Mol$N)=6}CJ9RLet~r%VPND=%!YP#dbfaRh&v_hjCWzUTY$yR2M( zdG?D8G%~O2p?L-ZKnPk zCRHgtdJ>f0i6O&QF*3cr;4?ct#m(s$$w$;{PW_JSNTWXZi7_LvUes(JP{4H-)J zo>u@Qes=m106r2Z!3W?k;lmWqd(n{iK86goTYRz3%HVB$z(NN8$G3h+zKtP+IYs%B z)st)a4uuR8V?L3Pp`Xo{xz2ZWem)#L^hqfB;ywX=RE&%1`-V{8cd9oHyux3?I^CsMawklQ@Pd`gJyjf6y2%lZ>Gg z7(>#y7?55uNcYJ{Knx&~5`%FiF%SWX!6_1hs}8_7%;cpoh}$r*K!!nP3j-kfofHOE zf|4)@@h>icKp13hFp#aAk|CsU<`=LN7>Y=KINpnyS8{Cx8SzwNSwY2bVqlG1*h1BTR zJqtSIEXc)KAVjmE?8|~J`q|1tJoNk5WFdW$aN(gJTuNlYf*}jJj)h>QhDGUNEHGD- z$_-D_>tSK8u&_3R1p|KJ=vP38{0c_!D*!_D6IFe$po8YQR}e3+ASC*=NR$r!fVaHR zFQlvhXILIwK?2+gxz`F!pr6X_G#b*@Y>bpsFcG9{Q;Y{U+dBm)=$m z`lTyfVZrA6`d|vdLcfhcKY&0#p`RbH@7w35=x)Lkg6e#JAf{lHRL^fcNu-k$Ev7(l zHd#b5>rB7E%qylaM_ioU?svp?W+?z=v7cY7QouexFq8sPO#n*4^*|3P<+mBL8Ru*?}%_Xzv5iT)twYFBply4 z(GK7I+LJEa3=*mGR9cg{6bF(4uDcns)@YR4%(;S=C}5f!t#w!^br=5bo0A1 zg;3#!u^4UMOPk*l9sx>0WQs12L)P|9S$tCX)HqNz1eK@un4uJ4H$P3AAEj$e#&wp6 zq7;%wPBBO+h@0PDP7adIk6(vT3WxwMu)4@i3i#%yN>Z2^N#QOcg=l{iF!Q4zd(WP_ zVWU79qX1ir0(umM6^VkQ9}1Zbg%d3l5;qbGoj5 z6ChkV0gZD4oyiI9m7H)RazfVmCE^5>zX|R!Kf9a2vfTtZ%CEe-2@`fF$4=USzcfiE zSfeI5K$^h)Gl3DosWSk%*}VjukqK|3F<}!iA&)SD=D!3x_7W7eVzf&bCc6ZH@>7mW zctTvlcfuun0hd7GNa^BKT;&&!5|C5il|YbWRzhl33Di&tvoR&um7g9Z#2HEm>65TZ zCt+_+Lbb}zY7%hD4-At4RDL&>1nW-{9*rc#$}f8)2zreKQ~3#t1e;%x;DU&RMTP_f zLP90w7wtm6zYtKBrt%~I2v>cCtFlLE#v??0DZf}Kzjc$S9pPhZ+9?GZXQ}w-X9{uz zGv&wM2>rB;z=hQs!7fN6AgLL_SR*4aY7!&#Brw8(@-tq9=H&NVgtmJY0rZMs?5YSr zrU+b?B6tf$NXv|Ahz>go!ofHx1`6HA95W0}*5=fQXgrc8c$2&&Q{oMFx(Bvq8(96~3*(+3?weWgPHr~Docff^e^@Mj1JV+h&i z0^1A00LqWbkO5;#QhqHj1QLbOyoVS8kL(6l8um;GC`br9D!&dP^!PzA>L8$oAQVXX z<)(uG`?5Ak9R!^6YtwWP2;HWwwGINj02^h6@(bQU02u@VDU#q#`8`8Y<#*#jc##KT z2M3`!O`3nq%I`PXD$u9$+cOA}V>1W{-m;r&^4D~Cr~GC>T-kC4p{*<$1jCVIluDm) z_@%7Cq5Lv62zdxsVl_r#vy@-1Qu&#PYY^DVulO=memjp+gFqQyS*<}B7BfL9zhut_ zf#s^mqFL7<$hlB{Y7IFM=K@7sUGFI}li^;D_XF-sh{5lkbhVrYA zARInctQ9^G;3vP;K=`u-LQVqV=r$ni5)jfxKmeNjt`Q(GWp|?g2VeUKg=&9bBYzN0 z?g!VI{P5Hddc2gH$xpTXAmyc$iODaqNBDu3%H}>$hkYO>zvSry7|#cMl@EZ750DN% zP!oKR$$Kz1xCdR&9@J7e#n0=3o2mytrU&su4@i-zSm%L8%!3@tgFsInfG59?#{;HL zX=%j+Q-%jD2OiAHuS?%SiKc0aUirp5*hF`b`*sk*+5xiJfin4JBz906A5J&wD0Fo1Oz~oP!?C!Qa0e1j?_o za=?Jf$$`|399;G|*l8RD4T}T7hyxkrmsZ3iw?D?gA+z`*nXt-$h&E>iiGdeH&~npmm<2FS|q2pB9rSt`G`fI)q8 z%&9f0pn$Qu+Gjvn@(UO%zoz3xK*r-GdZs6XQr@df$0nW+~liF?UZ29Fkje+ z?J>VSs0CCnpjTvmPteSdW4$1~dt84DOA~=42%4XKT#$Ms_5ul(ynEHkJ(dx582 zV14Zcs(Tz%o8LO=3zN4OTy-XQ%jGq>K%M!l`Hjh6tT)@nyOzN0LZsmN)ZD!38jrg8PW@YSiNE0(RZkOc%rv zIv0p(evE2<$0wW%NJYCm7kuel@M$*zv?M74AO2jh1j2w9K$Ku9FYna?n#KiF2p5p{ z7HA#`A1Aw!&95AKIIpe1j#kh`R&YJ@^RI$DTLogP0@JZ7Kr+7>RlpA5 zq6&oOAr6r7`{+Rx4FBPnV}2&40>GmJrJ;hg%&+$;=;;(FB_dMuN|8i?AElril7h{T zg0#^_K^yZEY*7GY0Y(+`JCP{pWrLkkqM&>e1-qUoSY0hqcPa<#1p0siTlEvP@d-|t zpKbI6J<>b)I|0VWJHg~soj?rCugnQ>-NXqD#QelX0c3t0LNxPZtV_@!h@c6C9{k7b zGJ#|7s~i)Y&99;`!K8K|+UB634}hhm*`2r?!HEopubEq)chKJeZo3-N5BCmFcRP*4+%sK66~uJX}!wQ z{H7Mc(9S7x1lZ!~YY;!~MgYtsi%dZw)nN*n`Rx#a1p2lX!GivuFM(DB@lz>+nMUTP z&51x}UuZHv#Uz4X5kWl=!BBVzI&TOfGX&t7-?a+?Me{2ykWf?zI?~A{1n9eOBNRe# z|`rF$WaQuM6b>L^VJ^kOTF_0YZlZ z%99@t2RNJvnjg*^5M4JQOmPE@Yy+;)28@}Xcx)h|`Q6t*08Naw2FkG-DAoMBNe$ea zUv3&W*!&_%1Lx*fk!au}Ux^1aP`UYOcLosIikO>$xy*n#E&~YX_e~izJL0j{|Khl&fJ z@D`xW7AOn@oJyfwa|Ots1#Yn{U}!7==S&zUR4ASTk+cGYMk_EiYkn0FVO4<0sX%;D zfh*1r!c(B9MNFHfz!9(%m^4zr;QXvnAf5b(0wUQF3fTV%)Y=nxbvuEEoIuU_*=-X5 zJwphj2^^X8b6}JS1i6fIelwUre?ZfJZ9eW#vj1NW0(2HSjC4z&it|%DOaYg`iJPBu z3BcI=ral+lc!Gv%ekh|$fIB1-%?|@>e)d)`Vw)eBTmm69`hFLlS_2R|6A=SFCE)WU z(5?A(TnZZXlCP40J=WR$#(MK}DG6wtpHntJEN#yu0qT+j3{^IX?97xYp&~awszjg! zrIG}Wk(eYvjrYy$+eyjIub?ErfRzMvS`xUPO9C#)Seumu1kP_qG6|AOlmzfSO@`~5 zi7Rv$2|Y=GCP}~zE}3qg6qw%!B6Dl(ie3Sb{l_l^K= zjLsugs1|)kz&I_B0BXmbRVM#6LZW=8Fs4E?b4P$YefWl+by-DV8OVW~uaiW)Y+MAm z+2RVpg-M?&0$5i*$cdB5_?4gg7JSi1mKSib^Zc2jorNP zXY31skUf+M6v%mkaU==>h5?&GUzJCf6leG#Acr|oIho5GocjdD+*Lf_1&Z^F-M$Ux0sMwtofd`%U?NjBL@)UVMW60~ zeCLhSv;DaH4{BluXb>sikS3v+W6{=PDW#(UwX^uAE!$p^ITMP{fHkgV zsEc(5eDyP9&4Baf&%js)JS2iFmvYNYOCshaKNl6Xj>W@OuM)oS1#b%&mzN_95HDEG zwOaaL0DXupQ6-L{aMh>1fMpUD)eE45Wcd$FV&68qfQIEaz}2>C&v605k7<_Xw4Bi) zZC%BywgA}NC3x-1AXh1WtA)`57HQXWf-Tzjw*klkGy?hg2rzK17M!*MYHb&wnQ~-q zs{r#xOHnG|vrMCc<&Q8}6Js)e91ms2O#z$l?BrL^YYO-mb^WU?On~wokpjS92jbkj z7x#z){(}E755hW_MCkt$01BMO#g;^#VSnLb__7ngGML}&E;m9OY}y2niXs7I0;DDp zQA$mFza^jydR`8rFa#&!NeN&jv?KvSc?uka1SCLM(F!If6&m&%0lldkpa`=N{IW(L zZ5qoG0mUGImL}d1u&yv^2?2uSZ#s&pY>yHI5Kz}Ob!Er4RHiA^@9xa?a(f4Z>DzV8 zRNOv*VE^;IJ^+2Ei!!3W7x%CSkdTOi1;H2Xy}I!LP)hOEk|wi!R5oY_Xb3%kwbyN_ zlIQ@;bL(Z76?6a@W+!+|vgI5HAg~&8q!$|l42L-103Z?oJXlmGK+C%swl=_MU@>F} zPT=!*W(`30EXinqF^0G9zyS3vBW<1hN~E}gH5x!WjdHBXfc!a~1)J+w20L`cULb!8Z0-NKG3I{+Tyy#E83cyY4J-`OQ zxhVgHpw9sQ(f*0CXdP@IY4ZM+?uiU{R18-hwq5}Dt`Uj-$REwPct;DMQwKl>(n)3& zz?cD`6|AB_mNx!B3nR!1i%<@?I$~cZomC>2w;fU zcR6~^nDwj*{Q$HU4OB5OD5wqql>+VZ6A8M`+5mW5Wo-LF2>;bq2B7&X+*iwhPaGG3 zWdZXs82q$*3cw5Z=ZI2+i^K0jK;27 zH@)YYWeW~ST@)x<0{2?!LrcUj0nqfvYz#ibw+$P_<;+U}{Kh0@N&p;PG1X&}e=NAk z4H5wMTti`1PK5sakMHB866)9fYdJ$0&nj-34jtr z@dC_X0{Yj`86Hqgl41j#=r42j+&T(VD-6mdSME$HkL$o)HAYMbegUNcn*koN*iIhX ze>RthRP0BR8_^g|BSOD#eyZ16Bt=wzXmeNR`7^On%zQ@q)XYO?pYfQHdL8+zF3H>H zu9aBbzK;nN$>!SC!%w-!{QMM8tunWmz3#ecsZV41B$YfjW6^btq^>)i-iI`uSXyl4qlaY1{-K^drp{tBfmQ=~lN~(TC_4zlMy1abtWf~z5Y1$%Q*^u6I z30p!c;aCZ+Jofscc<6X4g;GU1s+6r3rPKu!ixrD@ilgh*C1d1&5hH$-BUCKAaiy!X7&-D2BO4PDohIXNTU zwfDPP?;QVCA1%@nV}*p;@<;5F@w~G};s{In@$VSjM{H8HBP+E!niDGeP3L{CBP&a{ z-(9y=Y?Io|PWMplX6bZAr-_F%pQC*v;cC>|s3;quH>w?pstYnM{eTZIP%s$Oh^-zW z@(I$asF8y{L4>-o*D-1{G9d@il*LHUP+f?czPX@aI0y@|To@D#281JN_$svlfzB4C zX9!j&fB=UAhJiUK7ls7{3I?Sv35*Vq1|3m1$;9_}6G$8n!5M z5;=RSH5ZGbS1kEXy`|7RvaKv_geXJ~(MENA){|a34X`gn!*}p)89=f%E;jfr$(8uF%iEEY7wQ1K{bk^qNpe{ zikcFN8UqWHNnrJgN!-F>6A!-_ce}ftnphp}5!nl?vI@Uy$_`mEEq7u%uOM?6Jzi8M zH;Qa!i=v|APgNK7)Rmh>O&%9+bxT;)P#h7(D_-Jwox_#zNVs(ry^yPj<11nroQJ4= z5S?KXWm1j1a~Tv225*hfIm&n)8Olk>jD13TiHTH*g+j_*35Db+qGc>i(U*ZhNumXVe2aFqNGPbF58TTC|A|8qFP;yHAbwW zW6KQ+1_P6*BEg#xITJFGUT}!PnXw^5E@T#5$efLQr7BO4z0S>NeG-cuRRafl=6L@hiJC4T$q=IV2z$IZnjbGN)9GJ6@ce3vp(% zu_t8CYTS^qmdr~=N-QWe^)VKl;JBm?PK_9K<9fZa?t)707^g8alU`U|U|b%haiJrA zD@e>Ph<>s=`+pJ+(t5Du8EjeW#hrUK!^eFrQ4nY_hP)W3o{Y9hJ>wAu`HAwsKh><#U*w<7KLb z`7;&@^N`u(u-`3)uteyr5T1El5Smj=%+L@&(c(o)2c{^=!>;l)N+cbND#$ihrL9piB#3f7o|b=FUg3sM)l5LYpd z4mpl4-p4~i&a*{=-p6TzOl(yN(s)5dVtdfh4ysb>s3J4!uPCXy73;#{ zHsk9zQT(sFxQQ#1#gz>$j#hO+>@LJA{&avK00qN=TwVNc+*9$h{7aZGY|Mt;9;TV7 z#9FMN(EtE*7YI;D6bgi4AV^|xr}F?500mb#B8DCc3K9kc5H@O&;$RJBZe(+Ga%Ev{ z4P|a*Z(?c6@iZPZ8035@PO2?xeE2oC@p*AdYCe;lq7SPcWbANssR* z=-<0g@WEh7ShG{vK_4+1`{WE93YsXa|3M{zU|ie_DGGqGHK5_g6#&0Q;*kZ)F7-i; zg=J=ZN$r~h3RTv^}gk28SF5> z?F{(^^CVNXIgN7_*hdH1k0jrP6YRtxVdp)Xls7@)}0jpGxlj6Lq<9F zE8u*2`o*{Qe_0~l0f%_aWGF!Iy2wr^4;!|n)ZE6`Q17N_h|Q-S;PY4y1gj3@aH=B<<`7}VLSxQpT%I>}<{=U4-e;+2@#CY^T9&Eb(cuIW=v)v>PEg*%*hXI_e!;@Ep!R zOTP8tlbt&??89S^rinLpJGeU}!n8aOTA559U1#`RI+c_L3hV;sOq#U~(l^Ww`(%Oe zONVT2$&tu$*)?r;_U!LHj-uo@U-20wnnne_C_aj3gU28qze1)OWCzC5?;stq(9e%W zB`=l96WXQgM6$UHecsz@A05E#fzUg7S9)#o8U*{7B-lGz`}d{rJLHbg2ZDtb;;G;} z4M_9agzuLlg>*r#IV!L(u*}ocseV1fe9g3lZ_-xM=dZ+qrfSC1Ot_kj;MDsCCEo4S zWED^@N%bC#B~ASL$CB`rD%boJ%Sc477ABJk>=utu+#fd%C;?N92+`H9-^Ogr@Z1Z% z;qlK=8Fetf=07;4PdM7)CWgAI5!1xAfywS;8vUXh;M6)L)YE)k(bNyAG~|YVbCGlV zdIA^5;0~u&v}?#raqBar7Q=&vPVy@zDiJv#JyGn!E@_Smwh+{Y{p)HM%j(Y<#V&F& zI8rj~N|?YCoPBd}^K7SyM{{x6)&3SEx2+(SXvJz#Bz4zBcZ&P#fv*kr+_b9;CU3h zZ#RM)2sPZFTA=ABH_0c@d1_vLPB>Z5ST*GgEpQxXvpsee(nxqfN^qWV8q+3#OhK@z z>O!Y+hY60*G^no_41GPgZ%rsA3ODpC;?seppwZ0{?$kUgd~0$(j5<1V#KB{O%v}fJ z88?w_figjY9&S&YQ@gmu&9Mtsg|5^RdLvXbj3hGhM0Z;@dxQS{k(D;Ryr*9{VG@mr zH$-K|DWWBk2{>`u1G*SllfB2<-P>9^a7+AmMqW+mE~>Gwh_hnolJgmx=(gixF6I)1 zhc2t}@aYYJeU5OkLz|^#EhO$MxMA-2BMj35YdcTd-tr%Z50oan^a3JFOd+|;H7mDA4TRZpD zoGPf2g=_qqx=1#D3v2EO51g^V9qmLxn)wZjFoUrl9*y$0DoTtrQ{~BNLo@GXpKL41 zqiyRoW`$%9K<^zz156@u;3`Aj%_=Z_`YP!O2M@(Bx}KD61IhhjZhF>*ea0-DDp=oi zPO4PdHjz4^H|$g8=u!K^qDL|Tr-!C^@XQcbhHziIqh#+x5-lg6)>C%IN?#_xJ3gu>f{ME@9{A;&&vd2XnhfzAvoInG9kI8i^5=3*Slt#&~PX0oly z6L$Ngw9)YzSI9drdk6X}65bs3SZP`S`N@?r8(?8`u0Ufzx;Ct(Bx!Eid|in%g{9ZI z^fv1$;OZ&y&g)YDM0jCmDZg#V(}=0P%`AH$z@ZjPEkz^G@UHHJ>t_>7l3Ee420%<* zJ~OWiEeY9sLZ=nR(eKwjxa74CFjiI>AaVRh$(B#=Zg zbW9je9g#M8M5;tLXioo1(5g3p8~9`l-cQ8YASGGrU7VV1mq*>fNLT{KB=!V)thd(L&KYYe(R#r_?Y)Rj(oq7VQUcB!TI71 zwz_+FLOTn>-)O`XnS;5Q!+e!CdB}q*+NPvYGhJ=IE9Ndov$miNv@E`NmSU zzQT5icWE5pB9;N%Eny&*W9fSpHuWb-oXj<37u>!EvWO8J%+cw@nT?5U#@17^MKIHE zmT(w0=tS7f5tYzhsKb6e@ZY;1#n9!9*D{I&$~HxCQi0i#pGyQQD3MV19D^|GaMaSb z{iENPIpcT;!embZVUA9)eGq*!ry^uRt`yAZJKxIM#RBmkbf)c|5&(oO=yr1t>BQFMwg+6!<2!=0bwz( zwi2cL0O%M6AiEzjy-U>sz>U}pLup^4~j$AF!*pWI9KsOo~NPip~hn5sBv1u-3 z>DIzB4F^n+_a#80xajnR_a;V8_oknuBf)kfI5;F(2elAoQvp+yhOJyce#IBmUEU}@ z!RQKTCM&sGUPJhGsQXN$o*>E*C}n`kP7xs0VNGOg7YMrmk6($TT}BLSJX0em`ZO9$ z)5mR~s$&D*;WoexKw^l3Qv4>`Lu)$4dlrU+Au>H=;9sVwxD=!#%9i}I`K=F<{lf*0 zc=1N4v`({5AKfUHdcxvHG{gUx%%dz6nCKBe;R!_+IZgx>Fr11_=!b`2QSp0U*MdB_ zEr}gvXhsku5Sb}x5ba0)OUh4{(91e0XgK~3EsM$*+|It)Cp9MFsR7}f7WEj}^_2d>CriaP|*ygo@HapT&2vCi~4vL1gvB9Fc zwqvV>!Z<@%^~LJD#_l0ENaDsV9LLAVnsZ!XCT7tW9j-PhVwwmC!^}E?t9~#z4)~;v zWrYiqND7Nqpn>Q}6ux|fI1%c<7G^Mr4?VASd>0YdCHvtqoC1QBJGBOpQ9M+Lo0PN5 z;6hvJIt90Lxba!juJpY${uA6ZQR-6O$vf@9QDD&mpz3IE6n6ha69_5>?I?gTq(R<_ z>n7DGOo@jgTzY1pSH-?=$85a?F=P9LPSLM^6Q~!SLRuOcSk1ne@V7qI2`&K&MKRgK zKE^*uN_B6+AC96m6y%n#Pn6_Fuo((pR>UC%q>s$Y#gR^B=lbvh2+Kh}MaK+M6=5+4 zJCAdbvT1h$cAy4PA41MPq)TSI9^gw1{K~p^7Z+(4W}LGA)4OgL_Y^suJivU8!Qdxa zAkmady`Q>WOxR3?_YeSu)r4n67_?5ITImFYtCXA7;PV`28{7d(nJ|cVOf$egXH`)k zOWA;yMlgAZ<>Ifgo{}?8N!?f#>$LXMlqtcrxn~C}D8dt_MNDl#++LqBn3iggWsiDv zJO-f+@%s7u#vjud)IOvNT+^X@8WSuD2N;=b)y4u4*X)4v$3pzwhRG=*pJ%ygdKD-4 zyP+^A)I6WhqWX=p}P|5<>H3-D)fqipX@7VuP{`{=jX0ynCyrz#y+CQ)z3{ zs@YRO0qF{9;&Rvo&z3-Uhs)vsXcOONd7ohD`PDPnVF$VRU~SI9rwpzROLyIQNDO*5 zwzXz_J;IF@U{NWGk%?Gu!9a9iraiA(Zg<}De;DV|{e=9VP*#Y}wEKJ@<|Pg4sOMp5 z{7kTAa!xD+X$l3xMQl6~f<8BSIy2x|U^oQNl@5_gtU!5OW}1=ndQX0*;GI;!euZ?~ zV(@=2bRK3L$w5ql`dw~iWXTdHWMVg=Oj&9M1DQZw##=WIC-O`k0vJZap-gpJXkcpF z<{AAMtH(Wm$$tMd798GGNJRJ#{xTjQ%4H7Cc#HKb$||8cue~(r7<{{w$f z0%OiB8(dy32d1|!`E#uU7d{i*Pow05)K8)_HJH4dudNq&dayi=yFtUZqb5rq2vN+R zj3qKn;DAHEKakQrHbZ^yWcrA8N);{Yex-Yy9UzkofjozGLE6Z?;UpMJVWeNmDtA4~ zquPq1+pIF$qhO|Z&DVTEnyF&B*~fF3{r@|(AjjC77+b!UXkZ`O6FQ83rnMT|Qm)D! zX^sx4(e9sia4*y!NvRBdaYxq*LAUYdwA{8@u3Np}dhi&CRBN#IBOK}JoNM#b%-CLu zqW8j=NEHFQ(!$gZPgq;^-_H#NoUzFBnRqh$7-1}bZxTU&oLzs~{Sf-ETsCL~#bYqu zT?UF%Za^5SGo!JFd-+yAaK5>lZ<8iBNCDMQm1|xE*Asaoj)H>ilm@3i8Mr+4J8yb| z@vre)dFI>80ksXg@nke&%pQQLkp_^h68GlSr5yh{v^94Uf{;cCo&z~&A}+y~TEs9q z&rXgu>X`|NIKYXHUj3HrD#SM)Y?M+c>`p>aQikAiWZ;;q}O@Y7-RTw2S zFZ(qq8Q^8o1{4REY7^&1O`(*0>v`gh+URqrQC&CxR_>K3m(O38Gy> zO4U+Qhn%JO*e4FPSsg?cLiik@3iY*wPWaXs_wApKgmVC5p#cRPprmPl7J(;neqZ$>c5Z@;@AR}dh5ai=gYqnV zObe9>VTijY4-)n#_&>i~09?5U^a#=%!oh={mqJjWRmzu=k!W+t-JKN4$D~^vd5sc! z8$KgI3HpCQ5x!&luQIlg#0nyl&*rHGxC3E}8Bv4I{&b4iYieOcAa`kiZE3LX&iwv> zfS`P52muZ@7#jOSF6#tKm5m3K-nn_ek!ScEea1Kv{p_b9b-hN3ntPCkko)nKX$B8` zsjiO2sh?Q*j@er7_T*R>7X8Gt40vRsNv!xI-zMA%JtN1U%5C5QQ~ikYXp713Z;Z}T zG)D1w5-pIYk}NBQ@*q)JL6rE$@!@|-k>QECC%JNmxyS%hXDvS8+Zljl|mdT@wgT7eDly6sBVFwHC|6PFX^KNiJ?a7W~|wa^}{Ks zP4j;}PwOuqx@0ZSU(e=brkwqNYrq|DD`0?2HMp(U+!Z^~u*8kHm10?!%ML#F^9n*j zoWT`v0Sm|X_z!t#%!f^)8{V}l;sD|(z?hR<+%6a;idj#DVWXuWdHcT)HBXYQGWeq| zMXHdOk@b|e(z}Bp#7*IF7qA!7A~O~CAW9)PWiQkTVHmt}FOuLDL)5#369;DlA5D`s zL4gm}gPM!r^TP+9#vmS^Iwzb*g4=IJIrR;&s75K6zx$ET7N0&~0v(l(f~P}11Ti_3 z7(p!h>U5GxwaTrQEzsSQ>&?<3*{4{@Y;S=kTWUYt<8=;Fa-K3zPrj@i=8~q*$D3;I zz!H)G zuh}W2hJeAYhh9#singBP{uBeFHo{er#B=!w+B?PAcVoL04Z{q0=+mIf5gJ@#s%g=k zl{f)$?=g%sjVwFbcMOxgo}KycqFD6u+$k=j5>$cw8;_Km0LD^7cR}fi?(PP7rV3(4 zF(oyB10sjOVl<7%VphvXR(FXG6gBec{pG3y^O0^7$z~dL66rN5;C=2b)e8mG#+dfF zXkP#Y4sX^d@0NtWW?DU7>?8;)O!mZ1=Hecvk@PC8-B}y)ffbk$w1+~R9`_(les%lV zCzl=hb4uEV14ul|GjcXJfxXA~ked^^qF;%#V!#FYxL)K4Nx@a#0GKP1LrHNXn#di@ zU0CF$-$loKA%R7`858q*;0KT5IiTM_c?dIkqF@70&w`NyJz6I-+g ze}vH;W2wnmDQ~? z-WIf~)(s}K=yt#*e5t>XFDrO1GfisgOVI4DFGSwHy1gyR1>W@C7XI+I$R@uONs5?Y zc$*Ldfs}Ex+u~C2E0IZL+*c9E@#~AywOBWOaYYIK`Vu0|qL@K#&gA+c?`=Vo*89D_ z;t?a-ZShB%zM{z6;MP?!eMwrKzU(G#E**Tmu(ySe zw*`jf5M?8(y)6>Yl`pr9uRK-0vhaM}O5mAI- z8S_=Okgr^+X9n?gO_wS11;d%f^&=!-ijpH=?k76eUIrk(YTyA8;L?ze{2d~Q5I_P1pG#C^3N;&F=#USGBX``Tc0x~8!&A-Tmy z_hpLQ0+oH;liGcG0=h5a#lDV+$V9`wl&XniUr+0(uR|NT#=gkvzC?yOZV~nIE{}bsl7t1T zm3xsh{JMb6ubaDmX#{_@p|RFTpEUPhA6fu=`3IN)XTTaE0*ht^HlGGo)gD+ji(rLL zu$CGNW-$!*aASRg(>a)de6SOM*nkFeyo3b;3e%?Cg1sutv)lqU3loqRR^eh;bk4B) zUc=4ud|r3Wz{5n^4JylD<2m|G;nb^@ysG42DP38#V^mN~aj zmKb{WPu=y2Z9R(h+Ih8`*nncOBVUVYpoTh?#Ib}G;;64jl65RwpxDmlQ)A>eYzC?yt8Q+A zl0dd!w4fG+tXtP(E6y!A(?n(yB!iK4f~CATgU+{nFC?6=sg;DXii2B zKH0Q|vVo4Win#^KFJ*f{W!t98vWu*&Lta@?ie(bpEL&(TyZ&3&ujsPBxkaFO*%JCP z;Lk1O?P4!Qfi`218kiv;&oG0WTWG~>B}tFj-`rxi+`{~h*_2zDTSPuhX7|3#Xi}p$ zx0q*>84v~Ymzk|n4CIElx8yvcac0^$VQvA^>&1m?4DPW-OaAS(yEpKrust6mA9DIYP?BY>D$OF~gWJ69mBQ z>EjmF8T`4IF}xxmw}9k=xkc9q6&qo;SD`0nf7hUbN-PPZYa3Lga!f6t{y-qf2^=%Y z5|zvdy3AVU7WKH9jkvjmI_4H)7-;qZ%Pr1q(4<-CEsU{p3o8^9Xoj@hLK-xicBR?E zso6+sW|;<2<`(w?%FX2#zXYfm>raqo<)l%wo7U8t)uK;R=ou2_rjt+`vVqPvn{d#D z93|;vGcBzdOqpAN5XhR1ia}sQip{)XZFY}N3vIR8Mp|y+;>0DcVs3G-&GJ%C4K21= z>~afLt=wW%VB2g0%Pq=RxkV|t#nDJPs-Pp3TX0>Qc{4XlqqM%+jc>Lrw_tNKmegij zxrI5P=fh<&hI%iz*ivp0gT!)+X$+eU5iU04v?;g92xI_|KySZ{&2DPV5ONFLO>1$V z+N@c|Vzaui+3^&c-EoU4g>TDujDy0MN=w*GW89)rh|M%7tywy5;p3$uq8go$@%Z{;|VHcx+v#A1{%@4O&$uUdP->iMV*;?N$6>ec# z9=aJbpuX9EjfOK88Sldx@QPH5#ty_8>xnZLjb7!>a0?>@a0Uyh6orTu_J~{9I}qT^ z8xm*rHQeHCqrywhAiOz?Zgf_Eb@pA_*{$!L#l$Uy${Ekd;uh2MObhmG2?(X|+3vJH z`zrbwOx!~LkhzvQQp6e1@ZuJpiD;1zwBEP{CyHCh7&K@hG#jhXf}Ek%o`)7!L_6Ik zTGm|A0)f#w;uhGX(f%Vx`-)pc?9ncmutHk3BW-A1(hz{srb(ssO_sJcURt%qv;y3j zR(wq}qv5nbtJ6LX^E3hFr{#hd)D&>2P46AL(YVDNq$WLq;})!xn(H#P4RQrS0lIZ49QiY4&Ohja%%-wMhxKDU7nM;AvYmZri?>+g{`ryUg82M~8>u zYU^#>Q@D}GEvir40>*J$UUCzd%dNnDCEt?XWkwVy*0)yiq%_E+(H!X&1<0d#=;O4jayV{Z|Y}n>11yK*u9lD zXK{-<-J3_;0yKQnrfi;!;uiljjX#TTn-Vv^r7ON&>3oBTTWGFtbu0XqpnmHNx4_-} zZIA!b@I1$C@z0*V@4nT-o^p-=!kxszI zEvys*ar(H$0^$(Q-{FA9E&ND`@|89ojx27mdBfS7;Z6y(8g6lQ;WiaV&2ZwkL_s6n zh5N|G3@6qyoRJo80i4c*WVn_w++c8vg_C4B*SmSwpnfdT!(BZNCkC|vB8-H=Em$;q z_uvM+SP=d7hg)QXTY#iw5SJU=LjGL_hD62cfx<1;NrE6wEx5(tw=}dA1qX3rUW+A> zJh(-?D+{+M*>H=uHH>CT`p)u2%;dR;GZ%7iVCQEMriJxax>;tH@>?BWv7k-?%xU<5GdgP0Po1m_V*A zZh;qa@l)isH%G3vA#PEcB~ zS7$0aZy#G=0oiiV>T-wWmrMRIrvPrj{$CQ@LV(qUTbxazInIaX44}Ejsg6&xK6B$E zgJ+Hmx8Nn>3b$ah1-sC}E$F74YKv^5Ez}$gWOGR;fvNPsE$XJr*@H3K$LtS03EEuR z@LC++Tq&1(bBTXZGUUw>uqwBTp*IIdk$!u1oC6CXTBI!fwpdq6a_%*WZKX9ZH-Ma5 zvir6;MduPi=LSCKdVgC~1siO=E!u+<*aKGvbPiim?DB$`Te#bTf}C?00Q`cysoVv- z`7mrD?90~MB5N!9ws`ipMVM3aCT_W)ExaM*P2QA!6@-iO8pDCqA3Af{;^eo5u2>+t z2c+l%zAeQ2ZJ|$5MyHS&U5^CnRM83T%QA2a%b-Q4oF7r3_R!K*Gp36Mn=S!vp>;ZP<)_PYsJnbyWJujss;N^vs{5W*SMSv7ruEfD zf2>=`vo3jTouF`C*4si&b=`OKx&-{X;#{z^fWvMG56Vl6Z;Q*rE?ILQ)!V|s1l5Xi zRo9}}-WKhtZwsO{qB!g(6R+Rj7L$xMC96PS@9rqM*f|)+E~XybqC^+Ll znp6jQRexLTnq=)XJ{9brig8^6Vx-<7MQ$w4+U+ zoFz;<#7jGcAwp+cY@^Dyh{tS;T4Mqa+7>s}?te_6Y~Iq&K$v#*Y>PTnyO3|;E}(6} zrgo;PsNHbRwh)K5g)~sRB~-dLY)8gwI~3CGn%WkX;@hPaP`Yqe2nLS3vw@BPE+lOC z(6$K3?uG{Fx4Zk*yC>c?*u1L->s{UN-Im*2?VRrdW3u0KgYuO2;9=>kCp>hqg(4r!+!o+0q}u|*#u9yCB^Jmc$) zcRe0&us~kf+XCx~yu`P~D0$BhP9E0VLhsz(vtQ2@xFhV9=k>P8xV%*d<^fFR-5wy# zCFLZ~@HlV%+Pr%6IFB@t^TNC>MsDYE*=<1+#6-%S=e4;%WU^iM&MQj)BzI`e+xpI% zg@xxC&v|`UHzGF_&K){WiPV_>=6!ct^i)UzI4{LF@7j3t$OhqU@setuS-=eY>zgNl z&YR}(y!`WdUk6%CcE`*^kD?dR+d`yv^xUKdp)%=Zs9t(^GQ#QEh=Y1@BuTx#pG)=j zC!>0$P`7&9zAe~fJ>%aNkT$kBZwuz2=d+zO1P6Wd`?gpO zaJcU%HPxu}dGqu|mI(bEK=f<5#4yh^ zm(g$BP_}?4*+SoB3sV7Zd%C5FQnJO<4*;Cj4*k&7)=Z;`cVwf7W)0!f~)yQKZQVeNWU)|3u?tWSb?OUjgfwcT1v#x z&jVO^wkXswXp0J&Z~ts@c#QOW9sLq4fJQ$aXp0O13Ehgq9dPt>HemFFjijRAM5nD3 z>VBWH7BJVWhHZ=$Izl|r&rJb~LuiZl>;xX<^t$K=e>9?BB?yw35P6Lr0T4o47$tPy z=n?%6hkkRQ!H%}TKf?)D3;npCV7_$f`$#nOTh9S^Kj?P_`lWkf%gV-xuKM|@pXl?u z9us0JLKba-YdA++>?di9ZQ5w{8VG>!3^A0)SiTDMTS;3`e}1xky>~N98T7lQEkXqP zjk%CNzfYf^T|K`@+M*aE3KGw+FUZtri=&`H=ZB{{#`)=PJm+Uza?%zbPujEvdnf}S zjzt;H53=B;Ew(6l^ZS#wkT2Sz`a5B?MYu);Z@D3D@jm3~dz{~(DOMFS{Yofd<(nU1 zZS?%qVPo4r^*kJHkz5WSEH$llwS^QF$5(=Tcpy~PM+03NtK_d4+TbBpoNsQMZ#!{hD`YlMENDr z7V9&JIFZH>xr!tO5&mmu0gv;4{rr1BGn=+PFQaL+6#iMC)l<;RA$ zFpi4y`wc}~ye70oSNU1c7Iuehp1Vp3ZLuQd=gTL8%8#og+9E$r?>T^wX)qelul%Ih zTu+OEL|gPiTcoS})Q@NjUCMR~LRwm7V&f}6u_&VCPetX&M*$xqA|*P`4V9m=s@bB}v~ntek~VZL zg16b?W2O9%5;BVv#pdL-fW?29_2?lTRd2rqOk+9*&=lV za<<66vxRTY7WO+-_>d<*rb%x$TSR_E&KA-d45A^zCJ8sG_H_44k7&;p!3`VP*+LCSJzFHYE1)5OprTz_VP}g#B5DuH>a#_2 z4a3YBPM$5s#^{#gG!Es5_1Qv9`EBaig113FT;5pkY*D#L;HHC~xFmIzpFm`tE&ft| zBB=87xOU~Y3m@QY0s3YOXMm0$&DlcU@GBw?$nq;~%WoMsTY%V8G+Xe8yx9U;7-}cv2B5KkUHRQZUn@sO-|VX38&)Tie&lCL3@SDuVrRpgxP`^>B|cOZjnWw&3|6qXDn&0y|88S$@{f zww|@w;!ORweWGu`UlYvRwlI3Sl|@g-vIk>wEc>pB8bYhQRsn2^i-U~GorY!TNpKaVQSuVk}D z!!)vB(8N-;{0gr5NmDIWq?_3y8O#>?E?bOjerf@jEgr?E(`AeLV7AD_nJqG-=J!Y0 z{0h4HMRgeG$6T}yH^1`YaDL{kW{bGY7VzfrWV0d zw%GWUEmHj|Lgq(vxgacC6!&XFPJx6kxksIvM*y=0)|lV?%oZKX{J7rCFMc$?zeXCZ zO!nR(b!^NTdE54(k^O|zu013#TLm?^ZS$7BF%>`VsCykN=J*$g!9X) zq_)xu@7oqzNMk<;U{@ls#lf3j9@BKP$?_=)htNX7jT&oS%ViegokA+AFpw z4;Dnk#TMakerNlv;BP^Y^Lt`!F?Y8V-ipO_ev3@MR?zZ3da*?^@-$T82-v+s;QSav z^oX(9MrO*`f}HH`n@4lr}#~W#+5G1t?pT&9rZR4sm{*&H26e=Jx}+ zRknDiWs4ay2)4l`;{2+o7G)x~Y{4#~vPFdV{mLQCg7afQ*}{U!7I(=Oc}BL#Y;R_x zWQ(tyAHj(=NeP;4kz5`{D)u$1UlO%J*@FAZ7CLW4Qnpa{y0S&vX_GoX=>mF)H)usi zLx!@&o#M$Blk;=gAkGiqw5r69TK-D5;P12c;C&7PPK9MEJ=)GF_+wOAE}5$~1~Ty1 zUVz?g!axSSwCI!q(lG-WqG&tonejr(U%9nwYU^)|3Yp4-AhdcAMG({@TgWEHuzd56&|Biahg_;H@JB~_sLijo zY=krfrHj>uIoU$1sOjNkiw6ip7b5jVLF#-R!oT84MNxWAwsm0BZFc!m8sov>n)MSgHED=XSop5j+?uFV?3({^efNL3vda?yEM}fR1YzZnDydqBh zo`_}exhG6N$-`bRvPJDq=>fD;9wOAqVjvrp7qqDlOkz`atY5z@nn^uTx>WP^S}(OI=N2QY?_$6rwx!z#R7zD2%gW{amP& zPPQNxl%#`~CMKQw)wGSqlobU?No@{}KIz7>eCR;QoOZm8$-Lf|; zOGNEq89_l|NZCR-OyHa-N58-e=%{1_ z-ya2K3+;z)&3qDqsX{;RtEy+Ev=!!k+*4y%{HY0DN7`VMHT zw!I)`{Zpv0IiQeP0&xFAz_NwJ*pROOvpMI4TDGVgt0%Ekz5VTA%jn=?fLOYjxo6oz zg&(9uBSkV0LY6J&p#^BbxFy!+g#e+JN|S#s;n}=Ef3(n@LHmdg`{gRY0z_r1mxQZuu z*}~=wMWlV%A}w*u;p)c#{ACN8?W0mn{sB|-u-at{dNwGhAR+)EqrD3wAL6_C7bWlm zcplgA6(QcrWsB&vA{xAxGt3(!Q(?(vi=-v0(0ta!Y{3jI17Q4PS&rEP&#QF>ppn_4 z9FsZcum9R7ei5CwaxAmOSrYckF)B|pTRb7zw#_OZf!>n3;O?rUT^1Ku8u|cJ+N@W8 zW(&PoqS~^AW=-C^{r26dmRm�}hsSVE~+CMcs>des(pHFey&EKZZyn3yVY-;I!1x^2Bs7i*^; zG7Z||z536y#Y4HEWMs0jjPAdMl8aeZPc?y(Q~MTF#6@&?Zn6d@<va9&vxNg(c+uy_-g3~;;1*!32vZGsC^#$K6+Bxo)V(IwSdt?yxP?U+ zjXPI|cQdwksLp)E;xxDgWwHbdm67M>TB=HL3-I!exmE}b4Q`=GQPi7CsjYCf=aka% zvqg37I&>=quq28JZed3GKw+C;W1_qWZeixs+e6}c6Ne>}E}$(QxwMHGiscr>=!Y$2 zQDZlL8S8%ljNyu9YW1gWdf~Um?ZBenbX;uZAgii!*G2VY)Z0g=qIm&6_5l*{0u7qV%LtY z`6p2-kA6pR3#~ql3*Ttj<>A*QXp1b=BUQ6p_%u;)3&rQsojJs^pLn?k+9ExUItaYy z+5!axU!W}%O5v7Ex!qIHl>PsC8Vb0Da=^6^7GsIGbON`4Jr5cIoG+~018#v0Z`l=t zl39LgfLn;nk}8Vw--otvzDze2XVIu=3qIa;QtYBFB4yK~Q3F&+(H3m|lMjn$NYy41 zkCWsK`B=a$>}mhRwJ02f*D+GVC$}ZgDl5q9XV~Glg{4mB?YzN=wosU0LAZ}3A)4xh zXbS0Eu^jd)=~_V@v;AHq14+i)e&tWLi;hhl)pe!FIp!UZ$II4*dn!ZEm$aE z<#a)+wW4}(3xt0gz-J+VB8RjEf&zOl0#4FoyZk=H8E@4Fw{R71VLyquU<)A8_pQOV zvdCdx+KPi)K&|9N(d)a;I=F>$$fs>U0z-}wl~d+|Tc{sw5TIrf{5QA-z<89ZU}-_& zjaRLLTe!|}wR#uYLP7^UrC;Y4rQjB<)z!a64ZAafM1k^l(3Y8@Z61!&01cr(si z8(J`Ff~<(P$e&!hwtb-{Mq4XzMuQlFXW}@7%SDxCMXsw}{AGV2fD$q{O2w zQpg_d2M-NmYnK;s3)G5FiDcpygkIAVeV?ZR(AKf@h<|TcYnan*@5dHlAJf!x%`K_x z1e^L$8KW)oeK?ZKMPcDgZ6Ra^hgSFEx_`8V(uF?J9~OKbk=jD@PeIF$=k*7G@w@5QfqRq%CBbWU*3RJFr3C&wbAp>OZAEo}w*q?gbpI zH}n@5hVzkVi)X*aYT+P~ky0kwf@813SYu3B;@JXoav#gZ<+w1i6Kx^)huqcL8ALhS zA~U3@5eq(;7;2tlqb=y!tN}$v^LO52nQs|yXpy24M_Z)Sd3iKYm5XR-I9qVf+;FE+ zX%Z9_@0=|pl%HBsg35oih4hCclfay$M_a@|#7x+?sarM}XA8PIq-7rKrW=M{u(SoK z7oat}_H3d10RWnZj^;f*wR8;T8Yh%o{>`%mt5({CvEj=l4EmAgE@_MI#C8dV%o3h4 z`nS#&&@%yW%wtkyXA4}AQf-BZ;WogV%|6xHf_%do6{X8C*E?G%S1i?AR%i=s@`q%& zSW;{c0zVawCvCe2TWnVx>`tq1dxFexfZ3o|55+O{F*?0O;9*N608po9BV_ z>!A9hE%1o;pb@6lQleD?B@skBtA_u8a@p6rx>e+(jF;HY(;R=u&iYia?EhLC%3$x7-3DgCH#AkY; zM0mC^=M2y@aX><5F;Nd1q8Lq}LyF(yYXLv)DSO~uKCKqGvy)R7*9#UF(buyDamfZu zA5yS&JFSqF*NR?ww!rb$ez;$dC)KkBG5#k`F5d?tfE_;pk54g#LhVhAGZ@OEoh>YL zB%#G4!c^Ol%|fRQLoeDw8vzQI|DgJOb3|Jxv;{XWRkTHa%>jEKJ6kA5%Vl5%|9dvL zfZhie-&C5#8j7|!yU9aLJVaaQ%BF%^h$^AWROg~CK>Ap=vJOBwFYm$@*`uN3B1MS5 z7$k0Di?|FZLDCVlMaW?-b|VR5MLnl|W4Su~p+wtQu~6hYTUcC+u4mBpP(D^ZTTn7S zo$+SLt@_yljDX`5c$%FpjAfxA5$&pI6;#*wK{%f+^bMyR*v}S22OLq?l}RCf^3~ab zE>PhR=%XNdqi?EJ5g2y1=yNDx33aw$OYK~9JVfbk3WJMZpd)IW_h|sLeX-IK^lXts zQZad~5S}fl3$m@_X6m9zL1zm)7vWLZJdsyi>})}GK}z(2{YsE$3m(=uc3e`1q_YJd z3C0Fz6rqh-A-W7~uN-l2h&%4mBVimYXrlz;&EK(61-Q3b`xLB6c|kM*s}>zb)wAeq z0g%N=a|BOTa>>V+XA42z0o93Xn$>yT5ItLf;$xogvunBvTxzKWn;fSbG$cL>JDx3= z-=F^)k^|WZz%WVbvcNryqM(6zwpiVsEJLiJIx0dV!}xa##Y3L7``IGHOCY;dI{Co) z&lYR7u%NsNSjPui(8{P%Uqar~EUUS6qZcO@)y&9e3)y%rTAYNri=QnR3_D|>XzU;2 zvqhM0L>p90LZ22bR1q)qx@O}2_U+e+?o-(o1Z@FM+}K%6C|_A%x zKkvfm9~LEmw#ZMO=dr#F&fsA_PN^#Tpe=F=mIwr8OLpBA5wr!KQY1`%g0|R*IDjy6 z2Avg6C=1L|w@CHLg_DyC5bA-p-~#_@6y#o2SFF?cGhheKYCH@C+G228p;OaTCR$*G zEVy)dz(WiJZ}Nb)SXm`AIYlg?MFmKFoKE>{p}!L-C(kHd1M%sm!Os@(mY!6hEkb3~ z`0j9_lSjA$y?Bwm3qxCgi@A1Rel0V>TMWySMNLhfk}EB=g#dA@%0_IFg?S3G(@mNK!!V%g6p*_@QD+c&l`IJEI(4d1vT?M#bLtB_=t-s6#`v=#G4Q9d1E8JkI zGGcs^=TZ#Q!Gm%Ieb=+_($0Iew6>V{yDYlU7IC$WXlzr1I2c^}fNp@GcS3}=Q2aLz zGcs9(LKWJg@?D6Z&{;Vy7ohH^2=3$ZiPDi+nehWdyJ|-vZo%MLiq}tQm^77(z(QY7GU(82+J{T|7t5^KwCru^UzV$h0BWI7J4)~ z>!zW6U<9|6zjp*d0%a&Lb_o4V&=wgl9${vC47ITz_7)Y2+}Oc;;j2O8qAhf2 z`_44M7ZGhC>Nu*>n)$%gw}`fgWv6sI2j;OiJ~z}rM=33l@+@}|!3!!Bu)knY#|HNi z-Ny>%(;_>e4O!G4KTyCRiv5M4Sh19#B~~ zSU?&P@dID{z!yL8#SeV(17AEFbATV<2lxSgfFFuVvE?qfPdg0 z_y_)h)4heQg{_6Hg{_6HCCz~UErP7(Ipd5o&Ny3cIOB|SAdxg`Io>$kM(sAQTU`;= zC4T%v3K1G$Tr<#w#9*S9f@B5r>3S7mV4?%akXb=XomeqMZ(msaijY5smQ@cbMsmE& zV7nUw^EY5b4k<`bD5;!=_RCmtt-O2@Qaw}qS-Kk|6Rj{&p_t~FUAC<56d@xRS0B?^ z6S4lK6(afP8!0T4QeB$USU<E>>KE5uVwziA zeX34T^69H&41Z@hL9tNPFr^qqg{O>SmlK^rl1J?~BgI959&qR|V`760Z6+34Q5(r9 zIh~04raIl%um%$%H&#MM_*X?NB%uEK#3I*+VnXeOIIn;C!;x}e_^}Z(pi<2&eB)WT&jrmIk?19 zOg9SZCMne`94#TyB7bax#-~VOm7r`GCZ!f5Bbe50!gZ^ZV%pC7uK4m_6Bkb#(J`Qi zjCetkqlKkXf?tIAIjA6cu@YP1><~3vaLlB3T9BM_tgL2;lwj0I zEG9dazqI&K%_I*jU`TB!ld56N_!m;_LZWf3#6o`i{WvWtn+6_;Kn#p@g2fdRtwQFX zaOo;4T*P$SCTPazA*I3dNX>=l!}s#Vb|)_xhric5$ZGA>L~ zHdt6USX?S-Ba{-IqED5b;$~NZNf}&ZC}zKm64VSVtrFjD)uzi%RkJDc>SH_{Lb7kf zko53kg$EZXH_*^lh=^kOii%5>6P`m0mlHAnhDxf1$jF6>sm4kxMO3d|vko`h9DVoH z)e)ArGfq+@K5U|;pN!&=zNLj!6+O;EY|APy8O0+0dqR?9TzQJge%)+H1!b_)nok;* zK4YZRf;M_lP@dW(`z94j&yBq>64Ool<2NfbRxWHmy{mF?o5#wcIAzJ^Mm}(kQ zpv++6!~r&DhFEbzW5h(W%2h_O2`*>wV}eN-mOm1DWrU1UxN??}ETdD>D(WStm)&YM zX+l~hCVa$ySI~SKCn%ScjZ%_VRCp_YLu#3u;JSg3SkT2p+c-hRsCbheKIz{RzWvK> zq>pb%q4MJDPrPs*Qq*#=uuQo4+8>jQYTqSOkK?uPr-8CPUiSaa4P&HIeC}jSLNNz#dF>v@<7VL=NqWWBou+EEge1GL^cPkxh>x2}K6kUjM^K3!SMq6UNs$WTB}k^XrB{62sEVnUdGRNxdnTG+p?GIWc>LsP zClYd1v#FxbR-Ml9b%w7gBDtkx!)%onHzU4#gC%xS(rfuDqN^n#Hbn%l=yPSGFWn94 zVVYJBtI3#Ms*qw6ku2likz4L5SejLS6-oM6hO9Snl4VwT&5vh&%(BtfeTw)mi)zQ= z63ek7i%Ib(qZy{JsTwuOrO$#Z8+G9*EySjv>{;)oq-v6qOj43bO!bO)T_KmI_RGBZ zlaVYEYH7O~+u71fj#{x-L71JkZncCYi}de_9e>nAxg@Mc|J19=t);^zrJ7}>n~-c3 zjh^B%HJ>H8)Xh)^Keh;R)oE>KWmY;0SgFR(tocN(p$>LX?zpPY)m);0?Kq?miGh-$ zk@YdKJ+{B0b)-q|?KZplnOw0)H`ZLDi1{dDqniGX){sZN9rZ-6SbE7C|C0Fc%T8f- zI>XtMJN_vcdmY!~@T%y-T~kbw+>qpsqBZ1C&!kkx!2A;xKbq0L6-i39%POz&tcr8pCP`?y4MtK#_;vTr&%&OYReD`(jds)HoMuu9_Q^gbm;L{5hpj^7KSxV4|BF2B3%eip35jtla*M^MXF^%F#L!&#_)?KVnA zPp#;ROBG!1*(q;Zcv&hWH3t#pNt- zTlN}Kzy0j`R_xob^p2^R3<_qE`g3Z%AqTW%If;RZcN6>C| zGRW!E4>vg(?8x6nq=KXL%SX_kex-FpwPs63N%;4~k7>Khvelji{WjFkjaNNh^<1}# zdPfyZw&YTzdaapsA;~F!?6aT=iFVm5i3LwBD6>tGTn)KV*i4#OkVm&weZH(ht$StB zsi_@PZ<&J4k&qms$0k-x!J|m%O*!E&s=VZfT{LQH#a4}$jAYl%j$CpUa#6GS!dcg? zidxask|On6&E?2X+hy3RVT(RpOtOj?&tkG;c}sf9SAB}~@rpi2MzBkZf7xkkHb*L$ zi=KA-csq{_a<|C2=yar?NBVhWe@ktNm)$*rTy7J7z#wiq%nnG&@z_tUM>o?7rrMDu zpE(JNJq`;3G0iNWhW5Cv==9{4d+F66$PTxVkUVnFmGht+M^(Qe^~BB4Pe*tIslQMC zfzA%d$oYUjE(LK^5GRCw{`rZ{FI0Lhh_iY?=&f;j>qZw zKtCU^*Lk^3{dra{3ZvB$3*KNSRBku;!N)Fyis$De4m~&t!b8p|?MCdVm)!hyS`f$O zICBV+J&rzteAMI3?G8I7RV1b0sVz;hT94p8ay{CeTrxJVKMLMsCxaljA7q+Ce^EWnOrq%YRS<`s^D`4moxok*)9n_VfN~()0KRlUh?FQ zEjlH+BcFaT_?g8mM?q05?&kKVU#T5WE}4^Ck9t1JnN|5D#9ae0DA zkw1p%Z*6}~MDnXnLuF@&pE}&$?o)0$OwR{yioa_5C)k^xC>?zi)I|`?ZAg%g?S&US z1|UHC@t{8r9)9rfqmvt7ayr@3;0A{vv(r&>I$EzYb~;|p6MLXKSq$B(w5qgjiJxHvc54i)`pyx+B66*0Gh!3|L+)U1gxG6D* zAldVroEKiV%BoutOX?-pdNw3T2kQCA$8IM(TLjtSM<+q9m~FjiXxwNJ)OMcO`|zb_ zlU{#%qSFhR-#v1xr{nE7waBqur}a8=_`yd|Y8_>9%A)nJX#FDdc^TF&D>zj^FTG3sKL(n;?1K49--#FG3Oo?cUgmtnh%r=V(HNvvsd z%hC$AXmxeBsoEvE=ze}AmTb-GuZnuf-Q&BVE&dYt68yMD)M~{Lm_-w^#$OKIfNV;{_tut~y zK3*_@x^>#E<8B-p1gV})+5s^+A1LVa@j?MQUT`5_Nt94Ndmz;FQHz|}0ogiW0Cm7n zdN}IVAvqoEwt+uT>H$GHA86;}^B}QyAQ|*b&xg8!nBG+WIQGLKKT4D!9qVUfay&{9 z4|DTzayn?xgNvYe+q@qT_5*@;JZx~|$!_*O<>rMGF%rpW_tmiuJuirpdO*_8M)pAI z=L7wCz+Yz$L8G)xvF3k%qLnPYC@yyT=&4-i7Crn3qCZa^Ztb?Y$4<1G_xOz+5AWjz zb^}qhB?$#%cuU(|QY-T4hm)TCf!NN2en4`PQ@v-(J>`yrdOS*x2MY42NlpcQu-iwE zezMnzzl~`1NG#~1pNS1kY#2H_djy46@B%I=f*(_y<|ZhIp3upS@b8JJmgR9Rb}8s%4nL!{j6YEN@rXZ= z9p!ZMvq!JpI%(&F{cK|I6MvsM1kIqw7B_tC?vWF%BcFaW`I*H}uZq0M;o+waIa=&= z^W#%+7D3+!45`P11#wsq=j3?29w&oc`r&{Wz=d(saf@5rad>ir)obi-O|AK-qCSFT z59H*KKs_Z|^SY0p5V_?ehnpmRnx==tl^_A~f&oxa$LxHdoDw#;ksuu;NQn&w1ArhU zI1d=g&t?R#q7`+w&OLgk7v)Pb_BNOMpdStgh5~#b9c$-NK^wUHwA_c~Jny%$-G}sS zxDOKL$7AHCZU>^nj>Mk68QLIsc0fQR48Xx)0Mzrrf;Q*}MEd^nU-|RI9;XFu#*Ig~=?Fhas2hlGcE1{~+lJjXB6c*vXG&&Q^SYPa>~&`F zgO8wg`$#_>CU^~@=zf~NdgA1Vo1zSE_}J|wD1)9Dm!D!*BI)H2`q|>vZk&(fQFc7| zvh&Sv?m8k>_yfV6NA-Y^n~w7H5q}b08}SB>i}(AP><>(jkX>I$Umpmtk&>u;)QP9`Dz=$M5Al?AEbGZ~ivZ)A>9| zgdZhJ4+!jeV(+7VK6ulc*|3Q%b+Usw5cks&Zy+_;(Z_A}I6JwyU^5rFxBIx>)^eZr z(_uXvufz)@NQtxK;gx{l1498`?lUsURC|_Gb99#W*M%P>=x|fP>2H2#$7AGppq~x; z*{q;W%WbBI<9U!M!ER_>=@DE(ARnhA{CudMXYDq1`H>r^f7KLU&%qB2@~A(LEpj>O z{psj}I9>+~Cx~;8U;E+Io=0SYC>A}nY5aX=(DQa1)YBniOMCoSu2YZQUV3}kg-j0* zKjel4>FE%?rr(})2%6ceiZ6%cuBjzaP)FE#VeLTv)qK4!H^o_w|EZ~;WbA!bk4M_^ zuu0GiFeEg%oQTqKFSpYwl2q|e#a4`-Qc&hVVvj@e?{4Q|HxPRSiCB>(uX^d>B=>R~ zIo!Z7d7)^<`jJz)9}6D$vYSIsx`CwI2ON5G^NYES$mC=-3bR{PjEYq71c#=W46UI| zb|mOyMXRltJ+)^D6U4YLd&#PX0b5w;Tz{yXmc)N9iGvZXUYHmDrKQif+e& zzfKKjS1#&u9&=NI1%bR>Af8X<~nG{qun;K_i4G#x^>jg zhb@9g?)T+9A_xhRWAZX!0>szaF1SVj&~D8y(mqWMJDKz z9#4Az3638xq#h5Q<481fZ$^{Qb!ux)NMnDpj+fhEV)`wl(XqPNPrs;Uq#^%e7`M5vm^J^QL$G= zx7&;y5@V-?eu5|$EwQA??V{u`3_feGLwg)}197r=uyok zi$-Da6Lv`GYG`uRcKe(jkXi)!CC6e((@XN}7h*%aT%q#Q{v+!6=gvn@#itMWsFu=@;YM8w%fGb<`kbJ zJ$;WGiT!A|dV*A^=xq!(dy`YQjvVzy{(HotDhPx(y_x- z2ZZH3bI94DXOH5#aZGS3+iBVR#2e?`IJ4&wKVVQnAan>?KOgz{v0KOFbc~x4pa%?Q z=L7YCcpfl#6o3F85(QX69J$-l4~HeYGy6TYqzL``^V`jD1#L{v2MvOBvJ06VN;O{& zl!87n_|+m#ki%YoqHXM}zs_d0XROKdrpAU5Ri zXGdB=QTplR_N(3rug;8I6&>ACFO+_!Ry4KY3i9|@uY`A3e3=!Wr8gD5r!0O>@T!;M z3IcJtkDc6d(Q}I+ob+PQGmoGh{r;5p7esc?*+&zLqYj~Q~+x+N} zJH60ceZteJI4!|uJ%aACQ#(#gcKsRNBM9Y^EZB_EtX_U9xA8b7 zK99!;R%y{ww~a_ipZzwSI4utJK;;&oB&|EV!1|l;E5t{D(JSEf>b~1;6APiHVb~_JwhM2Ys~Rd> zgHwU+v-CrAGZ=Zbq3@@p+IdpKL_&rYLyJVZjYAaIlRjoJD}p)3**8%esKIok)(@Ob z|9}Ag1{XZ4weyh=nRmiy=xPR&6`?C;!jKWbYjDENYM_(Zc!tw@V z4RQMF^*XWk)Bak-@$WYw;&w75^R~n1Ayl1T598@mS}@swI^P|+)xeUIXVsPglXFL7 zjNI2Ds9d#1YR$$xu*?V3MsR7g0$!+pn{7d*$E*WH_GoRdGN)*bH?p{d&2@C}{4+J6 zyVLOPwysv*O*_5U9&?CC zsu~^=s@H~sWDUOSP|l&p#?#RuF(o4llXnY)&g&TgO}%{c^CI z*s_+UNp7Uu3iko(I@*)7vniTN;Z*M_DH}NOE$)M&)PE2Pi)WwhagA3o3qVd=^R=4< z2ijmF0orsq%w>zLLG@!l1QisB5LX%9DaZH1GMsuX>rHTbaMOW|9FxF!sEk24l(*|~ zK1HJGKiQrQ4J_VWsC`o2A8ANFiRE+lWAMbOcasZ9UYV2}R*8kbw+fR6NxteTjl_`a zuI%-(nbUZRs3;~nMrV~`~FM;QGHrrEgAs1gcT!32>oz+()SQ9#LHw`@P8&X`9GM2+=LaosN6BX$zsWksCdk)`P+7vc>Ai&YNu}xhP1g{DI@|3> zm4nzs#*=&8&n%zKd0e5@pn`e+8qUzgUUlMgSr#pH6^#~RUOSJ622rSf$@$A4l}@co z$v21dhNSU-^0rOeA>#ZDnsM=JvD(KW|62xZ&Og2>79IRMN1j-B zLc-F@w$>i!h$@)6W#Aw&!a`PGh(K+T(wGh0?ZPFI-T)%)^`n{&s#uajoMF}!aO^|I z@t!^h)3cLkGxP^Z-2GY*lklNORRo=Q(|WXA3c-3cb1G@Y$Vo)xW>9s>%qtM@iU@$E zEU0}%|2m?NUK9I6{U#T7WS3*C<9O)fCY#o?`~%%@_II)LhLF>rrDIKo(=CWyP|-T( z7K^3V%-sDN3(vFc6)rUToI${mB(vNZf4$z08{21?gw`lUlL6wLk)clF$!LA<8C#NJ zs`3;u`0L;Z{?GByHnioi)?wpt@KG>H$9sfwIzz0T^Ub>2!pwRXN(N#~Wl&*~> zHk_Dz-ijV%HXo6_OuAo#!Yricq$x^THNYA{=r-Adv}wInuk6RoKrqrzr<} zQZwjyR>3;^3MilMag~iGobe8ZMAZ$y*8NqyaKlk&vdNwCGwCW>i(VktkOfN9PI05m zpf!F_{&6FyqHz43VLo#83`SYbDp4?I_!s?Bo{$BoRl<~_gza*>QCALx3dETLbyDd` zK!{T}-1o&}LrwIZ|KST0`gjFM&?0+BMI5I!kUc=_`)h8vgK_;mm>IOuT#|B+ z_|7t6sGE-^$3eIQE=r~QvCX|7)VJ~Cx8(byn!~T}%n@yo08$0;@mK54q>W%3pqR6! z61IPO#)u&<(OHWrAir&K2&#N|q584-8s-m@wE~JIme_2r`nUw>j23FrbZ$R}T;(gw z;{T0MHB^8)G`WD~gD95t(}-o35U;_Ck|{K5#PPCN(R!Cmor>6+{A;yqlm&Tqi-rJ7 zvtcH=7P&X`#|#0FNcx7IBPz|C;5U>_dx*!dLvEb9wK=?2`iZ8P(uEOC;v4Cc8}#t} z)GYzL`QW=DZKHT>O`y2Cp*e_JvKX<7SF_awy}6_7D4s}e_1G0*|4fzBwYJ4EQ4y3J`JoaiICB&;U)cm^?Wmh3X@a~zZeT>MW+tLG3)5VEVb1E$rw$}hN>Vf*7RtFn zP27F-HFI$OtIMnk}VZ8D+YLX z@+vTX?Hc-h&Dr*61+SDPp7Dcty?XMNbmaji>PIg+OSdJM2kbUO7B!gGoFT7vhfXhoUd{#)~#?e@pB`q$6S2l7PCoNv462(IA1^VB35ZU`J_AJ|=IG{zP zUiwWWm%H=GN?7Zs^Jgr5unb4|TYrL~gCpQmCw%P>R-(xJG414Uy+VA<*quGRKUpUn z0n|yYuHsbX96#$vW(+mAuw;a~F8pPWTM_0)Tk>V7A5X7yg)c<3_KQ@AY`UHYxEl6+$LFeCIE77-OsszaD7~njt!Cejl3aQ#B zCk=#TX#1a!trA(7unilI$}CZ>UThxi2|S(OC-tA@pYX0YY2O##KTH&I|CSBAAKR)T z26T4qvvY@+AQ6|~A{(SlBdoXtm*@{E3Gq&kYJ&RI0fXZ*d6+RY*jwoe;X4HhY5g$@rg--`M~L9;@S=sDWFZCafBAdY<*sd6`GOi6!fINtoCo4F3~V&> zH=SGB($_WlZBlG&i1dT9;SQ!jv~ObdRoVrBHP-g?r_+&r7s31Oi+7*jG;w#y_q#Sh zMVtPqd0!9I$0>M*OhY@0dA3?;1zKEEAgqfI<|12?T}MfqChajF{(dPY?nT~-xpwML z9(i>CfIuoh91W#BL~kz2^9#QN4I6lMH2)F0Um!q*NJJV~(PS29>QW1kPg;T1>u+Ne zi|w=B;1XVvd(zHg(Cfe1!2Z67-1cvcN6MxLmAa>u&3KyZI@^TikP^0|uWD>@*89fI z3~sq)L?lqwZmyD8imU?jDFSt1H5_>lx0;K=_OVOGd{@{7Yc5W)MJbPM6`22aHEg$! z7FFJujnx(>2X-|S9$@*X8N?%DEs2}BM8-bx&g0ByD!+f`v;22@L#C(1TqEN{wRDu4U6rO0IAdl#U`jfS}5pp!tIu zD&MO%Ag76uB$2!lM{C4n`pjC=6i{3u|M9p( z7{FQb4gcjTPqbMq{9KDjS3t&D{qy<4F15)3#eCRaQ0$!7iGaC)jEO1=2XI1iGzA|< z%Ixy87rq$?m%BOEbXHxI%Z@u-ANb>Q-0GO~3qrQsCc{|jfO~e=MqjfFgz|KjS|{nf zorLIAmyq+}w3fRN1{C4Mr@_)Pio;{Lvt7rk`4#^mPYew+V|)*~$B3B~t`Ytqoy`gw z7400S!j^{V6BqhNQq8`wS88e-;!lwn=`~h-C3|O23qhEVpfQ`n;vU_4~ItS@hE=P zUrJ#Ww#jw~FB16tX3RtTNvCGKc=O@IoR%+!*Ie}(QqSG6`kZcA;A4;WP0naCVl~b4 zN!rYdQ-LU7-@5SI@wH~Z9dfgjn?|7}|7k-!2rBZjVcB!CA#bPdm83RLT%zqEmgihx zf^LrKf1<7WchVNcH6h=P4II1a^p;qRFo`%I&pm6j+hv=9*yYtnGzXZ^ zv}!f$OfAClHq#BqK$`|XVjumrym0EwvrK-Kvrit~DeIt+K+1Mr8BT99$`M-%CgRWf zCVyvk4$hCxqSP2y0wNNPO)E6i922bh7IzU-X>(z;c z6l_ua3W^52TuoXfzmaCmc-s$8fpo0asFQ?)IkK0giLdkICg+RXZ)DrXYeo!?B?1Fn zI`!|+Rf&N92mS#18%(zMOw3e)t-1=#{BfA?n7c4P7o^-{o_&!r8JoM`dgGpAR~*A` z9wwDajU;=YzgC!j5$FJ{wG6}S7w%O1;>f%Imm(;IX$!Ufe%A(a_pY8aZ;YS#yEen> zoE$&{e6@RKZcPG83NAfwBu+r|NKrz{kdLd3O!dK^I}#7 zyM^(x8;Z5%%zs~Y>vRMy#k~>?jdh<-Xk`^BYT3M;D-3=9lh|w zaU>58zZe10-<=?%^wY67KGKoo!YR zjZXHC2e3Y^-H*edOo;fMhyoM$LHTA-1rupICKRk_AT*V?^%CwpTMm(|#&N|CcJu3< zY~9ADQwRYPSQ=lr_%ZwKnll$(I%$Vy&@FFaYn`2ntzx z{U`L}?;Z{-xm5tU8(j>zy^)8NvC#SFM?Jnn@W|rdF>mB(tb0gZeu+NBNJk1kH~vdh zlixMpQ*VOm=j3le*I8`?a>uV?oqul7vM%R7aXy~ZF+l?U=^lIFeq=(u=J>9h*^4o} zjlISR7yHQHrI!f*Z}qs3lG4+u20txd_p)5x#jE)9WGhq6p*7-OT;uqQrni#j7a`Db z<5%B8B*$EvymFZOm+LDZgU*1KjfchgDIj)(-y~Z>NG;J+J8YPEXn$` z?+O$X|J~3~kVc5DK{<{eQ%D;te!YVVEHbZ~Uwx#RRW)+r=p_ElXg-u`W>MtzZRHVx&@tdc1q7P-ZneX>pZa?&~fSl$Gn__zF zIv-~YT*0UX07YLzZdZpKaHyM_r5HbN^FG=5TAL_spKdp*0%eV6HG6~gh~w5Sc`ki3 z!w+k7m$C4SlX*1RtlZmf@xkSe4#2(pPhx4qgLZ{ z&0eN`EkUaQ&H0zV-&8@Bjb?Eefj6tmyWH17eN3@TQd^IHC~C>*@YJe#6*@*ywH}?= zv{gq4R^h`@g;QecOiW6cHy@^tQJd74Mc2hSSQak)uIwx(%%s+zPGMbceNWZEk^(Bv zL0YCUb)vkrSx8r57jCGpC{ym4FC>FO0OEG3nqsREAc?oGFSwi_s8}%Ux_BC_)UWX5 zU{(6kK_^UN)0p%a+Y_Wi?q#iq+7WIk!<3A)7rMp7jf~1as%)Q4t!r$6jxS>C1f&d)1Mg7a zvwq$m(B$KB9-|0Lup+xo=a5{QA!1g#MKMKwQc7Q8aSjXbX6T6y7F=YA2?GK$C|b&n zIL{UWp@5e~!t9^SH1Z|nzwFm1Xgp+x4K-r<8zcv2C{OLU$ zVDW8)7yRV7B&g)b_+A3O*u*83k9Ai4Enf<>BwdU&zRibk2MgP+JPl`)G6k>rW7JA@v5t{3!XkP3Kxct7k% z-z!82Frfi3)~Vt|zP#Z+iMk!M9;E#gTiBVb;MXGGr=3=wQ!vRkz)v0ue% zPL?H^h`u~gnUvCBqB$A!&Vl{tnu> zgEY!|XaXKEWqO)~9Uf?jJE7(*rd$fn`qw1-PO_yBMXSL@I0>(%K@JB=MF-L4JPEKv zypcwVUg1q;`>s&sE!=8^{Larv+s#=?}14tBdPV1q<(d1m);cIkv7 z?$e$IMAQ~-@)k{U;dtb*A(j%e8kz`tdyz4vx<93o0aEP;y;91=2ey?YKNjGL{Om-q z{o(z8GXzR=57K@ovMG1ng5E_w1l^>k$|N)icC_HKSOUPTMo0R;iBRT zqCX&0C8GrFz3`IrCjgK!49!!-uyF%Rxhd6+DP@{q!R2?6YQ_v>q~cJR6j)`BHo@VL z3;>f(wmaPYmP)S<#F9(7ODf|AmrDhd9mE&oCYK-5jr%ibrbt7XNGA{x8f5U{1`18G zB_GCW3YjJfIe&_QnHOWk)rcP8iOL10`VU03%YjeHq0jd3=(2GFK+VW9z| zrmt@v5zk_bHFgP8Bq5Z!I8kgyNY26{nQ&3&4go9^kv=#OdfJ#GB5x_u_Gp#~F=&tP zqarH9ey~G+;ar6kb3e+aazDx!A7DoAaD!QV;XQvI{%fR{nZ5Ndxc%U87yRqsvgZ#% zg9LuBA%qMoKMZ|+_@PV+^6LOkVU9vZ5E%tKh*TpzLppJGz;Pz`(J8$Dimw4^`I{;o5aXtrkU_^UPQ}Jg zZ&Gn*ggN#$sH!^6Y(h(@Kwz@UQ_}J_ue|hEUWm=MM>UvvzO7|;R#M>xQBi<{?SFi^ zVVG(-LV`!*aG98-!V%`ye}+}g$MIx7()`k3>@A+fViJ2wfzp6fUD5CC7m~7c`=auS z{ng1(z;|T;IceP$76{QPJYz}LG)J#)p!7hX*6Sm}QSWo<1xYOZs$M)cIdv=ohl z!TI(ASoyi2JjdBS@Jn{?JQ`*;Xs}efzX}{pY|zM`-1NTXxv01IM+I#-Gc9uU&AYti z6~q#U6-1Wxz~xMqH4AA@E>TtUV7_}sCg~x0p_+^jS02HoxaI-^Y-543ky(UXDY&hM<5>IvJrb9at4Nw-@5foZu7198atfSKhL|a*~Qy3GwSU}0x z=lyP@f@lDk#AMW7zNV{!#RcB!^N$O^{wV}r6DlywpQe}mwUY?X9WxDN8v0LNTlA!p z_c7A7Ikj0D&v?0+@SWp5zi6$sh5V-+!^@X8`n`mjTA{U&;EoE-rhWN7n<7^Wc;!JA z$_hrXIZNln47y_cKG`M{StfS0?;&k!+oFtj=@tN8x*n{122u@Py#)KeC0CaocC7G<%$gzHv*WYKAdC5mxdZ7dI9%zIoX zfkX3OK@Z86%FNfdrjD~TM=}ve-}NimhO0G>x@LQe<@#5#hAn(KMaTXcP4}4i*)L7L ze}5+Blhjr@#am5giwa_^s8A)Ke3_md$7`7;nwX~Yn76mzm0!*PJU{SMNLf9qo^E0S zY*A{Tcjs*x%l>xNOe{$=){i2frR8eLCCT{YMECOv8byiNv$gw6*pLZbcb8`%hgys2 zcOK(~HiVL=qW~51bbC2H6p!)F-wA*z_BQKxfO?$a z2p%~bu;hYO<2#9{1JGlhZDbU0CjKO7Kvph&FED0+RmLu0*80?>Q4FlSN`jSGFy(JW ztj63;Ay>5B#?i*#?-1<=dJMX$Pg7yNc{IIr)b2SwM&w6(ywt0oh>Nt2Mw<4w7QpFU z?WiUqqp`fLjLXNqOl^>V*cL7orFdckJuOr0H{Kk!FpML^P^@hUz2?6B+XGJkDI-|+ z=<*A<*JPgIv~cLmGrcOF7Oqgj*Sme1}VNX!H8e~vlDC5btP z2Jho0p6vtq0VtDwu(DLBYoi?)pB9o9Kcq%nrmLu$ydRj^%$ykW z;h3LFY@A~2w?O-62loEVR(6H^r^(O2A=fFD%;*=IoiG^A_m;7PKV&|I7z1|M61Jz%{_75VH>?y~=O z0{eP-(KMB-KfN!ZKqW}$#wS#z$G%H0rC^np6{IuD$`dmnEaw0y$i}o5NmmiMMn5w1KUz}5G zCjC5XCPFMHA!!#+_P5jx@!q-FxG@7VYhy(Rl1dv`zTy?Sq}cu@;=Or}N}PdBF=MwqXin^nQGCY{F- zbPk_>wqvpGw$9U9nJLbFPp;m@K&NwaFbk0fimqi`wqJ!@nxVVc>1#Kb9gLbB?>ue(;jQ4t?B~RtK0a#r*+dbFYpLCPyTA9_ZH=IJTJrlm+4o38 z^>512YEw%D>^$|J#=hGC2yOzaAGzC{|K*v0Dx2uE<0K!V|2`03>kqnlLCGVQD=oA8 za+k-yCHG4Z;{DbU5s!zcCTz1}*J(p3CA0b;tOuZy6~w32c~`Zn zOfO2iGG>whRkr;+xdP!d0Jg^B@!P*P&@m&quXi+=4s-I8)}H@@#H?s;#WlaN@Li3qb5z%NDeuees5S|=oGkn+ zIp-3IJ9hE&T7NN#v0TiBfUb7TR*gP5pT+?#68(idqq{3NgmE@GcG~BLB6BF^6;Q&_ zfp<*;S7*qTSWqa-L||ljH7WU&{}aBi=e>}HhnSrjGMI9xGA@p3=yx*YnQxo(wrn|P zvA?c#g7*@_Y(u;lK(}96@v~x5pdzLs$9uOy0cB1RK&!6I0VjH4IhvSUr#+A{RL zmR68!y~q(9DrPkH=X2JkLsm1VfHy%BdNOM~b)-HZ&h7&A-&v8&-aKfU3AF6I84fqL zflQt2hKVc~8mpwLV|AUcZTg8a%!q_Va+jZbY_nh&M^*{u`B=7%rqhlTj*|BWnPiM3 zTS&~|fP9K36Fgqmj4geLRznrE>`nWGQ%RR=L9?D-=!D}z99<21G=9=VjYi_M27&k3 zBti5vPp`VjkwC$lT`&BpqDwy=NypoSyqTzo zjMp7@Tjy~TZoT@GJm3CTvg>Ijk!O;KvnkgrNBUpOJj^JU52MjL``th4;U0aPIv$(w z{5sHcRLBrF&O47mKQm$1y1KlV9iVOgcG#7gtF4-vv!mJv8vZ@m%?e&AQoxDV!KGNA zH*5AG=F{HF`FYJdQLw!MlK-9RnRE(E-sb8Lm~*sSj)Ok9-)p-9)hJNwo&lCFiq$O6 zV`J?_74C^;A=i8kz4$Z+Bc>o2O0$8sIUb8&Z0%5WPpO(p&We<~B=7dfZcpcCe?OWn zepi~7B}+O==zCx+MH+tXWQH=j^-}pB@_CR%G9s63vD39Np&~SElH`RFFPn|Jc$L)= zUs*1bRO1L*y^a^2d&iU1ILcF>L@Jv9T7-?K5O@cv5%RftRnh!v1)9Do z?$%9q6IU}Mh%CoW($K+9qs}u1x(P8d({d&6XRnBX?0I*K3H|Wg(yG8xk zTb*ME?Mwb@`^xJ9Kg%;^Gow(V%%Avq+Ldjuc<3v~n*5ei#wporsCha}pMEQ=wgKF} zvW-^MF8)0|ml$1Zu~@LY@y`Fn|IRS%K}mJ(VHMROwdDi;E8BQu?QVSgFz9!Uo%KsA zw9x5D$P0Dxz@qLu_0}3^tmU$G>k$5QeTHlAjJHa&&y^>g*FFiwaKeDH4!xOrJcoCg z$Q4TL5C4&*80i!_AmGWomZvj5QvIQ)0YPSKEq^M5@%A`9%BWgP_c=#ww~%&C89;iQ zO#`jFPnj?AOorcdinR|Wr=~fNCX&5HEI-^URxqQR z`rvOgH}2`C`}NdE@nWI;_5N}MJvXqV#7yrUB*y1p4gCc^wJQsT7@4A%0%emN4n-rq zvxShF3fD8etm-A^3l@h0qt|R#P}|2329KX#O!CBPm&1Bhfc- zbb_sU`!`}5T(UApJUoiHRJ?+&&sv91_UYHsh`ZfoUydrl zi6I1!CwuHACW$><{ScUxD*hf?zw` z9@sunF41n7>Ka$$Tvok_sq^^m`Uc%Eq9%4VbSLq0!`ZkJ&YEg14i@A93^y<@(;yU5 zTi4KIKI1(N`m^wUs1fP+-4JI>nMJ4z?W64^&%0$GK8<(CUfn-}Lq9RITz_)3i9$g0 zZzmPB8|kKZ%|3lQ{W_ZNI$ll;;CEu9=itc*8baF9N8CsGd~ne|a37^w>TeqIr&TeXVQe4Z}BqX=54u0 z914jEsP=%X0~(bPMj}(vxQEakzcy__A*r8XMQ{p3)dlbWRGPIM5EK<;DmH@zS&Vv1 zUM0D%1-Tw7T6_#{10=+>lrPODJ~@fKz{AIo7;GL=)7IsCr<&Rw>NH>XbbSob58!LV zAB#(KGkZQ!f9*?G*4wz^AD<=6GD;+1paCT3817~3<8N&fsVD*E;#t4GTCmR?8>>?G zFKoXfqc~gGA|q#HE3>?>>oLzNTzFhnt4B`lLaz0E4_i$s1npy}a|rnwauyr^r`n$E zyU8>agz674{sUzmT_o1hknLZ~=K1}^eJLg~nmQ^SIzOt#%ia5Xq;c!b(OZH{^XVq_ zb}x*dv!jnxSw%f-e+gF_TyhwX)VD~(Mo8ifGvd701WyjDn>aqiRE)F7;*k*&l3^u~ zQcx6RKZ@w-Dv3;TR#?H`S(?e98ngY=0|5ICHjLe__TX^2ZI3uG^IT>5HH@=z?pIzL zB>S?JAlCF!C)N@7swH$NdgIYKYzthH_O|g*0=v8>S3!YZ8XlC@H)E{cDflYgyGi#v zG8#pUW*=`J}VdJ2!aT`2cfE zQiiY6^=tI(SD9qyb8H0GC#XC@Cv4}?4XBxv3_W^Zl zl1xxhH}W~BBJD{)!-V~x9_-i8nW?Zatfr>hQq9>fvwSsVkYxXf<&yFIvJ=R^ucs@i zZ|Y?JURH4jPT6X;$N%}S#3P6DdHqe#DNq`~hRzJkt?4k(lAN}9+t088BMTcYs}cl+ z%f);OD3o}R{A9f=UQ+MSbw{(HSJugU>n)R9&1f4{;l=tsrc=FM^eb<-sy;SYix zJUR}lUc3SFb`QO5qi@pJmLID14cv9N)zw=Q%BD;$*fXER2eCg0Or zA8u5axxL-bGT0|8r`%M%kJ?J)1Nd{JSB3Bj10Y1P?fiG4?$!hiyd8&1x(a zv9lLo6*m*agM8vB9e^DHGX`HIgX&`ew@zX2AVB`D?; zORv=~pTZ=7)d{p*D*8*8yqyu;^rg#gxmGXSQ&xUqv0WZCb_|SZT;Y}DR3^c!U>Nr` z%=}&nr&8*Dc-$r#ZQCzOzQ?O&j7wm0@i0#NbZj>4s0-)Uz4SQZp zo?+3kn9)!t#Amea>Q3!D)*{S&D|>qpS@ire*@_gqxYsMDSlNT!;f8K#Kl^BTv z&CCXfmW=nP`mIh;O#shW#=yJ)^Ys27`oh>giX4P<>t_reHY%QX;G%5A_r0oeR}Y1^ zqJ3kHPs*$ZBbz~|m6nMP8$KdyN6@J)kbmQ8QaKr`uUGNM}t<*jqxWg8omuWt!P932GS2C8+FOk8St z#zU&n*|B+#>Jdn#{(ZM<+mDe6+PwTN7jus0!}RS5i*Ef%f>uc(KqE^-tW6mR*rDyFtn6U z>YE1U=UMj=F3)l)jpsdHU15rqsru3EXO~k|Os3dDv|77RhlOfkR{woL-C8#Q!hG}c3-S_V&zlObJ)P1ujWn@3$cLVPfSCV0U&Sp{EPLy2@U zi-;7!%@h5salr#pYfnDBh(A4)i!yHt zInLQp519Lv&G-0a+E=Ncj=dVQS{X2ppJrt&)K7~wRxXwAGO<>`@&gjX6QVFwkLP9` zm{_*5&1sz34jjylvsf5S=U&+~HbR});PABG*-I>cz3Y>KWBjWnCmPwYHKJmqL~(ja zGI=45gYwvE9c0Ca;$yz2gXYC#xl?hB^yD)8_^@qm&Y_xX`8F9ffa~z1<`CK2yd4yq zyn?89&DI>beJHR!(3rM(v}z{kKS@gdRjJk(!&@09)&Kk$Chpz+18=XZ7)QNHwAJEI zPnc}k9x{3)Jn^PMCa36cs2(wgYfxLg7N?Z?{Sl3s!G_~v!SUM~P_ZwJwYXHTBFAHu zvW`7WetI{n@2lHStU8d+6t@;EYKl;BhL<#OQ?z)~3|a1_v(4F84+>g9fBDC=zBlo<2& zNq-${3X$#cYGkb5QWRq_*d@FisdM`@YY8ey zUorUvV&qiu@?=*>InM062c|IKYZ(6FZQFCttTvj^=})}!)LIzlWdozysMq%2j2AP0 zcT@M{2T8N9sgngpFSR56R7g{^PtLF8<~=43nPz-|P@ziOH$geuVp6>dM7Do0p&`{< z2bHIb6D-Oe@eKp2{h+{$pDu{^aR9R)F43l1Q2 z9o0iNO=e*+^hN0$+-Z6VzrT^Sa1yR+xrS@j(#j4=Z*I?L7+y$By{$=$2fpq99?+`a z{8x@~`iB@)5{{$xrj1*}mCfddX+Ur%Yna{MbdAl2Nx{>wR7MgSHhzlcpyO#!Ce96_s@QRJ?DJj2nJy@2*smqw+OGmA>1v6%~!;a_4i%dMW#0oj*Q>T0BYb<-Z^doi>g&i^7K5W8i0<3%O zpTNNAfE97oMuN`9)4^sKFQDk2!PC@CDw)r~S__ou@N^?S`3jiKj5`qv+dXLU90;CTx){CG1bHT}H`%(K2yl}9RUAPt;a-%jWloB(*cXgTz zWtQBuYBEhi!L@=o(w3*pi1GxM1?OL9K4?)#FF01~oz6dzR6H~Oaa02%hK@NW7ZfG|Bcr6d6e;$-l))c&&vCPq z>Aa@FH)qQ-;iTl{nEEB{ZvB~1T`(`dJeB~D6pH5avfW8OaqrHlZ6lTW{Z(^_R?kyo$FRZrCZb9dpzQ0rTIs1hDuXu6gS&gqj_h zZFD7SPZ7jVdUwd4$$wH?Klv-Jzg^^5V{+nZbN{3>@UL@b_6l1r^C66dc{3JgDpHwP z>tMu1VJ6qhTr8AV#xrurLn4imLYGTbBZ(P&F_Z-!GpNe4tjpS{>fSdddsc?WQh?>z z4_yLEI$$BoYLh39BVeKtqY5$#3KRYp^fCaEk7fV#OPM=#`rVrHv`K1CWxxGG90oH9 zm3S<}Gjlw0eCKTiTqtMGjHV^%>3CVQ^vac7%f3`_*?uvpG~wHSP#TEUdS>H7sHyReR2b7{f7?a^J0+T}+fN$o9L7uvUrG#6G_L5Rahd0LocE;1XlO0gF zd;+gs9jUQ{wwXMes3fAZe0QqJ5+tMZ=(7 zRVHK*?aS4Qgbu5y1a_wmLQ8gIh(w*^fPdZeZ3Uh}e4cJSD@F!O=KNF%8SVyO#28_* z5whYc3S*Fh=P+mnchE?j&`8xu)5>G$_39&9!0{C(wJ!yXc7#=57;K;}UaEhY?`oGI z?4TiY)bPO}ErdddOK#QaBQ8t8VPq^rgjNIwkOhiMBjZ;+G1}}`IvhN-Q45g2h0pLJHl%WV+bFksFMp$o9kHH+zjQH!(zH zbVNPwrK_DX2Js;} z2`J(t!)D0~$?74BfmI}MYkUtn07+BD8MV%sXg(JQtQgaJi5YBY;yiwrvBo7)Oe$hRr zQz@KgkA^`M5s9xe7{x(Zil^@ZCG-%+WPOalG4>cHYc#^r5m(Tc=VbApnEuwXH* zDr0k8M9_Lo2=5L%JAbJF;U^W`SQ!okg<_S9E%aj&({Rxa;iw5?kUj3;C^%tI801k-xQY`)ltpt`^b=?=gsg_}z>jrT|g^p4#9?CS(a}S}{;j z!{X!t;PG1l2>uWFKnK5$U_b+Y2qK6abjU#l8#i9e%)FGC>@OU%U6GM~1Q0qgG{BAUOGr{51{jv_geOfdvpj1R&_33RRFo5r`m!BphJ~SD-=^pumJ9+&~5@ z=)nzQKm;G;zy&HGK?NFML<5HC!3G*IRf0uUHs2R4v`5{i(8D_8*vPiR6CiU0&8 z1YrkA7(x$-(1RPi-~=Er0S736fe0wz2m}Z*LyZ?OW?W)OXd)&Z1*N<2x5Uq3I2;2j z^)Mqv4OCD9CLo~*OCSOetRRIaNFfSN5JC@dAcP&*pav@-K?WW`#0DZ@gasO4!~uZV z!3K;KDj_sgh_}yY93`l?pMhHR{uy6$?C}9ai2m%m* zz=IpGzyu#CK?fpG0uWdL1tj=D2P^;qB7C@k1`HJ}Qpm7KA!9;|sYd_(uBv?|IqfZ2 zWEpUP5I?|y44jaJB3MBRPN>;}7Np>WCI}%1Gsr;nDPS7bn1g19H%U5?EmhQounBWDo-s zh#(0;*uf28u!0e6Kmsfv!3J>f0u<0-1t+M00~R0z4>s^H!wnf=tVj_FVVO**eW(3C zkD9+4wje>>AmfAxFc1M6umA;3NJ0^+Fa;_cK?p%00uXqxgd-5a2tV)v3r=8y2|(Zh zJmi2w4K`}TpgG|(BJ$7j2g3`g2c)IPFi>1MUTQtuaN&UoEC2#U>>xx9FpStCM-4Jq zl(0;sx)sf@#47)k1f{W;1?6x(N&6JPu5e`aG6 zq)l+8yF=IjqX9+uP=XFnKnE~50R|c%!~%l2;Q>VGfB^;s(SQT&@Bs@PAp#9N;0GFF zn7sZJ*uTPLwUX*ZElQ6aj*6@MHP!4)diNRbX~@dom>SE*2^9qNkOK!VKmihj&;uRJ zzy%qQzydlDfdmL41B@CcQcRr0OlqtV*NBGV{Wx{)a*d~9xU8z>Sp4u)%+Zf#sxNTF z4ihjU2Ma9VhZmdx1Qj?Uhz0~v0}nK2UPMePvi~K-M3eGTu~IYLatne)u{uLrp`=8= zo93lxiy&QsC9A(h%ZLJen85}vD1j1;AcP?BKnEL$zyfZtfr5sL6c#5+VpwJ|P@vdY z(K5p#0%M6pAv#1Qnvp_ztHLIzyQQj^WpMFg0t`4n2QNTD4`#4}8MMFzCh!0SE|7p7 zj_9Gr1B!?t1Q}q!1R5}e5kb^IgA6fXsE|Pclaf+vrTV*cx3p0m`|18YQ~LW7lA^)I z3=S7EF+c$bU{C@QKwt`PR`1r-Ytv*Is@g}>iQE>%7BO@CJn2;PNt(JW9s_3_43twG2Yl21+-D|ye zuFzU5$+;V{V@Fh#H%{98ABM41()8K+d2O2b?_sr97Wt%IhS{9ObR;0_VHb0&{NwO=7U)nT7 z4#?|)QZmYda!!!>4)K zN|C}MLG3@S%4pb%+v;XlGyB3K?dbS=pOI^xWc6jcuA40x(Ia>*JDm_y2?!f9S~~51 zAQi-s!|s3AxExpTBRw0G14-R4Np4;D9J3O=sQi(>Zsjg2UsJdma>upXv~bo1mB+Bs z+98F=iYhnJYmJI;*_~=OHK%?0z37w%_TNx}&G0gdVWpKqn)^2NU$Sq>ne=SaQ_<(h z@3tsGm6&kU&8FPO1gtcIPqyRqYRGchS=3T4tDeN4S@p_#p4Ib|X0^r0O6K3YI?5v` zb*C&Vdq&p3!2Y@9WFeU3r)4{=qoCi8u-z5;>r>6<>sfZ3=<(<$nUdQT-L7g@PeDBW zP`I0t3blOu9YLtMoFP(rG4oG+mn5`~{O-Pj`a1eB+Pf!yjypQK>UZU&lZ4`s-9^Rb z3v!6a!2*aJG(t}OhzWmz(vl&jhC>RJ8!xdHB`DNBwVrrRH?T%P1q- zq<3L8ih?>;As7f8DNLZ$>^7W@W*J&3#>y*(m=G2;QO%F<6kJK|G_H_JX@1=+9CG$H zl>M{}4K)*zV)6F9mN7pzQ5&`T*_TfeU9$8vq%@xhG3oGPrc|>ny^ZnkDMo+S#L=&J zM^Rkz>{mjvQB3`PlDayk>=f3wAtrhRb&G6tZo8L}kqjwdWFox9zo=UcwW6+yGTEgZ z=k%f`C0^w^>$XAh`c=4onNuFK;!#fct(qt2ks;H<0~VM7Wyh`u3aKQ?D5r(&5UZ}B z*MXGC+3<)OXrwSHvCVNsvne@6#VKrmS6Dm>%1+HG%W-7B?c(bcl}HBmr=02(o$Bid zm!52b?B~JJZbhx6gNfP>GbA-oS}3B~MVl_PPYqpb9Jmw zkc71V?unn^>vm&cnYj>2wV-fUou=edRj01JRZ;0CI;~Z(RI@ETmTB=TW+D>NT$<6p z9doe6T#T$nuStT<7FMW*2r7k)gi@mSRrER_CCKy2Wqu`Lann_hg}17kRbllqMpP=B z?cMREx3th(GNN0xxst;clw4AxWBxpvSGnwD(reAFNvQ7GP*1zi3aacBwzoG}WHz9H zNm2bbz=SAZhKvj@G8-&09cV;akepDr`;Oh-jw*W9%`WwlG^>ycYH!i0Xa#-r+tV&) zM*5+KiW3-X#k)edXelB_ObjkFA5fIEkcnVCHd)-fA&>y1dl#E-YwS>({o56v$EyZ&CWt^s!nT@Q#(!x`Z)1t zKNY`@7hsP=!oM_o_0f(`zt9TaX_%+o30PmljEZfB{(6emayP*c8ussLtD>!fu${Gm z#w3Mhvdb@r6D2aRz+_hYjE7}AysA?^1w;Nk0|^i!rQa{u#c(%=nGqT)v6R!jqS8sS z+JYaI{>H>ct9ymrYsp`e^z}<>zrh721PhfD(=KYu8Y(pvl>f3*6t4b+%a38=s=-8w zi5RJ0$&?jo2pchA{Ctv0*^RcC>>XliHng;0)czP2E|Z>-lrMyh7qMRFRqth`$4HTx zkeOy&Jr6V_EkaH@`i1;6t(RH%dWy@MZpL)AZ^;sTs*v(s4fVByk-}PG(h|v}3QtLV zxHX$BC40rpB&&aq;UYub>S!KWSh$I4K1tmrryNzcujrv54qkSvIo;LpZ^yqKMSPit z$!P&MWD;-#MagQEw_=OSr-^D29MXC<#>vTr3F?JO%0#Tx$LI=AThRQN)Q$4XD59Dc zf?xUS($^Q*j>8HSn3=1^(H7lpBxJmm=HEvwD$SLt9KD% z@<9d55G-15h>_uFY0bz+E*(BGE0JWhCO;-tc@8Ng8kH@gvnjarRd5zRtz5l;4>eMV zq((?^jg*rOEwdA-n+BDY5G+n+XeJx=Xhu{eDZV6|CwOGdr^`lHv-!eX5lfz*jucc) zgpC;dI_4)glFM1Bo$)PfXGu)73M-Vl*A%oLMhOZfWxFsj#YkDz{F`6PRQ;Ne@EI@b z>4%aEk)Zlge4dEh7$u|{DXA4BqZgPTa?jE=p7>Y9$vVr5;p}D1gSx%ZFiqOcQca-Rz3WHloIh4KpG!Qc^8wzKK?d zCaU`w4Z-CbdgQRPs!bIl{|_))X0XUqTs`S#*%6epVhKra)oe+qWf{dQCR$~uqqsyl z@wI>N+cAYqv_d9YDcQ1nMZF}dK4WMjnh};Ohjm!-B7}?+DrhE}&bn@N#CKaZs-NFX z2&x2?`v9Y51V`j>g9Szt>tBeBTz7htTRnbI)JQYPl&t0yMHB;ZLdFBkD+kKyhDpiB z2})I~EU^>|IADPW@Nk1EMq5rbix~ex7COP&UG{p4P5tC}c<};+8LR*U2{1xrw6j2w z)qn}X@gkD}Mka$yt%V7zmAg1hsL+5(3HfOgG7?GYJ|Wd8Bzt5;vv`gl%BqH$kQdn~HkvaKL=7lpDiwUj?9&8n#}PA&u>uPj)hMYD&yIWA zp>Tyl^wmc_d%1z(W{5~e+3JW0mZ4>pve6O~eS^jIqS|YrSHyQ!PW8-}N3wZBgk{1a znTU-__%~LYv-_mwYe)~9;xgSlR`)qWOi9b>)*;4q02nJUNKi2>9cG2QAR*1nM5#NS zAw^3NH(rGNZ;cd`3@J~)O7sc}CkeqYxT%%s2>c*J5jkj( zh-elR-9n_7fn{alwX+Zrr3fkgZ|Osf76ixuW2S}*8O1QIJVnfhQ8TrunOyzsik;TZ z&Ug_)Vd83m@@he%l7acA+=bOIHmYZw&`fVS!@_Nph-PqMu@E__oN!t{-|48Up$Im0 z6=d0{4klzSXnhLVj$+oo@ODImbKn3z7=a@OO^;c!nL?6T&_Xao{#9(2U~*qS9%h`d zfDkmq!2Xe6j#1gQP+RNckkCsL+f7RK&x$fDe25eyCs;eoX;u-vAwJy4XAR~55W|cd zDo&V?@EKH8HmIOx$o`StExDs9CRgmMhMAHREu99|hxl<1m-X49oN$$to^rBHym%Q`Xyk`W zL~o827Y&sc%BoN0tp|v}0R~B|MW-RW8UqZh2NxZwwQR;oU)K$ z6Qwr>lu-^dG!?V|hKb1r7FDV?ZM=kVzz7~-n7l|xG|4D#S>-UUUSvdDK})zr)+Oyp%+D?v(S5D!cDk%1<+VABF4&#t0x)FBY(V-x=T#;3SVoONTESR zOb(S*1Y(FmK#UX_T3j@+UZq5zkmgwEb>*xKCQx3akj$)f3gnQP01h#LaIxZIWRxOg z)S_f1N#!oCT}I}^)JP&Kd}XDhjPOxA&LA1pFfpwN5t(rDDWqB!g8dl%;W8dU zwfSjb=_qJDOp2y)-6;P%TEiArNCipDwaYcWg<0(@r&`4noBSNilnEg7Kn8l!?YAMAhR5ywjPy1&cE>XyS8kR0&s$E3&YhLfMi@y&M(F^ls5`3oM z(?yKeVFeY0iI5*=NL2Lczhoxta87m6N zapEMEuX6RJ#h-YENJMch1k-p}L?p}j)y37rM7YREmNDYTsQE0T88)LN^%JGs$o*tE z!IFYP{j7P4#T;N>32>1jLyGDJb)Ssn(ku3>$CBD-{OpRy*&L?au63s;xLnPq$PeQw zH&UuyoUmM4zK9>IkmeB|e(i6GCRb87Y;RBXX=1un&`vIBrxM;Z@oCdblH76Bh9Xvc z-7YMT>(PrrPL{hXCEKKzP3yOMN^l-9fI3Q`AC8ZHx5&L72oAYg&d#`ck$&D&@$EXY z2ja^QWmJn;a>SCWIaMjyBs=_))l*CAC@6~`6RZ%*FO$}eCNRW)mZNm3i4 zTyX?fYsCB;Bc&6p-Cw=6^QiT(5i(?Mw3LMOaEZt*`QcWb&U9DApIy0IlFJk_KL-jb zh7^^HnGa*4X?$y%%f9_|Xu*=ADusmX8z`$7BqSeFj0Dl*qz4)rjS`V;S84tW1PqxM zmI#IwQXwO`2sx#YiBe3rY=8AM^j~r$1h;6EmRsT?M$8qW4(_0aKO*tSg8dVv=DkOQuWTTYuA7;(ZN8PyJ zO>;EtRdP2!l55(f2!r3ceLfEu&JX8C%bK5;@NX?&_mX=*k7ylNO8SZ^SJA24bwa3k zf>GAIlF+b}hNrd+sUd8SUA8NG9@g_=B6Xi&;Vq>YMGIfaW1n_<`BBNH$Sq4UIt#@n zBN}$2F&us2DSm!3*}d{t#J5!tN8LbB@(H`w(@VbQGv$_|b+pCpWMs>7xK*#I7=_)h z>uzT`JaS1K71QoBpI~WT+YMwVJudo$HR zF%zMX`67M%vtvwuWqeJOB0YkzSw#uOuzki;@*O#N1nns}YDxd}RCt(Hqp;Z&;aQP? zCK1svP-wKD|J%`Zr>Ob-+3|I^`1!RS$26ZjuxP1~5=$}Nt@>oqC5>-SN_7igU%srX zVvUbyXqmP2_{4O}wDc9R9Y)P3`Ck{#(){|R%QQ37iD@^*XNW(utoRd>{jyoVC3`j0 zPp_rNw4N3T!7e5nrH@gtDRRqGjK=i%htaw0c6Dsks)`S@VC63(S(JLN_n~6MB!L@X z&?sq{`0?o_Np6^;O%v3uy4yPian_^3A~PxJG@pir;uL+l^wmU{F<4|Zq&R`f-_?!6 zsBn(~Uiejz)P{N4)#7HCAMdI9fKhKc}}n?($6WRo5k$Znpe2{)M5wAV_7cu>ZqIEs3k>y`nAiXd96pV9XSe$SaQ^sEBY0|XwH_QxHWODLiWy{DvYY6 z_#L@u`+-^zWTRk-Pp{y!Cb^K)L3%*ma8u1DjS43T(V^8;#V_PMD7`L)c6_F5_kI2Q z$f-|B`LU3l(&tvl7SZj_qPF>s+_UtaeHw<=kyk_0TfX@Dl+z(3yrh)N`dY@zvHUH; z=6S%MBAB0xl=j(=mtfQ;IeP@r;-<5w>Xvs@>{rrXNfynVvofzAg{%}Jx<&J9yJju5$54r(jB*teFJq)s^4n~;r5uR5{T>&=w6D&->H4L5 z>p97mbvAWj)jfs&5%1&cdVW5e7hV8yp#W~jq2l&mPY~oI^Ka^4)5~59U+qY_oj^}ceN75}((F<#q z9mTK+es>kEP4Xqh^y5$t#Fi*puI5Lk?)hiUoc#Fm`%|&yKI3L{en5Dcw&1DDIE$33 zv0yS3OBE93uRLyGy}CZckb|Zrrl)U~6pDrj>&6M|gk;wx=dcqvVztlY@k7(;nif6oJwK^ed#jr@MS#`b6w<(c!oRQ47D`a_QeAr8rI(+IxnQ+D58-vr=lovZvkT`jjMDLv z?9Q;_ied4so`+XEu2r*@87ei1II%+nSZ-*5=w*glMiZ}E&K-7_M(Ujf%OY}QJrAfu zf<(yK^y=xVVI4KaEd=?LbYJsbG5pKKPFs=BRIFHNykus$Lt4COZs21x_-KTs1SZ7_ z3=H+k=iDt*77Sf6?BDgIb-GuSPSJW@Nj7Z)qun>kbVub}vPm>L^m_A^%)3OUnh7;4 zp_Y5XO^u^c%FVdCkMpcKC<}9>r2Z!o~Q197MD(5FE&(O?2v+qL0-Y^suj_T zr51(2p%`5XdHtBYvuLi7P<_*C`p@o2Zb?YIYQJ^=C!Ls(v8W-&1_jI@ffMlXff-x? z2S(U{4wT?x0VNQbz@c}EAwP*xmQuo+MN*ZVO0gGh;Sl`al?1mrO71iro-KKs`WPBU zYM_8j5FS8*01~uVzzJ%wKnrZZfD2}f@W2cSq`(CT43tvrP=dh$OIe|ErNpwRJmW7! z$*|N}78Sem=)q;krsfLIb)WiGD5q8nO6KBnkwK%0fkZ_Ou$UX85gNKgyGJoy^m^w% zW$#gF6oN9T@OYKWD0%%=GL(*g{O-JH_Er2VrNjb5)*^=&4Gk+Xa=>8$8!)+H1mBW_ zU9HH(pkZZ(hK~|)W4^ERlamNV?RAnG(dHO(T^EYzO!qVw+KU}zczA#f27EvT5geGs z0D?6$!%F5xC;+cy!ZLv|1Fg zp9tc2k${vRIsh|-2Wrqj433z=5n=#A4o)OM1SB&wK(vB`)nbDbLL>JveH2rvWTkvx z?fI#mO?SPLB^}eVoa4A@G?V#LXz(aD`ji?ba%g~w93HSzLj!0vhylCrkuEffYx9fCmuB zfCD{Pf&*w!1R_@80}A8-2^QGF5@w3%z-$Hvux=z^e!<~0$&|hcD;i;Ek?7t{P^nlS zLd7stWm^`Lno)#n2ok{1zzrBc10^IN21uxp0UF%kff-bw21ZZ-3w|KP33QOd2y!sP z0xy_BKnP+lez0RQY)A(8FP;RmULC9vDqLmr!X@%8aq>@ZEQtfbTuWJ9Ys=QY9yX+Mb zlbKPg@xu!Sgg}N3$N&WcP>=$I22>cK0Smm~2Sb>E2Q40;0#pnlUM+S|z2K-}GUxu1 zZ<2}sRUux*=Qg{x?i}|hn2d`QL0G^>1zwN<7X+aOOt8WQZm@(IE&u}@5=a3H1%x0* z;{fkpg@BMXmEoFZV-eD zdO))P5wK!tK>vaWJp~UsiwzZp;+jPKmdK9lBpPPjGhCXXRc%(Ih*As@P(gqQbU=X* z4nTt>;DCZ4z`#HaatMJ977&9VB;W-=xIqLppn-uFSH)$*XJ6mdx}k^Ou2kDiu2SB3?83no8@~R$?B9ED;zE$10n=Ad>{u9 zu)z^z=zt7dKmY|ih`vA4DyHa93v7{F88WQomf}TJ)mqDT5P=O0ykJF$4fHcM;36nWCn{tqG%NbP z<%x= z9mpu41TGsWaEbu}dy50SD-*ge%=-DIpx2FZ`1$Z z^nH(3Ef*IxL;wUD$Uzc@NP!Px(7+2UFasaVAPH5701SrULkD7T;{heO0f7^g=x_o3 z#15{Ai*@A!_p$q{0a(Lx~uYG#HO z7Q=ae5AHWJ?#LD-Q(cx}F&sM_v-|YX3I-7pH~tAX2S><92#IkfkQk)ah_1hJT=evs^?KWe?qbN zQmX~?qBX+@Sq~Q2VFf{8fDMp9;{q?Jp#w2kzzcqmBLgmgLBI!4dXNAO6c_;lP*4LL z6ga_&1rO{i=Cf0tYOAShuP)hv;)s&;h-AXX4IhZX5i~$T4h_J713XBA2!ODJBUrEl zmmo4Q0|W&ckb)W{-~=_G#c+UnrG`w#4UWWBrnI`2QY;Y{G0gP9fFVH8f*d%Z3Jj1z5o!p*4RQ!U z4KjcOBm6Le8oUsJff5}Yz|unmW{AiDi$)Q&OAgp%hB-nB*&IdN8;)}rF1@Y;MOE}t zz1RT<1xS#A8w{ZVEbsx05Eo$KfdMW#D1hX~4kaoUW?TsU$k7T(VPZ*3x~=msm6tebj1a zUJOq(EI$wE)A0f7_*l731o=p}4Iam@^AXE5#`n=lMVpb-m=Qw`K_CFf5Didq!w)hx zW_Urv4ksp9uuNc7Dlq()j?T-bQUyik2uO>*(R>BWMT zNGe&r<@h$$cBfqtQ;1~0C7otZ(Opkf3uQvZjA#@>K_SVJBZo^SlH2u3nx~nHsY+tG zTrk={N}()Ff`o_Y*{J4~q_5+T12-Vy$AgMrx|S*?u?Q$&h!ZGgLQ+avvk*J?#nBwa z(5`EdX*KgDl}O5|WaXcc_$O9B*S?C5RbAHDr6zqhGAS{3Z5YV6o6L5hJY?wd^ zTJT^*iye$mxwyb#DW|BF&r(h*H2iGkyi4d!dhy@B_fjbIqNn)jc%RNn7E^)44<~By z!A1~9yx74AALT?2quHcWeB1sgWcR%M_aa&ig+ge@n?P|`F%(FH@c>%`3m*imBi=wLxx$=R46PuS^vN_2d{ zK!W3JU~_bZ_z_*(Z#>I&+Pd&e*Y$mlCVQqh&g;6r@1xkIU6U<2FeXd)1G^6o5Ca&% z{D68luFrHvO&oT8(aA)M7d#k&0G1dspvb5J=HjAMgBi6(Zan0PCO4j+Sjs0FV%r-< z=W(pda%b5)Rbld^&(l54x~5NLVp1e1r);AzoxXIw_xFwW{U0*1+*!}-TSUt$8|GcM zPE&u5dHc5C7H?VEEZNXI;c=_KTYtVXWBKx0!r@n`M}>5qO;3+w%~RL)m=~24nvA6D zCRw>wnMZx!CEb8z%*Qv|R^>(>!(z%Xg_4nQ|Q_Nzv2kKsrKJe~HXB^8YejO_a>-S9SVDVy%=Y#I9z2 zzau9izY5mgc{|UuET5k@i(p=oDF+fcoi+sLkvuz|_zOer+v0aWc3ESko z+n|q+Zv#S$Ac;*y?HY?=+Hs=CLvG!zrlnb4!BG5coCk=fL+`o z*v^YeaqK#s4g?}ak|oO!dfH;>hTu=jA~}A;@B`U^N_dbT5XkY+?Mg!q87owY48OD_ zZTH1n_HJ9ArdhUK&5}fg5;>XD4)nV#Os`9_%eyL#ny?s>pAYHTprm{n5*LYfWfCmO zs|ngk#I)n=iGJM~hWA{TNGKMnB&%oobv9~_VD~OZ_v6COhYD^kUr*`x-l}+7&gNL7 zWXLT|%t);Meos<=+f$D3tr}WOJ{|Y99MvugkMY#(bd(@L8@mK`Qykgr6<)VziI!h` zda`StN`6e+9vH4C>C-N)T{;T|;#|pJWJDMRD80=NH(?RTA~N z9kOE{X5Y|zLk|`|64aqnkp>qgY^X7#zwK4YKZSCVUBe~GfqZxrzy&<@V4wj8=rDuE zNDrMJcaqcB?V@Nl(__-livgQ44Jsll)dgiF|uzhFd;y`a_A0^BVbi1m5&p%GDU$=Uol=Fxj5D=u}L*j++gG9fk zD*Sf+A=s$zSv5CF6XYR3p1oz!&igu^@$=zbbriS$tBTx|B)f1)vUuFZO3g-3I1KAE z)!Vl&%~%BW^h7}*&%i5=+S^$*-pfUiZ|z(UV`%lvD}U?DPKwLFD>81%mgz_>F@f} ztcZy})$omqH0j|dxU1uRj&S(RqnLKv8hX0R@-4foXpWM+d(vpgzoZ3<(4mGGGgNyh zPt#Qm*LWE1m_p-lq0xt{}*cql}(EteQ}TY?QcOSih-mSw9X$3^Qt^K!M`- zd@X&qWbH1=Dio4kyq;OM#c%vg*Z4&5RaL)^f78&5qVAX!yLBms;uaOkO*>wy-;on9 zatf(-*`L{*J#iMTS=DCI9&YzltxK_n6CymMD8a!JV=?6{dM!I1vQm#ygVpn!&+Y%7 zCmD6sX=yFjtwVM^L^AvGTFpqLeWqpCO+Am~Y{bn+@2Whzik{92e!I)ELOIHgNpb79 z=ZRiTGduI?7AGn^Ep^ot&GCQVHG0Bf=eKBxJ$G~@#p^tNaLDnjxyt8P$oAn>cT@Hx z-_#^wnM^m`ieU+_TYqS^+b0}u_4F^dwMweIewJ7%F2Pfb!gTmFyMGM7qxgm&`*~-_ z=`QPrUfX%{Gu&C!mtFo{_jldn*A+j$MN716pJ8o+B)J_Sg-%L(YF=IX8zQ=8kqf2c zDPDV2#7EB_zuOewZ<~qu6Th3_2ah2wr&+BjDm_w5>T5}pUtNYWwHAt!8qb<6s(!{v z426Wtv_dLIR3j+F+RnNC&4L;6_FJhjI`&b z8V>307*)?=(o-;sm*Bc}NOAhw=RGZZH-(9CS3i@Oa+a3w(h`;4^#yjyVFn8lm+Oz$ z6(%VhR;b*787U#a3}%-5%vmZ&`ZJSN?|lG;EJwtkiCt zSm{?Y#*~jzko+hCGC%=7BwqNGc;QAx1?XS{4>V%1TgL@~gygTuMR5~sy^hLl+>evO z@+&|D4io?a2VXsFl&Cha1B?gYI3bg|TS_wws;1?tOOIzjf(;mfLk+B)zJUfs24-s2 zZmBin4@7c6NKVJhEcJjKal~;PsqE%l|b+d>X~XyQD-XBb`sf8Ie>DFi_A?C>TX= z79Gtm%*R<;ehw;3B;do17cC|YkPClvoKSC5ECUUWbq zm$Xta6KbUEA$aZI^BukU6i2hWdZ4-VL@yfaXO&ebgoLMR*H=gPq zT0TpELoxb}+^A+#e7>9C$WN1y?35JlveHdTw!ebt$79_#qV^;=9VG{(?=>viIABfV(Lc1MtomE+K*M}kioAG5T46BK`v)!hV3{JO@+w2&-fOINMBoa!7Y zE0TXsVU1M#?8;#lBraVo;n1^5uqMG5>~@tzIq9)bjRPj61V`LZ!wC@*(~YXtkXwrA zb*0CqyN!)<8U*6F8LYiUxTY5{G54Sj3*;tX~ph6`Ei%IRrYcN4_0|oY~Rg+8N zKBNeN zKnyfS#CU;0a(Zd)B3Il`kS5YIumB@ad9A|T7+72|X#U7QtM0b-JnHsggNhUo9N~kA zNmQcM6e1@YPMiSY!o>#^Bs|cJL?DM6IABf?V1o<=1hGR58kQkya4~@c*pLAQ=&*q! zc9?(>H86k&8#7=`V52++P09j>_<^P5WQHoWNSVbTQ<8$xSy=o`?R2AGi7M10L&-?I z>$gWUDvD26&cb{eMF|T=Rw~gfiHWcMIIXuuvAW9Nlox4brc!~4W|%<AT+eUa`FUyE?q-oq!`LXa!VQ!)W}Ic+3N~# zN3Y4FAMA0`ZPR)n_uEKuTaVu?a;@iazpZCay!`z36us&kcID=SPeoO|y6!fXzak_2 zM7QnMvB_`d-z9lH-SWwvS9Uwn$1*}pE2mm@v-%o_*l_mOtOwH3a;DEaO2XmCtL2Q3 zRjzX)WTnFk7}g%k<;T)r+Q@c=V%Hw0a@eO=IUV)a{O#3l$yXnbh-4EJU4!MN!wHhs zt?Fv{(qk1Nsa4&^;Dt- zg%z^lGP1&FSr$1s>P{0%o8AgAO!+2P^2n z3_>u02?!y>jT0g=USKmJr<0Tpfgx&`0SZdcVkKpUhGM{t7zW%hal#cs8PP4MT=b3& z@F52TfXD&Gg_4nI6xL1?Vv+%7#)Au&8cc}1w0aa2PQ(l|WNNPw6F(#6G$Sk_W}J8c z4K9dy!J+^hC|;z*ZlG8(Vuu)Nq=>;GbJBu@_2LS>dRZi=Kdio?M}j)5x6LC+f>+xV z->_4=Pr7kpJWb>4UM+9)D=E<}LP#?(kt-y-M)r=sBOZR4kwi>>Yo}9C`U{d%jFs5T zh>9h4`tNxL=EJ!BUsnBCMd7gvc5%45UWfE}cposZ-Uf#tSE2+-UQhSCw=2)4ZU_22 zIzSH(667N{N!J6hU8f|c_X(cnHpItQa%*~179NXUw8Z4YLbxn)DjIcJ?KE0sHl#pd zQKI74us+8Z>}b)$%Wn=nx(s{PG%4Y#+WlL!F2(iZYEvA+Xs9LsS*?j|98jRta0w|v z@vOeiV-!}$9!~2MT)$3;6-9m<*3YJzEzN9cW_7jn*Ygy!G03SOj!k~07u8kLWW)66 zr67*3nkl(;%_|LGTTHf$tQ12MBWaChBl`wS$*ZsNG%UU7jGsyVS)`9euBnb&&XTbl z?$M9NyREw=A>Fh+M!~3v9sibu#cfBul29zeTbS;;u=p8ZW(kl%#Rrby;Q~O&u%g6u zVn(t65i=;D1{gHVoZyhD$<+QEFt8eEL~y{sc$i@V0X)<|BjP&I@>NE1N*;4_yT?yn zZlgAg0S6$UgA;tfg~@D(6e16Z!9)ab$jp$knsI`PY32UvrJQCCAYca4;WKb8DMmo`S1-b=~Yte`9t!;-NPU>rEYhahmo$YEmShKp=QN(|Q9GkmRq!g4{95*g7b+wI$Q zHNQIP-Qz}L$@tsSk4OHx7FEeU$IpXAsQg^=x}ziPZQw_ThlBydjz?X3B0RmKSsC8W z@KUqD4>@*l0fT~eVnOLMUJkA0$tkn}1oYs59%xYI@(L<J z=>-Z6Pe~L60;}7Z6~8j7ak4`_A2-R}@FE2YHednXP5o6&0oyH*1B(pwV50{VBP(bl zJ{8vwL<9~wj^H7O679w)LE%VYp@8`(B043X`U$SvriIB&0XNXVujuM|Xp(z5GYc2TN>4#hdKb9le}2YofdqqxspXXf*|+ ztC;*(uVtsES%t@KSH%>Zj__^Fsa_GqEhf8URJZVT7K(Y-47uY9T4{%vT8%`?8L}v1r~xp4>x?6k%Gn5x43o~54&`C6r=Fi(I(itsmN8y&W8t5V&y!jmuxA` zC}t%VBdC?!z2#F|?-%afev4bNP^7rKdvSuhB)FtlaZ(CJ8d{15cL?t8Zlx3`1St@p z6m8MsMFK?vJ^9T%|G@L|oIR77oteDI?78>e>t5@+t`C*n#SWc8y85GNh8I;aLB{)h zF2N*1)pQ0k4sI|~J_EKHwf_ZiaADC5EOwupSR6B)0MS&fM87_75S#;m37 zZuRS=u8O&|D$0HPH3}`l<~Rlo;!5LGr~5w}7L{hMto-QBl1=SH<-g!P9#*+Ik4G)Q zo&5PR8OsoH3d#;){ZqlQ*g}H~k@5wqOe)~}IigLqjYOaG?$4SaI5@WkOg;7G`Uftd z&i6Utu6@^Ru`jxqZeVTWZ*2t@@6nvgH^d}wDvQU*v;10028Ux}vtwz3UxtLFnkxWa z_GK6GRA;QWe${rz`@VRcwVmm==htg+d*i^0l6yod16`Om7afV1Rt~3xM5#wVqk~%@ z1EBOc37&Ybhzyo!Nn zQ|l(0q~J+gtwLP*nB6~rHut}L(X}*t)e)iI*rqBjX*$724V|F1=sI=SiX786qgoJe zLrun`zZ}>W^+C!$yQ!M6^^nr735le{A`W&WiRc!%df$!cbIGFW#{%3ybmEVid z8bkHwn187;5b*kVuoYK8P2_f(y;L)V6v{p}iXZh%k^E`%g<~meeBrb{epsS}A~VG? z_tKi7Xhh{p45Rz(Q;GKk%-CEBE_VR{J1?`-42FCNheFuI{r#&AmN_})1R6$*vdQEx zBRF(bpGm33xtuE49O{NyM3HFFd}=degTCRVTed5U05y4iQLr%J39^hE2v){b__3ZJa;$VEV*prWeRN1)inB7 zLQT6Fg?mb_Mm*t)+zW$U{kD{6@~C`?rzB|0q#ZlcP+I9gw4bS>HdR#oUb&bJyUm79 z87(I`JeI3denQS78*66KOPXy(M#Zi+CgK;7K*s_qDymBH@30v(=^cdZ;&g<^9?*b! zXi|aR)rCyN;bYU$M6Q-rO1v7{M|-s!(}~RrG!$zk(#MKA$?2y!zmi{8lyxlc%&%oS zwNqCLJ@;N~F33dFeR>GSMe=FD`GExRkr+aJ`V<-q;g;Fu*v#17rPb3m;%@fo%-X*c zvW%M*>W5xZvM9FefP9%FjHsn*36`%y5|`z8$z9qkO_dq~4w_r~N(w4}_nOBx&c`+U?vqCKNtNiy6F&*f5d9xy`=y_BlEvj5A zK!%CduITbwS2v@S2NUGKH^R&vmOG}P?~6dpX4@xizxhfe5ECW7T5!%@=R^(@Jh=!i9 zx(<(BAAJAn=LKi?>6~AsW3SgbDTh;d+2xD&-$*yjDNk%ty!niJJjVsw$dyGI?12d3 zFz2e7mES_ZnxC9tcdPS(5kmdpB`zuQU}u!IVpYApH~4Mf2(60&v`XZ$+ROT;TPx;D zmo{{!5<>@*>ruLl%8o*pNO5He5i(I_(?m8>z4mSC&x3c$BGg4uM0z;X@0E$YxVBzC zGxr%H(IpY#6sqb6wkmoY9Atkarc&K5YDWF0o$g`T_h@UfvSCd%Vcc3)JBnUjeC{?A z-)DEO{gs0@u0R2X(e5Z%WPSYPQ@F5=7Npc@9A+sQ2cHJy*BqpM?-d`8sY6?EWXTp) zQ5bLGkV_bhIY7!r0FYzfr=_JqJGTC1+e7Es!;Qv1R?)VC;hZtiME~tOgEWCzlmn?t zukX4_###>=Do*}h)*=eI?t)q=eAoi`SdTem0Nq?f1~;a4Q^sKZw8`^VOG83a<4AHz zBWh#z5pq#IoX18^&UlbgGH0oI9$1G%4y|H2D-ynoKL8lDB3 zA{1-0{i&K##$Rb7s|gg%_n$Lv<`?iB-X16BQ} zjsf<7;i;tK7iGUc-oNk~ja_Qsv-4^09q|?(3_bE~i90@vqXfrS-gmy(->0&(V_o8{ zw(S@aS-V`BDN~p#py+9*F?5YsJ|i3peN&Z0|g%S zSW;04LWY8IG8ie_f5?vPRxtwK<^Wq?Uw3OK|I5V4o&VBNKL2afNFpKVpS^5>8`=1+?ecimnL@Jm3)vM8zJK4~T%=*<+OdgA8|d z4eLm>{)~)_i`fKxgF8_($rF(@4-p=45Ar7=+GtPqc|Wdp?f>XAdQUxXIr}Fu^<7`h z)eFPfJBhVFx++DeIm-d>Vd|a@)sVA*!*{1tby%l~(DW&tWT#Nq;LnOLCTrOEtfI%b zdexlvlJuoL6v-dCVin&#DCAHjdcz&RKqK}n|4$zE_+?rpt$E@b(`ypOnXNc*r= zX`uN6pT1e{-c|dw#H<4QPBnwehDbsd6)hiI<#qgit)9KEFK-spH$*FM6bqw>fxCFy z;+S)wN#97Kv{ESA^Sn0pDvc@bfSPNVQ`}?0jdkz?7jQUB^Z3V?mDK(UG^i}16Z+Q& zseo(Q>TZS1KN>T@UkS26*XEXCy#BeP&=w<|x>rl~n$K|;reBw`YLB^0)xqt;Xw4VA zrW&<%y5jhRAyHU|vV)ijh~fG})PJ63zcz3P6Vn!mmI*i`heDS|bhMs|S~dAD?L>^0 zU9F;*y-Q(o-p#M$^6YT6MRby^3&S}=J)qa?putBhB7HNgkJYMS z|GESfo~J*lE*xz=_}9>(jdF^qTJy#Ict?P ziD<2OBf@7b`U^0Bbqjx<%BwK_DSc@;ni_Y-*PUC$2<0FBpf>X^sygW2`VDSxnn7uo z0UO7=ii(nERe9cxJKZnp;!g!FV7`x^Osr*?y$j!cCOQ;Hu8y4*{BTP_(QkOjmY7pD z&B6nYQLV^tlDXUp^1ah48o|E-Aqn{go|ZSGMn~u^8M7uXtZWW1KHGCNzMy=h8@cmI z%Z`%czhD1-3pbytaWQYLv0SKg2T9f<{_p!L`TzH*Mf|^U(66r4VSE$FO(=M^4C?%? z(dl-kxEYmB;{M)JKX{dN$_kPe^a||6PhQv)(uSgIS<83+Sn^#ytdfM0zyG2%41KT^f6U(l!|_im=6xY;e8zPocB!bhW3u(*wM}^j0sSty9c9t1T9$PA}zrItM3&%HZ`qJNkc)rJ6cf z+g)NA^*#4WZM7~#r341KChS7mh%;EImiyB^X;2B!2`p=#B0bmMtI)ieFN{T$099)* z=;NrA{#Sh7A-(n49r1EHCO3FuPpB|D@qR0ev21Oi6v{b8NeVv2`zYsXBJ9|9tw6u7D}&V#_#bHAZ2h(KLx+j`&Nm3w_2(i7`E< zi$P0!y@F?h_u5)@U->#5c#5+n=H7k@04wwyC`9g_;j9>bo-BGrmqM5q;Tg*-7N3 z!ORIcg{$(!C@G1^zqxTGoPY0_(&PH)t%(u?da~%ZL@BEhqw3(C$2b4Ccr@Ri3RkD{ zMR7VjqWk=4`w!LYO>5|Qu+%Buf29+223q9FgPREBrL7+u(NVqkH|>Q_zi(kFTzY&@ z|BECf1At>=K21CoR-!gd3?J!SrueIjCU^4p#vrR*%tp#a&t;sFY(;}V76kHd6z1Oh zeK){22o|Wc74GjnvXPSSwawesGl)L8sTw`rM%2iZk2Y-k|KM;9Hl+LXEhf?=Z!h)5 zv9XYFr&;{?ukWmm?=zlIEd9(d?iXv(RlR70zay&24){U3!oCR2l{qTQKA?rT3+jPb zmF~mya#oGbtHbqgw?5~NGD7V-$4lnO|7k3V6h!f_=AWGtA?i;oFZz@;LXeeuTdOox5!gRA-YE7b)&sw-V>rC&ADEs>m~KMMaDWI(F!M z=?(6#UvtrvP1j3ZrjQ;CT=l=AI&*y1@Su*g8)RpMZ8xf!sC-&=NGi?BCoyz12_WSY z%qW!VuN(uup?)#qIt4O4&lon)tmcLQ?HJ#*t{5gh$UGnii(KeHAYL2AcnvU`&T4>C zpaN^nW_p+w{--Ru_XJ;o=UQ)yZ(qR=rMths=+Ux%rYWC~KHAeHQ_>KKQC&VvJ~XEQ zlnV8FA#0D`=^2db2ZULVU&{h2VaVgn-EbMvMcHoW!YJRr#VSJFD*YIZeQ-%Fr+jUi z&4GfWq`b+<+}5CXURnqW`ZprlUi_f4FbP`y!)eK*5x!F~jO5)w%mD-yaN`uuP=;PI zAq@0KRonBIFE;Q={*Eo2Na5u+{>98r8!DyBb!;zem-sAFRAU)$y4N!J+V0yfj(&ut z#*CLPtO#@oe`jpJeicr)OKL!AZ6`@i5ynfDfQ@yD--&Ix|6q$-9jbIt4-vx#Qf&BW zVfh@o7svEG^|UrFoa{Mt`TCYhsxGmm2)VuYpP&3zhOB(`L zj(l4~7HYp+<00>N$Rm z%FI#FuLkyLX0zj-B5oQbHklo8i<6Hn>}DQb{#Nh!I8INUoqvg)N4S$FzaiU~+UCH8 z`y-PqPQo%&va%^elCZyB-fPO$T_eaGZGOh2!ur~}zl3P|lkYt@tDJxE5gs%ymq^IE z&zs52NSxQ2GpVm9_QzA)Bo1jC*{9Z+Q}!zVaFNAyWObF`*_%mIipz>VdowM++*@> zZ-#!fYSkW;F>qzl8;p}=>ZM(~f>=9n3QV($b1}qNJt%T&jVeIvWz7lOg}HlZ;QP&o zwC^8@*d#h8xbzCdG2d_Ng<4^a=)6m;)Ha>^f&n}~MzovmLqD@5ucOV*Eap~Hl8+k8 zF&|U|WYv@IsD_8Un7dQ?5D|8116-^-fqa=o`gY+8L^Z$W0EJ!G$RWXJo!Rx@=5;FN zF2TN;yku?dj`FP6ijEw!})Nh`}Cd41=z47qFzR`{>ft*P}}?kO}wA996q>t(~=w1Tn7x>r}Pu!mKc!f;awo zX+aIZ^%4txVZJ=_o0}qIR=MwPhqM55xk{up-qc<43&MUw$Gk17}jfT z_dyEJLS;{tY`r3^jfFaI+c+IX$$bI zVbI#Y=^FhuoLUW-)JL!e063LG7MGz!S_~5Dt^#ac*2de@sKb^aF<`y6o^hJ6z z-hNp1U)}r;H~leHvHf~GQ=SO5K_jOow`w#UeG~*bT~1w~Ur*cDKBqQqUrBmvXD{taDas-_R zs1maM-3u$VL%+@qiiAkY2j*S25-RCL%%8a;0rR5r%qLh_(QIUA@7_or{$*$$GkMp= z7)#8KvX;PgiAJz7dwX_*lbk?WfhSCcsALx)J^14=8Resq#cg*7rv#1p+|@1x7gFCN zex>6kwck<~uZ0CPSsgDV8v?&yBr_$g9qC*J;5iQ^@6CCfS4O85{pj!T?vPTsAq?K& zBNJnjGO`m{C9N+_fQ#7$s2q#+0jhu5g&PTGm$Z+zVPJqoQXF6>M+u`wEteE#S_sG0 z+2CffM!KKp=FGRB40}=4#U@TNe+asBY75F*X@{a+$eogyO^6W=%^kI3JUPJlu#H+C zA??%s*6l=?!fpPtXcQF%g+x1`aW;nY*l)|wuno@9`MlfNJ0OJUI}cBqZ2_FE!+&J2 zFx>yTdT1IJ{Ep~qZ?w>+n)IcF)zBQ}yM)oW#}POG816bIc*Rjvy(OiAcAxNxl<)s@@;UnaVZ#MS=VDp>pNov(Cq7^AsA zgU$qHTh9H}WG7fM*J_A%yBMZ}9l64%>HmF&N^y6lyfA3z@qx)KEwK`CD_lRxVN6=W z?zc%Nyfg%t5T-f(4G#X>nRhoC&naChaTLP8dtC(Nc0D=MZ;)(kSQ*hz=2r=)QAo-C z@+$zQ?C@Nx`SW0&swc4I&l8Q?1r-4#gT^SLZ<~10D+Ta>Iz9Q7=+Kz&B2h=t ztQWw5MerbE6_bV8IG5_SyVvpBE13ec7!fbKm4#VL_reNRwjDa?Q#)H2%x5`yx!y>k z*Zd8qQn5@{=CqIwhhw2KIZ!2U*S5JxTk1d@V&yBwf3IA+ca3~izu9RFjizdwIFVB5 z!JPU}PM^AtP`B9OPTCKaS8)ab^k!?S6hf%gyV>gu>_rd4r>U&hx3MD{s?c2yEzUx5 zQBy(xJJ0>vQdn^L^^3u(MmT%Gysl6Lj7{pu)MpzWNVqxOfRj~yOGVAgdp-jG8a#=iA)bRU<**ANdYFmZ%y_35VRwF(12=n{6&io4EAu zC;Sk-M6hAvzi{&1>;wAOw>7=xuG1&={f^#mJiOrjcNEU`#Se1(Axdfpr7uz)uB=mI z8NH5=8hn@jR*BpW_DQbAu2ntD)t9QiJdP0DzY7cKUOL{F4rAwSGuw)z`a*8KQ8J1y+9Lo`cE zsN@J|oZ>4`2uaw=Q|ct9qW}-7!&F1CX9py$+-#@{n*D8^>u+a?mT(r9UGxuI79jz~ z7eR&Vuk0=^(o~YB;rtx3cyH#=e_f|!j(*MXkDQFzZhU*0X5+2_9@AjG)lFNchvwlA zGxnyg*6b|`sW6cmYyFLL&)TRPh+?l6gCIaXQi?TuH(Gx6KD=tWHPw`*|m@R_QzMn4!M;8#HL`#WY zea52!*2$!(EQ#^1nwNGX6LKl9ud53U_8-fRcpL{99(6(Wm*c;=Umd^bp{sGBxqshf zU&)cn!%oMQ%M0E%B*XoX%|uoW{A;SG!qVKiVSEZ!1I42PWRz5{pCE6$aVmufI8LOl z3BF7uX!b5YRQTRkEIz;4dagI=kX>h_ck?`avr!E`{Q}p%s~58Dho)*TiBF*>p)lK* zG@pq&mb)Qr*}GJCTG_%6AB+q+no<2T#u#=<)eWZ2$JUNXjQf(WQCkyaQibfY6OaxMV&HyIKKq-Z zGJ~~1z{44melV>lzsk|tD5i{vW(>uQZB!Jp$C2j{!sec8=~cVzJARix=NRLX?L7Q! z_j^12pARC-KDMgh*cS<~^(Sndq850llNpNKCZKoweEULEZ6Us=$d`_-96+T%v_hNT z!=$AUek+lu*>EY-AZtrE%lGbx4WW77fu~eiImA)OQDMu}4Ztx8D@ftH;v7w5XoRxU1I~~jn;3^=k8i;7w}!bpjhJQJrqNjw_S&BAEc-u zYsQjFH_ap)d4m}HT?P`lWTx~_u}z{k)Hi>u2kbRdu+$IT2^6%+bh~o>+giOIhx*mB5?b}6b&}TQxd=r&n+_VZ*T(u zas}ua`*%L2{*^;jf`ccFbq~rb!?7?eLOFEauh*Qlf^-?8OT1Qn+JsO0s~DgS1c<2y zAKmPSl62o^YpBhyP!@s3!BUo#+heZ9QafEmwFCcM8JJuJc~C+&W)u*L-H zFH_GYsKv3&S;MVR_9N7k4_|(^Z~fx^@x_+HSa9yArR{f5v$iO{5U*mkFRir-FkUum zpjq#xSbMOA z9AWnAZSlN+!Qz@jCZSiJmf=(2gs<^V)Rl6;@hH|i&6Aki{3=21rX0j9IaA`o0g;rc zuX|bn))J7)j@;vsa_qg^B*H?I#p;c;Vrcq*!(d7biNDh9b(b+mR7cjS;L$r0HFqt_ za7(?Q<4#?_-Rr&M&eLN}|P+4jgp~QTIAHgL1lk=4ecgAE3Gx-|k+8_H;$CD31`!?6A%yKb76sW z(Iph#*!mt{;c)J%Vug-hH$fv>$BGN5Y=gP~<(*H6(C0557Q%%_t4B|S1_HLw6@e|i zvPO176|0h^>;TVxvb!LMey@_3Fo3N|FR73uZF(Z4y%f_nkSMz6xKKaFdC{7yIZcSC zd1da*k%jh|YP`e-$B0R`HebssaiE@(U^emL9|WNFMpWFeI690tNunWORX-p5TXyeb-(h~fiF^} zed}2>t~)uDiL`>G zt;1~eXta7YdQC~ z;?_I*hGZ&rf3=kuOmzz)98wCt>kD5=g%Gl}Z@~>L&E8EHh%;q6p7Fa^Jv$jcYOCnv z>U!S1=?-%BlUHCw|A;kS=NOwc-QS@4a3t~>Ag2UBkPDJpK<0iRo5vcTE+OfWZL$9tUc57;=WQJBlR zEILe@r1~fJ^%AVV|1<5uoNl)DUJzLkA86@shYF^P0*KM= z6t}k-CI?QLJhWWX?Jl+?d%{hB3jUSYHcc5Z>)oEi{ov0*Vif-NhY_LQ&T9gcXfzYa zzRUg+_{A<{bWQmSC7y!{3%>?P67?s_KE{3y8`=AIiBoPot?;#}D((kN)9ruq#cp6U z3wCcktAn_1BT&j+Z3T~J99}onwC*o|02z)FF{z=ytJk_(-Utg))xf;kCH5tV3SVCi zPZ^iNg?K_Mb~^J^`RJwOnQJkED#v9OYue=6_h!xejb)8dO)JN9O<*LTf80|V)O&Yx zBM?;k(k8fyp+Vp8@kAdPen}Vuw>UL1lX7!?61tK7d<9 z$3mbyc(~H?)bxKQ<`x$Kw`>?L_@X-1FzY_iBCQQB{do*x(H8@_qn@Aex{Tt&-1S&9 zkXlb)Ag1ZsW{GoKs{2_yvWEGG{)ozWw2VG4Z#*5+Flfq8d*k?WV?#EQYZ zbx--Ivc@gNQT>xo=x05BcCIhe>D;SVuY@WO=?+TNIy8N5*TV=SLsHL~-B#0hp=ADK%kxkF)XTb>S}(LEwd7 zz!PnGrt{x^3)SO-J}E;JNtZ8LKEYmPXuxdR;1A2Q*O?VjCdMd)UkTzvtX5-C2{;=x zT{1^WoH~C(og|Q#pOfJ&Q;dqreGzWbT#XtKaZ#GmVcu8)5o_ggSUQdU8V$S!Cv%4m(PQy7B zo|pFM>vidsT?q0HS(=AFcvK;@sfpBo(Jnn91U}E&k^ky zeMq@Jt1);-HwA76E;MF0>!|kJd#V3+Q5Uu~>pH5mhrO%Z(uYdr)j18T^8X7#)pCU1 zjsK(-F5PQm>ZCEfSJR7sEMi6W>kDq=gfQV?4I*R0=U8qF53m0SUB!c%8<1OnIT|h} z^p~~Xd5i?xI!`O|4(DJC<-(fl4jW-%2Wv(6>oWI*%dBJk#_yHxtqgjI;L@}FIvVE9 zOQrU9-Y*VrYGuNhDRsZS4aScDJ$hWsqlVbN$M+i+M)ls5Gd=A?+eod{mJ$l-s$b~p zq9^KOV8E7K@BECdz2AR3Av!|Fp`9ao^F52R))iIdAPI&rW-FX(h`5uFF6M8f77>tS zq?D~%&=iKi&20|e(SOP;pBX=XPNSjC?^IU%lM4#|j!8tfA+b%WR_znTep-vzC^|rj zNnz?;ji0j z@6Tf`U$sy7@fBP*#v_DZ4s)~&HRtY_o~l=hwo#1-7>d=H^jI2o@M+wOr*8-qL{>}8O=xO+gPT`bX%C&-pWxL!oP!=oFm9u^r#uF}MaF)wA|0-K8n>7$ z*-CHKaVpcTXv{)47lxWtTNN`Se^K-=3kDC>C^a_Za&A}yC|AQ<)E;j98%u-MerDJ$ zpr1rWSTUHH;lD2~36G*jR@=b3u#ir1W~I=c?lLC^GYfGID}FA8%ub0L#|0kv)9I7f z6^$+Ok+YS28a`%vy@vZYB7?hjQSCoIuyD*{OIGG;pt+A+7z6QU9t)?=iRH)g@Bi@^ zvyk81t!|CxvaSZ5G{02IJ;wcSo3pdzz?tpcwxZxzip{xsCAKFr=v2+=*lMoQ`V+-l;gsq{eK zw(9n%WFco(`mr|&^)p_L4f6C7Q<_#|__Lp?2wREU+O6l_t+w7OXCcTb-@u5%ml6{u zJ;uU8P)$2V+vd3a03y4!hL1@s0Gomsw=96t#kqddE%g*)*IWZWsXnQGxI^1eaxE0+ zCPdgTq-DU)vCdH`Az_*Tut@Onkb|>9T;&lZ+Sr)}qe)TSH3F-Ssb~B;sd=+Ar+dqH z-N`zkV<;N#zEe+3R459eBy0~tPT7slr`E5&*=dNepANPbQcJb|l6OwqY8?A5@u-o2 zxfDAL$kNofd6(MJwNca({+X1XVB13UBZuVN$~#VQ@C)ME%0QC+IR*h9yk9ZReyEb0 z)3`8Og{gxx>agEF2QWs!^KZXUn;$BqO3UV3Hf?+JI^Fo94z5#N(rJQiK{v5(paq^9 zkZvQLj@so`O75z*w%y}H!#Y(q3`4KEF+;_!cvLGZnxWZ2>(iHXZ%Rd)b{AV%^N;+! zcHE$E2EUJ#VUrIc6X9~~Z|aWy^rP=7=d}}Y3Izz@6W(uz$^#?&6WGuG+fykyej$V0 z;OHFxX(F_B>i)&qr0#@==Oc65oJv?h{PpVw>H~Y^o zZ5-I?ggD;vp-O(+D=fr+g}xm|ypy}C>B52{+RcdUrW5dw{2V%Z#A;mM$`4tmeUfVD zK6<00+62!KN<&#n(zlu}dM=l^0xQ*jx%sv5-86L9ETr0N+&CjXrK0O~q`(H(*cBG5 zJuuw>h!cW@knr-+b5}BOS7lNqW)(C<-Se%pgWX4ILH3&y!d!@`4D)!Zj6*y7_S+iE z>%;3ht@AkvJu5M+>B#Jkfcfq?wz2#mO8?@v^(7J4t84eoQBidrQMZ2he!<9;J&=K4 zgldlIa0l_UG~S&;5$l4mLeod*W@QL|)SHadKFFvPYf2^)0C_8aXi?q9**XVzd1Tq> z+rO@Aa>=W+Gr1u;XgE8AdxK@4-yP3*^sw`|4y32_g-7-#yDUwWH~_d+Qax%;-hhW_ zyrO

S)rn-Y{@<|Z3-gZD>$)mg8>6^gs-JO7S{zwj^7a~1GY2f} z!GZ&qrr6!e(ksawQ&#*V&mIwIhYgSk23WK#sn+P1 z`GY*8P~NUUYf@9Ifmm{|en3Z8%Bpcx`9#rPMv5L~@YW0!@d9W0zd-OR+Q4@VF>1=c zyoncA)VM_vtf=}B!WBi?z3mmQbpmD!*L=vX=oPTC?be5b^wk5#4JUlR+pCy)*0{YH zE*qTzRot2*_ecf#X(h4QAQk(bNYXpNws8`$QrgCeyXwW)@k#t=qWl$koVn$IzR@Y1 zBpyg;9Q>zg(+rlNq!^c_EvfgC5~}ufhifDcJJSvdo-nsT zDQk}?ziK|ZcGXRVki}9Lp-HWJLzVFjDSdt#YVB78Ysi=8jU>aLkNGdYT^ONu5y&UU9+{<#w zClkb)gznB9N$3-8kl~R?Vr7o#$;9U1PB3X2( zMRjAB)@pQy{=n@SYCybxZ5Yl02xVoMr8O>($#CeBch{y0eel}<0;cD0nUUM%;x28m z*OT-#P;BZuxN5_FU!Q8Mhsm_PKpa#Z`KMk$W*6GM=J1joIH8gR&q8Jz}1>c^#^5(ID%#6-CX=ZDDt<| z`DcL*#ae6wtPfr1>k_SI@oBilMd!u?f)=cKksM)lE#Mrb-!p6)k)6UX^eIM!xqH73 z6we>dlHq2_FOR7DO%30P@~*68)pu-*1vGO1z<^O)vVe^BW&1RnWg|<@B8_-5Q4t1C zPHIsYZe-FX<<|jTH}-|K%*|FbqRv`@_0YcCinzNW_>BtLcm+ zWACx2wPnzZsl;`YijlddYk=@TMQam6VBb2cKQaEOKoBT|`~n7;zN>LeW0r2F%(u8{ zp##>h-`=oDGb#UgJNp>#`L8l+t8Qn)e=RYw(4sE)8~MP3_KVpPYkG)*dojb6+;vyG znd7Yb^CWNqA3>y(3x#rqH1hND;kd4!fb z?@J=L5l!-MWEc3#mw|efgX(4BZwhTv(5X^0RlnX+ILhv~+?lZsvMctfwm9o`5?3=d zv&7X#3=t!!*hHSu)oe#x)a}6wP3ue2PoHhK{dC#R6yULq%0fI9uyU|qWn8mL5{HaX zhIub|AHwX5n(V5&?6T|Jy5u36VWieFI;B9oi?ds5uk_x>cpXE8DRexw*%nnh6OzlZ z=tiXQoyT5}dCq!I*~v4uvUHR!)dH6d*;HjLTxm%N=FP`v>k<(BDna$O`}-(2ox(^t z5n^w+)^%yOn&}lR7gC}>d`rvC_l%?Vlfug$;DmOJN|XgTEBZ|BF1-d zt9J0C781)``Tk5;6+_#uh{xG@VD7wAn4E7Fuu?KdRX;<@rR7;S;~IN!?YUyleU3H`^+iOzC%}qk4 z6NS~)iIe?IhT!g;WepJ~8L&%Jp~x5=T-vvv$;2$?1FoZ~8i~fppWx_wX*fs!s;S1+ z^ceks^XTjYzR05ytvct+fjWPx`WI1S(`+=5sl6LsQTA|3Y*CPAwlCC4msp^T6idel zK|)D5%bxR80p2Yuf215D%%rtXia(&E-ye=s+89sjqPTcZ?=+0*4V*})VV*m1wdy0x zgh3GREHPWnG*HK`J9t5A+R1?NtR-lht)fl zCE2zdlotOh!OA;N7xCh>w5q6&~q=;jo3&ut7i55)N{+J#*eheLiKj$QvVPS7mFtky!lz)T59B zWi^hjf$$3=%Fhscpfg^{0TV5!R=q? zCqogA1zDY0KnJLPauT*nKF=7$AtV(v=wtD#&(62GqNjBC2;v)>HMMyV(E2zz_Qe15 zEEYofFX1teQ|nGieOTiN{xsJc$lfZzym2U z(d+0^r99n;imR0vTFf>*R^4sQj@8pR_p}Fk@&s$M`}Sd@juJ8n3O|JZ2LZ;C3xQ~p z*+(eEx{_lv?BqS4XbgYVg$tOq*7-Amil|eDA`_maP>ZAD(*UoetSw~7d9^@edSdU) zWk&?uF>#0iXpgRz)YPQe;eL+AKQ<@zml6I$Lv&v^i{4ciLeN*fF#%rWV|D3 zW~J8Wd*g_!OT1itwW1i>GpQryU~<|@tm!W0oa=a5_0{e4t;g6 zF`P_M?68M+Xg@$0F4v>3z{80wT7yMH&VRDj{^`qLezX`QLtcTV!>fEeZ6}1v5fyU=?lvLPS&C<6mfIS4UrSAWpj{ilI zvi9Q@TcgggPh^87Wq8lP@G4unK~dh^9si_t5q0X7_k_jw0SST5Mx9#UdQLCZbA_KL z>>Q3)e;tg_CQhfD(2IEgTwJb5*-tdpUFGhjgWv3!ItRP;S2#(O&X^9LgxaL%f6{$2 z5IkD>B4tOc@!6=8hsoBVpIpSjKu@vW$EPeF8soT86pm1#NCOjQ)@^62;?w5!1aY@s(p&j_90970ER;BnlxzYu{_<0I8pUq>3ddfZr!1w; z|H-&`Ygx|Lozo;BmYcV+p}7Z*_FDHKlTaMrrj)dGVhS@Hr=r2Z5y`YK#^=@EjERqJ zs$%`|evv=XfpY}r(!TrVZ5GK<8DobqWejgT#uJNUp>uE-szYJkbc`W+RH}>aMH>`$ z{4dI%y=LJCVG^im1j9^y32W!b-`UD8h}PI@v{yn*J9??G_ZOLv10?9E#57fji(-(c zRgvA{e5?GQ*24-qQGh!qhL(rL zNSTaDS(!|}NThh*yD*&Bo$o1mirQg-8gv0TA*BjLlJYiNJuGwl4rXA1WS?#TCu6f3 z&*xf}%?4SCi0nVyaMdS=1i1d)Xh9kNuShCz+>tRb;xDxT=1P7V`S7LYOf>c%N<@XC z`9IF+?4_7Lsdh;jg(Yuo7WT&tHfF?ArvdDh&mm4yO>HhQ$?8|;XqXVlhW-7c|C~OT zWfuj|fk@TiOQeABgh;!!npaYW1|8($PS8A~>R7j|jDC|;4>=FER8zexBEDz+&LkON z5`m^n6UOjTfqx#G10tceYrJrz5Ynl@yGj0?%7(O#o|J};Sasgl*0!0I7SyY@ ze`Z_5iR!b<-_GSO?ZL6|&p}alHfofh`@|~7=yA+?Rhg*dSCd5YjTqenQ{PlWO#9A$FiNB^A)%6c79?W~iY zg9?e%{x&vIC?WPuS66fk$I}d1mTP&uPYWOPmKBqncBxY79pE)8eBP%fJO2lhKy1Hp z_-UYs7J&Q|FkiljmUG8-)ycT7hKTF8y8NcSmgI!Yh6cThtsr~#0sz|mdH5#ce|pGt zLhWojyRSAat<&0sY~mM*$RU%~7Cd<)pvi{HPk3nUXs`<%t!%YyVVnUHF zlM75SL8OWaMY>EbFy#c1swWh6F}c_j6NIWxDA2{^LQ_o;sxqNimy?T4H9=IxgaTbm zE;iK!K@}4Ubv3!z)CmGrPbkpkS}Va zsS^aMo=~96$wgC45U6rOkuE0}Og%xU>Ip@^VjLV+$O7n*8< zP+1mm^%MUh-aYCateA{|V!A$mcHK+`j&XsGbP`|yfY17WTGm2DZecs@<6n?OvcVUN z84eX$p9%mguUPMATF{j7atr1JQ{WAf9 zEYXPUwH2l-yRz$B@IFAJ_J`)o7{+DgD0GBA->&HJQ?xLymosk^(@v4niPP;3bU6{4 zMW>a86HYkp`(5B23?~TusA#Ju6JA*SZXfMWE;>zd$*c*Y_+=!NuSp#78Ujfv0zgsF zo_!l(;tTDWhJu}H(d}ZK^(gwo`|!1_Y794;JutQ!B4t(yq+rDwzG})jz`_trr!XAh z{Ep__l?wvWjp1xN*H(wXQncBo)IpD+M2}2p4n-oOu_y#6@5QOFV2*eXpN?cHEY{qz zR*bGw@U@Vom=yba=rb}VCzMZ`nUF3iOozx$J|QB&YC;)hOn=Jm3IdT$ZPB~p=pG!{ zvzsklri67dqXyUMSxUwrMJoYU8Q#4? zCZy@y>wrhS^+sAPqnSvl``eG1Y8UW~f!~I9W1nBzH{Uq}PBhHkR#RWD%l&oQJw&uozmOE5+4Z2#g^5sF!-0#m2)86&Vo@fj ziYMexoj)W6H2N2r>ZRsgXyCyz<*-#TX|-f7C~Gv$UGw3$EpD?iSgtz#!XBNykSDqM zloxjp3zK-`2WWQMj~1SlPvwS4$R{&Dqb%SdKuBv2qBD|!0)+11KvcuLWiuSuq&k%n zkGfEgqdz3ha0|0oj@juUztxn%zZA^W(Fn1cc)L?oh)QB-hQ1Bc~- zWW3RjJ?EBZ5Tfj*Lq_>%kfoIFFi(9~k7 z0<$}e&S_@d3D>#|Bn?KXIa#QV0ji39o_m!?iS z2?*!#GPY&YU3!*4(Zk9OSO2q@xgn+~BC@HA)J6(5-7JNFyCTh7i^pqCJ#ss{zBfXrW;5)VV|4G zpeV|cy@CVIbIhsG&A$g?r9bf{nUbQmI`DXtRFpm zt2^;cmeJ>trS4MwuGuX6hV$l-m_wbAmnYWDq(5}2orRuK8S~|rlTa$h&g&~V$Ilmt z1dcEcEde3P{ekimzkUXm7y)S#z<>fM95WW|b?Of+1$B=%bcl;I09Kj5wKl+N&CuNf z_T7nf)2SFnelgKJKE6m6B&R6Wfa0E0;)^#NxXmvC|7a{ZRWCj^oVUG| zMTG7UAfx}*pJL(cGCUA=DxkL>M%Yhw`-Wx&Z@(o}>7?R=)(&R`l3uj=w=ATCFKj~f z1U%PYx%TCysr|^-i4OuDk)p~=?3?B5glT*&cnNA|k`O2Fe^~6LX*hWNi+mxOunn(u z@Ih&8E9c`B-MjHgfZ##em&szV)N0HCXOhY8ITP7J1U%P=eiF846cxu7E)EA2iZ)#4 zg*t|%XjlkmJqRBILN1s=X3$6UX<7}f+OAe!VjykZ0B|p9lf!u7qZb>cI5{!Tk6&>Z z9>fb8b(l;**9D{qClOG+GOgO~O+J4EWjJro8m z^tQVRk9lWRO9)e#5VwWM7rBr0c;vWu>0kutAm}b4iRn0cDDWvrR4?(}_z!?QCsDw` zQCLcomH~~;iAw_8QB1a%CCFbQkfTSNXxY=F_OpX4^YG4)E0K6q+p*} zRY?S|m?LoLIT1~Ha?Gc!oRen0doFvYSuV(S1j;8BKgRyp1HBDIUXE%^xvm65oi2j9 zgf9N2zfqg|UibGkt{q_3FKM)Ts{G%sh>_m-Rgvc0Kw(O2D8e;O+fuNGHg2#fCQYD)m?hNi?VW zd0#`gqH-(YlxeD9q-1CFfiY1a@;#4Pfe4H3z43ppo5~4dY&A7{Fb6)9N+~22K_)|= zJFo`(|KTT2h41f(8A^|;E};;onshta3-uHgHVbOoSr1l3464oCks?FTlt)VDIP{lf zG*A=^7*T==#WH4%3$6_4-})Rx&=|^Pyz(O~F@EeFi2osf>qlQlFbRA1mt?}6{cgbA zkn~n{b^r3Mr-<>{yO*7N8wP<$9P3PNF zOFP7iA^ul^2)tMw(`%#ToH7llrn^DGgjRb;QsY`VyljwX(r!iAKY@W(NNPJp@^woSFh2Bt z9~{|zn1l`iYSba_i3vt%xBS_(TJ!t~aD!0Vc&vfka}$8!H$?$qavwZPgk(SB+gCVe zwV-5|FNxR&VBKQ9u%b-ru7LlubWsV04qGIHU~_86&lP_@Sh_|5PlIHmUdcfV@!YgQ zVx}H3N)@Sb5${dJ3}?QeJ=9oGbk8umBC7%M5`)Os8+sttr*)oQV>TXvQfKYTCISFo zJcA=xQjKN#RH}m-X@}aCkM${y^O!9x-vwSnb>UX?dz#VP%ZZ~IEL;)D_GMmTHeM6T zO`^}MLdcT--P+1Fa{2#WxIXf;Q5=zk)w@03;6^B#R}DzmLAdLp7%4(itfiLdPDVs$ z#M0Rqgw?n-AXNrPVR_~y() z2R2VPu&f*n0Bv#J;13$-iw4v}O8A0}Er6k9*(ba8D&syz7yG9CfyDGYAlhpknOt{% z9MWrlQz~S1VIL$dd)Iu|CSC~#4P+>YEVoyAJxZNg>^3vYwo$><|lOypRQRObGd z%=N}EG5F+oxQGLT0%SO-wZ}-7N8l=!xn1EG2%7%o!>$i!>zA3X)lJ}1EA#?Ejw5TH zFF;-kHqgbwKta1gByy&mr#PDz-%2Cv!G2o$@<3-E z9pNL)h{_vv2mzWS0_2D2t%~$Wdia|eb5KEZu0=H{5U*}@laS=={Pch`R30v08-T<) zlHeeSK6(6y*7C*1&-~3k)zJ{fF__4{0@JX_>oqU~1wfMgO>pNz7W)SJ0YOC-z%BBm zg4QAe!mnEn@ugGM$O=Mu0mH&;4*qD8s{ze9ORG)~A zSqN{&3nhl)#M<1`{+|+&oE+}?-paes(5trvCPtm{{LH4KUkYtmq|i=s=R`-F4L{$5 zV}{c;v~E$@9n3O&*@AId7D8kxp6V5Mnm&!W?XE0gIEHtu6S|0Aj-u5U2!@#$ij$87 zZY;~{V5%z0^&cUfy!&?aJYES6^JYc=E#*96!klr$3ooD`l%;W&456?>8uJh}8L{aC z3fu!Q{N(OS1qrv!EC)>5q$&ZFm6V6^whXB4jMGhTl?`PXUT?~}*XcW|vp30_{7glH zl6) zopuiT9u1$KW;$Q(Bcyx+{`Bn7)C1Qf3F5xzqoRr2MvZzr6bAgJ46QxL-2D^`EdKJ& zK*I_pA&$*YR+kMZOzfn8{5Up93d_YyWALIPefc|}qQ$0d^8F2T33BDfk~$Ls8Y$qU z%A&*ft~T{Uq+s4sMB5bRVi>p?HFQNFET->rT)KC+ z5gi(RjqHq4vt;AzlD&=?T}fGkqLY1u6)vr7GeMCn)M)XeGk!ofZFw(uF}VJos} z1J|hGVZVV;jJ-FL#c!zbtGdRbaH7z*+U3k%!E+zH3V_+rHUFh z6OzC#44E4adZ5xV&`CcQA<^mZ&e0Rknx72tajt9{$$GrtCWNICXM!SDN+?!^R0U0M zWxp<89t=AKkJzrcfQp)~5{G_1?+B3kQqSfJG`%1(L)i$QMrNbFYALF5wjLTd6;^Y-yV;cwDo&j1hvTwj=rjW>QmDJj=IGgk%b zKk(y#HJUuG+O!SeL?n;_wg-dWb}xhPrqYl|FV$54dOKlUe$mK%86vXeiX)uuW`f7y zJ=a8kyG1_HComFA;YkYYVKG*_OT!+_NNSx!OjkHXklI5=Ni9(>V&;S6d4bEWN^O^P zTK8C67`qb;?}~Jz+Y%fDTgVj=y}CGlj5fmd6<(Dx++b|$@#miK(Q)Hg#JHG@bV8TLUuiGgjw*ubl8`2jeWD73vGQV7mS+OcK8A@hCIjP>bR+$lsRlCYoBWjDl}MmB&*vCZ=ZvO z<-J^9RH&(30TX5JH|le+=6OcIgD%$!ydAP1G5G}o2nNzbZDcPcyqd%v@?d4x%CL=; zHc1PH!#=p7z;F6w&laesvw&os3D{Rc+9o&TqAnX&*?J>afGZ@x|~}!hzENf0!tb+UPl{I{AYC8)^&&0AofKqPGixL;xZI%)HHWfdhde z9LRw{8~Amb*zq_JYa2xvXam8H2#SrJ7-;i4V(5BxKrZ&VL>9NTT%a)qi*>Qk>%hXT z)!|0Z>%dqpSSQATFL2{rp&kH^9j;G02UU>(`=lq#K&d|LE79^P(y2JZUQx178UZm- zQ8O?Dct8#lAcdpn5^5l;N8_U)0bC7$;E?iwVIte+)k$MuJQWKVlf({Cm5d!w_5yoE zS8;50>q&co52nX~`5RyzTmei907Hu;p4f%q2#(&@ai9;>eO(uhBIw~j4+a}S7x;-` zi}iI}9jw*yw$AIsLfF<}iLjTeV{tDL1`=JM*w`9losQ+TIw07~>ulc_>$pH8`0_v< z7lK_Fe&6SbFV`r-TpK9X8AVU*bX@3l#_q*+SfKb~c_4@ddc8gm)`4FL>ToTQ)oHav zufyVEVh4P=wk?c}H32pt;e<&;gl{T6SUq;2N5J}YCv3Jb<4@mK`<_JD4k%E7gcw*b5VyZ|(n zlora0ii*fe3JeA00eQT*NMI``FccV;!fJ6TFcy}ID<4@Q@o=GpsjReUC@Lx}PQ`-+ zhVl}j&0M961SYc5LRslyFDw+4^`o+_h_F~bE{w29V6PIA4(wGzA~NC<^AG^(0_;_S z+xO@r0Mdnz08n5mA~ZPuL!fO$6u)i*#V$5-t`7zRJF(a%cDNYK>$Jj<>%dqY2nLR@ zmiKY4mgvP^W5?xzo!9wX;MNg0*vIN#UL__juZIc=OC^P*q)l1LT`-drn2QxdSxK3- zkSHZ0C9aN$$cswK%l6{(bznds5Qyt|z}PAzv=SW_labI=W-^+M!V+0=!AwFW9o_l<3)R! zxwy2D0D-m^6&I}5Dp8@4_#`wJZDztkiD533m68w%4Q5h8LW8N$Qc6rlN?KTq6DlDQ zq4hJDO0Vxl(qh3#Xd)iBON8axMoLg(B`PHfM7A+Wfg&iL|`N&tXccgk!&O_4-?j{ zLIN9sxmY45DKz)Ry+}w}+(+{2ytGJKFO~@H<=IwfFBZy+tVE<_W`a_3x0JkCvycdk z1;)N`9q(0w%TQo9ET%#eQGt!jRA?xy4b*L2NJxkm0t$hV1fmGOU??se2imp`1o~bu zlucxNk-R__mGp!^kr1V;O8^Uv zX2o(vj)aY_GGq;V@hog5+e~EEb1_0Y4s0f=aD_%#MOiWaEjo=P&Oyr@llr6x=8AEtNPsa!o`XJQ_yy@HO(&}*c`>pGy(q0PDJ{fevb!+` z<1ueR_NpR2Ke9A{D(Uw*cFh-&nn*IQfwib{HN z;f+8_YnKv6jWf*flZXi^4hz)BS_aUQ#^CSdZD_M>V>)1~oZ}iS+kt~>j(J}Un<>oL zPq5ZY^|dS=4;^>!*Obe~;&DXuBvzhf2=D>fNKhl_+KU*(z~aP(I&5FtM<$yt$m)ZL z^x4cXSf;x+2otH*#M@8NItpOu(K$lXBAX>WpyP}cUO^d)v)tS`IlHH0>MJSVZ$D4_ z>%DrAt}2d=mVnheEzBM^1zO1Gtdhg;EQ6}(`Di4Y`Q4=XeN>anBOd2A1>=c#p4AT; zZJ>adgU-t&V#l;a?L`Lv91^h`P)-t__yj!g&*u7V0tANQ)gXhLrg4f4 zBG~YZsepkX4Dba!4HsHWZS6}OH=}^V{8VFW)}<*he$-&sx$LcCm}J;QFqi?j1((C9 z=%}o3V+-xsd)e|kaj9-Y7}}r&Vo>c^=A_&pj4M|o3el_-2U9Sk-nG_E5;Wq@E{>JT z%x{q^Ryi^fO~h=(zln&$G|N(0$s$vWspw4oH6H{yVk&a+s_P>Rp7?e*$#ejw!An4i zLTa2hCf_4>itV_H0D$2FSrUl+frswgqLXL#>1(cJ-Ah!~p%~JP3w0$p& z#S>B7t4K9Kko03YqK_mE(@d*Ks)bl@_%Si6{!mPQWL!>-2BI8AKMcG(i-{8Q zwYbR~H$GRM==M%*&n8ceH1x_e$7&gNt`CRs^b7fzI%)!GnBC&*wgcWXvbd zZ6u<@!U=kia%&H7Nr|5YHD!$~%FebS_|5K!)S($4X%a6~3$vzDeKU^G(}++bi!d=Z zX90IbF~T5(dxbe&{=8_BFBmw4@l(8ZFp->}UDKUpmJ!9Bm9m_VELQcT9-e0IPGuKp ztETsB&CR2YoOJv-;9rQgru^EEVp*bR!9lUlmhzFcQ<$JB(7=&1ENE+8I1@ZWpjuzf zOrn#S9iTNMv2Zn-Fcxr(7n?IG+ORMe_x>acLVt9YwrMc!z-c%O33f{ooQw!~m=Xv} zn&yQ=Gp-^GGH)LnQqU#5vuR5U$9iwVKtVJJ>lxAWcESCmBGi7jA;7dr;z+GA@`dI= zFFwRM7$_yTXVj7&AO3PiYXYF$lLf{aJp<3QrudL6?wv5#2pnH$MTP?sla~C1W0I~V z`;}abVhxIQ=b~v*juoW#eX?RED+w5v3un6xp-{I{jJAww4JMP75C%m8R%%MPAxQKA z)m%*M7@d_RKuHKa$;f&mG#)N!{bw~eJV0GkGt%hUx^b)4*&rh|!Y9kFoy3%##K3}} zzm06E3O~zV63DNJ$!~?2#EMMOIzVBdejNAeD91vC0|Cp4^~ox+uD1r9>z+>U4T_`m z_O%#_F1X}6_e0J8{H6g)GTLJtH^i}#!rh28b2HJU)JsP=`ipoB2mZBqU5O97Xw!VEhLRLl;!CrhPE@ zS}a~fnY&K30#f<{MU!y9{^k@zwTD^i`Zq}9S9_MtT z%M7e8#Z*Wg`MMki-H_o5g# zrK>?J&}5WtD~KHg1X?iG4o|u&E08oz!%jHZsZd4KhVJATuUN+!eK`;RG?{m`|IK6i zfXbE?9~5D2g3Ii{%DVpz+0gcG#^<@@!S4us+YoUmf_SXkUzb2wV>VKDV!NrOrL#At zZ_>cE4`PZ!!7I1SLd*Y=pio>=;p|obrGjapTW&w@l5l`oJ8W71d{J2p*2LcEN48Z@ zsG#;$McjxlrcNe7cH~zX=KJz0+gO8pM`WR~l?QV*X}HS&yuztgU4Rtqo#T^PVU3Wg zEe`6q1dyPPd{t0qLxwfe+@&b(QTpq(#)oGPsIbiX7-M!A0}j#y-~)977nEO&qDQ(XrwwGU>(=dz#F@th zWW!<J^q*zQ%>Jrq3uwF^W;pUQ!*e&Qy$b97J(Zhl3w6QKD+q;{qFhG!Qf4 z>oOY#qwP%D#1uo6gW2g!vLv}^Mh!Guz4aO<=q`T1x-J$qZK zkN$a8n_*Desnn5o7PW)y)SYqoY=7{0I%P~bqZq}}%@;4+Bi9)Rp&dC+7vApDO^&Q( z{yQR!gAUH|rwNhsW*G2BKT`TL_7TT{Bp1~TL)pk@Kf-J#nr2tB*&l~t5FNoT$yzNt zQekly+G%TT8J`)i#?9}xgM)uQ8pw6-y18T@X`_98J`AFtk-OOI;~;l-BgiAFa(ew? z5S!}e(Lk<;P(KXvv5~bS`$&k5{9ie(q?KLdlUv+z$flCTqLswH-lCN&>5-5sDKX|W zeOp$kZ05jb8E(gB(@8j%x1QR3rS+Kzc-uN09sO2uF0pKC(DsJd!gE zGPF4kB>Pq)+#_r{`QO!1$x4>?rDE0YtI*Vbd!~A^=FQ>E>_G(x6I6f@fdd0?fCn0& zU_t>NRG0t-6ev6Z13CEsgbETMr~n~?1ZPmP6hSfJ0tl=@G2sFTB3LltL4^ibm;hnI z8&Kf_1cM3^6buQN3s``G2NfcyPspRdU;zaaCI|on79C?FzG zpn!k?LIesFU|ygsJg~q3Gb$>({DgIts>GKx<5e>2p1rlK>D~#ZX4B7gKb=@|6ef1m z_ECtkTG1tMrh0W<$R?;ITYQN-I(8+M0~IJlfWUx411L~fcz}Sz;QIRK3KL8qVFB5f!x90cB+!5Z%J|3$B!C=(L&9#RRCapr+)Bl}x{|wd zFLJXfgWRj^d1WRJOI7Aa8QXT7FSGMw0t_Un`V?TWeXcb&-qWJ%T*JoHw{GRNvDqH2 z)G4Dall2`oGUl1Q^^#e5<%A^{Wx%9S@od~pON_C z(1c=l-^)5*AM7yYpw9S6G^iNu4^jRcCJ?zg6bQGAYSZWx7IS|3Qj zRJDqEruMyl3+r6FqqsSv4v$l6Y+`RQcUt!kNIDLyS)@vnV{SVzt?4-IILPnDVRsyw?yMi; zQ;h;8i((X`7=_g+24WNi$}d-nLpiw@1sAMTJNdk#P^Qc06vZe;F-mr$7{w??anppO z7{w@zG9v3{BMbK^MuDVwq9buIpqNS;ty1zZ z2y0*J9wi<>ic$P6*gOhNxeJC-+>U}TX;I~fw28yOe~-kD2*WTg+z5w3ZkZ*=A4So7 zR4sQN25LDf7W+q{fn2xhEX|6Pq-t4d#kw|08wsR7D!%ZY^|d%RU5UPy1-D+px!jV= zW?3jN%Hn-m`qr5$YjWK^s&YA7yplSs<3ge*CrP;)v~-*PY40oy#SYV*kFZg6vOY>G zxG82iNhYR8J11R=N=JMXRoPj(JqLm(e1uIY_5Zk5yN0Zq+H?(2g>{BOcG2WEX%xLm zrL|OB)Si$X?F?dKr{33iM5_dETriAc6eD`5sMjjeOx&y7-fKMJv7T5YB0dp+d_ROD zA0OlKvDxtmHa0e0OUA3Q9>Urh&35ew%j#?F>*dbQJm=ydGcpb~G9n{0A}%8%BO)X7 z2xn(DHX$~)VmD%=^(A3rzbmoPu<^T{gxENTKb5T2)f(cOAs1ik8qapFk?#8L?wYQ7 z>Fk)9hVMPDy6RnyB3%s|VW_BtrfkJkt-3aMT+Li9X|$iKU#q!`s>p2zMC?t(M1&cd z*&+}LwGwS_5fQ($+oBy;Ufy=_*3`Cp5xrTPmbSK6rnY)}duE+KLqo(_*6r;gZjY6{ ztG(Dvi&kvfsFlpim}f&aJ{=~Tp{!_^|14jS+c}F>i!uAL03v z`H7pXxSgEbl#Fbx$=b$a=gw2ZyR%cOeKKHY0R-xL5&X}1AVG4gZrT}D>KZN`%v$UE zn!Bb&Rm=5rBPQbBt#%%(uh?JOJzVWR(|z}$QEjzl*>c^lc6xcld|ce@`|qAum8@mF zyLu#iZQHB3_VB)2yO+0QEB^8RyPdb!&(*uM%uOoJJ13t}r)^~(=c(20-gw4`ttVFF z_cL`Z^>ur-pRH=!HmYqMLijTy0}`b1UukXFw_3eZ%iA_CO&Ev6VMcJ`sL2M{HC?x zjRbPZjrCH~=7x`pMRjviwalwVi)lJn{*jBfj427pd*klc!T%%&gSTk>sf4%v{Ig20mJTneo9sB3x!0+M$k;X~Jj)ASRdrFF@W_sWF~#V% zf?AT*OIvh9wo6(Q{zq|d+p1N1QI$>K(%IM<-P9oe^lE$C?pkdWiA_b;N@uBC#Amxv z$iL^_=P&K&wQ0*DG-9MI5|4OQZbossBkPS%=|=LBT1~`FXmVNU{SjM{D)IO1@Nl&# z55<`8JQ8v@ItxZ|qiTxTr@YotM_!tWv~+oNsC2T^hi{sGI8=E#C(O=%Yo2;|IL9)% zby$l=x?5)}H%V`9?z6nMPu)6e1GpjD3QZ^Za+ zj1Bkhu0MR!H)TA9SsD;e@82+9%_Wm18g5YV&d9WKOhiVp!Mxfq5Z+i_zWQ2h^M1qj zCca@1AQ((dON@&GDV8N*?ajvMpjM zJ`IEa6R%I{5$L%MP~!;ovam`S?AcS@Nv47+Ekwt7z6lx*E^Rqe?Z z>QyFc8Z)P;&M;gi>)7Tr<_yDPB^FgL_u&i!;;iCvPz+}nF1yeAIucL0k$a4bE4#SF}8mV5(NcG=bG&G*X5k}sTkQ`j5>yBXR zo_l)Rnv6%7d6*5z$3~atk+bC*!Cb?4P>$Fnps!nVa!kF5N$iGqCD2}hyOboQD0YMH3SWq=+xONMM;dhnx0RgoA zQMn;!P?rDd>{|Kf3h}JEt=jG3cx}ti$ zUI@z^oFBrB$;`-%>~3av$Inweg3ZX*>`)*wpU=%ibW(QaDHHXE2t<3~5s&}zue)FM z_um~K@$i{>s;5V)di~QfDeY-#nVI&?wAxO!tJ>-5^`7_4yIU#d<$dzrmc6a1_y6xx zU8_p_6zf=ssH|yeX=rI_W@cz+W@ct)hGu4FW@ct-mX>B|mT75eX=Z6=X=!O`_ut)r zcgm)vS;wzd>8VyX+06E=?e1>%?hZkS$hUdhLmb`R-d(RH5Sy61iO9~>PDP|9Qs!kQ zWoB`lNvVf=tjnf{dWbb`#naOpJs#Abo$BRc_7R?q3xP{GsCW45r0}SeR4g^Aqmcjz zNMjKI0AL^xiG>3au~aNi0RZ{~6aWRskUnHM5{E&OBuNYz0{{R300961000010H_lH z3zFYKYvI?7?@i@i7Zx;a96+4&DYs+DM>s41S*V1ZV2@l=VZdJ`0l->hsiPX&`Y3dO zX_ns;ZBb7%@~u7Ah=a@8E}28IAo-mMKI`dY>N8k!jz=fctc?!dkl!9e zqK1kf_~hEo4z@OVXojYaUTJ#;p&k6xFmEAGC?;%yppX) z#i4}J4Ou0L#jQDhxAmPlCG}g0WrsXuukjZ=

f%iPd%Gjx7h-<`923(0}a|HU_Y0 z*afa%OwF6o(UM>V!n$k#(Y?OE%!Fp2uk9{{_=FrJgaB}V>PPnh2dQc4Z;a$aFcvhb zi4ksGc%Jjbq%k*EfWRUy;!b=~XAFXuUwd|u00ag#L=MV6lR%^`5C%Ewt=C7S@P>ox zljLZ`h$s_mD!XrEvLl&LAiojCtEvhN&KqnsAYVrmy)kKMcbbQTPdODYXfHOLh%HBb zH47`V+(K+41Xvy}$UqIEB~1zy${e%-jI}avc_;NVjy&G1&FwL=RrDGE%M zK!tFmaO8E{(7^aP#R&oC2%}!TZ)0awl+yElz;!^@fPTO|mcBQ=-}m0=+kp#1G+Hph zOSbSFU-FPvU~*#fqdbN&Q)TeTYH^|w3fEA=0USI+ad!54YlfChH1$XFOVYb7w8X(w zJgtY@wSo5#UUZMK-AiYuUo?`vbN(ftAHnHEM%7YgXwX_OSL);)c0j3d!zeBpW=bvJ3kgG2JeZd6pgo)j$;b-&h92NWn3hzv5ZUIqEhvh?( z57T_WLo4`yr%9Yo_OwwAfcSY888Xdi*j1;Bmo>=5>@(Q_H2#h1pLukgFbbzLW1^qI zMG*^O3}{2c7^AAngzkWHIO7kDSA0;KyYQ5y7)jz6)lvem(;+g({K zf6by@Ua=x#q727-64eRTZJwm8vFcSN2>F_102S$BF29KXxz10l+UmH~Op#=g*Y0r7 zChE;(yS#9HSzLE+Sk%_d-cln72n0_ANZJxroI9Osd5`vgZdpnGPLu3&5)z7)Br${# z-LrQPL&lT{z0X-1$9*~2GwKFtbTyeZgyW)_rjg(RMRYo`CVf@w#D#$3W8wb@6@)h; z4TJoH+4+;p!)K&zvx(OJ5=h%}K;7g#AXa`i0)bU$P4hm{&Q$B%18~fclfXzdrP}em z!F<7B7w*0}LUl}h{C%kWK3dR!fZIw3`B9q4Uf3yShd&TnC4>he!^VIrg5{kA5C}Af z6XhIg5VcWGEG*X)I?Cvmy5G)T2%jWnRgi+2GZ`kqTYWjupA;u~!~L=xN_+hdN3&BM z#=3e;szm8*9>ko5g~(LeIeZALpBEv&a_W;NW7)=y8t*)26>8L z$0-Wi)GP0q|6~Z)%b8#q=2Bz8y8P`~Xfc=g4U-qr>hIh(LCuH!6aUwOvTa!$H{+Gd zCC9pm{Ljs+AHTU)g2z9V(ovYU-R`rC2DDLz09ATM=)@K{&etiHwx0C+4Pfdrkyx@T z3L{c1F03LH@=KZVk9jmw{Xn7+`d^2pjolpnkKB!aN9$rU`}16buN}$~hA-CpguH3H zHW)v=^%KMIF5j{g0(nY}qEH%0-YpHwPK&m88i}AN$KormR6#H{(i(M?_3wm_s3YHL z$*G5EUy9?;+66k5sYfolGlQk_ds~A2IZCzWiA-0o~P@f=Ppdy zYUnZbgdF*De4pl}W@{l%J)zOkgZYPR&RUiQk&K=q_lU{Dw9wOK5vrL+{%c6y?84>p zP$e@>ZDvVer7yDWuR*J{%f%+6eTMfNt*%-zTJLLuHm$!?h1sV5-3F@qo9{HQX8^>! z6|?-@V^yx5W+i1gEnrL)zfiBK?UpLdK&kL9?84CY<|K4{mgi5v?>m6Xm$=nHu>ymp zyiihEQqDIZ6F{Ca$?%}-;cii`=e0MIJ5-6SCEg!_XfHdw>zstfIzbW;&9p)lsIK8) z5E_oF-Sc$HWU;-Y%D(`=dEmIw`y!Z`c<&&K zPNCU}LR-_DL#14Q2yRLEsfPSRdE|_~7LcA7k%1K2xQ6(*G6!X#uz$|U)Oit2PM_B> zt*%}KBfdv^K7O8x-`}%N&5MJ)(N=K8jbCYY5V6t;Vt;-fkH%xuB>2)wn}IVf;mBoS zeN5a@=3@zhGa-a;!h-B@fm|)ZZd$L%|3shW0zZPI`o>s|=?`W4!Np_vVk@AhD9cID zBT)7aIJ_=O%nH@v&jvUJ?U#6hvFvu725)dwfZO7r*#$*e*ur{fJwK1r(k&tZ#jgCr zIZ55>$@5cdL?X-g_6FIrvDZJVnJ360@G4rm1^6Z04?ryp3?0ZwPIRROxxr5I+}Tgy z7DF$DXhpeXOOTsiC;%~!(g?eEaD=s;Lt*oT9t93yH$%F#J5l1tAx0Yyd`v z!0iT3snT8 zf(8EPV~2HgCRm~YMaYKF{_nt|&n9myIaBhj{;2-TWnwUM7D>wb7UC_^_3n}hS6fGG z!y#$vm`Fd7T`$>CO4?$-!+5KooPa%u&s4%&H`<@Nb)=sim0z=!qbc)Gq&!jDd7UeM z%l#bymGyG)3PQ)v^X4hiRb|>r4R`l%zDuuD&${ORKTCFui+ek9t4a2M?4Z@;h2o=F z94s98dOfhkJxwMO>YbsKGRd&k-vuH*N)nm}Ufv6jENnc7^}5hX5#>MXrqUy+qkpSm zYfoY#rWW_Is%!Xso~Zjwu3n8t)+1^Z4(lt-s%5r_gS zrB)kmwb_S?oV13u85QNo*!H@jk=Hfii!0?`Vl{r^ zMq>Y&);lS@9IhpJD{-rIQjX8Pa>9&!G!=Xfc*K*%Mm7u%{)FmuItphp%o%dI6eVEntSWA&RBf{8**7+t&&>s%l9nK<&1pB^^GUS351Iu)C3> zijHo2bNI&P^Ib2K^s*(ELUt02gP$5TQ87+w%mt;}(&Q12#gAti;@o!AFVD zRGYQHcnN~*e;6_Y+XQ^ z{0v?{f4z{CpxhbGdI^AIbGZ-U{H) zU6l1!M->!fBuRl0@+Bkem;{1F<3?oPJ{yWcP-}SB_1^9cEfpX4VV9tXzD~RPha7mv zB>^D%xbmZ__-jwRzU8DejCi;9V(AnF(pb77r+UXFDkf{fGlr2jb1(Qh&AW~hW5rg) zlSTQzs0pLO8IAhDTGJFa&2w6nk0KUzc103EFYE6I$z3DSY>}+AO&iaXr%?f6$-mUm zBJ$ji|1pi=ea-il79?KdgNQ3e87C9#!^bmavMJKK`Y1MF6~~>x`f?y7u%&+<>=fdr zVLmf(Hb@$w8g9=p7wp!rfrLyX6{0H4moE#S zm!*VcoiLg)ZxHXGoYvD?8eR#x6J;8`Y;d(}-O*6e`l9g|#g1hzC1dTe!=Af5@niF! zw8NS>t4PebTY(Ved4dPicv!8$Ln8QFwZFK=T(VN7d(vDMc|x;l9^$Ap6WA8!-K5~Z z0V#eJJig1URdNM}lf{v22WX(POst;jyCc3sLPtd98s_ox{7%~zm6&qzpZ;e8oordR;N>eBpi|Dn-Tbvkrn z``eOsK@`fXH;-!vw~?LBjVVz>9GnR9kLzAImGg`+<`a%UI*y80Q;WL58yNI3Jb-OU zZR8P|_3=52sl7n3=^8>iEe2}Ukg!%4$&*-Tp;cbwAaG~eC`ce$6NCf|20l7a^0(ihOD%?Mi%PbB02c zfcN74xq)XHOaW|E0nJMerck(l=pCJt>FirghOO=nT#^x_Nt7*Ub&NJigN9*Qa8f@7 zR|OgXpN9~W)waRD&MvIA-JFL*YLHVr_~%K_X@a=f*1g7>OZ3_qi$s72pDoi9L#+ER z22?*y1Sq^F3UgVsR;Jq%d~y^Ek(02&B%?oDSz`T2f~zXbZ%sCabVV*2$|xhMz+2eD3XG~)=sneEN1%Ex#-$3I zl%a5Hhx$(m@bLn;21`>0roM=4k5N_%-wkzT@>>5sr#laEm5qA8xg>sQnTrI}bes~m z%VB`S!E`0vK^V~)qu^+elU$3p@NCYhpm2gLMbIqgpLtHUD&a99-h_RU_I4E2N~S=_ zj}Z7jP(eRQxsRNQv0#9Tq?CFB_RUJ}M!N{s9M5gGWg%Vpj^YSTVwq=HG3#~E@c{JA zul6m4)tG00*gpUSl4`75oEv0cG_0%B0zAU{kUSA2pZlpZBoN+hYx|9#XEhGuT?1cJ zopJKB*qSUfJHV*-Fh*=}oOx)_WcFZMG17AzwA2z8^LO5c%R@9nMfS`TqyzCFEO!!eojMod;%xO66<&d4IJgj+cL;R=yO1ZYA8fa`3*3=@yCl59Z_<-GHss#$dp$&K1V4c zD1vr-9Pe>mE@r5u|6VSuJg2}7fQGaE3V{vePEDnDTU!0Sw0`@Mm^;4^ww|N*L+%|6k$uV$zI=FqU@{)eFzkPbEZVM zC1GkDYii|QQWO z6;}$6?KBOjeF)%2?lM-Q-nWy*2lXXjH7uof+*r?0uigI1%Uc%<6pu(t`AgLzG!*Am zL5IME_hm%;OK01qpTF$s@V&Iv&I3%{FikH_l2r}%)qSdrI+oZ9z}}G(swcYo*$U;g z!pG?EKP-EYqM@${k1XM-IG;HiVCrI3)^0Vt_|DQdn({iKQxN2Rs-o58YV()emI@<=;@*?oYLbX4hW;+${V0 ze({s+<;U%^!wEfOXgl>C3~;%(Ap6P_@Qh?mJ?(wO*+8wu;;n83W~LCz7LgWNnLEMa z1*FaAFD(VoA{z+C(2tv!W7|5@;-^8*c;ZgX$liD?_LC^W;}7e15EsrVPCJ6l(e?9M zwIqc88tivo;N<=joE%t~eX1QL^78!-2r`K6FYPJJ=lO)8P)SIE@|*@*xi?irq7v*Hk_#CLe3Vc#d@c}FEmx8UH+AG? z2w15RTt2`k%nnBc3xsCiV4rL^7Gz(UZC3ytrS=5?C^kZkS8xSuJLjLwP_IBt1PW4p zE?Zrc>hxa02_q1{SDO_;p0ZP|LTzww9KS%bEI``7N2wA| zfa%Yz;O3p4UIDctI%}YKaw`yIMX>@9VE!^z-m7^BQLlS(4*RU9w9ub{a(An*r$id~ z74%hm&)UgRwMe)>&U5{xR&|OX7P^JbIE;*nNM}qEFPx^d&=d;91`v=6MH0h7Rop8G zn;)%l1t2bZe8U2b1q%FNR)xgUB~Rx|HK_3PH6biBZhW>O$e2|F(&$Rd;Ns!5#IWG7 zz?VQ|$%OT&w5^_wZ;!`Xa9XplAi}Evn8t#d5zmYBG_0AKP_qRt)BtBOcA#n(nj_P+ za(@P@$e1zQ7gYcLrUL;ejHq1q0Pk&jgiWzJ+l(bzN+L=DSqCah3oRqMMXIqSckdE7 zJrfH~7B!qHKDgDd_~k4MQvMM9;-%Py0-5aKL&=DpfwoTwR(a@A^H zCEWEB9F>!f!a>Z!cR1HfVw7RPVewMVAf_k4`gQ^=VMI~M{f;PC64{ByoD-zG0Z5;X z2D72u+yKZEjbEY>?k#9R2QGl)75FGnE?I^fsO!VL(dB#~tDl52xRYTvjBHmh#{+=d z?l2RjfYi2!tVyqfc^aM|KDhIGCd@Dtt-13Os3qE*ZM6}ca6Jp)*3eSHykSAKAG`|y zua1a6T%-!sFb_BdOLbKRKcD9GDjI~ehE%Ez^)fN-LxP7D@VoqH+ylGP5wxB@q2(;!GdJ7!UxhkM64po58zg0lGo9H+bhi?@i zG5%_wRd3;j8K?sI%H8ydx2u4x9vDh3RsnM4QIyj_*j0-W<_>YK0(A7~)!l_wfZhIl z6MB+2SdvL2k8)xK6b0)Qp!vKNkmlo2?cVlP_X0FKa0S!_`^5g=DGW@=mea}LY65E zN`|0l!r|dK=JTQ%2|(%jr`zmXd(yLqeK{YIf3g6sB*wU`&cj29Z$VJx5`hvZ?+1x8)Wnm%n_S80%6mD}3Mu9zxQRtMa?#w1G`)GPV156&_4L0}C%fuh6 zO7YsgsXavKJjB@BPNUou%k$>q6ukKlTAb66Kp11_rQ#lJU3Texv&bWP8oWxi7;f|j zHVxlG4DO^i$v|2sere=qOlGoGM;*J~b96Nj znSwOiC(b-6@KqQa!yWb+6#W8liby`|WPhNrQw$?xH_95@k26jz({Q5Pj*#VBB%nSa z2{;^@$!O3@;g0=-XpG!aq{$NlpA!QTRvK>0a#kWr?u{AEj{i4eSD}1md{q275eJ^| zvX&3Jf?|!VOA-PUY_N-8-tbPzVqmAYPFH3hOi8y)fuH~I*nvtF#eazfM^+0nSz98v z(^FJd{6GUyF$(Uxn-n&g)8VY-*QSIj@Wj!0sb$h(6q!UKWsGx>{12x+qF|0P<0yk@ zWUcNvF_BRTj)f&Pjz?=<|AFFna}hj&ZaH7fs#*-hTOY|S>eSCjw}ly{xw1N&vo(_T+9!(QYY1ntuv<$58MY(`!^+G0aYs&1g{jsS>Geza=AjHP0s+y zab^(-O`NRqje69m#=Pl!MkN9w^v!nG>Z39I?P7ywO5T)DNeawAR&bJ8 z&&+&Yaf-fDfHSn?BLiX#_Bg90yML^DCp74t=&8)GCoPhn{pv`wo0XKokZesFa#EYh z6lEtWGiCu}NJ|~dQTgMUXY8pZ?{Yh%QdW;ygefAo{CYE(lUqY7t>5ynx;EVNd8;2* z^0;bDi}J4utPa_TDh_65q6mnGS0UgKu1|13Gm3?)5xel}{n7Kyc$M@G?jmStszhcX zIFSFS;SA>&g2#4q&2XfRj98}g{9;d53=PFvz%o6}$5nw0r&t*M0_ zLUa|^-IRm*k>cV_(0+I=X<9=WSpmy0|bZKlExlHsLwW$6hFH)iLcUA!E?TUT7Hmpn9}j}?-XZ}nNjou{E#UW^!A_swq*O!U(z8CqbGEV{LR z&*!Piy}NRW%CiL{gt6~t+i+EL4_($+^?>vxm$6}B<0Z7444H8+YMMPJ1vo!}TJ@2;L==!?=IxmkS;6MAGCKc_1)07K3EoJq_j}xa9*X z$O4U%y{L5GTNF2|4q+&%o(M8lsxCQ?f|-3e4kTn)-meWhtL6-xXdec-S(RN@(3%F8 zEFlkL%w#VSSJ6&qXuyN`;F8r2m&kM!x#=xYR6mjII@E$W=XMoY0MhR@Gdbp4F}IPC zlp&V^jl%saJ^q!3+li82rjC?(UG44WC=|x#H*q7s*);7rX4w z7B$`QNjGH1Vpu^JhP(TWD(^+dgF>PrWLNBYd(D)Dl-vy!LT-}z#f3YC8(aq_=rmv4 zIx$xXEezo70}PDgmU!BgOnK{MW`hv`lmTpfh%c{)sLJbzDI{$SIBoZpiPaN<#Ys6m zMx=LA#Waf2o8hVm!-SjieBAX7u8K{8LTNC#Kzq)jc@0hC!_M@-k@db3cWT%78}B6lD0VXP@8!zjvCQ5<`t)kaqg{uN1aMwnMk~ z)g}OmnVB%GU0C5^yVWxr7Y@2rtq5{Dp>?D6Xh?znZpEXS$&1~pkKPu>xm6d7hMhQ7 zg&3Do%>Wy@sq7^ma%&fJ-F1>>b~8n7U9YN7_rb3G+D!Z}u_AER$*rj*cau7v<<{;s zNCq98{6zS+u5WJ#D=W%4jXyZ+xx8^iTk*V~v7ah1fwJ04DiQZ&SA^PHaF_))?U({n zqo?Sy6>zA&9my3rS8rp{u$!B$O&3`EnBYjP=7lh!3=GD_1o)VS0Dtk4a!{Y=Eub6q zi1#o$k<)%R6$`sLUB)+LZ- z?$%Nr$OR}1lAwT0+@om=a4hol%_C?I#v z@2AlWvw&PO0w~Qs0a=}E?uq{Sc9^uzIB$T7W8X1ZNXcgmU>_8-T1IW8Ae;4IEiI8^ zt{7_iXaBh42b7rV{$p$RxN!W(0>Hymi9b%|lX%%5gJik{+8;yUI6+PKk8uL^W%I}2 zFfwUS9s9>CPO;QDharE=(FJN=bi^tN^)Unw2^@1Pp zHOW&o&9As9oX>wF$sd>azi|TcGUqBy1IRjvJjZ;hWtKBeZ9tYh@+yVhg;PO$5bqf_ zjxVSpiY$^g2AU6{m7nS3KiA^fI*2yvffbG@D$#!JH z3IWKJ{q6~nSG@*nzo9=y!M=~r(9ZJh&vf9AslG%qgI=-!uo7L>Pm1eu1snxNe@t;* z#b>*89T2YIg!DgNO5{DFR(awgK9JH+$>U7$~ei*Gtw&XlPEyT07G+O{e3if<;o} ziH_}KRhZz#+67MNEQV63h|P}=#y&&VaR|*e`(|2x`;)E6aDl8$jP#r#F5N(Wq9Vu3 z7Jn-CLKLFl?t2CuaSt)HtoclD@RXVS%v(HHV1?VJ_>q<-$EZ}lI6-bVp+Y7*vNh!)8LOEj zn~reYYz39I1Pw$f_7P*1kr%3V6j3|D!sLZROC+f8`!K>LtE#GN1DKHDf_+=n2&!Py zoMJHu3azwcof$7dQNK4s}s(qZ>w0uB{aG|}4E0AlRL|>U5Jsd(RC8Z5GoDcL6hS4Q9Uuo)v=DN1| zGm#0t_2nlsO-z3$9O0>jN!to!T%ch+Nfzro7+ zHlRFB{Hcb{qmBKq6|fTh7ty+sU85{NJ?Bttn`jsdYf*(t z!TQI1S%n&LlqGfv`<8V9yQ)O|*}&^BhY<&dz|)XAKdEF@dxQ*$^`LVP& z7~%4#B&5;lfuG=S-44)u*B_WD?WW$c@Pd?f(Y-{^OE0MaY#VjqFZ<A=HeL` z*mlEeP%Nr)1FQ(Q0qk-ZDAQgU2{~i3Q*UxKz;O}IkWJj)PldmKCYbwVzJ!Ez5JMzu zv0{~_r_9-f_j2fekV{v*fDdI}ZF|_49%Gj0L}-jy#r2EC?plXla==Mplf%yI1gi0M zGdIfk;RdVaO^U4)Khx}vICoVFSd#UY+rg7-j-YsMT1AISk)TzX+!vKrPN%X@Ke=Er z>#^Z{TG&DTR3Gp^Fp@P*3MY&dJXu{A;BY$ezcKervB}1o{$3I7-p6OwIQ;1FB~n0m zFDWJ}yfw8+;v=Jze1x5x;BTb3`kfKfcAx_mzSR>74vXHKW36Lqt%G=IP8k}V{z zE%|u0v$FDZ#~BiKUCHnbl2}zB}JMr}mW_&5L52DV<9hXFux+*$J@-x&K(@c9t za71=uLlHUz^$W=eXFD88lP^f0i62B#KEqF?s}|X71mA`2L#W-fh7(2yO&)3Mp?~1P zi48ZOQVK}sq8fxOx!!Cy-QD2Eal<#vQ5nS$!pz3<&k!Qe7Y#0kvgdO=R0+Z zCu<2Yeko&yj9fETuO(&chs`iVc_`baFXRDwKjUpm7-2%Rt=?|qF{FE<+Ze}sLnA@Z zvfVk^nChYtRxdKSUW%;v=us3*M=0}bG#+nTIgGkP$#)VR1zbtu*=NgpIS>6QILi?L zsAkhU!SB9?c&P0_lb8NfDA80#TU2|b{Yd*k4nHrF#2dgn0&8#HqofV4bE0+uF|SR? z=n$6}^SaSLQ!)J-QE^48NAzi*^Tz)MZ>W_BVok5j^N$De*=; z6DTOa#6*s=yO2#z%yUEtl{*T*xo!sI0JZ@!WlY#%F@vZbm_+*EyR2q+Iz! zf(Mu6vH5c%kI70JKf+5Bl&L2<>&{9(=LwU=&Vlx4W&Ccc@^YK(~P z=QeV}4^ZBVgAXPjQ0B)St0MnMw*Z-pBZ_SHfno7wfl6RFcZxDl_OOqYb|(ij{bTMt z<4Y-cX^c-2rI~OTGjWednvn^SpU~^PxV>aG7P@WDL^~t*`w0l+=>g0LFXJg>!T}@LRp0OewKGtwyq?;Ou{RFb^ZNi z|F`+ozxNcBnAh_M@#-hX4fLcIWD3qwoeO8ZfoSBvf_;Ax#L2IH_x7busRUd-86gt< zCIN0vW>c^AWo=_t1&Wrl4G$M>zZloud`(Qb%Q6j<$tCaX0ZwJf>pc)5fZvEnFe%Gv zHHiu5%=HhC1jNOwq#YFUKu*Xnu#>3RX~G6PrYD=4ku>ut(X_cyUHU34iSnhiqvYZ#&&q<6j69>`_i}Gq9&~GJeKsY zn-x0jc&xxPnV$(3VREcmwS}g`j8$K~lhdK3IL5&-hFj}{txs|~TembGfE(E0Ce^TN zru^@djM$)9J)hbd|X!y*Mq?5^~ZR6Np;?;t|gZwvia zSStAd#TybR2rEbmNoU#Hh1zyvDV;wIib}NXGAtw$?d!@d0*A%6B%GOOOBtLztg4@|*o-ESlcA9?~ z>yerZqcU}i82*UcIBY22aPLqw_-VHeq|cUEjR5a}c^UshC)jTWaJp>bd@L?*otRdk z?_dzby$-tV-y7OxvLHa2q!_14r(!%XGf3M%GL-HKyUTD_iC=)Xp3TZ>>()Ou#4L%x zw1vGd;hWh~i+0)t@fd3_^3lv_f0P8>b7hMX1LS;|kdz*L#;*DK?PI=QSU{Zkd^Gsi z3cTnqyn^^~3{6iK%Vmi2r1y?i;49IWV4NE|lKAuop7V%nEVmo?L?Va5y?>sZp4*cM zwTLgl=x-o*Fb#7Zh%@Wl@D>7H60r@z*YRW_cC$5uTuC;l++zbJn_NOxnUtB!!ItX1 zXCWV7u=OW$rJ$Os*8K`4kl}Oly-Q!Q4MlWA#w?eq7YLd`Grx09hqXt1Y!?LMMlJr7 zcYyN~>5&f1Eh7ak=t`9-Fj!p|Ei7nxN{9c#!)+`#`Kq)Camj7@XEy!FH}nwBjB9ZX z;=z;%DSD)RT4F*XPzx^y+HVnwJ`3GmW{AFve~wTV7;|$dWz*+X=byXI!bI_H9FkA# zNwyZ}!eDTakqwvr^%FuV()WpQ{cOcJxqNXB(Nw4aQ8kyiyHsTQb~F7^dPr~u*Z2xcB<7}?~mlMHx%Z>{e(yw9?LAW z1+GZrAl;!WIZn^<8d~)%9_Imdo19lblgW5@)@^15#w|v9`3tA{q1D%=mJc({vL&loN$Dqfkx63>Avct!P==N;8SCJejTk7) z>a;sT$RzU+Kzu5T72UyrJxEoOfDzTx7iBip!j^94{c5ph_rMYU{)wb^0EibEB4$k0 zpXH$YMd@U05e(F&x|9&~fGb3;8GbN(LPl6{96NKCZVEz#zwgCBKc8V5TMqs_6!p`H zdLA*!aE+0utF{)#lQgo6K>~8DBkYhJvKjJXkv$^;73^~JN@0uE9Z4NFh0%N~lDhEQ zx^FQh5bb}nE6NDQsFGP<^@z^^82Wrv8i8I56*cmHYz0(YRhUc8Z7b}JO}a`c z2#ai3b`PY)60Q}1_637%K6qx|%9L%bS} zN$w}?)*~g8m%<5|e!zb&GwbsaIP??Om6WpmrqqnSot?d_FDX)m<;GJKClaO6Eh4$d zj_Iw8r66D1`(ua=bR89WS@eqt-~mQr2tL7EDY?BzLKp4cXc471%F}u4AF6%{wAm&Q?Kv` zx+CrgSA>lMl8`wnER7{Tl-p8Hww0zJ<&{vb8_z_@-<2Nb`*{i>^+HVZC#Lx{jN`$n zkIJzIAidQ-A{wI*ZfBPS$xODha#c&-FK$I%73eNPaSlh?id<#Yj`(qcg97Gey}r9| zld@O<5$X{32G8$Dx9S&Cu~tg3dK^GDlKnbT-%QL#RLWKmyC^CZs2rc7C+0J^1}VM_ zI7=|(c$-r%zv}X(KcqI{Cgs?{(S*wjk!KO(eK$TxtfK{kNo^sMJ(!N9Qz*9NF}F^o zB`NlNj}2m?iD7s~xgQ2m)`DUviE$82j@67?^=xrWhttyL71(3I*jXyh|- zhSqg<&xQ;6FO;!D6?u~0;7`%$Xl#0L7gj!wMv4|Zd}G?d(g;f~+#b=x5u_n@ZXXq> z9+$BA2@_YCZs#r!Z;Ehze}eu_7yjYThIlHCAKR~R1f4V9;*T{zD<@vwq7dWs=Anw(G^B=WgsSO z1IiDQ#z$%{apG%fdQQQz>-!Amj#5*=g%XsN>aXw8_j?!PC@?oKl0bx39s}4v(FEEPvXt`w+*{FJy_4+>3AyxwB8o zOrUu8F!Cr7$Zw?{%bLk7xIP(00`2&gSUz`VOGj12$JT{3t1SGIqxj6FdO#P%^Y!cc zgue(`phO*#w*gskf9@nFubahgGa=#BC+Lrdo@bOLEP#0)Bu%s)MuFJ;0)|!~c>W?N z6N8AA)3AO!@}^?IU1u1OW&voZ1}>CoP|b0UlX7#_0!6`rl_-Vfg*AE$w}lIHC*W)0 zP=5sL-(sHtLv^rILM9u{hWF4CeG9L3skoYXP}yu~fg_ z@^#cTi4wUYIDC0~Ug09ILm}l&GBH4?H?iOO^5t^xW&b8;iMR@k9!(M-f&>Ecc8dVsCZkI zdk7=}rm0l?^ochnR=D&k*16InFaw;!6P*t+hB8NN3%Q~%to@Aq0i3l9#?) z2tP@gc@d}y|7tm6ocreBTYB~FX$d(Fc!=Yc>&{2#|P79MOcAg5yCsAH^Ic=AmeiSIXRmWZV5Zp5-e9y0ASOMC3d)luie%W;$6%^2;4o6tjR3dVWgyt)&yb0+-wfQBq2Gxf8UtFW>|7BL^$@8Au`q_& zAp@6Lk-hEr1JxCd#4CLw0R}=#`TDIARVvV!r--2Mefzv^gnh^B3xbFd_lR=%JoW_Bx3Vx@M64Cg zMNB@E`z4#mB0w|V*&}|}X{?V-Kb6UCrU=T;oK_?f;8wdPct>|~b&z#Wux0D)>j6TY z{Rf~;{IZbhU87&)r77vWWFnb|0TTC$Xwh;yddZL=9Cl645fZ@#|KQcklv9C9P^q;H z)Y4GXq&axPzWN$P<8SU)Y*iA;L3_30M1PYgj2^+-n8##&QOUgSA7aKExPRO}0^Sf1*4d3uJ(}8V5k|ib zZ|a@FPmaq`IFlRX%(J2Juf$u zZ{Ay-umTpcy|Vp=9DcP1Ygs)*AZ)O4Pvgs7cZ|O1HrQw=smgWBEhH7+*1=|0(}%PC zL16PTO}*Hvdt>5TlpV0CwK_o}QnP3w*=eS2im_d!keTLx`XOZX3_h}du}3@f{Zf?s zr=yA`OoZD9=D(`U zi-EJv(%X*G4QKq3BIttt?hV1*oJnbkmfc~Mcd|}VYRRl$m|mN^C%(XZugcF>%87V@ zb7A8}^T-l};qD!wQ>7j-RjF1mK$24J)l&x>wKiNY3;}$?>%=rzbjRdbD)sjDs37Jb zhP=Wikk64t0RkOxURrT&0103!kE5e1d1RM#gn#i*$*JmI5^OToh4F`u{{2v^1>%S< zKhieiLsvw%hK@UKaw~*(|9NTa^7UoQu$}k}nGySu4~Pfe+l$AOq-YAH<;X2J?+TpN z4$yw-#!DJ5Oo*Q!iOjT(e5HXWJ0?hw5a&n1fkWgy{ipI0SC}W}vP?(O?G`C=B2CoF zH?rJHdgurq8v*$TzeV;Ju)(!P;_4X=N3Aevh_!*ajG-eWmDlfqfZ`Gy^T7|M*OW*o zFDaKZ{4bSz)%pmn2pm>(2tWepgzUFD0MVa79N)YaLyolRqWf1}Y~iIHsg5FBwsmF4 zxw!5elN$=Ws*X}&3wuyO4Gje&lO>wYXMHtz5<`uRY66@k?&>*3PNu z(;x%$TMrPSaib)UXXuY#8TF2tY*mZJR2+6gbO=}p-@;Lh-18<|$@E4c2CuFy)jHxw z?wmVEDyZj^_8tgZ=HQA4;tInGcBE=o1d*2SQ60Zb;7iiKOkh<+5Q(I= zc787Pqr48aps|W&xPfG~qZgyVe)5b@Y+>SW$Xsm#lmuU@&M0lPiaM;o;J@+s)FS$X z6HgM`JAc%QEecwBtAYbQlBgn&F%!x%j=WCj-70Bt8*&C>)$mom^Rw8ljh3CEpCP?sPsqo@^AZb>){EbFi!Rf?a${ zvf0<#1*CBJh5w%ECQBM1rae9qGk3QIpuO?=#)jE&G+o!_WMZOa)P&#c}D&u4s z`VH*01HoF-IYNKKc}3?hs8C>9Sw2cWBK>&A*Q;CEi`g@yEJ z?FuRx@n-uPI7i_xk0Bmn*rv0xBDozc)TI*Ytu=`3xIvN@&*sF?w&r3Kt??~2Y#S?x z@c_4?g6rN)D@ZW1`7&ERRNbfY`lpzfptUTxLE&!>O{SF9*Obt_j%C&D z^E{GBva|=hm{Yu_8#t%+pr^6B6b5PDsRMrw>+MpwB*-RrO@W~g8q8qvCnMSTdF+^>^NX`y@N`oRK$^PQ3 zhKa4>^HsId`iHb8@4<1lS%~$ztBEA9vHr(Y_Oi%K0Tz&`te(z@p22}5!aPSN@*kqV z@BoJ%8$v3e5@MT>H;f%NxEN%E0(-lMku$FYLq!pWz^vpl!Oz`iqo_X^6HAEj@NTc* z15u$hLN3JY86D9wA03YWD+AZVl+`W#2j-i`B>n>l!(z#A&wDzseYj=q)i!f2VC9in zKpk3rypADoZN9)v9dS-yf{c-y!%*p*>q4{<8;G219}=G4+Wc(9nH1)nTt%HJR?hrS zcH5oz40JV$xEf_=~yWLIwjTGjeose-pHt zaNJ=jp^I`}G?;|a@DK)Dm9tje4RKwBg^npcx zm7r0=y_}@ojG>qy6rEcUu?T8boO(F&2D}C(-$5bUp}OzeFz=kKd*3BYNYYOW3g-+U z%+Uq6l7s>1z8=K2<40s3gltD>Y(qIJ88^9w{*%^=bDF;VE4q_Q6HGMw$Wc2)bAtgH z{5cs1sf~(Xh7-FPkGrj~o-@fG*AX03q|u`RhDe1jSiV-&<{8FfbS2_TeL0WnG+m3O zkyMxoYx~E|sKY9fvtm5NO%sCabzzs`i`z(23}&6f0soxJc7mguF`L9P5l$Ar+Q8@o zj?Wcljwuc%|5dGaS&@2{$)TZR)t&fosj#4Cn1JzghCwW>sj{0Dc+nS$LG)KpXIY4u z&c+2ic_9wKL*oyR4Lyo@NqvA75cR#o2Lh8Ds-p-5L0+3{M8P4D;cZ9+e0t@b0Yo(0 zqqW=dBVT2a1Gk*^uK@FaJLz8G!*>t`23<*tr$XOKF_%dY3Xd(_DS#Eph)(=RR!2M8 zi#c0rIOlu1N#d}X`cXQck(7=4(VE!kSl*(fQlhawM8WKfP2Z9wD3^Xg){_UDM>2~9 zivQc2{VB}cPBVFxwJ;T$&Q6h#Ql=r8u%iT_2$63mj4gf7I9jFf8Opb2)W|Z+sq*m9 z!DGP1o$WY4HYVJVbw^{1;H>0iL7AohCnrW1Nvv7=5FxUlDGRk5UC$=@OZhn!chJLs zyFj%Id$>i4x-9L?mG3L$Y@CQ<#3*U3wtbI^Tr-JQa$0iAW&fwspy}qi*yL-$2~tDE zK=T6Il07(tq5cSK+{U;$P?cYxUCo&T2Jf2Q{tbz)xMf?~R^?$kQ<}9zSG5de8iSd% zRcQ&9M8CU8SD{}8ElttVDsfwdrs5wH^%6t^z52TAmgS86Mj8dv@O>d1eKQaRrJIN zf>ttdhIC*?2Y@nb`Y~K+f6$6>H+UvvrN9H>hI-#DpR*xFuaVknHcO}BOO=Ll{l^4S zr~C?E1ID2D#lQUsUmG-(n*M1ztNb|{sexgQw_zLuKjQ@V9!0wN8VRue3`b&-vUaYk zdzRD`r0Od(5R&DueWrk8_fpK54`Dj@7x~m6SPH;=FhSy`vryjsat;#EL@q9p^#{j_q9br=0tv6KUav@IdSo-8prk;63wu?fTn62^H62zG(Fd8FTKCPk3m%k=veEZye|;o} zmmTbh4VOt;vYpm*^m9N;I61D)FeN{h*bPb+m9BQAlv*UJh}=BwIyuM`kID^XVNL|h zJg-V|q*QryAdK!SB-kTuyj#K76RepT)OZ^pbvz`MxF{K4&ZbnOq!v!-LKBsTferg1 z_p$1LaXuUh3gEl&LW2QYqfYO+0&=MVF2s7PWK$jMx27~@x3yH38&;i+A=9k$n1+h& z2hC(q2#tZ12BXko@BadV)&`t#8$1N|OHN{C4l&W7NAcNtf%e+d<;`+)5Z>CntISch zPO{xOqhy?$_55UG_zVRWag-j2MrSReTwmEam|Jqm1gwQYTv49v^wHW1Wey1RxJECE z{t8LDVU;p{-f|Ftr%_v7kAC5Q%^uoS%s21ANN==Z-zk{QDutN4pwlv-j666@MN~_r z8_lGo4<228v{7^;H-bwcRlUt083**2yn0mT&* zXP{re!f=ySY!UoV@eLK9Sa+}|kt=)V-GS2>P2%iZoFt~hDZtSE+HOqN891J5Uilz( zzd$40N|iQ=l*{(+G}f8WbA+5A*Kkcqo)0P-O|2c~@X;q`SG09)_9O>$e4H5!3EIG^ zA@~Cd1}{t5K_#nE5jj(hyb3zu)}DDXliRoYTnbpY5&oRoH49DH-s=v*VRhg_2!}s2 z7qpTC@;`)UTQo6AWUBpPFyJqI^S1B0P%A$#Fu_MAMv?}E)%(LSmYTg3atuSEvLK^uB{DRS~@s+qpEg*u=6tXa4bZ%INkrK(2VOf5^D$k`x; zB<%yutW&HJU1!VKlcnLkXEk;DkcDuSoL$zdqz?KgeCfJx7m)e2b-Un_~Yi%Ywz zcn3^O)nEAW5k2SB_iRXQ7C7y4_(0p}tqk1wDHR-+JiAOaSonw@Q|5~=M!M5rO5AyQ zaoHLK)|J>?BL+Wf=S8SCS!o8`Bezhwx@9hAgKwiHI3*bgESFS^fkqtYU`SWmdj>5+c>&$+b&L+~0x)#A;hAanP z`MDX8<&-x(B7#gJ1(9Tw*evR#biK#`fBDg9*pS_F=bRQgCf%Z{x{DV-E@WJ6H)42^ zpTR;TzQVL$d_gzTy3nXx5baRjE41~qWO>u0(QP#S3}ja5h?GQu7zgNXg3rGHuswt@ zlc?}@tEFdk(hIV?SVpdA$m#@m%N51doq%|^3YXx!L_M9{1(-3~_?V39hj1aQ4)Qk! z`>7DOj}Q4F?64dzv-n#gQI3tz0ml=$A|b3}b_9i3Ci~nL&nLO#VI+o3bz}gbu-_MU zLSZq5V`Bg7K-yXaK4+0JNr{o+)0Sod3+q9~1-1=@1&RmU{ew5S@Z})mUy)(O3^*cn zruENgkAY{=j1$-o8Ps!)FW$mle*|NRUc&&68S#w>-T6c#f#X>lx@iv82+q zYxWJ0XZe7@{*+U;ovLXi#?fbY2E3R1acOmL0SY>h2Z;zp9lF9eZt@q<%v_>`G=YH? zoa2HbR5~p`{qBnGbP_WB4XcPprOfWuWDK$jxaGr0OIA4e8Nt4b=c15%@ipx2!U&jj zz4$7B^sR{x$DH#Qs4^?%()?=*FF5FWUPWI)CiliAI%}rN9BZ0%)V3b#_uy^O+(M+t zKIHbf)CdTTlYJCwYwckp|F)I;;IZ{iY?OpL*sT6AtGA{|cDlhlDTx+7itN2lR@7rI zDhm^KaGOGF65`f%3x?2+b)@n+6ka=F9@t#J!_51fbWnHk=8j%m7s6H!cK4bFA5u(sCNQ6|G{P z&kt6$&kRLV$jgzc#^{c4tQRP-{XG97CyAJ?Ic&qo=K}u!=`U`yI?QLnRr4`PI`F@k zga6ZoHamQ7t?U;Sipi4OYS4-r_3)UAsLb!{cS4ModD z8#@+kc8eunNxALd!Apq_-XTeZq&!F-7-%7C%J7sG;X|8^>KeWV$HXU&yDAp#&Q%=) z657L;Q=M%d47IyNCK`209ftE^IsKGz#=&CwX}HawU^I{4Q7M^S!at0>^0hY0c-Ic2 z*q(*GH;dM)c+4%W8bXWjw1U#>8wAi2_H<_QSh=%oT9^wgLM=41_K4cbtIvRoWLDqi=o&WaWqOJ-P^(otRu!<7Jm~8>QcJZ;O1P%{U^y#rtnD z$Q}R+I!X6$F2YdmE{cjs-W|Shhm|>7AWuAe1Xkog-2lJMBD~Bp4u=VeZ;A{v#)-Hz zbD-fa7-a4qYkPkfB%QrdPQy8YL*@m6C@nh0H+mKrNp~Cd7Ou+OK5qa39HUWy8H@Om zqh2QlV%}iB-TUP4q$N%aVHzx=E6^zIUOMIihz4ZH9*xklI94owMFdJaF^lh^jVv3g zAk$|sv5yN!%{q&f@aJjALbcRHw>xz7ByuKNuuLlT6<$7S@56)>(N=oH3<(CX!%-YT zBSBHq)&72B>f$W+0bJ>!7WnK)>O=*v_c>j`LT(94wD^$F# zD**|dS|YJ18C3CK=fVE|SIrLvlrL)UI5R_=s0Zdb)!JU)&jM*1tq8{zjz0Jer1KzR10aV9u`^nsrtl*17!pJfoIz(}E7kIiGdv62 zz;VVW`Vj?a?GcfI6qF=FeqB#*5%m~6;6!5jvQR86^2~#vSp9Tufh}Cw0n8QX?Pi$^ zYiKJttq3?M&)9z+LST+fBoWq?*(|^>O6%Z+bNk4O8$LnipKXV*z@>rqe#nj9FrS6l zBC%c4L~|cOIPN=?+q|32XJMe=Y}7`RU~vf}l-79v$o_^-74AfDr|$Tmd@rc(_X!S; zGKErCNILe&(g9ey2BC%cD~MY_1n_qCuOXZ1ea2lu@eRjLm|*oa-)+{#=~vY zut^m58VH0DUZv|6hNE2*rtW+>J5XbySJsJ984&G{$=w9^{2Cr(-n zog&{Sr^S~%Y}j?ScxH9phIU01SL{7?&5Dyp2t%{mtjJI4mP=*z)45z>aTL4kz}tHG zhw^YqWg;HXOo~N8^J5Xz!&BV8GAHaQ!2{6*6%ij7h-u1%jUM(G@BR^DhLll5H`v}s zj#*=*p|%(=GB=DvzD)7pIuT~4w<{z%7#JkGCb_x1@7g+9f^g38W(H=tna!P zHtNK7ycgi^l2AJ#$`2#dC#fyA7$V&X^M<_2d=I6(lLDv|oLrj>IBg`?L@*{2LV<)+ zHas#XvBu@SuT{EcyN_(T0UqytVHRuv?>(KAo(y<+vea2Ln=A3c*yP{8#p}QDH z({=hixR~tpB5rdPWdY?|IA73XucW%Eswa3OEL&6|EIaL|B_*8~z@i5z6B4V*MFm3^dU03*@b#sP}mtG%tjnv4@|q$b7&-P0Q@ z{0BPnFKq@_n&UX6uy*?mA%qA-hOPIp^2ut`*B+o)Yuk8PQM4Ir2%H%LSP{V+C?BK# zicoz3_&bCXS?hoa+K8&-NMiH^t6g_@cu&hN?`RiEX6g`{(omY{`iyuB4dqZ4u4yTM76QzPM z8;*}y49=ZzW_BGkw>x@H&NX?4y@^~1?~zALQOfub8pOUX|UlZ!#U8}>vWj9`G46#2Jng& zOR!KJQdBviNZk=3tNq33h+VQscIHu=ulaw@x#Lbxac+{OvaHcY8^mZ11F<$d1jh}R zwo8!}j2sW159@dnEU^}d-U4N%Mk@?9qceR7bSw;-#dQ}_W9P>BMu$Zdc>%2RC9O-+2iRe$NLWD1nxkXE0fr_1|SX3Gb$JZ*qqw#nB+i3=hE|d z1k}{-q}PF>@K@AW*&UQiK9kCJU*`0$ie9zW+k4Ioa(r8+8RCP2DmW z1*%Q*^ickDcm)o&%cFBhZkI3|$SfU3-97PaJFg=GH-!|qRt(@Zc@)2YW7m5WR_d?% z>3Nk5ZMlKqE)5vUU^#%4L-5~-Xh^`RO$d+%2{*+8)cR6$43szI+GhD={!UFzq5A*G}p=jp^7J?|H{tfq1iqW9oyp5~!MRgx#^S{ffh<5-L2nt5nko zt9py1EZUrgpihyQU;CK33wtku1GaqSwQHAOVKXk_GiZwqI(45|g~Se1Xf#x~01Lv+RpDa5-^xgoaz? zSMH4G8@o@?4Wu8qO!CSKX1sb$lqUl)DX75#+-?G0Fn((v*iW`h9BFx?L+6tWDz04^I`eje_ow(7WN90hKgu|lZ1&`=4K{f(8mmPP# z5bCa`}ulpJ}TgehQGr3~B$ryBdTf?xbn-f0(>N$C=w{$>uqhG^} zg`B(4Qt)gg+seG%1s_c}3LgQ3zcxn6+-i4Zy>~GH%Se@bm9O6cwX0H?*UI+(6Y5}WpNaZPwX%3B zfZAQ)v&^+%>A{%++U_yRzxasDaw`d^Y)+V0@An#h1}6S>ZzbQg8goq91vaM}&J(iS zih+b7${rD=*Z|dVIh?7_N9p`ZhCOW&X1m=qkwIfG>g#6QsTU&yk%?Dv!7{+3TGan; z6eFDJwc;)T!>3pM^x;=}gJ{Cz&}U+xTcVwC^vN;~F1n;4=iH~f)s7U6?6aXSwxW39^z1%b z8VMb!YNWiUOLyj&P6_s{emk+7-V+w9XM=rW(E!h>WF9FEyCHslI7^f4 z@)nlZPo4g1DUe<#K`&7hoav4c;6@#3JhlI>99-ANU^h6_vp1MB1U12F9^X8>&x>&C z)eCO+h5M(wEmK;V1kW4hxUCX$N#f=`mUo_!TT0Q3L8G8tzyVJ&kStuUWZdJ}qSK?o zMt(5~nP|K-_cH4_N1xOB>&Lk&vl9xhW|>0for)z<*;f@9is4q2ICh_@Vystvan2I%VhUDKHY9C=eHHatHjTx7kI{4?y zdDR0&I~fJY>HQqThq`WHA9@x>zmLk)o6gaZ%SVcq9Cg zdEw6@k#@PMOj_N7zts)QhT$#2Y~VG>`~DE+#&Rm-9z=-LBfq~>uVw-A?G5!#uT6{R zhq(#h|CJlOm(Sg4x2521K1MEI8rdq+Cb8V*XLP5mf?4eGQ*#d`_#4@Sy}zu`$2Qru zyp%T9n)`!E=>lQv?A?vfbG!7_m2ksv(M^wL>Zex+R5Al9v-*c8kVJ^x@A02E*Q9ll zpd&k8q9S9Y2=0rrE^m9rMBuwZO~xh=*+5h` zveb*-kX=KRLA@^Ov4Ff7WuX|DJar8OFnddMJu^9T^z2{>N-`vl=6z!kbH6#pqaJ(q*<-!E<~Zl= z@y=r2d50YDjk&nRjQ8k69p>J#s5Qqt>|KW%cb&WLyJM_F9_p}v9Q!Te@x!7PHQzkr z?M0q(&)j2=!yf7phat~C`%vsW^N@QT@}9%&I~TR6HRf65dK^XHMKRnT9>-ARJA1M3 z&BGA)-p9R1oky)h&ciO^9*W`iVdy2L3$*2}v1M%q(pDfX<4_E-=VI7B?^$acc5!>} zc@8`GBk!U2n(N;C#=LKgu^4I*haVPwIQHGU9`_!-9>=^f-g_b!^ytVgR@9sV3IO81dz4gfRDB>_{`;-s zOj{2z4!iF=%$Vnp;~Z{}@rQe;b@p5gJI@*WFyvSa{f9%3MKO0#%-Qpea~3<+zK^iJ!72v<~idWiX8V3W9+jYMUJ)J+=n~tm}{*? zv2)C`q_cHVV%qR1`E2;pI(MzN=6lRpseAVw6nC~ZOhnq zv5P&-f0kO#0j2tXn=!F|XzQ3hB?GoPQww7S(zF0np#Q!f*Lnums2)|iWc5< zcDBB$aAq>}vYX!A_N(n$ZW(*cw+}Vm+v9L^-9?SD=Gy1HbH=6ZUH!E6Ls<7Mj^l^7 z?8OmtG4vUK7;g){hy2rF*ANI+*lf6TjO2*R_n6;0H|ksY$=KXw+73eA0uzuyFyKnv1yy$B4AsP z>JMAnSM;_g2;4M*7oD-xb%na81-3e0QK~{+lmu=n8rd)`bq4+b=({38?XmsXNdRh* zO$A_8JD}$NbigZmTXMvE+gf+6v(^l)(e>8#mT{=P=tG=0h6dR{5N~(`{RVEDp*0v< zLp?DlmO5KQsE)TTDp3R4Q-ykd`nqUqL2by*Z~e<#4?oN|%+MO_`eA4do%`OphirJ< za8Azv1!Ld(d#0Fd_%&~Yvq>v*tJsY&c!cd|7o%34&j(@n`JolV;|K%_g$I*Y;`NsGtRr~tiz18_M^@kl0&`w?l^C8)Mc14hhW{g_8yBFi+c3AL&EK~=*N+7 zxnsVbrxxL&A{{w3nk49v)@1Mq#mR~RE+ZmnVK9S9(rDEL!dE&L4DK{f${rv% z1Lk1h(gWV9!7rx8$$0fngM1zf*AdYNe#)S>%Wliy2D(fK^%>CxzfSWIBp5!1O{6n~ z8H3Yjp*^_*ZEKnoEZk{nrcb;E0h!1%;>Xo4S8$n$HxoVk8*uSL`|=@4K~}J^0=6<} z(u)z@@}o4EA>tt3JQ7ar$Q5YYPIEnp(X+po4@taN^z5&UxiY!q*sSvGqOx?uBgDZ3 zjaQ^XdJhg>F|H7}!Lm#)*sPDig~GBYsR9abNNC1Mr;#Vpku8mq>!AmCdB;j7o{ks{ zZ~}L=cq0~ro$U7&azIKiV}O!-gDVZKM*?zJ&PWGe+|}Ya5Gf6gar(rAtUQYOpj0|x zr-?K{%A)Y{C}tPw8dB3S38w6#N_)aIGIVGGePnKQwD3j+5rH9*6sat}1*u|TDXXl| zCaf|_MW&{_5Y|ppL(-8?FQsrX)6GIDQp6gTPs|j77sX64#}8;BGT?H-O6Xe_xf^ki>R*rx`R#uCEc& zkxLoa4Wyq=f6|N0^-Cnh9vS3w|)OPdo}IrNIc0 zd*($1A?LE;poJBYHUu&tsDp}ZAmz!OR#EV@@N2TbDhr-PR@sP|7vfz8#uF26nWrR# z(7-Zd%e1^B$`&x#5rYA)KOTtp`=WT@#{)5_B2m0B)hAx3J+{wUSKsX7W>bntaEol( zE8vgv`JQIW1zJ~XDMJ#mzAARnKOOLjG9=MvW2@DJu6_&3kVNh8tnZ8z@JAVv$Q+p& zk_d-RHbWAIS5J_AC0Hp;uio?{`%*QRt`Ws9n>p(R2j`Q1xiQ*=F*9v(2n3^1II1 zrd?C5(XvEe_nRqts;b!RHTv(_e)VU(2iC3tye%19TMXJ!0a(o+Tie%aRoBmZs@8Tz zqA(^X=M9K{{_pR0F{J5_SB#sAq$zo7MNaDNIGND#|SN{3`0n z9*aPiEnC1GDmNBQOVOxc+mM^iHhlUgxbqv|*gK zag(7;0cI^3|5ed1wtBrQY(Q-F#a8X9YN_aVoh)u=tk?`?{f`2}{a67h>wDGKi#^l! z2S8Py%bu>Ue(uL>t7TJ`YUX~g+Dbo{-LZA`x%jJS+WM>y7IU?$_q(6VqOW@5b@igJ zYHe`!+#MG-&t+LOU45(omt8+rz<^cC zrs(^z+Lfza1E{N&`?1>mvD($^bFI`_>vLOH`_pt?p*j{#TOX@kVHIuP)=yiOWwC7f zy6I=FF&4{y>Fct-mTj|N-&g%;yMC-zhXK&m+yqNiHyPh`#?Y^2*)c?0tLg>7 z*Rm{DU8wt6pK5JzSJr*oA3$AKUz@JJHeI#s8GBLHr&=3aSbN6)Pc5s}{O;^)wN}>u zsp^BpTx{M{bX(PJ+>qPaQa7rVv%M+`Q_obzqA>TnPL`3T>uUXO`vd$oP0vrYHh^GG zQ_}q@i@xdX^8=hBa1(G_-_u2D`pb=)KUJM0bJPA;-MBw?5~Sy9^{iI&JvHeUF*bqi z#VovBs78VDa{p(~($)Q;?VYjjtU%|VsFT0u>)PJg3R|rzY}>NCvC!7F4Opqa zJy};h+jko`WIBtX?$&na97%Y9qlqZ%+kK>sT=%>cAqRQF-4HO;8%i`p|lfQZ|k0Rlv{Kx}>8*$U;V z3Wl1-1f1__{*;ZKZX|&Fe$h`=C)%C?@_Vw*_s7NnsE&nTpgPR1qjbjpPOSX8=AwQKZ5gNzb=S~3N`DB|vD$N0y)Ef(&R4)6fwsIM#qBeydqrtF z!)!_smx`+Y z9X0A20NSn^JzL8({bk;kUa)Ph`&*WsiMEjZs}u9KzNhoI^*vd8jp}~rZGF$frJ?|Q zlq7Ogw~Drm>PW2rQ_G902k!e_m;9;fRMD1ge}HxS0ow2WmTd!|@0tD%34LsR-_;_v z>zZO*D*AF!^(4Km@7Zz=LsYk}zGy{Vzug4+kg1xy8p0K`;qm53ngM4ElJHo`UqLV3`6XP5@nZk~V?Q$}u zzubk!ez^;}(_Zd^hM5Zm<6U4-HVuc%=2N)~TH{V$jXQa}w`9?jH;*1#<61utck;Gj zMipf`H8H|;hQ*=0I^&A449mk{PRy)yI4@jg;$b%XFikvz3xmQuT{8PHT@Db_g&{Le zE)P?Ay5vq%A0~lL`wojvQ-CTOi-;*e6Go^Y!+0oIIL7Id4u+bwoTT9J5e2Ln0R)l{ z9{JFsG>Q%8!3`XE#EC=rPD5~9ZX3awQ$+${U8f;@NV9;!*o8TmOuW<54C_FsI9}Za zKZ1i)zzbCj#073ZBW_ch$#gDrU?}hw2m|Keo*J-FLd9U$#KJwaC=CWdB7+-%ts$%g z;*RP-xK1l!6ORM2P!Dd_P+)K)7V5!?7)TEeA!I(dEYNXqD2NE*Jg|w!i5gxHE=+_N z+#{2q$pQojh6^gkVH#H3tQZTZXZAh0h92P#XWFd+6i%~dH5CX4o8 z`IY-CxtFN~F_kQOkxLMgWT8DH(xP^Y$}l1={3=Km`eQ^Mj7STIAcx$-`Exik{v6K3 z`F##&etZsRKIE3{Bs-lDN;1#k^fHID(;l)#OKiQN;~i%Zp>)`W zClJk@yk!C-qERJ_*0}J8@^l0eTjOeUE)0sNIlxL5t=X!Hr_s1Hm!V|QvdKG1U_@Fa z*`h`I4Idw%&W|$)&60p2IAelEXIKoC1O>SfrZtPinKP_R#Vtt|y3=50E5c;_VNjs( zl`ZTsERTt2@bR`xtIF;&=~!k98gnupAIU;5W~j{wn|PQ`lW7&3JIz&PCf+6U9!~J! z{kYPiK=X9Tme8r_WH$RifVm%E7!)y3X5wAk)iTgvCyEdB5s->V!SZx6#k-JBmq!GF zg73qmXrwf_(=rg##JjK$)B2@YEI>N)YC7Z=?ljhvc?gh>+-aUbr>$)0n4vxf5lV;y zb=oX<+T-$=c#q3tgDDG*F#ike%>M!{CF#hP(7Apd-DNWI3^MM*C7TMFaZ)-vMM{G~ z2bpoQ08Koz06`@|!A|SC&Z&qLs{%Cf3__~6-h%WdoHe#|x9K@`s zPdu*!TFP?uSxO9k!OAyqNiatyOoC|&DI-j|c)?1SDQ#PR6vXV{5rPF(Ix&V1*pe2# z(wSzO%(N_9=`@UsfuU33LWm@1yrVE6W*a5f(=JsiELga7KuXe)NsTmp;43Mv!N}8e z0Y-$uA-P~pk2DgRBlCfxIf}3PkQasHv{7&hk4UAiN)xU*T^BHzcpbw81B)40Gzq3* zL2pAMWav_ohp~X{V0}4xrmny>C5h{y5{0*h2;1J#gKZQv;@~lf~@QW17 z2Byf$pg7QUk2*gdrT%)*h@U}(Vu>_#m*cFTY}-!5s_Jap1UJwrBZ-|N;OyhoA)QR| z2aSODmXHnR;C9-_O%B}l!3}J($)Xzy=ZQmjkMc?stJ`*3D^akptN}G^A7sRl!k&|c zFA+zn0~O3cw><-FhlD#Vqe>aP zL@sqfVl)yI2)?Fs=(IxvCBhH|yhXpW7XqRXLEBL2w1{joE;v5eWWcasA;O;t3Le~P zY^Y#i4LL)8{hEU#LqZQ8NZ=UQ>5@+pPC(HxAf`^EJP>bd3K@Sv;tVPE$l$a5sIU&< zF$)VAT%cp2MCigC2=Iu(CKE5HBv2f$K8d6Po+p-&O&X;^=)VvF7@^Y)GM&cJxDo|- z+L|EYT#WZ|^~n*UfC@^V2lpu?7+gr!@(hT|(p<(wNeah8>CXb$2P3l6PL2>I;?XXjA@J9e$^Jt4 zD&N1z;p{MCN}Mvnw5<9dIo+d}7y^S8S;6dsBrsVJE*gK9vV7!*%j0N}MErE8bpj?z zULY4$F8TTaI|;x1x9JH_^W?*WFX1tx&=rmT-&>Dql zNN94Wb(-ER)Pw6Zv6X6Y1rQO!2^kb}DC+!-hc5Y6Pmh+@}>YQPJegtKt=gvK5l1Yyg}n$DJzBT&f;FA9S&@O`F6;9@A7~0EYC0@pgMqexMt8nWWOh8#bjg-Gb4fCdJ5g+#t0l?21=V0OcXz>=v_?2E(% zRoIU(sBjJ|UgL@^1nY8eEdpsoz7kOH(rGSYvKSzD3F=&z0~DdO?W@42F5Kuv zVK$Nusq#rKUW70&es zAcXU zth69iI;~Y;(6X{tP8Y}kV&X9nDGmM<4T{Hjlr|a$X4XASPr##HPAOQK8j&Dr&BX#2 zat&H$f}11KGvF#95t;`Iqf#ZUvQ33P6ZJX?R2-<4ZfrcN{NSR~CAVt#0%aeDGEg}% zW+IZ~6*eZLL109tdN(l(6;OdiHC>FwM8iX*G+6yiSO+cKnIs_g6d zLOnPPPd%=}Nbop<1qk7E$b5Jh2%g+HNRj&>D_gkYvZ{PZcxdvILVQR|0fGRWsVl6~ zX`R+WuV^p_l-(8_&Kv?4&=%vJF1bPB2_cu$*DPM$e-tB^Y(%L=;!Dk1Q|%ZZZ}dnj zPeMcBmB5|XAwb{=yjp2HO_n%#iFi)`!Xr{)orypYB_f`|bO1vbk_*W!i^gjuAte|O ziAgYD_w`O2%xF9=+F;?KBmvBeKrS3m><(q3WT#~;1SvgHNSJzrQV7Y40_9yned4ix z0(YYkhUC=GjB^Z_r3O`jV&t8+=~gL%K>&`2LkD{)I2jSBv!nuI0#xc04$hUZK&rGx z0!@L2g+dmuZreA+LCg?QvzDahSu3!f+!nmFZEL{zr0}A&Q~2E>6mFFm7;vW*98?Rq zaqvjM3=#wZ&m;^aoW7WZTQBzjlhDlwkNYFSub&oRS1abhD1wa#Lq>xP_Mj^Un+6>W zjzAhN7;Ly)@Crjmo+%_S;El40fJZh+KCaVV8ioZ&I`V>3c&CnQPteE{A&8me47^|k z4Nba@Bc(l_)zBLf8v+lw7qeFb?`ulw;E_$tk=tXq2bE4sDSajIzW~JRm-@_Jugt_d zC`c%QuBy{Y@GBu-*}~w*h_p(jQmOQ4QJ4`aK@emo*$DxmI-D7GICFW(EnIpua*09n zbTJn#)|6pQtSK|;G>2@_0?WOUJed0%F!y7}Z}?xSVBvB%Q0H%;PEkoz5|!33rNLzk zl<9Pu?+z%NGl+E9PVNpUyTe8fD0^WLp>$a9fU-OI9Z@zX#*vMQy=NRwCsR0IB(XcK zlPR2+yP!L5)4(?kjhDNiH=EaFP~1r6{h5iU=`>BJxsz9GTw01jr*vk}sTr$e(V9+U zAh^xYrq-*%>|E1bEuF+HOABt2T;4U}kr77at0q+nVG|<7|@5CG$ylqnj3ZwDrts-2wx`V_9H{kkIo5eu_BC}c3LL(F= z5dP!97@Q-iSzBswlR_DpXhe{Sgm6O?0?|B77Mg`Ql|UJfVtOyNN;+*M@+hW=^ARQj z2egzKW{xD9?t*nqIv?!Mc9#5LJJ-YD}3AqE#P`i zmuzuW8SpDx*i@E?(m?aOMYX6FB|Bv{x^DGi2rWdn77yg;2Fci7$?P&U_LJB>~k z9#FPHB$^1QL{t}|swgExG$Q~20001U5&!@Y92N};C9~mN4O0Vr6o3L}Oe9D+KrAdC z5(z_*I4BH=#6S$AFc5fI* z!2!yp=^>?zGyt!yXqMJ_7Mmmeo5NwuTj1F)vHb+Gq*f6~Vv7TZ$=;EcnBx;{b-a%W z*b+FyMVwCT1~llx0wA8q13vS_=O9DiGT*Ow0%GciTBTXHSK60tKm4G~Jq|QIIFXuF z{U}sD1_;3iKYB=yzFect2S`EiCUI@I26`dpiQVfmHT0-TqSo$IuTeeM> z&!+U!AtU~Ek^BW)z!6AtO@HSUE9q^3`d^nhE3zS*3KLrd1n8lP1>@c3c2H7KlN-7c zV5wUVon@O^ue7&T`OMQtBUc1E`fCp8Z@J^-av7qmUo==o`62EVCwHuw|Vi4K>68vxo+0G&zif|#dzOLNf690*pY!~ z;M^S63j{~8x-GL_4Refz_G^ho91)m{5bXr*n$A$1sGJWbbB#OCsQa?_bH&VSVj(lw zENCZ7+of2{hPEbF;ahFJ*S;y%pw-s>4#dD-NBdmN{BmDHidETT*(bq&CB*UrZ4GkF zwmLJ68N4p|Tpqw96C>DF6P@@nnK}2k@228wuOZ!3_vKmcOoWO>yw$l(PSM+ET#Y6{ zl>-9(2o{`S_VX5lUmpMsA;>QYO2s-`05E8C5!%K$pA6q0u*8Y^12AFKe1Ci+2&m=E zC^161kAlH(-DhYJ(-()`In>V9Yfsx+79mV%NM2nlGW7XkM204@5{B3YNO9U{s2`}P{U!U z%vjyh*~Zu(#Iv@C9fJ^MWSv65C2>D&$Ra>;FlYi##=7<%W)vLKnCgcVi8DAP&@$Zt zpbmD&~Oj)*VQWsdxHKb+LIeC=ah z1<4|fjQln%?QPg#beM&OA4q(D*muP^d=xwg$TQv|evhL6>~$i2V5FZto*=Z`Wu@cQ z2+mPUF7BwycnD-YVZZYkP4rhp9 z(BV!X$LolmTsv2j`+Cew+c^`Qf(t-s9(8N?+bJ zmx(;@n$s_ZT4N9H&>j)dejo3~q!`3+!H};2mMiCT)q&z?bNI<$wD?xw)Yuznbg-SB z@08-;y-l2ggoyDB?@=>R2}UNi!PI#;D;ykYE1pm+m9a-hJi&jP7)@r`h^M1kgdfdq zp#wSxo~{}aj|6$#=3>?ybAStA2}js_)x%+6?z=ctf?hU=d3=jLi3%PI-X#eAB(|lm zbtDU|#W1MrRQ#}87(G7Ol5HbSuJb7_?>f%MOS5~FuFFg6&Q1JdHHhl&Bqp4aF8>$} z@Pb~j*J%_I=yk}5(W27`9%DZZVX+OQ$VuDCzt1|NFWa^$YR{LWv-O3T$CI%-@F>LM zvh{Bq<034v4Az#YY*f#P)om6UCe346=C*q`1X(~Q#$>ry3p0&_id8=PsZJ}NuRH4m z)H>hCb`^xF0USw;+V)V9gwv>qS)yg8|Xk@Z-G z2@z*C#S`Of-Byr`C0PIuH@t)7Q=P0 zXHC$+dtI%Je#9-mZ@gYSOV>?OmzR}7@2Y@i0FFYmloXp7-f&L7TkYDWCagj=l&H07~KrQW0pEo!P%swnK^eDl(vWZk9)G3y6!)2I=qd zno|;!!aRGm88`WkoXkJ~3JscN_C-?;)b?2HMVIE~-YrO&~Fzf7d zspJacg++SaK_0hFFPyu9OrPOWnEdacB71jF+1dru20;9tG1Rb8J4eb@aeUs8AbCP& zcWa+t5QwkgtxXbLELIMqyu)>}wD?7do%x~P=d5?3a(bD~nC^Z{y^Clva0v!)uQPc2 zQud|ec#f*(YL{p3xgrlZa4YPij)8xv5Hp?ot zE+M*ji!U9PfkXP=vUj4l++r{bvB=U8R~%|!%6i+>zmH3p+;wCVqfK|wnRGeW-}NS0 z__ytPTD7S9Hy0jp$}sJQ&|kdaIF2s<<+izLMTn;LuXxS)%*o;?`nP;cSH{0mm0f|r zzg!sCwKqk=Fu5Da;aIFO4VL#r|6 zY=(bpmP7z5RrPKeD)^W7CYc)!Le#%1F9QtXUnS_@2OcjFX#C6m!$p>p<|jlE{}#9! zeXoD*y6D(m1jBB9HoZyX|JUkeN-!qg@Gs1_fvO*%u78DA;>c=#jQ9rU6QO@KXUZ;* z)bX&#eb-&EW8SMl#pA;_p{c=`&|zvJJc4TyiqPpYAok&MSAmIKxoPH7dWt(S#= zhviu|$9ni+(pgS4#b2@VoBPOaaX@;SWP!xs38MpE+RVQ6V#c(`uk*>SelB>y(in=h zq*EIo_Pw~2#NbwHvqoGsKW(;}V(bc0n8OhcleM0IhsBkv3L>ni9(lSn zaJn>c8xON9#g+64ozYZDMNDyLqudU&EMj)!9aZ)w{@APPFAh*?O+9n|Y%w;xEtDKG zmbw+FCZHnoUI%-zTcc3#JlMI6`&Dt(06jp$zd!qBPrenaCkHaT>9%3iV4%1c3t$;MmDLzQr6zTqy!ASp1L7=5$ z@Tea92Jz=G)GENjs3VJtx{G55k+2G+Z;?TK0R%g1@@}!aQoz@U7e{m76j>7`N6zP{ zk#lee8cx)D@B%2$`egik+%>m>z98|P8v;+{-TvXg!LQ(NP>8GR`4T!%a-{qz-4uUp z4ZgP=AbC$fioX2vs-D5TK)qA6m0ziMwBT)fpFl0Bmj~+aAGMOD9YgjB`|J32*QJK= z3iZ;VN*Md*vXJK*3PHUz1ua~#?~J?uW>QXLJJnFxO9dbslX^knhagYaLp}un+X7QF zJjJ%#CmzLX{i0hHA6(ZAPX}y>GZP5;%pSXRoE40x^>U}}yxx*(9qX?e8KSXO7;0@< z0d=QrfeDaCP(eS>PhyKXMSZyNsxjaWc| z0A0oKn*yE>+PEI@3h^HkzhbsU?fXy>+YgE{ai$%SYnzS8_AnTs$&}$3Q&C*86eEJ) z81PdOq@*|cw%0du(Ke*Y z6&fZBwpKQt=$o8KFLGeXNr+<*g!JRhA3X}%fOGnyWO~Mwh~ZO68MV$)z+tN}qKrOs zGkwQxsB3VuF|(C7AB+fv?6&K3lUHt@H|ix==uU~lgyUc;&vI4~a9mkWAl3lqhU+<> ztJg%V`|?s3KgLt%eviYe_r9A8>#CPWDDRFoIzFqam-u2eq!`oMp8i(7+1v!5keo?O z+bR3vKKt}ATj?bZHrR9<~E_2d12 zmCr!qL(a(SR=hFV!+17!l`k2ftVs%hppf(4Tkjc_*<)xhicmgB%b*+TmskX8qPcgV zaRKt0m@Gqtb;j;7kTzqP7_X&=Kl4p?ti-~P@DmJ6#(qmIj!3CDY2WTY(A!nC#h;tG z3>{+yg?~N7Nci%-cWp(Iei||CC1`Q0c@g$>Tyo6S?LvG;o(-zB2Tw-OJa17n!pv&-x*UuO9faUE2^G%T~}i728XZ&idGYEKuM7!CVL1yL`4 z--mV#Ay&^i#xd;q{`#lJw+O#=?%B@y32IH=7w?Xo%sB6E$FcGR>x_-ILc_TRFDKj! zb!ni~f_Zn(QaJ=hRVl>sC4Ji*mV}7eXJ(RjfbZ_iMo)B02EV%=2BmUqfYE}dRs@_(wUVB(fl8nPzsZQfqPfKGn~b!tIQHKS2b|h+G{^IB{{2Yv z%)r6BJW7QjjR)PhDo1{H)yAuf7cRmaZ3fV$W4Eo_!aJ8XBjDC5P&IaemcegI{Z0mI zwU2^)d&d*68^jbNzMyJ0R|9xIWYb`JO>->@1=cZqS3#oc>(7{itsKWDfY=ag>tkH4 z97f#HEw^y60)A*=h>-YIuRG~HfZe!yT{}@WWhJp}9c|K;eL!9+?rf^7n;~m_oGlVB z*x9M@MhXg&W0__DV2R-~dHpN?jz{ z)FiYqiZ%MxGBR_IVQ?iaKtf(W3*2!>@m>t9iSoJ?+?&#x_d^-DV=UQa!O?rSJbw|W zy#DsjkHrnQQ15%U_pUW=VFNP}fI9QL8L~Z7Ju;BFWyrDAdk5#kDkdh#8{ zO7l;-F7z8pPXF>8!=-^bcCFNy52>pjKq`%_u7XfZeMGbfLknUGPN&yFj-*LD0t*gy zOEBj&wo~H`Ab1Sql-nQ+>mHU%Y`*5akad8_+SjJcPNLLpTKD_N*_Z(%ll_|{h;HRt zIl>|bkl4$1`?mK`1f?|_nZqzzP3aV(l~boFEpgURf03l1v5fzkEmK%CCC?@{M8fK5a#a{-@Wv3Sw#ASWFo~rUlm|bAy$S1;`8M-s#IKD(@70A zgJN{9gktK!#ME8ACoPL$|mw3IHo zohe-vyy|BEk@hxE!$6`eC4`Skajol@@ICqor|nc-psJ}x9Gi2AIsa8rKTkL3+Y&h= zu&$j-!x26sLAUl_Tijp1oQjUO0%-?>fw&R|pyB)KlT@ChKSpo`?4P2>QYVs6zhW1b zn45a(x28Q`mPg2~l?q){H*9sFNYiA~7&hWtb8Qi+O=PR3h!q#==~*N{UdsX$-T|4vKBQhbnPel;W^5oUKk^|wQr7Q|<1!z9;`ho% z4Du-jyB?58FqrN`-AGEQu`uXgzT#xMGt$f}2}2q@&-FAh-LsPm4UCY+bPMsCQ|wF^ z3!h}VZ{kh-3ci9FOM4}h%XI1e^91GvB%9or?k{Gyg1^J~k67svs7jf`bPZC52*t6( zoVA(m2)q0vu)d-La?0743p1AG`rb#n{)({2#ox$y;{*z?@~;eOP+s7jQhFVaUty>P zn7J}+kGwZ9I?*JwRT-o3*Z_S7 zz{);zNWE^R0I)Nv3@hRON6JvPY_;OAs5>v8Pj(O3xj#opmBE_J(6p~!uZ$v~hUgVj zCJI|Tly*g>O0@^;W!M$Er4V{9lj#HxhX|t_{tf8+G=hR29#Zj#gHn|pnAc40KznX)?lC< zs0XLtdeQ@7eV5XO=cjTcF&bX8Jfb2MCDFtN@*~W%4VW_1^LD0JyLw8*^}WRd9l7Fh zW89;&J$KL)NP9F9V;6;7HM=A!br(pPvs@w+MBEOKPE~`4sJaK|u88pvrV)D_i(5t> zRSP~S^`5=G6K5z^S7HqvCNQa}MN-6HJl|w5yl&()gvyo@mYE4V3=i=OqBN|xS_Y5e zJv#1ZyL=zs?znBIN_vT6mqdJ1L%j@-{57n)d=0|K3>BC-2Q5=)Oiuy8v6xGEMEWs~ zh%cR5j)8hn9$i*nMyb=|``Ed6r9cJ6;w?&B@Y7u8(z|uVg!41Y;-0q#8IBCAmH@c; zt$l2z#HR3kGfP!N#~kzhxsJp2)V?C%i_sXy`VT#Mf5_-PTq*p7-zYqyi8Hm5(H~O5>uJZ6mh2U~n<_q$#Sez<4JThA zf*gCTgLHC+4h!s2YF|OeleLu3pfomCUhzL;nQZ(5YoNQsP;6&RMm60RoM&(`X!8m%StffHci&+M|A^1U}Hja>L_nQBM&*F{h zl9fLdLttdo`(+VeR*b8_{2F9O0(&x8k@XBsEx)hZ@~87raTyF^!qqRc#d^T4Shx28u+3si+VJq1><8KVmp9VCX-m;N_-Bso%k#Pwy4T8Dhg&q%8kPl7hSfY#UZxd7>?p0g4A0lLv;lKk*VC_}NIx}1nd!?)KP zpr!c9U@&6l_K3aZtp~=r9TTaY)zc?;pPe(symWiYq^Jz5CR+>3WvoKYMi>v$R&?k( zAO#_!t{>bXfh-^fl-{|@9uR7fJ%{5D|K{4(f>t<57W2LXbNO6&qRJ|))I&?b5 z*X-l0dM*j<1xqRr)4sG16Fe;NP2~cz;l2li?8ba9sg^wFT#LAcclYeKB&(5slp3LP^mSMy7)BF$2(21`qVdRkPk3=^y22f_eo&K1>X1R7JU zW453gwS-dbX4|l+bk)*027ciZMtasycgxTI$QkJj=ANNmOf%9lblO%HuW>pk4Lo?< zX%R715^{}Q!j!0zzi4vna}r85nPMi>t5Y2bzh70 zmdjdNmC4;X0hsdyZVb~M^9l;v)uPl3y7l-MbggLDPV!CinpLV z)l5vATi3ax@A<+PXETIDEK0pgy=+#soPfO^nt7Lt@TdtQP(y4~)hXchHJnZHePntRNeUsHqW{>f16A;re zr2Pc&e$CVKmq*sag8Bg;AQdCK>Aep9GTPUM$;T+H@JJ>$Ij&06N0>Qi*~~I%oQ1)N zzl!5qybm(cmWB+>u_2trmK>=9>j5BsDR@TlGJ!Dcr(+sEJpGh0d5d8bfkCPPnST}s zk~!MLO&|mhsr(pUnamR?J~SX?psdD=t&SW9#Bu^gkIzgQwSxMCWaEqBA(d>%Ogk9c zEu$d)rx!*CuRI?<`*LHiiXVG{Nc9p$UUy>?^k(iz@oFSki>s<{hei$N$HRxVO1=37 zqB{CiI?h0X0NLRGb^^k|y$}HmWEfU8+!?a0L%8wd`&CLg7v?}Ejl=i_G6T4#yli(Y zksFAJO?Fs^N9eYS@V=eN@av!eQT7;$5$lX6Bm5PG`%1dp@vqh?^;`XtCCdr`nw-{t zflI7z8cx%Dts?=+`Emc@lnkq~96BzwMr$(sBN(Aobji(9=5-bU7+lyKJxC5RFAt+G zl%Sr|qBq8jpy7+j1KF39Fi+F-~p1s=0C zxj58eRltlDUCTzqWAw$NGRAyc9ZsVqb*Lkjae1Ve>)1fx+a+8BZ+YJ-siaEdH^wg( z3twPX_8AKRr4zv^pu-$uhYux0HP5l^atFC=!)LB1HGIt^tKivb2&=-#>e6}F7yrKR8xMnL_TS5Z<0eEhhuk$0LY@ArrK&|lbP z`@V`Vo7rTYTasxRY})l1brSpwml4%hg_EUzm!M1x{YdH3Ub{Cir{sfwZOSvKBL*8O zkEf18)*R5I6rWUWmOzqgn*C!G;z>?*ym>6sek^>PJI8|mtll*grx9hxp{UHWjRF5P znHoG@keZl+_8pF{8Xj$cKVCHm-l}i2KPOkCcZ^wsA#nbwF7r#F!v;d=ql(jE_}=wt z;pNyzg}NEm7;)iT(8Lwq1pLa#DLTLhd0_DjXE`zL ze+;gDAac9#XgVod$VSk0kWFP{d`iFB<8f(uoC@;-dWby8gbNKntiftnrgnj!2ruYg zU59m2_`7LCCd2IT>*-+HZ*V7MK4W1!3GR+08Jt1<_GK**G^k-WF%R z(DQ$HhT`%!U7YY4P@+Ovw=dt>W}0K_*SJ>O63g}NO2Zu zpq7`eTtq5IIA-Z75Tm-SVr0)_(JsvdU6yuVsDa(feyk``)@8Tzy)TA=fwG_2|Krr1(HX@ zNvi22K>nWcF4~QQj16^ayX&O`H@9k{)KgnYknWW?k{p7+d}J#Q6=cIONk@b`+y7P~ zT@YEUltQz8faXR5Nd8-g+I(RW7IO9la&h-#FGab?sj^QSVw(sky2 z1S<=p7>dkrqnufwCPz`P2hL2(cTpGzw`r&ln3iU~c;`&|krl*>1;Ly|zY z0riMP*+k$mnE@UnfC@z84)kU;Byj!EbS&eX+^U@WB`*TJ<(hyG{sbsD6z#a4N(ihG z_V=TOHM0gEryfK|e*#~74|g0yo#@+*7dUklFy2g(JRQVM76aZ&9GL z$e@(Lv9?rnI4GYGk+cm4$lb?3hkmy@st6q{?cs(RO3=SgC<0~Wb6#C0+$ma@xW#Em za+da_vW{v3Ui-T6q?r$EglToFZJeZiM}ZEOrhP=d?kk*XP0&UM>6jVBW>U*ZnYL>BvV{r)owW4@KJschN!t&knn7wiPBf_eFXKQb||Bfk0=u z-k!V~n4gho(fnTt{PRGqLTFPsV-2e2Ul;O%2187iLrWK6Z{brw>5r;_7P^t^w1TW@ zGjJ`Cn}WLdZFNUC$jPI?xi{w+T>%-Hh_<_+&OhU1fg(AmwJ2X}mZYJf^A zkSQMZe(+Ga%Ev{4P|a*Z(?c$pLG8i?y9lj!UzKWhZWF`8Hb?p%dOvAhnW@RAtWXz_vSMUT zusO2x3?*d|JL0o-)8rfn%nEdHEIN4Q+)*-n(aZJo=;xg z8kkDYFoCsJ8*B_$vjj4`)_j-dQy58W_?!O`-DS{|5L*35B==wW_evF}jXo`+;D3rf zqcaQj5`e*fVos`0nv-tqATj?Q6u1>7V=@bL^?T0X4FC%ubAB1{fmI5G4WrYka(%Zu^?;I7i11Fd(A7_xUHh(ylT7ttH z77Uv5J7&7ol&3p3CU_|K;RQ&P>}cg^I4zhxCJ($-d)h3U8L?Y4)pe|2QapVI`TS5N z8%S^?cvgB`5R(nL^aDkMK56Ew5Grr5UP{JwIIVjq2{Yawu}Ojt2jC-}A$&x7jdvWF z+GB|N#c+=(mJ{=?2^yd~4wVGFC>QWLYz=_mw7xnP*mVm)w9fhX>}^q@)h`7Tg@b1z z5s6+k`hJRr4XsPA1}%0@MEP@iV&b<=@vJr@8Y@AE6EJfSv;MCTPGexVgJkBrZV1MXb3znDEs=xY!lzF|6ih^FOxibVlg;>r1k68Le0F zD{#IRN$xW4qFIm=I;-&n2x6YtQe<5vK>sPh==(#YYX%VMKhq$=r_p3t!MP35!3Ug^ zHOEC8;e!K#=yn5BWihrBSg0-qCxzW5rv7w||DE_gMw2-w3^K%_rn*JEqknW(hrJ~1 z1Fle@i)T)-?Y0_3QyD6d!h5bv6Bnf-S>=_0JZ1~|Y9IPR3_s4lab@+h5iC7_Ox3(d zn4Avn9(9JuFHEoDPiSbNZT4Cu`IO*`6j5#=Y7<(4?sbMt=i%R)4S1f z)JIjS@72MX(Pqx~iWpecqMB5e0)uAfP`v>~`KNPYL9JH}Q7k+5rBe!rBQ}$wm)rzI zVrt9T7mlj9YU{x82^4UBs@{vn)mZ7S%e9th{E$1Kp>}<%U-hXbhUP;`TqIIYY>9*E z+dA3eBnZJ7S-Gu7&TMbdy~3g&`B2?x%dmqzif)Sr?Hll~@e3Fx?{_{GWvZ?zk|J(j zr$XNb#1Ee|1*o=>&3}hp=op2-wLCBp*-kMJxf))y_Q_R?Rf}?g8DW=Ljm;$rChihO z(5K}uRsB#VMP0bd+vrR9h33$!*pgBQq|Ez48Z>+hNL~<9=P4pyHXy)t8kdL0pZCRp z`*At+-OG*X`QA{sxxj0{#RbB}vrlmi?D2fxNiXyk`iK+BwTU-Dn?Hz{_098R|7)lP z%5CeP1oe^i&HIc)rg!A)0?8#wBrTAtW2@?Zp&}?_dVi~FEFhkZ5-K%OVzDmr=;oOe z2za`?3|cm%C~jTJ3B)}$fHfjfF3M}k%g9qi0YbCj5lg{HAXA*IWke-D@Umf(_#>7a8$Z(8YZalSV;a-*hL9n+#D-7dqr{ z-L30v><1@jlBmdFpq5g}i=udjYUL^rcSnx~0-x0KABZIvsu9iEwCYD^7nR<0J1g8| zxxA7-_}P#TeYBM?SK>ZiG@9w&~3c^M1KuWAe z0m=w86UmxZH+AfO2oqEq=OEmlz(dOb@oJPTMNla+ElX#-xpAn}W|0x5lw2EQZ2JJ~ z>C*-OdrbOBAQww3NSR7&N11DomCS#X78M>SDAp%G$7~s6i7@rGi~-q8Y(Z(g^Zu z1UB_D#LFN-xyad^;F`tT13{8;>tt`;q zO|Xq|jO20bi7WW|#*Qx`20AuR7vrpFHqX!4f)alIr#XUogRGn>nWN>FBuFn6W<;;3 z18zH!4$_leDE{zJQvz1}YdkU=#ihmxav%7wX**Psa9W=ZsD=_9T-_u33gUW;JX(r8 zyhcnI9tO_pbqV|M8aF+3+IasNqo{IoTF-)QC-VoF#6Nr+tTDA=_gI~SNg4@Xp+Za? z`Rs9swGzz-%V;rUdLb+$69i7{I!RySh_e*H;3YOSl)M@r4YRwr78aIaw3zMJF4}0P z+UuUii1nCYfNT;rVf>{O*uppy9HBV`{2g48W-cJ}N+@vS>kOLv+;I$8c%>fTYJi?9fwb5LHaz`q{=f8jkbni}ENh3XGH# zmUBB?s2CHp2i$ao3irY}j#eItVT58L94NyuFn}l9U01V1``DL>{ki;t4x?Xaci{c2 z^{1+ISSO6<*QAN8NFo&yupTY5`?nnvxUMZ&aFhPPBvFjOvRVKF{e~9qH1x%yl#T_D zysYK}6wD)Ua%?3tn2HIRsk;b{o(LZTDv$;0W= zlyqjMW^-muZ3gn%hhfiRXAa#lNm&XZoip*BNMKj7I50kMF)XNq8T3__6qO_Gk+Mal zstQaXtka_F6Il9!?bkkE_*64VrZ+Wn?XGOJh73RRLqu2ukg;TGY;tnKjCW8Mj}uf; zM(#%_wCyp(JAYhoExBAj$X46>Lv1=qH+27h>GN}+DpIe|H51RMw|`t2Q3sm+iC)y$ zBKQcC$S1PBCLPfh&PKN~5=Y8GZ?n(>LwS6}fOJeva%V$4V^1G#QTe$9b-P z`n_oZg*-N@fIPc}m3(@IBwMnF_>_b@xo65A8M&P-Q|O-L&b{KLN~H>3vZ>!4x=?6xw3I)XTv*;5jM!qczJuJ{=u;%+^j*%@TMu^V|hLcc;S}w?6 z+o0+dU=-~%lV1E^f(nufj4@l!5zv=?gW+~}gF#^b>WNDcuE}FpAv@_8miQXV;q%zV z`I0c`;Nxn%7t7N85#F{-ae>6t$d{L}r(de=vzOgB$a}8&!<)Yn2NaJfD!EX z_Fd-6`5({Z4m%>&f{z@T%F6%iTil@Y?%KKh#ALR~F9?>0;3-~~|D_^{6I#d>;qqo* zqK1~l2lbAMW`tZf_#u&Th04@d^zlVpa<#|+*zbd!mO-Hn_tm)#Cm?^!ZX9aZMg30< zJrpR|Z^e}xekm|cGbNF_4GOLr6q@i;rE>YedWP191}Xr~o)c(&eJBVBX{Y#agOf70 z4`7hpOjc^FF|A(|e+vmF<}6c*%Hk3>1Z??Ef_A8Cn%XdNEU5lRL#he_*4)UCHU_)! z8hosZLS1lc2DTz3>PbR}oOIX~2}qWIjVB_|KCb76cEQX4@p-?IP`7GR5_611+Mo&e z>vKh_l|qF0Bm@SFo|{_sUto?d*8;)dFBXE@mCko$PNMOK!EyDd8?P={_3O24`j;9R zhyGV_DdGfQzuJ8hDA_a#7?8>#~}>`9P$|V0Hg~Dr4SYLpW$$41=RAc9b!2_ z5Nj+_4;78Z+MyG_OMZtIDMN_PadwW#Pjl$u0*NvIfgl^p#>hFQbe8n4?@%c7(Ry>M z)q*3d=gnNfv~M=(2K5SsG99**%Zy3tT(jeo+<+A7(kANkvc#=mO{#xlV{C%pIE%dq@s&kWH&DlLvQE;3nx2^+<{2a~}{=AQGc@cu_j} z0y+N`kMj}Uwyz{%+C9*C>yo(sd@@12kpC%A^rm~I2a9m;al(=#IQc&dk# zD?G5J!T8krj2|H!0{!YiKQvOU!)uCchpxUpy%?WD7JzPuDgl+2Pwat^ipFhtj%3{l zd?YHUZpG&gc$7S}CB!4}c9;igfU4EB_n3U|4miLUxA!gbAiA)Laj(s5SKuhJ!CIL- z=zDJ&SYXbmIV+&44fZyaFT2x=vJv1|%l`)L>Frraiv$)Gd1=F<=&1hGfe_lASG!YD zOLt{WN;cshlFjkDTxOlH3k6JmgwGfDE|g@7GY69r6(FZ)e=8~15k!pLz*jbiYEZ}m zO2FXt2DWe%C>kC+T+9zaz3s3G@D+~*e{4hrP82<`HSt3MfeRS$mh5b?C8C`FbcBvi zWtA$~GHim715Iu$go+du3CZyE4${$zURD$)VEvI>7PEG;*5IjvrKkZ$%bUUNCxdrD zO&kfFbFMiwo=p-v=2AojR{8HFzh^`~zGL&CmE-B{Cp{0R`I;dR4iT4+2{5V$d?95C`jIXI5*^p*TX|E7=-2Y+@QMphuDrJb z<hT>?2E_-`EO`xu> zC6HbL0zfe@X+Q(fL$53Xw-HEpb6YB2`~=GV0c<)^BM1c!-t853vnsshCq@7P#aO-Q7y`xlIo1W@e7rU!Yw(m z(X|bg5pA#*sKe>UxF=pWjMX9yq355nkVY0Ym9Vq1uzg=gNMT9?Xf!^;R>7ulQ>a%^ zN~>L&B+%0-yh{+gGVXJh5d?H^p=y7i$c|e|J>KACP7`PB)`(%I}+@k zCOBTOq$&m*)L+CVVUzvr__nR7=ygSomOM z+-$;P6D-1ZbsbqPVSlyI_@$IFt20H=U5Dw-WNF)rr@Su zPWyGF$PW(d)BU>#dvkl~75x4@m-mUDJ(@SH&CY8S#==w!G(tp{QqU6=LqW9(!4k*A1&3$t%xUuI?Ekoi2%a~P?E5E6+WyknzQre<|~P!few{VFcK zAr>7z0LoAiCb%7CE|pV`Ojs&i0c1ddJmqHudVIYGXkZnN$S5WlsqI#6JpJHg`)E4; zw;i50_Xq~>YZ)BQIoNFU((a#u#-uR>9iF2{;u)ZYGX zva8ttx6u_@^UNFwJ%WLN_I$cVxT3`d^e8eDs~Yq)g_0LtW#GRVAABPgga~c$WAwI2 zTmBiVhND=FA_$fuyl-qhq$##NNe=+;{HZ3TWa2p!K7b0XssREyboTgflj& zv_53}npqr2yLq{b<;euqN7H#7@?@9ZY>pGro0|}_2XnMXA%(0F#WpmW3bjpSvbo>U zSV%Nbg%{r(-gJY$`X-v|qUmbF4&la~&Ri_v1JqrHC9$U^$?5S5K?w5Gsw)VborW|Y z&`vl$a`HnhCQQMA09LJPw%sw5Rk=xK!0d8Ti|O-QnZmAYNG^U)lBSd5{_WxvfqJDc zD1-coGy7Tl_SL!@tDx0It* zo_;_p9X{*@j_-w$=x(8!Zc_JMZsKs}=7g?~Mh($7_w*5!s0Avxi|#Z@h&{0Sty(I{ zx^X2{8RB=p6*)p-GJo|nf!#^L1k7#f+92{Pw`a|}XDkj(*Pm{o!>wpFB5NhE*Vvno zpA__*U>wJ;XVdm8YX^NAf)b2b`eO|FcYm{juP|``Z|(p+(&IQX0?Y~?gT&UHD+TLF zj-dtGboY0X5uQTM7k_-*md6Gl(EJx5#R_CWfM1)%Ulfr5hp;EPLlN?TS#f@|sslZp z{+E5vChG?Sc0V)$^-_s@HDqPcSViObAj?X66k?qp{EV;s!6%SYGIDT6kP~?<)SiCj zSObLem&2`w4u@vc(g&N7Pm~T`x6E===yJ74lwH3lE=nkEVJePn6fGv7_XS%Cw(XDleaEkrbcDz{`^Cd{4OWm0F>gBay;`A}aYD)@WALF74^^WT5gyxvg|ck$s>9 zjeDMJN1YqA%|m0XvQB6GB{Fq)459{0Nq1et6&A$^iz@*xJa~K%4w62Yuuv!{&o<&8 ziZ{USpO|h`x)8#@;c52{z#x`%X^_di)ce-kXE@f!7_|&?}(MP zydVWxA|24&ZT6%TtC;Y>-qgp*zFIOmOCo?3R4N+RYTE1d7h{ran$+1!6@Iu|7zcb+ z_vt6TL)mNR{V%^tM{WnFv^CM?qJQ}9b&ED~Xomz`MDIZOM5k0FK}g5v%~WiI=$&*n zqS#A@%qg1ac#`zHL1Ku22Py6?F1Gfdj(2`kF5&?)+(k+`>lQSj2j@FG07T%u1xYA$Rl_yWgU;BjoI;1$lRS{UdCOA2v{a1%A68o{k*{5%+f3Mp; zeGzCc@6`St9ZL)1W&^8CRV1<3N;53kO7MJWl2w%l+brAc#OAA zZ-}F243bF@AMHQ;9bF?qa+SEWBVnH(Vj&d#y8O=ra~XsxIbM;GaT4jq%mER@2vkvF zOYW6WVe`T884exMV1j8u0giHwGXdH)Njxi{BoJcVVBUP9y_3k>pl~bDib+^n!X;tM zc6aw?eJ_#ZY8X%9)#BxNPyyWo+ymnSHjY!^Ac$sEDZm=0(Q0XJn<@#;)&>rpErCS7 zor{@3pR-FZ)UC^Na>~*7%u9$!FE0^O1snxT0(?sh0h7R9WFnVBODWzfdt@jgr1d@M zrJiP&o@XP!?=%XF?Xn2o{kcvm=mAdL0kyM#*d>qDo{|6U~R-q(^Dk zM6;klBC2RCQ#cmAcEI?4w84+*!n8mlsI_3p=4_(5C@thLCy>kPS_IbI%yVD z7!4(5sXS++6~ZK-2`4(GL?X?JjtVNCUPur)VUohAJ7Lfb0jDqoEW@eN3rV~5LX(8B zMZ5HN3nQSqis|5nL$KXZQSf6(lu)!wFNB~JEP5r}I(&LO68VG=47dSOhZzZ_esXlE zd3ER2VgiPaPSU)1p76x5j~5+ACOcXRP{6pBjQ~= z;i~Yn%LMq@r3d~j_1OwUCb6Q+3-?TY>p61ry#mZ4`eu4 z*F$&dc?}EJMfYlffq+_FF=X6pV;~bbM7+eS2tBK^)%t$i;EF}&*(HL&Pdq#}pwQ9g z;}Y@-a*>ge;5dkn$7L2GD2|i_M|qVVSFjL4PIDd|r?6Sbvu=Vyah(Glhnco^NRpQ+ zp|n6Er;7?N$)FC;P(%iQMud?0s+7^;?s+HlPCO^{&a|zzwm{X}T8=Zw*_ennCkZ6u z_*^WUkBSpiNEFVAqo=K$VWVdyJ2d7&%tE5rI2mn$HZ$$a;$?#`_0y6J3}=R6wh<>S zhUN+!I9OK!iea#=0lo?&VymqT8O0N@FyCr)jt~=3B^B@@6kGEqB?)jP#QRz+{hono zRPf}wKq6;#ms}BT18s96;7$qhpO8Np$ZL#Js?#(YSI*GR)(x2fIRTif<4i>jW!PF` z-0-QuADEfuhVL8piGdN^%kd34{RqR5F8?fZe- zRrm&kfX!J0l^hY{sc@Ugo8i;D{mvE_Nzn49#V@cmr8dai5|yA}St;F!ivyY>S7s3k7Nr}n za+Aq|bokAN?w1BeY3v3}h89-+y!NkCi*|Br-ddOBQnnjin3klTk zP|E?-8m33QH!c*(wS-y;uQliK&DWh6wB z;DqyanxF-}^h8Za!_e%~11S_2713RKq|kKvuz^fuvnG?=f)Di^yVF~|GOb9sVNKyd zxN0WvHIjL{#dtOr1EPs>$p%dk2At5#9jVpb47RagQ?b};=|+z-F(^1$KDx9^Pq#LT z{H0xb43RAKp!lx%)5^0xSwx|$DyYx7NKn3e8+NCEG zy=a$SS4x%M6^Wu;>l5tKyPgD6#g(`XoUM^mx~vi& z+m=AmkF5_2+F@%2%t(g`cIkl{>~MmHfZl*dKzOb9V_tNjX*kvdzu4xK&%2+L|x(3PR8#3*n5x^zr z1@V{!_;)fJA9j#A57dojtDSsrYr{raNTyEHXg1JABTygUz(7KyRS;+6E24}WbsG<{>WKGm_|@rI z=GmpiLp4NZ149DHG>0RO)Nl$S*^6~tBF&(opmcmLQRdmDR|%CaF}B$yL#Rl&e;HYR zBT8tr$x4-w*la*DFuDOBG@8uTOGA5VjA*x7SltC`L)fJkGHl{yXwT}-1{w?l2tlO# zIMi`tkT~7O(QPxJjC@R683&MmhR6U0yCAmJCA}|mE2LsTypWYM4@fYo7f-!rQ&^WG ze=eoBOS{yg$ipP4Sr!F`GLU%1GmzlivWeH$FcYBi;dwS*Jg_}dtoY?!by$?&ww6%3 z5hSELCt;9g=Is_C!Q9(%w0Yy|ADFJDvTNz4_5bog5;2`Io`^Wk3 ze$T@*Gi%n~YrXGUd+q%VuqIZ>w#K+8^#*4}R3&2!o@!obUjIOm5#d*CtyN+C{u{Z2 zt`FrqrVZa>KAK(?J!3KaftP!%ReT+ArSP`ABa-}o+xh@7d6s@J2`^|QV)FMC{o}Zp>I!N z4Y8Tad5^({@(%;_n3CD?bhDcB@tK+g*>zo_1DK{h&g90k>M%VnF58tNYL>>^?|LwQ zFxh6OX74HAEqf#5eDTBs+zKv6%~F%I+O7n~Zx+|jS*v`lfK=92HZEE=)PP4--?WNY zhemElc1FS`OL8YKDP)-vNGnned~sGts2VX98`6-Z5ot~OJx^X zaBG?P0z07ZCCdjlnS}FI0@Ywo>epBl$Zv$6EQHs|qEcDRI|o+vI9|Kbv_uSqRb4e^ zloYpl1R;1ML`){G(ptReiwfEK@xsUKY$$d$zf~gQ^Awu0USuXOVbobGG3C?=h)}<@0 zhGte=n3iex)f|^w1|n{8WfJHSR*4r-7O?@?uVhrEInz)gCKvEX2N1ZotA_7hoW~{5 zHs@~kVJi2+@JH)J-!T%#W6Py_L5hLlrgDmHWRZ}W0-YIEN$>Qf^2m6#2s@(pg_F}l zcx^FvCUZ!+F{yZd7mG^m@-wZ}PB+eLV2%h5MGa4`XBIi0MB)) zF0tgy?a{qizkYTu_$yKLxVV4In(xY%?1u?*a{v5@It z55Ify<2zjs4#sQZXEs9ir|SX^?Tb8z!1K~86wBjTH!}9S{Hr&@I5sY96>SXEjc3D? zIyi14ulfaVRJ$>?#XcXn-QkVeo0bS3{C>dIGUm}`J7AQ2bqp%$fI9r>d*je|<73E1 zeb(|`Ao2Ex?{kGabrNG7!vW*QHiebVdy!`2?_My~93*bkv)1ofT7It`Z1YTL zpEI@WK=Hr+-=4~bWrEs zr`ux}(UNiLTDxe8q}%hcYa#W49rfUqz?bzqLrTv=xDQ)0nP59X^PTk@FH~Nkhsx$8 z#(|7vGoS7xAMUo)S#G0g?V09qR$$5OJJs7oA%}Iw(oCXVR&(RqEB+k5w_7yh0_|_@ z9H1{Q2bBfa-5UpvmyMG%zlyK1G4F#9n8q8AXM1p~6mERHv;V?#Xrs;uT^umKlk{Ty zX$h&f2ANoVJ$mDl%6HaR7RlQo)8a|>hb@8Vu6-C^+IEhW_WYFv%+Qb5uxe3~WmH{;z+Xx}aCTN|QH`}GjSGtvycIv8YT>$+4bQVOxGJ+>87ax2+ zOn!^;o|^uUqR<);mOkoHwBWY6YtcxH=pfx`4=sjoN3F5uY);_?=1{ zo3{zkrpT;@p}WOp1N#7e-h~;7%k7i7Jyq3h{ZVDN<{(wP_iFR3BBXkufwNo-xX8?n zyF@i^o@B+IkgAv~EWO-}R|oSih7s?|1_k;(;!qHe3m)oIO;N_Qy&adNEkP1!OPtTX zf7lCJN}V4W6fq<7B8{ZBF}*NIJL)8k8eq+mt0M02Yxc4GzFQX~BR?Qq&*ORLws@{J zNH5P-zGZL0(TpB^`uVg=P6V^wjWunn;J_(JtEar0EZe*zB6Let%SDQJp0NSe>GzBnCY@Hz}KGL+_eC$oZtMS=MoPqOF*^R{FrKOzTm zZ&2DwVh@{xcO-BB+GVrZu)@0(nEwP;%$k!3O3PX5^mL94?K2D$7ixMj;o>$mlKYO* za4u&vqJfoa^!{te9O;g}aY0FuSAlqF3kC8fkVnmHWF2o#v85g79Zz*8iJuSJ*hjxj zpVo1x%L#2f6DpLV#zp*%wSm}q=A%SS72oJU!qZN_v`BRxBI{jQqq~d5nEx{IK_tFd zkL7WuH(R_)1aBpQr5^AwP)S|Bj=aO?_${O8GdU1Cec^QrIr1G}iyWjVSY95$&{ap& z8Tc@s*nuXKtXIW6#Gi>+Vsw21nePDs7yG==ys+JV$v-k+BGp*H;lZU|Z1$WF&2sbo zH*+_z1A0XT*y7}JI-1IPm)RyA!e2A)DOabKI%B8J=dg>?(5TmvJw8Xh6dTQJ2f)z_ zl-%VCXyHyTXV7pG;20Y4>aM+K{r*z~a^>!o3LRz_@%Y!IHBWl(CqXN;WZ!bMySLla z+~PO*BJK$9h#qX~uAO@mU%1EW*+~x9zW#Ix(`Z1Xz8t@-hh}Ga^C8tYlcKA*v4V6N zG}p0od`DQmJSz_&)23aZghDl<3wr^~)ZDlVMui%jBv|{aS^iEbSEGtWwO*C4t!$Al zibXuSSrIeu6gP#}{i^cnGtP1^y|o9!3{-^fZIi;PqS>wVRTO?{FBnY5HO1X221RR# zpSo_YSB1d!!r?J|DUq$>)J4)SS&;#J`nI6gx5XQl%>teT^3a!g#oVHr@1^uD)N+Rzg(jccQ>O)xmj1 zZ(7E1^rRalTVu#CSxi2}4XYaEZ$MKHG1q-_5)e1kU7@c~e>I(=LQc#@% zBuJ&E5(Tq4%|4^5L9G%K^n~8ulht-T&-#*ppLT*}aG!V3<5rJfdKdmH%vUQf4_)D= z^^ANLZ`PNZ%2~5TUM0-MMX?t2nyJDr3y;K9E4@<0@a4gmplkyvO`-1+kg66&H@c}3 zZCCS)V#^$j;_Z)~aGNgq*hOH$Ywo39-=4$MnhUq783)YI&=jR}DEmE*w=sOtHGQVPFWpYu>Wsc`&l5m5hG&z#TQapZcC?f~)&w;fsX}JbX-)->b`@p&m#VKz1ot%cxG6P%^YC0ovMkB1nE(5udw9cjGwJ>8m$PZ65*pD_+(kSw2+S*sPf`%l zw1MHnX_8GW>jNvA$O{D?*+a%|qX-|4kd7|U#!!=u=|OMcW!U?63bpSUwwPUOSAGPk zVS@2O?^v7JDIS#OoRu~F)LkI2wSI;Re;G|R1|3>okkrJc zdn~boO3`J@v*=FgZ#uXiu{Zl9N(Fc|Jho`y>iBKzIeh}Uq>=LhPqSyZ?hdq3rQ8qM z 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