From 6e0b3484dd0360eef5365ce23144bfc59ade89ba Mon Sep 17 00:00:00 2001 From: frozolotl <44589151+frozolotl@users.noreply.github.com> Date: Mon, 11 Mar 2024 11:35:39 +0100 Subject: [PATCH] Fix paragraph layouting index out of bounds bug (#3607) --- crates/typst/src/layout/flow.rs | 18 +++++++++--------- tests/ref/bugs/flow-5.png | Bin 0 -> 20421 bytes tests/typ/bugs/flow-5.typ | 13 +++++++++++++ 3 files changed, 22 insertions(+), 9 deletions(-) create mode 100644 tests/ref/bugs/flow-5.png create mode 100644 tests/typ/bugs/flow-5.typ diff --git a/crates/typst/src/layout/flow.rs b/crates/typst/src/layout/flow.rs index bd693bd86..85f671429 100644 --- a/crates/typst/src/layout/flow.rs +++ b/crates/typst/src/layout/flow.rs @@ -244,17 +244,17 @@ impl<'a> FlowLayouter<'a> { )? .into_frames(); - let mut sticky = self.items.len(); - for (i, item) in self.items.iter().enumerate().rev() { - match *item { - FlowItem::Absolute(_, _) => {} - FlowItem::Frame { sticky: true, .. } => sticky = i, - _ => break, - } - } - if let Some(first) = lines.first() { while !self.regions.size.y.fits(first.height()) && !self.regions.in_last() { + let mut sticky = self.items.len(); + for (i, item) in self.items.iter().enumerate().rev() { + match *item { + FlowItem::Absolute(_, _) => {} + FlowItem::Frame { sticky: true, .. } => sticky = i, + _ => break, + } + } + let carry: Vec<_> = self.items.drain(sticky..).collect(); self.finish_region(engine, false)?; for item in carry { diff --git a/tests/ref/bugs/flow-5.png b/tests/ref/bugs/flow-5.png new file mode 100644 index 0000000000000000000000000000000000000000..648c8c44fafac5d052005119972f210100ee0f5c GIT binary patch literal 20421 zcmeGDWm6qa@CJw;0}g(0cY<38t_PQ(3GNUG?(PQ(8Y~2NcL@%`CAbB5m*Bw(c7MD3 zzq?y2AK+Hq>K8rJGgVVHJ=61aKQ)nRDsq@;q-X#D08>F;`U3y}ga81LMd*J9z-r0< z8vsD{tAezIhS&1Rl&XB9Gx^}(fG$~-;m||EP`89BdEwc-DI3G62oO;u;dh)KKGFev zZ*rZ6NPJV9?`EShjTXd3WS^_$-;plmmX;2Dj=UF92yBvwu4;OMWc0Y|i(J5F@7#Tj zH=?05p)g74!^iu{DM&gT&kCfRi^>zk@PF-GsH(IC=K07bPqtw{yzYnAuQb^d462SU+81f2 z`Cs%y_i5MN#SkrTY$XV5z=H_*)50o=E;dX+>K;gLA4L+)Lf+7@5p>G z{IPKfmAP5hi#mhLly@l+{`usq@M)dDoYpUEo|OVGVW%fn2HRAp>5`++!8h6bS}~YT zDYg2VNOSThHc^@Sw@@j9rzVxsZEb8y2exwQ2{_4Bejw)gl4Z>v-==<=#L4E5(liQi z_V-IcjN~gCL)SN+m%TY*qjfM#?drF{U)`{?cXvf^>c>9>X!8>GHaxn1`+pot< z^mQKRe*7)hG#0t`pG6|ANEp}XaL0LFWPsZoB*VzItbq*`b6O^Xb(2*gtarN zpo0gt6W5xmNzFcztnNLL@GYh0r#2KPKT%bjU(O_VqY+~b7-)lExye&{1P0$UzvX!M z%i=3BN?*$;HxFrg2+4wi;x`ZdKMdc(zPn&9&8fWUwTk*cW3zDP+u*s#K5sT3HJ1MT zeC5A>V0ire^tbZnY4a2N-ClFIUjm9moh7BG(lULY-3+c_>f$lBlUG zKowea|CenhCK&-I4K_xj*!e2_Xz#YJc68HTY%4*K6aEswB3pgWvRCE@5>xp~4SC)t zYy>kmUS)kQTst zqG9O$Fhe@?noHX&kvr$K89wMyA>$$#EC~U*Ih4vVy?w;!)(s1Ccg$|6NFIjX*h=1a zm#nF$gm1_ZB+m^{qX`EwkGSIQo#=kwU z@=>TE?lFj)x(Sl32JQ;6IbK>s!2;8bgi&aEPW#zGe5*Z;$T4y!C2Qs=U z3hAr@WeW6b6~aIm-)(cP-rbL6!9&El&Ad_l&u9VPEkueu`b?&=)S~6B<}j=EB2M+b z_u`dqsD^)ws?HRmICrk^SXAq^Y{aAPIbk~?FoH2@gAIuQRh3?u3*=Mti;%=o9nWFd zZ&nJ^4JKy$PSOPltWZ`ytz#{Z*q~S4p;+6Xv4FbKp}53F+cz87!w-7%20{Ahg4Bcv z`{dut;3BK~@x2W?hmcPN%EETVNx{(y;nTM&3~K~p6f%z?OCM#%lUn#vz>|5ST}^u} z3da`BS-bwrE(4tNXim+z=jVv3#*&to!A{tXISpfuta0uVOAQV9jDWL}5m_d`dVRO= zIVmNaz{xjf8VT44HL6`H7kLI@*JTQjnJBYGPbZ(AWowLKLRUZ+^q_Vq(( zCR7D!=snh5SH3Z7n`H8ciGFYo-w;*|@DClm;CQk@Sn0&3FCdef;c*lMbs)j{cDy>oh!0U`TOf{y7Mn9X)an~oUc$> z2wgDF)_H8aYxoG$7qm5|Csvx!d9)JTf9;rI&w8gv#;83~{c5N;c5$Xyw8xl|Oc*XP z>`1>mwp&{nkuUo^3c>Nk5gdrGZ_I3^$&m@DR`!hn@gyyV2Z>u`QfI(BCB&+zz9ct* z!#jrs0zd6MX30FB<)hsujITYYME=bXl^gNB;i6!H=49wClVH7!ueNiC4QxWk8>KM= zcpw}(m+=@#KMz^_TDH*wXo!|YQngQr>dH!O7z-~cS`zqj>)=6P@YA7m=IFFWk`k$kKY4M<`XXAb;$2zJd-a)grrzO>sf%4a4F~Kw2O`*AZ?NG)B?E^ z&e~;Mzc!|%iAcY~8#Q}2u0|mzqm$yzs_D+CwNp~DkWHGMJf8AYv3Y=Tgi`Gxken!h ztLlt-Xym<~Y9%zrKm6&oK9Wt1J> znAVN)aWmM7PD^E_ab|q(ktB498{6M%nYU_z8|kUI8-6 zUEp9*#$|_#5Ye=az+yX&<8yAwLqmR(AS_`FBW?i2^1Hd3Gk$4m&xaKkR?6RCLzKdL znqJv0>~2>avvM?==5->q*ozpNV7=SGU?2B#B8VHh?OpyBI7VNj$d#-}C5w9Jf}O490M zp`xW-WNrp~&;=EP5zrqL%ho0V?|AITdvAXFrprp*${sF2qR`V9qJZ|$C+bO_I+l@$u7f2H>)&uh=nY$f&z4RDQ;sB@y1BKYyklLRR zvF7yC-^IxHhQ7=HvPXPU2Qo8|;Yq9M0aXR;=%y1O97~9}og5Iao=(?v5KBVx@jh-@Ba0jt4PQ04{e` zs3S-%=Uog;R70=clN8jx=jq@FK(_u2Ag08XXF35^dj0WV=ilZbLAe<1Kf08^yn~%f z&Hm5Vye9&HJrVkGcr8X`IH!zB3=pFDt;6_T??bg21}rcbjY45(sp0X`D^hYLY5?(1 zfKywRYC5Te0E^rDIvt0JCky0eg)sH3z}#KJLYFftreE`Ytt>!_@`}{E>#a4aGUf+0 z76au%%Hj_m4!rHhHZ4Z*Rp91;&6Rs(&WSe8FidNG0%(#!GM2=GWLjVJu?CLmp{;~` zOlNp!L+NVz3?i6mGYajr)fTWCi!>A=a0fuVSJwqtmm!3Zeyb9K;{6R|4j28uYp19F z#ov;k#~*tU7rvv=bbl6idTQS=fUTl`aIWD=8cSe~jMxUL!;xgj1wP=Tw7BF)MrM5D z*52z*Xw^=C_YqIIH=!Sf50Sauk3HZ#+oRkneP;PvK`<#Uau*<$eJ6V0+`>8G?LQ$Q zEizUpf2V3Z38a3iei>;EuWBR25eeK-36H<-%Ss7%s##f$v#mmIxnFPi;y$3GF^~4~ zaygnZh21yVd4j%I@)r2HS$F3BUqE%UF;`6{fB4uJD(CV3R5JUGw{`_Uv6IH7qM({r z4!5jYgY7AvI#}M%d|EcIkBh<%I|_-y5I0_>@EqYstg0(K*yq#M!lYR`*a4THwOoiS zJZfe$Zn@KS$AZS~6q^h)pQi3fCL;M$5T83jYtL_%Jbs6IW|2g)|BXh>OhlC%ENm2i zB0@9XxN57A?P*tLku5P-Qx)x}!5^_}yN?lYxpyW_L%H(eLm9gZAMifDCH|%TF;UAB z-CSdaj!B;rS+iaiUh+47X8QW?dr2K<{OaN7sV>ZaX(kJ>Lv>|TH+A}uG*$!LoL*&O zEfnYq&=iTt>Xy(+{R}z9rhAc_)UEM6K=@iOQ06mDaN@%ZlyNr&hQ=}O5dI<}v1;z4 zsX5(qU#7%C{`GO-jY*Bp^EcRL%7DK#b*hj$`Ia(bX*(ZF;yL@o2g7O=$*}7W%m=uz z_c`?g19sTFjCNDc4DbUexLs zfeO$rT|q-kq9F4q;H0DuN5C9SeEl`%R(YO5_yKjlhM|-}%=jT1UiP7n7$^j8Kii2)q{^|m&I~If&LPHhp8=;?~=#==>|G*?KhnXG^ogo0>FvWpKzXY-oCMogqU>?~Jf|Rn4q>#B&h! z7++x4NN)TnK0J``H%rxk|{b1rCcA0MiaJdg-demyo{{kp=e>dus+X z(WXdcJp=Kp7T9iMJ84pyG+cnqW>T5&B+a~C-H@Vq<3E-t5qgdafevCMjj$y3zU*(D zyYbYb&#soQb6E{=y<6h_tK>fLqU6IAeCZ(UK2GQVv(jIpqruSb=qW62*sA0Li&Xdv z%Dd3<(@d$bVj_iXhDYhT-*)3+dpS931;?KacXWS#o}3oB#G{bXJg^yZya{^UCZ2Vn>`L@+V&~+Xb0KkVx-MGN)jA=#x=@qOGA9_^wPA2kyE#;`JD%!>Hld50cbdO} zBBfmn5X_0WSx33>`a4v^a~#4wmDFL@zufM)Pz2~=BNsYYe)Y=9%|H!gPLa}^NwwJv(xK8VtbNTK5dgND(_q#RUJ$RLL+pO5v_)=)U|BoD^tN!Ds2|f6`ps)F!@`;E> zn#8YrJ$C`;y#~Ual67SU{RHVWB8%m7TaQGz7~q}g+nO4uh;&X$z}RIxm&)1W1^Pnv-E6F_8B0hV*qiv_`qj#34ina8jr6HP2{quq=dt z4p9azEWsva0!T^(j7yw>K&>IsO-2wxJ0_lu{onG<*&IJg5n-N#xXDLguaM~v8Ke_f zN{|aBqFJp@X&v;th|IE|zq@$=$4X)X9m8He(ZMs`__mX-15e< z2bbiAl=_L@Z~7J=BoQN1KU4x^7=j|uvK}PKeMluNOv0NEs11l%o#MUq0-8ag_X_|T z#cN-_Uh;7E*FoX#B&XztkR1-ca~5SxO5^sVsxI5^kA#0@-zu-igv zIDw2MhY!^QGsjJ%1<=2fAbUlUpAokL6U@Y?!iVxHmsuTL<63TW6D?tNbPCgR7##MC&RCOO`@WpIkbroHj|rKk5JId7`6h|2$( zp{~MCU56SuE-v2bl#Cr6V|k5udnW5f%jV>r1{1fr@_LRbiJ`8EizHCV9J9FykFwUP z#Hw#`f=nEfs1Sc;A9><7GQff!E{R9~Ew()5iBcJEI8hyvc_p7SHL+)AUK0|jgLqfSWIxa{CpQbV=zY=$h)HM5bB^5N zytDwta}6E2fS1>6*>4%!KTWOpdH<_y8HdFy{J2bdd-Ej_AEhz_GFrYMLVvP1Z8+Phv6G!(lDeqdd;A~K#Cr(Dcd-;$!trF>5g3(3kIuq=+DH;FvR3fQ5{Re8Fs3noMSV4 z|ETv=4S&HJFV8-U$@O4yxq5@m3D}^@d6X;LskwI~B;!u5PjZycuDNPSJnQ=z!(3%$ zAJD1(sl9Yh2&p6E$qVmX6b?0o-v zfl9IVWipyGvpIzEgXjV?&V7oI9S+3gJj5-+wgVQJ);H6bB3yf&j`0TL7hF1 z7E=X^;G+jA_T@75W*nPDf8~I;0Mj(}dWMn_Z61cXowUdTb})3yeqe(=d!pVwZ>0da zB4u7X3fCeATqXGSbc%om)LqW|FO6%Sm?M(4lYy7~7V4jhkL zJ(~$00U*byD?KUvlK5k43fII+Fx-f*>ex;q!#`CM+u?}`860&&SC$;i8_%M#5IW&!NfcTEYIc1$FNV`ic4DQlrTxI@ki5~ zz%mp8G|eIQe2k4yZqVTp#Dc^Yk;E+-XJVf^lBlOW=3fS7=nImV12$emw7t>13K^6t zgFB<-)wF!Ei7lYbyVRSmKZtH4Kjm`UqbT8%=KcfZc4Gc3j^=53(~eM_ILzS0UE*x+ zaTW#rA<%}a7D$`;`D4x=BW=7%~Mo6p}-&&SN76u&4f)cGb)g@aTUcFHr=G=Ez2X}U@O zem`t+SnrsJ#}2ni4AtIYo7-~Ne7kL!b6c10E|+9Y8Izw?p!B}#H>y16iUuluDye@O z1^)r=az0DaS`yg~9vWtPSd}V=X{gjGyPijMll4;hOh-HxA^T%*4CUNWoR>V@Haa=P zv`a>_q_l@)WxK7h!Rro?MmL^b70YexM>0RhM}fa5=45LVmrO|EuzosQUZgB`%-YdG zV3>}od9147xYdZQrD69I+umPaui^QFXpw9*cCWr>#;+0QtkV;*58%)n|Iy(yQ0CEM zxn{|E&?9(k{GU-?Ei{~zm%uL?7t(R_^*@+f3z`x}<8&|ndG@0rq<;6}>tq>)3re*Dp-rjLkYPJgJ7 zOr_%n-ltHTuRSr+l!DfLVrOWr#Hi-|KlI~;qGxv)U;_u++kVV#LFhT1vV15FEjxrQ z<&=(}Nvs2~RJuTA(T0Y6V5hN97cG|y_vhERg44n3 z?T>ek2D|M6IsVqmn7`BQw>?_nCYn2LpS2@mb~1|=xxB)2GEo&`n*T-*GYI^RUFG_$ zs`@2o=hx&2mehj()lMe=s&)j7SLHtV*N?z3pS)U0*Zy28bAjk%uI6a&$umQOJOABX z8nP5Jq1K19Mjpig)6g>ZAYUZtsFJIMVM(@ZILz7)c9DG0V;oD1$HoX6ruvl++B@l#o{Abo(cBjC_C%DTltjL(t3x)w`TW(@IAOeu1*k z$srnDa&_8(gE zv+t;40gp|`)2?J9 zH|QrBNIa+L4RmEd50D)LTQQNu%4X;;8=+g!`=^dU(>5_{Ad(&KG~czGXo^Z?^?R23O3dNT3*$O4K!Y`03T_d_6 z>Vb?F9m2T#mAV^Ao%H;!wnNnIs0S1pTDm90&f@312zE2tv5)2(cX~=fNQ;Nj0Uo{j z3jMflRkQy5k6;JdAa(A{p)h1!8=KR@+JS8z6LpF(7PI@RYW3{&vTg1s1_pqk(s!$4 zO};PjN5!RoVOub^V#!p6JA5k#q{Z|B*Tw{55^seGNkNr>at6s3u;|xI(`KE!Ug(lT z82dk&^xJ!44j#wjIU0Ch8XuZWv)4D|S&Gxmf6&ZP78?~LZn<=g0ADY@<$VpU*=7Hd zm|iQ9olz#eCww!b*7IFe3{r&{bD3#`xx@y>eGMVDwZjqhqTxYc?So<`> zLYn#VqcwjOL{1Rpu?5JiHrwa246^fC?a`U0xAHfXS(0#Sw3w?t*RBNx+Y&ctJR3gX zpd?Ko8)n94Xq^VOMCOmtBa^VKD=!+oH*MRO!J)pQ5rOL;`2%=zk=11Pz@^N7aV&b6 zxm~5x&#Jsuh*Tx7RA4<;*3*`>NdZGCaB5>bI8dr5$jU)A0j;7Ovot=Zo@HLny2|N0LfGE4rC^md_dWxVkye--In z*hf=ra9ZJ**Q)M*;+W6!Hzo?*#d}hBAn-C`{J^vva`lvUxt=WNM$Vv*pgQlug7Ti+ z7l^Q2W+q2KqrN+A59ip_`h9H*!?{Qjcom}7pt|SBA&f-9Xa0D9Q9{ZvGc`|7$`@7f zCc4)1*LOqH!IpLxWv)ttE7b108A}Qjc9SN6Xn*IJyE|#MnOy5>IHQCU;{+ zpF8*_p|VKd=M_aT_!kimpT3xlOsS?MH;!yIMBkeo*vIm8QqDX+i%{C(UFJgXx33h;SXU2xed6TK>ps8ZK=SNYQnuhB_y(lQ7!Uxkskb zrw_@Q(4`-PdiX@Yg~KDb0~%_v4JJ53`;;Bt{n?p95rbyNNhqG4NTPHVATWnKZb5KQ zZ0;f@H2&zMS48L}>xTiO0GA=Zi=s0i811=Z8p9p#7W1(AbA0KQkRJ#bM zPmrjmH=G-$@3)~1wm~DLPE6<*6{+_ap??79TGMn+jsdTx+n+>xO%mgCYK&SlpcBVJ-ic$z75L=z)2l zTNdF4sNEFv3v?ovv;KE#r*${T83H9(F*Qf(R$WCYA}^2|syWg`z|hNn^-a-vfoJ*| z+ypbkQB0c+P`hzd*?W_4rA-o^&~VXVzcJRfT)e#%-^m%h*)WpLvu5X)IucrBwY5;-?dWPYQO6 z1B+(bYH9_gCX9=`Hg=0-KT?=jw1U$kIzF9a`bq$ifMrq8-$aWYluH(J`jg2gC=N@7@4 zO;IMoU0ux0YjmeSEl=duXs=%$kT+Y2Hq$Q9iSbIGo-i15fQ&dvB_#8)^`YJE5yFf?&r_F` z{7!D8c6JZToW^&c>8>nd9&!T;F8IuZ`_2&RW}N&>V#$lxnZLQ-wH(2@#-62!1K%2{ zArC6r=B$a`@ksZV!}m+|6LMhq_l0R8qsAHj?<1F9J-O-Xohx`N-Cu5k^uZO+6#_zNI>E2Lb}s8F;P zmc6^{bUbNK_5h3e638JoIQc&(EJb6-Q{$b73t(vy_3=#12#Zlm8Rpn+zZLnCPq(K zRO3dgzpXzWfrJ?!*ZY3UE`96)VGy1Lw@6}F?r}WTD(=sox|fMl%2RVFW_n&=-H-`A zm-erV-z^*GD^1DGaQ*LFBPYBx1-W?L3w!lAC-1#aFAf=1Tz1$@p72aGk#soEz{sCy zl-Q8NQo%*((uv90tk9m{rh`q!&1X|E`T*d5wAD4#A4rr2rEwuydgFb2%r;-ZeU#dm zA!kz@*%uBi8Mv>kLYdlU_pqdcM6?1rEGn_`6tgH+L`0kV5&u%_JBF#d%iq@Ou7WY- z+QTm@)Wr@CcF}q<1ySt-vA4bttQG=(WLqr>lgW7egKc?kP5cz;zqJe1H^c2F{wo=- zR!Z5HJx@Wdk{~YEJvrTS5n><_k>LJcRGZoDX465Xq7RbMm4uea(-U?xy$m#1X z)j3Z6S6w#w-lMFhse_?9fT6?CR|89ZBqtNZrd_pf!R(UfR+fUBq&&g&QROq8o)jOMnJO9cO$_SEtOk z05Mzs2XJ}T`-#n;Cz7kx{*UdyH?jjgO|Gk-eX$XrCx2gw2mloZn_t>bm9snTI5rH^ z7}X|JB!;+}|4q^vl;(&B9v_T&DW|<VwmH$VOYiS*h8ndU)9qVdEQ5_@-rD~7v2`0-R^C%7ey0&s4nyEm1y zo{uvOR30MhP_J#8^l&XQ?!)U8l8Ue`t#L%q8%j86(7PaK@0(?IcvMu)4T z+#l&9ZZ2Vm$M&&JcQ|I$dJ`yiqXiYmDOSGhfe>O^y1aO>UZ@d(kNd4eEQFXLTk5SZ zBH5z&r&8MW%(E(DbE9FQqq{3aE%$9V@CU(lBe&Kod#LQg^gg2;P${uftuzn|GU#Ws zHVWj{Ukx$y2ePpQmcL>R@7dEFo>R|q7XI!6`O0L8t zN0H6b`GBcbspWE3ro^|AFu#7u7LEX*(jy3EH(=;{NRZYZf?^v#zKgLEFT2}n6yqs2 z|2Vz@rTXzox=r$f!i+{LO~_VjCaN1tWObGqwbNgc5KKy-78p2VBm@zrUbVu;n2X}` z1YCN8b!Z>K&N(KgN=!P>_qS)rSy}^*353m&C!GJn`m1p?t4k;G--_g7owLeze()ZS z5-as3T77WQFM3qdUYA*bFRi)ODKn%m8&^BMt}AL?c~8ktcqi8C@L_N3F^7Oz8kXMs zPNJ^y_Vbi`><=i73YhUnb2BCe;mS-h8aI+-_VYa)&5jB-e)2x0c~7Al+~84{aj*@n zait0hPYk%|eGUgVAF!o%eJyY`Jn%8}dvwz3KY2j^+$DB#d;ET@o@guwg*kp zdOqs}OPTn=SLovRz%ZTb`936h!ZpkF?u>lFdnN7h7JzfO%zKt_PCS&@l1va4DoQGD#8q4|-~kh7rh5tgjwW-R++w?M~us zdASRwc_Pj7+6{`^D@5~R$;@|$TiowkL(ZaFcbNvpVgnZ^%uuH^#J2lBN7{Om(kMPD zO(@>%Qq7xCJGokkPa3FY`?68+~BZh4aXh4K$x8(;e8@=R=?3uu!XFK^hy z$z#XR)Qs5)-XdZ5r@+J*iFW)LTX<1a{oRN4kqT&)5HLX(8mkFNPb)rz-42;(UV8t) z5;}+usoI99nRC$(Gk2?UV~zx1Pd?zI`6DR2yca>^2k|Du9-Si60UD z`b`1Yk0cX@*KxCd;R5=wrFT7Cxiz|l{sY5$LZ9i>Zdspe z%4KSa;$F~bc$0aw-(F+mFd0Z(wNjh>l|eK3)@NFI4V2ZML~MK1YF&fn5x0AYwQYK} zLX=WvWU$92>RlL^cO}Rett~q;CrG##({9g$S{HL~8NA7G4mVRXlD;3$J$|-d!$6B= z=#-rUaQJ%@P!b2+e8XVf@;lwd=8xd8Jc;wE)5+aR=;3#ss-AN6l$}k9i3`Q|k(5{P zoIv+=v&Zuow$ef$)Od=@sA{jb-L&)KeocUwKVaf8eC`9SrdJJJrbd5jp5e#+xWAZTKWy^ z4zIDZ@A>J_&)liHDMxAngQt=x}(aK-E? zXoOLCUa2mBcF7J*EzW`N8y@8h7`>F68uuR%g3^!_|4v?7Qw)ipTH+|g#zxaUX=d2H zqc+>^ScT_GQi%CSugeJ(N!=f7MU%A#t4&|Nlhom)+~w<4$++b;{MKD>zZLqBL@4oJ zc(YIGeo>JL_OnwIF75rNT~>>3=u6IqRa@Y{rJWr!D#!>d(OaBvQfXNlvf=n@w|a>5 zC`5qT>0r35POyAl5#>AO`9oj3!qJ@GX>Pta?4y8BXiJ`lyM9inK*>=-j>pr!;If~v zF2B`Ps*J~gnXZMmnwYFcT%jz&`!J*(W`L`@apm>U>`j4vN=ZP6{nwxNxM$?J*PyU6uB-sUurt z;zyJagQgBqHh&5^NxneSkkZRci{&L3D7^^-QbrMiztJ84fNkM#egQuYkXQTMff zK`tJhwfosi2Gk}|P+YR^Ru-fsGc81dH=5a$GCvP<7}$l1s&i=-27*G9E-5b*v4T&x zAu#%5-DX?eR?1Am@SrF|fHuyTYJXj*(IxJMS}aX5{15LiJd7Ay2@h4*LoVpjqucKR zWS@OWSSv5qML_=)NJ6s?#+ziEoeMQ$7WiXr5^nja#hl+BmUNVOI=% z@Y1^e$&*bW3}OBxy6XvFCJ~#6+O_jDwAq}j z-ObKDgzG5mYuRm`YvZC%rw$#d=DIb1BkgV|2S`uE40nhE7dI*cCVMzdZ907186~YI z(>?fzHWlmJ+%qU;7v5BOcqoggHTwE)XZ7>532wSm{!E&$Mja86kN^ZEF}_|wv8ya{ z^k3aWW8Noo>gJ6RCrMQNZ|T7Q7Li_^AxS?usq%7Vc2CB)QzubP69oq4O8;u_+C@Ph zGhreFyke5$wh8rVv<%oZz3fCKdpDo`5+3t{lh4N{j1EiOWy1r zCc7?Bq5yA52hYPErB-oQlDw|1J19)#7C1Tr!A7d*qDL6;rv@Vm!a|#0DgSzhhf$1_ zeo*9VIN%t_z<=yH^UYNTFEaQKOAw(a~k_k9nD-BSaWs;7j`JhTw~V zDLaT-#k+=jpq_G2vO8j|?IQxM!?Y;^sTv(S_tP7bpA8JkSLf99QspI!5MoTEFfyR$ zo>soOy>JE=Qj{N}Rwp#~^tc$1SV*O#176rY=hBYFLOF{LYnrD}D#xWI0>{TVDd;Te zHNUgTm1}tufMmyp$a1;sYG&|SxlLnV1r#K7J4vzkex8WHO#4%=F^2*L%ZLDM@bv%V z<*;?!koNqa-lIw8Z@I1`a& z06zrRhx`00C-B;Qv>;A*P0dMUicU}yy31#k&=|9K0B>{}cpE&|08ESp4kH10?lR=Z zuyMm*E%&WLQZeHtEc=*Dg1r51@!S>)83lk@<2-SNT2QmEwg7YZs7*KTG@7U+#L2i4 zNe>?-ATi~I9U}hct517oio(|hpwEba01Z)a{Yj!y3p#ncZDMSFsVvj-Zx#Xp<&n}W z5w1U&!^Z64W5LP@DHqi5=s~78c^TwI+ruKntbrfu9dQ@&Bd%^rVp6}wo}1|~sQfaZ zew*V?diJ^Zly|gfq3cVxNysk`MizoYr+>B|XMh+ZmU_Zg#@;jeuEVJsOvd9z&ajWa zYuBZUNvb5ZooxFqjbG6WYU~Buhe=yZt!;ke)NmJnDN%18DXi84#&h!o2I+--p!PR= zp*0pP>0!`yN{#9VKA_D}R)dUP6X&;TCw9>*);N+FAA||svd`abNKy;pa??E&^u7bC z4FFCu<2q-F4i&%tmx5n;V=VJ*rQcEYmjcwn3)lrI5e?9Y(R-ycTClJjQ}gc%+9dB_ zZVmPSy|DSe)HkWkc2Y_FRQV+PF`*ONN^!`2vOy|!2=5Jh<2oF!F$I&RI! zPcgx=5r4YNsUCda{LJ8Ckjs{N?{5a-@&Hw`4e5SJF!Ec}?9+V8%8o{YSJc@|kt^=j zR7^)@y4T(BLLV}NX3f`GRWPY;qq^qMx6n#)gRE)4byZJz?pD6v3j}Yy*361aPw~q1 zAE<|R>-O=}12*3cE{!je`0>R^x_X>(W|AKKBmXd2V*sINBjXNmW!Ze^e^@SH7CXKa zeUv(iArD=5N}yH5cpYT+?b<9SoJp*oYMu zSq_>D^KV%NPINPs*ynT_;8aeIBbbi4-7Yc6*ro~|H-*!}+SH8}!c_Z0`0R3ceetrk za(9mh`AkZJ9g6@_)CXKAr`M3Rhfn1REJ5ka+2ZN#T~SS?{`f-__G>BD^pfIMFlqgf<%uGKHa@1LjV6(Wc2d zDCjapCRTd*R>qRxm;H5JZVHomMJR5`BBz~3A%?yq=pt z{4LIXH3E4*$~R4djpSQo)8CA(?Dp6UyENpCf+Y^dZilpUnq>|}-xe!|$%>f@t(fpe z0$kKT0ed@ir5OigyDfE2-onZ*+ET|@KW&oF$TrRCeZ+D*PTH1={>ip1$)sY%8Gf+J z(=RZ!(XsoG=i2!3q?}W6Jm9xJam=nHSbaXGAPiG)&U*e;sO>|R#RJEN(Vm*Cx}D9} z`X7e@;jVQWJNmOk+EaY>i@)dG2SYwLnf~Qaz76sTwVSh6PRU=($+ypzkjiM4x>~u1 z&6dvh=8&$TaBf}x#Tjbx|A%SnDBk^QfX1&``UDPn!m~2I*;_hRfcwGKa*btwUyTm- z0wR8T$zdj_24{;Y-(sU(GxAX%DlkdVE!ex|7*AevEOiK65l3J_eMsZa?r!59H#=34 z&107$oBHG5uO|Td4Tps2VJ<@1;f_;8-v8bNaRQ)1FFKf3)fHk(A`)E;PtV+=>%bwq zw#+W3HvbdLcN*3o(_V|nE^z?tj#mdoacKLl67n_Xl%uaxqfb@-)2l~+{svmL6E4n| zTVL5fVL$l2x-ZZ~=l@@bqyOQL{$JGA>ks2W76_6FahNc2hzt8!&yPh+4<9iO9MZq^`fjyR*!Z*>||ve;%pf2mlZSfx`aRMlij?w`-yLCC~q}@qZuv z|2O`BYFoA}VgI?ausLnK6a4>m@c-e$&_J2RufiomD;Cc;{5Z1XTInkJN{?rPicNO( z;X^A;iPreMWUJy|V1qW#q(vhv6-+B!t^FUP%_(JWY?{3qK9x+`?1NY9nvR8^;!k2CwjJ2yaqOrN8~!bEwy@WhH!R7t4@{1fn(OD? zpWWM~VMooI%o^KJ*<%eg1v+}WbOCYvh$gBGBC$uFO;KMd`hEwpl+06ZdrtCHTW`FA zjoWdo-GB2xmVQ)xrbHgnc{l%Ckl$ubkIG4>UMPfk(78-^VkRKy*|o~7MZ2kQ*E?rJ zX2>Jm=8ryPtMo?tC)<#C`xNu!Gy@9YlH!+Y<9i0P!B969Os(Xm^*2$li?%By+mB>U zK8B}98fTxleJ0!6E4Saa>)FHwC1+hHb9QDLmC?xxr#WpLs*vJRjf>gy!f$q$HV{ACbZo$bqY4U} zCR@8Wv6EWGTi6Lp30!f&1K#(WBNG`R(1`adtd}?me5?umP9Gd{i^6fJuvvNh>02;GNb@$?}5ob)T2&=cYv3(^xYrUf}d?rE)>O0f)pW$wIk>+ zC4m~dpiD)>x3F{%!2O3oiTV`uZl(&qpHKipS-T~I%TNxCRJ_)$o&$+JY%Nixyu%JQ zo^!~33HQV?i>4z-3i#M(l5Cw;6IdY7Yn1C?Y_cUPY)cRnv{@+v(9?JayL=xAs?|6T z|D4sbG4I0g+?#{bJN{Jm4+B28eh0ffk^zX2(in}S^oFHBy}MC|&S+92_wqH8^D^tL&49OSuVnFF5KH~pRJLmb-gn~u!kWfMo zJc`5siApab2tw#l5EM{AS{^09Lz-Y{Qd8(s>@=kaA~i^m-m3_Y8cIMxVi1skAQ3_7 zEN^CK_ixylojD)w$2;f4nLEEZb9ZIQ``|qUn1hPfDCy=ONC)bQWEBfyI%YtVyI}kL zF91yJOw{zb7g$}P&Q?*_O&X=zO$6iq!jWg*Km|5#%gh~!-(Gbzg$vnMSb;xGp6y6- zP}Q_M7N26^0J>Xl{SMsz5!^TH)Ko6Jyz94EKXH{U9;X+xk_~sSHX95D8LI#gEoG>j-{%g5g>B`!P!*$#H(SQoy z((I25<<3qGN3nR$s{Fkd=6*_Cu5G5zq6_`ZX0%%_+T2|;hZPNsxGxMg_lW_pWD1ta z6mA|CvC_wTjPMWVbd5Nw(^&OwcLEoVQ%9tu;>OQfxGh>nw7YNop7>eZRvNJ#T|>n46QIkB$CxnvL#*wPz0Jw?{(4m+dl%lV>CE0^|%`T@5); zc^L1m>+t8a{7lpYZ<`*IoQgI^SU<{Wmi5G_xEyY|JW^@*_?GeV?+EjIsWEWyzs3Cg z@NwGE1Vga5`N?4@>Vw@#VhLrLY*qX6n$w{+;)4Pq54F*1I974%zy*w$4RXgIAnT`4 zLmC8=*$z1S3dxfXwc zApQ;8@;TnL>Kw@Zi}M$NSJ?9o%`NU05^UKEFi5fptAwLk?MAGS2#|Mc#w=ogcpr zMEEr{P`^0&aoAKo;bfcO2zyX2o)jsm{%Jg3KiS8(hHU+YRQ0y)FrwyRlA~{laZAJg zn&kE-ymW6s*L)xKi{Y9V3w@9J-iYroyHux8RsQ>F(UOO1B7XgcWz7|hc2axImexm$ z+3xXbb&Qd^FvXFu6$P2$A+94~sv+i~Uf$J!du5=iS|gTP28%xFnUEZL*Ni#F2U83Z ztIYhya*Nc?K2`3{?489PaA(a3bGe9d1wlm&>S&ZQtxiV!W4mz0AsbWT%X(1rBxs7H z;mvV5k3Z%rnAO`Zf3l>rRFqh=>Zv-&9~^YlWLd`nSqlLRN&H)YfT6kepp^<6#U4KUT48P zaz+ce)&+9V3&2OC+=!)K1d{;%EMx?pp8I|lR${_k%MHk~8)2I&B^e3aGx(zKi?t`P z0|c6nbyWwm5v+`FF~BDYBx)lV=(Xy(Jg6w2S-T0qVgx&P`PpPbQh8xO7i0hs4i zh*B%?(=?+T?!_(qSu<{@ribKcxwYT!PpMgBl=bX0rVrX?%lupN{s8_sotf9WyiXq- z@voE!Yi!n%ibrl>x8r$6rL^%JOy>}ZryVuGLWO&SATE}eDZ=q}gkxyn>~~bvAm6l$ z)>@<2k`Xa2H$~SPp!!KPvY5r2R4)ZenibtJ1z~qCaP^1SN2I#r>GRD!)b;a(lpL%{ z<@mz7$4mHiVM7S(f7FN@NG$oJ)Ulvrs)cBgwZg|us2OX{qIrQRpzKtatV9LIQ~uFd zJG&1%1fSNYP+#LSEa~z4V%bruK)=SJpqEwpt2udUEQfZ!2vgJPCO6Smn41WbDBKg5 zL-*~CLZbskIuYlSm$1KFok{NDIbYIv=?&aiQb6q0=?ZS6Z*%l;xX#j-bly|u6Q(-N zUwZ}gqNKr3`o=FLBcEDL0sD1;j-18xA$5Qtki`u*`iY(XUJsEdl=NSM1PT>e3ERa_|DBNfB^{Op9C)z3a@1IO>1k%#Io#OOZ;%wvni> zGVOq@wb`oV%4&E=jdw^O&1&vOFvBv!fITyNC9ku>mZYchAU^2s@N*};V2iJUuN$$2DS-)oHO|Wz;{rwhQYSjd=bjO# z7A&?qcGe}AxSCOckcQK)bj*U_VuD8Ui^&N)gv>82YWF2 z1xK)|c>?rhcR=0Aah8HKh*P^#s%}tti3n&DXSZQfye8_lW!u0!0ZZm;Dv-TtJY=3o z19qvDT81${zLifav)N4Hd#{cZb61HdT_Cog9Z+B_-t~qDH+A0{HXm}bT&IDoS4qnn z$oX5`m=tIpM9-;@O)3h)m^h{SXSb^1Ru@gJ$B$VN4Nczzz@>A+d$n@Uq-n2lHEyv1 zl$77>3q0GWALl2eL%NF|9)ixMD~YWxBqE~7%BR48DdA0VXp`M~9oRfN-R9k7ZI3Jp z2Lcdc4BoevN1O}a1Eu=Z$tF@YKw3c}G6GMft)8B(hE6djBnHMoaTAREFtY01W(E?DKuen;r;gQ0iF5`8U z>h0R6hMHv}J*IU~b_NDKE*|Y)7ybRVf%Bn*K@nah==>GgtBTY>jGc6sj~H_`vXiro zFXLgM*M^)ZTs70zhmS&nVu~t(1&J!qP$6KQOktWjR_(#cjJTlu>M_O*iOYyDXH~@WO&SP zOqJuX?Jnl)86(o_TiSNc6P5tXuD|2>;`^0@+m(Hd_K*IS?y49l=8b)E!hZmZwel^S z%a1*Zcf+(vzkNS^3Doq)03&P{1v}%_t_8UUedn*z0NjDizcS2 z6-jd>y_?W*Pf#=kY)<`YMgz?rs}mk>8SqzBV48)){u|iTwdL3xusM+0)jkQJ^H)QgAzp{%vZMqJ7p>l!kaEn|74{f7yY!KGfqA@bC|N=vyPO7{hV|