From 8cd77aee9af3a9d8bad8a74a2488f8a4da3cfef4 Mon Sep 17 00:00:00 2001 From: Fabien LOISON Date: Mon, 4 Oct 2021 15:42:28 +0200 Subject: [PATCH] JPEG: ignore invalid values for the the orientation tag (closes #38) --- README.rst | 2 +- test/images/orientation/invalid.jpg | Bin 0 -> 68894 bytes test/test_image_encoders_jpeg.py | 22 +++++++++++++++++++- yoga/image/encoders/jpeg.py | 30 ++++++++++++++++------------ 4 files changed, 39 insertions(+), 15 deletions(-) create mode 100644 test/images/orientation/invalid.jpg diff --git a/README.rst b/README.rst index f312b3b..e6a1bb7 100644 --- a/README.rst +++ b/README.rst @@ -56,7 +56,7 @@ Changelog * **[NEXT]** (changes on ``master`` that have not been released yet): - * *nothing yet* + * JPEG: ignore invalid values for the the orientation tag (#38) * **1.1.0:** diff --git a/test/images/orientation/invalid.jpg b/test/images/orientation/invalid.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c17f8d2e3dc2d5084cffc25895ba0ba2b07967fc GIT binary patch literal 68894 zcmeEtcT`l%((e!?BVou{qLPOpM?r!hIcFJQhMaR$B;x>*hpZqu=O`c`APgXqqmmCf zgQCD2Jm;Qs?tAz9*1PLl@BMX~#h&Ww>gujvSNEQ(+52YZ<|}|$MNwH1fQE(!c#Qf3 z+$;l16@2Yr0D!VGCjbWk0AK+~(J%mLDC)M*pxyaJ>!WDeKWK9leg6*`bQBFjLkEzc zK2b^lc9EFB{2i>stT|+)@g#l4eVtsLpq>yW zUnfUr4{={9j$g{fQS>dFkAvx#h^K=Thq4pI1}ZLo3z@Eqiz5?AfEOgpfl}gb4HMUv zSNuZ-swTzp$6S4Ue0Y7pye{rGd>}C~F+P3)J^=w9lmw55pR*^#m&e(I1*HLx>6Z?9 zsE3uiovWvvi!;-$PKc$8m!}j52OiTOs+E-0H2+Drjh&P0FYPER_)vhtyO=s^8em)YpXx)cJ*?1{AIJX z6(7_Q>I8N6^g#Il=nwm?t;7{k=0QBA?QYkL&)yYkBgyv{_kT1EC~EEhoX9^p;%&<> zPyBrqZmZ&&cD_(YLwOXE&cEX#BrM7IFI#RQ{Hwv}uP$Ig(BHfKt>u4Yho>Fvzp&%B zglg{$r?}jjgBjuL=Dh+}rv8#Wb+9_Oz82xV83wXZ|Uu;ckaoILNK9OQZbs zm)zfZ|0DBIyWwB2(m#%i-xmobCjQ7B3h{JtzunN%x0{9O)_EoQ{`aQ;(R4gK6}(aV z_`f^9JaqkBp?um<4;L?YE2x4u3LBQc_C0DgYHI(z0wCy&d7!9mE-D}f6%_*s{Q^Ku?eA)C zSMGP+kL^5Ai22=~Hou=+I#9P?mEUWQcE1iUSBSd@^wugVj(?c-3-#MhzW@=3Sp8ak z4~RF^T9WUdc(0wUD5&u%#$iNhC|cj5XekJ>guq02V1m}dJc2MW0Uk@36^KVbNKD8YDk3Hd75vj* z{)L)lmV|CaE7yz4)3{aXn9Tf+Z;yz8&*3Dg;tGVwv>Ms8NntCb%;da9|dp{T5? zfJz(PW@sF(oIEi30RSgwPj_u4IVM9RV4|#wKzzG2P)gN%X1}GU+`3qYQ7+ByJ3ynYy z0JyVsb92H50AMEp09UVWZhpMExw*bGSFflPO zvF>1D{rbno#lgbH#m2(I!NGR#3*kry8orQ+0}BqbSCb#Y)5iZ9HPu}9j(k^5oUUP);blLIH1%Z z_^dXV&OC7)rVb*?E#G!l;{+i`pr!?rN{y8 zI;33i!1_j~=GDU1sZ4j!RZ#{aW5yv@mK|_M)5D`|r{Vd>wc%`xV{NLN$!o2=_e(9<6QYlx5Oh z*6u-#jGx8?qYvFB-!j8?=fnDbW*fVmDsrLI*=^f9LfZvR1oO%aku>#|C6sLGgpX4d1LGW6qg`oU!S!r*K@8Zmvf=< zM78HPeQ(9~k0*zCtJ(Jr=g#=-P8CkLi;;gk^A)a6Ps;2T#~t-- zP*pp$ew|OY8PG6E>tJHi>XhSK z^r-v`gG(f#y(##`tarb&9SrPw#Os}IEsU8zbT+U5p;^3odNPH(2(e%^)iT^L$LRom zI#?=Ja1`2Wa3sI@>^JzmeEz(gU>;w?%6guSI=R+YA{J^3rJYYkpo>)bzQ}7nrE-Fp z1L}`7+6k|Fos^U{5f$_x@ocA}44pQ3omXbky;$SyFFxGKMq0?%%D$YP#hkGxX9iwp zrst<=yoDV>26NLkpXYouDnw0l$uJE163mwRd8;YjTDREIa2H>+`+tD{c0%22CDn?r zE2~RDaZdkPDSBdqW~Z^r_PnCBmR)ou?j^J6s;^zdQu?IhOZOq%kPtj9&CabG8Xd`PcSK|XT>f0eI?veiGQ`iveY_arNpB2q&9QxHe~ znSZsyP7vjlRG%;pi*&n+;0Ui*jRpLkQE8SNS%fQPwdw3`dkhbj?S!=Yi6Q>Ap z*O8*KyP?dY`<>I)b-3wU{QOW4VPP}^%ia6JA>l6&=#Gm$R1KZfnVb2i1fdPZ&O7+z zJtupd3@=u|=eR6D!96*qNi@*W`e{ zx$$5yLki(@mp*N!lNxO;b$mt`A=OwG3uImPraY&VHj1`JY7<2aJWTIae8TbSUDNaVo(s>f_h7WE1#emTig>YS z5^?um)HpPmM{7x5sc$w^0ChAofV~?JE7TP4f2Moqi`y9{V!sQ!i#1^|Tr}~$qi|yS z^+Z3d{yyUV=$d@u329yzdKdb8YvOS3jRUKd?rikKE2b#b^d}gn+EspInV%`d zjil73+G+-9$A^*yl^!H4rAGy9n=%y?;x*Ds0s{<9J~$6N%_R@AlD1qNCvS9&l>q~p z4u_ZZoHs$#uL~vXAC|s1c8?TN>M}^5bRJE4^6BGQp>wz|;ff0GJv@;dskip6QN5=- zr~cZDYB~#7nZ=EA+U)k3OjJgpZ?HPvU7k5la#KWgQSQ+D3&$g=7R^cpxdwvPverkTCyG!1C_ zVK?w#?E4KMx1?F^oedLhRS^aEq#7$?Y>J|q5=QiekP)O|-rWqoB2uf-nQ7gmcrwN; z3pPc(8xUH!KLzNf-9e;8FzGg!H+ODeiBOrq2&0|fmT+xJ;>=Y%t=&<=tH(~MD<~V= zD7GBDN8z3Lrt-scZc5@_ZmL-Fj<#~{WugTNk(U-KTT%r0ZG7XW`4LZ*q$mhm5bF(6 z8ToyBwe6bZFMHFXIgPlUB$*rPX*6s^#^Dsz`v3S$L6e8IWpEjnn!uXyVs)#*yseOo zn{C*!YRt;rT=TIAS(zdX@)-T%?%>Fp|k-O9vs{lc((RH{d? zGN~AfkbQGakVGM%^{I+x-GJfDbdGn4qB{DG;Li^!j{=H3t|UCRuQCnPR9JS5>#O`m zpS&vBn`B*9tiVbnEyff&n@hQlgfr+;5wpsdJ$vNcR-Y?Tw?7BU^?64xn7PP#Ir3RD zNJDPQh%-$9chwx3NK}Z6J2vJ){3(lqwQ_3A3!`9T!NK-STBg>|eLBHp0XeQ`eqaL@ zz}XmcaL&Z9Onsb1sx0K(S|-uK8tZrxv-V83**A2aMHh{jUboGUk)PYbC?8Dy_C=8GD~a4t-?L3W?gQaZdT7*T1TjZXM(M zdok=!5Nd7mXrXD(@yW4;6SNCCmD_LS1jZ`Nr3U9~ZuzDdz+%_-aFfvRRKOBtJEq%_ z`2ukPRkn9bbf|z`aWvh9Ge_C^pY?e#JP@axjrouBDs>y{z7AgU0cYon$N7MJs*gNn zr3X*_RV&kiIj_AY{4?-V7TB@r#nCuB;aAwNgv_G{tLj~XQrn-U7xVdwKFq#D8)lV` zq-q%KZ2*hfk+2V*-|c8!fv-5$t8zY}jnD{9pf=8Gk-fh*YzA8SR&ZDFTpY|d(e%i= zFcju(M%$F@XhAw-h#To~q)U z#Na*LS0Z=G{4sRWe%q%d*|zZDCt^`A-Y%@( zeUe5aTe-U^E?RC28ENd;8P*YvtrvZQQD>hWlS)1uHE4-UX+|Tln1x2h?1H&UJsKM zZyEUwsy*5&&lXOOVq&Mtw@7X<@{O{^NDMV8F`3(`=KD>2)iI<_-`kl+y&!{gj|cZ* zK+rP%{G+8saw)V!N9j>qpW&F%I_OyAOowcnxqIwu{47D+5?d3+;ISqCg_1h*tI>2^ zFTb;7{bmYTW_zL1_jpFc55yM9sMr-X&k~Hc9zyWyEJX{#DnEBV6%+1I)coEa>%-e& zDGS2)pRVID{chf|R@B(l)V=l+u1FIEbDh3CeFDHK3qUlw6-Ct2dJp$tC9ZkC`En>b zn?wWY6mH2#Z1daTqsrm&AOL+1d0C-*_oaEkPzmqdmpm9^NM_IB{!e3!m`$4s@w)icUWQ@fUH*l3P znP4uQdN3dSO2)2lGjd0e=Ya7}@{f+lDH}D0;DPTrLrR?CT3=hIKLxyStmEdfk;I!$ zGjvHO{xFLBDhIwKsY(Iq@SUR-iMt0#GJ-%$(;C=b4W-$X8>i~4U_b5`QYx{V$~G(w zP4<_Hq?|n!hmPfa5MQ4r8gwO;es9oBXh0g){q5QTLvO(BTsJs#(${B>vMS!QwL`IH z`h*Iz-vi&^RpY}Oz$tJjh`#On*)A);2yX9wCfyuCfDVD4Z$y!c;49KuytkF*P5Qr` zDA%}ScshX`FNKEh>JI-vsNlQmOsTDcu-BEexAKMgJ7Fuf`B>1+n?D!eAf0at~ zseaMA{^=EI;lbzmndhAEqpFBwE7ZGBVqhmX0RG>eCSM2qXhTIy{KTkW3LOm-9Ss%T zp+X~6go%lM2Mr5=O+pGJBfm$?j6=b~3Zi5a05h=*%Ax`&98_S1b_ZR~+gYGUT|C-1 z?;Yj#i@-VVrkD-Ecl-HfX}av|A4@;At1-muJ$TmWwa61#zFj{sw^&%=w5b0nYP)jX zuAn)UxGVnUCd=YoOuezrljcCWaY|*r&uD*J37*(}zGr=vjyL|%? z-ym}SXfvL?_yjWSc%+nnFZPM~a9>@m7sCv#S_(aEHV}P0h2!F7Q%qkF+-5}JtH)N# zAhua@=F31fQFLxA(PZ#p+Ajc-;!;%GM)w_xh$!)f+`9b?0QX>~wQl zCg6Q}i&vScbwzX^F@mAjh>awK}en>|<7C5SLb0qb0NcPP!l;{aUM{R7X!M*0o`HB5xqHOR(H>$64T*mad&Vhx^=i3&-~N5JY|g&J`_sZ>+Flc zrc&D!X@LeRiE1EH3u>V;2UUSHkC$#uqxrl|x#S8JBy574zbnP7+W#Z`HW9 zp2=AeTvJ85k#RpB{o1{`4Phx*_j!^LtX~a~XR4iN1_hUuz4dpX6B!TqQck4RSWwQlZEL%gw9V7>an9N4 z{A_aSa;UyQt8vh~qF%ybt2(D1$=ya-24&y(T0_)phU&5cfXWN~~VemA6N9+S|#$vFbd_=B}TEf9rzdD-Z>C zBzh%oh;e~OQ_!@$m|0GO@uR1vy_JHJJPwg%OKgu%IYR?u>zvm`xTm-FM>#PZlO_#n zbKY65H#yd6K=dM5EXEy$ig&g3%qxuTD?Zx=ybIlDQ6In|Pqm7A5Y^v99D71oH(F3p zrbkBAj|V1-O#{D=o)>*s#wp{%Amvy5D7Rzd35Q*6kw}B$AAB z;A=RyD_*_mIDaVx<4%?D4WP{APJ^z8mwJr%wS!@2slNS1fOAu|ktM`Mgs6?Iy6L%- z3;%Yjj82lF_udGGIFoB9h{; z!c9qhZH^`W^Q1zM^9{h@*g(IG{%v%+$H|;uuT|&FV?28yU%8GF=P~c6xv`-wM~E)f zWDq$pEw=0UzJk$aBmtJG5_jFfNpI{-_G1%no!;#A+)u*rbq8P!2FTs6Puldw=d7O` z=~FW_O>uY(6>^Rlb2MKJ+eGpXD7_wzDV00ElZ7+Jh3H9D*gk*xvA$Z+aZS85`8Ccf zU{ytxMD7DS|K;@2q0>HJBOj66FD{;4KiP@26T{-PUbC-=w_CHCT31yPL8}VjuU=he zxBM7+Iv+pB_L?Fny+K=;d^XNP%jP8h3l}3v71f3*s{j_Oq_??wdBQ6+FB^VU{hZ?M zXRMhi{Ti(=oor0<&(K>afOX_%adnkOBIor%Qtf;-=MMI2X+D&X=RGs;ws}F>Kb2X8 zAG3q!_(!ae!KnMzUT7z2XQBPimoZvCLu2301WN<6iurzf9rz=o|FwhVLmf~LcC$z> zUJ*Qt!%P5(ScjJgpXan*F7q8Q16XKggkV;z>n{1UDAk+smqauXuT&NGZlF}Wb*xSae!&T>SjZmONJW~ z-gSrH=oL{LuaLjjYfn;?En-=Ee{$whmGU0f+*Y`wL@rh?UBm}At)@*t`QtuIw zm2HfeLJZ|b`xL4pt#ZZUiE?J`VIOsjxv)e>{K)-kyJR&`U$8U`7-Ph^>xLbE(8_FH z_&sf`{r1~aSZhr*m6L5LpSlE);BhK-8CEBefpCbn(ex&Rd#}f_AKkUv_w}m%r+&i9 z0pp_QQ>V?({OXd1M*~-Db$!w&*zu#2Ut}TTnAbKw&I&_G)%m|pv&h3dc%>=aUV8lm zSxi{2ous=VzPTwphUL{4J&&r{ER&p{fs5(rnlP6cg{5VGkbfNeg8Y2w20(n_*xmmv ztdlvfgg>EU>YQ~lYB+G(Gqe=|>~hPkA5Z7_O)N^xpFO;yEsJ zx$#y5{mbUSx%#fh()f>(qMu8K!VL+b6cvCz^{*Vye-M!3&x`R$Zc+hOzPOn6be)-$ zusr4lbH8$)ss2pBE9hdZlZ*8FX14b!C^_gA9nY6F!kT0(HB%q$UiUZUFeM}4pmdI?W3G5AsQaK1T}==BJWHJ- zN%*+*bIU%rY8}R@gY=^v`z@8mI&B3?%9aWEz@uq@3A7ndIrJS1}&Is{tXi-ww4 z&s_3s=Wl;bUb@(MSpYyAXyy@MjprHj72*wvJzVAUy)DIE9P^}S!qd0=S|HA zZ+wD2z_I@n%S4gwr8_U!NX!cq@_P9uewGW?oBr*7#=&~`u20|TI+>pVM3DY(-lp|N6Oq*vb=9V8!R>h#2k7Txn8 zqeZ}AGUIrJ=YAZakV1r`19oOoL?y*gVkv2VXcJ zhQc%UG{`#nbo8FFo=9CN1()8vgxTKmPm*CV0kmon$x+&quvG=Wh41wtNSsc(0ZkvBIX8GeZ4 z6n8`NYDgsS3wVUrIE?NfuT$LL6Rk;m;Uw(Zpz z)(TTRUkAu!*s=!i8(AW=4U`jQ)O^A<8M=oMmTv+G^OTdZVA`^#WyiyeEf8ZqCJ8>_c)a-;|oPN+O&hBFdub63wIOs z`)a#cX+9jsdWG22&BE#;As8=L8t)if7hZhuFA%*6KS9!@YZ zyn!cCJKW(Y+4V6g_gBP+E&b|8>ekgy6qO)H^s zCwz^$ounM0BEzZPI;_iZM}2s&-=*i&BE@}LUQ?-YMksVIhXY@vW3Uec_5dwBM!_Rw zY_U4Iz;gJbA`?KNO8Iho`*~v32hoQY8uwF2A8+-g^s?zrtw{Juj9-ptO=$d_EiYXa z#%rXgsZnjs*=4T|uO6lXQ7g1gn!U#qGMdaF>#dYHfmjNA<8b5hxE|S)wE9m|N_^CV zUUTG%FX10a)sqr_D_C^&i*x(P{T!e(Y{>lhJ%o+J6vO(y+k9AJ8KlfN5kESUc{2V( zs|gW2vdg_Y!30!V%X{DIE@8b?%)AKe1bLe#1St=OMA>aJcq2b!im?R zK|%mr-t1_?e>X#b;zi6?2cTo|F~X7SF!QcdLHu$57!r-(qV} z;U@jF_-dyA-tdapk2?y9Lz7g?CXP{BaQ>iBhu*@)Q43`_tLhH`KjzwO1X!p+&`+#CUFb& z<+X?lmu5HCiEa1ga=FB+e~mbcP1>7dWq+DU9@f-i{&us+$!?NZ-olD?z%+q&7Fb%W zmT1A|WOr9SE6;!iDckq}%p&QbYQyCiH9DXe@2Wd~&-zJ)cizjibG(VZn9r4mGugI| z{1Lgrj$W6$B(Lta@;drTskUi=3v;;r9a6vnH-HE|hdXRf9_e&Q6&Z+9{|vp8SKm^c zW!^>!vEz_^DJT?U!|iw;5t%9CF66-NtXev$M?u8@-c^*<^%#A+*kGa2b#F#vM_@#)W8WY~`kS;}DutwRK7Zk9gJ*6Kc$<48mb#LWKctF%3 zyS3Idc33vvwm@IY(YCnOdUo0=Dtjl5dMpAR4Fi?1!^FbDx_veT^&S}p2`1^iJ0M~p zv#gc?77N6Uj7cse;SDwgE4Ze1?2ueg+vEMRu#VNQTpsE<3K=vyx*q@c?zjm~emXz$ z8ti3AsADc)8=#|m4-Py?+qh4lOtO1Mj%8@ztwa(YZ^J*aTmx9)n~a9~9x}a0Zcw;9 z!_wDk+pyuUlmxGY@?RWoFm@9mW|mazn4S5pPh{R`T ziphEhfnI>}JP1i{1o^7SJ%HT{c#_u0lyj&*ZgG)5=g!eSFG_p@?&H{`gE=zeUg23? zPW~}AuSz)wNB3*V@+ee90JPOvdf@w%G$!N*VB|Y)H}2z|nLeNHx=0LZi9_49jB16s z9ep3%sZ!sT*f3KIyq^)%Uf31WGko^QAhYm<^XmAW@Sb9yP*)wK$aK#C!|Y^R9$Fx4h+0ONP13WS|)CrbjO20@57 zMg>u5>^zNZz8ulbDPoyEykMktH3MWxoxqqo!=A+PEZSu%je)?m&F@Eb2f{t(PA~@ri@Z?z!O1Z2W(E6u!*bO z&$Flgu)0F~`ez0#hcRnv-}#>~asrO}BX;F_M^-E`j_wA%=Go)!!;!{^pWG2DdVpU? zK*H!oozen9TlkWO^k)6)9fFW;k&x3!Ax39O)0>C)TDs+o&DC#`Hkw+fJx$E8>@%Bm zZhe;>MqbdkTeYP3woR+_*xvjGFrc3Kx%kuc*1>)dvKOpXp09C+ScKJezn`e1G|2!$6YiwE6W?+<^8g5 zPPnT*N;h&3NVV3z(Ctv+lfLO(CzJ&Xj-shpjgVUY+>q+by17IzlXB3N(aJr!%q5Kw z*L(D0VVF_%dP4K$NYI~koP!>TPF*ood&zkqqrf{W@J`BMj%Ip=27EfWR~ttJE<0VH zzf_ZY_Y)Q7E}n3!ek=Xi*I)0<9PNSi5xd`+>-|OVmv@H}3iI&35+2p_Xd|6oCVqsw zz!+KhnbJEEn7x)d1T>u#p#2V_9QQzf%EBG#OgWw{n+(&kDN~ltGq?V$YI5OkKTC41PH+bq&1?RojpBCh2md6~R56tI?y_ z9y+y(C0qZ1#cfFMxb2Sm7}qz1ai8keW2eP{fS%{f{_x2}b<8>Cu)uy()pZE5jUyd$ zWW3Byfu>down0SPZZii4&fUM`2b!=71%)7w$A=aVcm_bAsIQJkYNag~IYxTCJ?Nx> zg*^Q?$g8X4LLd!C>_qehViI)C$YcO>BW6C5s;JFiZ#s##Pqa{OJ!81G~ za=y1JEXO7t!ha1EOQR|j%R0|h1#W}O^*W!l2aj$G8!>NwXbwBVi`d}2JJyjC2o4q8 ztuR0ED{bsor8aS^k7IVyq6&|j=XaCbeh&1{qOUET{H#-i+b0(D+KrN!m8y0)@7b^y zzf|Nkb4YY?Q_$BZhHTn>P_KViADicTi|7sD8L`zIgIl!afj(*Jn4#02;Mq%D z>}c(04-8M&9wsPaJ_I35hDyq_$wjuQN9#SpGxSedLl{p-N{WwFh96yh1sZ4`_oxJ) zh91#jHOgQR^U?K#AnEMh*(x>WE&T`AU=ZghyF~1`YcFgCJz(UT3K7?VuA8Z-)NbHt z{m82BSnMTSVZ=h>UEZCKy?LFy&A{qRS7wV3RK%|+9Oj2U-}#<>2c#piD#X{AXft~r zkTYbm;gytm#8=K=K5T*hialHSLGmhF5#|Q{u<@g;hP2>|-=EK8OwTqO_QwYAt|SxyjULx;e#t!wm#Mp-w%$0D>Es)oQg#yJ zgWCrQvjpx5*Y9!|%FJORfpi*v(b4AMWf%7QaSOhs)zmRxgLTyTd;2Z1iA&?lzN@uJ zstBH$wnue-!8JPT<@bJJavG0(2H%F?eLVsPz1H|5zI@%Q?OjWZ-QY-Kb=LUezNw-0FXT`3XyGy#8@1nMDCwlHKrjZ{*E>b=3S-l|Ym!V^2 z@z(wEkz|nSlu=O7!*J3zD!O`;z;TL3cC=`?YG2phUCR0qdE2g$3Zv_ji$|f9_#$$z z&vQ%^sy4f_x5d9cokv>j3-jT^9 z*~$ZkPinHK7~i5RHqL);Du|8YPEdM*iwF#&C!MYs&YfCPwvESAR)K1^)gI)NZ|uHz z2jXrpd|D1rl2orI`fcXtvngh`m4=#-hey3qMWtxX8mhD!euX7FJ(1Y9 zFoI`+Yu+gZZ9Q>geKZd?`9a7>h~|v^3(R4gi#>5*=-d8PA^g^sd@5j>fy-92MwBNU z>#JCb_GA@C))PMYCK6e@=NyF~R0^=3wcDK~>qxwk@S)PkY?d#F%f#MtFU$T<2X{a! z)-!$I6yhF8CV&oseog{vSCcNW`+5$lFrXTNI{k*!Y4IRi!9qGafTHa_F-98t89kmm zDb_B056KKoe_qmRNF{v(@H1=7@esWD9*WRzKf+m|>)z!+zzVxkfN`)g6Yu79{gSlEVv$7IxutfVj+5W^#~ok%Y;&A!4?GkPL6u)Nk-DW0;N# zMQ;G-TvjJ(n}|agUhPC=Y-?xEQZS6U9Z2T#C;@@a(p5l-5f* zASBe3hz3%$xNi+%YsD<>X!A=f;lQ9wAF8>;L4yswBB*1@)h9qtRK{yYyOc$W5f&eC z`zL$JJ@NVjumTPJwpC=&jYtSt(>gX1n@eIf z{nTfJCp<*7_gVRd0BCp2wH=6;I~QX}AkT_33mpg}aEERW9o%p2P2L`h^h?j-Q0}zK z7;RTv!L6!tcP1^oM=+5%nWa$W+TUJS+;rGo$B(93oKSVQPWE(Qj+QlL*oXZm2yf}w;z9$QB~Kp#iQ;X z78lH1IuT+}ozZ*Z>72{dk6HfEpq+wu7X}o-`TF5-*Ty!;w5Kc6)IYOcAGa5CrY00E zH;Nz3-8w%{9`}iMXq5x3-gy7aCoGdOgm1hqLc>iu%BH?zK+;W|QJZ;`z301pU{pnV z$y?((o$TiULw)o5Z19SRhzNqaLCa?zR1amTB0D&qTA<_RpQtB@T=f4CDCe;K@-RJY z%~GVWyA#X&F4T9CvC%>zKsKs+(^HZgN!7>XZu>r`YcR!6V8`QqTBB=zy?lU#ceEij zODD2;%qzgq<$h|&aFB5KW7%Yll)b64x966`m|qJ9Do$^EL9W6~i^JC0-2^bV z$zr^w_*S0f^24LonGg$ylcOX`B(5Co7g;zj(?>w$S5#3|N5nRX9Ld~feU58xT;)L= zOLk}IX=wdLKRI;EhU@);4}YsFOB5v?DNJT6Y#1OpC>eDO93q!Pr}2lYan%lPcWPKb zsWR>sHo`@G8y~(8>(tPH4e5jBg%q6rpw4cN9|axr%P)0p=mc3!T2Fl`nOLfD!QbUj zn{cYGs>xi*Dj$tBtFqB?=?B6seV#jk5qL;dU!RaDxauRM5_FHNwR=Xg$8{dA!JpG@ z{eY1C=Z^PzhRi+SgpFnkmK>GC3b9S_A;b?j>~oRL+c3Fx0#lU9QcuZmN~vW?U*~vp z1Azay{08~Sv4yc@Z=Ojx1ixIVM`ERQp^W{J*>Ml}3p_{y zKcuqH%=A`#i`to&9Ic8<$M94)nP5_Tx5~8GEH}*4tSkIu7&tXq2OLPXzfyGuQI=Ygc!xNRnzHJ5*Ze@3<}vb51V3oQhkGrot_so{F8G*QR} z#FFotmqhx@;{_U`3CI)ZD!Pv|^6R4~AxewEBKf+YB|_CR3gk)r?(i^tc)x*8?ngYR z!UDv#9;QZat_5>`hCAL~>P#L84|bpAYG&*?T48%pm%BKJ?_IfY1K7M!6N2n5REVeR zJY*zY6=#d6EX<83L8uoPY|-EY*QiKdUxM!2xIJf?eGJ%3q4nzdSj9m%cuKE8ViHQ< zpqJZT^iAViT#6D?`4r8W$gJ(^iW6kXdgYnQ>~-a2?)BKU(v?;l_`D@FiMAaNGVt{Y zzA$F#yL?Qf{!gmjNuH`=yAUYJB@H&48ilM&rD!}0KOnPgkaHNjn#{*l?rlAVcKZ)%xUTF=)rQF22f zH5);QLR7Th6SB4YEF{NV-!MH}qj0g(%XAt0S=KNt*C0Qryd8JL`7-QF%jRjd(wRGI zFKl&;2?CaLOL+7CFk~5vTo9GrpWbyUA<(gd1yVV*1_U1IIxin!)2ZN|5c=+XnHjZ%Q=j>e!7UBL#a=q^qe3wJ zNYNZyecIO4?bAk+8Y&=w{Edx3)5jHpyM+QC@$}s=D`uPMTne2w*W7LgK`ULfQLPSY zp97U0W1#(LZ0I*O$Lou8>HBXoLjnEaEyDfzdqsYAb@Za1x}X-Aos4#1V?kn8yBqgV_U{f$dxRoLHLqThv)F5Hb1ydoEb$5}oqn z2Is~?bmM3{by^{Xiv_~Yg#W9OC6_=NtkOh5cz%L2I$SIIv@s~J!S^{Qd_yRzc0N1p zvn9Mxs$j}YZ{BSS#8af63;t4U)SlP*_6hafWoh=^vrL(hjff%ciHP%1ElaqDV3K6t z%b>DxmFs)RW%k`UFSab&!6wR)>%QVcv?H6dwE%^ccf((_ zxa<{~X9i~WgXl?(B5Cb~p`RZmGXw}bLpdaE^pd2q2zjKrDZvJN?J z%3FnsGm;R24D}up#$(tdp#e%xp`dwq`UY0Wi*_XH&ejj!kSP7(E9^n?*RtkD>eFGS@!6Wm$XP3CBrZpQzq6E5Pw%^4Q9_4r1 zeuh)-0Yd8B1%ruPt?8okI!DJtzw^{+dXOSFL=eI0>qgg9?`!Ban|Xw!n^x>bdV5v( za}N7Histx#4^=}>ah+V4OAd__d`zXV5P{|m0tGO3 z&O4@ZT{!0uzp!xXRD+EWE{<2K7!x3|2zwulMlC%(>FXNdx%fn1xDnhOc0|}v{Lw86 z4SL!{y#HvyW|SS~g&WCv@4K-M${qY>Qz|*rK*qCqFIFdI?&5X5o`8z>dThU7u+j7& zLbu%$GAE#a^ffC~f>(J$(hs_%!DVf!2l447cNOSLWCESP0B}8<3HD2sg?`0$?~G z$`4;ek)Apv1~9U|t`!h=v+OS7Lo!Z3J1{+~2h8trpSF_SVYD3g;ZSr{cd?O8b<{Tk zc0~5~)W!|c6)(dYj=P56W+AwRE_hnXU)mWd z4F05A!|H83jE~}dYC9T9l|}Vfi)_W>${dr!^X`69R00a&Z zm8Mr%E_~$;YdSxXf4#)fD_yRp5bi~Fg{korn>GEN#z=8ZY%aB}3sAJT&#!*_ME>29jU%F)w@_$;U_=gg$QOb!v8r=tXWDmD_R@)T*Tjdk|=F1JHy;Ef-e*9GLuc3Pm=M6;cSX*Cb2? zkSmc4iGZ6Q0+X<%@!0$_ym8H0m;>k@+7(EA1aV^?agUcB6VOQD`*42qzH9oytR2@T zb%BIZ-C*l~0jxk%zkom=FzJ}}60)m_Vy$cG;xWR)+jxjdOxc|Ke^|D0z=|sr&)tL^ zPG>$9@=T}b6I=UZG=~i}XV(bcal06n0I}5PgDkDba4)>-cg)N|J>bceN~_IKQJOMg z>NKZKsJv%55}Fc~!0}{U_;6z#hln?O#@&g1gQ%~^1}NXijIXK)Gq=gT%4DScuNm^EX!t5;NS|L<=!6C%j3f98FN$ zRAK;(MEGwM6Z-y9_Jn~m>+!KyIfGBnt`s$O)bk4xL^(wdP@qa}n-vmq4C=2(D zk7>jyZ(rnzQzT6P27E<+dJ&Q=QoovcA&{JK|h6ucSq)=j8D`kOmB3 zGsFWu!JX4b^8IkrvW9QG12M|(=cz??R=$X4N$bNW$1xp|f&1|@ImToCUZ}VO4GZkE z4F<3i^uoSxCRx2$Z~kyT+_!OcEo1C4ZO44WgE5Fw9KqDFchp402Z`@3M%@VJ7V?K3 z%`IMSe>0dJ*S97WQ&?k)mKO`4;(*g;Rr!R}q8td8+0En0{e zILM0$i<2F4V^}8E_ReVK4=(DRZV=^FxcS4nhz@9)>Q!L1AkM@Gn zhXxw5n}lSWXSC*OE7@TaI5>?p3IWVw5Pq{mr8ZmYo>!Mq0%^RfQ)5eX$hLJZz~i{? zO3F^x1{+tn_nSQlG`3Zzs2~#Ceq&-?y6grpN?Qbv27R$uH&6qdm{c(4Dn=bmxM}pm zh8#zz1{}rayvG~3n@NFz`eSX50p<)T!GO2hiAOvzj)@+!49_z&SzhtF8SO1y%a}*a z!I}&!b1bxm{Uz3vJFD&sTGR|oupQZcp~&PxVI58E)8X1;PUGQV#fQOiR#l%e6SW~b z*O-{Z#K@a6bK&nFXzpzpjb3?(2<8pPiDg^5h>WLXC+`k6S?=g*N`xtCP#1V-n0y7geR2Hjnoft%P+&@t?i?z(txN2Hm zSR*0})S(BtziMI(nbC`kW@$+dVjo8^^D*K2z~afQMi~1_Hu>W-UK!~0%5Q3$D=D*m zLBQ@b1Buzh0vzWsuguIR)ribO;xEgyf!x(ywCssptT>BWQgUXYwVHcPirjx`Z7*h> zoS*cKbGu|uhuu=X7|UMuJ9*+RqfqvP++gnc5F0(^^x)=u#u(-y+H)zdZy?9?*@4t? z>N9CEC}6pl&~dm=+?qWp@`E3FzjJ7d}VsSHrnQG&ioOWZD&H;joR_?o*R7rKM^{-OxD6+qo*#5KO&+=c*82tov{?-25p~*`Jbe#%C?ioB2>PKkI6yJLLTA45s1^aGs%qlpEEtiv@>A)L-w6` z?aTr{G0|A{9;%da{UYh|bCVr5jLdFLk!td5&%C?-VRodQxLK;*PLtIIZ1e+I;CB}X zj-{Gv?jE+{THl0CwB#I5{za>>;>>YAAMp#dRc?Cm{pX(FXv(ea8kUBZiBo5&-w(C9 z#QZgz_!Da&#Kl$h_^jg^pCX-)hm=ekN@W&7g^(*wQBeoI_L^un~plUTp%)AhI{{Ylm zX(wrJyZ$okY17;0D|(0No29q%PK z>^dKFA77@_WH(10{{XMNZ3mis$__-U;ns%)^*>3DCo-;}mwgz5YpyiunZTb9*4*|m zW9`Qh@m*{3&p&CW_>02;Qnhwy`e4zCn^u1~c8 z0F8Xn@TK#6-aqkg$Y-Y$2NT*XEjw(=)mJ83#g0IL8je8XC$B9FX2>vGFjg3h`%Oi) z*IRRg?G~nTOruM4+Ay(R+ndrqoYPU|mqQnW57jvbh(rUN!4Dz~&gQjJ#`%Y={{Tad zrrR`VTDIZ8?f&yixusW9Dn%9p8Uc80E>A40RO}QOb`G80|EmD0|^BO0s{sI0RRC40}%iO z5+N}K6Cy!TGGTEB5ELUqfsvu`6*E$?!3QK_a?#=OQ-T&lvNV#Dl%mogHaAq3!qemb z+5iXv0RRR+0#?&=X)Vik%lWAnR(?i1xN$Pt-g&0vcqu_c;YQ>B6)RLm?KjLs zYaOxApGr>2U6QtIw$2PYH*`;2#2!4k&sx2>+JW}3(BW)8+IwJXKU)6)jBR#$k!Je$ zL0iBvo|Hz%wrR_@ufne_i{&d&Bod@}g-1;D z)}3G_#y1aSmk>r%@dhYdwYTj;OLCUbzAp?q%`NLaqrG%?P*AK>OSsK$tdc}&-$`k~ z&S2Iw1K~kIP&rm17^6c_;xNa3VNPT8q?R#d_>FM_GbJaeq%`Yui4cNSrD6b@-C*r$ zHGxAgYd<@oF9gB~0Q2sp2?su2Xh^1Q_G3`;5_jOJarcS*yQw$Zh2TPfD=5l(SE5_9 zfuy)rl#I2f-7MlMZzX;l>R&RhsjuH|qoP2}(%nxs&R+57*<$f6sh4)0zVw1ZcYDN1 zkL5pEQ65g)>}6X(gL?C!bN$POCJLnm|s!8g<3E?(qn1 z*EmWi*$b4O5yUgl$)UFPmFstV_S1vA#ac62CDtW67y zA=IlpGuf@fW*5jBF1$jCGb-dLs*TEolfx6B>q_(_LZFj^fKJSN3%_o zDwbQ*Q%l)JG@-6bLmO3Yxb^QZ2}wgt&WwcBc?2Jee+O1X-tms zu#x`&zOMG`n^)6suB{V+#}*ZY^2i8C5^@z`vUaB0a5nOaowse=f#sgD-PW9X_Tj}^ z*(Z2ZwJ9k)^6@<>7S?Hc*4ZkDcj!CKJ8D0!zm-30VvkFCEA?tiW(a|q%7Y+ftmdDmf1S0CzgsPF(FP2bpznjuyi%|L2~P>5mnsUtmV%IDdUGIi1EpQxc|hqUi*%M6 zXy&X_Kc~j6JfAOJ`WycMezwONHG`)$ezfMtO5JfQYaOcG)THG}+6BB$HsM>Nswe2s z@`A@^`c=AQ$XZkR*Q6@Yv%E=4vdCqnF3QIBwA^A!l%+l-j$#LVRo%V&kdXdkQ{(V7 z9!sIXmBaw5%OU1uxtPaOHQLGso)kB!ob;=Ekd75_ll)0P;-zc%RxIO{1R*{o)IsqS zks#vsxe8NO;~Zp?fvJi!3hutU&<(|)yEpK3Bc9TQ5b|^AP#c}^{36FuiM(CfSvkr5>`LWdQ*28 z5RzU9Z3tR|J4P`K`q2HPr)gbn4^2m{^pTBBIR`L%iHtq@QZ{AMQg7OA)udrK)~v`n z{{V@mo7y%`zHQsYpa~%p-{J0xO@-aQ;ZYW^5tD{H`>DlSC8%s-En*3A#K2ZVF*r=b z&=>Yjy0;}sE)LF`=ayjj%`tS^0Xd~@;)N<(P{kj@a2hDIx^1sXSBmU6XmZtz(oYeOf{(yf%JR<-8<-QupZQBLJTp+IEuR=#E#{;h2U;68(Zqx) zSf>ci1OwMWM!_qba~?fuo0TC=t*|pnx>A(&xNxmlmybC$g*J_k_SPG%n9BbEnXyHC zHA=Q$ag^38wlOviPdBIbtPW-?b`uqfo3u`i5?~H>pP6n2@gg`nkEo*Ki^Ccxnyb-L zW1EFTL0E0X4t@2I&b?{D(wk4S?E%h^g%UrSvlOkbZ1Wa-L6_RN+3hf&zqk(K2^s=1 zVIKMm+ds5667sVx+iZkkM|6|L;{u$&*gjn|a<))ZZC%+YNpN&Zfyn!-Vr+XIu&0%? zZ8sKH`=oldu%$VfAAoDpf!Y?f%|C3Eg(J~a68dx!p`=Gnbk^8^XImk+n*HMo*n@*T zB_qOmQ;E6qk#S~D?Y7!N0A!~^0M9}x`*#qPqh_tZ@OlOyGR!BIlto)*~X$rUlc-Yot zjI+#B_UJ)k)n^i32<;S=B|j+l9}4uV1*ulgG7I;Tduqt0dUE(vdok6v^4s-_aePO^ zKW91@9!l(GI`pLht9I~jI>FHO_|uzl*BeufuO`%-3PYWeCs86LH1^fByHb$jLlZcl zPxYkQZ9v;r=vS+WkqVKY!kgK9B@1_Z2q+^`c~C04qoxXztU+I-1PTVJGg!el!)VQQosTZd*tVq*Nam2w#`Ut+iff`P;S{m!DuQwB~zD;UwL1Buc%;8Ou z+G<)>KoA>e78IPd1FX=xTdpKB&=}ILA|fU|!{=U{^8qX&xM5fX;_7qI(~1^oc;Inv zwQx9Km;)jF)U;b|B-*GgK^vAv6oUr|6pgESw3Nc`6qMeNWz`(AJ?HB>`z6a1yTqk7 z^GDV!YXwpDm2TLwcd`gVo8rS7z^hG}AW@zQ`iRZ<5wZxV@g`AcABk{yJq(RX8D_F(>FnfcVcV9&jwL3=ImiT?nWbgk9PN-a+k zPM+%j0ExCDWtIK<6YQS8V4&v~D8uH&Q(02leIBi8%nuo+wtJ<(y;iIoGH5#5f|7J8 z=Tb!$ZP$&>GSM}^N+7GX<3|t^-Cdch9jAV_*J#Gkw{2)tpHzpFDJb@d;>t4>{{YK2 z-~KG`{{Y6Gdc(F|y-?mf%3)3b0--&AwVH2aqyEmOl_q0$ z5>9c<r} zLB^E46*}ai2Rg<-Wj2eXe+%u<@#`$?tTUE>H-;AFtfMP4%zm28VIL}lx%hj*_nlZfG& z)N?V1{8q`?&$Oi4u<*s5&N9DZ{7G{d3NrwrgU7>fbLZz7mn1NsfQom$3Y)x5D0D ziFD#)0n62>@*O-4HsUSJE3qS5V{nw>WlK(6gz%4W{HYhJYz^wL`{~fi9(m?i3o@xg zX_$!b#Xsy7=}QHRM$!_>pBbK~5BSO`KJ#9Xzr^mJ3TI?nxOcARwNGKO&-9_gQxr+5 z+=6juE7reyLX*oX4**CS&?=(XKsnNZ6xQ!Sl@^>6l@?l0tY~i;{Y5Pc^M7A7SEU}z z!aQic>#1z=LFZUd-e?B;f=Tf~ckpH`G5B4??=O0>DSMa{cy`iHqZHBUZs`BVENZCbf;cEF92 z7M#I>3E#XCm;#bQBu!+5>8svyPy!4J!(7-qKQ1b`{bq@POcG^Hqa$W9}gN? zy1EUJbcr;r)5(&ZcQIUQJ~Z)R*u>|n&p!H6)dfX*)-^1Ekpit+P3XFDy`^X^Qs)R! z-zSH|LC;z?ZfuR7y^!N@>jw0!6amJFI zKCvo51BdvHGj{dHENrDpYe14xKE5=&x7m0whMQW}tOE)#Cx8VgNfhO#$+s$Q?dfzl zkO;%=bLx51-)LXAI24r^4;W8=UD;K;3%zv-YTZq#)P$`{jVE|Sjd}ibo12c!+hx^Y zK*Cd|T-D+HG@Dynozb4l3pkLTQbj52Eu`8KSRrd@l@%pXo{{sTcXp?*7j5dx&WMxv zK$=~*lXj!hJ4^lDS$L8u?Y(zw+m{ZwRrg{Ne^cL5s@95*aZT)&%&p~OTzz%?she2r zAOqvhq>6z`xmyJ*C$e(Nw~EB21Ne0nz5}!=$8ba_MI}m4GAnqo0OTmT1bgVf$tNl- zx1Uvl;!;>`N_IoF)2zxz{#L@FF`jv{#vo?bMRA zSFd$Mu=3VZy_2H3%+8;HRmGyx;vU??Kp{aeNYAna;lw_&D!AA_k$Kr@wx!B}liEtM zh&;IpO`|sZgtYpxHH3^J2kSMsVHi4qDpId?LaGfVw4DYe{-0gcf!afFW#EtT^PxoP z!&p=G^_?B~(?!t=ULhG6rKLkbN=!*TkwV=XDKeVqVuL6=^P-Wd=S4=7%#);3mIWLy zpr$$+C|*QlMPwxMtWE$wT4|J{mLpIE^cA}~!Rc6&SW%d-NJ6E~&I4QgT7$~4p>7Wa zR?E3+_YK1K#h^mmPAn&UkR(WvpLH*2qxQjZW|c?owtFxowB!a-vU~OCR~Bpis=0D* z8^OQ1*|N5^%@E)K=kgV@HpbiXjd!2%X30y=<3<9<130*+GElrT{35J;n7+F7dkJ&* zX2|t~KtPi{^>nKi)bbp)X&J0~xKfUB%ZPjQ=S$jaS#3#iu%INT3Ck5*BhVC<9Ccu) zvOf%{YI%28+R#?jtD}1JNRxzik`p;)Kl-WGZEh|{5L-XGdmU$?jSSK)wmYb~_LSkb zDFgU5&X;gN){4(M&a)nCy`edzC?nmM=TF`r`E5tU{{U(eNnCdS04jAyl5+a@no;*2 z>RLHYl(f%lN|lWBG`ES#Cx;bon;r&VxqsAMYVc2R{+;z-_!&pkDw zw*?!kiHLfO1f#WhH}n}Zpc?GHHqg6r#BB;!XY41(~1u&z^+>PvQ1js>?XYx z$L?A55}fv=yH)w zv2(WGUA>B9W`_)x+6iwV{5-$gPPEO^SuD7BYurPMonc3_%Q&9#UWK&m4Wv zc)M~nC*MJ}S}Ch{pI4;1h2~`EJ{{fk;;gobT8oNYB$ymr=T5m(Y4jwt)1}0@jdQ%= zAovY3*WpcW8f32Br3Y3uPYfjzJNZxp#Y9j+_s~K7H6CR=qmo7=OxvvSI;4g7^FKPd zxx?Cj55RwVN(D1&-zNB}O8i-Vb#UC~4;cFQQrF6Jro_@M{i9xw&zbI_oSka}eEHO* zNuu(^nXE-HNv<;(X&YMG0fYcjqn=#osI&l2EJBg9HwQI>``vrIC^ZlO=R~ro@2p8t zB>P6E06l9PCxe|#MH_^i<^+n6MOj{|$+Wq%Uv2iWIf+i3VM)#;c7G}!Q0=QtlDn5u z0@bvw0CYzqh;plqr{rap%@@x%yFzwtunKVU3Ls>e>sD6Q?_p`C(%L;{yjg?qKPvl3 zY^S%*I#j}jSh@T-zA2~1+u5PQ&8Q@65e9wcJFC%~QANrTynPN_lo`d{&)=mhb$`I6 zATxl$ZBwjjtm8cCdqFoL>t`B^X(SXXKqQZd*PR`e3PsK&;$CJ-eQ)&aY>W|KvN&Hn5<*7P0+K2txcmeEkrxUGXQ6S;U6rwd0w^$(5L$0|w9h=dI`~rVZdyVT(n8a_YzYBE z1Ps3qxK_=$KpXa(2YQT^BT!HC3jSJxdDnkg^S0kxmi|iymY=|skCfH7d0+izkmpKL zsn%yL(nR8j;UChSzs?8ZrS7y+vaSa41oog(-B=mvBRbwKSq}O$-vY6k4n2_MD|2qR zN^+XR_^Mf)&St$B_OMN4pPfnn02Cc{5R@Jn=4wpW1lAexq+8<7GZp)-x}bK?Awdr> z3RA4nZ+=X311e(uHs#B`pR`)IZI(oD0v*SPF5yz2B5l%QaI0yZKk)LR&8L&LOt|6Q z??%wxZpj@mjNsNCmAz7$l;C~95`@oZ#*uprtd$h4t9g~Sb0SYXvZ1-&w&Fr~T+M0W z6dGFG$8653?K)$e{c%yV0|Q}dc_F=4dLDwD+1r&A1P#ytLcSg+E`piellNL4QUbm* zPsXHCSQ;Gi@2IVO%uoLSaGJS4$NE*T`~LvzGz}WP+1oPBYeI`^oKcnp(i^$i2}-(R zNUySA*sogLlL=|W!B<#3@~n6Jq%B^^S7-Xs1yTnfs#|@Okts>k(01i9KFrr2EfW+s ztAWr|6^$~^w~;;Ome}obiWh}SN|JEMt=otT{vnjoh72f1SWj97;XUGmR}Jq|*PSWl zwDhD-0Nr4)wIKC#`cZkz%8bc06pNK7@WQJN!-^zxIo34xPKKLRn}It<_4KmHxm+NZ z6adHrl$t^xJ1jUdTHC!>82+utx6@8;@kk_C*6r?LTJ(&5=y1v@Ca~33F;ye+g{5|yL$Eq8lqkW|~qB8IP)SI`^ z>n=2{RoPgc&-bGHSDU@!vS|k-$xenkbDF*Mwi;8ZUIx}s3bAPu%95^Ci1IpAR+R>u zbEVT?^?_GW{<5i*&Wcd~0M+K1qj+7yw=l`~R^{@QrD6iG(k^`;8)%q6>Gh(f))s-G zqFf;p$pTFc!!qheX;fC~#8qH!vs?&IARiwt4blP4uy$Nri? zZ#Xd&l1H_j5C^)78nlY7?7vvPkSLV>Au zIygXA!h>aUl5?I_fl82-=kTX5>~7a=w^UTHfC_#Fi;1#s^bEqA;aIK1o~>W$ydhQh zfTlUbRv$`EloNG*o~BNeH%@!zzVkg}6)D1GL8P9pEnk%+l<6}iH!=6YL>f;klQwmry5A@K;_@ck#Dmvz?_S4 zahxJ^Jcrjhw_|9O2Umy!RhP%7Fn!f;vYEiksVn2ij4LxIa{x6)x79Xq4T7g2A#A|w6Cwumb5#GbCPjsN!ixwDxbYo3w%&LtTaaMiY{%Cu8QU; zyJnTCBSHlaOSVb>0Bjo0(;{;_+ug9({RC;Ps*(J z#hc1ct_{M(<*r6MtI-tZOAwh*`s+o7E4)`~rn>i06j&4d+?QN+s#7%FuHP08|CXV`2 zMx;_ym|PB3_I_YYkUG_|JRWnR3%DSU_eEaq zrT)+MgT7G#aOKL5&fMguTvK9Kg-!&g2*Q~;0UA-++d|d$u9^wJ)x#UIoTmvv%t-pq zm2A#wTO)WunNLh#+m#ep-M6m|(``-#M@ntKKu!kP3Es%gGM#@)a`we!Cge$BU=%B< zig|V`Q+H_|v8-6SnM~>{e!K{gF0GS?+Rr$oTK%H+?W=r1C`yp1)Ig@4x7r1lgDE)F zi9uIFNBvZ6FT_52GQA;CTz>L#LU4~N&jgIHvg1B;NL z4EBBh09w)!AgNy}J0)bg@EEv#f!|0{V5DlajZG!%CyR~{KtqQl`>D$XL(et zD2@{p5xPRh;fmdD3joO}mdISFABB1?$oGz7u_rkZTIWEvtw$G)6z&pCA6XgEj$G?H zwA-6h?(EaF*m>naSF20O#$b0O_|j3bwiV^|vx@<%#QLCnNU&UB#*9Ct-s{8 z!!2B?UbRUumsR~~&7X8f3xzI6P-DWRIh1hcMaiS)Y2tXW!u)7fN8d=eZLtA9v-*7L zS4!=X!e?4y&4tCw{eu|}rmpVxLzvQE#OjtkW6e(&^``7$3WV_{C_QO$xL7;|G_^iZ z^4wW6m0&aD){ygUxe6HY!V&%d06J~Ud%seY z09LfdB^e{+E9}IrPB2$5I^5-!pW43BR`4yyNO3O#p**@(!Ar`NoVRBRSDwEiS9e7V zY^f+Lf@EqZmr7l&rLf$qg=NL$;Ea=(T|M+)vbedmUCtfu;^k;clgMO5Xa$VFTuJ)+(vm@}>jLKr{=U3vzgv%Uno?6%N_NpK z;mK#HT9z6>$Wjou^% zTLenm?Ic$b3c^8cShdb+EjX02*#7{&uJirs-r@JtyIV=d-bOkqrC?$;{8_IoYLlvTQ9B&ZINQ9M=aG%4js0nABIpEc#LyrTbCG9f6ODzhZvEOO$#=gAq|kIiVd`k4ZfZ( zzWP%p;U%I-!H83(ik&BB>f2|m40wQ##))Lw`Se!^H ztH9IXB^IhJ=h~c!_zDf|#K9Q?(1J%w{ryF1PN_NRQ+C^2Qr)Ofgv<;|QI5)cx%gJ? z#o=wl!(k{eu{sF-eso>4d9_`O#V9r%1$c1wW2JgwwtI4-Q;Eb76h@$R{V0>fN!FC< zk|qchC{%FjG_SLsc4s#K08vs8n|_YNnJ%r*ZL-|uPqmI3aY`uehS&O$P25_DTM@jD z>UB}XEz;YBb*vbq>MMgY%o^nw5RKmfqieLcW!^YaRhm3<&snY83IU*m$w=;^({66kl*p0w%C1zAzTcpPx}!5X zN6RWM+?-A&F)478m8UqLuKKpwcJ^46bd0Z@J+sn3r7zML#@47RRKk1dou{*zamJCE zP8@&)i65W%q}?=7z33an1DX}#%A90jPVjb#t={ruMNl^2CCQLQ2JSLY*0rcPiU64d zv;8UCD>eG`B;rXLO)A8KmvMTj_PgoCT#UoSDO}{545Kw1qLXp>b0)ni+UEqMZxVTT z)*L}dbw4@}Z#Y>_70!Z-4?Qb&Ev+f(m1#+jWqxEI;-{@tfC3ybOmQN>$RCIF_k_%9V85Oez8gIIL$S4o5mhJGBrM202hgv*BB( zLCr+v-PXNe!j&OptalIZLd^Uvh`o<~7etg^~MLVaOOiSg?}^^aIor2-Y~ z(jHr!V&o-i&NJ?$T&@sYbOw-sB%o8a3s7ekY$Mwp74nKoZ_s@j?Km1sXC}_0FOGF+ zy9?wJ(E+}4u2J8WZf|Xp3PMwO*78CL<>6k3vMd*EW()%AZ7YFb2J%#M@9^%dH%U`KB;je6f=M0VMiKnk_Z?{8Da5R{q~dU%(8QmV zSECDXSZR1tLU78z#Uj$@xNfjUT6dbb*_QXR+7%(gqVyy4tBY-zO_xvs_S9yGabKvxy7G5ltlDq1Ta;OIfErbl&T>yb4xYr=QA} z?Xfn`rC{M#Is(z%>K)Zy2S3)7#DkUvwt3R-ZXSfRWv3O%By01h%A6%3M|MAkOn!c6 z8tRWbPjYhDR_zDbHNUt{N3xD)m1J%BGa?R^jUp2nC%Ul~Qvg6n8df!;O0=!YQZg7p z=SqF#fR&8Wo>YW~jHYnq5GhxWI+l{0h8*d{C0tX7cm`C}%z~w(5izc0AIh+`JYaYI z8n@yQL5Y1mVxGPPC6E?JYM} z?6y=Ezi1Bb`c=iM)TUMJ7YV^hJU$dXP{yR@gr`aGp}T7V2$MYM3q|5bJV~WoTtZSg z%{zIAC95wAx3Pok9RXexlUegKG>5$*&CAIl(W+8;9~w)qY%~R`cWz^Xq14vnYTLY2 zr9n$;gyD{{GxDU~UED3j12L9=+MEn#o#DbqNuj+4DB;u1X7C)8pUStlN;#mAD;E@h z6?(-JBPprD8vBJ{VF^EpMKd+&uifEozRoHxvZ03_Tv?o`^#?Q&%Dpje67e~w`%>1* z!(?Q(lro~H?k5?Qm5RpO*wmHgK;>90SUcpLmJ^z37kgcwQnsNEws?`HC|(h~-i0OR zgks1EjepHMaLb8W*h;r;t4K^jW4}LrHs;mYyedsv=^ zy4X8K*}1rIt9pk1d)#(r1J8f{&YFa=b2NfD;$j8pT z4R5$%AxU3xpXo{p#EAa@Q3eU5vXsMZ!d5YB8rBspAgwVF4sdz$p*aL1B_^7{v%B5o zp8o(cRPLx~l>CS5LkrxgY&7D6RNP{3T5T=csG$$zaYa*^fj^ZGPqIuEKy<9+JSq`% zm)!Olx6Xa~RqM9)O5c{!-K=}$=S44BEil>1N|%QUPJT4v!^&|Bj6kO`-aa&J?OpY0bdZ?f=LbK^i}x!@#^(qoa>4`( zJBHH3E@Hy%!c+nJ%dI`M8h+itSwoIuFjpu{oih{qQm<{U0&Wrq1Z%-Lr1w(adeO8g zx3GZ9aHYcradq&guC4BHJlVvAG%^5@%SoV%+izG^>ldM#`%36$Pya|6p97E1Lpy9*9sGceM)|=WWXBMrzgpSmVz8d^!IL*ce)Rf4all^^> z{%H!hY$0o%RUZDDRt2@%oX5NBXkCQl+Vk$8HMy7yB`4ut>eJ&(MdBNAB@pXmev}&l zNNAi50=^tX z5Irp_#(1()O$D`jgpxZX5m?rwNAQ|OqfZd66qw~S5}kQa8&lOG0B?u%@uT*34bp5^ z!i2;eX#W7=2Jae5zV3Nfr;Xc?%{ioc$U`%}b-& zRwW{QD&p?t^qt=loClOunpEPN2};}`jE;F?JhK$9y*`X`anJdQ@9!UxinRUN8>X$% z=>d5ZqYO6u)6~Y7rkNQP=D~N*T9x z0ZV*g#19Jn*$Pq=JyVnFhr{)x7s6GD0gJAg(~RempoI>e*y*4ml*W%XNLT_VEq(On z&5}y3@o{zfip*0tM19+-SHRGUQhHUxX4Ok=+lg9Gs3ls@ezZ5fu_e?gE$<24k^0us zZr5X})wjCFy?q@y=hHbk(vTs?)%WU=PBU*c9Bo_Dp@l=II=Fji zvXBzgw6v;_9ZImPRVPtRzGTCA;dq$iDJQYsA=l%>-C@>_KBD61QjbLS^3 z%>W`TvQxyG!EkbAqEMO;q)TL&*3HZai6Rg^L?P{<100Z*BIJ{Zd-_?$JCufJo8^Ux zuNfvu-NH|9aiE+~)U^jGSq=x1pNLOL*`9DJX}+E1oFo~y8E+?|{{Ze0I7mNilPlSV z+)DV-!a$;m;Qso^Ytv22KALhuadzWIfJk1N`pN`^k*rLWGGJf6CMyKd#`N(owg7mJ zQ%*%>)xKjGh%rQLnYgFaHiEM~9y^KG8s{Z|VRW!ZiHv~j3QV8p#ug6pM;pmkBRxqV|r4%NK-#hVp6Nb{4jEsuH zEGG(Hx<2Kc)pRIAB4xsanssTE2JR+{aK?)_mS<#d!gGZ(h z;jXJt>zwErKu@gUEeAj*B*!8@oR_*sIRx<24~!|Q zMji%ax1wJdM5D_~&#wKaCz+oKB2n&fuAm+#h2QY{_Yd&*v{; ztZG&rLR%%@jL|^352Ka`L!05(Q+c+QT>D&!gQFumz))8WNa+ksn1ND2o-q3ON5%~{ z5(1%BtTQNKyb2Ih@TDYTFhZM zn0|IOGv+wy!Na?ZNYG)X=5Ac7RI-c!H{emShQT3tB!Hd?WKhVzB*HFI>OjxggfuIA z0GJP==<}2EXqGhMC)jd3BTNC1Btx-GWo6Gm#H8r5;H^SWq}>MK?4l}g4K)DfQLXJq zKC*J5CJC6s!BN+)AtsG`d->zroCqdxreSYFr|xhlFp&E8;_?HsAR0w;=Ma?>?^lsN zbr{IhxD^@2CJdg>=`+kSuYdZ&<$U;R3M%cwObs~gk{B0n)`RB|l;e9aL&+VIMLiun z&lq{(v*;i8F^n8>fx7zl$lN}cgk-_zcpcQ=pKL42m8(7%(m1`>qY$o6D!tYD4-u|tHa(hl{UIg3Ytl&Vb& ztxsktCu=m|8+>NO9WXTn5mmP^VAqF3QcAVcXH%VG3sx^Mp6aC;%-iC8Go^Q8J(**6-hpJ3n~0;s%Tch3H>bQ7i(YY6u15t9hr^2u0&m~fBRA%!_Wc-RTmJok|A z64#P7i`%w95^Jh)A`(5NZb%IqC^iFBU!yg5U{K1iD28O{l>|d##^QLWUlz^-{{WT- z4nhg&o${Fu6M!Ndw+c|*m19@7=PE4D3@^ijh^7~>oU@AB)9{4n0 z(CO4k)7Hb5D~v2jQE~;Cp9}&u4KF+IlxUJ!P;$K^18~OUY&9%YX*Sg!C25F7PL~f0@$=c(i8fnNRx&Hv> zOFat`C)A99VKsg_gxswBGao0EF16notpyntkQ^-9fLxxJC6S6%4(H^P}UkPJg8 z;|c!cRs^i2AsvD5!4Rv5fo*DkI4I;S#rhX^?x1n1&VlQtUoD0qr0|e@Yx6mw9G2Ym zI(cy11W*|}Xk+jd%k_aq^0q&W5N*1L+k9Rv(plOMGyS~UhW8QtVH6HOSQcH7a{2YY zoVHzOagb3~$?+H`DwmZ%DfVCoUgj#h%N5TV8s;$p-b`&Po24)6`+t~EUuiodB`9aW z$oQ(^3KNKAj0NUFDGX`xkB5Uov2!pGJuf6lI8Go+6h#tsc<6fmN+ETE(7JNfdbf=c zDaGDN=*9yA4J?_KL&p})hSrSnYrrLi41)sN;?pD8a$}$@h8A3)NGQQD;eVz?OI2pE z1g7(nwRnCyv{fkyV>ko_4k(gJY)RqJbDC6dp$>q%;qkl=t9$~1PfdQDEgit%nhzH4 zql^aRKFCBvCXS1-c3{DORBbMV=ZZm?pM^$7Ll@sbJ*MN6lhVb|PB%j2AAvKI&5cY_!_i^*w(BnNLu zj6TQ|=*qal1^LY;3LRB53de^nXNbHehD3f#5au*oog-XZ^Mt(|M$`;LB9}D|F%BTO z2&e!6bk{-wJTa6t;Iy<>OWHvWno3Yv8qqn!kf)Cj9Iaq-Gy=%E23cTeQp}W8nyBb1 zF0R;&?Y30l8z`%DP9VKyXb2+hxsl#arU?X3h)+Sn?E;1}!5c1DbrFkbT{wut zo^_kK6WCCD;3+c_H_7hHksFyKXquVVoZ-WatcLv~+aeqUaQ^^9_mx+9KT>=BV~T~3 z9&#DXSI=MF;RWL^&+5%rRQ~`yaV{fYTK@oWzNG{`as(JG_2Gc2ka&M=ClYs&&SMj! zw7>&L_25`)j^5dbG--w(U|D5Vg}o zJrss!si@HTa~{~}7QiSan%&d`!3JJ_W|3<*CSqQ2R9S7*4{!?XI!qWQsSWbXh?v>q z9X#{oLWb%g$`?}rPHl9Nh(HfxlQmFf8746_m0C-T$SB!%aJZ6VyD+mPrkITcZWe7^ zCG-M~9Ls*`kt7Yl2S47p3r1kWak(aNR+c+|%o$Vsse8+XPVkLf{4Nk0MsjG`$3;K( zzZf}|6>O>h0JvKUSSJkMT>k)03$~Q*KibKjuya0{vY;+b_PFKKdDi|I>^6WU?T?F#FP)&)xp-V)((x;+7=gaNEEct&_vUXM?wSv z!7nrGagikQR;-I=h$q-2%&5bZR_UkbJl2cOdvF76@Vmki-FyyRY!_4j08{>eCkFYWy(q!cq#UWTDCSDaxPrQH3 zn5ao_`B;>KpbR6VR2KgL%z^?Wq_;FO6L-c1DB%FiKu@);%NZYTusLZ@3cheeoiZ%1 zCZuX~I$ZgiS9%QsZf8UIkW^EYc3b&UKCUb;VZ_Ad}DbN|> zD+LK7`FXg5PoU(6T7ivxqQi#_%48VkSK&Rf14WXb55^=77W>{0ICX<2DE(zp6Qhm4 zIKb{IZ!bny(-t*(at#tNV1@<03@KFbuZ)p0H07p`AB^O_Pov`@ff3ulr9%smAOd8} zyzCh~Qir1pob7`04ocQ6e|X@56u6_1Vc;;A0I*+t8Ou5CF_DgGE`sw&r7E&=Z{Ro> zAgbfIF=ZfN!;7jzxvLYB>$w#PBEW$NN$lcjYi~y&o4f=?PHW#ml6bOfmzGIlALpMi zQABM9agXjYvWyIJUK4AA35}N06l4%;EcD^Ia%|0ib*yKQMSaF1l19@PMPh~Ka%ccd z?qqPJTgmNXdjk4?v#H|XFxLiF1@D$G`g`R=TXrI2^M`OCeE$HL&i4fKf@rWFJu(i2 zlHzg+fr_7J29}4HMgxrYA8si{CXNgX0Fr$;#(?mtZm|1OrnQNsU%WNWfH}z6k$zbJ z02Jdy-ID$X?=0==k9bNV)8{y)x9N<~3~>ZK2(AY}C@r^?;UpBTc=iM0#V2 zL9KkVW;yDlvr%X?e$mPXP+&O=X&%sg%J&+F}okL_in_m~@o~ zC%EO+D&Awj`Oieefg)3L;&JL5K3wQeiNJ*zXINYPpWx#e+%LoS!ja0vBy+5UJHRK5 zWMx~u7{wUXk<~VF{njys5=VdYCXOmE`I9%Ka7))a?VgdmoSUWBIW&=4^NtPMa+j2g zv-)vyj|O=#BDfRAPBv2xn~b4MN0ttpUQ>B8{{RQGOcUn=Haw>xzCdr^2Tj=C0C3x2 z``&*RRxzRVf&hqV1DLL{X>Bl_pF>YhTTvj4W}d(-G4nk2^<;q(sid9yWaEs`P$Il& zi1CkU9<(_HkGF>nO8jw5wnZm5YQs?Dk^;WLUiUdHJg|W_0wt5kd@QM0EuU~n)*EqA zl0O+Yq7-Q0gJgWw;+FjpgH*C{lNmP|E#Fz;ID7*I3@srUJDZIY{&fpDpEJx(_PX$$b{&O=4V9D678?TR{r zkiXyNG5onidSzyaSsxh~Qi;aKYaVsAV@G!rSY$QvNhYpsb`V4#M)14~1Vsa^T$7%- zVfvt55_RRNhCN>6^bW8uw!fb zn~czGh@VVDJXh-oIDz(uOnt^JT&06F9XZOMBZ_x;?0;h6dw@fOloq>h#g1cA(*^EOM}eX?i^_{c;UO z85~rD#;`A{c4w^7RU&)H_MqL@{mOM|ipbgkbCDkM{cz!U2=j+C_G*;`AuJA*D;c?M zI9CA42$D<45zLSZ%H+)mJSHP6miKo7wTjg54{pEW8L?WPTXBk$^yxsrZWj%*2-Jw0 zAQkM8-cR**1{0~Mr1Oe#LlF8n-2fHnb>k39=|`7Y5)jFS;1dDJfIArB1f}b#oJD_1 zzx$gH{z8@$)UbZWQWOK12*RcH1_TOd3+Qw`wjr#Uz!5OmP^6 z3xwN=2!H{P3>^SEVlprdCDF!DY}V`kVjeGtLFv_Y;sGF^i$jjJ`c_unloQH@Xe=7zDzUBB^b12n|Q6oKqr_ z%zFcz@j0L(^sn9%sDxVNm6DzSys{1E(}W^G)EJmGHYS-9xhZJZD}e2i%l7{H?7B^pd~{{S$oee$sS#c6KTu8f-wX0a&w^LevK zfi2I&@BaV-dB;meP`2b9VB2sFRs+Tpk!29z$_IG|9qF9PnlfOz8yK;@qw3N%JPjrX zQ?W{b!Iit!@pu9{?ZAhSrQs)L7?MdwHi+oBFp+%Z-dgb&U5Mjf+5ya5IzK z{3_9i+}nNenukX$Lur9C!rl~p&YdugK*PcmV+HMZO& zNP|HnpFyh|*pesD@%mvr&x0Ff4AGd!4SoD0G4AoA}pSy9`s?Z>tZ$((7~ z80j(3j870KWESHCxlrF-ieWZ$sT6vk`>ca9z$^)IG1Y`iB)04C8BCI$3(AjC9?Ana^OHF|^M z4=#!*Nl0EQ*M+E3Nw)VZWHRIWanTu zTsyUgQ>B&Af>a|;lXdbrTO?m`yp*a%cjG@i-Gp&8fTgirqfc#a~fylUU`B%TmZY|AB^u~P=NjE64sA$}3Eowz z0U-}nbY*~qIIAjcMs%~d3FHl(^7Fw+1sAdHra@uwD*7H2qAuykZy zXL!hjTkPar7zkYr9@BLkuJdp_mY@j@Anz_BD87=D3FI%tMnzZz5Y!B%YWiYsQYYda z)j*_(#+t@Bw?R|ior8HY)QTZF4%+ndh5RYQych`vyTK~0#&^8d&>tP(z+X&dAX2({ zz?M>i=ZJqR18#FaA8$-?G(wF!IF7Oc6*Gh&`b;?h%DgVBm`r^Ed5vT>iiCEuZgxca zzZ^>i1>jv6&is2@nI)}|u1ro4LCtNwYXkst3};qEj+4nx)MM1&0gCfV93j)cyTGjx zNLFH`l5p`we47c4dnY2X3TB|Jk^vU5qft0uOr}Z9oq53Y6_dQCv5At9=^^hQj5QSe zjUS&F=AxjC%)jyu$8!EKRgF?&R0=mWG76`$6r`-F7KU2wQG~=k)#p^di%@XSbZ=K zZCLY=xN0<>dZ-KmING#ONpY_y#tlkhL%;}3_&jh;*%N~^a7Jb!ThDK4gu=2UK#eRk zscykxof43g^#!y-uk;w#}vcc)RK8~W_rY&A-s{8ZrfWiu&4~IEGH=$SE z-@}LM99dY-J#i^YqEJxtKL!p9D8uE(I*Q`a_SIqmGfTiA!er%#eDSQ_NF>+ow|Jep z(;uvTAUA^dk#Mqvc>e&xcnNMovqz1A3C)jLM|};wumytxpzOg7lo?z#$>HUa_ZS7e zgJ=1jn=muYYk!yt?%7u>MeCsEf5ceO)jGdQ>#Ug9DymtVgukY^*jqG*f*C7!$#l7d~iHbvh zxj#d3*TZv?cx7#x{{TL*IA8BO=pf5ux$%L=SugRC<}R3-%7@@Kf;T79q$&V+n28zgHLOIJ(+n)P899+-IPl zP!fB;%z|r8w==)_g-D87{{Zgb9fJ#F! z;B$Cv=?;8*;&kPMYm4sZ7N)=f7mZi^$y@*l;+d84##}lAc&myXImb9)ULP2S?fOvX z-ySoUpivVe3)AV0ObZ&pTRV-`v3K!r5C|^A()brh5E&+4M%l`lrjEc(R2~98tB3&hIzj&v>yc*9*>Uo?h1e;h> z+I)54!OFy7Z9B)0AGS_4XvY1_{w*YSWFX(1lMxFXh^;QYD8FYL%p}4>O)E-|ta}n` zi`lPa$bPcm!|@-SsuP5%Py^@sGqro6arFCTJR%sn7SKu_;gPh#CAHYS#6*_;M)e1wifN-n!U_bgTHxW5hy6}#QQiiTQ+T^X_6U&;z%aCz^&pNlb)|MAbS)jUIk1S z#hDf65=a!W`zmp@O4SXh+fQ>Mu7pc=iG`nhlVZ04M;3jVwW6kfKEjL}n$B5vn98$y@kHT~)sxF>Yv;Gj(Yd}C-5RaFvoG&vB~ zLa0Pz>ny1N2E9(bu&FU7c_V&tGb}0ZO!QaYd2m6aE|`sZ!(v*=61M*U=5ZBwiJIJf zU}p~#islUY7ye|zT2awItaSmC6m)ue<3W={hhJD?dmfBbd^(_HG43@ULf>eX{ZJv6DA_u7> z9CwUpWUNR4h*>M^mj}71$0k;eKiohqWNR|nYk7xJFZBST3J?gw&qr8)B}h0=1O%Y% zyn+tUiK~Y|wESQ_q#|*OU^~zbRzX0ZTw>yRwyKMqhc;W3rYIXb51gHLS8WOPC7xKv zB~x(qe1G#IMcU;)3h;lK5Uf~1M}((!F%^@eN+NI*f39-l1)|^UH>ZcoSws>`#)s5m z9jcqTKLFxjiPi%u8JG`~Vu>qurI5PumKmws2wX|Sl>*NvFsZlS@;~q@A=!O7%D=^w z=*Vd@7a1aDxX-bZTe)6vf@}>3ZoK0r$;!M#st0M~7pefm0BxSU;{Gtwc<95?p%cD6 z-mz>ZBR-UMIKcRXRhfUcnjq=i&#V1#lz}DEVZJ9JaHfp=dBHBAM2Y(Sp26Cp@1gO9 zl$fw&2nOfByj?5XO%ecDoo#1f?HU^VEjo3CwT7VWP87`oJ~1P!I%sneAIP&0X=yBw zh`NV;xM6Yx-4cU0MkvZ>5$&*gJ{42w)EGZ&9At7Y3CBJ$4}YWTux&W4;b`#+hcdA` zs#HaCKWw`qlpsmg+=&wdRJnGF;IL68twE);es~ zfxk(R!0f2dCdRlB}GOtbbcYyY66Fqw({Q6*kp%JnF z0K*4Hu;vnd?<8yF0!~rjd;4O3>Pdoke%U`uB3p4k(U3hgAunxA9pGoHgMaXO&Hz7X z;0X?X9N=RY_XE`*SI zpNGgU1G!?!x;DXR!m%ClwJ{Lz%IKkjrgP>eMd|0pNLVRB-jc+#%dwlQgs9D)$?{(D zxh;MrIo=$mQ~N%joD@g9L_3Me<<-29BSQ2o-Q?is+{m0aedaK=a!eGG_l#1ldf3w< zh{7*JSdNPo1zaiq3GfZA?1ES43z0GFD57dX#|$o7t%Y@B&x@`PdU-=~ z;@uOw>twYec*(b6OZjVRr=xlHe?Vx$(RmCSp|lrob^DN0JqciuhkfHq{A*4V0ZZh{1YZ)z3mzDCT_OIrU0uAFpryBx2L-{A|n~j@Mp?OXZBHY;kfAwPauuJ4= zcXgQ`U<`d42XaGBC$~TjB^$&IkfrN-js^Gm1IARDemaz%e4)ww6N07-r#nD-?i(gs zQCEQ4RC-evuZ&_O-yO#kAAId^FEi zquF)wk>QmUEhn-zoMA?Q$#*eG>?A}bf;X0RZMo3GXt?4!e`Q`0hJUD4tVPR$b#BuN zQH~mDkh+K~pS=)#N_Lthc<5`Ex8(XTx_3K^@#>dH-Z5_Bof&#pSjfU@l~tJpIAE7=gP=l(M_&3M#`e zsffi`u+&1XvY}|C%%(1;yk=3cN@rxXY5JET%rNT$;X7hfFWZ(`Tqb9M{K|ZSDW)luwh*MK4O41>-?^@DYdR^HwO!$^(NdZ zTB?RQbFNXcIr5IodS0i$54l9+&RJ+{F)in4b)X{jZj(R9i(K6y}> zv1CI^y<42UC0z?;#+r{=f9Nn|vQ}EhzBDr|p6<+jUn=Lu0J|3zT%aW>a;8ua3qQzj zW6~g6z_Q~^3WS!82!#ye6&$XzhX%K|oBc~YKR=#uuRiG8g?E=ga*D8&d`zXkE)Y@9 zJl;u=A-79B&OKmd8^}GLm7Sq>3$43w z4eC8gF*CWo*Xf8WtTnEtcIxZAeP(IXhL9lZ=ig3}`eb?SEQxdtTCXocUMamDFKc^- zI7-2sT)kKVf_5Sy-9rmfu30;dhe-XJchTvo?=>5if_TF2e!t3@-X%*^2CbNHT8Q0i z<$2x@-&)>@frzX_XWuhnPu5-n&HBb57tQDP1w%e--XIzSeSF$e zGg7+laE|;3flgew%HVEaZDHk80_vT=P&=WOpfsba@e8=ED5KMPW<`uQ=I{^Pu7goc z-!%RI0D>xrqf@!z(jw(tyZgcLmgzr;cDHS!6jO)p5eFlOK3x9*!m4P4Oi6&g2#(En zg^fb$HCV(+DMY@hVGPHtGHHumWonDWcZ5#U}txWzX4?eW?u#jH5o)W$Kq zVYB8Vb!*P}aQWUecY0Tz&{SvJN6#t>AP*P`KuS%WNr{V#a$dUdbEyoR2DiBFcw9Jh z^BhrhtrMxIbK7vXWo7Ux{-LtpAQzpxad(^;0K2PSyXiqOG=*<1-<`nY8-Xe+5OYIG zxG=G@Rn>1(lxHikT%EgqA-Y|YZ}6nda77>n5AqX}1DEQE?4wz#t~?~gsfy*_u9wE5 zXrsxTb9wzsFy@Z@L$p=^*4#Y)?-j1YetEAMh&HA}V)uBwp?18vexUgbon<(?*RJq0 zATl!5=Sh<2=Z^d|*M8A)g&Au8W(D}YKeC6G>sxMqyTcu}u3mdovem_}XtPz%NKldM zCS@hj7Vtq9F$~sV1ibI3+exfC@A#U^b%}5-sNJa;07Xo|rjtE{OA}be+j*~eZQ9Ne z05J;bVV0M85;R%l!D&h^o?M_Pm7XU!gGH-PhyXPQ)z;i%Xe_=O=Uy0@w^!*e0?2<6 zHnn9@*6AwXg(+oVFc<~EcBCAFiD+}DA_guJ#rj~_!7ILyx5 z`{VTv3CQMm%qXVw>m7=xhS&8qKvM6+mFv=OMd`6yW7CHDj;x~kdwOo`4hXhhL&9NM zt>VxUteVOV131&oWt;WrW%B{iHxn|aet&8hrLTv>1Ol%KDWgYDkpZb_>p~4CsU3M_ zODi;lW7Yt9F!eDoOrs$cdPIbP)h@`ySwaZ(61A4V8$}&HWmieG#}#udL^a>3x!SqJ zkkQYFGj88dhJY#4NN9U^;maMPvQd=RT{Xwg3Z@`7;buJqEZZG6K?iLfdHAJkFd7VT zo0P~iQ#o?<$IbSrZ!~+Tvf19CTkO8Bv4$2YeLSdR4K(RzpVnY4zQ~4+*Vi6&Nb4}; z5}PT55Mv~u!Bj^IGQz=yr=f^(7}=dFPcbnTmr@%BMsDwHt~umzYHW z09|^^hm*~*3Uq6S&zQhXI~?&V(TzF2Olnfi_P@-aDZTHG@_-F!hmG6xUilMm!5Pe!XwrZkCGW2I;~Dz{OL6beqhgjivyD zl{Op76%Ot>f1RZoxrkg248h9{Pz6I7)+yE;ml{O1FV1srrHo#PP@tgyAM=H0OWDod2nv!=UBe*Y8ir^MF43VRM3sf8%FVq z2C-PLJNGQ$Rw4&_ooQy8O`(4&n{pt zdiMB@PJ>MM?ZWv&i;a(b{mcsO>kP|v`-1gH6ODD9gXV#+zvE6(T^#;c^Q0nIy8HeOyIhzV5#hsSAZ9e3gFk2p%1pX04!ydWxQwR;Afb9V`oKz4tB z-Qrz_xab#p969R(74ey;AIvOSy+>un1-HonH;d*!BY!Nq{{S>1=9N)O(`w}~^{4a0 zXa+GWD_N-8CJMxTq2W+cR}pD7kA$ln9}tFZMal%ajIGfDt>BXqtPtQ-cG!+sg{f2x z!<-!beC-jiAgtpCt~2Kd)K{Bre8$^A1v%CgRLCnZOC;hNO7DieX~SHr@wB27@n64~ zbp=$hyq>YgwG z{>=(kDQVVdNT{(c=4u2?hGS*AzL@))0$o`hZ;ZUU%c5G#bVa$%6Ly0QCU%zLWw9pi z0_$I#`pTTyfpceGJo<2k_-okvjl`nE<81Fz+}R}p>FF+& zHu_78h@PY$I=FjcYfZ=2;ILq!9_m5)Bb(EX(95uC=P25@kazt@`{B#RQ-xu&N63E> z)h=vN0>~(}FkN3R@pWJt73-b<08)tQ!U$qI0Tqdv%B3@`=7?!6B9L>(j15k)F4NjH zPM_IrZ@(5Z12JySLsRGGXf4Fw&E=j7K9!A6jLRJx>%Un|(PpQ_cLCBnC1gfV7=}Dw zK4s2>dsFocEBrYvLO$_>lgmSdDhJ|Rx*lVf&pE${w#~rnUnH{`cg@8Y188n5-Z(!} zgm1C6-cl` zhXoxj5t%f0PAA_6YHB2Cl~II?W;8*>vaV8tzv9RS4xJ*@lJSS0F>~Deu5rk)w@$Eh zB;QOvvXt4Z$b$3m*YJg5!L6FM@6J#wC}RjaR>{^QqFuaScaKS_CfF*s&*NzMv}*Qx zO_$CvT5HZx;VeK==Zw!8(duLO-US#k$ZTnm-}y6ZLs&ti^X3gY`#fcU8<%1qQ(PWA zJ96U~SdJBb6HrHdW7*79L3A?&C{b})gJXbc=Q(N;;o>i)<{km8D{`9lg!LHbP9ct> z(QHHp)((_W7cQ2iMLhQRjx?=(@7gvjcYSYMA@Ytq_Vf1>Mi-8?<2Gwd@$>bxR9I`v zc&DAQ|(fy`l(Jy6xNM5hx4TcypSI*^N3r`QsQ}*tvfGV=BXJjvmmYQ`KGI-M9JY z0azyJHF?&huEYDAm$RK`berCNn|oB#+6U1esEgu%1Y+v@K(jFs2(A*&Dh*L{It)k$ zdVMf?QI1;qh3&2R=hC9mTs`l-%|yo+UeE`1irlU{bFT6153FsDerpqAjSt)D4z~t6 z@`hTKoBjKCii)`&lyh%9?hXYHKc0A&6(Ti#oXX6Xsp}A%M(olb94EZsz_Bi9!Fc3! z{6he)*2a*0C6jiu*?tIx)pvKs_xkAyuvxqSF3*WWxyOkKT%wXu9#_9+quU0smVNd2 znLTx(sgtwP2Lz%p*$kQKW4yY$0PI(`2z&{9OecA+YtC4hCyuZKE+KP+tW;|f(k2P2 zWw!kM>)s5jq!~tA_0!%6tfo8pj?p!wJxXccZ@H>Fb;jB0(gsipvwjkh;B0t2bc*e( zg%yg^7pxp5tz)c4>g}8EVr5ZwYsw30-ZnS1wJ6R2<#XKW!@Q;CH&ajK$<`bV1;kV( z>Fa0J%EhjGz7SPH%p##u!x~G3$FIDxM55WYDqfYp9mmgf7#^#u8l-Mu#3tj!d2K_{ zs5=@|2q_Mcq<2FEOt*PgXoib}B6-3gCY=!#8hP^yx?w&40H?gTj}MIX>lGN@JpTZZ znsgUi{lZe>H{_f7m}0WOQ@1D=Law8q)2!VQ*>8_8h^iLcT{wsG0kv1_ZT)w+_JNqN z<}e!4WQDP7A7@@0IEGlkR)M4%rQfeU6C>m~*B9zCkX7j|hy`Ynsv$5g_m;Xec8#r) z_{ZJGG;v{D0gM&v{DzMR*DmoQpo25ZGW?(z!4^as;#rdra2+62siq9cNZ1uDBc`lO z4o-N#tBXS9P{ujJQtZzCEz+PS!fC>E6vdx8*H)s=6^)`lXnJ4by#0F8R`<;{17&|;2UNk`MB z?ycinZx!{PxV~O-l<+v^rj_G{1t`~>hK;yut4YVH9qm=B)z-MCy2~>cyDU*{vdaxF zw&zjE4FJ#rE;ZfK%hPz0D12$c(Bg8N2C&Fo&a5A7WPh+#wJGSV_Pc{saqZI{@!WNV z3xgcPFKBedqqJ;(mF;;FRo9CjY=z>jsE3JX?L%GD##Y}h&=OrF%`N7 z9WUK_Z4_X^sq2pS1!|K+LtYS?xqe~|T;+HMKIH0+nabHKTSlfW8OvR}%R`Gz@hd#b zHQBBcfeS&QcaAA}!CYZF!$GPx=+W0XgS3f`ir*_797s}fuhh@iv_nH!kKl~j7~$u6 z%j9*Yz3N!apR0!in9n()fyB$@$0e@?d@z6}0Mw&2yVB4~u+%i+(|lFdxx)>vb>Fsr zW&On%M*R!$sn5ft0NKwM8P8pyeIxqg8##IF6LVw8os<(+=3WF;#9^ zchM*-JQTS_q*+R!_4vk;iYt9F`IJ5qUs+&HNUtjqFMx{E2=&ATteC5M>j~R9@PiRt zqU!?C(zw0XLr+rgQZQcU_HDz~yeeE;zka%`UstE;j3~B~o&J<|wkyYtP=%)08K=zZ>}C5fje2 zQT%@WQdO#~Z=L<^#9%Su?B85^%<@!b!1z|{m`1a#5`*&k!ngo`20boiS~{hLAd;Cw zHf}u9F9b0TG{#WO+1IoiO+)L(pd2c znE7~xHfa9<(WEQ=e*Pyv^F_7S-xm~V0P4G5QQ3mD!CodWO{-cXpdUO4BfS_>;OR2=7FGO&d1U+KzWpM{GpC??_KJf#i z9xLt3MH~3cvyokM_?*G~{{T_!wgqv2^r#?TL-Sepl`7x9k<@jbKUXRlOF67PFDvG~ zU^gLeP5ti};QQO37t$rg2H(XUVic{*O?B;CzMkk!gtG56J>3Qp!lwB~)*Wb>Mr)*g8At_RMAgv^@{uh#}Pe{bRAYk33I_mD$gZGaFlyDY`r6 ztq5LsW~&BxzlN^1$576d`2PGwn{R(}c<@2Xa+HeHOKt~PU2^c_KJd0G4J9LS!E+&j zw@E~BWJ+#ZHo8SG1B~V^hS+z1ACA$w&yV*AGT)@4&0H!gbB>>W@f3cXe!qOeg04^; zy(VHWPk(4A+&gvi$4IsLE%Cg_6uygC{>GuUaagZmV!f?*n(gTu%{_^qY-1tn z%v}e}1id{S#`&pG%u6*BaQpk1xsGCrMR=FiT?csn2+{ZbiZc)nVqkV}9i#dx4XPlP z;jfqw&gNe^q*kg}rg(S!yPrHoQ*y$JZ+Cawr{Z5VZLzdoYdZcVnK{)T9$=d-{oj7F z*{sAyW(!=>@d=);s{STsuHG~07!DqfF8lSA)Trxq_lZjs@w0mEoa4q|3YJj?bZE!F zq^U)gEpX#JP^>&p>v20TuXCdLqexokBV zi{<)boJz0~WBx87SQ=hnoI>8~1Po?httSAA8XbM(v|{vW8SZg`G_2V%Z4OhQbzqpt#d@{q>o%QxvrG_wTe)4g5+_hH=~X1M?d&Cy~xI z7+br)rX$xQ$(yDKp=rUTO?q2{-xJH4x*P}ZN1DaGseMWhZTqps1A|$!DZ|^C0(na= zWt|`k zopZ=omjo(}-48*E=x@?yvR2sNpx58OGQbqAySJRgxP+v(KEZXeTDMbAw*@$zFhPMs zs6}apE@D*XFxh=(MR;fd=tOOaR2UZ7xB}qd%dc-uO?1H~k}Yk&2VYIZDC->Fcn`0b zIZCFK@2mCxd5zM}`?DUuf7spxunukhySs`B>GzliVc(i!GF=V!u6)$W5Yb4Bor70e z*5eu+{Fip}uzc4uUAG%D=JPK55$^1s#lhO0vTrlrDs4 z&)>{OGzco2iqU}OMhYfZNTn5VEE!ay95Ww2Az0+Y_wH^zNvy?EQ`NmCo<4USRK-9l z%zD2^<`)tTd8q3KDl0;-AAa_o6HLL)1)c*ObJi|rNEvUNp-(R6rgt)axsEG24070C zyjLb4=YQ4WHjC8t*KcSi=G7^@vXPL!YP@GNB&_GHUkidG#{ohM#RGuAvwf-;uVaF! zJVi_~PS~xYVf;1w``#(8-|}2x9vi5IJJbm7rUkp)44rBl>Oi3zg$6m?0koi4 z4GIs;7pPRl#|qstoRuWSw+pCY4se-tkPd<3r8+Fza4A;;#sJ@*pU)eNfKg9c-LGo% zi;DV9_vFrY^1FnuF4O#tRG*)3yu_5?`0jT7z}#TT>z~*9q;kAJe-Q@lj?q)}`@~f@ z%xp_=vc)$40KbAEPR4xw5xJW>ouFgZIWi7l(zjU|+UZ)AfS0o36%0gK0|lZ0_+qe~ zKK^2&4b)b>BMwGe%3!OR!7ac7*Xk*-e17Ah#70st_=Q{Knfu;n(LTESsc2n137(6i z&%Cn8Yo%-+b**!V0llZKUmYVN)w&Pc+yjF2Tetc6=@(#n`S0JXP#=6t6igOk6jaZ4 z{qy`nFO`*q#zHGySK=LW+A0f-#E!$oM1;FBKp>;M5onm8R$vU_h-ZrDh^VmeyGzrU zotcP^IktTcY`d_e4v&-n&K6Lk`JpUe8F_SuVV z!M^gYH=KR@xZ!ri5X$2Up)xU)UQEU^l)Qx3NFW8h2loMO`W@xRBWwc;IDpkr(p3V^ zvij7>nS>>KM1NjqB)B|wzlbV=ZM@T3uDZWiBr>D#%*-6(WaKz~KZ#tG<@|hH8Yxao z#eXr=fhc&hSKEJ%vwY+4ubFE)#*3M87_GIe!mg|Q$7t+A8D#WJLtmo*0COs7xW}5$ zq^fZg9Ydp*STie`$g^*!U0YJCXTB>9!B7I_55XzyJ5IziQbqGzKyEW~)!bf5_2(8!!-f263k*h* zgBH@G7lZhj4!Qg7DEdEx{sS_LTu}G|7?EwEV6m7Ya5FcXm)VvDky6=WjY^zHnc7zX zXPA}*D_V#@V4_@tVf{Cpy$+B(X9^%%>3?x-cFYW9z{; zth&<(8<*U#nw#0#`DO5Lo_utQiNvIdf(=1%d72}+Y{{u%Y!(@4X@}2=1iiwvPD?NA z3u!+PunD|9zrX4TFozMNW@JfT2%$+Gs9bv^(^BM3x`y~adzDxl`+l%V#p~WvVxPJG zx=YXpk9R54v<_otIoN0GD*>FZTUGhLNmu^>0F;gp3iALC$?-6AgY^P8TKp1)n->b+ z0gp(nE%bT6GZ{j~Zz)<<2)$=0aH)P`gsfMHfts%{nQNbH#6O2>{{Ui5KwUQO{vc7$ zS8wqu*eMZqXNU!s08w7wbusA>u@D2-=`BSGo6i3L8olCfUd{US_Tr$qUKd`UnBou% z`}eF?TE(UB5OL54#r*v4D_z_da;&LSQ7WJi>yLbX;2%xx{zOMme&Y@z11bg~K{hT= z#5TuHd{Zv@AIz|89r%>O4yJx*0K`SPLkujGI85p@muTo3Y9P2Iy+)w{p*mj0tv!$X zRS-&IG>y{1QF_OB{{SsZO&_?6aIQF~uYQmYX#92WslWgYZQGAc#Ix7!?HX3-`*4EJ zQS*KJCuqQmyZG%iB?Tfi5Wx^5#$i>{{fFTsMp#YZ-D8Q>h~8m;SP`&v)JFqx9qGT~ zb+e!H1yL9=D)%!xdx6FO09lwQQ}Y)bjK3OzPT9dH&v<}L%*Afys>p4G+{IIZIQR1{ ziLbr?05Mo~{2S}$4QqTsm*Xm_kB9c;@zj(vEc}=8D6t-1oOqTQu=}VeBvG;=vjNNt z3oT5cJikopi8{r?XqDB=7a`(m;=4Qj`axFU5xr8ql=xs`5LppGdXBKnG&OR;8$Kg| zQJLF6Sz4F?I^>)j&T<}keEd!k22;#gm(~h5HggGOnLRZ7U!_efxpsn8piAqhmcHK~ z?5-L+xWLs(0dn#>TlhfeYERB1l?`a`2nhumw$Mv=?JCpRqW zA_h*?^BhHQU+26JA}+{^i$-f+CrA$(@erzAaSe?CUthknj*-zF)OOh#ukryMUl6e= zNN8>LVb;2cP<1&`6jz3yIjM10Lw-L|u+ZPODqjHJpM3h9Jn;%`Zodv_PfK=+EH?K*$~+rwFZPJ-`}+tjN`-rMFnFTOvi0OR<+^> z5`7@DXUF0;!0-IZb_M3Dat@i#$%&hBDLf)|;pS7btJUUS8s88SoM-Pa&@3PvQwsy1 zq`g%%s5dGov6qz4o#mM|UwTDbUH<@Ixoxb&`ik}lar>KCyE}E25O?>d^Jk>5MK_c0 z)?pQa+gbc)t|IoX{hvMHdMz&BO%r6}`HQOm0H}t5j@RpPCV^Udopl`I4r>s!2`W;K zAkJkNJDu!9LtPq~AMy8@ZR*UZ*hhee{es z4F_92##B820EBD~Ux}_VwV6kxvUN%pVkl7D-Shp+AT=#UbFMpj^@7Ca{8y$W8q=EB z-(Inr;=EU5&1aY(Iv<`-Pr8o{XW(%VZ2Vt865@>O$@ldzw=P`1Bigw;MMbkysnj1I z5YrvSdsGE7My{S>lROFDvlUPq*GQYg2k8E#jC%h75$MNH5hE6pU(8K{q6QQW^KoQL zB@@Lx<59R^qBEYckMN(Elbe~>qGhN)wEKKZCgyW3F3~%( zl`5UWhTKOt_Mk|D`5(AsTFrL)&v`w{)L*a}mE5zY2| zR7?iqm*p4I>aV;ySATKio9__tcJcS?D-FEsT{A6W+YT+)w*pHFASEa(ReO4_=0Fw~ z(;s<;sxCG!&$O=*!*u@uo%P~dEI8u1?HL6x9U)xWF)l|k(v=lcaO!ipm3T<)*p&pu ztjs4JZmWn;Gr86qJ_s?Qv9Dk7)U|-@h05W8#^Q(;F{E9Y?F)m%rc=AWN}A+hn#<1P zn?;-0%Mwv??YM-oxmEPbfj93g5`%-A=Q4tTVOYfOnyZOHo_fE(h|x2!I);*v!lo|b<1ARe z&fx?Awh&tf9eZXiaK5DYlpOA?14XyXZ<~LgULxG`Rke2Nb^Qzl;l{bAF*?|yuT2TT z$Dc^9SX^0(X}j%-;Iz5wyZszMB5mE*jF8r1FP+1f8fThAS!TNJ_WObIMEU z9c7ah{{RuxT3)3|(F?m%o{&V)e9O7F_Q3R=@0n1EIh2L;m2=i56#$M9sw5gV97IcN zo8bQ7z_;U@{xvt37Ji4;Bs}c=elSnu^Pjku`lChc#XYzELpgFB(^%*Dhh()hHL<(v z!!ZP&d-%nj80{p79Pl0bLOFH;(!&1$h?}E4KH;AcqzK@}S50G5>HIoJGMYto04N7x zwd*sw8T;uN@5voTo^OSY5uydblo9h4#UYySS>u zFBKXJjKbzR>xYBsELtJZ=RW%UOB+(nNnAx9m}Z!a@u_$yj5P-~9MzCYo+ZH*dANf$ z4Q~1UN4EoYT*^znrH{`Z(#=$vS)%%<_WDIw4=#JxZjYOHD(+>jyHnR*mpjV&FacDJ4^ z`KVa3lv5X3tMcHEMw3newRlR(b1BxnT~hO`;CD_j)@;C`u3y(#TrR_8Lyr9`i-6Y` z*c}*ar%oc&B?uD}ww2v8?NL~*5LUM1@VCZKBsqoiF6&SJEm5USMK5*yMhXiES|wd> z(TKjn$KO1B@ha-rYlJ%PyLB!BHcQ>&+P-5bIO*y5fsMQ$Yo=jkxe&o9AaR<1a+F^? z&l)-B5t%4$!W4PM#6@NMzrldk)W|sDJz%2TOj1Okw7JT5m&aD!ZmU_wwdW8kV$-)>dSeEq!CucQV@ReHq(B=w@MVC~ zr2XH#Mz^G^3^Y08`O7Jd^gciD|HJ?%5CH)I0s;a80s;d80RaF2009vIAu&NwVR3P+M-|C>S zA+a}KKrmfIhz)m%sO`BcyhcP3c6xHKsk;Ip2$~!NT?x`C0!dQ#TtEdu7_5@eMw+V( zmdeQ!YHWEL!0{#oMNmSTbL*b(jGHl}kn9cK!hPUn;5!H^4*Q?mm6$;{0Tb<~;}Xzi z5_)TahC4>{Kywc~>VJ?xSWs3P5a1K9`pu+L1<+L}gTuj5f>ghmB{nOeoR1FV0y%bb z)Gl5ETASE{mILpMMEe;EH8Cs@(Y)NSqyGR|21UibA<@h17^OY&_`)1+&=d-4YH^$l zKM+6Owco0o$-_mk%+T*cB&)oB00#=_-ekleE~l((Ko+wMd>sB2?!#8W(V~iOf{x zX%Q>{D9zRv@`^${fnZ5sbr5zosy#}m0~_c!Bzj>eELYEmRd9g>X$^V}9BJd&0Dy99 zbgc*&5;yMOJ}%G6U~+_E4L+v{NOd(AJxS!H;!q8To^~A=iiA|BCx@T?Zvmvt45Ffo&i>JThK&I>&8K3b;CVx0PMs@y*FRKcCNd z@WC~F0PLrGR%6|1%7YLKcPDQ3E_0|E*6p+fMXq5mJ_9T(FF`8>$Hp!q^yIxxsdfG#QJ-rspGyTF5xc-cJ%{{VOjzm4@s z)I&keGonUduz+)0wT*`m`M{I%KNxV-0y%gizK=(jxlWvH}SdLSYb87oBMfvJ^q1 z@^`Q-rPTzf9@Y)>F&Ho4U>(tlM)t7={{RpaYbR)`6%B%g(NxhZ*{(U`2`^9j-UA|F zP@rqbY?od$lSNV<1{kh8f=K8}^Y@nxG9!fn!8>v|ExRPm7v@*qY9*VB^x26U&{M=8 zx1RFfwXpYS(Di^c!)IUoW4IesrfM2sqoKvtc1p;A;S2GsN1zoCu|ajKh0++T+^~q* z&N>(gG?|hr?Z(ty+)3rFi)D(Y$B=n#S~#wajQ17*diydzp$m0u!TRa!k3=^^Ibt zHCIB*jKo}9>qyiVJMg#6xb(B&VO-l-0_ zJlG{Pj{TD%h=;t0n-{YV%fKj)71z)@MZ}CUK(FnL_y8Ws+Zt-!_vy6G382bCX5&0^ zq0Wx2;JmTK<Ddc+o>AR4p)um0Ivl%r3cov z2xngY8r5J=DXnqNY{=A+^6Gp8G$ES|U2v<`o);xH6sn!`lb6pX#l}}!I^zx- zR?jS&+>GtFr4K8$a`_34kn1+dwOJrkd=@EFLlta55G865L0B!`wTbybupS;5=XE=8 zE6wBauW6cKC-lO2VH>_!8B!qS3^t)~Iu#67cKMxQqf~+~*BAlTELjLvlmoFSUn-$R z8-krduVYzFOF|@sgb1+hDdC)2bXWpW!@i&?){dz~!1Oy}88!&{7D`@s5f&iHP)dlN zfiS+mVYF1pkP~E>;rM|l>#V}(HLQA&-7!^ZA`PRYVKS;x1d~dFMgqr{z)cr>c|-(E zJr#;VjspsSBEcv5VpQMhJY+2rnMSo?7zfbNvtCOa>Zw(5~U z01zWZ2#BVPK1y{2;2R64DeY0qVL&Q%+<+)zA>;Jfu!!#fDquXQrEfczUIN$x7#7U| zrg4Baz{;?@o$ToNzl=wz{4xQX)3sWEoL*&MyhK^UdnO;0Tmn{mE?#HCBul|%`TqbI z!&0j&3C8fKwt{p&qa8>(IEZ^N4>u9^S!m%G%ekUNdd4z5cgqpVN_^%cL>t*ZSS@Tk zQ{c}mvFO9(96nen@CWmPY(>B!xq9O)g||`ZA2_3~NId(8(kc#1fQ~^I1h5#qdKh8O zqw;?F@KAQ*`d2rNf+_`zf@lnLpdSkE3R4gS^%#eDbr47aRX#zFrV1Wd8*puc7~=>q zFF{n8Iw$xem?6W7QkkqKl}n4NLN%n&~uL z5-W9!t{wZ+jTV8v0l4%!amHV9muY}t+pilr#V`>Tg(mn2>&I|qEPA(G0n^5~x$$~i zWQPLiYAxYmkC&})j=A;I)?6j8l#sr+^MpWrfunqWv6)XNk9aYME}W(-?!}$Mt&R9` z(1qXP$?k!XmAvj^PK(P?( zAqs+tkZc4NFpvbO2abaF0c*Q>=z@{yCP7&+nj9k#l({uUfD3IT5|N3F_(uvH2`+X08-8z0V;9`90OH0Ke+>GI9e2xcxFX2 zcN=7E@D2c+h)#}RwupmBE+;1zivlGSLJ0Ay8Br=Lw*;3WjVv*pieb9zKo8-X(SQyl zb2)#eJ2VMKgS6y>kgT|a1BW1Wfbl+FdBXQi6Q^i=xT({*adEObQA9Vr0({M2-Z7Am zk*4AE;kDb628dVm8JxAPPV< z7vfcJ78SEtk^oc#0vo~EO#no4BqYHHxio|f>0N92_)zwRo0o#{sJ7z636J+WcAwAHJ?#lDg)(F@L zb0bLwhZN{T9o;e*>r>kSv0KqAKs-vo?kb9=2aQ9bBg0?ci;Z+E9d5ZF1JEFh0vZET z>QAf}LBQuc(!djdU2Q|*aUiJ>+Qdi&K-7WMF#a$mA%#YWATxF2Td1a_gUM9WXNKwE z34(y)Gn3L%V{`}-?JQ`}h`%0TMM{kZ>&ibNyyTKnn?S1TYx=$69;|`G$)PP1#wQqo zs8XF0o{t!;NR*YZpON^)Y?k$dUlGqtQWeI`Li8Yoo97)4h?2tD)sS~Qlt3B^I_GA@8R`bH&U_%p~Z><;#^Qs zRSC4g2UQ+~nl@Y?-^2l@VBiA4ryV!8Yz#JsI}Y3(=mjb(s3JfWJ7fzeMtKnHW6hd( zjRCdr3lC{0#yAih#~*4wk2v6I0^ANoCq4fFc`g>2Y#5ws!X`%g>+KkGn>VsqDVOJ?VXTxD7)T2hpREdGm|{09#$o ze7g9=D)N)3`g8S)wy~nBrFrdsbDM^{0G)J6@5>|zts&I^03RF0pFx@sgVn{I@zI?h zk`1!~Lcn&q3$Rk}UE?nRjttR&LV|PS1zQqQwwF~>LyuDjYT8Kbq#x&=@csw*n|~17 zMOgEddIJVSOWxP>g-ZJep4~lsW!DhIs064sf{R60qK(3!+YwiNfrQX@c5UBN#wKE! z#!&5A5hKD}D7vF9)Z}Y6y|YnXVDzg^S?^`JXIuHg*BS3Cz9xHFI_kULCGigpXCZ2tB}p zqMpGS{#mFZlqSsw8v1?Xi6Rs`Ippw%zAi0g8Xgbrks1nS`6sOg{=3I@3%rY?<4@!} z$QKQ#KD6uTyyHx*(0;#vzgQF7o02^L0KY#OV2U&#gadWeK)cB33OXIF0qJUmB37; zQc)v9fl`{-)N_XP;0&UWgoS`|>maodD{4n+!BOobg4T@jqZmWA!VHy3Cc5_Q{-ael zG_h)tM-9~_n zm=aABqWk=|M1V`t&s0_J>v$Zvp`f5r#{7=HaDeh@qKOmuzQv!Pf;YeobP zPWj;D#mzY|l~;fcca7W;SE}d$uVx76Zk0U$02qK)$m}1z&%9}7&@3UI4llvp6552M zQDH&mKY2TVP{NZ-D>~+H57;RrEwdp&5sXtCvkkyv*jpS%8fg$#fy97;(x{jRl_2-l zNJ#*Q#6-r_i3u1lWFR!lF4ID&69g_PfnpIXu^>j~+&8YdVm*-5gfvoKpJv6asxpP3 zK{cd!btpM1l6Gz@ROT5BG}Kt&rD+EP*c|%vwz}0wxVAI2qwDcC&OqjvIO;DS*RJVW zAnp490DiE^5CJ+m{mgamV5)zG;gXAuw8L1{nlNwmLqyX9AenHvq{* z>)gix*#kRE>bWd~qU?J=uCPcuUn-}m;~x~^%SE@=EhI~mTKGD7-xR`L@j)hCOGYTlMf{23$N5gy8UKB!9ZWD2*v=CEp8fbFInWmAck?%Xe z*GB&UJ}@RPm78i#TizrAdC~In!F3N7MFc~ORr0w@lEt<7t&8)f^60BY8eRJdca>K$ehicBA zJMWwnV1Xy={r>>WbyK9!jP>z@D7FTI?esdhNlHe|LGX{SmL#DQ${2lD=RaTsKc63X zLTg5pc*{d@5P%8Np?fE}ulIByHv2H5qkt*T52+jm<=(r|0q=N? z!bQolUGhue^@dRDCWvq0se*dC&l^pAq4k`U)ce2X&T7^{1vvV-;AIBFZ9JG_5`+yw zhw_~R=PdvVCSjpyI^oVGbl%yIMZ3^jv#To3NrZvub_avq(&Sx$2w#j&fpysN&hBpP z&sRoH4WByaJpg0*5&rNQV@Vk5p-0acOb*H@3qPE(4H1z!`^i#_)qkuFgjj39>_|7r zwvTqtLRTOK5K>1G1YH0oq74Aj(0|GN{8GZL(7cPFS33yjWJ5G0CW~<|!PxNx0r@#jA zK7k8pI>9L*pFBnFe1oTX44jcyA1697Z#?9IM$&?&P^Q9psntjzNpVidof@4?5W^6Z zLTRQZ{{UU$!dTD^gR^gJ>+cF$#1S}odo&nXOZo2k-V37bCp(+0Wp75BWbA9Ob z_{Bg8B7rTrF$x>4VCSCSoZd1Uq~h<6u|Sfdy)^Kj4pBoRs}KCbl?E*25P`krLzW3c zZ_cN{V!#$a=3lb}>s<|BJ23vN(rDc$2Ax-P5oy2^xPOi_yP*OMH9TJa3@s3V-{9*F zxbS9BrVyAYr#XiHzvsv6XqMKb3W{3g1X1L%5C|*D0euG%n^4e3h*Yp(86JI{D8fM9 zAOK~KWb4tIC}lT+qS0$TjI)}A#)PB;%3=6ini}FRoCE;k$mNXFwjlFIa&GD|G#p0+W{wMcl=R5W?s z_2Idyv{Y^b%Ej^DxIAru3i&lJMvnU;Oel0hSA#ZrnZT!mYo@iXb4y0PhWUEO?hoWZ zePIDkZlv9Moc{nmcf4d~03cUH*W(P7M7D_svJ3O;99brjC*ujYh1pKOyb(+iok(v- z_{E5!0>j$POvo6s-C(dX0u}&hn=d$D~bZn>Xy-6 zgz=hHTb3lwC;%y-TeO*@-?m;fdWVg0HLer&(0-;6K@8S$v=6xDqRmVofY3$AlzwGntFBKu|xoXG=tlj zx_ZVCbjom`dgD1K9X;mkAvqp3f<3KATa56A%|xym0V)@Gg`c4iPCU@$Aw;fm2Y(>b zQz*$)A~CU4+K|1LfH$p~CgLWeq!6!ib&zUn5fBjPZ1t{(Cd+|C6k1loXz#pYVig-@ zjaBl>OE%`?j(PKxs)C(PXdZdV3P30+*A?~SFKix`}7{=*{np7QByZJF7!D&?nt7!=ak!NzG(I5?N zDYu0r&@_b-VALSkuO^Vc0KPE8YuHs#aN(7Dg+?)WRgKONhn}{J!nCS}JR;A!5-jh~ zxF{AN{8y^PkPAGiM?p+zQe!2PKw>5g<$eI!4&c$Xj|k-2vx~=LtLwpV{|-L)pYp^N&CX9nh=nd}TWTy$n9O`oVgKtBy@!I2=Ye z4iM*mceUe#BC#;y2cix-LO=QSl}4lF71&gOt zm{Ucl0jf;`pq!uJ!VNr8L;`Jiz2b@_zy^eFo8T;&!%PS!(o(S=XE=>5H~|8)1ZrEi zyGU14Q&xJ3BtpEqHBsMo{HT=L0nWQ+a2g(9b?U$ExP2U;>|&EquE3lLab*ToMMHlM zK1C3C{#A;txZ~?0r4wEZ5~Uef#rq~dAge>e$3P$VJ=Dq?+yX!$RFtbJ)xG5#KCwER zHcH4kG}v{_4O=2X4HTbZmD&PAZ8?FrW8Sk*@fCJ(Hc{h*s)@;HWoE}Ly}Kn4NlmyYsM z3@1wAd+_zP84}_kFzR^Au-j9?iew+>EuiTPoyT9Cyc4MO9r3fA3M~<>bIL%FPECd7`RHEa)T7>6gPE)bBLK@`eI0du? zXl<&l_BqN9x=(Ia_P$!q2_>O74TGuN3)73R9%WKB+~8(b6Hdg8oeh_^Hb!stDJ zoJi5q_+W!MD0hOBCCfs@l29wtkG%$us07yDMUBipvKZaisVKvG+cBzS017IAQgU_k zn)kg6@$rHG02;uZ=pJ5SiJjlEU^l9P`FY1hPHwS#8RgMucp;K9PqsJ#>MY}bygaOi z+s2_Ox0H4Ve6}4@k+(U)Ahv*$E5s^}Vx$b&fzDE7wS|E=LN0=6ZY9lN<5o%uE(s!r z6=IM!Y{+qK;NsVo5VwjnZwHrzTQVEE9Tq);Zzh zV}*G8yyDmilBm81_l^RDHGmXrwk8oLuyIH$v1d75^}3=CV13pHcx|qwk+AdGNlP1C zDF}&gna%m*gRsPaEQgNXj~vImC@@a(zPW!f$1(HRDfTEYfyAGfjRmY5mHVAx_5g`{ zhc=#(#RbE}gVn7ZpBc=5kLuM!DMDg78X!%5{Pw4~WQ60ZrB?Z_@oj*FmPa~@8SLBhi^a0ALoNVVA(m8${r+1zPYi zO<*UZxoI#W$bTHs5wkQFlt*;$Dzpnjky{s7egyWxGE&j9ERH?}y5v`)l|ThZI(-4k zq9DNyN+TF1-k-LV62?IG!vRQ4ANGNrY7x#8Wh@L8_7T{ux$;U-+0J3%L)p@==W^(m%b`G z8!!gQQ)#SCDHx8Tb0d96>I*^ynH-2LK~~)kV|8vwt6C8#rRSxSKmt8OYtM)43?2ix zcz`<9UJ~V}uGdjJ=DwSFaJJ!yShDxR^S{B5LZ$4lA6RaNW3s#ki`QKDgZFepLXH4p zD1tOoLc@G(OG9B_9-P$xhQ4gXnJRgpf;A;V;@Fsz4$ef@B1I@+Qn*EA45-90ZS2!o zB;gML&IqDq8`Ek5L@NfjHRGCStb}!Rx`e>C6`(WlArpEwKr^@865~>lp}b8`-x0zn zrx+S7FER$UqJUYCK*pV~b7PA(=yC=WMidt~? zff=-%Qkp)5jGH+V5{qKcTiu-K(KAP?KK9%a2ski~(d|PCJTA`y8N+HA(x|0xucN$3 ze|eI~drJkUV~cxy)E7=Y3JF~^b@sS{QKLsF=;w0#TJa(@1i~%hu@a?527u1q`~LFj z!OSERN8#t^6EDXyy^C!uKa7FN@e!`%RM)3DW%en-j1$B4h|C$CfdgVD>p8+GfD}to zD(Qn{EU$)TwrH;tb857AmL7}}ijD1N{e0qr4h^^{1vlN}oPX9~x>PS!zKeyyKK2#E zqdlKtbvjao7P(*I<6*XAM2#J-_W{WRo^Va;mhb(Xf!?^a`4G%3!-Qn z$E;&G6p$4c3i9<#CkBJhKrtQw)j)1&N`xed&I2ewY1>@UH)yIT#G58pEqp@2)KEnR z8}~{CLxo-lj5fnu3(5P;YL;UcHDUZ>Fau82AW$QZATGQs0IiR+08m8_wqe9RU>vq` z5}XAS$eqGC?*zd>SJWo0Ly*-VG^_ycWQ43fu97bU0eX_;ms@u0Yh5}qj*+uc@ zj;H+G29FJW<%$~D8SBJwKu>5`<{Sn1nN!Qt!e^xiwG!7 zl(-6zgKvsD;SB2$WJ91Vf&mR!vo5I%?qx#)M_x_MCWCxoqge?LNN+3y0!)e%1v0xZnVAp1hTX3@A z2cS^_IYe2h%yckRnXrLKHyL`{G*}$ip_;EpJtQH#FIbd}Vz3LqCUD^kqAuNeQH`u)-`l1yKEmc$&Ul zeSgf0u`q(Om&=BBs2s0g1SXo<&LmRogj*;X%j0_QHprj?8>aXkx5s&Bv}@4-+s*uA zi3S=IR35jApeg*~KS6O`*{3Q`pHk_c@}Zu+tYp-n2Acp| z7?I|JkW;-Xf!xTxX5bMTb>6w~i6jBg7M&&IiSLJuTf&6^^{1zexc>mlX`C*PAD-}s zQ{GDlb5eDC7;i{EU+*6s<>AO2%%E}IBs+3dQ?0Y4UC0m~fDLROGJ*{HCl*JD@rm7O z1r2my-s$JKA%)s6H5fqge?t(KACf1Syg!}bw&poUl;!nb>lu^TLB<6R-h+ym4@2d6 zE1pc`UUfuE#h~S8+!hTO5o)f!aX}6WKy{q+jU947yxLW-=gtEq7<(7}h7}48DtL~V z-8gg@_77*^Q>W_?@(PJb`R#(Wc`Zs#7K`r>V4bAgiNhf~#{obAu^cN~;{O1GZYyav zZ0)srYj~!_N+uw973!|YoI5ru!Ko(05xB$|k81t^2X(W2&EP}1HW0r9>$ta^9rXYM z0&jscg5x}~eF%_MN+5&IRef~TpeZO_&D>-~N+y<&D1a{m3lT>m2$mzg=F*1xLMWEU zc&^ag3+5^4bOKEk>QL)p;+B%PT!MAP)(g3=SkWvkPgBc z5z-VqBdw(1SnZa8{#@wPF%5#ntxY#%u1#z%1ISbjL8_qaZn@;mopqow zU7MtekOkHu_xuYPMMVR6I0*U>I=}M^VIlb+$uStOtgHYMd^-N{DO@;J4e*EKHqt89 zWX_@Rd2IUDhfLwWhx`CS!*f9z^Iv!n+oCgaRlfH5W|(9P;F5L%ePTDrOU?;R1xht2 zI>Vye09gE~0X6~7@IgfZ#TsZqPJWF=AmJwUF|r-DM*f-&`{I|X^;5`qKv=*j)W6f8zXe+Qi!DN z1_Q;?nxU&8_ME$6z>bmY{r>UdRDt@aVSd`Wg6NC&eH>um3@cZ4`Dv8Hl`OZ?005L=;2^Zy;4VdxoPy+B**Sy{3 z*W?a1c-;M9S?TnLVP`8ISCfUv+;o**gX_B9P9GP2+x>H>zsluygXn-Xj;*o6wMFw{aiFxnMbMzC{*P(oz5N(8_)*7DON zrXLIB#%EK#mIxpvB7w8E_=q>Zi>7I@X>GiU7!O1PpPr zOm2LVF*sW80ufii*{#>FQ}$IG0iYN&YMiRY1GMEGs9e$v00zY?3N`VX4Y~_R70+fJ zY;chB&*ou*Tdnum{o$j>g&BhCX+iQ*#S!QB9tsYrL~;$V{NUTb>_AX2p|^d_w976% z8$eM=mC|j8smOu(o z)6m6lS5y;vAVvB5Af-?{+ptsZcjRbjmJsn-MMJeUu(zcM18m3jtTMT%noEHSRRt>x z2sbJDCdS>&IYM$x{aR@hg6+6=HtA3*t)sZ@z^s;_-qnjXT6B z0B2zs!F2Q4t>G@f1sZ_SZ8$f)CnORn!F|C008DDAZUIlip96w{2|aRu<_1*k`ow!5 zEm~S83k$@nnETIc){tOzIU&=WyuctKgM|k}ikftfxdBFqCxLe|85|k}A?!f?XE-Y2 zA2Y0pDCc3o{;`xL0E-77w%+hWEAd~fN+5cWq9G85xk;_z?d%G(+uk=kfoPH`WQ1%t zi9i#A#TtmF$RC`)Xtaw$5&_3;uR!hgv^XN|NjoBW#Az6S15LX-?B5tQy3zp2AZ!5U zh%U0bPN=#7g}paxqh>e~v$#NP!K1a3Q#1t|Hxdv}1BgsqWC~k=JX9w;JPrk6q9G9z zon6unyq=I5(P`uu)eTSr>?*s^1sl*{RhXM{3WYU5M6hzeW2K9B71uVjf^Y&kDH_D+ zLc(kVo&k|jbs~vSfEqHy7la}aQJ{friU?Gak}0)72uB739B`F%wuBQ%5jBW<^f{`j zwMGG5>@<6V2~8;!p~<{?<`iTpy^VpxPXR*eTu26vBU_h7@SPFQh=HLPaM(BiP7Q%a zNa{d3aaf6Hy`e#z_uMyS7%OI?+HD&f{xX$x@#7bXbg;1N`M83D4FRR&ed0F55t?Bn zsP!&3XMq%MiZFm_3_Fa-RoXc(G&|NLIzY(GM)FoTP|g7$n}u+`Jg7@ynX{s>+1Qma zsOFvl^SR>+n;W7>HUT%9B-ty_&2Q7bF{uH_3nuyvYxIU{{z-y`hnNQa=Aps@ z*b8lVLP>W(Tb}SJ5!k9c7LCxW$3tZ|M;Y_;5MfmIB_pMH zjqqyFTGDoM)(6W0a$`h^o=PxQ-#PXIov{T0TZ6JK0!m@!X+jc7Dg1LJ0*wM}2-rG6 zN+^u-5aKj2S`-Wlpe^l!yXC-46~HUAXhY*~CNp)(I#zAC?UmIAOfl%~qev@Y9r8x9 zsLYEo01vLuDTSixm}WLZrmTd(6{lup2nECppbpj$Lw$z{c1765OM=3H0@m#vt4<&? zSnzTG00|$KSWyr1{B6hR8ohvi7$So~jp|@Ku$(M={9(CdG;xorAyAxLA;KqiGXmmL z+W^hkTHu21+d%E*$VaBw1lUj%-hd#3tbWE;4Xm2g*ue6@tX7D_yQ(AJKcb;tO0BcQ z^5wKAAo*%@ezKD|SnBZuIu@kw5Z!B9knX;HdduPp6kw>j0H;^jB+=0-f{KwTc01Sq z0FGbQ0sD~!fD%}ud6Y3yiRimDHtUiymYKC1TvX%(vO9HSPO;hx01Yd?ojczb4W$Fc zO(j>s4?D-4lI+S5@0ifKEhkd+24rmk96Q+6ucZ%;j;$&ogjjXgk0LYTLU7P6cnd~*8 zQ*b{^@Xa07Y9VR~3M{t!!J!KO0GSnqX_Bx711OQN3#`~$Tyh|GiiYr%n^V3;$!RH3 z2n&uz3=LCAHzA@x8Ul6(z&I?1@fI9`Ygu*poge^gQVFjG3XDLNCWy($#scDyZ9;v5 zed3NoPgV|9AjY+0i5OM6(ZCTCM)y|ou_4VPU^#m&269yh+(00R+-}9^seyolN(~i4 z^bU5`={Eun&ocFs86AeX{{Wco+BeJ`cMGaAwYyH9IWhxTecXW)15wuI7|}$!#*=}n ghH`Hp{BmvzG=Uaz7n~2KiA|lhLrGzL{{Z*@+4dw6>;M1& literal 0 HcmV?d00001 diff --git a/test/test_image_encoders_jpeg.py b/test/test_image_encoders_jpeg.py index 687f1af..6bec91b 100644 --- a/test/test_image_encoders_jpeg.py +++ b/test/test_image_encoders_jpeg.py @@ -35,5 +35,25 @@ class Test_open_jpeg(object): assert r2 < 5 and g2 > 250 and b2 < 5 # ~lime # Check if the blue square is at bottom-right corner - r3, g3, b3 = image.getpixel((255 - 8, 340 - 8)) + r3, g3, b3 = image.getpixel((255 - 8, 341 - 8)) + assert r3 < 5 and g3 < 5 and b3 > 250 # ~blue + + def test_jpeg_orientation_invalid(self): + with open("test/images/orientation/invalid.jpg", "rb") as image_file: + image = jpeg.open_jpeg(image_file) + + # Test image size + assert image.width == 341 + assert image.height == 256 + + # Check if the red square is at top-right corner + r1, g1, b1 = image.getpixel((341 - 8, 8)) + assert r1 > 250 and g1 < 5 and b1 < 5 # ~red + + # Check if the green square is at bottom-right corner + r2, g2, b2 = image.getpixel((341 - 8, 255 - 8)) + assert r2 < 5 and g2 > 250 and b2 < 5 # ~lime + + # Check if the blue square is at bottom-left corner + r3, g3, b3 = image.getpixel((8, 255 - 8)) assert r3 < 5 and g3 < 5 and b3 > 250 # ~blue diff --git a/yoga/image/encoders/jpeg.py b/yoga/image/encoders/jpeg.py index df5b995..07cceb0 100644 --- a/yoga/image/encoders/jpeg.py +++ b/yoga/image/encoders/jpeg.py @@ -3,6 +3,19 @@ import mozjpeg_lossless_optimization from PIL import Image +EXIF_TAG_ORIENTATION = 0x0112 +ORIENTATION_OPERATIONS = { + 1: [], + 2: [Image.FLIP_LEFT_RIGHT], + 3: [Image.ROTATE_180], + 4: [Image.FLIP_TOP_BOTTOM], + 5: [Image.FLIP_LEFT_RIGHT, Image.ROTATE_90], + 6: [Image.ROTATE_270], + 7: [Image.FLIP_LEFT_RIGHT, Image.ROTATE_270], + 8: [Image.ROTATE_90], +} + + def is_jpeg(file_bytes): """Whether or not the given bytes represent a JPEG file. @@ -45,22 +58,13 @@ def open_jpeg(image_file): :param file-like image_file: the image file. :rtype: PIL.Image """ - EXIF_TAG_ORIENTATION = 274 - ORIENTATION_OPERATIONS = { - 1: [], - 2: [Image.FLIP_LEFT_RIGHT], - 3: [Image.ROTATE_180], - 4: [Image.FLIP_TOP_BOTTOM], - 5: [Image.FLIP_LEFT_RIGHT, Image.ROTATE_90], - 6: [Image.ROTATE_270], - 7: [Image.FLIP_LEFT_RIGHT, Image.ROTATE_270], - 8: [Image.ROTATE_90], - } - image = Image.open(image_file) exif = image.getexif() - if EXIF_TAG_ORIENTATION in exif: + if ( + EXIF_TAG_ORIENTATION in exif + and exif[EXIF_TAG_ORIENTATION] in ORIENTATION_OPERATIONS + ): orientation = exif[EXIF_TAG_ORIENTATION] for operation in ORIENTATION_OPERATIONS[orientation]: image = image.transpose(operation)