From cea36587ab209f00173cdd8716232fcc3673a868 Mon Sep 17 00:00:00 2001 From: hugovk Date: Sun, 29 Jan 2017 14:03:38 +0200 Subject: [PATCH 1/6] Test matrix convert --- Tests/test_image_convert.py | 35 +++++++++++++++++++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/Tests/test_image_convert.py b/Tests/test_image_convert.py index 54ffde10b..6128dc9d9 100644 --- a/Tests/test_image_convert.py +++ b/Tests/test_image_convert.py @@ -20,10 +20,10 @@ class TestImageConvert(PillowTestCase): convert(im, mode) # Check 0 - im = Image.new(mode, (0,0)) + im = Image.new(mode, (0, 0)) for mode in modes: convert(im, mode) - + def test_default(self): im = hopper("P") @@ -137,6 +137,37 @@ class TestImageConvert(PillowTestCase): self.assert_image_similar(alpha, comparable, 5) + def test_matrix_illegal_conversion(self): + # Arrange + im = hopper('CMYK') + matrix = ( + 0.412453, 0.357580, 0.180423, 0, + 0.212671, 0.715160, 0.072169, 0, + 0.019334, 0.119193, 0.950227, 0) + self.assertNotEqual(im.mode, 'RGB') + + # Act / Assert + self.assertRaises(ValueError, + lambda: im.convert(mode='CMYK', matrix=matrix)) + + def test_matrix(self): + # Arrange + im = hopper('RGB') + matrix = ( + 0.412453, 0.357580, 0.180423, 0, + 0.212671, 0.715160, 0.072169, 0, + 0.019334, 0.119193, 0.950227, 0) + self.assertEqual(im.mode, 'RGB') + + # Act + # Convert an RGB image to the CIE XYZ colour space + converted_im = im.convert(mode='RGB', matrix=matrix) + + # Assert + self.assertEqual(converted_im.mode, 'RGB') + self.assertEqual(converted_im.size, im.size) + + if __name__ == '__main__': unittest.main() From 90dac5f4dc529bc60e94b387960dd0b5546eaa19 Mon Sep 17 00:00:00 2001 From: hugovk Date: Sun, 29 Jan 2017 14:24:49 +0200 Subject: [PATCH 2/6] Refactor and test matrix convert with RGB and L modes --- Tests/test_image_convert.py | 32 ++++++++++++++++++-------------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/Tests/test_image_convert.py b/Tests/test_image_convert.py index 6128dc9d9..170b174ad 100644 --- a/Tests/test_image_convert.py +++ b/Tests/test_image_convert.py @@ -150,23 +150,27 @@ class TestImageConvert(PillowTestCase): self.assertRaises(ValueError, lambda: im.convert(mode='CMYK', matrix=matrix)) - def test_matrix(self): - # Arrange - im = hopper('RGB') - matrix = ( - 0.412453, 0.357580, 0.180423, 0, - 0.212671, 0.715160, 0.072169, 0, - 0.019334, 0.119193, 0.950227, 0) - self.assertEqual(im.mode, 'RGB') + def test_matrix_rgb(self): - # Act - # Convert an RGB image to the CIE XYZ colour space - converted_im = im.convert(mode='RGB', matrix=matrix) + def matrix_convert(mode): + # Arrange + im = hopper('RGB') + matrix = ( + 0.412453, 0.357580, 0.180423, 0, + 0.212671, 0.715160, 0.072169, 0, + 0.019334, 0.119193, 0.950227, 0) + self.assertEqual(im.mode, 'RGB') - # Assert - self.assertEqual(converted_im.mode, 'RGB') - self.assertEqual(converted_im.size, im.size) + # Act + # Convert an RGB image to the CIE XYZ colour space + converted_im = im.convert(mode=mode, matrix=matrix) + # Assert + self.assertEqual(converted_im.mode, mode) + self.assertEqual(converted_im.size, im.size) + + matrix_convert('RGB') + matrix_convert('L') if __name__ == '__main__': From fdf0737fcd601942c6f7b8d5ced559796cce7636 Mon Sep 17 00:00:00 2001 From: hugovk Date: Sun, 29 Jan 2017 15:55:17 +0200 Subject: [PATCH 3/6] Test matrix convert for ValueError: image has wrong mode --- Tests/test_image_convert.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/Tests/test_image_convert.py b/Tests/test_image_convert.py index 170b174ad..512a86491 100644 --- a/Tests/test_image_convert.py +++ b/Tests/test_image_convert.py @@ -150,6 +150,19 @@ class TestImageConvert(PillowTestCase): self.assertRaises(ValueError, lambda: im.convert(mode='CMYK', matrix=matrix)) + def test_matrix_wrong_mode(self): + # Arrange + im = hopper('L') + matrix = ( + 0.412453, 0.357580, 0.180423, 0, + 0.212671, 0.715160, 0.072169, 0, + 0.019334, 0.119193, 0.950227, 0) + self.assertEqual(im.mode, 'L') + + # Act / Assert + self.assertRaises(ValueError, + lambda: im.convert(mode='L', matrix=matrix)) + def test_matrix_rgb(self): def matrix_convert(mode): From 7fba16b07450a110eaf363cdb805c3d34b8549dd Mon Sep 17 00:00:00 2001 From: Hugo Date: Mon, 30 Jan 2017 14:27:29 +0200 Subject: [PATCH 4/6] Test for similarity --- Tests/test_image_convert.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Tests/test_image_convert.py b/Tests/test_image_convert.py index 512a86491..5da593e59 100644 --- a/Tests/test_image_convert.py +++ b/Tests/test_image_convert.py @@ -163,7 +163,7 @@ class TestImageConvert(PillowTestCase): self.assertRaises(ValueError, lambda: im.convert(mode='L', matrix=matrix)) - def test_matrix_rgb(self): + def test_matrix_xyz(self): def matrix_convert(mode): # Arrange @@ -181,6 +181,8 @@ class TestImageConvert(PillowTestCase): # Assert self.assertEqual(converted_im.mode, mode) self.assertEqual(converted_im.size, im.size) + if converted_im.mode == 'RGB': + self.assert_image_similar(converted_im, im, 33) matrix_convert('RGB') matrix_convert('L') From 04e3f585b036cbecaaca0be00213dd173f248f96 Mon Sep 17 00:00:00 2001 From: Hugo Date: Mon, 30 Jan 2017 14:28:00 +0200 Subject: [PATCH 5/6] Test no change with identity matrix --- Tests/test_image_convert.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/Tests/test_image_convert.py b/Tests/test_image_convert.py index 5da593e59..011f23bf8 100644 --- a/Tests/test_image_convert.py +++ b/Tests/test_image_convert.py @@ -187,6 +187,23 @@ class TestImageConvert(PillowTestCase): matrix_convert('RGB') matrix_convert('L') + def test_matrix_identity(self): + # Arrange + im = hopper('RGB') + identity_matrix = ( + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0) + self.assertEqual(im.mode, 'RGB') + + # Act + # Convert with an identity matrix + converted_im = im.convert(mode='RGB', matrix=identity_matrix) + + # Assert + # No change + self.assert_image_equal(converted_im, im) + if __name__ == '__main__': unittest.main() From d707cb3692dab6931ea4f3b5f6d7b874a48ac8cc Mon Sep 17 00:00:00 2001 From: wiredfool Date: Mon, 20 Feb 2017 13:41:28 -0800 Subject: [PATCH 6/6] Tight similarity tests for XYZ conversion --- Tests/images/hopper-XYZ.png | Bin 0 -> 30271 bytes Tests/test_image_convert.py | 6 +++++- 2 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 Tests/images/hopper-XYZ.png diff --git a/Tests/images/hopper-XYZ.png b/Tests/images/hopper-XYZ.png new file mode 100644 index 0000000000000000000000000000000000000000..194d24540e1a67bbe9f0b402df6e4ebe684eafad GIT binary patch literal 30271 zcmWh!cQ{;67hWZ-kXY@f$LcjfB)VXOAkka&79?sy5H>o|YxLf0R$rp59^LAzuSA!{ z>cV0_-@VV=dG5V)|CqTm=bZOF??h^AzIt$<={^7ec%Y`Lq|- zVh2SHMF5~Kp8VSS-rYUeR#jI60Py9xYZnRtT>ZcO4glaO0s#EA0sy4b0RZ}s*{wRV zcP~h6UcXWT;QxQ-Bg($tJt6z3YU}|3Jna2{AsBEge|PsOnVOQK{+GoVgm=50ktbUR zY7v^}g~MPqgqc!w=#vr>KoDTiJ%**G~PB0yThx#Gf@2AI)I~+nHLIo(QloFetjI@5@IKJL%_PdY? zxT5zz5WK*T=|@YiXxbiEl6D@?tX^-fif4JC7m$mumzo^pPog{jIRsoCmE}oGF0^js ztlko>o>ya6+MlaA=4<>xT*M&%1R2HQXF4y3Ok76Lf>@S^6rdsi9UoTmJ_bpRvy$B7 zH4ylG-y&2eEGQ$0G3NpRuwrnB@Yk{Pf7BK+J*NODQG>|tf$K?Ctn2{*ECGNZJtK&K z3IL*d(mK34aC8r_mytmgL`V=$T?BD$4)5n1ttce z8k7#K<+-pR=O3Y@fv}Tv)mPVwlX`VgL+m*H)jX0oA5(8 z{9Ibc;Vd{ksweVXy=)cJFDhYr@GZ;D?@!CioTh#FNeGVe5gM=FnJ2)_%fnlu4d@Xo zeR(q!kH7htprJKRP9PAd=vIR8oyugd{cmR;!w1>cTQhieYl^v6)*zYJ8rE~X`X?`ZSa5^+H)e~7~dtR-sk)0w0>ELholwXR};x@sk* z%BqvAyD}V|qA1HExoc;cjbVkMZwz<%)-S4~>%O1OC$y~~bro9m?B$1-x z6q79O$Be|e0{cGR~kZ7ez6c;N;+(sJh;w$G61#Zye5jfyEE2E_m#pl<>|XT=)} z2~8U%d5c#9MlPS{Hc$2ls1oM12t;TmRa}SwXq;zBV+S|j_p<8SjErt5k1AqiTOi<)^p*s3elP|qx$vnEy5txV~B7vSB{;}}Z zuxN1+dCN>8t*gO6^fcjqC@SN`cjSCbc~ai<_-6u5@LJD1HEN%6xNp^Dy8qFoE!$-S zzOA)B+b+ZeQ9uY#4cMZ`pX9GXe~;wFfB#1su(66Cx5SO(&gD)Hu$Og$H7&QcY&S*g z195C$H_2y*w??Xe`W3eDYdnYqgj!i)+|xdA|BdyX{YeWV01{B$6A_bCdWQutBoJ5^ zpV!ekT2?R36Mk%I;u;>nXc2M%zF)+tf(bdE)?T1ZM)rmua3%q&zhaJ=RY}6ZufrPs zCqRkaqB4Lj-ElzutMkF%KWUk;axxrBpCc@Q+{8@#*$x#OA4QaskvPf7FeN&rh`I|y z`ikeJ=<=k`PeF}1J&&Q zlKg~ZEK*Ajk5uJTO0;{Klw20}99;4yi3_OI+*Wv|kVO!vHJy9rQ&P(C*{Ski;gO90 zjw$-`;NoT}?_nWBLUd!R+i;46=m{pK)PK?(H{%SUt)0mLbJi zNPd2gCvR>)h{K-*by81JPOYbzy*NT*zussxA7p0!r|JDhRA2X-j!?0J(3yOUD*;d& z3<7|y_*XXRC2+MZ5lx9&^HaOOxh4{MvU@qWn zBoANKiT@4t|0gH0+N4Z>cuanf=qBs6F~JXG9R>ykr5lULC=sd}VlQ_I3|zhO8bnMkW~5(0kqz^4^36az!5ta3NepfST)`vUE83J*aO_ zBrdbR7}@6| zUJW^5+i^_PAI~1FRWiH!Y~K4fBkynT>7y~&CpD3YIU71R=|rbDsz9TIxzal10bl}f zFd+17)=~lnP*6g)M6>E~xTB~NIewW%)xA{WdPm}ge%WGb^Fv?Z=@M530tf8~INBTH zWy4(!4_8u57{?WIF_#)=e$(kgQ-M6HGz711An}f&q2{vJHf!e%X~2u;4|ElC6+uCDwN36l3$j2Wt7*&+ z>9of=QibnsNc~TFlPk@P5f&<46mw<)CyNVuYTSFCP{>+OX;_Ka$kT|2tY3DKZ8bXg zzr9oy__&Z#Tf2+qWs^CY#dYSEN&_8HTPcptpLJ-Jlejo9K67<(l9C0^<8+P8KoKsV zgT#L(76qgZ1ZNNg1ub|~WLnw2(eV#NwOmMR&IseLgu@dfY(9+EJ{J{b`5dO7;%HuB zC9G&{FH|XJ~RM=@|$(iL^Fi)LHiJ zc#}yL5tMR4&aDmC%Z9)6h=D*vz5{#>AT&+tDUvAh*gZ;LM_7m z{B*LxLF;knaZdrwE6vYyiy4n(ai{CL6&6sJ377Fv%^8di=nJ5hM1T%JqBxNqD08rQ z>?eO{?&0wuFk6+gRR{y;DV=&|r(*T)+k|Td3y79R5*;dXQ4!V8ol?2%ruC z2~8eN{{zfTw7)A z1WplDaGz`<=@iXe)S%c2BmD4Y>njy8^$@*}1qm@4s#HcRLQBCk39XHINY(@Xd(oC9 zK90bL1SDIE?%M(PP68)5}Zkz$CMBUU<&?AoZp(6!^XPfKHPv)oEuN-;+`o z57TBX%MS0ko~_4Yk*MXZ$5~CTe#dn+dD5SX=k|q!b4`q8{SQ+dq@6NA01D&#x!pv- zdujV6SU;@H`aHezz~T>dxu=Yi0PwZTLHqXED>M|#xU9n5)B=cif{4I`6A?^^`C?zg zL-+u-6es-zMBV)`g=C#V^hphVAH|wAO&bV~_%}b9_K@{!_hM!em5r63V~kT{rFX|= zbXGnCwX9Z2xuXe)z-oP`)q_;8A+PXGvn;nw+_k zHgjn`W5kIhO%FrwD7rzP zU8LStkva$j)FF8NE)w*G9yz*~T=`zfcHL6_I?pw$&jis%Cn*h9PgRvIrVT!Qa;pz8yC7ordH?=}TYf$0eqHnPYN-Qb zxq8xsB`c)C23bJ4ylfAcrs^uKegX=dg!!smpJmr_3Ny*7oHdFz=>Cl=>zQNM7R9RZuX zvACjV`zNnHbKD-WhN|t{SwLl37X^8Do}JU@;-|J?OBUX^=C7C0l&S_meglT5PPS${ z$#rQ*(LxtNv@BO0By;{egEX7q!y;ldK54WK7O-&t6|Bym#EV74ddADbIF6jCq z6Bz7AHo-=`|39LU=#kYghZtnJq0*$?v*6_4Hm|yVkM{Sa-3!oHCN$w=@5;9Rnt|u^O-fJg$9? z`g+q%Du0Lexl;f`o4;x;+#E6fH%0;H=Bv1UxXM2Xw%hM{xAC3ze%o=|c|OY~9%r5s za~M7RLD?;oR_g_>PcQGLkM|*)>}gNK`1mN&9GB_Td4fZGoIQ|uKsut^C9>asJVjH} zw*H`1)zbHN==%WWb0!+N?J1qM!-kiSqAjWk@%x=g|j!<&^NAAdejm(e6BZ=|mZa!L#S!NjO9cIkU z4=3-p$M)za{x!nYZC;DWm;k^fCi*;sYb>&&4{9Sk6_iqc^{+QxY6RhGd2h-?75a?rUS0R=-@_sPgyZ)@dUIiOy>rX$n85VK`rL$r%|Tk`@el323xN{oWBZIyjx@OlIhjsC8d=6m!Cff&D)kcRHl8EhZ~ib zzm65&M|&)c->lV`d-Oh3_DdjG=Y?~n z6p8b0w>#xMuZ#1C6g#m$sHhRbp{JuJn9-jz89(Iqex(3{emsuipzIN;cm`{LFP{E& zhx#0Ca)xWVEwuhx>K?yd%Htc+4NiXkLgR$%gEUl$zH|<=Tj=)r)4z#=Kea{`eGo`V zW}n)1>k{@s?~dt#-#GpXjz9f1{`K}G@Ai7-;wz@a$P70WaHY^ZH#BW$J}*-F8A@b( zToit>kEqmxaZ|($j#htGi6l;D7lmb626RxW(-ZeIKj^u)MKC^oFC{HK_h(e-5B;jM z{yutn96#WXUk0;L|9_CRkCKBP9@wSM=Gn@dc>I;jxO_wB?6UuglPh$ipvF^LP|aYL z*>Nt{TujVEDM7zy^VhFV9Hvv?sc<>dx34FU+ca|}+wm#fB}{?huc3wxqv8?8qWogv zpZI8vF;wq5mnaJb8UVoFTHmcbW5qr|MIroISBL0d{7q(pz(XweQ4Gf zjh%=oL&bM7P5p*dk2#W(){2uT&)Pb+!?jo}FMqS$9<0a9UR`Ph9G^x`tChI_n;7}9 z_`>~P*c~1+ftj>jEixA;BhVAZpR86DLkC-LAJ;4)+P~W1JM7p6P`eyhB2$$r4JPG8 zQJ#@0$qEL{LbSb;y`*YNOh(-*Hq6?}3l#^5|OA(kWL4Cn$z0!X~qG zvKK?kLlf*4RT7dQE;G!wtB)jJcqk?-=$h5`apn+h^XHun)Ehdf@wctqT1jT-E=V(c zhV83y!)A5wRaI5d=zWJTHs=4k3qQ0PW@x?%sOEk-6{Y<_dloLouj~K|So?S6YkT}_ zJ2$297U}JWm*_YjOuTX6;VBW7))e4+o7K}gT1S>F(*H`QT!Tu5YCC(|WKaQ8Ti>3| zr6#?{t5!liC$pb2G{kQ^nxV&Q08&?j42w`88X!sV7LXM@?t2vN+l`iF0_fi7Rsqn8 zD{elK)0)L$S0rl9qB(0@Q-G4Im>RH?Gu?Vfp=LKVPdiVl_*;&QJA*ZmOCO+Lx+75v zd9~og@~UZ@SA7mXde5tEbeKJx{NC^>3!O3*aiVuuT>X!PrxAtaeD`4Kts&mk<0fo5iur?h zE$W*!xa6}1vmQ8AO&Z${N2Q*D*omwfk4DG5Hq5wn$%hh&jyS1yoaQN{t0T?NsIyBsly|>#={`Y+nvE70; zkUQlVNv?+aK&K57aD$;*O<-cv_?zBUcB*&AOe&&cV6~+CuqkPx2&ylRj@#>$@+bc| zwMusn@z*Ff&9NsUzT2Z#^PEX2Mh8}EGKg(#!c^VEo_U67aL(ffi#TB8m|fsgj(zvq zgqh044V0;h4k5iZFsY}(mY6a|R+nm2$N&IPF||MJ8s!1njH961*3TFo5)4AM1?rHm z85#6c8NXSV!-c6pp`jG0D?UTRm$b_LTY+Y%a014_k^8^jJ~w9|i@$yHQbd6K9jD!9 zOJg-a39utX6vz_t2=J=p={Z`)A?8W({a~;Xb#M2?`zP*2`WxA=Xy5vhl!J%>ly7cw zZ)W7LE4-~ss2`Fz_5QJ@)}iHxk+a(wcUXB*5bpuHnCO48gN;pVJ#|Tfxu^;fC{WPt zg*wu4h`KSEpmHKn>d%~~dCGve44CNpQ|a}$OHV^QT#HK)pOMB+WF??sMmLx>6)*_x zgLS8i00U2CZSC1ZK}mIQ9Iu}4N>y9ORoZsZSKh`JJdLI7?qm^(r)S{`WOI-uhQ2#q z4_ObAob1 zDUns_KI`D6+;r$XWscxk7cD9G~c!N8YDkx`KRu&zo zBVy26z|1m1^&8emJQ}04?T+F+>535PkpWk?m2v-2BK%1u^o@$3JMA88S@OHB!oio? z>Le&>b|MmRvg|i|5ddzo=tdap_N+9@IbWaU7ZqUJr&E^-jpMsN9=SKDxWzFJ(n+#9 zFC9d9s7La}$ZeB!89R{+hJpaP-~w)Hq%kp}5|&jY0jzY0j-dfys#Hpr-!^r`*yk{; zfYlUiuq^b%QQd0F5j|4kCNwE_KI40c234hC*$K&VriE{@9kM6BDvN0{qP`uYnr5^t zV2(V?U&-931V7*OrCJ858_mhsk87)c7t>Y$twTMF>yg>c@pNVo%72q20H6y~OHyfW zATCz}9-0}l2g$`z&lJt54+7xLqDu zN4UPiK!BUsdO?JN;N(v%yeY-Hk^1?eAmdc3dyvpkNrrc?9em8Cbbwx1E-m#LjMUXo?IZ=mOdHv8u-zod{1IA#$$IUF_U>; zI8b;zt`?J(*JQMto)~wZgPNTWqYv6n(C@Iv0{(}x}ierg|TZIA@0f!`3pKqP- zeqs5fqwjX{{p{yTJ<#YbU9t);j<;2C{wstl2O-v&KDFDh(j8ZQ8M(VVwj>PQ`!itq za9WNiv7Eu1Bv`cC1U4llQn)q9n#zH5H z25)=+LKDuCV*V(;N?<`mv4;=~@P255HD5~Q`y5lEAa#*0$%;Df5dX5tOaK5DEi_`P zHyxN@_n}0(v#Fke_}yoT$Rg`SO55ZL^fP(S6OB3KILWK{M}7wxL|sAPsn+s2nw|;r zM$|XOKJ@nlG!!6!ITm@+kSsu;V&$%6V@1NW&VMawVCjF#- z1s8dfOab@W)2Wb*a@18ueoCY>&NQlgu-*0k6$6Rll*@%-Dr!nGwZzxmy~uV`V@q{kcKK`$P1-(U6vu9E8d+R@m&c2B;<7qTUHVq>z4-H_k(z(;@@Ht-{Q+2{ zNK7*5cMuq8Q0PKJ(f^-PaNm3rKvXpp@K$mp0s{2X{0@Rh+ftAXMkiO8&%Cx6})#4&{m}_f9nK;fa7Jn_C>1Qk5AWzhuxD# zc~ex?!G^iYV8ZoSFn6&#lHh5e<+xup`LXX?ZNk%m%H4LZl~z`CgcVC?WH>eB#TIn+ zc2rO6ri&7Po%%S-|BODs7!#EIWdSW%-EzKl2R=E2bVGa6DJDfF$C(sGL%aO-6J8R6 z+37?G@IWM*zwlKLr5jzo)vy=(Z`7!$+q zoXG4%kr?w`oyF)sakr@NO4e4NU13zgy?lI8Ht7!mmCh~>o(qf(_4UQE|0&jf-qMFn zI*ao}^zAjl1O;FFbh({jXW5zHl=83X8{ihx^^EkqgV;?id|^%_pS#c721t zB4umGd#q@tK8SXHJNjhwU5hx9kUG#4?dvwjsR-FcIK=Y>b~Bm+2=d2{Es9#eVKXEG zvxcAqkCyudlXrNMooqs7U=|!D5K5ill;SA8$5htM%&jUw75+5NuBMHzk5;!Y753a3 z#A&=8t*2@0K`@qFve^+Zcu&szq7S-rBxw$?J%VUZ>by_B~*IRA@)+g6HT?`0ek>v>Y(~b4XqDBpb{4``=2=TwqjirlM@_Xste=iCirpj-=x@2 zA?DN89508*L~)`^r*KGC4&Xp5kdWH79LnJQ1xGTn zy~t1nYF+;AY(RIH9Sy4AcjMPRbhKvw`y2vf$rF&Zxej}rG~v6>IkNTnMcFuNb6Q1^ zP_7&|x2N>$z)QsH?PD$Zn=W&=t7?pe2j-Rh@gF!`8Sq@aJ&^YpQt!D41>8?6HlTGC z8D!b!?)sMD1otg#P**}O$zn9#ym3WKvwgdR>;OoGfUZG1<&>fXCeU-C8( zV9n?F31$e(k^M9*m7bXyQ$ALutf;quazjCGOFOPd>XdL(^hnY>&`p|z+l4uUD=7FDh*O;Xx6j`dQaQUm}rV^T1ev4nn7qH}ZGagWEi3}u>`|GrG; zNw{X7q(O!LI$zw{#>SAXhp9OJob<(UXTZME?JgGY3Ti$e-0k@Ja?4=$re(mcy&0|N^`iCl^7*&9(J{9dUjMjsWTlMr za+WTCjpNs=SK9pl())k#^%5BIZ5@Q21zf!f_;|dNgj5|a4(;O$yXjujXhs(kPG^_j z-dRN4680zVbsnzxf=8GH!XYE9?7#21l>Hock@G2LwzB+y#to$k1OH#7n_<+9{$?lTK_YsWp7K!5Q_^_>2*c$=0-IH5e5 zlkLdS;_ue7B-ij|YyQZV^x^(0egDuB`m)CHjBNYxJN{qYcAlU8>g(}5Nw1BWq4jC8 z=^G2E=jIIa>h;~UJ_>zunqp+}0DxRlDQa>VNtKMG7k6W$m{NeZzZ%fwzqcm`WjS+q z0R~zB@aQiALLgmJQY+dtrU7(mFmC{bD)R*i)#j1yE3bW%t6BW%NpEi3#*~wV#|g#) z{|)+(%~$iDP9hzOzU$`~ugjr<&fIOP$S#>wbrDm0HsYR^(=AiCjLh5xk4x@=Bi?{1 z%wxy>LcVk7*I6(5U?YM1ajb1+4oQYpnGff#5ME^nlMUAiErcZ#MXSdN&FTr7O^++r zcW*KTXDM|!935gkF5~jXYu{61*=vAx<)HA%l@3=dl72jw7V>2)WwW8bct7P=WF$$V z?^+`1HzM3wjh_qVTy9+c=CfbvET(Cx$^mz?nQ^(BX6buM!-iL_lA?R{x9=#;$S5u0 z9ZbM6i&wbqda>dXmQyY3-%exj-=K_bY_b55!+fKLnk@bS_TD9u+_~3xrS$Wq@W-HG z(zQ65)nu-QfQvt!b1h%~EYRoqu1yxbviR#|RLD0EorRyN=v8RnORIN$DKNZ-;Dp~^FpQ>wq(a&^+8&pPf|06-(w|EKebuq zBbW=U$SI=^EXh|1l${pbC-`FaqDaL+rP@xw;I*DeqbbuR=Zp(*2Iv zE|@=z}ySN|pNuNR%SfBh(Ho(PBOye6R{`$G|`^R`MNsdx(0#P$vrMz7nT^rX1$#lY>V-S)+0_0I zFT?l+oBavF@%Fn!0Ji)Iv141^f3igigas#x$z1s0JG!|xE&rSxaU1KGiZOh5L#+ps z8;F16%j_-la$8iB!$r@2#Hw>$W)(M!>$qOMJsD?}cX#x+PD}pNk!F$nl!`+E;Buvm z&dSNk&B=3l##2_>EQ=rY=pqoS6nTf0BkK8G>D1Ks>2Op}7`uq@wlBS0{=T{cpGzv1 zmXb4adsbG)E4&2V?NcgQHBKhH+E0(LAdQWGcqF#tO>MUjUL}$@X!D$(a=mIKTtP%TpXa3JbdkK3Jq!u)*~ag zwp>hkczGFR1EZ75pNmdn;R_!CGS8oTF3=fu98X2ld|zVK^wmsKpOra`5da?I2jDtn zvBx0J9kUF7hUWaZ#e;FT3CTvhQq7VBn_;CV*J-xNx~vCWnqO%%2={2u`*)DA+*kZI zTV`estvbLXmonvkPc6h|hb3Fi&&&Fx$*CFvM;mxMAl}>Fi~g`KRk=i8~KaJ$y=#af`5^`x7!R{MO!z z#!Ok8)WE;>y1G7P)J|+>9^3Ubrw;XTd&*i2vv=|J^0FRja*^=@+muj~sy7hoIo-)7teOY7CIh2{LO5C3oqJFj%SR9$k)QzH$L zWfoa#=Su>E1n!6Qy;ad2+v3S;-nRA`0@2YW=g2yON3g_S?<4c2}B9g=TBYf;hFKnIcBFXB_N zg6VN(VG2b1-v_MCXB36Ui;~m!m^kGqo+>SHr!@+w9WGDflGVNT7hCGTtPNLH-z}V1 z!D40c;>>iA@ZVi0Gp7&+mE33zQwe5Uz$ZJO-NDI_JL{<@@N+Y+jmp|{_cX{)c)#@> zc6864j!QkvC-*sTsaBqJX>dYN^M31(1?OBT&vr!9*S(zr4lN_YG=R=hp_Hf^SKEGW zgN4)nj|aulKBubbTcAgd(!=G*(#gI4=;(1TK2HqeP zT4}rAK;n zxWLI_8sQ{rPaX?bfGcLp&Mo{-dQu;cqSD`(5?NhivbCr@xal(UJjbMFa8aW%=&s*V-CVx zj84Cqa8pktCX`MW2@-*2gGu54|ytEY^9l1Nk}pk0pCxh5$fKMv!Qg z3^_)Nn%)UyiB-ZiYtQzw=SCy;QnUepouCY=1mZ+MH`0byB}^P?H|q%F)8zu^^TieM z4L-G)fA#^9v)afVqmJtpQaYblhlqZ8aidw|$A6f+G&wO?$bS3y#+@zXp8?o4Cb$9C_&w0)3>B zD%#&4X!jcFyi%3?+bmV1_0Q}>N6hliK9{VZb7ksOB&cZ}mOsrWgOwp_&d4~Z2rbcEiv}g#+ z;Xgw?mCJ~nViVX!wv96%lK7-PB)$3b(JJ=Iv5ku-9GwnMO0)3aM6tFx!hNAG5BTde znTU{tWOSjQ@*(`QSH9*61PDn|3F!w#BY7BM&LA#Svu*b3BlE%}A+WlY8nG(sa;AkP zF)RX9k`GX`CL7}9qU8n;%=h^0w;!Q^N$3^@Y4_s*PeIVwAgneb7+VMPZZPU(8p2ZR5%Z>UBVmW8}Bwjh?+yAsIqlK zX1S*38@rqCU7CUHBM*Tt0_x7)=HvqUO8 z4$i#qe8t?ug8*YzsvOrWpoH5>lgsuKw+Cc4*m~x*g*XZ5tNG z$*R2W8|?5T#bn4UBse1CYlg8wPdWr-y4||(g?QA7gQ7imH^~}yJ&*aKLa7BP8myZq zGg%%sK(-;3CPh+*dp|zy{D4CSGZw-c%IG_9Q-q}kW*v)^7_udOcMh66Y+YSnr#^s9 zN;3ngq{~K1>QU*1wJMhN4p=cQx%!JrOclHm)v60C41~{eySUq@1|wio-hUwUe z?7@WcR$6dV%k?Kg>p)qmUp>ZhzxY)5sBz~rs8WYCBl&{R7;u-VTjze$+^Y3{bn6biPhJEZC0O-( zV_KyscUyXd1aiNEmP6VpL@BYWWV2yxW^H0xN-NxdVOAGXIM&l9=}a> zpwSaEw*H%&vo6F&Yh3#7(oe43D-K$S*f-4WdA69Wd>C$3Jc-4NkLG7^9> zWSxLGY2e5$dC!Z@9Rn1R#tel&lsr1fU zdF^@%5CT**<~1XZP}Q?9RImHFTejjxJyG zkRa?yw!_0vsKv5J_@2FR}^Sa%^ z!b~pvX-KhqNhiQX zoAftUrE~6e((s>`xL^@<{aKX1qnb)ECqSqQhW6oND(KMuo!;n19LGGj`+BO><1qs= zqy#F8Y9KpiyTNPF@$v9Ub#vi!so4*CiIDpH(3M>0=S;EoYDYXNACXjQMdXlS z5A$@22_j#t96Ps~*~XphR^j&XMaO!a3>G}WCEH-<1ytP`x$g-#q~A%eGpQ=u{f%rp zfN{Y$^&E_hG-bBiJ;qS)99%R6Dm+#gt3NL~MLTGk`R!}mL8X@K%6*v&K*8j}oh<*( zr7S1D3@HN)dncsmm5)+gWGsCy!yIybp80o8K=q|@XJhsOYb z60M4El!~p5qpz39j+e}cb@^JcZj-H&4)r&JLT_Z(AUOmJa~S)5w{yYCJZ=<)@h!Uj zE{}_rSoL+PX`6AJy(f*u?aj$%anQpe?_qvCmu5YWeDCfkO%aUhyUW59fp@)RD4KLN zlJCcg8aff1$@)32l8n|V@rX=;_7(Jn-3gM#&4h-dEzDG#MtLEZ!dAc#0YW7M{5PiaB`|O~Y zc@{|)d1>~qH8FoZShMIsX4t^a>B)O(@f|<(d&-@tstf(fwUt#ILT~!9m62QHvC#PR zXLolFR(!)`)J2Y0W_(bJ9b>mFgZ)jD&Gv#&3Y25uB> zGS-D+VqoO`4+4W#=g4`e0Hx#_x+rvLq5r8W(i*8dD)1Xv(B>fj*4dKM(`)S`t`?Kr z#A9qr^cj>R-oj=j+!i{Z7j|jp{wcIiDL4V;b6K%lN+6P~X4jP#==k4b$FgbUiL9m# z{~h6~5gt-FXaF)482baRLS=p^9naoprYGe1sCK|p`zE}ja>H!`SF=ds@u}3e=zR63 z!zR&X?gfIEwG~%bzTqA4b*TprvdMULiVFTCTPvkca) zmd;n){07=yD)(uEWQ@2{LR;>9TpeGda7s;W4`XL*J>g!H>k?1syLe+0+1njXxNpe| zoqbB_6LOjrSKbP)nmZfycV^N>#ybd{l$2bF$~0M0sdBs%tNb)^%lHaVu+C5Sv9pUL zMlpLjxqw2O(f;%RimMfss>Fw+kO;m=0k}%ds;Q~@%CmqENi%VIFV^RYT$F!2U6Em5rwdCEq_+vD0Pq+C`}di*2*AjA=pN3GD4y(D|J z@#D&anu-}h4mRE(QU17LxA!?J@A&T#(EQu27&5hhVoEPB6~JHg)NGuhg_u=7am<$I z6AS{%liktVK6S0F*Yli|tn$7;m-hY7ZiW4?vA6cC9ceN-$eGh0@Fx}e87+KMB2nJh z77h(kYuXfnSteFu_GDKE+o5)*P%0`7O-%`Am?y10gR+siM~JTbQj__2J+ZM!!xCML z=hEo)wV0OQQA3`z|LOc+N12Gf0@)wU7@Kilu<3GNEXC6z$PF*E)UKoww~boFpR&1) zZW07KH*1Ac$zJ|5iWy2$zmsZ5e#9Egt@v-tg+JUAj8d#wg((VZLYx|8M+|7$Qvwak zh^xR+DfhWyk8>A44VB~~kRFhCT#Uqs1Hc3|nZh%aDiwzfgTa#1$cM~>fK6`V%YU4d z+fok3IvdigrJ*zB65qPM!}!UbQb0IF_s)(XZ1V10<0m2!vB-7F#dbSW+Hd>tP5;h0 ztoL`v*wAMvVnuDYXVHq{a$?ONM$SzTla3l-b|RWdleV_TpFf+Pv6NosT%a3J1>Idf z<$Tos#Lhh9l7)^cHsh-8Ivc`V`}^`&E6uR+Ja`YpuSm^7G2nfH?!V%n(&Ni!Ihx<>nn?@T*{pO&V5vF zG|8%NU!L36)^)j~{o5CjT@sxeTVaAPO?=kP-Q;VrH$h4LoBf-)`w|`g0kpq-w%Wr@ zT<%1jNy$hjZXFIuhZ2e(W1(H@#c_|m_+I4h-|3W>%SCO#DYJYL3qE9#7mWWX>Quv> z95mU^n?R~LUeHf<7pGza#g!r`n6at3g@%oBm3Trj>L6*P+V_0u6>0CEZX(sUKiiKji|(aPDYv_djQf;fhCJ2C=;5Y4KbFIFCu3y@e*595-I zTxae}IYx8Uby%Ar$$n3DuDp%m+S0i)L0`1o$siZZq19;5Av!I&qmQ~UPpF{BNfybC zb+dS_PiLf^B+UA%ZF={FiA}HbK>bo6h z|F1M_+-2Z-QUO9z#aQaf?2fGhPQ-amCC>3iV zzJ#acv%HnF-}rxcu<(i!Uf^=TQGa2rsFXjodc_}DUeV}HM@N@=-3^w;-}YTEl23LW zb0fHrM_`o{fxGm&J;?_??)R7o$B6s$FEe7S0jFciZ!cz0wENdQ|vW2lh}2%X;D z@3Ha@0N?-(u_5pQVk0YQ7Cs;G9o_k>@1L)pt;i=hEW8$$EmPW%V=DSzU1t>*)%U*r zp&N!!2Bb?s8tEJagrPenq@<-CkZz>ARYJP!3xagV5Hf(^fP{bp4vqAG{|?`S_hj#r zy{>Ea?3uOpdhYxFJdrFyT(sDf(N35Z>?crheK0Y;HKZoMI#8ufDk%yj0}>pQk!bW^ z@v-gJbXm9y3E5l@*X=YG&CO3}e!oIPnyV3xEc+Z$Ri)m?M%aX^B#(8sYwmyR?jMr8 z64(xffSLqE6l;++O7YNM_o6xJ4y3PijfTe4SZ4{sh~L|WL_u{%yjd_m_Qln>;~ zN`E9m^g6Heu_t&!0t6HYLfC-#UXOcPIHq5{7Hj^thbG?{{_u4MM7|5l zD)mKNhm2Je2Xbk1ef!sm7*gjHbOVpT^BJXDLwD;no|+q|%tX~@p3In8D0^+x;+!2M z`9#|o{O&6fJNfRHY6YKuA|tVkU4->? zv&$x6)_EV-!#p9=aBib}IM*d`V71ySF+Gs&fZ_I+5mUL+sY^Q*iH9c9H2x&tQ9k~o2)qNCdT+ZTrKEacyo+lN;~@m!ehPZ5heT)9)OQ*7dlx%i z33+HepZ{fZeDJzq71iulkqPXxTpRp1|C>mR_@4YT$h^+^Q52BwFRE~62DiLVC0~** zTI8;OZl1wW#wI)!JMD-bYTDv;d#5w$wB#u6S!F1(3upTtb^4ju4n1M))GNP)YnB~O z)A(X&E-LnvHo%ajfBvX`_w))ILpXD3J(_}Gr021>kIkd8tU_i+^xN=HeqDr}kNv_~ z{1cUKwAQxW!8wCnA$oaf5-C2>v? zhz~DzN3|_TqPq|Mb%gn*r*-&?Et`IzOZM7x{+w5G2S&&eqr1rmbY0^z#!al`{jbk9 z9ZX)$<-Vz_6G&rm_hzkHdX*8LxCJJveU|Wg>;OMfoan7~hY7NqpnQNO0sKx9auL+S zH=Uhhvg+#US~HpSI|?bTRYaJNe5ofZxPz;&h38k6nirLcGGiSJ+LcSLX(T;}PdzqL zD-bvlK^%`J#lC)JnyH{57eL;p-;8zLJVmlGX=WZ*+eSXXlE{WB6q5?4jv#X5C#v~O zj7R(&H+w>g+MxjgW-FHTe|vl;Y(vd0e9%!hJrD=}aPecmEh_{08*q;rxFUZXIyh3R zrs;ImKI>ksifS`*b_R0#2PwEb{;w6Amfq8vH(p@iEv z&BDH1S;dJ-k?ye24usEFFvCa1BHW#C-K$q(eI94|>F!s7HC2C#>(w{=kLDdG`n)xA zjU-t#18@v(zHu895i_sgtgtjkipTSHZ9=@b!?Szr%ut^grzVZ*5- zK`SZFoHx!@i{=7~eoog@Z3d~g|E4_e?lH|4>gkSk^1<61-vCWy@sAit0kRzjr5OeZ zM?4`vu$guGyEnjVCag-V0+;s{c;N=B`MG7U`jXj^&cm2%<)Pr&pZDzTy z2WI(;@Kwz1-|-2KPfjUJmBvNd3j!?E(#oo5DA%KnS*$A0_P6NBI)Qo2?(sXzRA}HL z8Km^-OnAF8Q8V|+6rGa)*oH4GbEz82nMs@o!m*j~rNYj-Wr`b+EREP0YPvHyZ*cO@ z;y}73X%`8?6n?yUMWX^4)#H1N5RkAixcdw#`%`l%_hgaF^W9<5$LoJLHR=xD-oJq4 z36S`p|K|Ol`3L$WRq5{;20lu>Hw7SZW_<4FK6Y$gC*SgB37$~Gd1{3M~KtfbG;>$9K zb&j+aVRDG@;Rzmrr`Au$RHRK0nf$LhDz1uMVgq&5_^Lq;~} z+U;{)n_?OA2fa;vYEJ;tl*iVkOImKh?Rh>Z4gy^5ibnoaDK@Is!u06Fs#tUgcx&kv z?&h5o^tV^|J9>*M#if2u%}3~hVh-GSqEQ(>+HnuDy1l&W48;gR-#I2XSuD$#u$dfc zLsfE6AZB?ttC8v{8J?LKRm5p)FBcE1IyNJVXn4TEJ7p1$Xxv7aT72ufYYwcl8=P`S z@E`~5#1`>*gl^xxx!az{6v!A}GD}P9LX(6HsUC|Tj>S|U3Z)<;0Xy`8KZ{A!!0q?n{HIWsg;Nw3H zCcgwLyAngs{v2rUu7Y^0ATPZbf|Tt+8p`Snp6ktiCC2-8OaWI3947IDC5@o;RM5*@ zw^1bEng6V-l8vlcWIF`BCQk6bd0^KW?y>|sZ@!iYVrsye<@52O%xgokxsz~^oAKh= z;`LA&tmV7uD{&IEM)t_-#0zxlBL*LhOeDINRmHOpLa7xC*|u; z1Uc0K&J@v>mXU2zjgk)~UsNLncRWIG%A@)ad9(;_264C2oV(k)H@< zPIZ;h)+|PJ00D82ujgb=$=^=KQ@(*mBa)h=GaQWYh)lx>KfJU~BkHi?=+sq2@r4xI77OC7V$d{^Ira$qB3nrI@+F zFS%NYT;5lV9?3OVS+T6{jJI43$#$tLRg4MOc}BULXoOECUC%Jpa4?v9yRb7<}%hs;oXh ziu!!24O8LBTaiI`Kc#WV{oTV)g7bVP%A4m(7XMKMfxSPcb0vWyt_p4+b{I#*!Vhjr zg79>hImO7IX^Y)&m>$g6+k_rR$>-ufy~gV^Vy!qpYhxO+8~}SP zWrXxDvrJpVlO8x1@$t;Zevt3BmAOYho21_U$M_t_%Re$qj!;kHhQN z?LV!^O6e)7h!Hd9AGpiXn~0Nm)HA}=uuU$pqn+r>9YsWLh>Nr3O*W z9lGi+ZcU90xLGi<_P7-Ji|ujI(PSnmJZ#^7WH@oTzESg-BH>Qzo0o)pEA)r0Ml=FN zW|q=lTiww%fr0)js~%2LlQ&7m2DBqm=x(B|u|Q0i`rOd>GNoB*GHklhcyL4;33i_0 zrV`rR4qK)5G#wpLnYFWq_FFEX%z%g#I!Q4`Fq8h!GsWR%3f?23kUNTg*6?k=T?UoU zk>-~ySINRb`3`~HHs3{`#zuqVO3GZQl=j$OGKdLLQl~&T!lL+OtdVeQ4b7s=GTFf0 z9;XT|E)L-SlO)#p$}yL#iOH0^;+`ulm-)0Gpz@Gy$33|~fPaIX7OzOzg_?a%U&l?n zz$fFidG<-|?w8$J#nXQq-=DI0x%PZgtAiM=DYNbeI=|6kS86PS^l z&j}DLO^|x1#mLRY822{K_3E4|u zfmM;F_#8^RJwBW;O4S~SEWXmQ)cj=gd!j~4?TK_XY>1s$n89aaoc-YNH`tF@n@H^q zwFb%p$Fr6yBJVROf{kohbcywupg}p(ONb8xfvkq1b)_Wkb(djfE_riEqJcO?o=26S zs51^QD1nVSYG=%giV8}|nnP={k?<_^ufoF&K#K^{`6$~0U(lpcIs8k-qbtI3a-e5Y zcnMMce8Q#+6(b6dMv}5bvVd%MTQk*^vs{Ax+~3{oG*DL4hfk3Ny?r3j|0J08wiAse z6mzu6aWYROE>(uvy4xnu=n3$5_1=t$QXBYm^!_Raj5ZcD83HkJYzS#mjwmHkyl~o~ zM5V;fk1YMczaXT%-4djdzxB;NKE`DuuYkFr^hhJjc|u2vJbeWkkS?XpF6woQ`T4~~ z3ceeP#ZS;)skDdvpKcelK7{C%MQf1QFiJ!9u}fam;dO5awVl+ocWq*&9ihp-y?cmzeb!GCC-W*Z*cnYF;{KNu6d} zP7<>cnK=Pb+~(79q8A;s%{MGi`CS70St|YZD6674*rQzHjF1Ve5~W<6Cnvc@ISx10 zkEyn&M?%4*u{|zgCkMnuSYeq1Qs|x>{p8=BI5HSY;cCOyIrX;cq}A4~lN!%=KNoaD zuFeD2WaV0_dIFK#@N)BGR2E+k^i#rGPG>-s65GkahxewrYi1w644Yq`b$q)Sb(uCB zN;Lxy7^En;C9?CDRyVIY*<;JTfP*7hRFz%%zy#2-sjjg|7M>@uAl)iO!e5rf75gg- zS10qwPQ|zML2ud}FDyfL9+_Av^ftb5O@e?j@$mWfKduDPU@Ini#qXy3>JvI>vc@g5 zzm?j=syk0+jZ1Hq4c`1WZWl{&w?nWFgbHQHnr;*GDN~_o*l6r3P`3{fOGwG8j3c~X z=m{IX;zcqzt*k|NMlelDa<|M7UQCAniq$ClQCru0Ov*h#gh2y*20#CW0mHT*E)DgN zI&_k;zrQ+<7{u2k8;}EE$*aX~L<`_2IX)tq_uYeNGs*ZNWWGH#Kl4=Q&2avc7hJrW zQyi)q*JnOGCd5W!<+QA-yf2rtRS})4yv>LmLA>exrCWc9^q|h`u^u5bt~0=#a33q1 zmg1wF&qn;qzcmtHJil%o=2&0RJGLTOd8;D$rXxOW7BY%Hs9%JT_BrnNJW>L+WKu0V zkD3{$8p0j9xGY9f3U4vJXC(WLiZrf=Ts8LmrH7Q{j}4*5Qxl3HC$607frpI?O8GyuOJcuP)sAq-s!H-bDrtV%vuPhA2GI33lQb3A$WoRCu zmxCXKOG6q#w~~@JUkaYVF~uct3m0o-ZB~v6{_>%I@eb;F{NdvbI`nq=VS0X%1%!ys z9NHMs644c}$z)to-kxM7n{nPHRk!7rj2(pDON3taYky_uew$6F=6X2t!U%T7WGf7d zecX5YhM4_k4hNS_pAhSH7zC6vc%VUC1X!cr?XCoYB=-CO9IET!=XygH1Z$OvW5?m$ z-^<(WUxTAjiMx;eqipr77U}DV>e^1fp>lcmhWX?WR8K zNi26j(R;rr2vh`WT%W1s8d9^RrswvtZ~S*1YCBO?*bu>TR1fCfoKl3|*p{~JI53VnI7uG#9M{YIy-&u8O}2-p8KN@`3;=DjZ7w%I?_=J| zR3hQ#gsTVNa|Wrv3yDySXT@WG+|OXD?pT&6mZ%%~OCF3FkIHLhv~hcQqHCyZOi&=i zXb2qdmAHqi$`oGioH+X$)QU`ra(O}y)~LC!Ri0*~vr;1g1i(pyosbdV#uyD2X~ zCEuTZdc0f6+`=a0YWOLlP+nT9lkBBdZKFIR324u+W8JDwm2@QXh46Ky$Je{H3?1&O z&Hv{2Yq7i`(fYdi{<4xW>1~TixytXW#E9}#OXF0F)*Zlmlwu{0V-OLFs@U&dsuK~7 z!>~u7+Ejg6`^1#bLZaC9=b^1{ulX z_S{0@VY1htAlLu#00h)0#e(e$xXDAWmeU5q#=?}Su&LFRjb^&IXyVvmlB}RA4&FJG zt0T$5hUG?=yzrOrC3~{(1a_U+MTIk*e32&AL=hMA&k~AT;9x@5fBR3F=xuw&L0mBY zrjIw$cpX3G*7HM}z9z_xoU- z^_1;_Vde-=JStP5|O6WHHE>93n(oTDKa&wD#bwUexxj6_v&FpZ>$q z*mAPx8+P+|Karv>5DJJKZHj2hZZrvqn`a|FPK|0{XlNUVIGC7cWMuJHf+wPnn7VOl zplCLP2&-W}IRz$k=OE7@^!9#TGWhp)y+-}@#!LCHjph1mRow)38_Q{JLF?~cb-qWs zyt22=l-xy7hI%X$(d$guIBq1BHcWONbXmMf^ zW@%{H8d+U__Y1x=J0CDWRz$wL_^104l#N9Yd9NWTe;M=j?-`ROmLB#8AHZK!dk^W5991SKM(l3)-xK!43HIOF>OnCWn^NAQ}c51YyEPCo9aZBCtpRD zdhcqGY8vC-GjiucgOTCTC~mBxNPQd9+Z4bBI&u?B`pv(;FkpVlMuiQUAaZ|8KCJpqKKvIqM3Q3IIGLmK zh)Ri&Rp7t%Iqa+SXXrJ>!8sXfOwd(c85NEYHhYPWcJ-``&J-6S25|S@YF&0~@$i&E z+Ol80dli?y7Uydj`u3RL{k`{=cIITTS3!mF^-;e`t`uoFomvF)h~(jZ_u+4YeD3bb z(01#kRTYamFOnW(sbA&ts+LdivC14KAavvFdf-K(0kQo3T<@Nr%uFW>p?cyT4#et} ze6ATGPn0D=z)75JqTu7q6W-n4D>7L;_7h1OkgxV?@@sahS5l?tELt+WhA0bMeO{4~ zG<~IlR(r6z)13o(Z0>ytX z`yr`RA-_i-21oCIBYH0N3Qg_0irU5V+N0Y5|0=BtWfTw))k%j*Gcd?_AJN_qQqAz?OP{~T=Grl+{rIo= z7+vyxZ1c}r%~Yb2PYZv$FWSG>`YGW?C>0e*R;ByU&pm>>Xf?qnALBDeg}0&K=QYf4 z1vb%f8%?OzT}~_CZ&J4$zf|7telhTpIiyeYb|UmP2@!I#1(fv%!&|cRj6Oxtj6g7Q zMDwcDL_CIo+94z**7NSd7ZM}b`>!@LJ+6#_^Cl`4l>&-t;N^bev0E4xgb_6TdyeTm zj^4crK_xBzjKO-p0iK>XiC?H7XEkR#+Btg0ax4cB@XTqa$_$qeeLse5>Xnx~XC$O_ zgXqe-48-bD-5D8QVMn(>{~(0pJl!<8eM~&yZyo6DPN^!8Z-#sZMZ@j&m&1*WifTvAMs6sQc|8~r-#BkTL)7zE?M_0-{S1mK! z|KNg@~sYCRfd4njkg9zk-Z zcjSEubA`4?Q&f~ulB3uTi5KkO2US%Rm{xq{ttVB_F9jt@pJ;F*zseaQO37G8JTlkZOUPndIaEHv0oAwhI)= z=d#P>xLUfyZt>y3xlg1+8oVQOOZb9A@KZ}cfA5*~P7;6gqS<5dZ)*_tEZ$MoXXOLj zTv2=)HH-Oe7mVx2#U0&;GX8&m7}sGFfpP_ce?O0ITbyM6cS6f_J3)KG_i72J6w&pD zb+qEECSkEpl7Nu*lg!1d203d?1DexOLn(W4z?q`oZt5`>d5?T|? z?LCuK8fg0*cY%o2X02enf$c{_gyG$T54M0mlfd7f;gmB(b;3KCcTQMyQaQV3;26)Y z-NR|5at{`VA}t7X&@Ur|p9`cd4LTcn2?g&1pL`qX?DVJoDxv!t)@>1BD>0HDGUyi` z+Vo9+s=iQYU}ue&>w-mD{fT2TW3Wnf6Bm&42u=*+#*Yj?&3^NI;9|`qr;3ZW#dDWv z3Ga8nR@yBs$6bWV$~%gkDPx=D4B{5iF0j(`Khq^+7&y9vpU>@Qca`ykFE}EAg{BdQ zEmi-2Yfsl$IVp?*XY=~`iO)V*A^$=kY=}E=tTZkl7)RBrw_}QL^yz(sJLH)D8%)*{ zt6Ok#hYuDBP2yUtaYG>2ni_T;$1~{?%9uoJBa{TOVDhL&J$l{q;;?sxr{AkL5}ZJoAp6qZ z<_LwD_PqYa{7)js8oqe@r8+?I^>Z<#R4Uf8Jg|h_pU2)qmNQakI@33tgCS=l?q5h` zbY5yzp{=Xd!p{G-`;twRwxDR+@1q65EQoKiN_`=G{X1tI1f-JE&mG<2o%*kA{5d$_ zo=b!E{hzGc1BqBAsQ8j)6V92Un%zY2pNxumNUs06SD?VM^35vt$iB$yG_Q%ZeO>gk z+i&;gej2gnJBbEdg=ti3VRH_uOl48F%-W1H@Ppa#r_8}>6D*`JUTy1Fd!I|FJyeqU z%4Nkk@Vgx(W`~OfVR{@KW6}@OM*Oy#4wsLdYAZf}zbWn4)8(b07hRS_0Q{`*^t4Ou z)IEP=q7|7~7B$+cbO(+S{JZc|HI5{IyN91}&q<77Ldq%9oIgu*0ZQ{S&PJ0J*UTcb zmQx>A`oUXfS;kJ2=4m-@mS;((c?ynzF}bp06b!HYu`cv%P~qMOXml|+b@1Nxbs5}H z7sg;pR*@`l{=*f(S@bgD+U|FQmDGNQsR#$n%4&gQF`yl^Q2j=XNzCPvBV`(_Bk{vLXkix^5VE9OUKM2{uo2 zHZERNce_9S@`x9sX(~57s~acGmTq_>mnSfD?!t~p2~=rV-DgR&e|9$YX}w8RM@#2P zDJ2y4IWto~m4%HaB0>nv0Z@vnGPfk-x60Ph#x-q8;_h4Jev~SDX-=xNQ>Inl5yeuR zQL|kv0LDdx9va0KTN*2)BY%Iit8l6VIKH?O1|S9z!xDi!TcxUYN^Ufj-CNv=ku3I@ zNEX6DP+?9SKuvx<>#PCZ4hOM60xL4S9C3En%yyb$FLB3A>?Jl8!g=E3ZUe3Vy!n1m z=`qDb^oTXkliB#%icXgAx|K2s}(H(-2PXo;i)o>s&v?|9pL^a9Lvup&GyV z@#n3isl_XS6E~r~hPql(0y#{7kW-S^jEdJmEwz%V>&;K?Hsc&#wS`|2BrM%_RS_W# z%(&rgBb@;ImAMljtc#A25`gh_$x~S^KiMaLVU9)ILxb5=YN5M8S79)43|?wm}4KY<=Yg|kB9i>lWb zsInIz8j;j7CQJ1I=epya#x=dA{r`-d2RWm-Nz#ihs=)*Br^+m&SNKAz70wA9s&V7# zrxgsIz2T{WE{^_wSG6o&(`^#p?&}LcpT;&`FyH#HDnnwR5P%4xPDjWpU3Bqj-NIb9 zRLkqn_VLbe3x(X<&>(j|AX6yV{K4V}GO0|Ap3(>`z1!mZ4|q`o(%zL+PpPSsIIuif z5jM_Er{A~M-~HVmT`ii~oM#&ki|e*?WeB&y+)Bz>zjgrI)6rUN2^+#hT4c7t zAH~11o2o`v4NDWfp~uGQ(CCUm_1>;3h#$EB&Lphm=k+S*j#1oRsb;YUCu*y4vDr;T zDXUk>F$KMn7Ezum?m_z-YYZpvmH8E8smF!%9`>;7mlE0775VfpTD>YN`bjgI#Zd*v z;ocbgELtzS)IDwrPGKAYkLSp}{balCo${af_ozvUl)n!!rZ zzwl6VV=ZiYG+cyi(B`w8*vR_@9rr}q z&8}IDe;z4;3PG%gZtD1>&6##O9@*KFo32Z%F;JFs0c zVaq1hAD~ZU4o%@DRgf)g=7}n&k1SY7d>J3vM1VGGwRp3xqWPVrW#7Mr@3$i1A>)7_ z{YPM(utbNmqyIPK8tRgkn4TP^EIK&P_H;-0J#rOOjr;?{+dycTyPZW$=m;jP1vS{S zsL5R%MWVj8IBD1Nk#!X<0)=76{e%5OnE(m;x`m45l=P|OQTQ{{k4QX8CFacaVyr;G zYxU;2D{B8ant(S`30dto&?n53#hnFcu=*n3f2gWYi<(q7DaOw1K?RivRCFkemoK7) zpmF*zdn%4H4*KEXT_b0Z8DaRCep>2Yp?gOTOs(Bsl_!%x+7FQ4j$|j|vTjVI_0hNE zam#O7^QU=OzpvdsuKQ5>lEMSkZ72EeyLp45VU5_cMe}{h95YRX0F25>OONKOKQilDrpqjZKT0;}&$b3aAs9d^)77Ogp+XOi!hrYPRU2UvR#Pi&g0xXhy6e{>(t{)#j?=y|_>{96;n$8cj4LFF@&RV zeKhEV;Df8;()-vX?);tG||liYWvd&6lYbafs^X3$ zuMqLn`AxkJbVOeinGk<2)BhzjSw^Z;Ec?5Mn(gSIu8sXqK3QJB7iT(|VPZ3oS6u5aUEFah4B=UN5n#4S zeP!X04W{6K{n{1oZ6P~5wB*cd0AU$(6}f)Zrr%W#9@%!-cBo~7GH1<72h0#dBgQN= zNMRssgwFQ>H&lC-Sm*2;DYAK1Qv&k78;)cg0m zsgyuq{M*PKYOfb6(^`9V`tu)_i)ttue5!1S^aN5kg9xTzz>=ju-pV>zyu~-2P}?{I z@JD5pqQWaE>vtLE-h4j2yRnk~FSNI%{X2zvxqg*lq)_7)gwBt$7)H6pftJP+ts<0nEoY`!_{n#i!5m=fN1aSz890|IolK+gaW@# z9RLm`OK7J`F=UvJbtda#@rjQaTZWAlyaMrTQ%tv~6>sy$tgX3xPqMmNRk*9;xBlZpa!X5nK+EYEj}{X?j}ms?M?l9R%45 z67028p%yW&#|~p92l_xxPSnhMvy+#PpnhUB5lKJ}+gy z-*aj>kodTDdv+R%_v=5ano0^XFEuIG=EytOV3%M6CrYl59g_2>PiF|V6_1GstSfS9 zPZ#FDAmX`Mia*MsZ)Q|a&mj2!86EM4tu89DT{+nIvXJ53;|)-i8qYHuagIQZT4rwA z3Bu+X4|f=f4{Q87Q2+TXLkln4kmkg03ru2nb*@HXvs-R1?9sd zJv|-SBFoOe^P{7z#(+a36CL9M$=pwu`MN~fGmZo=JI0RD67{8nD+lA#EfUtf$0NUL z8p^+Spg-8E^<{m0e#m>SDqudZ8R9V{v?{F%M6{{ZuOA+_BJc^y_rQVkelO@^kh3%IkWc8S9l* zOqYM$i>vyay{9%`4qsdTmQF09j;}cnycniMpMUY-a$kz+3UAWl%cYOVtB!}*Fl8A{ zM2%%~AZVS?+S9CmVe8EKyk#GjcTI0c)HIHk1DIb$^9`#P{&xW(Sz%t+rH;HTXfnjYfEC(8x}JV zk>>R`m1;(|FS!T=!k;xfM;CdB|D0#KJE6-&i)dMD_eGlu*pGzn#N>A-kxEpmGA{J1 ze+EY=KdFTFHTOS8z0JC`dN((&vWyI~1bA0~&`@DZCDx~G!m+ff%LW()qebz7DoQ%Jup!wd}YFP)30{t29f8F_ZYQzAK zm7FMuS|;?iwV3G>m+}}775q7Gn~bT~kHk5#;j~mAu6oeM%J{((2@e^60r#%O;q*AH zD#P%vcpQAVqVDU$8!xi-nGG7MRYV821?pCI&Lu=YI1bJ-TlN@Bh_zVP2^5~PMu|WL zQMfroF|TMuS?F2g?J+NA(sGx-LT(&I_PdgE=i-QmhZExn-KvL~jh2VqV%|*Q>NYiS zYAoRT)A&sAyhxbIEcE2kf_1LD$;OWRD%9}h?6OJ! zcXy@XYF#6(Usn0Tc9s*iGME%}Vt!XLPaKI8M%JX0-nVD- z@Mm`T+`Bw#+E+)P_7BTk_6HK{rJ2scI!xw&dXbPM%f+@2)fcaSzvt|{wZhlMQRO4; zp|YJ>@!^i78b@e5PThvKE~wCiDE@u|0)hB^RZM;DJl)+LJbXc_&TbAY0p8BO0Q80B zHJk-%@A=w+MfZ)Tucyx&&$pE<&jo}6E-aIQah(4fXK(B4AZ_RE0GvP~Lc$XKLL&Ua y5{5z&($7Vug@pKpB!MG`jGo>9Gr--`-q{iU{~uuFxW5hz0I92JE7vR8MEoD$0@2d| literal 0 HcmV?d00001 diff --git a/Tests/test_image_convert.py b/Tests/test_image_convert.py index 011f23bf8..e641a99f2 100644 --- a/Tests/test_image_convert.py +++ b/Tests/test_image_convert.py @@ -181,8 +181,12 @@ class TestImageConvert(PillowTestCase): # Assert self.assertEqual(converted_im.mode, mode) self.assertEqual(converted_im.size, im.size) + target = Image.open('Tests/images/hopper-XYZ.png') if converted_im.mode == 'RGB': - self.assert_image_similar(converted_im, im, 33) + self.assert_image_similar(converted_im, target, 3) + else: + self.assert_image_similar(converted_im, target.split()[0], 1) + matrix_convert('RGB') matrix_convert('L')