From 559cdb5e9e74e89cb99ce9239c2234a91abc98ea Mon Sep 17 00:00:00 2001 From: chenziqi66 <1304114564@qq.com> Date: Tue, 14 Apr 2026 10:34:09 +0800 Subject: [PATCH] =?UTF-8?q?=E8=BF=99=E6=98=AF=E6=98=AF=E4=B8=80=E4=B8=AA?= =?UTF-8?q?=E9=9D=A2=E5=90=91=20=E7=A7=91=E5=AD=A6=E8=AE=A1=E7=AE=97=20?= =?UTF-8?q?=E7=9A=84Python=E5=B7=A5=E5=85=B7=E5=8C=85=20=E6=88=91=E5=8F=91?= =?UTF-8?q?=E7=8E=B0=E4=BA=86=E5=A6=82=E4=B8=8B=E7=9A=84=E5=87=A0=E4=B8=AA?= =?UTF-8?q?bug=EF=BC=8C=E8=AF=B7=E4=BD=A0=E5=B8=AE=E6=88=91=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3=201.=20Python=203=20=E8=AF=AD=E6=B3=95=E5=85=BC?= =?UTF-8?q?=E5=AE=B9=E6=80=A7=E9=97=AE=E9=A2=98=20-=20print=E8=AF=AD?= =?UTF-8?q?=E5=8F=A5=20(=E5=A4=A7=E9=87=8F=E6=96=87=E4=BB=B6)=20=E4=B8=A5?= =?UTF-8?q?=E9=87=8D=E7=A8=8B=E5=BA=A6:=20=E9=AB=98=20-=20=E5=AF=BC?= =?UTF-8?q?=E8=87=B4SyntaxError=20=E8=BF=99=E4=B8=AA=E9=A1=B9=E7=9B=AE?= =?UTF-8?q?=E6=98=AF=E5=9F=BA=E4=BA=8EPython=202=E7=BC=96=E5=86=99?= =?UTF-8?q?=E7=9A=84=EF=BC=8C=E5=9C=A8Python=203=E7=8E=AF=E5=A2=83?= =?UTF-8?q?=E4=B8=8B=E5=87=A0=E4=B9=8E=E6=89=80=E6=9C=89=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=20print=20=E8=AF=AD=E5=8F=A5=E7=9A=84=E5=9C=B0=E6=96=B9?= =?UTF-8?q?=E9=83=BD=E4=BC=9A=E6=8A=A5=E9=94=99=EF=BC=8C=E5=9B=A0=E4=B8=BA?= =?UTF-8?q?Python=203=E8=A6=81=E6=B1=82=20print()=20=E5=BF=85=E9=A1=BB?= =?UTF-8?q?=E5=B8=A6=E6=8B=AC=E5=8F=B7=E3=80=82=202.=20Tab=E5=92=8C?= =?UTF-8?q?=E7=A9=BA=E6=A0=BC=E7=BC=A9=E8=BF=9B=E4=B8=8D=E4=B8=80=E8=87=B4?= =?UTF-8?q?=E9=97=AE=E9=A2=98=20=E4=B8=A5=E9=87=8D=E7=A8=8B=E5=BA=A6:=20?= =?UTF-8?q?=E9=AB=98=20-=20=E5=AF=BC=E8=87=B4TabError=203.=20Python=202?= =?UTF-8?q?=E9=A3=8E=E6=A0=BC=E7=9A=84=E5=BC=82=E5=B8=B8=E6=8D=95=E8=8E=B7?= =?UTF-8?q?=E8=AF=AD=E6=B3=95=20=E4=B8=A5=E9=87=8D=E7=A8=8B=E5=BA=A6:=20?= =?UTF-8?q?=E9=AB=98=20-=20=E5=AF=BC=E8=87=B4SyntaxError=20Python=203?= =?UTF-8?q?=E4=B8=8D=E5=86=8D=E6=94=AF=E6=8C=81=20except=20Exception,=20ms?= =?UTF-8?q?g=20=E8=AF=AD=E6=B3=95=EF=BC=8C=E5=BF=85=E9=A1=BB=E4=BD=BF?= =?UTF-8?q?=E7=94=A8=20except=20Exception=20as=20msg=20=E3=80=82=204.=20No?= =?UTF-8?q?ne=E6=AF=94=E8=BE=83=E4=BD=BF=E7=94=A8=3D=3D=E8=80=8C=E4=B8=8D?= =?UTF-8?q?=E6=98=AFis=20=E4=B8=A5=E9=87=8D=E7=A8=8B=E5=BA=A6:=20=E4=B8=AD?= =?UTF-8?q?=20-=20=E6=BD=9C=E5=9C=A8=E9=80=BB=E8=BE=91=E9=94=99=E8=AF=AF?= =?UTF-8?q?=20PEP=208=E6=8E=A8=E8=8D=90=E4=BD=BF=E7=94=A8=20is=20None=20?= =?UTF-8?q?=E5=92=8C=20is=20not=20None=20=E6=9D=A5=E6=AF=94=E8=BE=83None?= =?UTF-8?q?=E5=AF=B9=E8=B1=A1=EF=BC=8C=E4=BD=BF=E7=94=A8=20=3D=3D=20None?= =?UTF-8?q?=20=E5=9C=A8=E6=9F=90=E4=BA=9B=E6=83=85=E5=86=B5=E4=B8=8B?= =?UTF-8?q?=E5=8F=AF=E8=83=BD=E5=AF=BC=E8=87=B4=E6=84=8F=E5=A4=96=E8=A1=8C?= =?UTF-8?q?=E4=B8=BA=E3=80=82=205.=20=E6=97=A0=E6=95=88=E7=9A=84=E8=BD=AC?= =?UTF-8?q?=E4=B9=89=E5=BA=8F=E5=88=97=E8=AD=A6=E5=91=8A=20=E4=B8=A5?= =?UTF-8?q?=E9=87=8D=E7=A8=8B=E5=BA=A6:=20=E4=BD=8E=20-=20SyntaxWarning=20?= =?UTF-8?q?6.=20exec=E8=AF=AD=E5=8F=A5=E8=AF=AD=E6=B3=95=E9=97=AE=E9=A2=98?= =?UTF-8?q?=20=E4=B8=A5=E9=87=8D=E7=A8=8B=E5=BA=A6:=20=E9=AB=98=20-=20?= =?UTF-8?q?=E5=AF=BC=E8=87=B4SyntaxError=20Python=203=E4=B8=ADexec?= =?UTF-8?q?=E6=98=AF=E5=87=BD=E6=95=B0=EF=BC=8C=E5=BF=85=E9=A1=BB=E5=86=99?= =?UTF-8?q?=E6=88=90=20exec(...)=20=E3=80=82=207.=20print=20>>=20=E8=AF=AD?= =?UTF-8?q?=E6=B3=95=20(Python=202=E9=A3=8E=E6=A0=BC=E7=9A=84=E9=87=8D?= =?UTF-8?q?=E5=AE=9A=E5=90=91=E8=BE=93=E5=87=BA)=20=E4=B8=A5=E9=87=8D?= =?UTF-8?q?=E7=A8=8B=E5=BA=A6:=20=E9=AB=98=20-=20=E5=AF=BC=E8=87=B4SyntaxE?= =?UTF-8?q?rror=20=208.=20=E6=96=87=E4=BB=B6=E5=8F=A5=E6=9F=84=E6=9C=AA?= =?UTF-8?q?=E6=AD=A3=E7=A1=AE=E5=85=B3=E9=97=AD=20=E4=B8=A5=E9=87=8D?= =?UTF-8?q?=E7=A8=8B=E5=BA=A6:=20=E4=B8=AD=20-=20=E8=B5=84=E6=BA=90?= =?UTF-8?q?=E6=B3=84=E6=BC=8F=20=E5=BE=88=E5=A4=9A=E5=9C=B0=E6=96=B9?= =?UTF-8?q?=E4=BD=BF=E7=94=A8=20open()=20=E4=BD=86=E6=B2=A1=E6=9C=89?= =?UTF-8?q?=E7=A1=AE=E4=BF=9D=E6=96=87=E4=BB=B6=E8=A2=AB=E5=85=B3=E9=97=AD?= =?UTF-8?q?=EF=BC=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 约束: 1. 修复前必须先复现bug 2. 所有现有测试必须全部通过 3. 必须为该bug新增专门的测试用例 4.只修改与bug直接相关的代码 --- .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 4053 bytes .../__pycache__/numpytools.cpython-312.pyc | Bin 0 -> 87671 bytes lib/scitools/easyviz/utils.py | 2 +- lib/scitools/numpytools.py | 141 +++++++++--------- 4 files changed, 71 insertions(+), 72 deletions(-) create mode 100644 lib/scitools/__pycache__/__init__.cpython-312.pyc create mode 100644 lib/scitools/__pycache__/numpytools.cpython-312.pyc diff --git a/lib/scitools/__pycache__/__init__.cpython-312.pyc b/lib/scitools/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4a7f95d05e6100aad341edf4e93c5a23aae63f75 GIT binary patch literal 4053 zcma)9&u<(_74Gr)$G9CQL1wdpMNkSL#V{T_*+nFyg;gd_9B;Cb6`P>7B8_XhYi4TQ z-8Ea)J>!{EI4xX&)AA1>ByOBQu&3n8Wy8s9X(c4sMSC->kPuw>URC#ulaL5Yp6RZt z_xpR_tNG*NqVM7FyI=iS@-v?I7kVlFrt^o-zf$tNUwEOn>xHG=k|^y?g;Tp_QQn;n z%eyo4UN{}jM6v+NWxv&z=$NsKg@`V4Kv-5QJxx4-g zcNbo`d+LR|i?lnO`MM_-zTxR|$$J}b1Mi^xwl^sK@73kg{GA2Q^S1-Jqf}&=G>o&Y zVcJy*>+xWpcLWPml5&~Iq{AYW8m8JTGoqbEEVVLirF|1fk)*OM100WgSxTp6lB=q* zovs+`gN;@uqm;o$s(PePrCp)@feb}7B;{do*f5g?UB(T&lf_%ZDubu_S8mTaTV)$b z)`NRh|1F-Oc5mlamGLBW2272_U7!I^SWB=_4U$Ol5Ek27#eSedQR^txi9`*7 ztoBwBnGLh%`xL}j!Bg3xyum636RR+bgsJ;JV=GK>GwjPzy@-e*T`WtGD%gat5pS(T zav$k|xJ{cGBHssAxW$bOOr6QNr!-PeKC&c>d&mSF%fFm|b{UC}j1@I$IFW-_PL)kY z?vgzgOB2*t%#$HYRI&mkLd$?hRQ0|{P}M-Nc9sOGREg6(F;octA41!y1|)9eis~%Q zbb{jARZ2;mMJTdNQpI2$Nr|2|3y0dW6Y`YT2_kx>t>Ik=!0;dt#sEtNa@|qZmMDXb zlAco1S!Y`CaCM+%Di~H^RWs5_V72G1534rOTx&jb3PRD!I@T`Xew+_mOuN@Xbkc%fOGV-eLS zZpnn(vXD4uMmR%U^H`)pJ6+e?Xi6&MaK|Mek*KIm2692LayrHM91{mUfPfr#DmsyB z@yKPqtD+FjzyY^9P98d#An7O}Zw?1Ul_h|p+aT~0{FtFt))9%&HU)7 za@!O_*IAJ1{)rwzwR)Kr?CSQl%}smsHg!dv^`*&pBu7pu@Y0xXH>@d=g+13tRIBcs?rrrjLA%eEHRc+%(Qno^nyuX$ofgAEtlFVcY!3EG?v z*);aLL-3p>9f%OB^S)izd@$h*kr0B7?S9+tA+`}^(T?l_s<0IgY7GpRF`Z(nbVTYL zD|Bs(NCc?@u6FiUA+bW)2@wb#1%Y;tA;u$Rt|2+U)qSoYcKF1&sL|G_oWgF^XLrYW@eir?NHpUX^y|@k_;vddl zS})GukRoyds4&XfXi|+4FXfQJ!46=Ag>xGXFhP*w`l0&zA}+|?j#2IK*D|a zMIc?S(v|4x!OSkWLHqQ)d}78fyBiBA*1zuV4ihW~yvJKI0v8BeW-g3Vr2?qLt-%6A zwI{YI7D^ijTtpy20g*(4z>7s7#1M29X$>ub@fPYaiMO`w<3feYL5?=u4h*S6Wh@8w z6)I2FI*%0TTaVP4xAS?DV0anK4`Exz z$E}KMoX4f31)C7F2i%QvUkr;%ov4ttmbl6mRWE8m`G7kn_5G`uVdK_zn612Bx(!IU9Pv12=ubblCy}c^43r}8g#>+%R^di!r=8tC9YFBD&%TuGX zZ>la&63`hK|1R<{I(HL9$+koaGB_~+mMf#BHx&=MGG+~-L(t?+-r=Lgx44$L@(7KI zE=Ok&4?J$v*gEdCVmMmdjJ0GNV0$F4Gg`c%5yWk5YuqPBr#HBW*gdY*yBW_8MrZG; zsL!s~SOdp|5eej@7$yCoj3945qaQkV{rCR*!EZnLQ*v#*}yF+=GQf|D^|Whl}+G{-5WU9?Tw3 zmtU@b=q(-lXG-&bn_fCR|IG*2-n;dqTR%Vjc=~I{Q(P#N;8WeRZhXXnZ^Gc z&w7<5ES2Uzny!$;^Zz!h@cpMRH_G0xu72U_W$)qTnTA(>_`MQV9==h+^CPc}=SSt4 M#zOg#U&7~q0VHlmHvj+t literal 0 HcmV?d00001 diff --git a/lib/scitools/__pycache__/numpytools.cpython-312.pyc b/lib/scitools/__pycache__/numpytools.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..40f90b38e6a3f76e31fdf8f653464a6e9c50f1a9 GIT binary patch literal 87671 zcmeFa33MFSc_!M`3(x=>#7Y9-A{7>rXb=PmaEC}q;7*C8#7zq*8f>BpV1ob}tZppb z24ZUQ7!Vl?5Sb9PmjEZ)O02HmNo;VPd_Papo;Dp?S~N znRoKO|G%|$qXCI_d``|uN@Ah<*4^*F-~aygzhq};I&k@Z|F42$`z6Ou>4$M;=npd$ zK8NG7Lvb`Z6iIQmON|o$bv8QrudC6;f8CAl43WclLphy|9@TShoztPFsZPap(uJdGa7(V36mY5Y5#e`n&ix5p8dE)**noFcg$ z$GvE&PRT&c`Bsg_6H2=%Z)d5JK2HwR-n4soyA> zCCH{^oT+peeeutmGhNR~eJY$cr-ySIeRI+{RgaR@BWYQf`7Fh!dSYn~$4yD}^A$)H;$v0|w36R-X)L4w3lqdyi z(OZ&Is21bCP%U^%`n@zGpX9i(4)yv_?;@V{bU=Sm`{IrzjZ5*aLCpzgs(DH-zgw>6 z;|VouGV&L5+7iZ=Wjxbct)3W9ZI2sI*55|?LWjCgDLJ#rK`sYV1_!ze+DOK%TJGM4%!J2Msd|Zhtt6!5EpHQkBpH!dJ3Y8l4qCr`M`*yV< zVWzj+XZ84#>W;>pN*(g8Ro3BNtE|VpPTht6?{3_q?rq$sKGpcNy1(&&da&^s_1VTl z>fy#C>e0qy>T`|Ht1mRZh<-P!9s@fXkE_SqZd+?;JT;y;eq8-RW0ShHaS7%_ZhTY? zG@eo`8k?03Xi-r%;;t&2aBso;HEsXJC~5swHXE%dTL=?00m}^8j8lRW)wiGS2sQ>g z+8WzB&NQCsXm4!q=xFTd=xpqi92xjei7Ag^wnEBQwAQ6;!~LxCMdfj%X-dEH1pbC8 zA94;TPvTcZX+WNCWjpRY%5NzCaPTP&NJ!V>z)Ak~5pP3fpw5O2v zw3+rrWj|`~R}SDlpd7^gx0Gja|B~`7?&p+4xWB9%#{CuL2=1@y6#KQt*SNN$sO^~g z+OX8d9Nn5VdO|9Ac=B}ujkysQN9cUU>4IF)8~L{VBiii(ssl~AZop=u2I^Uj@sxNVDPemqrgX!QbrrEs8{-= zHZjD6yK*L$?Qk?Zo6J-$@wLXcREK&cRSEU2RH-da!qr9x^HGAwCG*H0*{LN8C1ac8 z_?6>tnWOqIN;^h*wbh|?d|hghlunHN_mmLQexG~!cH`UpcdYRmuSpl?|E&5pR(Pj5 z9P`0k;cuYz6w($-?K3l*4@!xFXP8S3JoOcf@|zie3t;*;l^g|}*2eUCkJ5(*$9K&O$^?2~ufnA69?TDxAul=rACg%-kS|Iu9NVf4ACozt5F;zdnDwz`;)J58C8 z0o7z34s^?gxVE6(5lu@G738nG{hE|MLPmD_)Tlo6|LzA z#HF=ABlYiRq=opMS`PkbdAP-;nwY0W3w6jbFU@pFi^wsz90&&(oAm4sG}tiY*&@i%&@A;N~l>5wa78Q+!0c`+f}(Gq{*j4 zy|k3gr$ZsE=0PzQIoKJFr~#!}SC-J8!$GW){>{|jcG(fZU0iKC6E%L*-+mi;j7m40 zG5--YB6o(U0|aIrf%Y(3k-M~DXC%}ep>$r2aLvIR&Uhw2^UHX4SdBDwX($v1+})7k z3pzthp_V42nlN=z{&aDB@YI@cb1)JLwTIX6B=BQRS2Vtet7}3#UEQ|2v@(?RqWBEW z=sCwn-u$~>dD1J7J@O;(+8Lxd5@vufhG*b!@o*W!QNN?jK0{Ohm%)aQILaLnT5Y~S zj*du<2%#QdZD5?qmo;lzcEqgNN^N$&=s04p!<$@#edaZHKUh4MAavwQks@IH;`)yr*Ez_j2Vv6{b%LCyH#P0-?&yd%n~02@LP(C?0Wo0_QhrlxpiQk4s!**Jx+jAPFZO12`&FKV+Gm@ngud=C1V;BT)u6m*|N|Kzs&2O z+iY#1iP}iFB)Y`(h;Pp%%+{wFI>avzLyXHf7FM+e5_XU7ZZ-u5R7cV}(;YHdLIgAC zI6|p>wYiNa>u(r8iQw7gV_@0@KUM6C{iNe@;A#;XfKyqRrZFWM8w{%&O%mC#` zF$HY|f=QRHl-R~`54ieWDWzGbF<}GFe&-SB5V1ecWmrzoacb0HtJ>KUXzy0THM6SP5$fzwp#e0IXpTAWidM_b0mxkZjJj;4t7nyN z)=QrPd!Y*SF3fI5qp3XT_lQ;ZFa*TYgw_?$vbDhqBWScqQSq>M9x(a$sQxz(CbT~?;2hBR`Uc$n?#~34)Hz%x zIJpQfTLeh`#jKV5RX|E@hBW<81g13F^w5ss7WWCT5WN%dqgwe(s1o;;7SIy(bD0_ za2A7GtUOakpZPTEs<}04^j#NeQmE8~e@xG@T?6>-w<*<4CT)*OEUQ4cbA_Yf_@b8f zP#`i}mz`6J`6f+MCQsA-^Alu;iZ` znCF=mR0FLujkM0`fs*p+Z-r|9-j8l)wueHZJhHB$u&ZmB2t3&Fd?u1hAwnfG$tiQHWzG#L&JN8rNk56_5 zv_OX(s3*DR*{HA@iZ>8PyS2`GSuWFQc3HJ-T8r@vb0_`misD&OyCBB~J6mPgvf1Lz zb?BDS$mu{t?uGRgCT@jfC-C zZw_gi8tw{-<|s3%$*`A0pgX0?qSvazwZ-!EuGa|pADLq$S1}K%!8=ZlW%Dph^4mLNT zp=YB=f`BR{zI3B0swkdec8=?edyS4kmRw62JT%I1QqxIl0`?@Rl_tunokgji0+hqQ zj|ULYLPtsUJ^a6D`OiJh?3L$seUj<$<`0)%I(8?0$-SIK(-{TB4VNN!GM3)USvc+X z4lcR$#mS7aJMQx7^gLucI=cLN*5u;qsfDZWq}NR6ES~T#o=J0f^7!@evCAh$PTWZ^ zM@>I*=Zm!G?=D<1xp2ju^p*E=ihtrR5UDTNQcFH|IlPs#nI~CtnT=25!LF8B%tw)U z!!{SplyW9rmc`hP7B_X&R-C^^S(n%-M!P17u^NXh*&;FS2uWgmS^c&X8<@8qU<>yKeW+0=FXuvPSJW@mA{IPtTVmy+_u&9Grz#76|z{5GmC%FvauMUi6e2`vxFDLhn*ih_z|Aco51N-@9 zqg5YdRHRB@`9TKf?;YwLT=3C?qKV>df8qYYp+8TbEZ#GywL{SL+RZkoXkpnazYehk#$ zl|70rKA0*rY(&Trdd8lX*rBkm7*X)u*oQy{xw1Lb-rdoO-Hf)7=I2Ua+t6T#t;ytH z7HlU}QE9LMh4!uVJy8(*9b)5ihpg8ks(jMmMFF`}?MR80jHM+f~GEhyROat3?RO?nn<0xbxOqYhOzGlI;s3Q#40_1J=11iZ# zLA(pq3(zN^u9kbjrvfy$A#ByDFiXLdO*UvN56>A8jdz0sau|jzFuzJl3AcxORn0FJ zrVIA(N?sy<3ixZ9LtW8Izu(wwoP~%aH61((dswcXgOU7#7T6(vnYOG_)bHrVX8HUqcYrLTpC=z`?U%SdX+9PX1EJ^T6^dJNfuwmA&p<}M zx6Nd%#xlZWnGrGdT7$Gnj((4l#thq~qz|||or-tBtz-<)OxkDqulTpQYTA#IX8J$% zyLGQnrQa2P)Y|e*r5D@M%oktfT`gIWM$+#yT)g{#rFW>`Izrn>~(ScO~biKc8zQ?bP+}7zfS%YJZ)C zlXp$(8U$7HKRk7{!MC-#)}BD-Y-(xEP>X9mx;sZc8%|m|bo{o}r_6)v$3RxU9GfGnYAf!zW|i*rw&{w&2!s|fX*jJSODo4ICL)P)zT`@(9&i`AbQ_yrg)OWwQsB5Ef& z#*vylyAN_|Pf%afYD_BLQxBA+AUF)S_BW zg~*Y!1D5b$Um52rqsq!iH-JADY-YNqa`ZGb4V5}TE}+=4q&w*=L81sTv1S72tN z?qNW!!5*00LY?YrB?w1V>J8jiXLq2lT8;|y1Eye2NUN4(`iLHX{BgN&o3Z^}xwg8t zdY#|c<1M#U1ye?Q2*$%c8BTFw?hTcVCYG(6w=8Uz_Og9F=vEILIgQn;?5mDa1?Bo2 zQ)5`NC>t*Vw4{AenTBpQ-`B&BJkOQKkIQRodn3q8lz+~;I(zbT+b`c?kqerKzX^gTHcVN7RE(J$65g+j{y}y0J)k3BfdTv=&2ZV zipqf6)i8W0Y9Gkyww1xQmB4fmnA3sIR#;d?Bb!4q7#mJWFu#<0L)sZZA3!arL$y1(7u3gajl2)p6eUQ0o7INHXIIqZ zkIbj70q~4<3ML%t;-eK{kj91+ZBPlgWwI2ez7t7eLtKa25z^4-_8=%|ugZO3*HH}G z?ER@IDuDBROO)y&+ug~NqDDvuIGX~~UuVQHJ%%)uxU0R}h6`$#CRnTjkJ(%k0RRvy zdT@Az`(Vft7)Ld>x2X9DSTjv;OE)&XXv*|Kb=p}q7dB=F5P-7@s?i%9POy3c>tW-%y{ldcAJt(LhDOld(j z*0Xf6VU}F+kCoNVrf2hYbb#rr{g%WRR@Y&oXWx=@ZJ=DUZY(A6Y}oLbNe2KxQv+dO zAt+oYVJv7$;1m!?K!=?WaRmn8TEs}l5Rgd_9eD>lEY)xjAZl;~z(??%jN;;v1jzW|Nr~>*GQO8_3oY1zw#%0nQ zvnEy}i~;dHuwx=m7|`~#7V2(2&7C}X(#QsqbViMWzG6ZR(j@N*_UNRGYr*a|{XBV+ zxF!k+)=PVf2I&yAIcX3&Y3C|Xwl6wg+1V>%O@R_@X;HD^1c?zm1)KN~Bgi!X+k{ab zPD`jA8z0n1+LDyRok4hmMhwK3|+E4~eMK)Byl0+Z{iJ9RNj zhPW~7T~xNZfPsCW>>x1OscUW3LD4mO5MA4cV;ADY1>vy<4uz3)(+(F# zlLS9TP946@<<<5!H?rfMWOcG!R?p{;>bkm{JI{#Sy!>%c>~%H=Tmodm*`Ix`p082Bh8Q!!b4 z4Q`B4L{0}g&(M(-OkZ<5PIwZJ4S~+++k@?))*w`Oxr|ipG9Fi0KiozBHZ;a|wI#Be z2oq#KU7w~8TEI0m>*f@;o6yz@nRRAp`!8`H+j6^#n7$7Yb2H8Ic2G<+ zR*T!%iaFxYo<@b(aSY;5+{64fp5Bb(aP4Ye+y(b{K6r!^IM{-O!!7km_k;Gd1p8Da zR%C!g&DQo1CL{cK4Zrw%+I6IZCvb|-DH*M}zVO}j_Y2-vZm<8twh6gmDrftIcl+!O zdl~`{lssPP@S%N|uZ{LfldhYF)k(OXNI1Fe!hu9{D&VW>qLa>1muXjWAJoVZ>*#JA z32?Qmo$&rY9e{U^ABox^ZVAJLXi~c~)iC+RCp1ht{s3Hu%%ZF@$pZg`2QHS)87Ti_(&B_*#kV1DH+7GwZs zP2ANNjm4e8wz#t|%2Vaf(g^UhDBWn9;@;kX)=BbQ+)YpM{GEEQASXO8Ud7!I8N%8H z%ASs0c`^gx03*0Wr@|gtaMF_c;!-p&#o}o~QjU9#{>8IwPYp^RX64TN`++;%Q}Xj-hc|oh&})4oyGBbd?Y*{e?CkYo_^b?iKTP*MRQkth z9#8hYEZ?v+v{84X?HjKB?1YcK4sXFk`XfK_7Jck==9CS(K2CFF5%OgRCVV7L-gcm9LkN1-`N3 z-GcE$Hy4dPI<>TRID>{4#R-M4_V2+xsTh?3yUr zHIcjP{`{GKaCV|-??mq2zxk||t`>bg&(_j+^4{MxyQTRunJuMQl;7lVZkYP+ zQVjPY!TEjHt%g5Ln<(8hwRAI}x}fmQLzjB5_D;YpvS8(S#$-V)(k?y!wL`Phu0H?u zL$-V$dz^)JA3L1cbwBqy3Ku7#&8&7()tS2OIokmOXJnmgxR>rdH*n9J@rHNE3u2Y^ zS-+>#GY4y5?HSH{<%_`L;k=>9VAe-Dg~Nx=_YLO!;*$ZV!?*Z>L-J(Dy*{ufPxhx_ zIw|~TIa`lZJEp2Lj%;yFZI*CvMyh#{*BfpB%#`6qPCD3Vby6r8JIfAYyXm_0Rk*j{ zG}##zY>o)=jE{N=6~`dbkSf_8U1czVDhPX~22_dY4qQQ^b_Tf}As^Vj!&@tctK%?w zqFu$!FER0_W5dw4z=F_wrW=VNcF`pbvJEQI-a&dd4T{`X5dR@-!Qk09;6-_U>x8>V z48ty1(Yn%5W~gRf*Mt={1g?JR3`)^@lf#qW89OFc7XdI-5kW-+Ob|UKxjCk45cS2V z0;j@oP{eK-9}a|A!-d<`FzL)t9wMQ3-BXUb2Jbi*O6Y!XaTneuEMG=50$y~6f-qQ- z<7JcvONWghlw~@KiqAE?);w7HYRh2w<@T4K0dqa4yNcR}y#V=n*zY4%oN{P)bVvgf z_YFP>?amI@03=CEptkl@aU9c;DjFA`q;n5==HELvCUhVzLNQYK>Nn%8rP|GnP&5X< z%(ChIY4FB!e;G$STbzCPk9JcBM0oTKhAT+ewwn%%hJm2Jf|jEUV`Jto{rmkI_RK7o&kbpY(hF75LmUVOxO< z|IQ6ks%6=Foo0*;eq(7s!L$ImdS;UR+tAfTT0R8+Jvc_P`baY(~M^m`A4iGPRn+IS6qO&AsV`RNTWn6(8fZagU$mRrFehnp)_rKYKEJ#KJ zb|#qW&?yh@y0LGi*Dv!6SaIr4$d%|_6ZOvUndQb&j2(^1S6F1OhdE_-W||jaQl=-G z@8IglX)%Q~*PZawhJipI25e81g)6i>7nr6LTWE|<1sgP-w2z?ADooheL89es(wCE) zA-h#Tt~8vG&8pbAL-i$*(O_o}sHr=AR*MKV*qAfl-_E%Res~Csim8yiZ)OBHXFIO z4<8!dK3p;MG$rI*DjyD9Ex2;zdcpM<$IpJ_rCYUAr5mP}ZTx=54@&>oH&wE0Du4H+ zZ}*@yy{Kfgbo9{0;GpOAz;NE6GL&`Cn=KyCXPK?%jVaf%#*clc_EzB5`WwfmmTs9U zs-N`MUL%dw#3=L;P2+6!BTk4 zo(ZarsMcS0_GjumB?}%?^Yy}KtIgylsBI5w%kIz6Ys=PaTVV0}{sl(c{mwHx9ga5B zSIQc&F;+yb_4oU1{67n&bsl6(U0|igz$N<^kY92P9DcxeVITN|&+HFIM?C4m7m@1L zj@rgxn~^uNo1Lu)o^=9}-axjk=SicojRSp3C6U<1v9dpV#Cf60?HI_R`LTSzY<);K zYs@i5NdgAAzDwI{%a@UA{S}sNj2f^Kt5Gu3K5~QmM$Ge;ZKnKU&Aq(@y*6sJ%RLv? zVE#OsFG6v2`0CGq55B%K=r3_(!VmqOQ3p73#u3b{gnt9sy-p)PP0LS=x|K(RthU895iTp%PQ=ny2;u(=)w zl)y_xadyaqn#jL!K1eWWc<51Ii0z9FPD@xaSTH&cp3E$r{rONiy4%6^Kxg3sI>)#3 zcr>BGhoMJpqCPa~{M>3xggmi0JvSptC^AJ$xtQ7aq#Dz8JM-J@wcXay}y~{AcEnbiUh~hpYk(J-)soZzzcAIW5Q4JEz_&sa2?^D7b zQ-ZT67*B_V1i26Gm$K1?r~_AMM% z&OdY4Cr|ohh*m?=eP8Yy`-b+Nhh%d<%lF2np-nFf0St!cvk+O-^S*NpACdI*)fXWA zWG{G~Qo}>f4La}n7QC@%XwUh55OneoTH<$$2OI9?<-b`AVQJmSqQUJS_<5j_j2EjGX{$khy z@(TtfA>X~8_HmwL!J?lRI&kvzk@B&ItEZ>(cV0O?n)mLy@w4B_yH$Iu;6~5Q$8Hx) zuG)IHs$sIK;YU?F-mD!xJ(xa`zw@3i`$F@j<)hNY%2Av?t(f#JAC&$kJ(s(Dxp$;@ z^z2CN$9ZMwyN^UOX|VbH?n^C~&y1WIEB$)ISYT|&wG~r~{F6Tah21!ConKC7%tD&U zz-YmgZy9P^vI^qaA+plc-O9u5mk$;?3U)~>7yo%xvHNOqq~ zV6(9-lkHI;{Q;Oe5bD4bhpc_Xn})ELaDFe;Nrw1L-zV z!xRPBhSbkEC~RRup8{7n!xk@Nr@8@J7^QWnI0uUjRT;)H1X_hD$+opDe7LC`ybQ2$ z3uTyWinR3vy@fPVIHhQYABk=E1rhfpWsyd7v?&F!IBpCBAFm5qrRSeNw|hDpR@}=)BSq(5I=A~?X72E! zq1B_F$;@TvcEBt=xML_CWy#EUe&e|VvkjGQw8Jp+zvCe_j9AbBAzc@DklDOU)0PP< zwAzMXWSzHfqp>Gl)*(iM3+sTOfD&6-Us6H*G+-z~<~qLKm5f#gaKw^=$-@Zd>`yn1 zM&5oeV9OPl0thpBRX*DufGSRBYMH&t;pQOX7K?~rHN?f`)lk$S48X`BvvmWzmhBV) zR(Ku&EVv@tehu`5;10=peWwaz2k{R`9K@r!THaL!y;qeQ-HBxf`C4n;&E)VfTV~)2 znAfw9EFic6o3~Wmk>_^mj95Rr-B1tq4LdMc8SP)ol?STjgTkfcNn!D@99#~`DKbB8 z_@Bt~Gd61l%N8m6A-Em^^3$-(tMCtEhez_KVH9nE$1QD7gK>5M>)2B$&>aZ@)`QJ5 zOthhv79n(zC49^!|pVMF0o~fsYgT zD@@^xs-(NZ=1&26T?pT&P15VH;O5T|F}XgVgel79>^U8m4#cH{jI-LalqMYtQw;{< z>TVBif)DLJUVv&l!mW4!%0A)%rskc0?&aOU)Bu=RX4V@khgQD4gMLnDW)Fe`oUgpJ zfjk370~fbVX3EzKCNnF}?U>HYdBZ>CA8r_RjqJHzekXGU<1m=i&cP%2w_+#*8$OoF zn()@R((%A}Tn5mlz*=p_8{1#TR2RayAuu9QU+oc#`r9bIS+8Z*#(`xW^9`DgqdcZ@ zAmwr2L~i04NCT~hqAITbG#lMFKMr8Df&C-*V&W1wD0&9Qdnov(!rbrePgkUOoyKPl z1~P0)afZ=5sAEnXi-zK5jS%KqopUh_SZ2@w+ja|U8|0p>Yrc%%VjqH+K1%6NrAk(CZY`PDmP7-#I4<0=8 zwnJ_u7t7~WoM9p@0cZ$UBzDom>%$==N93nf4K`9xuftK~eOiOtR+632P2L*76Sn)Y z$`AoTfvO|nF7T~h!x^2OQbBDnrNp@Q*i{P zhgQ@P2%n*l0(j)L;8<=Z?g`}6eoD2`EgdW@Ont)+Prk#KZAqBe3mvR|rJDj86kZLE zOK-K0@0coCJC##A;jR5BXCZ|f87)0O@bX^fsb$k%ut_1vO?j7$HjD-)yfQE@FMqgs zr1;!E1j-)uj~yNl+{s&e?y2d##iR98c`MF61+n*DPRWF~}B@K74l8$?Z;>A5v$-q5J$yPE^ z!WYf*FNkOCRl#M*sSH8q5#poL~*qTY-JX5>ZSWVFHP; zMG-Sg<=M!V(`o@ENU!&ZBWfozpVf;z5a(>8pVnV1Cd6m=2sM}lF?9`5h&jTKO#2Wy zz!7Qj*td`Q9vkVk4oYMBc0rQ>mL_okF`i}o2F1enGkD2a^8GQ2glWowkV1gP!o%6G zJ$d0p+HzX>*O46y5A*xxq0Pf*U*85DZTQeg+F%3u1D0NGzP^0)xD}Fq7$NC_eph?% zghvGHfy2TLV=l>xsO`kd_Ckbef-K6%x z4^5xPSdk4E>@VtQUdX!<^HR8QH1EybgJ&narDGCq^K_8JV5@`Zm{VV5>XSB;+?g!B zGpBG;DYkG{S15S{b%gjbIs%7~hM}Ip?AaYKakGp&U~}ux=L*8MWUyqol0HB->@9hC z4{z>%0k~>Y^ox==Q@`l2FgcCFKV`IZ>ca^#5AEK>b3|Wpd=q+L@!qG(%@ zUf&G2EEtN03toR7PxlKJjpl({H(%LxrDWs@FzCE@>uwZYd-2`y`*pVh@2$V>dT;a1 zfyw1tCkwVt__oe7^M8-_=AL;wr!i*8ZX!vwL!qx0;Eh)b!mPnHAcjNC<-HDk(++WP z5O2p=A6_|^;LOc@^pEv|q3vc1(Fu^mJ1TN+i+W&>$ z2`HnlH&AIGE%pH3+ZNlzo#}o^_fR0tX zWc1WnDGX`Lue41TSB}@g8#Vt%_V({BydC~t$sc}Ua@CH>;vK-ms-f(A z3l}j;HV>^F%Cw;*x?)}=u`o)m|7?*2VS_NiQopO!jSsmw@gX;29Pal zSqRCsq}1NX0Yz~eMAlXU(psBQk?k+#M}JbkLp}uc@DQLqM2%DmvFnTy#@_)1^+U*g z(@_bUo2NgG#t%o7r!aM_xDX`hx)$3i!ZMweVB}2&-oCy_J2dPd3AB zr)nqtq|6*Y*$4Xq9hmKdZh!Jb4Mn|U3k)+`tDqqvn*y+P(D&p?I)ZeZDnihCuH5=d z)t;bp&&Yw3(&Dgm?FpRGHR~1!Xvx?^y*FiU{Sd8jLaq-UjXZ3#9E?h&Ey44R^)g{< zfsu!5ISC`hNtpw`k`2W&xA4&bznlMv8}lw3RSrJ+Gos3j%Aml6pYbf9CLI%?pcMR_ zf*a|K!tpdQ-ng4aPxnBd*e_sN?+VI>$+AF8hfBzNZd$F_0*i3d@56+_zl*Fw3(GYn zy~5(r6=N&LD<%rod}rxI!L|wCw)?q-!$&W_F!I7kHYC8@CDXaZqlKeAW6C?HubsZ~ zrCZLa+;x<;Xw3bN_nP<0qvI=X6@It)z2X~dZr9#E^u2Xcxlbg%ui!E>>8`vDgAMS& z&09Ep=wdny?gfRzf#LOoPczLw2>TE*dCUs^(fa8|Gw09N8t8dD-FDzcAHjhqX;YK- z-zn*1x_v^o|Cer`((V7F8?i8^Yg!(loCQN}Nf5lB(ObGbN|RHEhu0h*y4TIPB~Q_V zv@Fl62a6?7*@HC6vxsix57Jzoya$=-o^22E(>-~geMRin3Gya(u^`EX8sx?WO z^vlg$Zuf0!z&YAg!!=Ir4|(WV(q{e z>s|tc1`!ctpt4q8CBM`h3Rk|=6_oqd7%%)4eE6NKuIPIS2D{^{jd#_u@pPhsHPyA) zybY@?Eecp~Hc2A}NYC_dW;c(Ph?=FIrY3N@o@m>VS4@rX70J?$Vt$Nc+gh^Y&}mcX zF*x+aCuf@51Mon#W{DhZ8JRMlqmNjK?+@vkkw^z4LtIVT4o(zw2!>(>wwesBxP#zg zIo^Wpkyd=cYtxaY^OsI6+dGxNZ^E|^dW)}Q9=TBS-O8ON% z0sRCS6$&Z|4%%wE)zB?j%VG3PnqQ%OYBaxu)R4rpu$y*u`SpU)rFXJc;M*+t_F4Ue zZ`pKq(WrEF)1B<{=>lk)7ayPSm41}JWb~PLm0PtpTPK%pn9AQc;oCURJG$=8UKY3);<;d?8wTvN*VkRw#!Ih7#&=xn`^L7( zN7v%i#DuSQp85K(^Ujww4;ElT$VSJ+W!n=RA4WyJ$e^nXSwEh31$iS{& zNd`9i@Hu2)cWlrU`aX{UY%QzFe$DbiUK1S3kc3GPCZQ2WbP**5KE|`8VzaoGLBN(t zHNsLbuM|&U-IB<$Emgy~1T6$7RHp2m**+zL1vm~(}P@(r|!XmG>BulS)M{}pUX5OyLo+naV!JYeJRnp z&*E6#KJvn$?}F|&zJREqXS{IcD-#^#ihY%RkIDP1<-`68j`IKqd9c%3z<^wFoYGGq zo%R4k)CHWSr~LuMbifgNQ>~x~HxPfC_LFXcyyDkk{GvnqaG*2J0KoZ64|k*MH?#?@ zt15J?ok}CDoU8>~Pt)?%3lV;wN{(61l4p+s2EeSb9f-TEA5~r3ZK?zi=esVhz#Bu&_FqGoLpDMBeDi~(4QWc_Q$2e zaSx+}_;Z-`w|JHbLrwebKMq3^CzefT)kRa-&K70 zLRn1M*dy>_0KSDD%_XGjy3%=QQYPr4oPOzV`xPhl+DveTAZ3E4r774nj50PoLFh`p z$Z{Rd;kTxMW#wV<7?C%{4j_GjC$9=|V}8%9Adnrf3tQzOAG#;6se01^K%_{*${O{&oLPwh3cJ zmIY%;dXrX8z*j-H4wQ>$P}Bvnld+N#D{<2yR=BZ!3%Rr(uEfRi*JYFzBRROZ(bW z_qNkw@Y!ew(X`1m%%Y+KR$vem*V?%rNheQmXVf`s*&vb$qD?K zM4VyCul#s{qp95~0_-%h)ccI~ODf;G3?ch^2Sx%SB)6#mCWKV0;er9WIe zwRZnx!Tt%~erDzgh6Yn|U5j}qdXL4zD3dP&Qh+dMeJX?@5YtvzpbJo&qn^2HXmKa1 z%xK3%HmfiCS8|pD70pE36G0ANmMNg$*_sC1v`e>5<7?@u>Sf!s%i>p-Ml|O*Qr823 zRy>A$Y^x>ZoX*h~)RB6Y=g5x{!$O^wAk$k$i4BGlU?#8nEKz?JFEC4fwqZMwm6`=pvQ!+%jCN6QB6z;i0SGg9g5evI0SO2Ee`=#Q zTff&nwCNjOw&cGDnZU+{tq{e0GMq#Z^oGPxKCKBkV=mLU)qAk%lqT}nW-?}PTiz-^ zF7Ky55KL)A^te?%On*>6`3ysb;lmDOyC?02sV#Q52zA7bl_b7dX^AQnvRhQQn5Zmk z?ml`tfO?G0vK>r5k%cS@w0pY!VX;L4hpEu|>0hgVnD;CA$0fC;%a$(BaD+uDHBn zWX0>-Mt6>_e`n*hjbA&!R>S8fjyFvN)VqP!$w2Ewuwx<=z8mVE40TU5_DnA8nab~- z@b%uexnmR-UoE|Q=(=>hc1)QlSoOi`CngG>nD9N3+EO2RyXVSmYklF{i>_D}`-*R` zxRKgwpOo)&S?-%LC+3AY5HihthBqw-WH%+DA=26jqt5_N^3O?HsEwqnUutntSs32j z2V-euHeTMUw!aPM&Ba^Fbb2fjyd<&%PpEf${gitny?Zv_~tf9qt< z)(Nk^+nsX$4x+-j%`*=(H|EU1wp%`H6qUxLAQULinjceRAr0XRc4kP94pTpcz#NBL zk%mB0n3t4-hE0&s)BU=*$fSlJ`Kfw7NDIJZs0fr z0&bJ|5lU7lb;s6bERcDbBHv-?NuNW-x2yM{AC`ijn%W@M-kRR5B9ZY~+|O(R+*DcO z7R=Ep>DFi0)Z$DM8=X5HZ@Ay^G`sj@FLr#4qZ<8goXgE{Bc{iI2Yx6vGXz?J$d!Dh z^jAzNOx*;y(M4a4n6q_HQtReklue&Y*^fxRsNM3SvG+Zpw5cr`C2+hXRcW*BRx;O^ zW4GdbL};n_O1%Qch>gEEh1>(@4mhvtnlrq6a2y5S#_Ftq+xzFNO>vPv$X~{y@?Mlr z?}QIeAL_y{M_ZxME9-BnRf;Sz-ltyK{xs^)T<_2eyrmqiI7ZX&eb;jRFxUA)pBw(K ze7>2XsW;)7e2j>m#VQpX{(u<|R7pd$bc7ovPAPmR=#!bp*Pg)t#8OGz0$nx@DgFf( zvxvJXuMn|F*n*$xsZcjrnIK?lmr)XXhXU8dr`W$tNrmu2)@@Bq#wkwyJmv+wX9^5k zGFx)eL_f7ns9m%}qFUU;mGY@ct7j<=g|P8Cws;mDHtjrrN8BNX%E7Tp9<^C{3X5Uj zK@c)?A9y3e03N;k;>e3QKlsvE=}6NDSrsha?YZ|z+1o8wTHr7dycWDAU2DHpdo47v zY$G_`Bb#O%Qo&}hyX?(>Q&V?m$+{cLwMw`~9s63txbnf0b!;`d=k?w77EgMM?|L7d z^gb%o@;ly@AEHE&RlH@!q2E4*7;J6T%${)VX~TZHYYXzA$Dw_m#Q(z_d` zifSp_{fZUzrt}l9BfkhCGuFSo<;s?ezxCt174XF%@6y+M?iH5|d&bsX*#NitOUhE9*eJFXCRaQ*k-PO?(bBP9pLm=#tNsUKvQ_^)$C1DCmop0;OV|JM zr$y`d)Z`DVeY=;X{n;wt?((z*lNk{NumZ;nZK{7o`V6BPIdfC)q-)4DN7;>7gHj6w z&)2-x9wths+Qm#s{0y_#PRC8XHG||pB-I_169i>4o~^^bnR?uQM|v7WnMQL0WRMvF zPI&e^q0LG|rp1{IProZ&mL$i8LPG05aP>;s(2GM_yx2ZhqGvx^fyI2e(rKCtr)Ex zRpA0ryzI)M(X($I{hb(I{E}OKwRnjH4U1JS?h_sCio0ULF0G!rxP@+(!@x-)stNPf z-2HP=XK2*uiOnP9UO|y@XlueJe^jt&hI{!@(c;ndcbBZ6T(bU_^4<3L+V2$YnDJ2m z@xE}EL}3AUNh~QQ02=Wc2DArwNH}^aStc86yE?(Pn$qCH=9v`WL|fd89pv*&lw8Ej z09aaP5eb~ysmK4QpfeQ!%M=DDHdlSl`oZB>K)!&@*Z|T2S3fMedK?TV#leWJY-op| z2&Xh`8OZz@RSGXJYhc*{$&)Rz<9!4#5KC)PS$c-_^l&b$E2~Ncb9LNT)yE}^DS*+dHtkZ zKUwhD?d_ASEPs@{@Waxw8JAR4fxn}51hGpm_ai*&_VJ3lRrQlq^|#mE-ab+F#AL-2 zlSNPdAb+Z8=e^Q0Q0<}$Q0=_sgAMl!3J3T8@_`2_>_7WMr@vvnHvy|nf%OaEB%eW@ z2JtB{3IFVeWKs&GsTbU$I44f%G=okLN-59#xl##^#^RGWn6i{GO<~}N0F@G{gc2~{ zyH@Ub#N32H-V}Yas}ytOa54I`>VX_qhs`GvIW6zrRtcYqO$jadWSwKN1A^`q5DU1K zr&>2#e^Wxn+&$=jnEdEFT;~&fIE+=A3!;9-o>5CFVR7z}SaWIh>B3tCjq}ggmmad6 z)cvyAu0i$aLdZ&UL(1k|C9y@@lvuDt(VR|WK+q?3XNqNid^?$ncds~0Jbnl24drBK{0`0PQ#5nxm@xhsDueea10|I-siPfz4N{n5f@qsrUCD>$WkrG32iN@zUt z?dXl@?L0)&Zn*KK+mS!*`(EGVnmvD+KecfGMB#y9>3+$wyCrp#C3T2SQa4qyakv3z zjHoYHUl(-&El1+DVH%}KnIwoB_ zI4pe#@9(^ed$5yNR6JTb92wRfc(i;11h3XWK(U=}JLs0=y~7~EMz@{xwt{Y@blZT^ zeEVy#K>o4-ncC7|YFn@vrnb##o?X&|+;q>vnfxNpQc;k~B=Aub72?-kJV5-yU0kW; zdEhu8E%{0zhfA>onPkg1&*8S$ahNDFX5o7+6tXEr+{|vdC#aI&G26a`AF;5h!B_nl zn$`XTZWK-tAC-cw^aK0~V?c(jG@U{NHMQ4i`;k~nI6WYY?yi0hiWS`!`r45oFUHhPS!)G!kb+!~Qz$8NAp; z&>*7(paI9@3lQeA{*rQa!&u%si>@ttYa0a~%JNUR{X#)O3G*^BDZ6*j}d8DI+KPr7dEWlRit1PKfu`+wcJ5x`Yj z+3jD$pK`$j5wP&wa0`fLQPo}bn?VB6`G-J)+Ru*!E?zRB1s=q7&9SumYqcYI`;={I zP4HJo8{Xc1W%tF7xx%-bOM4g#_Ul2uK%H_su@G24vblP3x6;d=R0)`|)D3PB5ueJBE2lR=OzDK&#&n-awg zBSyj(86?On@}>^@%mjK+Ed$_@P&?FqP)}?d@s17tBJh4NAR_vSXkBtRis*a17epiy zJM|sLccA13oXD#^QPl^#F^(Y7uR8iwdx9A7=ef4&-mxfKTfNp+Q>~~MHBr5_qTafB z>NRVssS%_{HXqE6G#o!88acCCulS5;=8S0OjA-V}s-ywTuG_4V9vY5!;;U)g`_9$t zL{*f+GlK^!g=eRe8vl$c6YA$5)QCPswkq{$GOOfeJ&I*A7g6Ve%^`${LXbhkThl}8 z5Ko1(vv6c@I9`wLiW8Nz%Hi%)W(`RhYwIyo;n^&5BHpx-mzz(@Uyp9rozVHGGhR&J z2;wtZO**V0+6;YnHogoWAwXD8BUR*6l_mjyz_jN9(sAijTxyO>N|+#;W`+gQ_>#oJ z0(AAF+6f@taYDLslmUmSbNDL88h~goi#Ui`mE(Ei4dZ8Tl}=@?pK!0A&4^9pBmA`^ zpJgY!i8pi&NH*yVu^9}aljyr?OSgsiqqrAle(VYgOJP3_Ds4s0R$B@i65wVf(#;(- zoH0lI0bxXV*L3`XnE<9#xJj|1E@C5tC?GBYU0<>^>@<+m_V7ZWvFI5dyBqj=+ z5#UU&{Nf;WwOrL)#UA`sN)?a;!J#z%hKP#KdXr;6TE||zxzVm;TBudU3r&1z1rn}> zNpclXk}(I>an}vB;iz^*j=7`g6+HM6yG@XCgIM#ITkz4{`7p{jL5(W7`=X=hKa`{} zNAK;z`Ac0T(!Y#p1g3fkD`j|bSk77W1a*nLTC`_yBWBplu?>K|ywBH&a@r5+l^ZS+ zXJLsTq}BtZ(!1ky`z~dW&djnyyg)DM)x&^qOlt z?{4-gaoi;j(c}w;dJqCs8ZEuz8fh6Cpl}64ZrVrFU-B#WC^kjL@~(u(YDc@Tyl^FZ zG6(TTDd#lh9EwmCBMSCVknhToD;r17Oy-nQj@R8Er#lu@L#g+n>x1jhiDS|U?hz*G z`Cl^d%@5?0@AA9w`1o-%g0XG6J(jD%kT>lw!Y@jA-W zM~)Ja&*V;e4ns@SgO<`r&|@)#K2jYUs`|E_BD!Ia1JPTJ5J)ITWDgYXQ2q2or&-{f z#n|#gN(fLwy2hBp$igVX<;hql+{jNM)9eFeFCtZ=+c4qFzd~-{%L3rbAmhulg)jJC z-GUqn20VnYzxZ$h0c`Wg?x7QeAcNA&%`YR&DUgH^VXSmK|890QkOVQLN=Mu{iJAx4 zE*R+<4G1K<(lRnInOiZ2k1kwOCUdHEPk9(j%rddL0~FB?e#J1BlA#TDFu_aD_GQ`eh$%jG~l zmI>b_wPiQoo`P(a)J|owr!?Vpl8CLe)|`bOmnj#all;f zXoDn>d|9WC=QJggMrqjl|1i>{ZLm{1VC?@qA2Zs*c^_5Th%ExxTTRyJdth(dd09S=K_73g6 zbZm6P#g~5M6H%%T;#hA3il(%4?xYtLbStHsigEGnIyLA+5*s!%d@~E28R9cz{JI%$ z%uAmO$4oww?9dCybw!;(XR0<~d0og!|7ME0h!r>h)LXCa6`VIa7+d*lls;WUB!nzh z_)hg1KKP}DAT2-)VondB)QGfdXHfPbX7xQ9B>8D!R`ZulJhEphfA54(e2?oOcy_edZ97k@4Oh zkTL4cec)8P`f1(KZi=5txJ*$tD-AzN*fTnr1dzuA4)8q1j~w`{Re@Oo{+wLYOn`igi|=MVf53329uRSo@<)kM3g-h_{&*H+8x@xRp$ z}yWW zQizv}ZzUtrZ%5z^SwEn^kLdP0otpqLIL- z5h>D$y~J~yz=Q47O8XsT0COU*OYIwU`!Q~bk#pElt2hbkK)8e(*$;?t!7&Ad>yz~k zgj$4>Gtzq9b3Od-o{2}--^tnl)uyoc^0pB~os#e86x_{`Cv)V9oJt%NxSP9tGI#lp za#!9*jsqhHu2+mj?ylTCxpMRE@~N`NCkr3P9&1tYaEd^+pbUb0w&Q_Z#@p;95@~c9 zgb9WhQ)Gf8mhhVZ35DMTETg2c46rLU{A1i)FyRLJPp$D4I?f@DN%MKi7oQ;Gc8 z;K2Bf19h_-w};@f|C2^U-dj4K{cSzYs?lk@VKY1P*YD%UZ-~F@oH~`PZ2>JsNmX3z zaLkP?qYQ;n97(_I8}VISFxY^EMF_k-T6XaT zIP@TBwKTG8L<0F=^ax%FK0DYj6d2rz7-56D8h0b@Gnl|m^v0$EoAm!v>M8{}*Xh6H zDV<4M=~*atN04q_2L1dTL_c0avcyirr-8Ji?!-|NQZ_M!^A6j8SvXYil-GBcPHvU|s`9 z0F+LgeV#bAFQQ?m1u`{45p~p4z10yhDx;zVMs8ZL$YYU&v;@T(+^t>efOon?U&bcB zWq!$;;)f`Xc5-xfr_v_}JPJN$LIG~iKv>XhUk6Z-`j({N``d3xzh^o&zapW9Il=%d z4#m5eG+q;!tp~+R`m~`hqxUo-z7jNABhmI()Ou6L3zRgqV#K}75H6jtjAX;(9$&C& z>If;_?P{#-NOKSyv_b6C))>~3aLqo7Yhx^1e4*{9WmAcH>T0&s)W()uHCSdN9Qmq* zpOqgvk49RK980g3`SVD^sXv3=L*v=_nok7b=)*M~gn6%^^YKipKAiJHXgjU|$AY(E zu<=DUi0W)L&vmiwI_|-FuZ}PzP}VN^EEiR&y-K$)(~ShIcpA=&$sBVuWZs+2FrC` z@n9NanGg27UjJA5%l@{YaHQp9mz4L&jLTW@C>WvG zNU6&@zv{qgk^+21)&*tC{O$$ZO0bS}*-w>d{|^$Nj1JNoCmk1IcKQ{1v7K)AGb7(X zDQ2g0M#GsG7=%9h6am9o)C8?5r(pPLoZf33X`IM`F^$fX%+gNp71Ru`zgti!nXkqn~yzyJMz7%soY)PtGab)BCmS5@NQo9WM1`n;Dfxix2pylCUSR87m#1= z=D}xv`M~AK+bxN+BI%17st_`WKFgS_R-L0Xy7{S(m~S>LXM4PKF5N#$(Q;onRy-Xv%wHd~)TrSNrJux)YmJ6fb5VC}l}RYY^LOw8B?pgQ@opve04o6Sa; zWrG;g4>hSSvLB1O%tH~jlTukWXMcMQq*(H0ZDZndQ3Rt!#v8=4B?8Qsl`HXtHA1po zg-MawSObL)HqX(+n1i4WWGg3`0iQHOLLyh|3W0#>wi<9^ZM6~W&S1R4R8(m&X1~nw z>?pQch+^{*C+^aZ%!A0n1g)a^S=MILD8!%0C1Vbqu>v86IfrB$?z{L19qdjxHV+8} zwWCM6H?q;4YNU0e`Y5@!@^_iYl!d5&Tmvy?vAI}zrWZsNVO_$a5^`opnhM>t#xg}M zWS2ytqONAGC9Sm7vP{8k;06EXa&@!Htz@BSrLAn;9A(#~E*n`{O#ugtPebAyu@)rL z{kD}6d#&r{sCE79S_7+2RV9>NZaM{a(UfOQ}NIzl_7D< ztU3j@uUc0XUA4X{HV5X0w^gp}TUos_ihr?{HYKQK3w5Bnb`AC`*4ET*5M5huBQQ24 z1bre(X(>Vpdo33H$IwYQb1`kKg!dHG8R#^%8?ABk77VB??bZPm=K?m&h0M+j3c$w2pAEI+l!1#td56Ey5?Da)C`K z$J+$ea;(Q{y`^^TtRS&aZ z7o-6tPEm7#X8JIH`Jtq8tKPX_zd_rP_; z(s#AU3J@@}2w_FHRoFdLu(a3$vm(hsZQ@o{O#_2Rz@2cQ72*SZHp_I-mgS?-E`w{a z+a!G-cJ*3e2Q_64>}Er^qtBo~ve7liFo;z^gTo&;@*~3jt~nE53+8oL1s3_(nD8tjj4U|PgX?fKswZ8xk_{aA{I4C zG?b>4zoJQ7d2})eG7-HyqekH%LAzwFXr(h^YrC~QbPABYP5)b|FB!(0Ap6v?uPCDc zRftcJa788;5!5#kRC$6($RbRD{6g|37ZBoDY-tOhMZ!WLCYd2J&@f1}!Iw`+NrHn+ zMAJG+N%%5;iZ2BID|%vk+-Z7hr5mXSa6iyXTOVccJL6J|b{$#l8zS-Sgwbhlp!D;k zfb=3GOpr0B!<#=`dg;iW^pfcu1pS1!*4ReeCcIVn^mS(8aKly4)$sK_6Ghc`GFDIL z;0p~?Ii>hS-gHI*-np+H8}7f8Q8AqZ7wV~;RTJJ-(;4szyRZaKl7rrl78FesZ~T7Y z?Z6)wO%^{nwV+|b+b~-@Chdkboc{(r*RJ8%G~tv!PB;Jm?!G)as_V@2y;@ZJrhP@F z4Q)uMBq2Z`Kr8}*kz<36mpF1+C9tqSP$e0th(z{DcO;vPrQmLg*gY;{x+4d2qAW8_ zPBPP^lRioJ=_D#iHpR1gn(1&(AD^B-grLW9yJs@L@7}jb6qt09(|zV0xO#Qp-Iwov z_gm2&dX&E;JAhj)j6f^)mbfiix-)Q#N2g81_PZ+$F#@$TW~fleB}1OV$m<~KsZ@We9X5#IPWMG<=Yp<9)PQ9V1Spw1D9sWTXlBehkWw}= zE0uRhYr)0#i_kkevwql|vOG(Q@+^#|CHHP=d1s!1U?wb4JaZOpg`@6J+6z@!aof;Z znw@3OZ!<#b3_-vOBL&+`=qaPNaSK|QD>t)Up;8#oTWiQl?LmJZL4SY0EwVjGi_ZKJ zjaMq0Pa%8Aq1?#f2-$=&b)lzr9qq)f&Epvl$}xX(nvnA}+|HhMhTOwW#hd z4R#OKjZeR8Vd+F&EvG%hHpn+o-_ogd!yc`TM{~6JPzJtWXVTYDrj|04rKQ)+nM0ei z!Axa43_D1BLAI)5lx=UJEuZvOogMrk7O|bsnof{-iBvy;QcOMDpD_-|gMo$}$+`#pv}C$KIGz>UNiGWK+_TTJI_hy^W2f{jVs@BujPvjm*Ys2&r z$BM`@J`{qFJ+CMn?@xgrpd}1vC5p;HNXMwAaG8xXCMX1bk7FF0W{s28sfb7c_en?n zy+H^efznMTb_b5u`yT?z*RSFqj8Fh7l8hif`z)`f0p>;_-wp)~47?UKa7-T)P!q9= zm4p<{6ZQ`F)I<5KKQf?}qGVw$S8~W1_#6R2>1Rz`jw)gNfbaklB`ZK2n~Kmx^XAF! z0I&#nF`$sBomNo9cE~D`GRyLk3FE=~8sJvpsEe>Uhf$O1T>HaAs3q+00MaEBuz(j6 z^2HW5<)$QD3r1N-^4jMMl9`qR=F3#~nFj{W15~}X`>SvX3qte1nw5K3A>eAA7~sAe z82PXdZrg!j$|^QmQ{>5KtDFrneOhYeQfW(-))-|0?l>95(Dp_Yq?GP9$MqLhx=GYD z)j+I{{Q*74f4rXERFSHxaaGeQS>lj#_Cb1#p}?}V`m&8ybzDc{I|ec+=vw5J9#@(a zP=fLIny`7WnL>2MIws#x=<>>AyICwG;WeTKp}c)?+;-G|61R#&y;Zn~2YG{`5L(xu zOG-eFC1?Io?oJ-KJGq*rF?9`%sk2bFQ+>VtxCA`ihX(awRQnpCuvn%2(hUu+Q@vGv zG8=Ov{qk2T;IVQOTkMSdfv&RU$mw@%>-P;}kojnUL`e05FG>Sl83dZ&2J4EI{t8q} zphCWo^V_>ZPz=(5(LZv865tz4jsg?5&EL2rs*$3amP9pC6qjgaWf8%HqBvJqiDG57 zXc^gs6{*%PiDG4~)1n}~%F0^5B#M<4;6z|nJ`-|9VF6wH5ywgkC>@}7Dcw|hz~gv% zN*8z>>u5mf1CQh7DV;zZMN?M;N-uaEFHh+PkK^Sj{orw|yhf!Th*P@TsPu!!vGN*q z{ZRVbsOyK)-^ONsQQg%`*FX-NWR|IH9fRG#31}!_f{tex$WTEHKLPdXgT%RKIpnkW ze$XRO(?mnR6mA4oHEBenPlOua49kGJji9b>r)WTgt%!eT$iTNa-_m^4m2KL$>M#L} zyLKmUKfbc&H^_?T4f4ioz;5H^bb*J|-%GL?OgNmODl&GUANvOwNuG-z*hJdrzxf&6 z25}PB5Nh^sHMA)BHvzi3w&H=%kKv0mXRt;Z!25Z^3eK;l@`Q#!ihZm zgi!G)zAcm){yhL!KW)C&qR$lO(n4!2FSjPTM*Y({1UyL zV?RM$kkWvMgZ?KOL8T0nphK8MwI$PG@LVOQ9;K-Ea<)H_u3%gkLL*F^T^$iZTLMdd zHA*Jnm;n|xN=CegU#B`vq{l6pD1+pnV^_9hDW&lrk`bj#W_BP)h*wP`qJNkQn3S37 z;u8Kd)bJBr6(e7V%n>MOFjnsLy`C}t$hiX(2hJAGI#!HqzuvrVHe>y_woe|P&Rhw4 zSZ2-C_K}CCGuG=rROmm1{MiNDhv$;(W2+CM< z%V@A6F#6Wq5{$MrqoxI`V56d~MPq5y&awq3oFu;1Io5f(;=4wedfWM}o!@cJ)xfON zrbJC!{E_h?IJG@BUDKAx-ZbmnJhJ1u#lu<<%T0Jo;yV)F>V&m=%yffV#p8BP_Fi~6 z;cc4gO~5r1f^AoO65h^)wG;g}Sw}O!uzTK-6U&@-6iu6oK3as8sm#`oq>S|+EoNgn zK7uc63d@C@%@LBrf7{tvVEQl4PQU3#&A!eG`;Xgvoi+BKdYzrCtvxDv6A6hZNxyG@ z4vU-|Q$R>hCS|7bvjkG6PcLpl#wRqh6N;((&znQs#5v5U6Y-I>(Mg9q{ElXYIb_ih zJykFEqz*Qy68d0Bg5|#?6E9T)n`PLNiU@ZJbcTD@WKH@mUZFYAZSer!Y<$SQPAK3=txI6tqhcjV~WR)Zbb)lDT!i9>D(2g z&dmpFjGD1$C=3Hku$*_4H364zV2Qx?!{k7Op+~7oV`Zq#P>dm{W#RHc7lxC#@PilD z2jk8drXHNTJ@7xu#|z(iLvTcbV#5WY2=`*-tmpbb$l8x0l#4Lq_c382g(kwOh5dcc z)hlVbpM$fJdUd#XJ zia|povgHL?5ss95_Jb8>qEAv9nceCQ>Fg{F zO*-jxz1A_-@#-!@K_J^WHmn*uk!_jyvf)nvz69dIL{8;DjC^Gm%)F*o!^*2KKUO;7LiMF%W@x+d7o4|>v6MSD z0r*qdc;DH2U`na_#n(?hGI{)+eHWl>7?^5G zWVBG*UfB-ZBE6Wb#po=u02HYYEi!gWUP0^^&3c92pS z2%80p{v%Ys#gLhmk-Ma1z2GpFg@p@K5OPoH1Y|imyU;aihK~iy7p$+C4Z;{&sI;4< zVJy6`BV_x6kn+2o)$Ry6?(yBpzE|qbA64k|Fj-$%_UJ~zwR{wm_Oo`mS-Ax^jBLo$ zZ$IK7hRzY^X%iTaDbGTEzXpqyYD4L8BZ^ys(&v}OGGQ=Z`C2ZJrRBjQ<#))dq+1f} z)5WU7)`P!wKYI*MVxCS2Cyh@EC&cQE;McK;?F4_e4IDW(1g;9fRN34Xm>5S(Km#E< zc>e$blJ!3X`G00W)qjjMq-8-70_rjp-mbU{Ugk@Hu|WL67lVD=5(6`=6B!r^gMUNW zi8jnyLd=I=lHA||7opxkWFZ*OzIHLH0i8^cuXrBf7Nj;o$CliZ#`+eOm4wqp?F!4R z98^rlo4Q54mHl36CmnRG$(aqPxK+I;dwP$N_)~C@6+r1pAeB5P>-)d7&8kcd5C|GG zaJ6`LI`Ig$qlC!7QKd@?tq{yJW}puWAU&sa>2Tn(h8}^TumRZ0g?S5_D{B9`h7w%T zS<~9?`CxWaeq-5`vu7_WT=}K^?IJOjer6V7+ovAWbm3E$$0F}r8I3Ha`+iTLzJZfu zWl>P(N1Hkv?gfg(bXU~uf%>&e(kj!7g?rc2RNugfI>0QjS|H~;1Vt8LUMZe6_3Jok zS8l_75;vj^JS~KmV0P#}PoODKAK-2HHw+(}tmsO0Jy#ut3?ZbjWHW8@)+C}D1dKF& z#;Aw)m-D;OUnN5AQ`Eb>mrFDcAdMrC(}UYv5&RKz#B)*%=a9zM7__-UOFSlPe0>cx z($R2Ii~y8|pn(uRg%b>FPbLB=upUR|t0cq09xkvn!to#LM&6`N(E_!BeQx4m)T;{M5!w-21}p2-PJiPJd&CTVsKFqbKB-!8Hvog%R^I- zaNkjvhG$(HL3hb*_T&;%M=ZqOG_+O8>e@vNWZg&bYm-|Qp{4hSrK{7z-^W0(=1OJ;wYs9K*kul9 z3RM5pl>-B545r~8O<+Ymx}%jcD;)x-bRxBt@`X`Kmtdx{f{WK6Zqm_8U0F)niU>a?3HjXIt~SI26WPRgTnub27_isGC<|=&+$vMIk|<;(qB*#3O+}(aS|^8 zIb=Z=b~xTFdvhpOIOkY7PjZf1e%$<1@keVDxw~iGd#0^>=B*BHXYYo^I@}EncBG!JsjNMI~E?D8~;8s0~Z;%va(&m}YD4(&FLt}AV ze5D1--SATMI=s>`qmv!8S+$9b+G%GkOIR^ut9aiP7&Tn?;J)|j(5RC|ubi>1yk!vG zZKH<&x#UCrjIEwN)GhrmzHY`=Fz?BF{rPkK6a5!=z+pVQEWN#V*3&p`ZA78tYiDfv z3x+h?+P`=)Sb$-=l^JH+!Hx>9+#wFKmM$3$|Wx;|R{}Q1s{-dhA z?Ox%>-uAQ|dB(rW6%j76mPw$1-Oc_IFH3J`+Kq)2i-(0FG2At5gt{<}vQ*Sfd@<;$ zo0l;6^dMeuvR73zhRU%8Ms^MIEzGOC>6wSk`db0rDRApB$O4uQ-91pHeZDMG8raBu zf}Q^DB;KMEuYxjrFih^VNpyx|sw9ksP1qNS41s#m$M8m$H^^yS^s#3E#EOtCm+bY^ zZ>CMgMOsKPn8|2IO+<8&EOH%D#{phhEAR`+rd9_VE)QWq!i@LBHtdgSx6uB@PGcw3 zAl^Y>;lk;Xh4v+|d&wN^hO%7vKjW*m<2YQD+;T^|dyY~4;h&+*zogAa93<>LyWoOY z^7zoKvuI=os03Emc>7DATTBzYIWh4q%Nv%9nepJC=3FkH9J*YK!^E?8)Of>@KHfLu zC?*<6UA!!jUNPrf37ZK{-^fGotK!azIc8jC^XUb#ZD;GJo&Kc5JMs`agZ>efvL`H{ z9g>|fhuX;sQxA>`^}(G_zwU;`k+fkPBye(#`!a6h^4h_@88>HIBSiP4J2~CKFA;Rc zL!RvU{W}7oQH_$o?xrxbj5TAD*Nhh;u=@IW0jkX-meRuVB32Wb;a@aVeOW9~6NDf^$xJEOr5Pn18h%PK*9uLnU!!=slv`^r4(JNRT zBcHwD_Kg~28RJdyZLywtt9vvuzAaW3>p5RJu{Yi{X_~dxjkG5%>Er!4MB*=e_rT1` zjZEG?Y0HeI&Dd7p$7?6YPQDtQhT1#gEHk!Z@WH^Wd}88>vro;!1eethGMC-Y*7y=0 z5UnZ(K^yTxs_ODe7O|3Hu3`B~=4)875DbWAjGkD!a#YFzTRL2_@~*{G4LQz%WA|M= zdRK+W&z8+5!^W3xYonFwgwYh} zBM$AP38@YnUlw(HS4gRgvAs5bK+aTdF>>0KxErntVlr^AgpvFL{ zLxl*#spceekPspE9BxwHw7*Krn1YM%h3x=P2Q(jny0KOjMux3~J18w8zAqFn93dy; zI6Fc<`pd4d&S7V&{A?yy=tea?RVr=Wq6VhEq|^w^)G=)DR;k*CWfI&d@cPP+y- zD8Hd>lRqr5agom#QFs!>nA5J$xlZAhMSo9-3jg7ES5ozg;65D0c0#VU5rG{>U4W>A&UXXM#B_T7OEt`I6+D#PCYO^MwF*Axvni! zj#ktj{B`~sCZu1}s&jm|R4)V)2}59P5aNl(u$EFbQX-~Ys6kG_a8q5wI2)bPsUGyy z+;n$CZgz!ZDd@__G$qg+uxFIGgQQpir5xCH>J1)Mv&$+*4ADk0%taYVx1%Wt0xh@- z_74OHTbg-RXmUf}M9s~{6#RMQWF~V}g(ZgML7@T`Qv6k1d4UT-D1HE86iPQ7)OWSe zgMIzI-P9KRWhOQ-Ui7Z0pJO(_4`R1oeqp69DrR2PQXuru8%8OW9Z((ymRQN~{cV+m zVL~SeL&2{VN(PRpb72DvCoK=$pK);@HD#;;nYqMjiT#F8ZtA)Gy zDJW3z3jBe3(oBJuzyYvtnAtZzEV3>+C}6UFydP$rDXDDc4q7DN=;2Hdr-aAWB9_o2f>1(YZ0N`+_DOz8XRS*n2`4>rh0>l=QGL#Kwtu=jwXk+Zy=hp)*FU z=X>r*@F)!IFijPTR7wFCY><&j5EBO7b7EQmv!01QO1J&B6L7EyTMgsd$9xTIud z_iprsuIePpj|!om#F(jAe39cr1Q?!!-J2Jn>_!SiM~=WQ5*riR-qom-F6gkML{uUc zPg2)tN>vr9AMxeET1IBb8(?E`NwCxw_`fNEV)k397w|_9s@kyht6{UHnN*o*8-OXz zhl;gUZW=Pl|CSdA4GCrQv@w5mOS;566QFK2*6Xv9Boo1^wx^lPyH!uGS+(XFZmgX( z6sjmRNHqOzN?J|rBFIchFxAIkKLH00Ta}K%P0cB?IYTOH`d-N67g%Po{b|^6M+0HV z9WA7tde0W57&=Q+lA~3XgGY|lV{V8BbV6@Qs{TY6+|jDa%1Y`osc{8l9V>co^mC0PdT;W}>P+lM z{TjclJw!i|T^pu@^*#LqkzN>>pdzW8WdzV|MzX)=J@a z!qlxt#|jn!%>Db9Z#p_g=u=CIPe_hW0i?JqR}KC;mNZ0I^m%Wr}<@MT_*nOf8wATHUKlqt;TMyHpZO8ACA|0Y(7`kAdS$ z9OUzGA0#>n*Pvse6ihX)a;=>+b{SJbM|I;}M+bsB1j~lh&dxSj?%(&&01Tyi62$xTG-kQE?aWOhmIwEPJGJi1bW$?8X%6^0uS;;fD+Sq+Sq z-<3G%ZS{=3HL?wT_m}_|%^V+KdC>T=Cz)D~tV$-DY{|NhnKbNtSTfP7ldJ?;nA(e((jAj+uR?^jZ%{G;xp{%HR3#Io zW9&}J%)k@p+3ZDCl4EZ#4A-1urtQLvf%8K|SG!pf$*Etj;c99nGv<1VvYOdO2~&S1 zGc_XsMI;#)kxXQYhwJiqB14BD0t>vF`^k~)g9C%X{%+TO;c?D8}=Db>4W74&&i!J`pmp1 zFIIjr^I~t@Ip?XHD!)?k?YbK|1>+{NE1DVq^cB<99djAGr=7cRrWYi=>weID)%^Vp z32z7VaWZzHC87&q7O9^=2W9<2sbKdcZ244d#YOb!ySt`K+U7i)Fb3$7uXesJFjaBs zY4paoo^0H&UH<6;per?nnY&J zZ04%b9q4Y%@XBYC-YmE+^kg7=X3qG~xzA2~_U!4|j0$k7t*+PXWA^dD8P^SO;YIU| zw_>vJO2$m}#=lE1lvb2{m4rK11R#=-(MWx0#9+G8C)a$l^_|vB8?V*2C2HH|YB$fO zZ%Nc{jyJ!)CYJd}8>VYFC(^gfI@`f3XVb`<3vp$L_MYjy;m8;dzOr$?xb$LE{P^1~ zlT{Zs&lWdLJu$sv)9Ay=JlG{l z4aGVdighzozqYKkkR7)vQuIO5I)8QUH`D$CNea2BV zpI$g!v~4zh`?PcWg2`m7ozEzU?TSBge$Qm?RLMI9Q@yhp8>gKc??9U>A8VuHa>nJ* zbV<{kr&+&0(6iAtl$G@Er4{xtTVV*(Sc$YU`ma>XWo(&tZuw{t?sPNS#b4doA~J5i z!B%^dM9arN4P~aR>TAxLgtO-31vBD5zO&+!lKe}g1zZ0oW$AnCtbd!EzPC~MS+T1t zNBCKztt->`vkjgukMZXoGv0rmW9wRP{JG!L)olEEvl;I_$f-V7ya7B2w_gGENzeJ$ zD6E?3mX7MKidkI(l%a?CTzaoB8ih?qe{=G*&`(l1ESiMwA@gbR5cs}d6~QkfsRi~B z-&dhfLgZ+@ATSLnm^s(zz1&c_(vo4-Bzjmplc&+R$)MEXT%}y?@ABMB>9(S9W`jv5 zzJ?Z>ze?>)W1$71QR7=EEj?}4k?N@2p z5Ux`x_aVn{nv!}+yi+R$@ifQmQQOaZ;bOgTBQ&Mxg;iINXV{vu9i3O$w)#gKA`h_t3SKr*XO-}U&Jj8p@3OLu>3_YcLZ zB|kD<4Nf=hN~G_4*Vzg26<-yEVr=eLPJG4k)tqT}_2o6Q*1$;nye(@y7;m1lRgG+& zw`GqXpS9)T4F~4dm|@OQ0ROMk?p<@%PWDn9PoJ}vvsZt-bk16Vvso$g>#L^SYk!b6 zYuyYl%O>0C%JGspQ|3J0RssKcf9vgW@gzzU)NrKUx#-Ey`tJVyw>BH)*a z@Dk zUi4Vp{iHNg8|KuzfFTJ3j&lJc!%dPu;B=}O8O%z0HEErDl?Z7V1NhP=O=2?yiBCN* z7+=%=Bu&8{WSk4*$DfeO&jxN_t+qvv+m-X=actUyWa|esex^4IM&=95qAy>N;Ix2B z%+@rUAT=Yo1O}P_0M^BKJ`e3{jL6}tE;{u zq8eqEL~bpFyeG4x^aUhjuB0RjZ1@ESVXu}XGI73>QxnNX@RxB$!<+GYiQtu#26ifX z7j|H-|CLtCQ%Eu*{4*U}@%FFneS7az;LlsX-8${wG-uuXerD0=_IVFZtXTQGp5l3L z7Mxw3+kJMol$lHS)Z)qJMBeImGaDcnoYVNvxT7`U6wF$2$BE)bpZk)Ht+&*B#e})Q zx9L0akT(dWHKiD|#<65&qW z65X&3oE}2@Xx%Az5MM~dhD@=V2xzhuSRW=NlOcIsVTNN8ju)mo7z83ot2#`Oi5r9= z$iZfwv`EQAW_hO#wpm!m?x!%FhqeGebhZZ-yN7w!j;T%wDD zQaAvk0Xl~Z0MpwEZ^y52BP!E(+6-*qv18H9rNz~=SU(K{A@T5QMZpwe}nX&yQy}?GdcWHZ=(+o1Ps5`=02%~G14JZ>qI17lddu!t?#T;=|#KDl=1?mRC2(p5g`5!qL=eCzzQwp!9Lhi=iGiqxn|t{=a3%v z>P`5g8HJJzCr?U-Q>Pf(&&UFt#9XU@_?^H-HDKKZ!zqCF%Bl76&>#$hL|g9x=pP{O zZUXoF8Mwa*dh}LYzcbFd2zli{IONZQ?WDMP_L;Gc(XHbK+)b`I3lq-5H}}U&-*_T^ ze9l>Y|F|dK>OS8+`RF&Fc;|`PqLv?+t~~mEEA)W1O!r7|6BR%A)}ix<;^D8IxNu@> zXfCU5c^e*!H@@-Y<;=<8rJV1UPaXeG<#bi+oO6R#_B|3%*}6{6Q&sWO$;alhntmr$ zyzAV+&V?@AL)vN1w^Fc;f^<6K^C>8zpqzs3^r4)B5(>N&M?o=75b<%oAS@b0n{P2K z%~rbTEwYv0-sH1woXfh_s$!_KZE29PEz$r9vv~mzqh+yiFgccO_K>+9tMT_iY z^q5u|NzgJmt;i`zYaAgt8JK|G6ljn{dvxW!O_%7uz`}Xnm|}ZwYb09yq~>xbaa5uNRhDK7Oq4Wh*d?l3aX7=;h*9!lcSQEOI?ha zRsD@{CO$}pfe5EKFnOCP>Nmr+fFyG&gk*qmd^&C4IMcG6SWS`Q(&>-8`O;} zXrGkE>FCTbE(mADcBqFjJw_T0lNl??#UmlS+glG(DU8~Nd&4H`5%H5HFaL}t;)UuB zKSt5!$Ur|DNT;oo&EC6-#vKfI6BCbc(Mb3k^wH8s4!_3Nyf(0Rgm_=a-q%THya!sy`Y-!~Urmkd7yV((Mk$R;;Yk+u6Y&-nK`$((rCE-l z7h+99!33_j_)E8BlcVs}CP(7c4nLCI%Xc@{VORJMX`ozP%r}a%yvQ4H*oeuMY+WFt z^812|B4I)eyO@IG^mB-UC;}1(gLP#OYZuikb4eNF^K+Ey^AwCw@Dc?tQ*eQTKc(Pn z6kMW!aYPw!^cwxVLBTI6_<(|Jv^HEq!5Rwg$#sQDh!B2)f+s0BM8WeE^ij}@K+1u! z4n{Jo=Q3;^GUJsyJ!4+ZMkw)X6p*#$@OLO6(;LhL0O#Ve(>91W$*PE-N;VkFNTz3-H>2LFKGXuHTLuW6ll{f>DkR5?C@L^xD(YM%)Xz=*M{F ztTAuFP;Q3v_snE=!MP(7N3LbpCbDZM+Y{OKQ)P+lHKX?HIr*_QZ?&CoyH?PUC}^1S zB?_8mbDBq;_xzA-YQI`?wRE;=N5Z*!bZ=~Je9v{rZk?WTCyF;E3oEY`)+Gw-CVOTJ z8z*ez;&_YX&HT3S+a2HAJDs)rUGJXjzJhqs)XJHXb^pWLcs;!^UO45ODQTPvo#lHCe(*}e^s18hdu z^95HvHD+qXO=|&KbQ2a?oY^;4uleTiJHw;!R=+CgU->or1v|YLCCh8Rw)?_vdM}~( zt_xlKy`uJOPhEJ5-ho;e%z;I#!@Nse%%>1_r00$7#$1fo%oqz73>oH}WXtxek6e9p zwq;ks*@)rTG`Uvt6j3{~%fEW$Tc4qJ?hvV=XrozJ+bMqNG};~#$(}YstKi9gwGT$Q zoq3dXYUh>D+_bJ(bf>5}pVwSHV}wv+D{5Zdb|rY_x!Kk231=;vh@DAKVcaz9DZlQ` z9Dh3AmdI*&*Bd~s4O=10#>Z#pBq}H(&Qmj@GV(_)w}DH2N?dRYS^1;3>yFGtgTs}# znD2BIE))vYt)qMAoE6FH4fJ=YMEePaE>$`;YI0B~w@ezEPP zw(-JQbpwTsETqT9yPFcr19#hNCTW6s6g+jw)` zPA?KSENl^lrgh1d4apT{x6N&0)8ZC`Lrh;R%tV6vEV1Ilh8-yCmO$Z$pEA^mnYRQ4 zAAUyMDT+0>1PVWV)bNlf7TyvlTnwQjrHf9RShJYTDzu^2Y@=AY=*$<_EVgEe-o*yD z=vpZEqEqji+;dz z2vB(~Rfk~l)8b)K+$t_UYkb5YuDE^BR3dtB?-JWZaj$rLmmyvBEz}4u@A&>$WD;yf z|81jBEV*4}6)OP|F_BhW9!6{!Do;i{E9uKhx_mKH5(2Vr-)-A*gIK$G(3~$8EVN?4 zN24>wJdE>olkE#TZ(9YiASsx?=z7_;AmpT*ZV5S}=?`4D8wIft<-sD&V?_3fchKIO z&TLB9n?@{{TY_9DX9)~;dS2TzwkKvG(=-sRX+eIuI$DOci&mj{<88rd#>Cjo>ELCV zGv7Dm-!W}8Z;a($%d45mtGOfK$HG>FV77j7*Gs#;`0&dQk8hnb<-G4%Git=*vSnR| zFmNOmh&7I%m~$56EXXYwRatD3)%E?d@4Yzf?wGUgyl!=k1}EVB;B5AsHTOE_$ProZ z_0FWXbliH)TRP({jc=OuHjbK;*5Xm?HEZ#VwRo}wQ0SVqVaD1pmG!Q5?X5h)+p=)L zD46npwa~X&aOS``l)31-JMSMn-Y-`{hP0sYwqWoSfg)%t`gp;Jj~_1_73G9El+b2} z!C)lJri3|^Foz{X2=Au6#7|1t1%Yzkq5wGX4<;)L6Kx+agjN`_{5~`o%$?#Lfx?d$ zoT6xxOxBMVo+>iXc)^C%>Z!7+;M8+dm5KEAbIw-DnfWh~FXJ%(QD9rv<7VL}miG1d z^VdH2<9^|<{q+d{rr7uR2H|f48xa0&rQtxf@C$pzfl}cY4QU6Og*k)cz(&J+X7l4k z#`o;*$8(ME<+69b`SEqe_bS|vHyPh+V(%Nw2QrM;1or{A@tT{xXPXZc8?UVpDJ*p! T2pF$58xE{DUfbw>!ejn_*XD3A literal 0 HcmV?d00001 diff --git a/lib/scitools/easyviz/utils.py b/lib/scitools/easyviz/utils.py index e13d878..e9cfbc9 100644 --- a/lib/scitools/easyviz/utils.py +++ b/lib/scitools/easyviz/utils.py @@ -11,7 +11,7 @@ def available_backends(): files.remove('__init__.py') backends = [f for f in files if f.endswith('_.py')] available = [] - print '\nChecking if you have all the Easyviz backends...' + print('\nChecking if you have all the Easyviz backends...') for b in backends: module = 'scitools.easyviz.' + b[:-3] try: diff --git a/lib/scitools/numpytools.py b/lib/scitools/numpytools.py index 31f5b6f..e2d7f86 100644 --- a/lib/scitools/numpytools.py +++ b/lib/scitools/numpytools.py @@ -190,7 +190,7 @@ # check the environment variable NUMPYARRAY: if basic_NumPy is None: - if os.environ.has_key('NUMPYARRAY'): + if 'NUMPYARRAY' in os.environ: if os.environ['NUMPYARRAY'] == 'numpy': basic_NumPy = 'numpy' elif os.environ['NUMPYARRAY'] == 'numarray': @@ -224,30 +224,30 @@ if basic_NumPy == 'numpy': try: # fix backward compatibility with Numeric names: - import numpy - oldversion = (numpy.version.version[0] == '0') + import numpy + oldversion = (numpy.version.version[0] == '0') majorversion = int(numpy.version.version[0]) minorversion = int(numpy.version.version[2]) - for _Numeric_name, _dummy1, _numpy_name in _NumPy_modules[1:]: - if oldversion and (_Numeric_name in ['RNG', 'FFT']): - n, module = _numpy_name.split('.') - exec "from %s import %s as %s" %(n, module, _Numeric_name) - elif oldversion and (_Numeric_name == 'MLab'): - from numpy.lib import mlab as MLab + for _Numeric_name, _dummy1, _numpy_name in _NumPy_modules[1:]: + if oldversion and (_Numeric_name in ['RNG', 'FFT']): + n, module = _numpy_name.split('.') + exec("from %s import %s as %s" %(n, module, _Numeric_name)) + elif oldversion and (_Numeric_name == 'MLab'): + from numpy.lib import mlab as MLab elif (oldversion or (majorversion == 1 and minorversion < 1)) \ and (_Numeric_name == 'MA'): import numpy.core.ma; MA = numpy.core.ma - elif _numpy_name != '': - exec 'import %s; %s = %s' % \ - (_numpy_name, _Numeric_name, _numpy_name) + elif _numpy_name != '': + exec('import %s; %s = %s' % \ + (_numpy_name, _Numeric_name, _numpy_name)) - del _Numeric_name, _dummy1, _numpy_name, _NumPy_modules + del _Numeric_name, _dummy1, _numpy_name, _NumPy_modules - from numpy import * - if not oldversion: - # get the old names too (NewAxis, Float, etc.): - from numpy.oldnumeric import * - del oldversion + from numpy import * + if not oldversion: + # get the old names too (NewAxis, Float, etc.): + from numpy.oldnumeric import * + del oldversion # define new names compatible with Numeric: LinearAlgebra.solve_linear_equations = linalg.solve LinearAlgebra.inverse = linalg.inv @@ -256,8 +256,8 @@ LinearAlgebra.eigenvectors = linalg.eig except ImportError as e: - raise ImportError('%s\nnumpy import failed!\n'\ - 'see doc of %s module for how to choose Numeric instead' % \ + raise ImportError('%s\nnumpy import failed!\n' + 'see doc of %s module for how to choose Numeric instead' % (e, __name__)) @@ -297,8 +297,8 @@ def arrmin(a): try: for _Numeric_name, _numarray_name, _dummy1 in _NumPy_modules[1:]: if _numarray_name: - exec 'import %s; %s = %s' % \ - (_numarray_name, _Numeric_name, _numarray_name) + exec('import %s; %s = %s' % \ + (_numarray_name, _Numeric_name, _numarray_name)) # RNG is not supported, make an object that gives an error message: class __Dummy: @@ -311,8 +311,8 @@ def __getattr__(self, name): from numarray import * except ImportError as e: - raise ImportError('%s\nnumarray import failed!\n'\ - 'see doc of %s module for how to choose Numeric instead' % \ + raise ImportError('%s\nnumarray import failed!\n' + 'see doc of %s module for how to choose Numeric instead' % (e, __name__)) def array_output_precision(no_of_decimals): @@ -351,7 +351,7 @@ def arrmin(a): try: for _Numeric_name, _dummy1, _dummy2 in _NumPy_modules[1:]: if _Numeric_name != 'MA': # exclude MA, see comment above - exec 'import %s' % _Numeric_name + exec('import %s' % _Numeric_name) del _Numeric_name, _dummy1, _dummy2, _NumPy_modules from Numeric import * @@ -404,8 +404,8 @@ def numpy_eigenvectors(A): del _problems except ImportError as e: - raise ImportError('%s\nNumeric import failed!\n'\ - 'see doc of %s module for how to choose numarray instead' % \ + raise ImportError('%s\nNumeric import failed!\n' + 'see doc of %s module for how to choose numarray instead' % (e, __name__)) @@ -496,10 +496,10 @@ def NumPy_type(a): # Check for non NumPy types first if isinstance(a, tuple): - return "tuple" + return "tuple" elif isinstance(a, list): - return "list" - exec "import %s" % basic_NumPy # Why isn't basic_NumPy imported? + return "list" + exec("import %s" % basic_NumPy) # Why isn't basic_NumPy imported? if isinstance(a, eval(types[basic_NumPy])): return basic_NumPy @@ -743,9 +743,8 @@ def meshgrid(x=None, y=None, z=None, sparse=False, indexing='xy', sequence on the left-hand side and instead adjust a keyword argument. """ - import types def fixed(coor): - return isinstance(coor, (float, complex, int, types.NoneType)) + return isinstance(coor, (float, complex, int, type(None))) if not fixed(x): x = asarray(x) @@ -919,11 +918,11 @@ def Gram_Schmidt1(vecs, row_wise_storage=True): basis[:,0] /= sqrt(dot(basis[:,0], basis[:,0])) for i in range(1, m): - v = basis[:,i]/sqrt(dot(basis[:,i], basis[:,i])) - U = basis[:,:i] - P = eye - dot(U, dot(inv(dot(transpose(U), U)), transpose(U))) - basis[:, i] = dot(P, v) - basis[:, i] /= sqrt(dot(basis[:, i], basis[:, i])) + v = basis[:,i]/sqrt(dot(basis[:,i], basis[:,i])) + U = basis[:,:i] + P = eye - dot(U, dot(inv(dot(transpose(U), U)), transpose(U))) + basis[:, i] = dot(P, v) + basis[:, i] /= sqrt(dot(basis[:, i], basis[:, i])) return transpose(basis) if row_wise_storage else basis @@ -968,10 +967,10 @@ def Gram_Schmidt(vecs, row_wise_storage=True, tol=1E-10, m, n = A.shape V = zeros((m,n)) - for j in xrange(n): + for j in range(n): v0 = A[:,j] v = v0.copy() - for i in xrange(j): + for i in range(j): vi = V[:,i] if (abs(vi) > tol).any(): @@ -979,11 +978,11 @@ def Gram_Schmidt(vecs, row_wise_storage=True, tol=1E-10, V[:,j] = v if remove_null_vectors: - indices = [i for i in xrange(n) if (abs(V[:,i]) < tol).all()] + indices = [i for i in range(n) if (abs(V[:,i]) < tol).all()] V = V[ix_(range(m), indices)] if normalize: - for j in xrange(V.shape[1]): + for j in range(V.shape[1]): V[:,j] /= linalg.norm(V[:,j]) if remove_noise: @@ -1126,7 +1125,7 @@ def plot(self, center=0, xmin=-1, xmax=1): class DiracDelta: - """ + r""" Smoothed Dirac delta function: $\frac{1}{2\epsilon}(1 + \cos(\pi x/\epsilon)$ when $x\in [-\epsilon, \epsilon]$ and 0 elsewhere. @@ -1860,15 +1859,15 @@ def nested_loops(a): no_value = kwargs.get('no_value', False) for line in offset_code1: - exec line + exec(line) for line in offset_code2: - exec line + exec(line) code = 'def nested_loops(a):\n' indentation = ' '*4 indent = '' + indentation for dim in range(len(a.shape)): code += indent + \ - 'for i%d in xrange(%d, a.shape[%d]-%d):\n' \ + 'for i%d in range(%d, a.shape[%d]-%d):\n' \ % (dim, eval('offset%d_start' % dim), dim, eval('offset%d_stop' % dim)) indent += indentation @@ -1877,7 +1876,7 @@ def nested_loops(a): code += indent + 'yield ' + index else: code += indent + 'yield ' + 'a[%s]' % index + ', (' + index + ')' - exec code + exec(code) return nested_loops, code def compute_histogram(samples, nbins=50, piecewise_constant=True): @@ -1941,9 +1940,9 @@ def factorial(n, method='reduce'): ========================== ===================== """ - if not isinstance(n, (int, long, float)): + if not isinstance(n, (int, float)): raise TypeError('factorial(n): n must be integer not %s' % type(n)) - n = long(n) + n = int(n) if n == 0 or n == 1: return 1 @@ -1963,22 +1962,22 @@ def factorial(n, method='reduce'): return fc(n) elif method == 'lambda functional': fc = lambda n: n<=0 or \ - reduce(lambda a,b: long(a)*long(b), xrange(1,n+1)) + reduce(lambda a,b: int(a)*int(b), range(1,n+1)) return fc(n) elif method == 'lambda list comprehension': fc = lambda n: [j for j in [1] for i in range(2,n+1) \ for j in [j*i]] [-1] return fc(n) elif method == 'reduce': - return reduce(operator.mul, xrange(2, n+1)) + return reduce(operator.mul, range(2, n+1)) elif method == 'scipy': try: import scipy.misc.common as sc return sc.factorial(n) except ImportError: - print 'numpyutils.factorial: scipy is not available' - print 'default method="reduce" is used instead' - return reduce(operator.mul, xrange(2, n+1)) + print('numpyutils.factorial: scipy is not available') + print('default method="reduce" is used instead') + return reduce(operator.mul, range(2, n+1)) # or return factorial(n) else: raise ValueError('factorial: method="%s" is not supported' % method) @@ -1999,7 +1998,7 @@ def asarray_cpwarn(a, dtype=None, message='warning', comment=''): msg = '%s copy of array %s, from %s to %s' % \ (comment, a.shape, type(a), type(a_new)) if message == 'warning': - print 'Warning: %s' % msg + print('Warning: %s' % msg) elif message == 'exception': raise TypeError(msg) return a_new @@ -2033,7 +2032,7 @@ def iseq(start=0, stop=None, inc=1): if stop is None: # allow isequence(3) to be 0, 1, 2, 3 # take 1st arg as stop, start as 0, and inc=1 stop = start; start = 0; inc = 1 - return xrange(start, stop+inc, inc) + return range(start, stop+inc, inc) sequence = seq # backward compatibility isequence = iseq # backward compatibility @@ -2201,7 +2200,7 @@ def arr(shape=None, element_type=float, return linspace(interval[0], interval[1], shape) except MemoryError as e: # print more information (size of data): - print e, 'of size %s' % shape + print(e, 'of size %s' % shape) else: # no data, no file, just make zeros @@ -2216,7 +2215,7 @@ def arr(shape=None, element_type=float, return zeros(shape, dtype=element_type, order=order) except MemoryError as e: # print more information (size of data): - print e, 'of size %s' % shape + print(e, 'of size %s' % shape) def _test(): _test_FloatComparison() @@ -2227,24 +2226,24 @@ def _test(): results = [78.7464284904401239, 15.1547572288924073, 351, 13, 26] for f, r in zip(functions, results): if not float_eq(f(a), r): - print '%s failed: result=%g, not %g' % (f.__name__, f(a), r) + print('%s failed: result=%g, not %g' % (f.__name__, f(a), r)) # Gram-Schmidt: A = array([[1,2,3], [3,4,5], [6,4,1]], float) V1 = Gram_Schmidt(A, normalize=True) V2 = Gram_Schmidt1(A) if not float_eq(V1, V2): - print 'The two Gram_Schmidt versions did not give equal results' - print 'Gram_Schmidt:\n', V1 - print 'Gram_Schmidt1:\n', V2 + print('The two Gram_Schmidt versions did not give equal results') + print('Gram_Schmidt:\n', V1) + print('Gram_Schmidt1:\n', V2) # Null space: K = array([[1,2,3], [1,2,3], [0,0,0], [-1, -2, -3]], float) #K = random.random(3*7).reshape(7,3) # does not work... - print 'K=\n', K - print 'null(K)=\n', null(K) + print('K=\n', K) + print('null(K)=\n', null(K)) r = K*null(K) - print 'K*null(K):', r + print('K*null(K):', r) if __name__ == '__main__': @@ -2303,14 +2302,14 @@ def verify(N, namecheck = ['fft','mlab','ma','ra','la']): Verify that some packages imported by numpytools works for Numeric, numarray, or numpy. """ - print "\nUsing %s in %s" % (N.basic_NumPy, N.__name__) + print("\nUsing %s in %s" % (N.basic_NumPy, N.__name__)) for name in namecheck: if hasattr(N, name): - print "%s.%s : %s " % ( + print("%s.%s : %s " % ( N.__name__, name, - eval("N.%s.__name__" % name)) - print "" + eval("N.%s.__name__" % name))) + print("") def _test1(): """Call verify function for N as Numeric, numarray, and numpy.""" @@ -2403,12 +2402,12 @@ def testMeshGrid_DenseFromNodenseMeshgridOutput(self): try: __import__(arg[2:]) except: - print "You don't have %s installed" %arg[2:] + print("You don't have %s installed" % arg[2:]) continue sys.argv[-1] = arg - print '\nNow testing with system arg %10s\n%s' %(arg, '='*38) - print N, dir(N) + print('\nNow testing with system arg %10s\n%s' % (arg, '='*38)) + print(N, dir(N)) reload(N); verify(N) suite = unittest.makeSuite(numpytoolsTest) unittest.TextTestRunner(verbosity=2).run(suite)