From d8365d6285035c9c9b23d0385ccde3c50e80f2c1 Mon Sep 17 00:00:00 2001 From: Mahdi Dibaiee Date: Tue, 26 Feb 2019 11:50:31 +0330 Subject: [PATCH] feat(models): train models and evaluate them --- .gitignore | 1 + checkpoints/a.hdf5 | Bin 0 -> 14416 bytes checkpoints/b.hdf5 | Bin 0 -> 60288 bytes nn.py | 60 -------------------- train.py | 134 +++++++++++++++++++++++++++++++++++++++++++++ utils.py | 6 +- 6 files changed, 138 insertions(+), 63 deletions(-) create mode 100644 checkpoints/a.hdf5 create mode 100644 checkpoints/b.hdf5 delete mode 100644 nn.py create mode 100644 train.py diff --git a/.gitignore b/.gitignore index 0361c94..e2327e5 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +checkpoints.* geodata *.p #### joe made this: http://goel.io/joe diff --git a/checkpoints/a.hdf5 b/checkpoints/a.hdf5 new file mode 100644 index 0000000000000000000000000000000000000000..f016d673004ee8d10bcd1606100e79e20a1d025c GIT binary patch literal 14416 zcmeHNO>7%Q6rOd`V$uXPg{tWf)G;8cD$QSAutMSl(GVk{Hl%=}rp4VPn|SGF-R!Q@ zCRIvq6miJ~=m~+iAS9&R;LzBrxP&T#fGU23RJ8}hg+s)l%>fB!cHXnuvD0nyLr^>; zd1q(l?VI<$dGGDaTfZAW`chTJo(jTBFi6VDcJ~%9e?#ex@*ZsC_!+oSpuPnW4=@1_$o zPhvkV1Gik1$8CWzv%X5w0sMk4zkYS#tY!}S@^Kv(_%JB)a#gu}I35Ejb4VYi!@m52 zOex^UUDO*77!OtyO2p*GbwIyf+UgFI1zr(9zmD(YgvDn8CbHVJ2rTEyfgCjMRC~4_@cQjUTk@VtBw%ZQDgI+!6|(&_>gm>FBBvt_y{E zJfi&fHRHMsCSt;jrQy)rMBZ4}%rVY|ZxM+o9O-?dp z=#)NFoYbt8EwC=o(Pah_TiS5iP%V%crgtYQI^yD?JL8F>qrj7{we7Bjlh?>)SunsP z5mEAA>(B*#`Dx>#arrC904((idM9^*GmtHvRocD?j3&M7LOwV{B%I(Sdx?$ zj3YCUw_E@@P_F4iUb?TK{c{8FFSRS?rA53d>6b4SniW#z=B4=;u6$ye<)s;>K6&W| zo|J28g!OM=nYfllhBB@QyU!Q=ev1pKkOS_Z65uO~`5Vmhi0v|(LuZuLq5ZD>goMbh zAldacOtA&NBLxDSAzrIUbtSp z`}tHCYI*G!r=w4DIvJ-q4yAS#<8%lBxB~Wrc%Z*x8~v5pAS+Q`-S<`8?=^zmB0tfN z@0)Rn5#sv}6f$f99h$=ZA+|fB)-RX7tndvVUYdXJ5U3yX|Jz z=xoo|<(W&T0@>(Wzg?|%c67{4RCFjU-?vXZUmgp*QJ?v9Xg;&|^LH{IUfP%ar0nkO z!R9-$FFSj(-_Bpj{CJ};`|D5d#}?+kh~56~TIC9TlEq@mz`Z%FmMvaGvy@a|_Rt z7d8?OdbTY7Kdx@~j84cjNauIHoQZHk+;?uMQgZVD90BosiB`WP8-DR+ z=?JHn@nyYN?ElGMj4vS&vlr|KrC#s+)nXH$3G-K?9itqw_97tWuR5Odj*Bhy^INbF g5ywll?YDo$_X^f4f1i-2ImWmWyjA!<+1UN-KWbmm8vpg%FCO2&tsdqFpL+&vMgV zDkVuNE!wmwN_+oXIOjQi&v~8a`906?cYeSB`F>t6_w|{XYp%KGnz?3q&wQ+Nb{wrB zr!6Pe@yN=G^$=73_1gXOv+Idz?u_XUcc=Syy@+?wq%OKoqVq*uOj@iXO|vUrxl6vD zWM_nCSH?*mPEKMX&TjeLv@6?R1jzm+;?I|VCkr?`@!dP>>)lo9?*4S4tDkk-A~bw< zV2IC>z~H$-QIVp^?tY278UBk@rK`XG-mm4woJGFUAzx8UT})PNeqe-Oq|f5Oh{)jZ zFj2ggsNfDy>iFx_p|j_9>+>tr)tNiuXO&#qJKLcbjav<#6?UUdUv-&w_ksf{*^3N*Ga_w znO{5i>tyVf)0OQ{@^4~+-~C#ztKNBC{ixdvvjf8-14V&f)W@oeT6g)DnAnJJ#{VSk z_G{k`Cl)<1UFFG(xp(=Yyr_q3iiP+s3ykmy^9v2^7)`{))I^Upd)E|*rJe-A$nF;Ger!uqn7=O zG!RwFFKVcDhnz)W!BHJr*xHB!egRRzi~XWRe zuQmE5@(&3en*461f7;kSRvi`mJI(!vivEYzw6Y%YXLJ6cq5rRF&R<^lUv17mI%j0~ zoTyO0rGNV8;{QqioVjY%ueq^f#Q#V0K*#d28?j1?2h?%DnJC;ig`e_G&A z3;bz;KP~X51^%?apBDI6Sip0Fo1^$IG_SMt5nXslHxA(Y8$R-{(DDC;GXILZ{`c|V z&NcMk$6fy!p4y_{X|3+{_x}sF`%}mNISc%br*`+EmcD;m#xJN$6xHqL&VQTyUk-JS zBa(mF_g(J*Nkvb${G(lX<@GK-y7fx4{9C@#u5eukXexTT&jm&d?+ka#%Xa7tmpXOQ z|G)fp0P*VH(uLKf3>$oCn#rU*%|7< z;q1EX-FZ^=M=N%p-*z{oxR}W=CUJ?*mgv=$1$EKi!;+#F?BG<<)9u0z^u#n|#WbS3 z_@zX(=}4E5=oHw2xpzF0;xR_QUc|(@Mg9t^cJ;81Jbv$@X8aKW@5=SRiFC}B9c6d- z%kK8_*6l2CseUK@XXEq;!%n_G$LUTx{JZ`BK2Ga(86dl>|8(1<+he=K-9FpV2Roks z>bckN>pjb^e%meY_kP@2%Adc#TcFd95`P&7Vk~~=_}g%|pX=%TZT!D|Xll8=^^mo2 ze6%i`_hvM|;L;|9BQ^>z7^q{J>^-Pa{G#B~gEF+~>0vf0F9F5)rz7{cCZ0jO9>>bX z*j?i#P_k(QlzHOlF#3+4Y?=hctup8szj{tL z`6E>yIe`CDT!X(MuMg|p6od++_9L@HN@%=yJdZAkCu`(`nbmex;IL>1Y8ZBm+Hix> z=DwTAioG`Ej-D}_pf?&lo)QIjCAkQXR)iwGtYTinBq7pL?nPCt@1c|TTDbxTH`XvW zlUuS?yTZ$877Up$D_m`H10uDlz;gE#`UFZbvEeB^x_AK^e`-Fo9F>47#HI-swLX9` zr`qjro)-#TC(k1X3uaTn@qXyg_mRK3kG$aHblsHZupKU`X0&Un1PJ*y|m&=VLliJ}Z61Ku z+~XtvF+S+?h<+4dWjyHhVyd06kv6*|K-EJ%VEy=XCO4*#q~2P`YYQx*y?3u;Gmq!c zRT~$Q$j5u(nMV=yN?tOl$y`AP_a@wMUK*TW+aDf`m4S19p2aS3C3Ve}A>zw#iSjrz z$31JIyt6V?x)o0BdW}W-U?}pC;HcKtPxR)@Od#9dn=&OU-r{08F6Nyb?^fSMNU=ti zz38)s+|x~iy?k%LMXSBwGbuZ&x_=F)?UF>Z((~aw&kzWd)#0LnTj*}rJiw`ilR?K{ z(RGy`#4XDcRcWq+nsfS~;acB7m3B0_?%)R1pR~e)@)CMA%YnA6UO>bozuWCH{YHb1 zIk2piBhc_M`?2pSUApQ(4Y}O53EmuAMU`|GQBEcpUNuM~CX4(a*!voqzER|CQ)`IC za6M)|RSLe5Nfbl}r$cpzwRpMp0f-i!joluLlXW_tAdW@4P3na-5hK%YkX(6Dd0cv1XT)c08(_i5~U8uKj$IS=YdfAni0 z^u>B|>i#G=>bM6N?j6S+Qd>qH&s+h?;M;2ySx18nCqZrhcrv2nQ(_)6h|xo3`sKNHnn9#=}p1p759=9UP^;K zTraaVmXn}FODxfHOyWmPd1^x2+*sip5Z`=n~MfJc3k%Q<0O43^{py6Et<0#QDB2hG!;i z;yo)?WJ5DX(w@Sx^hTetghws8pM%oi%dO?uIJK1NHNWTWD=Gn>o~(un4>0t6z^P5^r)RHXF4ETcW!GrD$uy8(8L=O2yUI z6Uo^-xwHi*d54eAW^LmRL&>2lg~8W_)WXkz9N`Z~^Bzuum*<_Kht9l2yGzyxb^T2c z*S3hWc8o#s=@hfXWi)Q8S%vS-SJ-pCam7*L9EQ?lppOI()_hk&(T}wF$CEW-wm~U$ z4DQ7>Y^$MN!LK3p8^}FCO}K|rgQbu4nm9lrNC$ZaeC3~GS<;D zM02a-QTTT)__WG`dvSK6@LS-0q%wI8zPo8K)ZI}*oPW+>+sIFN?}G7oxV;l!qgHvXU(OzIv&Vv%Zy;Fc2j zWTZVg^|FeL2+Vi_ZEoko(BdMnzrPz7HeeBaEZZ9i21&5R8BWx5>37c8Z3!tq{hIcR zFklNJqmij!0@1h?Mk^l^T&kE4zrX3hBJY@y%kN#dw5(%->9?oD5$U@*-xVJC)-e@m zeand58MzEzv^mMm&Qyb+TJ^ceY2%=?%^)u9xj21u%?H|rpJ1ok+<^V6USyF=EjXck zfo#?6N#4GWp(`f6qt313(7n>1%)c`Lwp^NoqZ;NC=Xc38$mu$0<;@VjUS`57nis+R zDdXWO&%xY}fXT??>MkxRwg+6`$Kxj38nTAOVz|;PisXce+CQ!V+~k!*i3tK)->i>~ z+*)Xu;SLb=V-)o2qr^1}kI*%%OJKWhPg3h>&Dogbun@W1+zPv4(EP0q2UVq5(jx`x zoEF2)I(?ajE|-E-6XOJ)J(;l&b1RKELG*GD{`qw#%FG(bCg0!7RyW!cKXFqys|gXG zFkR?-%AKgcQ)l`i>)4Ly^W4On?KFP*Hk|W8TDY;?lPTZjv(FXx=re&gyX}<2d`(A@ z1?MiYm_}#8*WeQ5yi^;>AAE!x^_AfZuO3W&xfS}*!o$wD6&C z4IEi(hWgx|1icp+f}dyiEel7YKjJH$$U--cgSs{d-SoeKr*t7`zu=3%Y&-slr!4(T+P~uEAKhPcAKIx+ zT9;D)3}5*KI~lw8UH^)@{8{F|&H}&VE6QD}eCooLyEXfTgo^GHcjF(<-3kATv>Oln z9moF9;I|z*cKdxdZre?}^!!@{*T>4D8xQ(l#cxqpJ!87)@8SQ(cr)fV(Z7O!9B+cU z*#6Iue}vy^4(lvGrfb~zXX6Xvck=%^zWkqQxBuHp`A74V<>*dLyXUF@jNVNLu7Sn(A#`ntsOUj>&B3533OAK%QN?UEbfc>0NO`G$g(B3U( z&~1}C)Gstb9r-rAKKCo1oJkD( zZCZi$J!*yDz6LVcsujQZ)qf5lafa1`NwS;hLn7LL?3#?^Vh6*_LHU9mt25Au8S6>Z z;J5Vro*1;|Yb@(1S8OGq36}`OnN4hz!$r2BH{cj2fu%%P(v{D%P;SqI@ayBSU%W$m z-DMKXPXWm{pI~x|9bP4$$F@#=NUU{_<8Mm^?ArNd!WS+PbdTv(A)P2C5Txefm;J5q z;M57sr9rf)0ahr5h$tUz*ZhiWLXELk%UlOFmef>5;UQ96i`c{!2H_aHk_RL^zyG>b;vMsUkOJ}g5k^Y!l%NDzCVcgCSaLnOQ z>Q;Lbj@^=rPst>)yQ7A(p;`UW+sipDIOzyAxY^8B-(QHuZ|e(R`p5~TqjJ&qp(pUm z>35)-B4fcG?J!~DL;A@$kX;Gs2NP#ZU^~_};obgyiADe3LdzQyh4!OL>1U5Ac&y@g zrn*547wvtF1{CJf)|(PS$1G`K`@AYN@VgTieRLDmwmwb|y}iLMR!b18c}grtW-S-; zb|D^+bc$=TvJiUI$iXQW8mQo19h=NkVgjuN%;(8HC^lS-Or3ok&a%GCp4zJjUk9A# zs@L{}$EHt5r&B&Nv&aN?v-F6-`Kc?~yL%|oJ$00A&_0f(sv?9+=VQ^jPx1JkPZG0x z=Spgh_UG?y3ZzA2zTmaF{b{~pGcD7~W*-Jz#vY>mEPwMcmYOdq^z{m4r#3p`*|N)6 zL+Ebo(Z7xwa87KeL<2hFFGnT4#Npnls@%3}6P6Iw#$5PJ=#XB_5_8tG8y>6Jx5E4M zMXdrWIebw#-flc|X;EjlHp&RcE=yoHJ_rBmLmgf2&*x7I{AqzdE%5)U1%BVB=yg>j z@7E0e*INDWJ_l~G=`5>zAN2cr_^+D$`Su?z@cTJ%(y0HK`p5U~{X%0Gp7BSHf6thI zhJ(d)nWdZlH}<97S0=i**1shGabNnc#limB{`2UiPJ?v!r!MpSN&ZbN@cX>cjc?Wc zb|116H~Q;$^3MNF`*h=5zu&+7pTW1Rf5W$|{}cGu-@lKScA>MP&%5^HzuQZ%%MP;L zC{IoE7A}QY991O}KMPWx!;}av-+a zk#{&H8YgX6!%dU!;yF#tAjRt|HVRM&2haP1-a-AjXRU*{#&0?0GrlU}qFyOLwlo?H z+20F`8CsCW4fW-QJ4JUX>}$(ov}5f{U4QTjB?fbOX>s6Zx)@hkU`;Mmo)uJ&&?Pl8 zgYg^pe1J@A%k}!L;d!U`@`@`!jP{9z{!yIBKhRGdFr z{LYE)9;eKVm%n1GMw_!Afs@!t=Uq4`G#xRNOR1V8c|NHYKK$BOC}AwkjBMpOqg$BN zN${vpLx|724Hp(Rl)&jOeNkQbM>KKQVzl={7z*lJ$vu7KN6zL8sYF67o2apr?Yg** zy&5z@==N&6&^%%T_FDg%czKON3qNOq2w!6&m%We7STLKG=e0wqEI_F}%wdDSDm*z_ zmhE1YPlonf%$pIK3s>*4LK*vOV2DN%xtqG3t<90;jwhwS-TThN)+}Ep$h1J zO9R->&w|mT4+GO}7iio{h{k`kXS~HJ)QcXWRfh($MPJ7XkA)6KBU;SJR}~x1VU-5F zWx5O{4W3B`uf4%-JgUf^oQwujzsu|EW^DFtMJTP%&KAYjhAT$JC|8*Z|?ht{vV zfY;7`31thc5i*#{hCEM$=VCX(xRXY#He?^Z@_Yj!KFKsg{61GTrHHJ6MNms&AM#4u z#f>~LjKn#egeKnCAn(g467GEjZtpUYO6iVZGdp=S9@r6o_*o}Et zuF<%%Txwmi0xC0g{(|Z4+!7}pYTQ&yXQ$h9pUlJ1F13Sr(c0(Sn5ToOY1VH1eoi2l zGUYQp{wRiirpcg>+CE}CK>|k|+K!zQ2^@7dgN{BAxl<;JX#ZndQg)0F+tUU^XBA(9 z&h?--FFMhjOKosTh%S>#&ZcP#WZ0W)L4tEl(KIwck_MmI%6%N<2QsgorLisJ;V#V{ zTR^b5d9^K~k z3Wi%gR)NSh+u6~*Tj3HtdAz8~Q0VFrNA<*}p_!{^ zp^uYpGNY5aw2xac%vK#jB3(JOFRPI`e(opKQg#rg?Y+g6jIRmnIBjAZS%(sR8{iOG zMYN;(A>Ok;n-$M4rw=4Yv8{Wb!B>&@1d06<*zkQXn0s3d?h`eDY?=@woISNa<=pOL z)6*{nvlmX~Kfj!TePmqh9TtZPHwdO8-{Ws->$NW+*Lp82&(46WFBMUN+h(fk@PYR@ z<|>($U`*3bKE)HH4pQwqx z{mEqOJ#^}RPQV_v)3~k4U>EL1O4hhn2>evou7rIwc!LYU8Mf&CatZ!IeMywG=oS4i zt%yE-8wgju&IC_N?ojiia?oIB9}1&0*pHk5Y+ob6)@eAPX6A%v&0NWU^3s~C@_3BB z9fWjY{~@qYa}fJ*y%+yvbR*Co)fZghyO9$D4PnjV?Ko}!SR^xI8sE}wq)_gQKEE0$ z^6TaHa2Moq*xl*;W^a&X-T*TUhPkr<)z*&%AV=mE^>8XznJq z?a}k{%8%A$*z{Y%+os>p<)UPGPh9~#Qy<2^ARi9y3@fEKq*Ca-z!H`o{*y00GzjfE zwi7AbO+^_GllZHIJ^0NADx~!0b#|I}9$gGDBu%?+vx%?bgbz|Y*!a&r{BI2z!lCCS z*`rtb6)H7Hg)-;Wh;lz&gd3cM+hk@{Bt;st)C@gl{YjmIC#TtKz0Ihkbt)cTIu@Nd z-yfZmT*oRaOo3qLY%X%_BQ#Y^hPVimn5ww4U{X>s-Q$IYw}N=&oSYsT_WU?o;o1v5 zbCMU`G4(~dk!fs&(g>m4H%DR8<6+Ee^gA}+W*)YlkVs;t+@+pdhw`u3KW58po0(@x z1AH4jm%V7NDbIa61v!7&4UaiX+M6CJhyAptB9~Yl^sxRWyYqe@K9DTBN3@|950Fh1 zw!f4nV+Yx=y{7x=lI;0hZD^$EzSn+IeZiWpJbIhWeJRe2i&dE7=)r_ckzoCEw!pq` zEpR}fGn_C|6HV7RjrG1K@mB5iW;+_p(L!Dp87w%CoAY@rviTNA1|C5V3$4*BzxVKb z9bl)d%gPoQrP4b_eELZavQtv~*qgzjWa7IF)MBPZe7pnE@<)#7Vev&arDP{=u_#A5 z1ruqH33>3ukF~`1%452EUtoZx6%MDa}^`|H)FaybOg=O&!WP?b8+CBN8I3$MAl{%i|u{I_+M8lgI%S2 zsI{9Gn!9cg2+}o1J+rnjxmh(Zp`lFR?O;O&xnZO~Of1mntk9TdcOZOUf?rNu*3pm^_?6p9rJ|uC88RC%K5}g-LeMP z)eHqcOKxMm3=7^)(wkfFY)Lj8&A_Ecb9ifeD{+1WM&w823hZ2W6I-cX#6`0E@Y4Hb zcoOBnjAMGFQJyDQzv>YVH)WX3TZOGI$r5U&Na_UXyt8FTvF@w}9DA$`SY9~IL(}Vd zUwpTKv+ZSgkJMhEq$)>78CHOb)>lBGP>wsV6NlT-R6O}qHfBEo(6Z9zRL%`0ua78@ zgZ_Ll?wBN4-=IkLUNIptt9t_H_CX-8r_kP8I0?kuSZCjutO-8*Y{bjaC9w674T-NB zLQEGO0qcVjvF5Qd-WKHstm0CH4{Nl5fxTpjKx{G|SyqnST@1<6;M4eMv^!ot>@gl< z&=Y$(OOdiYZ^70js$89pF#*pNxl;{&x!p3=U`7&$txvrMOHU}`?bp`gylZv#gw_Bb z0|PGmg(=>wc^}-bo{9}*wu8~Bhrr3nkFnj_EO73*3K=|Do?Cx$6Mp2TMv7;i2BwBW zP>Sk!N!Q-tyJS%RuB; zW6mqN7un-8gvh8%ku7&>FiZNzv%J@fC@+u0%G$x$QcIl_r!IwVi^}j`+urQJ2^AXl z!UD`c)kiorw4E*i#i;JXKKAxU3x2n@P%y;Y4t!pcghs~?0hiADveN@E($c_tSSend zxgHsYHrj>Jm!1@eZ*Hfa57y9w_mlwFzCd*5dxKbx`3i(~8B`^G3{1-q(t9s>B*A#lzc(Q=pqxNA@>QLS2k>In&HvDt=VYqI7 zA2ca`gD|USE*SiNG1M>8XETdNkdQV*8WEAmTd-jd{4mg*RoqIzZePdJy#c$R*BGZV z-4DYBE;Emd#_x@^YTYFI;ns9mG9(W+Y3Ado2jfZg2_9=6^M$HUZX`9HL!d_P88}sZ z7&Ls=i`&~O$&FjG2ut7}_+8C)TyuIgxVG1XD;YBZN3PZ2EaTgF+qSB6s?i_8yoz)X zM$dw_{;F8%sVZkG--~!p-OVH8Qn56C1FZcogV9TGWA0KuxS*&3+$GEbq6h59daH1A zwif}xDhYDpj0Troq)NP%P76lZS_8x8eYi2igg3bH9WGjT73^2iS_ zd?9ch&y{zgPu*Gvb--BJ6W5&cc=w#WY^=NGmhYhHT%HJM>~M6_yW8;vKHu_ z+Aq*E@5?iIQ3)pKXc7~pGlGoZ=Qt}$onyft?5BAj!SR`5IPK9=(7ptV@QuXs;tv!I z5-O1SbNZ2%@lyn!z2b3IU<)oeXhNiX<+yM1lAz|+7GUpm4A%<}2yILj5U@Yyqs_C#2$+`J;-tYlz!&%Js5GMow`+MKyrSMtvzzwArqVcOd%=mB72bk+=XSCKO&P-Z z^2gB3x*x!93W0Z5=TfB@d7>=UANpy^3Ku_Ff|%+A+_26>sCn`#Ez1oc=|+XH0=Lqm zDLfQrK7qeL!H){g2B7)71hiEC4!(12CQ`ZOhP3Q0*gJBVIJR1#?@Q~!Sw}hS{bU{c z+1#5w{XCuZa+%B<`9zfsm%TyTXU`-WS55e1mMOt0*T!*8nYZEV`@MVRzeUSkaE ztMn32k*nkSEUAJKeL}&yg~M3%do6xl-_NYl{63squm!EsUBmVc`wDw~k>bzUIFM{H zN#85UYK6B#Hvk)0#oa|69y*sKMaY;j#ba%@~a^G8?c`<3Esw%#bRoxh9F zlqa_Q^(cx}*nD6=8}*5D!$7z#)E_-rSw??EHgiG871@LLo+x&}B9@svlB|>63ODC! zvQuZRfQ~7qhg4eNiv>g2i;oV%dDnow%L*xSrtFnqMlW6Xb%++Z5HTHXDlCV)u3&gL z{UXh~{)X;8bQKCBQqjl=BN~u6gSNzP#|4`lIXmy*BLR;#%9N$4qO|PIHM$LUi`4si z2{rdLro%=Qz*Xb|s4<#M4t+L7J*y)Y%aLgrq{P12TAMgt9kGw&PU#fC0-(OI} z&8q0=aup{2*qG!ssuTjjFVnN!uYN~tY6uX*Q%#)R~<*aWxp`{oqos`Dh%5obWQc7&%JCp-ms~3z>gthw$3y9?B{mYFT{&(zd3-lv25CI zcOMQW?l7cRsvRzhgO1j#srTt0nD*UH4BSu9dA-`{_mi%y-b#hE8GOa74=0tk*#DsJ zv8%v|k0+qPvJv!Wz85qTnDHjw9S4tGub{)te&Q3`C&E;-6YwB-51s^slAURq+$y`V zWN!5Z&SmRi7F(MD>)PaS%g+pYmK(|uIVappW(#~UDF~-KZRA?^Bys5`%JBN6WH>Qm z7CrKQ8W{Y#FVfzY20z8W!KG;f*dULC^gxp@9oe=Y@77VL_n+p%rAo#y?2ZL+UjBd- zTEC{GJQm&!lA(*w8?g<;Hj|VGdh`*J0cHliBtg)`E!|W=e3mGo*@j>6!<-vXeShxD+9tD`P6J(F*&!-nk-2* zq(Q;nbnD2Mbn+HODi^3j&*tugJN61Wxj6;!$whhWSi6@FZL*+?vkG8ZO%ZgMAWKY( z25_I3hg0nb8Ulv+4NPn^l7H}ULM#8@&<^i7R| zxed7T-Ig>Ot%gIIeL(-h9yB-6m8>J%VbJ4v;@N16T%aG!l+Yv+Vaw>PH~M7uRb%wS zq8BR_*P#Y!SE$+wf1EX|1nSTt7?jB;Clq?XmR@d%7zx0)v+^ip_fTpS-UIJlVU1!m z0PnoG5036xjAwpsBr)74JHh)eT+H0DRKCYuxP8EO_WXP?H)^Ofi@vr11zgJ#YE;f; zMQsAiFMA19-+zNXu6?lP32&I{`x$=K&4B(gpK;;2JIHIDIiu<2f|x=%ba!-bc;|=( z+7*47Hh&q(d>`(kyIiWN%=6yDQG1Lr>^&AG*Y)BUN9*j^(0%QZD8y(Dj$wa zcsoxl)WK*QUM}6b~uFnk@=o$~a|m z|JgM#U0}f}nCD^TvZ1*C!8b4|P=r6fI|A6cp}c87w}BC=2Lw&#NAX>`DxCEYV=sPx zE^UdAVDz^nV7FouxOb}+=Sk?2vB`>@d0++DK1Ou@Wze z@MwWbt|EbNh4`@14RCL^Io66b;~s0pVAC-=%w zdThis?Hf!o1McCfW-+cUHWpz0@Az=2De+xyK#FshVeiLIph?<@E4;46?Yr;}@5qwl zcAxUc&#lF<`=(fYwciZvi;DzRhm1KB*;(Ly%3g5FSC>1p(*sYfAIRmLS%JkqCEx?O z2yDJmuf!P<({Mx?oSidZmV`f7POXb1qA6M-Sb|yiwn%9CK z!h8sq=%Q910%!Jp2_AcIp%#%Q5XMeqg&t{4_KFD{En6N}~}kmOK4)wic^{C3KA26{v+K1HDQ8P*w1A)?d?w zg$>o92d>K^U#Fc^>e@nPkva}j8#VGOp@2!gv1UJR1qg@N>yv1yQkdDR6`Ooq&rQ+q zK|ZGF!0!$lgcHUbf%)USV8PZ^^u?8H=z_N~wA*%4u()(2y`SmB?eG{xQ1}p}dZC

KPjA$69f@B^Rp>ccFeMBhW}r;-Sjb#Qahb^22{lfeh} zEa`|E^Tev$mXC+v9;GazD7%X}f7K;ZR!*Vsk65w8(e0S&ePU1P40~1g z$Uf}SdwMa;2iZR`LYc+*Eq?jS+4OzpHX1Oh5Xg+mXG6+*kx2JS zFumY5s+|+UWQ09%o3=b(dubn*TM-L;mfpba>=3GuE`b65m4Z=KaqPK!46(JJiJqE$ zxmyvb_Hi0GSi%MV%P<_Zm@Fe07JxLFSk^$x?I zaX>iayAY>Xr{XfHIMh1VjH@_unAHr~i~Toh2xV)M1t7APF6&z-47V*7PKcG}ymIeA z>3(|ryTe=ItzKGaX2lmSdfrfQeeF;*&tyBTeQQg`7R0f%`QKP#gE@-{@no3_^J&$0 z9(`yN&wfsFfl(IJ{^wnc^7cic9g&#yS?K}KTBt(l$2x4T_7h>dpeKs|Ce96VSVIoI znaJ#R9i!KJmf^|owvz{K?o4>p6?;t(ps95}g4noR;KEAKImc;OU9W}?IBATe_6(w4 z>fS_YUJ6>b?g7Y|`h;sA9?W#Y2tBq-i6{>r!;@Q43f-uwaO$U-!uDvBqP26o*)k_bg?7To4-k#+ON8P0l=AWdJR}1hp!4bUAc|G1_S^{}K zYr(b$U+MK6S!(e!1ipQqh3?GQL!J*jPxSP7=q~1?80ls84?qteP! zy@ts-Re|+}D`~i78SHb0PcFQuEH^aFXOh!Q`8xOR3+$|yL!18DtXGpIwyAF8hH6gc zu;X6Z5_kxW)4KqJr;Maz=U^m1&XD9+da{KJGvI;z^$6`8iPj_}PzApQT&zqIUS_(U zYG#JP4R^m{o7dm%o}mJ)cQc0Vd}P4HrBs=pMj+dIV-#xMmJO!f6ay;5`*Avrx7q2r z6VNTsk!Yb$0`3{~l?1J8;SJ)(BHgeMe2wqJ3WL`QB@fSrg*H1y`-*HD+$)V8DKc!bc)F^!}#%)YtSKwDcZ=hF@5P##}u>b7duXuk<63QC=A>xw8?D;nm>12a=hq z?Qr_MM;f5X-l(-v3*?M@jFQjjv)We+NTq=#b=vWe4jtE%eYfmMf=(yFxas96IIx6! zfFIG~S+-0(?lrrpH;@GGctssfl~pV@Y=OcB#dOBYGqgw1EjnXsJX|Td`*ruyawK~p zl}X$CVl(M5=yukKT^l)wx#t(6slFyeS51>lPckJ-&g{dgNQz|S^g(hK*68VUONiiM zBAZx6NAJic%dN+uzO6>gc33=uBhUY0;e#mHYINeyTv>q$4qO zAh5@=om|h78D;x@4dEhRZ!S(x9Ub&9;I@shLnEHvqh2lNi7XYzQw#jjL#t3$oaIjA z7rK$AN&$1S*Ma$CcH@Ns_gS#xCT3r~553!yj7KFpp%RBdRE0{iP?u0vS`xqt>gz~! zYXGZVo=AGWEXIM3smxqw4IBeiSg7x=^6)83SoCsxGW<*&OL?mb7X|}rReo5sHuXh# zwli659n754`_a)_F+jO8yFC6*1WdkDPtR&kA~r*{SkX##woA>I4qoC!6IQgr?03rW z61~pdkvv7GWG0ZsrKxOE>{WXDq8e+yl1;XYu%s=IuhWWEk7!uk4faf1pJ*3829?#~ zR9&qSzP5KH?A#8~osoF@@rF0v^64=<)aNz+T3^8$t3n}?7!K|P*fFUyl_YweJI9-O z507}anTEU0VETie(nPy-X6|ALg&DGN>(c~qa@z=)SihWR_lcoTFoQTvljW>UB+AigdW z3HuwtJV6RR?kU5yt{Fr=HKp>B&Wg^j%tiO_#%Ke*i^ByrqnmL>b1W$6ISmIK{)}Zc z)Buxp#Yaukz(H9RGLJn4Y0Zv;;_0$v(Qrdjb#W-!^3{SfOR2#%-+JSMHxRcUHRAHz z?%I=r19<7kf#h&mEl^p06dTCh1gNA&@Y+CwOjI6B*yTFG_Rw$~k!nOrod$tZXEnIh zk-drD=ZE%IYj)$q4zIw`i5Yll<`6u_K$H8Tco5`O6!P@a_t|eS@6Q>WAz&)^0;Ba> z;Lx5y+{foXLDF$8{IdNejv2VMY_SFfjn$*D?{t5G>o*FDMCX-mQ=Z|Ib_W5sycsB- zF9kc7>XV`;&v4t&W-QTm9G9-!08|uB$)FqhTtk%rXL$_a#J|>K-w%%j=VNYSxxjTG zcS8|~G8~UJBKni`{YFIN{uj8G9>jB99&(9BGlbi?IDAR$90S7_RfH;)Q;P|rI~(S% z;9{vV$T%S6xzPxA&+&#m3RY#WSIID&+hx!}W*aisy-c0^j7B#nMM0C#*Xh7dfh6Ej zU+$m_<{o&cqWSC6@%m6xnl+^!CcO1Sw)T5)&cvS7G+mA^THKR3tTka%hgz|#S$pZv z^agI~#2wVQ@*XwrnNA0ey&~wbQuOcEE^Z?7XqP=k*C{W>pFe~>NPS+6K9ow{+E_-eXpIF$F)`n;##^1v> zPtX?R?iB6Ysx!!!Ro}@hJ2SMxDh+6q_^=I+k3i*Od$jhu65cY}6zMJ=L$39%MVU98 z;FN5!%Eyb@Er(|; zsmK*98cYPsOv!>6Re@L!zI~BL1zvpYIap?+#+|S+eXKGpJKcAXGRo*j=}4{QN*(GX6`R)uqy zG{MsR7O-a9VD6ejJZ87H*tbb%0612RL#OodT?tceU%or`7S|+4u_2IitN`9iO+aa+ zCuqEuR<7AH2DpzNhT|WdzzRYG(l}p}d}^x{oLg`Pgx-9Nv+h`t1+C`f&1KR5cq@_O ztq4%(7W+KL3nHDc`$>v>f4AY>lkIuCGcxhCj54rV_bMnonjvskd4q2ck>V`N`B(3HajT7!)?8PohX21joE%r7nll@HY$&ybS5pMouX1n_U zwQRH_k&E95#!YU474mE0^ey7tw7BWax^5wwbZ-TBAQV!=LH$vd$x+m2mk)Y{UAeIS zlWB6y7{?oY~eV&s- zp^cVO8h+BEJy9f*nVG#Cq*CELp$30(X3xgU1KUuT|5)tIIY0#zhaHhn&b3m-%sdRxgC@#T!P#7LwIPrE^$1TLAR9; zfo;D|fNyRU=-2UfShuN~ks9ei=O3BUxmBTcC(o$XZvC7|L}S#5Hn>HcmR=+0((Iv% zgE&t5b{cEf-r}s@BLwP!zvSy8Q3J*4(|97i-R9S*8K z0ENMk@UXx~G;Z7p-&BOb*46)EnZg1OLY^b>fXrA)$Q*V7b_UZyVl zBdoQ2L{>dxu(Hw%ETkPm*5CKV_r^bf4L^s_^Ug|MhlDClP4y+K73VVs_cyTC`<61D zJLG_6ge%mnj3M9KE`nxHOLDfyiAtxZkO!m^e-!a!Ie)`}xQQ(rcS(}!y|)5Yl~SN8 zR22Jd7bkxkUb2i^G9H*2g^9fZ@ya5!p`m}f+sC7OK(%dA$ z!Lh@@le-W;f11KLCoaX;YxjY(il>>A*K3hoUK58K@|IP2^A?5l0#GmU1&rP%WbUvy zxfJh1BqD2YvvnM^OVS7D#9U*m7w$!w)ic4>b6I$swJqZou0aA^zOV-Z9)c^gc4BtT zFZRcb81UvGgsl$}$yYCbtUD)-8rCF}HxK5KPm4GpFf*2k$al zQ~Qtv?mmRKH&3!#1}jOaSta(Ex|(%4A`S-)O3>Q8^GwZxHr)G1;EjFQjeXsmNoTP% zIGv$Pt}j=?RjMNF%r9zem&;|OyjP#K_EB7Cl#GuT^eC zCKcZ~kTdDzu5HLhc`s!QSM5cPw=f{(~a%@{|n8E1k+O|kq!Jv_Tf z2(Pud&CL2Gg4KgPn7|`189nhvo=L9=j(9YN0z$fYQ@dr^9!@_RxY~;vZysXiB~QUJ zP0!FP#VJhi9Tn^*U%&& zz*!a{gG0}cbM_o8;XtDpq?1$23@ZXOxGR;>Z_s1q6y(@((@7@Qr3NkeAeam5qmX*r zNhap^1!Ti1W!6vsi2>Q3m6fH;7`Rnvso66tcWxg9pw$M-qz^@duN71Z|bD7DtBlTyMhmy6R!S)n@q6 zwbtg+~ zA%y$nsm_-|Cb3(NeN~glTD%s+fz1ZAr|T5m!C^?{)>+KtnrtS=bDR}@;`iN3sp+$!tg)K+n1#NU(5jg&Y^d&9952K2hMvx9#hfY(#LFd=g`qov^|QFyy1 z=#cUv8k*1H1-s)6ciL94>!Av+%-%=es@>rKDhvcEX;v)PQiaTsy@I2J4gu{zNie-k zpf!wS^R`diL!V9v0oy??uAcRoO&O^LqS|l3hUr=)(tA7hlRU)4<{7dx4$j9B>q?=P z&=7A?q7glnzJXlZRY0=buJZ!pJORhX}TFQG-b)8L`7AtXP3ioOteOx)%all23^ zkaJD}O5;hAbKyFCJ5QZ*B=*zCH}r5q(H5xw&XN8qNbl^^W}1*IIQ8zQn+r(VSMnE-M@&`>L*?uw9ej{u@VP`z(!GZDhc$9mA~6jb1X| zT8edU7DErW1Ngs0GurK}&Gokt<9@okP%y`Y()TwmQ0bB)FmQejx$yH&?d-nS6gID< zH&rG0MP5nFZt1nK++a2lQ8~*yDc}ePL_9}M#Wv7Hb|!7va37_9o=fOOVSMo3PmB-j zW7>x9(G3@VkeU^aG_olia4)uiP3BzweUnCJ_C5~$Q+kTz4T-_Dvd?f|C}Kw!&7jrJ zdiZ+%WsaoePI#zsGpU9EFL}z)gd{__@lh)H;eMKKpCQhMOc>ztRm+$(D@Ax``VyRr zuY%Es#pL`@JpBf*k$s=$fF(c8Sg)PQIB@MWzN~Kx>o87Gh`$x>i2q9LkLuvI0AaXL zv7f{?b%7l|*LWSLGGV>^SFo|@1g0Tp=yHn&Aoi=0PUAlU<*DO9((@a*+V~HcWKU=8 z79jj9t$-0)t_>tj2sr-86XK~^aJkG*q`l@bNyCs8-jqpx1^VM>u1&1g4qf7T?Jdyl z5u#mM!gSZg1a?B13l67W#nN9j(ddj$3_kJ1-O7RxyRM=4+xox5mKb&M(x#DvD^m z9b@Y^4Z=f}m)O<0$B9wP8N6>xATzr8B`Pzu0oJRBz)4*bsJ~kXvgYx`9V)`v0}aIf zt2eG~?f`K<@7QO5lGt8LEu20vlUi#Hfu+K`vF5?$bf{;H_p0+R@v?kJA_A+J_4f+F z_W9ev6bkOVB7#9^uM zS#o*)AvS$+8d>+`Ak~~{jcfdKp~UVoLd>S(y)rp4^Fbf`YquUOeKDUKnH|ft`j6Kp zym^fdFqj2d-#9g4()?y;Z5nhjm!{Tf)m7bH!{4<35e;jb%RLpM$i`L_z`#|i_{%gA z{=L?CR!C!&ql`^DwWukDhW$#^yF>zCUT;Z_HfPd((?>bpzlO*bsV3-WGKG(#uVMKg z=g5}|8MZjDhdTToQ(7W)kGHZ2SvU3W-mS>nPsY=%q^0B4Z6&i zS#E+_k`6<2C1tul_cLAnzKRxpe+5JJO~8%4Jc>iSu}StOtoAjL#t+Vf9V1$N%hS^A zpGhgMR(>4nS`tW!RStBn34*Qnh8R2eggi`)ryJXs)w!hVQXOOpe+D!$zfLIe&(pP3 zYK1wztlq+;yFG$-^X%cWgOBOFjkCDLle>taq6_>vDM}P2uc5#>D*SiX{!+8iMw0&S zI<#GQkWTaaNG9sVxN-IVc&(Wk()2h;q5XI4{lW!C`UWu$B`e{9icI)dVJ2=8;(-s! z1%e&nB+Qw69~PZxL9cn$G$?x!`zK139~*znF~Ycl#jk7O#fMk8J6dC4&;}8H=BhfX z)%}RGQSuy(9}+O`FDDUq`xLUo(}0^ZbrZdqdV&w~rhqANvk6!gKH9qV|KNX1t85@7lw}KQP5EswL!} z$R>K*>R{d5@gQKkvkdLpdjnqAoeR88<(bE~uY;m>1CS$m0I$*E;HJZmV1->W*qwKm z`4jF%H!d=x2Ud-;kqd6LUCXYfoDJDVf{DPo* zgeF+O{V?<#{aN$exttC}oPh@;f1}}9nlLeGE>tQtfM0*`Ipur?jd)^2$Qgq;Vvp`M-Q93=%DQ>I5*J%;;HJ?AmY7yKViBv_4VC`#dATZ2MleVJDxX zaG7$XgQq!w3ud%<1$O!t}bL1+BQ#$tF+Tg9}c2ff9>Z5Xtp| z`U6k#5o8SaU6QBA*jae;(kM7KIKVjQ1kiPHVa(GM8?ry&iRf$3rDf;Z=z;lX$xdq< zU}AFx&s%PaTiX}a?m~I!+fRAs=%@pcT=OPt|&t>FYQRft*hY2o{t3R+#<`r z?Iwn6UCEU=mZ*AGv%|kDLEo?_n-ir>^;apx#cQJ#^Hgi-XT&)u9li z9w&}J<`)2MsS+T%XoU39zib&d1@9=ArLlnvafjR(c1ZVRKmed%2T#LHK5vvT*4@ zEPdK<0AK!>L()W_V=GBVSUXsOGuNha*1oNQKHMA7wtN)B$^>*f;5NwZ;^J#w52#Yl zD7)lRHVEiL(Dg(Gy`fk_+Lc84UY`EYv*R+LZX-OqRtJ7)E+5yx)4XrrpR&E$^SI2{ zdiYAX51h4l!uhACTi2*=OV{+p(G%1VPciJL?}F~b%zjCFYq0`lt zr1A<=LB4-+)l)k7GL_vf?gDj99yv*<_v5T#AJEGz!zqt+V0>~bXV>aOtcK+RzJ+QV zuS>g_h|b+d7dI~A=Lg*5RQ@{%ns!g6gBel$f$Q$HcK!p z9N5Xs^b%*)ihW>hOgGxHPaK9gN7M7chw0#z(7ItSArj+U1d3;t!9QtI&~Rcpzq`-@ z$5ocYq1~sbUvD$dTt}F)>xN*x^8^0o?l5KJ6ln`*M^CG`pPE-uF{ z+dKy!^?U_iWIabV8!m!FqZat_^Afr^rGPSd%V`u(g@nmD(p!&vXqL_#uJcYVE;27B zHI;8@YOocaEwPzD{<<3mZ7QG{GTOBNojP}$uOFR|4yEex5_PlR2r*^$wp|E}3i#U9ARqkp8ZjN)tTV0we9HGt;+LH`&-@EdghlUL;M?V&X|UrIzTV7m zqV@L!DElnMDXFvJ>t(H^CQ3*6{~DIUB@&~+YGMI5b2|?Yw=BZAFkj$J9K+@ttI@}S z7yQTi)gY#G6PVn+5v-qXgIycam}&ij`?xQ~u;#ZuIw1dusp6*LlSgk;WuIB_*(9ZU ze=mYHpJL$SmF2K{-ZwBa`dlEHcCj-YR4fxRAi z>{*Pho&~`T@#An^#bS76T_?qwYv}2fncQL<9olt5;7>XU@;3Vm`TOf$l64)?pg&)U z?9vLRiHnvo0bZ?av1J~3=H3I{A9K+9)7kL%`)@#0`4ix{DRVc7F5o^e&WDsKg|if6 zaCu-TW~~O`=`00enFdJ88$G-}avKp{$|6IxRC*!yAUN8PjHm0Yf;(ld!z8Ogwi;q$ zGdu=n8=s>Ed+gB)6=Cjac~5%u`ZMM$NCZZ27^+Wg=-Xw{M6p-|K7P{=U6XH-PMvTd zGt&Ui7H~oHADtrK7p2o}EulE)gfSf!ief|3wo#$Cw_yIK3Ivs;sC}UiOp9Ai(+oQ~ zovTtvp~nLdZrH&SAJXL~!&+YHgBYOee}eB((}mKF+wj>iRr)9JDBb#B3cA#8PBx<% z)HX(qMr$TOnFtN=bfpU17PcK9JLv$IjVqH@=jUwWgB9eHnhf;wo6nC~E$E~Pi9?`m zEw>J*;APKMvCfDDEIN}0yT2!c{>?lXb|e|K4?kj7U2;Js>oGAq_Z#&tE`V-R=CVSY z&e4&kgP>zo9=;M8PNvYOZYKP%T8}|p zVi+n4R3Ll@7dpLjIcho-hJ8;Bz>;sLVZ?)1RDQb@klI~IH0R`kyOu(n%I9UIH!=_R zl>@NqcO7`IQ3ph(i2_u9g!BB(IgqoygdG^0$6k`%kIt-_3J;mQLn}Y}5REG)TwTpe zP=5?kU>HK%D+L*peQ%vE1(d=tw*j-M$&Z$LC*z)@jF}vT+}}xg-TVyJ|+Vj9+s2ovWbT2MUhd;equtqM%Q? zA~DGf^$jhaev6F7D)F=n z{(y%@38X8#ga~bm=~nczb9 z0S7(_`HTYAxxxX`57LIe(CbCj@Q?ItIBUHfaaPVlX>>k5n-&Q_IqoH0o40^1L$_hH z^M1PW(mYW5wGHXllmP25B5;x74bJYQ1Q7nM2Fw{%rnYnEQdcMsYUgFZE{tA*f_cN)gp8~Jl;NuB+8$2`5gBcrI$t+(TY#AvJB~>>fVd-hO zrY{UE%+iE&aWptkhdDu+#bm(`CHV9?gKcI=z*nt5&|mq7K!0R2E4ii(c>jIE=={w9 zNvfDh4Yj9B?yiQ7W=ia{rIeh0_lArmF9jX19`l~fTS4p(3B%EZ&Af75Aw2tvBoy|P zhE?aYNKuRi$#>ia?hTZHSQ`Ui;Q+AzRXeODTLsGbABjZjVyf?}g&+NJrOLXZ*lX)c zk~#l6Z9d`(T$vhhVy-5~`4j;S?$Si2-XDb5cH(R4&FBK(0-W6~OLHA!(0_i{z?Ai- z6kiu~*JP|AGIyj&QKks}6Q#kfl~@iPKh_}URb8Nd?KUE)2LY@7BthQe=Y`3To`AOLt7mJ_d{wZ0w(X0b0h+EOJvQqR(W-Tl{`-U`c z5XDL7q-mzWE9sgP1FiRTdE-IWB--7I4Rl&XYAnQ=%?>L3MJ2eK$3wkw_iuJI+_zb)! zp@ef@Dv}wk+{?4F;~?PzE6m&X5IH&##<5Qu&)GJGF?6)RjiobC54Xc9eR~QL{-Vv6 zKF{D()u>{VvDap#+kvw z9VHxtdv6(1k%-<`oI-bm&vNuXX|NVg`vkhb7`l6GCN>{0M_t>q7>jx4g4^0j=9us# za#LN)T=u_#-Vf>Gtr=Qu|Jxb(J6DO_)s(>uAJoIWS4x@Jucu*~zxhb1-WK=EK0~`s zr!Z&IRoPJ_iW&z@7;%3Yc2OwQE1k?g2(#O^ zu0wU_-=ZsH_ROy1g5Py}9NM>C7wi4!il+I?p+@gNypf0TsQ+ zFutpYn-_&Lp-hXD>x(I@X;=;tYnDZSO)oJn_ow23tYZbm)2EVJk2y|5e(%ZMpI_N{btBN;90|T$Th8|FQGmP$Nn~f1 zK6sU|kJ;`qh<6lh!^>JOU~?Bs;Jn%ho~@8(+e2;XrAJoXmNfNN&$_FdQF@!=W(yZu=2> zYv=LKv>nc8gN{cd3!5(c!sJyu*&npHwXK1jS2Gwv;@Fem$f;mqk?s38oX|bP; zqVc&OlGyg2A0t)~$jId`!!W6kb0GL08k9Q3yIc;ihwTci7bJ!z;{Gvn6vi2zoF04k zzg75QmKq+CT*7)^z07Recg!f&`?ww4jV*(>Jrp$)c&R~<5T;o})Ou=5R=6H)#EK?O1z$`m1 zFSt!IM;h{H7@3%4EOxUBCA4%g8lH71bg3q*>3f&K>sy#?_#JuZ9$@d+9Kt#Gjxz6m zT}AcFBp8dCo@}#yIdiLAlcmni_*Z%t@9@m6=y|LT>s$B_nG{sj;`5Z&j<(i>eS^rH7^SS((~$=sHV z!r#wFdr#R?zWgBi(P|9n`~uLuyaVhQZpW#K?QFA?B$ZsdgO&10BKvPmhZS8JNV;|t z5KijB+XmD)MhV5N!z=*x+aiGN%~+1(^R=M*i!XBjcvEn*@5R%VKgv!Ex{G_p8p)Dp zX~em}f%LvxN&d83{vyerZS$TkT=EaS znmwJ`m)vAhO7^kh{XYEa;^VA=>=+2Pn2nFmf%XkY2LJ=JZNsf%~0Es@S4PJeE!)Cp`gG^^WCCiKfxsulck5;ZHO;=ygyMlb( z>4XJLxW66od|(Dcl_rP}$|nt9#01RyP`b@6oVe*KAr;ZHe9?|jBIGFW;EhL_!;aP@ zQ|J^JJkbo>o9?0Zr)iA*5n(6>5+oEoqo8%+_CxV;=V zJhLIWf5yPkZB4un8bRQ!kpioKLmiLb^d=K87USKK&)B2qbaCp=$GFUQ0XY5F8aLXP zf_ewR?p&k~Z--0N2726My8_Bc?D4DAV4o_=FdS!jVef$Q1%Q&LXA0OKrx0(gF}@$T zfeGo%U`S9JmjCuG}XpCM8M3q8za7@hL14c$n>L zQw3}HNB}LDMZn@!A?NRR6}VXF7IXB~36L*ZgXR5B19UqL7l&pOjYkaQU~rc3>w-wJ zKtFP^S7J5NWAWVI+SL76C}&-k0~-;2&tn#H)@9_UGX%M0@cH ze5sF1?k0fYs>L#&k7KH$b`E1t6+{oJyK?p34198T=Lz`+9kB2?pqdY zaf=Elv73tr?rTH7%pczC9UAPFTXmG*kj}esGKKjn|Cw%%C?f4h3oAUW!qGbuK$Lm{ z>5aFi;Z08D*4c}=QlKALeCcP!54w`SPxo?~Xe}AvdX|0C>cm<0ej)4XX~llttWUtF zso?Iw7hZ072537qpYJqS36%|P`DB&nK-`ZXP)TE{HbKGu^SYRre~`3QEg zNzm%;X8N0zrYHZ^fsN zBP-y7OjW+AW`Fg-->a8FY%aILf?_hm{Iow>{bFZ_4~o-}W#NB`*aQ$9xHfDuP}Ak`f{7d$VekGk3IHv-@W z#qZ#7y9W1Ue-T!k_l2|f!U#+aWMJdZS-|h)@$F)3V zD{<(TdL2ZkYEs1}F4K~431{EE0wpyIIDMZo;D2{IctIyJVU^ltmZMwDNj&%jZr4a6 zEvaEtalv2aXXQz#WiXRrue8%IeT|@h;uW)Kdl@`?-5h~+J#cehI6tS!4~l3Rfm@yN zxcKigB3bkwv2!0p--;EW{y!yHEtJR%ehq_V-?szjkT#+p=)l)GZh=!So8otCZ*%H% zSorv+4aeH$A$&S`k)#*Z0VYeA)F$Skn{%CL+UP^z&>RIvqY(`_z8`HoxDtMJTZ_+p z3PUTlzh!S6enrC5CE&e8Exg2cFADp+7}dyq#IKIlfK>Sl)Yw`WHn?3yJ1#xtf6T-r zanE0}b@l}M7w-=(BBpY4tUnOx2aw&h&INvaokAXJ=AnVe^El=J1oP|OQmY4j%*(Bj z;N0rjFw^KiBAven{yJezbv9Hm;CUBF+#y4BPl}!%&}kZot`8q0{qoWj9XH}e=pDw1`aj7r|9DvO?g_Ix@;3eV&jsgp%%`f4 zYx!c&4&faY_ejsbDQx!&X?n4JE}pacEM=N1$-C`2(0%qwTBy=MUyWX%Lf%}wQ2#X+ zA2p;#8usA)jt4-FW`XT|CFHkP758sy;uLKCh4RneVt(u#K;Mjm(Y{BAnQ$H% zx7NpdoW-!vj?c)^>lv@twG_>@QNY()Iyid%x=hP7RWxfy9uwLsQX5tJiRWAzh_=O> z^XgV5FhRCzSO5d9{b1jP3@<6-UH4uhxwmuJ_}2Hl$PIR^+n1fpp1ograq)WWuhp-Z zgL7oq~p-N)4}NP+8@j=r(q^BI}*Jwb3y3MHDpt+ zk79Bxd2@;vp{5xI?4C4d=8ec3bZBQ5&$#ab%FRjREzQ=)FAP32^wEtDQxk8;SkZYlqe zW*s2M{_qcbbzqp>LGE6zq~DGo0H>Or`T0Z*zaE)@xq3-NIUpD967_=1cV3}mZIIvi z>K`i9i-ng|5d2d$fQ%HCXe&1!==qG0!865hmDB9{j`OEr@NQ}TE&T*WEH97Wm?|La z#YDh{tHLlh;VPeJeiJ&(s$hi#t#Y{sMW)(@Z60b*m}1ttp8I2 z8saixux==|UN{e}6WoSKuhOCa^~S<^Gg(;B@Y|`ym4LLON`}!?#*rhD)ep-J;O%X~ zb%DMDZo!8OR7$N1{uOj3mDxOEFI<+c30ba9GmpwbXE!H!zSC68mM*x)Ugx=5{#H?bBe zDGXzWZ|2ZB`#LmC)?<}T9ieIcRcchEh<}_ff}Q_9JN-ELlx$d34n0Gp@R4U;e6e$K z@S~x=fFrDl#wOQd+0SCo(=(E*tI|$4jA$@;wUi*{l)&kjV$bJ?v@_uxQ&>*;SYw_J zR2x1FQr@m0&mxP^;`?^=_E0Lx!vB!8q5;h;N`M`zgywsy@x`IsP0GRRN2;A^CiM3lpP-UYjN!slWx$q)q z+I=xv-+GaClblJi6KNgr!sZf$b!ApQ<6_ocQ3&mw<5@rhEYz${%2%k z!(RNb^M19)opWeo-A|nScrCl4#sk;S4F$_P){#aJJzzf)2P{T11$)R(;@Sd`{9QY8 z?%)Hub@u?_XRKrAw>N{Hpcqh6lZ-p&VI-3%$VzemW&dg6Ex93Z=}k;aU-rYOv}bTh zH&5Vq+~sI)b4Ely1Xgp8G7F+T;rEl5zz5U-Uv_Td`hT?Go60!B-q{{hMNN%fPyR=J z;?+>@WGVE(^87< z)c@%ddh=N^-MgR?BrH1*>Rq_ZMAHvAtsw@gJ($Vg@otRr&neb@s&@pDFdfPNTL|Ay zw2*`CL$o~cB6ZK0^=#yJ6b$V^txU6+9^W9pT9~9sT zc9lj$*BkFpN>(a2yG#z_gF^IATroZy{|-$Yt%iE!9c5nG^7rlyhFq>ElpWYh!@8Y^eq3!(GpxboOE&-Q$DG-274YA4QeWdp79r853 znb#h-o}BW%MY}@MDVhwW9)E^;SF3V)dCT{r>-(apAtxT$B*YVk8VY`DIl;v7wWPr8 zAyNK#7W#ee<+&6uq1K8Ry0qP8=8XKt(fNPD%P3DYJ<*8>UCF+qTEQp^QYjUMmf4^pi0GqwFxjhMdl^_B;5VS zumk9%i$rPB-WZ_2V~kuh6LhWzKP0o?@5dS6g+W!E z4(7iO!|&I8rpDqDbhn>B{E#ZjF1Ykm(1G|6-969%Kdkbl{ia*U)>I{SQYi$EZ1oUi z7UOY5U@}Q-`+}S7a+tO=uH=JuEYJ|J(4I|JkiIA?9#93h01ZdvMHS>a&7fXr}l_(vxn3Og2YBslz&y{(Oykt`veGUNzw^ zF{7u13eZ}^RPw;IhiyTfX#U>cfR=^OACgm{hu;(upC&_<^o{x3J<72hW4gp>elzj0&cWhO`Z$v1N8yGx1Gqo`HNue+IM*$Sdhb`mx7KYZTds_eA=xAl z^?o~fWYq$MJ}d>JK3Y)kc?-Dyrv}__?M7WHh5~u1hPdr%VV3RxhKu&8vvnKy&@Ch4 zunb?LNu_ptlT+7W#ybdJP8sA$T(QM(Px`~Q;w|v;d<)v@e3Pj8CQz&WLA03HfS-A+ z##6Q4;1wyqc_NwOP;dVzx|Y@p4i|J1#i;?zNn62PlFuMg6wD0DIlr-K_tB=0Hn<5Mzc%9|(XzL*8(h3#kbi)XP`JEk$} z9jh6AYeiP*`OVt%yi-it!X#d5=_Qo5Gm%HawORQq`k1C)_w9?^ka%AV|r;S4n6o19q4Uh zMlUZ%8!zj##Xr8Gur92bXPdM(5(yL3H&W zqW*L$ysIk3cG;=n>pQcM%?n)?JyONfg;J41R3kfa+ZF$IwSwP1`M_CM_2_8n=PSBLoN0zT7>1- zmev01egO{nSl|u|X*{HRg#`5}GS0hNNrw7OV)jmxM2kv5p-s{BN&X39JW80Ow3P7_ zy}@oyY2v+kcbQgrgg{B#yS#ft+Cc8yTsZwj3hb{^2e)VQ8Fl|avQpa*Tyc=5oEs8Y z^xsqvd}$lnRnp&4=h#HO`<#OfJ)y)?fMnZ zi0JlOqMxaQ|2F()r_J7g+e{DBx0AZ`ki7^ydt8s4dw7Pdo6}34w#l>A&v$_7hc3|O zUo&W{iUpXvFotw>sZ#TM=NR)7qf6+Gxi>xITSH`r|D#7z1PS#+%Mmjc&Nvd`g$Ed-;89Z`uQX4-pzQGFrcm>pg z7Sq97TY$gTMUZx`9+V8e;`k&*p#9@4_*XLtE;#=}s!m@>OY2^;;z>RE8bj!kxLV>E z^^4dav4ho#c4(na1y9@kD=4nG#Ux$s<-r_R{Q27-HmmzK&*{uKF^ITCZXKEePU6EL zRXTziDjX-m>e;!Pxj)KDn6vYZIaFEJC0`em6DjiOf;hO4NUFRCaw#Yq7j>g(3|_2Uddlf zS4>-kOIN7D%a0n_Nuya%L}dx2!EcFUuL^7L`xHstGa~I3?xbnfWm4R51#eE@N#~7E zg$>3{;J-!TNXAc$Mh?D$r#cR?u+O8el_pSK z(3xZ@agNmZIKlxz$H=_ZZ{YR71|X6t0=DKRGx+i*{)#oPS+N>nRVys@){+>fHv6w7WiTlagx zS65!bb)PEfX3MEyxo9KZJNg{B(mc9mzc>{?0r9lfgRsQ?5)A9|qc=}&B@$T}o@k08 zHHMo>XHF3e_Fsr|%O>co^C@smOCgL+?qOcm#eyAQWZ=WY`3zxKas%FTaO+MU89s3z z{P;A9Ox%s((>YDZJ<5R406A<~F-&?#CHc{xz4$=ShIIHFLnpZ>f^04vCt0+a@-3-NRcXd$ZyelBm*aC*m zX#(4B#gL~nO6eErS@g5=24?$!3hj}-3S>+*$dMmA;fLW;Drc~O{=MUa?fn))4;?wq zJUc_0y|EaH3@HO;KLAI*?}AAJHj?yc2<#n>rtY6NQCp1`yo|FE@A0jJPY<1gF|o-| zf7>kl=vE2e?UMsS*z6>5>39n~FY4oSuoxReJg42C!|}kPKGYsR6*omz@GnnEB>6>$=pAoi zSfmmM#j7%rB8P=r6$QN!zO!hwx<34{e>Y?;dq_&oU35n332IdLq?yARWX(_(y2D=J z+mD}vUIxyP*aUHfesCE5H|FRkkz}#b^CJC9w;K;s} zRN@#15AHRC<~8E*b?Zs6tMfLAwh4p23;Ti77iqFsu&uau)S|0LD#5&E4~g&YdXOuA z3EiE@A#Dq9fc_^3nXp`G+V3%iS>d`Il;2r3vr zF<=6WpqLO96$K=zfCNQQQA7|FGf{<|?zdM(1Os3|1jT@oR1AoKD0jc_`~Chn=Tx1l zTes@gtva{=nBJc5otb@i`t6?S=Y5_WFj28Y!)5)9k)A$Vow$m{bTX^j6BNW%vdUSss_?AxIk^p8G%m!)WP-lvQd+i zjtGO(N1e5JPscg6p<$*Hol2gD;uH?jCZ;m9_h2!~($Hb@f9~Q*J{yUYEtK)K+Aqi~ zppSbz$^?51y+`9a6DfMonNFY9jb`>N!_EE|QDo~oq`Pe_wm2{W@4WVnTmI@PExa>= znYcL&MMml1Q~OskKaAeG$QK=^M!s8z`BtL%iw2&{=4Gw|>kUun>$hXk*!iY(Phf#4W)-B78$8w`F@Rt;a+mMK>Ls zx3Pu`f3=RgS>%jd6|U1x`Hpxz{~Y?-*UBAt>Y{7rG}84a)^nO0SK$j827(WNXk7C} z#7nD^hSu?_=vNZilpiUiK01_fD$DPo*k9tfd1V)R>1V~PeM{5RUzZDvmD+jv-ZBh3 zW0==1cLFWzmqWgm-nc>Bm|F751^0%Xq4h>~bCb1Xu)uK_TGd}fuT)^@`gJR~s;L~e z{FEjwb)|)xb9p)S%itAqGt|cGO}}vOC2Xl1Wx+UP&0}{FH5&y<4N-z5Yk(uznLSm0m6^2q3F~L1 zg6y3<@WSaAuzu$N=fzWGx7KN}?KO%ZKR=2!o#BUPB!_a9kIV%fC1YVnd_A*CGXNS^ zouj5ZXF)~&Ry<)$8QwLpiIwtR2KG_1kS5}2-)vQk7M?UhCOTT+dvgzVJU5a*SImJL zXjuXl%G0>)u#tqfvOpMdFA2GkrLgw=YkC588+)mS;Eh%pbfG%UuJrBY&djud$XXfJ zxvZY|*wdrZ;N?B`tBA+{%Dh~x^*aC(n-?*Et}4KCkrv;KaXnOG7 z2JEdx?_i7c27H+J1paiZaJFUhsF3JRMxkybj%}1nd@JYCFwI6IYp5dMR-Nh`tDdMzVyBq0g-s2KJ&LdgPL-2fjFnlXlVBLeVpk8-YPl~`E-9|Oxl>Y@BjQw;9kUnIrLCYDE@I)SBixr)i?PqKAm-P} zFtnq07o0b30zHiaIO3?zw^3gLm#nqO^(zf*-&z}L)y4_1HuygHr;T83b4Ibjqc6gW zA7waf<`5TbY|bvoijg{x_DtGb0b=jF_X&$U4O1>(SdzsIReOlB94+``UD7z<8n7HEFj5;m^zGIiZ) z8WY;$4cQM@ut_ge=;BQ>Bz($oZs@K&YB{0|`tPPfcSJsj?ca}H&k=F`D5j7Ib|xv0 zHDZ>uvPfFYi5=(q1gp>UXIF(BBqFjh=GjmRqu^%C5AHt;bB4XC@Nyq^D|H$m@h~cr z*htBaJCE)6OORRTo^v@rB-r+#@#xIA$BdYrHe2R4m6Ht4Vr}_Hpsy>GsL1tjTFeIa zM&Ay|J+uMB$SjeTpBapLa)mWtCE$uzN|03>oA8Xpm3WwUmUgV!NIsRUXB-afgDW4@ zIR1MI^2@WCWbP5CB%8wLnYy#r%wt*c0Bwe9NT6EM!6}#%NB4q*tqv2A^ch|-u5An+RM7LSr-hMfmLpN3wuLarRWYsc`KkF4~_YuTV26R zES(IgV`kgFqhR;S7X{umMa%j^u)<_FEN*1T&pM_+Z^=5x7DRV*XO>pt>O1prd{GHr z^=BSi>n5TaT4c$@&P;?lsr{^iS3k4(_Bz4C=Lvk}6?W|JetqPb)rQV{-C(KNP3%0g z7)~YLgygj~pq!64;nbFLRcEeT2QCbDh@^S~_N2xV~GlXY3{4L3gfxip8rz^?l=(6pOBVRgqbn4<-PzRZWL zjl3Zv)z-kY6a>3)Rl58W4l3CHwjIASBZ^5X-%7jc%D|ifFV66GF4&)l1+91|*4kW& zU4Ld4E4?*|wOcR;DBn(jzjiXC|G5M`)A2^%C$%BnSIcAeVL*_FYbAm9u3>~!MkPrCT$urt* z;~CN;k0-^5@aaD5ImcmtkAp)1@`i3?)Ab9uBN7h`~D^!7uOn560%K<>_lyL$L5DjWCNe=@pXgJ zMkP3RToUcOF&fv`@1+|p^jVikN4&!B0E0IowA53KcKyUr-i9)~=O^m~HQVE;=Y=l> zx8N!l7jHw0^ebsC_a$6uV=<@mIe^kqxWq|bbfBw0oe_9v8u9`QRZzf;O(H#jwcIz; z+tmFpe%x@P86DBsLn-x3aI;b^C>M1N8fkP>UeXeDKmebc@%F4h=5skk|9(zQ*rkBX z;yEgCt`aSkJf6~U$>LngIw^C1Z4|Ka6ZgQ>1{r*o;+_~=qtBmCQOAsb^Q_j|qn!^m zIXS^5?zcL}sWpl7Os21;1onryg*opim>F65Qb&ZH+h5BKWjS!(&cAqbFL7MaY8m>~ zp&@F7{{*zNdIMFo-i}_s>m>!R3L95$CIZjN7y(n=<@8nvVLi(nWGunqF{2 zjE?MT=S-$8q7p3XxHYGY>8M3RE>pf(qrRMx$W;9|x6-wVYNs@4yBF)ZMbEA2;e?-D z*6T4S!1c3>ZGjPQN&Z>tkzm7 zw>r&NG^J&iS8>WtB3*6g6I?;l0V=`1k8DLz^XC{ zKRTj8r93+!TEqLq)@D1g#x)*fk#hnhMV@DOkKNBUsVcG)3(m3i(-Juw(-c&GNR#ZV zoQ!OCt|pOgTlvmU99S)v1d2Ig!vA$9jtHKA;r4#gg?m3)*6p-8-)DXlb1JBe)gQH= z-PigQ1&@g57U(!bol-tKj}3;U(}LmM*2R1|=Qr%g+;6-qcG2{j;xw?#q4=urc--+f zZjk;toweL4g^M?QRHS$MREnHijpn)f8)75(4w&>IovHNXVi z-(@hl&8Cd`1`lK+J{BItjALGZqfjZbqPKiI#>m{s!LiM|(E0^5UbL8ICf!ySW;5{j7|6o8t{XVRFo#cP8{3D zjh5bq!&>Ge$y0XB?)t6h%DII&qWmg;U0{b*f>Y6h;&sgW>IVA4O-p8<=QhqaU>}nD zIuDmr<-om$WcJ5X8LGpem+A12rn0Nf;mBEMS(_tgaGU-?$jDD*M!inLWf^?t(bF09 zN5=}hP5l}dxpf^j7_%Bnbspq0LSvcE>6YvoP{f{RGjZ{Y?>N%R5{pP;u-&X{%+ZQu zDoJq+PzMRz8MuoFJ?nAC;oEqY^nONp4#L9yXPGCi*;MmY19noJIOqmnWZbq5P{Z@R zz*hP@iW=C@>5ZL8@)@0vTFYA%PpeTyobzckX{Ev?zFt`^LVkt3*(@NUN9`BE-! zmJfTt@FHIM!w!-sS%dwbZtl>&XLLW~(W5uNYZet*(EhnZO`LFiUVsd}iOGx~4 zKsizSzmlYQ)T4hj(fe2accvj~|5y6!>?^)*TP7wJ^mqCH)@J@ZclW=}KK!53zt7)a z`_HF;uJYe||9}2J#R5Kayxhb^_s75gf0*{qFaKBf5lgN9r`++c{r^+!^1u5#|FNUQ zzr2B%82jMAKf=H59d-A=Z}&f~_P_e?fBdVs_&;~#zy0>V^Zx^XJ>?(UI{gO||5ty# z^FP%8|HA*<7Env;1#8PmWN@53xi_Fp_>(_^_MjRW{yK_m=#V54cGC!2CQS^jtVvai z3i)$hnT&qoO4hgAQ~66Jky(!nXEQ<>jn7G>T#skCH0}SvU9BqRzKCL|r`)mUcF$Ep zn@jryw8?4Sn1szdIq?N}aqv!#_c5Bl5CMTv0C^Tw4ST1>fm3omctlUf4oifrhU|CX zG%gSyg=es(P8vo`%O@{BDUvWvU!hanbmBxyleR%a@?oEk@E&DCvM!~=#*gF4HfKvx zaoD;448SX=K7ZtzkEw%ixG-Vu`!+GO5 z+)oik)xP{1cc{07iddQm^Jk6|W=}{(pWm9Zhxs8Qj+tM~g^$~qj<(HAb{vMO-yF%A z(Hq&=Ni%Rm{yk=dAHeRD2IK{E7L5Nm36-zCf@-k`;4EDMQfq#~lm=OnUoJyNE8BqN z;090#M38gv1x!^tLSW%bflIpzt+^spI4fQTM}Itzf1Yo}7tD7v-mQIf3u}k3{|slo zifEFz&a=XoPd>xF8Dd0y*;PTMbv5xTQ3D6Ml^F`)gl*;}sEt|3jwPu?c7YXt)nqep z^m1j^sElC?TddfKGJ8C;M~qJQqbR<&5gHK1_pSF6X&y`7;;m!G&=;O~Ba5bZZnd-= zm%HdExATQ8QaU<vV4pLNue!pZcPE=SbrdV-oeQI$)dBw0DsIe}I@ zUeE2jnnh*0c2Lq*;oSJqm#9-pYdIgf3MP6@fZJ2}kQZ+Wb6YGS#6lac^S(m!>eaBe zvj9pueV|L12W}}=5W+si##4OAvf*F6w3#mj^Sw%`xQ7S1_1`Y@97;^-xim*zk+0#| zyfLR2&v?O2-)PP)b+}9^8$PE5m5(duoBPA*>lcO3poZxDQNLTAyG#1`D zf!CugFrmQ;4(R%V|K4!WH_-ycnc3uBTB}GK;5eL+8x&ztJD|7VJ{;E+09#oMwNu+6 z@J1=<#S7r^vKNqvo1k1@i>Rf~BnOEmXtj+XN#FW}&qfE}(h?(>se27uxA&l~-gk7l zL=p0MI-60683`Iqb9hh0lh9E47Vz+00PFh=fl?eJOn2D}t(WA4-&Y(Uy+8MWMNAX4 z9Z!Xq5z??TQAcR{gP^ur2E^rgQ1#oMEKN5iV&PsQ{PJ3|X}UK#{Vh@0*EEqROtvCd z8jZ==^eFQ4w!3hWbODKKr$`*PiY$H4!T#sTaPUu)-k<4*86R}XXcuX+=YBa*^=hP)lOi); zsuP7BGDNXtBmBOkNtB+ygAotKN!mUFbDKJ#R{9=njJ*Sstq^SN8cRAyT?RJ!Ff`d_ zK;_+X@^SnLxT1do%;GWlixyZnt+QeMig0!oTAdVBXNXK0X zlIv(qa<&?f6yYCGJ*h~XmwOYJZ;mK_+IwpKj&3CNz=(QSD21$F_;c6I=kdl$cThXV zX&~3H#wfyUDK|p3kvbf?AK7JyD9obe87{+5q`^Cq|3Iw~M>(W|$-xfT(&+;3bw$|E z^B_2eB!H)l79*9Z0X2~#8lv4f!dSO0;65=0-fEaZ$Lw!F-#-k21~I~bsi)ywcP~`9 z7r;&rIgnnpUf8EvM2fp|AV@&K{+J7zt+5y>h%^cpN=&HSBzh->iZjq2qjQv}raU(z zPZk|-*+UhiSfj)CCDa;_LvFG+(IuG!v9jMUwR96(UrjDwLz9w zGdw(#18PZH#G>{zOnKc3i7Y34b0rJBRja|vJpw0Xa#<7J@D=}L2dgXpgsw}GxRb%yFCmI`#A`=d;pQ{#qjEGAsoyRk>%)IhnE`f zfbM$>IuwRX#d?@j97jAdy*S@bigZ@P6ql-?TB`n0k6?0?ER}6(P1`JxM)zC7sX9G% znhU-sSaPt2$}V`$&CR&t^1*OA*?iy)8T=eZLSF`fZ<;5rcFMws4-LcZr7hU1X`gUW zy(ai($U*z9=P-7I1Q__{fa{THkP66zXmKCVEsBLdjX7}Ys11qvIfkexM?t@l=-xWf z0GS%<}%0!bdb)fU2HT62% zVk&OtPINPHkjpu{8g(Ct<5ILok{QW8FysCJtp4*7yjD~|-h?YKRJaJfoPG_LPV+^$ zio>uVycS;k?1TH4OW?WAc`_ow8y44%2kr1ya*fTxx8!PREtHACpU)jW&7c#%rP-NN z9xfp7|)#!4vPUo_M~$3!AJ(b2Fz$P`gTwNH~g-&oL6@^TaP;UZqC% zoK6Af*wzB3t^kxWu^B#GW8H8LvgJ%qpe1Hvon;oeakvXWau!_SiS^0>?VNbfe37{=oQ)ifP;79?xJx( zRw%Qs3QK=06w1kAQfMwlW-kq5>MSCJGeaVU7mDu#(-#RE1D9Z5A`c>SkAbRTA0)aK zz?eBYkXPnJa8n#?{nHC8(iBPhXa(~0ooI|IQY5v>eE?&I;Me*=ptm@Zv9iWwuH`6# z^X$nd)`>WY#v%K+dPHw{CGyWff;Ge#4b~S{$~^kYTQ%_x*Cg{~%3J;k>b~9zlyzW* zK<@J}XO0u7$r}eM&nW$*rk6H=RE9bkZJQ1zIbD#n#E^9Si6G+|pTNyIzGUx#+2C2! zfL}{l5mIsx%%-(MNa+YsF!pE=2$G18M?SICZtb!ERYndPWUK zmed>@MVf+a$iUvw;?kCW&FP;an@3}>c+bIL;Diy&=s(BXtEW#r$T0uNk7@1 z@Q|FOmM389XCzig&`kzO7JsUlap3K?PKMKjJ-{0~|PN49DAakY{6=g0?HJrIP4Ph(!6I z6wO3*4-a!kPR~T+hw@PKumJh(6L8VDbWw&s=3Z~!g6_*%&`R=-s6NgaB|I}nW=THC zrDifZ6|M?w?CFI&RK8XnaMQX2&gQiP6 z=wpxciI{B?IlQPAl68AQy0lPe^=Glr;L&+#{fObE(@D7eZMiUh%T>7NVFizW55h}{ z>7YAHLa2Q{2hyAGfm;nj&yu6*hx8j>k2qJ^ucA(UI8s5CH~UrUMq8kr@eh(*RBL zarnzjOAkU2nh533qR8mS8}KbVk*`L#KyF1J7@LhHKU$J_`d_a=^#_JYE~JR> zmETZ4Isgm|62Shui`kz(*I-_oXzt`-NiIx#1e>y(VfXVCc)t7{Gz(vYpNI>v(z*fK zg08|(^D;OsAwg2UijkyFP2%U939q&U5<|v|>@WC8PSHaoDk6zw@^y&&h10}w$ynj~ zO4(Zq&64Eu9F{ECi(pS~%z$(=CGsPi$Ao{kf|j_&aOjNMt###jpc#4t?)=dOI;9ZQ z^@l-jzy^d0nJ|ubL$n^XkOVu*lC1Zag$I4IVgK1QSgjck+9zj{kW;51JJgqG%u*pq z5rNR4*bLV)ZOEwvJ_+}dB3Gn02o=;~$a4`l?@v7`Mpe@r<~$XJ=sfiYB6{`;ixk5@ zocF=c@Gx-jdWz-WsuSa>2PyO5Zcd)Er5CxZMzYo!0`Gk@=<%te=`;RIsWZ$N)Y5J* z=>6uxtyM1Kg7*h-eB)z+#&mV!xK^4tC1i;-9qmc<3n!tt(=(FNVn6~;_>f)tY0&=u z8Qh$pEo^nlA`-Sb#A%7RaM7_YsJhVvPYTaNePab6oicdd@)*vYvm!Bd0568+2vk0Y z`24T%D61PHMD>oEF63qSCdy@&Cs!Yx&1t2~=d`!UqlkCbbZEZ=5*rgu9dmpv7}#h< zD;78-?m&p)mNia8lx7Shn{8{MmgTCN^u5BXu#L+bqK6_w0of z=igwfrb~47Q^9)VeE2Q4mdvW$MRfP=CjNm*c&__a;+3jLqSt)Ji_3DDHTO0M%}##= z@p^F*WB&-(Pu>nAXO1D|Mie+jAA_nZ^NAa%k?GE@!s!jsu&PoH`X1Yp$!8D2gsm6B z?B-?CDJBPo#b=;pQYaqwaDr>{3D{dN3UvJ!L5j&7*nC5TVf2fKpe=EbV3{rAk}d_M zxCnS?oCYB;*1?xC^MvE;f5YW$9dhZO94TKRNA&J!5uLUs=xx;^DI-2Wc8CV~+VvC` z`}e`vry2y_jwa8JegvbrRlMq0brDbaHtx>7vFMK0E=u?=l{4M)hkH5RhpOIvi3{Ch zK&e_Ab0Ked$j#&euT-yR%9qYkxG3sV^qcqawYeEmSLhH+^ahqiD3Hg>%0xpH&#**A ziCEp0COX#3g_;9WWS;6pSm!^R?8@~bquxFxyI#49o&m=Z)B7ypN$ew6SI#ElN@k=X zE{^o-Zy^Ku45{lMOK$4B3YCl#h0#AGg@0z02}kx`2kEPC@S~BHSZ|v-2`G-k(x_Cp zrfwX#c^$Qyapw0NK16JI1mOW%P{Z_K#inu4 zs?5>xuBTyg*D@UhL7`0uQrO)Mm<_n;w+L zyA-U{wgquIRnYZy1^xTGfcm+4SdZ5 z;lR$D@V&YOenspB-I@YWxM&OklO__yB^_Wtc`{jK_5!}!NfD|=oJ{kSA+|jqq0f8= zlql*E*S4=<`RN_})o;z_tFvd|66uq3CvG29gnnuVAaU6NpfeL-Ab+Ir{=@T-{y^&1 z$B+u5H!B*Zhh7j~b6iO}l^=pZi$6N^^*V3(y$zzimGQO~W>G7*IP#=CCLknz1lh$* zs#FcT%jwqjaQE-1qM$r0w0=jGKzv#tSeBOIBkA2F(Y6mKu9kpXMrJTltO9xN3c~lz zw_uIIe6CyDkt^$u!i=OXSj>-w#a%l=BqR^6iL;uXy)(v)b6y&kXbQV811_rHSWlU?vhyH!-9x5Dkom!QYAgzDcGhMbFU^Lo+^&>m@;OPiU%TUpjid1S3Ys&z(a zhSM!H@H-lPQSe7YpR-X+-F$9?_5@TfJ&D{gGa>iF$B-YPQeELoDQM%G&BkWtxM zB+proT%GPuYB)zSTXq78xo$x^!()Y}g|RsO&KaiV^fP8K_bm>*`4!7o#KQG?bLfog zs$ewj6L~Rr2D^s529?Al{PKrCwt8ks`VUH>pFYtjV3ZU+gq2XU-yn78#Wm_&q7C)- z>VpcKc5~X$z!7cd?H8a_;A#gZBFWkD)YZ&3qsd_gK9%d;p9R?^7P0R@TpJ1@ddMyk33`wSJ|%QJ4KW-|4Do(dsMQ_+P!0;$thph)va8+if}2 z^uh$yh}qC{)^!TrU%tytDKkQf;tOaQjd|$&;f3IoPk~vb7~>T?8Tck9AiY})uG`;+ z+_R$hHTmu&{iOqx`Q5@cFXKTebPgC4 z7g!WAQqGI;#eECt__w7vV%V9z=a9-;mZiakS`IGoZ^3MI0jk3;138idUwMm#bXYNj zH8#VlqxoPHR}P!^8jzkFWg;!-7f?Okg;4+k<4XJd{j(Df|@DO{!g|32R=6w6IOg;dqxdDEh|; z1H+79_@@Ws+8GYn`inqws0vDSGV$7E9^@b!l2K_U^e}S-sr@owG-eE>yq^t!x>8B7 zswISHTa(xqM$mlT6kaE)(n05z!&dDmVmZbZd6Y*|El7-(%lD-Rp@JJ-A;bM1PNS;2 z+qvZJA)K_ZS+K!IkvNW!bie_=Fo|GP zvJKi`6uG9|i|?_=p>aw&{93&oD&w4m25T3P_j?`-uSEKg_#@unW*P(Oa~42ryPfd5 z(ni?XnI!C#RfWUVv5@=gB)rou5%K=Zkk-H!Q0r46t3_)JS>x2nJhzu{Ib%2ZaN|9M z_KhIM@4rILj4>qn)+7=tsYB%ZzCyiB7i{Y6!k04vuU~%!6qd( zsa4QY5QS^jJcR?XebBID9^mQ&xO7Vl4$cmP7d4?!acKtpv {}'.format(feature, target)) - -print(tf.__version__) diff --git a/train.py b/train.py new file mode 100644 index 0000000..83d3082 --- /dev/null +++ b/train.py @@ -0,0 +1,134 @@ +from __future__ import absolute_import, division, print_function + +# TensorFlow and tf.keras +import tensorflow as tf +from tensorflow import keras + +# Helper libraries +import numpy as np +import matplotlib.pyplot as plt +import pandas as pd +import os.path + +from utils import * + +RANDOM_SEED = 1 + +tf.enable_eager_execution() + +tf.set_random_seed(RANDOM_SEED) +np.random.seed(RANDOM_SEED) + +df = pd.read_pickle('data_final.p') + +# temp and precipitation +def train_model_a(): + filepath = "checkpoints/a.hdf5" + + BATCH_SIZE = 100 + SHUFFLE_BUFFER_SIZE = 500 + LEARNING_RATE = 0.001 + EPOCHS = 2 + + # dataset = dataframe_to_dataset_biomes(df) + dataset_size, features, output_size, dataset = dataframe_to_dataset_temp_precip(df) + dataset = dataset.shuffle(SHUFFLE_BUFFER_SIZE).batch(BATCH_SIZE) + TRAIN_SIZE = dataset_size * 0.85 + TEST_SIZE = dataset_size - TRAIN_SIZE + (training, test) = (dataset.take(TRAIN_SIZE).repeat(), dataset.skip(TRAIN_SIZE).repeat()) + + model = keras.Sequential([ + keras.layers.Dense(4, activation=tf.nn.relu, input_shape=[features]), + keras.layers.Dense(output_size) + ]) + + model.load_weights(filepath) + + optimizer = tf.train.AdamOptimizer(LEARNING_RATE) + + model.compile(loss='mse', + optimizer=optimizer, + metrics=['mae', 'accuracy']) + + model.summary() + + checkpoint = keras.callbacks.ModelCheckpoint(filepath, monitor='acc', verbose=1, mode='max') + + model.fit( + training, + batch_size=BATCH_SIZE, + epochs=EPOCHS, + steps_per_epoch=int(dataset_size / BATCH_SIZE), + callbacks=[checkpoint], + verbose=1 + ) + + evaluation = model.evaluate( + test, + batch_size=BATCH_SIZE, + steps=int(dataset_size / BATCH_SIZE), + verbose=1 + ) + + print(evaluation) + +# 850 epochs so far +def train_model_b(): + filepath = filepath="checkpoints/b.hdf5" + + BATCH_SIZE = 100 + SHUFFLE_BUFFER_SIZE = 500 + LEARNING_RATE = 0.0005 + EPOCHS = 400 + + # dataset = dataframe_to_dataset_biomes(df) + dataset_size, features, output_size, dataset = dataframe_to_dataset_biomes(df) + dataset = dataset.shuffle(SHUFFLE_BUFFER_SIZE) + TRAIN_SIZE = dataset_size * 0.85 + TEST_SIZE = dataset_size - TRAIN_SIZE + (training, test) = (dataset.take(TRAIN_SIZE).batch(BATCH_SIZE).repeat(), dataset.skip(TRAIN_SIZE).batch(BATCH_SIZE).repeat()) + + model = keras.Sequential([ + keras.layers.Dense(64, activation=tf.nn.relu, input_shape=[features]), + keras.layers.Dense(128, activation=tf.nn.relu), + keras.layers.Dense(output_size, activation=tf.nn.softmax) + ]) + + model.load_weights(filepath) + + optimizer = tf.train.AdamOptimizer(LEARNING_RATE) + + model.compile(loss='sparse_categorical_crossentropy', + optimizer=optimizer, + metrics=['accuracy']) + + model.summary() + + checkpoint = keras.callbacks.ModelCheckpoint(filepath, monitor='acc', verbose=1, mode='max') + + model.fit( + training, + epochs=EPOCHS, + verbose=1, + steps_per_epoch=int(dataset_size / BATCH_SIZE), + callbacks=[checkpoint] + ) + # print(dataset.repeat().make_one_shot_iteraor().get_next()) + + # inp, out = test.make_one_shot_iterator().get_next() + # print(inp, out) + # print(np.argmax(model.predict(inp), axis=1)) + + evaluation = model.evaluate( + test, + batch_size=BATCH_SIZE, + steps=int(dataset_size / BATCH_SIZE), + verbose=1 + ) + + print('loss: {}, accuracy: {}'.format(*evaluation)) + +# train_model_a() +train_model_b() + +# train_model_a() diff --git a/utils.py b/utils.py index 99393ba..11c1a3b 100644 --- a/utils.py +++ b/utils.py @@ -49,9 +49,9 @@ def dataframe_to_dataset_biomes(df): tf_output = np.concatenate((tf_output, df[output].values), axis=0) tf_inputs = tf.cast(normalize_ndarray(tf_inputs), tf.float32) - tf_output = tf.cast(normalize_ndarray(tf_output), tf.int32) + tf_output = tf.cast(tf_output, tf.int64) - return int(tf_inputs.shape[0]), 5, tf.data.Dataset.from_tensor_slices((tf_inputs, tf_output)) + return int(tf_inputs.shape[0]), 11, 14, tf.data.Dataset.from_tensor_slices((tf_inputs, tf_output)) def dataframe_to_dataset_temp_precip(df): rows = df.shape[0] @@ -81,5 +81,5 @@ def dataframe_to_dataset_temp_precip(df): tf_inputs = tf.cast(normalize_ndarray(tf_inputs), tf.float32) tf_output = tf.cast(normalize_ndarray(tf_output), tf.float32) - return int(tf_inputs.shape[0]), 5, tf.data.Dataset.from_tensor_slices((tf_inputs, tf_output)) + return int(tf_inputs.shape[0]), 5, 2, tf.data.Dataset.from_tensor_slices((tf_inputs, tf_output))