From 2e8d82d44587a0a86bc4f9e15107b90c8d4ddfb8 Mon Sep 17 00:00:00 2001 From: bmilan Date: Wed, 18 Jun 2014 22:41:51 +0200 Subject: [PATCH] new testgui version in /dev/ subdir --- tools/dev/preview/error.jpg | Bin 0 -> 108198 bytes tools/dev/preview/exec_evtbuild_t.pl | 66 ++++ tools/dev/preview/run.pl_old | 514 ++++++++++++++++++++++++++ tools/dev/preview/unpack_hld.pl | 522 ++++++++++++++++++++++++++ tools/dev/testgui.js | 47 +++ tools/dev/testgui.pl | 533 +++++++++++++++++++++++++++ 6 files changed, 1682 insertions(+) create mode 100644 tools/dev/preview/error.jpg create mode 100755 tools/dev/preview/exec_evtbuild_t.pl create mode 100755 tools/dev/preview/run.pl_old create mode 100755 tools/dev/preview/unpack_hld.pl create mode 100644 tools/dev/testgui.js create mode 100755 tools/dev/testgui.pl diff --git a/tools/dev/preview/error.jpg b/tools/dev/preview/error.jpg new file mode 100644 index 0000000000000000000000000000000000000000..333b554adaf22f452fd012aa6ccd1b1250da89b3 GIT binary patch literal 108198 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 rSI!h$O_iDOVP6_cH+NEcW z|0!7(H#EdusWE^~^p)AR_c5F6UB&-}5ixl*GQ~0i&usQ}uUJ^x@nGcvw7p7V6yCO! znR2^|_?oZIn_l%al4FlXtIPY3)5;BYsF6_Av?R428-;dncu3>~6!k3=zS8N+Fl3Je zWJylTp)2>Qs~9H8H1Z&5=WflR171hI`wXQRc%-z@uxA{pZbM^l-@*X9CX5gw8RcwMCx$)dhOyKyQk_u>m`oaF7?G?OK4f!umSFJGJvg(4%{pO8pt(IU*{ zJCII^8%CF5VsK}!8nyHWWpC4jBXR0e2kO|OQC6{(HMRD!wyM*Xtg8Qf(?-c`|0@v#c?6dWv*C^?ki0%+h= zQ!DkD48xgqbl2y?j?uy88MCFPV8UB05jdA}S}ot&?(83Lqz;~Kk)Wnj;9$`lH|xl~ ztCh0h@<@@!?JgVx1PH5ttuuL)PpzZ@@oS#E1DwkIEq65IK6r_jiuzFeBeOMvt~M{N zh1eZ>7x1cSga$F{(6S9>{mURf(CYW^z?%`o{E`dKbV?5+#U-yT;kY?he|ezQ4B7pv z73D=k^p;tnrGgzjexzHO64U0aBvtkYkt*R$uK$+L`ES&w#hcfTxOlbJ0`trGbq~4U zW)9R!7E9K#v3--bTF<)omtZ~9031o3^b%EMU9SSRFHYhKoR5L}VnE3;G_uWOs7(!Jg)hjTH@a|0RC{=ysoAoB|IgrymxZ$-jLGHBSKrk;VzvP9Q z{vKEdpc`g=gsX&v8*bv82Bp1pu5I1S1JuLbQU+qA$N=-tCns7{!^-7mY7Ps^J_zRi zE6>3V#B_D;Zcaf}bdue#j@0_sj9K8jaR@?0upFXE8#HIT#2;b5611nT&Gk1 zXzFea#7bdcD2=5I3|9G}gz2Z{x7PCLL}N^n&SdYKofPe#ML~N#q#7|d*S@dXTsIuN zG}vQzf1r>!S3ZGT$#cOOlTE~elmrMHBFFkEi4~}qL5JSeVPR$n>20EQ#v-Oh@ogfo z-W-|q8=2=aUqs8-yE@zdy)3GUYb$9QQfImNdL`$lH*eiH9M+15L60lE1TvHD&7r&- zuHh|s%q2TWwjYrtk|T#!J(8XXQjhVd>qA3aFz+x|{eA#p)i6$LT}^Ja@ynTW(lAQY zj*-^#^$FMVckc(OW8Fb9V979t1@Ap5vGIRM%xdZ!t_(oc{xmAp%>wJ4)^y=>Cv|5K zXuuEjGK)p+&+EBW zkx=kiY0rc!UoEgl@aw^f#&=_3w^7?nOmG!de8@9z_pQg8+D(wdGzZqiWkiQUvvb%}Y)t-oVr|!d=xrHTCxdjos${7{;SC1Sz65n^0+j{!);Lz#O z`p!xhkqT3g1Wwrbu=_=hwygKh2}dL%hG<&<|BzM=GWPVgocu6G8BpbURgbl538dN& z8gSb8L$Rn_r+zqDP)h15?|x}dNd0b;Nwyks2{WUtZs^QReAiey70!{oG&Egh13|Gk zNmpFS*4cDQ2a@_i;b)-r7fvU=P*xy_fLCNKH)L`%CfzQJ$iX8vKWudX`9il{y@Sdr^G=ymNfDxB;y@<1^aG# z@FwZqSiD&K*UgE>u5#_>sHxkj9>F3PYG$&TEE?Y8{M%gTT0e@&7KRX!dCkwbjy&yh zb4((ywe1acU3PeSMz*%ntz8t^LuAlBKU8I{PLoH7$8-eH1NI7kDJ$ipW00?lj(QaE1GSNNqIyiZNF1vv?M|r!(~V0 z9pH)GiY(^y&|vXjJD9k>&Wx%kXlYFQ&sr-doK8Si%rH$y*UZh6oW4izIa-)OH?>=$ z06)Zmf15Gt%i|n!bvYpMVUIwve7(y32)*`9sDbC{hD|Sd2rk8t;5uha&4>jeYWV%A zONQ%bzSaJDgo7tmh`Y*0fUfg!bsFalDNNBX6-p`>K~7#){B3f%2cme{@SbGx!>PMs z%{#^ake2^Lnxw_xqq#G52WG#MzN9@H-Pj%<@62LT+sX}HcbFAhYME&A7_EC1?$n9F z>`WPbNz(v>@w>bg3AG4Cm#8t-%`sU>-ZT@X&7ZF(-)`xavk(LnWx%$s?)$tAFVm7> zmdCr3DkGNySe+*Ib#9Z1GpzhB83(e8Z^dGhi%V;(J~P5fwBqAX10va20z+vKy^G{t z%S{)rRaYVhl zQX4IPHptat6r(E=FIheGgXT2>SQ*kZmH;sTNlwlZ2in3vOm$OVv4V+5RPMnf@wEe4 zsZ%U*ZZgy}Nx42j06XmZ@Vj41&=>8n-zg@UBS^bRn_LRZI=GseP>7!QlI-)~K$GKT?PoK6vF9-YD&{BEbJ!riFO_@GDwtTFZtT;G>G*ANu4 z1Bw(%zooXbFgPggYY{x?->im@!eBV|hgvaNe5kx4T7Qp22e{>U8q{kbbojfyZ!d2z z1?I+IbD{39hb(8ICiBUN0-jK;D*36wtD8<$2?`cFDKyXlh`@t&e}tv6GDLy~vmJLN ze(HBdQ=$v7Bzv*XYzS1yy}x01QQl1xc3G;^zn^%x^;cNAPH8Q0jWgox@MpIaG}RTu3R zrw16tvgncN`|TfJ-+W>a@*^a^uKN$kR#V8~Cb_)1^Nz5XFdGCf7+QS=DoX7U9`K(k zZXKuMFH5y<*;hhz8^=+z)V3!L6?}ygPHSR1Pexm zA+$o!WFCfnqs1?yj{=X}MUjJO)kc8R)_!vatkj6MTT#moTOGVZVL-5b2_G*lF)50w zVW}h91HXdqP=WwM)U=%RBBSRASCEKJ|H!YGE+O3Io4^<-;*AIXPjfFQKq*6yM3+>~ zC48|qV7X?beL9xf$%}=42~BQbt(yVSIBad|-ArL9PyDWeUNm7+rf$uwhD+LCvzxNo~&!riYm9qf)4b;+5 z64~G1giq)kj*QHaSl~~+CO29=SF>1BAKK^oWymlI^*--k_AtWw3T`^&KIV=LNX7vB zL6jgCPF&|WJK}kUSlxFNGFS-|Wb59r_vzG-ZNSs>*yxRu;;68Uz-GbXkG7o<%xod!(vZ) z;g41)v&zrY&Q*r;6L}ds9uw(@PV_g()dME75UGa?vu?Sy1AQ5kYROm-{f z=;L7M-d~PQyn04O`*5WHklHU%{`TqpGHc=f)7vx63BDp`sci9=auMFNQy|LG4P2q- zHS=p`IbC0Cp}dxi^{o3oOjDy@nPxGIj;KcVi zg07Q2Ar~f~8%tl4Lf;!H*6LOKPE^V+f=MyqDJAT5C|!9i*Ld<0VBlImpR|92erHdU)n<2$``X%K#EplmCuEca2$X%53P2cDr^I_FAZv zv3Hk+4NutFe(fdYk+wqm6301nC2nVDy`HY4e#lW%C0T88w8<=z4zuTLl`UEnN%B`6 zu6M_ViLv8zT4uCy`+q3+Z!x!lIizzE+m zPS$+r4TEfsiG+2NWrzM5-{_`>`s$cF0^c|S@I!mZPp=!KHcIVwI*Wv;V>kUja+}0H zuZV8WBjuy1w6$(R2{2(FVwMfkkQEN~Rx{!qarfUGgTNB9UCRZ^%d=cFU>+WJK{w); z#P%_DM~loM$L#g^X$g(-ykD8LbrDT85ef5VPAvg(HoR3;D`QtOtP0ZGLVm3KCLBow zs00ikYOTqx;QO~>os$9#^hHw2n|eGxj?p6O?kFd$wd19hZ!FAI5_Z<5lH2*`VY{`0 z_F=}vIq)wHq%99~A>p_tneA=^+lnEJc>n$4NK+K;WypXX2Tt_f*PfF{@*RLhtb77^Ukm{h2G~Wk2l?-*Q$ljbGwl?_DmnUTreO z*r+314`<@P;}i)^0cPqYTMm_=kXN26Tc#)G<^`ti;zg=zjw;Td+Abw4Xr`3?RkN~b zYmH#?o#ZnuUDaPj-MQHloiaQd^@x=1!HwTdY7fJTeLkLV68Srv!XK`JjK&Y$1uEwwJKUSO%88MbbxGg`1z^vrb!C)JLs#3_&44Rbqjl| z3u@q!lhO=FSS*-AUO8QZf<*uYZQef>eT-N`ZYDxKRF@_db3NggIIdsCkQ~za^XpHL zA>PySW?a*tc&U{iwb4nJHUyzZ&`~t4B-JPNQU~CJ}53-f33N%=pxa* zg|STPexzHYnk-pnZO=*u5Popnn5*7&^mKZ-n(*|%61l~+^|V|5^S3$Q@5kANy|IHq zZx;G8$u=vil2(3Wc0W~S>Wnj>^u2IS#}HpjcK2#?R$2~l2Ih84zb$(#c4Vqy)GuRu zJ6rgg`^OpmXYPmG*tG5VGpfnlk=@GBFR4MzR1bL71yZps7wU;Z`N`d~!pPu&?ofL>`bgavV+BFUg|(mf&6E`)QP~u8Z2sIW-)HlvhHo4aZkU9VDdp$8!m+ zSCaQOek?zVKKKuRPBkz~g_l=LEvG;ti3`0>){VgK9M{VkT9!HTkw5*CGS1#T^Wc>D zT~gW{Ys(>FReGM)Z_y2%iePMyyMr^BH0iVnL%i$Ii{3J6_{sL>&1|#_C|zJq1Bogt z9C&=w`J1WT#VJ}O=+Z7fOEIRG_vAP5{joc!s^Etl_K=}x*ipRDj@C@MpIz7~bZOak zPPb6yF*a5`>@Fp8NBcntPB*00H_#Jw&etmhpPj|VLw=NqB(O?17TMP;2!iW@l~Lt4YbwR7{7{*Iocc>BQOb?i}oCb1d;wFNhj;qvC-TJ7I`l z;EcZxX>BA#H!zWduw&wE3(}E(0>;#|V4Jft&W40kW5Jn2tYJ?1yo96N6|lp+!#V5! zkTzqxo%v|I9`=vLlqQIU=JKM|HI6whK2o?K@V`5*(eIfEfNv#tOG`_cknfrlh$FwI zF6m%Rv0*UrR3Vub;QQaL#JOv+5oRYqxjiMgWoW0K;uUL#dJ$XA<4Qxt8LO|-}kxe!_lGu9;2cNK^fAhce&!T4vT@#Yw3q-P2f$f zI~Inkvn;D46@0-$?vj)$vxSkr_|st<;8Y67N0LfmSme(i<@d~NEj=A0mv}hHEmLOt z7YyB-K!=5?ctJ`@pDGp@lj4hP>@7T5ITfi)J6 zj}4c-Q>C_R_bEOj!l@5>86fYG@l2fTctzidEEAZ8Em-08>u7&$^q5{DsZf*&-lrHM zUBFOw0;nM1TqyFrk+D3DO_-2w*<1BDeBXpf?~U4eTztOfE=n^-fjiJ7le+4B69GMz z09vI{qP<^AiVz{KfYRHVN0V;mIJ2#Y1ONeQ8K{fA$r-EiMVnCDH^f+1vTWW#ROm~i za4}Qe#7vRJK|!P1^kF{^Rb~c!x~q}{N59K`r0I@(RSo+%uX^ngtQD#RUXHC-@~oQojm^5(`2tx11P)KzvP4exS!nFORVozLCS_f@9W1x=s}W-?P_>P;iNL!ODf403psWd z2My4DxGDZGw-nFb5)lSK1K!bh*Cgbxb3WPxl=lmB@#&XsqA{VV@2M!M-|}~c)Mb!n zYuoCwrKr}Y4foJt(Gea`>$#^ZZOZ-8zOkUcpm#(m^uQHw-C&|`qs!99GtC~U9g|78Q0~46cuUL> zYZX@T8R%KbxkgkWS!WwxOJt`ULjT)<#c{P#PU!`3#BWRFN@I*K{I4$kL+0vFVEYyp z?NFL_z=v(kh#ZZG6(0#)%r4^tAWxZxDcfkqJmekeuejm6lUCizHqNqR-E`%iSTCCR zKE$D%kfB;ymKdrkv4FeOL-~sUOI23t)@z2~pN5_&tS>9319Rn0IsBxAseWty>a-on za79aabr`%_^&1=V8qwl%o0UhUm+CT#H}x;JmY9+Hkn+Euck@D zg1q_`J8LmN>?=m<^Rds^W>L5vorV9+AnvV#s$hrm#+tHqMZ4^qx>qDg+7T0AMG#s2 zaX_6QZQpZ#k;}*@D3%W{ z|El_Dq=H-F?VZ ze+*FMujnIHO_{w{-w@OI^mmGmk-MC>?>@?MVKwS0cFzm(1&))6qU9l_jUESzVI2Jg zz*_h0*##5JO1lvSa)Ey3%8nFQq-0Ors;UMy)=r_1=11x|w03~Z4|83Y)(Fi!Ghu2V z!zL$&iO7c67O7W%EQjeQhtg7KyxuG#kfBCQ3=17|i0EoBf<_L&F6i1{;5H_@WV8dz zz@tYeuStETxO@ZU_3}ncu(!AQ`qQARs&@~pVab1f#r%L<#W4_Kkyu(i zJ;~q#-FXSCWjeDU>A{PJ`sUQ`iu1uz}N88M8s z$hFT9*ch;i9Gz@MBD0sq7?5?WI86Lpa&zwvR_v=y{wro>W>Qgv>z<=>kLgyhR^jagTGAco+)nk ziqHLq6;jy*k&I7ET|K?m~1Ot@%F-AiLV>2Gaw+754jDQFLR39jD#pbn}v15 z_v)l|)ilgWc=3w!E(BMX|8e^ek->>vv%f{tKYl*ko`{b!%ETW04kw+l&$p5w)6>bY z?SCz|p=aU>vD+Xde*gwPJ;VbywZs5rjGPQEE<#M!U4oFw<>>B_EXeP(Q)6CivK^===J3-4aE#^|umhOW#?5F}wta~|w(2;}duuBun^t9ZXJ#(`4y@V8_F{){oo$zhOkGB|Z=%lJ z(VmeMzmWR&@oX>054gu%npQ0HWbxDI+ERupNwzBd14FklG+mhTT4z3D#Q1w;6d0Ef z3xRNJ+}8AKRB-MZEZvtVi`9}$H&6SBWoEk5`JQh~z{rQ2@%DTUE2o`BGc_0r337Jr zM^XcE>JT#>_^~))Jd<>^c44I>QcEfxF1!R*(>ia1NQK5JU9)Y-Nsg>;)sujxGJSUa z3kQrDdn}BpLmc-OR-mA@8ip$I5pI?;fvy<_T0nvXmlbY;?UpD=U(v#&APAp1yt)qa zOrJ0CCudHg!EonPn`o29_?98hoP%XGXP?MLCh$6ygq949+Tlt{s@K$E;%kRcfO8^k zD>`EmcvEQ}9B3#s^`^4|?wRBVVK1)6*;+PzZG8>KW;8F3v4}`}nnFG5#1#|wgDflF zFofiOkvR!eT1_(MI;NIlGP(6>6Z}>tg+#5+dP>PC zK z>o$9=pnSbNVHYynq25*ng#`1Z!vq3hCgsM`Te$V5FJzTkZG)$M9jpHrIBw`aBsi5; z)N*S_cdAAO6Jpd`M`!b(!H9aw3`Y5x`*tvDWhFr!Y&<^JY2W!Pne|p4-H6a7&`MeU z{D)Jl((tYLL5;43q08}H7t>t;whJiN1lHW1#K-cf(@OR~q)P(f79r)mjHe3J2?mD#viV*ghukBM+==<`#m@0`-s8kb2JeM}ZaH=&&!6ZlqPs(|bTMYA> z92d4=ewaZ*7&M}+?h$XtTgpqErwz@$Bjac{z3Rc!cF2-A1$EgaSpW++Qru@uHgd> z0`bwU?!3`E=l#>3&&OQ-0qt80I6l-;!j=6n7^B9~+7qOu9FQqj7 zX*?GAAJQoL6WZ6q9ZQXorE_f;?V$u&e{_7-j*4vO8N;^S`|*Ww*ADcd$aW!LIPwcHM<{GXqH-isC_$W;& zquh`s@tG$Xw20i763H`8bSrpz@760JiYSU-kl-`)%;Ib1G#>=9t7GCk{LgptuIG9p z@7dEkQUvft>w7C2>=`?KZ266*`hz;ql8cLpVcZr7MI9wxlBH7i&r(?GT>9etLjaZ} z!D`Jvh7*g)nRJf*AsUD^BnaJg%Nx-@(VhPxO~>0k1S^p2&3&Yffv6BE#ewMk4rAeo zg5M!GM5&x9guq;OjGAE{ptqZ_Km{;wNb^D)#rHUQO2>}2xx4)v=xHfaj<*j9;WWSQ zT-|UKU;(?b4%}FqVz<%=99ZA0x2OKMs@6N5i5f(Po@6Z1vG8Dz)S9@E9T;J=sU}@0 zdG~AZNb_6PDQuS14xD*OjUxibUJz_N;y$FXP@)mqpx7SIqUMy1DOQqPg;b2{FrM1> zn9ZAM;3@tt!UUHDLq}hZoB*%fRpzsPmKv>wLy62MpPKHE0V&aI<0D3VqVf}V z8r@!#wn^pfS4&|t1q72R!}vQ2yBL4ifn2o^Irm^Oq$Cc*Lk!{uI0G?_f$kZt?DbEP zgxb~3z;idBZ}i@AG`FY~jw|IZ!kMiV(?2pjc1SEQY$dOmV%|)u&y>p}N+{SLPOlmk z5jx2z8H89N|Mo#i9=H!n{`*F9v-)1A(kB(NN7NhdQw}mReIq+f68ID!4?49Fb5?&K z*qCaj;=|$#YUwixrMClc@uUQ)CW_SEoZF^p$u59Pv9$kBs>K7Idx+*-Qseg^V0Uy2 zkNvN7QbLE1*7TDwn4y(_B5xUJ0z*DYgu>U)pt`iQiH4KhN_#xHliCxgQ(r?KUd$J~ zJi0F_rfXRcHAs8TJ#R}5jj)jZsB_5(H8s?+b`?`h&CPxO52=my*g{DGev5G}ZQ%qe zrMu4%e;i?;0P+Le#lxf_9lmb7!-DJ&49h+nFxb8|xsV6ncK@)`C7+5(_3Qf=>fa2i zA5xk<^tOQEKL*1fN)LmiCkeJ$;pMinlrL=`Se($8^g>NrdlV-PV061vb{X_?B_L0&fi`LvSd%RxM)?sm;e$Rw9ectG|+X zE{tBZ+EA^Y`9DwZA8M@(7lEbBtFT4{<(~~lnPA;c2c_ZHM?rT(OwNiqCLyN#vm;y4z`bU?6MyH5@EDzCtH*Hz`&=XC{$7tn*}2SRvYPkd#jTq+$-Npm z0|`V;7V?Nv;Ir9Br1S2~`BhE>bIY`8-N4?VHEYCh!DF1LV&>Mc#WdF8kA{75y~^Dq z$m7GVaygAqT))-V=U-}px#NHQRt>@LP?l13lA|X>e$K`R(+;APji<%EKuRLXH^E?Z ze!2Kzmy%_l`^LRbXcYM##tKuiDIUCOKTCG*A;zNvDV~`1G9M7#4bd#_PTrw`;4m7; z{MrdZZ{&R&l4Mgsx6=EQuJYA!b`t6vxnxC9TnLZM+^Ni;0PN9x{!to4PE2;nm%7q( zJCDoNk_d@7bdqthX^D>Xa2oK_$JH1B(ODTt&NpT4Mycg4 z?E3G0K|sgl`k`L*fV|+eCF6>-7L7IT#*%7hiBG?9N}j2HcyMQ@;_|o{kgm}Yv#mwp zEM>Tmf)WTxg4jw`j!7aOV^Q?jv$eu}C7`ixcxj9sN{J_X;=ii;(M5-9Yi#T(ZQ{Rv zJuK@$3o_-3Hg*~ou;Jjj_mK$u=Vb)*_H8cSGC!^i<~p$7u^Jcw!UG=Ke+j5l7*Nqs zy?ZLPd`fEqzu(Ml{{88U4)!lLxZwKA6Ijnol$9{q(Hd-aXS0X#09G*w({q5J27)+F z-_rUgeb(w14O&y5ZU#ZV&^CPf?C5y2NL1B;#y=hZACi<{ZQIAHZ)4Y{)?}NTk54!T z`%y~2Gv1QeS4^q^jQk-g1d$eWU_uI3CKmG_pS|;)zoF}v$CY9*H{PsO-YFCC!9P?J zvF$hlyi%;GjaRTg29fEn&fBEE^PIe-Y4*v9$xJ`y5Xd0i0GtX|Z;dhY|5$|AImKP7 z7kCntM--RvSA+rLLO-{&DUfv*BvjG@tzfzj6I?*tv zRr1?rWI>Yb<5IsDdDCEc=io|7Yv>{Fmn!jd(|DeOIcsU9;Wdz8;zsy*|7@!BidWIhhBF6>xlA65011tjYNj2LAobC*~hQ1zUB64#g)yGs%8Mhh5I zyeyQ9K7bd@!J|rl5C21od^taE(Tv*Gm2bmb%l-Y2EruJ*e64Kw-{x+8Vl2mhNJanX zaB)!9>-~a~cjAV6`M6yhR0$>OpBG~s3CM603#qG5-3=v)5I6&ZXoO3hr^TjY{|enx zKp6!0DUj8WOh++R@$NeB7W=u~{j^9~jfnYj?+{Ge7%imPMKuC+U3h6wBW<^|Jl#51 z1`Xf*6guYu8WjS_g5Efg9|D;h{s&M`myT?y$&dj3%b)R_U`F z3TXG97*AIFC;`v=mYQ)|UUB+Kfm9YX_!Zm8V*5ke+W~|ft4((_!Umd=deAv)!m;D2 zLW6qNScbmcIgc?>+8v^P9>%iAp~bnyh5j}N$jY3;{Hge%cE`3WgR>>>N-BY3#rkQ_ z*1ZVB&5Y)RTc$FKr7(>e!k@C|S~&c+$_8ygrI}qyRq9lOKYfqU+$vQS%?3}!=({B+ z>U?Bp$>6i>n&au5uUt9KLQd=6hG7>cqRV9mGXvJcIuvVz%gl=sykE@3*LjII4Muj2>C<+ReaT_MSmIj_?f6`4fY4$<8&nnHN3V^Jh)umZYg;gg42O2OSKgL zA-!k+6r5sc6(vw}!|2zV5HE|e8UA(KS=%>JkRU_=`~IgUh4hj2!$zf~ms>|TWK$5r znKa^Ww2t#0MVQvfIT8I*RRF@uDl6|okenj6RubVWiA67BxFnC|MLcSrd`k-hQJDvv zU+NfkH0s4&k(?dhJn7Z~p<8*JRZWBO0^B9-)jwWGk7rYcNC}`e28jV5WO!7f++74K zIHmPNS#SktG5M6HC&sN3mheO8+4o4C$tuB#@4z^F5au7Y{`2I!r3L~cEaKZJovZcDEQg!eiteW^;` znB$cA)*Y9dGu*mkPmH4c9cZwr0jr76ySU>{W&8eF0sAUyzM3|dyI(UdXsX3^m{sss z^@$Ft`Oxis{rh}OM`g>(k!A0{<12Drz#E2wzfis&!v~&Jw#~^+?$}B)ZCj8BD`KX@ z>8+!?KfL=Q(l_7n1fnr&Cd&%}6Bik8o>?4Mq!A=HxOG0~o}-RNMgwA&LV^od96lZI z-0m4J;|#jA^%uRZX{rPIdAd=_bHl8U5u!7-r`~?cA0vqOM*lf?dOPuI@MaK)2g9ht z$Mcp3VS`)hVdD0t#{K*UM^~721o`NFR$*{@dfl}CS*9qce z78ZHM-<90Fl4!b0do0Sus;8e5V#q2;85O%hgP)QvD;!;}l)777-kx^ulp8!4FksPD6=E7)&Ya0Vl6l|6|J;DQ&yDs7bGHi%aX z{@U!VG7#HTD1>;46P`O6`QfFYv21D2Jk}!a`0B=60#$7$=D4`|{MV{fCr-xG{shL6 zi(#zROIG5Afi5aG{1m|lNlvj@naQWR8uFGbN&F<<$YA#xs@Q!a-6$O?pTyFje^VY? zl3V7bjh|}psBd@rZcS2bekdkb?hxt$Mn|fI^%g*7HL{X&lORWL(al`331n~AF=_EF zB2A)s1Y#JH`1&vP$8jwZY$W)8(Tqilp=Fj)4ofXQy=X3rCA30UH{;o)eNW6f$ z#)_FdKZJ)k?0}K~=t1O)BYpNr zb+KQ1b?3y+msG!fwoFq|4S8t(B$>$PU)0*ZU1~RNo@VlM6Yk~!}*2D-C(Vy zWp}p7)J=Xzts7KN(Yvy-4RNs?inY1&xp@8Q=|>u;R1s%|#R=j!TFOFlyjJFnM!oAq z-iW&YuJRXh))U>^u2I^g zAC$rVLI}k!;wGMsaWhxjX_C`RU$iEwVC`%4L9Ok@<#DdTZQs;71zyYN{#m#}5E9?= z-YJ<+@cj~dHv8>=@w=}fi?Mk>U*i4z2*$vq1io6nB<;)+AM{y}Yd|{^NlxSXamBq& z;=edG{8j$k=a&0;_fAfwC{8j;q0MjGiCJtYcqn*JAJp=;rYsP*N2~gy)W$}$4RkL& zI+=jgH2a4&RGI%WhkcaPYtifu&u1G+TKPR^E&~pTwztpMpz2Rd{fS+jv?|f+{ze~l z(hBZ<)z6?!RB~PL{5aqc3mWKHAy-e7F3&GcO(7!jN|N_(F5g37YuRMIZ9$QUxLHkO zI27=i091u%DpeJjFj{L1Z#TH#B}i_Ofb+j4)9`V8C5RCRa!uggJ*~KP*S}LhwW#9W z{PpcDS?jsIaAa*mn2;e8*3NqQ zriq5>S^LC7Al^&#EM06}Wq2SBue5Tw(#D-0OY7f}AX@4F?et>)Paw@a1z}J~KtDyq zvo=qux?{+ z*SPb|C)x^bfjXFq>Szex(8)TI^4J$t=tY09j^1r;q}7h=2ppQ3c0}l?Uz|d%tDCxS zLvy76u7+@KZn6?k-Ip%Jx7U(xnI(2n>b=2_y54b1IM0v{E_t`uU0An*14Bu-ba#UwB`qBa@*K{m zbKZY(@4eQ#F5*8BqGZoP1hWUKoOX(H9Eciu1W8}HloHxhAL``M^w%`=%QE*6>yEX4 zLmbsms@GeZ`V4%@(=HJV0c;s1mBM1qnWh837d8u8hw1fs1z(zKhnV`Bju$%p_rm86 z2~UA5wR1lM6H|974qOG~87F0#QYOySa1)P5XADO4|9O=SDO*(I7^`U?nS5_C{s90^#a z7vhlfkNoW9w<#&5nKk~ls5ZJ~7nH^}@2HS26 zzL;_-ESvI0rjQf@0N5fYI{oZ09Cvwi=9pcl-oE?g5sKljnmO^YlT6ohS)N`SM$;{4 zR81^U#c0f5u{?L^dpj7M6Uk)fAzH&M!IenWUPvPh-XZ! zO@NhT-^|-a;dOl3L`1Mbr&!FgzC;C{iuEu4VGc0r>F5{%r};YlGs`ifxheFc34!;T z+eb;>q1N&Ri)m>uA&e&Y@4aXYhn+(v1_a{rN`TYU<;}gnnK4PRX5>5*cd_u2I^?Wp zxMIEo6c`Sab*>wl#@CH;%ojgia|=2X{z6%JZFnPlhNQEK75F#2zyk#m!!3XL87P9; zZZ+TrkrNXxB4E9|mRgL|e`XlyQOFf~)5dZZv=(C%??>V7V(*rPwTtK9l)JH_XqU^g zzJb*k66`jn6>2^OIBM{$zZW$v>k!H0V-baHB*77z=?)p5J1AoG4ujsFa;*aT-r7by zN0HkVzJhRML0Kn}40z5EwRKgvaQm zak#zx6>nrYGewE5lI>jeI{-V5#-sB5Cp?1DEPVtKk(?$zgRQ2?JuD^pmjOpyE8aOxJ7 zSXr^NfKMy2GbiW{R7NS7%?3h7<*Ts!J@e(?H`y3&Hi>#lhIYB<9sFnDsIidPiv6Ss zCWTV8N|;~VPG7NejDqY0Zb}MyC_S-lqDQ6jq;T z=y3jf3;i!gl%w&eQg#sPrG}(r1H|BusvT zpy1`%A1+HxOT)N7 zG%Wj{zFHgeMu7aZR;tIyaxrJivcZ;h`_R1`*o*9f8vd@v!7`j;uaieVi(kw(?kfqB zkkau)rSmvWz${V58c=hLf!d7oMJ~Q0p}AF%E8;{(5#i)&zf~~&Tbt)4U|*^U!OvPQ z`F8`S&Qz8kOMk3?|=iB?!Ep1egYlk z_iivWc7d_{*>^u3+A?yQbq*NnL3<6W^=muGSU13<2iW?)?g zmprKDI1@Slp<*=nfE9Yskk9mtB3(6AHpt5a^6&1U%6=$Q+er9vwlE@!>lRKu>S-yI zbwi7YL0MXxo>F$$9Z#7j5}Bb%rYwSsR7O5(@t5))Q@-I+ez+k1)T#R|+SP6UY3ohU zR@Ivor&^DVjl5KvG0y9jBJ*!}HL*Ff>T3r0^maSNmf|_|hm}c1ytETHRi^I=KI=D) z0#@U;{g>N~IWC*&@#iibLOH5m(t z3qq>pf*ev`fE@!*vH`gy?4!b4`2!Wtu=DuR zHf`?ZH%KwN-^nCh)t4`n|dhpsh0znp9PYQTr$xmdOMOBI39;!^~&`@GkpK zfH^M(KbAWoA4W-q-d#6^VN{*4bxLqJVIW|cKq7wYgO{Kv^%2%C4o6LJ8ssO|)NU<5=?S51ii^dU& z$FT5W`oO>3xcdXfI7l6@G}J~-A8^~gZuTB|vqP%!ERJ?VgId3?gzd2U8_oNnF_3=< z*`}-Dz`l~fED0pi4`QKag>5xok?x5_Sa=k8PUVJpE4|B~S25|kwJoUEHuVhTbo6jn z+5TQFIQqqqU!<%sK;t}=isW6;h?A@CkBJ z(;+D79j_eWA+fOsUORu5BFZG9oy|?&aD{?KO`@-Ovy<vc{T>zD{1kM_wijYaKc5(?zYtPp)^_^8B8 zf37Gs%fz)PXJd@$YuEg}_l%OChguINC$Kn4ntOQe8^-LDFBmqhP8e)?xuT1j?Pafo zq9%&u{yz2C$ff0ce0*7Witfi-XDZ|9jf0@n((L;`We3y3c#raLV`<|^2-F1}AP;JfJJJ*q!~rH{Ff5?uZ*`0&6is9ku-Fw0oQ@LdnL zRM^|^L@Ks#gaaac`iaTKSBAPg!g2IS;((8RgVuZ7e9 zpW{XR;;m@}9PXJzq7vTlB%~AjiSvc{kGXgRLK`XGp=G!8t=Py< zwSJBhw^GvbkH#F{b>BR!SE+SmPN-E@eN`3{OQN(>Bp;PX2$feBIzL|#N5S~aX1Cr@ z{@uKo`q=t~pt-22|24nd=MGZ-TskGU_eavG_GdFDDSHE}$Yjo)=gD6G%2o@`s1&R* zc9sB`B+v`sRZ@x@Ki0CwN!x=_vlC!T9!sGUx*_meNcsYp7*^H8Yp6d8RsHMy;nGjL zp_md}!OCLFZQYVE$(n#%?-m<@mIaixUkhm~KWYOxNj;G+iD{}Pewg=sZMmYQO@2S( z#gLacHKGuqBHASAJoOr5IKf2eSoT#^1b@@f`s>p<(9mTKw`nX|vIrYZW%Xy{`bIfA zPu%V`j@1=gbOpW5D{jCYYNFOhGM?kVUgnkc(C2E6Hp%ig_9J*RL)L0iA*G0{nK-?m(aGzFu8k3l$ z3@vJs^SBECg>^k6m6MHIVa@2>;_ZpF zlQZvFou{TE<;EsUo+L5Cfq6eI)#a@CySp(8iPi7{YFN0i>Lh*<5_2Bo&><({;oog1i`tJULdfKnE3Griel3uq&j; z?^FlajV$s|9h2*?V29^U9X25%t(s!dmPVWAsB|wp^@uD&2CaW^=Jyvjn^iR@bd%>A zZ+3~Tnw4H8-%#ZZst@lH6IGy|9;B``Fm*WO6DN>LIJgaY#CT)rMI52n+7s{`nG_wf0N-b^*Oks|PMfv&j@{8K*XKXv1a8LfH2uw4>rxSNv3cv;_cfa`TE`au z-?^EJ9^o3hr%pfM1SgC-Pb`*W4);1XsFzfJ->j097Jwa1w!CB*lWt5}7|rysoGkL> zdX5PGS~Cq*#+}dZ^bY@ocPZOsi^o;cdgs7;0CapqqZ&J@?s3_=@DIctWS zXs3cuF$n32>1($nrIJ#OA-GWZ#w=CBtGk#ZwBJsR{OOOu{k{G!b!eFJB8*Ns*-|z{ zV&4Q*QBCDo=?#nR_!oXdg7g(-M}jjt0?k|xw*dMUGaqC=8$IQRjp}gQkS%@6EfxV+ z&pi`A6CiIM2UFal!Zn~6v;E4H@-EPin2Ijs=+ z4#&gS^U71WTCF=1`eExvLO^F4W)ipD_^}}K^K~6CI?K=0P%WJppn?+bKQ~bf?G$c) zYE*=DR_Z~vY*4UJ5g3TSxVZQByxdUP3zniL)}nu);>rhYQUmI3sMF;6nq534q&kkF z5Reb~H<5~zucNVZ>g$jvgq(M+u*ulwB41TodLMj?*u58keZZv6PTA)sCT=)toM1_{ zH1d>rJ^9_!E5GkqKxyR#A&|!k+|r&Sf=DJee{yN0rqGQ&)d&~)^XI`4r~2dCo7j)8 z*RQE=C{HWBHG;N`d1Ug80m=yz__;D_7}*Aj4pYO(|Hu2_>=%ie2Om%6XV`w7(Wl=( zRHb+#vHC6S46*!7X~@dv@)fNkY0fy+k#zefFAIFad^g~u%TTu|6qGN#gAQ53!p!0s4VHCH`%2J0P|fIi*A(IARWWIYsohH^+$A@xPgZ!) zWe0^D%>LwaUTrF1YoT7Hsm}iIS7YzN9tzNbKBJf$WGen`quUFo!7rAPN4Lt>B5 zjMpMgJWMyY8)C%DBtiLUsea1z*U;GRwP39-w`w7QRP79H&c6%VG)wu2YpQ|c;!ADN zPH84YJnjX&Mx*jkN&W`w4WiSAsKNs+q}xH`W9jI)TFn5jrdTt2{ zcyTpB44$LM*f~TWZ10TU4<3RneOVW0KZ*0O)JI};96_z*Q;AimEblGwi-HI=R=d76 z_bdniXU0HRM5#i_X^w~Zg`3;EUF9>DY*VjCmS?|rMRjzTNh~INKb7u_RqiEJTT7Ez zvb;UlMvZtmw=0z}VdD=Ee0#rLe~y41QtGA>$?jJZE(_mPn;g;%bLJHH+MPUSJ|@?ztY{5SWBYqa5{zG;Yp%eF8-qTSpqfRX$GQ>CMjkqvT~ zphsw^FCGbGVM0kghK==ZJ;1Y!KqIFN>(Bo#D#&U-w)C_Vf%^_8G6_ANBLPDO>-Nkr zO~s>|>m|w5SSD(!0XdBZ*YRNq7`Uze0pLdm(z|H)rWpO%Ut` zv*E`@ZrVg=17+$JIscz}i+6g{<+}p=A(+PA3-h_7Qi(g#H`QkNXaq%vxAVSxHH+A$ z+<)}F0H=o>ulOfSle!PzJ5B;M8;b`}+R8_ZQo+5J&Am=a?Q%ywpPz z^fnQ$64!33?-iyH7#!`KjVl^xB{ZgD!;j!G08iqFK;9PrPD`9{gBWAma#;EuM0&Rbvs8#hNKT| zaYml%HSIB%;|6K(<#$(3@Wvhu8H3b*7;OJWJfC1t$Kh)hiZHiQ+LXFq;V@gUC>@oI zKyK}n9z1wiKBrhB`eHM7Ou(pH&=Z}gh z$YLhn;6Efi+u?i7Fv;a|>3CLRA1h+kigY>zQ(t4II?fzms7cp@DuIoqS(TE_mLL}t z*Uxk*S5@AOr9WGKhQ%mFY!&PyWe_*+!54`tfMy~Y)8(d{^;<(rcr!Lbh39HR!`Q`U z389ws5N0!i}Md%0*#+EnNm2XvQhhrRw{N%<%h=e_$^!aq+Nli_-PR#@4+kc9aWacm+&5U`WwJ@>R@O}>R*ED+kDl$(Y7c>aOyCdMS zIW4N`4&@y9VuC!L>Ua83rjNHS+mYKD^X0jow;#*?|GRtf;dl(I|N!nC~!0Edgr(!yIy-Qh+d;lf9eK)d#rBbr1 zH)R|v3ySl=_#b)O9QF@nuh$ZJbFDAvr3y$pTTM!q0A#jdmBRR5^bWh>2owwNx>+Mv z2bWPam8mD?Dty^|Zhd81^KECLUdF-nDYcgF5A4N;>^Y5N7ENb^swsX;#uts(_-H1L zKK|ZwsDuNLli8%)Ek=y(#3J`_Lel{w|KzBrlkaN9sO((dYlc_-Yp)I$-d^9ZuWX?C z4~e?$J@2qRKV;AaPLcPatfz9as!n78)~MGvq(nS69$Uo5Sv^}$@2#9xf?_|A`#azx z&|bGJsnnd=InYb`*q3L}w#`P=A0c-jR%CIYX#kcr7g6L9x0q}50(`am9Zw`WVd1K$ z9`JNqEn%d{!qqOS2PEf9dZWI;zws%cOgkm*)2o)^A-=miBl?xv zdi6l6x+iq!AMtkO!&@f%o?kCR*>&p!X`BM>%-N|2tZZ_M{s&i&F@a1#&n`9zS6U|h z_fvmMoi}>Bg%2kHWgOS>E!9AgYoqU+Z+xG*D^~(pgmKxk#gm%c&eu;#X|7TLp~**! z18GW7W#qlutkn zhT6uM&-h=HU*R6+W$trIi;Y_kBUJ~lf(RSu{^0VG#_lP2NTM;bj z^sASX>WU2NxjS-{6+cW2DlUt!w@+=jK0I1SxK|VvEXEq*CWE)$IYF(Mcs99 zY?YT5=RX~TcfJ|8%$Z23pE>jF3Wr@I#S5%|BQH3ecP!0jAGG$!mBa5G&ngZpuHYPb zzT>vTRVnO7#o78=D2vUVSs~pfN+CY0F4X1>e8qhMBxi zY_8_%QyP4wCMM?L_)>bMOhn)CmJU<0oW5K#y&~d`3CWi;@&vO7Vj-hRDu)Ss!5nde zX%z!nEicZ+ErsqJb2T1$c>-MIjGr0*tdRz7DgND*G^8Q`*bJM0^4o-{l1j8;t+Dwi z^RRokiealyV*brN?V1iZRX#>9m!piZV0-+#lo|Pt-PN8Nr)9ut0LOZia7~}ykHS4q zRhhKhA0l+g3xU$1B?mFS!kt{LjhsgV&8SCAX8U@MC&RDE;HX}g&k;9NG@L%?74|Cv zJjrW!>AJQPU(K9H9O`Ymf{9&{+VtFJs~sXNX{B*N{VFBkhK1m?(!!QzB;K+MFdi&g zH1)78gE4BRtg1Gbs9zbkMUnN+MrfT~_3Dq50*}~9`(|1jL~bwNs_DJ`FQxO|it&!? zqFJ@@A;jsFiFosG`S>$ZJ6}q#G}~{ddoOWG68v;E|G4{jH&n26q14wvWcN}u#ARvT z6`X_wV#naFQhEad$?K%6)*N9HZ^2{VRs>STS>;3SFm|DXHe-Q$<}Mrh#o}|C`d}3W zR-|hjcA}(|*qad!1Y^oV1P3eLXRztprfWHcKIZ&REvN`Z)P-$@2#pyb^JvGo%t2u_ zoUDMd7>6B?iKuSl75Ph!v&}IRr0~-ZK+43UxxM$vvD&k~Oy%P+4|nh^@P5GeKO}T} zO|z#HVs6AZ)9Q!VRHq;5Ruak$pCRcSwS<+m0x>%z7D~~|dj49v7b#Qa_u+gg{iExUFEc&P$iZml^K z-)eP|LZtThN?GRcbk)Rm2!(29COLGQP;1N_Q45B1cZ2|gg{Q=Iu+EjO(?i4Dv43v` zy?EG&`FA~^_sUQ*$xzrC)jgWn^klK_Yw6PuN_A*YUvoY2trmheA9XJTMw^_0q4 zVwsRr?X0a0E5i-hykDp(zKzvw_D<^giC^|z1#n6orn@(BM=wyKkVg}nEc8fy)YKG+ zeujIhFW&#V&@f=+U}+4Kw2Qf0mV`QIq?bEuq0Dy_D;jG}K9qhw_W8NVeudm*Gf2af zgq6Yw^wlNd8LxU~+|M-ChUAR{{yIW-j4q!`K|Z;-_bAfJnj@X95y)|8TUwdQp9xKp z8G`=|+i9dOD%ko`B+hKIr&Qta&QuazR}FXUIhia{>y5{Y$Nz`)X)B3Bh0*wj6Ml%< zGYsjj(&UV+*4~Y$ns(GVcd&+SIOl^ux_rn8l6RCqSBQBZorjthaRTw0$B4vl+B|rO z6%(mP&w!o{L_7wD0?lSH;nHcjg0SARoaUx}d~w)LSk_$dxxFTi?t&MyQv$0nvHMcs z*U<$l7Bb>InAl$6fID|_DYSh7@lu(NsOp;k#fH%w6=&U_FH=rCGCDF*{U@)ZITVP@&bxCp4!M5vdV7ok$Vo?9TAmi&!}fxY%=l&DlEdp~*(hjQgD% zG)H8RfA~u!qBej~*0Rdg8oUK$u9;TdGW|KU;f{kdb_2jB7-W|1&6Z0`c*?AMA+ouIC5YwV) zszPoIBTG|pj80x&&Z2dk2<6+9}kDJjMyD6w*zQYDbb5F$zr=@brS7S zPSCI}P+|b~NbNj9Dao2qX*Y$sJ2lXQ;Lkj}fOXg~S zaGZ)aom*RGh>NDn6h@sIWoqSH0!BxxU#9NA*qSJcq#46di?N>Y$AKCn6P5~1kBJO~ zxCAwG7q5Tk>a7?{H_<)zi`MoFMca>M+&2@B^?~Ypaa-z5J&9?eNv0YSB3X#|cU*+R zR0@?cDFCVumxU=pue3`y?8o%aMe0~uNt$y2}|_2uB~`xWu;H|F1~;R%zDdOsyKpWTEU7An-_3^6zvdBaq;c)DY# zm;lI1I?m-~=rzPq0IibOKLd+^C6J#rRe06L@yv4fwZ!v_y`cH~He>tw4I^X&DKB$09a;9Pap*kBN1s{g#T(sLAK9BTJL|^nQ-p7wba@V}-&8(&F?d`0 z*kFNm^g2Fk0w?n6Y16d>!rpj|gzhS(oX~CR)&TtT4%d3yAWsg$MlyyQVJ^Lb8_!Vq zA5y&l3_zVCHZNAauC6c-;R)W0ZG6Dx7;T^qpqBpa2&?9;npYAUt|;4dUP)JOG5&Ti zyb+Y}Tn!6}P5i0nw?c!>i|ESCLc!P7epoW2lzpi)i>oFQ|xoa}b;Ru42DH1&)KP}H<-wqjvJ zO_Bj~X37q8AKw-yNhAQj4iU-0DV=re2`!p(;I@RjeeMqex{QgK zAiws_onZ^hr5s1NpX%ctTUM)*4eXEZ5O?efQOpNrSF4iC5?({$-Ja0e3 z&%|Cb5qF**Mn0(h^%FgNY(cWm7=yiT0>j&(VHcX%^x-+GvHFx~xcR6qdjDf66VM?fyLtXo7M1C?IVavD9ObR- zCl62-&%=Rau3L~snnm^xS6r95T16Ws&E^;j`|@)azki0~yUB&fVpU6lo{k$W?NOsA zkS$%nbofSF_kT$6I)X4PT|EKuYMF}T3>9V!ErZpSLs9AhRr^?f4C!}zKOux-G9s3G z^i*n>Y<6r8ceK0zkX&7S6H-lF+NxO^Az~u*GYE&XeAv1oJ+L;U#ktNuDEA6{3rsTq6R4K;>rAsJZw;ig_fImw2=dj6>cRfE3yK-P+k)Z&a&JI=M_b(O{Sj~TkQKY*&*@k_#v#aGP) z=weGtrGVv4ztq7dUo+`)bZ87r9jdT(2~UY<9!#FBS~ddP)-r4}Rx&>=`JJ*aN^Dw7 zx&uJz{cPD8r5$yWe7L=t>10pEm9J#zlwGV$YSG+N)H>uEoBCPofRuQ- zAcCd{n@>C&%_l!N?aMEzVYNjMgb~( z077)x+lHk#y3u2l!bCfU1;Xt3Ef8o z1QDOfOfl}xb8vY|{lX_#w@Izv_ucysNqIHyg7cVyxSck9Xu>@=u>D{A9n%X`nzcqA z7Z{%9)BZSb%1QSwuk-S&`QeV)MNsP>X#OS}?`aLr$Buz~Ccu)%8^)%cSYK6j?B3{0 zq=H3A0MjeyXxJP$T_pJz)go0nV_ug8;hPLQr~Ugy$kwITK_P^QX#cVux4^jR{!;=pouSWN_yWr zx)rmDFnISX$1!K{*ZaF?dbH7#54fHxbKCPAGygOoJs$hEtLS);+=Se-&VkY^vffIdSTbbmELP}!4B5CWS9r#FW;n#4pcdd?~YO~g$5->{K zHYJQ$O|HoPlQS6ooH3Zr)aavOkUlvcPo`h|xS{W^M`dA{kqR&T)E{s++?5xop{9_= zK=|-%*bw11;ELaoI|ZGnlYrMar~R)7l~gj^Tr%OHnM^PAo9~8g)Wkcy~2fQosN3Y5&6xd*3PzoSIoKg~-S7ug#g z&np?Rpvo)INRS84LK%-v<>+*oJam)Bv`XcPJ-}(Z*(R4WTtG-A@%FlSl|hsOSx5?U z7iF*We@IYN{iSC6scENWt#tH=nJ#<9MQ4;T9u-de1d%&g6Iw98XPoG?xcAWPsgL!-PLwW+mHj}#IW zGZp}<19mer!CqT&7&}q1bF>ZTxWe}&Rmb>I;$uU^4WokC%J18Y)Qu?WjzpWb5@RxH zo?unVEKwpCGpp4(EQt>+9xa)_19HR*^`-^Po}9IqCt$t_q-=$2OC?1HqXM)e^i+CFKG ziQ`qxNJ(hX4a;*Pw9OLpbc0f@X@!6@v8@qHttt{*i)@I#JxO)}|JU6#{uSy}qv{8u z%^+pwnnOz^tOjN2$BFr>S72+NW0lY04cUK4MxijFuCH1gAUbNe4=4c)XJoMuP~ywBscYHzBDx-*~#O3@H&u7z)4J;safv!5A$J;AV@R&Q8I(dFw&MdbAFYZEqgj{Un2M+;8hjS6DT_N?reN8IF75{ z+Eo~DGh!`LI+W2!|L#YyaohIRsT zq7+O5FnHzj+lD}e!ynV+R4|Zk`Yo0A{!Kl#K9x^en{K438tX_)hSU`QncYVA;$zd3 ztlU6F+hv|vL9ugVX`zz-8G8e_O8C*S${XuaXjNF7g5>T@BTt5>nB>aT7G_gnokw=U~b`G;gzR z#=U;)5H?%Q+eSByvKzApYrkV01joITd7)s4|UQhqT5tQjohRo5SUbBi^X z60jMDjgTo-8`y|xqsNAa(8+5nOLZ}wYIsmySO0v2Om9B*PN=M!kDTrYbEqWbg}&X8 zQbd#}#ktdioVu#~tJ_Y;Af4DZdp@Ts#)mQg0C4ojlI~gE%qmRl6(Ym`klOjJ$m)9* zE5<;cp~0-!f0sVzx!G!(x?OIVwS0S%YUhJ@suy<79iet^Bm&?7+A1(Qfg~!K;u(sC zH1-eld^Q!H|EPzPC09rX-6EReiPmA=FC)#$=LWK$&w0!Z=|8wMa`-N%d@>$B^@z#~ zu6qr&<(vfZnQ*5oYNy6Lr{69L?9=plgc^_=@ej z9|UYct_fqo)v!%v)h;nVuR{olZM1(uMv)BOZng|8>AK`UNNhD)sxfo=V)~AI8{XWQ z%_{BP^Q)8*pjRSCWH&;0g0tQRq)km<(j_@#pD9fKzWEI6*3{SEf;i6R=D$0?gx7gr zS96CH_(|wa4VQMQi*TQ&VwfE-UBId1+gZ}d>_@z3GgD9)m9F4_%~d=cvouGa+J0sK zc@OmgyzO;5Hb*oMJbZTLLcp(XvoqyGGRU=s=0p}7@PM3Ef(!GALQvSTO1F}$1;_B+~M-O&weace75DZIOsk6Gg$tcJo)?k2ytglNuA#3h2f^>(7Bn1L zu;8#_oo@R&?6K+EXdw1kJS_}Kz?%Mk^r~ZrsE7!Dub{k_0N!eQijPtcuMP9rU3~Rw z7UXSsFYE{Vj66NX+pSLT*&6k5r;d%C{zl6efpg7!c4C)7Ff5PYy~v06;(AID3-QI% zK!St9@5lF!V{TZfmHb05Q%cRmf*V{ZT2j%Mu8lP1jesl>&$+#HG9uo0?&9vW?;?=N zi;Ghjn3w{zV95KDX?cSe^NmFF8`pp27Uil_w9zGB7Cut6R#~$-tQ)<+#M6c<^d(G{iG3{7U#rv z_JOGHunKW7@jFfJXKV<*dTg&S^UonF@1y{4y&c1dd>t0NU;mUYnsv7*wfz|Y_?frs z0b6Oloig^-lC92coba zC04P}Invo`px@$utvm@Q{-TI9(A*+4v%lYmssJaHZ-wA7%+d2Ep47p#eIG7446_Jr2tJr675Ms zM7oQnp4pM&o{vnhvQ8paM+rX-Le>^F}01CJ%kk%08M$>cB=K0-P{Rrc#Y_p~8%%WXk5l1hJ=OPE8r2vMTq= z74{hEziuj{hZHZ^dXyf1KEH#j1&raFah^XY`NskTZ~Q48B8#s%e=>dUZ;93z&W^&q z>?2E^xuJTckk(Z>VvEE0kb3>wQ5}i2yjoY%W2b)n+DJL|;$ns>QZD1+hAhR!vf3~f z3Ms>yT{e{7_TBA}ev-KPL@~iZz0&?@6FNK|GQZF+RnR;|<2)dIVjw)uKKDP$SeNyV zd+rZ!X(GkHN(vxsg!Y1TJF&&0tNP(gFQ0I#X7FOk{WYe%ReE0p=@HSB&#K?lr~l zTHK=UFfc+fx7e_C+oV&aUEcsL=1O-`zDeYfEAV=wT(5V;w9pr;fD?^?-|v0O8b^V= z&3PsWC@8UjnSR2jwc=2&#cMfUu8HXk*=x=)dNRzW`BNvfK!7N1#@ZX`A#qjxt$q@_ z+Pv~$`2k!A?@Q{V}QUnI~<3AKhmT@u0#4m27R;}^iX6`NgL<@S~Pzf!ng zG0I`A)SCd=nPV|*+7&1==HrSUhZcKq8W&55hyDUdUAA!q4I)|BExug73AilS~K znJ_CZ-V?5%W^;Y0s8gf?j_BiHQ0qMpT=&lTMH(5&fixf>B(wR0d}5E6rgg{fTe-Wr|C&6r9(vprnw{Y?qYn3@AC(hCJ=XRGq26 z47I0la`$Jw@`_w<_>H$~P*SDu>4W3$WqT+U_(iIS8~`j{wM$6&Pa zHYuPx`&ZIP4d9^YjZ&&sR(?y@lt94_C`TrQIq zYniu(viy30)n0%ZJ*8*2{4{APxs29lmO3jA9tjr!68Af_O|6TTThVCHtCt|Wmu3WW zPhV8hR42=DYhdUKujO;neH{7`-_3l?JrCb5b%=~x#F#72t?C-HOQ4V5`3#2#JEa;O zl$PO0gn*k$9VLh(6kRD|6a_E(RD>-!1M#uWwf>_?`Af01unLwxpe$@D!TdcCmM!D4@nFa*wi(GiD1) zdl&Dsk)0n*l6uF{+}^lkMd-z;HuA|?!UmmZME0L?)R-2H!J-*5RtU}AzCRHUp`MtQ znl8x^cEhQxiH#E;g6*G8Qm_d)>fXXaR5kWp?#X$mZPw~g*B8hotuL`|iLx>UA%HL9 zvPWadJSkRAs`yzC6Os~AT+ikyC$W`C34)~l^#wRMeGAXF1$#_xxHoor)K_ka5jhr; z21TR?3(h5r?dUG`E4g4rCnkAN%LKd##br!JPq`yia6LMO0^$!Z_MGaDEr#g_t$K!X z>waiQ{qxCf=Mrj^b5P2&R`z0opEAe@y~~H{xi$XX%ZHVg79W~g9Ioe_CB6A*4LsTLe>$17vE{qdbHcXVuUJ+O|wc-M;p`bRck{u-fmfLdqnW>7G%)L+L=UABR>){R)q z3mSW?nMhIC>%pA5H$oE;Y2BptI5vIMmGgSn{RL5)xT+%s20X|P*$q~4B6AcZO9!0m zK3qpE2r2$liZ2Km;;+b80J+lps$~!56Q~Ut2Af?gI)R(7>iqM(S zlAIw8+g)eW`t#vp!*V0XwYFyT1G%{C`bj1gV(8@Ug%dyS{m<<2kERbyf#GfI18EcIV?iPnqUn;Wj;KX#W?|OdJXE!(W-_2hje=RxWXgK>4JDb(M%bx;m@!P z%+})u{M*O!>N!gOF58OaUc$*a>NiA+TUSiW-&7>Zs`I0Hr8d0+^37E`NcG&Dx|Q-) zlbInrsELBr#yNU=!~jmR5%Xryu^)EFRvI*-e1tsnkOHie`Fp3d0$JZuje>emeH0dM z*;G{OpboKrUjT#LPG;dNk^6$ttH1U3158Y|#SqNa5FKa9jH(@VZq#A#RJw{= z`(uyc<0&MmY>7R7>*YvQlE{^^Tg`;B^hx*Jg5Hg0QO+xWO!Z{HEak>IV zp{uD(AlN+p814JlFKL6(P;{)g2*7@~ZGR|%Chivc-wSh{By)Z35G0!}i{|r}jQNt| z8-Y|#%1kXnYf-V2Kj5z>U=g?BS08 z9uYlz@K>9+gl9k?WKk1e3-*f|UtsPx%?73|p>opC5nBtZ+5`pT#I^!^(|uA%KuhU* z2psMhs~Dp;iBfk8D-UUkOj^UD8VixU->qoqt$+=TD)XIbxG}G4g+qQ?P9xey)}Asq z6;b_v`cwE1hhjz%r1|kc#pes$g|c2TSXck<;e3-c#w#FHDo;-QNpxH)JX8x7h$WX}(9gj&mcJOZ**F@(y%_-NYp_kDCxylvR22 zxL~Y+r5K}`y}fg+=JBj(!)PQg2-uw7ca^|7;H^6PqO|!w1z&&Kj%H8Aqch3QM4TOV zZ^;0MmxO^7%-}D?7M8o75E7{HSuja?oRUZi+HZ!3yVu^bUY$XY;Z5ypk@No@nu$*i z#rYy$%;B-FTIl%)-1f?rWDX>;okGxffEZ+Fn$QsLwQ{-pYLI`H%rC)1N^hy&&{l&-E zQ!TwlyFJpI9Bx=CZ}X1*+g5^sI|B&zR_{i~z$xcge#6AQ>ES_!*TS(zoH@UdGB}C7 z+rq#2Cu##z6#+RCC=yOqsTx}ZNPhQzqJ8%;U@uhJ3Y3D-JYLv#D)T^WmX3(R=U*|A zCyeUflyb2xvkVd-Y!WwX3eWC;Nq^~vF_`>4k-4x`{t`t0_qFh^G&Us=RP(l( z#V*iUoVy(ITgCPuc;D2xq(qUG%gSFNW1H5h^q+Qs;MU3 z$?r&F!^%Qou`n&InUU$H@(8F<=Z&bVb-2$Y9HZpY{`E<}iR0}SqN0}L*KpuyeU-3jjQ5Q4)@Ab4~KOSdvZCZ4+VJRQKz&cY+4jQiG^qA9q)r0g{&;9eYVias)X)0%{1bjxOTE~ zW~ixQ22eY2RIR<=@&kmLxzv0CM}7d0oh3ofEkU;)f1ZD!I8SJntAhEX0yFl_k%SVrK2- z76(RF6%7MP8>Q$Yjr+w40szEtwUqEy3NeEl^!c zaY~OTxjrZM7g~LkM0}mY&UHSUCu0Vakl254{}d^`Ysk?dPFPT$MK!9wK7tjAQit<4 zp9eh|%^9&0&I46cvk@7bSj{|C=odpvh>TxHfw+u{GU>RC^0Jyfdn1}bacR2_^+Btb~#s~+gfdICbhdq;RZ`HTYwr% z;V0s}v6V}g?%-3m!cP;kHdms_i>BH8e&q)2F9-_MBt6ZQ0{x`k0UmDd(=5*-0*t3M zjts(kN6e}6Wl008;h5%8=`vziiokYjfsy~<-Uz0uZz)#ugecmCA*ae%Z-)<{Q59zn z1IKP8-d|1n=~EdX8S$HGW(m&`wwYvQiQxa>)VnM4FL*M-&@|qmi`4vQgoc(miI4<~ zjp&1J{2U>&4(xZEMMDp$fK7P12CFUsz8kl(md&LGt%q?EWCkLMAenQMyxPfbU|kDE zHwdLT5tz)rLSaTY?TB;9ZgQja*g~rFEqQ~Xxi;5Kx8oGK6oiw8b1g*IKBrInotBGj zc;Ub??NB@GBYcczNGfyT}Cdo^Nt|l?42$@7k0li6^6M@P0Hhw_CT zs<~7mXMtDh>0y9GLh-O=DvuOAdS?Lfp(+$=h>?@{^iaG>gIk3s+EPb}h_?fvNIX4? zBcD_`u{hM5wz?4C1bl`UJ&z2o;AtIni#=N>lp#zEU#q@(TbILJ8+Cit)sD20J5S3x`yX{$x3P-8rd)aT z3S`GBggs^M%`~?7V*{PmYuY(jr=UomE(M z@;STRIC1Q_UX)5lT6!pyszEY{4r&qU9ZT1=uo&v8Ew$6f4r8w z@=9Q?#VywX-p)Vy90B|(RUnmKA0(TU$5yLn^o%T;m@9I<&oT5GkoB8 zi&P)z)0w)8Ddd5Xm~JOfub@ymupD&XeZVAYaN!-bfd0ny_-sHZLJAc zrT+>NrU@wyN5JEy;~y_0-D0LCrDP#k%x@%}4%LFe4yd2Nj{2ynxgj}yQ18?^l2A^I zTMb9lY?^E=QrX@oS|n^-(c>m=J#2KNWPXFk184j-C;Awj)Q~QvoUTE9$MA8TDA#fE zjf7{5G%PN|Xo42LE@VqnzWyi7+}{cgPDmT6VolWc>Z%bknz6AuT+*6m=U!U!Gg^0&TarrjaM>pK9^-E&`c(FX zT-f9`s8i40SL|mY0)6AP6Z{X=yJL-j+XS}j@LI*lbo3&wbqQ!VwN>xC`hZriQit3_ z)4at9YMyf_QlpgD*@jNEHc-%~fXQ$eU|f>+^FT>u*+oOCx`ZaS>HSwrrBd7o%##Nz zg|w`XS?BGkGQ!q+Y@QYffmB8~2RkiI_(W7l@{7&5Z(iq?)Ue)I%=s|Xv`v0zrL`1l z5V2691M>|M0SP{RP)+a>%UlBugl&CBEBY;Oj}uu@EyF_})Fq6%TiI^lBA5MFebe<- zIDR%$z};5W=Q3q2rOq))gkdIM$EBx-a=p0~L+(bCq?%j8lEGe^&H}yvSZBNKE(S}c zBeP{-!iU_!2_cK*osRG-T!{|06BM%fdA=c};a>ngjzO{ZP(m_Hq$nZft5mUK0c_Mb zvuH*j?3)JMF;g_VCri)~nbV&n>CJ@FkMmF8_YwrSviNRGZ zypXYqE*hm}@Tb8MH+8;&yw;1pnHHA~kFgBOBFuz0nA<>mjf?K`IW&yz7&h=B1uyy< zp=O4eYyr1p@icz>ZVi?ok{i?Bi_R9!8{99mZ-DOvo8nWW_7V=}G*PLWWhaA`yDY5< zo*;G$MA#r1#o|R6+y3ig?NE`RX9&GA228Uwt4#*)8&I`t<3-}=crsZBl`AcE1Xp$Z z+Xo+y71`(TXRhq0SNI!8*{0H{WW$yqD4#?rNM*c3T(VkeX*~-2F-{c_B__QkX{ zaSmS{oa!#Tbu8C$^EiiEiUJ?28n9RmWoR%biUVBP&!}6%HKV}|X7?)?E#@e48*{N= zkXnfH1%VzDq^Y5Z9=PHi1HvCb1aYCd%c;N9X}{EeqQG=pZ?B01vjHIp=u}a!Pjy-J zFyo-nvgzhCKavDaujAB;UNs*tj4_Xi4;CqOYMr5jKfkh-DlO89D4~T!jbtY8+xlYg zil+t^{s$N2WN#`Xqi3*^#Ii9yXI3$g=F3iLm-E-27Z%7m4Puj1+xsqjR9<8t3$bk>&W z`&d|+<7wEo0WPE=5roaJ*H`PG);LsJb7@bsMEnPba6aWGPpkj)j+IY?%oF+poi5Oc zzZzKv)%p90$h`kgb=Yp61tXvm+$J!IKl<=8{b`Ej1WJO>}G zv&6zKPc-x8CeV7`%w3xLg#T;lOn)}nZs9L(xnkFp@eRy+@V@(SW(t~@tc>;DaH>0nNa8U8^~R)&u1xAIJ|Ko$YcLCVQfo10Ea zS{j|2OQ7?WapT3lx5(p;{sGA)DW4fghx-1xEvr#8iwcLEYublAIwfUUKPpX727&4e zebp`uSy@fZ>vgGXU%rX2^VijSKfkR&SK;~rr*u!!cW0igg!H*RB8~CSPs{*5g*>r! zGM7AMr<$K1Rz+|L%s+F*KTp%jO8OkDY~^u=qVokh`K@JML4LL-^{(n|cG#vIh}aH@ z{jGAoBUJ#|C!wQ!R;|gA0UC_5{$8=C)yQW`k02Bko0NeX zHkS`$5mXqBADq<#%==X@sF1TCL8DdRpa z;uRxaDT5C=lAki#qNr~RWn zXV*1k%Dky)LZ|-H0c)2Fhn8XXfnQ9u?#aG3CEJ=yXMp^z$tzFrKhm`Zg9w19NU=x} zs+;J7BJL&W5plJ4;G0?#WO*4oxW%}?QuAKhE2fu6LC(1#@LayO>1T3ZCI#_RQJe(< zU#Tx%V)^K>Ms({pM|7ju1Xi6nJNDKJWH@$O-H~#obN6QfnGXtFk&VV z9M4Jtsg}H-F0}j#*C#?{q~D`uJ%^1dcYmH3iXs_%6^LfOw83*mqMLUWPmroMI=TQj zzF+W%o-aKzL#fRR_FdYp>ugF3P5aXWoxKI}oSX6MdSA<^)#h+3TxY;qsy!5>B5)ocqBuTR30EwCbUg%Q%jRg05eD{-OkoQwGh%?e|gms(a zM{d@){)1E1ulVC>h*vjNnCDX~(0)L6@BIIwp8oITeP{!H(6aB3_0*e-Syqa4z<7(u z#lPQGT(t02=E19guD>^DdcW{w0Hh25MfWHQ}yKlLz z<<+(nB)GVOS~szz)X51-xVrs8_#)#7$uPV9t21*d9wh@6I7VLP98{;@c^9*7?ceFv zd6g9-ZJtex0&=t&bVsv|z`@KtZ! z%3|~*t*;eRi2>2uF4bSBVtsJu#F~fM`Nf^rkWL*t{X7B-W=p4@=skVzXuW6_B2D?{ zSqy@+Gg)gt*r!N4wnBzLHaXk?_5(RC@6}>~ys{t$P5-ryR>Ub43VPl(8UqKP`^tp+ zy0kFshvlnIRgT6l+->#2)?Elbk%Y&_S|~Ps7zwC0a3H;i7cU0de}ZJqr)I38vFXBX zOo3P9fz{(BAGooTlYjA{ukFiB3LnC-<)Esn%URaRYS|Tv+c1Ka`_?1 z>rJUJ-lCv|vtIL845O-eIiX@aZ|I(~UsLd|q+O)^BNu2){l1%$d$_WG)RRYjXym-5 zo@k#4TF(_Lm$B^+^5M5J_raq@i3kiTkUrA#G7BSr+a!k1q6XzSLOhoY?W6K%K&R1N6_gY3wnV}$lqAx5M= zTXxwd(a>=0VHQpr6(=qbRb{bt#fKQQ5J@N=6AZFuLJ#_-cu?A}x)#~mR>xzy(BgVS z$WKyEF^|hCRM=;(k>UKt*BhmG>H2w_Yr%AwPOUC7eo1bQ zNi@U7Q5H|vUzeP!z#e<@oSUhEk=nl^muV>7X(q}bs135p=M2GZ+qsncoNObGYQYW=)$mFIea();ww3cezIU6dD=73ug>LYG?_D-9bTASC$GrVppW zUk$(VeHplLzm&na7@^GD7L;VH54xm+ZFZYtl1%&3RpC~)#X^`A^CZJ_Ie2EObtASh zR!TTKqehB&;$vWZ+0LC|u&cjy-z}z#TVFp~RrR0~R6$mEPFz;?R*C!kq zrbsfq4dI>%n%KUAJC|mOzZZ0<%y+i5yor6ssrp9R`Cu`X>cg~s^NhRa5@RAGLjWO; z{OgS2C_0|dgY$9jsg86e9WRZ)Z~8^&A*i>CHBXsG>kq+UYc-IrM*~bsJ z`m=m9d3O9ndhv=un@+*n@i3IMiN7Awxc>27_yDTG85O+N{4w+LrH>IrIy_=y?|UTZ z{Mih|A$8w)f1_iKzsL7tB<=I6p&~|CJTsnhb~#ckH1cFJc||KhzX>fiLC;EdjVrDE zO5K5xRvBdm;pVnNatwNW+pyfdAne9Fe({^*B6yxi}87N;0^mE!SzPqbx|fWPWSTLdRO` zoO`S7TTM(nL)EXhmePcfQJI@t&NenXS9B8Q!Ox!L2HEaysc=t!=I0GajFPEz{|?|* zFv(1}l5Py(CY^uoHV!#t?1P1UCTTR_x$kDuNS!j6D^jrRP@E#R+m#?r<114U)G!R$zt=$$P~Yls?c2SR(tw8?_h#@oRUweJERn`4n;GplJs zw;-&|j&&gOM&2?Je?wG!VGtJbbRobiG#PvMJ5%HgT}y{MUj;ReosKaVQ_J;K!0iFT@_(~ut$iDHf`G506KsJck|1*jh) zE$>QrWY&C+n<_JwZo?xu_4cGF*=9DgpP;spo5J0s_&mIKxd+A^E~gCB|H@N1GxSW+ zIYnP<%|{bTAGDuKYnTZvN2?9Aqj78su7(HtoOM__s##GqM)r>cj-8^vO}FM1lvw>@pOy2$7O|>_~an^8@`1q%}Jx(9$0`yn$kIJSV zk87_B``(d;7=9%HIJCAPzYDXS-Hk8stv@fGTnjYXRh!=05A;jS+28+M|L?_=4?I%z zFi+A#)@nRyO<`;|52EW*`BjPuW8+THf9o6rEz1ty%5_9amT9K0Zz_bRld7+{1F8CFqQ0*ijG~ znUDhF0(7W;NI!`#$R*7z9D@?+8n&$YxGig01Swa%f7w#X`-pW(CpK_T z)-B0~7D_tD8fAt59nnrLc0&d3{He0{4P=RofGxmG%BVXcQw8o%R+}&A#h%qX>#TY9 zyS7?iqOgQOd!?U3VNr#|G7vO4Hb$Y>jmHX!_2>w}^bobFaHPA%TY)AD%iiA`wlFp| zVbWGh>f#>l#>gAGFHsm9C_a7~Mgz`6i*WuBQ>+h0e%b~qRYo(m_H^HO=!J}N` z$X0BN0GJ1QXkNmZKGDy)wX}DJh_JSlX<~n;AaCVrr~Xo_R#JN3$G%gx`(3JgntX{q zTJD1fCVPt-J2+wlE`jd*rGBqHo^FC$W>Fet6m3Phxt(1gl-iqE=p{S>41v3wmUwCfAsJyhH{h2y-CtcZ)YIHsFmmlNubxxcUD^BXi(Op4=WSq!9Uj-!@wm#7< z_wyOL#Oq($+X&$M^m0`UJDM=ptY-bl>x?k*k%{UUI8OY%i$knM9a8!LFs+uA(8f-d z=<)vNJU2`zl%XP9%0%4UDQ8ULiW=eixMBbCdsO(Ms9x(k=bUBG8e#(Ty5olSASLt@ zx3H9F;Av5ZvejaghDn4ti$^DT7uYvf=AU2$F`*T#XjCGka=s^i_3_ils4p*Amji{lzDG8#_8z^C+h-4sEm z0y(^7Y%RBng|e&jJM2ipidpr21EJ_dyL<>m8dX-8tF58lnqp-Jp5KPl!;wmIN?L5; zr&rWMs)j0zXr2`{G%YO?sy-)gP76W~q(b%MvkND!nGB>bWwKDX@UDTfl78v)^Okw= zf&Ic!n%j|hno_pG;R4xV`NTF#dfB~SkT8qUEof!p)^b1?3+9TB`USOazBj#e&n1k8m~BxPbk!ssfzY0 z)7~v~_mBMJj*WZCNFtX~28g6qJtlTHoWD0U&9$`3gC=W5?G=ypv$u5EFLyDWOBZp7 z24qZ3LI4MD3HosG+40!jGtYFOVvP4?PNpvQjKa&Mo_0SK)=&-xM9P9pruO(Kf)=I^ zaOjR(OFyzNG#l&0iK;z4E50A*3>>wzb#N@40}XC;=l?ysN-2yn@m6mj;}d4i&&Oz@ zv>UMFWd`Hf?s@A{9bf@>xMfevZAVVf!3VXT0Ixq@wXz$mDj42p^?y$aN95djL`4M* zHp(di04E0DHdaA*9imTy?BHYSn)t`%)Ou zOoHv@CsX9|bt*JfL<5yh10%uq`(023KsDy;^Z^&~)@^hFrq>}d@Z|M-xxNIEUd4y* z-l8oj-B9@s^~?NEJ%iuuT|8Ll#SRUFz6boOA=De!lZ%ii;&DHdo9@y`iw|AB2Y|d!kpi2`8TemiWYiD zBS;Amxx?@7Kq&oRh2W;iIOV3z%E>+1edfdm0fdZ1p~JK zgR{%2bR{Qr*|xk;sY)=o7Dy196C_Thtt)jXkEq;Bu3`I!M~u!2hoA@%dY&A~k0>Gp zWJ@*#w<}%_u8`x|szCp4u(wJ`lXrT5^O56oyyV;sqyMT-p5HctU$ixa=;W}0;Z3-_ zR9_xxkm4R_e(7jg#-lb7b*0h-t%g#Vdo)!y)$(PY9nD0&2qcmwvCt>iiqmX6y!yR# zZ^D=BdQPCv1g@E>keY$8tk21eV||%yYL&!qo+?*^zzdhwP>Y2?@79K6B7YMW7&YA3qr$jv~=f}G5z%2hg;W@&+@4Iu}1g%tewep_aP%^lY7 zNKErjkDRZaGK;2YYx-|CvzyVO7$owN(OZ~7aJ7J=G{4>rzaA`&&A(ac7HOc(Es|%A zV*4?XSVR(IvP!0NNm z(GD)kM(ApK7VD1qv5^1ed38)TDUR<^nO%RM=PObdvnb^$F0p(6Rg~%i8!l92lN?Bo)%m4eyJqlKp zK43#pj#Dlg+{!L3Csl#dMavt4y=WgDQn8W+vUmO<4L48GZaXkY19lHqs3vpPUBoAr zYm0Tx`~&3Bn+9{N>=b^Rri5@F2l0n}wdV){G$X z$TSm&LyahzW_GIsG@P(y*9behQ6!A5I&vX*|ASa@swcUFg%|$B!K*&WnAnVou0p?> zYhc0GRYu#em7_M&0f>}WfXNK`5>*<|)8mW38)f#{&#O*9E!3XmYqZz`T=~|gg<9{j z7{B!J^sV<5VDrDDN^C!l5H!qn4pRK@%pSrQCSM-Zvo?8NypNqg^bItus$gPeB+BT;7z#I~%|_7>dZF9;tBXA&6qeD3Pd)K_ zO6<0NTbYyT@XD*UEBv=)ffuXlI6$u`ttkx1H1pNfpIV$K6QGWh#wUP$eDJ=?0()22 zsLC~v@$3%fKUG7wT|yb|Mv_f)cw~jsOA$&4BzH7H6_tfZve7PVBRS_N4Nz?0d=70U5414S$b0c==23Qzly!V z#d%v%`{ME7rl|?d#{18v1BBIjvs^_E@jFKH{b`v46NIih11=dqv@O?w%9Y==+?JkB z^lT@9-i7-h9N*Jr{JI#2A#shLYOMk4m`F}CHZVIvvcy>$D`*X^?i^siJbf+8jlQVy zpyZ!Dz;J-w9b+)tfT@? z6h7*MMChxmWOy34Q>@r04eeAV^0>*-N1|09&Cc^vW9?K2)1ZA#r98HDGd#-l|!C7+!%Yf87pkZGs=VN zABs#xs=zZtd>9`ToYs}t*r&U+^swY9DSV{%6i3@#^nYxd$uekrD@`rxgy@18R+Y6) zR6_31Q-TEhheDg7$3|n3JQ}J90?~OeCE-Iwqy1jV>dNg|Wy4J9-lnb-TSnrVGMW|7 zn9($6vHunvD*B;?b%#x(d!x_U4ai(4bMY*-7yFlHMa}N2pk(FSUm7*$_$Ctt3 zr3MutpIhRL)sYJ`*)J5~Ke)Br~JxPKjVC3hfnvWSek?v#0 zyYN`JKz!NcU$-67F9k3ECYRbU<^2o#&dYy`QCC+LRsILJ$Y2)H7rgaEKH=89fip`= ziq2hUlii6X?k5r8luKD3dz`Ts<|oZoWrk1N@WQCai~@ za}@$3ISOc>wjEw9|Rs8FrzTQm3jj7lsH#SL`L%tAALIm^fk;6Z1NwE6(lx@u|0~EIFePLhh*5eJ->_x$jp_CtVzynreMs*3W7BRRgzO zP6lvsA;0&Q5V7A{ideo{uJ08-@2hl1W@oF(kdr`lzC?D^ChJj%=M?o~>ZJc{oq7Bx zzjhWRWtRloU3HVM#|$L3g2mx8ZBVy~T)Mlu2O*Px(*31Vn`P!T@?|PD@;Q3xSfhoS z)45K2L{~RQ?TqHLbdOcT7DbeY&&WRegy|fg(Mcxn_FR>%&Y&y%j~~kSC?TuU(F0}! zu80$KeURJJ!J9}MP;48@7dNE}f_GVWhOkl}bpLf3Ed1lqv`0Txm|8Rr@k6nb1VU4a z!D}WW3V}QULlQ;Ctshp2Jc9Noz(ERuegdmT2^Y#Vvh3(Urt@g$h4ZP7rNLxkz!{o^gO zWC8eAFGXEK$%O9ADZK)~lE6*9egULm!%Gd3zwf-F<_8@yrpj!=D&x~$zPpwke0;t* z?j|)eI1gVS?KGg0N+qG?MPN>jTVi8=E^xJF2=(w?4El@A%aQ>w2z--zs3Z0e3a2S( z@9r=cjm~xz_#M?hICDLB>3m zRUWNzTJ8Y@N1|38*NhI zm(1m3Le350mvJmtIKf8aGW-AFsxn`zIm1Ju8KR>lm_hqnjxk^sm4jl9C+24I&sb^| z^|hWX_d@tP0Z;QAP|qp%ssG@-(|+!1S|;`?n*3b@5ESq+<zp%((dv4i8&JH45k~-z}*ggn}-k z#PEfxK&004i}YXTnL76W?EtXbb!OzxAcWy{u@p=r`JWeMm@DO4o7V&Joi1cE6kXq3 zMTjA6H|&v2&?2X^V6$9mHpb3a`SQ~QnR7!`3=W}CeMFCekVa$2Uzt0kePtU%0Y zl?6+7G6yCBnymwa*tBo4_xZW5#Az9lAbFe*e>Mr8;F$!N!WyJ9l>lrS@A;?3`&1Gc z87SC}(C(*zpyU6~NuXwA(~BW0W?9zi8W8gu8$G!T+wTpu%~zg=oXyne9{U4 zMG&5#!D)BHR;b_kX7M-3ge@-(awRMz1PPKpZ^C$j5Qve2 zmqsW=>Cm*^n0%Ol)Wc0ZFvq?+A8REj%#(d;W`IR9b!x_%@$)8kJLQU&L&g%7xg$df6ZQJ-^GtmVKA@b^MD|{O6-adc@#_TjxODXycwc7eKRBZ_ zDx$mj@{!zCre6tTJLd+=Tqi#*4L`>(?UPO1sn*30!Fs%_RY31B|B!1uGxbE&q@WEl8i``yHjxN?S|Yf_VCla(=;1 zmGSXurUuC8eCbJ5B|QIv1n*dULKshWF!bYKK73ufAqhxa8+h~-Xu`{OCwXC1P= zm6ayoc40-+4UC>jQ~lH(L>KqxAAwtMYK&UTtfYb{il(I_TFAuRRF-a0WqgabUKcSt z=}y0_$fU;GrCks{STdNl&4Ex#f6V3oVWd}viME5W)s&o05F`3GKnb1YXhIEwg6(iI z7?8&u?x7+RXNRa$9fP~PYj*o&?&xz&G}sW1$spQIqm&?p`6vg*{+$aFG6%2XIv$}1 zV}QGsivfd#42N_OCpZVd7X0({pLzEhHW@H!MBJP~_?BA>q508*-qD{GiZCviBvWH% z#k@M{0OCjX`tU)bdawWWzu`KFJLij#DtMi(Mn;` zkWToh)TfA+oU*z(E_I@N)<&r+9k0f`$?>YCP9L|u^)8#fL6A~@oTx0NG@0ARts{3> z50FCVQxy47d&9v{k4yGZz;SJ7Ugj{_bjzftj&w^^eKlOi7KJlprb#xGZ$1qIw8z8} zUmXK-g++uZMd!!5*Oh06l^|111Pd*21X7cxHby#{?#S)VKw>}zzIB9>jE)J z%HFMZ+N&L(a@28EOZ^CE3T3>8jJy1_4Pbi#mlUwpnu_ijcN1%sB`-hj1@0+;qNDLGewLJW~jnERsX zyT85(kC_6a^xK@8a2IY+*DF+IL^n;e!SBymyTBni(BN@;Y6@K2lGC9vDO5v+#OCBVOv2z5c&xr{^_3dPYE*rx9L52?{ z0#Br4C%El6S-ZE&c>81H{doM9f^ctdT_lmwgY0B?Q}b7XyJAjn1+gC@C;Yf0mTM_X zg1-_TsA_)V*LV(9bLK~J?5rd(8{V%)3YAv#-ckz0=FUo0ZI9L5or-_RrpR$Lf2_B@ zn1P(;Duf`nM4564B>mKOF7-!l*AGbe%~0QrhQXG$WN$j3o=a?#KSVX#Hsth+pQ38{(7cFaI+yzQsDbLwKd@JofJV z+~9z%F%N+SBeA%YnGVnwTPiuB;mDt<6e>2XEH~_+KqIBQI~m zNb9((_Po7fXIqYJ=WQY;3m2Rpk}*>FCQc+U=$|rvqIX1cu?{cN82)e`RzRAmnY--p z3YOxP+2f`igpT&om24j5ZL&f(jho-0l_5C-_sVLE+YawoIjv=YvRqYu9{H@tc!7Wv zB90(A&}x^NUi;fLM)-Ho)zT`yVf&`pg^8h6V9%OP;vqAJ3;LQK`OgpbCV&BhHrz?_aYezhFN!NOXAG?X|xyL(xg5cQG;fYRuV^;A)&=n{CZ@T51}8g?d`+Ig+7MTk^T{K&lFzea>E zwfR)ix8qi+rKnPiiFKvbob%@H8+vdTBs(Z`wgI&v$-fb_<&l0E1NYZDs*yOqFA0jB z;RtreX@`AQWxA_U%FA=?s-a-~)49Y_@9|d?GfoZ+q^qJ69mh+tcdAY6!y^Eso`|8HOs^zba(aWOEd``H*L#) zXtZ}8ku*3kI7(30TS;Fv1`xfAWb;iz@eiNgYT}HRhOlu$QQZVy zJm1!NkBI&8>>p};3zT3+(^gz9LQA?`IC<$$mO$??sbGw_shd?`05Mu!LrHo^e+}s?9HxzRe9Hm5DSozah`Vr}14`97G&q-f&W0G!ul~H%f0~qCIx!cWY6m z-f@>XZ^;ULjod?G*d2^QQ!335+{G`{&sdNAlNSTARMxX3drLEy4|nA3z$@tg;-qMP z)5P_^=zB7jCOi2}0_H8NJ~b5>@ivOc=F%Wo z8Vx71kJ7%#O#6Jfa^>&fL%mjHoN9`DQ7`v7H;J1mW2?tY1E7@W$I{}|vbyKakjd&P zI7%Q=kITk858!+Z+tfScL#GI{!S2;XVQy`*ofkK2Z@bt1^LgD?xg!gAFCiJx1ILCT zMj?8Gos*?X78k%^CZgf3G;%~mWq`h8_L-SwF2 z@c44OPpqb3+^E7Ng|lj>7ltTxm=gSZs0 z`u)XZEcIo7%aTq9qewl!-_v#CS!``$a_$g?c76laMV7&LB;j+*8{%LxA5c`h;|=E? zKLUaOd{^z9KOU58jwYElrU*kJp)6(*nkms~8Mdxd8e zR2AE8`r;b2Rqrv&QftkuD#EAF))Q$@yAS?O?c=f)bV#x=Mfk}jZN}m>09VtwvAPn` zfq3W2@RE5cB?j_=RmG%Iz6W<{1ba_Y<)vzKej4^FMow{tokfg?d2iLKBjUyKNQ*oK z`9>EF|D%M#T`6Hi7x_7im9FvY_WKT_gx(5}n33L0p=73%g9kqoTvmmWeHg@ZfOU}d z(Q0KC>XIGEPT+d0I043gu=$!O5OQbNTEIvPF%zUB#L+^GprqA^L8A0qFW|gs=%D-} z9bFhD+Nq>VdF52kUr^XQ?|RewEI|0-;CxZb? zE?gr5QqtWF-QC?C12eQVNH!(U@SZupo%8(-``PY#G=wkZ;)EPhJe zi0-ZL4P7$E3Sp(szo@B)a!<$$|4tfx+1d%vFJ17Bgqo;XYjzRcKwP3)@3wY?>CvEk z?Hw1b==QQV`TJAm>9$FAi6c_&7F}Nx-zER!MK!@=@_6&M;=ri+R>|S`iftdN)7wmd z*jtN&mP5(mPH~D->Two8GeI^egcr|II_Bw~za*bSsDUgFc@zy7xZ6;K6bml3xK`6J zr#_;Ab>$l99|`#;@aclIN^YtIV#aq=%@0ii>xS-Ir<4dG3`|2#&+A4ql{ZabpluT=hnI#t401{xE5zVd(W z1BA!l%rtT;#Za=|)o1(U`S1_6yRYlh^$d3IK+*QR9t|n*`^4qLs+sAq>;ktdxeVXcO=gj2BYxfkJ zRUxykVC(+q?t$PM8H2C1SNvq0*-c7B2*|`SLRM#A;;OA-53#)V%6UIc?1f!H0JFY= zLCnz&DexGG`{f@;^;3Ez;yt^|mS^e0vLO{F+^s4+ZVhblP!-y-@sIJSjVX|5lIRd^ z6E2@lLD@mwS!ob~pwh`IZ*A=~IsJ!lWRZKaRM48$0j8c( zzDCdb38K3{IDR!e!>aDyrr5OFskDns4Dn1)cio)V!pO* z1qDrs5Zvj7lHnhNUP_-Zg#|ow~ww%pEK;lI?PUV3TWVP25~B-vxXoZh+O+G%9Anwt9=Y`8pW$9*z7j0L$dN>)WMA`KeKYc zrM3PuNwq)6nZL?h_I0Q*XBaO99>1y`s}glxqgzlUf$s?=MhadvqlGk_NAi5^m3JqTBZ z#jsWnME+R}=^!Xa^kv%ZvZp4~J@4f$XHHMDTGg5_4=Q@gaJr8tE1j~+T{rUQx9~k$(LKG;oo?mmg z{^N>546kpxCUbzMs`0sqEd*l+C7bp{J6|6OObXVgkkyv*@91bi$4f00N|E>%bm!Ed+Su0qcu@!kb~DQ7L{VKzT^B{LvKHM&zy-^;Tc;Ir^LlIR@V%xSS~`*~JL@sW z{CCf+(0+Mia~YGQOJ?tP^4eG*AiL6+YCSkul{6oVRcM}caYE8j0blUcUzHkIc8sxo zQdU*+I=XH}JiV6LIS%ky=N)-V9v+CwsYlWc=SI|il~#Ev$be0WU3+#l5v?&WAVHTr zr;WD}4-V=GjMqdw^V0VOOL05dL{FohuI_9NqXj;OsWaU{S6<39v(YSB;wp#vt^iSm zNg7r(;V`z>T-b;+VR^k1NA|E+Xywu}PKFHK)`yj?uKt`$1MTgNufaIuhxn_x zzelWh*Pl2IWA9NIr$Pc#Ho=#*sZHoL^@JQ*yge>(7Og3xkXVuV8?z-&ktlcF|l{~W9TemjvU(a`wJesXu+3? zju@}>>@EI9??f#P3CFtix18$rhwD1-dP~INCao^k>gLBR8hLG#q@-kuDmW7er-?PD zx^A{==#6NofcZT)c&6NwNNDHBdhMvyGEkJwaj>sS8P_aU3dmbExmjQS&ouDy)Q5xG z{XWNg1jJ7uD;R7KM#d$S+dW+_dx2-JLh{Qjve>cT#PqvERX!q=F$%2gc-KzoC;BNi zG-a52|1afqHDo(e6?Rn07CEj_f{(R{y&v1Qcnb8OLL& z=hyI>!{O_{YnZ|-z(j_3XV$!qeC!_mnC9-=+YTm&wk^!7y7mu$B`-0|50THyG#hDY z(Naq*A%A)l<)ssY`+A%~bi`5i<3_4&u~W`x@Ut(p;iz{&3+*5Wr@Xav7`qzE;oU;~ z2{Jk6DZSxld(=W5X?_`J@UX7thaGXiRqj+GG2~Avx?g91k z0{D|FzPpE0C(6!#P6oeI7+CBoEN+EbpE6N(p>AV@+G%|cN`O_ix}+O%XQXPtrYE0Y zR+)SKV*iO`Ix$Qla642$vL}I=_^lW7`C!(3jDBve5Fcg?8pVTK$xu)VF zv>xc_=#UPiv=LA0SKxzEP ziEHLqDB_O9;Al$mA^~lZ$t_q8C~I17HJR${BpCW8m%G*L)koh`g=dC7Y5Ota{pg*T zM&PD#8##6N7+gB#RJe{gep#`7L3lS)78V7Y;+pP9E#|~mz7Dh70hHohh?jI?qzLY8 zJySPW;l{It^8_!_+qc^Xa#@)fGTM^owGjB)TE7{`8MLwNx7t>;w%PJCnwOBrF5juOU9q);SBKN5sUf6(kq@4J~hacsGqto zaKwb3f?uFN@00xL%`}6=O>jLk!cTzZ7vdM(tF0!9=S|j6b1?Fw46nyTO_Nc;%(eE? z3b{>n>614v(Z-Q%0ca5fit&9&tz|49Z11F?<7Sck4`ExSP6}tF{nTP~pH*E8A!yT4 zFWKGE2Tu%_^8?-YD-33pbTKAUziPAU6{XjTe3#Clep4A;TJvY(u`u9G?mUdv&#A;6 zMaxnBBb2|xa(z+{O$9~$-9H}2wurtc^W|=vLXl4?`<=$olxIpC{vDJUW zs~d&Iap^2EoBp7QtSB3`hNC7b7Q^HKO7+WxvGy$5%0GLLqzjzuy~-(v#_r1879DKWl{t3U` z2>KN%t~YZ~dWv!mP7`ePtE1H=sr7?{o*O$7PEg<8jP$yTZhQO3*)%y|oY`cdqq`NE zitcd3`FOi-o-ZZBLnq=c-C&OiDhv8`9nPR~TTa?wUk@qq@0pqpBm}=j5H&AFZ;9`= zN`3J0rn;EiSv@ERr@2>!`+1D;ciTJ@#Lz`qn>Bh}X>j@%0#yjU&c<;C$6Vy?P16G1`PQ;og7xFS16GtKJA2cA>}<;#`O3iXm71vlPUbC+$bEdA9R z8scl)5UXnG&X@()i?R%@q*#wXINdP9XZwcsp2 z*VB?~e)R9%A>@J0rnLnkoV8^`9=-QJezc>iGYM(-m<2_6)<^iABfa@2gtZQ;;GZe(w#$d{@dey`eZBC@=`{XoTx}H72uoxHVy~ zU*@41!c_>e-iv5(#st-~c;gy{g~gI(@n(_ojpu-#3)AL)gmT!lm%P&_ze9u=KOW`Z z)vA53j{S&wp3nn}YN2*}zr^5|rjFyIVD`@R!7a--h?MHxG*xo)`1r-kNv_& zy1X+>I?-Hfx@gN;M$MU-y;E7#R8m@(N~L$D$=pZej#|kod^s@x;IlR7IBCNYbPY$z z3|EmZWlcEzXT(ymCLy72fdmJ)Mf5TuzFoNUnbn3$Be7lvv4MAs6%VLz^pA+1 za}JTx$0zpnlPBNliN@7<%GHjGx0Ps;RQ6i_y-0q1Co;_;6G$rF(@r{!o{$P5J}|C8 zCGhuG9(Vf1Ob#ZNpBE=RYy4uaie0X=4uKp|EO)Jr?^cv`0>-a@Yw`XD+{=SGPo&0n z)xtn0GXLm*QvdY#NT+4NrK{Th>5#bI%Q*QT0!><&C8m`h$VrPK+hvA5u-n}*d=BFW zmN~lMMlvs;j#)M)b}V@ROO=sa@Ln?#2{c(Fd9*cMxWmo`Gw|O4u_xv7IEujB2zYXILkcnC3BCFS+s$c~#; zz|(HF5S)%y`($WYKkK+|k&@-H|{9nFA3BQ&5uH=s`I7N*{4&%cjEe zOItFE=@U}?)0iG}M?I9&nDUgWu9b~LuEof6cU=dd^RmBe=^ar{oy*v6`G;e)c#jcE z#IHw-Pgq%RwRbbL9HKK-(Y|bYbt+P4{F<+7F<6~z z$dg(N)KUGbf>YrwOVwqLZq7==U*q&2>C+*Lg92G3#&OE@$G#8W^Ss2+FP>61jQaXv zd2xA;PMt77mfohEcNe$~i)Ttk^XlC#5;65j?;DQ(i|0Q*!CiaR^xYUVWyaz6zevcu zIylrbgz?tZGhCa=M&2?WaiLjQX8WCr!JokR!ai8;6ypoApS?xAD4NIg%#dAWPhNkt~qHBNN(d zK9gieC!8lMz?Ad$2HqP;4^H1V%IHA>CG8b$u|}^qgm!MN7?y8+njJ?BYxxhMt16mT zB%D|yg-PF1_#en}7rQ_?Us={0TA`$G+x3c{eiC-rRrIbNdD749cdDFSG zds|G;t*>F?%4GNg_28wpcjRcP$ca*1IidAqe3)!;?COJpEFtw|V~;U6@JW8_3Y%PO zzM0w^8LN^)R22_TDc}WA{$&BP>nWnrrRs#u%Y(v|bBIGv;FD*EJ8;iuC<1jFA}?eD zUk5~50s@KGFM5o$PZZV5!@kg9`_`Ixi8f!OtLnY`4?#C~eH?Pt!0|FDBzB9w6WdMr zh}=MssaL_i(3lW;ZWJd1D^8Bf;_Y?OG(Dh$xHL^N&Dygm=^(?^@0Ukx)&#ts8 z)s7#3V5j|uP(M=?J8Zcbj8x5wypv*E@e>5R9UChY=-}lI&qe!%Z*@_DM4)Mn?4g4# zF(djaeD+r(sS+&oAA<0uks3^diy>clsm9aoM;vM+8uaS@j-_hk(mNobh=#=&FT$FN z{`Y`?V1{PHS%UN=Z^^|-A-v6jO3W3uPMBEkbm_+epPcE`EAo#9%q6(cZP+*vzCGg| zytb;J4!X-{l4J9K$BoStv{R+X!#*jU9Up2bMjmJTWDj#H<;Reica)rT7xADGzuj-t zh-%-njgIjC8?~3D(im700^p*C2c%`SGNe=eV{bZmQrg3eXy}6%U)1M1#6CcCDlhxG zeX-8W@i=h7Q-&R(wAXspfEwcUJXv)5*zxER1%*F;_a*!MDSVNN^O9|vL%c66ENFeV zPf9}_tqFq9JR2`b+xQ!>10Q_Slqufa0Ltj3*z9LwrEf=y5o>@af$SrvG(^@C%vux zXLo2T^5fpvtY0k4nHUf)@$jDNAhmHrIX+a7G>`jHU*tao^B`dbs^B=|{}8aV(elRW zv2x!_cCb}&;h@Ff5;6KL!sZLNR$m8)oN^NVdQX+&d3U|FNq?5m5BvRb2KkpA-GBff z5aN3G&c?Ks9X?;J=FE5L5VE|6UKl3SCW49=fK#4Y@!uH zPF`-o0$ikKnusQ(eF*jc4*|WpRuba3%P@j17BfX&qg{RWPD<3y0$oJs59kajIX3R_ z>@D8!YIAnDj}K7CWIiz%OR8yp>yS48fh0x~NR-!^U5sjyzf z{gLXaQ1JjMuK?N)Kx%K!R7-n38yMI{p^JYBt)z_dA7V%kP=@WPMQy%4xr|)H>~an; zdb%;yn`m1xw7!9C{ZosX^w$|xAb4OI!bjq!WVG4NQm|!=M)5S(FGrd#J5Z{ZkioEC_3yXK8eGnmA3bl4 zy9`Zw2i$p2*m)~Glj_xstdQ5l~|9EbM94`vg3-6i;T z3P0MLjaTNq!OF5_a}}u(JC=)P5ytB&=#*M(Nx0wLB-rFp(t@TTPE2?ql>dCSg;@A1 zOwv+*H7@1uw_MVAb=~7UnzwX%H4cX-f>(!LY6_yNs=7wR(?lJy`xjSNZuY-*t~~1j z2~^&T7FlMZU9@?UvLt;=gvQrGlr8ks6Zc?K-3XATSu}Fzb&3By@k5${x6BGVf8W37 z0Nt&H-@ZX3)>kY(9Mw5*pTx%50J`ktS06G2e;KE&Uer$Kv#?Wz~+O1 zLhlFa3U3Tl{Tw{Vm_*FeBBw^T(8^=PxbLS#avUC*D^h|d@n9;$kK)4?r;S`mB=_?F z5UN8=m{-K^7r2y~wsDr{T`aV*D_5dyNGmMeE%+wN8s`Mre8^gd3s zd3c?uP3plRU>_s2`CR`-kT8L!alR@CruU0i_1SB1%jPGnzwfxeiig$IXH*O0sekm} z`r(?vWV`as&;4H4>4M$5;t>+R{6`3YIoYXA9L|GC^;78h6XPxpHgkScgPVn0j7S=d zm#F5R^ZMu99dR96#g&2cR|O&GLZ`putIM1;9@HbwMG##xLr#289r_NCo(x(snt3Iw zZRM5wQt%&@SIOWEU>wAxO`$uHph%AVaRRUJ?(;5hr1Nz3=9zBLnup+jTp1&20$ ztu;JlI#f;U=A~EaiceYXLaY52_93(2S_)ALPuo9>hjG8cMk)i{xWn)DBc>ZP#>I?JOgB@-0~O zVt{~Vhj8O{y+1M(EzTIcYw9f8-1EQL{DAMAX=Sxds7c9eZxW{}+$AR3DULTj> za9WPCd-`KqOYC20bK_`!?p<|Cukz8- z?~JeTnjRJ21dL@g>5=_>iF1zc&rL1!ET{lv*X6N5B!X(s>%_P#O)>ep6#Qvtz*0wWbFtVRj+Gu=m`FLfNgn*8bI z`QsrJ?J=u~%Ik`yo%_E#_4FS`@q;}TvpTE}GBu!$9iP#V4Ha$V-YXdf)Rf}ZWM9P| z`)RnZw01)1>5m;@zm<%P*=t;dPf_u|&P${CsJu$Y{94(Z6;epsvWCJ767inRftZ;{ z7Xeh@ai><54WbHaEG0sWwmb;*hFV)%HwrZ|o=}rU)vMAv5w5Rj|Fb{6<>s9%)ENz3 zF7<3_%*!(WmX~Aob8l@Ckobw*mAOc&yXLTM=vbKLIVt2#L>l?Zt+tmjr6VB%2}kiT z=lNWNmO~sp%f@K^82TVh_)m!XnR2JC)bL9Vm2o~i)EnG(>B> zH!Y624*~{y4VCO(w;W7LWj(kN` zev-MzLAOyRa9=lmJ4RqqX~z{aK8@?9Lakrs zcbq&0O^GIo#*RO&++zX@UCN8(*Dt!HSQIMEt+Chi1#m6^ggRiQH-WkEsU{7rhNrgL z#j-PpN+hi&uzY1nn4rm&u$vyPRPOgBysMeK$PuouN2bvNUKC<&)-;$e?66?O{5}!I zQjA(BTSvRPN15Unu8@I5{dtH7>QRs%(Naznqgwv%!g$N!4Fuw3bRpwpy^hC(yD*?* zu%!A>52y}B$3)VTpsm6-yhZg2JriXLgeYhDj?T?9g@?y4+1U0qn6->LhaNGF8AXts zRU}fmW2*C6OIe9Jsa3R{NEc^YBwGX2mqCLz3RCYb$kYQ*E6BsmG_X(J6K|Sq9+6b? zcq@@ssn7Bv8SXz-EaeDjo%;s5;N~?Q9A*K(mJ-ZbTf* zg7dHUHE|onbdx00!A*=*l;IQ93<`C+q|p|ZYuGbp{-X6DyOlz;IUOzd&iuB9Ckftf zRRrL1%U*B?ltSO=`@v_vi1M$`=LXe3&UsHr3~Xt!P7y}9^$pW+u-j2JtQ#kbMwIR=#q+OeE;zw^`PDg-NcCu`$M&8Rl2|3eU^)Zbr1N@)WqM%R-o4e&?7n+YHU z799AxNG84x)RxOW&*qU)%15N>sFNI2hEYAiMpp%(PHnd?C@U^%hTBzRSR-otb1Q1f zeZLiA(%*^&-EO~QGmFk^-w3^tVvTdDR9v?17+CUS#}xcKJ5rJ?ION7E;3Yf1E+cyS8d1gYs-UiVCag{(#LRb+m6cr8PJ(70=C&l${w7>_ zZMr@@MGjZpLD?B7833l;>N@yn4`og;fZPB zz6n>m9qi8CaM9ldo2(Wv7D!*B%viScOtLW~E5S{(Y<&G@KCt#v_N3+oa9Pi>RMVb? z^;tNZm;ZE2pp5M^kCUulEb+=ehuhK1_x-rq}Bx}}rJnZuc!BmSSYJ=66+ z4AB>xQySR-@moA6D+_z|!%~zbEh^vgp3>AD(IaaKytbV0?D@Pbzun4ZTKI?|3uHM9 zcHDowXHqn4lZ-y=(s0*+050&1!o9ZhlAU$dg9sNKe3d1X=&pv%Q zH*^y%TEtpdI6!F9xDD~JPZJ(Ht@r3Msry3jR{5^EyWT67!YNgjZhX8Hz2pX@2`1id zWE~R66Bod2Il>x6uG-a=Tr-$W2H z+Gd~ptH85pRs>*;|Ni9<7+D~ShnCIw^AryPOcQ|jVHCPcy^Hle8{6PG;FaZ>?Z>X` zopH>>Xagy^3F*P^_M>BWlb8R!H}qVxe@+8OWj3lnHz@$S9Or1A?;oo%);pM}AWh*!+K#|N0>jqmbY6BnnlS@Bn46~EB$meGqKgA?JD=I75Xz~Zlp zNNY5q1v!_Z5p_ew4vJAKzqYf5fnHwA4q}>;EQVu3JU{0E?2QoSgb-~cdHml%(bRx_ zP-nU^EsO@kDNdR(90YrWtoLp?e#JglSWs z$*wB--jmf0hrxg|R5Chlx~;T$O-*pCdsb@Z5U4D}2th^=j-;XYI;c^bbnmStB1Uo* zT@79RHzKmv?mJ5K2Wg};F9j1J8mSmFi_)J5r@HfWgA8!5!0LN8(Ko>}mnYc$5>&}9q5mfoa(j*UBlOf;~~-Ju2ARUzj!63;=EEOzxFYi3X~iwo8(Y(omXhO%_7${q0>8Nzi*6~j>{QxaTnqi?G1Kr+Ys#u%Za6P zH_*qeU$^DUe^wF;FCK@hXNb!|H~F45^DR4s^mui+2yoCRdW|nr>bh)nx^YQQHY!Wg-e)b6wbX6bj+5%&|VaZW$E(`xM~)VAQ%ABD|I_$$@XU6`*-{ zj_gZ(ieM&B@ba!|UH@c@5{Ji`2Sq36&`1=~{i7#BR6f7vnD_c4cN$rqp^y3&0AC>1RA)F|*&$)T-RTJ|b58@{VsgVBH=p7Ji z4ubrm8u9q?E}TZ(mvWx}MjFG>$mHjw4WE4}XND z^=lz(pcA3<$Hot9m{^6 zysAD7bM;o5dq5yUocRdNqnUv=MTpg6QB{N8-}}WV@^6U~lvPs|mO|}+KPJRe^i|mM zX>|U+CXf%=a6$tUY7^+r(|Sbo*b=fjBX{7Skz*(R4)iVWkEpR&{`WyPi0HoZ%w@SL zz$3v(aDN}>nDLhEb_&+dAi8p7499Lp$6eRMF&2uM)6P8~3Ikl!P1>uzi%RdbKJqHk z9g*mq`dh(SjS6YH)DK9#o9#b-5pv^QKbxKB37i6VW3a0;tJXH6R_Q@CaYb;!XJLhD ziSm&6fawLl&+%H_bsoRrtl|w*ryh;nRj_g9=kB002{VN@(oQs^tD!WDPe|5%E<$s2 z!^qd|FRm~CWr1YNqnf2bB%rC~)(LE{6hAqsVjZlT z-~F(WGhf%Bf3xpMePAM@9*g0*R8EVGqyr`}`+Jy_o0#4Mo76U<3+4`=zY4TJb?(B! z)2TV9`i8Aq@@0qUuLWO))gr%NrEwArDHibdTUQ|xy>^fi&;Bl@(5{huvbla60(0HnWvY|u>iwRI-%aGL+`cejFK@Jjv@MWe1?{$ zxB&_Uh>m&Iq%@&TUiHBt7!{*t_DoFKM~qUh<<$PtlclMOhRaO*?&o?z-nSTSLc-G& zcqm@k>gsVcDO@*G4a`acS`;BnWYV8AG{0Y!#<9}+{~qeK?!R*0=@-uk>zfr_l`N0Om#RoHsX1E7m`ZbEk=Sha59Gf zLrC^7Z{Dqz%64Uq&H3>7#)58S?B$ChFVl6Yxu(CYIAo^fux_g5A9wTNWUH|%+#HER zkrpfR2=oyY@vtTg$cPybfP^hu~l$`jJsU?f|Wt#?C>& zwDQH`Z_ObznvXl%eSYzSmK5-Lu~U&W=2Ovn{XL`Wr)fX!D~_fg?96*@iw*;3%8kWk zk#kufWf=caOw|xgZ7LJS(20E0#SJqDHZ%Da)A1`flw_kDL(b74(7v{nV*`b(Ds}Bo(0RBybjgAZh8g4TU zwVPzeY|h8PzxbJ%Zs*8_+9M;PE8sbhR+>Z7DtV>d-at1Up+yC*7I#b)Yu%iLBW#+9 z7WA%hYmn!|zUYYWW0Fa^Bm8Rb=1;>u(f78?DR0@zS0fy&`7MkStkWCL$m54LqC^!- z*jR4PTpYz*w}js%xuTP@o>C#0nk^I=;K-+S#bU2m^+=Q{ekQi>RuA0vEnGZfRkq`B>gLe7slQftsN3eUg%d@ z%v65tFrG~T#``&D&yG3Jl4*Py z7TAn>H9*LuBGnF*i1Fo6;ow$g0`6XtT{=s!1ym!;*R?~DEemVn+pOIJ-J;5|G#veA1E8-h0a$07R&0^TgTE? zyunCGTL9o$Aq~rSb61g{`}3EoClyYKa4UPfZz_HfS&Yies8sBeaGZS6!s^mVg{2gG z;h~)=?0t2-6{PYpYsNiU-4y9j%8uw1|WR7^0_3to-9ti{=c(($?u+6 z9RPI2Xyq;JU$2hSFA}#sM@mOR`FnW&G2xVh0*ANn1V?T84E^jsr|@WRgnzMW7eNG) zvnSiwBT#`=I9c6)*ww6o!BP>+%?-u$oiQj1Gt-ndayOyNkQncK6BZ(MC&UoCl!ic7 zC`_vSMcr0u<15#X^e&!zTeZZz7FwI3GvqyDaw>8m;Ou0z)iK8PF`;&aU>EIPdiBWD zOyAob)z2YAWb@FK2)b-;T0Ji`-f^ z{ZuM`0TBBSm5;*JQN`+GZsB#x1-U+5Hf9&qJ+S&iX+IQl#05`r@?>{K%F*-+npV7; za2$Fs2$F{Y;jg>Z0)CCo)(JQ0FJ5`k<&Ai(Kz98+FEUeU9OTXn-~SLCaGAg_?$sAb z89O>Z%0rx4m>z3+*xQ#WdP7i`Q9o2}qpPk>8TTF>RG+n=W=A}uHugbi%p?oGtJNu> zk-CNVkiGO4sOuK}6fGm$oe@;s8w{nfUxqz-k`5z4t5O`ld)Xi{Y5@wC+4CaPaC-va*VE+@!xM}A+B zPELGSmIxxSFd5n76#GzreqLc9_PNK4yjxap)#IBeI@GB=Jgz~AMg|lRMm%8*Rydsu zfa7!1aHDil2!i;)d@*W6+D!9H6W>;DV8)+%Jlo7(hGO27-K}vHx}}?g+Lv&Q++&8e z@i6X1<2k+Mb&wS}C7yk~gDlV_Nh5|S@%tWePuK?C!=unuGtq#<^C?u=W8}=rFrh zr9Pbix{1dGOtkhJAFH61nrE1P`uDjp_?6`9VOkphJucvY$z4^gXg67K;4J6~4E;)C zWb;eWFtK0C=&o(1g$%=2AV8=Cx&?~lhxKHskklu&`U7avsyX6FJ^s8MLWq+li)L%l zOfvePLU+E8i559%yED*YwxYiOB!5hX?VkrX872@-PI1lHnnUYwKjGQ(86*g&lBPJs z)i%|L9<%rm+!XYy_Ro0lFe|;VOo(!{@6aHV9N476v1CUr{Yv1WvI12izZb# zNCt>S7{Dc6Ab6!tCIT-V5RT)OovTIHpTQ5fwN)5ny93#7EO^Bl2S^3CD_fZ8C#z1y z5tzkxnnhd<1_u2iapqT(1E}B3t*4S;Nj!w7D!u4jsO2)WgU(=}?#t!ReSx9V*-8_q z?}toFLJfi>PD2!UzB4xhQ1Xhbw$x&yolYitPH@mC zps<1|e}y^siPM7vI=}_5$&sWo!IqX2sov(8PSb_4kE?2H!RnFWTlbxey^$-KOu{JZ zFAC|y+EC$`^^|Au)t$5OT|~YI)FN|gLN!NOY_j1z*zvBR4wr+uVhI;^N=^2#4l|B- zSWEa!D9}Om8Q4T(tHU^TSy~#F^1&LB9>f)16nS51m5Laai}K+WpXx#q&=D!A-Uwl; zsYyJ6Vfwfk*0`+2J={aYIt)Dle0bL2do7nZWzNbXD$$gpfv^6HMbZ7Ielf^$2J3%9sKZ|agQemdW(s!n)_N3-%Lse0&BM&Oi>D1a}Se^|#Vyd(beb84l0 zsbccM^#D(jU=ggr2W(dntNVCa=g#u2+Mk)k|MhPDDSh&AZ zCW_LMWeMrv7*wV|zDp13f2sfoN>thsd-&_=vkW)b*NDmh^`ZbumU$SbtJk5? z(s`lIlKIkv1K}b`t5Nu8f_(YMw-*ohR?YG1-X?LkxcG|JdAHxhz#MrzOl7K&!7~Nt z{hB{JGzoRjsu0%a}$vj!gh^>Rsu+S6x{_uxce~pI>h4tOit$sj&a(=W|^M@4y#v@?9IAHTJ< z!~_0bW7Gn}b$z{2uF?lHY+@55a#q{`-@@H?3P~dHiy>ABFEQJ@X36&l$hLM>#`S0+$U zF-}Oo$8{T`yC&e=d1^FV)4=bEZnF(_#P6shrS`J43mt+sdZ5k> z=(ZmVbTlh`5^{B4h8RPXeO$y)9!Wf~QH6NvV z{~jsco!-gW!A{ps>5b+TeV{~q_P)_4z@4X;>0}x^kd>2X7mN*;@KchEuxAovO{fr#Q72gLdXQd~-=@T9Y{vie7g*^)4&G$R`uyT?+4{8gp`6`o( zusV*FoK7}fR|tl|Y7KE(>Nnm`pePfp#OL6phm>EjS0Dd0@*Z?I39vfaS9bqA+|1|r z?{H5$XQQP^TA`%qIACXHNzZVGDaGe<)9(jOEt>Sz1TG zKt=NYM4E;kKbrme9GACjx|ln4XdVxH5nu|Ac-LVoXGyY2IXt$C;<&Dre( z?h?_xtciXU3AHhH%mtw6F!`IhpJbDe`~&cJQQH>$0LpLV+F2fkQq_qb8zg(K*X7Q= z;nYq}3}7?m)+rB@?vD2E=JC(GR+N_@#dYOI4Ehl3xRM<#G0&eAOzg%sy9KPYe2Bt{ z*2@0`7I%8-BN}+iJjDxQX#7p{t{WO5o)%hZdneu$d8p7k)l`ZL$@W`m$vqr=suoJ}EoCr(@FneEO;9 zgReLS;h0^OHLkNO6-zWaeLPaqRTla$>p@)h#iE-UX3jqjkn(|meqI+8pdqpUS#Ma{dhlBoU)73F&^(#>*T@u9w zjiS&tP6x?J$L1X+h5fcp6tzssCP)qC-z$?%x?vKFBVX|(x@tRsE;&0>ccS-coC0M$ z5}%~oq76-3Pg+NX05rq8;cNo9{BhkBE&595M}{Cys>E7~Vj#Pq?=DAAB76AOaC!wq z*mAc?0I@6Ep5o-5vh`-g$&d;z>ZNa6lVS4p?sO*|6&1FTf`5CX75D@hnAD(|7{rp~ zhUn-lh?u>~82d3H#-QX?YeG6;Cn0)G>o!(o)tl@*+L)noUf?;a`H4>klw$$k%hr_w zo=q^H&*?3d_MIpl;1V&(GkRCGDC(^!;xEU;1LVsPWfl3oJPL26GH7)ZhhjI&E#u84 z%Ld`hw5&h7!x*MOK`Ryxa0hLX9kbvxE{gMRNF$ zd1D%X7w9v2fwMtmQlBr%`8L0gTrO;I$55AgzMiGH+cU5SD2drH(P_+%>Qt z?#IGbPpa1hrgl*Kj#%cAq>3JyE5+W_#N`mzqjJtp3#)vY=%XUJrG}D4v$l_M8of1- z&fi>}#C(uox-#?wY9>6!FJGXfp5nZk>Y{KZE!~=re5yLMx}`!k7%J5Bau7)&^%n=w zmUzg5Sb>r7eE07zZVAzBVKehP6IhD3H&@o>r1-J|&?TtfpU)k+m^BLQ(?3;v0+nM7 z7JP|i47s_AZ@*G#Gs1@HJnPJ0r`!@oSvmUJd#>BW}{exd#GU-|4>#si@ z-+wb}==zq%>GIGiY%@}@pSJXa1a-rz8;w7GpB%2ig3?c}3Z<@u!;$Az{?1l8tRxa~ z_OUX*%k{d5^7H{|Wvhvzy9O~chjrs7X1!yDHZ{W0D#t!WaA<4-le;oe|3m2(EIFEO z1e|1F5jDS=nJkLN7g!8xzpu%?n395n4G04>)aLN}$h_HV&eTqt=c1mEIR9+m>s#_A zePwFxQPT(?D&+R%3Uy^fD`@5wu=;9e@)vKI2X|jO5RjSfdE(VzrtY}SnK`KzKSZ)D zJg}b6`R+Kto8*ES>1+k@kOopnafB__R3$E1bG30=15S<$M@m8FT}1o29)dxAi7HU) z3e4s3OI-cb0jtzuwIHgD-1PhXvnA|7!vDCawKtTm8&4!Pb$Y_f@?ul#Y0fXV)#MN4 zt4rVDG)e2IoFsSv$I=TsKo;IEW<`fB#5$^bF6~lStGZ{M_iOO-e!yVn?RL&y7hmt| zKm1s!kDud2`ut2V9#5}P&13=k|AcFD{Rij~7CYwx&zai+7_*b)NO;u%cIqc=;MSPOTZ6&P5T+AM z)Zpiiv|7LYWi44sRKx-cfKy8YrR_ibNbN*DFfE0zV?$uUi+ic1R72Ly!n%3VBlEQMx;##U8=s_4nt>fJ-90p&{LQIv!dzQ8n;qeN;~pO z9M9jwxu_e%@x*|tEtP7c`z}A6?NXN%2Wl6c{XRz5XbyW>6lBND1=nciv0pv$h&&7& z+0UV6VkPwA6m3t$&1iS>zd~CieohXT zP=R@*RoaavtnM#0pIqGoq#f>sOq@lM<7sHxC~%0x7yWmQO<*}d^i(Bi)iZx%F@d}J zkEhr}!}K~ktM8kNf4n?}Ud?lipgyOSEc&l5i+x3ILUnZmOiS9gtQP$O5SnFqS9+k& zY*DUNu5hsk+IDQPVEJ-v8~m=h%fuT=z;0{4D@tbk>8;7LD(ix&{)E{^nRc;tnbDx^ z1RubbkN!nw0A*j$`KJ~iA(V{QD4ZSv@%f&P2bd1 zdNy0obUm>wusftfklO1Jz&|AVI^I`AAFivs_U34ad)IvsAFOY~m>epBikr^+jiaxb z_TUrChy@~F%0#i+H15u8{p<2zPp}a8YNRYTDr|i8rFL z14-_~+(t4snP(ZUS_b{n}(i@%Noecj?L=r&pG9j;)Fmit7<63WdpHS7PG2UlfPDM8m z(RtKVXcUAWOob~AVd8|HS2I4Y$y9%(iuZQSj?4xTT8+PONh(bDL_~=r6W|%|8JAej zP+I$XAWWo}hl}-rV#R@~`h=Qe@2}=`fO~}td2^IWvBp8*%-kRX!^aGx6sJ-iGm@t} zr-v8KR3(SqiT7%8b;^Zbx(BfB(p}EDu(}SzhFLTcNr~D`eQ~wyUg^m>4=+%biY+A> zB=`p&s<_K1D84dTPl7)E9#Aux?!Mw#K_^4u_3Npd&ucWWR(7C1^j2bZtcdmNxcr3z4-0~CqsMka) z2c@B~vx7>;Y>y})zmQTNg-y;6&FX3-Zl%Is9J7dPtpc$!vxe);(PPqq?J4xUhd0Bs zUC8S1FSp3e1EdR81tuaUou<%GWB8b zV=M{eFAi@X9q~*ONNHHsOtfMaa7IaRl{6NYN+j(5RojUR%_JBf6AA8iyaA?X^7%+@F%3MrzcT_P_?g#_|(nT#s0sv z=cP=HhD)e}?vgW(?=MQ=edSb^nh2V(Me820^i8SmUVx|;T^BRxwa9#_<6z}l=< zwTQ5OkZu(v8TLK+$^Dz3nMiRochN=^b?N$Funtk^(~-_1@9Q>jg7JfwkvS)b_yeK{;8QDP@f!+^4pG}768d;9ad{<~d=K>%{Ok6+RT>LRKG}thU9V!NO7ef3M zUXiOdX{ME<9yb>AYTWwyUD+k5#*+0&%`XKsS02@g0%#xq*W z4~wo*3F&cf`GyhigeL3~rGf@ONA@Wx{)!xNE3f9Rk|Z*W5aaNA(71fFnBFszn4CA% zYNH&-E*T4MNI5S}?yz+gYyR~-oI~Nw>&7Gw*a?-;acz1?ltQd$&-;sfU+p!o{(F{Q z4+;=2EzWCC9Di3cb#LwHGIldebO(|VT?h7VaOe5>>S^7t{oMZNyt5IO-9y;{#n0YK zmi9h2+&1ig;n@(9H64|P1!TT6p%A1g?>PagphgK5~=O-_ju>}XYkmnXfnS{P8 z;H&>cuPEW0R9;a3p-Y;zK33j`W}}5m8^E(EZVz+II093BEnT15T)^q5*s(aj{egAP>g#N&=D)2psDC|wVRc|QcM{YM# z@4bg%MK-2y*RbXSrcO`c?_YR9%|i5GztoyAcYJUwGbbVUA+scQm1z)CZe1nGbgRvz z(lv)dX(ZcYWDboRkYW%^Y;m2`P`qpNFY-Wzw%XY zcPtArkcEq7HF(aPzU!}OWF4e!*oWv>3?@I&F&PZYCWv0Sb*&*a$zM)|SUm03bAj#@ z^F=&$<_4QvybUgWl!-Yxs&vp$jKd#i=c)ZdpK4e=Ehq*%di>+o2Dthc#|D0n)ZZ~j z2hxtbr_rNb|Ey8@yO=FV^t?=a4T`T4DsPh3Rv%+G^y#4`7V@7vVRGA;Th)cWS$566 zlTB%UY4I&EL0)%f{;7M-hAd^^$s-aTFD~bRL|h7QRu;d_Ia%O_JQ#tKy}rtvvZ3DY z!;DCRSicN4M$e3=FU4YKFvf}LHj0(JgwOgG@%EI$yBUBt@D13DeK6D^{{a_-{dLjf z8M*IHJC5_4<`Cj9AnJvr33)xK>aO%q37QK3=At4=)`pwDZ2V2R7{R|dk5I3l^eO*f z$9J5PmaiS&zK5%_tl+&d)wUoww#>tiP z>AYoTDvl?PX##l$rB1PjHv9rRVYx7{+>y7pj;6Gn^w9%$Y9G6)iWx~9A8u#u2T&6b zv`;sh%omFuZhaRRP~j<27`C;6;{)J^M}wlVcx(QBqJA+{!eN!05B3Tm?QY=qLV=@C z>&1U&)72u<#w}8?keH=~*85jltluGsaDgHzt zA|gH^1aR;dukB`)j*7Y4c`6hdsKpoUyd^ad1_R5sFu@N8hzo93+bZ)V4WkTdP4G~o zqIG)+x6pKt!%_&>FFcA`X=ot$_(n}H>vgVBJQ1A`0*4TV2Ta9eLy|UwG!LXsZH{z( zNEw!M5Tv&s_>#gl=fs{v?qo*E0)Hd>){>xt4feqafCoBkTG{$YfcAJpWPq8MLr`+n zpicH9JrSAnlH)DRR9>RI=2#qW)YzHMhv2xKHj7_UkAO{0?_;JRZ>7!UW)r@|ku;#W zB_d3`hiM`yX|Q@SA9I=nxM-FI5;Mc7WdYz=(ewJH06i3mmOTFTe49oNbJBe@?YOkK zw>Eq>7QD|G=@X6ef(V?>1f5m&N3Um6PZ9P@a4sD{PQa9uZahn`9L82rV#yRu^4u>o zqURZzEjZHi*DS_{sBoEp9#OZVqT424tS@}Fn8oyi5zMWoPZ77$gFH+@u985PQG%<` z*u27y@SfY_!U@TD-~V|S)f4opwcHUkCciK-_tEXwy6G2?k;YFPVLU$B4wJ@upEE7D5-#^hbk(WIFV0TM|+^Y&eW-EtSpqQ=X5TJ|81%ZQ*HE^?tD z9Kz(NA_v$dLW-T}!{@K$sTrZ|PHOb`H(QLpnWg}9zBmiWx3JpAusos;Y7<@a*{#f;>>qsmRcda7NK;@M*##7<)TqBNol5l%|j;J z856tCftP-rJLk`G8`#lHE`{z(2G^w^o&zM+pLrvV)Z21hhyed^9coT=y@mFhUW6Nf z+VUvi{HU$2&_&GiG21uimh~JLdA0h~r)bmxT7YYxfVaN{T5I0@AkMG$4Y#-Eaa>Cul_ zuq5yrF}y4=(MeUr)5OI{To%ng8BwT**D&=E{Ji*g_R?TX3MMVFnOx5rKxRW`_HEcP zVv(YQsld;0+?M?#%9F=5r{a8E8paAN#_?yivbj`#3@l^FYNy$O84*|mGj%)t;tXT zD0Nck)cku2^yJu8)w5MP*lxZWn%E*eyXjT(kR{%X=+GhID*WTM!Cj#nr?vYMV;%73 zD@ZskhTm2m(ZzqzzFS_A6#HgRI_>OgeHnq<$L8_{<@AVLjoY0NkV#U?L!{75U+dWla7qsH@yxgWde+)>?pT>-JrP0 zS|Tds6VP;k#ukDcq$HYgst2-#RoM2#>1%mmTcJXHGB%PLIO{tWFV5{fAxY+DdB7d7 zy}Qlld0fjS3uE*%)-=_?MEu1O>vN=G?RlBmZ$^(MHm)p4vAttQ6W8cxSly2j)a>jXiQh` z{7c!Q%D`21KB;W|Uq{jZzP*!}RDSxipfkMZ@gckR4L`$Akb^SuZpCSdTGvkQJJ6(w zt(S$nir{#p!Q7`LMPzA*0FV1YF(qxZnQD`>A>lMTD&Jjt_S zA{tE}q&C%4n9WeoeD@IUv8=k@jIa^36(f`BQJ0Ag;E$LDSZMy*qso)h>5(1}LnKexNXgI0P4c@3QAjScT@P+ZKj zZAmV_Tr*W5-y$rN%~h#SNyH2$p!hN`4nl0oq6TXMCHGDi!V6j9Ej4VUBY+GpoHGE9 z_Z&GP(U)Y%!W$Yxy02Ik%Z+0oz;8MkuL-a##ffQr_;7s0IUl_m8HQXJv6sDwlMVZe z6E>~Fcbt`PCpB;2IpEaq&jELz>F0CSF|#oixhedy^z4w}&jIXGyT?gw&psW{5;8uoALjNKH-d>)gOz*DnSji-PLu4 zG=HK8ZC{U^{l)ROv(GoYzdo2$#YRAh7|8P6IyD-=u{>BT9^+4=J5jq~T2TLAL2JW8 z=y04QPu@y%z%bn+MXBU=@(>eP%B=W5>ahO()%<@k@Be$1v9i*JGR?br`>N7sCk5!i z8vg*1SLhM<8eK;j$=S*R9^&%BYPWvcDyNi@e=SgTR)8Kr^Ki9t70#i#;9Ao5|6O_5 z^?%zWkP!vO0E+hYEEMw4AX9K4!@^Xvur5PC_&>|V{y$~@XSDu*(4PvL=df|7`IZCC rLs*m>zM%}j*8Z \$opt_help, + 't|time=f' => \$opt_time + ); + +if($opt_help) { + &help(); + exit(0); +} + + +sub help(){ + print "Usage: exec_evtbuild_t.pl -t + +required: + [-t|--time ] : The runtime of the daq_netmem (effective runtime). + [-h|--help] : Show this help. + +" +} + + +if (defined($opt_time)){ + $time = $opt_time; +} +else{ + $time = 3; +} + + + +$thr1 = threads->new(\&execute, "timeout -s SIGINT ".($time+1.5)." daq_evtbuild -m 1 -q 32 -d file -x te -Se -S boris"); +sleep 1; +$thr2 = threads->new(\&execute, "timeout -s SIGINT ".$time." daq_netmem -m 1 -q 32 -i 50000 -S boris"); + +$thr1->join(); +$thr2->join(); + + + + + +sub execute { + my $s = shift; + system($s); +} diff --git a/tools/dev/preview/run.pl_old b/tools/dev/preview/run.pl_old new file mode 100755 index 0000000..e92443d --- /dev/null +++ b/tools/dev/preview/run.pl_old @@ -0,0 +1,514 @@ +#!/usr/bin/perl -w + +# TODO +# this is veeeeryyyy ugly!!! + + +use strict; +use warnings; +# use Gtk2 -init; +use Data::Dumper; +use Time::HiRes qw( gettimeofday usleep time ); +use FileHandle; +use feature 'say'; +use Bit::Vector; +use POSIX qw/floor ceil/; +use Getopt::Long; +use CGI ':standard'; + +my $here = qx/pwd/; + +my $q = CGI->new; + + +my $opt_help; +my $opt_time; +my $time; +my $opt_id; + +GetOptions ('h|help' => \$opt_help, + 't|time=f' => \$opt_time, + 'id=s' => \$opt_id + ); + +if( $q->param('id') ) { + $opt_id = $q->param('id'); +} + +if( $q->param('t') ) { + $opt_time = $q->param('t'); +} + +if($opt_help) { + &help(); + exit(0); +} + +unless($opt_time && $opt_id){ + &help(); +# exit(0); + $opt_time = 0.2; + $opt_id = "ccc1ccc1"; +} + + +sub help(){ + print "Usage: run.pl -t + +required: + [-t|--time ] : The runtime of the daq_netmem (effective runtime). + [-id ] : The id of the sensor you want to test +optional: + [-h|--help] : Show this help. + +" +} + +my $file; +my @lines; +my $pos; +my $str; +my $s; +my $i; +my $j; +my $k; +my $n; +my $runtime; +my $id; +my $command; +my @skiprun; + +my @data; +my $run; +my $mode; +my $avg; +my $counts; +my $good_status; +my $bad_status; +my $broken; +my @tokens; +my $line; +my $word; +my @status_array; +my @debug1_array; +my @debug2_array; +my @timestamp1_array; +my @timestamp2_array; +my @dlen_array; +my @dcounter_array; +my @framenum_array; +my $dcount; +my @pixels; + +my $avgA = 0; +my $avgB = 0; +my $avgC = 0; +my $avgD = 0; +my $undef_data; +my @a; +my $size; +my $p1; +my $p2; +my $row; +my $overflow; +my $hits; +my $col; + + + + + + + + + +sub run(){ + +# execute("cd /daq/trb_maps_jtag3/ui/;./ui.pl;"); +# execute("trbcmd w 0xf013 0xc001 0x00FFFFFF"); +# execute("trbcmd w 0xf013 0xc006 0x00002eaa"); +# execute("cd /daq/trb_maps_jtag3/ui/;./start.pl"); +# sleep 1; +# execute("trbcmd w 0xf013 0xc001 0x00000000"); +# execute("trbcmd w 0xf013 0xc002 0x00000010"); +# execute("trbcmd w 0xf013 0xc007 0x00000200"); + + sleep 1; + + #execute("trbcmd w 0xf013 0xb120 0x0000000A"); + + + say "All tresholds set..."; + + system("./exec_evtbuild_t.pl -t ".$runtime); #14 + system("mv te1* ./temp.hld"); + + + open(PIPE,"daq_anal ./temp.hld |"); + + + + undef @data; + $run = -1; + $mode = 0; + $i = 0; + $avg = 0; + $counts = 0; + $good_status = 0; + $bad_status = 0; + $broken = 0; + foreach $line (){ + @tokens = split(/ +/, $line); + chomp(@tokens); + + foreach $word (@tokens){ + + if ($word =~ "00000000:"){ + $mode = 1; + $run++; + # $done[$run] = 0; + $status_array[$run] = Bit::Vector->new_Hex(32, substr("0x00000000",2,8)); + $debug1_array[$run] = Bit::Vector->new_Hex(32, substr("0x00000000",2,8)); + $debug2_array[$run] = Bit::Vector->new_Hex(32, substr("0x00000000",2,8)); + $timestamp1_array[$run] = Bit::Vector->new_Hex(32, substr("0x00000000",2,8)); + $timestamp2_array[$run] = Bit::Vector->new_Hex(32, substr("0x00000000",2,8)); + $dcounter_array[$run] = Bit::Vector->new_Hex(32, substr("0x00000000",2,8)); + $framenum_array[$run] = Bit::Vector->new_Hex(32, substr("0x00000000",2,8)); + $dcount = 0; + } + + if ($mode == 1){ + if ($word =~ "ffffffff"){ + # $done[$run] = 1; + $mode = 2; + } + } + elsif ($mode == 2){ + if ($word =~ ":"){} + else{ + #$id = "aaa".$opt_sensor."aaa".$opt_sensor; + #$id = "c".$opt_chain."s".$opt_sensor."c".$opt_chain."s".$opt_sensor; + if ($word =~ $id){ + # $done[$run] = 2; + $mode = 3; + } + else{ + $mode = 1; + } + } + } + elsif ($mode == 3){ + if ($word =~ ":"){} + else{ + # $done[$run] = 3; + # say $word; + $status_array[$run] = Bit::Vector->new_Hex(32, substr($word,2,8)); + # say $run; + # say $status_array[$i]->to_Hex(); + $mode = 4; + } + } + elsif ($mode == 4){ + if ($word =~ ":"){} + else{ + # $done[$run] = 4; + $debug1_array[$run] = Bit::Vector->new_Hex(32, substr($word,2,8)); + $mode = 5; + } + } + elsif ($mode == 5){ + if ($word =~ ":"){} + else{ + # $done[$run] = 5; + $debug2_array[$run] = Bit::Vector->new_Hex(32, substr($word,2,8)); + $mode = 6; + } + } + elsif ($mode == 6){ + if ($word =~ ":"){} + else{ + # $done[$run] = 6; + $timestamp1_array[$run] = Bit::Vector->new_Hex(32, substr($word,2,8)); + $mode = 7; + } + } + elsif ($mode == 7){ + if ($word =~ ":"){} + else{ + # $done[$run] = 7; + $timestamp2_array[$run] = Bit::Vector->new_Hex(32, substr($word,2,8)); + $mode = 8; + } + } + elsif ($mode == 8){ + if ($word =~ ":"){} + else{ + # $done[$run] = 8; + if ($word =~ "55555555"){ + #$dcount++; + $mode = 9; + } + else{ + $mode = 0; + } + } + } + elsif ($mode == 9){ + if ($word =~ ":"){} + else{ + # $done[$run] = 9; + #$dcount++; + $framenum_array[$run] = Bit::Vector->new_Hex(32, substr($word,2,8)); + $mode = 10; + } + } + elsif ($mode == 10){ + if ($word =~ ":"){} + else{ + $dlen_array[$run] = Bit::Vector->new_Hex(32, substr($word,2,8)); + $mode = 11; + } + } + elsif ($mode == 11){ + if ($word =~ ":"){} + else{ + if ($word =~ "80018001"){ + # $done[$run] = 11; + $mode = 0; + } + elsif ($word =~ "ffffffff"){ + # $dcounter_array[$run] = $dcount; + $mode = 0; + $broken++; + } + else{ + # $done[$run] = 10; + push(@{$data[$run]},$word); + # $dcount++; + } + } + } + } + $i++; + } + + + close(PIPE); + + say "Total frames: ".$run." broken: ".$broken; + + $i = 0; + $j = 0; + $k = 0; + + + for ($i=0;$i<576;$i++){ + for ($j=0;$j<1152;$j++){ + $pixels[$i][$j]=0; + } + } + + + + $good_status = 0; + $bad_status = 0; + $avgA = 0; + $avgB = 0; + $avgC = 0; + $avgD = 0; + $counts = 0; + $undef_data = 0; + for ($i=0;$i<$run;$i++){ + + if ($status_array[$i]->to_Hex() =~ /f000000f/i){ + $good_status++; + $counts++; + + if (defined($data[$i])){ + @a = @{$data[$i]}; + $size = 0; + foreach $word (@a){ + #print "\n<<< ".$word; + #say $word; + $p1 = Bit::Vector->new_Hex(16, substr($word,2,4)); + $p2 = Bit::Vector->new_Hex(16, substr($word,6,4)); + if ($size == 0){ + #print "\n >>> size 0"; + $size = int($p1->Chunk_Read(4,0)); + $row = int($p1->Chunk_Read(11,4)); + $overflow = int($p1->Chunk_Read(1,15)); + $hits = int($p2->Chunk_Read(2,0)); + $col = int($p2->Chunk_Read(11,2)); + #print "\n ".$p1->to_Bin(); + #print "\n size ".$size." row ".$row." ov ".$overflow; + #print "\n ".$p2->to_Bin(); + #print "\n col ".$col." hits ".$hits; + #print DATA $row." ".$col."\n"; + $pixels[$row][$col]++; + if ($col < 288) {$avgA++;} elsif ($col < 576){$avgB++;} elsif ($col < 864){$avgC++;} elsif ($col < 1152){$avgD++;} + if ($hits > 0){ + for ($k=0;$k<$hits;$k++){ + $col++; + if ($col < 288) {$avgA++;} elsif ($col < 576){$avgB++;} elsif ($col < 864){$avgC++;} elsif ($col < 1152){$avgD++;} + #print "\n +col ".$col; + #print DATA $row." ".$col."\n"; + $pixels[$row][$col]++; + } + } + $size--; + } + elsif ($size == 1){ + #print "\n >>> size 1"; + #print "\n ".$p1->to_Bin(); + $hits = int($p1->Chunk_Read(2,0)); + $col = int($p1->Chunk_Read(11,2)); + #print "\n col ".$col." hits ".$hits; + #print DATA $row." ".$col."\n"; + if ($col < 288) {$avgA++;} elsif ($col < 576){$avgB++;} elsif ($col < 864){$avgC++;} elsif ($col < 1152){$avgD++;} + $pixels[$row][$col]++; + if ($hits > 0){ + for ($k=0;$k<$hits;$k++){ + $col++; + if ($col < 288) {$avgA++;} elsif ($col < 576){$avgB++;} elsif ($col < 864){$avgC++;} elsif ($col < 1152){$avgD++;} + #print "\n +col ".$col; + #print DATA $row." ".$col."\n"; + $pixels[$row][$col]++; + } + } + $size = int($p2->Chunk_Read(4,0)); + $row = int($p2->Chunk_Read(11,4)); + $overflow = int($p2->Chunk_Read(1,15)); + #print "\n ".$p2->to_Bin(); + #print "\n size ".$size." row ".$row." ov ".$overflow; + } + else{ + #print "\n >>> size ".$size; + $hits = int($p1->Chunk_Read(2,0)); + $col = int($p1->Chunk_Read(11,2)); + if ($col < 288) {$avgA++;} elsif ($col < 576){$avgB++;} elsif ($col < 864){$avgC++;} elsif ($col < 1152){$avgD++;} + #print "\n ".$p1->to_Bin(); + #print "\n col ".$col." hits ".$hits; + #print DATA $row." ".$col."\n"; + $pixels[$row][$col]++; + if ($hits > 0){ + for ($k=0;$k<$hits;$k++){ + $col++; + if ($col < 288) {$avgA++;} elsif ($col < 576){$avgB++;} elsif ($col < 864){$avgC++;} elsif ($col < 1152){$avgD++;} + #print "\n +col ".$col; + #print DATA $row." ".$col."\n"; + $pixels[$row][$col]++; + } + } + $size--; + $hits = int($p2->Chunk_Read(2,0)); + $col = int($p2->Chunk_Read(11,2)); + if ($col < 288) {$avgA++;} elsif ($col < 576){$avgB++;} elsif ($col < 864){$avgC++;} elsif ($col < 1152){$avgD++;} + #print "\n ".$p1->to_Bin(); + #print "\n col ".$col." hits ".$hits; + #print DATA $row." ".$col."\n"; + $pixels[$row][$col]++; + if ($hits > 0){ + for ($k=0;$k<$hits;$k++){ + $col++; + if ($col < 288) {$avgA++;} elsif ($col < 576){$avgB++;} elsif ($col < 864){$avgC++;} elsif ($col < 1152){$avgD++;} + #print "\n +col ".$col; + #print DATA $row." ".$col."\n"; + $pixels[$row][$col]++; + #print "debug: ".$pixels[$row][$col]." ".$row." ".$col."\n"; + } + } + $size--; + } + } + } + else{ + $undef_data++; + } + } + else{ + $bad_status++; + } + + } + + say "good: ".$good_status." bad: ".$bad_status; + say "Total hits: ".$avgA." ".$avgB." ".$avgC." ".$avgD."\n"; + + if ($counts > 0){ + $avgA = $avgA/$counts; + $avgB = $avgB/$counts; + $avgC = $avgC/$counts; + $avgD = $avgD/$counts; + + say "Normalized: ".$avgA." ".$avgB." ".$avgC." ".$avgD."\n"; + +# $avgal->set_text("ADC A - ".$avgA); +# $avgbl->set_text("ADC B - ".$avgB); +# $avgcl->set_text("ADC C - ".$avgC); +# $avgdl->set_text("ADC D - ".$avgD); + } + else{ + say "Error: NO GOOD FRAMES!!!"; +# $avgal->set_text("ADC A - n/a"); +# $avgbl->set_text("ADC B - n/a"); +# $avgcl->set_text("ADC C - n/a"); +# $avgdl->set_text("ADC D - n/a"); + } + +# $stats->set_text("Statistics (total/broken/good/bad): $run / $broken / $good_status / $bad_status"); + + open(DATA,"> ./bitmap_1.pix") || die("Cannot create data file!"); + + for ($i=0;$i<576;$i++){ + for ($j=0;$j<1152;$j++){ + print DATA $pixels[$i][$j]." "; + } + print DATA "\n"; + } + close(DATA); + + + $command = " + gnuplot -e \" + set terminal pngcairo; + set palette model RGB; + set xrange [0:1152]; + set yrange [0:576]; + set cbrange [0:20000]; + set palette defined ( 0 'white', 1 'red', 5 'black', 10 'blue', 20000 'green'); + set output './image_recalibrated_1.png'; + plot './bitmap_1.pix' matrix with image; + exit; + \" + "; + + + system($command); + +} + + +sub execute { + my $s = shift; + system($s); +} + + + + + +system("rm image_recalibrated_1.png"); + +$runtime = $opt_time; +$id =$opt_id; + +$ENV{'JTAGPATH'}="/local.1/jtag_mvd/soft/toolbox/jtag_atomic/"; +$ENV{'DAQOPSERVER'}="localhost:7"; +chdir("../"); +system("./startup.pl ../setup/testsetup.xml"); +chdir("preview"); + +run(); + + +1; diff --git a/tools/dev/preview/unpack_hld.pl b/tools/dev/preview/unpack_hld.pl new file mode 100755 index 0000000..8c3125d --- /dev/null +++ b/tools/dev/preview/unpack_hld.pl @@ -0,0 +1,522 @@ +#!/usr/bin/perl -w + +use English; +use strict; +use Getopt::Long; +use Data::Dumper; +use FileHandle; +use feature "switch"; +use POSIX qw/strftime/; +my $SensorHeaderLength = 7; + +my $Statistics; +my $PMap; + + +############################################################################### +## Configuration ############################################################## +############################################################################### + + +my $file; +my $opt_help = 0; +my $opt_verb = 0; +my $opt_debug = 0; +my $opt_frameinfo = 0; +my $totalevents = 1E9; +my $mode = ""; + +GetOptions ('h|help' => \$opt_help, + 'f|file=s' => \$file, + 'v|verb' => \$opt_verb, + 'i|info' => \$opt_frameinfo, + 'd|debug' => \$opt_debug, + 'e|events=i' => \$totalevents); + + + + +if($opt_help) { + printf("Usage: unpack_hld.pl \n"); + printf("[-h|--help] Show this help\n"); + printf("-f|--file Path to hld file\n"); + printf("[-v|--verb] Dump hld file content\n"); + printf("[-i|--info] Show frame information\n"); + printf("[-d|--debug] More debugging output\n"); + printf("\n"); + exit; + } + + + +############################################################################### +## HLD Reader ################################################################# +############################################################################### + + +if(&checkArgs()){ + exit(0); +} + +my @evtHeader_list = (); +my $evtHeader_aref = \@evtHeader_list; + +my @subEvtHeader_list = (); +my $subEvtHeader_aref = \@subEvtHeader_list; + +my @data_list = (); +my $data_aref = \@data_list; + +my $fh = new FileHandle("$file", "r"); + +while(1){ + @evtHeader_list = (); + + &getEvtHeader($fh,$evtHeader_aref); + &printEvtHeader($evtHeader_aref) if($opt_verb); + + my $evtSize = $evtHeader_aref->[0]; + if (!defined $evtSize || $evtSize < 0x10) {last;} + + #- If the size is only 32 Bytes -> goto to + # the next Event Header since there are no subevents + next unless defined $evtSize; + next if($evtSize == 32); + + my $size_cntr = 32; # Bytes + + while($evtSize > $size_cntr){ + + @subEvtHeader_list = (); + + my $endian = &getSubEvtHeader($fh,$subEvtHeader_aref); + &printSubEvtHeader($subEvtHeader_aref) if($opt_verb); + + my $subEvtSize = $subEvtHeader_aref->[0]; + + $size_cntr = $size_cntr + $subEvtSize; + + #- If the size is only 16 Bytes -> goto to + # the next Sub Event Header since there are no subevents + next if($subEvtSize == 16); + + @data_list = (); + &getSubEvtData($fh, $data_aref, $subEvtSize, $endian); + &printData($data_aref) if($opt_verb); + + my $paddedSize = &padding($fh, $subEvtSize); + + $size_cntr = $size_cntr + $paddedSize; + + #----------> User function <--------- + &analyzeData($evtHeader_aref, $subEvtHeader_aref, $data_aref); + } +} + +WriteResults(); + +$fh->close(); + +exit(0); + +####################### END OF MAIN ################### + +sub printEvtHeader() +{ + my ($data_aref) = @_; + + print "\n"; + + printf("size: %08x ", $data_aref->[0]); + printf("decoding: %08x ", $data_aref->[1]); + printf("id: %08x ", $data_aref->[2]); + printf("seqNr: %08x\n", $data_aref->[3]); + + my $year = (($data_aref->[4] >> 16) & 0xff) + 1900; + my $mon = (($data_aref->[4] >> 8) & 0xff) + 1; + my $mday = ($data_aref->[4] >> 0) & 0xff; + + my $hour = ($data_aref->[5] >> 16) & 0xff; + my $min = ($data_aref->[5] >> 8) & 0xff; + my $sec = ($data_aref->[5] >> 0) & 0xff; + + printf("date: %04d-%02d-%02d ", $year, $mon, $mday); + printf("time: %02d:%02d:%02d ", $hour, $min, $sec); + printf("runNr: %08x ", $data_aref->[6]); + printf("expId: %08x\n", $data_aref->[7]); +} + +sub printSubEvtHeader() +{ + my ($data_aref) = @_; + + print "\n"; + + printf("size: %08x ", $data_aref->[0]); + printf("decoding: %08x ", $data_aref->[1]); + printf("id: %08x ", $data_aref->[2]); + printf("trigNr: %08x\n", $data_aref->[3]); +} + +sub printData() +{ + my ($data_aref) = @_; + + my $cntr = 0; + + print "\n"; + + foreach my $word (@$data_aref){ + printf("%08x ", $word); + + $cntr++; + + print "\n" if( ($cntr%4) == 0); + } +} + +sub getEvtHeader() +{ + my ($fh, $data_aref) = @_; + + my @tmp_list; + + foreach my $i (1..8){ + my $header; + + read($fh, $header, 4); +# &checkEndOfFile($fh, $header); + + push(@tmp_list, $header); + } + + my $decoding = unpack("V*", $tmp_list[1]); + my $endian = &getEndianess($decoding); + + unless(defined $decoding) { + printf "This seems to be the end\n" if $opt_verb; + return -1; + } + + if($opt_debug){ + if($endian){ + printf("\n Event Decoding: %08x Byte Order: Little Endian\n", $decoding); + } + else{ + printf("\n Event Decoding: %08x Byte Order: Big Endian\n", $decoding); + } + } + + foreach my $tmp (@tmp_list){ + my $word; + + if($endian){ + $word = unpack("V*", $tmp); # Small Endian + } + else{ + $word = unpack("N*", $tmp); # Big Endian + } + + push(@$data_aref, $word); + } +} + +sub getSubEvtHeader() +{ + my ($fh, $data_aref) = @_; + + my @tmp_list; + + foreach my $i (1..4){ + my $header; + + read($fh, $header, 4); +# &checkEndOfFile($fh, $header); + + push(@tmp_list, $header); + } + + my $decoding = unpack("V*", $tmp_list[1]); + my $endian = &getEndianess($decoding); + if($opt_debug){ + if($endian){ + printf("\n SubEvent Decoding: %08x Byte Order: Little Endian\n", $decoding); + } + else{ + printf("\n SubEvent Decoding: %08x Byte Order: Big Endian\n", $decoding); + } + } + + foreach my $tmp (@tmp_list){ + my $word; + + if($endian){ + $word = unpack("V*", $tmp); # Small Endian + } + else{ + $word = unpack("N*", $tmp); # Big Endian + } + + push(@$data_aref, $word); + } + + return $endian; +} + +sub getEndianess() +{ + my ($decoding) = @_; + + # Return values: + # 0 : Big Endian + # 1 : Little Endian + # + # Usually (when sent by GbE-FPGAs) Event Headers are Little Endian + # SubEvent Headers and data are Big Endian + + my $retVal = 0; + + if(defined($decoding) && ($decoding & 0x000000ff) > 0){ + $retVal = 1; # This is Little Endian + } + + return $retVal; +} + +sub getSubEvtData() { + my ($fh, $data_aref, $size, $endian) = @_; + + #- Subtract subevent header size and devide by word size + my $nrOfWords = ($size - 16)/4; + my $tmp; + + my @tmps; + read($fh, $tmp, 4*$nrOfWords); + if($endian){ + @$data_aref = unpack("v*",$tmp); + } + else{ + @$data_aref = unpack("n*",$tmp); + } + +# my $word; +# foreach my $i (1..$nrOfWords){ +# read($fh, $tmp, 4); +# if($endian){ +# $word = unpack("V*", $tmp); # Little Endian +# } +# else{ +# $word = unpack("N*", $tmp); # Big Endian +# } +# push(@$data_aref, $word); +# } + } + +sub padding() +{ + my ($fh, $size) = @_; + + my $retVal = 0; # Size of the padded word + + #- Check 64-bit (8-Byte) alignment + unless( ($size%8) == 0){ + my $tmp; + read($fh, $tmp, 4); + $retVal = 4; # Bytes + } + + return $retVal; +} + +sub checkEndOfFile() +{ + my ($fh, $tmp) = @_; + + unless( defined $tmp){ + #- The end of the file + print "\n End of file\n"; + $fh->close(); + exit(0); + } +} + +sub checkArgs() +{ + my $retVal = 0; + + unless( defined $file){ + print "\n You must provide a path to the hld file!\n"; + print " Read help.\n"; + $retVal = 1; + } + + return $retVal; +} + + + + + + + +############################################################################### +## MVD Unpacker ############################################################### +############################################################################### + + + +sub analyzeData() { + my ($evtHeader, $subEvtHeader, $data) = @_; + my $EvtId = $evtHeader->[3]; + my $pos = 0; + my $time = 0; + my $SubEvtSize = $subEvtHeader->[1]/4-6; + + SSELoop: while(1) { #Loop over SubSubEvents + + #Read SubSubEvent Header + my $RocLength = $data->[$pos++]; + my $RocId = $data->[$pos++]; + if($RocId == 0x5555) {last;} + my $RocEnd = $pos + $RocLength*2 -1; + + SensLoop: while(1) { #Loop over Sensors + #Read Sensor Header + my $SensorHead = ($data->[$pos+0] << 16) + $data->[$pos+1]; + my $SensorId = $data->[$pos+3]; + my $SensorStatus = ($data->[$pos+4] << 16) + $data->[$pos+5]; + my $SensorError = ($data->[$pos+6] << 16) + $data->[$pos+7]; + my $SensorDebug = ($data->[$pos+8] << 16) + $data->[$pos+9]; + $pos+=10; + + if($opt_frameinfo) { + my $SensorTime = sprintf("%04x%04x%04x%04x",$data->[$pos+2],$data->[$pos+3],$data->[$pos],$data->[$pos+1]) if $opt_frameinfo; + printf("Head\t%8x\tID\t%8x\tStatus\t%08x\tError\t%08x\tDebug\t%08x\tTime\t%s\n", + $SensorHead, $SensorId, $SensorStatus, $SensorError, $SensorDebug, $SensorTime); + } + $pos+= 4; + + $PMap->{$SensorId}->[575]->[1151] = 0 unless defined $PMap->{$SensorId}->[575]->[1151]; + my $matrix = $PMap->{$SensorId}; + + + + + + #Could it be...? + if($SensorHead != 0xffffffff) { + #Something is really wrong with data. Skip SubEvent! + printf("Broken Sensor Header\n") if $opt_frameinfo; + $Statistics->{$SensorId}->{Broken}++; + last SSELoop; + } + + #Check Status Word + my $SensorIsValid = 0; + if($SensorStatus == 0xf000000f) { + $SensorIsValid = 1; + $Statistics->{$SensorId}->{Valid}++; + } + else { + $SensorIsValid = 0; + $Statistics->{$SensorId}->{Broken}++; + } + + if($SensorIsValid){ + #Hey Sensor, tell me who you are! + my $SensorDummy = ($data->[$pos+0] << 16) + $data->[$pos+1]; + my $SensorNumber = ($data->[$pos+2] << 16) + $data->[$pos+3]; + my $SensorLength = $data->[$pos+5]; + $pos+=6; + + printf("\t\t\tHeader\t%08x\tFrame\t%08x\tLength\t%i\n", + $SensorDummy, $SensorNumber, $SensorLength) if $opt_frameinfo; + + my $FrameEndPos = $pos + $SensorLength*2; + my ($d, $line, $column, $pixels, $statecnt, $ovf) = (0,0,0,0,0,0); + while(1) { + $d = $data->[$pos++]; + + #Is new line? + if($statecnt-- == 0) { + $ovf += ($d >> 15) & 1; + $line = ($d >> 4) & 0x7FF; + $statecnt = $d & 0xF; + } + else { + $pixels = ($d & 0x3); + $column = ($d >> 2) & 0x7FF; + printf("\t$line, $column x %d\n",$pixels+1) if $opt_frameinfo; + + $matrix->[$line]->[$column]++; + if ($pixels > 0) { + $matrix->[$line]->[$column+1]++; + if ($pixels > 1) { + $matrix->[$line]->[$column+2]++; + if ($pixels > 2) { + $matrix->[$line]->[$column+3]++; + } + } + } + } + + last if $pos >= $FrameEndPos; + } + + + #Read end of frame marker without check + $pos+=2; + } + else { + #TODO: handling for frames with invalid status, but data. + } + if($pos >= $RocEnd){ + last SensLoop; + } + } + } + } + + +sub WriteResults { + + + foreach my $id (keys $Statistics) { + #No frames? No plot! + if(!defined $Statistics->{$id}->{Valid}) {next;} + + my $fn = "gnuplot"; + $fh = new FileHandle ("|$fn") or die "error: no gnuplot"; + $fh->autoflush(1); + + print $fh "set terminal png size 800,400 font \",9\";\n"; + print $fh strftime("set label 100 \"%H:%M:%S\" at screen 0.98,0.02 right tc rgb \"#000044\" font \"monospace,8\"\n", localtime()); + print $fh "set palette model RGB;\n"; + print $fh "set xrange [0:1152];\n"; + print $fh "set yrange [0:576];\n"; + print $fh "set cbrange [0:5000];\n"; + print $fh "set palette defined ( 0 'white', 1 'red', 5 'black', 10 'blue', 5000 'green');\n"; + my $s = sprintf("%04x",$id); + print $fh "set output './image_recalibrated_$s.png';\n"; + print $fh "plot '-' matrix with image\n"; + + my @matrix; + + for(my $y = 0; $y < 576; $y++) { + my $map = $PMap->{$id}->[$y]; + #Define lengths of all arrays + $map->[1152] = 0; + #Fill undef with 0 + @matrix = map {$_ || 0 } @{$map}; + #Join lines + my $l = join(" ",@matrix); + print $fh $l."\n"; + } + + print $fh "e\nexit\n"; + $fh->close(); + } + + + } + diff --git a/tools/dev/testgui.js b/tools/dev/testgui.js new file mode 100644 index 0000000..f4a66df --- /dev/null +++ b/tools/dev/testgui.js @@ -0,0 +1,47 @@ + +// var sensorIdHash = new Object(); + + + + +function reloadQuickEditArea(configFile,destId) { + + var configFile_ = encodeURIComponent(configFile); + var destId_ = encodeURIComponent(destId); + getdata("testgui.pl?action=print_quickEditArea&configFile="+configFile_+"&destId="+destId_,destId,false); + +} + + + +function run(time) { +// sensorIdHash["hugo"]="hugo"; +// sensorIdHash["hugo2"]="hugonaut"; + + + for( var sensorId in previewAreaIdHash){ +// alert(laufid+" => "+previewAreaIdHash[laufid]); + var sensorId_ = encodeURIComponent(sensorId); + getdata("testgui.pl?action=showPlot&sensorId=",previewAreaIdHash[sensorId],true); + } + + getdata("run.pl","theConsole",false); + + for( var sensorId in previewAreaIdHash){ +// alert(laufid+" => "+previewAreaIdHash[laufid]); + var sensorId_ = encodeURIComponent(sensorId); + getdata("testgui.pl?action=showPlot&sensorId="+sensorId_,previewAreaIdHash[sensorId],true); + } +} + + + +function toggleVis(elementId) { +if(document.getElementById(elementId)){ +if( document.getElementById(elementId).style.visibility == "visible") { + document.getElementById(elementId).style.visibility = "collapse"; +} else { + document.getElementById(elementId).style.visibility = "visible" ; +} +} +} \ No newline at end of file diff --git a/tools/dev/testgui.pl b/tools/dev/testgui.pl new file mode 100755 index 0000000..ce4f674 --- /dev/null +++ b/tools/dev/testgui.pl @@ -0,0 +1,533 @@ +#!/usr/bin/perl -w +#print "Content-type: text/html\n\n"; + + +my $me = "testgui.pl"; + +use strict; +use warnings; +use XML::LibXML; +use POSIX; +use CGI ':standard'; +use CGI::Carp qw(fatalsToBrowser); +use HTML::Entities; +require Common; +require xmlOperations; + + +##### preliminary hardcoded stuff: + +our $setupDir = '../setup'; +our $confDir = '../config'; +our $specDir = '../specs'; + +my $setupFileName = "testsetup.xml"; +my $setupFile = $setupDir."/".$setupFileName; + +# the file that tells me what fields should be printed in the quick edit area +# for each sensor +my $quickEditMaskFileName = "quickEditMask.xml"; +my $quickEditMaskFile = $confDir."/".$quickEditMaskFileName; + + +#### globals: + +my $quickEditMaskTree; +my $setupTree; +my $sensorAreaId; +my $quickEditAreaId; + +my %previewAreaIdHash; + + +####################### + +my $q = CGI->new; + + + +unless($q->param()) { + #if called without arguments, + init_html(); +} else { +##################################### +######## process CGI request ######## +##################################### + print header; + #process the arguments + + if ($q->param('action') eq "print_quickEditArea") { + my $configFileName = $q->param('configFile'); + my $destId = $q->param('destId'); + $quickEditAreaId = $destId; + print_quickEditArea($configFileName); + } elsif ($q->param('action') eq "showPlot") { + + my $sensorId = $q->param('sensorId'); + my $imgSrc = './preview/image_recalibrated_'.$sensorId.'.png'; + if (-e $imgSrc) { + print img{src=>$imgSrc."?".rand(),title=>$sensorId}; + } else { + print img{src=>"./preview/error.jpg",title=>$sensorId}; + } + } else { + + print start_html( + -title=>'testgui_debug', + -style=>{'src'=>'../layout/styles.css'} + ); + report_param(); + + } + +} + + + + + + + + + +################################## +#### Subs +################################## + +sub parse_setupFile { + my $parser = XML::LibXML->new(); + unless( -e $setupFile) { + die "setup file $setupFile does not exist!\n"; + } + $setupTree = $parser->parse_file($setupFile); +} + + +sub parse_quickEditMaskFile { + my $parser = XML::LibXML->new(); + unless( -e $quickEditMaskFile) { + die "quickEditMaskFile $quickEditMaskFile does not exist!\n"; + } + $quickEditMaskTree = $parser->parse_file($quickEditMaskFile); +} + + + +sub init_html{ + +print header; +print start_html( +-title=>'testgui', +-style=>[{'src'=>'../layout/styles.css'}, +{'src'=>'../layout/testgui.css'} +], +-script=>[ +{ -type => 'text/javascript', -src => './testgui.js'}, +{ -type => 'text/javascript', -src => './getdata.js'}, +{ -type => 'text/javascript', -src => './xmlOperations.js'} +] +); + +# print h2("testgui"); + + +# print "
"; +# +# print ""; +# print ""; +# print ""; +# print "
IVDREF1AIVDREF1B
"; +# +# +# print "
"; + + + + +# print "
"; +# print_quickEditArea("0.xml"); +# print "
"; +print_setupStructure(); +print q%%; + + + + +# pass a list of sensor Ids to the javascript side +# more precisely: a hash consisting of $sensorId=>$previewAreaId +# so the javascript knows which placeholders to fill with actual plots +print ""; +# end of that story + +print ""; +print "
[the \"console\"]
"; + +print end_html; + + + +} + + + + +sub print_setupStructure { + + unless(defined($setupTree)) { + parse_setupFile(); + } + my $setup = $setupTree->findnodes("/DetectorSetup")->shift(); + unless(defined($setup)) { die "did not find DetectorSetup node in setup file!\n";} + my $setupDesc = $setup->findvalue("./description"); + my $setupName = $setup->findvalue("./\@name"); + print h2("Setup: $setupName"); + print "

description: $setupDesc

"; + + my @controllers = $setup->findnodes("./controller"); + unless(scalar(@controllers) > 0) { die "no controllers in setup file!\n";} + for my $controller (@controllers) { + my $controllerName = $controller->findvalue("./\@name"); + my $controllerAddress = $controller->findvalue("./\@address"); + my $controllerId = $controller->findvalue("./\@id"); + print h3("Controller name:$controllerName id:$controllerId address:$controllerAddress"); + + my @chains = $controller->findnodes("./chain"); + unless(scalar(@chains)>0) {die "no chains attached to controller $controllerName\n";} + + for my $chain (@chains) { + my $chainName = $chain->findvalue("./\@name"); + my $chainId = $chain->findvalue("./\@id"); + print h4("Chain name:$chainName id:$chainId"); + + my @sensors = $chain->findnodes("./sensor"); + unless(scalar(@sensors)>0) { die "no sensors attached to chain $chainName\n";} + for my $sensor (@sensors) { + + my $sensorId = $sensor->findvalue("./\@id"); + my $sensorName = $sensor->findvalue("./\@name"); + my $sensorConfig = $sensor->findvalue("./\@config"); + my $sensorEnabled = $sensor->findvalue("./\@enabled"); + my $sensorSerial = $sensor->findvalue("./\@serial"); + my $sensorPosition = $sensor->findnodes("./position")->shift(); + my $sensorDescription = $sensor->findvalue("./description"); + +# print h5("Sensor name:$sensorName id:$sensorId"); +# print "

description: $sensorDescription

"; + print_sensorArea($sensor); + } + + } + + } + +} + + +sub report_param { + print br,br; + print "action ".$q->param('action')." executed with following parameters:",br; + my @params = $q->param(); + print ""; + for (@params) { + print ""; + + } + print "
"; + print escapeHTML($_); + print "="; + print escapeHTML($q->param($_)); + print "
"; + +} + + +#### html output subs ########### + +sub print_sensorArea { + + my $sensor = $_[0]; + # this is an xml object that contains the sensor node + # from the setup file + my $sensorId = $sensor->findvalue("./\@id"); + my $sensorName = $sensor->findvalue("./\@name"); + my $sensorConfig = $sensor->findvalue("./\@config"); + my $sensorEnabled = $sensor->findvalue("./\@enabled"); + my $sensorSerial = $sensor->findvalue("./\@serial"); + my $sensorPosition = $sensor->findnodes("./position")->shift(); + my $sensorDescription = $sensor->findvalue("./description"); + + + $sensorAreaId = $sensorId; + print "
"; + print ""; + print ""; + print ""; + print ""; + print ""; + my $previewAreaId = "preview_".$sensorId; + print ""; + $quickEditAreaId = "quickEdit_".$sensorId; + print ""; + print ""; +# print ""; +# print ""; +# print ""; + print "
"; + print ""; + print "
$sensorName (id=$sensorId)
description: $sensorDescription
"; + print "
[not run yet!] "; + print_quickEditArea($sensorConfig); + print "
"; +# my $command = "./prevImg.pl"; +# print q%%; +# print "
"; + print "
"; + + $previewAreaIdHash{$sensorId}=$previewAreaId; +} +# description the block that is printed for each sensor, +# containing the preview plot and the quick edit area + + +sub print_quickEditArea { + + my $argumentConfigFile = $_[0]; + + unless(defined($quickEditMaskTree)) { + parse_quickEditMaskFile(); + } + +# print ""; +# my @fields = $quickEditMaskTree->findnodes("/MAPS/register/field"); +# for my $field (@fields) { +# print ""; +# +# +# } +# print "
"; +# print $field->findvalue("./\@name"); +# print "
"; +# print "print_registers();",br; + parseConfigAndSpec($argumentConfigFile); + integrateAncestry(); + print "
".getConfigFileName()."
"; + print_registers(getConfigFile()); + + +} + + + + +sub print_registers { + + my $configFile = getConfigFile(); + my $specFile = getSpecFile(); + my $configFileName = getConfigFileName(); + my $specFileName = getSpecFileName(); + my $configTree = getConfigTree(); + my $specTree = getSpecTree(); + + my $xmlfile = $_[0]; + my $xmltree; +# if ( $xmlfile eq $configFile ) { +# $xmltree = $configTree; +# } +# elsif ( $xmlfile eq $specFile ) { +# $xmltree = $specTree; +# } +# else { +# die "xmlfile given to sub print_registers is unknown"; +# } + my @registers = sort by_name $quickEditMaskTree->findnodes("/MAPS/register"); + print ""; + for my $register (@registers) { + + my $registerName = $register->findvalue("./\@name"); + +# # if register not in the mask file, don't print! +# unless( $quickEditMaskTree->findnodes("/MAPS/register[\@name='". +# $registerName."']")) { +# next; +# } + + my $registerId = $register->findvalue("./\@id"); + my $registerSize = $register->findvalue("./\@size"); + my $registerDescr = prepare_text( + $specTree->findvalue( + "/MAPS/register[\@name='" . $registerName . "']/description" + ) + || "n/a" + ); + + my $flistid = $configFile . "//" . $registerName; + + print ""; + + print < +  +EOF + print ""; + + #print ""; + +# if ( $xmlfile eq $configFile ) { # we are printing the Specifications Tree +# print < X  +# EOF +# } + + + print ""; + + #print ""; + + print ''; + print ''; + print '"; + } + print "
$registerName$registerId
'; + print_fields( $configFile, $register ); + print ""; + print "
"; +} + +sub print_fields { + + my $configFile = getConfigFile(); + my $specFile = getSpecFile(); + my $configFileName = getConfigFileName(); + my $specFileName = getSpecFileName(); + my $configTree = getConfigTree(); + my $specTree = getSpecTree(); + + my $register = $_[1]; + my $xmlfile = $_[0]; + my $registerName = $register->findvalue("./\@name"); + my @maskFields = sort by_name $register->findnodes("./field"); + print ""; + for my $maskField (@maskFields) { + + my $fieldName = $maskField->findvalue("./\@name"); + + my $field = $configTree->findnodes("/MAPS/register[\@name='". + $registerName."']/field[\@name='".$fieldName."']")->shift(); + + + unless(defined($field)){ + + my $specField = $specTree->findnodes("/MAPS/register[\@name='". + $registerName."']/field[\@name='".$fieldName."']")->shift(); + $field=$register->addNewChild("","field"); + $field->setAttribute("name",$fieldName); + $field->setAttribute("value",$specField->findvalue("./\@defaultValue")); + $field->setAttribute( "isHeritageFrom", $specFileName ); + } + + + + +# # if field not in the mask file, don't print! +# unless( $quickEditMaskTree->findnodes("/MAPS/register[\@name='". +# $registerName."']/field[\@name='".$fieldName."']")) { +# next; +# } + + my $isHeritageFrom = $field->findvalue("./\@isHeritageFrom") || ""; +# my $isHeritageFrom = ""; + my $readOnlyFlag = 0; + my $fieldValue = $field->findvalue("./\@value"); + my $fieldSize = + $specTree->findvalue( "/MAPS/register[\@name='" + . $registerName + . "']/field[\@name='" + . $fieldName + . "']/\@size" ) + || "n/a"; + my $fieldDescr = prepare_text( + $specTree->findvalue( + "/MAPS/register[\@name='" + . $registerName + . "']/field[\@name='" + . $fieldName + . "']/description" + ) + || "n/a" + ); + + my $maxFieldVal = 2**$fieldSize; + my $sizeInfo = + sprintf( + "Field contains %d bits, possible values: 0-%d (0x0-0x%x)\n\n", + $fieldSize, $maxFieldVal, $maxFieldVal ); + + $fieldDescr = $sizeInfo . $fieldDescr; + + unless ( $isHeritageFrom eq "" ) { + $fieldDescr = + "Field was inherited from $isHeritageFrom\n\n" . $fieldDescr; + } + + my $fieldId = $xmlfile . "//" . $registerName . "/" . $fieldName; + if ( $fieldValue eq "" ) { + $fieldValue = $field->findvalue("./\@defaultValue"); + $readOnlyFlag = 1; + } + + print ""; + print ""; + print ""; + if ($readOnlyFlag) { + print <$fieldValue +EOF + } + else { + print < + + +EOF + + } + + print ''; +# if ( $xmlfile eq $specFile ) { # we are printing the Specifications tree +# print < →  +# EOF +# } + if ( $xmlfile eq $configFile ) { # we are printing the Settings Tree + + if ( $isHeritageFrom eq "" ) + { # these are actual settings, not inherited! + print < X  +EOF + } + else { + print ""; + } + } + print ""; + if ( ( any2dec($fieldValue) < 0 ) + or ( any2dec($fieldValue) > $maxFieldVal ) ) + { + print +"" + ; # just debug + } + } + print "
$fieldName  =  X 
!!!Above value not in allowed range!!!
"; + +} -- 2.43.0