From 7b329e0895e058c8f210288946e43f8ee58cdc64 Mon Sep 17 00:00:00 2001 From: Rohan Batra <116573125+rohanbatrain@users.noreply.github.com> Date: Fri, 13 Jun 2025 11:45:44 +0530 Subject: [PATCH 1/4] Add health check endpoint and update Docker configurations - Implemented a health check route in main.py to verify application status. - Updated Dockerfile to use a lightweight base image and optimized CMD for Gunicorn. - Added health check configuration in docker-compose.yml for service monitoring. --- Dockerfile | 11 ++++------- dev-environment/docker-compose.yml | 6 ++++++ docker-compose.yml | 6 ++++++ src/second_brain_database/main.py | 10 ++++++++++ 4 files changed, 26 insertions(+), 7 deletions(-) diff --git a/Dockerfile b/Dockerfile index 42fa13b..ad5d3f1 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ -# Use the official Python image -FROM python:3.9-slim +# Use a lightweight base image for production +FROM python:3.9-slim as base # Set the working directory inside the container WORKDIR /app @@ -25,8 +25,6 @@ RUN chown -R sbd_user:sbd_user /app # Install your package (assuming setup.py or pyproject.toml exists) RUN pip install . -RUN pip install second_brain_database - # Switch to the non-root user USER sbd_user @@ -36,6 +34,5 @@ ENV HOME=/sbd_user # Expose the port EXPOSE 5000 -# Run the app -CMD ["gunicorn", "--bind", "0.0.0.0:5000", "second_brain_database.main"] -# CMD ["python", "-m", "Second_Brain_Database.main"] \ No newline at end of file +# Use Gunicorn for production with optimized settings +CMD ["gunicorn", "--workers=3", "--threads=2", "--bind", "0.0.0.0:5000", "second_brain_database.main:app"] \ No newline at end of file diff --git a/dev-environment/docker-compose.yml b/dev-environment/docker-compose.yml index 93122fd..e1ba07b 100644 --- a/dev-environment/docker-compose.yml +++ b/dev-environment/docker-compose.yml @@ -28,6 +28,12 @@ services: networks: - proxy - default + healthcheck: + test: ["CMD", "curl", "-f", "http://localhost:5000/health"] + interval: 30s + timeout: 10s + retries: 3 + start_period: 10s nginx_proxy_manager: image: jc21/nginx-proxy-manager:latest diff --git a/docker-compose.yml b/docker-compose.yml index 728e28a..435b9fb 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -28,6 +28,12 @@ services: networks: - proxy - default + healthcheck: + test: ["CMD", "curl", "-f", "http://localhost:5000/health"] + interval: 30s + timeout: 10s + retries: 3 + start_period: 10s nginx_proxy_manager: image: jc21/nginx-proxy-manager:latest diff --git a/src/second_brain_database/main.py b/src/second_brain_database/main.py index 65c1f2d..1ea2fef 100644 --- a/src/second_brain_database/main.py +++ b/src/second_brain_database/main.py @@ -182,6 +182,16 @@ def register_page(): return """
b ziw7~B`J+)vlZQR}wVK%HrVFJs$nr&Mrm(w(ZWmjd+Ew z#_j#kx;1AAcLztGu$mYT5gzKm& d`-`yi9vtINE(OBbZ`)FYsG47!h4W-T@KmEDgpOcbh--HoNU z2IAbc-CY2|URLC** ACaW;MVxEbu-^zqg>-}Oz* zx-8UbX>u9OsAo%t> qWD9`|_r~I-<(GjKEDe)GsxD@R>=c_o39}taaFG%@jxCCrM85)^?_E5*29g_v7 z#2#Y%&x!k)?>C|~0-{$`=GWENT#s<^4B{5BP*(3}bNG{L4~|9sHVfc{mBr$szv&^! zi%wl8xqHEB3v^3lF1 `py zhj%2#??%5yE-_6^`x=O_HCaC;D`lQdMjwuXyH-Hbp6)7~{3b8v2W;6MK5Gp<^Ak9& z0A1lKEks|0^~l0g@u|KB*RqStMjD~_qpI5Hxw+*|Mg0r<=MJk6P#j*U5un?obtAyR z52m|O?P1p@FHnAymmNWGp$r_oBG|sl37Sw^XRp}|w BtY%GcR6qx@(E z?jp=E`EbXtFoL+Pbmrx7LKWe7mz(*a&e4Osz&!Xnrz;+K8un5O^;=jCI<7jZEq*G@ zP5nXiQPN)Ec}M$Dz}Wc6xvF7ARfQ;a#w<9ENl&!*rdQ5Tq4Y=mpOl{~N#j`qP~x08 zy`U^$rQKOcv4I)<;GlljGVQsWOAK_O{ g!S7p!bs_WA0&3P-JilHl1!i_|lDw8HR4ew%3my zt?>R(rFC2sIV3hNEqp!Auq5a)4(Ce9%#N@utDt+CCvj;^PBi%3S}^DtoZ2ell}^op zP!ap&Fd6UUGCS?gR!ZrZ4L(22u?6v>QIj5zpDAkLQ*8xj9?+x7OMr%U5-?A+iK|#? zIr@p3J<#Y*C23PU23aTnPSQH#xW~JpZB1UL12uJE%c_|tqesiVH*ub_O@fObIDVKs z(4hGOLx9S9fsvaao=oPfzR4=BjnE0M+Q;2(r~L-3b|+>dWXMUg72F)0Zx?YGoW@~2 z!q1^+1j7Tau6--5Ad#Nf($G*bvxAK44<2mY@i3ux{iJ@nqfmN?t$D!5NE$?ZEeT(f z6d2Vuz<0W0U(6DL$XETX(pa^GGgY_B?=dJFj}h=|q^Yo~%Yy!D?eE$g>dLQ=&ct$} zzDKeXZ 4R|GULbt}js@fMf(-l% zMf#k~9k{_M)b0;sLB!FKd2SMRvAl8^67lO3eu7~#YO5}2dR`#WZ`*UF#Of*2;3r}D zc8y>^Z+Q?8e|Gw-Rd(799!FTC4hEct*-a;{l^ gL zu=}#@+HD?#5715TC#3l+9^vr;-RD;VGjonzPA*WDPFw&4F3C*3ojr3sDt~x5X zFZEnd&C!^TVo`!YV`ut5+%HH&?B6$}cyonqr4En7_vCy$Fq^pHen%@=ySN+}qFDe= z3x+)=X}zLVf=~6_*s-j3_(b&vK^T+imO$d{wnGj(L9l%0T>{cEMchWNqjgP(xwaHI zq3kP3<-;=9yt)WrWNdoVg}W;QgShVeqtXuVAX4kLoL|lSh48D6nE`myn}8lgZpaY! z^12_K7C>f=t|FDj9-24cNA|fzjY?^z+@ 0TU8l+j{zH0AJ z6HoBz4)Qv>SmX^!u_}I-fDQXV(gr=h?+2sxM~+p z9yq&un!JJPc+HcG!wb xEnb03yjm4 z<-DHx67e`Ys82m0I{iAkS9*PK<2{bNuf8FQ;s%p(UpBMZ1$N%gsHyQ)&&J~rEY4{` z f~GX%KAe)@Q5L_{^X;S)D uT9-sobGff5y} z&sz>w8S9Uwf6bi^_k6)o0eUF%wMuav+pKB6fz#3NwPqhmzg=yg7tiMpEt(IxrlnpT*@r)C%*g>PGD;t=gIl zNSe1N(IOBBb(tzD#gB;O!^-Q71NN(cIiD-vy;IsX@!yiCE}@vt7j58a +8r@PCMr&d&abdrODQQTavhPf=UG&!`G zZJi_ye )DYRpOig)K$qG}`yTB+wHH6csb)+;#;Pk{G(UdZ*sBAt^gX3kNg@RL zk!3|01~M1ERzqtF-p<|F?usu}SK!1X+nSr k&t@+*56|$>)oi?Ig#%ZuJK}+SsGl@|S^)L?xn+hZpo) zuaDr@3Da>n#ACHwdy6_o*BCS^J*KOnbUeT?i^K7JTE`l`l`3$ZvaNQM#9+|f?}KNp zs*G2}vw8HO7(tL@xl_tMT~7ICt^)~+y~2-PL6XmoreAZ{g`4C-WxU0Bmr_ZSkzV&? z!pdZ}r9M}qXr}Umkdg6@K7!~{qDS9u>7?*wGYJ h$kF580vC&BMpfYef4ku_CzyqF~ u3j;%>keH^|53lKLHn-jWrBCPSn_4WW_)gg z8Mul{^DE1Iy>mluIQQBhvo=T&_62*_Ic&Duxt*34&pEn+EgO+qPo0>dL2wf~ea5{! zH@_=X)=_)!GIVP8z^0*C-%Fyf(DxF-R5`yV-z$iH_=auu0#`UQ({2u{0-p-U%{)3I z2F(?L8|!eVBc-OIMq)mNsl0GIzIX;b<=M8;%}U5<$_O~+;lJtUU5|m*=`rv}M9qUB z16VoyhcbBlYc-gA)4oQ!uLgHb9R2iQY?s?LxZ{597la7%r$UV&NO9H4ywPr1Sr>bv zavmE#dgesL><lE_aFS8?@VFP(Lx;M*>1S<0yjLrQ!ADL~aBbs78(qHAs6gJuQhf z0BP5dC$*>^7Oc71v!M6AKbAuo#zL^1P=H((W0En4U6@FjPl0j_QnQ!0x!J%S#N?`o zeFR2t-2M?9FL#XkDSVY3x{I-q*l3G04W`b6hm-A%hFFL}Rs*U^59l5GI9p2SncqjR zAafC*9`Wb~k8&SUBZT)ps$q!(GUM5cUCx6$W|UpjGM}ji$d`C)Gh%x9+R*ADKco3} zK+SH8G`RuodIcZC&lrDeamByXrBiF`^AxQ7{7BEoxmn=G5u}8q)gRmj2`Jiipj+J% zpNuGG!Af2EAM7S6tp~OL*_bHO?-b5>I>tH|F@8;kO=E_m%P?LMY}Waq24 BDqTkG)o zuya;H6ykFB-H?fZPr`#$*JH&8JnK-i zh>st<)mx`SEb6&sysk(ZYVsmGqU 1coO^eKPJtTdFLI?B!^}4`edWv zr1PG%a2ykMqHWi%4T#a377rO>;}!> v@@c`A)zl)N zLoLbfgPaS642Z20lC?V`Khqa7$QUz2Lb2&joMTW)aND-qK}I*qTmOk4LDiGbCO2Qi z+3n5p$fO543gY#6yL(=SMP9N8PF;L$r_Bx>I-{P213d#@u7FUDGa5AQTVv|)@o|@Y z%TJ1v?296>B=$l!A7yxhI}&b` aWSR(UmSR+da{jNiqGNpywf7 zufi|*-F#F`hdcq5#}m5~8MxY>kRW{~C`GA2TA6$kD5plR-#({IgwoCdhi3dYJqjOb zjgO*Gd60|%tW%k;yWwF6omiudS;fWeysil;T+ZXm#@q~UWD5i3a~Lp)3CwwxMkAYI z#NQgGzskX+S0Fpi&>&P0_-F+ig?A9;covVt!1eOJhCOm)#8cqlB{b6>(uO~qD?w>} z=NZ3o V@mV2{f$yLcS7>CTj=&`N%lCmhv z!M9P7W8otG0+iKi MTp z2|H* GZTt+<+0$_-uD&$ixDZ{9+ $+YT4Pnm$cG>a;OO9g5v zxHr78$U`WwRnR3l_eJaA;&oiZF-G0QqjmW%uwN4k+PJdErP*N}r_^wabHv67?#Gi* zIFG^IN(jmqf7+gbF0aFhhr${UD!;{g$`Ht6qStHADVtPHNo#U8O+~FD-}f_IJqG`w z?^ro9wOl?IZY(`8>%DC}Y}1P4xPjC0*8QRXb*zL;^K KQ4{3>uZ&3#)nXDfVdi-< WX6~OwUDHSpXe>6n0O{YU*kED3y_U!Py{P7+#{?+TR^n-Rau+kzG^g^Qttt?c-SE zKa{trRyHnH1klHi`Th4~>mQKSv`0U|Y9(^R2N0kuD8>#ib6nFaydT?gwpVk?Nxi0U zNyLKvh8Z_j=(;NnIwp>&YXO*em_*D-bu~!Ol68ojby}W>7Cv$_y1@?*bxzUx+9Uo_ zX&SxWOMIq->Xxvd3O9Lye%(NbW+Vg;A+_EL<9pSIE34fxZD)xyKHg^{zC8yCv{~%Z z(fqhu?Q*`JEK?&fL_{1W5R%3+NEP<{+ `dsUbJIW&**0S4N$gc o1_|G{ZPzG8<@nJ+FsHjq$0#| zGf_)ijXtHZ2r6TBlrm7!P7PQBCQC$Zvjp{@7gj>2Jg9D7 v)mK9+$JyKSq?22 jprLi@V10`4(rX+m= zXba)y8t2RWg=V!}W)o^Pz}~B$7r`?d*n6dQ;u)H?E@*wO^ZE?b2y*XSt3XH*L#3F< z!|%3FaXNUT_BDy{+2dy{WNt5FO>T6ATO#{^p&HO)*m74|WPY?~;Z+9p)Uyi4TxFGz zaj84IPWjzLY5%&L4fotp*@@5Dz_cBCz_C-lS;4Nt+83p W@Dy z*lt`!3-Zv)H-Ec*mhy!k6}le(rh`rlYq}7 &DvM(y*z&?Sf>?@SSZi0g zj_vRH6b0XqfQsKfdKf%0u3z{noQlMic6vk-NW}R@O_oqL1}HVh?D)ck7@g~&7N- pr+P|t_jHCW89WX z1S-dK@SgFymuiuGFQbg|W)goIhZ!z)BJ6X{%<=`^ON|Jfx*!?V*Wfp2MU*`PP6W(3 zbwU#+^ }MN zTe*#Z4CTMsqKgKOp9DFtzvh_zt*v2<@ZRft1Z#54jaVmOG>b2f+*XbD`{)x>V6T_^ z|1tLGQAy{~|2W>vG&9+>YE6q-Q<9{WW#)=Yi&>OniA$+yY3aCOihxRLi!EAMN#=q; zi$N}+=7NG~<(8IGqM#yBZX_sXh$wE~SD)YaeZJ@SJ@1_FfBu1ob1rvz+{b;~`-Bsl zeMXOrc4PnftI^}>WQd}%pJwF)xSqNX(KM%#&A4afh)e%^C*CM(D-lM#2d@e!4=3qr4z?NyfWdx0Gr|qdP+Xfk(kJGs&k|@{hX?dH#EkE~JW##ev zdG`5{-51_;-gn={-2OaxR|T%E;1`lnrq}NUrLTJp9hd@7GcoV 1K@1JGoL0HyPokxz8fIFp9 ;$A`4-p$`4|l60G?X2*g*R7un-QW! zmR*iU@Vjg2{;(WkWP&FOYrj>3bv@o0r)k@a=)O2trS%tuU#+O!^o*CcuP8xCGb{M{ zX2)j&0RJf+(ffYVgMQnv%;~x#Hxzaw+I?fBC}6W!52fnY KY#<2o=K}&uZ*IeG+tw5ctoeU_bclpxc*@oU;1Vm@9UBEkZ5e>SlBLB ?AP6 fJPmH2r@tgxiUpQl%y=RIg|aiaqP&X?H%R#x-Iw7xaHTy4AT26o7dRV zJqZ!L!3j;)dHfW@@yXUW@o1HRec|(nre#J)?o;vDJ=C}27EFpzuOh_e{rvvjXWEaD zJjsv$SxD~F$y|DY{osqTrRWbIL3y`|wx5@PSnoe_Bt(8?!=2XaK_(mBImbO#(MWxh z4^A<4!>|dpo*T%qnoTq18u9OCu(24FB3)WIgEi~ Q$V<<2At8W)8PK5zK%#l}POZ}f8?` OJcr{)Q-*UH5VLF2ynkoQ OBSJ@Bja%ypXUs`6?%$L{zF>kZ-er49Ax5&Y&O^ma_1rEs{#WnD#Efx? z{rWrc }IAGrOuJNA{4SRWgjTem;SNLml(G`8x*kPZAjOhXP>CX1x zxz_9VcuR&a(qn^0Q{|uL)fa7XYTH**;I>dGS}g$%tnCEEG~`Seu>BXep?0{lD#pg! zlpSe}552-{wn)%~cl`WZ=10J6m?J;K!Pjcto(M #(T>gXeIe(>p z0cB?0G!S^{U=v750fJSf )GTD5B+ODTv=&Hg|V&Cy2R=)C3T4e#h?r-5fM_*FX9nEx`Zni?3^)&a+Gh>Y|pv zW+)NMz6J_v=E$AsbCwwGXqHxu#|7F{&WByQY4AISw>l>O3Egl#9*gaw6(PR<%i)4= z7*nb}H#p^V1aGKJRcEH+3U3n6cY$`rZ6>zGuvR$%dTCssn*O*euPJ=l<#xML`G;5P zm$H4{g#1Ht)GV+z7kHs-eKZ|&gU(0>ifZV&6*4qMWK?W9Cw8jU>cnn`*i9Q>l()tS zkjR{&E9#Z!LZ>0}#_&TGp?<)rCP@x2`&(Pw207hZ&^OJ)1}#O2G&F- BsJe65-BuZvo|@-609tFQCxjMw0LcA5jqfJ4&d?*e}Tjzf%vzS|0HBgf<4bS>10*}I@=`rRd4h8GqB zQhQHP)?W@^%{4KNxrp(+G@MfCmQ?%eY20gID=dc;;Qpjj+OgH`QlcRApr65+NNr&{ zQ^zxce>*t*qa7iHwpC!mvpz9B5_i;kD5~05sCqzO0cq8z8|rSFY-Q#44{LbN kc&kvoO8jFeOkf;J-=yL+1*m=KclZF^3m%Ba<54=H}*r zV4Ku8&5v75n&V-vk#93oLZsQzHqfA9b=t(MbP8+vwA;Pv_(|d{r#Yx~L4&Yom$-a? zaMFcqYOq%3(?4$;5ThS0KG8_5l0>(=nOZl2mLVDP$`_X5F|gi{nojW}%pFovm%?r| zh+DpS_vl}&Q(@qGkF_4y8^8>gexR@=)7XW|5*M15-;coJM7|dEwSJ$#$Xo%)ft7GT zb)WIK^?13RptIFGm~U&LM~s81SLIrH%K7v;UMwJ6V&FHwFEfaqJ`-9krldwFL3Aq% zE2TLG9%i-rf3@KM*!499x@7w#_a3D5)=#ay @I=uak+zsWA< zBGol6J87wRPf PaM_;zj|Q6Q zYjBJic~R}W!0{G(uB~&T?lA5oxC-b)^3QtL79 %kca1zAUkKFD}j79?8eU?up(NXa7d@ z$@>2MeYem~lWxLk{e^M+=QaVX`dPZ>(49G}l8Xk5xayK?3x_|`SIm&K!@wKDxoGVX z+I51C-`1DVIQSWmmXpz2%z;AkjN6^~#<8V&s9D~ts`S0Qv2ak=y1V!f(TX{TTb&Yn z6m-Ygv|NOfwIL?Wb~lfHxkGi^nhQ(ew31+%#Gy=3ZFZAxa91;e@pr`*rqwwdkG`&e z-9!!|Njt`R>JD0@uEA+igkL&G|MtcvJG0;OgMgEzb^>QP52M$PK8o$Pl`<3mx!~oO z^9Z-mg>zcDM|B&PMCUwT-V|q}n)5o&z_f3qZJrL Vc$NY`Zl z=)H<`Pqw_G?+o~0{ELz3OgH0n_{ryGzX>1KwM|2#J4x%^t>F(_N6o!=ZcGm*kApXT zqdHXd$zq2<$>9`f{fBi0Ao}pQ^9S0vCx&q7QPg04ptWDX)cTT+S=e_uh`aR<-DbmN zlr9E24>dS7U9;X_HP3Lg?l#sULQ_bXq|TYN72YU>@>D}7sFK_d%XYpVHi|1hzLT8C zK*vW(xV^gr!1XoVhURocUQllNGo54b`wC4ZnV8$Wc}A$o;@=D38-DYh^TO0cdN%(- zc$>3ecqaWl-uiLgZS>eiMg?2W&Jhl!Ov*-C9i4BTeX9Om)P%n*`=>tbw?& #-2vC>qa5>wYBplH&_3G*Zch_0Rx*U69^x8VheP B(%Dh;=I1@nS@WgcEBT_L__kz{wLvR0 zI6O*z8vG{V_6j*ag|XHAZGSVT<%1rvO@Ql_I>%RqQoW#2VflH^5nU6Rajj**X(K=E zm?P3Qi~pDrf$fvwzsW-O4?bv&FJ**By?BpjNX3m5`S$ qup>;B+1$es7g{-P{DNw^xP&$Q!;eQVcJ(mG~x8y$VmlpMXJv)=9gL62i4PzSlf zikr8<=W=awMxs(F+L=jR&^`IpZKjgtuXqv8*M~sW pBMS$?4Er&X7h{KW!fw)dS{6R9bdy zEgwAwT&)3(hbGE2_=5L<+&k$kcuT>(YDAL^op-y^?rYqL
U4^({abP6NkK~!AN4Tf43BbXM z&=Oi`+B>%~Vm)iv3qM0ehaF=|&oPe(L6xK+WMiHnOw+I~Ab!Ykm$U05!pI|fo7$t8 zRb|(FPB*xKpa`MNINYNjDNOJPc9A1+?>tgC-JiTrh=ADL24tTc{*AKV#&os#S`YKE zRhylriAhbcsOWf(99%A` CWmtZ>sUHul^S`;68sv5a#DAcgdO7x z$Hg5F`U`E#2^R`J$FU)WlOM8$W)V4Mi9BYzF`r>ymC(`o6=Xm~Zy#M%&?M3frFND- zi;DjKLcW^NW!ZTJygre+f_PDkBzx&I{svE@t?lVNV)=>RJ>tP%mkLmfncsA?PZ{3t z_3^onlHVF?b2fHXhj6H7&NC{H$8#w*Rfw_wtSiTV)Rl%un+`8lR~$Y&h6(R%CGF|Z z%2)Lcl`b#islB&j^=)l~pZPzgrY<*vx%RXa!xH8k?$E!V1Ji9#GKc5Rt9E*%`hi`= zCteYH2ihVoby;tlvnjuiFN@BERFw}s@D((>n57cJ_)r`%#$^NnL%)@QUdxmQ+sEqv z)&Cez13?B;`1r{x{py %acM=M1_A@ zuM%tviMOoMcxGJSP5Io9^=8BI$PjFP(P-SWxjlmtb9*EMGELwcSR7Z2&j?Z`s=OnR z{A}oT^mOTZe~amZgKdvC D~Mkm5=rUqNo7{!D;bhVlp z;j6}kp}jVg=+jm^U!2gkuW;=Ky-6^t&wn!Wp{_Xzt`!}X*I&-55f@NsW4eZ=gnK^s zc&4i 7jbw zg1gq+Cnqei&bAqG#f@iBVcOpERRS)DI3{H=_MxNt0ufQ6cNCRE6Dt9E<8TCQu5C~Z zdTsEgSgymA!p0;mDa4w-kVtO|!-M5joi`jeI%K=6p^X2|Ks~WpecM`QmK~tN$(r?0 z89HVPq+a({)U@fKYm3}?gB)^FeNG@`PQQs?#6UnkoOSwjS&6+V lP1Ymi>WQl5L7J+R zK=(%H>mN*+FuR^1mrLmbJm`}VP{*j1MXGV?a23gB(92QVz}+kR`(V9(@^w|EuXjM+ zb=MG-F^!gqjg01^`rE5 9>>N`+^cHj{LRO;vXI z^hrV19C*vE4H zPDa5OXOci8=Rb1`@~TCUB67QsbJ^nL-f8G9v^rWI+?O8pzH{P{t|I=aH`~WJoKf5S zhCxQ6cF}Kd`7a+`3;1ZP$tA}{eu8f|w5r$J=dXD65JE*v<>zKEJqy-HH>G{d2D+~} zQa?dk+6BE&AD}&R1>fJfc5?U4E?7?7P{qUht5#onc(FV#9{jgeMZ{o-GlLeJyD?(0 z8I_o}9Sk*0K2AA_Bu>E&j5uBy9XQm~INs$$Q$lx)JmOIrJ0qQUe2%6Y+qbl9kqIBB zfjE|Q_7=pCI6e@y6mylk3#4|Vzw=lFafwW^Q|K9RJ!`84=VbJb5pS!KNp)Qj#G~kp zn1~uCyAg%`dAF^p@c2-Qiy5D852Wtdwq~{zr|kzIuk5j4k}D>!mW6I?m^Du{Z lryAzgTT^W*X9gwD~|xLu_7y(m)QCK$4aC_&|E95BT98pk2f9eV3o1k z;{COG$NU$%hs_7Q)*qnFTS8wM-KEx?ZE|g}Og|3+TA%ZBMyCqZBET>6KIfeH bcrL1cgfW-v$oA^#$SqJqF<7ZcQ;LutbZLjA@cmf( z^sw^$fM{L-1d1lwM>q(CxQgivO%n#uHLyjnNZkdn #^h7&GF58MZBb%rRNA$18V q$K5nd`?deHWiHn~dbnVzMi_o+^~H zZVE(<9 !ZS$#+Jqr%G)#l!NtUD0hqg{Bw%2%0KUDZ>%>jy5)x)F z(V;6i FoOYoO@*tFSry|v=i^r3GcO=h-bqG zf(A3|X~ t{?-c-jP@Q)yqn}uft&(*1 zP(4_zG5!r9b|;g8jo*HD{};^g7!W#iY#dNfMHvUpfQL zXn`L~0U1|`e&B7;J3H=2(Iq*G@MQACu_o*Equ}G19V3ou^n1K9%Xw%RkY3e=!Skvs zU=~Sk5NX U~Or!-Md 0mBRZS~udg}xyw?jZxE;O?`s`(!dH}BZ?T?;6 zt T;98QvaH<(bTpEEf%i5pQpo4m{F->Xqog~Sn_Luev8znK z5C4xU$@fyx#GDVV{a7sW7?^ptZ>=X}SOsucNv3lmqw}_?sJ;_>SAtiF-xa~M^JjNU zV3p1RCnKSQbF+=6Qq5S^q+>PfAuDYve>URM6YnoCLt{5fiyl+VU=dmW7MlC}X8eVS z2kPphKP?V?p{_DpfY%c1t$zm~)$UzvkND3~nU*Mk`JUzE0O)(q1hAo^PDneyha^ zmoaodU@)pe=UnK0jQ_}&zPQ*pq##r~D5Fl%qdUFdw$x7TY_EtDwpKy!#g}dkp(m8D zA;zIC#+dPPLd{%YJW-KX{w)|ePl&}5p8Nc@h_9`=`daX#T3bK1(OSfQ|9rc&v;uH5 zOO|LdAM^<5mSf`EC=0e+V8I027K6mN5R(L``D }zeEPqN|uqP!(C?Eev z2CW2NU4sL-+C}rM#PNxabvx4ED9L)*KkZ%x`!!}qA>naOP6yOy^;x|{+aWtzfHY>g z2Y51Xiw8E;J=qLe?7f|zTmiEwNV}N!%{q8LlmNAa#dbD4IpC>f+^`*5ER6&2mzB1g zk!GiC0@7*>OcXYC&_lz$(bcK%@!Uv~e*xMoUf>Jw?`b}x_oqcsa_##pWEf$MVDM<# zAB0>pXmU^u><{;O-A_mqUQSAXI=KcM4m(mf=?K0V5>7I)G+`4GBq_zI?lNZvH#+nv zT>|1DHO$5xo$j6%c?sGJ#zD;Tse-?f;j6nQT$q!hlp;bQS&S<4C`+J~?^BgHZv_}M zcnwQDrpO|fZVF;zB-IwVSnbrKKkov6lymuy&PNqcziiQRzWu?)#vl!0h1@|u{fv8x zyVj(S-wOfs>L@_RzHKUd|0T;$+tfl?B#5Sf&*iot+^^eSho^gzzG(t)cWFKtxjI8u zU@m?6-Y|G4fD#2QBK1WzW+VxuQ>K2lW4Xsjp wj9SR ziSxDh3^c>K|LUZa&sV;6OzSM)N7sTUPOS>O?VPrnUGv nFS`UUs0liDF^$*EJ;&=L{a{YblH*x@B?1oxJ7@$;yaa~7z^ z>dh(at-0mfJ+PU!+$#xwJ9}XV;hS=YK6>04UCOD$YNvw@O`s=*u4IQsWzH}Q 1360pbtR={ewK zgFv{STL}+Q#Hrzj3uX>tL`a&VN7^kVn|k7Brstqb`LR@c{*zEA?I1m{-l?=<^H&lu zMDF3CP+EB`h!W;OQk6wb9~;+ruyJ&Hl-0)&7N#2qu@Qa|zn^P8qqZx(Fdir(#!=qC z3Eo?1dt~OC_v-eNaOW_-QXx8D_c(OXxCWj$_<^5TB^NF(V*PKo*Horou!#EfaBs9{ zmr*sJOC+5Kq-Vpi?vq_3_so-#&=}#CqTqp~8tIj^x|&mW=>Fk7+dZ0ckEHCr?|tEW ztYg~u-m18fE0_g-06K?IKQKVn*+z=c?rB5oUKpZpEPHrER!Q1b`OrvjwdZc#H>#n{ zbNKq2_n%x|bQ#yeYfr>V$!6n{d-k@^hn~pC0D^Bao5l@kWr=BTr2yRQBUu_Mq5FFa z-H{yVf$%|^?MuQ1(i-9r9gxJZ+JJGzZe(27XlQ%5U-TR{Z9kk_qX)D(v~mMZL~sHo z^f|7!Jx;XzRbC*w`~aO`9C7e(g{?noB(POj_*X Y z`5!I7_DR8=-<~hp8a;X~F|4B^)Hz@Co6>BAqXW#fEON2SfiTWcE>!!1s9d^r{Wa@x zC^p3Xno6=TuTI1qw_$V0V=6z}$Cz8_+VrJ+EH;o(P4Jy28=fnx6+Pj-teD)iM161c zfe-j46%Rp_NbnnU+O0N@s8;3UUzYBT*kggNTI&yvyj<5D`EkqG(hAtU(Z`QKSBG <84{svmF zWTK!b263|Xxyfuw!tDC~xrt4%{phi^La|rqSZiB}sK;CC)nu7moHuW7WrpC<@xgmf z#QWponYViR_a_Hjl*u!Tq)H&!P6hq&)6&^#^dhA36hJ1W6tAZ0o_S74Nge5dGDx5T zwYwHH5vy&?t(MgS0|fhEQ>ZZ)4SSq(v4*~ez4k(ZjrWVLpcQ^qkivjrhqCNbaM*CU z@oGt !)QRnr6 zam}*>(bG>$s@DgQ&U;H~{VvzP0@Ko7oxd!&E=#-W^WL8$^*dgrhqeh-fpB$@9c{s0 z-FvcF*ATP$RQ`<)Q(h#~jw(?k@aRwTs6N}+dTOk%J;&53)Zg H(I((U zQi)+brv2S-h@0%x )a? zN68QU0Zq&M-u$~rzWsb#ClhopNCVrEy|fbaR)&m2O9e%1{N<+kpCfbEq}#R4=KSMv zG*SNy%+OS8i_sxxc3u8JwnG<)o4-t$>`p4qQz~*HgW`sUOI63*9+O)&L^qE9*(FhMt`*i2;QUPKjxs?<)F7L^gfjlK0c-D zy&S)+08+;vGmh9&itp{B6M_+)TWz$`49UEB-ZaB}ArCc78lkQdvAMe2&FOh9Lk2Fr z ?49qY21sLc){;)_21(3nYrPgaFr>8-0 z$SCOfUf}T}NW)e`fQCDpPE2!hmF81wcdQ`QKLl}%4(;4DS=Bf?nSWpeg@;sh>rKu& z>T&CGPlBW~7do45vONi3^QC5LS2D~5m}Nnovg%3rvss{bb(hmZ>}>r49yb<5c9y)D zFJ6yeYjVg>(Zfk^V9`-ZPb$!{GTF0Es?Uw&MuN<^mCmOUUFJxjde*$1Y8KW}pk^h= zhMp-eyJk;rk53&cXgrDv+s%@Bq4|Z*cA @I_#KYyFKn9Ckt`}N{kFw2%;?|N*mH~H@$^T9eylic`~rs`ywu2pmE z;8LvqNpfh!&Q#d-9MDUlo oUoQcW`Py&UDzA_q0W z{%Z0LE@-=yR_5x1HfCPew5q%ah5}j@$X5}I79$zxISp)kMcdrHy1~znY6%lPqa(JX zt02(3#`h&P$18naaw(dT3YYj7|4!ZFy3L5DVa6D=I(ec;B&5I4BdjcP85@gooVhdk z-gzNf^;N+mKMKJqjXw@ff~V^_izG|{o?fvBdi$}U5BnBj`d)8y`b@8XmA*f1nY_Le zh8zW*Wj-IF9T*{KL(_VfSre{2-!TAsi)JsOiVy|M G{_YkIVlT`!OyJ42bn}(R^$VvutsuV? z>-aNYjl?2bMI9Nyz*p5f$|xqSBYq#OptwxKr8e|mcm-V*;1^phI$uxB@TOa>Eo}oz zjjd9l7vst5f%Av}`?Z0HYIs{%jFZ4g3Lz8G#r(qpmxz#qDzSweGkP~7>Nai>&-*_` z|HnYxw0GKlv7-NFsrinP8=pNAqO?z^!$oaH?y2;?P;14&S#TG%B-cumbVYwXvZy=d z3iNtDq{?8tv$+JC8{gQExsATguXDP&9{d;Ir@h)*LKx_8! 3RdI;;oWS~e>vHIaw zPu-Mt4OUtu7Ak4fp)r?8)U3#7g2f1QwSz=5PhMxiUYI!vNO1`8E{{JDy`fzDJ;+OE z)%Wr;?4^`(N+Mhgvnm}{G5iFQQ%7 -#=7R?-Dnnz4sUb#3SmADUZ+S&|@+CLWIUF>rXfjw>D zSl4G;i(DJ5EJjDZVmeV#Vb+f^cbs<=3bQc!XE0wVN!hxFXDFRoo7~$@pXqEahDFb* zYZvD1F^On_O)Y_3^lN8b-tvE>?0x|h4o)=K#78ijJG0qAVT?bJE%Un_3hDLC^>J-e z;Bk||%NuIxAJdb%@+>UZMp{#A-KDkk7j8us_YAh1Hzyo7cZ!^Gcz4p@10R_(3{1+s zL=)XGUt-@gC9iih_uaapV6ZZn1eN2L-|4y0YyE^{KKi{!6{7xgWzNQe_$zQZgF?gJ ze)Jctw|DZhaGv-*K$$a|X~$7)0 GH#+ z&&!nJ(Y9ju(^0R&Eh<3qRxwaUw! &x2M zp|l}_b}_*pTqTXA>ih#4SM <)L3baQso@c?yHZ~T0xjLf Yzmss}A?8d1??A7Q z#gWs46YI4{CTuojz_t{uFdvWpkiWk?{elQB41j&qIGi}?#P!k3Fg&iR?jO?BQ&)#E ztWYO8yBbV7hoZ0OpM Ur*ez6*?S_MMg@sbefVO%Ok=zd&O9j}qmTc&f^uNlT{tqU* zW`F1E$-UeT(uv}=Y`1%&6A_}+Vv8eT+85kebYLDTvNX>Ao0R+HZ9OUiTyHQ;7iWN0 zfW0h}-LZE&N&d_oVc;`WvDQe+0HXDi;XYCMaOTiF(R@Gjg~bv6g>wt>s6C>hChir& z<+Ak;wJpG>I|HDZ0P(&Xa|c~ctOVb>eYnL1T(A?#P?Yb>5g*V>g{5_7b4Wb5`w?x} za)H)eqDJ;zdC$GSbgq9TEXi5^gprX>Xgk`E(Pv{4Kb~*NFdj2&g6Gt_e(0STa9)Ut zJ)lRF^$|+K6&wy#ZVOh2)L`dgQ6vV%2*dU{`8}^qHQK}DyywrNxh~TmIl`)WO|!{p zt7cU!yFxOwM(`hvLi`V--rwu8m^5}9?0jjR@W%PwXwk9=*nZi-S=$WEL%M$ B*=R(z2T&nD#fq88#4G)DNIh$mKd>kCK8gh8kswjqLqGJnp6cT6F zjUhLD>nXB-cmdo7zwfb@ACKMBR?;F;#byB791GhRF9EaGjJ{elQ$Nb#sf6OvSTL)~ z0Dnpn8A5@EUXUH*Wgi?Isu+{S<)P2vf=CiLR@Lil&)`(ea8}kP^Bx`jFWJcq02&gu zd6QQxR?{9`)mcC;y$ yHYVRyU9gR(Ywd@JFSQYm6wUS)J{Dv5g=-k}@tFI|g!f`qiC@8lfL@Z;G{p zV2s@@tg M%uK5)kF+RHJoO zo1;uJGpSc14|vIJMQ3StpE3Vbcc|_DaV;BKIt( zb|_JH97(dW%GOLz9A5z(x}~8FRauNNgI`d6a?R16ofsiSGT{x@V{J_&JQt29TymLr zaOH0u^zUax%3l)hs^WvZ)aIch7X+%Ut#3wI6uv)`T Km@MD@|BvQOO84gT9MZ z{Uu8kfX9l*`$87^)YJ{FD@I#k&rYSekj}c@f1&5Ani^tFcoROJ;q_Hvv^QJ$lUf|P z5l+9lY6nClxD2M~npC6|i%`~U2R@X}L()lvvt*n>)eB$K<`RY19Nx4I 97ne3 zUV8TGv_DoKvr_?Gm$US(Ax5Z_Y_Eq!6{d#gKlger6+>T-3{m2Sn%Tx&Y6;)>yUX$t zIEkthjT_R;%cbN`sw|`TXb2JOI#M?OZ?D-r;zRj;$R~7KKxm?*@L1j-Wf{otSG0ZE z>Oa$yX|tDY_d@|at@Q ?lMbHpJx(2Te3PNbt+ zT`W9CkHZ%PUUcP&a _fcxoJg8Z`!JCN|NVhZABdXgb6GzR?dlNMW=f8uBw&v;<2PDp!C_=h zR@0`jFRb-3j~2}B%@PRf*lQyY-4H0tR{$mGt}Tc{31~{4vHC>ajH0k>et=bfEhG!Z zT~zGB>Ot3?r_wdDs^FX;AJTp^tr4Su7rrP{W{156`Z2>Qo>fpJoPWl3dUYNgPPKn` zT2N(dFW2-}R+T#jRERp+!u6QlBIkP|_BHPSxJW+prmAgpM-lqq;8*H4Y$%Sta 3>kNTLD>`q%NJd2#R>UdVBHOm6SZHURl~2cDhea@3W?gSMnhisM~TA zy$y16X4LpR!ND3@#EqebA`_kqcUGMA1n`4i|MbYb=y5yVfw|sKW! yAA0q$ z$l8vy-+N4$z?aK1Ep~L8`!WS{vLhp&1D7uyfM(<^fJ|KF@ufNwRbc3YyjvC}qx`=~ zLi}t`XP MdWZgg#$2cW^ #S4bDl@n7hBaE+55 zDWs&`O~-#PRAi@yg8My&{I>gr`*$HqN4Ht9U&92l7$dBwy|MA|CROEoz4gZBw?o7s ztFz;pJ(rchmPRX`%Omw0sMd42^9PIAmK_qwyJEsrHlGT+ 4X`V>XPneC;J}#F$k-yc3~J|1UlMJwU+{G+U{= zSnTh*=DleWfADFVLmC3e{}ylMpmu|9Dq$PB7!qrwRdU=ZMgf2LoN$_yG(i56w2Onp zNe LYUqg$epq0+vEHSrMqGgu0G~ zj8&-(ZnGslC!)-bTR_qzBdc(Ig#k`GhA=@tp6--(BWkgsAKd o-uxlyuSeKOV{pN+vY0_uc7v;!5 zE0N5z>J{L+ox?C`R+>RGl&gZB=u*71PTmH4_EC~k6Ooh*%}4#}u5BZWX_MBu-~0=F z-szc-?U)_pO>09eiy>B0vz*?BfX}-l6;`~`be!HokpU;Sr&qDLDt#p9!;2ht9FFjt z@oj2NzB*S7ms>;O5tq&m?jLl~uBUpz012dLMBf84t;DiFD=JF)r!E!!uNThkt&K^n zetrHHp$Y|VcaFE=>;t6^BfdPASJ`!*lc5nV?h276TQfp!LNdCCG^3@xJr*2&bcquh zSp4$wNnooV>`esYtP^y%^Hn$VeBt+<(ABXKS9rB-y#NueVTcq)yzR5tHUj{!q(FOM zAM{RV5rFmi_L`X8b;yQm(5 bGO3Gz+Z+l$v-6DWi{s#9)+Vne@4AFk$mu%I!~I}p zJt_j|H*!$;_mUa?mBaV#E77~~wQ?z8jdwrr_8!2d6SpcfeV{kMBsI)R9w$~YnFqqW zGT7oc{d} UB;gDlo(NIj>@sqPWP1Z(HwSZsM5$iN|H(N*7(7d@Q z?>=oagL@{B$8K!377YF)UBp@dj~Me~Da;n4SgeoT<^XUnla5<1zwIg89i|;n@pfc_ z2>llGR-V+dZZgsJmUHdgy-uxHgqSm9#N3xIgCeE(ZFwu~B4NMU{YV%<^nc)2pV)Da zkYx~wPJ>gGdXiw9TGzXBhdt>C!bS+RL{;OpU}nMgI%PFN9!z~ kWsws^uCcH+4qkP*2zWQ+s##p%!=sg#J2dB z68^uJ@+n+2!@{YmWVo3ZR}}j1Tq~$t{Eopb=WdBmWDSkBv13T$@`nKkm|#X$S_Vem z9OJ2FwW$mEb;7|sg=HbiX)M*NNr8|Cw!u<4-FrP|8upfswQ($_TWlAjysz2c1kx)- zJ9tQI5eWA1koFC0D|u{Y%Nj){;Y?1UdGe8n7u}#nQa?9S1Pcr@R!M&Q2;BuMyPW1| zJBh(|1#N-OzLfS#6=G0&Sdt)^0qcMS RDeQ+{>r`nN7*F01vUK)=$SVh?(3!6Qd$z?xZbo{%4gK?MtF^W3HaC74irtnOM2` z{r_kIGWpH|-Dq(z>2j=ygNwGxXq?|d(Zp~9(=MrEh1eF0IWhg0EjNBnwE$NBYzjaw z%6LC=u}+~?%L$ObX~FuA+Db;-rqbWa12>$oP=Fu7uG?&96uLdYF(P+3fm6iGN~F`8 z>bPF~Q;0cUFgN7*K;CExH6-nloeb9=KmscE6v*_Kd9>Am@>|gA_OAHvA`z}px-`G& zQNF<{p%Pxy-J*s%6gHJ_*i~S(*S$jIW4 _^jDdeU+)FX8M80?Sesz>!*WsT_2hy5J@TYN_j>LPa0YQ(C)@uS|4-J{~kp8$11 zTNREa9@RW$DD`kmUktikC26e+m&^{F8=i}hH88L*aAg2SD1==niJ=FL4gFlg5Ucqm zz$@m6` lCAEMCN`*V3N@b>T|aw0<_P2r?A?w1H-G+% zT-&$(vVM?N^5CX=&@m@}8GR|vAydQlZvHy*s~mH~J+}YD=vB-ScQ6J6Eb3yy#&C^; z^*7^YukaHgU!D=RBkO(j{L=qaq4X#T7>U_5*rZL%)~tr89Nw(Xv1rI^clSRq*gILX zSL){+m8HSUSLb Ds#vO%&aw1LV8XavQ#fhjU{aUvG4cynW4p6 zI{jbf?vGpee^h>iYWIwMoa)pbaojI+z*`q7r 0bwe$E gH+Ouv*Gl$-=^09ioc-d5(SYmdB{+bOwc@kjl8J3l+` zIXG{qHUI|9E|=Qk_R#Z?3D6cNlf+Wf5sYomL`3T^0(-r?AZ>6r8s~G)#i~c;!NkaV zWc-ezujPqY7nuLoyykE}j9}Q5l^_>qxz?~qg>ajLZ9U-L%5sI?-8d&{c|3DOTuT+t z_u_aGc27|iNxXetQJo{pP%fIQDKNmBX~#3C7h7Lj_@{X7GD1@M`fV)I1)v85H-Ft& z@!eZHXRD==tRo=Xj<90JM* 7pI1uo*7c_Sqz% cp(BA-9*iaj+f0&I_8{Y zC*@m~i( bxU(awTD+vdC{gXx*yTj=4uRYR 8fO8#f;-U zqDDo(_!3e}#$Jaei~^K!Ap%A<6OUv43jrR+P9Tv?c8{XrobWapxucnWyL4Wt8Y8F~ zH8d=hUO$@DRc1hqjgVNN?Rww_lf>$t k7CjWE=}e{8-`elQF7wqY0X>DLhs z=k-@7?5M+h=YswU-`PcfaC-1A*kO3a3j4MTdXBVWrq@0>my)8ZTN0i2ch0{L8*8%Q z7D1eaD_B4%2mV`kTxviIEhIgOLKVIz;=3}2D$`4>A6r;`Zv0Xi;Xf{-e@sq^(7cIl z8xkL+ty~Ru4_-wbBWx*%EHJ@dzX(3&{MK!KpbJOPQ mJO;afWq-ji % zMD~9%cBWxTCT!oInr0@un-;CHGHXhb(Pk_wMNxF7#UcgDJrymr97QojKyjOCw^B 6&)F*Iw`6~tqO2dXx zEoESM&nnpqSSnlra@ }-)t$&!K58#tYw`&FI`Oj zWt8;Sn5yDRWp!821DlLlqDGcmx$D~uuvxvOZfL6`q^|Y(Jv9!k>reYc9SH)%Fz>oZ zL-U@p>-oygz3-|X`sD vA=OR z0;lQJT!+NGUA2r`vpyPl-htn*vO8OhUJH0qDTXD+`~HO1i{mkAhv*lL&1a}zCJT=? z!vCy(c&bup7w}w2SA{RL`JD@H)Peh`=8CPxP{M6u+D6{cz*zY`UTeBVID=2I?Z10g zTm!bo+*N?*rr l=I2k9Jf9k$@tL1*$) zus1xLJusdNe`M%E65n1j3gT&g(cI*mPSlva#KvER9cZ-INI^Ro;!9ndicM>|s?#a3 z6>JDR*3S!EiTP(RCp!3DJ@>IpT_JaoAzb)1u=*s&_V{)@`(7}!3#*9IRHggNZ3jr{ zgN7Xu9$L*(ek;c?l_N= )8U3Dy$xF5)3_U5v8U!OR>+ 4FQ)t7BcFMIi$#ZZqrb(#X_;|d1TfM*rVPr>s#`oY$z9BFgacY%yYO2 zh?3BFg1$#`gsg|Wjc6c(CkPUTNXPYy8Y;+_>W|-n@iRkOG_N4?_(~3@Hn$w>^(`i4 zU;_soF9=#fA1`Dz@4ELWqn~2D)jemJlvNU8&BFVtL)3P#+Cx>u4kg+tb|ra>NT);! zk*mw~$7A2xFVR1zV>a`zeZArW#9pmHgPb_}>9FN0QDpYcOZQz)Py5uvNKb_BIdC&j z>(U-{!|%Z(p=ztcdivleAZv5@6Uf?e?}yV_xAn->#pl9=n*%s{j1elYxM#8_P!;$D z;VaB!J&EkFj>w}^?BwCOi~T=Eq@9yA;P3L<{y`vV)dO$6L~|%1(A@4C&S&PT`)#=9 z#xaF$l?MANQV!_2h|oZ{(+f(=o2U85;FjI*h}XyGR{+~F2qv#>Yeqm9_t|7`(^B=J zq%IeGl)PhG8?qp3|HMa6VjRBNu5Vw3K`G~97pd}sT7J}L^O7t9s#7u^=jBZv0lv9# zQn<%|($!yR2hEM0jSj*{+KKoaJf^)uic)P<#&l=WOA~eW&8|)n zM~2*;&**09?dk|eO$8VRq%j68AZaMWHiwxkkO*sQi1WBY-YwJ#GRp}uLr7f|pC+M7 zxYOA=0^NM{O;T!Gj@j5Q^0bYK#Al$6_ZxQp6(ceD9WT~7#|np-x~%)wt_3nGmvtmP zgz&y|zZBUYb{;p)8?x_-E2s~SKQs4e>JQ@0ZVSbLl*8gr%%8fPDWHSi(0j!b8z}yT zn7;%I?*BTOpK}Ky#_0suJIIm3SX4f~ug4{O 74+{(_R8YkrWMU%PSc7Upua!C20^ypOv^0UexNfNZztC3 zjTroK{$>~GHGmVjb40VNRvIT+^e%$uRPI-K+=sQZ>|%EX{q`DJ(K&lyUqq`W+l4lv zHrC3*CCBu^R^d~x;Kk%`X#Pias&<{$E?wz>2 Y9~xqj;W3@ zoe!NoKH+UrarS(6P~z!{@B?<>i;P`$7gjpG%F_eGPgUh7pnVG7Gma0qW4rM0G&zU? z7e4`)rP|; X+tx^1#|G1iyeEi2gAAeF180JrPF2@5f-J(mdDKdo|{AM zpQxT;Pb&uZ`794k>k}1Y@%z}5Db3w-xBKkc*GVOM&8`qILA)@~KF=>-tpEn%2I@*V z=9e6#ji+2UtzJZTI;NE{h9Oe{`f5EUe3sW@4w>l|hQO+p$%Hvao3#a2 0fVU*P%WI zRq9PR++ho=_7qiHY2G7t8%Mm?2+GC~OUIIm(qk$KglmO@ZiX*|*aXNT((> 3S-GqY5d5~V89Xghg-l2n~`Py7o-`zrRx8+w0in@&lKTx=)3{4aIIB4o`C z&yqE(y!i>+{suv M9@u1w!g|Es&0rUI-A)CA5NcRN}yapazK8MH5| znN<@({{SmpPFcP}yRLU&KtmpR7LXlC9-k)-#@pe}3=8Lo5ss7YG2qcO^3}9imz IegbxzQ#G`3abL`&U?sCM;YvemSqZm6z<={bO%lJ*W4p5|X6 z?Z7J~QH6W#hwFF7LMqt3B6uDAC2j1}*i#*ej-6S(MUf^}H_!5EXuM#~XQhW9WQN}a zC&?O0ACWCMW=$e0bx1hcZ+uH`Eb#f%@T Xnt?Jxk2;?p1>4u-CM3Jf;3gxR(>_s2Zz){* zP{b_3<_(>Ai(=?6hly=&3m$S%ULO28IEUJSD!FL*CJYvTbDK>q1bfr7QeD*KpZ2Fk z;xRihsUjIoa`2b1ZSsS{1qE1G-&lSdpHshg?tkqyQ``j!_ez!K)g+;M8J-{!e7m}$ zXL%bCSQ5|XW`VyNTfP7gKo+*^sZjti0vSak5M9O(EH#0Cq`t6*54~gFvTWIho(1P0 zOM>%{0 SI|(^U`s@#uU^!!&Z1SZ5IDWk0YgS8!JRMGlPJ z8c?%JsK2O_yOQa9xlTF;`W!X%`U<4dD6bn>wYl$!Tsz?~Yo(TV=8`wNRYlXEy>4*d zh0xN6gYKK27@uq>Za3z}SgnyctSwNV UXJ_ z5#ip#hJ!7*T^ZY$MeiiX1ZH&aO-d*j6r3tbP(>bJ2wdVstlS-l4B)8k>p$K&obD-B z{zWnTR%30@H%|5>OyY4uZvWe06Md{~8F-{qfu+WI00!g=xDiX@d9ymX&(v2{d(bql z_FM2vx;!ew6XsiwQW-#J3 wq6dzJ$6oibEg!s hMO1!J2u`5*6#(ixEEhKxCizR{OKPs=DvZu z`$;)xiy`|b)P>2eo<%k}^7`>iUmReWn4k{_>Ohom5+%?ye(c!eV;RSS^d*nvX3Z#N zsQM}wnIoMNjLMBskV&^X^dL~cHPrH?VWD{6oU)Ig{=BMC-2Ty)Z7Spr8~+SFQ(lde z^{BrJB)~#?;rH2mR*uV|1<+%PF9(0L E2L6+qd^q$SXs5GNZBV71g7VS`O9)Bn&~Yx-R6 zMfMEm;k;rTpMV)>@33JflIkMecg~F&y5SN_9l}V71s>q%4EvOG!u9F?Ht>oKB~mSx zcyhT_`*)E~V)Rd6jU8X6{zRj{wk+^Y-Je`dX|ZzRXPs;OoA5K|=YH1tkwUvf8*t9C z*SQo##qJ3zA%Ej6&2|nn+6~<~9y92@rh*LVu;NAJVLCFW7abl%l}tE%FH^FH``+49 zta+Kp>biC<#Ggu5lr=@YqtxK%yymL-@K2G|+=m|-vqCACZ?acDP H&l1a|zG zJGFaH-kh4MTGxxHtCqYUcwRm_(v0^|+uTUhdY@>3})BFE4racI@?-oMN*-kAJ{mwmq;YL _MZPuu@Gtqj@zyRl)gWR&T75sl=yho0Ij|n#c+XrsO$b_!!U 0^XZwp5Bs29j 8 z8bNig@9Gs=#W9$Rlrl_@dtN&~*A2TV4@Xzb| 9WTr2kr{5Sd7}WH0{E(RC zii8fliDWw3E2l!07EBvZZs8@dmL2q)%NU`OdzR*%lHR%u?4ZlQysMN|pFa4VoJUjc z;mH30Hv$g0TkOP(mrAits_!dfIy7H@f4@ZfMSY+~KeB3#j#*24FqN}%Vzz#H`wB#7 zqrq19BJ292@Jo0nDQ-#2yJp^!1)p$QJAM=i?(QCzs cYjJ@QqSlX z0t2hLa(RZ!AzEZmtexhh0%hS)ImPnL$u$PggbkM|hP`*XSBIV~MYc}l)*%YJpcVNV z*HZL-%>6Pud-3)PZ*NAwd}xS-({}vxRIb=N_ 4wa-%*FKL863rZ|HPaNNu;oUy9kDz++ZZb0n%lk# zy#Sycs5^~~T=@;7Ty<@`2nR-1E4hCj^;qSNzW@8u<`KxywX?r>A;V6SdJJm^Hua_&XK^)4~^S7KFcv~b+xt)(KV|3U8E{3*yk2aeQ_GAXfQFECw zk2oLd7}cGcT17R~H^TsaD~eZ#d^+(kYrw43>=001PFbRDdK|nYK5>$!s|NboIFAJb zGvpRg_s8lh2VX+>m3lvmVh=P)5qsUu2_*dw+I!QtA@t$=Wr%!{aJ#o1AIx^D{miI? z?mVV>5DbG2pH&4>y!zJjgKvAb|2-WG?U+W#5LD3=Z6>E8C&+$SA^5Gihi#ExRF%oo zM0pv>HWeZ7#-|`kCT3DiLkBlo!pN9a%atv&i9jq#+rG*-@L8mr*>E$+-*h|Z(#Q2+ z+B!KQ#qE3^*|;Mb(0RvfXmW^S^UtjH)xGZO9x2I@5}WyRM^o7Ao@>P&Z{QE%cez_% z826Q=@box76WnOR+T5{DcYh~dUszy{7fPv4%Fvq|s5TKoq~9d3xA^~BfP?kO+3IBN z!vnm95W~<0eTcxUnKwtQ<&QetMT4Q($RSqI`20WjZjvuRA}5l7aMHsa92qlC&}36c zs-dirUPy7LMHy>h8_)HbmwozVQX8(_V2vekPA#k-=u|JJXARehmwMo7U1rnx-=3R) zuyTS;vH-(dIZlmykqq~6G=p?O@e96v3a)afX71aAN|;3tJw-U#&mouFRhR>@zS+9A z=u>}Q1kSn80M{O-y}h+#m$^ H`Q@ z%F0_i0M&s+yWOXq>`i_$b)zxqKjZeFi!M#%wkUl_x5$<@S)XG%<~A=f`O?KX1>5x@ zhuBPx$_71$FGfh^w%}^hWU0$f27f5oi S1O51}Crj1#|&HBp8Kwu)k%Q=Rrpm`6g>{40-ifgQsN6zX?n?zyvd zif={H;WE3)tCNoMw+sh-^OzJk^+gx#qBU0xrj29_+S7;0JLH@!SxA9V<>MT$bIX8A zNz5C+-mfp|cJ(@BDNnh_9 J5+T(zGx_|1T7x50enJ#Dj?485JBncWSei|IH*RC=o{AS&<>z7_MWF!mn)q3)8 z3H2|%>vR)D$r;_BpzuFNd%fYK_gTxV9E;uXJF!MD=|RN(<2Z!w<$>y`iQPpjg6dks z`m=8HHsPbq&{Skor@T|eoRgeQMRTmIgD49YL_QAsk9UqdGA8XVa FuyJPwRj#3>1;$R5cD zUuFPr$!=5&y2#kUvkIM)*H+?lcI4JARruA9f52`GjxSJW4n3*8dJuu+bz}Sn7hnCj z6sD+#z#@!ZVPpMC(%#SY`K(GzTN$BR>!dG*@ERDzj#3AnExcBs;Wq@T_hb$R9K&j8 z#k^*=2YN3~-ZQ-?qJt=}BKy;(`+=$7eZ1UhS98O-v1)Zx_Gj=H%n$h)f8gu$mc^!Z zY0p19wZOk6-xwm?U^f@!KH+iky2_oXCGEwW8#i%cgRGKUgfw^##%7JvsXknMEk9X9 zj*!=eHxvXpogVmLja>&Prgp@nIXZ8I3=O-#EtsopSplFYxjFNp?NZQB)isjt<62u{ zVrxdx7S-TeKd+ Od1c*PVZ433YN+5ypL^55dOTWzD!0*ud8CGuaQa3|$%_7IMxD=YE)|s)Kw{3G zyoIl>zM%D~7ww@88g-Ip87VSYV&xVaP5E@)g<;#Jt&i0m7l5IV7r)<;SsqDB{Gjen zWoq~73#XNJTLWE^1(FDu!$SP_fbg5WWsVau433e~usdS0?EC)`Pnch}?p^yk;#PU& z->fxlJ79h0@|tv{@xE8^61el#rys6+tqiYRm+0&^_&ZA1q-&0SZvKAwL3P-H`bUuv z+<3!}kiq0xGADl{^e53=IOufqpSu3MnnXIJ#kFe=^t`)9X(zYV#;XhADYPjT*&kDA zGpTX7i$6{u`!FY-57*8i5~`LM9R=Y#sGU z+Q>`5s%pA_@yjyX;}@sS Z=SdodDU}RztDF31E(r^-6-mJ;ImrBm4ToPys+j&hts#@)JicReZ<~UgA=tWs# zy42%raX!K4*NVyUNIs2sA=a6WK``R3!X~d|cxszHq9A?Q`q ?yweYWxOjcEUPr z?z(ix!HErWWz4}hb}!_KZ|!yVlXtLQIYzc5_kOlL+ESvS`c@h`o~^=iOzY_qWM{W^ zQ5rwWFD+Caj~zs=b8%P3dc+}@Cjwuafi(l52D&Z6Id80Zp|1MM(dKz7*4D)r0r+|T zGZdB3+9=8fc;oK5QRa$VqYRXEr^|AcEuz^c4)tsOi92q8RGfW*oG5^OBsWH;%~VXG zlb V}FFhEPME_0G3}Q;Agc}r0iCws6dV~o7V2;@)Q>p-lE%_ z4xls_21=vi@tC|6jJFH?FRHBIUXe}4R02s=7%@&*iC@@6n#$F?j4{iz@Bw5yKVm{H zI`YFAyP|5bE*_9-KWSd#$$#z^19iFYf~|Bni|>SS8tv|BsxYovbpiK(3goxeL4%)@ zm(xx@AdF=bCbAoz{lLDvYktY$R_*ox)StBH)=4qqIcc@&IY27qj7>rJBZgu18ixW| z;1fuv8${4Ba_e-OJ!I%D$PIsdxJ8V#qeU(>RPoGo{)F3}9gZx2JoVz9+96u(b2Q1{ z;x 0sK+9P zlvtI7U>|CK)4r>;_KNHuN<#J!hgU7*jpF=ZGeW<_rBoI0I(gUU0H^ix+cI2FaLmw! zU9oOnqGQI&_$xRk$q!r$KQ-ZCgRJ8Pmf4%UjfJ^CQ&MRWQM$Z36Z7ByiRZyvFWY^+ zM*l*#em>B;-t?#ExmR; CZ8Q5@|TqbSm z*KrHp2)TyRwUAA!ZAf7-r5$e)QOv#EtrH0rBKOF&mCo+*$kw2Yw(!6M;C*>>xpM>y zrgcVSA{k7xs;FHtW-@#VaE`BsEE9d+StJgQWSm8~VDokt_&-)odz^a4-Xd3y`#^ zE^R XA9(p0?F;WJ9uF2CN>6VaN6?wvLM;LF0=RlPllsC|$O2IY{cKDGlg}4j zlEpPR+U`gUt;ws;Sf_$>ilY67o!H)E^v14PuH@jgLZdoCV(Kh6-5(-%LVIH+n=8xT z;J^N0fyHyq*)O_4hsQBr*98JdJ!nh8@@+Nk&WrR*T^&Af%eV(%>-L*QI;SA}Tc-DZ z-~}NfAL?aw%y#t-%!O@0su9;*p>~R)x%&roV48vH3)01&(2C>34j{O7tZZb2!#dP1 zhbz0Ph!*BOI71<*4X_j!JEi%8Ni-ZV-h1nx{RS)r?mOZ#hhDVjn9Z1kLjhSbYZ4yd z7~g3w-tYqXlwFdRpqwABU?MCYgtSIvg#;F?pfJC*-07MhoyW;)DZ}NKTnp2l4zQ*q z>D9I$JRAYU*${s0vH#HgZM|JU*uu+4894}x^f72HMocHlPsiU{pb9|A8lWBl_=;Gm zr S< z(tZ=G5Wrv)1s*|kegF*%%wa-$?}3MBrLr5hpkv83(SempJ6J|t&ahHKaCD2u%t zlEY6Hf}n!M9*JaR#=)0#@F$u?6`0k&gZw#~j1pnQ_)2_bdk*L?e9WU8pl0YK%GtAa zISfb!F6kG@KZ{z5Xz%hO`nyB946@o%^JD^2eomgtlQaSf32xn|++Iq63p*5ZVmK|6 zX{#8tNsG=TO#qe#8?+gAUgQBt(=<~DhoZ&?deYjwD~%ESOu*p)(WI7kYdeuQ+}050 z>mK^Mpyj+F@126t^rpJH{}414`D9R|VE*}16MHMyaiYwnP%nt(>U~*MIuk0$s ;l%-w- z)g$ZUjT%iU(-X<>)kzOBZ~WTqKXj!1 {Mg3+mAEI$10n-nYr`gX;nTEgRX+kMIriU7>Gn#$i5zjyC;OA z&Txdq5b1Tdu G6dL0 z0vp-CW^f$$|Jz>W_DL~D_XN)|n-+ODdLN0(A6LfYsU2VUCNFx#V5dycerhXCvsun= zCj9kTDS4ep=d8*1lzFz$N!M53V0)wGq)1u8o zR2Fa9M#BlKcXLRIQ2 uN(Wf=q;9IqdVarbb9-hNXi$7qP13;x^v-9p)&nE8poUhZ({ z k)KRgaeIDpp?ADDS%whoEUMt;Ya{WOJI&zo6HfK7q8MBW>zM z`1