From ad100848507326fca6dbac9912b31b7b8f674c4e Mon Sep 17 00:00:00 2001 From: LittleSheep Date: Sun, 28 Apr 2024 21:49:03 +0800 Subject: [PATCH] :sparkles: Real-time local notify --- android/app/src/main/AndroidManifest.xml | 11 ++++ .../app/src/main/res/drawable/app_icon.png | Bin 0 -> 71986 bytes ios/Runner/AppDelegate.swift | 10 ++++ lib/providers/notify.dart | 51 ++++++++++++++++++ lib/screens/chat/call.dart | 2 + lib/screens/notification.dart | 2 + lib/widgets/notification_notifier.dart | 5 +- macos/Flutter/GeneratedPluginRegistrant.swift | 2 + macos/Podfile.lock | 6 +++ macos/Runner/Info.plist | 14 ++--- pubspec.lock | 32 +++++++++++ pubspec.yaml | 1 + 12 files changed, 128 insertions(+), 8 deletions(-) create mode 100755 android/app/src/main/res/drawable/app_icon.png diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index aface36..f9475ef 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -20,6 +20,17 @@ android:label="Solian" android:name="${applicationName}" android:icon="@mipmap/launcher_icon"> + + + + + + + + + + + ViWk^)0XgLFza2olmLAkv*f8wk=N(o)jWFr%A&_DOXgk)a&_c6E*!pqIeFT%|y!XrS(!zaQg zB*J|M@;%z?AvlHSq-fv@fp9XQzcIXWB|RXJOEoq+`fmDasv-{^?K#aKIa*k9df7Xn z?*tL^5&?(ymTu;BUiNklt|DII^uMkU0mtZ%x#;PBUE*ddPOq<~NhjmzVo4{!$<4`4 zFM&@-MAQ$=!7Y`>l*Z24{xPP4b_wfGKRR90o^lzvB))Wj)M8?GuZDKl(j&>6Nm&J*3 z{r6S>*9|OX&D|^|&{oF5&Bwtbp!3JdZgT@$m|K0SygN>U6 z@9!r6_3?kVGWhrT|Fg%xpa1W+8ZI`Lz^s2gEzj@n{{GqT>&3Xxmi;$N|7#ij`V_1q z34HK+|Ex&~d_S>*+YpEpL`ha!#|vX^8gEMX;c@GB!%QvQbRaMEZbe>)ZjQ}MBBeK> zIk*P5lb^}PY7KK+^yhS5k6X*NXCr-C#dS}IX?-H8cDJQ;`C|V5=8m0pL*M4PU#W&; zpKCAN^zblsS8REz&mba;E)W96{ojxOy@UVR!T*-Q|DfQ1NccY_{2vnj4+;N=g#Sar z{~_W3knsNpB$P6O?pv~5!T*PO>9h1}9`7M!bv=-?$2YMsFo~offB(Tw^q3KTgUea- zqcG#%9k@pRKZ7?ZTrBmNRLN+ey-dln3sjZJ)qmdRE?vLAODbc`Xpp~j8LIIC&Oa}K zvN&Ze@XNf-ymaa{JBp}M|L4R0WY<)jxCm({C)uVMV-`spDY1WSNcP{4Otht$`M%1% zzTGcO_9`+i&17;=pxXYQcdKKGW_9c^MvVe2k5+(kWxi z#wCy1)ghxh);($eyzB^9C;ISM(Js*mB{jY7bH{T%E z-`2EBV?yvBBaONKjJUz|*r9vEL44*u^43%n0yR&kV9dZhFd4xx!Z_;y!q z_}QO}I0?vH>ir89AVH6D$r2oN6vy_9hG-MLcq7HIveiVgo;|XS zd2;eh^&+R89IyAw!rxcMTt(~3y_T6_+g#bk7N%9|56dd5(O#PK>|q~C$T025`Y&B< zlWaTCsvchGKFRa=kMVA4WoA{0Yg*LHA_#Q_l#I(%rWm!fgM+2UuzHgSRpSxUX6 z3~O?*{zs2ltrUYJRCrv3vP;UMwaW2vnRG-U00B;Y>Tjk;mj=C(Q;|y| zE!3gU=)D)q!XYh9hYO{M4V@WwESDv!iD6mHTzXR075E?BvEm!C?m8ynPDp=}?<~lW zHNeA%`r{%=xkOa_ZWC9nGdwv$^7dP1b%p*%GbP-;ByU1x%p)_4%7uLI#H38Rxu;Uj zHVYnMw2Z-x_Od*J#!Lu1Hwvx4TLYbXkUFpNYeKpj<>pI_Z0+NcOfqy@7)@&ngkcv- zp*E8*EJ_g(ZU)W;(R7-BYuKTY+1yw!Lmz=d=p!Gv@zYvalSuJ-V7jqOOQ=L1Z^Wc* zyz7W%URNYvC}z;#p0hOz>Qj4hL}D)aSf3I8*!%JFPe~{qu1=y2ZNeB6@xl77(Nh9) z&NU<7_3HBe7W;MU1KwfFg0A>rDI%;rR{8|S$hgP!10td~J6cjZ>2d!UgpJb~tVC}t$|PNEowm2R z6RPuC2p{V6b={RjM3bz2Utlp+Igx#3$_G`_i*QE~iq7?+u+nsw2fXdwJ581lYf%ZA zbkXWT+PS>qlM9A;wY6E(gP(7N5iqj+Sr5RWP+PLqdfp4ZccH&>dldSm`hmW9O!~8v z3R&s=8EnfYHKC{q%PtYmS$J)wdE2wb$Xxu zw~$*7!l7}hu^YcPhvDBy`q=nE{)l~%;ekjN>RBlR8Rk53f68HX%xf0nc>5osor`v$ z)8B)LE()Bn6k-wOG+Ew`+&k+qy6-h05X6@wgJ^6r`66ap_T*b(Zy?5{)b+{QFTO?@ zTW$|(YqIRe?UI{Hks>nEbb>*=J8w+_T8!vlOn$`ZEP9Ul=h2CTRLw#gN!qDzl(|f> zpKbcR#^)NN@7EFGHTYPx-?{7YWcb~8vF&!!-csWR5{XO=4{Upt$>AFNnjRBRH|n=^ znNWAe^u(VA^p{cRQk`-CS_h|WnSJCn2g1vPwXz=l645KRr)+Js=HzwyBHSwUG46Ca zLn8&+UnnH}>MA`qXC6iU&`#Hw9HHVTPbsM!g&F6w43NEpP1CTJo6_5%j=N$jCH$lR zb@$gE7DP2^6oR|oK14edlV@G)Pcv$w@r(>jL4}pMkCvIvdVhaPo_Yy~Fvky)QHsw` z-lODNIWFNlJ?I{BiB0;2Q~?uwxN_k@In;Z)nE~4Ml9T=~J|{&5jq2n#pDA#@?I})~ zd5_9pmE>~JWu+f%VOS&%C8W)xlkd%CtoM)u>bknRh{(wylc=RU;U}d6T;Xf(YNNu& zhb#wpItiTOu&k)DN^|2G*0X+v^m~8S);yF}>B4@j-Z}f~Y`9w7i!xg2O@Csg_i?hC zj_nDF`#Z&zy)H9;yFFF3#SO+;OU3nFJLSS|(?jl>qjJhWv6Pj__YgZ=pvDM|Ma5bsbqr77`F_(r#F%3|Jo8#i&KhCeGN{)=7FQA2&&L{mK72FGiiE$$0Y zBZp&R1J6Z9wJp+QMUosdR}pi;1gR@S`3?SN8}64TnAcN!x;TBOhuw8X?<)&os>kr> ztBf@}Jh?bfOl6V&?K*;R@r{_^ksk>)5XbNGkJE2{*k{Bw9{G^u3lmVxvGv9-O;6-7 z6v+rUuOI!gm|mL?A8wv#WUm~(Z){B=L>3yD_%e2MmXT0#tXX1dZT2~aF-^|X-%N*- zU@z&|b%U&K|F9)Djg{m!tU~O`P)RfLN|r-nrWZq|poO2NMNz0>*YKzh8i%XwCr6S6 z9n+U_=KTfV0WMJ#RMI8rJN?c5b;?WpyHYPraAu7yvO{}NCMNJ9j3|bGfeR5&P}bmV zqX*I8{_*nj*Q@GVcStUxad&N|F5*vBlr^V_`_qOLU^OZ^w#Jur#FLYg)t?hmr@~Yc zf5NFYd{3TaUVmbN+UYe(a!*@oRUz_YSIb?mClM&K-QHU#q)oz5WBAJ`12v#riVfRq zEIGVAFZ_=4qWTaz^TuJ^>B03y{d= zoCJCHlW3AwYcUum1sotsP<5p!vQ5lFCG9fhu|@~jVC{vEf`-a(s39T?Dvwp97ror6 zO1ZhR^9@Gc#CXeY)C&4 zI=^AXlHu-={ae1qqwXf7@RtoxLB;(^Mmv*?*cC%#&+!84-=sa5X)B#EzFS>}ez!{H z{gBV{+6ipLH`JOx_HQ4E*!ic6m(c6q~(VyNu29@tKYf|TKwU2 zgjFHw(QgXUZhjT9utg%uCLz|Ocz54~n>b`yzaB?yN27^h0U*i^DVF*xM~jcz3DfGV-|P=QCv+o3q}O`W@}4XGp+P)lvko z&V)p_jta6K6c&`AR1Rt~Cowf{5{L4WQTq{2QdpXl&F&7)sb2f@4(WrqV0yKlLcK}@ zGB{A0#IZ%`(v|mP^xh_%(w)Yc<&9$M^wc9k#o5XUY`rp9#TQObcl&}Q-xC@JKPjwv zVz(<2-}DMub63eIv$31^!N&u4M(VR6mC`*Eu|H1w#fw(G!9KS&*#*7lGtR=)xrsVE zZ)E-Lu~x*Xt1?fSoN7*wnq{LCwH~+@=$5?M{rMwGRMd0h@}#pna_9cTYF*cq(SkL5 z`C4jaKWI|NBU?s0Q?9{r$=(Oyj?)%we^G&AqStIqip!C*4(?|>J@=NC;XZ|M2Yamb z>Hwv5trjjRSDv35iivvnP<;amwCk5C1-i#8tu>H@Ic@3h-xM`*UP>7)U$a-Ng(+`9 zeezzCjB3rvpWqGZ#UN6`Eh;&U4IQO=`I6pI&j3k7gBQCocAbHEZ)4FEz+$IO@ zBX%yJKF``+@FtU*49`%VFGGK$!vOIOn6bNU{(O>;Z(T=0-@ti)h{Wk&(xVGwR$=+? zgtH>tuDR`kxAd7hIaTtdL$G__X=SGt7Z>-_3Qdk+{6#Ov8wsr(A0kRt1jxVL(-AqZ zlT8d&>+;RsvknU-%=B^IOtH?P{ueIGO11o)o^keRz0`%uebqy=2fJ2O5*iUrb@8vF|uzDlaEp)J-c;%jW-9rKDsrX=3~lO|IL)3W*9zq8A65k_BGt zNv9469c|%Od*pSLu;w_$Pq6-7fhWTq6q5dp?l_%VE76>y#?J)Gvd1Sg9l{Z66GnTH z`*23Ii%jN>KfR#WGNo@BRGV>Y$hhd?!kCfy9f3ArZp3WVHM#P9dssm@Xwsi?CMN50 zdAFbe#&}@}D{h`V@Lo<^R!!!Gv3=!XRbtRz@`H;m z9orBbC;{rkdkQ4qqzB(~ki!|jXD|*rCnrhF_phI$EU*0wKcWN4TUJd_mDa>I0k13bC{;1UIUD{V4_Q`;9(MTs08z}EyW4+hDGF4w$Y4Hg^GKBaA9ukp>3N59q z*qFSDP(#&}OnOC!`_uSrPsjHzHY&R`E72#Io?0HvUgO%pXoa+Hb{t*(YZ?y-x)V9` zT$x#F5znwg%hMLhdqU2atTg*=kJ(Ws5~AM{5BAHo&0E?$(nmgplY0WnzvOpuc1U$V z4=8XcB_a}upq~sb$(pQlKvlznb$A(*zc3Oihki1_Ve?T&O1UD!)0O6G+9KST)!={7 z*e*y9*2J=IMs@q_>}!Ywv+Z&5LZ0Xclf)mn<>ZV9DvT+fnaj8D7sk7Oq4pG#JpcKy z6bIh;0)%l0z@D>FktLII2Lff2&HmUwjrVp!HDDj-OG0Y;RCHpUiuMv-P9J!6l`IsH z|8Z=rThTd-2ZYbkJ>K*V(Q7BLb6!KLmrb6j*PKT&)>agF@J1eKB-+TUAS3N6>al&A zT^7FzAI=7}R676oEEBZ}qD5!$jeKugYP7GnAkt_!A6I~ z0|zn8Yt{C4K)m$VKxGx@9;_5iir#o|!HU8EZRmE$@#BJ{*p!*p{#Pz}I>&jkuhlEn z9#fa-6vPg-1O!;4MoOHi7kG%FSfIBYRD7vn#roLI7BxW z#~)cwO=(Yrr0EC5?(&_*DA25k9gIEfjieUE7fJsC$BZTEcUKwZF&?#>Nvx2(y~o#9 z^43~-Wo6miY1o(Pav}@EcS{4-SM}>dAG!z!uKynCPp-_CM_$ggivd4pzlrg&aBN1z zIQc5vPCgb?G$}a0=@~T4b0_mm<@3UO?h|!#3$Z*a5H-4+mk*<_Yidq!Om`xbFO#KLwdpjbj zqTUm`brRCOI}15r9ynhXhEF5h)0WeHd&g@XP2YZTRE?5)fccxYr_@%j^^u&ZDpk8B z;s^Vz-0!ul)7ohi`PQ4q-QvHr-2J7b#Wp{hq4G}*qKJj9Jmau#v`{=6WvWGD%;@tl z-%)(0!$!LwI4Eatsx;PA@##^FH5qAm#K{?{hS-4j(PB~>I^J2Ni&Q33ye~ESDakTz z*nMcpUgJ1VLu;Uq{;XIjhb%7af|D4Vw&~!!Lsn$@W7VOTS?-|;%lzF9ov`14ghBrJ z_K|nF_6Xk`VM|Vaz6tjBgQH8aqgPrOy*pZtk*$Oz;f#&?iOp5c6E^w655GjZ6Viyi zUfsUA%P{vcurvh`xr%tQTl4zNAUi|&cwAevfP>VJmDr6`d~%g3jE;ZxxPPIk}u|>)NZml2=|OMxt7qOjw^pjJ4LTIU z*&d(k`K?m+{CUR^O#f&q{0RfaefXI>j1K}=W5jCWk|Ltj%Js|{nQBf_bg#$sIL}i{ z5ux?}nPvFJdN@3g8Hyl8A?$W*-kcfaWGH=t`Li}HUZt+O>@w@A;_s11L+;;F`Q{%Bdt&0v53Tf*sd#8q#Te7wukQ^~6$<9B2k?H{x!CRDu?Nbqn$3UCJ~x!YD_=kes`l$cjM(F)$Ik}Wld}GBGj$0 z%=DP0Pjg}E$y)ON5@m?5z2i8OaAWR#brEpgVzw~0VQKT3$|DrJQQiBYQe#o;bHFR9 zA_iEX{&+}{GE}p}CBIUygZe^2WpNq$4$CygT*C5%9yj^kLO^ z;`*82A+5clRS2SDPofmo`!D|n98CSpl7*#DTvr(`*+nZpNwb`9qDl5HH!`x%e$*MO z-j^<(R&6_qJ+G%1D@FGXiU8dG?d0VQF4h3%GwsW5ZY3u=QHkE-HqU{6K}?Q2_(Oxf znFT2UZN`gFNEB46gFj@n|DlN2L`Ao@=(o~3Ns{n!hPZZz%dn<+Wuzpf{^I;ZErIR+ z)RSjE#P8M3+MZom3S&;^W>ARam%J#}(8^_`%M7XXR2Iu<74z39JWL)yUGN#HKPnkE zZCez0NAue=-KFQ2+1Z=d%a?rC&XCR@l@ONb1BO+hq(XV^wyqnE-S0ab>Synq%TFg?(^NDe@ z0?*kpN0kxAZp_QnwUpcM&U*%XTNrPu3@5&DD|k>{xH4H==Dl7$+D&`Dg`?f*)xTMP zZRL~PvJ743q~`8YPmg`=v=s=6EU&Zcn|W+ZQ3Q9xmA2tF`&UVB!)?T?<#9UK+_j77 zOY8ToUhK}li46mm@C1Vst~uS zs?723(q*lFD@tkDKy;x6#XQ+C5}GPSQe0VWv%`()rE%+wJ2KA+@3^!CKBlLdL9u(U zaFIkQAtA0~%5q9xO`(%Xa|PjqdzJI={-vH-jM6w)DFetI`y;32HI!uYo3Q7*kL#HSIniw)d$Nl#~}srYT}e4KHITv z!I4WnImyb1<5>LN>~j^_N! z{?XuPFp=wxV9Ds7-c@D>DVjis2E>)gQ;LK$isFnwoJ&I#ceT*vs_qc*l z67w!|>!;K#!$*t}fkn`i+=D1%`|q`1L(cgj)R$Md${$#~m$k$zdTAo+_vxBmdnxt# zT*%dK1M4))`xi(6Wv4BH4wHyiC^*zDrFPGR=9r=+Gs_2eaW`{N+Zdk5S`w{M~yCylsS=c1W;T|87W#*IW&EA!S`dnSb=>% zunBpZ^NJQ`rG%L^9L-3Rc!Og=_3gXRZ*rwq1rl!SEhPmMCGn=o%sF99Z%kI(T8p@^ zKJr)_Gr!Jh^mxHJ__@Z74ZS_SQzJa_X_G!eeU|OY(Ah;Tr8%;zv17OFk;&LNVvoa_ zh@|Lbp_d_{kIiG)pfq?$amY<&{;f>$X;$Bv5RV<(`5WH5JYjl_Zs+Awm+<4{Qd%c*SfL6s z+i-uvOHvujW{;M{#ILWBVZCulf!T%>12dST6(aRM>FW5cxuif7zOfG>pQB<0+;A-8 zaO|lkWZ~ZCFWSRNe71cbNnVvaMlxuZ8VNH*T_ME=(;=&tX*XVx=Z+f5vmGs6n)?u9 z1>CUJtOPYdO(D|yG?_$%NK?V0pj{r1EBu^3pg`dYVYJ6}@8Rn`bb(SYFzFlGDBoJj z7UKTA^$201<97*uZhi&@3lBPyy=0gWM+Z30(6ixP3*8AxlusrIJ7KtAZl(LyO5w z<{@3?0@2TfI1SZ;d%3DZc|I^S%D!dO1QMg`fE;_x zL~>?bf)+83DA(QZO?tWMTC^jx3fDNlSiM!YZ3;k-j;R#_xebNlF2FK zQuSzO@u48WRI{;TsiX10=Ce`~pR&OFB$A3b4VPo_HPk(Gy@wA28=D!U4!tNaFzGqL ze7EaC5K&SR(4s~0CX;eEiJ=@6M-$KBYq$G}#(i=-o02e^SRvhDlKj>jr8w1rw{kr| zDj{E{QU&BmfPjqk9;1hqCZHE;-wN;d08zKQ#(vUnt-@b#ip9CS{gC8XC)JIt>H9hX zN%G3O;y{r-_GdIC4jK3Lq;598fI%_WRi?~_-D~2j zOdlMVpT8g0Oj6CrqJ*oOE+*`8W$S1eWl)3`38W%T7MmfjC5>;~U?fG9SxmQ3JZ+li;zmjgHf4+b`bzNU4B6N-nA)DRPd z32E@gp@L3K!jw9@*>{m@X%k9~Oam%!5tuN!AXe?X*FenpqK=_n&SnMRJsgvlm$!Q* zKZAx6R|pWc?w!T19u3K}M_N|{)?fN3xy9Gr1#*14ZU&MIb$oX4QWl0+8$Q#r>=TwT z?eOB5ScXET>IJqSuMQ>;WhH1M?ZXZt%n!F8Z z*A0^+!GX=Ql6T5_e&RE~ndfb~>LqbyUlR+8tIysF3H(HmRC+6#DTpDLhHC>?@7~0K zsov6;7*DO_CG0Rk#yuakrshG!Tfw=nUzHz;wNnQJ4?}VGNy8Ca9*vNM*ZPA3(UF}S zYNRLCdnp+#ylUI&#;o%!3a^8Jv(ox|^BN?gu^^EO;d`P=Eh#RyeU@4!@VKaSRYZM+ss5EiR5UQl8lL+^ z7*R98on+V5VSA`toV3MuwQtg9ydsy+cBFWA-Jr~*X+n7E^+T~f7}xSLNbPtYZPTKc zs3gXj>QG-zql7lQw{c6#o~Uw5k<0ZaiV{6|0JnA9DKO-}29rbYl;6GfO})EPn52X* z0HywF#%iMIK-^wIJ|yzSsc>a-ftn z^f);`1AZ(VJGmSVD_ij#^}2e(t3L4-t=2l@k-fBKW4a6GJHlIw$YBTfZdvj$<(Yxr zOEOlA(uNI@p)ylR2An;-eGSLLT+bh)3JyocFRybv`5Z;-c)s;q@@E?UI-p>L&}B_@kjN$t** z4(YyK)@X6CHcl!X6yMNz?@9l_Bk}BCaU>ZFfW9DERWLqbOo^lx%Eh0O0oUm?3w2ms zcY6d=04q*mh#F>Q%QM*%o)p1-|0qo2&cN(FgqsbY%^>4Yo%6#0(kypOBHZfMi}OQC zKCdma-H!xZuhT^LU-BuZLg9}PADq>@9-&FIIV3Ovygd@)I%y_<))gsH z;@#qhQxDnnMidnCYmvPbgiv;qMxmx_%vy#3%6sBjwYv-Q)8DjDb)&P&r%dmif5`8S zww!+x11`V{IQo{R52p2a$VHbsF#oUXY9?sC+l3S$s^B$n9Mp)pXYj=qwnz9S-UyTJ ze&HjBmNSo`B0a9`5QszKK58^2oD%IfGcH~~j1*?-v+=qF0zXArDK4BFJQlKc z+){mhZ%@@T>rWlOZkl|TL>ngt07^1Q`y?)%(`zYl?@t%ueOFbwGRT2!Mj_gBk!a|^ z9i+KP3Bo>Ck}Fzn%dyA&G4RYdZzaH*YGzKmX~@`)WWZGbWhd0 z!kxd4KL(MHMHDV5&avxFI-*3+OiJJnp`{+dS^g00EBNhm))OL$0dj2%>kT^@p`Ktk zK~q@x%jdjh=y>7?pDNmuVOyw`N$t(+?H^xK%9@YARyoc}^y6G0+V{v00Z&cl>lI>{ z#X^2cG43Wpa31Yf8c1gES3Z!e2IR9BsjA|wtd+*n2o`j z;V0mRL|bVV%CuSp4Gz{ikQ^#e+1N_%o9%N29EICVRM{XK-t`TPoMW03%~f=9^8NVy ziZ40YXCD{sYn)8Ymb#Od02m37GON3_@LW9Tw`L%WxxrfA*24c7kgkvP0D1Hi$-L?3 zGNgoUjs?ORU~ET8&wM#htT{e~J|JJ%lWd*7Vj?3kTzrW6c%(S_Xeq_f@A288ng_D~ zmd8-($EWqjYlpn2S1~ZB$bJF^tp^m=bo*{LS?{G|BqpkXAfK&uma)cQLID9v4s3{k zXvRb|}ZvD6oEUOCV(GWlSn%+!&yZVp=MwsLQ_;a!xP z-}Wc+O95P1vssE@eGGDP2b}xub}&S>_sWX^w3|R(Reb8Rb)o8EcUe(ACkO(?KrbOF zf)E`d+!ui}yiBGoj~0htDc+Lhj;X=pCoKj z%=n+IFC|;MUBsht&Wr24-8kCn;&JsD;}M@)tsd)Pr-%1AhLZ@USwj2CsF8)8!o zAcfI870Wt?pnJCfc|c^HTR*sD~{dYZpB~g28>7FLhhWtF&xdMxgln|gSn2l3tUcb z8>jW=AB07mGGAG4u>2a&Bkr@ueK_M=1_BRdA<^%5M}QU;K7GRpXknbgGyw@dyPpQK z6;e>84V>r6uSw9Bs3e6WpW(Nov^(Y6mkg?|8irqPezQ`-eh9->V&4&`L_aG*=`;amcu9zRcp-_gsxe2quS z^cobu(4;e#p&5b%E^-d}-n^}Q>wDX)*-N>c9;URZHk3`{7K*gf57yD^@u<z?-VFi5nOS`eqGKjfsJw4S9ue--KkbD=F$} zy1~6{`77F$R%*Sxof%1<#JFjJ=~&zr?Jvg6S^-ffL!6Q-{uEEv#eqtwn9(rFL4u<3 zxgkV@SPB!kjC4*xswbK4pYXa#3zdrW${aT8muZHYd_6%iNtov1hGzvWd@sfZIN&wN zXrB?AUa6f`_iJ+?-7Wjv1SJgoKG>lWl&2|<%{<4C--8Fr7bCh?V`rcZib7oH!y;k0K){YqX6IwZ4S&qJO0ET?&@o*b;h1E_RM9#nT18&pORB6BK{ zWrrelTfkSP0Q{wB!nv!PXo8LMAK2entLzgXH+GA$8F>5DW~#1yz?T*jm(uw`kADt| zZZ`7y0R?xPJ=rp_{YzNiS1J%TxnUgK4Q>wYxEj=s>6YSfJFDeqM$B08_v8lwu#KVo zs1*>Vti`WwJ))UX{Sra(P{eb?4&+^swy{@k@^cU6YiJzJT=6|v<3Xn@yip~!7Kb-* zzg}sI6j^;YMnSG;3U^)X!ye`@XCiXcWtfeo7Y<37vF#YBIPMGu{ z*Kf%wi{GPC!q)U}W<2)RY28DV4anU+ z6#r8nI+qnVbHBKuoej^{Q+Y4RO!(F0q`3G4R~qky7^z}y!6_%1W)+#zbG+!TIH^z zjNLk6*c5k9jKZ*Y!*d1O7E|Bx7NWCH}8BcymTQ`YwgYWmf`TOP!;Nw z76Vi4dbC2Y$d3NFlphVvu`qGq1*-YQMjWyk?@#PC$fBvcy2_AsmA=M9AqUK7q*!{- zk7?02T`HN@ed$5^qk9#hrY~v8GC*-jP)Ap|{WkDvo}e)7NagSdi>2aweH?ai?x&^-;4qWG^fk+No+j_ru{rMe|EK#jMI0x=+coi;>4b(oRS1skz-YH!_) zTtn^Ng6fB%EE$|#plrT5o}=0%f&Biz0QOPO*-wx;MNwF5W98W~DQj~1Lm2BToy-|_ z@=-KBQU+2A$7&( zyF^$DOu266&DASp91r*p8jqUcCvO0+{`~y%V_q$cddimiov*ihLh(pR(h^pN*fS^l z&_n@#IBmVRMga`Ej)5*|rX4$fk(FVCpXk+t{oycj#%GGfVe&~UFz5$z;Lm?{y||ox zD^uZP6AYn9mhiq5Y11t@?G_i4f=Ir3$1OF4gej=W_Yf?xiPr#Mp0e88y4r(?8l(&( zVie*GCKW`U1!h3gL_H(ZoPXRW1Oyny3{B@4S+={K0&pSfc@!jC3kfag~f znz~_Qv|wH5c<^X1ma+-+YxuoFoq{oObrbK!gfSS7s0Wf_Pxm_Y_n%4abYU>vgJ|_z z;H3g8@jP&5U7f42H}?GwVH<#J&xK=u>!Ca~n%Twsyb`+o+p)TZ9Uv)euGYncH2R6yje3sBj-f^_ew4%5z_G4EeAa;C{Vk{ z?}Erd1UMrxH_2xghAi(v8jxk}^|L3w30-#VMngyv=nQ_x*&VUz4O-u|azD{`vjxY~ zg|p=Xn=+3!8CIG}{#w65ngmtRYxyerC!b1MFr#kpd_>pJHH-2z+GMl>jbx*vx@e?y z(tOIH0hGdYxOW|t*zMtBT*U;T=_;FNm>_Ym>EHrD^0$720zk%<({L4eLHMpY8P>5H`zS z<;#ei4CVl{+25;N13H{~ox*Wi(QMN(HPz?7d`y=SILma>{IkX1J3(;s0wv-bn%c$i zY+GJyh^#Ow&`2(I{CG(+<7|#Cisc6HNA=sAY_^Tm`fk*J=}mZLa%(QOwdLZ>QA4tA zft7|eO*nt{!|{00Y^V8&pE9@Ubp9ax_Vkxu0txVoxEOFhQ)@hU&Z}zE_WTTg1Va?n zk3EYd4~aIDb-;{@jSt%p##bqL8P|%g9Wl&>1)djf>~pOi-}V=IX|j_&+jC4!Jx<*A1&!twOzz>1A3OH zx*O5@4Cd?P_UIfEAV+)A(*)^c@HlvbH&)#Mj3F^U}_` zi=`o1`#F*tRaocmiSqQiAz4Y%VQ~1t%~bWU^Y`S|(QC>-X)?8F0%lnZXo-te&zr^7 zUc7|K+nJ-eCO#{jpH*3k?FUhgIm{YXE#=s?}I$DctgB;OV_@r zctnOF-a_%oBZOn#$zwD%mkAWL{T$TJ7(@P!4qB@+#i}(Re?|EIn34a{;;(Sfg*xk% zagGKJKA@A6MlPK&tIrV>G&RcFM|kMsgGRupkJLW;;>xO<0kFvfrIhm6oZ_gHhRtT% zN72KT2UWL(2|6xQ3H5ipB77B*;5AY6{FQxTO?u)D&hk%f9ya(v{Q#1Q5OVS#Y4CMo zYBpk#tmcayF7oovY-XFARz}M*Vnp$L6;-rr2<)a2-_U`o)rVlL8qYiYXOuuwSsB-s z>}3H!{2qSdQR%V%U>6ws8~e$cPxD}H3Ai*h#H4&n2I)?aXSoB4vLociD=d466{ySs zbAA#jwxg&GBr8vnu54X#qC*$6Vt~O*m3>5YLO}g zk}5?3aW~k?KO|j#OcoRff)1iBELopsT%9=G&A9%Q?)W{}r6kI4)bAzFRy5=tCafaG z5A>4^vyb257aP|0c3dgw20S-gndqH=*BPWcRoJx~k2#g-U85qCA9Ob0qUi|43Kp0A zR1(>FZr;`_<@b4?p*#=-Ia43(H(k;Y-`8;k6*~1O^l-{Y ztF%WD=z5+-$8{)UbU6h7<7iM4;b!N=v_a8!=R2p8XHGj&nEQ9-G&^D^J>Y;n;RWJG z&}!K942hs3S={?lGA@&;4z&qYbX*3ktr$g1ji27SHeUHK1agd`{S*)cb{J6BbB>X5 zb~99;ncn=~A*Df)0ZQwW#k?z$McfMq?2o|$-r+w2R4Qe+Pg3$axrtX6&}to&*HOzc zgzRA7gCOg-xQ=e0xw1{anw_ zNOWh|71WE|HkwZy6#QeTwCF3G_RhtykD z0mqNxxdA8Zhhv{b;CAh3&}&RD55Xm;adLinK3Unh%PY&GBtGgD38pTfNW=yE@{Ku= zEreY@p;~yH6_{#)>ez44bubn1bC_})QoCO2?#48|igM%Yune`avy_pM|w?zs(}JvQEeljxj@{A6wjK zH4lk@_l$>>=`1-VDKeE>45G@Ube4DjC)a8XkW`xZ8^AN%o&}p?wl3#rdM+JHm3lN;lhmr`=?Ajf)xzT7Gst z6lSO|K^hQ(1+vq)c~$cC{e4vYhAmR!`G&9l&-yM%prz=U8?z$@&8641S2o9(Gif)} z?2(BQUkn|FAC@*9Jcx^lF_%d~hQOdM4CP~djr-g8;^zoDSm)#&POqQJc5>SU0UGtI zjs;!jpfvg+B8*`8omLyWF=7~B^CB=KC#`$Gh^=m@&r(rSDD6GorF#-7#J_~p;y zcSz}pEHG#=spg+5tPYSyrxYd&&iV~?tVHAiEtKk1!SNcdUzB@(bjU?3SDq>9aL7jh zj;F@~=kFEFfG&epnw9|nS(=-D{z>F_qD42Lwh#xr3|#V7O#jkhOEK1?wiMd*n7CzMJKGk_w- zJQNEpvGF<2%kBalV-#6{06SROxot<-`K)_W>GBmF>TyqjI?lgiw`Vl-J@-8x2o>7E zMy@s^AjipX1k%>*m2@70qyX>EPf6QjQVj(+TDimfZW(fi#=zqe838>$xWTT2{Uema zu!jHQs4t)!#N-b}U5N8CQMX9EfT$-E&rxtrpPB!%j@=Rn!`8Rkj<9?pae4m`En}}k3vpIDuCnhWKBs-gG)-3 z#4*dDC=szS*4=4)@fUs|vcEh1oQ3%UprTy;N!I2GkcN6d)r&oljjkUzht^+0C$2+q zt`fSE4<q19n0|f%qQJ5K1jR#h zkd}+t2zV`0hNI>4^@7~gk2tTYq}RPQ5F-yjrtTpRb=nY|X8LfT>%N<*;$aw=^|=!8 zu4a6O9)w~k$FrF4?MaFE92_lYEc1WBEhDILhY#i`$>U(Ke82unECz{^kJDkek0c*{ zju;cS@CRiixO)Or#$qcuaos@cr;2=ZDK^)HE$ig&ukZp9B@1xI5iFLi&&j&WC6*f`ki;LO$+c19V>pQshOq=XRs)1Z#VIbr%<6co zB_bjM_dsl)6D1L|LAfFkyK#F(f)rTQ6sQ7dH8y<`^|=XGx8X>v;r~W2Q}W{Rc>Vh}~_eeGJlAxeyC5C|{TOgcPdoV2%FJv250fu#JX z_e*LhD6*%DiY1tPJ6vf85VGe+_U~PFu9KH%XrvNM&rRmMfTn?4CT1 zJIe=vrtZZ?!zM!OjypQLR0@dp+)a*a=Qv5_{SiYeP}KNA>4oYJnG@9)w~Z-bk8Fe(^Zc*Ox)~Tgrd?1pAs7$Qbqs1q zCh%>esjfr90f{KUNYRr1nN6y090^*JTj|dV83(%%?(OoCf(CQdU<4-NLp0#nEUXo5 zCuCp2n-7Z^*z`3sNE&rY7-wy6N(atB&m9+%Vjg3g%@ zV*<4#{sC4uwSEvt7GMep8j||%bTYr9QM~t&mHSZ#QQJeUw)(Y>n?di;;YBq}JpkQ~ z9}mP3chv4^sr6%e?WNYLJo^6esk|eL0$y2Q`iFsB6>{`8lkZjhNJL4%qF&yW&2 zje7=7Ell+v${el((3P2E0jKd{s5f+|e|kxQAhAl~`aaMesxz70FfcIfu7jnxl&dle zYy^WGYmX<8OcV>G03KR@fsPdgfZVMW$Z%nFN5sbxdjT!mOY8}+Q+EginvR|ziaS@( znu-S=m5@_wDd9khDVETyBRzb*i~g?18z6Gko6K}^#B!Ug-|ZD`vX37@TOuYfWJO50 z5*Q-}ra$TbN7Q$KQ~AIDpK}~K$2>-q?7b;_A7t;XLP|nqWlNkRLK2FyLPkbqv{1%L zwuTukq>`xYZ2tG7&-eGgE}!eF&(%4e=Xu}bb-(V{eLpH;bK`zHUu5qgBAffumR9QW zkii!REVZc>H5W{5#7H{)tdm7*8R>wB*&%vE5w=SaXmY6i72KASg-~Y0DY0+p&1FOFBp;)@KScljC`# zMvz8C+L279!x$)k75$plPA41^v4`UG3Rr{nk^Uvn%@K?q5utt@a26b*)-Q0bKd)ol z)~(@Cm2Py@gvW-O8FQ69vOMAvkkv64SpfJwAr)W)||K%=!Ru;ilkGpOT*E= zb5o2V4h}bwLH1AOxksra=b)!Rqom9NjnpZ`bQ?V^QV`R9jN=L(w7v@o(7QazBu3Dx z*7x(ckoyr4s4xKj+^@Os7*xuKzQ{>(T}K!}Yz!Zq2jM106)7S3*~CEGue!bZRWDOj z{D-K23tsfwiqdQepWOLxooth*-&NE8`uu$O>VA2V`#*0egSrVsbtDhE^gqbQU1=50 zjr8_Rdi79282zO4?l?)*B6rH-`ygi+86cnHoa%Kx=s)YhQ}UAXj6jA={(H1d4iQkT zu6<~FklZ}qen4aW?Yp=GhRxss?(DLzTpj6V$YZIKgx~hOY495S*-6^}-4V|tpPS2q zE3NM6-nA|=u%3A;y2Y&?a$od!uaQ6XlIyN~iQ)$rv+0U?j12X~IuZAvz+&}2QQ5o| zw}N8X719zj$iLvj=bWxAfyWZ&j0>PmHVMk8 zM<*6KJ_;M};5lz@y}=pW}i4D)<2>5m`*3!jduX6r;gjjJI7 z-qFp~EdRk)w>ps&xP7a6Kxl6C!fZ*oNCo~m1>9iYUzt>GxJn?sNvX2Le#F%_*}Z`0 z9TV@3;zS(P49KH?D^~k&NZdt~dOu7zxlf?q#o=TlpIsvo5v<)A!?zoU?_+-C23`|C z-W2IHAUb=F46)#?-F+wK6a_jdr)moDK&r2w*tj@R-!;o(c{kVvQUobx2us(gjg^tG z)Qm;wKtxXExcE3nge+NECxC=S3o=ak|Jam`Hgra!@@aq`%#H;c5W7pkh@++ll>WtT zdq)=!W6Q$#$!~Z4au8aR=V^Kuv>v3Or%fr0Gj{yq6t%VHt~+koPKAhu&t%i(d7pZlAjcA8)pq z+XH_l5i2mEpMxDM?B$x{F+kl0_u2g|e%ob|rIU%lxX3fBDqhQZLvtS~t z+pcwcecyzUNrFFPn|lIi7*#M?+V|)0%`^xUW7{ll7(q=FN2;2g;s`- z`|D+>T@tXeV-c6Mw%3iGm=JIT`hEN<5&EL9p_@4sB0rd4NCb@Z8XBVcC#7HIDfhWsD z$0p-Eg0S?+ZicTny=7d<6KzR3WU4*w>Z$|6;t;;B`!i?y0E5XqCG2t-Mdm{=Kx+xh z?OX{{$K{hJ7`EcJZ&7U=XIzl%I?L5choL4{;}JxQs63$#7C&LC$+8B6WVf9+W?x(% zZ3us~=Rxn`ebk_^Wp97n1!58@0+?q^+`bqYE||g+nD2S9ExY4@*ZETn>A{#5Q6M0) z%t-)e#_uTSe35|vd1+?&ZE{7qd^`nIZm(Zl+7sB&k`L-K3X0;#z6tnj6fSi9K`7hN zfejOdR29QQ@4w9*oy`d4nn@8a%{>WI9v*p-3tb7z8Y7=Cf^q{Urz5EMwwaT`#OjY| z2FE+Q{djYme-`}{6c$d<-NDUVr*jyMphVZVuCXKwFSTDlnidodz;TlgYDW)&W#|f` zFcIGE8IG>|NoKz+Pk^TQZ|HR%5$V*7jEtp*S4hGu2FD;uMD*Qutm@G|HbINmoYQvL z74&h5SUo&tyx1*Sl?ke*K((b4YNJh7_2)h0&wn%WJCN*ucHPK~788#54>xi>)Bw)u zO9!(owQ;{Ijx(+A$kbSzyxZEy!nFyXw6ma30$KvT^k)_ zC>mG>F_8{);RP zBNt;qPRaS4gIHp+9%Omt7DjFE5ENdrImObxO6piWNzl#y48?3PJK?s+*9m_0a%BHS&} zuf&ZALkM!|kslgWxJBEPw)zOG?NVIPwYjUpLo{Ov%z}&;Zgcd@7VIhb+L5BHHm5sp zh=8AM1+#l(jxwj3ljDIxIzUg^0#U1e>uh0Tg_Qi&>#KGXb%#AqMl6>nr__Om)Fz<>90Eo7k2=Yed@!DN5$Jng zvR=*(8BE1&9GNwPM)=DURg1doSg3;2n!3xx#mP`(iz@QUzn6u(+3LyU5g^zhsqfjT zhOT@03i3x|o}Ul@YAy-ojdVe?RWqc&$?UUB{DSF0bW?)u$RNi}slIuaE5{+StqSvQ zh8$6jX};P?Kpz96t`6>E|5PP<>N=U)vYic4da7gAbC&>73?YlNprty06l6!9fiU-) z0}O_tb4&9dP>%F%D_ZoB*~@?mC|DF!g-3*N*%xm4xM~h~Y=SEYKmKX zZQYwN5i}%5e``XgxPP~J={HEjNUfGfJNMw5cx_d(i_n9>9-reJ=wyfqI!H%Y>4vDK z5{wNuq*nI~QarFg1m#2DCsIkX&WeJ>PI4)X0IxyV=*D5uw0&4M4`WDuI)h&8xS7 zjEKa@0|#{!u)upYcm<`q3Xq6yNEH56Xl#1Y(^%Skz=kyg0T)`dQywVj-(TZ?JRSTi zeGm&Xjoy_F3nq_Xfy1E0$v+rs7}Y%`(=gY9DRqzW!XZ3l-;`J*g0Dcn+ zm8)mfL>?Y5096PQ?BO~Kkn3EUFjlRXw5@!xL(6DFyK^H`az3xsC^25xH?7XDuqM`( zD>C=6IbQSa!>h5be^bS+j}|^W%#gUdAg-EN08Oyd>q|c;p=A6%Jj8YrWH8M>m+ALk z*JXIcnL^A_@-h3;^6Pw?yT_tJgsN>a=QDL(r0Cd$d@pq6HYUQ#Sy{;Cqgc4i8)nJx zeixmVQ&=MAs+zy;M&p;*Y-K-Rg(U-WMBsCTmWEdKZ1vBWONiD_d{D=#SQ(9i)#<-lTq`HY2qNR-Qd{&oKuwcg_uq{yhcQ+Nt0# z5uvM)XR_cyw#j&V4OL{w;ypb)vKYD5S{LSo$q5P{pj(`<2@*Jk3I?luqZ;x}GV1&=eZB$MvHl0)pKRM}PMIFgPT#`LM_Z=KGL3LLS(1 z!0fY`ZAr^Qg3(ENn95r+&cQ?WcOn1Z1@&38sTZhc4E7wlDSLeT`EcWU%C@d%@U&f# zvU4%WvH%m^J^JJf0!w~Y<#JNV`h!TkBkwfJ>S3zP@mE>$uj_y0&4iqOmOmXK=o=cd z&YWOKGDS^T)BaFc$D*{a2qwR|878W}`ToXo(T~SauaQ}LxqXujc`pv$cdBVI%T^F) zkC;Vi?prM6ir$>B;T|@Xsc)V7+>Gqd@O%Wl31uW_!RXN6?|(KSWE=uPz2z^PD;hVx zB^N_RCOv~u;}?67#>JPtb$_1CwB%@H36fwLXD-@pXkzn;{4?ieQ5sp<`4Rr#jY6Oc zs%6oU%0&ad)3v~@@>RpSyOE1j07X2ZerHqHBg*oQJQA&sk3+t!%2Bh3OwaRQGy+!)$FM+~i)ld2UP-oF?20zI{mmcYZ*F`Wy)D?BB^3JhO>VuxpH0nbj`FgiHd<0y{kT2B{}##tRcHEU zWNTGiWA^s2AbQShWWV6I3;cIP=_MdCTV?_8!SQ4J5%bX+sO4Rg4f#eVPQQ4uR zopEJj?f3Xl7(O={Or+jhf#=EG>Nl@(sp^8ruK4{^H0AiR`1;hQ`Kn zD8YaZkb7dMn}Wv${p@eUy0+*OQ0V7`-mmx?7bi|>i>O0Y!3RX?$0v`U?e1lQFIUGz z7S%H#fbY`O#mouo$%rU4{>ptBOhLurp#1dKs^m^lEBwh~mJB z@x=kSs*kKh4CR?EF$GK1Cs#cSW)?UE|Cf+zN=n(A5zhKXSvFFEFZ&s`uAQoCf%r&? z+z`IVGJKIpg@%77$P6DgD!NlC8zF=m`MO{C`n?&o$7B?agu)$WnR@?7RMF>y!h)eo zb5q2!i7GRnkkDbr=MKv4)M7PlEz?D23PDp=3kwSmqY4rTaPfB7RFvG1fBm;#yfQAo zx7)Jxhu{ARHMB&o2t^*jf#=4rdKX>|nRzEYAu$=riOG(@))DyfCCI1EG5S~7!hfVQ zpEbBr1{UQ z+B_~V+$QEFIEFMXR)om5?yXq6aYFUC8Brd2dLubR2x28#iL_T&i~3p5K+>FieRU?5?Hli|C!w%|qH-a> zoFtAnHLPE`-Mjj&i*-V%6;yz^b)2_U^a^0P8^XhT%Csqp@XfVx9Jc~G)_h#t84I^2 zi55cL*IYOt6no2Tokyt3Vcq5Lq@Xq459?|D<;UhqSZL~Cnn zAFVk_4SSDd-<^F@N1|h~$W^hX8+tm}C8|NstM%z-%`xFAIFx=E_wj#t$)1KSfJBPJ z^P%0oyx8*d(i4iyv>W*>RGcTYAxF1+l_E$tX&rj+C2cBh6x4@Do+)rN@|%E`Y(Y-{ zfc>V=1juN3+ute`B@=ZhpAZvVSylbIlv&Uqv&&>)qs_6uSc&58efNfAG{9pI`fQ}nqm;1XDnF*7ssp;yP=oPKxzh&S+o zHEgVx z*PHGg$ezpm#+vdf0`6)1p@Gw-o<`T{&wjRu92Cr7NQK68=vb@dWxigR zlH*hhD&vnNvm)Og#<<7&^uE)<((U5EY@%wErTJ@YaUKxXx_wWGD>*-;9Jm&+Z1Z-1q9 zGH4e=ABQ#r}|(kbCGIO$>VX+bOmf7zDWk zBj6Dg?GLuomQi7*sBASX=)g>%sZ)Z*vy>GPjyj7_miL9sj+#Rz4Xu||+kLEQIPk#Y zzTV+mqb;ATFPgWXdGMqzCPhk$XC|X=H{KHY3^33(F9zvLdswoA-{`Yox@DBz8SgMLm~uSPTY}p0fjVPg{ui=pN*$yhIYzoL+I(rMIz@*}B{BUd3FvLUp)y zOLv{_#b!_ne*}_mNV>=vNxHJ1tGGhg0Sc7J!fj9Oli!tDUjjDEpzB7Uw2Oi!j!nWY z0cuJ^P!A8jrz5LNr39^!qZW#iRJvr-f2O;eLcpI~einXs;><)!p*gIH z8cLP8vhd@rrQtQMJHUvR-`n@WmDOvwlH2FQ-mG#3yvRtE27)->0Nzx>qtO$4j{Umy)1-N=-S|L>#;tB_48WEFF$=D(oh`$6RCNI_ zy@EYotE<1s*S18aDE&}0a~j6ig+T9NceFW5v&1B$8^!a28u>N7H%Z(1sK?2BJ`C~C z-LrZrK9@6HHehBNd?$6ps#5&87 zWDnM-8a1dM?F``OZ4crf{TEPInaFqa;#tNvJH4KV&KhW<_EG}Ppag*b=`*3ufJRZ6yCQ&3%Hu5qf2>V5-zR7ZQ>LV={QXl>RdsDRKOb4$gZ!gI z_&IhGsG^MS?U93dYv`8bm|^ceeeF4r0vzDr!A}3Yd+RIHLrKtzkUay9<-GNteb^BI z6{!{wjehF6h3)ahF@+0LIA2~cX`Na5fd3*u_AwimMSuqq4*Tz#n*tQL>A+L~#8GSn zs*-63xP*lFU!3%Rybowe%DSx@co{}t4mUM5y$Nm4Ks?FqAf#ERb3{ejc;$UcYzrBL zcmt(DyB_<_KB zy*gO=hnJ1*u+tyEfkaX@xY4Kp2}?PqGN(t6U2Tu9OEu7aWfPEa7Q@Bz(9TGSe;1vj zFgpSiYBUssOI41`YiYM0G96Gd<8^1RK6G(C=;)(%db)*gEtB2b5W(+4J5=JB3oLjL z9p-o1^&=_-RueCsU~zN+JuO|m7fW>bF`_(wY1}Er#JB#e2;vJ8BphKP)nYrn8g5;L zTKJGzPWL2i6i5`@Ik~?^BYdG3WDADCyp{4sZ>B+5J^7PdyBh_f5F9&}d5`&EK7nF7 z6IyY{Oq6>*?skyc`c}3w;1g*}UfQ3fU`JlJ6U1bzSzMV(|j&{nb_VVlJ0#_?^FXQmF21W@O-_n#yv=!$U*7v~Zlox}IWPzA*x89*2p2|Q?P9NObC7>S9bk(i*X zr%&ba=DfQWx2J!7uW;=Mnf+7`+I8+iC>^Z;Rf~l$e5?52Z*T-w(u>K-r2@>-+!=Mn}MI`gD0_h?MVDf z9S#}i0vKTJ191Oy>E}Su_GY*~kM`gD2L3Q%A_mbvT|LxSpO#(92r9cGnA>mqy2rJe ziM+M3Vhfbl6UMM+xq^D;2bV}u1pmvB4Bl9^C{_}@1Z5@-_i9xJJ?wr0PT?WMyay@^ zWOqy%gddwX*_OA}o}72jlDXa3^K>pb1h`Uf=v_UtG-zUGVq_F?q|<{Ij-xTxJadYa zWuC^JQpL0j%4t41LW5@8Myz|UwdNr|`0ov3Y2 zJ)`Suw17U1m@x|bNr=+(WX+2h9UZN#81~KwWOI*U^~>Az%<2^=ozhvETUu7f%9^A> zhi;;O@#2G){~%@_xL5Cur99O?{HUP>* zvSA{kWJ`}g9ds!gy5MY735;@U7fM~B34Q#rS6aGNJi`Hl64S*$n*ZV*S`xug-9={` zM#7{$wfNoRrkbDjg=vg4BbhHVh63v>(yuHX%KZ$vIhj}6^|H5%&q7}WtWfV8I$c}? zEF<%9sO&``YaWNpo5LUa6@qx_|e-R$Zmq^^-Xnbmbn3@2IH% z+1Dh(>8Q4MRk$wPee+)TJRSa_Zt4vY^Fk5{RdQwFk!QmQdiNsk>mkaRCD>bFjGuxg z>kXEEZbN&b-N0?Y`a(S=FW?Y~Jhu6BiQH$;$Y2>0>uxSXHdVW(!E7^wJ@Ouow^? zh>BkM68-1V~H9=6i8(F6ig@ROW-!^ih>D=1G?*w*o2 zAM=s+qK;a{S%l($v2d?-QoiWA;tmEs4__2n{{8XR!_%)#jz@1PYKAYg4$f1;5u0(t z0IG*aC`xSv*l7yb6q|GRe2_7HHWrq`ryrb_g^f~4prAEKWD&lyeAIc@P5IoUk&Jp) z;{kzTY;|$He^WQaiJwoaeHzB73Z#xagfi^w6htlu9Nj^9IwP6H>A~`nA*!(TC2=TA zuDUkJh317p9E66wn)suH8~xO@{!QHfoxd-(nwsJ(=$jW-FE_5s|06Da@Abn86nstB%K?$tL2|2-p{Ul71M*X?2r;V(`a~zcYYEO`3BeS&}(84}zB=p=r z`laaB>Z>2HlEYa2XpdD9y(dHgGegQ3f2-Hoir!FA*+lMuVUz((vpM(tY&u;lXd-g! z^2npfDFGS*6WDoLMg@W#9TJpThk5$yesioVDi;ROTQOlQn5$pCPPgrw5O~B=C(AV} zR9u$obDCjdENZMdIv=dI=p2I=4D_TkUE2AJ*WQg6lGuiZ1~D>~Z>5kILR@{eLzx?gXw;y*(vW1njG+uBXa~PZa`n4!`go5Y% zFEm0LKm}5MVe^tubwoE(YL~7nZH?LU^WSObqxwMeC1HqPU={jzI|AfR%}F4ChCVks zR=HY3r#j*6y?r&wJet{16-&1%YWd1R3HbjX+B{M^H5?=x{$Z|@e74Mf-LUgKKO_H5 z?>l$ywEj?no?ph%THgnD0Z+~RaahP;hp-^0E@I36dWtlfdb zrzZ&5K_L<+>P&yE457L=YkHpd{IPrs4cbaz1HsL!U|BvZgPpN6ytn%vO;^L0T z7+|5SbF;ueom>b_R+E4x(2WMIFL{eU9aG?}pWOi##;@sq&k8v4V_2%Tu)I9f#&Z=Z zH6a(pqn@HNJ@1c~U%)CQ_)^CPv7IbmN2RGCH4t!>>B6S$*>Wc^nqhN%3(}Fh)QLED zl?JHx5*uG)__7WN`F{fUW^*z{p?hOn)mpMBz#87KwQv7?i^xAqUW6p=pSQPCL6+>; zvix2*O4$!rbAgA2MHig66zB(Q&~YZDwCnC7jw9H*(_LT(#hKax6R|cb_E!Q<*iAO= zT-hrru|s#Njq&-vgwu|cO*I{RM$3UcXM7y_Rgg;5JiFNLqHljO{x|3c7Y+&%ArQN> zz}A)hP-a+M350R0JIM#?xvn-PuWSX*YieZ?XKxn^*cg2Yh(NUN7cYdc#YssmryQEBy@mcSr6*5kMxR|C-Ue@*53L+&+nH`z^<|> z=pH>p#Ay-KrCN2W2R<(Y?D5#sKqL#HD&Z^{V{y2NYH$Yp59V0jJR# z?FZ83Z_a!6R;fjAYY3ZXr^9g6gTi;A_VZ0Uz}(E-JQp@_39@w`s9F<~WDCipA>8;r z;=N?Ci8OPRBenR_7PF~v4yvN=0Rb(^h|SgcpdW9z@p%*>z+o=9pxM#eh;T#r z6HH|G!Cn)^N78{~(Jis~3|5X+$$vl&g=>Wl0%-*Ibw2!{-fWCl>LxERrK(~BoYH| z?k_2hj>85rEZdjaeC=r8OP$PsDoC!_I+HB`A0>9>KR$@UJ{BuYJ2zUBFzsn>XgzUe2Y=sPI zB!aqhqQ+))Wvn4QP&n&L%^{AxU_kLPF);~_cK@*;B$6cJhjHwc)aV?Ram`9Nu_8Da z$sgg-uzrM%lkL2>VQdGMftCY1 zCev|^@t-3C@Iy@^nA;Q^#_I!?oUZGNl-lFtZnxIIp8SV}V8v%4RJF$B8dxC(#8~>r zr?65)500 zjB##@f>_%ct-kDwRLjtsRrh#@+t>z?-E?|Y9S(^p@KY#A!V-f{&8gwSj3_-lNq`FV zfPuOTPr?e8A9PvtC^7MBnK}EYLy=*k`wfnfhebaWPUjwrm|YnGy5|-qVRY(@Y+qw6rfk$^6Y<#o0FI9#kq)#w17c z*ZJDVP5A9COrl`y!g^b?r77CfLK(Xo9-j(>CHchjkb8tuHNwwx%DJKDw+BG%D{k5D zv0haB8=k3{qyQBDx=_-TLU^(TB4*T=!UG2V0_UG`!2;udh&cPyqlY~k6lBLv*Uaun zbFHFxA3FsDE>%t86TmLABmjT=#OI?!d3H0Dt`i4NK7RtJu@}}ol;`4IK?4rJgF7xh z{v!j`1fm zSwN7l0~E8vHQZMpDuiwO%SX9awCY9F60n*LS(>u`?k77e{-w2eR2rIx$mlmT)rUVS z{QAedj*#FMl=hv9^|HY1KXj@9Qe1YO+c?A~aTr&dq;I9Fswa-abYD5VM#tpE;Yt=B zF0Nl>gCKZ7fbEe!FA!^@ZJ%LHf>ygN`f<=1*tli)q8%`}9L@N~9A5-Ed;l>IB_7>=AJ8C7FW7U$x+a zO168pKEv;7&Ft9JBf|DB85WEn-`h2Zg_ML+wJt_*s-7>l5p{#qZwFg057?|)cJlM{ zo4k$%zqL&h(Dwq^3wvIrKQ0i*`P_stu)>LdzKhSnhwH%Ktz*GK@YVo$1pAWU5wvqM zg;8OAna2gG>Q63%053xt)8OY|uzapIcesF+w`8Q$l6OM)3P7y8@DK-}{86mNBJ^+s z^LXPtQ1<;jxxOJ`V>>W58vJOF-oNMY7r}3h9lU+VQc)cET*b5OP#PyUtxX>2&eMEO zT@)l!JU8e6p)NoW%38B>4oWZ;Y=YppZa?0mS{1MtMs^Jg>qN2K0JxLd|5(tPr9VzH6Uxf zrh4xz0q6B`@16-7v@Of{*k|bd=k%{ct0!OF*%67!M>r7_c8Skz>^WLqv|-jxPMHkGe5VL ziJd$63de%|BuMEQYlcFA7LUIJh?9l)PQ1a=(ofr?4Pgi8`>sF@TLQaS(qW0Aey$Kg z?DgIv!jyc5yXNwf>1@Sc8==V@mAgDCq4yd%-G`bu2vPKC8O{-q)Pj(L>9*#Dn@B9M zbsTpHbORV*2vg>EPtA%g^YcIuVjTI9^zw_<0DTaIgH|Hx*1JGWRzW4W+=()Z=&pgu z!sY%_|C_*t{Ukuy@aah5tzv8YTCoQHCA3XSG6-6nG|xWdL7O4tl8rE0R5bL67@Ud$ z@<}^3Y{tgQimUFLwczI-HR!x3sH+v%&to7t<2Ya>-r5_7{%Mh9%H4mA#f&4;f zK5HQQrMVwTzHn)ZJYt*}U>iD@9Oo5qRIn{nf?*k5&xymNiIO(*$_`v8D{Ktv6Hp<_h0Kc+>;Ri)~-QB1Rfw>HkjM&TR;vo#0VWESp2T|8C zFK7qIBs)mMnKHGXFGNQ2@d|c!;1_CQU^u{rHXHbc-ViB*94^d+bi)hC*#*1gk6UYl zpq_YE_nDXbUzj5jO~Glrj5(gc-$w<;XJ$+hI1f^jWPsNOFif}~+-CE^*nRM~LZx2Iq_blHFI{5YomhtZoA>tH*B!b}BvjZD# ziaF-`<)b`(G@~}1#3dYReO)|qh+te^a6+&XMbguLT#ZnzKn76EGTW$Z^3?}b>o=x! zMIEdKP9J^{MWCAik|Hk?fr8EuTma^{LSt?6YlDC8`16;6JKGntd;sB0u-ke61s?ML!k9B;A4N6ksL3+8CDasyA+?+!ejIl9`wqJd> z8X5rWBn<-Tw&CmGXCxCIiV{y`EFO&|{XeHJ%6_82xcmNE^*LXC~jLg;X@eQl#{I5_JL|QwzA`~w?m|THW zNkag_#`#`<^&j!(CI}B?#H*TF0_PNmBwhP5EAr%<+olK=4Veq{-il(r zpXwa&)N2za=H^~Mn|=n5)dlF4r@uAyzpWA8zclZ~jS@A} z+MLrnGg8feadW-{(H=c8*VP8690$M&?q>~o^t#0QlGOzG&Wjf>ptcjyeD#6`=X99@ z_^BLLKOF6NbbMd$r-XMpL~Wdk9&jnScVf@N^E1<-jE&_3j5UR+RwVq|0y&m0v3A$r zHReWS>^KC8jM6d$Ohb4bfWE1FMUDi1#LWh%-=(*EcU}iAzU}1EiZnu&Yz!JxUyo;* z{O8v~a7si>P$u;Id-I5pJu`CNgXu8KHh*uN1BRr3wAxsD&U^@g8Bhom!OBqyOGl(i zhrN!9-iQ4^R$vXT?$e39OlTwQ+J@FX>(-ajp^9)pr5+4jVpQlk@62&qj$EHp<|Z^Q%O2m@}76$#929- z6*kPX(z0GE3utx4(AmTP8)i`nqwa^|#WT@~fZg?NQau95D(7QrAt-SYV0edV3Z`-S zwDjGe6%2`r*BTsNq570`hGV7k9e|*cqIk&euEvFPqvx8A=ux2+@j<}$td3|)K0(Md zXgPV5q!Q@wtLjojQ)S!U3yJo|$i(nI1 zxYR>lwF`ZsyPYHhE3Wf_zA6>6tA5s^c`alrczN3XyGl3AXm#{|5rN)X)XrAu#DLP( z!IqaV6FbHMnIMIhewb94J=5^X@hT=BjRGkDdwakzqQCD8Q{3CJcTEx4pYHAga9N4t zz|xpI$H&E`aKFwxD2U)c@yOMad>9pK5R9N5rF0+(o6-x$_+N*>Y7x`o@rHSP>p4us zlpu8wX!dT;#NKmd9nT>Hb0F45f-!=$l$5tKD|5+>cz^Ch;87%$+e7%QA!JMpp&t6i ztcmQb&VOa&;=0de9k%ezc;bf5(uX`sB2kMyEoHw)SH8CPUI{xRW5$sao6PR7fPF~F zVj87JJ3iys$?E7jdS)RJJJk3ICiV9j4%5l zer|LXfT{_aqFfa5d9`UjAMX=YkVq*X@Belo>fu{S#?`wLHqf9eNtCwCSYR(a-22M=JEFM5`as;4m5nRjLnKlaf@iDipsp^yPY-P->bTh0eXrC5 z>t6CMsqUw=SYrBq>5Xs9HkZO{PK@Znpa@j}HB>U^%51!IF_Vm%KYPwdM}ah zIw|bR6cp;WzQV{*a64-CWtol zM>&F&t<=h;{(K1=Z|g$n(BvwFtKa+JEq;1Jy~VAC9b*jFlHI>K_1!lmX&?J3m%l16 z@ShB!4RO8CZ}(gV6{ggy8hEjTA+W35Ae4%T%&aL+hA~Jr(D6(-fmlF~O+bFL?xoHT zd;%utnu2$~QBEx!L`Xu>nydOJAaKQ-=y^0&pD|Ml6{f28IQ{%gVQouxOzm{Cmn5ON=Nzpbi z8vn?R-?d>FuMcCFcU0aekAk-4h7zxBvC$WT{_JRBCtd{V%Fh>B6meW9B`L?6T9>G* z6ehl%1VM3eWu9F380+?Pic}{4k&e7J#DJj9VtQL7BJ4`QGIs(=-vz=pS8Lp%s$sNV zeZzn4RsYs$z0GUK+E2rEo;&& zbG+%-6zsXaRQqz=FE%h*Fl(>8dx+O0FsY<#`RONU5uhi9Og1cTjnzKrm~fKm01(Cv z&K(LA)*jxa&t}+!<`dlyy(U#)h$>!X?9Mt)2zYKveWC&2R=GEBCX6jd|M+&pzNfvk#EBnT)q}?M$VX^RxUoGzN~7<6VcAk7)0CX8AQjjT^a{ZCKF zj?nL)cD__sV#q)Ts7}7kuNtI>5eRa64$J%s1`&ZKnV)wowjBou0 zG@s{)x4zD)^~SdSQ%4Bj@9j|`v&`OuP|tKg_t-T>zUd$jnwu51slIK~ z8LDf8{|`#aslr`fU5V!A2`7^BU1edvTpz4rGXzjj{3$n~8GrL(4iF56kmR{w&&UgN z@}5BXrWGx$m|*zGmSp~4O5#vLLPBUew``|qK_G^2 zAymU|)0LiZ-3a%e`x-;^4?fBRDtFM)%!GzA`2s;%g_r&HNQ8`-z$?h7Z$UlW@hN&qAyu?w8hM-6{SL<7x#ROC>@j_xt^$ zc#y*CpFE=exgmTY#(J9fx)V1MDyt#@?KV(CiG}|8w61>QP*UN78gxXj{uynQYzwsB zOhZyFG-(z)o1A>~K$}nuT*ya3&8c(eFoh_=*Lj-9)-;u$mcCoD$i1wC%q5!?sK*K( z$EluSiyz;Et3xJg9237p$RoO`S4DfqG)4IS*7n2xh4fPt$nrm-0m(BH8?!?oTzGk0 zl&bY9+9X%yU~hvC$uAocuDPg1r>eIp+m>L!H@*xp>j{RcPdhjLj8xFA&9+|eg!!(W zEC&5wuE8}f<3hKxU@FD1Q#7V1Ice9u)rULX_;1Di*CpGR4luUU`Q@IEmj(SHAsNCO zJh-8vO>v$`sFIK}pQK%c{zx#)Bz6S=9rZH#Iek1tc7b5u*IDw0%hempGop$j^U>^o zgHKvPTHlnpw|(GSgYKns=!EH&-}S4Sn@5dkFGc-{JGL7KpuC4y7T~lOug=?c)qCEx?k}D1!uo#B6O*z1U{+r#4 zO((3wtR8*;hzR9jI=K(}VDue4jNW=gp+%$nfBMc@cz=CT|Af<@ju=EtNl@0>dtT}p z9kizQks)du?4w@&KNxwFA0bO8A^@nsrYOF|9||`UU*pILiyawVdCMgENuKoP0 z!qH4IG)0i|o+7S$nKoPs%Ydaf1Y>*2famH@g{$Fgi90jHiUZmX2vzYGOZ&EfOYfMD zcHr997Sgq&qb5$Fl2jgE3u`0o{|J;7Qh^Jd;WG-zPuiaU$?@ybJ992cqlwKhweahf zc)dq-=%zJ}j}c}5Us^)&M~>!-n4%7!eLn^L>gs%#@L+m2gSo zasE-5FeR#?ziOMLUc)guB|sJD(`Z->AeKK(s!n46b0jITqp%bz)Kt8eorlMQH*yZW1zq(wR4+4b^26RJBbF}N zo>uo_qFEDW+&o>hmC0FXt~W<^;sT*J2aY*{HC{6d;Bu-l?^7RRQZ3CU2(Csse%85tcS35MJiyalYB;g(8ck!M|&WJMe;Zma1- zh&$XbDPqJPRTaInjqDqxGZYh5pc6*zbBj&guS-LlX3KBC&)|_Vg!*5a+aXCjc+~S` zl?g>QpmaOisKSF$vrHU4BMjg3GjivbmrFp#EY^jxz$GkBD>6Xy^nyu05MgxL9}+FX zK~j-X7`=&gbztqODTj=#0E3=KWGIzr+}uGjvZh&lI(Q%ImaUAF6q>Mq(R|+AkH1IY zIK}ZF9kz`3$M8M9c$B9xg%cI>J}p5-Q<%Wa{Dt6IrVi}m1i{iwbG>n3edPn~dfPz2 zE_Q|9Wl+KZmj-uJ?Rrwl>@^6$rra-~;%)kV<0@}!a=smnLuRQ%BKZe07AghWsJqP! zIc*J0gqVLNbpaY~eQ+b1-kh&Mf($mP-fAl!Kl1hu!7|W&y*hTq&gc|OR1ZVTl_}mS z`3u4DZ@9wEhklVzZcn7`oC#t#Z9XV#pLuIyr^!QQA(vxX>0Te*qFJ#tV)TPSvgr??Hpe z&R^`o{UL*{1Su1_4t6S^1U-jf&8^QFf9l?uV{!>|3kw2AI<{&)f^x4As263yxrUEO z4;wnWD)0IO)1USt0Shd;1Z@4Ifa{Y>kG(OZg9|khuj9BTVWgHQjR_dE!D=GO5}_YN zk+Ib?Fp~w$(sh6zrl4^U(TZ1(-rkIOc0&D_WxiHM#Nrt2Kq*(=nfQNHeRn+7|NB12 z!J%-3kWEE|vSl42dlNFVvPUv9a#R{5G!Q~oR`$qf6?giKe{@pYYtd5t5OTgY7a=*RWba^|k4BIhMI z?Uf_RJP+{Lgr_)w&~ibFP!9H}4!#7)+JC}_dttDvDnmSJ#?yl5Ssrm@*`1f`-~eEO7?Dm(2FoU3)&z; z-ZeZ}cxp7mY((##(E4%s;Bp_>4*2!%6w52#AnHhmt}lN+2`DcW!DA!~RM|su_hU(> zZ{C6ck_p{L>%=6053}IWG|On-_Hh$@?oZRht5Hu&nyJ!OLZws4l{_Rq@(}lyq zjmHP*ykN&46Ep5vdHH$uuFFuliIG*prnZ{mf_CH0Ud+c~wJYL}?tM6n9-`nCb^gg` za=i12x*^@A8k$i~n;;Z4%X#Fd>wz5duJ=cEu?@5@e*#>Ku-S%x#}ZG#0($oW?|oU- zii+@3VaANy2FM8Iw#}5xFWzQ{Q@}pDWmO-n4mewh*OS@Xet<_M%J>(aYf10_6(5kF z86%(+ap>&%wSlRo&WlO|{yH{*svDx~l4~d#!|>vmdAiF_xZszlG9Y<8VP5(7=*1X{+L6KXvS|@Q|?$nygBbz$N^C5i_6M-?j|Sz z0bW4N(FZG&`3OSpYiZ(-4RgmNViZ&G8O0Xh2|Juv)g<7c9@AP=kek&Oj|#^t{^rkBofgdEGV zL}!W+_4~DEDmz4a1h8(v^TQLofu?Mn{_{IKJCF|A8z3%nLY^#4QeK=0U&({B*y9ii z0eK;&3~^udzxgDA$i~0g>JlSYM)+|$+tu|*uj0ZOy$l)3y(u6W;n;&r`%)opZi(Ji z!4|WDe7G&21koXbdsCLe-n%}n!N>S$+P{F!S`}d@mh8@<9?elNOWXn~!eHUsdMZpn zP*4xx&G+bxotBQoBop1c_R%_6)J*L$Jk{T|*UPVJVus1qX$#en?V`MS=9LWcRI1ds zAbcSV3~n2Uk>xNSq9%kT^^<)kr4YAiu}x!DB~_+oypDG(FyLVwK4lRZywOx2g7Ins z;aTBrY$01R^nR zLK_wAa~%$$ehOkC))oP>&r@_0HNIZaGh zJb6S!Sxtd!pyZ9aHB2fFA0z>EC9RhHRW`N;z{W%r` z3MQQ+NEI~@P1IkwIakzRJCb6nz@N!VlK1-*QHSjfYYQn$wW*)P9qT>6YigUAiqKNo zFZBmRB#4FF{)cAG$r*-&xokP0*b;+!+rfb-m5LoSflz&N*E1uX^I{s}-5m~?NECvS z2+e${j0wJDN6xiz_?V8yWWOWVAk{3#$RmWYM)CRbk^O)U>^N@Fa;qY|d!#wvPb~$E z?GWIN8i67j3Q2Dx%VkI=@ZlIJ?Cyh#&Ev(r(;Sq-gNZ!Ht75{*q9mf0UGuT_PpQt~ z0&Bz3__22&ayW>y$;V@$Oqc~6>1sLwIEVM6nOJ25iVZR!ZscXa>oAQZ>PLgOczMOm zQdP0NduOWg=TC4k9%j0FagweGt>%FnpLo;(Z}&5^R2%$#9J(}6zVxu zmj^_VgW-WV`!d;ox6B;_km?r9WJD+$*PxEA30&g`+Hy3Cgan~8>HH+9z?v6F#{kzXUIknC8S8Y~LYhsS~scotxYjCmKy7!5Wu&QQJx ztu|%BGmB8PrN|{Ioj>nTLo_^##n8EsVRHG8E3-XicU?JpERIrrvg9P+88+nhB<;PJ z{@tDh4`Ge?wG{yrv=(#s5Ncv3ZNTabEl6q%6GNCTJ}2nBC`rQ#y}NQdPF?EkFyCV183IdHj1|morqG^VNXHD!70yOZ`PAK8woX}Ti`NDLM zaC}meife;vqDOg>wg!Xgh;nMJbic_>Difd~7 zes*9*4TlRfhyOh_nDwq{SMQTNq3$8FdTAxJ{#(7kuEq~+u2=*d141vM4GpatU65#s z`Cyji0#U&l1ac+&e$pAvV9dQS?K-;?2z>1F zxUr}WJ2x9h`ragTbf7OHsG`V7S7LuT9X+wE_HHdUrs%|bM%@8+t}c14IW?laSl`=J z`}j1HHHwGr3za~RAKb&44@6-tvyf#(%L2v6Pe@J5VO9^av|z(wD2UBSNNTfBAY)5= zwx~Zm=bpftgm7gx7@D~H==;2=#7pG8=v6~+9#;FWfeh9l*a?RwgaCJ!hC?GV8!A>X z+Zi5K2Y4OHxJ+)d)rRiLgDN2&VE`e#TtIVucnwDy>S2YLDa$F*u#J)XfRsidq4k9s|)Zav!E!& zdJ^BuRXK@1shd)etOu3!Yg5E}vqXvWq*p*^9~vCIJmxmt>HoUXx*Bo`pLl0sKA^?Z zD5N!u>E3YNmqvJ6p9 z#!C6kGl4z?kDQ~h?_U7=VgQKkSRL#5ExaHF;^7tNJuEi!lzZ`x(&|`i^Wg9~2?vj) z;u2DV#Ch<6ImlNv(qPU<3ww~+$_cFmz3M-Z%D>?kIu5FYJd>hAjKEYNSuztM0bUqy zu%na}S}<&alj%NO{|u3B7iUHz9(wnE~U) zr6p#5sTqphP9p1Ly=C3Dl&vlH}MIfyjJS4!!>K;)#82C}nND9Kzscu$f* zvU5^YNa4ME`&!ARDR!tH03-1TBm&T2qQodU*Z9O!x1&9xK8o#`61_SSm zDGU(}IKxqEU#Th>bl9z&7D~?abizVQSr{JO%9fX z37g%v2V|%|F8HzMB@a$K3iujg<+qj;^GfL|rYmEmU7<(ejcDc}E1CF7f-eyabKiZ)Q2%H8I1czYAIHZPT8jR% zA0b^zd%UA`VG`%eC4T!0!y|)xZGLJXFz$a{Sy6G8##Qa@VylaH=NlM^fZ8b>luCeh_a+}aApQMmF6$3y{)oqhQZ(ssm zi>ti6{9d6@b?=x2gx;9ih_(JBUjIkZwPcOFX~X(9vbCXA&1QQ0pIS{GRX0@+n5hAq zC&=<(;;um+jmxnHAWS9BrX51#IFF+07J%O+6Y=iqPZ`hO5hPZMF`SAh6#xZ_`YG9O zD0Q|LZf@2l9N(4EF<%N_&dG`IE40j)^?m%~HrXB6j<3Ql=IrwjG>^RIPJd*MfB(odih=$= z>OAt5ZA4KB-2|$d*fthpp|R!}8lGBX6C< z<~GookgHpu;OsuNFj8%pcMGW)z+gaqO;Ph399AbR0lmZ)V~B<7KELHI;e22UTMm1O zvyN*2p8`7*%XHQj4b_3}pvC?yR|JQ*i&sx-P3grL!Jhk?kC$>ALsMoo|r-}q&%_)$=DD?Rc) z5+c7g-kLkul|Q(a0lqSXS*|~Uiq)O`!*2Hm*gtCkt}Mo}D)E3}zo!7ff(|<|TV@r6O-h1TNfLBT*mn9PP4mmO%1U+yCyz#YDcegWDL6|BG7?7ZMN(G^&U^}_lorTg~ z#iP~(h+c+@`0nzx#F#rudThO7Z?o$&;7&T}kNvkHxClWzERX?%U4N1hH?-li!5&Ow zO)+i-4(*R3RJHpHg&y_tHjhL2H9GDhOq9OUzz7W-s`A9x1Is479~ziU%1M%*eI0nZ z#Ni58RmdZ*ebsQay2(J)$7-SsyL^H^?8?`?MkUHa(i28B7WUUsV{y?~;sa3)9@L^R zxcLOKoNj*Kdj@Hi2uP=QLWKvGWeSLjC)0TB;hml=)>dQW`n8@~!sv8|2fP>VupE&B znKQDM{ZPR@?X8Orl>jz&0|*N>v4SYxasDz|zTq>Js77y)5jXO@~-*2sW_g2A-GR3{YMkdU5Mp z33di1?W~+lja>k`LeXR5Wb8ey!+*E)=an5Y8#a%fAif*023A+4!Ui4pmj3vPVfDfx zVCC7|K5}sS${c}?reVr!4jDf!mrWq@W&#cjNmI^ycom3ZMwjAmkOwFjQo)^~KuxP= zT#Np%j5PL-C@&VU0aa@9MHxHWpOZnl%Axhu3Om-)T=neq-2SJYc@eb_L7XUF-{d}b zaIGlJGP&K2txCY;qE1V_tVHY)0Mw0Oku3CKbMrF>OGx*lXPYVx5&KV9=HI{hF_Qq? z+NYTW74NvBq8(x%Gm$Q5s}Ow>di91(V9|-;@ji z0!!NG&!71olfQdp%eI(!6sR(^^O1dHut|kr5c_i!``xaVtYOZW!t}ou6$bFN4&HK#@4AYYE-51M* zeLpK$CILwV*p@kPSb8?({MP;ZE)))~Cvri4&jpiuEWn8#Oh2bTH_ka>mXj+l{e}`B z*i-_)9NmIjBB-M_Mm@V5skQLh!`sPkT3W$AOog3w^9o zi!;wH1;$Q4^T19N=b_KMG=}CBr;Px_;Q^P|w5Jcw&ssF1_yO6Kyj*C9fb#bWAZH?> z{kyb{QY(~qk}vwbn9=FHcxg5{mO2uUaEro6v;A?)|6lmT11P8iVO)>W{L{O$V0GaF z-FGcUE$3RG&t|W(=-dLp8+y3(qvio@$g8(K4n@F&faQN42%{8U4xsaK?S@WUR{G39 z2@e&sh;kl{qj(2t510tI&C35J3#-B`Tlj5Y2vzixccpsVX_1bg{djx+bB`(dOnlTnOxSi{=gagL&K3BepTlu5;msKe zyPAQB4mCvY@NIX~>9klUW+MBO=#3e7R#Zakd*(v{D3l{SH=bFQ>K`rKNyDZs;ViHm zk88WX%TC_-12&+~fHT4{oE0!mfkI#lXi7?ZpAaG@{&r+Sy3OYxl>q}8G`@D~^8w0A zc!YNBNLGgp7k4ZvI+_LyqG-eGjaW%NJw1UL8WC~q1tofwm*A5yEwUfGUu!~u_5bvO z*pi!qfP(->2=$WZAN$b$*jTks-urS{&h2?3A{>#rvZ4|7@Rb6X8S4bB zSfW=Sm4pv&z!}4O?wXqPVs!KljOSU$0qww{#>ROV;qfblQ<|N-fWBghlJ&n%jX=hD zJTKhD@@@95gF`bRg#gE6E=$u!(cFkvo3-7J5X%E}GU_wNsp(yqH_mC>9w z|BSYQ61ES63!ziwf-V3tCkuoSbGE|gctBf^ID-WOA3wboUF52a$knAZEqN;S^5uzP zIee9l+~*&-Abkp|h|k0aNdqNna&i($2DiS)TW4;~fiMG}J{??{G}qo1zK8Bw{_(K+ zV+vm-7>RXEeEWFK`hN{@r@7;pi>6A+bj=aYbeVNmJAS*;5C>UBN3 znjnodn8brfMRa@96fjO2_-VdQ<9&!x525?I#NK8R`^UVjHF53qU0MU#ObEuwRA)2HN&iDA8gV%nd+`lX|k| z#TPjg($EF2a!o(;8ywCKB`bOT;epj&BCJQf$0reOAp&SbAl_gI5v4oCW#skQ5MUN} z@8C&1>D1y*GhYr}8`fHW?2TC-nUan;_!tn#aN3EV|J8s@C<})M5b4m<(sK2_gs7

wYfB!iyA&crz-e-#aMa3CT08AR` zRIN@llAK!SiGm?4VMw@u-TE+?!kS78u`@uN;7Nio{qyid+@0$CPxSdFJQ3n2cJM@_ z`^{s-{1T$1E(5wz=oQC!Eob*iETul1$6`B6J9PtoN`N+aeuSnkYmnC+A)$vQb^FO^fs9F9`B(VSdSqpnqY$Ad3P^;W7T0K5e>*x4(xo5tdRBxQn>+O+lAN(%3K#05`{NlXxe;vincV{Q+7IF z@x^}3?1K;dIq}TufgZ_8DGkI;#Ot~GE^XTqWZlL^?n7uin!phKe>ERB;dqR2p;ZP|L1~u$RhtNxXVMj-7&g2bH!`l z!v$POJuLMWJGm78iKbf@Ov5IeS!X!p zh~=Y0ATy=srIzPc(WO`lfamC&A1u2+eQf^(oKYd#>-{IxfrnwI-GuS0hrN|ABGPH# z=)Zfq*Hxg6Sn&;fy}ZB`cZ|)GgWseu*@(l26{7e*-%_4^`xXcxLNO5Ogn!=f$y$Uq zhrvxWMdmh&e086C$A76jNB+G{vjjRoXJzET#pw+c(`l0417%`ih*AmQEx=(+&*`Aa zL63<6yCsmE&Nz!`m_yO_0z$!L@*>|)(~V|WY^Ma|!KmA9l#}*ZA%LPQ{M;$#PF-{p zod$oOMJSjfZz%_%aITpu(P2IVQx2JsgIIQguPnP<$QHd3EJ9h%V#wjQU}`uYH+K_> zV2XeHlT&o=qcu+rvbBCzi#Wl-1SF&vKW_cJ(Egg*X9t^N=%f!9(fP|9p`f{Pg@4yA z9QJ$~J29(N9=oQKh5GecdD!+b73q18goKgZr}JuO#+`3bHl$EhHMydxLW78VE)OwNrllYn)q5M`h8jR|2BB@nkD@m@hQK!>7gAkB;PsU^36x!>D)S(G zw>Uv)l~dT7;rS`K7cABf>Pw8|Ug5(u-=b-`;X1(+z{2gLIuh#)tMhOt+x+$(jn(eq zcd6leN2AF@*X8AIJg+ih$c&24L=(l z72uzY`6g)<8o6 zw{hSv&XZ9cGfL3%f&7D^zDhZC>L~t5qhUcPaUs#Nr_Oy$0hf(TQ<6tb?irrtk`L^y zZ?arxmNl*R&G7xf4kiBY#CV;1(A0#2uw2om-w^ThkjLsuY23tfJlEwntNw_%x!LK; z6?gXGXm$lIh5x03>1;U8W|SW(?#Z3c8J^s7JW}9qP{MvoQ;BmJ1xMC>5H>TvtNgP) zz9&CCP%h*bhRoxd2GBp=0%jH+hIGqXY{XpSa=>`aWJe&00uxc#{RmO|zQEM173Ep18T$ z+R?M*XTBcyhTn?54dV;#wK*%`BHTAda-pd!9tcy9q)k8d%<$iGe-0v*%pj%E`TqP3 z@A17VcNeg5Vm8WFmnXegXu<4#WMXgKxW4L}UQ3z0O$gWAC!K^L(|7U;=Szwl<)nx? zaYs-v#7;a+E1BrC#;JL?szJvjHPP7%05-L5N!?m^(6WKpkC@NgViIHbA`o{0eNyzK zmXF3MoA?_=TggAJ)aziTCQCzEd*YKdNTPWDa%E`Hlyz=TO3>m@m=dXeCHm`eE^ItO zk(_O6zRMHx@@N6gU+Q7_leexVt_qWi3l>IzGj???4A>n-hIC$tW?yhS{HSC#e8|WD z{gAQ`eDAQ4L-wf;cVe&J&uj zV}G1ZzEVyDHrZm(bYnWGL>5b1g?zy5%?k?WPv;*y+fASXPa92|4R8eu)V!sZc@1Lm zF>%i^SugRtc)u{{;#UK3HuiJMWGG2#rM_`s{8l9(iOr`6}Iib)Oa5l zb^g4E0{^8lBZ48+Y-#*uMC-C2+Taurg^da&_$@ODOXbNb-?-y-M{S{vbQP@ay%V4J zBLa2bwUl+||n9gke z*3H)pSB8^B(3@$ zXC7B4WW;HW@>>p_FZoadoXj8jlg#d~JRGjVK>C=n$3$joK*tY5LfdEz*ZGljmB`Z1 znJtx<6UPGbzX~;5kW%aij<+ZY;vZcRj11K^s?bVJi4_X%m|ch{7vLmj`>V>E?4^Vq zj;G$rfcbK#Ioa|aNfHNrIUY@+wYS^Xcljbai;EpG3*D4EtC7Td+1a!xQgzteL?~(c znRJOg;}VP5B(@iYXg=ANyQ*p57tXxX4O*D6E>j^dkptXnpX~HkEZG1%fG5DP%XA2x z=o0rS=Twu?%As>*zVYk!+rdE(Qlp6TTpyKwcYkojPLAbwEcRmsMDnS?wVuri^gM0Y z4#OJ;zkHm~BkkKjYEkfqLj1~)tM4reUgKG+A>r@`2eMkAY(1?51%-Q)LeggRZ5$u! z9M^ZTvYMc8QIblzN7iz1Hu08z-XKiBCUIBo(&N!PA~2ar5(;`r=<1Y9WF!O*XYKGX z^b2G&J|=EOo)TkkO<}Xu?t?aA}@t>(b+u!-#QQ|^b$+7(_5QUkN zN*H?dpK|28T6U|#(@?m2>Jh?uOSvmbA5TUsv)RwnadUtj;r_^hIi0gj#zRa2&oT@~ zR;gXAam5ZBq^x_-xy}L7U*B<#a)oqQa#((7y?4%4^MZ9%NkY^oH@6E1Z;ewwEU;w< z)hrV+GVir;L#_5*l4kySR#aTJ4s4yavmekUR0CBn!T0PG6*`L>`NNzv?Qct;jxcY^zEoOZigN1&LSrQEQB%An%s9+=mi+6nTr=7 zRpy_H$oGJga}66(kMO@BvB1_bGbpE(qTu9+ys=R`uEOG8u8$oy zOTFz8g-oCH3zGB__YaM zD!*3U8~*LrcXWFMF8DB@EYwG2 zl($xTc8IWEQdv|H;*s*6$-$1F#e9${5;;cUgpNUJ8|5qT$(u|$s=9Aj4RfxI`j1Cl z-_-PbL2>)qvghysoBs&yG1@gnPQNf%;0)~3@0G)LH}Z?>w_N7u%1W7s zB&53?cCb6eVhC9nvY6Gvae}?S=$n%wEEZnZ`pzBQ*;xvWp0~PaP>G(O*!##6eK=cT zJotC}ASzoN^lx;#Yc~F2P`>?2X~@fk^RGq`>$0Qt00H)wxfRm?>==kiT^yxueMsuOQsj z?cU=>sN#@}1s-?nXD>^_hR$hTw&P}D`R~WeaU>Os+|A_hVy(x$wU=TYV(wMIU=^fMRSu(2HxA*yUi3a;%)jL;6Cz+|@i7Zqc~f4yT8(#c7v2 zI2;OW7orNQe&IgfLWN>gS}#B`zgTWZ1s2L3Gh?{k#<$a-ImmLtacwOAx>M#*C zoolB%^n^IF)bC0GDLuK|?EUw84@UmB?iB1srk(NZTKw^8@2MZg25@aCK; zVzdfqq+&WlkXs+H(}_Q9v^n-*XC8Co$xd(N-b+j%=`TPhXYodrH99`vG$kYVAtYRO#kUly?e!C=^gL5Xjg+}Jkr>xJekTt@fK?WYl(F~(u9ob&?$m3Y3cB}l0-mmzps}XfIPyI!g$8Qr zshFnvkL&7{o|NCqdJN^<<}ce}St4VgBy>Po5XY1!XUO(%e|=q)D*wkLmz#dio%hR-q`(} zS_{DXm12iRv7g4h?-rLr^)AQnK=k1ZMz%B-rcqXJL4p&BiYCrQm# zHSD~S`7`y{^4t4hX8qo$^)`(tq`HSmu${)fUCLuHIQ9c0_3pC;1zIZ+70w=%#L5^5 zNK=1G#HD#l#E#oh);8?DI`Tvp#;ak=VCC78osdDJu*FGJp|7OQm#7o1tr&zyNshf< z#x%kq(Qu~ZNxYJw)jjQrtk&J+QwbE3dAXz^=&amMd5U#_~hK&RP3+jiJ7)rZ5WpB1IhxIhR%PW4Pe0Fy3S9&$noB zT1e03SvzY=jkq&ehGrE(Tan6@`B>-NrzobgH*f7>FOvD5%X>m<%04;cAeWzQ7W? z?budGgyDkPav0K*hg#1}2>ttwgW1*CtsQK{sq{zkHsvcVK4IW6=RzvBf|LCB zaki+6r#_zHqwJqgl^CGfUPE3Mo{yR@(HD2I-^=*CxK2;vH}Wr^6KFc(aDS80QOa-P$rs9=K%C&>OSz(i~W8N*yT zU>j-F`zF0b9(G0{9K9Y0di17!cw9&NJG~@~(xu*gbKek)`ooYQ<()nZmZrZcZLS2X z@_86&bqb&sE)a$Jl3x8SI9{VY%>dycnqcu}_la%n*W$H0ULRp_0{y6+aHf$8hTet% zB2ow;vk(j)ay_QO2;CBJ!{iFV+t+4uUtV42Xo^Uq#!P|!JZP)cdiU!X>>bu}zo?Tp z3dReKS1g8Xo z>4=vHQ>_l63TqI=Vds$a*audVfJP0{1GOW(j4oAj#Oqd>=blfT)y1HN-Cb4s zbyEf8I(mh$C0iUORnS+3ZK5ga6gDUwh|Jw9o^G!dg)YoCOq#r+9NOLjE zC=^C*LaDyWIAWVvi5V@t!a&f!lNfqLi>EAQrfGJi}J6Bk{`9mRQ zS5X}M@eyJKI11&Wrz8+AkI$k`>@gdfOhd z-(O>LTHl%h#m_^l;1w0ND|a6w8CF`~AoG=E+Mka`yzn^`P-Q9+3adJT!(|dH{DBgwc5i#o7k%9BCCZ!uy z3c8_>`5J6=tD)i?cCQ?CRGHEn;Xd}Y7ToxbI@Ssa-QA4uZfsxyi;R5zTb5dXYo_ku z>Jegq*`{pCaFSzNvB0>`nq7eJ~nM$<6b& zdHM>lmdm9C>)l`R9v|5JwaWb@zO9*Ed2XEWm%r;~UQBiG73lx5{xxZQP{oZW)S%Wk z<%1rKgMabpqZ1PSmLA>HER?qIth2WdeD zZ)&hex7*(m>qtoin!b{X^9|@QE_`w-Lh-X0*@S%7=z2poIXYvFX4zD5WX zdO_{)pj7=>5LS(`4d|G4$alk4|9}e$Z+`pfBFnP1uW}Jd4A$`*WLD>qw}ZT*NA#O} zEhGJs!iS9e^2~nC&h3RTECrn&H<9T#*MYMl9nOSPfor`c`K!j`u#@P3|9Sn*pSY&w zJ1ibK1}p)huuE+a2U4fh@T|=d{>#rQi^@V$7Pb+j_n??mMZ%1iHB zaV(Xv*AJOrmIk!T96kz-3glP$%Q=W&9pZ`1-`4u_x#MQE2QVWk=h`^nV}=={)|s!Q z`mR5l{$0i&Q@WcKI3WMK^9z-3@V-w0(DvW9|b4Gor9Hih(PMA(ewy zM)EpiSa(^ABp}f_cw1qQ4v862Ii3opYFo@#id<;9y>~GaLGWMJns4h2DB zsaTFUT`$I}vU@`xiz;2-2t|x;qGM9HQO9z|1|I}j*7FYZZIj0CUZ=E(UE`k-FYVzj zCKModOXKB?u_l%&-Zd)8;=NhIKYh<7t|B_F!Kh2SvFuU)eY2;{ERr7c&|sN^Dy$*z z^!p%M949#n$*RHa_iD|TafIS7?c}Ymot&R_>D2tX#D3To0jbQB2Prpc`Kk%bd5xp& zt|dh+fv2*64e_Ur^XVA76>y&5`&?iqy79$Ox7yNwRJ_sP<1yG*C)0QzzlPp=?XX8} zJ5mZb=ifLr8&pa8CZC?v@FXm@VhxDc`Nuc!L!@!Zt6mpx*Oe0=rvAHt#*O5bh{)=C z*V`t&7Ufl#2Do-I<@yii{t`Qn#d@0x9z1~zJqE}^lj0r_kw<|sA-U|aTbD>+*$R#C zy)oSYOBU}Bw;sUz5{JHtmC~pP7_if>$uHnNa=KH;iS5H!23HUmt@hIMoGxz0XUzv7rEm`CNUN3BN#b?bxP^!+6^^vbtU)DPR@fAFdc` z;_VAJJavsL)c4$eDOi^&E@YOvr4Y$*>6s|W^}QnS*-V_pDSKYqu96PS!PHzD8#DC*#ii@5GfY4U+hBO zLlFl1s%V+10pQ4LP@tLE-fydGuK&)FSuD`=<4I2*-CE*vrsddqb=eP_eD_3<70?Td ztGI@2PZe5!&wFL9`~8L<=u3nIUneQRK6TAE;N_b?dsF7FX=CQ>7odYSN#Y@3_=>v} zYpS(83#R3(z|pIOf083V%rpUgrB4PXAN>DRE|mo>s-EIceEh!S=8fC|qu6Vufo@rw z=YHP&$bo!1OG3(Xuzm~+#tc-A)OSDU=MyB~bF?KX*`}}MTi26K&vA;$QMker0^OuS z==OO)%=ZBfhBxTb+Ah3xB1K{7(QZk=(WzWHPa`L$OTM?x?2-C?{h3GV!a8%qi_W#I z!04jksrh%m2Pu)@GGUA_3aYzm$b>pU=Tz`$!Tinzc9&vhhjPQrojV4#CkTZYDa#c) z6(Ivivqwl7Ehah?_JWbV$&d7Qu_IxpDUm^`ivXCNmTg(uUh-LcC+#|aCOqVuXZ&9i z@rqtlDqnE0`g&GN$*+ri|9gzNq1G1~+9l?B$Ua=0J0nu6jtb4%RGWM&d`|?iKY0$X ztP4=-LV>%;raDSI?C3sR;Vz|{YUYsIwQk1t;a#C_K>1u&>Hq#@0m^SLqo^@WZip}P zQ(;1B*wAlE>o~&h#z0+zxAtZqeh;3snTs>KPUJ`m@vySoE-x>2uY4|;i z{tARe41eEC<*(G>T&gH5e=IS~pIx{^ena)YWFmsLm?A1TMBtjzSq7~Y5edW9r<6%c zgm~{yt7uI5|s@PnPbMq#}}Rte@d7%!x_->MY+@w4pZd|98oPe@yLXtk=jOzeJ! zTZi!?#WOlmDyG>38eOWr+fO)8wfjoMtxqaRMcOmB@R-~0(-s-U6pTKx^Ce+mw0GKq zp?Gh1dwTyf8&GN`oO!YAzL#*;E?MWolT!Zr)*I%eW7)4wCS5stlpF?+-}I$de`&^_ z_O!`l_>l+AA7t0U5rDgo-paAC9>-c*r%T+?a|<&5dOo_ZzRx+UbwHVk(XR&S|$Yh_7t$oqk|O*;niQyNb%`A?c!tH1Bo(NLwiXKfu}k zai!(u&u5GS=7PbW3Qf~-@q|$H*!5|)eF_HP9i2!sL-%ygmjM}ifBqYKw;zoes#I?1JtO6}6Kz(aanMI2 zZw+3Zy`IhOp{cp<<_ysp6aB|-cV?30wze)s-+$usS&>`?Y;_Pr|JeJQrOs%S_o0Ex z%ft8F1*HF4Krc$(N?()K_Sba*%dwN)RNf(myl4?&0t3-A>t?YtFH!3cB$A$uec+j` zHqECoB))|t zcH0>DeW)o7lAlM*|5q|#a~=_x-VA@RX?AoT%hM3oTuO4+Ax*m9de>E`1sPg(4Kg*= zqPkxi{M17^$6+rP*L#GFZQbaQ*PNH%I>fNX;H>rB*x7n+zCaA6f8`*5$MQYLTbjR7 zo3twyDZJLcdg<3Ge)keyLykGY*CKwSzWvZ4*YAQuIX~z@^DhkggiXlMR^{4Ca>$(m zqagR218*73)b@;cf(zb;+7m}g{L9(#3dBjuA3tz5x6DiynVmTG>4$pt#mQFDjqh$H z%}2YS>&*dJtw7E#DgIkHW6}Z|bL&d^=VhJPq~;qrwlXSlk3vM3>@0_Z&k2^HRn7lp z(41yrcb~k8R%~J9=lx=q^bK1{k?Qt{pCj%`Nt_S3+NK{8t~;{@PA_?ZBhA~ie7X2F zv$@*7yFTlGR?v5veFlQE!(Net&H7Ov&O7pSHkz z+Op=Vv1_Xd$7bwyblT1xU-(xgg$1A=8cE2L@%r8W8n>Ck3tX;owo=Pa(ougT5b>SO#}zVNiCk8$l1or;wKiTIa(W54+Cq)+|+_Y!O6 z2}PcT3+BI0XSMe-v3$HEl~CpRC$yT_E$G+V=7?wpu1c=hbG^BSyysvWWx#ZvkcDre zH&i)kiRWDVrVEz7JDU&V%*Xr2&G~*k3V!Ys$}5~!P6vk%QXfUo6{`yVVR|xD#o-(h z=X1T3d`6}AN$*`tQ>fe{vOD4!&YWtA(E=43J+&&siZ7^%{ zTe?P7vxj%jIsXY_sCRs|-nAiNdI52)fLW-@Fe;~giB>=`T7|F`vvy+6aOmMZDwY95 zq8r&C14} zQl+L((Zx1Bdc$}lp&n%NFAT4E2tySfn^Kc~I=7TxBkS5cbF&)inqp; z@3X@8Kgnjs(cfp8m<=t~Zko-W?tQ0YyIGv)!Yp7^q$#J)mVWj9sf+x1mpZ@HH^5u! zf>MqJVtr-~iSp5w6#N?L99^H}uX4cvr~J{tYvtVepMIGCfjPnBPd3mA1vTA5|3Xks zCca30TqoB)L@6jq`%*x3(+8VZ2_o|>W$Y(#b7>+=dYgd-#%Co;gpmQ7GvHDA5Fnyw zZ+I?UGCD2_5@ix`*>pc1R@bPsi|>zPX&YqLuaPM=qqHn+{5W>^;8tqd@GN`_lL7)wjB}IsA~! zCErio-|Tvmm41n*wo&9$PVxRbAvwJ=Fu{l27Iy!X9}nWcDI9ORu$OnvgZ@lTNbOph z?X&a&iENK*q-kCA?V(IMu&#={v7dy0(iQtU&2{%Vr)+r*N^B?J*u|RGS{sL4;xBzt zsBag%DxAa`_dj3=J$md*gE|dv-m0VA;^ymDvo7NWyzT~WyMEHs3=!p-g2wtX&qU1i z-I5HeMs#oddOQOih)C#Or_}R|C-)EZJ$of%e)sxpnZt07dwym6rBd_Adi~o|HdV~N zM)oHb((Y_7?{Ev)l#~4XI(fXGwIYX!9lA+k?)TW!^()|x z$_?Xpujk;8a1Wi0%ZIY#+W%|s+T)qt|3Bj7awMls(IJ;kVMU2mYRDxd_ib)ruH`b6 zrd)=dTso^-B!VUeD+2{Q}bDv%tKYt|br5Vh&r4`$&xEJPB*sVF#&K zm?CSP@=J}M->#EaIbHf{W!dLH$D#pOcsbxJ`&U)<`YAys#W&C5A^DwA&X?ZX(?_jb z_LFV0yJHGHXOM^N;55yGH7p=+ObTlF`r-?q>Fe$E2)o{+9qF>2rZLyQ&_&Z3VFiv* z&Q(&{+-&1mIyM+G;$DLA;s@8$Pm(0dr{P<`;k3l*+_}37uZMg%+|zW5RvVgp9F}KR zx616{doU{+EJ7iS7u5~zti;8~V*w_ZM!Tx0^>L)Y_(J1-*m>LQrX8}>R42ldp}$FG z_s}l1JBW)K841p7lLGIjT4<@tR8pb(TChnU_DW7yaT;8dVZ_SK;b+ zSPuC`wuR;d^tsUpB_QCKaqyS9ca9$C9yqz)i>Z57dcC;R)jtE^ug_j>l{Pg77?;4a zQuP+2hpKeEs$SWTs*hw?4O)-T#>_H$Z{T15K59#xLY7t++LCLf7^@6%_wf1K<--VPR7roSYn@NMN}v#$U3D&3D)$0WF8a1-d|q7+$*BpzlW%~Mw>+SM zDV{g&Q7gmAW*20!NK*IE$7s`Uq3Onz!6n<(3`1)mH|zGlK}m(@Om=?rmqI@h-P}Z? zaFjmtWxGI7ufZ@sl<8Gh1a)X1Y)i^)2+X%Bp#MoNu7@<&#~epS?7mm%7b*oK#~)q{(l3 zf4+qe#z=X1Rf#XXahNd$Q@+0eALZ<%BuCS=5vBK7k-3*G`}W zxZx&tsv-642lFk{jlb1TmCi9{--Yi@A2P_U_P}LFygZ7(4>DgE&7ISqZQ1r1xW(ES zf-Er`dK7+zsUvahD4~IySP5WTk&y%EvR=VIg;gG}#vFlT&N1?@h2;$=dZ;=~ke+O+ zZg$S9&DM%rM3i4H>-~j_%;*utHY&HCnH*+?jk234Od=oYhPv2@$@e6Aq6fRznt*J_ z7-&_$9SxL5$CFC7^$raO{o zvs)f+p45uZg@Q?FbE$!7SE1$)>fazz=v&W&8rVa5!e^ZzS3-5ZIL9ZO`n6Sj@alZL zj@^T!zY)FwWQN4|5Lgr2$%Wc85JsIj9nVE`J`W5USvK3WO#v55QSWQQiy940T&Qkg zW5ey8-782)8h;B(B?(9Ue&`P!2~0SJRONR5rO&6ZWHtuxJfRaeh?gmkbm_JKZXrE< z#>|sTT8H(3(99U%QSG8khjA0$=qjkQ%eU&Fm&=vh$?A9XMgn`;HI~y6R8<-No1yhC z_|yEA#q`(G#rrllO{*sAMrZzZ*$h7Ns{@w!JArfW6v!|9!n*}>Kr+Vpsl;W8tB3?^ zwZ0=uUV$T?_cdJe0RH|gAg-01+S$ZrRzMwHN-Uj|!^JsO1J|fhMMu$P=VC~rmx(ZP zgpTAMuDDdtK(irK^g7o@=f|$;gOuMP=gfcX-qDfvAhxp!)@*b1rIE{6WrRJ3%e|=q zHo4nk4ZZ>5T`#X4@S0s(pH*1L8xD9p)3j2`HvRC2+cS0`h7KL~Bi`fMawr2A896k& zZBqo+&cROy$qtu7RZE;lw?}GKUD>LIq^RIlnFIOTeW6cW?fl$*zSEQ^p{-fXJ!Xxz zc8cTmXK=m|?Gxhl`%b*#%3XB>80KW4fYa~=5Zh^f^;k`~Mb~w9rM?PxHuVAUb|Lo- z0CM{?9l%PZ)`are?*bLmgz$Y1hgUUPX!d_>dcT=XE@93p!p3)7b1h>>*Q|$0A13)2 zKb|}zd)X+({f$sfO}-^)DO>p!_xG!AK&$c1y0B?E7yypf+f|Q8Y5y}RkK9d3WA?B! zi!gQr+o_t)54-)zWeInXadknak{)b z#~%fm*R0wzvHL{S-V23wUa@YwZeoZ1qa$j)RDKDV2fdzXP_SApbL9<(dK*q=aOF8h z1NY4W#NQrvwFf`q-J-+kya417C-@F*=<3&Db@8q2@2)stKvdPd!vRbmp%f8SAc`?? z%!-git}bO*i^^J@BEz18paIu?md_mczyJ!FUx1?m4-{(bCw2+aZXXT^AMY$FN&b~# z%{i8j7s=-IYN{JftArxxyC6Y^c`>U4H+sbWqQ!P^o`H(0xKgrZ-?p+Pj^Aa=#-_Bf zb8U(Ed`{}sHD0YzBw0vpM2Kfr#kXDDlX>v{MF=qlNNw`~4#)(M>AnB>mq284<6uUr zea^GxIIbi|CBI9epXoA#h4r zb|+0CuMig=FD8y{k58_|rXM|r?i{YFXYRKX5#r7tCv{h>qUrch5e!IQ^OW>IwXqJJpf0k&HRCX6^~vc;UY`F8!_90i z<(%LO>yJCfI0s>hxbTA%_@8S{rn}dspVfX~ey-3lOn4DoZ zS}B@1Qg^WJAnIY!Es)Ye(PgqbXEFPNht>Va@;y!-l8Y*vq0`%{XZhzN1;zXA zh)MS6;od%bJ6ui$z8})9#+c7RPzPOdY~w!s9hf%~jnBr{GXCj0GRd<}s_z?5+(c_0 z5^sgE=2A!ca`>LItH{(=0nMooXQsz~dy9~LU*=e7w!%x{E|2I|VthEa;m){W_2?93 zN$jfw!Y~8ri_0V}i@Is|Rws|SO?d%sRz#PKUw_~OK4EUjX_1mDS7?lqV1Cn$w^Ynx zO)KBR&@rBz7X#92hj63Cx_(*Sq19};L9`&W_k7<-HY_!9D$=0VWkgCU?fdkk zsDm1NyhQW$1$`k&c(({%3gkBetwg%7BjZ3~$}{i@W5fzwS#q_vRIbYO1Jn+F5M3Cb z7BusK4Nvje@)DxZebTVGlvZCl-(~LYVIt+ObJ6)0U+I~`#d>AS5i=RKKg&0m6Pq4* ztYN2s0BG07T>!Ylh@SgkzsZyZ(^N`nkO(aMEm2iQ-Eb7y=d8buZ4VUKx3EMOtCTIVA%*M_cUvYz zNH_e_--+rs{{8Eq>$YesMy&d)y5YtGIwX4{q>(W`D-5;0x0bu;EPYYGH`LA7uh7?` zE5Sfh=X0b<_A>Vxc?K+APjA+m6lheN4iwp=^bsr4@s?JyV?2-@vAd(B z`*u1O7vVo9k55@fA=q;!POH=SgganLQ6$#_F{jRIOfGX%nn8Bk?+4TgQKrSeuJb?Z5o_ELl{wtxk4mX|=*6V%IO#^$hMf|+!%V*gdZ=1S zBO+^Hz9<=A!!CMDnEzTc2r+FG9?cK__TJ|bZ1WM?(m2<?~ccU8eP5Juwl zO@$yZReoi--9pscHn&R7XS-e)!9s>MIya2kz+&TKjb#GCqB9rQe4aAepMT}eybSzOX$74f+p zU$e5SncqIn=rWws+u9UO29`RPbCoT(6ZbE`VA*Jlu?-P zf!9$|vbi1GQ=;!&5z#!x=YKu2d&{PZJ#fvYh0Mya-Bf2w{&(WNJ%o2Mb_hWl%aw5 z*jfCbC1w&$hsdZJ4(CuckOwIQW@;SJQWqxC`56CtIhw@&#@L_Ixm8Q7RCKaLvrI@Gt(lHB3W8&gsgK?Jd zkE?k0{3mVA00-Wt6dxc}&x!Rj>jP(JubJ2_fMSXp%8*y#>k8X&91PLA4ex``-w}8y z81lSJS!w5=2AT*U1GmHKwMI4DMsng}t>w2I3@bDZp9lakWepDZ&uOX$+5Ao_U(p7b zLK`{UfcgNfZ3cWudPUW=?;-u>v>k4XKrnZU1&}ZXBH5q`( zj5`#Psearnbz&ESH~xSMW`MVnw;v`$NeZ6o9CiIFW#ZF3RJ|~)6?H~Y*p4h5_~#G@ zYyrAAJ>wTK`p~`xT6}2Ji8kCI{d@~+yw;+^v4VFdxzRVq>%$JE6g$oGJI=G2p3~7e ztWkH{$l3*cu4~#aKm2CHc|JOzj)52WpwW!@)loMUC7`>~z4%NT*iUbkUN>_1`o`AT zT+8*ioU1ArseDsJ40lMP-|n*pJgUg-GXQp+d!;vM;U7R|^DGpF8|IQed>h4|c$o6( zbDYq^s)OgmoXn=P{QJ-WnM--QOKrN5izi~stYoDqN$(akh5vPktw*+rYY+T+A7a>` z)1t9LPXnF)%SiNpTMlsJv7MLl&qq@iZET6boX^f-N$fX9|555~ZUX^aoG{P6X}vLG zOgFdeoSqjv2=b#F@5kBmFKGX6>@$yOpcHorMpewzm|jsR+mPvP2A&^p1`w4r+b6qK z73{kapvaVF-jy&CKg8s?$gWi}+}8QC^$Vcstp<^b1v#kY*hdvQ7CNqcjK((iG9pdY zrxf@R8#c80P0)AGVX;&3n+OH4X8wiT40dyT9@P_KvbW7H9_AY|;IBW;=e6P{{tvtV z*ZOW*Z|eoNmgeVI{@ZzeTH~iRetOE!81XYY{)~h_BjL|T_%jmzjD$ZU;s1XmOp(R$ ZMWSD3i{#gI{UZQ;%uTF}OAS$f{trXjnX3Q* literal 0 HcmV?d00001 diff --git a/ios/Runner/AppDelegate.swift b/ios/Runner/AppDelegate.swift index 70693e4..7597b0b 100644 --- a/ios/Runner/AppDelegate.swift +++ b/ios/Runner/AppDelegate.swift @@ -1,12 +1,22 @@ import UIKit import Flutter +import flutter_local_notifications + @UIApplicationMain @objc class AppDelegate: FlutterAppDelegate { override func application( _ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? ) -> Bool { + FlutterLocalNotificationsPlugin.setPluginRegistrantCallback { (registry) in + GeneratedPluginRegistrant.register(with: registry) + } + + if #available(iOS 10.0, *) { + UNUserNotificationCenter.current().delegate = self as UNUserNotificationCenterDelegate + } + GeneratedPluginRegistrant.register(with: self) return super.application(application, didFinishLaunchingWithOptions: launchOptions) } diff --git a/lib/providers/notify.dart b/lib/providers/notify.dart index dead1a2..a9e5ce7 100644 --- a/lib/providers/notify.dart +++ b/lib/providers/notify.dart @@ -1,17 +1,43 @@ import 'dart:convert'; import 'package:flutter/material.dart'; +import 'package:flutter_local_notifications/flutter_local_notifications.dart'; +import 'package:permission_handler/permission_handler.dart'; import 'package:solian/models/pagination.dart'; import 'package:solian/providers/auth.dart'; import 'package:solian/utils/service_url.dart'; import 'package:solian/models/notification.dart' as model; import 'package:web_socket_channel/web_socket_channel.dart'; +import 'dart:math' as math; class NotifyProvider extends ChangeNotifier { bool isOpened = false; + int unreadAmount = 0; List notifications = List.empty(growable: true); + final FlutterLocalNotificationsPlugin localNotify = FlutterLocalNotificationsPlugin(); + + NotifyProvider() { + initNotify(); + requestPermissions(); + } + + void initNotify() { + const InitializationSettings initializationSettings = InitializationSettings( + android: AndroidInitializationSettings('app_icon'), + iOS: DarwinInitializationSettings(), + macOS: DarwinInitializationSettings(), + linux: LinuxInitializationSettings(defaultActionName: 'Open notification'), + ); + + localNotify.initialize(initializationSettings); + } + + Future requestPermissions() async { + await Permission.notification.request(); + } + Future fetch(AuthProvider auth) async { if (!await auth.isAuthorized()) return; @@ -46,10 +72,30 @@ class NotifyProvider extends ChangeNotifier { } void onRemoteMessage(model.Notification item) { + unreadAmount++; notifications.add(item); notifyListeners(); } + void notifyMessage(String title, String body) { + localNotify.show( + math.max(1, math.Random().nextInt(100000000)), + title, + body, + const NotificationDetails( + android: AndroidNotificationDetails( + 'general', + 'General', + importance: Importance.high, + priority: Priority.high, + ), + iOS: DarwinNotificationDetails(), + macOS: DarwinNotificationDetails(), + linux: LinuxNotificationDetails(), + ), + ); + } + void clearAt(int index) { notifications.removeAt(index); notifyListeners(); @@ -58,4 +104,9 @@ class NotifyProvider extends ChangeNotifier { void clearNonRealtime() { notifications = notifications.where((x) => !x.isRealtime).toList(); } + + void allRead() { + unreadAmount = 0; + notifyListeners(); + } } diff --git a/lib/screens/chat/call.dart b/lib/screens/chat/call.dart index 66d8afe..63532fe 100644 --- a/lib/screens/chat/call.dart +++ b/lib/screens/chat/call.dart @@ -51,6 +51,8 @@ class _ChatCallState extends State { List _participantTracks = []; Future checkPermissions() async { + if(lkPlatformIs(PlatformType.macOS) || lkPlatformIs(PlatformType.linux)) return; + await Permission.camera.request(); await Permission.microphone.request(); await Permission.bluetooth.request(); diff --git a/lib/screens/notification.dart b/lib/screens/notification.dart index c2760f6..14b99c3 100644 --- a/lib/screens/notification.dart +++ b/lib/screens/notification.dart @@ -21,6 +21,8 @@ class _NotificationScreenState extends State { final auth = context.read(); final nty = context.watch(); + WidgetsBinding.instance.addPostFrameCallback((_) => nty.allRead()); + return IndentWrapper( noSafeArea: true, hideDrawer: true, diff --git a/lib/widgets/notification_notifier.dart b/lib/widgets/notification_notifier.dart index eac2c4d..fcfd5b1 100644 --- a/lib/widgets/notification_notifier.dart +++ b/lib/widgets/notification_notifier.dart @@ -37,6 +37,7 @@ class _NotificationNotifierState extends State { (event) { final result = model.Notification.fromJson(jsonDecode(event)); nty.onRemoteMessage(result); + nty.notifyMessage(result.subject, result.content); }, onError: (_, __) => connect(), onDone: () => connect(), @@ -75,10 +76,10 @@ class _NotificationButtonState extends State { final nty = context.watch(); return badge.Badge( - showBadge: nty.notifications.isNotEmpty, + showBadge: nty.unreadAmount > 0, position: badge.BadgePosition.custom(top: -2, end: 8), badgeContent: Text( - nty.notifications.length.toString(), + nty.unreadAmount.toString(), style: const TextStyle(color: Colors.white), ), child: IconButton( diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift index 9647d86..884ab6e 100644 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -8,6 +8,7 @@ import Foundation import connectivity_plus import device_info_plus import file_selector_macos +import flutter_local_notifications import flutter_secure_storage_macos import flutter_webrtc import livekit_client @@ -23,6 +24,7 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { ConnectivityPlusPlugin.register(with: registry.registrar(forPlugin: "ConnectivityPlusPlugin")) DeviceInfoPlusMacosPlugin.register(with: registry.registrar(forPlugin: "DeviceInfoPlusMacosPlugin")) FileSelectorPlugin.register(with: registry.registrar(forPlugin: "FileSelectorPlugin")) + FlutterLocalNotificationsPlugin.register(with: registry.registrar(forPlugin: "FlutterLocalNotificationsPlugin")) FlutterSecureStoragePlugin.register(with: registry.registrar(forPlugin: "FlutterSecureStoragePlugin")) FlutterWebRTCPlugin.register(with: registry.registrar(forPlugin: "FlutterWebRTCPlugin")) LiveKitPlugin.register(with: registry.registrar(forPlugin: "LiveKitPlugin")) diff --git a/macos/Podfile.lock b/macos/Podfile.lock index 8791eeb..2392b32 100644 --- a/macos/Podfile.lock +++ b/macos/Podfile.lock @@ -6,6 +6,8 @@ PODS: - FlutterMacOS - file_selector_macos (0.0.1): - FlutterMacOS + - flutter_local_notifications (0.0.1): + - FlutterMacOS - flutter_secure_storage_macos (6.1.1): - FlutterMacOS - flutter_webrtc (0.9.36): @@ -38,6 +40,7 @@ DEPENDENCIES: - connectivity_plus (from `Flutter/ephemeral/.symlinks/plugins/connectivity_plus/darwin`) - device_info_plus (from `Flutter/ephemeral/.symlinks/plugins/device_info_plus/macos`) - file_selector_macos (from `Flutter/ephemeral/.symlinks/plugins/file_selector_macos/macos`) + - flutter_local_notifications (from `Flutter/ephemeral/.symlinks/plugins/flutter_local_notifications/macos`) - flutter_secure_storage_macos (from `Flutter/ephemeral/.symlinks/plugins/flutter_secure_storage_macos/macos`) - flutter_webrtc (from `Flutter/ephemeral/.symlinks/plugins/flutter_webrtc/macos`) - FlutterMacOS (from `Flutter/ephemeral`) @@ -62,6 +65,8 @@ EXTERNAL SOURCES: :path: Flutter/ephemeral/.symlinks/plugins/device_info_plus/macos file_selector_macos: :path: Flutter/ephemeral/.symlinks/plugins/file_selector_macos/macos + flutter_local_notifications: + :path: Flutter/ephemeral/.symlinks/plugins/flutter_local_notifications/macos flutter_secure_storage_macos: :path: Flutter/ephemeral/.symlinks/plugins/flutter_secure_storage_macos/macos flutter_webrtc: @@ -91,6 +96,7 @@ SPEC CHECKSUMS: connectivity_plus: ddd7f30999e1faaef5967c23d5b6d503d10434db device_info_plus: ce1b7762849d3ec103d0e0517299f2db7ad60720 file_selector_macos: 468fb6b81fac7c0e88d71317f3eec34c3b008ff9 + flutter_local_notifications: 3805ca215b2fb7f397d78b66db91f6a747af52e4 flutter_secure_storage_macos: d56e2d218c1130b262bef8b4a7d64f88d7f9c9ea flutter_webrtc: e72bd998301fa4abde8ac5fdea3d6ca2dcab1fc0 FlutterMacOS: 8f6f14fa908a6fb3fba0cd85dbd81ec4b251fb24 diff --git a/macos/Runner/Info.plist b/macos/Runner/Info.plist index f8d877f..8ba8012 100644 --- a/macos/Runner/Info.plist +++ b/macos/Runner/Info.plist @@ -2,6 +2,8 @@ + ITSAppUsesNonExemptEncryption + CFBundleDevelopmentRegion $(DEVELOPMENT_LANGUAGE) CFBundleExecutable @@ -30,11 +32,11 @@ public.app-category.social-networking NSPrincipalClass NSApplication - NSPhotoLibraryUsageDescription - Allow you add photo to your message or post - NSCameraUsageDescription - Allow you take photo/video for your message or post - NSMicrophoneUsageDescription - Allow you record audio for your message or post + NSPhotoLibraryUsageDescription + Allow you add photo to your message or post + NSCameraUsageDescription + Allow you take photo/video for your message or post + NSMicrophoneUsageDescription + Allow you record audio for your message or post diff --git a/pubspec.lock b/pubspec.lock index 1f94fcf..1da5536 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -278,6 +278,30 @@ packages: url: "https://pub.dev" source: hosted version: "3.0.2" + flutter_local_notifications: + dependency: "direct main" + description: + name: flutter_local_notifications + sha256: "8cdc719114ab1c86c64bb7a86d3a679674c3637edd229e3a994797d4a1504ce4" + url: "https://pub.dev" + source: hosted + version: "17.1.0" + flutter_local_notifications_linux: + dependency: transitive + description: + name: flutter_local_notifications_linux + sha256: "33f741ef47b5f63cc7f78fe75eeeac7e19f171ff3c3df054d84c1e38bedb6a03" + url: "https://pub.dev" + source: hosted + version: "4.0.0+1" + flutter_local_notifications_platform_interface: + dependency: transitive + description: + name: flutter_local_notifications_platform_interface + sha256: "340abf67df238f7f0ef58f4a26d2a83e1ab74c77ab03cd2b2d5018ac64db30b7" + url: "https://pub.dev" + source: hosted + version: "7.1.0" flutter_localizations: dependency: "direct main" description: flutter @@ -1042,6 +1066,14 @@ packages: url: "https://pub.dev" source: hosted version: "3.6.1" + timezone: + dependency: transitive + description: + name: timezone + sha256: a6ccda4a69a442098b602c44e61a1e2b4bf6f5516e875bbf0f427d5df14745d5 + url: "https://pub.dev" + source: hosted + version: "0.9.3" typed_data: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 25c39e9..2990085 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -65,6 +65,7 @@ dependencies: flutter_webrtc: ^0.10.3 flutter_background: ^1.2.0 wakelock_plus: ^1.2.4 + flutter_local_notifications: ^17.1.0 dev_dependencies: flutter_test: