From b0cbcd0edf4af5afa382ccdf18845ea9fe13e4a9 Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 21 Dec 2019 14:09:30 +0000 Subject: [PATCH] When a corrupt schema is loaded using writable_schema=ON, the CHECK constraints (or other expressions in the table definition) might not be fully resolved. Ensure that the code generator can deal with this if the table is subsequently used in a DML statement. dbsqlfuzz find. FossilOrigin-Name: ea721b34477ab8b49d182352c4bc198245933b850e9b6248b4f97600e80bb44b --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/expr.c | 14 ++++++++++---- test/fuzzdata8.db | Bin 1564672 -> 1569792 bytes 4 files changed, 18 insertions(+), 12 deletions(-) diff --git a/manifest b/manifest index cda6e79652..7d2ddd7bc5 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Do\snot\stry\sto\saccess\sa\sgenerated\scolumn\sthrough\san\sindex\sif\sthe\scollating\nsequence\sfor\sthe\sgenerated\scolumn\sis\snon-standard.\nPart\s2\sof\sticket\s[e0a8120553f4b082] -D 2019-12-20T22:46:41.121 +C When\sa\scorrupt\sschema\sis\sloaded\susing\swritable_schema=ON,\sthe\sCHECK\sconstraints\n(or\sother\sexpressions\sin\sthe\stable\sdefinition)\smight\snot\sbe\sfully\sresolved.\nEnsure\sthat\sthe\scode\sgenerator\scan\sdeal\swith\sthis\sif\sthe\stable\sis\ssubsequently\nused\sin\sa\sDML\sstatement.\s\sdbsqlfuzz\sfind. +D 2019-12-21T14:09:30.906 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -479,7 +479,7 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c 6c407e549406c10fde9ac3987f6d734459205239ad370369bc5fcd683084a4fa F src/delete.c a5c59b9c0251cf7682bc52af0d64f09b1aefc6781a63592c8f1136f7b73c66e4 -F src/expr.c f384985519fdc748d1c3e37b387825d601c2b076517c921db673b1dd368fe68c +F src/expr.c d1031aaefc3d8697f30f418494ec491e729c2423af7f426041bb7525c41d3ad5 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 92a248ec0fa4ed8ab60c98d9b188ce173aaf218f32e7737ba77deb2a684f9847 F src/func.c ed33e38cd642058182a31a3f518f2e34f4bbe53aa483335705c153c4d3e50b12 @@ -1017,7 +1017,7 @@ F test/fuzzdata4.db b502c7d5498261715812dd8b3c2005bad08b3a26e6489414bd13926cd3e4 F test/fuzzdata5.db e35f64af17ec48926481cfaf3b3855e436bd40d1cfe2d59a9474cb4b748a52a5 F test/fuzzdata6.db 92a80e4afc172c24f662a10a612d188fb272de4a9bd19e017927c95f737de6d7 F test/fuzzdata7.db e7a86fd83dda151d160445d542e32e5c6019c541b3a74c2a525b6ac640639711 -F test/fuzzdata8.db bbe69fc3534e5e68ef211481e145aa9aac678dacb8dbc0c4f3177db0d40e099e +F test/fuzzdata8.db 34eb781c21f70c47501167b184a48a3fa8ff05ce9bc41b93dc48721e553c3c5e F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test 8792cd77fd5bce765b05d0c8e01b9edcf8af8536 @@ -1852,7 +1852,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 728ad39e3bd07a2503a95c68ed5bbc3f28fd97551d59f12a5fab25dc68227e99 -R cfaa4a73c5ab8e91e0e8aea15aa1b6a1 +P 056bb8dcbdc45989c5c6e86d2966200062e3c01c382ec52aae37c828104b4496 +R 3d66cf80146322364a240ad41d3a3004 U drh -Z c7accbd12333ca8b3a817093296c39eb +Z d7946e0fe8abc0809f4706cc432866a0 diff --git a/manifest.uuid b/manifest.uuid index 357a08a153..f33a4854bd 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -056bb8dcbdc45989c5c6e86d2966200062e3c01c382ec52aae37c828104b4496 \ No newline at end of file +ea721b34477ab8b49d182352c4bc198245933b850e9b6248b4f97600e80bb44b \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index e1efeba2b0..21fa97d8ec 100644 --- a/src/expr.c +++ b/src/expr.c @@ -3649,9 +3649,14 @@ expr_code_doover: Table *pTab = pExpr->y.pTab; int iSrc; int iCol = pExpr->iColumn; + if( pTab==0 ){ + assert( CORRUPT_DB ); + sqlite3VdbeAddOp2(v, OP_Null, 0, target); + return target; + } assert( pTab!=0 ); assert( iCol>=XN_ROWID ); - assert( iColy.pTab->nCol ); + assert( iColnCol ); if( iCol<0 ){ return -1-pParse->iSelfTab; } @@ -3717,9 +3722,10 @@ expr_code_doover: default: { /* Make NULL the default case so that if a bug causes an illegal ** Expr node to be passed into this function, it will be handled - ** sanely and not crash. But keep an assert() to bring the problem - ** to the attention of the developers. */ - assert( op==TK_NULL ); + ** sanely and not crash. This comes up, for example, if a corrupt + ** database schema is loaded using PRAGMA writable_schema=ON. */ + assert( op==TK_NULL || CORRUPT_DB ); + testcase( op!=TK_NULL ); sqlite3VdbeAddOp2(v, OP_Null, 0, target); return target; } diff --git a/test/fuzzdata8.db b/test/fuzzdata8.db index bf72ac52c27021e9af06290e2220452473e1386a..caba53a7744bca52e6dd45a8d54eda48e5d7a61d 100644 GIT binary patch delta 10605 zcmaJ{30#!b`sRG!H_R~1uzbr5F35ljpro@8gdmuhUQs|Xcbx$SH&j3{F$<>Tws~Em zcq=QxY_Y{9mt&~~sbyv^T`OBm$ZogN3R`b=yZztu4Ip9t$KRY8&hoy``@GLtzBAUf z%&Yr+-iChBdqP4qzlB_VWo%4wkUar!y_eK`xq2^O?-lC3ntE?&y;ocB)zy2$>b?4U zZ+N}eQ13O?dn4+-k@eoFz24}pQ*`smQ)o)_8yE_sPjKX^hKih1wVLk&w_)WMfm^Y> z5Lk`nJAqrUd^4~L%ho^*mfHg>vD_M1f#t)2YAiPds<8ZfU^$j`fl4fw2P&{!5?F?1 zQD7;SvjdBWvqmSY2cEHeW|SXu)U29xU3R_GEdN^{t(saChmV{_PSR-4{g;!bn>-A=d5lj?Cg9QcW) zH4RLaWB|0?XwXCX1WriD;Z|pOpJxvf5JZwjz(yZFAe*#X&=? zFH}4cX@UV?Xtny_PzD}$jU&qSopGqf)0}>n6GQP}2==ZB-EO;8kI`Mz1O-(}zmd)! zTsWMmINISXvZpePdIaf5!w5+I=C<1$B@QQ2Xbld6JZh2O%DSqiAg0e9T8wV5&vvh}*#u1JR(3fww@bBl?Do zx5UHAVtqIqDKSJ1aJX=eFsZBj>RpaMNF7>RbrR$qlC&_ml0*izZrRUihS}W?#M+%L z2DQ_jC)H}}!KcjyXR2knp(!g8=ITUa1k#DUgJigE4XrgpwZT915Is{b*LJp`wtCZq zn(HB7C(ce(uifEC%~}~48_E)sfg-W7DC~aK73)%rUD6!Ld{Cy=5^M0~u$Gn-;n&hq zr~0kb@2l0%vSH;M?1Lt;&1Nfc2U&5e+@yJ&o-|w^oSm%>)D^a4*ggzAIKpE^)womj z9=qG+c45O+cg3nZm$lSigf5Hqv+P*TvHEc&da~MT|HPTynx-~8&_S0oCt77gJlLi> z^Vs#Ov#!`|=)%RE`Ca;14lL)`(%5*rM;&EDl8O zn8i}PYEu2MvG43<)6a5Z(;S=CiqplK_7|qnG8BXwO)z4DPN!wTq*>i+&GqimQl#98 zGm%x=yAy;iOHGzckO-$EM%^#Cpm}9B3 zS*GL^T8cA@ham^)`YAcNIX4tqZnlh_oHx-@Ww%TlmoquXvU1p}47VkF(iqFi_zV}= ziX-BMs>*6VR2+{oY0J&3O{nOjv&804&c1PCwx!ZvTwS?*;R^q}s>+4)=ld&{XV`Ab z17BQtLi!EaQwozTiB$_K{R@L=I^C8nn?HPLO0cw)`pTC3QxM_sp+PiQp8~a-Fl#@= zf5YS)hQBa-bS_5Wz$jGUL!qK5OyVsyDNt}lkkXR!CXdOPY#BYnQj=`So?@w7cJsWY z)k})}m7Nh)vOR*=zfy?2s*Zl>{*H)`!?l{23>U@^MJd4lggY`FZ zeFr63()HsfP05*DXc<2V8>(!{>H6&4LX4@Cl`1FL;&lDt{RhG#446lDCd*um1rzF|&ow%}Q)vB7r>+Cpwa!!73_6<2*7Be$FNxqb#l$7o;U}qxVC+dd0+^G{M zS&A5-grcGZxbn7Q=BsRpjbDfNg;$P8X@raO%8B>0NT{0S)uRrLwUdUY~F zpe0li$`&rKf?bJxzuLs5mem=+l3a%2NN$!;93i7_#O^4}d75(@p4HLVVR#%jT`{6<1d;$;cZ! z7A3;;-yL3YSEADOR_ElL@sq~nOi$P6O>`J>25=-MgnUe5@W^c-`oC`<9GIdBS^LpM zJalJ1@S1q5?#`|Hz+@rh7}$R1Y>jtoBS}%imC_h^uP{<>Xp1rW`kg+jAGfd)PqDScnPx5arLvy-Sy;@$Q@Bq(ny9DnUWZ91uGx4V zuogKTMXAuYk|bqfRgV*iGkC(s^PL}elpe=#yXWeD$4sbZe0uObPGX1SsLo>=v!$M? zyN=l&JZAs#M52db)ugY!*Mo%ETO zv7QKMYAvnUFYe*!ev>$XkbgjyL7Yv!G2-JqSqB9MaX91~#0GSR=@btm zMDaQ{cmov%F&rCVSA;kpI);cdnA=betl{VsotQ~umguG46f{WrF=8!Yp2iV)UN1&5 z)471oK4=^#IsgMm2v#Bf82U{gF`A>t-C`O6K39AVI-(0q%S&cSoj#8|-A>)E$x)^Cg&`-7~LgIZ=wZ}2Rfhp26g zh~c5NP}V<@RXz;y;o>0nXEXe5jWj689~%CNW6hiBnf_upp^*jR_Z)eI23AP5DxN6j zr$48kRH*@xy>g+LUo6ejeQ(?^dpvEe(4>K;ZfsYYtStYiqmQ*YSjVnb@ zu(@fq=;dMOLPS;GEIJxji+V^57e!`e7$!l|(+vxyat@k~icR2KEN&rNs8Gfd^*9ua z7A?$70z>kWiezh$EBw1nja}QgR*YwTOpL!TR3sM(d6KbH%+aV)@gbGIr=T4%(5Qt{ zhwAHd7Ut8C`-C{1&R!!v#glEcyPydGFer0j2%Jqqm>@e*UR zL(Osw>l#cSbTo@+nT`FBJs-W*-Hwy#<$ySvW8^NOKfESJ5b`2}7RR6!ax9L!Nn=}3 zK}oD~I_44?hA&TveaHctRVKFZkh@VF$qXOtt@OsrDEWbmP>kXn-`IiTQdNSWuF;~K znRq3r8uTQpns`Tzs)c6Nsg9lqI%7fM_>N$1Jz5&rka7AEp2ohQmCf&!8<6u23u4R63eLOCnCe*5kYe?fD$pFdW zs1CH>uIhFi>~u(Bv{aNHCFBG|e<~J0zC+BRmXE{*gsn0zmdynAEt#eKHkF*WXneeM zfny$YtX5HLPcoe5tLo7(@TVa9Be9Z+J%Zl4T3W5fd>VE|i7x^!H8ISFs+hZ2fD!b) zu~IUDQHRAb6c+%AkTbA7AP#|+BxyIB35{@R0wO;BH_1w%Zk-fEj|`PY5%M;3p2i{z zQ$_R=X&fU(F_%I8sF6+)&ZgPybYr=g$M*`3g*lV~euo)~XHk5pVttpMxmz5eZUnJ3 zKU3OG$a_8c6~zIhGray{lA4xtEbmr^dGaB%?_>~<@r?_laQgJ~Vkn`}Q>AY?a-O!{B#t7q?SAnP*H|uDSig%r zxxfZp&p;jL7~cP|VB2W+UE%~)YP;Cq?XMFdPBcDL)B3y^FUK97y8B3&R zIC2rrj2F+bIXj4Nyh}oUx`Z{E=C5E>{fpwXIz!lsGfd^?GX`Tg!*r5wykF8#`)d5w zy%B%T*pGv{R#fSPHPU{bd;#&X;y?a$d7-$x*j4F$2|JUd!%QD_!P#)ROj=4GTqi9i z@A`?>y(4{0;6jZY2i|mfBGhe`Y+#u$+vv_$r748`2kPFJ zra{MaE{v8Okv8+>XQ(?b*`fSL#RHq4kS5Us$0UcI+(f^5TZ$r@AJF`N!M8&)!-i*w z2R2M6)%5kV(ny~C21~w|KB1qTlVW-DKiF|jDFwtYfj3JI!1`YmFP(c{dV(Xr!>&tG z9`wB&ZlvBeX$#M3LZIbD*br*@Qo;?q{GwDwS9~V@rqN6jLca3vZI{D2ddJt&YGV8q zueEtR`Qpotw;nsBXCdoloTe=u(rBL72yUo&6<5CP?@1H80_z-S7)iMoTzk+L>aGeZb@b1)+Qh|{5AExwJg>wn7iG&4p%%998nzbIDf>@T0< z@#3#yvreWl7WooSq8ge_5;YH!FY_cCYQM)Qev6lB&qw*DW`ba09wf7#}VVH0R0#VP~#v1mvTP(uuM_!1}F}0x^Dh1+-~NC@gzd8cJXG z%WIgPH745psx%Kde^{%BtY+yZ`s)JuIL^yQi2z7c8XPE;+3uw=(<_B?K7rHmIt^U- zS=vL5qvi3Tnpr}~$q^{PyJ)gkzKw(OK5{>>#u-LH8*dU|#{@ZFBjfnKP{GUh()GD= z6;Jw6Td8b8GGCRZ)71s?ogC>8mJcO7NEgbH$v(f!RXHabuTv9h>-?K8;m!419B0ie`vD;E4s!99JxKP>FnjC-JZ` zOfIA43*-i#B)~?atiZ{sas|DoOs>(ALD23cn35_?N!Va3-iq1r9u78Y(7w^PE#FSUYzJ}zULoYCNVTr;8TnbFNk+JM8UG@m&G3FeXxw)BQ$ifH`M7}U z$Vw2V!i*Dw%m`6+D!` zE3lnU|u5iXWXc{Pl!Oo=-_rcuV@)kz- zU^v}s+`|z6K+>;bX4F28n(oB7NSzZSY2Ck!4Foba$yE&VREkI+CnSTOIwaeW+Z}v= zTJVAF4%HOl`lNCT4ZM;@e`%97ye1Vx%%X%u<{@(&0<)eoK1_|D$v+a34S_ebiIAVJ zi~O^I00SCK=X@bQ$&u0Y$_p|+sr>dvH2u|>bLf?qnKLyuON$&u=%`=hPqiAq5VB=CD#Z%ZIc1%0{Q8POi4d}x z%|ts`c*Ui=@x{Mj@(k_{6RJt|fni_UqWfW>79`NiMaW&}0&b zdq9{4o9iPKh93vPg5& z#=(L4kT*)%8IHf6YNoN@&0MAMaj4>?nOO?1?bE3+M!{`&1{KD!&zV%nRdNkvF%(Q! zUJ091zc{c+2)TC_W0Q`bp}fSAxis6&=?FEi_Tl4Y~{&9h}T9=r{1l~ zV+5LPp;0vAN#$Dt-YJ5>I9&vRCp9V5x>oroPZrbmgy=Y&xpRe=Y5PVcfg@#5af@&- zH0_DnFfFG|`;}sztbjAKbR%H> zYCI-f_)r^1ryW$D}2sK{iZ{ad9ntw ze^Oq7x(q`pl>e-xQr{2C7LL?I^DTIV-u8x+%c|$l*Z-qDuhlOXLe4LC{f;lFXcugI zcbM{dO#uDf1-^&FuiL#-o{A3xdrW4s?bfk(-Og6p1Y3@Wz_ca9MxwI(7 z)Xb9x2;>^agJqGDz+m0ally7wmj--{$ugP_sf*?V4cP;SbmQ5_lSa7GZnyO!kEA%O=oXlsoroeL{LU>ouM2<*C#xAq{9 zHVrow6Y}UaKpz7H`aV5B+cbnHn|p(7x(1}5fo$#xa!XH;WsEqy-MUI#x#>F{SwRoh zm~P-Sn-JTRy90Pk?9QoA&FNE6vBi9ZZoc1qjL;3Yo0b#uG-SVEItiH0b<|tW+-~a) z@0n}hsT@Ar6W((@;i-9jz9+l~O*qL`(#$5)N}}I!A~tYyZ$6(u%sat$i|NhXb#i?t z@Wz{r53p5h7qlv-ry+ljHV!tJOm74u0E}QOYkmP*XDbt+&S9#9tQSnDm^h16J?w_4 zP38``?j^$@CeY8-$~_P-nc`vS>*jaCI?@EtwB6vRKkYRcIIQ8m@(lt6c&|A<4dne=2pC{wxp2>KnI~h9qw>Hy@JZb5f41?JduGx>g9sUbk zN3Owjv^TETdgFTi&v6~=iR+DSTwRm@cu!oPqK4^#4D%RH^D3fy>o3rqyawH=-sn#E zMtA1V(Y@Uh-9N8EceW?G*^IRli0i$-z;*5#T<`bB^+9i3AO1P6k9y)d-xHTQ^FQv1 zOP%?vJ7@m8h_C%Gm-J7rUD7XJv!s9e=S%v(dM@do^~Cq@p7_+M|9MY*Ys?+G&|BGb z&kio1;rO445M~>`FVS6X;YSI@59W zipEKB;ix%{O>iLerB<^IpF{g{nXq${c?$ovEg1?tLPBsag45%TI><^k#xkSdK!6(X z@IKO1NNbzS_(a|T1^Z3s>4zuGaqJFHbA=WhG%X=?@fq`ab)EROJB&m+;W_i@FmfAR zx7S?3X}-knKQ!2sv)$|KHoV@$eF=UynZ`0>KSH)cBX_Q}ZHLSQIlR%?WiahiQIF^F z_U6n1V{9*^gV@lYp;=?90t9)8y52CK?e0g&AOm<=k`cs7VZnn&vX2fV&Pp&9x^e8kx(GOXgBw+SA#Lx=QC&E+{Bp*exD zoIrR^z?lVlP;6PxLtaicmvBr4jvICJRw%Dt>eDcvqTCpsXET4uxH42mCpX zhDzjFC~Zk&(f=DQBj7(v=R#Ra+7!JlXbw?0z#`19pt~g8+nNp{WHIN z;)g?NI|8zwjs}mS?Ze!qv>SmPQ)mou3th!u(ZW_AvZoJynqZ)s&X)@M(~d&9cuY;C z+vS46^cW0Wqb1x_llT27?MbDP1S2QV?<4|fF4Y$BXtbnJ!d5wfVu!Xvu&fcV$>_<_ zj>zKw7tlAAo|1)Lp#mU5biOErX(^t3nV@Gmt+q^si0eETY|2`!+CrTYMmsKr|T zG!{sQ3YO8h&HNAU!XzyXrx(#YiM$HYigr{CdM|QiLM+D-E%vK>-Z(+Lm*^a^r1l*kT@Ye75l zc>3vKEBjs(!?neztwOAeSEvhLf0qs?COz6NB=5X&@o)=?W6}@cbwJHMB$m%T- zNbFAu9fGq|baoKVPp=m|@z8WqP{zajSt9*R#IDu~YrV)p?QVKnnAiy^b7(UN7Vt^* z_G;Q&5)x0t@6Xc+p1Vh>N8qJP!kHx&$Zj!@S6E>Tv4n9h2mL`>Cd1%YXm?>3 zML>DBapA3OYAHJR3f=_a#5qg%ePX&)H%z?bf@+>Dd{}Db!-v+eZ=!#dWq;pI`v<@u zqxmrDKlG$b-olhr?Hy|{D%7~Qpq3^;pt<%d#;MvT5_v}qY@q*ntxQ6%kG8OEmWkd( zfpgTtDaW)d+LWh(rd=WLir_RC7(J~VctJRDP;|!D%K@IB=d2hXg6MO6Vv97msbF@D zwo(GwscC}fq7cw!jdDbc>J^4-tW50>CH=HeoY+EJN632+{S!@t)PA%tdTQw;t6n4t z3-O{}v=XtMZ^0kMxFn6I2^ZKQdUdP!m;iMDnI@{BJ`T~fbh^my2%MLz&6NuhG$-s! zpryd8NF!mwN{z+Bu?RdnQfoz^*IC*J`6Sl}sesp4(-u(HUE3)#zW}a}<-nC=G%tbR z2CWeu>Z$c20;bVVlT#XnsI+i^)y|0G<#fGIE0K~|=f7EIE@@#s^ubHiCH z>g^K}xd`R+dBydgr@Qe%Q`^SVEK7?KTC^4tt`xbJUi0n27n zzmI?Gv(!q-Vr%=*eJ1Fudcyo5#2x^bvnhn|%LO#RHkLh||!dubN1* zVO&X-at9V(R?U$ef!;1}8@ z0+*j>u@D%-?uXz`%?F-2%!egsv|)sN3&Ah72cR}X3dQl~wDmIi4uW-B2gnLDI>GvV z+TZcbkF}0rWH^5PnHELVT5kSF$ULaIA$J?;1i2YxCcbx7>n@X@V48z{f}h>cVr24f zD88Xj1kYYxECT7wgcXrS0LRp6uSn!)DE(a<0!?m&yD;#bwn3JZU!bfav;}&8)A(|o z^`kZwpZr<-RaHkQwl60jcQ0JRXCyY4xPIUOzj>`s2Op#z)V72F13q`l6xLgomEV&g z`;2D5>({mWZ#f!Ha8oE7D-j#y4Ucl;T~1c+AP?Y0#^U4<qw%s^H|!tH#BC?QEwCnyTAW>6AfF5rqxMa*Oh z0dELv1C3_0C!yL-Lg4XhT5EiJHd`ptS&hb`Gul`#`-}E4@bA_};4gF8aXwMkaUr-= zUEs}0ELq%1v2GGeB~TgXP~ozR?LyZGHXuYDsn|}o7fHAnTg_neCCF;a?&7;LXM3o2 z8wwPUWvOZ;H=skdn>~js0&Ip%4D>z4JY3E*S_aOYz!piw4W6$xzK5Q~S~=9wimkYl zusRB^Ww9{F-J7$`QDQ0-IYWCv;Xu~h$xSwXMKK>zY{y-<#&=kvgWdUnZ!U|9Mj?CqbwVj2H9*o$TOIZjTZB`gnGQ* zWN!zr*9UoxnI8u)V`wMwkT%_}L(jhU*|>5QbB8Kp6x&wt{af-CEU~-r`Z~rWHI8F6 z&ySwm2%8o%US(V0$V+S^!HUByQGyGb**&BsWVeZAkoAiz7lOSUA&_-S$pwE4MTf0d z*aMJN$#-w5pSZ$s^fvY?A@@MGH&TP1o8?yM-@y*bq!o_5#;-u|3s(r1l(JzGX^mx> zDz9O=V&fIUq@+q~J=9IM!VjI{dF-)7s1n!s_}f^VOk zB6!aejD45=i;#9$bX?&n;*VE`!-EwH6a1Yd(jHQZTpvNi752@an7}bFL*@y#fq0?l z14V{BS$QxLEUq~8{!Vo1|Q1^%ILy`a4(^i*dG61rV zMqYtfi0p>(KD|aF1Np8!l9#F2Wf5*DTolFKdr;|&k0tA?i8Lq?NH_% zFl3*OJPLuaN)tG>H7pj@9{N^0nSjN8^il4xKxL|81!`di(3YJIEyT zrs;fMjM&o5d<3e8>XX&9yyoUa7&1&R3I98PYN*fW^(9S&OHK4d?3u3f0zV9u44p5( z>8Oknzr#@p=!2bPGNet_-wDmgnPNVw*q(bxsEGrn>H8&K$y1Ug2SI1H{-Z=jLiv^O zZjd@pUz}goC>7l^^&1j-2+C`nm3VrV-oq)JdgW1WAOXAP=)*~9V8twRDv!rZ(FX^f z)q97ISu)d{qS*2u|6f;A=(kAUtB&H-W1%otzK&ln)|s7TLeo!`cx;iYU$m2PP}EO< z2*<9`H_2o?#MvV=FtAsDnLwd0Bnl(;>)-H$f?vy&`Xca+EP@z+L~kE8RL{;i}w%I#+Xsk66& zvUuYOEUeJS$s`-99&)sY6?6I8fBAwv79Xh8cgSQqnoC#$FG6jZ9ov7XpO(lIQ1v-4 zg5JY?QO&Kf569)_^qF=t6HcrrN!X=YKQ5CeA!`v|*qmS3=R)iT$0eNkslHqy|A4&g zNWP=Es$Z3*S)TlUcelk3H}onwe0HbAE{Tar1Okya`la)CP<0(fFRzc+DO* zU9nx9lJqbe*WlZ=rI1D=Jdi58HsR4kW1)jQf%o?? z-jLL%xuxgxO*RG}_8UbqSq|o4*8uR$*W(4&Dw(Xn@@r21lH-pvtd|@$H$SCWi(5Q< zWReGUHO@Iu+t}z2FMaHO0Ryd!jS^W|pDF(~rd9QsMj78YLT0Eob4?E{f8OXOg^uT7 z%lH?dbfxUACmt5|HpUUM<~Gn5fP;R77qg5OGI_BfO-!p4;d7~@dK_u zg);#v1J4_OlhgvvRk2sRlsd>&^-I<1xc2krIdw=cS}F zLJEV_we|$yY5P8ujOQDj!23d-Qpo#~%n-RdlHdnbhEF1IKw1;mll&msmmi>v%)1 z6Aig4?#%UmeXf(YahlZe?P<0>hQw^d3lbKAT^nYBU<%yAoKMUQR3qzd}N#ZB|@%3%}!@* z0d@TyE`Q|iA|^Nx-2b85$6rUANIjvX*gZ`C!q*DYI`N&6wH86;0G9*&tz0p}=ru6W z$@lN6MmjFo<>qhZ*CDOKxQG|3-Lc}lNxgw-mBuuJQ$BUCu09-6D?j|>>k|Cl+PF^`tAmt|D*L0-R#&;3N&Il9)MM= zAgAh0S4;!a1o7y1P}JC%0UYuzOuFbkDUt87T^r*AekgoOw_d}3z;;1nJ3l)6)SWJo sA0fJnqls8REzGwFO4r