From 74ecdf238a200e124a9ae43702666f12209a5083 Mon Sep 17 00:00:00 2001 From: Dylan De Faoite Date: Thu, 2 Apr 2026 19:30:20 +0100 Subject: [PATCH] docs: add database schema diagram --- report/img/schema.png | Bin 0 -> 65132 bytes report/main.tex | 32 +++++++++++++++++++++++++++++++- 2 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 report/img/schema.png diff --git a/report/img/schema.png b/report/img/schema.png new file mode 100644 index 0000000000000000000000000000000000000000..a6e29853914378a3b44953e4b44c34de600cb404 GIT binary patch literal 65132 zcmeFY2UwKZvNj6XU?Tzz2uN-~5RjaaoRKUbNdy{bg5;cY7D=$GThauGqd;1*>leQ&-w3u?sJ|!Te{b`z7=ZKs(S0K>PU4}dE5)+7tqkqaBnEc zXrQ5;t3*RX7lmSh7TWP%GBh;mau-=$7h4Z=D;p#l1CR8NPYm3gmiEpr3_LOn+}sEU z2X-?ngoP8r)|uT7=>nR-bA$!b?q>%TdoL>+8w3Nl93ML;c*LZFFtxICv3Is);E@8~ zZ`ipYZNOj94E|Nq1pnxQ|8sE~aq$@mFoTbh4h}X*9i)kp6&PKPk4J!=haWUEDJf{F zC^K+NgU>cr)=2P29%*WAk9tMg(#hTyw8(Ms^0RZI{s$U05#|Udt3M2ZTB#e-$=S-@ z?#E`hh1mJo!Puw=&ZY<(!RSxLTPZoqvw@V<;DUdm9%k zhktA|wYRfFn*Kb>pCcliob28Iv75QQ&ClKa?Bf77{tu(08Z`eTQdFysm6;3B1(Y%g zatr)e3#wfKX=P#gYi2Hfp&w6d5x+YB+=;U#!pz?N$NPUel^=5aB~2%LdobP~4(*SR ze|56;kVe{|6!MoGf6fE+=D+^#Z_;r3?LPdU40l(^6lo%Bq@c%RBy>yKM#zkh%jK7P zIUs(Y10WVpabcS|c5q^1MH6m_odKr2Dpk0WtI*tq^YYzA(A8`MZ!_aC}|dc?&EB*pim*#u!~ZQ*3^Y6p}I^~}k_ zgb8TNkGucJ56nOMJ0Q%=ew%~a;m6>=)&SOMfm(~JGr0P{77R}JY|TF&{c3eVm;eF( z)kc0T^tV--+uOOIwgvIL@f@>}z-#@|~|`i~O!4OOjQ5C8HF zRO6rL`*X{mruxg#exDz8K0hoeY8Bd&8qx}q8oyRz^4s`GTZ9$R(SO;;0paZI4y?D4 zB?9Gk{$*cNCnUlJX=a1~I)dsbBdH~;bwfq=*UW#p>c5l$s`0N*2i5*Vv3?yTH<$-? zLy^DiJL+QnYeV(Bxspc$SLfmclz`Ln4NYkOwxe_h|-?aTj|eUnoH{`ZF=2FBbDsPCU0;h8sOL)m(i!$4`c6Zile z>R;G-25ue?p&t*=tUI`4KgRvXouSOipKR>!Ehuwp^gp)e|1UQDe^a>sH|P4BgLJWS zL7}>T>BIoGH+8ada5;-?P(8I|b$|2Xzxz&S7lex|u=W3PtRJ0>tnAF~|E8y@y)B5; z{+09meQE$etxSJTt*EJ{icO#@Z^8#;{P11poZ1_8M}bE$;!o318IXmDYNYFPoz+Y z`)6Rw1<=wTV-=*GnItMm1(AxZhP@q9%U%Ux2SAS0SqynQq@ZAw)0r6Efb}>-gFn{vM|_BixlkSd3IP6VK=%WW{`eOK?$qr8 z$pc3ErPIH393>Ah$8S3RYbNJ2HTn4#Y6;+;{tepvyD9(a8vS<7eogt~F#cam`4i^; z2E6~ZWd8d>F$jE768c|I{9gpcNH<_j{udJevq$_LBmR%U!#_aczx33SAf{^tZ?fu;3`h{6EHOE>^Zk0L5$_esub0TH<%u z^ap(S*QoD@-T3>>{V>UYv+^?>_n+xw1gKHQJ&riVP}CN z+ff4fo1SJ?&K9nye8hjE?_GP~fc_Kx%#n!y+~m#(Gdra7PayjrEYuD}US~MQ3Pri2 zX8$iE-oMmVRHM^B-)2{QnN|^8FLy<^ILJ{(_(X{fPIUFBUg1??1x%e91t#j|V?rK&7dF#0;dSjJjxOFti)MO?sfOreoLMA3SZZkM%$H8+*mH_B28J zfudH0LP&z8=2!(OvxXV=vjm1`HUlp!?&d(B$>u+(fGaX+ja7Wvt>0)S>!advUYZhi z-e9HSnD*>-{=T$5vERF&vEjtRs#iAePlt%R=6}xodp*YcQxSQ%&Pm1&QW8)oI&BGFpz$3IW?DET zBmf4(z=rj6$YD5WC1^vg%seNaqTDcuy$T7D$e^9!m)l-V-l_cYnmQrmThvX$j~^L{ zp$ZKunD@R&Lt7*y^pYbRru|RTlZieQC`JUhKo}sZJ!b=h*XFNa5IQ)2ef1?PM52ve zot?;_%q)`1Z3H13b9}VjH?Cvkd&}(Yoc7-I>50Yely~v*cAt2w?aKp4g18tsJ1+|i zLkhkCo#&w$b~EWbP2;X_X7&9{=)iNTro?jzL+Z(Wg3Ek&6MPRo=Q7jmfMvX*7WEp* z^gq#)nPwpY@754Nxs4B!Im0go(6(xJScny^wOl&oLQ1>q9lWQi26xj>xQ*WMCIv^HWI`>GjVd?M^3naQe6y#LpC zSI3n&-kP;jI^Soz{kr?PN~*c-SVgJ+tGjwjz3FSQ;wMj16i^b6(}p}(PBu|V<#*+^ zdjC|)H2N}E(^iFCG`ZgC$?=`hCz8RdV6w6dQSY$=y>bJ?0=fE!(Kwjv?|P z&~1;QvgWAU%Z{cN9eb55>|QkKHg4-S<+(I!o@#48Y~=sebz^FhE5g2Rzm3}e$Wcd) z2BlJgF0?b4JtS=Uf`)vErjQQxq-*63WFj6V(G&u`un>#hG%JgA*T-vhhwG{mlm4g2 zY=&5KB5f;Y!`eKc!#3;3JHtjpHSYETVx}5E9y9&&_XyP8rQkFK5=pk> zuM4T%Cmihxv18XpN^@+>-Z93gR|nv*)8UKlJ)!cL34Clx)g^b;dTh2i{PxOF;ac@d zQBKufrL-iC6ug`u0$LgQyvpUX#^J$Aar6x9)eMhp(XSo!VUbu-QY3aNDZHg$2J>q$ zXLgwdDZaxa;tpwe^~f*KN@h@?V%~!M(zwjg!{4Eq?nw zh037;-EBaYbTliR`Yx$~gCu16^sxTaxz@7&_vHHB?Od~1IDb7R&ztW59i9)Uu&Ofl_3eZJhr$-DW5tI+~eC1B43(e+*IHG;Ty z1>cK;#K4VIAjSA1AWz@{jum%mEKBCt>RAl0;ZajSQL$ zv`ej@9B#PdD3HY8sdgzPzNVdYDo<@S_I+iz@8J8IwWW+*-M)F5Y*mZ|9=2lD$;%6( z)2A0Ekvlyr#r5k3*N&u1OgBD2i}A&eO2%6)+WoiYTI=%q`3&EB_~6z>xRJiW^?=Jv zeO>6n*`X-*%~Gr;z^IClAUozy7~mB89#*#NShqKab2$G{jm}!bK&^z|jD8Cog!`C& zMJ-3|W>8ka?2Xx;$f43(FSW8#Zsn;r+Iq;<3`fQadwipXaN`9^VX)tC=z~QU)>{l; zps5%ww-C0K87{gL-8#0IYQKJDHQ*%yZe3j{Uu7M~WsJI-z4Fp0E%O^O!t0x@)r%|` zLRXj;zFh0vSuzozNraxJu?G00ShiInYmdHmg~7YA3}FTJS7LNHsEte;%RfI)B|n1I zK@nK(i%)1$t!uw0M21MH(yPnW<05&LRqJ2ccnJ@o+xAAM*f8u#T)#X!EguUH>%>dpEH5e0r&qB1^S*)>LVsg%cGB)YC_Ya za9w&l_(wdd>mPxZ3tKcPQ;l6Ik9k&<3x~F}vwas|c#MlNR(p+nDIy@M9wVwG43}c; zraaZc(Pf|Q@;qn_(BU&VI&lx=Gv}<%>y5g@>(RD?nY?30yaZ2)2=t9Asv^JS zDWCbxyO5cio3EGsgyb;9?_|bilGJQZG;jM{zX=p9I`qSo_lE7B$AD2%ljqi0_{z0( z4k%>*>k}_k+Bkm5%%@GmJ-1oOIsf{-Xa#dBigh&~k^5oqfmMg;sx|Z!d?xnizY8of z3Is{Pg$d$D72N6sdaet@`ggAhPdzkehA74cKqlUsCaH*87X8@qPtbJcztUtSFzkBk z^hI^I2-Iv=dhXh)(6*&$gT!&n`+ZKg=74SI8 zbdpzQBt~5)8)beEoffFp)z|9_$y%y;AMwKBewo*5rTVg_-@ZS^^&p|gEs~cSPLqAY zgkZ9u5ecVZB@%t%blFZc<;P_L^S~ixSm@Z5dfP8~2OiMD5qVELUZlem$S}T~VUV8- zM+Qk$VOO3WZO0xTZqy^c#*xdQ772%N;|JEC99-LGyv5G*{s~z6JP$@exE|>e50;l3 zZJZ+H0(k9s!{7E(w7_c>fys|7+69&tRFh!bG(;Oi}}50P;BAg;boL9HwsgXZn8UT5nc1e)oW3vG1kGe4O;E z`00LZ4jg))r~l|!p2j!9fszmHQi`(K7;Qe*hCW>{q(USbL+?L0I%5l9(*gc$n+iB^4}9%s@fixAioPhL2;4w zYuYFKZITjrf&&d^*Xu3(loHvaGhU;BhFh=DQUMs%v6WayHyn@3;QO;g!!JXtQ6y|m zyCv4nD>M#6KD9-cFZQJ77JNY2@uIqeySu`~ zlb^A#rom?S-6uVBsl1l6;twse1gi_zLnXe`mb9T?JzPwmBD3JGKmGPWtYhh!sAwDoa!Z_AI+0Vgp6s#s z35o!Bze0s5;~_HsG=6(oZ#SE8uvcEFL+2?l95D@eE0cn0pHh3TmJ%2|S53dmre9Ig zn=U-Q)lNh6F80yhLZZ>?+ubQ=S%C?M;GRtJ>9!cEm82fiSkc9=`4T6+0%Dy@7_J2@jogp)GclD+nYTv9U=P4*x6;KA&|dF zqMV`)O9jH%I$P^uHTFqt``y*dmi%lVa38-?1}e|*+I&YKJItpyXPXO+>ityrdG3D9 z>lnWf)KG;j$4z*Jf6S7eg4Z%G>&gL$4TwJ8*LmuLx-11(XNHRIjPDC>J+m@;;;>2+kvzmaxPF&rf{l;>7FfO+ZHU0J>< z+xQXgW~rN}QS@GDxxNe(K2}qD6lG1WVT?9x=n)YK&j5JlM&ZvCb96Wc0BH2cxq@ck zEv&m9v)vInr~H6uP*V>Z*0IZ|S5SFdts$M?Hf7uv*ozHZT$|nXNu0M+T&8U!AP}=* z;zR6{<5OL!<5R-9R=HZ%#Y*Y$vhp~u4i*tDLE@idDy}}Y z^gOtDK{T%w65y_0?{}<_|NaQ8{~aoxfxK*bAK@L3vZrW}89v?U0)^S@kNq@nbaOpA za_ESo4a>F!fb>P$^Mg)z$i4nuGj0*$?5jF2G#JLcRtjzN3s*9CKcoHR0$$&fxr#R| zIezcP*7873^b@K+k!|HlLGzTli0-4cH`8*RT)r_A3GhI-5DMl!6S!0 z(cKChj#>xNt|YBKVLyM3i!JSP3=4q`UKn;|5A$y2KaMhcM|yXm^AUEcqrtf#E~zbG zJ8jn|s`$OXufDSF)?Id(SHD6ZDFcJBr*J=ie?v=$80cXqEYN21+ci9+Ytn+wCQNk9 zM9qlCAk5ycVYu%%gAosQLG%?~eovVw0@JyroyNbmqk4tKlJ+$o&a)7S6FT*bBWk~n zEi3WUqjCfn86Kf5jD?jU$~r6JkS6c|s&VVPJ>PBroi1wTXkC72f^GxSOVs;&MGyaY z_gpAbZp_s$GwSv2>)wJih7d!eF!41IP%YU%tRswm7@&E2XoSb1`#?^bI8>jbKb1ez6;C?$f>&mQL6i>*bcF z3p!?}yH9x*iG|;)2j-le>R58mxo&wrXWw?BlItCm;KoBwS?(c5&hVI`n%4@6lu{D0 zbdY;e@Ijx#ye%!m%jgBp5oyZn$Gg+^z;z}I<1H7}tUJ|X&r5eDatKtAKW%mayg(KI zJPO^mktIGAy;W>D8S%JNYH%qTv)6#5y66mj3q?yj-}YYA0nTOVLPxdxVt2Bgit;7o z9z6%}l;0gOST0;yZ{~GbR;S=H3F&H*jh!i6H(zTfvq+mABkZuZeO&W|Af{;L0*IQN zE`g}Yt~!$-Q?Hk^#Y||@^o2iA8)X=vB&44JApRP#0mzA3URux^BB4hYuzf+N36`=h#(h}P{&@0@_JFeX8DUTlZ3SQzndk=-tgu($BOY?r_ z1*eT;hm=ja-z2vp5Jgm`CVV<4T}pNDd9iyP~Zd#oUPa07EOjJaAAzH!xiZi zw`gPx-E+f9F@7L30D6c3VnXg1mfhiJx|YVPIt7P2^4J@`qUJq?^%LQsa1nrqOag!z zdki^v0L|C$NrZg<_=@1k>C)YvZ2K3by07|ZOa z(n*oTe_CI3(TgnQ9;`zc(h~T7x06TKKy8}nr3GzVD^$i;l3~XDbIs9gIE@Xs#NPpN zh5SsEFkO*TcWyy|Aet2jy9&Mu*q29LmE>B`rxfVNbPB)wJ-=HW3_`Oq8CX9R?H z6rLfiQKYv4v{)KFloD_}{C-D!JB*#eMTTz=y!Hpk z)I_#I0A^`MswHtY9>bkKHs<>J-U$UP z2?xe#+s5vMv)b(vV@WCXDW7eXR3T^crt1uBK1W;awgcI+vi#?VpD864>1+VE^v1bY z$l~qM^8IT?l}*=OmS@U1-hR^<_xKb&OyT|qs7T(fG@E(4>wjtivx=BD8NSixS8!Xv zZ1K{zg*NfmrJEm4pXR2!rI<Wc@w1MWAL;=jRP zGC{Z@fdGH^VHZFP)xRwgelVkdfoKkM>txOyDM2)+Nl4cizV)i2nJ^8w~Kz(Z-&Mvt&GEFO4z+Zj96aA+CCac4@LY;C_dly`&rzGfm{615fueZI2 z;?zWUwC+mkkB`qZ22bict=Ud=DVN2n*=AL&s8W^#$H*^ zpFB`vj~u)b{59xeijtq&Ga2Bx;@$#7soJ%?Qor3RtSb14T4nx4ZpN27PI)Rc35KKgDpo-YI;kQ<5#Mgfw@ldPVFuAXuY`;U1y?J_`&!0;vp zMP_&}XN4Qobt!z!;oVkng5K)70V#Xvd0ukPv-~EcUT~$L{63A&>6Z}*AhI)UhVQuV z=v9*t1pR6?vz5ZqU;t)``hlzQ?M`t(+VEYUtd+VYESqDB(jUc2kI&;sYh?oyx;DDqVPbylR$ zRx4@x%sZ)vp%;U=L(47tUIU_>ylFxEwk^_!D;!0~$CY#L2n(-{A?6zFgr)dwU$hf1 zI^AxRdI@3@yV;P>oX7MDcCSax7s(W|Jw2SU52Buf;A@g|e{(;ninc$ylpz+A9Eas= z-YzhV5259hiRXnjhV-yj8R9HIRKG*vpf`Fb5DRvXs zFEN)Mc}UrZBXdAN#pD{7U1&UiG;Uh@0fbD=HpF%F+f`+a5VaZMwzqkE&>6Z?5Opa? zuj?^w-R3m!zMKjIX6O6>dCf3R?{5S0w}Az~mAqWeyC+QL11!i;v61-F)XfAv%6d^7 z8^U6=jIJ;isc)5zp(;HCSBy23Ph|<#HCNWExCJRR+`Ds zfkC?AcCAP0xr}Q^u#=WB%9b|x%KSss>+cHB%?59M8NjYL`l#l1#}^2iB8a7lmm=UB zLF@=?3tgxuE{)j4*6er8)L7_roeB)1U1}ohpSpPuBYawWXd9@5MN>7)B@6~hcp-*e zHg*;>GCs223ZymYYvx9VO$j@K%7BegJ$E0zd??k>x)CXh?a3;*7c_U;nYfW^U*}jO z?}N@ok+1dQ0b=+RTv^S@0a;9=yKeo<=cjLt4ZXb8WlYCfl9ymf4bY_zt?juT(Z*U% zo)e%n=|-#I6m40HnB) zi)gb~aXv_=Dhrv9vtrx`$1aDFgo@#-@E?0MrL`tHvaN|MOD8ZwKCT@=pGrss$JU-4 ztSmzm~`BAn`Cs8Vf%X5^PgE_ZtN-f6ttXMQXUJ=pwcwiLI!qfx@x zdH&+Hr-!t9Nqbzd7ET&Q{KkYy=87mwU5?5b42!V_Qvc2b=C)q3kSFgFhjs~kWlN%a zr5)NtNHy;q>1^rY2D#>ogtRU5&w4Af-V=^>@OFFEfBloVGNcC%P2(s1pinG1=haT- zewo}5a(6nTiq=xvl7n-gjW^lJXHfUaDbV@}xrn+3?g#Pkz_#j&ZH4}~_d+D}2^8d) zbj|uXo)_x|x@=6P-@bW)AYkcm{b&O%)i>#5)*w8ORLp!+xabscg8({-}1Z< zO>0#dR|HwL{WhS=4$UHql9Y*(FeQhrA1Qr|C&vaFx(H3US|7V8TWQ)bjfPI$F%Vm@ zOTuojY_Jz(JX!tdx_YhG=7?5dKG{`jS#fErede1_^_Jvr54BJj?PEd zGxXk_Mcvu5QE7dbf*xg})hw@m%-NC&4vHmd;xK>5>atg6vgqB-)h=k8XP?+joR!?5 zX^GiSV%#e^{jTDfDh%@2lG-P0iz3I4waFfT8ryA;!0pBMdnJx4`hb4b9F>60(?YEm z8cj>mQGw4B#Ufhn_eZ^;!g2g+-kpRayF?)HtNwm|KMm zG|r)sL|3cxIx2EwNC~Y{FFJOgm*RWgWGNaMqb$KvaqeA3u4=aDjKE5;$xVTjP5R)0 z28rZz3rUzf9Pcv#G$&FM;X?2tl`FZ1rAI7ip{A13Zvmtf)+F({JTf4Svwo=JqS7it zxKqqc8`lGc5kCm9O=6M1tysDAej_$GOOVFcbK~u9wZcafb5>d<@4ZKh!BLOX!q9M) z)ScMls#uXsTf0cr?KgH|pQ&vXrP7dH8_GQ?e0M~!_M9qd_|FSzUr9?;Chwy2D?g&+ zP3C_|52BhyxcZfPwJj}>PzuyY<+C>5WH9LJH|Fk^CA~9mBGZ7wyyOlwnv})7KsO<% z{&A*=q?o!1absxESfYfPpEz0mX2=E`hM-UC4&Tw(8^kuDtnvuUKq5nR(?k2J1rq7K zK6^j?GL;FLkws@ceN2M@S=|L3MfJp*jk@s&U1c%zW=nU1D+Dt>GRk$Ut7fy!ikFm+ z%5-J=!>H($ITfU345iVo;Fcc74!L!)z2WU$4e~TzcU*flOs=m}*Rh(mh577+G1bPz zCz(^|6QD%DFS_Rt_M9sW_QxA*rRy$84(5<9na5e(s4CNLQzp|iUmrcbz=QKO=~`ba zk7KO)K`_3UL*F@Rlk>QRoJbfB*oA_3Q2fEteLnmz#O~A;1lWN#5@=#K^R)|;G+VFS zH+Gqo%Dznqh3H^rs=?{_XO-*4sUJKoX6>CpY<7SCkXzHyVTsNui)E4RBnEihbpr83+IgShFYl|4V7Teov{0uHxdU5Roh9rEuIcv43)rx$7%RwVu=Vc;%3Osh_EW@ zZZs*)JS=!rs!JPoQGTl=qgjnqmY|6q!zSB{K~JYVP@$HT)iOzkRf-;`h{;~pxw$Kn z^qf88J?EZ*Q01kF(JlDJc{Z_#MGZxI8M#I1j+fE?Ccn6Pj zLr=WnpnYvj{yk!@E2v=+Q`ac$9YlB+ffz~z9LR@;#7F#=BF#A3U+-mW_0UfVKGVDQ zDK-q&OZjQ17)8g1NHD@180pqY2ApYW*wE?;29Pp@3%h~Wtvg2u4Ia)BMRTM+FO5*q z{1Wm4gbpOuX%1A+LM22X2^GtP4Ay6;ZCE|*)cYS$E^Sk zzEn2zcEkr^)g!?-A2J*kBw>~6s}tUI`dpu8ozV!sMFyxtyuP|Z31wTB(%r`1LBF*; z`o!TdmWzk}CPGC1y0T1qR7|Hqif727w*Fa~uMc|Z`$Uh$m2ay*RvKpuwX9>1hDT%A z9V8OVFc%qAIccb=Ub;^C**C##I)VolSwRK~jLJI#nQ-!x+cI|Bu1BxjH>S>_VkzPA z5`;AUd&VVUjaCAC*zqAGMA~zp&~bpk-WZ`WZI3> zI8Q433|KJVe1jipyFZ+7Tt4*a%?3W{J>i4p9Ng_GkV_hb+QxilH|_=W0Tv#mC8)~a zgWL*{?H!sEk?HN9gZX}Oe9ShcF*Xe%@irl2@smAz+3z4Myo^y&qjyLE32YU{gK8T0 z8qAAuynNVZR_V4jHZgV%Ut}g^5>&LL3i!HVT8m%CL6GQ|7zd_`HwkaIE*C1%7#8Nr;b-m_@S493G|zQTmac3UvogQx_2IG zhoiJ0uuLYv)mASi(Xs#({ZKqk-qd9!BO1Jw3}d=L?Q~Uif$393QrUgV5uYoL@@ql?}h*JA0iByto>I8_xs-05i zQK`0PM82H8tE1(%ZV|N&s=}R0JopC+d@sb$H0lO{2Pn(21+;3BkoI-bJ1+4`;oE=@ zbE}yN!ZGl>Ay%>;C>}muCNU>q3Yda;n}XnusMmRc?%S#8_TeK*^8#p5@aer|iwv$Y zllW%FWl&FbRvyRk8pysRE|dWCCaliHtC6C4%RFzzlcJMlJy$jTi@`TRfkbaLrhHWCLU6GZQ^@y8cO#3n<&}n5J*6CY z)8IzHIXs8Q>E-4zvx!BV1-a*0vk0`1<=;gY<)za+s0eL;TC#B$8COs(fB9swov$fDMzL>xN<=BDNd)UGw{sf;-^<5Ky%CuiZ4IEb}jxaw)$ zaT`SzVGT)Hq&bFdr8Z!#0Ps3-YJdPEgO296S&wi>_ zCJ!e6T(8`mq{m24ez@@Vu=@9YuE*h9bHgRf%bqKs&Tx+Pa&hffMN;_V*Ka1AqCOQ? z@@5|)e50-DJ~f5Ec*qLw$Gey;uhBpW06*MXM?V|Bwn_FhIgiD5Z4+MWq#^@-v&!iU zRBXLV;@cct_tSK0-ksSp*Bw2m=<&A?VV+I^L=}Sa!Xg%bGWb5Sf zXSOYeK{d`NfnX7g-O|9whAu36&n;*)rmr6;Vkx?iVnJd6lDZDNJ|FXS`l?<%VO|u| zW9bo@xNQC1`i=&wM9>T$Lzjba^AdH(0nxMG1ZGV-`~V8-p?kXFE}!2s%wcT-%1?0N zqU0^BKCIhx)a0KXY%$&l*7GBsqelep_nDg}`Im~Bn>yH*cZB-vSyi&{&TC?a60F>X zSXFdF^clpd39g3o@g5QT`2%6rToyr$qM={T?=1;6tv&Javs#=z?B{cbDdY!?qjKLm zlvyMl)LzT9sLT?N>5Lee$s0;du8LZSk;$&`5ku7aIX2d)M8Jt$t?rmK{d#|2?~UCg z-Pr9TlTmEx2HDgLrE!Seh&qGj%QTjz`%(zQJD_S$7;w$eXt!3yZl-exDR-vM$0tUB zFh%A#AJo7EUX+Hn=Q^X<-9(~_^DRaJS55Fp(`mv2TYEtr!7@LY-X^UsVP@d<)BV1% zFs#QeNi(f2-cW0@e$GA2%dP~hRq`FrsE7FGy@L|V(LzB{CKZLSn~ls$qZ}hUdtFie zd(y?WlZl34#DsA5aTk+!K2GZJAf;n&+pXwI0$pmuM_sI@0oxp5YX>-Z)1_tVK}E@JmUw}bjAP5D|jNEcWeN)+hQBXn6!OqQ^Flq&tKmI&6B ztbm#Cga%%+W1$^E5NH%iFiRaJgM9E5j8~6>eznZ7NdMJKf||C>#l{zOmWHz`x}_5! z3(=d)M`EuM0_{xn++HLTA)%IkGVI{Xzte%g6yJsszf-bQY-v9_f+9bd+#a)T8rh9} zi_*TB^~`)7wqj~<2&!DjE$*DN#|>)O?0M!(C#Aky`{>%rv4bxwTG_5`%n{-MNVAdj>>&K4ZgMMR6|s8?qTWo#b&bx5Y-K)4DCb2(Q0p zL=xoPFW{Nv)31}wfupbOmH@phMUm8f+y1R=8H`I@IiKr>xy3T5QDxJLiNrJ|xRH#J zgzFp}S@JM;15K)GSg>S7ztVyB77js*ZIbrO#hZD~lRs*qAm}0LejI>BCXJj77^SE= zkrlhUMT(Jmyg?*1afd>(N zW!+OZZ6@a)_ae|!epV^y7p?aZ+t4A(#!u~X*ymz*cGt<}Z%5-mDS~zD;PO(KtECJ4h03C*Ci92n4lP>A|zAyNJzVs_eA=dMUVJX>gifCLEa6^C^t4cuVS0& zrT-%f8Vn@ej5!T!O6iYi<|zg`r2Q5Mf`@Mv9D$OuRszWvx+4U}A<#5PZuYr3&RS4a za>bNTY7Hd6?#oijo2o~e&T`(6yQb`ex!ldu$J_nfxBg=kBfo}Te|+p~^g_tC)Of=L z7CyDj-YZ%y&0HqMR*`$;(x8CA3Zhjy0c#+PZzRwkP&c_HRX`TP+vm)vnq~Sek~EFYCineH2Gj8GU0D5d`ttHZwRk>JX9`Mlll;j)h`6pcbTx z&C*7wpJB9z(Vw(i7Hq8`w+Xh9C62`R_7nz1?p>B^)e8fq0j%DLlp@s8!&6~!52EMp ztnZ<`5yl-y&HF9-4K2|=BnC-ES$7ytnv%FoCro0>u!$H)KnfgYKyiTa z4KxY=jp8I`)6Q;D^ES&H3f@f+d>$bKvkqwm#?4FdG6X)!^eLpBaFVbAbWA;&>@8W- z_?MoXk3o@T;HnH9ib3CY(GdwVK_!8A;WlXmI9S(+J!qOTmqaO(%RRPCOt-T=X|$eK<;ag@tFwgaFj_p8cwTxE%Wi zD8gbc6fL{bQ2pS(X=z%d<}Ryice((4R5bz zEP%N5jaF~-ZlU#e`ZzlD#J8EN=jn%tV3K5-ak@ycSPp7)nv=SUVNm~>UvcN@E73*& zG=bz!3)Pj7!73oog?ng0SH*M&9!4a_ex{1w-4czm)6CdS`b-ssT? z8_w6J477xaU<&a8T~lg|BC21O0(iuqTSa=A%hODU$++Irl!I7a)-JQ{*KL>wKeExz z!5B#u<6Jz=|R-FIDN>_0_d z@`h5vqMzKTP^A3eSbdcVirn+2gSB>Doued|ypFsNJZ!&UcZzq2AVl@R5)}42KBgm> zVbLkFnYxkbjgbjA0~MdMZq2v?f)A%kP1~>2l1e_TyGIw4WvqSQEn#V17kli|u8`F^ zu60nSx0W5n&Ry|zUJ`O`Ye2GUHw23mLFsJ8!xK~ub4p)&j@NjzGM74jAJiYKxzS4H z;}AH6;-bgA0u>oA@`D?wsX{_A4lo4X_k)5>+lByif_r%E>SLaqVN9t6{l(J!^>4Mh zMUyMBUR;*9B}!iBJ#B)~?u7 z>ze?BO6SRHDt%LeTn*wUpgRU+CvV#4trZ!EPf>w!VNW7v^n7=}gas&cY)S184ljWC zIi4S6-=((|dHIf%BBk1os|Bl1;{K%A-+;UADB@KEX?-U8V$C1U0j~F`)H* zd7yby_L=IaSN(`>y* zTnL=(Vo$=r6rBg5Q@R(v=(o5)`W={Jq*i+v1`-y(x%oD9Bu*j+7i&gozfb%);bY)9 z^Z=E|AGOAoO#PmrD2zX?_M+&nK@7BIiFiSf8TU>Y^a|1NlZp?Gb0IyAGRGxorssyv zcLguCj_oOZl;=i>7`3016JOl zez`Pk;H>i09>ZDk8;-8xTDnO%*NZB~tVuOHkC!VpmQ$Y>}R-e4m7l<-Fuf z(5=w((p)kQqC;UYE|Ze57O(firYf-v3@g?NEV?v=R~*34>548mLxbQiF0(yL4yRD2 zkuqk(U?z0OFO8!SP}ta3$*UYL1*fD87LQb zwR;)*6^FM(ER%x*JwuR_0-e;B^&}gjD`hNu`>>VNNOxp_`h&%yl!D83`MCLNn^A7* z4s*#S(Mw9!H~e@@p<4rM%M@7&*KdegEPGm>L%i>KBu1d<>p$O0-yQ#!KQ&)G|NcP| zAyLQ$B0GL`-7Afj%)y(uh^+Hl?1p~($T!#laAnU|lWsf?3{;F?`_m3ZNbVA#zYJsbw5#2c+qO_Np=}O|S5Ys>Tt0vI!}Dm@wXs13X`71o zZ%}TtThe%Qrm?L}TdxPYfb-aUc8A)uT+S@#KHv4-f*#$gX7( z$WlhjiL$as_61=wbm9&TRaS7Z*WSDSPQz+3e)aOpL>lN*g@$N+5+f|5duWjx*Tla< z-%!2@Fn_>-jc5#pb3%mbE~V{N34EpxqqM5F|@n*Y+_uIfy=~ zWCg1+Et`z2#s$`7mm?RQ*2io6IXLvPu=UgCmTkm)%HF8N=f&@P=?$klNimQi65nyl z&HYO!7NcEpwXd>1&HhAQ0&h|b!4>_o*9!BwNG&U-%~h$icV0rXA&gER!-H%e^|M9i zDC3)&9rxECZO6TiuePqMKlsrmw0cC9zmFccSdSR*9eX*RXGDmawv#O=w zhp>p#w;gpBTq_@PV;%2emRgNe-qkAUHPMW+nC&FT%eWkCaT7luFM+J(M&m*AZ5$0b zF>CSn2s)a4v9`_qiHCinA~=a+dl&5NW_P$31|XTzx4ZQBrw32TQ*8@A%npA<9$z?Z zyTxI{te{5+xF5ou{IVk%_!^%4jUI zN62aKmSd@@!Lsg5!iT5Z2sa%xJxRJNFRKsWp5;07B zx+x6vS5U`q0S(no3yP-OMER5?KATkh3xJYCZaRnDo>0;4rwyRnYfQ}R+Q779{}#GP zG)v6Jy!N8q$ALL3O_qw$rxL)6O`7IzybmG=4HqKBUethJp_1kXhBD*G_`ONOM*=84 z#Q!u(X;Zs9rx_wvmx(IV8etWii=e;X>R9$zw(e~a>UT{YY}-VvO3<&7&oHg|Li7so zJq0$ag`5{JUr6>4iSp8&X}nh2VY(e1P%w2Nbca{l|052OBK?pPw0ORmW|TF!&oS1a z%PX~t&t{~*3JVZ3JDgj3a1XXxQonA3IHfwnIsW}@PYoDE&W37&$X8sp)sneKC~LHh#(P-N*XoH{#5_=?ZnBrO`7LF*UWFziM1wZ( zF_QG4MM>~;Z&WQ&OW#Jj2vQRQen$O!PBe^rBwMhNiRSZ3j{S=o;X;tc>K;}8t-W;P z;7e?nQoIC5ZyO?qATH*JufMo}XqNgrl<94ZjQ^p_V zFqV*{GP3VeBtnsWr?IPyC3{jSYo*9CLfNT=lzjW1_oRj3UIpT?9%Mdba55R=2y!{33U<3Ds~trv~QT-Hj*Sq9v-E zu|1@rs<${bpzv87CQ6Sk_iH* zJG0Y2ON6fuouARjl@{)kAhEUd^s{m=bStut>k-|#IY98P_UAIE@>TQ9@Lpv50EUT6F##q89L|EYnZJ;SV>|dSrYdhrUYjuD z!0AxRJkRS@ch(4JWiGw!&FK)`qN`fEsxCe%@ngpu=X9oD9&>r)p2x?ut7Ns=UA$N@ z@-WZj62|zm_L4Oi-eDKSB5j#qn7s7xXW{pSbq@=-oq@ZwvxwZm#H^bKF-0rv-=3sJ zhp+ppW5XO}JGI$1tsT+LwLCwzfe={*elkKhZ2tPqN!mhT!MdnPRmaX~wz^{xj>9s{ zhBHF3M=E!mXnWQ~`Fu|CV&ZWoUEOona`TXHq~HXrI66COPQ(F0o4MfabzyfFZ4Obk z9`;H3FSpf-9bNt1XVYI+Iww7iE=hW-J|arEHK;Iu8aTaDsItgA;@*ZXAB_0IyT{o~ z`Ih4u3!eH;Q;gAGCu2P=ra>`s*T@Yi5!-qJ8VD(~@-;8nU)>!0Joi5@{%C^Q^w`BaMgT*`_i^jp4pgz*x0e-r0P)Qsz5`pw8|{OhPrkcDQiM&&5uq~}i~;hp1b(S@b@2C@Y} znrLX-7A+5kSRV?5*wDKPUQD{p_zrJ`nxDx+dkK<-)Fa)=;4vnPXn(CTj0dCR{3{CN z>YbaxF2JeHV$Io&2gAll>@_44dca>(c@big~&`6Y>PMT=<@$aGphckud zTKg$URmf+CWwJtGj%Rp41Tq=$8{+w5xqhmqJ-AM7)_RecO@GW=_kj)_d)(QDah);6;QpufN0a=`2+Er!kM zZ3Lky(vsZfvblpJR673(T-1pta|IJwxAYB<=>I+f|O} z_;8417?DM^vJ_bAu)@gMvu|))V%i6bMZ3u7YW$&%nejx4dTdm zueN~P4okmJJG*aFN%61~bk{yB%DLK+&&zVCllj|B5w#RexO>}SIIu1%x{I)c0rhOB zyc5_i!{d^S-xCj2FgUXw%838|az+07DpX6fN}~%vh2s&M%r6&~GdTK^0V-;i@_NR}>=Et|5K4n^bPt)##&GD5Cur|DukJ1XNoYkU`3AeF<5?}S)T z2jjZLQg(_IKK>;Iq?;g|o^hud=bQMyvx7$Vj_|}2k-j}9g3g?;>nKENIk+~gLq)GmnfsBLW92g5vMUDx0 zT%lU0vpHYF1qG>=lXEh%57X(Tn>`g>iB$9OC%@Y1h5#EIK7$9l+E4V-bCtfD{#}q6 zYrqb+#XiqgK&G%*tRK?p_swXU%RUWvgU<7?+>47eDhk>(0&DL5LkP!I!;HZ>pp$rp ziWm5Xp>X1)$MN3lsPH88+Z?A`s3Vz1H^BGiG8j2@`XPVBoS^X>o+(RfH4cGgOoVRr zb@I%1rD-g;VbO=nN@xwZPeg71 z{$@xR_+<`pdWnVi%$&7+22JydjNybVJ^cCJXr_iYKm+0VJ^8aN`AIq19n!x_tZEEN z``s`Kx!HMVDci|_X9EnNH76~4gFZdKas_dg`arZ^)aeXc6w=BLem3;%#ygzmYbD_p z`Ter$z58r%H(0JJD8Z4HsA1oig&J21EK@zWIUIK7Ze|K*tMG4>I?3aIe(l+K)LK&* z5_=YX0*-3)%nnDs2e-Wkfa!=CCQBP2{@|aIqd>KDAQ28$sN@hFL8T>+#D}*3X$OEr$n(|a^ z9(hxCS6{dFM!M5kh$DbcMLbEsb$_n>jYR@M$&2O3eOI%Gd)otx((>`Zjv!B4g!I%9kBq{RC7TvOMyqR#J2dy93%K_mTm29_ zD;_qH>=5)d!f3T0A4vfioIg#CA;)ckq(>ARdIt+qM!@DuEH=>}Sny8p(0Wi{sy}a* z4EL8-9GsJfidaz^i<9xzHt?nS0iq{8?CNH;v{i&0-Adw1qB?uw{*JxRbc*LCdAM-LfA(Y&$ZeyTVRx-( zzzup)A1jzG10(ACaYQW&2EMoKjHb6{sHY`Fw%*T~0y{(>gDLTG<@4He_>b*3;4Jj+ zgF4$2uFYYUeibnbG+wue1t+U@JDC&&7-4T*lE^Ie5`#iU2natl^#KgU)bS|0os=E$ z2PK0`)PDV%Dqp>;7;2kemD>R!*&+=_5I2`?=fU^?mLRM$2E|!3OdP4q5z$t@q5TEj zcjy7>o?xD@w3lYxosdnxKkcIMxIr+7_gS~zEEY@EqzvY}+`Xkk-BTyVuDCZexnIkw` zOgQ+q(JgQj^IhL$3-_sbh#;B8aV;v_JfFFMN-oY2W9CGtIHTm#nqv;*5jImfZzU?1 z0PZUj|H_x$fOCS`LK$x#9&2**Q}YCh+0nw4Cyo6Lo*XROTxQpIQZQ7ZI~wc4iIb^I zH)Jy@{C6hma^9-E=1bVeBnnGK;YImxypQqKaGs7&@6jR2tMZYDNU^@41 z|G`s?*3cRmXxJZ;HzQz$K$YTS{(Wnjw5}JC=JZyliT&U$-=}OpcNJ6tVme*}n0jJ9 zTG2bcz8w=lUSjrlE$q6%Td7?`JJqufL@DcGOSz4IPkvEl97kIbH0zk{iOum-%@3U( zmFSXTF-QGx7SQwzSZO-B0WIZ9zy~U2n4Uu^+6c07FYv;`OUY_Z@vTq5z@+m57^Qpz zme@{iMFed7p2z*B^}p{*WAa>Ul-_Uud6AAjAJom?m(ORb?q`8 zFe``XWo@mY4oxzP_lK^KTg4oHmuwD|`5(yVUayy{Sr!IpzW#b`ZOH-DqbHl7@Ib;4 zMdXa>v=1#25i!rRJTf{wgqmVI(2`!>#-d2}Pmx8jLqFMzdA$Ud-*Gdms&l+xr zr;phxsEsflT*-?sgsNE>jJ#OeMmO0W4cE;kI;`JOtSXb|_i5OiJ{ga`t*Ih?-B-jl ztamr%Dc_1I_2^{`^#i!O*JOo~=vw0ic81_=2EG!7DJHR3s(xUd++UGKxb(Q1`2-bc zOa&KMl#FB*Yi^dc5JEHdi7xL{dO1+z?SUtOBggUNqU2vai#K(Bx|0$k7N$t&D$*`W zufozT()$boW*F!gK1wRTWAD?Aplkp~4*&7pdLyiR4UYGMgX+swvRM5l9d^qkte!SJ zLBKHbgnYRWk*>n1T4vJ)<=E=hg-D3XX5Y}xur)8NGmnBb1{jE2*Xr6GC?;8VL(%)*l0W!i2XW}`eyeR(UUM$=J!zwwS?F|maHPZqRF_|=bcc--tg|JJo1rtjThSn_GXW! zAI}vhMOh@g&4ZnB7!Mva+BMdJMxg@m>Lq;|0|Wq$SWlEYe?i+P1?COtM@6^3J%$qD zmf>~mJjUHTx0bXu^DgO$^zDWIyIzQ#%IAy~3~A*oE9a@AVS0qT)<)?qxI)~3UgeO@ zw*N5W{5pQ$*CZiHdwfUxmi~_wMsD=~))PKrK-$kuMOKttuYH?V{*W%$y8hMB&i<&Y z`t(-&McB0%IP5(VGz#=n@q~qS_k)z`$ ztvgMqGJRC$2ZQ9AB1-7xX-ZswtQNxM>+!y&ch9?8&{0`UZk-$7DArYvovel!;!5)A zI7jf*K^%2zW(DmKyYZ>6jh>$;c7gXB;{Y}!oP>0-Y4BT1n&dWPN)nvjVz)Ovo@NmC zNVX4Av3FRXMk;DEkDVg7PY;BQd62r0IXWO2F*vV<&CzBhe$Awm(?utFI6een zeO&c%8A-qLQ#QNE@c9Y3CS+KHj3k%i5cAL^hg788MNO=jV6 zufIp`n(i9FrQ(syy6IS|1o}{3vFu>=oSyGJSvxijv~1WQUp2N&D6lAKwwj1zMp}r$ zT0Gl2P{eSNE`beN{ZW0mmz)$Gl1X+uQ3nb)k)o4#D(Ls+{E8juiewjY~@#*#ri{#*~a%K0j5$op6S- zGBw*gX<)5R4~{(`H6ENL_$6(PAvo1AHDx8QYM3l=;0V%c{ zd9|i-z>=L>CCVAU0z@>|IyboB!o>=`^FEE=)IT~l`4P-S13GVJP4S^akvc;D&Cz9h zY2`ZrlXvy&Is>h}rU&c0ha?RMt$zkja1o~p4b7P_=!JekFGRghG5V2E zD5EXqaQFRuwq4wSq)3}{n`q#cr3DIpOOdf*SM2{JEcyuJnmhUmRsbCH_xkQI#AHO; zuJ*qNH!25AVlt$+{Qi5pIzd`SnXv=Cv69$_DlIP@&+Sg1rQ{d)(T+ z`^xZ0ZGpHcxF7g2(r;@k}Ru{7QPT6~IWyWqkz?~BwU9P_-Qr&Dc8p)dN0f&2U$iKF&`AI^1V;LF@^ z$QFY@R;@W?`*Uv4#3C|{_+0c;Tw|j#zWXwW5qri0yzddJ*Hqs3%H_Xx9tM%ugo0py;L{dsMOPp?dV!4nq_8`qZryF{(u54bg& zc(z<9*E;oQ(Qm+VGk@l%&9HdNMRHYnB)lkNif|Y{{?z8w?8!o+{ae7E_?TSr5OP$d z>WV4|4GBlfFdNiU5cQzVtuEG2;LA9FF`<*}nv<%vz_W!@+`(I3T(CSlc@&5mTMsw4 z*AVmnbZ-}i_}Vo17SE=6n-wd~H>hsTZj=+h7=H#l*4K&W2QrQk%}}au7mYEgPBDL6 zKDY7K&uxEw*YzdhPuL1T4Zqs#mhlVb2_%(Z5?d*YJiu ztO!3>Z~;Eka_@a=7UL_E*1p*1MOuGvp-e-}+nc?RtX$k@OinSOy_?#UJy?}e^FL7-HKnU>c`DFN~ zl9d;%v!Mo^V*yrMv#%fUsqmjru0Kp>EcEN-{RJ2<#~vTu`s6~A^9F1hwOHFwn{Ckh zJp#Sk^r!CVRMs4o3m2;J5(6A0t=%@^Z0%){!A!%TyNb@y9KIV*@gV}2%O~nQEfVO0 zFuh*@l{Z|qZs^6=~ZS|`(zxy(vi@p-g9UClt@Q_ecf9XT_FMv1lT;5wMO*54ApTBKwsE(dC zTGyxq^j>Jg{H|Pb#yKN(Mm#YqGR~YF4)h_$mlvQD=@aN802;<4BUB<5`x2@bB{SuQiP-dqpS<>HJg1ZR{%4a z=dFhl`tl_+kz6o^8$JyPQI~f%=fyd|{J*nKY;<_7%p@xxYbs{Of;#g*YZ!Qq_r5fx zA0z(|Nya57Tw{p)AJ!a9elFggH);T}Y(E>CDSo*9?@3hZ)4V&5_9VJ) zWZ?IL+UU3|A62UZ`GjH~fTOEC@8D)pd4?g>A?$1=t`=KF#Ecx$Q}UG=`rj-d{cnTe zV*l#Ml}hD82!h2EmA|iZA^pbB<(*Hl)~e4ePW-M{IrjuGdZwj}4)sPW$-NFh;>41V z2=k%3MHZex4agjK2U*f8en1%~J1+8F$Gkv$EXPL5>ndomseX0)55F=;)r+)l3q5B# zK{M%JsZp}SH1GU{vR&9@5Zn12Ts!fnnUz>A?}X*K?XCw}g~gp{+g5sNi15^31Mk1- zPsL>m1Scdp7tss=wtT1rcwj)|uUXFw*5h>mM>%=^iQQM2aPi|-yObJa_(nv>Tx#iM z#d-YS_92C)*_E2gZce`OK58aK-{v7=%enqhvPB{F#dM)*E}lPkC@41x8rDOEF#ud9 z5wEmGCzc@^0NO*NLNA8CKQ^s-NdsM6tjE!G}DY}#o)c%ojUJKcp-yUwm`eUj&82u@~&x_7o7(N)2!qxDseyjwfv!{L#p-Op)6u(45~Bh>HA_f zKv|IoSqCH%dHL^RDi(VNQKaTn92XDcuz{IQM;Pi}xDbm^y@^HYha{w$%mJP=XvoJY3LpDPvKLHYQ_DBR*b!@(iVx`}%j&qpo^WJ`0gOHQCVBP!Rh*7C|1b`v}m*;USeRM2Y%@NcF z(=OafIW%vd(|hWLzooYveNbqnvV4HC%HymIf0fZJZmi-T`ysq;F>y8CK5z9 zn^7L2{&`B`?Yg4+&ne#ep9X){ONr45?3(E`*SsBeckODzoeRozoS)*RxX?Kv|8=KvWOnW|PX*?0EgvL>aQSA!OY}&`MBqcXy|6=pi|o$T)k8p;?UV z>=qYE@!r8RzAXK~$EU-4e{3l1YQ{FZ(8hC`k={|8eo*uB-$O)7j?AjnQ!azMBpht;@l zx$Rk9Jirx=B8qOeiXTHe58JM?egIUR#Nd0pPJz%FdrCBYrKygpU=H)yP_iP4BaJ^h zoLRnc(q;UGB|d$=GvvM1zfK!EGlEki(SZ^>hu+B0emqomf-B8n_sN4#rYG$!zJ^@* z2`Glp4?)cd^hD02M2@sc=&35u+5LX-df&>j{NH~RkD}4D%B(0q`oABH#cE;Fvtd43 zQ`_bu@zlUE%iGR}}L`2toO zAFZ4E=Kw1)a&JM%_lpp^cxg5U_?WrHZazE_o*2#sx(6{|ZcacJu*^{fJ4s>Qt{9-6 z(mPFt7|gS8*p~J3vluhtHJg*9E7dN&cjAF+GCN^`={aSbuz?Twj39{4)!;iAX>HIF z{sP6}%d26CC_5v}{^!Nx#^TffU6o0TR9DkQp0_{b9PS)G`7rAwRI9L?|CE4la?$EM zN4`;pAN<~SoYgFX@T$F@x)3AwjhTlNyxTG2_XohMcNgGQ4O~9k_+!|VSq(oWzI)V& z+fS7}4!FCORr`=ATP@v0)q22SKhyEOY3r2!Altjvs6#1Y@f8eDfsgm)wQqc1R{)pK z?{d2^VnAS}9s-xCZ_QV*$Br9&=(zx$=1NL1g;9$0)=~@dO&FXq`5TnBHXwoI-R_{k zqt0!u$1&n#FM@0`u@5esgbD_B9;**YO)*w+WxFU?PApb;fNpvfa$BWVYXQcA_vYMN zR#tcs@NR#6_T`4xC!nzT2E|J3K$RolNnE`4&RpZg{>Wq7PoP(FGBEf8Wo&>e$^R#` zoi=##vl@ z(4Zaz*CmT^QJiKIR0eB(ta6-$OcvI!K)%K=@K@mXj{vpOYL7xoJ!nA3!Q|(A_iPyW z*aiNyWf*~axdudN;2%cY19OC(7S6YhPo;D0PICuf`Z=-itE<+x z=%#rg%RJ0>*#WKvhuLjB;nYeK0-E3nv7+fv@FlDSumyUH8^D?T*uL@FcjNlH{$nyO zPiZ4!xhY%YU}X$_=w57vP@^HJ;8sUc@c>xaeYa;af;tqmsAU^;IA1Yz)1NjNlrDL zL()tU?I}yu-I?P!{#TUB&qveisr2?YV3r={m<9P0ycBuKI?$&%vNZq{+?Ye?2ELsW zX-;78eFIT^?@rySyfD`{EAunKM0_2-=VOJMz5$jF@#VZC**h3ydsRi3r09g!=lUS_eU1jHM3iKMYR!8n{1LJ6*~hU zpuAy2Y%q1oNBPFpnTJJ>5z(zPA6)&C7P4QIXz85}WSI?xdu^c%lxRKjAujAryXdXW zCd7N9>G7y#?WEhca8as`pJ<|BnDtF%XZ+iw1|@(>nULt8;(@f1U3m6W38qXI_mc2tvbhy_45d zGy9ON=U^{rkw3{7rU8Ka$VImudDnCPkkfKR%8s}27?R(*feRBk3Ce*}?@XJ6#`t8! ztC6=)z<9-{cEi>-8SpCquA``7v30OVK6Y8|0`nw)v}n{_q=8M-PAE)6&arvov*><} z=4^b&nC{-H{_qezzqeEUVmzJz#2ZH-XGkdvpJO+sH{6Emy!;#-UVO2wDc8tXEs~Z2 ztiDffGt}OUG3?k7*SiUD+Dzm))nWEQU&DUR;$?Dp>sN@-aajmzzf&PvMtv{52p4%h z4j&q@Iy!`$YJcsahw5`di&bjKjwZH#18g*6T_hk!XC z;ucY-S%oO2!37!-2cdZ?o~d9wqzpexT>>D?D~MO%wS2)53TW1g6PVDD-St>6#CHM2 zC-428&?n)c!@X@=_9t|A2EmxSt-}&*UGwQu8jma_1lcIjTK#kpN!NpY&&8jt@u=$l zcQvQiAiTk}_&lJdx9|5^u*<Yej6ze8Hz!2%jdeiTWl4%g?_(^JJ^m z&F}Q9A0WyD=5s^n^sE2MwjE4se?*p~x%cX5jr>)4+H=s1P3lLcMYXspl01rf4d-|< z(|aqi33*vD@GOIaHu}wN21W6B`(&OYVqfSp>0e?XjdEKT41*aNHJm2K}dXVWISwC$y zAs%>C+X-KVqN*9>5bYGQ7(cPyL<%E?)jOKww;k)nt!WYT@mc* z3J@d0mwOuR0DP?eX=&xC7VF+sMQ6!O-_aj^=Z?-CI-v@)9x8~mO6K?+>vYCo``(ph z*J}yrL;fD2eTatWBJL`oa1U8gRDn{`g4y_zlFMff1Lk*bp%IKeacN2mWAEMVVEs-P zn&uu!#19B~4Bx_Yz-0KYgf6tQx*W)w*-UNjPpkK$%!Y0yY`NYG*7(6Mxxn?vM>&{C z){Nk;98~PO6w?wIq&+NK@A~0f0WvWOi(ZS4ZP`;Ql+%;^jv~aj_E1wxlLU2c)O*nu zw$4Yk1~Lc*71fNv6zM1@Y!3u46^z+P4)=CFP@6++L-P@)8ylb$`2lrj$#l zp^7?sglKLCw(^%>|KBX&R!7966(P~%R_wlYTdyvTKyOi0C6?xdEn3fD;&noD9Gauc zh{OCf6h|R?gOy)B*}L70w@%}_)q0e#vEps8cCp~Jh?Vw1d@-Yo|x8+axAn(B;aB+%qk2=O^ZSNfLG(w>cvA7` zZi-~V?W-0{C#DkppwGtUp8w0{2s8G zkKM@$;*Ai=(F4JPvpPid-)EeUr-{lWQij;xC~@c4CEC~r*wk+SNTK0^Z#?f-dZ#}d zi52*K1!#vwZIYI2-st;J%goyL@mYw~?{^*F0_VMQx&exA;PJnxMWb30UTvLciJU41VSEowZGNmmu(JTr~eLEND2I zCj1-Q#5?`GCnpnbS|V@*Y~l`cxR=~62%1Uy zPAmaH?p_3^zE+eS*n^}FPJMazUwV(Z4=1R4>;3bQf4pfGED`Otxw&zWuQv^Z|zuNS?Y2QoGZX?ABR;6b||^XDx^KC zySpT2?LN`qHv-Zcvso7#li9;t?~j(nXyTHWddfsn*-LCUQBLhYKrwsTP2l(s(6I2e zZM_Nl`N8@d=v|fiM|EnPRMNsRRN*dkMtq6J7Ey*B1{8_#iA@7XSMY(R7bE80)Sqck zBw^SM&fq0A;~An-N*G>TQGMYlEREF6j4>-w*B}nI?(=5MNr;NdfT9nfyV$)$#$-Dcv)>i|J_|BE6@z#((uSzDsD+-l3anSQ zzOma+KNc9f*7xCKgSjsCDlk^0h()qLwaS4wi{eur`&+;s{PLz>= zGx7M)nS5Z3?04g4X@j`$gIcbghqt2FKp{Pa4kgkHg;SmN)9->EgvuDcv^#xHOi`>= zbmEshA*iOcJ^u>GTQPj)^Z6w&Nx7b*erGM>j~973<5WB-{oRRoA$n3cM6@E4IV7S{?!hRgNEU%EJ_ z!Tw-CZQoYQ`WGP0E2C`=9uSPb0lwb(mhdo$ad()dT4DBPJh%Cgad_&()&SOGb}MJ} zWpa0orheoBs4OqKAkqOjKk%!YE&(eltd~71Z}Yvj1^!@| zywKGa!ToIu@Djg+WR(^W@dyFaougAC2lm@xSBtwr4rFi~_E@h)H+L&|r}*!PAW{IQ z($7tKV-t03=m#sW^6L#V7g~s_-PwsrA@zJB9&)~??D87H%t29iFBq+k$yNi&tOWj8 z$TV5hgpw|f%nM1r-{ctk@A$3M!(88yf!R}&M?q}PCy+t;QTtk(6wbY^<9F5h$GOvg zmVHLTWx=rF(n#ftU;UNfw~LpA>ji`MT_bh@OzwF-A`#6QH}T>~yY_R)TA)Q)?JWgh zly9naL||)Bj2!`49XfWO?|~Ym6B*j=UisU}2Q2v1VHS`3ZrVW$aN<3Y(9eU$QeMLX zU&Z&>|AKBzFp-gaAO?cx33G!Yb`A(9Rg*?G9yvutw?vQ;-t)FdZW_5QfW~!$-@9WRcJ_iRWNE|zKZCOEo;Lb97V*VjKd5yqZRcEpyrS?!8Hx# ziv(WOMKWy+;kQgU&!m3S>!Fpn06&$h`W8=jj|~APKI)&6%f5le{TG<#G^h$wcT3_r z&gO)`1L~iYwa1>1+nEXB@9%0tI`isngC!a>_v7qxIgg$dE@`nef&>;=CYGYuo%?NDb?qDm|aUpT%o&Kc|#hVQAq^--{u68q zl=sD-0q5A6teEx70K+AkQ}Q5keHKqG&&ODk;k#O{%gL>zB2%qgmR@?L=jF-TyP~HL zAGAmM-%gifL5Zb(7^< zkp^fNx}UK}XiC{HNo3KplcNBM_BSYyqSVnv#5XOk)2r&02jC|lpNonB8VP9gbFJ?s z{p~7h*=S+rA`Kvpq)&c|a~vVcA*NW8($PD5f{TwSy1M8AzF}UI*|GB{)bGP>&GKya ziyr`TF_pP0aEc%TcSc9oi_9qLJ}uK3y5slYkO=X{V?^6y!r77(JjoJp=-Oq|jl1i+ z3b#SgRST*82dj}Uc;$XP{pjFjZRbaK&V{|Leo4cd)f{;g9+0>*m1neGNfwm0Ld=Q6 zUU*frZ(T+)@}@}Zl~TCCZ`~eQbOXNBUJGAAQ8_FZF7lI}XE<`UwLmjHW)AHPbG_co zD-F~1F>6C?^1QEZ{8Ua=)yGI$h{J1X0iSkk{f?@UNV*qdZmdM|ql2SgK|+x^`9lpB z*WMjmLxd0BEO~11X?bsDs5D`E^5&Ql?b$a*L9bhGs|H@|(Mn-P%POK>=KN#XT#+@< zF^*I7%%x0We8MDGF3*~7Idb)I9Kv5wO{10Dr3($vI`PfWF9e>T3YO}0eL z6~JeM3OJg>!L=Qa?c*UlIQ@|WtxQa5Z(^K2mfN+n%NzRP{U!oDnBX6^KPzw;SLB;I zym{x8!zm7ts}&lb!9W=g|9K&C=}1i?t`2!uxOvg+4G6MU%y*|gbfyBDX4T^0`F^!q>I9@KH_I=c=1#Br|Q3M#DFFROEAs7%~ovk{}qVysn~A1iK`K! z=Ksy^YgxhH-e$X7)fsB~pc;}FszPeRGfwzIVVUxw=-J^lmK5F;R zh+t0CpJ}__`R}z)zXbo$e(RD!&!ZLqoa@>jBF?KNtT(_rMG+Xw_4XZL4@15QrL}I# z*uEuF_BsA)7z)o)@V3fma<=44L3hvLD6@kSFi8tmPX7|P(?Wa|vl+qQfrt_Kc>cYe z4}`I)C?fonZxq3|?l%e-oEDbUqS@Jp zcxM{aQ^O$2P?(h%?8I+D|6ZjLppF3f3g4LeNToBNHfuHxV@FVcpwW}Yf9=6PiFgje ztvNC;r(ynUrTD$MuOx-vuGwvT_kU!aW!s60q!PlLJPXdO@o^g9XlU0)Y_G_%CqfDb zkf?0y_9}=ABr~XnfDJt}*FdgX&-qG%Gjz@OERxH1wifv_);)X4)0-6Gcje|P{c~{@ zdtfvB3CekW2%=p1J5eVQE8t*!0FB8(y{P5-Ma8o}ATaZH(OPD|*qGAUs(moDx5ceK zbx;uTy(9_h{9sIx(m!evCJw=QU62Z{hA}9Jw?0M9Yos3dp1MHVIeX3!E)n4q)XdI-R2 zC$(sOL6Lk7NIndgJ5Lq~{=6^_fHO9LsCXHQR{~=APmFh)`@lb;b1JSS#qLx6MOTnl zo+NU5&ujsLkbZ&&L?eJEMtp4h{2FWxcxhHQXTpm5?hOFD*~mG)b~7vmRJ;u#y5M$S zEZ{I#+WsF-#5x>`<`Vfe&Mp7%0f25!6aHVE*#=Vj`!Qc2Tu=vwA$`qIFi>Y{`w6O} zz!-UlrcofFaRtV0|M~Yh#{wV9fJCV%P#5$m{^=`oXlnNB+h9JFA-i%>w4wp`gJ&=GXOsT(hCFAgF*RZ3Zaf+Xj781&@y~ zz5o&)p0U(}wLb>~2U~@I2tQhYGIJyqG!eK96F~b<8C>0ciMTT%Hdpd3bV{87T>HZ70NP~Xni?6y2DwM6vh^$odJC;zUF;;vO~42b5mVfW`k4__7G{ZvDNa zPKBOX1Ab31T+9{>U2hu!)NU`(fQdw11>u-bXzUmeFs+520!j=IFv^bkz1{NXDH!G+ z8TPbHGRcy(0Vy*qmyf`d{eNACx;j^Z2;pYYCeemW4PZmj-y1K%GyAYaanYh5%S0dL zyAT^_-SF#>oW{X(B;PW$;{6*AvkNLt-td>-CEL1YqFG`<=J%)7r?Ka?>|WIav)a7? z56BL!GD-4~_`d_njTV+$f;2|c!pA_ko!lA0V$|di$XXgTOcVMB9|E;KzP_S)Mvp;o zE)$UeO{Jd#gZSVb+$>XlGg+jOiB1^qbhLpG$HbK!ez85w4^hk`{1FNn8a^DQdNm6( z1Zc^SRz$?DsSwosNF+@~@+onY$dESh#rm#t3? zq^j%#d&<95l`*J%Sluoi11;14&Q?q`7HQ&+$7LNBiOf+hf3C~S;(7b%Id2gEbxQg* z{5lZ3UjwXJFsA-f4#gR&)=V`i4lEpJC8Dk~KOsbPi)p(G^?8Z7vGSS$Si0CVR%W`jpkN1=$R zl-a8YR<4K79N3F9iY!;SUcbdQ7#QOpC1Vo}(f*E(g3i~$?(yK-D;b;|?syjmN`Su_pqA^*i;c@ z+I>%n7Nfcs07}_d@rGLS9Yo!IU$v>vrIxFEjr0n}#Z-L*9J!H@+whEB5G9F{;AN2- zBBP`~KH}-dJXGd8wZ_bU^kyEIIhR7AO)2d*_0F{HEn~opCGTUqtN_*$c+&+<%uyF~ zvVzh@3y{~GBvn8pv+p(GK1TCLyA^*mBuka3SQZ?={(V*bkaQ!cS5s&RWH;`!3Y!r} z7cA#64^MvwUn~1Prh0l?=2-a+)S$3QsCRdZc+=oe-qAnX#k_wHh2c2t$mSkUnZ$8B z_-14({dolz(1M0!aj{+&}O}%UGtg&x(Yi0=gGb=3~rHbO#)jv=*A| zgim)bO1&KR07s$e83$6`wJ}3&f_FH$IwXR@NY!DQ;S)NC% zkL|72r34#Tft7T3paWl%IAZ;&v`OQ{6)_ec%QXT(m&PHg=kqDw-`}>;fA<$(5AHVx zcx~>a=gr7Gwg~B+t>g>mIzv91Fg1*eBr-TPFM2L*d9HpBZPPg7x_EwFzV4zA-8(hS zH2Cwf3s$DuOz6VzM8k?F=q%v*Nr)2H+uWOld&r~{!%5W?_EE@eS zWsJV8wNL@J@K7G9%_tkS^$=S<_<|37_$drkWTW7ip0Aq#wmo0Lvgw!;gQ@|Kg`ocWyS;~k z15VWn|F9np7C&xivb=MboLPS^Zx}ikfABnH03Ua^P*hNh;B=hD*uc@-Vhj}y3RC={a=-_`yiy%_0Q zpcWki#lRI1Je6+_(lQydK!{@babfi1rMb6R_B!>CAPo$7aDB@okG&3zg_yKpOMono zu}K73l(VU#IM-$7zqt47bI4!;t@kejz4WKTz}D^UO;e)(*R0Zviq}fU+zvs-YQ(`v zTO&|0sidy!S*E?QGY$r#UI4r3O!-u-&)@|%%)de99gj8E`IA2Z2B=yoC~m40O#8D&er(2{VBakE3_b#;;Y#<($QY9##u}H~`54VM`U1yB*LtoWHaK#pzZEFZDRcCB|W2 zw!?0j^{mOT%9Bj@s82AZ4wpR-j&&rUZLM~tBs^gfqBGgQA)1&G5K2q!PTze2`}e}9 zqh&8ofk>jBkX9mL{!Zw(uPg73I$2W1G$&rW0T8TW_yCDdUQ*LKfei;xKYmq!FJH1 z6;R>2<+0%Q3g^s@KVpm2$9wiPl9+=TEf+Y6d4aeP%sk$U>VrlBk+e^;d}Dk89ciwH zC)EjhOf&3z;8!6(JOWyatXl$N;U}fj%~1Rx>o;G|jz^*=#bAamKlic3Oo|=tdubPL zT>fP_5E?&xpCvU)EHv=>)s68%vCp?{Mo;Qmhw63QBmNAyY4fq-bArv73-lAV=bKHb zWlRUHyp-wIy6*AS%#-9>XaOlDHIC(4yTEjgGtmRVPc;VAE5UNKV*2HOyJ78uf+V!> zGY}N91na!4V#v`P3c;c7vwxp18H{yi4`FUBf_fXzYgAFtpNck@le)~t)?>=3o@%pK zL=t>!&iq-8$6tR3)1z&bd`YiS5 zE-pjAR0ab4^Rv3@(&!0fVQmh`u+I-Usz2cT2uftDSKKTUlX@3h2r);TVFq%Ko z>&frBq{nz25hlMZ<*Q?-`&|BRo&9a)`1P4A2T+}IqmSEdEA-`brHFP5FW_0jM@VCr zAW+p3aZe*!|3a-t>$M1%oRw1zU9gmg&2PJbgc4X}Z+>T))qs8fFUI>gS9WWdaPsjQ zpqq@%xeC&zTP;PzNf0Nl%#1^>{G-1U5g}bXOa5~p^okT{pug~|3vhR*{RO}(%!e*w zS|0$Y&=mi69z>(}T{=V{Kgwz5ZjWCYvOLx-$^JjTUeN_#lK3FQgigQGUIR(9M?4N*&>@-tVg4xzUMRcF6VatycIc~lI95bWpWtz+ z5d$*^%eWxk&=;6L*E+t%JVNHr+u^WNl$2dlq@&b0M^(`#X8JN?y6sJ__x>VoUc7~a z=)hSChHgQEj-M%2PXOgWB2!!Dn8OQiWTP#ig?Z>Iw5^}k8-AKI3ydIeIVrdk=Ck(X zTrBMA1=e&c8ah;xcV*oJ6(zT-?-2i8yN_ihERnJawhclrk`o_r>7pw<1wzDf6IrPR z2I4jw7K|`FVc}jqse-Q@2bjE-c=l51JoNft2~C!3gwr=9$vTnL7~z^y7V|+nra5#T zW)pIo;&*8w*keA^k6+stLf}X zoz^XocFQEDUg3Q`IcSFR-jOYFaMaR0!Fj*zz7q;^S6)O$Nb2kRe^E6_!QHyN|HNdDB{th_I(AX{pb&W`QBqaEZS2^K-Rx!7rY`_ad#4=K7I<7jDw$x1RZ zcsIDC%-k>W~w`XHxn{gkX&>?0zAg&TM1)1L!(_4gA894)bJ z6oU?HmcW-q^IHRotk-(W&m$|cp!>ZUHbMFgzsW2_T)Q8(6cdCrpD3LDOxj89R=5tM zlxxH-c^DQ^=Lr#ub_}0lsJ-7cJmU6;D*ezMWj*)!aMfTO4)B%186qY%(gDd#gY^0c z8>&BCz;P^}4DvQS+A!1NMPCjLLe@3H$%$NYR{5Yx^MM=5#V^MpMfL{lnB&#n%8xtW zofZA-*l~6QkL(yST@N+>*K#(Us(knZ@<$}zQOHTXqpD-ix^>?zjyLO-^T(0xH)%}@ zm)NcewNy&5r+l}43Px2g+7Iu{U`DjKUiaYv{O&8SFpeUO37wd(d#v#mjdap@Xb_v& z&=L-p+bH{ja`Fb$7|o2gRAmbKjnL(o@jDt~l_c3;LHT@zZ2E=;FQ!z=2MK+Ia%>^Y zU%KdkKoj%%Zd5At8Xni*{y*=yGbT7- z3aoLnqb`0wz0){l>(@(bVEbjew6OBo#4YHUCW3JP!pF9rx68gPOf+?`WG@!^ zssTrL?l2}O!&l`@in{3j*Z1OwZ-mGLWcUvveON&4qsWw?;a3DIU(L!Ic!p_E9O+}o zf!iemTEf$7U%}Zmn@vS(_S+fRLyhd&8aUa~Pfp>NLx}7@$|XmT#|sFe)Le;bt^>k{ z#&{xDY@#T~e&%SmCr_}0K856~&l+#*%KvQHD$7oDhXlT?Bi@VEm`cnd)Zl#XCxo9t z?Pq#^;FSHlRV=5A?s_uqwU3H(|XUx%;V@M(1 zh4(LO>e*=K_Zwgsd%f^3<$*{~;6QP0MhFr56Q~p@3PyfEkq%*?o)ML_$GjVu&;^_Z znx;S#7@nlEYoyPkjk^aZNLii%V~5BDVE1}Bqbu_b-M?cIdR~HGE&Q#hT@Ph!>FAjU zr?h`UuUQW5>s=FMKM-jqXaQ!r9tK@4DVxs!J8Rwp6+Gx{0XDx#8I*MBe^ulOW~sdL zG;WU2`4-^u?Fvz&KUL+pfX-t% zG~W+8#YR!%z2|9pT#ZEA0L?ikQiG`kLB&fr=fnn2pt!}694}te>i)eocOpj1!2sYT z!o$gPzat4Jjb)Bj1968yMeCWxBfHw!dAwIfc=H;}YTO?~qK`*-kO_>E?^266TEZ$T z595*T^F|rvAe5}N)ZZn{x9c!S#kuO}{WPS{6*^m<@%&gFL81hlIZX1{7*5| zKmS5o8;8z&(rvwnzBdk$ORs^AOGxBVDmCfeZ6Hk}ZUs{bwsJUQ7Tb(oCbovOiH@4u zAYMZCyU2p%R3b`S8adXM0)b15aB8+6Kx>y-Q$enWM5f(nI@qZMI7Tt~;@1?=c8JGc z9qoX=QM%BukZf`~m(p2y%gzP!)&T;RYc)v=&T<3WB@i0*9gR$LzUOVH{`s_*qh#-F z8?$CToWKiSmBV?#8N!-)Z)N1gO5Bf2MZaLxA;Qxo-h-KqL}@Zd=k7;9VUJ5##7UBvn=)@yn>)lhK5oT_&(oOjxy} zcn`Mg5K_|EcgM7ET?uNAwv0PT87pw96n0MQe}o2u^A$3icY5(jV`&c5pn^=|$G#Y~ zEWK0X$N*>6?`HbTf1c%FA$f*|J1>NMPZP4ByU*eJ-Q2XZV}jLGfj1D&4=ul*kH^b_ zjm_UWkUqH5Ipxs(@XIAq6Tx0L#WW$U_xZz^B&SpDW(}f}uP;}L`&ItjnNZnR zOgZEMuNo!AZ^p5@M@rBuSRyipxg>iFF^9hZ>~^mAOs!`4ANClcTn_86OFNk}<$$#}AX8z;@+tOoNQq1&N#&EC5lG?w~_=^6dl`n%->bj}o6FB&DH&^a49Y z+YKME4UT~_pQf_7SXh!@0)rw5X+;|Qny19U=|v;!Y+vs#jUM;WIU`P8-H+Sh6 zym_lIZg~m05))oi{@!%}EI!G?JDHKIt*`=4RSo&)5+E!$Ktu^=_a=YC??gsPwanp& z`5S~JLgRSLP>5b5`CYM*6!(3pd7x^=zQrmbI|dry2(zs#C+^KcJ%&*A+WDG_Y9Gf`Td6P*ikLDR`r0C;>-ICgM{mDow*4+ z<=Lc_4kC}?Z)ALc)qvT4-&LPU-2wgi8qg`O%X)qYGlN%&%)_fnf2axwtb=n~4W?x% zqd0TlHPMeCUnutdxh@v)`*zBc_zGpXo#Qqo*nb9czp(wJ$9VX@63!YoTZ7}qne$5w zE0Z;qq=y1F4Pf*sh9V7oGLK2aotGMqE`A~&%nm&CNr`9Zkp=y3Irz5|Zmj|L>cB3N zPksXyY7F7mww|TOgu;Z-HH0T*2jta@p|amI#BaJF5~a|W$9rqOiNbQxrwAc20zxfz zS?faB2G0S>-t}-GjPTWelLH%Cn2*)N{jD#3uaQL@Ez&o>`+~iK+P(&6la&v&E{?xH zvF1?kcKftz)OMz0oCUZ+*cF&Uh2x>XrLbvY>}b77w}VH>T7=bq&|iJg&x;Ct6HZ95 z;C44Bj)LZq>3S{*ZkzEoV`;?2vRB~UVK&k0K!$fV&7zrqD%7O1tQM@rl|35_N}-QR zG|skA-WskJ8xA<}0=smLnO=BQS5vZ`4i-?3qJ<6oO#T3!>jZO{&V3H%DZ_&q2xa3Yr%~m`SYxaq|k;wjsP%m@(*XE8rRG6PQ!P*zxqZ542h5 z`GOZ=3_AL+A`n>j6w&|d@XCQ++}$5hyzS+EKTXE;Bd>-|$TngP8rqJ`*W>myfIm*Q zYv$8PYvz4v^L}X%tn|=_(T~Y>Zcg3de~6tRsas1|2uRZxwzXJ7Ak`qrwkDTHK!jx`n#8I^hq4JyJ8~I?0Tttr!=Fa1D?(ZIX zs@v%#ZFZ?e`8HoF8>MZ{QHD$HQ-t8+JGWv3A|Fj0r8g_@K<{!TMWLBB&mDlv>D;qS zM7gjju_N+lW-1Qp@a4LV{(HS53p2HZ+W z$l3Vz$6t)!&QOa)l;~(WMn2Jc)R>JYA+dR3S6!H6@$K#*SlI3Rr(=lKYl>EhRSrvE ztu7WIA0H&4;Xxx07EU&t03`m4>P8KC)*smf_0on)^-rV@vqjriY?b#GYVF_P6KTo_VE?(b&^?rxnLx|5>Jw zE2Q+Bl3Ai9zHhQCsv)We4-+11^VCzM+Ek4GpkwWDle<*`tS6P+YFi{}jc2+!N;@pf z&wzM8r^&D{GAG7JD7dCSlyo6g)&xD1Cn@JCbm?^wjRvM5mB*K3RWceg0MEz!UJ$WVXJx_RBbk4yHiGK0r2kXR*R z=7PeW)UP`$qw%ZNAOM;fUFpmX{O#h@kE}i7AQ_0j;}8Y^U4@#0LL}Wqzv`{Z_EY4+ zDRKR)BspJ!?Wh17;^?{jH<|g5qHC?9erE1|XX3eQ1Rbqem6M;v`yR|iPe_Fdt5ZE6 zD-a!6&dwwOK{p-Y6v>vlm{H3(eo+JddJ=U4#_XEVQ}Q^4r?*yJ8wZz>)A-Kj)s4Sj zzyxuO%JX#bQez@6^yMH~FpQmkG>T+toO6~RwhpE5y{ef1weECCv-xe)xT#k-|Lhc; zIYFsPQ1pBSyctZny%iIt?FEN92wUNinAjHN^v$^Aw2WH(hG{H5S)Pr zn+x08_l0eZ)0Obxzci7X9#+Q`5a4eA!`LE!A$XSI8|X)BRhp_8jlYAqQ=ww@DJ|_K zNjA=7oH*b2WTDssCEt#MQ6l;g)4pI!#W$_RYPQ}Fu_aSLMv0$ndBMTlDjYCOeAo;U zdCd4Q_8}3p)bCDt$3j51>|5e1-2e7{4EVUcmfP4s$*3Z*UTBMUFNtyFyXA$CLxavk zdyrZsvnBrQ+I({5jmZ6;O$~+fZ0VxdBG_+afH)8*_nI4p4zLGl`wDVwM{wI;0!)3U z4LnHk_0bYOjqG@04QcIh<}10Y_l6_>c@yZ+!~f81wp=I$AtklyAx$YNxexU|Ta$Xg zK$;^H4Oa_Pb0G&GmZSK+kd6 zmt%N{DLNkQ$x1T0B3Nnh`5&w#kb3~A)fsG~;YOPPOk6O5cTW+Cg-${(?ff7w+*O6F z(53-5663dC5Qf?Jq*`IBFd+!52V1Hqd(W@%m{izC@*0)}v5kP{`xh|pgq6mj14wj? zGp8S*Z0D{7Mx~}IHKmo^|MA<3hC1)dlcpCnAv720(w&jcJ}5e&%g@mRW=0=DoaRVG ziHZH;Z590OHw`QuW}g|_5q-4x8uEbv~fZrq3gard!8xg z299!3bTcwxgU562>-S(UGL3a;r=1^i8+h5jMrLiKj-2;So}qPw0ErYNZm73@2fATK zDZX3{q(>m+{SITACG-w(HzGPR`hkwA*s)Dd=c&eqbI>04W~M6bKHK5y&!KbwSLyUZ z8fGhGl5)+`N58iS-*c@kO_3}3Gfcx57;X*ixbVz4*97h9%AHiRb23(F;-GE}7KpvORQUfu6KQ2gR=#i7H#G)R9R`4gh73I{T*T%s1z7lbv>h-Od zkp%8gVns`qL4*sk3Rh1LQrQi{Jf~RusDsw|T*ZT0%LlFmf)vGDO!D zaCG49GDl)OjJQ$p1_3ElEET;e-}gnNHo24DQJlg~9ZadZ02pcMriEZ2`GzRj9R_!2 zW_4H?=aIIQf=vvUM064+m}Uotp5WA9?n&X4mpy{fH=>nC7`E4(!6P(HrrpBP-HhD^ z_PEpb4?=^ub7*z;{|}=BO+JO~!!7q@1{K7eDtwbQ2OG*MNUhc{?>Y~TojXo*D>;&i z++R2HOMxpB>^MyjGvG{oBmX07t#WmH3WWy0eXWU0&EsgE)sJmo;~m~S`7nCv8yga1 z{Uj|5W^%!&z;8M(y0FY9Mu5z~L`G-InXK3{k=a!E`F7UD_ZRww zNN?l4aMw;(SAT)Ur=qX4%)<)15Tko}(xwf2h%7$a#7TCXNY1;Ej%c%>yLG?irStO` zfuZDk8t`btzI_!P=)sk-tQta383Wsf%}qal;nXnL*kRRHT2Imgxkf)OR>tY%zBZ9( z$HagFCTWY$KXS2H>7Uv>gt3%UE3gTX#Ga#CvuX-B$mG9XL8QsRDH6SVkI63=ul+{y z4mw?Km(`Kx?n8M`Nm-6kzud#~|vfQzV_8^G=>tvFZ7hSKxd0}KeO|^09AKC}^?_;gY3LU`^ z6BKpQ1Hm)-6u>{eM_9712XLQ0Dpi>aJ=1?dy&28QFbLbI?Hn~F@gs7srebu7JdAr% zBCn|j!oeUu-Z3DRdWt#5t#<`LwCP291y`kMX2RT0EVs#w7YsxDc!FO<@bx50Ye{b> zVXy9i;3}s^N?fc~#xGzXY6scD=w%KebEFK|YNyZ|VeCU6x_!luF@+gIc?`af%-4}M zvRl|>SVfs8maY#ghq6ExNN_EzaGccR30;UNif=3!dmwO%KZtZ1zvn3pTb`wjPHeo$ z9;WT!*H8AeYdV3fvH&viWOYgZJ}Ku;2gmaQBgY&x|cRkQd%jYZaV;8kDO9#s7Ql;Xj|%>5O1YThSZ zVQno!@xK;R^El@R@(VG7fBP&EuIxAVHk@>^ z5zRgGFv+Wk=BtgcomdVb;44G&HDcv0*+Lv^GK6+-12O14kf*2^7us}_7`M-YH}nvF_u=+yd->T4)D!;(m2TP>NkxKZ;~@W0@ddKMD+bd)?FRyjbV^%)UzEd4zPgCrcL}eh z(xyY9uD--d?;8Gh8aRvh<5|G^Q)MEE^n zbMFZ!c3|FM1F1pi$tnm?8EN$Q^$tDb&;W&LOKILFk0AftEpmd32+hnK@*U~4q4OvQ zz0$`bggQcqJS2@osmgkvr^p4;T7&{m@&soU$zQw$;V8AW3Z9GAw4oy3NwEilTKkC3 zjWGB9DEkrcD(*f8=01|$15Cz!umL3&x3*!-HYV00RFnTGW_(xK(Y|J z4N;aK46ff-<71R!#1i^|K1~cl?B%=sVUoeLJ#~AI@JTsHu}?XJZ*d1^L`Hu?OD2W@ z?MZEY2Ig)8QH>(unv063990ZTOjQT5KQZrM@F~_4AxN$?eE`=plOaC&PHDrAP?;pa zfJ{8sJm!GZce|T&?}vc&T?cjtH=ySUD3eyMGIEJbn0`JNhI!o+ym#dYB7^mC@3hrr4dLyROkEAM60=fBC$mwj1vTLPI&f{GgAdP<-LPY!)%C<>-!( ze_y2TAY3))lgwF|{xOOqV(h_`*FdV-w6{o8F*gVSFU5gJha+%WBE}>5KRP$mqHW~z zqa@b>$gGQ0_MFfV4)F#0wit%);TGJunIkIw2vT$Q*78wfTtvb4J%5TNmXWxRM z(EAKd4}LCsG*?oe>-xCaA1QG9MA$x=u)%$Gp8Ws)dGr_}K|LiB_KU*`r@gN5bk4vAv`E zm4?p#RECMjKz9|K%2h~y9Nsdl%A!mGUHkPFyrT&Pe@pY&G@}52PYT31W=t)oGe zK_=Ebzq3W;H}pwfVQC6YNLNYHCXW@WV`8o zj^W{3fQPk>SP?-*CCn`Khf%UG(HYzEuWrQ*yz zU!ei-MG2oFnH*o?qUSF!Q|fK;G>~<# z2gU1t@Dx-xYySvqj*S$#R1Yg{wrqR4((<1O_e#j4_<|lXlj}C~cBWl({J(G`Aqq~N#~$ZUf%gpn4Pp@7 zNa7@MgN^oSs%=P7JJ_Yg_hqM*rej?$mvMb%On@AmU*Zbe#kuzR&;&Sxn@h)J9DMpTX&rgisM-sa4m$8D@2 zlI5uUv`g?j#z#T5P$p3GI#3CO9u|4$m|a0g7xOhP0u>|s1q1;7me%Rf`jQlaL}*T3pXy!{oK+;VMth=fb`$qg9RZ2) z66$vyb4Ucf2GwHkd^}8WRVX5!jV9Sh-XY z48fGd%n9;X(_SMH!WwBp?XmAGN!QZxF;f>jfK988?T6#^x?}ZtD8mDr#HB}=iOJ}} zcm$-_)Z3%SRZ3efA^SXzdm(63yL8bJ-OWVmVe z^GnemY>sD)-$`)QL*adKD#xrjJIS`(qTI3x5y`z8fW$o*)jnR8)N zj0%pxMpSfhF?4e&sE(b`lQlwBsH!O7KGaA&7nwVj-*)114$cYnvBRUi$#09JLqAqO z2_Mupk-h%a05bJ=UqpNSer5V4yg@a>!q(ZgbC6gd0nYd;Ampn_aeQ7F44B8n&REMhvmuv}=?ha@Y?N z69+;LeOo_Rtug~+*U zo**}knbs%k+lmR&q18PEwLsykp-W|$`76^WuP3HEf5W@o0--YrIp`k?Y9SX5dDW2b zhf)X%(g0ZKF3ctl43y0$w% z=wr*>Q?a)$LrK)|Kms_-L~QdUEb4C$n0;*YuQO}(8z60zQ2W+k6GyxgbyOF!LE?QT9C| zdN1eOR3eTEds|iq5tqNdiT+}D#Qv53Xjd7*D`3y$d07VXc}haf>oh5Apvzm>~+xIsZnE?;|)< z#~}PSb~7EOT}OwrQ#&w|I7?wTqFaC4ZR^EbgHm(RHg9Ak(=@-V!GDu?%Nz*Kz4nba zpHh1X@@m0mDsETm@3+jX8gLu0qnc9QP8n}mv! z*0BqRprJzyidk2ewH>w~6uUAJckW7Iic?c3cj3Y@{i{VT{z?FQzdzKI^D}R$G z>9_0pr7)Vf;9_NKwuSpRQz}(T4WO{K@Y@cji@Sb6!X!l<2rM$Mmp%UN11^WPmQ(cV zlC^vM6f;kCpQKxu`)_~9pa~nE?vA;d`SPA#-5cxnD5|a25RG<=!|#;r&G4)_VkW_l zH~~(_nu7a5@PLzk%e|(`lu(VX62f+!3=XO@w6l49jSIy@`~^*1Z77UvyJp`d_8+!t zu=`rgyQSIEy$4LWtK$iLGFO+bOh3>s>^!$Ph>|zxPT{`^B)ofPqPb?K#0<|1U{Ez1 zXaoAdWV&2pb(Ixo2y`kX0g%gj|>xW$HIO1OzGbD`kWX(O(h^4p5lc72P`vl+TYS8kDG z&50W(=Pb_OT1r4PIETv`8*sP@b+Guy1q%MA3w;sDE44A>F=O6zv*Y*sn*nn>CvD#P z&nGHZ(>@59?xd#qESc;!(nn{X$4D;|Fj+RcKVr4B1Rh|C-(p$pVBDXiA=3Ht>3%%y zBqWB<7s{9u77+xMB>-DwSf0noR_-Wts*RzfD|hz6ehhwak}JQx7Vp{;!Ki&4wyRN! z?+e*iAard#zVvz~n=+lM3>WZzY5Ey zQfq7$7U>?gF);*Z820Ht$Np3OGl~19;gt|%X})L_!i(*R{2^>e2YQGvOiT`*hA34l zT(&`>Jgi$sfX;en1LdZaRV!Lkmms-2#i9NNMr&t+#4l31{wblmn*bbO*ZXsVKkAy4 znoBe1l~0|6&y452J~>|MzM*iT!+$)>b}piz8dklI7>K@;cjS9Bl}1OpF|KVttj=p(?!V`FG_%i`{bV4k}dv|b>NsR9#g zlz)j~1o$aDpbsbgP(sF~*LA{&i6i-W^=50fRUZG8goeLO?{l5dYu6OJa7QdV2>A^Y zosj4N`PIsclMnkI$=q!4{keGGC))x2MsBPwDuEI$WP!7L^+&Mf(NxXPCh>-o_hrB1 znfjamwRh=5!M^}tHYup^p&bhC-nwrL1&C*gbfSOj!W&dHG2x3ZXSE~M_&RgLh9S!h z+m*YW7zaH4b$ME4t^$^Qu;ZT|SetqmU@}=s^|6$BNf&tD;(&vFK1`AY{X6fzt<&$s z^o>kgY$TKS<493dXL;d@cf1uI5cv;#$f8Le$tLKl49@_a@tKKSVLM&)dW=dN)r-ib zw}u85FuRXQUrxu&$H|^lQp1~^%>D4`-+BxGAdc;te%+Tb@r((B9@8=boS^l9!XmpdBgB|Lhhn&XGd3s!b#>~J~(FzRmN+NHiDaqI?=M2Qf z=7P-UUS~`D*3LOLm7Pj)1c>~p@#f))4WRD4F6CY5Q`^#%<%M+={2-7&!~e*CCoQ_L zCtwDA`P7nbs_|r;iUSc?X44~uYlV*>yPoP-GG~Ego~ybK$akIcNcho%Y4^}B=PmVk z|3hVP1uijs10iz;eONUdZa~$HrK)FKsBQYaz|VW(oVNN&wdJH?nVEqHGSHYLaW5Z9 z;|+MU{NVz8cZw6kp905%c*v@k1{A{V1KkjD@S*vU%RbvP(KSkb^VMe-;N_|F+pFL% zpkx{?30zlh^dkHl_#FLo`~j!H{{ls3S!%lCNW1PN!M0I2#U>3Q_oouj9;|2hWXduP zzl^FSGr~_@&r;#>_0;b|f{K3F)u*;^?~6e;b)EY{)OEGEPsoyx#JHoK*G*LZg(9!j zQuwHz-cdQFux>DMMeC_~L#>*)f}R7DFu!Sa!q-~_t@m#!)yGo_cf4f&$@g;#a(6ZL zn9tS(F|d5$&8q;>y%sW6s`|?-h(o}eNP4%v z0ZO7+>6g&ddxHnB#gme$-g3Dha58+OdhU#k443{F2r(ZADc^OBTPW{q>#QtL;afR3 z!o)SJOy<@Saf<1s>5DK%4YzxVBy3-p3@f8VuR~HBZm-GAqJ(k%!`%T@RzL zX6WvBq(?W~(E)=aJf)Gg!qvjc5KJ@a@FXo-mI32<|DQ)aVHIExf+kIUu=mKmmQlB! zTw&TEYoowTlHj|N6XYSknA)tmO1_Y))9B|T<@uHD9`+qDH>VR#YTOrwS7v@PT&%hM zj`#H#$WpI?OhEdH5m!$j@U~`g!gKr)!t^S+2+NY^=oEO2TpwlG^C9&DPm_V--LJs%B|ZNrq>_fC zx%7)2BUE>u4icA#al04o7F^5^A>gG@+8G{x@UkE- zsOI@~Laf?tPBZrQHgD(Zk=>NQh;4{9OwM{EE@;r0ws0Z_M~HCm){v|tVm$LvZMtJd zejw@Z7vEa3Ir?g+&s3=r87>xc8rRf0@|OBBYh_0Z4wsMl=^qq{RqzQ|eyL!c4AtFA z7Xl!dE8xx0&mU_aN7o**QVaV!BYM2mnT700iZ(_$l9VZMxxT~DEhrnXRg+ua_aw26 zYG_(L5ht=(>$zfj<%Pz@9R`IoJ6<-ZybYm{Q1Zf{1m3G2GLzCVGm}`^}#mN(_j~W`wugJy!+?cv)7$#3(GjI|c-yDW_ z{RutKxM5O_W)QcbJFRhqOKhE}@1v*6#7&UKPx}lV0pB->F1hf34kT@c9KP?7IC;b? z;QveBlYJ?xpHBqdb8i|=zOyjRbsejK_KJM$1^LTvj@S*Z!+pU6eLEh zyh*-??6U19S&-jZ9c|yw5>zGBE3<4dBzk-}hx{^H>C+mDe=aWYDGW_`EE~JkG!I(Y zby_}2)O2y!%U^lqZF!>PqWh(TE~n4`dr$_mCWw$4^n~YJ{Mw9f>OUW{pEy+iFD^r# zGzLLD$E$l<3}q@##dE#GZNNUD88jP4$zlrp@o>uh6vT9tr%RBoVv@fOyZE9-_^Zvq8gGUlB-$fYJ= zZu8yW1!2y7vb}W~nM5D>P6wZg!SvAHqx`;4vXF*j0-F;=@{}J~>;hAQfAboo{~Xpy zrdv?z$M!{bj2F8A!=0f+=nvy1s^0HlTUBa)0a2IKoM9?W3dXFcTOW$F->5Xrd&}Z8 z56TT>C&>>#pghYhwvebySB^}sI>}@_$=3ATH5o#hA2J*Fx^?trrK@V+)!Zt~F`M4|;~Wef&CF|;*5RDZ$oJC0a+=j#ww&Wz?O zC+MTSomEW~K97YFQ0in^wcw9KW6G_a7izWq8w5^fzHLVFbke62VO*$@0YRb9zbpWe z5bn9v_-oyxm1aO$+QU}5IHSHAnJWMT;_N zm-j{4ruF{&KXO&|!2VD_J0b~f)SLawPv%D#GBe*mYn0zj?oNT^v+n!{Z>+W8lEo&U zP?O=aIocJGJA=0*c6`5riBSXlZ|MggpMhty6~l1aP5x7v)m>!wN2ExxKZ0~7qy7i! zNF_?aqU_N#1oUPNU+)ISmzbYYDNIV;i=z~E?P=R~Sa(SM5MJY-6 zQ08!xNGjmB#D|VrBq;;9f^0@hw_l1y9&W9nc&}VOooB~iCfcm`{pkWaq;zR0I6L5D zsV#4W#8CE$q32Kd6*wj(&+ubBLLD6U09U`scq}>f@_Gt5F~l{_vHQ7Q>NVS$ch{Uz z`>S!-5qeXT4Z!?G`jLXc7?ij%^Vd$hDwSvS*e(+kwZ@;yz>tnEvv&DhKaO{~__5Z7 z%}{cF^T|lPj+WMOh+=RUZyyA5%-{`4_pg~Z_ncT( z-!|OFRYjGcD*g^HHZs3 zq)qdrDYU<0AFO?R{Tghj66FDlJyh(|AOpLJS%KUxiBEU-uYvb8EM86eL@;0+Jpx|C z2|y>8y52|)dh+xdzOPZ5GW5V!L(=V)UoPFI29f82&*D#xX&6fbENNrL<)>pOKahN? z45bXsm~&J~GJol$HC03_+_?$R4cmYt?;iKCRl6;&;gR2zavL#jToFIOtC{c~K?+SY zeP`15g}`+*OJ`y?eErPl{K@)9clOA%BbI*jVe@IHKsRW~F++^2oDpytP081*==%vlNBNR?DJ85=Ncw{@=zFp^4*TxkIMd6{ z!0!-+!+ng>@YEGr9-e*2vL(x4zcYU6hda?4=e;xM#F+NnS1*q#*Mgt7BNZd>ExmAp zz-dVu^D*fw&p|s=48x}yk0%~J9fQAtf&Kg`x|;R85QXKWYcx6cBGW0GfwtH&(aSz9 z2PrR~(AG93cJLdPUcuw+h3?*T8bsG#U|Y$)}PS;$0U`zFhp;FbA5B6{Qx% zl!JAa^MXOG!V&oOgltPpih<$nylM!3YiOJ0jPug2Md`0}@}Wmd)5 z?r2=QZ`m&d74m+zthwr|f>XRWcwD*n!Sy`B~9X|8c;;B2gM3D_NC6?^NEqJKipoeXYR+N3uC3i?e;?~SnQK{_F>gF zX6P{MQhwh+=|15JhE>--`#zrJ&pjQiyX2_snpvTq)K$BMOvfIXgJmr<*JogrFaly` zGM(vz@R?-usfTG>t7L6F>tg}SlQrfcxhXg}XF60BF6mWzEOg+jm2vXSUm%(+@%h=l z0?bt`zi6uO(rp1CRKMnKpO51MnsVv8-c39O*``6({x`!q08~K2V)1hUW&XqEs#Y*N zqPF^yR}TRcU#wS@d6B3$aDnl9`d8zSdZt7H>HT;;nzd{IL6-!aPlGVVVcY_1uF>sL zkvNZKLg}~BUQC{ZdDs5o%%E!z5pI2-RZwsF*fyR=e?jGhxFuTHr3G_^iSuaPyGgBP z$h4U|@6?0)4!}+F?IQEYPok)61N6Q+sy+$|4m&8}zJ5=ewYF>TG$Je~$~E`f@nf48 zsapyoiqvcAm@ZW|iRRzQ;~UBr%ROP>%=04GGq>~C&kgb7{@k#a11EE1o5Lh;EZ>u~ zZdp7(;+#zmjM&n6wQ1$+^gC$5mRbq@NIK-QlB3v##>RUfQ?JaI zB#hJnfdD)wKY#dkhl$$e5AY=71>kw9e=xhDp}2)Ib6A`BBRX_8mE=xLLI-Qceldk< zaruSH4e{S}`*ODSFE7@cRrMM%yNs>U#OXi!%Kj4}sQLtI?j#rq*JQue=l(;;5Z^)> zWy@fL+&JU(TxELQm9KH2_Edn!pr1MA?&$OE#P@QiLHNuyEIIr?-SMuxM&4W5dXoNn z5{LqD$&=Q8q5OB>xDSIh^B-x?pi%>C7K-C*`etY|^s`)&&Cb&PK#Y9pvczRHYAhD* zfEu zdwjqT=I3U0uM)p^ZOCu5u)tzB@zhX}6+c#neAUL;(dmD044!(B>5Bl{Y1m*ij*JAa z4L$d!wE11(&_@UM0Bjl&t%T+LCstnKfmEvW%*xeMF5uM1CZ;a+D>&I7A?lczrT(gX zKZu2LVp7(nG>#DRhhs5CErnxn{`I*Fw_P1c&z(wut2cQ;L_^^Z1VGTdHlALo`6m@$ zd9*bX4iHxYo=@k?9%q}DN2u!zxh7W07*b7x)C7LeCgSQ4j@>B-G{tD zeHx)M2}`=90uSpGU)`Im{~_Zv$RaL2QD~rL0jtPfgN@*UAs#zI z+z45D9FSX1ICko|y=za08l>^%qMF&A$3T@SUCsgJ!r482Y=)sQ)*Do7nE;Uchzl?( zq0SHhdz_2@i+`)dKV@_9xx*wlA%GuSx$*WstER}$rGYnHg1&1LqRdmPh>ZY&fILqy z4(pdfh4|wtbzDi6RBU2dl~;GxKE~d<(3AMvcfNDyG8LF08uq_FUpLzQxgwp4{;n{6jowZ`hBn>P72{ZV+<8f%_Eoc_0-&9# zP_l#sas6Dm6Exrh!(NE2uUr*hgRTKcgKi|#hX!n!NX+`nHxRNzg?b66^i$87Q`MWt zAke1xP4yP69-0KP^L)DXKszexIx-QPyf_3{k7fiK)#zIPq7tiawL9CKDKRxnZOcyp zWgz-U#3Fml3vMeir0`pOevc#{E>eJWq`ch4`+gW@+bYD3%e=p6?(kn ztdjTMZ+C8TnblTFZ}kYj^7x|ZKEDpV94k8(9v_B7 zBYG`~AT_j1+HE#8+M4z=U%tma$1&zwz8msRkV1bwT7++VoD+IGk)7H`aF{&xQ2bUA zNVy5w!Mf08RC`!0p3_bd?k}z4cDL+nkaE zt~a4eJ@G;6_FTGuKG!xOfe#!5nHa4XF|MwoX5Lim1AdakGZoK3DS{GbAi6vR%o0** zPoZGQ3`eZBdQd}oV+OyzAxf=$Lrm%oq&N={mp9VzTW>76=`pZK%PwenMiIye=9c^7~e&!_lzmW(Yo<9)BZY99?8%-dk5NBfJP08BllKT zaqZ(bnhv-5HO;JU3MD%XqOi?Tj-9I}Nahy zLI$ObjfiZ%Y$%ENrDcAN_X(|@5>)Ny4p9yhQ!mY)Hi&TCX=4(@KCV9F5ddKURLg$E ztJS7IS4R6h-yV*t@V%=>&8_#;f;h}qSlrUneoAmfwwP)72-^2L{{};Uw>71+q&M&r zdm2rO>+9#PsnaLow`Oe0eaiJ-9kVKX;(7pTU!^FPzM)sKDyQ%2um{s5u|M`fD9Pg= zbY##X7s?4kJh00yv!{CPoRdGME7a2Fhn%8(J-sdYeN&;fJ$U>Dto&Z;l&)x3|1lv&}^tc$n(C z%`(OOVHwvPq~w*{fcuSGv&3U(Rsn~fE^W_`H;=#nR5I{g{IR!^-=A9+Kig5eqa%_j z_2+fLD_0D^gU0>z&YfWu&)R<$cn4nZ-rfH!-@ABzV_m0TX1TluxP;Md!8+i+rHdh| z2UsS#KhSbWX|P{5YZts~P7=J3b%--TaBaXsr;5^7mQ8$&QY#gvWp+dyd*zvuat>Ig zit~xK{j+^}_3=K?p0DVP2U`E-)~xOD|8KLo{Mb@`oy`w(fgOvqh|o&@{mo0mtCzT7HW-jpG4YLhYpa^id%y_)M{%`i-wdO&NFJ}G&2DJr9<=vvMO0cF2 zWJXCKg=tpxBEgPztJeaXBeiy0(18<1_GLrk}nF$&It`Z{|MpW9EN`(|cSK#Ad4ti>|jhIA=n$ z%XjMoEiOx3S(_UEiSryuzN7+4z>oTXb-AA0$^Um}{ak-#=Jp@^@0Fye#Vxb9R8feW z;9Rgv_Z)}H^Z!l1zDuXeJNts$OH80P)@*)X`KD?7>ITZaXns=o?rdzyGL*T-H znZSk>df)-RlfbFTw9m{7w7i=sc8Xhf&+JOn6qCf=>`S#6LrR3#+urz2=>7QJH}Y(;tEj0*8m1g zuaHNnGSqt;6&Bb*%UTDPO@2T-U$40Wt~9_&Y#&F48OUJ*z^P)dZDLDyF8d2Kec986 z#;~jetR4lJqS}CtsuAP}+O$>Stm)g}X$O2yJEtRjG+_!$)9=?geDc%tfPvn@*Jxq< z&8qQr<-E#yUC%okpR>+(EcrKe)pQqy2bBl^=~T~q_P#Rd0SN6(p1|>c{?n^ckKUAD z(b2#Cx#+v(N1MCvE6t5R*j%lgCs7e6CUIv{t6Ahr_362P{+kHwh&$EUHB&-`kNNWa zCF%?6&oBFb`Hap}_oXj4PdIc?=cVP0e=0hRf2FrC`Tu>c{Cvh<$^G-KfB$D-VEF&P j{->x8kiiD((K0g>sQ0z3@5;;uiZFP(`njxgN@xNAfbhaP literal 0 HcmV?d00001 diff --git a/report/main.tex b/report/main.tex index 603cfc2..135333b 100644 --- a/report/main.tex +++ b/report/main.tex @@ -279,11 +279,41 @@ As a result, there are practical limits on the size of datasets that can be proc \subsection{System Architecture} \begin{figure}[h] \centering - \includegraphics[width=1.2\textwidth]{img/architecture.png} + \includegraphics[width=1.0\textwidth]{img/architecture.png} \caption{System Architecture Diagram} \label{fig:architecture} \end{figure} +An asynchronous processing queue using Redis and Celery will be implemented to handle long-running NLP tasks without blocking the main Flask API application. This prevents timeouts and allows for proper scaling of computationally intensive operations. The asynchronous queue will also manage retreival of new datasets from social media sites, which itself is time-consuming due to API rate limits and data volume. + +\begin{figure}[h] + \centering + \includegraphics[width=1.0\textwidth]{img/schema.png} + \caption{System Schema} + \label{fig:schema} +\end{figure} + +\subsection{Client-Server Architecture} +The system will follow a client-server architecture, with a Flask-based backend API and a React-based frontend interface. The backend will handle data processing, NLP analysis, and database interactions, while the frontend will provide an interactive user interface for data exploration and visualization. + +\subsubsection{Flask API} +The Flask backend will expose a RESTful API with endpoints for dataset management, authentication and user management, and analytical queries. Flask will call on backend components for data parsing, normalisation, NLP processing and database interfacing. + +Flask was chosen for its simplicity, familiarity and speed of development. It also has many extensions that can be used for authentication (Flask-Bcrypt, Flask-Login). + +\subsubsection{React Frontend} +React was chosen for the frontend due to its massive library of pre-built components with efficient rendering capabilities and ability to display many different types of data. The frontend will be structured around a tabbed interface, with each tab corresponding to a different analytical endpoint (e.g., temporal analysis, linguistic analysis, emotional analysis). Each tab will fetch data from the backend API and render it using appropriate visualisation libraries (react-wordcloud for word clouds, react-chartjs-2 for charts, etc). The frontend will also include controls for filtering the dataset based on keywords, date ranges, and data sources. + + +\subsection{Database vs On-Disk Storage} +Originally, the system was designed to store \texttt{json} datasets on disk and load them into memory for processing. This was simple and time-efficient for early development and testing. However, as the functionality of the system expanded, it become clear that a more persistent and scalable storage solution was needed. + +Storing datasets in a database allows for more efficient querying, filtering, and updating of data without needing to reload entire datasets into memory. However the priamry benefit of using a database is support for \textbf{ multiple users and multiple datasets per user}. + +An additional benefit of using a database was that it allowed the NLP processing to be done once, with the NLP results stored alongside the original data in the database. This meant that the system could avoid redundant NLP processing on the same data, which was a significant performance improvement. + +\texttt{PostgreSQL} was chosen as the database solution due to its robustness, support for complex queries, and compatibility with Python through \texttt{psycopg2}. PostgreSQL's support for JSONB fields allows for storage of unstructured NLP outputs, which alternatives like SQLite does not support. + \newpage \section{Implementation}