From 209f0ce3e44391324ed14cd0f0f0878d80801d2c Mon Sep 17 00:00:00 2001 From: Anwaar Date: Mon, 14 Jun 2021 18:53:47 +0530 Subject: [PATCH 1/8] samples generating code from models repo --- mnist_vae_cnn/generate_images.py | 77 ++++++++ mnist_vae_cnn/latent/allSamples.jpg | Bin 0 -> 2999 bytes mnist_vae_cnn/mnist_vae_cnn.cpp | 55 ++++-- .../samples_posterior/allSamples.jpg | Bin 0 -> 3519 bytes mnist_vae_cnn/samples_prior/2dLatent.jpg | Bin 0 -> 49806 bytes mnist_vae_cnn/samples_prior/allLatent.jpg | Bin 0 -> 31073 bytes mnist_vae_cnn/samples_prior/allSamples.jpg | Bin 0 -> 3069 bytes mnist_vae_cnn/vae_generate.cpp | 185 ++++++++++++++++++ mnist_vae_cnn/vae_utils.hpp | 4 +- 9 files changed, 305 insertions(+), 16 deletions(-) create mode 100644 mnist_vae_cnn/generate_images.py create mode 100644 mnist_vae_cnn/latent/allSamples.jpg create mode 100644 mnist_vae_cnn/samples_posterior/allSamples.jpg create mode 100644 mnist_vae_cnn/samples_prior/2dLatent.jpg create mode 100644 mnist_vae_cnn/samples_prior/allLatent.jpg create mode 100644 mnist_vae_cnn/samples_prior/allSamples.jpg create mode 100644 mnist_vae_cnn/vae_generate.cpp diff --git a/mnist_vae_cnn/generate_images.py b/mnist_vae_cnn/generate_images.py new file mode 100644 index 00000000..a36f69ca --- /dev/null +++ b/mnist_vae_cnn/generate_images.py @@ -0,0 +1,77 @@ +""" +@file generate_images.py +@author Atharva Khandait + +Generates jpg files from csv. + +mlpack is free software; you may redistribute it and/or modify it under the +terms of the 3-clause BSD license. You should have received a copy of the +3-clause BSD license along with mlpack. If not, see +http://www.opensource.org/licenses/BSD-3-Clause for more information. +""" + +from PIL import Image +import numpy as np + +def ImagesFromCSV(filename, + imgShape = (28, 28), + destination = 'samples', + saveIndividual = False): + + # Import the data into a numpy matrix. + samples = np.genfromtxt(filename, delimiter = ',', dtype = np.uint8) + + # Reshape and save it as an image in the destination. + tempImage = Image.fromarray(np.reshape(samples[:, 0], imgShape), 'L') + if saveIndividual: + tempImage.save(destination + '/sample0.jpg') + + # All the images will be concatenated to this for a combined image. + allSamples = tempImage + + for i in range(1, samples.shape[1]): + tempImage = np.reshape(samples[:, i], imgShape) + + allSamples = np.concatenate((allSamples, tempImage), axis = 1) + + tempImage = Image.fromarray(tempImage, 'L') + if saveIndividual: + tempImage.save(destination + '/sample' + str(i) + '.jpg') + + tempImage = allSamples + allSamples = Image.fromarray(allSamples, 'L') + allSamples.save(destination + '/allSamples' + '.jpg') + + print ('Samples saved in ' + destination + '/.') + + return tempImage + +# Save posterior samples. +ImagesFromCSV('./samples_csv_files/samples_posterior.csv', destination = + 'samples_posterior') + +# Save prior samples with individual latent varying. +latentSize = 10 +allLatent = ImagesFromCSV('./samples_csv_files/samples_prior_latent0.csv', + destination = 'samples_prior') + +for i in range(1, latentSize): + allLatent = np.concatenate((allLatent, + (ImagesFromCSV('./samples_csv_files/samples_prior_latent' + str(i) + '.csv', + destination = 'samples_prior'))), axis = 0) + +saved = Image.fromarray(allLatent, 'L') +saved.save('./samples_prior/allLatent.jpg') + +# Save prior samples with 2d latent varying. +nofSamples = 20 +allLatent = ImagesFromCSV('./samples_csv_files/samples_prior_latent_2d0.csv', + destination = 'latent') + +for i in range(1, nofSamples): + allLatent = np.concatenate((allLatent, + (ImagesFromCSV('./samples_csv_files/samples_prior_latent_2d' + str(i) + + '.csv', destination = 'samples_prior'))), axis = 0) + +saved = Image.fromarray(allLatent, 'L') +saved.save('./samples_prior/2dLatent.jpg') diff --git a/mnist_vae_cnn/latent/allSamples.jpg b/mnist_vae_cnn/latent/allSamples.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1527e60b90f3e7003c6e628e030aca9386b11a0a GIT binary patch literal 2999 zcmY+Ac{~&TAICS>m~tOs2pfqMnWL``6t;37ldD3Gtz_gZl-pwE&Mc*oD_5D!k-Oy> zxtVgG9b=91tuKC~-{bN7eLtT+KcCn0`Fg*1$9HD{LP!&Y2>=KL0D$ZZ*qsCz19*9O zKs?;MAP|U;j~9GE?BD@@{sU4XqJmKZEblK z{nL6{1{x=|wRT$o{Ja1N#|a=%7_i#`kY~fWf%^yW-vi{}=$`~?$JGX&Ds&fWp#c-hIr^SYO}k1sm#c2ICgXjphmY+QUo zViGPbJtH$K`*9B8IjNxVMNx4{>8sZ@m;pnzZf%i=0dWvX)*km2FtV&<2;^h zQ?i1tyP@Grq=0!4D{8?}AdHo-YDp6*BBwdgL0WV$bDC(sEo0m~RzD%EgnaGBbf;sY1s1s$gKHqIyrF+vo_Kjp z%Pc~bke3-oawU@&B3+(sl(tq;in~;BpQ3m%e54n}qaDt=;T=YSI8-DSrJW-8)1^tG z)>;Z`z@+Dv`l1N%iP}c_#^~&NR)u!Z$U%w(?E|6nPt0NCi6YDStwff! z6wJ^6FB>$$ekvvSW~C4`rfOf;n=^d19=N7OJJ@`<-+wwZK}0EQ@}u=7~fFG5~wbW zPPMlJN8jbV_=Nts>g$uc7#TBIFmn4rx%Be;db<381^RjIzLcKOMkoF{H{5})UC#H2 z#>fW9h*kVE_tLjMsINRSD=X8&8*Z!6}19 zjy)WG9p5qXbDke|0c}RLiHl3M=C3swRGzv^VXbo+M8d`z=T?-Bcicu-mX81B@jQ&++@)$kVg3v5Eaw->?%~y~ z6}l>iXz0)=i=BaChqDY;%!jeEX}X*588Ct6P$%f8)M1^^u;31TYLQW}FjgEY+5Riu zJ>4=>DeVI6@n&b>E6N-QDzv zalu>g?iDoO85$8$N-68=58u4$HW;DXn&yfYEpsji#X22BFp*T{Cd=6!+z0y0fy|4!aeK53=I2g6`$*olpHZxhos=4$`B%rQr(2$7UmgO`xb&UmRP??j9D6QBOa=bc8 z>aS|Iq9E&C!ZR^3 z_Nd`V3wp9Ui2nD^54C1ySA9&IPVgJiXr56zM8pEq+rpK+Q5ZzGEDSeoA18AQp6WHI z`;c01=%Um3O}QcToAM7W5oi6bQUyaJQzuG+`m%NMx!*4GYaZ~atuNoKLT%nn&0U+Q zP2fs*^8r9PkzZ<_A~&8URHJ2_>@&i!B;DS5+$@}`g$cp;H|7X9>(gw&VD`pnhh3t4 zO@9Q_XLbR1q$*g{=+A=uj)s9+3p3vY1TZu^juyF$iU!0+C1UH2-1GO0SAs|N#utfL z7l~Jko4K{e|G@0PVDBc^ft?TVBeaH_{t;LLqcQxARj9WG?z1(eDi{QUFLeX23L;T1 z^5~7qgn`dm=NCQYE@7)-Y!pw$E@qBOMQX%M$tL4XhyQ1sBQ9OEkxeMtKp$M zY*-F5WWzWoyN5dK#EJt{feO_s1j*s3_Ko4f`z_c7s*K1*Ja^bm=_DCLYK~eHq!E|O zxVTSFRr-`;Zfm=~=fZ0VozP#Sg|*#t})Esla&7P#+A zpQIG>&f5;Fx#vTxp=pTI=133+0g=+KB(9Xt^W^lW&QXKE3({qEb+DHVX?n%i_e8XM zEn|bk@>cLT&A7)i4WV4X39u3I@PFTFwqjUh8G^ly>d!-HwtSrE)C6hIJ*(7Sx#d?r zkS3EP>>MqgNHZQw3kb9U-Zx`=6!zvhbEo0Kt7e}(gw8r!Wc_T3XeUfNBQsg%=@~y~ zHd3eHm^>_NVd?ZpK$TCk%G15z_Tixl4TfKLZqh=wPs`LFPkw^-7Tc3Lzn{7K(gZC~ zq+B4oAA#*P`{?HKDN|RpOV#>*(`#G`yBZKOG}}~PYl@diQZhNTA88~!^8cTOaa?2H zl2N>8F^M5y0eIi_sZY*I)Po(Vq~sG0N{Y|Ebd`XRMwf0#9V*%6d5R4S47U4d2`x0? M`O(MCj_gkS2XVcs_5c6? literal 0 HcmV?d00001 diff --git a/mnist_vae_cnn/mnist_vae_cnn.cpp b/mnist_vae_cnn/mnist_vae_cnn.cpp index 2286e0e6..51b4c7fd 100644 --- a/mnist_vae_cnn/mnist_vae_cnn.cpp +++ b/mnist_vae_cnn/mnist_vae_cnn.cpp @@ -46,8 +46,10 @@ int main() constexpr int batchSize = 64; // The step size of the optimizer. constexpr double stepSize = 0.001; - // The maximum number of possible iteration - constexpr int maxIteration = 0; + // Number of epochs/ cycle + constexpr int epochs = 1; + // Number of cycles + constexpr int cycles = 10; // Whether to load a model to train. constexpr bool loadModel = false; // Whether to save the trained model. @@ -84,6 +86,13 @@ int main() arma::mat train, validation; data::Split(fullData, validation, train, trainRatio); + + // Loss is calculated on train_test data after each cycle. + arma::mat train_test, dump; + data::Split(train, dump, train_test, 0.045); + + // No of iterations of the optimizer + int iterPerCycle = (epochs * train.n_cols); /** * Model architecture: @@ -107,7 +116,7 @@ int main() * size 5x5, stride = 1, padding = 0) ---> 14x14x16 * 14x14x16 ------------- Leaky ReLU ------------> 14x14x16 * 14x14x16 ---- transposed conv (1 filter of - * size 15x15, stride = 1, padding = 1) -> 28x28x1 + * size 15x15, stride = 0, padding = 1) -> 28x28x1 */ // Creating the VAE model. @@ -197,24 +206,42 @@ int main() 0.9, // Exponential decay rate for the first moment estimates. 0.999, // Exponential decay rate for the weighted infinity norm estimates. 1e-8, // Value used to initialise the mean squared gradient parameter. - maxIteration, // Max number of iterations. + iterPerCycle, // Max number of iterations. 1e-8, // Tolerance. true); + + const clock_t begin_time = clock(); + clock_t cycle_time = begin_time; + + + // Cycles for monitoring the progress. + for (int i = 0; i < cycles; i++) + { + // Train neural network. If this is the first iteration, weights are + // random, using current values as starting point otherwise. + vaeModel.Train(train, + train, + optimizer, + ens::PrintLoss(), + ens::ProgressBar()); + + // Don't reset optimizer's parameters between cycles. + optimizer.ResetPolicy() = false; + + std::cout << "Loss after cycle " << i << " -> " << + MeanTestLoss(vaeModel, train_test, batchSize) << std::endl; + std::cout << "Time taken for cycle -> " << float(clock() - cycle_time) / + CLOCKS_PER_SEC << " seconds" << std::endl; + cycle_time = clock(); + } - // Train neural network. If this is the first iteration, weights are - // random, using current values as starting point otherwise. - vaeModel.Train(train, - train, - optimizer, - ens::PrintLoss(), - ens::ProgressBar(), - // Stop the training using Early Stop at min loss. - ens::EarlyStopAtMinLoss()); + std::cout << "Time taken to train -> " << float(clock() - begin_time) / + CLOCKS_PER_SEC << " seconds" << std::endl; // Save the model if specified. if (saveModel) { - data::Save("vae/saved_models/vaeCNN.bin", "vaeCNN", vaeModel); + data::Save("./saved_models/vaeCNN.bin", "vaeCNN", vaeModel); std::cout << "Model saved in vae/saved_models." << std::endl; } } diff --git a/mnist_vae_cnn/samples_posterior/allSamples.jpg b/mnist_vae_cnn/samples_posterior/allSamples.jpg new file mode 100644 index 0000000000000000000000000000000000000000..092300d946a6f4749e30240490367c949b8cb00d GIT binary patch literal 3519 zcmV;w4M6h$*#F=F5K2Z#MgRc;000310RRC1+Wgv=4-_35A08bV92_7dE+-%&EF&BoC^soAFflYVG#@89JvcHvE;BST|G)qX2ml-c zFaZG(0RO}Q9{>OW1pxs80RaI300000000010s{mE1_uZU3Jd?l0JRVR0s#X90t5pE z1q1{D00Dgg0s{a95d{(Xb($mz{*4NnC+Tr5k9JlU=)z7wJ?o!%q=Cx1kaJ9C=iaXAdQIN3bL3jY%t$Sqa4E8BcW@W;A|NARnyLvI z&uSx%N#t0fLhi=_RAid!tbQAKj_^j`WD##80z-pX`o@QOpj@ zp?F7D@dR%*tOP)vWo`kgTBeb6q)p{q6el?OO;c7o39DLmm3OMSOK8hut~*rs-W=65 z?S^Yt3g_h@b*#^sT&n^I>J2}ua58Gmo|SifaIrycB(gEUL>VTX=98&H+6uQ(Ex6`X#DP_i)M!Z9ZRPSb5_$Ev1d-p(u*Z)@j`T01RkY z{*}LL@c#hBbITgNgF(H39%;wvS(?s`aiU+noy*43CtZg)tmkff=j&Y$h5Qk#c(I(= zsw`>NNe%^8*ZeK0cy>Uyn+le|bU77}56kOF*a!h$Pd#eoo{y<&8%>pz(kVCvSAu@D zx{i;1quhBn(3s`xwDzh_PT&Vx-O>CXsOtm}V}To^NP5(MBJj=UhMpw4k~i}?U6qar z+D%Vqrrci~M48QWPw?NwiKhL$S_Xg&Ui66*^ln*cWxL}cUuI%2%H#!=o}c#8i1NEvP9nTiq0f!ev;oE~du!@eK7*Kd5d zVs?#rW&?`!e~4N!x6w2!a1FDhS#=#+yzgB^j^5fh&RIvzRCIe-Z?#BaxN@n>1Az0lG zMg?<$h^@a4=x?q($-Jad0M6OK72J4d!`f}8uMF_F+{syFIo#gW=bG=C{k?o;Ai0&Y zMN@`B9mH}sMPN;Lx@MSuBkQrml3XiC9?+m<06&#o_>+5Wq-gd&6|^kP2hTBT^BkSH z&39i7^x3Ya)UK_g^DZHPh{w6D+aCvN78*s=*N^7iPKDh=ZnM+>%K&$YV2H zM;?Cj0h;zbH(AkbEn(5DwGXnz3}njV_};O6PjwB)h8`xA%&6p~jnvnfh9bQK;r{@J z^zD4hJ?RB4$SoduVO`bD^!L}x9+ez6nogX)V~E!Tf$v^D;*Dwby?W;GvutLf=d z*4ga*HK;|bTqzrI3Kq+5t|+J_vG`Yg;qMaI>Ao2IG!mFEmO#vN_k~#T$Br%aXtcFO z^Q4A9o%7bXE4%i-a$Q1>*s97*Y#CUt4^dvL@WLxeZS{R`TalW=#uC9!KY0CxdCt47 z&#r1x-AnSLH}2vc5qk>GRLc9;qvK+n~&er8%zKOFUvjMnN-Y&h;G|vX<`ZQ1H z-S6{cWgyp?lB{up2WnJ}T4h!{P>>1quVC<{zLBRy&pxFTHi;Q-qj@#wekj(hbvwxt z!X`^$Az;sq%~&BpT=%Y%!YKn>N{=X658VWSE7bMKG%pKye$P>w{y8pPM%W=>OB(S# zQ&4?ZRGRW$JjTc#gRrXmSYvBoXT5qSh5R3@-Rdx0q$TWQjLhGjP!cVUnj6+IZu|Hn7@T={ijEO^AZcE4F_M^K}58 zY2i_&P)^k(WcmvB-weZ~=-M>@0P#DDI48AW!PsueuPM|d(rxW#w6d0I$&)+Cz{O+j z3_f19*!W~wO`u*_$*8TR#F7UrPBH-LSGBJbX*zs1c6w7h?E?PtUd-Or!(C1;?&O&8 zT;$Yi5otgkz3b8~^?gsmdR$s}hT=md#w4EPV6o5e=e1V&y0+(8(`Aj-u3pUz#twdL zSDuC3ymhXV!WWk|_ZL?7_Z~~j9s%8fpRINTmZv!pFvy>zp9;MSDNH*5a$so z{uS+6>b!B*wzQ2M?j~EAolJ2sVu$#>tI&K=;xnoEFxgy2n_^rdC)O$EIB9%Hl*TJ&!fNZu0goxPp0-F0;s^V>grHRIcVcta7M z^!VeA?xRT|69NG}YszGir=8`H<(-Q$ zKBkm`<En@>(nDdj0+xS9||Qn~}zYhr^e zlDF?9Xa4|r=72f;X^;1*wB#9VQ`~&NN}Y8}#M9cvCuO!{mO;?{YM|uQh$*d=Y^fmo zQ(2kLS&2UM=*DTxpo)(tJxv0o1GO~eIZ{FPG_u@HI6*9o;RX~F&{I$Y%_$k{SMB^k zt6EvfX9fJ}ZsP?5oMN+w%t<|I$rd$VJKlblnP zMrl}lze;JEPcO^f+dsRWDFFF%PhL(bMDs)n$1AAMK-i^g%a>0rrgDdk tnq8P-n2*>8cAUQr9ncG?(R@JhVE7xK~Nfo66qR17#gHI1cnZ2q+1Y- zcg^75|NVS=@uPEJ>t0KaLp;~@^UutmWzby(8F?Adty>__E#MdE&pb#HgpG-bg^7WU zg@twJ4mJ)R2|gY!E*=H(Jwg&1N;+B^N@{9)CN5Tb1`bAQ>W6}C9FMvA`1t5pg~fz; zM7enRc>c73aIw)IqdmTLiwN|m3q%KmW86Z0f&PBoLc5KQfr*8E2L~7U0Q@cp?bhwv zXy~^wFwoI~PX_?M4?-uxAb!9tfq75e6pO)ygeNF22b=MERXeH1*bx)2nQQPJ95V9z z6qL*?tPk1P`S=9{g@m6-N=eJe%E>EeYH91}>ggMpTUc6I+t}Kdzbq8~NCtf{p|OT?{A%f{Gy1;?i$fWQ+JYxlU!9A%-(= zHHyF4)!TE~W;Ebn%6|iUzQTg2*|HV4Sv8we1#3UlUq?Z93MNWCqT|mVL!EUlnmqZn8a@&8~y_Az8TXw%Van; zY$Z!pr(kw;7SXVSYA?ljI#k?c3aLb0ZqTX@D->>?3oClrUG+`b?16B%FmQk6V1=fs zisbPDUZ(O9F*XllmP45)foVH3i5bcgD%=G13za@G zN%1QCTArU_xe>UOxUVbUGzM!O^~|w2!{XNxAZN+tgwDU~fR;g@>;&Jf?aguI)hkhP zQSsU$wN{+qf=8d#)Vyu3m>^)=4Xjj7mutVLaPE}~;Dgw`#sv=@9a4`U`I@0{wSGT0!y69ULR(VR@OsS&S78c z;AXLse*T8>LcKw>k**U6-KxcxKcJ51wUHZ}waV4p2fdi}%^BwWr7ORlUQ4QB6AmFW zON|X)*eqdZo$A$pb*jGG6VV_C&%rCbr@@&{LgyLPy3f^_&A04DW1} z#Ju(CB5(4}t8lXf)g;DvY39`PZnr-mq9x{I@>$a8L9|ufQ5_-v-t{$#a#h0Z&vU-e zE|;+N&6XEhHI3sx$vKzug&-d9h-7XS>{ZZkg&_Q~KA03m8M0{zTWaXPGtw14CjF>N z6p*CXT*<}ke{LRP6sv-bTu}M<#3V6eOlkk9@417?cz|Ggys_QAQo}s&C?=ux44h-t zd^TbJ9r0UV9CPJ1YvLH8+RPcig0Jol$*`e3;#&)caAhw~H?(9b-JxZ8qar+l;axZmJiqftAREnIVr9o&>Qgr6Q8jStWw6=1 zE|yukA@7uncNrTou4zIHaM7m)F`C-3WPd<9!cM;D#-5X9{) zg+w(H5=;t@{(vNt9}?T>Ypi-OHSB?tk1wMh-KDbm3gm71uMh>-8Y{x0eG%a}VVX)9=51ivsg=72WV})Lp7S)yCQD5fD#*!4%!;oo-$2;8w zE#Ga{Pbv8aTV3z)4+c9!G&>t@Cix>@x}*jz{9bKQ?b0cBS}}Ly7^v(fKggkW8*hFA zELYWEp>_Ex7n>t=;JL98o46^RyDsxuUO2wn-kAJm4J5@Gh#Nxtzj1#+3g?fA4LS+K z!v=?n@zm+KhE`;2gr7`i{c?OBs-Z;zjy)Dh^OyAl%Q1Nc47F{= zgE_d?nLJ7jjP4B=$x=V6dP5;nW%6cCp6kJpWlQL^!dNdn_^_W7dU6~rV{0ssux%1^ zbU-!ldQs{Ol4h2OuOB6DNa@o3#Fu5>bYL~&(`^+tK>TE~g`I5!!6-*(ZVlVh&GDW+ zFg@~sCr;CUbZ}^DXWDFTdl?7SHAb%YQ#9&|<^m#w6R8lw>|(;`nbJj$Oyf(l8gX^e zZ+8uig*z$4dLbC~=pb9yGZhlYO~#VT*NXB7x3uTxC4=RMeIh~sN&78!0e*akl9-p- zg_hnkAY^VaBDS~Z=mjX+N@u>mpNR@kk{RyfO!sIsFn&`$Jm$rT)0i(29D z<$-v`jy9(e7zz(-;NSpHY?$8Ym96Y|&$;D4AU_J&X>afjA+DZ;8_)XkJ^=w_SPQL< zHWAh&e^w!X=|}sq@8A<5yU@%=hKmu|r;YRU+DA8GS~xh?EyiQNzwkdCZgOxAaDg5) z`_`#>TdPFvs5ex4Vqx)b4%~W4sGw^^XLnW+F}A}awP8W4!tnsp9|CS;sycc7(> z^1qVwi-hYf%~tLnPBp!VKYW_Ed>6V$gm>@$E&%X8))=J3+JTP(Nbp^3oc zr!d=7DiNs3_LfL*n?G4Hj)#DtPk9z zL?WrlObG~R+_PRduS-k_BdOyI-wzm!>oH5(`t9pssM#$Q;3`kRgQ=wPZ0piu&#Nek z=csAe6kZqfRm$YCiXhoEjjv9@C-Ms083FUUpthMDoI zZMh5*%kL;Fd@!F&tM6%#i>kAy^uO>T7dqXFS8`vN?dIl&y4^xe&F3-+5;N4PmC4vq zudgR0Eaj_l?<*~+1M8ViU}lRgc8|Rf_hIT)9?sCbM^X6r{$@7*{%|9YqzePs8Mz^E zLcGe~E9C-@q4NtOh1`o=I&e%he*ZpIx=_&sMWGOCYO?W(qzjYH!d>861cgke8b$ZN z7g+pf$WpoMM6u?jqy1{Gl2t~VIn-aUPUqV;epg&B>QYZK5`dZi|483)J8+#&bTAP# zq`04-J(ex)A@C3?&-j_UH@asvT}0!PkgJgroAZ6Y-6BpkUuxmK(h$#Q8jjOtp+(~h zjgzIObX0h3VOA!FFYn^x;;FTu%9JmI`F#XKs(u*HbwO8uMZ}mATpwF^uRbMAVk-A| zBpQ;t<3jatPKZ@wr+mgGYEuwD)T`KjKW4b2fM9f$v9dzuo#fGG>5Aty9&rE+gX3f? z7CaQxzL^wj7`5~Bfn{F#x>LE#-n)(uJ9dw#ZN4|E6jM~k`MpXRdkWM6+eqU^zB8qcL@9dNBmJF+Cp9@T$F6R1FHYT_zfk220 zj61luXgsazGDBwh5rESd1k78+=N4hsdI(xo*6|kVZ>f-%(q9`ORHMfm6SE^~Yr@n{{?Gh8{{np;b zU-?C#iW62Fl-C@CE83d0X?L?zX}hm-Socx=WRSq6h?_Wq~3*J2Lx7F0Txt}A>)K|3i=y{eH9DP*nPNjuJ#~TK9b(hO22M#Wcc3!8y zBtX!0+10&0yN2MaOPA3qX&`e(F{!whGM&&q-*sOACS~Lp%;hH($#B2KVxZWcu`$U&;!|gx8<1BLc{rf4;SjYux;vPoHN6B1lx07 z;cL-*r7k{o?(uOKkm2@QpQH(pak>$?2*;THlRu!G?(CH7%@Xg%C0xHVvhUH3G4Ui` zq_44OqdZ!gQ*?>iaSq}o;nKdGqY?Iep9y7g4LG}Jl}{987b^tOvHI_S&s!Jpr93B$ zXbeyADe8Ju^J|q~IIc;TZEaBr*oyTARY1@Qu-FWze6qxJsznkq`#gn_7_9AH+R9V{|oojT=_tn?m(yLHwSf7qP|8Tz9qPz0DxL}k+eblmPPy?6WB})h~ zQoLH)KtdXZEjRt;meF^DCoTp{G%dlsnz~tx40Rx1-F)v-gBth|TCb(khN?4KvI(}) z^gA`TEXZW@?GoGZ8aB=k;s%eIOQVi!3p`$sEDn&A$vu~8eT}nq1gti7w6RBK@KN-b z9KY>*h1{`KorA+NU)0Dg>S++0<#G`81V?ikdj8^;9n`OkyQT8ioPd|^y)|XEomSSy zR5rOUq0(n)m5*IATnv6wH3tvs$Y${@ABmNYH5A7TlLL z8a`9rO!D6F`RxVR1U+&m@tQ(m;Ayq_=BLcAs6MpfvoEHBL>z~g%zchLU}f9*m>HGz zT89jHScbIsn}SF6W928DMQ?wDd})4B!CV)T8@xnsu;G~oYNwu#_sAFXsn9v%DzyGC zL}b3nXP-l(?A*#VX{dXQcbfVWt{SH~K^hSfo1rrrcJQHQYBk=YZ=LOo{~PV2>9C5> z++gews<8RZwYXuQM<$8L#a^_{C4Hz2Vl*+A8L|jiGop*;x1K!TF0lDonN2S-Px>Y# zHi8tsVwmn{?8?STJ6qX5jX5yI?A;z1jF}wS(Tz|;FgMPS2(QT6g~|3w9BS%~lIHIy z@`;p9`1DU8hIX@^(YK_EUa!(BXwj)WFnezcz?Wd~)ESNNeI2 z#X8Q8KmTepKJk(|Cn`z;=A_mnIDKlghr21@89Pb&E&((DQx@0|9&h8{g_Z9f$Z~89 zt02)<%DoAXvn26t$iT3LY1mnATUC4aDf@J3S_l%6q z<*J{&MAT~bLOeey152I3qPu>x*G%#4`hi6rJzxa!-s|snEg{&u(#)`a4=z3$jpExU zxZ}SsI>`3CL}Im}bUwk)kH257)!f=>}VH3!#lB3=z zzC{9xw^u&NW?@<(J&@Gq2EmkSBU0Q=ZhHd6BpnOBqBWoAG=%BP;WJ-d>D6qK*WeMPl1X%}W&{I>`OJNMenD$asOOsoxPNj0cr!d+n4+7hM8Xt6@dVc-s{6Y@Li?78ZBnlF*49G)J{zgtYvOgV(p3ghM2s3(M{cN=HbP$_t?U9=4_bZ*AQj$fcL)Rlzh%oNG&AiST~B}JRKJd z#^rS)xxK{%>}Ans9|eF=ISp0kRcwoJR1fiH>5hTrW}N5Lblm+7%`cPAGe#57Z0|D! z%ZuJJOra&1a;V8iSiqlJJD!J!p5+51l#^>Cc(vajK0v&$W@lizgqls=&>Sxf@7PQ` z6-Ei2E5K!BR~mMz_R>vWWm2p{$VorhFNg5?3WfoO!=;ain!y%^{c_lZMf4nMGQJD+ z6lXrA<4N-q1v^zoDg31>wTx9H>@70Nv`lmT9uERr?=Rh8O-*!0)u&ov!-&|Z}W=}^|5kpeD0p% ztD`8p>{;C6)L>xHn?EXai)1U%MW?2m{ZJnO!8ffkTiY_l`NlREFRUAJsC}s?U(Ogo z-&XP0wvtX#$r~#U;@(h*M@kKohsjfuf^uK;MYP5p-Tkr|wjBR} zzN^@kAfb&z*+F{6LBW{WgFdQ~HXS+IXAeA~wo*!~bhpwM%;hDHaex^lXpeKb`@LgX zFF?(rkPeuYTnUhI0A`DBW<7ve-#XT}(|O*C&nFKY_ci4*q-h0(M_H-^SrxI5ar8^c zvStPT2W@o`d%vfBpZ@`ssV9vpoHJS$+5E<80Hn>o4<~S&uR$x_r)!7bUjjWSjLs@Fvj(o^ zkEFW~s$4cDHh%A;0u6HjX3K(1h?3{nsWN~5Zof;rtVry`AAQUWFcz*fb3qU{*t(RO za_xo!%f!DHg<&O8P;8qN`dE4uT(bBL>nzKo^)J~(G5U2OL z9)Y}H!)*l>W#3mpXCmDv1|!-r>wvKtY_&4{aPf}VE9qVj!%Cgq>4mP}ELU^5Pou21 zhI@J!f;d+cF7v10T>QDRBG)Q69qSfk!g-d@%F-g)*2p{rxi_y6*Uuh5NE-F@tFRLXtPo=v_e^H@1#YsES{>j)xrJPv$M5fs-LpS;i zwOYjMGuw}`g2B?Uwu#AZ)1<@x5_&nugtKuM&2oZB!5XkYX`*eX`lNZxaaEudR*P>I z+{U4q_ClApI7;ZV7xD3ki^-#j8~sBYTe{EaooNpBV9xkXI^_L}A*74WD&}WT49@|9 z1WSWa1`!l-^gV;0(?BT0ivLHd?{qPwwv;dwy5loF5X<=K0RUJOC_6oWbjy}j`qLAh zybBz8*C#j|&3@E6SBJA}2}2e})gkZYVS4vM3|eU>QZy!4-}IQjNb4=CP@CR2Q^ln! zwo)fir->r~_qc_0gQ=nCPeI#YC#!fg;?)&-9-=S0tZPL%byHnL@|&bLSug))X-+)| zmq<-KaM{7|jfix3NlQh}`B-l)@`rOQzW0=~cfJL?$`jp>KgEJ~5Un4$l04bi@sfHk zvoxPZ9x~hdPkAj2XRNP&>No(12%g{0cNOZ=&C>C<*{t zdtq*Y%p;6pf)ZlQ&kVX!kVEVV?r=g+iI7s~iITeSRDE8Hzdm3{F?-1yy@=f4^$tIg z0XWRR+FDqs>`McZu<~X3prH`lef!f>vzFUE6{56vYpbElq*R74o#llqctFIwH;CmF zQDstaoh^zk#pL*2mvog)X^FliF7K2guit))l{AC=q1>)6UtT60yNeKB{cBJ6)tXg( z-BC<_*=g~0;Y(*%HxnxmlT}iRt$5P6uY{|uw>IyA;&K?>gX^>J%2`fVF!A_=_77SM z^FMotib~4ZA&R7eSZAjL9@g^*WK(yPnc32{n^3byK%fE{e)ccbJ?*@#7-$aGCh7@A zikNs4YdXwCIAMrIGI_*J>v=F>h;DNCfP~(4fhnx(nPIO$VREwHWL4p-mJ2f?q(P&B zkl{qMXM8ANlf8UJdYxMtC#Bxg%K>PeN8KrZY3-@#P+y?^7QfO%wzw&n&2Qfw^;9Z6 zLKv^{bnMjX*G>VVg`uXe=nR!e$!ffjEZ|PJX+hCy$*f(`8?scy`n_oNVwM-XWU=W%~wg#N-mv)F<9kUUThX>>ZqX7c=JN$yk zuBxS>Gq(90Hr;zXiWyQ!RSbekbbxR7nm|U7GMU5(SeC}7cVeE~lj1#m8I?^GWXXL9 zBpL3$&%>>`XFI+yDo8wVAU0xKgtdkQGY&7!u6)L{N!6Ej3|`b#Oj&t|5=^n;^eBLD z%I7gNIfqWyhSL@Z52+{A2zxS?&7pb+um>7(Dm#Tm`0DrSH{Jk__doSQp-8AS#M>9Oh?F(Agm@o* z_MmrmR{L)$?w1lO_+RLfGb1OQ1*un4Q-_7ydilOpa5;>{Q@tTF3?_{nmPD*WlaRhB z0z51o+VE_#$?h>t(NUJMp!zM6t{&SFOyNRFA2&yo6{3VJqCyh|an{JKI>)nJyjrNA7Rb!|FPw<~Uo1Ud*eD#t7mBe>iT9 zcF5g{qY^@qT4CjCLwTo_2;w{0XS)XNm;P0QaWlF(EYT~AFFLvA0-A$2F_`m5^L;)5 zQdBkQVr(6{cNTe&>tH45_GnQ;&3j(9ZrnrecRxieMPg&|o)FB*c{cW(GpVYvUQ2j( zGI9?*_Oyx*U$zs^o^xTLBOj`o@AEN()>dz$wCpG*JdrEz+}(;WGm^b7hA%zfk(TPG zF7t3pj*+T>=KN|vi4+%30x*1;8p)ys!?9-RAGuMI z+2Z?@0P7eb*KtfT<)0fZVYBHIxi?kf-K!F!I!R(Exgkx@QMzyR`!IoK`+M!7hx7YF z9Wmf91eP!EZY!@jKkyiRB=Z4YbXxwi&oJ%4>YkCEostkLr>6rKptPEQC@q|dTNPgC z*AyDgeahWC-a;I3TV559z1?YZ;iKbCjy+UY*lt&p;^W++F>blE8wktnmG|V+`+Dt` z#YJ^>cYBuK=Z;t2#s|R4u;0t|y$sKYGkDBV^lAS5rKJwolz*UL>wRp}<^T%6Ca1g~ zN!B$tUYmSqs8jPSyok{}4#*JjjgR&-MYq3$0|q^wjXm3i_;4L)V22xzU?8dLZ2l?! zN9M|`b*`;MAgOKTldaMEwEl7n8r5!g?F*R0dz#{R&2}l#<)(0imV{j;qs42HDQwef zl3j=`*MWI3fO|nEZ#;nau&PIUE}SK!Zgp-0vI?iKft`f=Vb$${wC~jF1?x)F^-e>3 zzw#?~*B;I9;LyVj-R<9F`L?6mcR!h%Q*27zUoq-`&_?<#C6M;hgy>W1rxu3Mndw;? zPjoZTZm+-f({QB{!}oRSy#B>=su{Voecff}#^?z%@4d=F{513&tT*g={=D$hYC{IK z`)W;%;q;=0DiVqkn%oYcjD)*BHKEz zu>e@7bBr91pxuVQUvZ{tcZy?9GIpO_;&(MLw7pjatopn)YT$yW%TjmErb6YIw$$4E z=o@oPU7UwATKr8O%HxW>vD7DEjvvX%44dKfO~4O0Evnb5-Cm9#%81^_vF(9iPDtNV zM!N!okE|m5Do$2gc)J=~^0PbJX)@~)T%2>{O&$Yw_RizOIe>8~ui>2HKCAciLpF*r z(xL03ZpD8_3o<|f)`wevrxh;@W5 zG{3Yi_rbub;NJ;EN9-|sYwt^N=b+c|_j-TT{EawPMwH|;C^134fna`Ew3Fp4^E38v zX4_mYstwx7Z@*cm%J=;-8Q`y(>Tt+ikDiShoKO;)KoCE1i)Z@Ri|go`o)fGXImLKL zmRx3Ss)aEsF+BQ!*6SvJLQrk8il@ruQ!s9;1o zl?LEcR{c0X7`b!N?t8#^dwg>yn-yIIMmg_cmwv-|`Esq0v|^>H-u~ReC&BaJ)>(z* zu}Tw7MQ}3q0}L3sQz|C*W^;TZV2!G6SD88CpsKe$F-fLV^%WF$g*wO7r#^uO1w;UN zg@n9ai<&taULb=uiVkMHMdF#iCak<7BpKTb&sw?l<$XrziAhZ%@=0MM_FD%*F^|n< z28a;T_tx;W;ZApzx!(=mIl;IB9F8{@Y~698W&q)C9?S?PxuQJ$sa+9}(qW74f_1Op zs~|GU5f#;X2T>mO7VSZJ3>9}AVw!MuUmNb=DsS-Uk#&DLZYak zX6*_pReV`A*-fVYn!#9E{`EyWSqciY#(>-1o^zZTaREUlGWQpae&_qn#pZC1sWpv) zJd3pa^JwiLxT$-G8n!Qq*|Qq~lOT-Fojg0Q2_7?512OsHY-mxVprq*NB5L2=P@Yi$ z=Y(g?!>uu9&5rzJkrcQ22#H-A^oS`zqB)bi>gP<_Pu-^_S09l}m)UMxJJ~!?1F>!! zm4rau-kxB1(9#@h7rcQm@W1xacWG=`e7^Vf>#)17Q|fHnzWT!-&US_rYc_jK}s*dNN6q;2*+BK&misvYK1A!c7qMv2yYoCx({S@jAvIHX8=7t6#mkv8mf| z8I->L2f8AFMxE^}4CtR@bdZVsrGWE?{`og59me}^Q4DDG$6 zfSEiJ%oG7IQ=jJ_^Um(pY3#{_m|Fr_cY!RpYahXK0NagKns-wMMoR+0{_|t}MN2j@Jk1C>AU^0?2G1 zN7x|XpRkmsdPq})BM`Pxwf!%d>^#njt8gJ4}^ZrG%5dh7S0W`}+qM2%xgGZ+LNKem~`EJmUe$gtJJ`WWm z94KJvB*&~Q%9=9YJ&YRws0i|HXIliYkO(JvOj$LbR!J@68gM$}^Jjq$nZBsX;TX`>|?l2u; zI2v6_>cYpT)#AV2eLMmox--IN{GvFd>k@*6GGB({KZxIe3w~zDFLS7qx zEYll`JZJ>APjMX#&3iy)R{q? zeiIqX*(w$#YKJvY#p3_n6bGJft838xtro64;v+k+y9aK&2O?l3W zgWR@aQPRzz`Aw+~7~J-Hf*dqP4MMeh;#}5^NEZJyn0HkB@k(QdO5My+W-UZ-Fmt9* zx5W@*ITSMzz&2NqXVzcb|p|!GlSSY#oghtg%p{RG4|m( zE1Sb4&C(}-h+4JKbzE_kd-&OsB{(yL;?;@5t$r$dYj&|&<)!Vfbq((TeX=s3Pgb$A z>r`W0C3(F;$KtD7$QhoK?@hV$2V_`(nghH8^epj9cn$9HJ67;^`l1u^ey)P~5O@z;MiBL@;a1Bo}%W$18?nWJ7HfS=c%o#r!tiqv&G(q^m5iN=(_* zUk31`yKv1$JvE=0ti0(5NS$gHG5@|OMZgonCJ07) zM3&tOE+5G@X*zPU=+zZ-sA?Mh0d+~o65jolWau78e@Z1L4^srXa}aOO-u=1vSakG@ zA>%C~>YtM5+Y?M)7-7XQ{80Da;$M4#?70D=muDnHPj*t~z>sVurtJ3lZanza-Ct=` zem$?7tb>(ZeS~@-x}CLX*IL>_bJ^UOEl;(oZA7U!7uR>jddUYVk4GRqt;n?sFB#>N zAFiBO=q+h;pa2e2sQjnIcMFF@O0+#fbm#_;vkWTg4@g_uokaf((Cl>vnKBj4KLNLIfG?m7Z zIx*Ci_cl#;O|r`k7%r7z1(^!6MBuy2(=paqNV7!v z8l9;1q%`>@vWjN047@ts%xVm;pcERiJ$-y$p*qd^K%88VM@gWUi0yBZ4$$EXudip8Fx0VLFAUsZJJ7lF7cPY5mPu2Ga90eiA#l!q`Hn9( zKjFe_e=g-I{ROp^+XD^YA2Q-}?P3MLB=>FdwE)>#7gZOW^OyDEP8qiLuig?CB26TB zMYhJcmJFjWS7VhU7+F2RUw)eN&R;&E5k8oV^Q@G1mbafyB~axn3j;b(QkSnVx-0$G z+)JzEjmLHAR&86yR>A#mTOlGF*~0y8WtBI!)yXjz>e6*hAfvLU`@wrepYtajMrew{ z09t0$a=e>~g|O)Or+uJDac||P;NyrUL8QDbGP^7>rSH=|Xin_kEtfV}A=(%fHnGw1*6J(gd0lmsuU!*Q$G)5T&H-faE?bmVl9 z9l4L*Xy8g(bDmHsCNdX*@t9BHyZxf0kJE(hw^)j9P>|XBNvIjw-0aq752X3HIQeTw za`LH4gF~TNy|C~o|7IJSjITx`@>a>)xJ^iX@Jbk^SUFbfGkqllnmkukd3gf%w)myE z)BxMEWq7rZ{WE;7?Q{gdt(fNdSGf9}qPs0ep5WVAKc~}Q-=Wx67)18kUVys&7(^(v zq#{-Hdr7+>@pn9$>WC?@Qe}WJITV!H()#Xj|G*E&$^xor{?65g-evB|DdvrpOSkhJB3RjKJ6Vz*Wm{Sus5V-xwXy>5ZPTEw44{ohomaa= zRb}`lQIY<>)JwOo(0}S^cg`y0j!1N;@A9OPJddm57!e|E-zC1o?-vg&tL8cJNQ3+>Bx-c1L|Nz(H04+bXPAvxovVg_G)uB*IFG- zrmOn#vhJN- zO}AB`n|{Hq?xQRK*LCv)#Wv(X6EN@~OG;-MsKcpyi2e`7@Wj|o7gb%gMtS>#{$pa& zUM^^#Bt;|3QNXq1gTg)Dsu0Gz0Eq!m$EWC>1)W_!$d;aS=HQ3fy`vdu_Jgho`6u^ z_to5L%=%WGW&OUWZNV)_y?|GeX1LqqH%09jCrg+|s)@e!b&-hn3o4u1E15#NS#$1A zo)m4dFgL&OA+ORW9v_+-(Uc-}Q%q-c1NmMN?$T0vO*mwzqQ#HX*#Vs*pM3M=)y6|y z1Dh|Zf*zHF$_sqL`#Je`+?K$C9_1aMzI|&w`v@4HIF6) zGVPb#6%^$HN{3NhHG{^lcV@QL7i8vY?DrpvFqUNTjOUC4O)gOxp?nQw0}CjsY3j|T zH|0yd&(yoZIlJR-OnlKPQpVX2WoFJ3pWNKJ>4epFJn>BX9-5#n<3+E2r{rGp^`B z4TTvl|6&->pIXz<=xf`1M`QOcdhbCM0wDp462u6OYDWPd+;1>1>`B!+a7*A!Tt!+c zbq9w{l_>o@hUP^TDinnI)8rbc3N;`|YAk5p#KL8}r?~a)?C4)hQUyOF4Zd&REpKgi zks^;Cpm%;&A<_7yX2xHj6r(cP(s=j*=@yRj0Eo7brYqpLXsCmS*?p-z3d)9TI=feMCLE0xc$KoD zZ&VAOO!J1kvzz#Gm|NY{RYjqr#5H#|{7S33^3v73y7t7;TCLFOz6MYq`vug;E-I9d zn16*$?#cK)Ueb7PT$*ycng6SBwW&}VjP5OmxVkmfPzG#Q5aLIZd3b2X1OC|r8E=*- znVb13%55<3qkFH&sNz2Q38arr#ckB!>=127K$o1G!r|5lB6xV%HA@5myzKp{?Z&_+ zXWk)G_=NyI@^Wns?v6WCc6iDm^Xw0Z3p_3=T{=H|3F>xmB(_C7w7fsZJJlSH^r5G1 zS4kNY&kbe*x3QTUV2Zs@vcDHbIa+A35t|YPyxuiBKz7kuXvLs?BD>$iaK?S4`)I~l-l zg51WU=q0UQ@hfuh2(?WS2}kjlJdElEE^}iKlf0%A6zgC93dBQvAXB@KNhvhX9d{Aq z68LD6N_)ycCVIf)hr$#l64D?Yb&m}pauWm}!ki?H|A5}`_rQG z*Qp{zmCrnX?^hfaG?<1kTBG!PW%BGBhl2w; zQ4h#`VYR^n%k##VCV)O1nE|y%8o+1@4p^eP!hY`4)73`xpgw^1P-U@XH(3YwPl^QR zG}Xq0Z$x!5D+&!~<_xeI-{SW+nIWU3QS|i+-}_^)WUMB0L^_*tiCec@N}VduI~#mW zDZ?2wmzulYUd+i7JGX6-%()|C)ksHt3B!M(Qd?DBbHWgbigL$t21E$SXz%bYKlVP4 z)#L=So|gdf1#NEdo9~AindX_z&=i-5D^bRe*zCiS<;{@1^zryXk@)WuixSm#D%+m&BooNC4!?Dpak7c5i^U>Uilb;p~qS#GgEe0V!MB^qwOxLoYagu!)Xq|G%e9jb%P-^1HykCGLJG=% zRtDX}yZ)yM_F|k5yzl5nljm23$V$S@Ei~Hpl3Ch#UVj5`RCzB;knrZ9x+13WRmt!N z1MWS%(|a0A#RSV;5FrpxVl!Rx7peSS-+rg?T7aByG_6m)Ukt-Rc|}q==6bWWUCA zSSZ?e^@@<^E`{4lp(^jZ$`*adij#L#O_dNe^D*pOef9IruiPg+?78fC6kV=#<}Y>C zmAN0yYMYy8+#5zw*uoZC`L==bRJGT-A(vq>>xTlM-q(`^SQsflS|vMx+F2xYJ7nY9 zfeSdV(e-95F#lIVTT03|+9iKwU29aQp(-I?yzND)-J2l%{Oeu@vc86ze1~gCHya)J zoWlVSEeNUnVw78*5Gh1){J_Jn-O0Yeyr1<$uIBgwU)s;&SzOOKH|-=;)y`0UB|xI4 zyH$itU>&$*Yy*CjlkWO4^y~$J?GyOoc_O89ThyYAp5sR8(^aP=@<@$gSL@)%%;IG( zMmj3o(AlFsT8E*x5f?k3S$wTpSUAQ1fK-n77k|T_W|Ai>fP9IaF}$||*?jB7cun4| zWU^}3H&sU{)$4u0QN%l$OgVlCw4pS{T&=>nH?uV$Z-JtgAuSEi{--VwMF6^H)xx?* zUMr5(@Okn8eJrwHtq?e^xz=)-FIvaHO-nlNafgeOVPZ=!hh5PP=wEk*Mt$u9+cXd2 znGe~Yv!E!fVrBkC%~x(CpGcmDZRlBX8CSU|kxM{{(H(VjW^Gkh?+ThL`n^WN-! zi!#d!Zzvu}972yrkiUK>`jn)#$i@D`FiVj`>1fbvN z2#)Th+$`SveWOa#`Cs+=34=FVTI-3~W#lA!g)690Yo#ymbGcuOdY*DfAgZ}{AX%4T zBs#71WPS6QcgbJ=Qy}{(Z1ISnJA;nHv3=VlrD&Gq$bCA+3ul*FDwNvmZ&K#+BKNAI z_iB6R51U}|ZAslDj*e158BJOjSJ7-EuAJp1la%A%=0 zQ;*3avKO=2?WQ0Xd^Uln#?Z%Tt5q#bI_!M~#EhXkG?!SW(h@+D`r9eWo$zPM4@!c5 z$o)1GgG}&4gyuV9JUCWrWfXdZ_}9{I4zr5hD<~s7DmbPZ%1=8s>V3z#3ZF`Tm?2Ki z9MmTaGh{^v=uyzDZm!w1N8@Q)M7gh3wKZNA#kJxPPgQ)CJCJkJJflOmt(u>cDr;xT z)K5G9qRY9K?p^NT9?MD~uwE&Q+2Ef+Wbm7^((soVzf0=G7Jzao<+JmOE9V(QxAgk; z8Yz#5mXB3XO|hIy%sU(xJD4Z@?03}0b(vSwgS=Kn`hQMO=-QgnZ>6XVXSDyCUAe z#3up%YMx;8>i6GbMZ2kBaEuIatvsrwOVGM|1d@8_eeDO9P;)LC9 zaiQQ!@-J9r-SAh$@!mG;2#Oc80)RJ@2gLKjHrP5ZkS1)_iIm; z_ymAyR!v_i`lgod)xqO8w{Dy$h7Mn zytF{z^rSV)zlPbY1iw9SC=~q(bi1;6t!t0+;mvip4IP=0ZR=a2)9HA`yyG{`v%uR? z+aZ0Y52c=a@kXuj{|LR>SO}J+e-zWT#sBOd|EepDpLyv+(F18b&hc}?HR$B;ICK`5 zGDY^pP$xt!ktal1gBY6PsGExbN^=u}fsGTD%NL*YSx_Cq^`21S2Kg?D!3}FK$LZfNGF4Zu*2lPNr|36;AH+$% zzn`&L{I@4I0*$(l3=@OYAAf2ojNk}8eF%N_II`{f)WrD%8R+lP)u%xW&Glh%>k>FJ z^46wpFe-y2%So7koH1#i4r@7Z;MBsS^a`v>TS)cHxwB~0V87Y1!uo?=^XbF-_jnAC zMLjl~SDta)+E&;N4gin)Dx7+ zq*{M_zyaO`+#;87e(a97 zc05}qY5fDBYxdud6W#b&fvt%W9)7P-K>@1I#-Xcw7tEw77lk^E$yNB*#|&M$u~7cT ztaQ?xiY$OBBMV?aV-5zR*O9Z1BMryaVdN+O+y9zccq{R}P}NPW|DTE(8Wh<|J5>Cq z`c?^WnuXR2gPTs;O}y9;O4GtnZ81A@zPDb2q%)VU^O9BZ=u;1TU|dh=e^chKDO2Jz zYQEbWOI=A*EXnF<81A%UUrMs5OL?gnhvq;2_zbqUZGc(5(od%Zw@k)h>H~nP9eJ2? zbG3;OZ_cLn({p}rsQwlmyRSAKh3(yK186`NFSRC{FEeTJwwNM ze&h{~NFZ;}pz#mr&NkFJS(u-RYdqwWsE${3&9}2(%2JObbKjGJbjScX6VJABavbN1 zo=pFu>*tYctLg1b1$H=Lh__&9-cTXr;~vyCUEyTu&Xb3ea#>(mc$XcL&B&S-7ex^f z3vqzTIDy9v!If!gl9L6Uiw8IDwva1{)6iMe5;CxH0#?P2l113(4ob1Sc+TOg!zF^g zWBpc+PqBj67?wiN;=zXU5pXCXsUw_RJHB{hbMOosbpK5V;7%P?S2D)Zuzq3 z@Kd}Lqhw&G!4|th80B4@#;-zZ9&#C(n6RAD@4bzMr>{2Y?R#Jl&2!+OkP5j@{wL%* z`)k)DF2H*S+(m+c2??pFF-vD;&W)R)akJw02M7Y0c7_U-^>s`Gs0@yoM{+a`KTJL>Xo7B|*48cF#c(X8(}R?0#2I*#qE z*I-k)7jFA4rQh0BNA7JY3%P@@3B1_A_A7yjh@lhvrX}tPVdI@$6N#zBbvoa(&$qwo z8-JBL)ek>O4Bj7hGZ9CG=dU&;$0$hNzeAa=qJ0I(|zz^++hDGU9_0Cst_Xv}r4 ztaUp$Y>e_?V8||_pI1D{7anZ^{@)X)eJ;lpA5IA%ZFty?RumClxLO(^#YXay0kvF1 zFWl}MdDZMvHV-d-!bZ2RcvGo_`O&YO;02}$dbI)ZZ>;4$q)3}`3Wie|Mn@XW2b*d9 zKep~NpsFog12qZ)5)um1(n=%UDJ?0T(%oGmDI$$@OG`<&h;$>}-3?L_ddFPoKIhzf z|IhU?=aS8aXT9$??&~M5H98lB$+thoCdXS5!g_qTqrJd&R;-6H-)`!CHQDb#qRWf~)_gfTdU=JC2&2+XdzU2$@A64hLeDm~RQEvI{?E;x60kZswS zi6!Xz-5Fr?=3j+}|Jp4Q9-Dc(wb((I4X9uh`*}>y@fpCWR4B1$*s7+ex&5}MZl1$` zOV_{DQqSlxX(re|yC8!3!GFlbN1WffDs&jirub!2LUWbRxFGeFCJSC;wPIzl<0RDE zOh=s)wJfCh=)DvOz?k5y(%OrixH*n8%z2_4*PcN3)OX0Ykf`qb6*s1bl2(Mm1p&jRId=eNZ})DJFPdy z7ZecLN7Ci~;L{-qGdZFPwc34NJ0X}q-<`kE>rC3>IOLN5(W{nk^z5;ev0H@{a+LDT zh!*&X_F+c73^!_q^7$fsO)XB}Gj3S1PBzo6ngRF6iq<1{JVW~uAB9G5k>6T*cq}CT zu!z@rL6MD8&yjI77PtN4|U7<7#cr zRlh@fJ6RN6zK6s#99b0{t&}X>?^shK?+sKclnvy>M%zJwQOcA@bM`&e2aoWn z692Y0^bu+!#kedo%+gEf$+Kvh=GpzBxWnVn>wPgsS^=`U{qD$5-dkC{qy*EIxN1G|4=D@ib@ir>|~;+;dpG9OA# zzWIcv%81q+b@$^c5dd4!T&uOQ24OP1ME8hyY|dLQn}X76DujcB2Z;;s!@^E0!<8pK z4=i|AIH$;FvkFOKU7E(z=$LZib3*Df;bZ{IM?EaK|otP9`pUkSW)Tr z>SnMdTkut8o4-j$**o>kafP-!b5uszuEH2MXJ#2EaBgLcwaDz&)+`RbYv!b-)s(j( z7@5wh-WDCd?P(H-`+FDn^jeZYuLn4G6~?mKVh3lx1;eq-HM@}e25xt&_r0DLOq=(5 z((3~;g4HsiB$L`n*n@M;gq$MxPE~%|ubFv+x!MU&;kZunMQ>ASw>YNlrlwRq5`FeU zB`nD9Z&z}_j`l3(lddIe!d?s)_|n4p=0CUMsqY`vdMK0qi>1lmt}1(wve<4_*GUy2tZ2dGbZI;o!>zNhI|^mmyaq(V9o%rLm;$Si zokpANLPA;n+>4Z-a^>-+KoK*E`f;0=s=d+N^d2Y?iX*1O`+SK#aev^9Mp2+}8om9* zQ(rCHC2J9Wb|yW8EVRY6+k6^uIY;SXu+}V{de(8YY?CG_E>R%fes!Qrt9m2}S``;T zReM8cb)k9VwAy41zHC(lC~EGvb5Gvt+CZuE>Wpt%P6RMAbH}Y$!MR41CqTOV^&J(X zwIYVAI|EDqz*WSZB#dcAf>t0tSZn4VkI(l|_kG6Jbn$wop>_5wa&eSHt1E-XAGn9A z&-jFiGX~Sq4Ey=tv$sRdx>EGc`eh9YianIt2>v_lo7I=zHxa%E?C2IgJc9JGa2p6| zbe&g6GGlchO-9%{ZIk2ZX>6Mdrp7w7f;gF%v}EzMP~3+YHpK|GGs+2k5U;9kU1z{5o;-eyNzO!12VlbG6H+Z;7}pLP(iULymr5E2V)NW(4|HeZYjOg1R=n>XMXx znr7K=iguiuVB9hHxMwYqVBQmGo);%lvd4byPsKMcPr6IRtp&ChS{`#w=X^_4h356U z{egQ!BmXq%BpuDXCW1c&_f?U?9#xb2I8&RtLDkXS>4Lr}&^rOqs8uMMHW*agcD}np zxT0MGIF7*b{_>$p`&pJ9)qMb7z&!rI4Szhg9KL4A)BY6~sX0*gLOGs)avY@lOAP!gTIv)DFG_M!8o{SI}2&J0^QEL}er*r+~lz}X^5{pfI^QDU6JN^cZ=Nm8{k1+%J? zKX6FqJNKFzbzg_}Knl_a(o`ZkL|n_^fmN&cnYvCMBd%&zs! zO;VV;DoDT37%fsu)6yTd$pRmg;L7@6I+^6jA2#nAE2AbQnv z^#~stym^UY5AkASYk`0Y{C5cyREC?DotGpu8Yn4erJ{$#b>$2B{JUm7_jLxf(?d!E zH-h&!9^%V<>5Um(sWQ4Zn+$a3y|-U;Nz@&$Y0 z+=EwtO7|#V0rPr*SdHOLwQ8Xv1?EM(-xu2mF4@3NbY%wfmdpKa4NaKx{HUWGVfEop zgN8qFk7pT50}MxgPZlA+D#Ig6IWJ|!1BRvqGc;_ZK;3h?nSP4^TJc^<%+v&_rWr)SfbK59|-rj@qd*i9q<`Gt2|7> z4Rgv#Vd@HfAm`Zcp5H>jPXmjPfpI3S{Z!v+KVjpis1YyI`8t;B^pq#w@v?c!{dddS z9F?)<2^J7EageRLHUK{j4~v@`W((ZmZl;;JLAQYekJ2=UjuFJ6L=Wj%%NwKRLV^SK zO>sId{G4ki7_&9dJ~R-%-w7FjCDQ68llL~st%#0ULnoY9sIQ&|?tO}0@|t?|W)IKt zw3HJxL4lzmK!G$|y7!8G(HUWwseRvTn>?J;HS3HbyD|^)(yDIDn@;{L+xOQvkoiJS zOEx-QOkLRgFiQ2>0>LVb@y1y=Nw74G5vsg;p%eEV)kZ60Q5wa$;Ivy-6kRrTbfX2A zh?MbLyj1{kv{JKv9*bxCTok~m_W4X?2My`bB(9mic zu`CIE5V5$&gzbv(89K@LWpm}Zu4a0(Z*Tc``h!p%JVwJ25zRkoJi^hyW6EHg1wkv| zHrF(X(+&WUM0+XIy{EqB20#%mW>(1x>9?P|TD^z}^=OH*(8D`_#&w?V8ut4z`>Matpc2o`ZGkEDnA=a7wMORa_CgsXv6Snhv` zDy_fZ#=+N(e>C#+Hg5LXB%n5lRFzvt`3y1ZUzVz>9NeS~{c(Q;hqxE0JW3`EHgSJn zGzs3Pey?E|3uVVx6;ENwuFrgX+#*1hWcWrFdnurxSv$F*z{v(YJe!0)pKu&as`4q^ z3j32+FmcNo82JcP%&X?1oN$tw*I(rVxwKmRobYuw6>zyqEtwpvqBrz#VNk+l3IS-f0pCQg28GyUZzEu0 zVy94KOxYdwZy}$wZ0Yxp+#Zc~nB(o+&{YgEI5F_ebQXU5siPhK$VqzeC@tbaR6*yN zTc2HDL##Jl3J77Top?TKYP|VHXN@;UfgvxwH}i7HxfG+DI^L|ClGb5kx^WT0Brvc1 za4+qH(GYd^V0p;JDMF)6W&&@rO+_8SyOE<(?rU95zb4tc(YP@Tpia?mHzopYw zulv5x%{_aBLDKEx+F+G?*I(p{2r6>&R1L6*s;uFJ+l#pRRNZ0wgTv)eCIWQjUANP7g5HiX6r!FAU{|GtA_2 zgQPZqa`{#8Y2|k2SxA!yOAx&+_f_ZpDndISZ^TrJ%SmNG)Zl@#&*+p&{j+uE?^)$p!AHF#>}t6LUBHPaYq{qt<1zeNXGrgn zO30LjuoBLD^?xH$jV8{^zCE~e)j6c*>Yb&Ie&_eGM_f5{yW}7fK!+dPI080oS&D?bD*lDpALg>jJ~Kfl;b@hQPqwQLIadvN+OT2&F7aF^1H z2Kyq4Z-lg7yw494ZLdM3GO7uteUUdpY#F;jGM1CIfGS165!_QAnL{_?%)7(Sv{YF( zt@(@d6{%jN_mI5i(eK=NN)8XAiL49i{eeGlDj}B1q~AeEZ1zZ95VMLb|Dwc^pj;SF zISk5lF%0k*%8Px~lA0o+pzRHu(T)GSjazTpT3}F9g{3X+D=d62%x~GnGki=q1U8Q_ z9*_T22+=5pcb67+0e|9tCAAP$JW}2xcof90EG8&d)#n&tF*4< zDTFk?(_D9lpo_D>+@kYNy?vX^ zNXWTZKnTmWGYN>EJZrWI*AJ1;zlkjq!JAi@q1$Qh_99rXkI-KCLy<+<<>w!n0Xpj`ceCPQ8Lr{OneyqUi`Wg5Vaoa<&3{yZTvlzB(HIh>uW;KFwmE8*;! z4p6Q}pj_2_obEWe8D8y!2^|xVo5Ef*3a`92+ix0I>QlLMw;=npDj6O=sxydQKPr$?|c2C2Hc7qvKL2MdTtr?cjMoT7?iTd0h}s z+x<(88(J#15y+TXHP-Ucdu=*zxM9vz&C{Bk&>+paqC->$%!(mVUx`Yi+2`ug>!{Zu z?07Oc9`VRUk@ZW*F&(^OQ@qmGxNW`0jSN_a(7j-nalGTm#7$KQV~)M1)UCtXq)n5m zUKAIO*V9*f7=*gQS#axh9=7jfY4VvH6H2xchB;ma?k0tu)F|C-J+R|dwh+)JvG7FA zDR0ow#Ue%8Pnw;$)~Bv8h_j!`ehznMW)@{#ndpXQfY(=tF>rbHhjl7$H;K5m4g282 zycF;*=cn^g6~55Mtwqp`q%(FYZzLOiQg7+nM#AK6@|~BfcpUj7oXdH;BkcpnEjj1? zdrtL89}IqwMu|o9g*LbnY?PL)HaCHANfQ+5dM?phIa;koXX->5jkzrtFn%8FrR^Lh zK={l$4mlFeegUU1pBn^=oWTw-nWaB)xT2p#Nw2U0oQeK_CxMjNELF}>v?S=~Y0Z-# z*`9Tz-V4R;MNoW82mr3fKLyx}?jjhpfFqpQNo^G;B@N(gP(^u%r`!GurB*VUcliDQW9hpkQf} z{k17>UA~#ZMgX??OA5wal>fn*j-g!jmufHwldyTZ-4W#hgh60Y+Eydya-q(BBa6Dsj5CE3r1hqBUpb#JVjgpH6lkYEZbF+ zu)78g*QIaUl?RO3O<>Zi_^1yA7Etc3GL^yRMYLFxgcWGB>fuThnODc*#x0ooVRHUF z4|CW`{dRj(+kC9c4YK!)O+o2%QssdgVqIZFB9kpu-N&^xgN~%EwUz?wr_lQp3Co1J zCAUZI@L1=jn_Hi`kv$O<^qOEy1aFk<20Zu)_8V{XwB4M6tOsM64_?_Boo7P^bOC9~ zg{Lzy0{gMV82Y-=By}d2lwFGp50ES_y@MOlFexaWB5@T_8bV98fHgs4#$d-fE&B0E zn;T+*-qtyR@efG5Pyz%Vvqg1MwG}?H(3o6&wr^>1{+*yC-Jr&??Jic#pmeJ^cRP;+ zH<+O*_|6&Ks;uh6GoG?76{eH_@v3*<*OT5;9@ERy#YO>aKlTj`!)2hq5gACqS zXp>l;7)_@use>j__Q=l%*K>mxRNi6H>4OrWpLj2PvYPZ{$K zr;0PMbnoP(A;zE(ZSU#rE`NY#y2DOdO$H8eJKw;4i{_h;n8%a6Y?pDFwtxex+YmR% zgkUdb3M^e38Q$xm{W35N(2Q?6W#7?P%_)^+M?Iwz4v$#<1cxLmw?9{Y?PZs|buP4l zErF98g`4t_&itCehuBZ2EKC&ox*bZc2C)FXO3XFI21@M=-#*|0WL6&z$c#DML_}UT zk6oR!Hz|U??aly@zQMrKxE98#EQMBH^`GiJk_I%0s9|k@-iA&r8I-P+zElq9VQF^M zQMhn=TfA!<4PR)(n#MRidcij`83Rjt%^nV+(jRw5RDNEjKS7wtnA(~+`-<2&%AOp- zeHZr$hkep9$+gny8+rUv@gMY6bcI)_Ivk6l79Zm9*9uvel@&EF{CE}net^P?(=B|} z@Uf(Cu}UZW{Ndx8_BQDR&uOQN56ju7aQ1$zLiL@kes>HgIL5wtc`xjGA`W-_F)I4! z5_Qu!_Lw6QY;WRr$G%4C+EK}vLf5y>LZPv9jk17Y-VkLz&ZGUb8K5N z-!(-GM{uzHVjZDwx?lP0onHx)Ghtvtw(%DXIZw67^JNIW8o7-fOvt3$rIJt!cA}yl@yuOPkAn}FQZ|$bpZ&T%LdR2x# zS^8qsO278-SLz0$PC${V|9IoO%##do%mBvyt)muWYj}Y{cKkVz91FK5uNpPLQ&=l)nQXsdbh z-Y{H zDK15k4Ie>&Z;P4lyc;u;boPEP)GVytrW3qR zkXfyI$vV}1C9O|1X7QVxm)Az=L5&4P#rl`>49Dc%6_N7&p%b3VJHbWQPl+QNRZVZl zZ6y5^hI)_E=@ut~@WN%f>z4VWv~l-R)X0{#avCT0bEIBoxp2lz;Kad7luik&o~tjw z+8=;c2YfngF1k1&6MGheBVX=ZU)wgAQFTMT_Ia04m=;QB)9ncedqh1oJAVOer+vR# zfVgVGuGuU~2rCQz*F-WLtV0RXRX@Bih(_9W*t*J!jN*ZS?M%?vf9@lXY?N%HBl%sG z27AvcO_KP9(PaI2V4C)zng>0(o98B1jL=X77?>5a)@@NV>w=7t@wMA}EG|`O^zQfC zRF}1v7C4k!wSP(+54eaAhCsL zj_q!E&oBzG7dmS*EZr3vnMVtxX^T3}3g5^SYD>Pqz0^!8meN};(y|O{|T*3dOOeWPKSjcte2QYNdrAPkH&gRL7W5( z$Zj)fuOWO3U}>lOT!TRK|95rL->Ze7+03jjKqd{}AaP9nbs$&2#4UIk1#&9^s_VCB zZ+XR5ase`9b~O3-D7*%Nf>>tGnDM->ey397e!wU(x9eBoWt!EVy{&kY#vj?&@XTFDDK>V3 z6faXrtBovyN9HZ4~H` zT)V{deiUK8Jm~rZ2Te;dFt3jeUdHMqoduDq1u`60$uBx07nGr@IE2}@!aBv{@i}^%h&mjT zZ}#K|gf?(C-rj0ce9%ch%dE(>A3mea9hxWSVn!FGayo)aDv|+aD|UCkoTDccCds}X zWr}-BW$=U*gwCc9q(>Mli7&mskh2SN6Wi;$-74CYo2m53vU+y2DCJL(6?4LgSq6>6 zQITvJf?CQu>d8TUDowPlS0ca23{(Y5=KUHh=bp;Ni_95X6;Zs3Cv^<@*?y~N#!KGh z?MmFGk=<oUzS;m|E9B##JdLHi;g~7)1q0QTTH^Sz|u}YjJKBd1jS6DkqkJmQ-=hcw)UP+Zyk&Qa`M zez-fuH(G&xkb)w~jn6X8W8a*|sIO@n{gkF9G_MrZRJZ))H<<;6;?c`ow&(2xv=BBy zQdf{UUtDxRC~kzkwBR_%%i?X^3W!V4*5B5G z-@dB2cKI+U@6NtC=0j9GcQ2*P0Ut+tQF#;hx3SVwJSTes_TZ!*t$(VI2-X-EWHJbx zxv@+D&juaEvM$2YPk9(A?^7Eh*mLZpv=DdhvOa?~Dx zR_edOZ2%v$-Yl+7mbG< zErq>}c;Yrev%(;HCB98#9MMyYkCx^ivTkR;r}gz=L(qh3Usk*hSaR4j#;(EO)MYL0 z9v6W>_Z*C)_QEH$eVOuV);_Z8#}>)+7>O#g%!=R!w8!LMoKdH$=(ZShxn21il%*lK zY7boeQjc9pNBZRZSVf6j$A(5ZuHT~|OgJ(m1-fKdGAew@GW$p4>uL7FPMnmNyU!cP z@7?Uy0|0wP)c8(NI!tY?Wj*gp1MXu3)c~$1-z_b5kHR`C45}^fiXwj_1B^BeEznAJ z>%tk{Ok?I@sK|D)uMDl7wM_ro7_R`}$}m2v;v|3UjS{-7p%Z;cKryl%aI5v^mHSo6 z$h*-9emHQLO-DfEpfR2>Mmzc>v>j)5%(6FYnf7-I@R)M%f{@J!VGbTbscm_x2xm=fn#0_Mp>03#>(2<2%lqAqNRh`T*$B7Ath524*n%=G{ z0T9w+1O+{ZYFBbFCVZ@E`N`w26?v_OIQ1=PuT7t{hXB)Cb;;v7zgw?|aZ%3yfcv>o zDUD9%`x1|{eXXl0n;dR;!l$5t2u#OnA9r|F^61vSo;>EL09{5=8`2)Hvwl zRv1mlrt`?4E*6RV5hQW4OM^Hqne?Gn0ns0)v;SkS|BY4FHt^lJrzick7ZL4Q>Lb=x z48?7jFA#TquwW23ow73v^RotTWXU}P%8!{U+$-z@x;ir6?hJi-Occ0+OR^AF#>M0m ze~Xr^Db2OaIC}a)yexOx{A?Vow(-OIxp?yvO0j|LS*IOc-r)r3vSLv{aX1h?duy58 zSRZ$Jtd$sU1S7QgTS7yK7H#ro4cYXP0RcUy8Cikxh229D0k0=tE#tMJE@TvBR?~uk zRk98oapOgG_L@O~G zFS0S*?lbRr{~x#jb{(F68`Cfmtmr#i>SmpP>FSl_;e1wcp_KLG{fUd2%+H)>54UQl z?|*y1Ps{GbXkI4400d1Mrf}>P-b)Pf@)cT%KSZLU|F?h1NFMHI79)C^fi+M~+9#h~ z#~*G@AmSf_YN7C9U2aFTJb61ooC_BUZ_;$*VQ!A0Q4K5Y=l?rHLTZSqD!OA{Fv_D2 zC|r@rNC_INq1{P-EST`Ao9zPusBZy;vzoh5Qz$RjO7zR8;C1YRG%1xLWl=RKCS!gF ztz%9=YC1%OgneR(kOxK7Ze=Jch@HO>+6I=nW{akx~U4$?k*F?pS}gS zEuxLPrCU5y^JQe1jE|fhhciamepOCg7idWBRf6PLV(v5dzXuq+a?`v-eN-3uDd_*a z*j$rgyp%>A@sYF3mcllH)3nvRc2U3?EsW6M{+)iHbfI}kM_K0*=6dU3qPGsVrO7^C z`dnQI&e>#3aht$u+UOIv23}0dE0tCdmm^H|dkfhgKr~O{XzhxQh9H-ienUo4oNPRE zIKvjciA-~s>D1qac~e`C!B)%oq#T?c>jhr2A-pjV%Rv3IP3 z5YYna+ZxuFK-UBzT|3AaDe+mlU;lNC5!WGK3m=@ZBJr2QK56O7xaLhw&C+v()Y+%0 zUyTd4S*q_=t=4EiR&Ox?^I&IGE})V=j(J)8GYiIR4XY!0w)bY|w>eQ+KjU_|?@TvF zG(XCV>GzNew01bh#f_^d;%K?=qbhLv{s?=Rm%*9zB`((5e<1c1H*B8SmFwySS~=Zxx>`*{?CboPwI7A z1*#V2CM6t~CO{^FZ{|L-8^5Po)GxhEDV( z_!2@$C}R@StAW{2Etu*^!c`tJ{QDvNyWoOfzKdyev5-f8#jemQHsZaR{8&xb-2A1w z{>Sxt`VDC&9sc5JDaC8Wo)gmL6y<`hP2P!&3vy(7{L}lT%i?gcvn!>;b$U1p)S1h4 z$-!$ZenO0%K(p*1%_=ol&E4M9XGQ+@T27Ac>yhkDae9DwGVyVjhS2fKYX|S0zIRWP z9BE!f4Y`&IAHKkxwrxtgWFy7SNpUWD)y`SqvrL${^06n|xADB)=w44W&)6O{JpXq4 zdT__0oE)ppK}e}}Q6qIV)_hUuHc~txWKbr||HRFW8aV^Qm4DYfkRBEMUK(@6zpQ6@ z&MH9@>wx%k0Vnz~Em(SAnV_jP7ST7!a(@GCs&98yJrlr@VQW;28pUAbKuY%jK<1uf zOzQ}KYi(gBN2*QRXG6*H=S5qud-711YQM>z-XRf_I5WaaRYALeqF8sB!ktM4A=w=v zbcKE1tz;P$169nb#$vcD!`=Q1-_=ACtj+kb01DZ?Kz*0wnJuQmP?ul=LTtKJ>veWV zT}Gi`oJTK=$fiYj^=J$CR%YC_f>C0gsbMbWL@iP)_BNFeOeng0(dXym}LlAA! z*{Bl}6LIB5S>=;(iTCJRr$LLNvsUH5v80E}k)@l<@-@#SI!U9z0=D&dc2fBPXb;oG3O%3b<^f5gm=A4zp>MMcEIxz@JkI^KPl8iMZ@A*qVE@ z$H>mD^w>0rgG~MWls(}w*vVhXrW(gD{L=bX$=b`?^ETrg*%s%zGU&~Ofkj&gn5>@e zNcRW>!25k)$|ln-FA)Z1t?WSE-t%8ae%n2Ku}a73;{iAj>NHZuh~^i*aEGE@_RCWg zBb6Tr;}h6dKLmy$f4iJW+HhQpc-4LTv=R5{C*lV0wRJ@ny@)r#Z@1T613wJ;n;KZP zL{=#{RnNg`3jp7;GG+J(q8pz^jhYs_k}$ee?y+JIUchEqcTY(T1mFR56+Y~vfQ9L2(zvJT`n~H)9lO99w1BPLcnt}Q=$6P$JFA7ua2t zNz@(XsJ9?!cAMG4CnYK%9qy)&UhLYP+=>waVX&>cizZRjam=dR#KPNmc3%EjChf)v1j(49+paH;fu3K}N#=-y=tIl3;)a+XNO29VY;g%dsERI7Cfh z78B&rLR~?s%YHZu_B2ivGS6SpheF0>FZuQj$bdn4G&Yb&(-E~3;_4R%^)i_F-MQtq zHNb7+Fm8JkjOe{Zxc&z8=)wqQgol-;(Us;(m`dKs{qWZiVEM5;?ELIH_)Ls8PEmXR zATnfh$Z4|lKt>0$yPniYRlyHVl_Ts_SRL5hh--JhxOxSshQG^` z$k#Ji3egfr?P(nuZXitMl^k<=nk-W_O^#s0FULEP247VNmXDQ82#uV4z}uTp4DI!F zdN2xdYCbqyA9A;)3-DgpgH!gjzKYO^f?l9v^L^GwHNy3(CwChNi#er7ov4#vRuLK? zt&=(e0?fFDvAlOD{fxuU9%KY*^+rld-271gO*;~ln*TXl7^_1F=Uu}p*m~=5##Ac~af|_pr^GvhzOWu;gZzUnP3ubLrel1Yk~>rQPn=Xa zL#*xvefnHRZ?Qs((hlYEoUHjQH2vCkRY_sPdd_7=_Suxqa6c;nW+O^bOQ*S=CHTOc z15^0XM80ud3UO4_kg8w^y;yk0=PyP2zFeAMltGEvrO#PhMr0Y?6E(1{&D=X@vO5d6 zyizHu;Mb&s<)HH7DzyH~bg7tRfX;27afM}&nU{hhqsZrx#s}V0#k*}F;e`W;jJ$Y@ z08GjvLWoS&d8e;a{5#gfDdI$i-3XkX_>Q{q^lwm15N)%%z?yh$^o`Z8$HD<_9cD(3&`E{A2_KR ze_2%Y5I(c)M3kSpUKssp>C%t(B1sasON9=tsxQ+T;~%>SUuXUK zQkhy%`~6BXh^FetZ4?2Qe^m#?#gY{47Ejij9)9Pr=Kbh=T_o)6*|@iSx;A}HO^vi5;)eJIG;oIUFI zU<%kb0Pa?2snCH#LC@N5a4j;brf@{T0)R^h0^SlOx#dOR)e}Y9NTD1pEnYCA3)L;^eWD!#^f!{U>8GYF=ElkG29qm%k zinP9aWNo8^kNPWvQIO|Et4Wyc;9fVZNv-g{?d(EvTU!f3vv#4h=R%apvre; zPuLmViR(iTZG-e1?Fl-Nt}|?{`C#d?-QCcC=S`~R&;dJ^{t|VK*`097qxCysjT2Gl zP;pS^uzh=02JNVW6$SGSF+jKZ40d#VqvyZm3M=#0`W1&u6xeA>Tt9Zn)Z$DmuZbGV`D5e!{YXx84|AR=c-q8Ulv>fkW3T8fsyK zUk_rrYj~jcd__m}O5_-yGNLENh{fXpT|Cghh9w!`ZyfX7Q7-;lI(xtKsB&Y73&lys zB?q?3Mv{(ATcWB#f#On$q-tB2s9D3BG->9b73(e^I6bl^^Z@K}qwC*eB=yH}a$i?`4y_}&33E_$CtH;(XUk4j%_rR`q`^d)2 z39+1u0dMN5teVPqo@kFLl3JRZ(v_N`w_WBa(!4*j>w$A5EAke6OlN=P;@IDe7hBtQ zaMt%nRzB}UBZX4|dX{>tXDpA8N+P6=K2GyjNZiX7n|xh|yD>y1^ppU;!o} z7OCsr`0eyF7e?$SO-^_jx)y6Nq<@V3&WtR#sK%ACA@FfS7v#`n2|HNK#`hzq#f^+- z8Ycw3-8nKr%nBM~4#Ahaq3ao8I$Il&kJI=-(+Xj#MF%e#wkXOXX6ljl@;^SKe!qhF zL*F@Mm?J9QW<~qvbags#7hqmDh0zGk8*PH5o=pwyUtyT`paJUf2QHM6y%4!b6~_+& zrf|2I2NaGvaQWw_7gzK@vW;gzmDJOf5xSR77Rf2LcJN5K<@LB~0){W3d)Wx))90uH zd`3ivfaM$64EXHhKR(leZ*LWqLYd0yQ8P2JOlxY0`+cTW0A#4#JVZbnG%i;)X5GQf zY$eTs69?ADoi^#o17G_wbKd(+uf~?K0f=d$7H9avr@c3`C_tmI=heS4$G2mAzW-G? zv7Cu{=lJFM8qTJRMu+AgdN}>Z6(bgJ^qla0sM^gtuTU+4cyHNz&wb&!2OK4If89+ zx`sEwQeZKe)TU+1|C_v^L0VuC1aaWx&`vPO>B@~S7yvoa0l~U5EPnvE z9R>hRk}PT8$?p*pMG9^BX;r?PsPc&Qi=UqYJ3u!?A1rLY4Ug4J1UWNUJWZOXf6?4A zcmM43W0-yY2WWud3Zn58{)geJ_<6=mQqy&*9q-DeLfmh);Py&!WDnPUOc^Vhb+`=kX9(=A zsjN)L(A%Ls7A7IrEt#WDJq?}qTBj)kax<#l z)HMB1EA7x&NYUK?z8eH`{+>m+X0NbH)ofxlFTd;X_|Ph4pUo&Dem6;YPdQ8vRY&iJ zpH?_7S?NyyG?Fr)8P}91qz> z)e^_q?%lrJ9=zOAEKNL23Q!t(S!Bv`oH*E1cB%T_wXgwC4VkCGDWB=&m(x~&L-})l zl%%)d^@!_z;Sy7vRCQ(JsCr@xO zq2PNQ)Zy(wo7c8UQ8}Ss{Rb|t8;=pvv{0aFf8fx17`~3#V?MD|p1IHezT`k=gej)w zam{7rvhlQD9N@IPf)4xXkNVkn-a}5e^~2(EeQv5@o*Y^Edv~45S??XeWt~bFk6qOj z5{u4w(nCjWUC=fB0~a_eOx54!cBPa{{xpNSp%9(r=Wop9-aVy7Ig$9aaxr(#H>@Fw zy`gFMOJ58xf2|*N+9AB(#-Ui+$9f*oWa1@R72c~8e#f6Qf*!itS&%AfUNXTPw6{yR z5~04GDa)~SjpOQBFiXGxs18y!S(wu`c?iVfte)39ho$VGM>A@h0{82_h%hA%Zy-YT z`_5PPs-@q43Z%?@zSo9tdj@u<6TCS9jnX--t%}~onZh~oCDTYUE7P>5!tTEZ39tp* z7}t&zSwB^`#$s7%c;eA<@gB^pA)@i~YK(i;0$WdJd!ax(-*5MPy(7J0P)OEQajSfA zi7>f$CooANuxz2!;#e1SNo74$BM|y7y~CQm1&xw1{r+)YBp9r!IJu)JhL5z`ZM^BB zMgbCHHP_T1ZZhew-J_^q3FJ1E?vB?TR<+N~eedP?J|nLSZq0*)MxMHfNvztt8dp({ zyk=74X0Yk?#qSkddJ+l@cJAR~(`ohJs-E~xxDg_G zbr#`81{I@Z$9Q~J&2CUs461+*xd}{BkM)6aFun4Z!D3fV9;e41tb+_4J3%5Ug#Hs% z?yPsi)iRMDf&0tK)DXi>H#Qkg_%YNNiu4m4Erp9Ytt&J>K!S^ah!hHr00=dy$3W7| zz8p-tAyb+>FIhj3t85&eHcjW03;4{51pW91 z==VU-FJl)4zS=Hsfzx%0n0~GT)myk@LDk|vuX%iwIjtcBNG$e9HIpQ(RGv+VEuR@a z?KB)lVkgNyl{!VT%%O-#F;HsET4bR0`}YpQv1oBbnzVW??-hT!dMrjEMUVZ|Fw44SJG(acetTDfXG$}vL6*@+499wwufP*W zkxduP-B?n>?r?Lv-{X-~4FWdnTg!$c*|F->r7pwpJ>6w7I0<|N)A`$t{z@Qs_prrY zyyw8)DHt@(P4G)3+Ty!C3wu|)22q}?m>g__d4Sp~*pqNSCIrdc;f6 zwt7o<8#WK4*gaznifTc@JH2}yV-`WCvp^s zrGZ=IZF~G<&I04ngF)Men4xo8^W}bPEIi}k!N;9%P&kk~0FgO@bN){H2?l)l*jGdD zb_8GwRIS&|{xTdrHiLnn&%Ht&kt6Ma_t+hvQJJ*je6_jHq>1WcQXSYOZc}`qA?%Py zY$+oeZRQO3gG2%}G-usPEWKG}${SeUHAUG$HwlC+dS8Y_s+)}^5+u~*{o&`eq->p8 zDCw}M#r0Fva7q>=_`9pBO)S-k0!+5&Pj6+g5qLlLm&5kp)gVHK4L}K<%*3`)>N3dz*w?SSAh{+^93)a< zI5~{wTJRAR4_~|mxiwKT|98@J zBd0Ej*BF_(K)e1MC4J17z}N?28=QO-k5DcCj;w~!%g?-U-WZx@ogV+=fTfhtuVL6W z^wxA9dbnW_5{V5LhdZ?M7(wK{jjP?VoCZ}()YKPd7Do|qgN}P(iJL6FejEV2#l_QH zG-X(@?cbHOKm?&GXC~ZJun*0SRWe2f&p2E{!HtWnpV{C)XG7i$eddSJl+PaF)rFN9DQy|KJxUA7QTP(*yYE`0~M)?cQ02CFoeXtd|{kZ)AulOVC zS5=a<*oj`_PnOe^BU>)I@{!2+JDnasqmFC%3$y^<#m<@ICgH}Q7k|xym(SM;Pt8Is z11(93oNY<6P)dip;267eKx3uvD!ZHsk0-2@2C!~tYO8NfkH4qCR7sB`L%7=-12oHU z%?4KDtou<^Da(iowrIb+44ho@BrTH1-LeF|OA0U%?JX>UX5r@Z@`GYC;1q+ns9V0P zUT>8gJCS-iTzr?3^sTys{e0sIadAH#I61)Ok}4=7x5X+cz{FZ)*Q;Rap20=wOC3%{ z70K@up>OF>Ar9OmF!G4Y!2Qd2LoOxN`>oQWCu-?3Rd>03?*y-|G`S!0f;cF*#a<;p zr_{(^ao{Ds?S2c0qTMra%abE;$@pCMnGVc*4Ca|_@)%fngmePG6Vg>Bep^!gQ+~wu z#5G>FibPrHZ5vvOYpEauHWx+O9~1oS-|J7a}*E0sp)y=sSoC`s!tV! zkiKz&2(O@}9~zc~7-eW}jCQV=Sh5c|kQlskX}!B@U0>2O4ZFY_=RAzc0aL~Y#&3f}OXRhLM5fb(A?+t`EjL5qoGm{j; zc!G__tIM@;ZyY>4Q84$Sq*jnXqFWdoJ1G>ers{cJx?(G={FQ2f;o$vXEPnVSq0jGr zO%P63RyMRED7CC5;u_$9v}T_B__Rc8_i{*|1Y6l*50ooA+Lt=dqnROn8cH;g;U={_ z>fE)zQHikz-i%#3-es{%J-3+W;s#-uw0Wl`f>q{QkJCiDk>ZRVVuJr}JPfsGwglkP z5GwCeM*W@lJ2&M4(ZddO4~#&n@IP?s;rm)b9hl=tGObPY|`kVzVww^HvcG(nlE(?Zb+`=h4B+tAZGls&z4&F9ChC>nMYqKhin!5 z<0-#YcMRzU4OQ@&Z7@8guEGm=)6)`(nkq{(S07V%gGs%C?@@cY5mc+1rhdjXSG2yA zUOcddC5EPM*dWowrwfB6TW91F*;)paNX`e6MLxl5J3b|aMQ;?9TjYC_RvSE3zxui` z3mRyl>4$~oMiD)<+;;Yl=U0UJ@dd3oToGJoovGZr&Y4cft*jEn|roA$Pc1e-_j_XfjldnNo z*mbjPqYdHw;MB2)#kMrD{C>^Hq}NR~9<4U<6@gPR=S(@vS?}JEcX|3f?U2TTfuj6p z<9#h*cBPB=O~id&+Fbnrh1-+xEG}^sHc7a5VQazkiNddfmF0dMgL$;#gGMN zMYgV~y_to-25b-fDZV6!L~gI3JV6_DX;}x?PJ*jz zi#JTjP4i_Ty(I^4ud)3ZvnrW`+Lx@UMzh3acGR5Sv>e9vM(h{YYk3^IbDN-!L*Q_a z@RnlFZw+iS>{@P5akXB%-?VLI16OEH7 zBRLGn`5It9E{dv4J@NNdO!pS(sdJ3J5lz8p1_jl!{vAn^fW{SJFpsWOlk>=(QRg31 zNoPC5aS+w>&36VtisGf6qt;K!ygw@ti8WP~NjjAf9^`+{PvK~|#*ID`Z=4Rq(b#9g zoIG;*KV8YVe1Yl%w!!TKrOP>S9+Td=_dq)QY@T#s0?cz+>WMF4dfp=4i{+Z9HM1`6 zl}aguj}?}#pHgnxM%rVluT+rptUj)h*%+wq%Z-=y&|KTdmR*g6XLQP235Ig~(kmoV zI-$!>g56>QY-Ax)&Gz6CT^_59GItsiC3iBM^J46;O6`^0zgi(2L|vUY0|Kx>fMk6 z&=bzD`jwMY94wf4X}ul~vF?Ps-8%h~;?`vWw=P~~oy)!l#GLVA2W8OA>WaAOha&u8 z28niI1Yp;>iU^H#I&mj7IC+IOtYM5C2&tz)5QNYgfn5g<9H3x5Y(wX)pgN1ilyH%z z0-aktR`&<0)lCB2o=ciplvQ(xAY!U-L#2-mbJe&KYjsh!QJ*q>l+($*nsb$y1RbpP z0kry*zJs_=Uc^n0TvAaAFCFsFmC*r@uv%k|)-Jl}fbL|9gM-56SL4A((k+V0W@mb; z$GyTra<;V5;7GFG;VU#uK%Y8NWRK=%>fX%7mX(AuZZ?sxS&cC(dKSCm z=q@zy-prsadx-5}I}~Oc_P$lkb@EF71OjhsOZO%^AG- z$J31TpXV33ds`q2pbROk-v<#HyOf9q&XO~ESA?-{f0>?BoE* zyS%)zP_QpPFPxO~!=N?0ZL0aJwq+5UpCG#MpdowU_Z4CRR+D=Wrx$Jz_8MTlX77ee z0J<8<>IHh|9*Y(jJhK^9e&2Wj=KkxMt9Y~z^ZP&x31m1wPBlbI^rtfuR;ti#%y-cE zL7e`-1T7Z?A19FW;?q#`gE#?NN&;r#g!?ZQfYxU3b)T;Wt2i`;qO8IZ5@4-eoBfcN z>Ds{XgQ#&mK7kXHdg9R>Odqec(=Z1hIz=~89c+|{d#nR~<-S2!wU*JG_ecB^fFO9V zmJVWzGQpywPx!rg^+CXN;p@l-D;JMiAe>FP8(A|AwWY@;rGwI7uV(G%0s_kCYx85x5Js%i&;nk&kfX?Y@$@bnD zLkFd!P--*-vC_5LmY5RKMn#J}v#)>7(1{4rBuh)akb)MVbL&^BSCBqjFRClMiNlJu zE=R)<>vTW7cFEZKB>sY4-e=~YcabeO{^4<*?C%v!Py>)=+9F!2{NnhgQ z%VTTXcM*}=3Yf2QtLpkNg@sOgmZj-kWY^DZhQ9hTm()uC1&MKm*PiS{Is{s8ZvkzZ zOqVj~@}CVmEQyM~rYEX%^8%vgNj5??GzBg#gCb}mDsx2};!WG*@wu*;&W(*S+zhg7 zQHY^mt;}VAV%hKx-}M6MmsUyBcytkW zY#5EHhjy0y7igQd7!Bql^Z3P?c3Z!15Y&Na=5BggmHl-I4afK^;ncgRcXOfMV+*0V zxltl@!sgi!4AVRcTr*A`Eu@cQfamwT&_9aOE$1AaDMok!>DQ*_WLE*_er{CUV=?l7 zoYeX(4SgKAaP3|T+QDD9juo4)e4KEeOPpMDA(ty1t$CG8Tz)l_W|3<2bFxch**(Wm zpmf-M{#LFt6zFlKx!DU?IL{_~-_Pke6Ot?}NpHrj#m<91pTvZ}EQegEw}^@SsmpBc zZQ#^{1=P8xcoNF`+x~f#x&>77Z-fqOP&eu%iRdlOv_!iwP|FBW z0jG=0Si5UaY(Le>PcSNyUQ`_DIO~ip)5-UvK3@F-fxsPm`_Pf0dB(rUE`HTClRKM$ zxFjwam49e(CzlE0S48(v7ZI6rW8@;54 zz2df7Z?EhLGxtT$bsyriW}vU~e)B6Sh8+7k2M7Uy6HfxG+JG%10eJBTJ48Ej4xcQ4;Bbqr)l+R(>LFz}>jMM=w(H02uQg>IYy9z&o%h zPi@8L#>H#p9iB3HT7xu)N)4pvB2-d2(Da00**($S3g#7)hmWvy)jQ5`Rr z@RC*RzvjHgTP5sZuit*8Eg{_DUq?AiV3?n2^|_S#{C z-((#Vux736yI>sfQry*X;-F<3z^skV>^C&~Rf|;aI>F9Z zbv&Aa|G*2EHC&e;Uz0zCT1s$uYwNjHTps?(WM0OcWh0C`_T>bZporKVZC-__TeMX0 z6tKq3SdkqV`%a0*WVn@M#WY{(2H_(H$!gY_or)-2y9qmTwc|jE+hoG8D;??6_s$%! zH4-VpSEo5TO2NN$WSEoBg>GbYNii|10gFuyo(iRMbCA-y^IJ`?ATF@_eN#|?=av#X zH{00J8x>;07R{)CsLodxDxYFA4QCS-@Od&T37haQT|~=*O5-fir1$S5F29)IV}{oE z7gb)%tjn>3RanM36Mnt%@zK|JLuV|=$^)Qi!S|f!%(bh_raq_12j*UiV3Rt@LBy*1 zMaTP*)2ts))~=c+N-nD2w>nM$w8|HVamICt_l$7qp>e`!1~E9j@<4e~u7ZRfNgx$L zq-DBB71aU=<%%Z`Z7@|zn9%InND*!Cak7%IlL?%<(RtJYLUoVce&9P!0LoD?Af7;Z zyEC5{i3k>UU^@s5tq_sZC1oVtCf+&4Lt%9U>VxwNN=TB!V#vZ`nW%&!+8WREoIH7A zXZ!r0?lavi42JzuwK@g@mFUsv5Azt#pSr_`ybXL#&O2SQ7bEubcja{}ALqHknT!Q- z>=42t`op!lHg>&5$0f{$13!ubJoiYjaF=dPEV^)sdJM#I9LI~%&!KbeUY^R+J9;$3 zqVMEL$s+`8!+WB2UCBoW1pYb*= zqdBy~%(>2jIelzj#KYkZPgF?lAvBxk;qu%CTEm|i(s~yh#%N|BCdT934_32{S2(b$ z6F-s0%5Z0;rrH5Xq|#%3DMFVyWcQu_c1__)IOpX)z&Y6sdWsAdhhkqmNO^7!|4`kv zIMVs2#XJ}kl|4AT&SK@HhJ>RrK}x;?psF?}#Y6r^2A zY&s>)XvBUjem_4~)xQ44pYUFy>^uFh+ru#GdiaHn{M*3>lCKVHJ6@`-j9RIIR+vo;Yv*JO z*N14cNzHPz!QW%<47Xw`Yw0h^olIL5{3TYjVLQI|G)o#NWgMWxiAg`%c3frLlIi_M zzGj3MF`pXgw54h$uE8b_aBWlmXT2Vu>_ zmTMtdCqWn&z<(QZ=`<+}x+9)UuN*O*q;UnYFCPav?$h!IEKoI$`1D5NvN^wBb-`WB zS6!L>?9lzL{PHo|drwMTRUi1>tVS$a3NilD$_YF-)#kEam1|SCZD!-0e$u$@kjB<@ z6{Dj*awTa{p@6aF-0vF5QWI>P2#dm9_#^5yU3IQ*ouhTu@#gtNYM#U5NNYc3kf+7E zwwH6?x%2nwYXqf|B8MHv<)7=flUyHA^f}cZTiD>l{>7#!e!rG5hv~|w!m8rQuvN`H zlio~QnPW@iw9j6N9A@~S=4OCXs5aj1&(i z+qg>Hr~Ua+g^n1tN1A}DqA}>$Vrzny;_H-O`N&RDqq(;@rd9~JEf{diRZz|wTuE5aZU6b1N+&hc;|Vf3 zH|7|dnYYuVOLjP#m&6-LWglk6qjwl`*g&xr((|&t$m_SBq!*VwlM^LPx*4#R#LUY? zqfD-Oo2)??k6y|~yPE@9DtC+*mb1i?^$#Wn`~&VuRiPBZmJ6DtYuZ-+476 znXX0jKwuE`Tn~b5EZ3UB|0?(VN~NSy`adR@y|}FK5|0mPWR)eSI$0LJ5Epp^_&X1~juyDMEGbsDK8-8f4s8?4C5Crp)5C?go@fwLV(F2ArH z1>wPvL0}KgkckVJ&F97;>s>tuN>MXL`T(iD8yN8& z1nM8VrU``i@anbf5eZb${t1nS%5w%6oc~I0)iGn?>INmgZ({6e|3f7Lp}7=)E9q3F zSkb>ZBPa4j&x}x``2koPDVCx?@nf#wgwTc4;;p#Y;PAiKRpg#eXEwj0@J+M$C~&*N zzo*)z`C5sB7-4D(p38U&Bg|-=S6Krh;u6Mkx3*-!@BH)y4j3F48xr1ra7{UxUatS4 z(hFMRLl%hb5giXfobaphiORB*F?}Inif1Jw>!iBps4tkRQ`|pOPy?-H_D;Oq*J84f zch3>vHE4gFf>>Se08v{WQ+#xR4-m^7(|&}-g$OlWZ50aUJ17IcrdWuHy_G9Pi?1)P z5iM4u698f3hC&|8>BYs5?GEe7;G|9*-i#`x?vWdW*$bTDgWIIty%YRP0vU46@u7jG z?h;_R0DI=sju_VB;fD|@WGBdLRYnuiYC;TOZ=&K$+6b*N;$ zqg#8J#N;}3tDrt}xSd(u&6rh@t)l3qktVO<@fH&NVf|K8OtJu6K+mLyo2F(CwNveS{#I3#~IWCQM5S>3(SCS7ZB^cj!!k?^LG z_j|VrkxE9vJjwv5L9q}@R3E!WZdoFHKjQw9LMTC(9c8kkxV3$!)G&jm`b10qMftN~ z^?qvj=sIlUtrJ#9dw@f^Z8&14t_aAFFA$_J== zMqlsrdsB1jawB~nI?! zD<0~^mfy6^beCu5XGeotEQ@DBz(aJo+ik1IY2LR$Wp{edAxqgtfLI*CJsf=GbOJ#e zf}ekm1xu502K%LShAc_nJ`jWYXOI5DHopjgtT5fN8gw7skd(<uNNQqwF^W&!|XMA92(+a?!=(-Y8(c?+J4~Q$r->PAU^4 z4TIfG@Rtgq(L&j)v^lD+8Z;Ne%8iztgpWKf~zcE>Q0NFZFK&^y0lqPeAeB85Tq%a*5%G z&z8Mtb2Sy{;rsmAcCkNkfR{q?8fjwz#Y==WbO}3Gojx(z>ohL6ODCjWVk>&HB;xV$ z@8Rh~y@_W~Emkep1cP<6p_(d_v7zn_tb0@=pO714YHb-k<9yT)Q#OZ$L^2D7Hd+Ni z9|F|T5LCekjTQ*Sj3WlQgb+oE@FyY*SuB!#w!m-83~e^-xa5jF1#J<`@VaL_q{=%y zl;Lu`WkjQ6%p~B2$JJ%gM{RZn1GP<7(Dge**Pr`VqtjHH?Q}A@tG)Flp0Zl0XgAJr z6jd?ht-1N zA;|DEu3M{Q#SrONyu|gg3EQkLA;l>uu_rEFUyyFDE<}Ij^K=02Dyu-@nbi* z7KsI>?NPP7*IetAf?RyIvYEd<{n~}?TO9f+((?*$9rV@O0~{!)El{+2LCp*3jf;NT zZWbAXhIX_U;_rB^M5S@)gM0fa;em}?oU5kdbn@7@h7kBUcQ)tad!{+ zSP79+cys{Dvx!;w#{v8Pa30`8za(Jhy_@&9Wm~3foJ%@a7lq8G;JA}i9Y&$aqi6s3 zXKuvwN={P!75d(_v>%fE3kH!TN}_-rjz<44J2Wq7)(tqR{CAwfy=zQC2?Yi*o7p`7 z=p)-h*vYnz%zxx?(1)O$mXLJxrD8(n^%ImXuM~R)K}7-*{r={>nD{Ws4jW!Uz4`r@ z8xB56w4}Vq3z&QVxFHu{kXXPVA2uBU5K_qqGW?`~TNvJVq=^PEX;pRW?V-gx$pBTN zO(AHQ08~I*9R=@!_p(n! zXP^PMNEa)zn?W6PTcbk0&_U>ujbzayb;gM;6F7zsfn(S;G>G;YiIxBTATr{Dcy6RP z(AjqU@Evy0PP(Oy1(9>A1;miGvx?cidqNqO1@iZ^!e#fF0Th&|$-54g$mNfv2y*G) z{SOraV8$G82s0wx9I_VJt=H$`>>`z8b*}>~I7;(%h_W=#13XBTl}@#dck%w6vaG7W zphpuTx%_i?`Kzrjr2)`Lf2J>qqq)1b zFb)EZ&@ab~4t*leu9fK@Xq*!hxwMQI^jB<9B~m@E2U1|^b?0ud8*T`lhzyQTA4IyG zNY$y_jf$!bsaX|>F+{2157!%jvz#yx%d^|TXdtchH3TgSE{O5bE29J!Q;K>jvl_oB zwo>uP0r{@>NN@+mz1yhb?m%`rEIoYI5r9oO$m2>k98$}7ER;ChWDEX53a*9Ut@BY? zkgfDwJ5%u3NJZhOdkI;mjVaZttLtav(<2|(Tud%pwckiCwD!FeTeYBiw`fSme~;JYYcdj++L1dm-1SXkHll_y#lSM_+pGe!P};VeRpe z)|Lk6!D?5RR~87^p!gY=V46&5Mwo!`7^IzMWoq@y?!31)}N^AJe0I7;fr- zc&WOrEj&teYJ!;9&zNEOh6Vt_By)3;AB_u5U#;dP?-82e4!__zE9cl7^U-QQ-=7I^^K2YFTfljC3`hEYM)X~cC5P$rR&tkU;<|ZQ^Ftl*rE^QoG zlL6(?NeIXVK8H;tZum2ftm_2Ns#d+dL1auOo7Ka+t13$(o2Immu`4M*X>&=*#n$Ny z(v+&g#2;t(xuN#XrpVMylMpVGn%qXH(m_*%U>E%76qeIp_;Uj=5i@4jTCg5Rzp9tv zC*<^DZPs4DH=S&Xv9G?C9icn-w!x*U3Q)dYGn>S*>n%|#`?9^>%=L+$ueLPLA0unD zpl^+y#B|G9udgg zIriZ|%D2VqJyt7~JE7{_Bj85aMBK-K1bvw^NYSgF)t@wZKg&8nMe zYUU8aJ#M{5MuDhq@70c>Y25zd5Yf5Bpza+Fqj}KeGg0BIuRgk4i1Ak1&Op8ep+hK> zK4XE5!r(%$7ViWvnADWaQTFM(tV5!n`w|UmKI^8LSwpREPEHC0#NbU&wPWCPf=aaS z)}XOWd6>F?Oc@P_KG#CT;v)DGB1$Ixan*u#*#gR0EQ5_hFekr1r)Ap`?Fk-lt>vb3 zpuSn0tDpq)o$~wQ-C;EQbI;{HnmjFMV6FxyHtP!(h~V;_s-@0aEpiQ)RY^L-JphVNw%GKmR5TqJaA8hMD$2yoA>GYFz{9P0@V>~E7;)z zCV<&+6FZM*$mJq(jlBaVm*T#waK)p6q)6M^8V;CUQoI;E`M@hQ>e{5~vavCUeFE`F zBfuj?>^emR`kBigORN9jE~3n~Z93+?NeI2YieHL7D^khm^k4v0-mBz|RZPPQwAIDO z-H1j?K}1rTbvgTXdtopjlIVp;m%F7ZuKt`HWG<)r->lI`0B)KBxOwLp!%e6(yh(Vp zw&c58Ch75RlIj9jiH|1|&D zcfRC>>&rbeqnXzSo}q|)qFC5;=d)nAwYa#$DeYS`gr%(N^5|*o!Au81!Ho|CE?mAk z3aZt6W*+#y!G3Cn!TM{eO1=vw^AzOjMcGX#9;3R>E_V+NlMWWjbSuH$HA88-$;HR1 zwVp-Z0axcM_sQyt8-qF6+w^Iio(+ZZWFcRCO6&FfLN=)C%|M@pn78W-4 zEgWoITpS$CtNk&52jGz7Qrzd4#iM*_j?d~sB@mpDL%{Z|vV;27k9~GQ3)c`rBAUCj zbo386I3IFx3ki!n5fu}cdoHh_sHCi-^;%m;S5M!-(&~-1jjf%%o4bdn7uee;^j+Bd z58)A!iAf)mQ&K;DhJ4A*%P%M_DlVz2uBol7Z)j}l?COU1^!D|C8yy>;Kp-c7q81jH zmRDBS);BiM2Zu+;C#PrU7r#*ef}7f80Q;PxGGXpbWWmBQ0UdiwA}4h!fyfypHm#%M zqS{Az3ZmUOXAj#g*@o#|ogiv2W zI|sR_HU1d&z?|Kf9TJbOos>H_ou#u$9lyP)?yK49Is#Fr;<7fQL~gjT^>WjMB1l5TEaQLd>0;8A!At#DcvEImx^TNoG>wMGLtR8gYxw)Hq-XmI`LK-xdufl_j6_E7Q_Twglbh;^lr1ThNse0=@1LWv z<7>md)2DQP+tO-{93ExkIjEa>X{N+LJQ zrJ4H+S@;f(#$L@^KITdL#G z9@7eG?t(RD05`kyoYWUS(=6u_nz_Ct7WWD zj3Z6;anvO#?AdiBcN1eeaz@|&4}k8iRdJJ=1dN`X+{#8IenGk z>m9o-cfcUQ)J-#wYHpgLntr_TulwEO7(Vq^z5}4!R1(jTBr$7~UPT^c#Jpu3AgN~z z>#2J!a$#kXJNT&limJwmM>$nB(fvY$)H+S2BUoL9N@h)H(oDYgRUC)!Qe znYVEZ2Ft;sTZU~kh^6o4`3?6XOa$qb@TW(7HeoGy9rE;lg3Gnr4&Ar%56w-y2G56q z;fPv0kBnEKp8)l>71c~y0M&Ge23&_@2Jia4=(i)Ci-vG6SZGvlRm=a}dLA@Ur6rM9XBysBjc+ieRdes;CQYHji6D1)-ZGSrJ znBgip`E+d21tJPfPV0lWi8&T z`hL`Sl~NmY?z!x&wAoWt+qix8B!6Jxm-I`i@mP|TUNgo0$fXX^O;FB$O0Clu<7tg0 z%6__7E|=?asjXaT!ce8^TC_&3ANv?g#+LxFn{k+~dlzayx+PwQtO5j&d<*>&+gapc z-Yh!g^Po2B>e(e}MBeaykqQ>R$+#9pow8O}-$x{Nug-imKN=Y;&CeQ<2E{E<_gXC# z!{R#Whw38S+$2LCx)W#@KgQn4JpRrZVm9i)+wu}R7a_Fq)tB_Umj-4nqyMa>4hZ=o zc8to&W~*Wbm~Hj;(pj6xl*G-0L~%|Kt8znU?KW6b{1 z@kJW{tEr18Pm*rkN>XOnTVA-1656;^6ZEc5rdv^`y==(SkcD`I0_>~#$;h~Gq1=Xv z>R-*m4hR$$^I&DL!7w!(P8{=tkP$LjyZ>6;xJ;S@=`?Y)CjHh>cE%Z#GZv#MoMC{` z3{g0L;r?<`n~EX-#m^2i;150?mflwzD3K^h7igZSs@s)fvzd-#>w~!WLLc^b-gPb> zD3bV!uIB{;V2?PN)IBnZ#&?85{XO_-HWvA1+1#Hga@4+Up{Dula5utZYsEn{ON6&^ zsB2A>x)7N$^yC4aCVa3S|4Qa_O2vnDavT$ z5mR@)3{Q0>?Q^zx;5+n8SXnB|aqukZFh0^;F%bd`6Bb*>n7mQ+k5oF3vp@cdjZ$Bb zvL0PhPLzmn4A8f+kiO9hLCHaq<$Wx zEXfJ|Ic+BZci|lw;MrB|d*_PlY$7qXbF_EYwAVqPpFzp={hweXfIq?LzrQ{9baMgU zfxkbf!ut()i_8J%4k4szIw7HQ_$P1k^n1#r_b|ysG0Cng%Fqc}$rw(O z)TNmAs~TSR3s=0Si@($=KBs~9xbht1NvH`sd;8yLP@(}{KF3GTguqU~drl`qK6fL! zA-$aq6xT}ku7^HGDgF2`vvF10`&cj}kUR0=k3#uG^{7m}lX8Q7;hcTg*Eeo?({e5k zdI#8d6~EnN3lJZJ{x{nQXVL{y63`K|vmietxmhC5FdpM>w;NyOXhX~pjD|5du5iIGdQ{Ueua zeyR>$ctIN?drB=;QixijP+ckTc2YTZ!Zv^}e5L$pZ0A*XDAfBW-YZNzQ^pO%2{X^Q z4r<{+L;)XB`hmtDJs(}=gER$hJjdu@ng9yFh6PS}3oWcV=emk}N^RXS?8#@VZ82 z3%k!9TA9lIFlVgj&{53AzRK9Ks)At}nla&@I{g=)8*44_<~{N9tZd724j7_(E4{G< zK_gzkbe%5b2x^QM*P;4I8z61%jVxTVnMimg_k_x@|q>D|8jp+ICSvQZ{*O zN=ARa%#Wbz2%bAABu~JMab&W6%#`m{M;JB*gj37VE=c+3QPsolJ{N zEwvTFQ&mPSJp90Ke`a1Bbh{>2&7=P}!<=_u*M-jOxcufEP*dO?>8&pKab$+aMV*#z z?Z#Uqwkr8Im4VoI{8R{xv*r}b@l18m0HHL^7tVHSquU43FfAD`FRCB0-hYw=jXrlx zr0$pxRkyLDZEm!dQr^;FiQyRa#>e|Oz&G;n+mzs`8(hdT)2`df@;DE7NlX_Q`;K10 zIzH9wL7bb43_a0WLPzdkJZJK%NN2zUvk-rwzCMvy2t?jDD+AYdonip^?|dXv1w=x0ZdZalC;RL z!Rl>|P4TT9G*exo$5wY039&K|hdEnU^iuY|TQ6O)15aVA1?w|yZ|m)^2D=5LHL5Zn zL{48_UtHMr&9+j@yHLV$ROrR%g0~e_N~Y6^Hm{hn<=qxlX=@b@axlKLTAmh3Dm&!| zI?XCt(bFcrqVfqg+Sst1M-_!*tNXZ7FT6t&s!nFBQ3n@FjJn|CHjBGWyLI2_&Mpo8tIQ zYOAqfRLJnr`|q^3|=tNTMc#;wBuBsX1?UwQ!rrJe&C1PCN$GKgIw>&DnI$N zS~^S4zRamPVZ48zU@VujP)&XgFhOVOI`)1hL2#542J7wP7byIyBXlGBoW zwe{0cWY5SM7?!{)|4q!y$Lci+k{SV)==w1Oj_j0r+4AXu-$y458C*ajAVXo&WqCs` ziMFz+&85IRFE0Z=jOk&C ze)hw1tA?poUo!i7TGr@N3JEJM+CyWf&=%3ufO{3jFS{SBoF7d34NE60!YeT3%>R(t zgVR0twDk2x0-vPbqKw6CzGLB;8CwYNhc2OiJ&$2L1Kz!i?~eURCCe4!p6a;xPJ~R( zq;#IiR~=E?KYFOh0=kr_XwoJ(CBG~SY?G}Zogorr^Vl48TuTJWBU#h~75UWh5{jX*R5eond0K3;Pn$Y7;+ zN+|dwzs~C}_nb4%?YVv$gf4oj31)hrY4 zMIU&@+QtN85UJL;n04rw_eFk6)EkdiUDin4nSL2+b|k!s+2_YI5(bD}$f*+E3a>Hz zTm3}^e!h1=u4u~j!pF+Nm_te=q;Sa5cJ`hzH_A|-2LXOyW`#4KWxsvRI&HVL5J<|K zoTN`^en`?FB{B4n$;g-S7bUo@>S~&E70-iadkPEL@ z-E_3enJp6>%pLT4?)3j@9qlsEhu4BySfOha86C-eCR*NZ9In>DW9 zzci{qc%*Hm{km@e@>NXQ!D@)c>ZM-s`J=$SMsi<_6RHDuu)V%VuU%FLwM~*2#OBZ- zWKN#)Q)wJq*q{5r%gdvl;2S8GjbGpkIXE2pzXVQ=DiOkIm(9N((5r$l0s!=#UPj&I z&AUK1f60M#iIjdR`#K;<5siPMomU67|BrxbV?}6JCR0^yEdwO)5@FneLTPPt?f3S}|9 z{#FASN9Fw(Z0}FHDd;zV((x_tmBhl3G@^G~4KeH1PNsG$yfSmM0yfGj@Bgd-^hyHB zE9`Ii>g%}BN9*cpZ`>YmxMk!)#R z-kGaYBC8zl0A8k)yJZf382@~zZvDnO%6_7g5w|@P zT|@zCiNKHdOy{tAdGz~?>PSNyl~w>>WId` zacZjQs#?r36xD#R*w#Dd&Iv=v_=DR_GRSbFQQAs&x+P@ z%^n#fgioEy!b&yJZ(vFDmpdGz-=PyHI7q-@jVJ8cUsoKf!$|EA-zgU!@&@bZKpO7T zXi246E@a-gngTnDLi8{`QXESUh{&@L`Sl%CQh|O`mo(qJLq9qWoj~6L1vz`hPV~Kw z8p9!K&7J;<+B`YETR~_R(Ipf(3pYl`MKHik?x(%79aL&(cUiknb%2pTB$2(zNm=S z4KE!3No?QF^AGF6Uly!n0G@K88|>r`RP{5OYY?2q4tX6&f?-_->mC`VsjAy!oRPEN zY4D80v=#6e&2U!Q?M0uP6Jtu0@YmLZEtR#*W9Y&jsVO*ie@cJbIG5*u@ga*rW$Bsu z(HkD*$r!am8Jif~{Ak2T3&8Ufn;mJCMYh-TndH~R475o_AbjVLrL(cL)D0xqX>63! zqf^?r)(Qd#cGb_awTjgFQU#}Yi30rX{Vls**=DD<)_*E>U=>W);c&@pC;;dMVR1B# z@8jkCN+!*5^Kfut%zYR;$A1O<+z>Q1xSvY=VhQ-7akbV@W?^cNe9k{*@ZLSE=5&B` ztw{Akqr2L9YRW0gJ{|Z;3&L@ zF3CmdhoiObWMrn`$SVW=Fp}sLw;+5(KEh8-8Tr0L#AHwA=|CjdT(;Ezp+a=*;<66GGEi+3Sn)gGPmp~<%6t218yfFRijM7*dWozcu8X-3yFzr)S|h}mYl{If z>J&1Z`9%mee`iQQ@)&&HLH$Vd*v=~CA_e93eOwvC?|edZgMvd;(F`~}u7dhz`x+#|+UX0gv$A23N7$RLw#ub_`|{XX$@*=U zXSyQoxmC>B7+YdeK*i_Z%WG#;Bp9AETV>qFu#7OQ+o3oIa5n7FmGo$YnImCGL5ak# z3C?w3{)Z0w^d=$@=|0@CcZK+7bEKKQ{7Lr01y1Vf68Ymt4RFWpRb&rBQknDF6_zGa zh#}+F^3=2{WrHZD{2^<+c22y6m&=!t8dA9K&R|ZhR9R#5Sz74ig4|8WHCif9xp77p zB~6v%@((7|NxI*6IYKrGuk7W9Q3 zn0>?f%)^D=^0No)WlnT~3vfnZ3h}v*um(q_D`8;zvHcy$+}2}*WjxPz9%mW)V-~tI z?HYCQk=M-)k>KnPyFHih566U;68qjH=dt0&YH$%U>Xu!J?w2*yeU=((9pncpbdlZD z;jDGO<_;DrO~}J)Qqr&vSc!4_2GZ<8fC5XqK=Jen|G;U_^pDi}2DDllB5k1ymz8Y` zEl1^yDRMl}`?Nf+E=o#EP@mqeIHI9aJxwns7h-!0^AGVrN>oD}^;3v(->BjcJE!|U z&cE}(uS==3?@7jl{dG0Jevh4@>3R( zaf}+)x<~_qg_@H`tK0OH?Xo6rdQp8=a~Y7!1YuMKnk$P^Z<_F8>ZFM%oSmIk*hjT1 zzxMy>HrnEg9HM_-DIRoSma=1{8@V&4+GGs$ z`Ygm=GlEHbNYhre?SNghtJ;!NX+3c8U}+Aa9$y~muG zuQ3WSt2(oFm(sp&w5KAEuY_5RX%Z#~uiGdvhNXTT%w#pN84j>SHBJZ@<{GA52Ah*l zVZLD_#Iz&Lxu1T`vOoLTt;p#9d&Di3+}-K5eDHEyn}VOE%P=l?g$}XoJ^JHEn730a zqWsMSG(Y-jd{dF#V=s$_y}O3J1;#OgfoYP@Yev$qdTZSxL0XDo<@uL5oNvb-zs3|) zc$UTyAKxUQkfo43U3%($?V5n zG1rWh^F4>e=D2fM%`}vdhP2eU&8BO`5?oj}e|_IXva%Lgwh9Sk?VM@Z_|zZt+7s?J zD=^MB;b&Pg+v!GCPf~G7ihoe1{la&=4uPapjq*!n5~%}@w#bq1{|0p4<`vmpRxaAS z%WADY6`8#*XkvutJN8-XFW!e5gNJfJEOEmc4+|_guwG744}-g2#A%}gN_`0jUrqDN zZHuyetDKN!vN!bgjj)C{Jm^&~#A^k1Coo|zP`^*}a#^*1aw_e{w*!CSPFK!{EwwTD zr<%1cCemF@HPxE@p_+Bl?t@nC+!DINi#yMxbm2|;+lu_E&TyF-MzR%sqU_k(2dym! zLs8DEv1uA4KBf`5;`p6X5^Bv2hr$e(aZ=-Ti$&tZ$W*M%qg6F`wnNzALO_(4*J7#N z+UM-C9XFvttIl`{i^eP(d%}{l>esE|t749{g_o_EYLZ_l8YIpVE`K7x;v-|w6y6AU z7`-k-C^W>kyEHiNw01b7>c}0M&C$|8d|D`AnZuId_4T$psQD|kp{C>zUIys%Du)^u zz#Z;-%{@-3jn*mjryF!L;@3QN3%(%wrj6rKd@sbC;}$?I2wih%lDb$UPS)uFRB1}@ zFPhUliJ-diehV}Z)L$rIW<`FE^xv;mY-&Plw{{;2iF;%V4yrCFVHW_C(F)m+@q-QUpDS)eHLcuSMScQTP&WW#B3RLu_Qn|_yU=I^>7phlhmRf$5?lO z)Ep+By#j1RE?p@HG!;e&Gho;ngJ0Fq7doymMH9Pyc?k_1Isxnstsx($=uq3N+d@*z zn{FJrUiTY6VT?;)n;86$o#V$b#%GOI)Agd1Gdgv)Bt=6VO*e0jT^(nr}o^iSa$+L2j~-1;y_K5d+Xe%8X<4QteQun`~8h`jd) zt8-+A0Y)SK|)nA2tTpAr5)BQryYks5XOV7$ASe^Ac>$N7>T#b&Kd^~4oMO2O|( zspD94wlaDlFQiDYzNP0dK@*7(kTOK;vczec_=&jw#Y2UWfz&C*0zHGK~4_SS#%b>@# z$^8|-cr_ir738Wm0#tOGcNUtb09=@fDv-m`mzrq26?mk9oDc-@ku&AWPOL8pe zG{-0xPl3Drq@=L9fsQh8=bp@J5R}T7c1aPfg}Cm6gir%|QV6835;w2v{3ZXu*KF$bom>>lZF}7l zAG1s9?8#IL&N(OhgP1vfcC$;O8~R=+TiD6GFGS z80Z$8%kgbfG;v$Ue=syRM~KKf;(?Ea4Hu;%Hv(8MiKY~>VzAz5Gg64_vh)y?`lv^4 zis#XkbEd@3Vc5qs-?uIHt#f=qg+Rk8;s=9Kr&FkwI57*QjuWaFWaO?Nb3S&+3 zrUnS6l;BK!H|=Y7eU8*cIZLJ*XK&lv+(q*Vqm87G<@LsRdUA?o?M*HECVAI^6Na)C z_51R_cG@zb)Kv?PR;DffrG0KG?C7IEWJ!`717jgwUGlWg`ThxpSm~FL4~yC#eQYAs zKkEEwC&#k-W10zLn%<*u>X^X6Ynwvkwhz(qd(5d6yLrQ{1|I6s8RvR|hv#v%;A>Z9 zwk&g{8BoJMN3fkYkFM9tv=3fCnHuP3cI_WUc)qmDx1!v@iPWynNcDJaP104E7RisXEriVq&Cd{QyiUWADLOUkjddRqB;0 zW`JToAR}uL0~MR{&K!Ks)j_3f3K)$^b4*Tcv^@k#fUN4}pQ=1$#9S>8i`~krtp_z1 zLB9u$K7OHTe?qfgmt1fq*_^?PGxqHB6UW??BkCpNezvdn3OmMMyGBS*n~;#1x#AS6 zx9mg$RzhpBAE~S|`SxIi4tW$V!z?&UHdGQulXv z-_%fQQaC&1LQ+4!EB*bipJmnR;>cs82IrA+OIiGK* z8d^BaON~VY9dzZUXNo+JP0wMsP4hHP(DiRgYuB1ipuVN1rqi2R-bwuujLg}q6+!GQ zD&K#|EI(jg9H15RWD4^s>{hq;HN^%8bSWo&8?$*Z`5WN>0qTuAfZt%z`b%Q`xmh%_ z!tXw0cJ|UY#0kL(CT}9fu<38u_Fkvr?`Ew=HM-Y|#LAor@keWf)B^3En>t4`Hj{R? zYA!0&3)ctx$ynwquWTT3npyTLj>}mx>Ib{Mj*2GDB2QS}-K9Ywb3Rc9R7$kRd^htb z7e>~Ch75JSHnyb>LX;=dPsGaNG2rs`G=)NP|4v~sPm|78two(i9%k(QU$Lp2sf9*w zrdYZaq2TS9wrBo!Wsl{3?{;iOfeh#MDE(Ny!WgpKhrCn1mYUe3hK?t;+pI>_x|1eX ztJ*PLeEss4K3$z-fj+(Yk-14RTF@ww1#lM7tL6{!?=h~N=sPZFwC3x+7=7Ha+8Q;# zGX#a64${sMWGpJKKNd8xEZ?k$)YbcYd2=P&aaeT!0zJMZTYACKQQSRBLtZ=}a6-MA zMd{Jcx{v>1+a39{aQe*@lTn-jx>J?ej@IlDfnl!vhsj7xjQj)+)oz}sotkRyzdgi0 zsFww`4pQQ*HT~g9qQUX8B1S_$wW3`6EDa_ZNOmP-StvblJ7aiqv)cz5L!tM*3qP}V z+Z1ot!Qs(4vD0%+cH3Wgc%VT^*%IST)XvVzbl7U5HT$(N1WQafQ2yty;@c{E3WaVr zM!!g-c5i~O*5BvkWcS&jvLHnu{V#0+}Jr0`~0EbV$*a%?s3JL$uf=!KK2N*kocnt|`#zCM>ND%_6xYB75}G zZXpW5*hGaCorHd#?nF&D4UNnRDJW`6aQB^f{mW+R?`O?$yK*~-@H_JJ7kW>1%{CfN zVJ|!iD;ce9(6Fza(gLAfNaWoZd&xsbbkAk=4K86YQKIs}r$psFh$|zRJp{4A`?+4O z)v#y=a}>jPv8ZLp~LDwl*1k|f2SL&?qzTsCZvUl zD+(y>_CAPUAB&&&eT}H+avW-6+MH3?)>XvZW>a;+HVpW(KzEZ#v#`{2o0$t5`4O4j zE(uvZO}_#7;5K9z^7L+%fwkLPbkEek{+g2#yA$pDoVg7_AM35>XpS9oJ%M@Xz(|MV zA>i||o%;tlWAogKrT@_Gh>k27e+cz6w!wTf9re>eQ08Z*=#;0k65ORqEK$d;-$J?Y zetWS4i~`RA?WD7bZP8>(3;r@?G+LuBJ?0vXl7J8_^%^4BnspUBGp7_}0GFIfaANgXdOjmvClT@0) zv0tB;KCCXe&JQl zYrW@xc@AjAUV{h&hPxy})~Le?*kGEY$#dxzHAjJ@n~?2h9$tu62$)*qQloiv7lJy$ z50T#Di#fH|bj@#;QIf1`4fVshZblWzKMzC|(Z)(8f}Neks==|W{T zbH#T4%oF7d)_zp8)ylU4EjI^SnGA}L->(ovK_W*Ro*PxJ1MT-Z#b+|pm~(ieL-6UQ zX)0e|yTh)QsB?4A0$(Am`SlEiKH%(gLr=22@@Ir=mwAapt4V7K-V&b_6xq>o^XVN? zS9>h*I*zHuy-4|n*@+>zmRwgG#^*giImPcDOs?}?=8mI`6wcz>pdIl&)h3W{p8*%X zHIx0FNuxzbc3+3KYfqh{A1BmcBVm)`r_w!__@`^s(S?WkUTd_a7t&!xpi~Zq+nxy( z%IzE4dqr=DOe<(?iBXUT>hPiV2o|P;^em3rBRy!0Z7AadV;?vtfMuk8-uG>?S?N)x69*91?xN#7QJ1x)X>ue9e)bP1k5^Kmo zeZkm-iBC#)M=7jF@g~4wC?b7iM5Q&)_Oxkbp}z86^AcxlNY1#>6qIki!-GzNC7}o# zQ?R6jppOn-{}vH(k+FjuB7V6g2x}hJ{#;3ph1*@ zl#s0!%o~I7!ET{1=2%3!od{xty{OxPIY>9oNL*@s=Wr~w_=;rE@*M0Hy z6d4V5b7Hv=;yjy1>d%iYO3CT8G@@~bg-Ss-iLWh0;+_Kg_?VbCZNkmzCX0^f79l~( z0>z@l?KY#Ws(PRqj&D6(odS#G1W)b~1`S>(Yc3j*yvYH3qJAONjdKKz$p6IjyNT&1 zSuE~ z_6XI)EoE)xc6Qw@+V1~d|Vx3*SwQc#i|gx61YjBP@vy2b12-P~YC+#8-JqslyQ6(*R1 z%Gny-eH%0Hzq7H({caO!5htMi%9#*bcvHOD*w)7(HfuroDH-WjT5`|g?B^0waww#? ztBo<_LOw|+kptrTN75~m-?*@ANJb-b_2l9_*jMjV?yuxK7E^@BR#c4Rf|hE1U7|9Z zg-8(-fO^o+3P9G9Fa!0No^GajE5zJKYX!)E739F$(9@Zqb-C*^1hfXKsoZQGV7v z2ru%99Nn<=u60yH`aYOXN0^`6uM~XXHIo;Vvi%gEXvL9g?dYk<<1VHT`*AtJ}>5C`vw0Im3yu4 zC-`M@Y%aw?0tYv&ox!kqq4^u?&EGpLJ@aTjI_uLYqax7(QQ=skY@ znppiZpP%kKdXtsmCTkVQgcU6`wwc6kVBFf0D5MxB&x9uh`sO&peBu=qj#2;~4L!#@ zy`65g*ea)`xL+4$S$O6#K5Z=Dwz+O8CA}^z*NfoP*suR!*^*$Yl_>%-Vt&mWgv<=> z0al%1cHKp6uA5g;!$H~7AqkK< zelk8L=semuwQGo?>-G39U+rCH_4EMSsB0fgy^8OxCj2xPKiiD6E4eq@vb)jEv&M#Q zndpMoPcee`6C!^Js)6?ffK6xmc_XD@*xeLe8pPA#b<_9vTp(*#mi{7zi>(T~-d-sm zgS>12nD38YKW)Dl?Ola)?*0tM4=H3s7K39^OI=?HYc5%8SY%!Xio2So(DkvX9K_=} zYp!Vir5omrl!0L!DK<29Plq>6L!K@PkAOR`9W>zvVdJBFyj-`F(y`iaRVHAQ`REN+ z^ndybKPi8KW`g#9kfz)~STD5wDEgYgKQ}NjT|?g{KJ3QKd3*n@;LAatcsY)&KLJem5yD>+qo=^go%3; zH#pU7YOW4?9q3Au<$If9i*gAGJGJ|mwzToJ%Tx(ZmbEv zdrI-m$U9$)Q}iXq_zhf~GlkHN^6|Z6t;nM}aswl<(}GEcqa(wPLDG3O(^c|_X1=#A zwj{GUBmitUv&)|bhj#DF3yqwp3frv^Pc!ODEzT&Y zYj$HcadaO$kd{;8^}p;(@73Bgca3j8euZ@9DrnrYYq~Sz!k)2;)(M88c+>@zu9GnTDo@9TAl5#8Pi#o{TxRC@$LG zgVu|!hVqNfOfvyIsNb^c{(t zTGWqCDQ4A11r@5O!YMOKMBB^UF_jDR=8vCf-3|MxDOa;3yneA$b4`0@Sy(!Vd2mg~ zNkoBUc<`wFF~BBC^Iqm$jDFQbdCmA|UQXMVAGP21l}bLWo=5a^CTU<}N2+}^>xyQK zto1LM-F$!F%XyTbXB=lg7gh4`7gslhxOOS8!KJ!#;;3iT5Q9-UPGo`i|3>AK|2yi9 z8AaOP0>9kRrV9ADNXW!J5exM%VDGn)kXs{x>4wN_$vhd!)lXII$RO$0aeDtyuVNW%Q zq)NU-zlvAd&?)l(?eKD_ilJDWJ5#q$E8^-yutHzKL2G@{g(~)d%j5pdM2DnQN$jNzJo^g?#dd zN*$69PfCI;K1RpN8&pp0)zoD0tl9dlpjLbmUhf;OVxA+mYyUgB%sA01r_(k8c~oa4 z^yL8|?f+4A<(_z7?w_BxanlkX5;z{Gaw99HY2eHhcK=(2nfQNZCI7EkL7g&T-(Osu z|EA6J(Uzn+k8?w$8M1Hb5&~OUt#`O``MgQ)6F5WDL&?x6z`%bJL6=v0lh*W*cY2)1UpflX_n?iAUol) z*{o^(j`3gi$k^EAyq~C_`s)=xr&XTxk@4itwwy{SL7hmz0Z!zbr8W%VNZib4qA!47 zzt@Zq_k!Gbe0Wk_3_@2;j2OAhH%vgqCW_v^Je8gCIhM6|%&@dcmEoQ!)Au|=mq3PJ z7Gki>{p-b1=E5xJjF!M!eYl|gK%GqaZ;n~Oz5hrsw=-v zd`a0TC%j_-|C7m3b985?%t0ueXP3#VPrM3~AkVtyN+xHZ+&;pF;Vll04O=$#oGrvL zm?U{{>q~97NcLWHgUn4Hr$Ep8R9BTsb|t-?*R%j_%S0FB*rbJK2~}0#js~40WIF-3 z%veJTQyqPm>U&ftQaNPQ)A#@&FtB69;get>P8!44Se&2dP;p07Nw zh_-n@$%NE8;*kOlJHg;H(}`su`VFKN7)@|74DF`>9VEM z;*2n`^1SeerQ+tnz4`zHk7}LIH|1?@A zkN5&6+}N9`sUx^c9^>jtLN<>aZsCNC?(X6@feKh@sXTh22I%T3yB-qhDa{asadSSA zfMTtS_f}+co?Tq2Jvl1Zfj3b@9Lsn%xzH{JqCK>B@~WR05b7rLtZTI8WOsSSNHR0a+fp0b ze(Mg3S}I_ZCtw@-XneJ>(WQ`826bs+`Wl8iZRO?qDQ|{Xu%dv+HhQI zA^-t$eHqKH37MI2yC+Y_JkhttzF4+#qHvAAM^f+Qr|VWQiPE#JzuT)WNA)yL`sMhg zF0Pw1QcyA)FztFP8tX-RF@8K~((nG_yD)d9?21e4q66=jbPCVN43?$2jiW}w4U$3# zbqFTcX-Qp-Z0WW^dHV|4DfAa~`d6v1U{ojNDu^qE`Z)rRN8E6pqu+ptg5){L5dbXi=Hi zunHf;*cOHR8qvEY=lv8r(x0&*EA7J|-wq_uVNul**wpUIj`Fo=<%Ihj*s~D9q(^M) z>R7ks9047!WbDYO(M+;d47h8@hXH8JDqQ!(C%x*^mqRh~a;S6G9nMR|*jnA0L=Kc@ z10zxdf5kBKPKFu!L2>eoIeUai)}#wxQI!t(2x13jvpcN?)Te+N6Y zqo1S2=Ofyrejlk5(lgrOm*i5U3RJuk@a$1hxitD+fzw_4Sd7m}%A>`~r&|WIv~Ntw z_0MAmXnq6I%L~NHmC&o@Os8FaGzfAh>w4+ePf1M~6G44kng++^?|m{_!!jV}9KPrI zwu@wavYWsWKV7agxKCOtkKYMSmLrgnl*ArvTZAUb`ZQR%cmC}{HxG=tW{SOR7x{v? zj|-Xhep$46wwz=lui}F&yAl|8*yiQ^@X_XLref^9t9Q&_TK2jR=={`+s>R&aD%dX> zbzU%G4x^=!ezj(|*1H->FVFXR(#`uyVh&sXw$eMAD4AsXxTRip$bo?`(*Ua3=@z(J zZ67|Eda5(TJI$X}wHD8K3KPHBb$E8Yc;Ly)GkVurI&WNMvKY!?=$o7{o;q6)MDeJA{qH4deUj*q=kZu`3r34we1St_v8irDuVdxlAP(d020U1i9W9Vk+ zZlwn4?t!5Z(C2J?p5N!3_q_klzP{^P_lDVX-)pV?KKI%8=^64P%7Z>%#0nunTCdw# z>3G`$-?;x1cdpanDs@jX+r6J_ycwr`X7hsu=2|{aXp`(oEB@28`K$Sf643O2y-I2d zksmve5uhed{3@_|b;O!ipVgi(G*`dUB#3uWrG*_HO0J_F<{uKutg`)7>WAj?^W^`1 za_%l<&;6;1dPmcN%Tc#>oWFTsU_h0yqO`7i;c@L`HM!ukagN7EGr0S5tsFbhNM=TN zmcba_3akpSUHruDJef8R5|%AzGb&|rUi$oK2eSKff8)*Ai}mSDZTDA&-RiK%bqz+( z<8SRjiw~V6F{c59>OVZT$Y_&-nqm(ccA(LKB6FF;?ltwwpdi`2%-mU?(Moj7XhM34 zANrw>I~Qi}T)V=a+ig#)P@-UBCAaPiWR5S_{rxmrZ)KEjc9)SNIolpf&kwuh&9>-1 zfo7H*|FZ69V7gRBYYcbT-p{WQ2Ko~DkKAiweb)u{txzb$hPL{^-vD3eM8q$=t(xO& zy3x~FX{CEwVrOg?Ye^Ufvm+J%bDWXaaBC{9mv^Rd6#t?U-D#lZ4lYaOb1e`08y~-? z%el9^NuS$MgBQ<4+W5VdoVv`tbJ7PUaa+**LxafIQywycYE|$1>Zc=2g@wUH^A-K56!eW1?g)B3vGUO@jaSo4u8&y`HuX93j{ z@HjlXy8(zDvF}=U?e>(VIJ9DAYV=Ei`TwL6y+aka%X&Iw zGIDO9J*Nr;=k`A}(c^H1wOB<{p73iU)|zkIzNX05IQ%bsZEvXotFQjG8cPJPWFw!i z=}P)$pgOIfb_J}&6W1pubAwW8)iEZ&)quzzVl`o#R3W!x($Fd^&NO*9TGq|=p-f<| zpg%mo;m#^j)vfCRgVQw9RIcMP(Wi8X!3cmkk~ zOezvhN@n#(hBvqT!gYmQxd+l@7ndCyFXk4QI52pxTni*zXmsb(fFC0dCKZ6+;wcEB>;l1fI}7(;MR7ilLWRlax%0`VA#l!{g2*FFALjeb9gHYw#-nTKte8 zJ73KYMkVszf9IFOqMB z8HEbEaQlCt<1(LjYRmU;YepTqvoTExC#Bk|>!G$0 zO1$@}7_?q0-A*_PPB=yK^L93dmbo+2{)j#j#o!;zq68Wyhbr$+ory={ z9PUQRshBAT@RF-BXMBDnT|%Q`?z?lc_)+pK|C?G-JJqkdXFUH(y8SDO*G`Za`x?D# za1uar1!;+x8hJc6Fstlv9wE(9bn$$dW8%*1OUVK6j0!j`0lOvRfh@a- z&O1ta zkt-h>9)0T(-cqbgUSSzLc!*!1&r+bvg>I}`TCen1|Tq zSiS##t>MyKNiUg-?1zQnN-I94^P7NJ)%`w@kny(oLE!ch;PR}2!XYXw&%&v#85>qIO z5wh$~aVNaQwtlSkOO0$`H{r`L+w=Kw*6ouSCNOnnT#wR99)+z@8jtATYJZK`4`eo8 z+%eu8Yj1_2xGE*_W|F%QS99Cm#xmWrrotKi|i`Ote&yu-0NHKn0P`R_Bp1)$5nzyx2p6PsQJohnP z(#ZH0ZvoDl+==S9x~!H)V$}f2Apthpv&r!=BZB-oex2 zFZ-v24VsMRDZS0MLOe)ctqwa|N#y)`BMlTz${W`P4oB{4oAnnOFU*5GQ2#3TcMyPaj^@GWo2;!uAEFm&+Tl3@BIf*j62yuTVpf(Hw=8r#>mcR?*RoAXGiN~8*z)vympS0Ewg(hJKN$L@$v5T{=cNkG%(eJ;Oii<1 zc71~(8PCw*Cw$07c5x^2A_UhYtF|)SB8rC{7?4Epl=hmFN=D;u0dpd&?f_bthg%gU_MWE~-Vri2;n6TC~7A2bFHrwT5p_d=>h(=45gT zUa9PLX0YJ0b$;~{|2DIMGj{P=)l?0SdTMSRToY>&BxE4_(BZ6cp_M*n+jwDsCir#$ zg(Tt_eb=djwzn|A^GN^%F-=@TT*6(l0SUJ`y9%YCk@2G9r(# zwa6wRb-`C4&`sFYGP#vD5obC|QWwXYr%bF974e?0%PJw$*bB$eBcE>e`>|%m&W79V z$|ijJms&Ww?AC4p_PbHGV346Kn&Jh4HtbYBr@3w95v~@^+v6rCFXZD@ELuINzw65TH^m}lT%$J9S%!WP z99emc-Y)D>QaTo580Be}!V#6!uEJjxshrai!c}8=cXInA4}V}^wtBti3Bt`}@QyRL z$_woCG+py2chipi#>??6b9o<|Jy8c84+kAd;cpR3>)@_?vzh25(~sC|uNc<(XiM6@ z(_P8#6vEj|SV)f&rMy?7aEJgQe9BqogKj>rK-Cm>5aG7UF#JdhpS%rf>TQDj%%7nKAELNmJR%Py-5HLV%AY;y7RbKcB09vmhxUC zlZJ3FJ=d2IyoF}UE?LT2Y)f)}yXaz_i8AO@#Z?1F*K?j?Rt+1SyZ_y~A&}nVe*L!r zgIq7xTUhuZ2%YRLZDgcu+An^4HCX>dhGNzbJw#IRB^boM8*GwMwXRfRszkNS`KjRg zQH1jNi;5m%TMk`6V1m@g4$(if;~p1WvuCqmKrgzSw@gt+E3jD`c&EDg2t8c?7xk{K z?D?KF-tw?>kWxl;^fweST*S6wDifHHJ-35hShA=8Gih7#9T{B(d;fYtJR1zdn zdiSF9((gxEr-i&aF#EVdNj!T2(JHU|#L=7~1d8g-^V8G1vwg?Dg|ZrTlrUVM5Na01 z8_GwrN;3^7?cnSZHd~mBGWw}(TGhtGO!ED^NC6n;-DmjCE||xn$Avd`3RPcIT)+C_ zzN+q<0u?4LNhSJ0DSQAGUIsU&B$=Luh%5StyisEqeQ{RQ!a25Fj`d96{PfOft<4jU z+=RozfWEZ1&5Vli%52eu@JTT915h9(4H>UTIs52cacZN0QB)mqg9%6Q@Y z^6_LlExs#ILq@pFQN}cT75pdMDmCV9ctso1oYGjSaQEFDr0sAmJ%}vIfExK(!wEx! zTl9PYr%0#^O-D>-$+t(N(om*6buB^p0mFxk=s|1uu&M<5$Q0E@@U7NhVTnI$!>tg1 zNo@e>y=iRFH8;53uK;ib0nI)A!@b9A+gYBMjf`}K-Htmxvam8BMOF$lctr&3aarT& z(SL)cehw8%_9DriL+3zcSwD8@PkGI9LQ^;?Ia{SOCL!Hk+l22OOQTEFL1UIf^0E%c zD{ZBZp%qx35Q6ID#>BSa8iXz31)|PhvN!-q`WosC^1lvNR&tSCeSj9c$F5{#ByXHe z#_#UVEEI)`x-s;8vYH;niJx1bidbHym@CcXd5Za^W~?tRWC4dU6bG8uH74zwTo7@@v?!yX(#H+#FG)T@`0$B_kkWpmm{Rq zDLYgsDehhHK6D(cK_y7k4RxsK8n1qxNOp0dvU|CzMnq~ju2GoC2^he0WpTXM2aXES|f#4YcO8pC}0zg2Q z{gqC-qM{v&;}3UfW@p`7yUD4EpECn#?}7=Gd|FVeSH4(BB3k`h1~mp_rGeeW#&ebL zI6n#XotJ4(pacv2UmS{viAqM@?G+BWufl1^;vzLk8C55G=9`qcTnv6lk%-&lCe&Op zXz&F`b;%$LE~saVtRt*`I`jbg0R5+lC}wFUQ!5B+4}!6Jw03x*e0a1q?#W&?0q^ z1ZjumHb}F6%tv}HP+|3YJAqEwodv$h+`sO@0MlwIGGht3bjw@n|t_eg_NmTtW&f=n_m=PS-kfP zV1A%nb=xd*srVNcwlphS@j;AwLi?7lFWPyT?Y0TfX1P$j(rj#4Y8^k_3uAs(JM<6E zUGOrUaB6CU4Jd&#X>?*Toz)UrVm#y`s>&31U{?HgX&$no6}FNwa7q8os*`~}>Hz@H zKl}z4`E}AtHp`)UvZZIZ%4%tuRQ8~~SCjXLKaC&X0!`}}`)5!xd5{WWKGIv35(`EH z-YFdd9|7KX3~C=bGyA|&{@jPQm*$CyCA?7MR^iVqES3~mw3&k0h%;Fc0&rx&64G)- zF6>*z$k~H$4@2$gvDx)3JDEKxS>u_{vBQ-#v6>%vMTIs*B^-|YnLSpT>42RBt!2n> z?uD1}CZYu5GBQvU);n0>`c{^M*~9;#@BNEz+s_j-NYK=L5d%2}LzR>FE{Ah+f@|g7 zZnAz5e3}{7!Vv>ipU(P_KQtz^B3d_n_dbk#k1n0hnj=pjemPETq}H_A?bOhi8nKckRz1#at$13_snA4^LPs(}j*crVRX3*m*I z-;y8cBGoQ+w>PJ892s%aY=%4H*V!MhrU@ro8LPz9V=#l0q&~1+DGhO5{{4n@>s;(} zAkZL150AUnD;q5A3pQ$FOMG3(?yl4B%~eH}a{HX1N$|pmPGcz?C4IQg7L|ZlCUEao zg~Sj(-}0AQC2hvj3q6wQ9h7PXY(eJ$EnuK7tUfoPhFFW{X3or1$ zC?u;;F4X478dDtFNp0BWJy-qew$_3HS@s6YZvGFHU!fg3ZuqVo5B>a9;YD3H9V_o7 zKBgn6UA_biqHs9NES|G>+@Qeo8sRMl#IlRzK3b1i-H5p(mTz%Yif`6POK3Bw3`sKX zc*KS==Eb=)SFqI!oyUSzx-%X&9O{3oOMZlh-*zMCs~?(*G}-3cSPYu4irCTW<~Pg7StdyE7Ev`osUP!C(K{)mc^LtbMltW7Wu}zh*-#=neJ|+L)(7=m!yT$rF zJ#eh)X+m>?N1u<6o$fZ%H`KQ2V@w}j*r_viNyNMd$p>S5h!87UGgIchH)SqMk+ z*%3Q?vLL9Wf5DHtM^P?X;FOhEn)!>oeW}QDG4{3+C6MQ~@uf=Gfr#9by)3U*hb^X+ zyc+IQuFoGI?A8H8h}?#bXt&fxY53gf)2-yi3j4SlXU)SK=Ti&A3T8yts1uB2xerYb z!Z%|eD5oe3?;AyC{e{StRLm_a$jc_HUV=KdmAnT2gqglhOMwMShZRQUcx9)x%?M?7 zvFF<&<~Z<#F4~Tbj<#xzbE8zJgWNYez8d?{Z@FT!@Mh)iP373g=p{9c7QR=IeG%#$pxY6z?$QdiV+k`KzsvI#+LB`bn$o zSFtp;Bt{q78z5w^lZ-!5I=eEgGwTILsO{<)+MoL(XN(Qo#)dXSjOV9-E}c}x@z!d= z>P^V&^K?y2tBHX~_V=}yLwFvgu}WCVaOtP8vuHUj+prTGDfg2SQ+0LJkAtd=*%bynHQQ7;N4FcXG2ulR!4Tw> z_`|LR?~pBw|Id&7?fpa6s9uIkebMaP1$(+9BZoUO&0V%+F^?!B6SSwNO&yZ$q1Jfn zPtx$spzekjZ&zTHnsnzgj*+khC8>A6T}@VE+P>dJ`cVnX6L$U7`7ByW)91bneVXmI z;bly+PmZ~ob%FfZ`Q0>O@r|!r4PgGn=&5{_O91jRJP4J-lC)F$} z@)-YeHP<~t3QzIz{8%FkU0Vz1A%1ISzWpdjC7U|xH!s_(aY2#DZN3^J)`gWPp(@N1 z3>|9|N%~@viDSk;Z_;{8*J^5`Y>AE94&l<;G7eIAIuhgvtlu`-iTMfaY3F({@&x;< ztk9EPI;Df+ye!+~p7&0O3=VT&s`D$%WA-`4tz3r{(*!isY^~i3O}T2)DEUTQXq45E z!{%+W+&@H?-v;D8Pnut24!OKEkj$>Nvtj7reftb67KT#1m8vnGlO#I?C)_q-3{COL zSyZ!q>-1j&vPS5*bE>KuCY-cq#t4&a#YwV3H=zpt7b=&!*%5`p?*QI(^B3QTM}#1k zJi*sWEA%gBfJiI;!SVYl_q^}FP^GTC>*}MH<9f&yH0gkOno`jU>-R4x{x( zTmV=4Z&cFX#cD4g?%2qwuC8ybSNAhCGfG=}6qNvJtP4VEeB17P*)q1Ft~2$t&%7+x zy?C4<=MP8PDloBvai`@0TBM0zOi$FyYuP1hV3kD;56Q;F6`@57Deb)IXLIZ%+B_&&-b(TrJb0Z15<>DL(WpLXrrddQ`%-oU!)4L+ibwEGNMsw?SF9Y zjJP6B0_b=Ca7|SY@;}iP^-5ZH!AtCsj3+csUUiIGDBU*lcsK<*8dCL1J`@b^15qwR8rHQ-4HJe0@p*~9Q8n4V>NB6ktBnU*;_FEr~c zU;BQ+_EdS6IZ(P=@;5yWnX9EN11}%Z9Gm1RtgUW8|H?q;O`^r!6ltnxItflQMC^w-uip>k8TH6qa*m)ibrUrh72T@xF+r=E zcg#d*60i0(C8z$u>B%A){Kgjrng|?D4VP;kL*-CM>2CxV^yezNyW6?KmHU9s2jGX= zwb-A@WThzq&)r`F9_Tuoqa3$6AbmVS=CX=x#Pt}Ud*T_%Sb=2-uvTf3rL6&lGuxL+ zd$r|?!FQr--vww&qLmK6Dimk&m4GJxjQ-2|$|?jwP-F=t;tx+|-N#19r3C;>rF~&H zQ+;WJbT2bkbIq-(5{fY3KlVjOXzE~uztqS2%$|(iQ!YAY54@M5;dOWC^7lqIEPtCW z0isB8TS4>@@u~Q(sbJ4*l393w?Q8BL*s(j$d80uB(7WKSFaa8al?w9p(|siR$S|96 zy2D0hJ-H79t4I4@LZTlc(-9Jeb;G-6f^Iq(9s2rMKNw(4k?C}gxAwb-jLm50v4j5O zqz2UQF>wp&ntg}Nn9{qp<>OsFK1kT4?dP<8e|M8_g|ClJk>pG&4O3v%k~hpvWpp%Y;3-b=ixAgH(T6uQ{hol; zlSj@?nzPK6&Fnco>#>Ky5^erJ0H8@N&b@di&agw)p58X&T{AJ_N=-u_CjZ3|h6x;n z;kaJ)oR;zNxX1e;{FK|Mrwwes+98^2--{Mn(>e*nCNeqUy*URP^m;!(pYjT{N2o(R z)U0@X^mOYI-s1EbA7yQy`jbHW?vqT{WU#MCC zIrmd$dzcAF>$Pd-#}kI;`fv<1 zS&xs{tj1eyTmY=0$waR*%t?0q-5^Vy|11_-%+zyKvRrc|edi;alr7T7TYs}zBHMy^ zPiD6gyB}B7o;6%F!*h@?Yx2U7JiDQ&MY{P)x!BpsTDbYIep;EgfoTHyWY*TwwfK3;LNMC>2L2P1Zg664j(K*6Qa4J#% zO&(_SV<7R85e<1pa|=5{M(v-D9uwYZdmH$&#uX`YhAq>s5M}GHhXX}`W)dQ2(V;h4 z4;9%x9p{>)W}4m$tGX4dqYKO^kGxCKH_M!l!z|_J;P{ z>3XL!Z#O^HzvGHxzNCPr{-?>_P~RFeM!~9&+f4eZr5<={`*_Nvl;D86PjjmQl%e4R z-_?3B_*e5ne*jaGGf5vqF-zX@r)V^hsJm8(SkgNy-F1F*F~sG zwI?ZDHa0S&zH~F0Z#VQ=NHx zd5Y5RYQ|q4Ek9Rx(XCLSr@hZKGQ=*)q7w=1PbtP&%iyuF(h zPr^X(>$1P))u0g8{pLGc;CDJa*%VVN6oNG%w54xXC(t_ zFFg&i3hed;a#rU}qHVP1(hCwAaj5TcP+ohJ%NV@_1RZ|+Is7HO0OXw*6)$Atw2|l< z^AL!+I>V7lSnf@;5+86WPEM8TRg9|i##bQZxhUQ2SIw$j>aOfztoK+S5womYf1orrE1KM-qn)LDNwxvKAXfL6WHvcYUka78edCCdd~Pd#i%Gm4HAelv z%NYH22Az3QNh{^vJhVnNHVh2%wrHx#?BEdC)303_K$lEe%wN_uG`t@`SaQ;OLw>wEb=NB+LF2)*8$o#&Jgrtmn9BCTR~R zyQv!eNI-Gt{-<6~?zbq{SfoNPcas+G)*qW(XPGWm=P!$mA4pDc=~SLLcpZ%rrf!Jsf3qGr(1EXh_d}o>vsbLM} z$BZcwafR=0$v|gOPx6c)aN!*zM-Gn%3UhxW?-KZ&JCX9|SC4EBDKld4nlxMFG8dKb zbc2}b+*NqfWgqIivPS!3!B_?se{;Z@w+d&_QLi> zRW(*`;&@tq=VeI7-?%wFL`~I357R7nUsm*=m5#PGKAGF89p=0Ll+!=1a+9+G*&6w2 zrrQrngRB-^r=y4~U`D49w22R^+d}!*2fB&4VkJ&!FbfRhe0$f_p6;%ec%ceZwoz7W z4u`y1wfko91t8(_y*x8bg1B3irVdj*s?UH|;c!}ysJKHi>F!rYoXs#n;IJX+N7V@m z=+Ju$W}Doq+NAyUHy^0x-M4sW{h#C+8^Q1I?C%T^&V^_j0NSt2cs!5h2i)W8S7~li z;!pZ**t-Nm%s~NiEE2wndNDHGo(5A*n}nVHl1vs?DhwS`yiu+Ol$R~TsOHs9%3#=@ z6sYAAw0O4Z0dr$wj7pT1A3A(~$#mdp-<)eiNQ_pE7c0RJThtURahVL{_`!OVr5||^ z8EH#%+T5Ir65ZhHq@;1v7qskZ%n93OKbHf9XEm{0Q(1ntw?mb9sZo}k3n*>O$5}4+H7D`z zn|qrQZ_8V(alM59&VA((w8`NjxarX4r&0huG9C5UhZ9PKW{UR7*n5Zv^ofN+to*RFeM8S)H$WqMeH zC=4(n;@;1nK zmdtp3!tlStVKY9_aPNx0c)$Ei@U?>@KS%1I3ksL88Qv9R<)rBVQ6=x5bN#@>^NGNX zcM?UtDg_hkrcF{&=3XC-k5YLcBVQ`FLWX{eO8Er>Y>SZQ{=itF zl7{nDIE>2WNl(jE(9-HWVS)Faor&gkOcDFnk+z8gzPtr|Bnpun$NSl_uO&Fy$<_>t z;ha5Qm*x@tj;a3#2b64%OLfsfrle~Hf74di-z z*B>|);MI8zyWIl8Ut;z{M?9gEPMer2|8@Qvd>P{QI3kJP|2C1#!z_T_2ieRvW8MGT-wYv89Lgv6)-3c~|R7v4`7pKMu$ zP}F_hgYmkVO(tRI3^YIN#LRzsm3cWLJZx^w(v!3rpUk^=wPNG1A5a<1q%!&09*r#A zx`uWU^Z9@fh$%VI9g#ZL< z-5$o|gZ5KpE_^c{0>J43jycjdrg=s8P^IHNe|oWDyIniQkD$e9xGm@sftVDVSI$-Y z^%2Jwyeo@)nB&V6PBpU&5Zu?5U6Wq=tu#=E7xM**pp2|+xawd$Ko#}j$x0&&$%ZowC0ChJApJYl6Tc64THR*C4GYWT!E?3&9+@;oFBW*iP!vi z^($h!K7h!04c?s=*U}x?*TtE3g_%;gbiOy;drPxim4K;br7!=e_plBVeM}?!)gaT{ zY;MP(%FMLSDnp-d-!I{n;OpRs9hAhXYBlsBpYw@dfb!%e=tJp4f1TB<(YxDImnNcK zmtM)Y28?IPa0Ap1Og=3aO(yOkJm(BvJxW&mMDGG^iCyW^cMGWO?UeL4E*)-lbpBFS zPqT?e*GVSsq3hfjcv2#pGS(*4r!C$zW|G6lWT-|UOqlzNud3hvvgP27@Q(0*>$f5! zx%fPEWKnZ$NkSd+I!LQfW;dQ0Y*dAc@7UojNL0`2yX|Tg%+~$6+SSK;IbD`t$7Zxv zY)Az_)t#dy(@*{{6xqcO5h=BjGLO^%099mugG%~8P_5B)@^u+w2Y*q_y+HonMg+1i z{Lhre*s=uVzx>59GgiPnxe~h!?%tTX-%KJG`3?;m&JV4=IDN`GS}SVwv7Ww6y0sN} zU*$#%>hqxVkkQ;ZnCcQ(saR6@cepPx#;LjhOsb|#rcG7D6A{Q^4v*FRs2(~pt1-^; z|AO!cxApn=t*YuHR@j@quUQ#nsT_LmwF~h3gY)z9D)#82lV0x=@Q!+tULp1W`0e(S z)lrLXy3bAUZU>vHg!tP7mFIgpvvb=n4z!g~^ts}N{yK*wS6#jy#wN60GfpXY`)dEo z9?oM2xPaLhd^1eoM1p~4EAHCtN*HtoJnN0?sGgDb3_d=`quB)J=Xw@9P%oN2x2{jA zlgil0GJip`BmHny>q2=9E+EneCN%;)rRgp_y!aTfA|uK#K*|dfdl9t;f&6=;!*4TY zFnz2+NB{?26e>3ybI~8Y{H>uUrxWoq?+%ZKWZJrY_HzqN9WFndpT{#eal=M>8w%*g zaT{Za;p2bq#z`A6S}}%HXA?Zs#MfBK3`<_%9M2wGs;nLN=#rqF>U?+e2L*5t4;NxXkyarwQZR^HRM lum|lCI>9=?O~-#8cCz*_WkTW#T)vd)zEHnJ1pepe{{t(PyUPFo literal 0 HcmV?d00001 diff --git a/mnist_vae_cnn/samples_prior/allSamples.jpg b/mnist_vae_cnn/samples_prior/allSamples.jpg new file mode 100644 index 0000000000000000000000000000000000000000..77d7f1e6434542cc763d2690b73031fbcfe0cb3d GIT binary patch literal 3069 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 F{~yvRwMPH| literal 0 HcmV?d00001 diff --git a/mnist_vae_cnn/vae_generate.cpp b/mnist_vae_cnn/vae_generate.cpp new file mode 100644 index 00000000..576e0285 --- /dev/null +++ b/mnist_vae_cnn/vae_generate.cpp @@ -0,0 +1,185 @@ +/** + * @file vae_generate.cpp + * @author Atharva Khandait + * + * Generate MNIST using trained VAE model. + * + * mlpack is free software; you may redistribute it and/or modify it under the + * terms of the 3-clause BSD license. You should have received a copy of the + * 3-clause BSD license along with mlpack. If not, see + * http://www.opensource.org/licenses/BSD-3-Clause for more information. + */ +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include "vae_utils.hpp" + +using namespace mlpack; +using namespace mlpack::ann; + +// Convenience typedef +typedef FFN >, + HeInitialization> ReconModel; + +int main() +{ + // Whether to load training data. + constexpr bool loadData = true; + // The number of samples to generate. + constexpr size_t nofSamples = 20; + // Whether modelled on binary data. + constexpr bool isBinary = false; + // the latent size of the VAE model. + constexpr size_t latentSize = 20; + + arma::mat fullData, train, validation; + + if (loadData) + { + data::Load("../data/mnist_train.csv", fullData, true, false); + // Get rid of the header + fullData = + fullData.submat(0, 1, fullData.n_rows - 1, fullData.n_cols -1); + fullData /= 255.0; + // Get rid of the labels + fullData = + fullData.submat(1, 0, fullData.n_rows - 1, fullData.n_cols - 1); + + if (isBinary) + { + fullData = arma::conv_to::from(arma::randu + (fullData.n_rows, fullData.n_cols) <= fullData); + } + else + fullData = (fullData - 0.5) * 2; + + data::Split(fullData, validation, train, 0.8); + } + + arma::arma_rng::set_seed_random(); + + // It doesn't matter what type of network we initialize, as we only need to + // forward pass throught it and not initialize weights or take loss. + FFN<> vaeModel; + + // Load the trained model. + if (isBinary) + { + data::Load("./saved_models/vaeBinaryMS.xml", "vaeBinaryMS", vaeModel); + vaeModel.Add >(); + } + else + { + data::Load("./saved_models/vaeCNN.bin", "vaeMS", vaeModel); + } + + arma::mat gaussianSamples, outputDists, samples; + + /* + * Sampling from the prior. + */ + gaussianSamples = arma::randn(latentSize, nofSamples); + + // Forward pass only through the decoder(and Sigmod layer in case of binary). + vaeModel.Forward(gaussianSamples, + outputDists, + 3 /* Index of the decoder */, + 3 + (size_t)isBinary /* Index of the last layer */); + + GetSample(outputDists, samples, isBinary); + // Save the prior samples as csv. + data::Save("./samples_csv_files/samples_prior.csv", samples, false, false); + + /* + * Sampling from the prior by varying all latent variables. + */ + arma::mat gaussianVaried; + + for (size_t i = 0; i < latentSize; i++) + { + gaussianSamples = arma::randn(latentSize, 1); + gaussianVaried = arma::zeros(latentSize, nofSamples); + gaussianVaried.each_col() = gaussianSamples; + + for (size_t j = 0; j < nofSamples; j++) + { + gaussianVaried.col(j)(i) = -1.5 + j * (3.0 / nofSamples); + } + + // Forward pass only through the decoder + // (and Sigmod layer in case of binary). + vaeModel.Forward(gaussianVaried, + outputDists, + 3 /* Index of the decoder */, + 3 + (size_t)isBinary /* Index of the last layer */); + + GetSample(outputDists, samples, isBinary); + // Save the prior samples as csv. + data::Save( + "./samples_csv_files/samples_prior_latent" + std::to_string(i) + ".csv", + samples, + false, + false); + } + + /* + * Sampling from the prior by varying two latent variables in 2d. + */ + size_t latent1 = 3; // Latent variable to be varied vertically. + size_t latent2 = 4; // Latent variable to be varied horizontally. + + for (size_t i = 0; i < nofSamples; i++) + { + gaussianVaried = arma::zeros(latentSize, nofSamples); + + for (size_t j = 0; j < nofSamples; j++) + { + // Set the vertical variable to a constant value for the outer loop. + gaussianVaried.col(j)(latent1) = 1.5 - i * (3.0 / nofSamples); + // Vary the horizontal variable from -1.5 to 1.5. + gaussianVaried.col(j)(latent2) = -1.5 + j * (3.0 / nofSamples); + } + + // Forward pass only through the decoder + // (and Sigmod layer in case of binary). + vaeModel.Forward(gaussianVaried, + outputDists, + 3 /* Index of the decoder */, + 3 + (size_t)isBinary /* Index of the last layer */); + + GetSample(outputDists, samples, isBinary); + // Save the prior samples as csv. + data::Save("./samples_csv_files/samples_prior_latent_2d" + std::to_string(i) + + ".csv", samples, false, false); + } + + /* + * Sampling from the posterior. + */ + if (loadData) + { + // Forward pass through the entire network given an input datapoint. + vaeModel.Forward(validation.cols(0, 19), + outputDists, + 1 /* Index of the encoder */, + 3 + (size_t)isBinary /* Index of the last layer */); + + GetSample(outputDists, samples, isBinary); + // Save the posterior samples as csv. + data::Save( + "./samples_csv_files/samples_posterior.csv", + samples, + false, + false); + } +} diff --git a/mnist_vae_cnn/vae_utils.hpp b/mnist_vae_cnn/vae_utils.hpp index 644ea3f5..6438402a 100644 --- a/mnist_vae_cnn/vae_utils.hpp +++ b/mnist_vae_cnn/vae_utils.hpp @@ -21,7 +21,7 @@ using namespace mlpack::ann; // Calculates mean loss over batches. template, HeInitialization>, typename DataType = arma::mat> -double MeanTestLoss(NetworkType model, DataType testSet, size_t batchSize) +double MeanTestLoss(NetworkType& model, DataType& testSet, size_t batchSize) { double loss = 0; size_t nofPoints = testSet.n_cols; @@ -49,7 +49,7 @@ double MeanTestLoss(NetworkType model, DataType testSet, size_t batchSize) // Sample from the output distribution and post-process the outputs(because // we pre-processed it before passing it to the model). template -void GetSample(DataType input, DataType& samples, bool isBinary) +void GetSample(DataType &input, DataType& samples, bool isBinary) { if (isBinary) { From 2582849100c462594dc2fb3df30824001568f352 Mon Sep 17 00:00:00 2001 From: Shah Anwaar Khalid Date: Wed, 16 Jun 2021 10:39:35 +0530 Subject: [PATCH 2/8] apply suggested change Co-authored-by: Marcus Edel --- mnist_vae_cnn/mnist_vae_cnn.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mnist_vae_cnn/mnist_vae_cnn.cpp b/mnist_vae_cnn/mnist_vae_cnn.cpp index 51b4c7fd..0ceea063 100644 --- a/mnist_vae_cnn/mnist_vae_cnn.cpp +++ b/mnist_vae_cnn/mnist_vae_cnn.cpp @@ -91,7 +91,7 @@ int main() arma::mat train_test, dump; data::Split(train, dump, train_test, 0.045); - // No of iterations of the optimizer + // No of iterations of the optimizer. int iterPerCycle = (epochs * train.n_cols); /** From 8aa85e56b796b650d1cdddcdd876cc5957931bbb Mon Sep 17 00:00:00 2001 From: Shah Anwaar Khalid Date: Wed, 16 Jun 2021 10:39:50 +0530 Subject: [PATCH 3/8] apply suggested change Co-authored-by: Marcus Edel --- mnist_vae_cnn/mnist_vae_cnn.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/mnist_vae_cnn/mnist_vae_cnn.cpp b/mnist_vae_cnn/mnist_vae_cnn.cpp index 0ceea063..eb9dfcf0 100644 --- a/mnist_vae_cnn/mnist_vae_cnn.cpp +++ b/mnist_vae_cnn/mnist_vae_cnn.cpp @@ -212,7 +212,6 @@ int main() const clock_t begin_time = clock(); clock_t cycle_time = begin_time; - // Cycles for monitoring the progress. for (int i = 0; i < cycles; i++) From 088a84210973473322eca8fd947fed0e9fb4fc90 Mon Sep 17 00:00:00 2001 From: Shah Anwaar Khalid Date: Wed, 16 Jun 2021 10:41:09 +0530 Subject: [PATCH 4/8] apply suggested change Co-authored-by: Marcus Edel --- mnist_vae_cnn/vae_generate.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mnist_vae_cnn/vae_generate.cpp b/mnist_vae_cnn/vae_generate.cpp index 576e0285..c8b1316b 100644 --- a/mnist_vae_cnn/vae_generate.cpp +++ b/mnist_vae_cnn/vae_generate.cpp @@ -47,7 +47,7 @@ int main() if (loadData) { data::Load("../data/mnist_train.csv", fullData, true, false); - // Get rid of the header + // Get rid of the header. fullData = fullData.submat(0, 1, fullData.n_rows - 1, fullData.n_cols -1); fullData /= 255.0; From 9006ed9a2abb931b2caf6549f8b3a7210da1e428 Mon Sep 17 00:00:00 2001 From: Shah Anwaar Khalid Date: Wed, 16 Jun 2021 10:41:19 +0530 Subject: [PATCH 5/8] apply suggested change Co-authored-by: Marcus Edel --- mnist_vae_cnn/vae_generate.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mnist_vae_cnn/vae_generate.cpp b/mnist_vae_cnn/vae_generate.cpp index c8b1316b..14d6d461 100644 --- a/mnist_vae_cnn/vae_generate.cpp +++ b/mnist_vae_cnn/vae_generate.cpp @@ -51,7 +51,7 @@ int main() fullData = fullData.submat(0, 1, fullData.n_rows - 1, fullData.n_cols -1); fullData /= 255.0; - // Get rid of the labels + // Get rid of the labels. fullData = fullData.submat(1, 0, fullData.n_rows - 1, fullData.n_cols - 1); From 36f6f813f075ff44116c633215988360820d925a Mon Sep 17 00:00:00 2001 From: Anwaar Date: Wed, 16 Jun 2021 10:46:37 +0530 Subject: [PATCH 6/8] convert to camel casing --- mnist_vae_cnn/mnist_vae_cnn.cpp | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/mnist_vae_cnn/mnist_vae_cnn.cpp b/mnist_vae_cnn/mnist_vae_cnn.cpp index eb9dfcf0..863fe680 100644 --- a/mnist_vae_cnn/mnist_vae_cnn.cpp +++ b/mnist_vae_cnn/mnist_vae_cnn.cpp @@ -88,8 +88,8 @@ int main() data::Split(fullData, validation, train, trainRatio); // Loss is calculated on train_test data after each cycle. - arma::mat train_test, dump; - data::Split(train, dump, train_test, 0.045); + arma::mat trainTest, dump; + data::Split(train, dump, trainTest, 0.045); // No of iterations of the optimizer. int iterPerCycle = (epochs * train.n_cols); @@ -210,8 +210,8 @@ int main() 1e-8, // Tolerance. true); - const clock_t begin_time = clock(); - clock_t cycle_time = begin_time; + const clock_t beginTime = clock(); + clock_t cycleTime = beginTime; // Cycles for monitoring the progress. for (int i = 0; i < cycles; i++) @@ -219,22 +219,22 @@ int main() // Train neural network. If this is the first iteration, weights are // random, using current values as starting point otherwise. vaeModel.Train(train, - train, - optimizer, - ens::PrintLoss(), - ens::ProgressBar()); + train, + optimizer, + ens::PrintLoss(), + ens::ProgressBar()); // Don't reset optimizer's parameters between cycles. optimizer.ResetPolicy() = false; std::cout << "Loss after cycle " << i << " -> " << MeanTestLoss(vaeModel, train_test, batchSize) << std::endl; - std::cout << "Time taken for cycle -> " << float(clock() - cycle_time) / + std::cout << "Time taken for cycle -> " << float(clock() - cycleTime) / CLOCKS_PER_SEC << " seconds" << std::endl; - cycle_time = clock(); + cycleTime = clock(); } - std::cout << "Time taken to train -> " << float(clock() - begin_time) / + std::cout << "Time taken to train -> " << float(clock() - beginTime) / CLOCKS_PER_SEC << " seconds" << std::endl; // Save the model if specified. From cf9a695b0b56398e3a68140e7a6d1823ad480de0 Mon Sep 17 00:00:00 2001 From: Anwaar Date: Wed, 16 Jun 2021 10:53:08 +0530 Subject: [PATCH 7/8] Added report callback & minor bug fix --- mnist_vae_cnn/mnist_vae_cnn.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/mnist_vae_cnn/mnist_vae_cnn.cpp b/mnist_vae_cnn/mnist_vae_cnn.cpp index 863fe680..f95adabd 100644 --- a/mnist_vae_cnn/mnist_vae_cnn.cpp +++ b/mnist_vae_cnn/mnist_vae_cnn.cpp @@ -222,13 +222,14 @@ int main() train, optimizer, ens::PrintLoss(), - ens::ProgressBar()); + ens::ProgressBar(), + ens::Report()); // Don't reset optimizer's parameters between cycles. optimizer.ResetPolicy() = false; std::cout << "Loss after cycle " << i << " -> " << - MeanTestLoss(vaeModel, train_test, batchSize) << std::endl; + MeanTestLoss(vaeModel, trainTest, batchSize) << std::endl; std::cout << "Time taken for cycle -> " << float(clock() - cycleTime) / CLOCKS_PER_SEC << " seconds" << std::endl; cycleTime = clock(); From c8adf4506e58507c58a21538a5123188dcf07a5c Mon Sep 17 00:00:00 2001 From: Anwaar Date: Tue, 22 Jun 2021 13:37:47 +0530 Subject: [PATCH 8/8] cycleTime no longer needed after adding report callback --- mnist_vae_cnn/mnist_vae_cnn.cpp | 5 ----- 1 file changed, 5 deletions(-) diff --git a/mnist_vae_cnn/mnist_vae_cnn.cpp b/mnist_vae_cnn/mnist_vae_cnn.cpp index f95adabd..206451d6 100644 --- a/mnist_vae_cnn/mnist_vae_cnn.cpp +++ b/mnist_vae_cnn/mnist_vae_cnn.cpp @@ -211,8 +211,6 @@ int main() true); const clock_t beginTime = clock(); - clock_t cycleTime = beginTime; - // Cycles for monitoring the progress. for (int i = 0; i < cycles; i++) { @@ -230,9 +228,6 @@ int main() std::cout << "Loss after cycle " << i << " -> " << MeanTestLoss(vaeModel, trainTest, batchSize) << std::endl; - std::cout << "Time taken for cycle -> " << float(clock() - cycleTime) / - CLOCKS_PER_SEC << " seconds" << std::endl; - cycleTime = clock(); } std::cout << "Time taken to train -> " << float(clock() - beginTime) /