From 9b5ac4387c93c499a40206f33cb6d1cd5db21c7c Mon Sep 17 00:00:00 2001 From: Jade Choghari Date: Tue, 23 Dec 2025 13:11:18 +0000 Subject: [PATCH] add more changes --- debug_image.png | Bin 0 -> 52214 bytes examples/dataset/load_libero.py | 18 ++++++++++ src/lerobot/datasets/lerobot_dataset.py | 2 +- src/lerobot/policies/pi05/modeling_pi05.py | 2 +- src/lerobot/policies/pi05/processor_pi05.py | 2 +- src/lerobot/policies/pi05/train.sh | 11 ++++--- src/lerobot/policies/pi05/train_fast.sh | 7 ++-- src/lerobot/policies/pi05/train_libero.sh | 19 +++++++++++ src/lerobot/policies/pi05/train_multi.sh | 33 ++++++++----------- src/lerobot/processor/tokenizer_processor.py | 19 +++++++++-- src/lerobot/scripts/lerobot_train.py | 1 + 11 files changed, 79 insertions(+), 35 deletions(-) create mode 100644 debug_image.png create mode 100644 examples/dataset/load_libero.py create mode 100644 src/lerobot/policies/pi05/train_libero.sh diff --git a/debug_image.png b/debug_image.png new file mode 100644 index 0000000000000000000000000000000000000000..c2fe742c8eec3fb378e2b4097dc4ddc5659c5092 GIT binary patch literal 52214 zcmW(-Wk6G38y_Kz4rwMa=|&o9hJ=zL-5^MJGeEk#I|M|!q`SMMrCYii-ur*ghYh}L z_nv#s^Ze>8R7pV^3!Mxd1Oj2n%D_}WAOzq~1P~Yzc$>x*qgQ-j)0VRqBaVZZyyy(5<+hHJFUWQ`*p zI7QU+dWBH><74}?{xdZMPPKtl0Ws%~il+%ZXxjY$*mjt?5bAe)({B%<#KTi&q%BaD zYb-x_XgjzyHa1R_lL8}vTJ+a3#Qo z5whoo5uAPB$|5;o0U^K#79^!>i(auvGJWKd&k(ku7e|w+Kp&RJ9qHoYqL9IF|NQ7aWxlF* zF&@ns^nChr*Lz~=NKQJsZI1AT<@vAo4o+XnhI+4lvE=CeG^KeOqHn^~h0yrLj|BKf zS}2Oh5GshHl;a1TY+Rvv9F0As$lL-21+Q+&`ay7o02;PAPvRc};}#GoPLPWWcrn}C z;^gD2ud8#uIo37C%!lF?m=AI77M)3wNJ9FHXDlSZ9}ZobGYicj{jGY6;Lg_uCP^xY zO4v6KNh2?oWj6}R0n6yr$m|)?8PN(wgi@1#{v^z5d1=wRjC5+Nwm8TH2!W?bNP>*I z*5X-bD%B}S5ijL8e){Kj+Cx@vNa;wbb3v$Z&)_=)TtksB;A_~W2UjOW=( zAsTNl##m6d!xLn9*u?f$>-ocA_-3+2StN>ah&_peR>w_|`Oruiu}kf&AxV(o&pPkJ zs(w>b(>w;hw-QT|S(`|dBA4Tm8y#zZSs0?d5xbuz&ZO2spf&!eUH7O>f*z3XlVy#8 zVJgVS;P&Hm0;jm;sF*$sg*h)n(D~PNnT?Ij?^}*Qco~Lm>XX~f;g^~jm-z;9xYh? zlCFjZL!#U@MH$a{&pY(-3((qvSvLH7!3>z}IV;{(pBH!^=?4@LxO?J4XxL?nJ2EeX zl01l-8K+eb2gH;ZcJh!YS5~Pv_>KYu3gwoqr86EV?<(huGJf#-AcXQ{Q=d*V7>Gg4 zrq`0fx^BSFkIBbBl8Fj`?-up;81ne*_F__opFdvY%&_M+kIGjiY*2K#u9RT$t5};f zWZEF(MHwtgu+J^k@;-|Z3B%OIo#14ay9z+6Z!V%4bIbg6{SN;HqH7=~Xm2}PJ#T7y$i!X(j4ljicIB}+vd_#OgZ}@APU!lyY zv;8Xw4y-$n7`PK6#`yK-=TEMM&hz?&^WvhcIF+{3E{uBH)$+Lm?f(zVIu;)HEaLw@ zD@C9(t~*DE=?kRaepw70Y^@{K^{rCylX8+V&2Fl;mEu&0yow>o2j!dXPA&FsoyE}xlq!n?n0s6k#G|gg^*$mHD*4a-_HGK8d)p2R7cC+m2lj-k`$wi; zy%z2JF3yZ={4uRijxmUaS%^O>zs~fpqi(XHI^$P_pSF_jWG(5B0+^CeLHPaU{&W$7 zZ>)v2b>xd#PP@;`^Yt}v_~D3N({eedsh5`u<95^cUH6fNA2Di8HAafrO8tn6BtcTh zA$fbu`gc>IujxU)c=I-YLTX3?8iOg-)=1@O!?SVTSyJc?iH<0i9&6$B!Ho>X5U?~(zkb_uX^sG4PHS08n#c9oPld-bM0L}IhN!^e|MAP_b4P}9gT9re zZt1srB!*~wQk+%=Paa%pkROvLu~rfeD7-T+mP7DOaImpa04tZw+)^jA={i7AL3s?n z=E#A$pKaKGXxjw;4wPG$VJy=e^lM9WU(BS-kC}nry(}yg?`C;=czf$v%Ks=UrL}KB zFu~QiU)y)fSDd9pNO+sl4eUZOT|9>g%CnJiRD>T1YGiMrYCf7e$L~SZ$YLlr@W=0X z9VFd-&Oy)6)>@^mY{zwP#k|VjZ|TZET^%upC8g$LKS=WaT1>1~v<6Cxx3@^t=F!p7 z^0KZAoS^{OR48q?Td{It+|saJk3dT6z@>TA(&zbZmtD_m#NxF4fa4}c1^VWj7liY| zIH$9SX`9%V*&+z%WgZhDD6ElV%2&{-2)hyfX-k9bOvu*CDneJ{vFynm`|RP;fSDYG zMuZ0R&iIMvkIv&tdCs2_7PBj33?e24dFTd1EiFEg^=6u7wK5S}#8VCA4cV*m8wB-L z9CUvv*?D(f^UT4+GxLpmUXrCibxIsYbXaygj8U624vBs_bkWAZz)%#vQY}zHLsXQz z6be@U8XZe9eBkt>&WAS#=PlgOpEw+GJml=o4itp6vhC2Q15|wH`YCLGDU zXE_$`8mh z{nV8Fi-nrCc|@{zN(UCJN~n|18=D_azvpg#zx01<(>kC6Thx(hi{7eZGGi8Y$uQu0 zzmGp$|F%J6NSd>36JSWvZ=ZH7jx&t;iM?)C3n^A+`sW^%@$2W_aAE{8OV)z!gzi2a zi1|8)ohnhhX7~3e8E64Z;;(XYnRUkf8hn-7vzu5S%bkBN+CWp(fBL7cJNJqMmXAG2 zF{C`_aHx;g%oL(d1Up2%yMC1>Vj?*D1(M* z8CM9UQC+uQMRFnD$2(AmRVSIxy_GnNfd&m{-zRzbs^w{tZX1@NClF3P-gRdEjC)EU z0Kp2)E9RJ!hod%Ss2322sm5-{{Y1jKAAPW&mInt1ZM`qjOTYLapkm+J997QYOm!W- z#%{d3R&Qy=lnKuMmy2tFOvxWIAKmAG(xy_})0e&Bh)XNxLW|j*hZj%1au_HSgNrDJ zGmkEAri_Cq24(V1kRgeODZ`NaOyWG!(zto(i4>CkvuSy&LetT|6Q9Lqc2=MDmZ(_i~~C^^YF^w zia$8_KA$$PEu?;O;F{DP#Ef>^Ha@`^Ktf5mt3d`bXu@#M!Fb&cJ8>6e)etMkB=PSf z0m(nW3;Imn58P-6<87N>iR^F)2n<>UcP=aJ8+P>m;=D%3tCC^}gHnflSywCJ5fS+c z$BqES^zUjWyV#GxF0U$lGAAXApFvaI8C_Mx&JkxFb8qw@Oe?d&9Nf4J?kT$vO=Q6k z9LR@_UB~Sha_B}*8ZcXW9EDLI&QEG3g#Bl? zw+#n!FeIujj!#nqN@@RSWshYcD09n|qa)Xzyy7{xKJ=q}V^ zy?Z(ixev%=;YJh|amMcOE})U+zb?_McxY>{sd2pe_l2l=;c>hpEX1&dc-!bJIrI8F zPH%pznyiTKy70~!0yOE668g@cdMAFYEE*MNbNq!U>s zzaSryV>8eEWoSzICh6Gc=|CSxDEk#P%p~Ndg(@tM13g^s*UZ~HNw&XS*kaFwN}YGT ze1{(~WTrnA4ne87wSyG0GA@L6sgS9V#X8Qt-kPFY?ke{YO8_yEn=8rQjE5@y^B9^>=MFQ7L=nU1&-R4ka_Iuvbk6iig zKe73F7j*c~$Wy9h#>n9dQ{ogqnjZ+%#bLsfQgBUMRWO}2(k(^bJ;XAmKqM-fcYV?R>tf9U%@2-!Wwu&f@k{{|VsRwAuXYY7ZS1@R}w2GWK{N^KHu z=X#C{U0^!m?4%McwSPSaw>*|o#y{?vBbTLL9+=g<-koFbM*|>+bsC_`Ma0kY@xip(4`|Fo5j2mT zB%hfQ$FkstuHlH!Nu^dpQQW4%-hVlB0&`U!&4$SGatpXGmigwwjk<+ zmLs=U#oW^Jf8#$qDgdX6GETz!cNN6A<+Asr$>I<0xTeH7P_0B%rXE`unlL9r09ke? zNVf<-9M)v_c`!!18hCAT^Nn95Y@XJ;<8x3M)h}(QDDgJZ$(kZow^@Y0$Q4&raT;Sn z8_S0+gez<~Qg0n8iJ&+qGQYiUmA^kze`z*``ZCfG5twoDKQM%OtrAPrE*-shJr;U- zyb#B&%xzU=;z^emQO#?m!6`vD!=(OfQS}X%C8`#ePoDq{JujBG&kly5Xl`n{(-Zny z4y`OW{v|(ZBbMCwM}m1;90K1dWL%PwbeA#u#DL{%<0_(kHn%OFueBN%7Z(gUrZFZ} zuhP$6$fvhR5c}N)PE=mP%TEq>+S~QYkpW9Pw3&k2u17xIoRK-&jdXC0fLC6NIj(_+a+Y;rdXs%y}}_X~15_ zX7~`S?BG>W2T`)gHA4L@k7W!Vs99Iq`udhi9i?2S(da7@_TAPusEDdUoxndWkyd+| zy`p>)zo6%q+g(GM=QWe4Xi%^TV(IRcN9*?Xc2Tx>S|l}ys^HK`(7h+>_$qH?Hde|b zmSRK)S9=z&>`CPa;ivA^;Pnd70g{rXO-Gp&MyO+3qGdf$m;jZLq~?e6^RxP2bOhQXn9 z!-%+}G^8ITrns$j;L_KfiXgxs3ujk0ou%h()p{g|Ls&Sokkd;r9~_P|Nd8dignatu zGRYq|U*;-E#Oo(EhZfTJaS%etPrZufa!;U2@P1x2-q~AKD4HIXxEtK@GTFvP#}k*r zR`P0NAo#e|U9;kETC>kYD5cz};|*Y6Vq#*9OP=@^((@o__nAr&DqwTm0g{4GaWpE7J2EbgKad##81}|hkQIdV4Fp;rXe5=^?!c2?y}&`b4|dnW z!+FpUhOB+zSD~tX%Du1U8z8A^X%XV#>CJtK+6*upnCNiET0C-L|4&~s9^J{|9`~CG z{0T?VY3|B>uptC7k!%7NrSE`c#*OeMtNroX9-$(QP*;tEj%= z#Ow}#F+RR%SsMEmyzobDa-cOUvxk9l<_-v#n`%WLb7iOIN!Ls;h)SwWVx6~9d%7KCM{9Bb%EeA~uTwK^by%H}}sIMhrW~~g30{3A5K*!zQsHlMYYL#H$idnSXo)k%d*{fQhR%Q0g%t$i9BZ zQ6aK%z5=H$(e${xedK6}tcXhGwRo|(_;}QFTUNY~n$k{Ghl!rp!ZXqcREZa5*OORe zMq#`B``UzcwH!Q(!?udU2bSe(h>+Yyv+IdP8L-m_i;If^ZbYapKx5*%edd_2=a) zjTZbNNinFTHkcSV&z3;V1R{MKfD96sjJTBS|MTb13gr%!=Sx1MAJo&`>@8Zr`G@YV z<19n~bb=VZIHZhOcX4sC?U1_djbfvKTGe?UA*FfS;Vq}w=#$L4%{$Zq)vI3;1}ODH zjhSZu*ICXOOawKemys^hdl}^qD^a~F)z)`TbT<3Pl4+X3A{SJ3&aipKNfPHjgOGmA z`+?ZR^R+ULu-VyJ&|2eemT@FUh4we}&jwlRk23{x)BwoK1&gUig<;Rmhe%?=5uhMZn(Z_1|2Vnj}h~87!%26Xf9;8wtRo z3uKVFgzFRJ$%h&FJDX~jOq$tU%N6s(xs`|XJHG9{#lodnk8=9ZUx)`xmt8uQ z%RasAhD;p?-#96CN^b`V)MOZED-Ng9nx_92SfRuM(lE<6{jC;t_pK*S*DL7}vYR9b zUUO0$Izq`e28s()p6^xu4va?}3Pd3pp3IA~PxVSu{Cjji>r*^w?YH}W=9a)1`xhaw z#L3Fa>RXx5CZD(eppdjUU%EBGrv;~puEy~SP<%h-Mq~6eVQ+_~2v>AFL9>T7Ch zqAkd>EA%e+BaP$Jr9(k16K^-h#;~F9F3l8_85@HGBORDgnvJQCU5$*ob|$k0o&Wut zDS?Qcfp_l~Fr)POuNgM_{{8zWskrO2xrxzK<3%V=#zwkrdHa=;dXfA02vAHL9S^h9DNZ% z=@YZG96sYXyER`y!)KSej1Cno<8uQA<&pdHa&%2`AK1qo!<$lS<5Xw}1 ztEV@Bd?^uf;GD3SL(Q9@yHf)DkP?+AjMUBy6d zeHAXlIfRS|FT6dlz0!2TSc5B?`-AWEy8itDuCEj^@3T&;$4vFJR#_k6cmA=|eVxg6 z%gCok+-rQH=iAM;6Gw7dWBh)5tB3fP$Vj6ue|fKi_lxZscc6X}INodcDt6$G_?{?5 zp)eV8&floP8F`Icz(-JJ!ZWN{ICg1fd7>ZGv%olFKj;Yhqfp{(VIQmA!=dZ+*bh*P9JlmAMtYQmLP_K(doL$aWc$x@;_}uk1 zHSKk80M%0hmgMuF>UN-$5v*&#D>-C@s9$>*Q>2hteXVq$>#cer^vEz&3h&T;tReaR z1=4mR`YRREhaP|$A5G z7v2=rWLdu#b!mq5%YJ@a5Rs>9d72@XxB2kZ^5{*#n7>#c7SbaWX2qLcP|aT86ts`e zU0US2qZ9l*u*JSclEDk{#gG0=_3X>`Gnf?fb=2nHR!?F)eUE)wUbsVpLj98U{~e@d z8^=*z1``g`Km!C2m24abCOsXU*J}L{1;5;7ZnArZA!m)E!sd%WexxP&VzylqqPiam zIXO8cC4HVv{jkSN4zU$?;`(0ke|FSNLjc3lf}11%B*nY;--QPH&Kt#E-WrOyyo3|u zRJ&0;uttACRgzn7_2iSqSM#}B8=g@qng-bTzLTKxY&ToDP#?+a&G2^hrp!*2956w%7Ih7^ zc)Pl|le+`-!BM%=*QXkW=lCVjDyaOw8WbN+XrbFb6-6F#k-e`D^goxseIo_lwkVi8 z03_JzoBE}r>ePXE2n-q^(qD9RbUQmcDThe*$tvYZ7e9$SGpGyV3sIDrXzS=ePLOdD zHB4MF5~M!g*`SYApA^RIIzNvyBM69PG91V9uJOCSt$}wlkG2SpS|L5+CiYCA~RD{D?x-ET5{Yo<#fJi4&2z+^JVW0 zBGm!z+B%h2HJirVjs!}EtH}vON#>+dqEqAEY-M;E-<$-7#CEY@w|*@3{~R|1DA|M|upfD6!3qcSyPTi;FoOa(K* z>nO{%>ZF1eX8j&Q+BW2{hdi|ToNo>CNA(haTIF%?$5J@=x>>PfQ3L87SBmB!py0W@0!2I-hII8!#;PY{GaF`NQ z6k*32>Kaj|eLajEMSVay=rl+f#OEVAg3&4N-MQ5-DWpttJ>LCzI!|_eS|oaE4%`FN|Q6$0$wPx0q|?T#X0jYa|qop$f#-?g28KlbhrKaaF_1c@MD*r|I>Fsxuc z>@(nu3=26}%Kt8^+8A!zt*hf1Yph935P8_)L=~WQOYxc)eJH<)40fMG>OXs9s55ZX zdb8rFd(%s-pOKY??FYhxudc4Fm`;7g%1L^>Fb)Uj)Mcfm-5a3@RYS+nkJD}2LfseG z`_N$~x3AsbbsPNoklpCmeveV9e{8nKwxUE}ardJ!$F@-i1;mS6HCZh4_4#r9Md-6u z91J{py0Nq$=U?aMZ< zf|*p{D2vD^E0pbR`W5(%uJWGMV4Fq1y+xf?vFb*KqVdS%qY$Q}A(8ca)W(4D3H=0Q zjtYjMXd^EFx<>m4!*ZdHvI(8JR_BAHuT&A`Ntcj!u#*~6edN_%5s~-&*!N-kLw$WH zc&+#UN&vS76TQ3y*WAo3*qD;PHS;?8y1uW6A*^ZHra(o&`QIO6-hD>dxXjGVva&K@ zMZAh4(WR#ENMcoGO8l72hUH)~Qqm&Bn23w74E-haZ+gRj#x=ab@QdBUJh7e|f}?+$ zwb;OhQkhy!({1xf+wiBv%(w_7lnD&%PowUtnzQ-N*O31Ik>i48GSlkLdgQV!6_42KHT`aqNdx*d0Bdl?mA^Q6T z2{LVcy~Zk=o105i0Ul+=V`94sTe9$YdS)h8cf(wG2m_{MQWkR}=WI%(x#gSKvW*Jo zin)>*i}3JpLx>q+^>trPhhRqe1VX{n5&u8LvIRqH>!Y2~^!LqJD?BcxMijqI!ihQQ zBBG-K06x8JLww$lvw<82#f6$mX`_3CET>tR&{C2cYLdkJg4Olhzrx{fKvos>g;cY$ zyY4GJJ%DZhbh{Z{kf2_n=d7E<^yeK)WE$ibrAUHMuq4eVT{L-(^Q78(dMV^&K(AlFwkmaNNE8|BjQ81$ zofG!}Y9z(06dwOdk%Pc3P>RsOC>A!1i*ZNlD=Rw;y=14TeYt7Xq7XXl zA#=`kvtnX2)yE|6`)r7z3^FFI>6HdZb?Ite%a4yOv-gJ!H79KkY}1}1R5mb!Im_gc zFRz|26<;m^^6CY!Urqn$ygdVyQ>Bdc@3*Hh@5Yg`eN+QR?ltUnnsNQYPdT2VHdDA7 zo0i$|tgWmrJ%n8b08y}}TlBgAg&*v90zdJbo}R8~IY;+wOJRRqP@pns`du@d7S)rN zEHX7UbzwpCK#=yGmL`K^2{K3`AZJi#- zPa)zdW&(8aPcZ;K_@fY1Vto@50kYe7YotO#0M+}nLYU>C9RtVM#)GNtqWD_Ql~Ws~ z6#~;56KukTWX70Xlt6=K>Y)KqW({J&W z@bdAUthSHKRkj8X|5~hlkDbGS@=BHwX#7uickcc6&t3Muib(eeV)j|6(+_}553pyt zk0G~DCq6Ge&)F}#RA4%K`hzP$JosrR>WH;}4oyMn+`)`RohsAJf%EDO;CL;4<1W{4 zf9^!3WMN|)8_fiq(+X9lSw$dUCIDFfM=s=%K@R`b=MlGHmd)e$C$YFK?6@rrx5gw; z4JLpc=;`V@KZ(7zyT`zJ;9k99P7IR|G%OA>ypa~YSB|3rwx!QTC_Vq%gnS;XAH|_1 z+f{x)CDlF}{v?u+WgMi6&lN7sNprtMWWa z`828CcAm)YbN63l3(!17Z#!{H6S4kFm{D_+VbR5}KJM_PrpPNO*x1?vkBcs}cdM4M9f3ZvK$l`0u9GEc2QIV`DXM|8lOpNd#_rJA8Da_?cQ(;3kwH_xNRbZMI#!+VzdCpwq*G{6}iuq z>@_I8xrLyP(v;pT*H!pUUnKc;{io$d{F1Nokf>h5TYep4JW^ZDsEq@`yFVYxygJ3R zgPD?t0W{p~d_WY=U^SSeq5zovvCq*jx6$1kr85?gIRgwH3~KQA{OY#HZFbR%5w5>i zu{X)oz6-BFR7M0+BYL+|G08&WFdANaTs*2cTrraX10OTfrS-mpyINA(sK1xx4VqG4 zzJMo>uLWCU)*}kU$=f>LaUb&t5N7RG83K7DwG65`*Ov>Q=W!tZ@n@z){q9cdz=8)! z9;p~K89a{v#Rz`@VR7q81ql5eRXc2+pPwHs)eEdnvC&|5Q-L*pY;9|#s)0Mbo4Dl{ z0{hDk$oXtW#>a;hxw!YZ9BqYL@YI0f`M2FCo3%f|^A=DX8;80x-@6WNzf1Pol)zzW zbZG{Xf8{6C8@4akw*PfrKqFXM`Y%Za1V}%Tk!JG0kBA;^@=Q>9$9KVrYS0V93j`T| zYF;)K+n)|yAXU}*{e}6+MPqY~x?T*dTrnpw6Z7h;<>4*~IrVixB`%)yuH$7pJc_Vx z)onA9TmC=Y-}qC_0;ZoYmVSdMA%D7PjtbK&-s`tq2rDIW1?LypFOOY;8080TK(7RB zycqJ3L-O=dqF|&ed!a%Rpg3K5WWKN@%31lg!5^;Y+Mll!*+-AVan~Jhb8S{yG!F%b zcKiT5EMh=Mvuu-G0Yn@pPa&u-SH<-0XOXtZ;&!`Z0I~xHU>>=+x(Yn^I4`RdtFk4- zS8w3@jISi@R*9kK%OmUAG-$qffqVMKBO@c2^eT%cWYl7oZ)u@%vnZgL>+_(W2I-=| zunn9kehX>YrzVg8P7s&(|4KuY$}c!z>LwWF2oN=(ooodX>)r0~wVRhnY6pY5OEP^q zL*i=tV7N7S*VG@BosJgkwCipDt1JLa&hW+!qDFnsLE({Aa#5J3)WLjBn$2&YH)CP1 zSMcQ^8kN7q-b3%oE~$9qk_tu0T&%DW&4U-zGUWK@n^Gg-Da2TD#yqV z#$Ue{On$S&5t?V$66*|N4Nxlo2qP6sK?d=+dFy)EHU3qf_sZ z2wLs^Cs+IP-yA%RPCHv;^Ft|e6P)gAGDk<k!CL(9gBhCIGe^RJ1=Q0&3D!!AD?5 zjTuakVlx}d-u5`O%($wntNWaV>-X5VR97Q{0Q*&gA^m;dA|>`Q64W6t0&BU(zqfI` zKxZhQEE*jsyj7!YU_{G*g+k-YO~DbI07+FV>9v3S>o_h9Y&`V}kvbqu@$w9ZqIYvd z8K)N_Bk_YCzNid#IUS!Ts34lqI?Z!cHZ^%{_C*3<*757tz(k2zI(FTr9!*p&OW#k9 zd!DfZ4TT*cy37hV7XeNK)|sfnLu#~DA6(P_jFWM#UYGnAC2GGX1hoJRq3vXRbX2#= zsaS`NYuca(fU%T5kDNEs4`=2y4?+N z5DqV0p?R1Jq8Nz_#|iBx7_bsl80F>VpZ0*RrueciYHe*@wbPM?rU>vYhen9hI$EdDjgQuMI5{7C&0M{A%h|I05`Cg*0|kqcCfl&zmdFYr^P-`s?+f9&t? zm#9~ajgPmV4>7a1KUQxhdS-r5Do0qm-T~Bfi&nkef7~JS=B{o&hCZ62*k`>$pJBxR zR+$T$mU*?~Lk2Ed0s{jhBkO$56`u#69&Yermj!uEA`wD1>v1{3ex@~dHQ7&x?^o}l z-X_w{yFk96_5H=^*l{ULn>G5}@_DQ3la%$+J;I?;xOQj9Q0t+9E`|di#+J)?r_My4 z*Q-}}?E@wabYX=2tdf=LZe~{bk$L)Gsm>qSr`)#A)0u!=P`QwZi1+j3-G7q#>eI0+ zJv}{_KBkgVc^WrBo0*xJA$^}6(l&rd(Q>_LssFGzCuSlsXP9y#?%7Xp zKa$D?v9`2)3LO40eo<0b*gR4o}uZ zjmH^z!Y@>MKXVRQiJ<~Fa97kJHkQ9H-904!V|PdTllkAn>Wc`p+U=>#7G9#m7Hrti z*tpNH(5R!3$F@Y9l$4}ZM)c4X!XS!d{YKlXKm(Mi7=jbwn(f>}BhI*ecd@HG_f+(9 znZ43r@1Lkp_S({^-YFI*&iY-(cbkay+Brbl)@iUa{5j+~(MK5iZPj`Fg2LzV3}^+B zkyr|MtoUmp>Y$2VlvGW|z}WAh!g!oLHGN%a-(sr>?jo>UnSX6w^Trax_M267z&m=C zdKG3fC_A7G&hEZ!fZSCsDw#0)eDC|Fd`cn-wDZqEud;e)S*P{>{d-L7s7<>8Z@drz zIaS8qFQ*IU?C6p^Jh`{truToT!!M+C=77vOzx_tf`FShl^Jy>uO==7ibpoeTO2d$M z>g*3=RCah~3G<%U{Ba74igry+bE)p;;f#G+*Nqsr3N`I}PLS(DdU`hfHl2z&?J^=z zWq5K`D?gTY>2woVW882PXE+$MKWbBZ@JEg<0p$mn6c&#n(WWT+hgZxqJ@(ON$4zV( zz7CC61;reg1w9-QniF{}#O#~ECeefMq?%Rli&t$+e21*rH;DiKR7tIfW5-3QqRS?S z@Pw<+aK{j~Ix&f!$#BhHJt(oY-f+12DK4Pf8=!Ay4aAh+A5ahJOVsX+IgFrNO~(KW z=G56*kL6xyF#V zkUR#?zS6QXbtb|xG_mAi@%kkxza>6f-4?f4T_XsL!|3VlAw8xd5KXSJzrHMXxO)%4 zmkK~s(X^`kfao25@-WNW%j6xagw=9^7fw3syvC3HUn)$w`l6Q0P|@!Rpr5NcIy!)a zN2E!S@!Qky6+V-lYC#5GH{uhukGC85gKBW~270_9k$KoJ^6Xl|FQ_<6L;bzGT0BwW z0j$4Zm!9o6ol~*839)e(!At-{9v&W^s+T(e*&zOm zX`qx8~^?WSYkd<19>RrD62pR3S($W&}#OUk-BX56ZB^EGImw-J~fp#cip!*bLRe8>giUqh3?xMA8dfTZMba8H)z&I^G)AYfW@q zJ*nJ_i`Kp^IWdFZ^3G47$Fk&eHP?eIu<%|jy@<4{CFAHB%TMBaL0^3vsz zK$QQ4vX)daZ^*Ch^c=aQm*{Dqo39V@?k>7|cN661noYP;NGBp&aU+8&+j{A_ovz&otD1Kgo14F-x(XySHV!2>g7vfyGdP0ijZgJmrC=>_nr0qN8{ z?f8(JAJNFtG8`@o0CWI|^78VCOagY18q1yQB8+HKIenZ_{oq?9c}cFhB!t?dyy*`T1G z_jUYcDGU=d1x)h;HQB%F1Crid8wS%{;Xe=^ThlMYEj_b z0FjCqVVN^v89E69FF@GxfV`o(dH8xXk80Q)MN#Oi=kk&}`Oo%-Ca^nzHU+R17=hGD z%SBWIz8Ejr(N$fhTtS`^GB(SInx5OW3f!~bS$9Hn2Lu9dg>YI&#J&m&Vjv~caQY1m z_)^GtV@#zdGo4WFto!|$OC;jNT~WQyFLuw`2}xozZm;(Ih(cYzL}iq;`m=5~ z8G&jtC?v*@1JmbZ^=WC=Wx8aDMmB(30{m{P>EB4|XE{bjfF(;8Nq}>Z@sL*W+~wAk zG)RS9A6{|@XugA}xWDBS;z3v%PD^D{Wl0f1zEqrjz9Tf@{80k64%W__NA;_Enwp!d zD^1RufctO^1c~JF-{wu2IOv=3h2h15H~FuHWMM&567QjU$p|1Z|Bzn`R!MTSQDU|4 zkO(*m`449a+@}L9Q4R zzQko-$S?ta)Wxv=^RLNoG@Sj|Ob=6{&zqv&>w&~s@PD%JnLjholqMj7V8yd!uTGx{ z5;X?+l&ea@kIq=+7vCSg_+Mvlbis1>unu=Y8Slu0*2}c(0d#@J4RyHn#f8eosT4bH z4<(lV^pHbL#7*NY0z|KaE5IA~yh&2bPTC#Uzu$^i1WpVt9{tW$9f<1_S zU(2i-5{Cz>eHjTt%GhX`a}dWHLfhtEw8Y&k@0AZw|;yWa?OY<=6;S|ZZFA4622VXvXk4uTluZ~0hzs<@;;=6#|i7M75>w^mk*s2Ka$ z4U)qY=zZF#cnZs>Z%_h4o%ZG!3& zhV6?SFk~`_+Hrk!*yb(0=-uG`>@_emDw3d%g}9JC_bdd1O>(@}vp#az<*v`QwEpvX za{KiZ&-ew$YM9YE(oww6aR8_SVBut4RA@;7k zKAaA~bv^!jx4ina%r5-!H<9__t7^Gus`XE0IXpj3ln~iFy+(IHzVxSBTdCK2z59bW za9QN8sNp73ytrq_s>c@@Z%#Gno~X30*cOtEk#Z#HRAo(i1+ftGu~ znDM!;$$lkn_irl|5ZeFI!1ou!v(CNx)qfJ0KH|kT*PA82?RnPe7pLkLdai8{^pudY zSPdqU?5vf!Y(y?w?#qQeQB9Bv9{#n$PMakYr>lDIt?<6yNw;-*jRhhj#3QBlG~`nv z>9ZFALl`&t=|BoxR9*Uy8&`bZXW{MFbI*%2!^9{>>W_}dUX&qK3%0MMoe@CwDYJ_V zvwhhiU6eoK}mifhxpdAb{Ed~o3K*z(wW)akYb_aqM}zD;PGkvbI_f; zfe+Q(Qn`+TsT;-!x|;@vzi-u1Bll;>GBz(C_w@X?M*b6}slb4K(?@L&!tFo1ysRyg z))f+srwu$xKLTSLh!R)$@aB)Z2^uMNGL32viFyD6f%o%$x)!-gloURq-(L(AfxibW zhS9Ug2HcY`=k1Rb+wB*t83K-dZ3WTD1nfi=kPiebHtgGU`v6opn5%d_IW!dZwMFT4 zYM$&ntjF5!0`pWDp?R+b8URpOv-bP#13+|m9;ze8RrXI(AzO^^I|{$w_^PUWxL&qC zL+Cx`qtFqVEjBt)2Op+1IJ_}j()Y#Gop>xLj54w&S7_(ib??=R?g0C8DpeAA9i zLCzZ>6(V9bJ=8+5w@_GM(HrLP|DV5uf%o4m+PX@Pv1(_5O4d zH;McKX)E+$cCCB^QvG?Jo_owg+vfn3B#_cU2=L^otcf0Xa&~rhcfY$F?A`c|J*)4r zw)n6E)UH-NzP?95@Y2%MjO|*-`e!_F&4p2Jo<_!0y|+GQI{S<#Yl-!f^-t>+a3-ex z>3TX^-wWs}Kk_&*#Sde7gJg$Eah37*7>=C<(PM?!fd>)P=8TU9lQp?ryEn+(+;kSP zlJfUxeFjpGx`1}?<>h5&CJp8k5g98`Db2J`_6 z&6QO_R?wncXRN%<&AS#iP$if-RGk0S=eP&_ zCc%{BG6zaz8W`*W%9#X-A%Yq3#2KYxeh4CeLh#+3%BMi1rp-xEiGSYOS$5nV18if5 z%4Dlhe~XT1D+DNFoXhgi8DQP$>-!ufSG-oPX&nB*gw$nEfQKbSwTez%Hr+&G*5w`D zx$dDhiUi_Y`Ud)}R?KXVB|&3-77%9D zsgj1Lig1I|MiR7se}BKVwS`LQ)nU7SeU@Q0vF~K1j?GpyCVT(R_H|@Pkz%%*TrBXr z0Ge$+wvLW9s!ac#^?@uFB-C;ZDq!EpN24?PRf2hNPf@b*unIIYse}i7uLt&s%+-bF!gv zqk6f1v6VkG<)oy)NAtikJ7<%SS-Qq)6Icd-2^3VqRO~8Wg`)NK^QOP1a<*NhOUk1p zzpX#kcYAhpJOw17?>=WgP0~^s03v|@VzPL_VES>QIGoXs!hw%;q^(DbZ8Pi&egf<@2qnVw!>nv{f?7y%?sA)A%wy%iOe z^<`NiVQJ)HHdf+nlZS_|uhf>vvu9&zUYGl2no=8FNSGXL7`!RJmJwipb3)e{_fC9-Qw0|?#*mY7 zARugQLS~2!LU2GCLe|0(q7Kt5g5FR@;u=chOSaHp+O7(QNmxfb%@8jD^=C`we2XJx zO?4sY&7a5E(CDaWw17jy(eeJi^GlBWT3j8pS}sM%e}RhS{ogJ4Vlp0C#VCGvrRL@| z$49hZ9TimEoIV;$Ydi-da5n3H>TC|SmojF#&n-hJzOM^bFa3AP=<1BiW;UlZdvDC` z~i8$_z$TP+*ib=%&=$hkY1v6jD20QDUM=O2IZHZI1w@VOJ*e@A`kz2Y@ivm2QHZ;G+? za0fM99ZxA9{vOsW9yj;BBPqZZ7ywuPC}fMhhO#j=5F|?v{0yJ`P)@Rb@i=2tJlu`c z7J5-MrkN(L{nbLM{EWfS%@xd-Ei6iPzUFk~SWkaB0qr?yJMbG>TINq}KWymh=^q|wpXbM9g0y2*V*@N z;E+Nv&B?C_(TTJW1dFgKoB*?wB$OFDgxps(xgOedFxquj=zog+K$D%~)euj-?evGzY)b z?(4n(MS_opLZ4##^iS>f=+gZ!f!b2R7V&@QHrt-YSx;E7vCWAxE;~dUnP=vKn){kQ z#keTXh!MJU4!PBbvF1X2SOx?e*z3afJ4)K~Vrgr>N8Bb$2%#}IVNzs@P`(jkr&D|m zaQ8Kxw)2gSjRn5jtnGkSLf)0V-ob|&qP$soj%o~nFHv!#t znB(8Ig%U!C(6YtCyJ9VB({cr}CSBz2LM${aFnK0Oy<=Q;U3>bALTa9VcdxtwX~8>q2s3MDApKGPiOk!B?Ds{+wSO-U`nfk^ z1u9>V!dKvA>PD={rFdIL#1a7p(+0N!=Qjwp!?Pt~ww-;IDNH&a) z%0o!A+yA)#Iz_jwz^Z)o%qubx8ent zt#}>ji^E|kgC4?(g*I36rSPBxracb82&_h(0-{z?UC~KZ zd^L3I{pSYXg9M@I1bFzDv5jh#b@KQwIM&19&Bd1P6jV$n*UG=o<@qNW(1AU#Ace`% zcWzs>9^B!4O&_YLyYI{ST2wu}OXUxVtM^18T4`*yq*HD>Tb9_f?p#%WL}UM@?Xoq#GNoy~roRP? zd2KC762w$-B9ig9+!;gZNz5Yld{S1`p#THK^FE##5Bu5a={Lp=Uc#EHW3jo`)KwLu zZ1J&%iv+I+_cXrG+#{gd&F1)Xgl^gH+NcebM}6mIYCnzXD>6K z?!#H!!s!E3Vj4XrSzdKu5Ct#JKs@A&L~FIr98p=uAKK)oQ9U@&Ms+d1f_`)YDC*r^$B*QuI&aiU%gQD;-6*N3Sb89cT2IT zZOnMM*8lTBX4*nX#c#?rNir9Mw*DJ@H%TD9#=?{;sY-V+&aeVE++$Xc()n}!r*yNn z%6{6&Y5jRu7S2stFt`u_RN={F4Y4q$de3?4}hb)2Y#i}-Kf{JnZF<8w3H;5}lK zq{T0i(h`HU<4axZ(|E-1eKgUfWLn^v68aE|WeGTf-6AjCjNrGfnrc989C_)WbW{>O znFSSD%wDGnsn@vDfAo6JM&TI-XDj2U;KXFV6MoGEl23i2jmINYCO&ahy4Yed!*<)D zW>!PrHQZ8j@3BqszP7LkeQFuQRguYK*J8%hd^Mm}b5ix?>r?~Bxc~9Sk8(?%o~TiN zqZ2P#+TUqd0!@NZ%;Yzv{yPtf_dV#_&wxKm@?h%#%(1b{uqoRm@jIQMvQNz)MI9QC z%S?Fg-*@67pf*kv=s0ck2SZksg4)v37Ty|gVXAW;tt1i#TO{lhQ3t2qFl?F8lk{ z&+t_Yj#9$9<8#Jky1QypAvH99-RQNgCSJ7G<43kvmNK5(4p#+DY;ie>%9AcWRIWj2 z9Zw^c{a_O5`Qisq94qJ8dqjD;hj#tBV{qnt#^aJVU?Dgm;Dct0-`BY%CinQfqgNLA*P@2v~ z7dR_oOY~QI<;f4&izNe-_P$U#6LXmKJ z5*`{jh(Vyy|MR5ytQpRsv(Vg1Q~a;S+-{DVuE#)jc&+0>^uwRj4@5-pAX3~hrv)Y! zPB!N8#VLC1M14=V-}!L*^;y5)HHObOeC0W>eK#8=H)el+(&;(V;a$e;vo}s#`g|nO z+WMTZM~}^;cB{3xRN3Ve7pmopH$+dIuw{Szad?ycA?YQBo>=94pL66=O`U`?0;b*1 zo`u0AbuxJKsH@vFLu|@i&5GLJwV4Scm8`Ls7HInGN7eJ={Z5vXoaa;j48$@#Nolbjch18Rp6?&3yW!~vSZc?@x4Qj2R(k= zWc0PFR-S8UF;C{AJw!DboIb+skgN_<7SrB8Wv6+vc54AKJ%kD(tIlTiH-PXv{1in(>Bpxt%!We3z+iS5Qj+5g9ySa>*Ea zCrzm)=v?43;J)%ESygC+F@P+H3w+MyvxbTIQr4tR}|FA;wD+l2k&%YrD%Z+vO?wj%vKifh)0d7NQf95ju|PBJ1xd zwIUTJj>wRN@#x0Cn8Yu@{fu$GUuel942_2p>+jy}CEM1GuimocRT=DeAM-Afg0JV#@*R82#h;oT=?l?JZA+yo_9H+V+M;)+E<( z4ni_cjI*6&P1klr&@rd*#5{L;$U9x?yOmc=eo1c-3Ey~rweKbB^c*DV^z12)b_+@H zM?wa+UG&W+!m?wdmO)feRYA+`Kp)iM31S!jt1tNsW*tB6W`+vTK={EbWu1U zLN(Zv!?5TqJ*r0QKp!~+h>b})DQH*8Z|}UEn(*3BSg<9v<^%CdBI)CgUsR^UcG@jU zv7!%+Cp#D~e=ybqRnWw5V}_WZ^%Q9+Igkr-mGt*?dt>)fT!S=5T_jW`NkE-NrMGwb)2Nq)O%{05UV9BI zUSB1V?MRkUx|u|xEY_!=Ur1)kf>^L|QCUO7wyZ#qm+qTM>HCWr4v~eSNR@*h;M}-t z$-HxhxQ|^t|08_~WnWPX{C($}O{V~_Coh{nvKSNwHD9NMgy3qpzW{b+kZ`9AS-g=) z1E-$##E6ZXi^~J`C!EYN-ujAp$k?;u@BwNje*Hkag7Ai)Tiac2^KyR~I`F?I9A

z|KRky^H`KfQ8AaTknwFA`yIg3gvajTvvQ+IU*q0+zW7Mde1JN8UxbVPI3br)^{>Pf zuv;GixE`3Hj2`sM^uMVAeFvDDgVM2V;uEl#?@Lcx*!ubTfqAF3wY8t$tc4mGfM6W^ zHjQj_IMp}Q7=P8xUDW_gug~JXW}u=R-Z*WXi*5l{(L1UAN!ltlM}p^MCvaXov4tgVq&&fCF>-qOiQfO!E$+!6YMTMhvW%m)Y6lyz#Y{c24W zb10B|>>^C>5#g8yq7626zP^guaIf2XMGws2W1E1;>Ru-WS9EXmDq<++Wc9p@#M+tI zdIT+6QCARI9*QtH5T#|@_U=2Rb3alEPh0a$3mZz%$?CP)j;zngR8KQ4c(zqR`T#N= z(p}Sb0{t-Ptzr_#=6n)de{UWk_Wn(dkB{9`bAfi~c{JhxxGHleSAWLa#@l|6j_TDI z#m7)7#oZH=@?Pv~z)YSlkB>hGjI1Osou23dkP&!+Kmo+7n3PF@UMqTZbW_`lFCxpU zVF#t5Mh=sk5C8}Wc8e(hYi(4YkBU|Y!K1zysZg3$hFLh0(S;B8h);6hKXC}bLmQU} zH>Hg}A3wCC4%Oj;5=n>Z_l}N_@z^N@D8@imHGb%+O1sk+w?C+t0OLob5ZSO*dgz;; z@&*ChdJdjh(CLYgxi!7f!$z>IQ9BZ7@}{Qa9&=(4w;^VNaQTG5tJ?jH(7!bAk%_j9 z_)J+s>db&Q;(7&&*@z`KUA>>t67Kr2VvDy4$$hVV0H*WdL-2>c&&OB9bKf)V+5Isv z2tvT7M}W%=UykYB+dp6PAf|Bn>(O|HxsxOvqrUhC7)aZIL6wV(A*b8^A!nx($jSoq zb;A%fOXJPL?aCAI*D2)2ysKUTG}NykM+9CV;rZ*oX^S%b0^Gt)+SUcH&It+bEF#Qv zZxp{4yx?@4Wu0oq{gc@1+c7F%oohbDgSSfb+%E6L_g_Es^WMFiPqsZL%fGm8Q{~0! zI5UN_8E$m|xPWL!;?LJvJovJ3tl#fvFOF#3FRboGZd}i{hP{78Pw&gJ7}sIO;}@(z z;on=UO&bbmyrKws>SH~cXK*ZRo$L^%xK}o^7W*Wv_Ei8=dNQ=6_ePt%-HiIk3nYhZ zL_Rj|0I^4=kE#lTxEIaY2^Sqp$?L0hytc@Cpac$uzl?VM4;1Jk=%qcjF z$BLTDir?B?w{`#e1?EV2GCoyRG3X=%VUZFnxsI-J1k&vLfNRUKhIy4i0eJG}d`_Z) zIf7&7o!NRV?%urCqhshB$pwZfF0jYgDC#Nz(t)&^u#(+OnD{-PiZR3Lst~bQi5oGa z04#Y8Os4l(V)RW@8ujw`va2hK6AKYR-19DZZyRMIvTAC?9)_rIW^&sSZWs!g1q zzoA6oS}Jiv78hvCz`d-D*X=2$QfnZQQLU zUS1h44WN7nJi=B&C}ho`)oI{ML$cjzGgb}mB1UH-3O{1ag%2@=%o=HuDb8xZjj8{X z_YDh#Vx>f$SybA2r9JD7G*wqyoymHKpjY}C*5w-lMlz_OxXrO!)1s}x(g&txqz^Ds zzVq`JkKW4}d*!4vUUy3#8?-z(;fybt;F4!6+~i7j<5X7s+MUW)x)HXt@DB`~xIuVJ zW=n=jUQJEyvZ3kZWV|aD)5O}nx@u8lL@Dp+aBJ3!ML3gO1e{WL&yZV%YiVSamI%C4lhCF5om^{nN z#h*EijXg`NeQS_8pd}PejM-_wPse~Gx(?%r$rSLco=X=$tg;(;r6e+fhWB^~KdgV& zNFU-5FD5wHKQ_Z%2a>^9w8PfpU-QAaE1B!V&o zNO!;;`_E7D9Og{lG+{Stv%(PpoDwL0sTlJe(ur;Nv)(^P=Y4$|skz~!0LY*Q>S|Eh zBn&?Rhu=sK^-mmd0Od7Oz~o%2e)z_WjgF?B4!MBwu>M4u0vXk<(oSlnl(#U>J4|lg z#+3yH+u#WhvZ~V%kj0mCJlkIZKmnI^^11#&J?m6)c@XhC>l@H7@%|uFrbf}Jojo}3 zEPRzYO_J57=KGz;bzRt^=}!H^unWb>2D^%73$3B>pzMG9*tCd2W@SYmqyVo14T5^#zqY;hpDuanj%HZB!kyEhKro1}s7kcA5HyRCVy{@x(F z<)TdvY!Y)dE_ud9AR#=%VKg}_E+C~>pm!iEL?FunSiHv@MePR?IlqMtE3YyUt+)Ln zP;ddBeu0IB~$9<`?85k;UN*%rJf#&7%rqw5IQeC!V?3(JxD8 zPHmH70919vikK(1Y6XIsri(+`c!qk6P}gZQoO>V-e;q$s`c6aBInL%0`b&*DzPAsq zGmOJfKIQWHP4ex8(oX9aBJyYu;{bTHJ`#)Ygr*q~uJ-C62583Raz5TdMMY7ESxJu_ zBl=G85dcNiojR0VGtFnW0Z<=ifyf{03`k1=>;l{(=x#@nz`2{NIe&m*9d9hDsGxZG z!k+W2mZ>hUmLd3fP?g1$Nf0zep;RiZN`iAKKZ zyHlG3t(%#zzs(+I$o>9c<;_@oo>oE02>8DnnObk1_i6t`$uCYO^ypK?}1lXbhiF_NR_V! z<4oVlu&so+!@3+*ydExJx;|g!yOnkNm*udPUq)aK7lM<+jJXomJUMd$*OrMNna3t> zLeR$HbjolZrRHVl%_*b9Tx0Z?W-Hdpy&&iN$y0P&TILNCe+JZ|#;H@EO-k^<$lxrb z;|^5V18B4>6F{{pGgwRhWmceSVb9{}+DQq#6SY)5d@KBM^(3v=gKzz}`obtk6^&iv z@8E7#vt?=Ifl*$cxB&UklWH}V2PUC@?o5d)Y{WMp)L-ow=<5Q!^Po}$*!OCurIBYQ zN2(ZpqNYnsk(!2vd)zH+n9L=!_jEif z7^#6#VcQ+Cfjy6Pk?7c`c>Nh1U6dhTkYPfLa4Jel+NvE~Ia!?tfu?+Qo3+-T5ZV}> z8ld+fU|{Hcogj0TQ0K8*SWpmRwtgW;9ZKT!d1O#OnXZ8@`%$6g$ISC)xuv*q&zQi+ zG}!PBFpTsJTtW@Gp;T4L>_$JPMkQF6lgipG4vnVtHCslYMsk7&eZJqv1E}EZ&6WEy0q^ka(wbl{lP+=L*v;!nVOM5%A87C zJ2ddqUjAG7^aWWIDf>81^BD@XdzLr9yotT6s-}Rn^|`IsA%DVd|DJb@ZB&i(3SrqC z5cIFEnr=@1KbGddpO6kr&%h_BD&D$HFLoseHRrG^vs5lbeHdB);r9~8pW82E3IT5K z+xbvQQeJ_>2ym5ySzN_r^_nN%59$Qk#mX)BkAfqWf8p9+-hMj>WmD>lsd?`Ry4%aM zgP0{C!P=6k4gWs50``x8;Wo8zwiT(P=K#_Ld}2*|bWPe^NrlD@lbc6iGy|mW@dZE- zP)+KIrV|BjdFji)tstNavNO1TDKCD40j6>mT{Paum!Jpozbd*pnr)B(#=#>!@Zi)I zPT5qbVB$x^2;ukbhqWmJ8o9Gy=OD$Q-JIPEaQ?gw*6CT@u_sqjQ}_DJyY|K@<`#Q( zJs_=Hr%D6wz(1Y(pHHl@2H7c)_0k;LG_?aUVEY7i$$kmnbJuu9;7`Oa*!;`X72ABi z0Qa4bLtHoF6Km`T?mo5b`-GG?s^8B6{eKXMofeJF`QEf{I$WPmR@i>}pi14}+l$8b z`KTsK0pZC}7a+?9IQSom#|Q!1G%Dg!=j))2x~8VfKGL?faTm0#Aj|zP;9_fQ3vBCq zAR+yaUO z<`dsl9MCfTW6A5~gAbOI;%!>~@5SDrQP9XMM>n8&@YBp+g53re`1bi%{$IMAH0NpR z&DOs@f9W(JHK7z9uBxfzKMUBtU4MR8 zMq-ZPCWlJT!U862a(S{3LYuvoGcgL=@+8v{_&u?{{WQ5xZa@1z0{Y*k@^W&e!3OV> zN_Te;clTMZ%>tk#Sd?`ueN@HhXcbNjOFd4XkC8mK(qB<(V^s#KkEmXOL40#1_L!Tf zh=|eH75>dUW3eJR><92P&vAS(naE>M=)qL_&ROE?i^2QSW%}=Fcj3|{jQw5uvF+KFF?tT7goKPM)QTWUCwdoptBOyp_gom4zCrZlDharhJw(A6v3D%wz; zC5K{Av5v??1(8$Ws5&*ZVnL|Eh;*&|rvSmKvyfwLGo(v!-{`xZDqo}H{XhR6U=0?< zR|(QL4spz)XIK;n9LT6sIbM;yWbF%o#4rGqUtU(E?`&czJUY12=l!u6{M{C7+@=@| zt$watV!hS!&NqKA=P0v&{|^8gfJV>jvWE=N-cmoMHFzD_J z={LD8`g7?x%U07L3;iKvML^2~I?%JP0BQg>NPvtKasSI{s|o|)5r}>moc}x~IvQ8* z-b{y+UA9&T0^BObCMM}AJr?bmf4A-)NIH0V)sAg?#*o3VJ^%pU_o+Ag%WG?EP3I#; z*a7mdOU|kB-YufK2E7M3h9n~iEHdEFw5Nd~ZP0*Se@0VB~-mc2D$F1ky^R1JEE7&sfr%IreBAhnjs`DW>D6LO2p>owMoTC>kTg&}$AH z-B-u{2US2H*QUwGk}Yqz=rG)k9^+EsMD*R_^E(5di(MGl?Scmj2r!Fl@TTP_P!)l3 zjqP=tf&gGZ0(hoC!wQH1D8O~tZ2&TnSB&}3bwXxP$%C`{TjIBvXmBJm)4JapxBI{< zV6X{}E6@t7U|8Onp4@`qa`G98TD%uW=c9_h66F5~VUuwU!Gxrx&J3H53{%SmI#`+M z3bCLsjQHorJ4`P%TL}?&_U+CkZGD*)I;ewtvC&ljs-A6Eaj>7msk$OD7QxO8Wpqt8 z(`cZy6&+GwvM|>01 zsYV6{i!$2cpCSZwr^?>FLzg2#*GK@)QhSk)&kBvKg*N{Mna)!FSp@;#qa`HU7Kr}C z!{EOHj#-jQd&lEW>mF>WbTVYgLeOiyzT4GcRss?}S*#^)(og{7&r+V19UJpraK4+o zJr)D1*0);;GLw}ts}xFcxo>B#+jOoPwcuS+uiF_{TU01BPybO<2mntT*Icq6ta?aW zOVOor81)QJXF2I&9Mfz%tACrY#7Zt-4@^Xbo5UlLZ~J1F)HF50^#fwb;8j;=yQE1| z`acY3{@7-3!i80Yz$>RvRf^X-hRBG}2A{5qD;GN7*7fu+d)?LrZpyaiY83`-S*N1r9HQU9$CvvH-m8OygCSQinv+Q|TOMNa%igSo zQqcjPGg!DS58p3+*4{&bbkUa)(B!#5&E0Yjo{&xRJHCGX8l11*-V#I#VEse1$TK1f z+WMNBZf7{1D0n65fCTyGkr%yv-wW5B=^Buj=6z9H4n%PQfd$Xm<=>}TBaRLlDiiw- zQKqA%KSBhtGIYLH7lO!&x8RpXV1jQniPI_k{@qcT1@qgbzbP?y!{qw7YFOwfhbfEa z@>a?wwzTWh2lT5~A#s!28Gj$R4qQJT>HXV(BpXTAB{O~{mNRebFkg>NsWCpPd;eMJ ztR%Rn0Sz|Vdd1ljXwJi(AYH3ZXZENKjF-wLUJ+}N|KTCr7n7g8cZ*?>hj>VqxEA$} zbfzBI4S4Uq%o`2|;S6&}TXDlq!l*bM(#J8KZQZ3t*!nCN`1oX?6#4%mMqRFbMhLvv2Q7m=THS-2Na4V2?SA2@dct_DyL zt5<03+gC`I`lVKnt&F+7Fl_z~Khbi$A6dU3D^T^ejWTK+S9_h>@3et?);wvRFs8?7 ze;AL)hiLA!NXmcwl?~{jP7coXlixt^HS2r4-@UZm!o0hcU}-8N#>h2I#dnd3RdDpxajcocWD4>8erDLrz)6sC)g2L!Vf(3D zJ{RS_7tp;wZU928`3d!-{C#kB5EFP30in;^`=gi)v6Y_ER1E)zGXe;%{^=eb`c5MH z;z{_UKTTm`bFJ@Axb9v4w^d^6W7K3k#D25!yCmy z4k7d(LliyPmARHF_}2|ptb3&g-z~HX27+*Zfu6%mEp96W7Lk#}!|`wPh0)_HCn&HF zgb{ssAM95h<`B~PkEH_omxm~xQpUr=#eVA>4i+d@R*}8vJQZwevr@cVySYq%{})!4 z|JK8U3JJa#Vux^KO*K%GBS3TAI^K8op(~$^QOEG(ds2iLgza^^r-&PrwO?* zGlzhnc^LF~T3k_%p?%j|MME<{H}RP(olg)OeKF&?%hhwLLzYo2Nktf`ay;C1SO`)KMmi^UT&RpBm)bTIG-u}EO0y6`$90WossIPR2)@rss3Z&tRe;su!5)KTbdsf z6@S{kA??lB=`u`U{aT>Xjd8~^H8W$jB}~kvUpJY~2xKD)2jJx+;yWnQGa9U`_VjV< zsA|u@3zC9CTx>)?)wy|x<vFTuRQ(t)&{Ig5Y8s5czU2v<$7=%Z< z6W9fw&5kz+OGw;;Krf5mK1Dg7_oWmED!$h({&3HbI^YQ39z~RWs8nir8B5V&7EC@o zxHxt(ZkvhANM|$tvULl{W6avAmZ?Dkk6|4M+0@8uI6aR&1g$jcNBGPJJByfz1}G;I zK1RgFYXuHA{6{dg+fd~Ws?)iXnw$t6)mTz%bJE)m{C{x`{>vtr8tW*E{xx!Bb(y}ShKzMk48)fv&_LqAT zuzgR>5$|ZmMNnal?PFQshL|=kgIcJ-|2i@`#_BIN^OO>1Dbz3sR}E9!bW z;lce`-W-N=Qor?;1XzVd!c__9k=0Q+> zz}HQ|Uix2J0vs5sPA0RSZx@to7Ia%e47>spHim|H00s_WNw#;GvYuks7}d20N+13#BHDSSR~~6yvRRAn%)Gk$ za88a}5$w{WZvq>U^m&sf2D&@wHTZbs$4wt4u;8QC3%r>XApYWduQ5ZzLU$YP%d6&L$G&4$CvVS`Q9KQ9`*D2^4(`hM^z2`OY-Y&|p`{kw=oC+Zsg z-|lUjj$pn&b%Nv>7sgJyXr5Aii7L5dMiv(8UK~H7FC^0E@3aPjs}~W1W<&OMH6$*iX|A$6D>hJCQ4mMGAYouNPlZt;HaW@vRf%hD7)IEIPqD^o4P=*w?W!XFChs%tpz{b69_NtlS z&kzYcu<>xXm!6t(#~v>V`-x>5571r9|vT6<%4+eO0BbyEHN+!gx-mhgS;btKVhQZ$2d5hUOnOxKdAbNpr$$a`Ptm z9A1f*3Ezt_&#We&Uw{H4d_vK1x!oN*Gy78RBo%p%v7~n|v2ioUhw)3>5zw-*a(MLH z0IMi$2#em$A;N+}V~*w*^Lwo3t1GOS!)g}oHFZXtwM?H^MY=uI!}e8Rc0lfiELpas zcw%8`$tdAX%9KCY{^!x0P()j4vzj0^&9U=w+&T0H0 zG4!F7%bZG>)O0QU_-24Mj_~2yRh=u~ghKos^s~N(^zPPx>;>^lNN{5g>!E{ce+D`_ zqjcI2CaL@LP z)c4q08Z-K{bR)mF= zxOE#M_oY%WFLtJ^($t=<%8))g4R9kvVpDUql|m3rc(W5m=> zdVZL4HN2BQ(cvLK+mcX}fXHxT9NDGouz3Vv%^I>Ou1kxyE)L|z%;)==^f=G+Gj}h7 zQT#xbEG~v1fOj8j1-01(rQxS<+RHfg#vj91YVFhgYpVl0nOKK}CABx*lP4!*=1}PRdQZQ*wa~kElZCNDk_=bfKb0gbo zQQ6*k2Y-8)i814Kl;Wp*#1VKR8pZQ%hZSm)-bHKbby|Le><{d91ZYX(w&srO#H~ zO&M3fLxwc#b}DPSAi0l8UBy2e6#U29Jv~i-aUeF`<3!Jn2pvjbU;U9IOAw1x=7I#h zLzugaK86zFi&>GA(L{Pc#96bx&NF{)(iAYsgXXb+$VqacM3}4*{z670C#8ENYXOI7 zOIIrc48F>Mn;Eo`xKkI6?|mq|Erul&i|8_-GZb+vr!r(tT80P}UGMOzKastQA^#F3 z@Q^+Kr|Q43>gg%U!x8LpRi*sB=|-F-(gBQYUJZSOLezf_eo^l%e4GfWPK;bwUy_#Q zM=@B56lc$QPo6Agxej{Ns%_M)v)941IR3cZ4ZQ#hNl!b;y-KVG*+= zL@NPoKmdRqz4V-rzawK^^j>Pc=sFt15RXScn~6FM^mX+7kbFGzb7W!X*Tf@a25 z6$RteN$=Hq@(acV#%kY-$`|)Ovd9ub^P_72#-FE$Z>y$eCMSb}wE9Bk=sU55Knzka zib5W~inFEC^B^FubxAA*RH9XbR>i_3kR$5`CyR?c!x2N;Wvdn}z$~DpxT_CK#2Q#8 zC4xYYL zeM*c2V}{}H1Tic6uzton`BbfB5eN>-tE8FeDcCpX3I2ZZIJFsp>=G}q^8YQp`}=>?Ts%vp8APScUwH?m^{gB zH>>_y;&6C(VRS?ey|KjQ`zesnf#y>)n8|KiCOjisOn345xLF&sU;8gGt(cno>)gIT z&(O%o^+lCYAxoCdVnNkxi@c_T-x%=wYNksUBrdA>f$t6&pB+>)PUG}@m@asS{Y;vc z;-lV6XpLGBhb{uda#Aj4own_A2@5wv&Bm>SRFVkcW@K4lZnM0qo(U3Y(qAifjwjRB zkn2L~Rh6REt1j`m+C|`Rt9hRnmX`1^QbI}_hS z1K%Ri6H;MlIJOm9^pL6Hf%jm*x$!H$;NjpPcjAC{0;-xv0!H`;0~%=sORo!#7EuiO z>aSX=nhoB3B3nq(VN$FcR(=x95u)pf%L^i8${^(1Gj!$ZCkF@Gu#)0*On^)0eoK_T z-`|1T{rB*Q5sn^fK7k#2Mm$E6wG?Oq$*@dkTKm*o5x&_;7rOv0VAn`X0~>XLPl1Zh z1dQ;wRaHSK&dJHi$LBIzQ`)R|0owsA=8-b$6)+l`nV48W{jsmgPgKcXh;SRsNVzi} zuv_W>J|>GO>TQ=6j5_KyZKCY?`X>Ai)5Y=p*&_3I*>;aR!6oA*<>jwr9xO*l`X|Z# zOZ|a7$G-;BB!7gq7O+R%0le&C_Kyaqs!>s}`Yki78qs`~kM45Hj?MFR>C})&N4DAT zo?riBVu1>S!Diw&HO`NZzN5(N)~ma%(>QMHF_|q{WCz2M3X)H4Ppk zpUZuhG2_#-e*f#)sof}bHKTuP{o)_yV~n10Dhh!&{#hd|AMDgj{Moo0@n!6fo3*94 zZ~Yb-4S6{genB)THWn_SyC0z<(}3d3_p;80bc$^+MMZPJdhQM{QAzSdkY#TZkodGS zb#^I{E_$8Od;qcaaQQXkq#tV*o8m@SpA>jZh{W}nJ28rRimb9=r+RJew+d;ueIm&5 zwZj8Ej&^oY2XH!~qQI^!1T2*3!V=Pn^9Z2CMn7iXTRorLy2KV`0qQ0Fqx$|ozSKqB z${^=;aAsLT8k_g(j)f%zR^@JNbx^OMi1Q4}h9infF#rTAs2QJY7r6L*8!VawO?!!Z zBpNJW`G-E~4k44dIqMg@M+t$0wc7)TPx@R>t12s>GcsiXNfw^)P&+ZV@s~f}qP+m) zoAeGbJAcQV7fqUmQj*2em(zU)6aC#Kt$bMoKsU-u$9IyH0 ziS}Dig~4s8d=z+46UxQzem|w;4Q_t*F1Z_5cS|)zY}|y#JV&y$(Q>Q>V@_jFQk&w5 znp%(4$xr?GadvigRD4t%7}tQnv1vb!Y+2|mVR{w$^l4|OY{W?P5gFK;1UQ%zc7QRf zsje<{HC@Kk{;}y?m`Z8i_olDGyMe>&yqmqVGhaL$h+S(OSF?2vFB&e#7sDqu3A$f?`GCd^MMxJad8!2XK3k15^(I6x2Z*p!X*|YeenoE$L%?*g2lS9wZS3LSOaU4?SZL2}CeC)b zTgl!q-kaw3;A8K1<)h*llnVFA(7>AGUjL8G7Jjf$h395`9|LTv;xt1)ZWO^J!OG3#x~muPa=P3C&s10NsrQbf44_{%7{M4&BsovkF_T=x6-a-Pbg zIU?xiF!gU~o?LN6?94Usbpb1*hXA()7%6rb-Jxe!CY^3tUi@?xJUUsrAN*k%$HVz> zKGDa!jN%P(tqCAX1I-^Kl>zA}2swpiGYv08sBgh(k5%gS?DW4fh);#x zA!23?fYB@uc_@;HW*!ZfSp3wvl6$ZHPj~Yy3CgO_DA$OGX_xddbP5oFi+jM}#7j!H zTU)AfJve@R+r72;32(AkRp_YVX!l^R*MBM)dvjH|obsZl zu|ToNlaIfR3#uDEsX|ydV%L0%!tW$do^IWyj69chjOAj4o%2T>QnHKaK9;Z=z8J{1 z`p#n@asf%*suQ1QRuF?G-hIgWT>jTMFbJKK2n-+o|LD^IDKi%x?lb4W&di-_G>C&t zavc%^8-9RIp`!~Rs%4cGms6`j5)ll)xAabaX(gfKw)E39H83#?k9Lm-BoC&5h)aI`7rNp6VR>A-J;yES72W0+gEBsV@($r@f z28_BXU)fJ^ip_sI8M(&+OA&d{M;@>=5G-tEh8c#`xTt{zL1UYRq+6p$l3=AZcvOfL zFu#F#dy?mWp4Xre#>Un&1?Rv&JrjvY2*L6$58kgz6x1L)_WdiRqrx#>b7p;E{VI-k zGSYiWl>8h&EM&LAGy+S-U6**^ zFn9TDE^%iZ#E{Kbahy^eWAMjHSXlz)ZD;I6z*tj*gAoZh_`+FOhoCgO{VbHM6vf73 zyWuC4TN(VH|7rAMrdleicAM%*YLtMu^2-2~Un!}ni{c!{oC5}(+5i+nlLr8{0$&St zxm09pj7AO8Q`2uH6wla?^(1i+ibXc++y`aiuIBXtW5r~FZ1}_Mz26D%>F#)9gJHZ1 zB371V$gYjq@B?~0yRfDorHV>T%x)1XblBC10uJ4ryQ+S%>q38yn-Ly!9LYaFqhQ#D z9l!jPa|ygMa&z0Uup!udz^PI<>1e_QO z{^oL=H*rgd1q&KlNVipVHIj#oxr7gakH^7g=4`Kj4jLlZ#@HS_c=8x?S8PccGTb-4yz%r^RF0! zN*|DbiLtEImZiVfhm{7(T%hs`c7SaOezw%1MpRSOWJ*Y?M)l!C!0NcV0-i#Ryro+E zykXBjU-PN>jJFPwD3zXL$U6y2O|qu8Y0XiTcZphoehv0xC<4f&MtshM9k7KQ9l7yt zGy+8zaEp_Z^-o*t(+X!k<2xJE!-sb-+)t0UtD5Q42oA5b=(R?|_O+)Ae@I*y>t1%t z4Re=D#5@hHj~+W|JZS*Z)n54Dn=Pi7RJU;y;#t8w0vt;-_GLGTxM2nb?)%HiQ?ppa z@C>i=?6=h-^c1%Qe%_tF`Lnm@JnMPms%UbI*lGgDuHg{gDO+I8}m#xwND^6c_* zPWEjrp(k{^qjV!BlRG!q$=cpMu z7P15{3zsR2vezX?q+>*%a4@66R;z^J{OMkpZ+bX@`+h(F>>D(g;TD0u$K5K2*0H^l zNP)aMx#_$)Ho1)S-}}*dB02WPy%xQG&VUum%!$F0=Y)naD-to>K*3g(`*k46qRpGE ziisDfE_bCu3L~-1Xm2qOeGhn{$Mp$M^l4+uX3HT*T{dzXFc`7}$sOe;u7w zT$N21#Sh&L(vs5h(hUOA-QC?K-5?+>-JR0iAV^AgNh#f3lHd59D=xS=zwPYhtUiJ1cXn3R z6BuRt-zMhT+1ms88&52MRW;@&a1d^E0&(F&bd1W+zhPWRNAMz;PK+6Jk^h8i2gAca z>c@iGW(7y705`8vmL%bvQIcHutG8FQVGUG|y;y(?ja0~j+D8p4L4_FR)KPj6Onp;f z{?ocB#;_&ozl1@NL|Nq~I^>144!nocNlXYL)}uZ#1hgIM&RY}8-iXo-)nUd(c!j$A zHEt|5c`WszR{G`MiOjR;Vs0nZdxlO2p6rW;I|e+ikojN!_xGn3POYBo-n%?3XD_d1 zXA(ASNRey$HMkrPIs=Rjdnr?16Z*)!OB)j`xYOf(hQMoHXrsIBUOzeb2_81F#`q}D zoeYdz4Z}(i$;t4&`7M2bIAf(kUrbCFtb{1Yr7<%|!4MOZ+Qxhf#-Ohc2p_aS!UJhg zxO7rj*EgNZjPc!;?-z%wt9nGuq!i-i!%9hm))|yY6iIvD&IFG3cFChV{4EY}IozzQ z>Sc4gyCYo&idYHxRaK<)#64)p%|z8l^=d60+J>j^|H^>lJVM6H*W0*szBRz{9WI!i zJ2{%q-#z2dD$3BSP~yBJ{}RQ08xZzc1jUZ5c(@&(?H#vIDV-`bIZU7xECJ;vI!BSb zco~a~{-QdaG!Ad2FTq%^(IZtgf;BOv4i);fvY)cj-?H-$5OCAUVtCwd2cpx3tQ%L(3Md?}j|Z1Y1jZ5%7+{BBrLKSXk~B_q%Az zAnB-L!p_cq8Z_$q9vWD^r&ck)Ty_9{Ym(6LEFndhg@#H0Z(z4Tq9}3_y8r#z$_L>} zf{BFl2WzJP`b)e=>FmMzLPL~?jm;r=kw3g#d<7!7nSP#Fn7mmIP93nYr|%_S_sPa5 zCUg{yC!DabMvGl=#ewd2RgoXH4|JD+sdN&h)mlD*`rXhLd;(ad%&tYtI_k`+0NBN! z4c>wWaG1D}fN1((bNxUSF*5)Ux^SDL7!WIBIz?euy3zXZ+94}F5^ZC5hUJa6d{Wfy5v)%L$ybOjhfGCVn9TWE3 z_S_uq>-is%*FU*=G((Kld{jSMksa2$T7WK4(s{{-2iko2qf`*~?IN}{gaXe7$IF04 zP_UuvJ&1Z5UuijY$=AyiWx%2eZ(n=3?(a7(tr7CuL6V_F3LF&nua=?f-b8UdTi0F( zW0Yi>W80NA`{osjcvt-m@q@2_jg$J3n&keAHQlW>CTKAD<7F`aADjq_5bN`CuXNe$ z$;rvLl_So+(WpJ&4a0SvmCg>mjBH@8&i`IK`&L8yN@laSIRExvUFYzBe^ zY(%u}CJ$6$pt6&;m6IoFb)b^bD@HvOjEsS2!H>K&fq8UUbm8~6P-0?0CD~5Y&wtwW zL#~@9y816tTZorT_$Lo>feI*e);rDu^eX0)48`9eWlI$P`8y9v&9Z}xqjnV&?4z|o zbV~R3s-5J=f7#n7UO`C(0PD5d0Y==69n~mdL?>@r3K$C>_TD|6E0O&6y4V~5r1((X z7I5zQtbJQN5=XL?3L9tpcMk#f&*Y-65mgCam+dj?**)fm* z3BJm;={eXt(iO9Oy-`dMqjc|BYnt}~6);fYW<`P)Gw4+F{QDvXK*#ImW1V3GlPqIi zsR0M67NHNB(Vt zTXCN2dOYvLcpX1`3Gm&x3&9qpqbN#ZUOZ$gN}}Y@vE}Nf;o}^XQUh|Ej~gJH$LF%* zKNJc`zLejWna53nxn#+&1=Rv`@seVdpK)^mjvwT}9l)uZMjv_S?2V5n`)!crrd6pi zR1Y-|m^nB&wAA%=AG&vdbrricXQSR(ra=PvqyHQVam?W9DJV904;h5I^7Y=u zueuEoK&oNd6AiY1Kwa#b&dgr1TFE2;an<_;5R_ z2?Q7$|EP$SRGvF}7Zqh`A_D}mmk$rUy}_!Zb0!4t5Dh3#axx_%=s!vN-8$6^ojn8} ze?bB*Q3->^D#k`BV#FXyfXhFGZT`tVG0FD~zuW&}enYB241Q$hcmC;~(C0}+<)L+U zlV75U{zwUNbd3wp_1|gJ%R%>+ju*-*x;I46b+lfiB0m1OK8Y^DVHJ2wyA~cE_^ir` zQ2T)8cnqN^NishCEdvq& z$3yQR2XcD!o}U9za@de&4Bpk@~j3I}#2@Nv1g2Dp%x z#Rc7}l(SagV!7WQl>8@bl2a?Bfnfje->bttS)~p7dkK58p%FbZT z!r|WT@Jc6CRx(S60tW5+!-EB`IJA-scMMLm_W?CLBqD1^j*ZdQOOEGs1@lwSEy?xu zi=5eGD+n6R{Sfd{_|@?RB!9H~SxVd5YgMnExv>wjKu2pb{s+tlsnvoX*x6ycqWH!7 zgZsj%8ZtXNz_i`PrGD|Ks>V@KPL3xQxMtXa<_|!7WbDV>^kJYOl+59!=&oBqXoMzy z%E*gujH;?4m~x1F0GI;az{S=32%;w{tLP6a>+u9;u53beI3cU`#~{3EO}!1a4*7?%9)S+nnS) zAC+X#mVNc>TKC+` z_Rz@&rvm_4E6WrEOQj9ygi6i2`gXbl^MQ<#iVPBxkqIuMu$K%n6sC#>t*eg@F-P=Q z`Q{Geq}~v;XZO_x^-Sdk$kb(wI0Scjt<=h#+}raVjco0+ z2jIav6K$JE&R>?AZB!|P4O)~>n3z%Va{0b^1QODUnT%&t6e^Wu-pvRaE=_5kvELkj zjUXTqf2vD|FT}ADGsxif;Ut0<&X%EX>N)d$F5&p}6d4;lsAW44$Xh%Isymf`l4P0^nkZ&y zidK1Vhf;n|d#)sia*4H!1PaAVz__3GB=xYfmY5l-pWm}S|HjyH<)Dv~dzrCtxTB_f?Xit-o1ER&a$pp})jv@KvrZwerlO zFN%oyUX~nI4FmH@YaiP^&+nd*gAghfE4xhXqkkZd)`QBB8(2eLHfw6+X>g)VA>lYb zubzM>1GFPV>b$M7e#~14M}H8571mBk_JTTL84MUT4;*sC3=|e?B&B4MMH&h1{~5D? z{YIhy&uMGKFp>XA)FQ`xIXm-TXr>^ky@2OA9pkkb+sZ~avH0+0*Y)LXTh|x?HB&OB zGneGdO*;#V3%gpiFB(uNA`;YFK|>1bzv*Ffn3>V6WJXCM&|);aXFmJT3P4G2XTS3^ zN=quUNbJqt+AO9(o7500KBMnW}tFtZ_X zOJEc=i4nq*#$My{6OrB~ll+85^!5GZ1P=CR^S_rr>_^STCU3%wP;aO(k8X=@o+QIg;qnb;-9GTFM$;a)z~GavMIJ;KUveD z&FN1tTGqEiyVj%0pd;v;=Kco=$g~hsriRkSKu5P|NN<%}@vzsBvpOSMR4xOi1`2M` z?Sv^Sjs&Y3lfOcIeC+|RFMv_7voDE_AU%pLFnObimQO4GTiA_|z<>a^e>QuH9`oG) zPIHk{T_Yqt;CV6N`A^@MgmQ!6uxN=w06YV6al-F6@)QmrO#v08%{&R&NHeAXosyia zA{NVQ;J81qXu)q_kfr=&D2ibjfHn5!>%4@!K@Y> z#2;~M8VBim>6oE7uwmFEnPmslwCJncMnfeP^y?B}WYiZ2kV#;AikQObcCk73Se=65 zH$VH9<>}#-jG^Ms@BCKDM$2=j=rC8U{k1ITvHLG*>1>s!6(qp~FZcOyC-VV(Pz>&% z>CgJgpONu7o0|lhPA+$+Hg)YFZ!0wFg9mNQ7T0h6=lK^?L`b_+({(rSdV6wqX^aSiR2eqfVE)Qdix8JNpqD+?a$na0aaT1@{o(&DwgU@` zb@ZyQua9YThC`5-FWHs@^lR{Q0)D{j4VyF4*fIro7>H5^$0>D0)&^9$6){k7vY~4ytr^KRX7tm=yyX*i>2k`E9>q0Nh4J1#{q+u4VgRe71R62 zc=_;mf1=5Dk+KTTA#oViNV2k`w6t`l#@I9wb)V7$4*yDZfJX@D(b=hHNxMC@`(W58 zv9(iF#73?eyKk8Vf=Nltt5jK#iiKUz5r}|*fI%k2gzV?!WQGiqVZI;?H7wiNT51kR zJER557len$m^ETo1aKk-y3e(Yc!WU$sZX7EA`+oQ-V#EjQ1|QQX0P}6txWl{$1PfF z3^$gSd3pS<2Z#4?C>iB6%~m1j9LzS(m7`ySm&7V`q+!t#2=Tfuf~Pje&W>99dm zsM&avFoDUh3b$Cw?=0d;&vI4-1qC~OOaq)B=*&&};QhqzxXS)~6JR4KK`u8vTN?Zb zXf*OxVvQsj+EkPf+IafWrz^*onO7PR&A5T_pI$3wOzqDr4$`w@0opGY@2n`H3sb$Y z#OZ}mdZ8_l>!WkD`7VUAZqjvZX^r?Lwr(s>HZjQ~ALso}f6kTzIE{e!HR2(ryUE+- z_4T)3hcx6qXa_U2Xd$4b8{>)tV}T32*U`fJKMPlX^-j+UKf#TW-ewR778Vv>@WkIs zxoAX&%arZ7(Bl*LQ^=Swrt`HP0^cbJ?pj;(d%jr=jrf&0b=sXzc~o}xN6{d=Hl#TK zF)l1C&G#)4t~eGjT$F$ir+>^gA15dBN2uj7J3Bjp*QYB=pA-18>Plym(HtbL8Ue;^ z+WteCKG$5zKAa9q*WT>#IL>;SNQuH>Pl0!ln>^|a%*b6@l`i&aY8*tiNxucDSs8ae z5Pp4J)QqN&pwGmUc)MCPw=-HLFE-A&}` z)jP+$nW7{xbqkrm?=#So$lT*i9!&$u@CWRPuoxI`cbC~TTH9EG?;dD*cmrMpfLSc8 zm7{GJ8V`mL(xn5A0)v#|e%pj@T4oCM>-cAuXO_EFoFm5Uwbnp%eu@6ipJDzW_hJF& z)J{gt4mbALUY%XM-@pio$bJEx15mX?oJn%Q!vw=}kW=;o;t$bJ^7<90&c-vjK|jh@ zXk%?HTaLzsN~37pQ{Z14bM_i+uHf-nXGA(WWt4<_zP|V^8@h${A09FHyPeUVtxb%q zv)x=UokesoFSu>~ji=SE$XFCz&O})9cXtdU&CVeC%j>Y6NxB?ZV5lpezev}DXT_4KlxyT-v zZ$19l_Uw99NZd}xJ(&wIKgxU=_72Zar5`vmilPd3GPtHZQDj%Yh7CzG1hK_X^Ul*u zUd=e+ibwUCnvQuUfuJW=tdyTptqfPF<5-uj@cU-rka#n~g%FU`<9$yZtp!vd( zP5BhQ^Q~Y+DV^CgQNl@B%9L%qXmp1TtQsPtn~@pvxn0guG;>arYO$a#q}>id`cC~y)4w)X|>X}SMf1HAyo}_k98J1 zcxP^=V=pf+VD|#8v|MvS$_a}GV3XEwcLi0y;Ise7bGJ6V^$rh30h=p<4}5&0Vn}f0 zd#jXD^-Ms#!?pn+V${<0Oo=$EHQE(@fuC@0A)boD zdoQ0wRfEicTCa>~g@`tPRYktMY)S_0cJQIs3eCiF0^Q}-fBOlIP@Q_N&VoZ2V!=iz zPx*BDpP}FLNYodMTRbQVNm$*hWdMpI8S*&W_`t`jU8Mmmejsx0j!e)yucGm6&f5EL zdJ0tU(NA2*d1s8ps%zJ1bIt_~=0_nSEG*OH17(Myh>c2Cc#-#SqWbzi^2#OC%Fxes z`OE%MLKp#26KAV!S0e*^pqhz|jorO!Q#mY7H8A=4$f11pmqi^jzW+PdV6FN0U z50c84m2!N3v%bM>uBaS6$NERKnr*_q$MN%#rpb6ar>AYBsi})K8$8y38ptm~On<27W)xl0G5X$qZj z#W5Lw7j{xxEFcWc9=PJlk5+Qn$Z5+FK`G%FCBK%zTbq-WDOBnx&G$q@T)uBs`H}4q zP=0d=%1_hF-|f#iR2(BcV*WiZE-jWZ8V+f7X*1mo`MtN{d4d3voC|$gN-`(Km5b1r z6cw=|=P&oK@2M%psH@zXdCYe&mK1Hd^{6Xzqa3+7xp{Kttk|uZoEPd3gj6on$qCe4 z9wZL5z4ZMWN2pM0o0{CfQ!$O+#$g#0Q*P8_#=yWB03MFuA>)HUStSu@W3YW5pPl`4 zpqXpSyaa)tALJ$iB!);Vxt`$Cgdgcq2>0`a=M!+e(ia0CAQk;al1hTX`_X#flze`E z1_cqgz!y$?3Z&SjgIme+%8Cz2Klx`}htvO7;-f0`Da!%rhODFGyfItp>t*{J;_ka@ zUqBAz_TS>B)-cpg0rd&k9!9V9+(iJ#DeY%NJ+z<*p<0mLoF0eJUp0C;Cg~*@QFtRL zaeaA8j0P*kUL8!Vz)xbx8iZItG!bMMG+7 zGy8OrbQ*(cdZ}a4k(90^Bd2@P|*KFM$TZ6-eU$CwYE~d@c+5$ZP<=Yk$ z|1&(!ShYpkP;AC`A<($%IqQv!mD@Y$3Gnfaq{^zwU7E`YFyMQ0t%!UcOiLV~jNKEr z=n)fh_4dv%lg{ZY`xC06mlRl(I7d*}3JWnB4%3AM#)p2JrD|PT@Fm54)}KLbG$Q+!ep8xbdhp#W{xZ+|mwq1brBu&Sa zK9=a(rY9k-ha1WY;*u%FT-o8tA&V9kglS@ne`dh-^=x57Z)0PFO!Dyje2VD`}zaoP!x6z;s-D6S*1iS9A#j8-DOFsSvoU(wA!w4y<}mfI6I_+1YL?}leM}4AnG+WLWG%jg|6cvw z;5su#s#_Id7Ps~nM92&IKkpj8>=?@27J)WZz=5nGA0OY}>977~-2SzL3Z{7iSMOmF zp|s2{lOAgw`z2V>LM`_0sdwa>$nx%E7T2dr?m^34T_)<%)%mDY47Y5$@X@3B?iL(K zA2!xS#hlkUk>7V?nOCum%%e|2ghT!B&;MlWaw{q*lq611*mdeL4;60r7R%;7ZPT&~ zd7ZYsABRUQ%XS$&eKO1H8XDsy^vqHj7`{FIR7Yuwioa~emQI5NVY(aue@xPbdpbSs zUthZlygdVh7sKubJ!Zw^429C^!G3a^Hfw!oh>aQMSDIbKp9EW^NnF9-XeR_KgPz|i zyUjoXyAh1;#wM(&6Z8=ap?)7&so}!WNNcBb-!d9zh( zT|kZ(Xo+~anqMIh=;knmdB0vHutt+bw0O!lW#RODwFrxA1L=*a93U7~clrU-zm8G= zm{*Q%RiV}84oD#a!O=D;=A-5oIQ&n~^!KG3PcYn3T2$qz?Y%#cMKD^&g;Y2hjk9wx zu|%+@UD~J%W_O?=+sIERJ}m(t0d*&eZSqqW2Pl7hURD7v1e3^=!zp6{3oDTTD|NJZ zL1*(l_^u=*B;h_9S>F&a-iEK-dL{tjbq;?^2VfI4G-a0@3~y=;((ksNE5NgJds($d z`q;_|A^HQF&C%q`@uUJqtVAIeJ}-NwK-3nGj0vRG_b(eI%@#Ny6CjJMw9*N_wE>@i zueta{E=Amjm6^?bE1A zhR*{{1QHf5B${T6X>??U+{9RnE0Zo#!nvr)AnE5A*~>odzwls=-zIfZn-M7U>`~54 zj@cHUIb}Dnw{rcjFsN5j`Mn@UpShS=8cEDEcXhrb?V|)8W)P@ps%ciJ=a2Hlf+$5Z zw!izglHlh2$bAa1mLJ$aP;p5Q)9B#rFaYbw(~2ugU9x%gj#U81s<{}o0k=zMMiJO$ zr6n%FSR%LE)tG~bK2+yOIl-n%R&|FbUay%MO)D)7_P75D732?G9rdr7VwK2f=Fxf% zomKr9);uYPE<)20JC?hJ;4Kpr1c!3aIyl_iI9OLp48*P9_jkFN0awqO78!Tv^@gRX;?=@K|y7!j2ZmVgQ**xKod3Ll(} zSjfNwM6|uWy8zJUSo_&e$pR{=%X+Zs4SSkJ$G4a*T1C@GLN~_$Y%QF&0w#PQySBAu zln3$_rs_B1$}F~w-`^+e#Ho`Vew&CjJDRv>gNQhtwsAeFz;y`H1Tr`mj|v6CTE!|x z8jFdkLLe0l^X%P)FD9mBUN-jnjp`1JAuvdW^LnHGBeA%gkHQIKL`o^e)du#hMdZTD zCJEFV54RrOSJ`LbJNl+`EO{?mmMEZw zEjq#Ho7na0DVTI+XDXBe?Wu_cDQt!DVVDA=~IgVJ1oh7R}Exq=8Uy`BVi~6#6c=q-V{nnytRk_~`#N!2-g`x7$+wVQAMXIdC zL*Ro@DHG1q4mE9#<=#7+g&1ukm{^d*!uMg3$89gEe2=Lvj^YwJnO6;4&=@KvTTIze zw;Cr!gP0m&T^c|^jA9_DQm{(q!^V)Q8!NEPfKmkrBjRh;{q|D-{px`CaK!cza&@26 zU486b*-}y{W}7Vr3sHu>iqR$-0PFGo!|Tzao+vK7#a(?2haF-b6<3go3^tiaW+hx+ zZ$eao5$lt2NVqlM#FcN;Sj4xfVig9Bi2Z&sYA!OYfD$@!zc0+D=F0mAuH~Cj&`P3J z5j%fJkh!h4^k9T$yV@O)BZN@*eVCa(h+?m0ho)04pre0BR*TXW6&oB>Vl-9FOJ7zG z;Y%ZFarh3Smbt4G=vhG$yUHMn`m4Gln&ilbODtq5(h>?%5=l5uLTdF*ZD-ob)yav4 zDCQD+lV<|uImXd<3lze}3DjR>@m<)7dyC7W~)`q{wD_YJ@`(Dy|74Kgz6!?1O7B!v$UxCT4AcFhX9@hnGj1Z{*$&-S-KYMKIPsL zU2!+TCOR zt>Us92Hx-XsND)^3nTru@t8E;h&ra!Lf40h)bIBo_kiWdSxyH(DSF3!XZgJ83WZ(6 zZ9X2Op043Sj2@4XIdXGmpsQuW|1sukH^7fpeN#_ulch{|gmh zH2gcV2%s|a3}3hI8%yHYiOJ})|u>8j9`VWuzT`-e&7ZLN}G_bKw-r%!A?O$lOqv&$W;s~BMYQv!qX*{%bOGm zuvXH{dQpxBcVr9iHC~A!Q^n~HWBnV|LX{MC&_R#hlj|Osi4!R>`8`$5orqksEJ4tF z_nnCrHmvsBaALT9-?SuSJdvHP_ttq`JXrix`-~8deeE}q)S{OBQ+=4Y(CZ>9D=GmB z9?^!^h+ZIqAn)l*uJ6_%zR>H**;53`3jP3_3RNKc1j5@?DNJXfT$mnUUj0*y|Bvd$ z_+NKi3H=@+Wr_2gJS4x!o!kk7XBzTXu#X@rI;ly9{T49v zASawEk!mLwi>Un_76OYWuAK5dUqbaOYGgsgFjR}=UXtXD;E1~tMNxoJO}zQ&lWacZ9cG#glf?hJpOXd{Sw_Rg5>lr0D^4k z4k2HMfN9hID4SvKNW$-b-*v>Jcx-ydK_FadgW4NbIad`LD562qUwln3qS2`X z{SmfWEdIWM2oo~Hku3aEtWk?(ApRlsb(6dMBF6FQeCR`dIJTLoEB&YZK~$v+ZOc?P zd8#VT`dBqw+JvtNX;+iao0k9TRoO|yw8=dq8Pk#QK({~Zl&-R7_&r;xesI}=Hm8g^ z?x*a$xZYJH3{49fhpnq~mzPRE_I);Qdz&;BX>Y=6uIo~U7{1OUHan_y3=~3%{8BvP{wTe3xS8!xbh@Bf9=h3UKWly>Dtg)PM*Zn1>WXY(y-682Mq-*DBxWaW zyiP&_m+sM8d9-;=0)zObIG|Xr?D$AyB*fG4#GOIvn#YEp=3Y8$*g)?``Bsr*-YaYS z;P=S4<<0iTjhNK5&|RV7*#Zj-1>S^+fdn$bwYxMF7{=QZY_7*W8DGN5>F;aZt=QEe zy!Ese%?{6wbPsC=I+ouQ=4yq~TBWA`R_I$>Rbb}qnv!vGC@rt)xkiV7KmuI(2Y*k^_65^4iMw#Y-ru-3oLztLGBu&zNy;&Ua>i9aY+5MnC zo>juS7s@K}5!NMef@ow0qNa%p)ygz9dtt@F*r47l;D48G=zq875mgXQIfgvmFOh0C zMn_6za^k$?hedIiRSqZ8TAeNQ;m`M3)rBLA<;UU6{I?i5@o)FJcF^Z#qP@SZy~s8b zHOAYumIxY?S|IqnZyj67RO7+=3ePmvDhMuL!}bCBK@_1>jWVD1bl>{cR&jbY*vfZy z;ndpI=_62+CsZa)36l(gzU+4pYv<8@_gp}?oo^xBU(W;*!t^OOtvFIfDL^!YBny~m zbw5n-{}TvaOb3l$k$-RL$6}Y2yb0{cpO%7P$jUwD?6U}GTR);i|5P|LLnTm+Ttrk~ zpoN4ACyyf>+3lqy8`Yw^H;RSiDJ@~LH#o;EXMY}w%bLQUy-D45sD73CP~KMQM_^?; zE&PQft`iL&vr$t zE*mjKNorLZ#`@uu-%*vs@2+D*kVgQ_u(6^v(HWew;g;Q~491pezmX6}7IZJ=Au zd#d1RtEBe|k_-!&te>Rm@}&Tt3T(Y+at7NbLngDc^6Z9Hqycsw#9t#FgbrXNS#Ha0eIxAN`-{awM72 z3|TCC3l_prpG7l#tJ3^N=?KoG3_!Up zcBz^yaa{bU_{J$;>1`olr=@nXy*hHMnk&TC00nCrtyMsRjsTg5VuxT-s4=H0-L1r# z*lt|9KALLIU6cL^RcxP^Qi22u&quH=YA~~e8`;HAG-$TkRg&hn$~0JE(3F?Vy)`B?Y$UJc{?KXo zaY1Radj_Q~yCR*TM!L}#Jy^C{&#|maFv8WMP~o1`BW5E-s5E=1AV^`^(_+yU`JHC* zbtLWT15bO^F~fTUNe3#t?=DBZ5K3(0eWL3mQF6O{9rN9sI&EcYAT3nB%vw6`gPD+^s6|B;I!i zj2;%L<;+h!t2sAuz9Xh`l28*9lZy%6C%^`c_*|Y!^^&Q2TLe-OIL?w3)jqwW#)Xn!%o2NcMk>_AW z1iMkOq8N8W3QBvTZFsH444z`NzLN>+_W-`((?363NGlT{6(*@* zVa@Z>3i8!^?$@DuLE+xBVSU0y=XTrH3~hO0DS4P$FqD-!%n*G@$W}t6k>n znuWXp-gg2nY_1(jE6XPKx_~@U%Pqh81??!~K%WnxEG>o~1rA8gP4RvlGmWmkp{A&V z)o*erl1>QssO9ecGk@@e$11hF$jwT|VHL-qX0YcLLFP?^U@viO2K#B!wutWAOTmo_ zx;v$ID!%X)6xLeWb6?@fliPF94XG5`t*zci{&_elC^s{M@;4nh@xCG^uscWwgrCh$ z4~UbqmVFX_*yew#U-#|94}}jm&MFdh!@?#?Y2}eA8#Z$R%#Jwya>dYQ)AK_~1GL?R zY}m<@q0H^`VC9xf{`ybN(9iE%ja)cg3@a)Y59Hp@l6sNR=R^b_T{Zv7c&q4kGp3+a zvmA2BoI!2N_Tz6@c(@Zw zj=@|;lHO9vSP_bQ^N{2YG6)OBHyXSm;}(CzQjNV&kI4BX49b|5 z4)?YLY>QExNB(YP?U9b9yq$@t@bGV<^Ah?72_RIlb;)0tf33yi!WdC=o0e`NHF{ZY zNHK*8h{V!c|Ja?lY)>)CFKXfvNBR|h_E8zvD@Qg<+nwpa;8Eje$g}8TJYyJx(q1NJ z+WB#7*Kq5n+Ah(+O3XZRR2%4O`*rasg%n4As{e35Z;c@$n+R+SMYFf|x0zw2Jvb#M0x-_EiYnao>3X}M8hE2SyO|vodgkevD*{lP|EYrtk{Xc-?z>u zPDCWzagQUAJW2vj+0ljH3+pi|k+Er88yzgY{TTMq%?qAyfdYu)KI(J}_@UUkV~vDx z%6~gb{a%IZYAlT?_^3h4*5)Q~yU{zx_2cfq)ZKXv&Mmq4J5(!=zpdQFSorZOL;2dTzvo$DwLl@d&UWVYHu;_j!L ziZ<;+LCShe%WKej7=-5v`uh10S!?jkOjU!$fK`+#g^PIvwrS5xZ>i>Gs9A&TPN2 zE$y8md@by_9MY&IR_>^&MI>qaZ;R-#>2CgcaU}QJL@ zrL_fq?o+9%1GV!O+>}D#fI3_yq3j-0Ct+JHarnq|TPcR*x;CFzjDB+5vaW!ZEI(e& zN+d5fRz6QLN(+~;f}A72EqZn1=qIQ=Ym5@Y@>>L>kO~Ga9hl6APP`*2d1S00G!|Jp zDYMUd7cQFlZhxdk~IeuADv*ppV&)uUNF6cwRzfk>)K%Rj7LIZ;v0Lu2{|EXjbPrSibddF%$P0 zB9v=l<7eUSc;lEu@vLSTv9pQY?1NUxJaB`qE4K+-Br~ zjLF=aXDFRRs}!Wx_}%sMkcLQgv18FHzA9B{`uT(Uj><76PVp3X1^XV`TAOmAE9XC3 z6O8>W61cTy;?>yjFpZtCe0Q4^-mUi*H@Ktk{Nw=N;)(e)N!^=_nCjakL1O9oPYHl}21Dwf|>iOm8`DM?=lN{Gxo=0=lB+=NNM40}#5gJc=-#XdbLK z1)Dx+5hlSx8Rh-j)!zuI=2V0DY>j7%m$pg#Mg~F&TwC>=!zjY>A1shO7F;%^fkTSu zXjaHtz7ruw9+ZQ(TGNH3XYJ}eRr#jN%6J*~%dcK4gDf@$6N_NvmCoS=oUripbY+qL zF$wW7*#UUr(;ry#j3|L&t>_r@MeHFD{>fSz$L6eUOOR9EK-twLb5#!!(Y z>b=s5J%a`Z^Scc<*k09ozOvoFr`6U$+NG%bJK1&}sv{odXTa34JkR|yRWPF|5ON`L zBvkjAL13Imq^H{<7m2x@?18k29LRhFt*7h^Cl}F8y=mv7^dZvu>+#EtI6! z!AO8>wk2!*%LMXi(xZ)#1CllptWzzR=BOiN?%OPL?XcblUHH^wEvH)3>K#6=YV%p* zR%eVd_Hli*uoC&gi7w+S1~V)l0>2_rB$hlm2#Wp44ARDa`PqhjYpiaeX2{Uwx@CxAxg7C`__r zx4FCqt79Q&B>ku7|Ru$NSl?jx94LJ`gA|d^Iuq` z)qF_tMB*-+LvP(&u$%BEfGF`BJEx;iCvD*t{TjqYr5E<#kT>ccB>qw!MGpxiV$?;3 zVWGFE#tx=nA=aJ_s!G*OW7PaM!cPi?x!kA#wo<<5s?MBf!Oo_-Lc#KHgZ~wl+i9cr zz~kYJ?hwSlDv7^UMs={$bPUyJmk@jleaelCy2^V_d)Bmam6+s&zX`={$KtzaZ#=%q znp_+B>3UkYyCTYXhKQLWsn>+t>Yo@in#f7cm>+kFt zCzbdeI^3F3SRmdO4h;kFfj#yc1(u&I=8s|;b~{crJM5+wbQv}>8N?G-@2A6)Ndh6i z-u6~0ixH6rZj*nbF=v=0`IArC@)&F)r63Cj2^?g>!GT0hmKE{*$@z&DUFBI3PKWhn z6=dwHy(b`^G^vEyqR8vWPnwcf?)qKL7b2o1B*v>=-Rk@0YsgTMuA{r3TTJCrvu5j4 z4?1EnTMsV(fm60%4@AdR!+(`(&r(HH2RX=YNBI6BahUS1>ipBss>d`}paK1{WXVpV z<&jGNxnbz{?Xd8-VxRI@T*s9uzQ_yMkn0sKmvR-a2+uu{o4Cf-KzR%Opj!|hW0hKfPZ@aVrSb$1PzaQSU-tvCs9C9+ZGyp?e~16v0vEpU73Qx z$>BnW$cSSw>_u$$sfv}rqS1FcRMFhl<1mUOj#Z2IcinqJ-4JT3%IZT(O4iR3EFm$R ztAZ)@`nn|%bTCJ5Iw@}$>dQ`(@5e-SrUFmjf2!GV5)iUPJMma54)h)+d`s$CJbM7Q z0{2ktMf;zZ#*Q|p?Fu1H=1m7m&~Lk7nA>gN6VqJVTQ-)T3TAQs!$=CPu|I5#s)&h> ze#PGYL2cxO=0{z;J#*LO?OWzXsO|j3=I{3f!z=UDNl-wsL!me-OZL43isdi91*7V& zkzsZw#Z{vflcUif9b6~BA0rw!#Zb-J9i0@RJ!Rfy#3Gw~n=oyjoBrgK|4C%8G)3ht zEx6#(srxXiTWE-Weu?0rBnoY>M^EX8mrrg?(@G$b9A859&hHeA-}z(wuDbJVil(p@ z^>+cvDf@IIp~&NU%E@y?RgCd}r--=}1z+Ub)K1(VIAVO{oiWG$I?Mh%e&AW#>MgI? z;iPAI8vcm!clb~zo62>1uw1vw&xyE;ar02j8=sk=f8?45bJJEoD4Y_!MpJ5;t`x4* z?}(~U#i9%LmXp3-YQn{s8rf&dA{}B(f ziL^BZ!RX&VelPcuo0kDCY+9x0j=ZU(dxB5|rAYzx*{GMN9Ix5UYmTi!q_1DkORl|v zOQT+$ZXytsXzAkc9gNm;<#xomUTF)G)em;QlW74hkI zM_=+;+Usp&-a`FbyqbIJ{o)x=HS^=~87h%Y%0aA==zVlI+5V<#_|kmMMtrB%XwYto z6PiT5d(oRdlfGYfw{YjGa2*5Hvcys0ZRR!Ct)w}#d0Zr2s$Tc7URF2p7T}wzWWjP zEFc;8SilF=N z$Ma#?D6$r8$0i$Il;wR?(l(R~sf>K|*)rM?&L8E-{Vu~A!HT-}D_#6ya$09(s}Ibd zD!uK_V2>3~t`I(|9X#Yel&aY&)=w|%|78A2K0h206tuK%Q0Wn|#9Z}P6rpe zd6ch`)o%I3B>Ve|!}9CoH&iPtKkup``g}C*v#W=sjW%Ip{L3F`Ttt-BRkPe3Qy+Sc r7ESE;W%gBc=*D~VgZo~pgkE2v);7ijy4^D6AmAe{t{_$|Y83oGXPrY) literal 0 HcmV?d00001 diff --git a/examples/dataset/load_libero.py b/examples/dataset/load_libero.py new file mode 100644 index 000000000..80e49c36a --- /dev/null +++ b/examples/dataset/load_libero.py @@ -0,0 +1,18 @@ +import torch +from huggingface_hub import HfApi + +import lerobot +from lerobot.datasets.lerobot_dataset import LeRobotDataset, LeRobotDatasetMetadata + +dataset = LeRobotDataset(repo_id="lerobot/libero") + +dataloader = torch.utils.data.DataLoader( + dataset, + num_workers=0, + batch_size=4, + shuffle=True, +) +batch = next(iter(dataloader)) +print(batch.keys()) + +breakpoint() diff --git a/src/lerobot/datasets/lerobot_dataset.py b/src/lerobot/datasets/lerobot_dataset.py index a6d8f7e3b..daf0e3b74 100644 --- a/src/lerobot/datasets/lerobot_dataset.py +++ b/src/lerobot/datasets/lerobot_dataset.py @@ -162,7 +162,7 @@ class LeRobotDatasetMetadata: self.info = load_info(self.root) check_version_compatibility(self.repo_id, self._version, CODEBASE_VERSION) self.tasks = load_tasks(self.root) - self.tasks_high_level = load_tasks_high_level(self.root) + # self.tasks_high_level = load_tasks_high_level(self.root) self.episodes = load_episodes(self.root) self.stats = load_stats(self.root) diff --git a/src/lerobot/policies/pi05/modeling_pi05.py b/src/lerobot/policies/pi05/modeling_pi05.py index acaccd660..b278954d5 100644 --- a/src/lerobot/policies/pi05/modeling_pi05.py +++ b/src/lerobot/policies/pi05/modeling_pi05.py @@ -1438,7 +1438,7 @@ class PI05Pytorch(nn.Module): # see openpi `PI0Pytorch` # Apply mask and compute mean loss masked_fast_loss = fast_loss_per_token * fast_action_masks.float() fast_loss = masked_fast_loss.sum() / fast_action_masks.sum().clamp(min=1) - + breakpoint() return { "fast_loss": fast_loss, "loss": fast_loss, diff --git a/src/lerobot/policies/pi05/processor_pi05.py b/src/lerobot/policies/pi05/processor_pi05.py index 3ef6b093b..63feda122 100644 --- a/src/lerobot/policies/pi05/processor_pi05.py +++ b/src/lerobot/policies/pi05/processor_pi05.py @@ -102,7 +102,7 @@ class Pi05PrepareStateAndLanguageTokenizerProcessorStep(ProcessorStep): full_prompt = f"High level task: {cleaned_high_level_task}; State: {state_str}; Subtask: {cleaned_text}" else: full_prompt = f"Task: {cleaned_text}, State: {state_str};\nAction: " - + low_level_prompts.append(full_prompt) transition[TransitionKey.COMPLEMENTARY_DATA][self.task_key] = low_level_prompts diff --git a/src/lerobot/policies/pi05/train.sh b/src/lerobot/policies/pi05/train.sh index ef448f328..004a040fd 100644 --- a/src/lerobot/policies/pi05/train.sh +++ b/src/lerobot/policies/pi05/train.sh @@ -2,7 +2,7 @@ export CUDA_LAUNCH_BLOCKING=1 lerobot-train \ --dataset.repo_id=local \ --dataset.root=/fsx/jade_choghari/outputs/collect-data-pgen \ - --output_dir=/fsx/jade_choghari/outputs/pi0_fast_fruit1 \ + --output_dir=/fsx/jade_choghari/outputs/pi0_fast_fruit2 \ --job_name=pi0_training \ --policy.repo_id=jade_choghari/pi0-base1 \ --policy.path=lerobot/pi05_base \ @@ -14,9 +14,10 @@ lerobot-train \ "observation.images.left_wrist": "observation.images.left_wrist_0_rgb", "observation.images.right_wrist": "observation.images.right_wrist_0_rgb", }' \ - --batch_size=4 \ + --batch_size=16 \ --policy.device=cuda \ - --wandb.enable=true \ - --wandb.disable_artifact=true \ - --wandb.project=pi05hi-training \ + --policy.fast_only=true \ + # --wandb.enable=true \ + # --wandb.disable_artifact=true \ + # --wandb.project=pi05hi-training \ # /fsx/jade_choghari/.cache/huggingface/lerobot/jadechoghari/collect-data \ No newline at end of file diff --git a/src/lerobot/policies/pi05/train_fast.sh b/src/lerobot/policies/pi05/train_fast.sh index 3f6b6e778..00753ef11 100644 --- a/src/lerobot/policies/pi05/train_fast.sh +++ b/src/lerobot/policies/pi05/train_fast.sh @@ -1,9 +1,6 @@ python src/lerobot/policies/pi05/train_fast_tokenizer.py \ - --repo_id "local" \ - --root "/fsx/jade_choghari/outputs/collect-data-pgen" \ - --action_horizon 16 \ - --encoded_dims "0:15" \ + --repo_id "lerobot/libero" \ --action_horizon 50 \ + --encoded_dims "0:6" \ --vocab_size 1024 \ - --scale 10.0 \ --output_dir "/fsx/jade_choghari/outputs/fast_tokenizer" diff --git a/src/lerobot/policies/pi05/train_libero.sh b/src/lerobot/policies/pi05/train_libero.sh new file mode 100644 index 000000000..f3874e958 --- /dev/null +++ b/src/lerobot/policies/pi05/train_libero.sh @@ -0,0 +1,19 @@ +export CUDA_LAUNCH_BLOCKING=1 +lerobot-train \ + --dataset.repo_id=local \ + --dataset.root=/fsx/jade_choghari/data/libero \ + --output_dir=/fsx/jade_choghari/outputs/libero_training_fast_1 \ + --job_name=libero_training_fast \ + --policy.repo_id=jade_choghari/pi05-fast-libero \ + --policy.path=/fsx/jade_choghari/models/libero-pi-fast \ + --policy.dtype=bfloat16 \ + --steps=200000 \ + --save_freq=30000 \ + --batch_size=16 \ + --policy.device=cuda \ + --policy.fast_only=true \ + --policy.gradient_checkpointing=true \ + # --wandb.enable=true \ + # --wandb.disable_artifact=true \ + # --wandb.project=pi05-libero-training \ +# /fsx/jade_choghari/.cache/huggingface/lerobot/jadechoghari/collect-data \ No newline at end of file diff --git a/src/lerobot/policies/pi05/train_multi.sh b/src/lerobot/policies/pi05/train_multi.sh index 3c8321139..1d741b69e 100644 --- a/src/lerobot/policies/pi05/train_multi.sh +++ b/src/lerobot/policies/pi05/train_multi.sh @@ -1,23 +1,16 @@ -rm -rf /fsx/jade_choghari/outputs/pi0_multi_training accelerate launch --multi_gpu --num_processes=2 \ $(which lerobot-train) \ - --dataset.repo_id=local \ - --dataset.root=/fsx/jade_choghari/outputs/collect-data-pgen \ - --output_dir=/fsx/jade_choghari/outputs/pi0_multi_training \ - --job_name=pi0_multi_training \ - --policy.repo_id=jadechoghari/pi0-base1 \ - --policy.path=lerobot/pi05_base \ + --dataset.repo_id=lerobot/libero \ + --output_dir=/fsx/jade_choghari/outputs/libero_training_fast \ + --job_name=libero_training_fast \ + --policy.repo_id=jade_choghari/pi05-fast-libero \ + --policy.path=/fsx/jade_choghari/models/libero-pi-fast \ --policy.dtype=bfloat16 \ - --steps=50000 \ - --save_freq=5000 \ - --rename_map='{ - "observation.images.base": "observation.images.base_0_rgb", - "observation.images.left_wrist": "observation.images.left_wrist_0_rgb", - "observation.images.right_wrist": "observation.images.right_wrist_0_rgb", - }' \ - --policy.gradient_checkpointing=true \ - --batch_size=1 \ - --policy.device=cpu - # --wandb.enable=true \ - # --wandb.disable_artifact=true \ - # --wandb.project=pi05hi-training \ + --steps=200000 \ + --save_freq=30000 \ + --batch_size=16 \ + --policy.device=cuda \ + --policy.fast_only=true \ + --wandb.enable=true \ + --wandb.disable_artifact=true \ + --wandb.project=pi05-libero-training \ diff --git a/src/lerobot/processor/tokenizer_processor.py b/src/lerobot/processor/tokenizer_processor.py index 59afddab1..77288ed1c 100644 --- a/src/lerobot/processor/tokenizer_processor.py +++ b/src/lerobot/processor/tokenizer_processor.py @@ -453,10 +453,11 @@ class ActionTokenizerProcessorStep(ActionProcessorStep): tokenizer_name: str | None = None tokenizer: Any | None = None trust_remote_code: bool = True - max_action_tokens: int = 32 + max_action_tokens: int = 256 # Internal tokenizer instance (not part of the config) action_tokenizer: Any = field(default=None, init=False, repr=False) - + _paligemma_tokenizer: Any = field(default=None, init=False, repr=False) + _fast_skip_tokens: int = field(default=128, init=False, repr=False) def __post_init__(self): """ Initializes the action tokenizer after the dataclass is created. @@ -488,6 +489,9 @@ class ActionTokenizerProcessorStep(ActionProcessorStep): "Either 'tokenizer' or 'tokenizer_name' must be provided. " "Pass a tokenizer object directly or a tokenizer name to auto-load." ) + + self._paligemma_tokenizer = AutoTokenizer.from_pretrained("google/paligemma-3b-pt-224", trust_remote_code=True, add_eos_token=True, add_bos_token=False) + self._fast_skip_tokens = 128 # Skip last 128 tokens in PaliGemma vocab since they are special tokens def __call__(self, transition: EnvTransition) -> EnvTransition: """ @@ -520,6 +524,11 @@ class ActionTokenizerProcessorStep(ActionProcessorStep): new_transition[TransitionKey.COMPLEMENTARY_DATA] = complementary_data return new_transition + def _act_tokens_to_paligemma_tokens(self, tokens: torch.Tensor) -> torch.Tensor: + """ + Converts action tokens to PaliGemma tokens. + """ + return self._paligemma_tokenizer.vocab_size - 1 - self._fast_skip_tokens - tokens def _tokenize_action(self, action: torch.Tensor) -> tuple[torch.Tensor, torch.Tensor]: """ Tokenizes the action tensor and creates a mask. @@ -568,8 +577,14 @@ class ActionTokenizerProcessorStep(ActionProcessorStep): if tokens.dim() > 1: tokens = tokens.flatten() + tokens = torch.cat([self._act_tokens_to_paligemma_tokens(tokens), torch.tensor(self._paligemma_tokenizer.encode("|"), device=action.device)]) # Truncate or pad to max_action_tokens if len(tokens) > self.max_action_tokens: + import logging + logging.warning( + f"Token length ({len(tokens)}) exceeds max length ({self.max_action_tokens}), truncating. " + "Consider increasing the `max_token_len` in your model config if this happens frequently." + ) tokens = tokens[:self.max_action_tokens] mask = torch.ones(self.max_action_tokens, dtype=torch.bool, device=action.device) else: diff --git a/src/lerobot/scripts/lerobot_train.py b/src/lerobot/scripts/lerobot_train.py index 1ebdee600..424d8368f 100644 --- a/src/lerobot/scripts/lerobot_train.py +++ b/src/lerobot/scripts/lerobot_train.py @@ -206,6 +206,7 @@ def train(cfg: TrainPipelineConfig, accelerator: Accelerator | None = None): ds_meta=dataset.meta, rename_map=cfg.rename_map, ) + # Wait for all processes to finish policy creation before continuing accelerator.wait_for_everyone()