From 3a9c77e1570418930713e762dbeab783bb23810f Mon Sep 17 00:00:00 2001 From: Hantang Sun Date: Tue, 2 Apr 2024 16:47:22 +0100 Subject: [PATCH 1/4] Etherlink: update ghostnet kernel to d517020b --- .../tests/resources/ghostnet_evm_kernel.wasm | Bin 3659773 -> 3655283 bytes tezt/lib_tezos/constant.ml | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/etherlink/kernel_evm/kernel/tests/resources/ghostnet_evm_kernel.wasm b/etherlink/kernel_evm/kernel/tests/resources/ghostnet_evm_kernel.wasm index f3eb9b1fa3dd0cd38fa8913f7797195ca4c7d163..b02d91839ca4c7176d508bdd78b17bff0c09e4ce 100644 GIT binary patch delta 345195 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 z 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

TS} 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 z zZUv%QeANATLAe!_^Ff$#dc2RidnmFH6AJ?aa#@Qk$IJq{>ljiMQm~QW{EY zm6OxI_^azN8JwD~5}>ZclyGXgM}WE+Q_HF84FT#-OnXjEKN6ts#Kmx06ukb&>hyGh zKy@)GpVN?LXK7w?PJVG}ib8r(erW*%L(1vt4uR@QOf{#crv$32F)cVfy(dszj_Jhd z>1#mZFHTRt5U4K2#B*l)n?Q9fCXF-GC4$t|m_p7>cL-7!W2!kbJp#m^a%Or%kh&7n zo-@;z1gX0*JvcM{4T!ICcDg{Yx)qbp+37yP>Pk!pB5d!kpx#Q*9q&WSP@g3j7L4QlQ(F#P}j|Nr!c zN$T3ueU+7Lrf;xQ7nDmZF451;PthwXW?;}i4`~+FGeMdX`sb&ogsKOr!NfnaK*Tv& zAjKyr-EpxnFmSUV+G0E)L1+yEX^Sz%T$o-GrXI(%$5O` z4{U_-Em#=9$CJbOHY^O_NjDhZi3MUljPDE$Dh*8r23{6KYnP9Ofq|cefk6PIo`t~~ zlu5w&0W$+baDHwovSLt^!!JJ%MGVxuK~^KkGJONLQtGDgI3>S6j~7$GfQ7(bnn0o+=E@j)GEh(3sqRG3iJgDOByBzrBP zNfxHx0SjM|fnj=Sw7RIP5K@E)voJ8E<>#cNrZ6xdi-W=*nJ)rLAV~Verk{^i7Y`Lj z5|UtHU~o$;Ndyf?Ad5?~fLhjNsi0l}vbYqetOccC1_lOXap~#&E$Z%EML7kTd3r^~ zCD*3+#HhzHUAVUWO^mt{qtJ)zq6|Tx{yrlljy_zUt`Mhg<^&TD0u4SeFfhRQpw@^2 z5`Q(cwE~krz{tR$3YMQfBTn6n>CTPm7vj|8n0Rh(H;7j^6JV}*DLQ@QH^o?{B`>Gf zRH*AQ^SlzBuJ}PQmdWJR^fk5W3ezhJ)bp4QzuNwyKwXQG`NM0`>4M)C4cQ{zfGWG` zAIjCWI9lF_f~O>>zq_KSz_jJf^aVxgc6>5O#f2=(^nyxtpXnCG>Ox8?Zy^zH#sGMHdR0hk1JX-gIc1}hc@25S}u22kl?3wHqAo_eT@-~wdx?N}HX z>{%EX99S3_9FZ&n6;q(1$pw`3pyF;&T8l*-VzE051A_+(1A`|E1A`X}1B3VU>{9j5 zGz}ag0-kz-Lxg2m0=^y+IOJ)@)Y}0Mbxb*AJ33hy7`i}er@t>(*JjfA1j(BbpTId$ z@4zQf@LJ1=Pmrn`)D#8veEbVQ;|~lB-ALtA56koe%M_!S1wMnbr~Y(-UPU&hiq9Yu zZKiK1Ru`GRr&67(e#K`|hF}H;aIXzqheG+a(6S#U4_fB~T2uhzH=)U|XJ7yyhzlzd zdy(AIhg2pai}$lI=rOoL3q@p!2`mf@!KKN`si`Rp$l?>H7gwq4^CAmPn!dhD-5Et_ z^7Q{z>c^R`eFgb7j)~{Z>drDV`ca*%3wNu z|1!lWnUu`3%;L=aJcXo6g{st|e1_@YAERm+2FF6qSS}enPBjhZcSkKSihe)~k2wPJl{))`WnP2aFF( zF4K{sW(K(Wv4&MYHoqVif(lenYJl<07#YB0vM@f(K{mfcr?)n!t8$c)(Q$NxeM7vq6cEVEe{z(X{kif9fC1H)Vv z28MY^V)H@4;m_>xPjq@>i+ZN;l7EoecPq4uz2u+h^t&zUs=^BYA^z3+FA5$c1xbju zsw*-_{1=^GJ4ao7dO)kX5O>LcNb9%#zvy(wS|yw5D_hkinOFQ5oqn`c-IvvbL5x9Y zdVHI@=yaVnbuQKb1~CR12tS}ror|f2VR}rPx*XFChUqmRdI!VwIc@4vOg9*&?`TtB z$M%ImjA1#$^oFyF64P7S)rFXrFixM*u3pD=hf$0npMim43FCBy4s|WA6ecn7n8p&u z=^-8JW?VCv#K5h9C5+Rjbg1ib-Cz;}C$J@q)6aCMTX6|6i!o?I^b2&Vr%5ef76Xsv z2AAX)rTXQUIQr$MfI9eFn5R$ZRF`5p!#sUWr@EBY3uZC!*s^C{L1~G9X-Pq8Nl1Ra zPhwGeDgz6P7CCtthEYn-M)RmYHuuNakrLM>H zgk|~-5MP9K`kyX!DS-t@NoFAn1H<$^UFwq4?Yq^5>lYzOEe6$(5ch^8rZX@g%PnDH zU)3rS25ODxJv%qw9)RkIY-R?JMzNpZ?70S%xc>tDvgz~Gc$nwOGTREZ?6 z#;_b@a7mg4k|4th7F2^*PXFGm?kwWNCI;@mWU+~XXGZ@2|1UrNp^uW;^n{7(g4|`P z$)IwMfuV(M`hp(yB&H{9(^-1ewLr8%uX-2LVfN{Jde!5&ez1!%L@+Qgl(0`%=~H*& z%HR+KcPUHQrx*08ml-i}ih)PY#5u*l-Iy&LV&ExSX=r;L#s^JZfNtX1!ZBT^HG6FhnI5WtL3zrypHmaLT3_K&y!zBjJk2AT%7`Pdx8%$ESo_>6Sx;WDjuIUdZs5`N# zaD)5=ktpv~7oJ`=QC)&5fqVLdiRw!A+mLJk#cUWPKEZVqvK%}{!7{;_RjFVG1G1X! zpj6|JDZT>~q%w?22gE~!8859By}a;T}Y1GzWx0q z_0^2LyOG59OkX}ly)pk%0j;p#-_MOkk$E6kkbsetBXgB;Cvqn0{cIx?Y%oAS4IxMJh4(u`n=XXXd5Y z6sIN@C1<1-DS&tirFoh8d3Fp83=V>jG*gtAl$n>ESX2PorG}(`Kg;w41En~o8o}*L zrmOcc)(Z%uI@2vPFD11oBe6Jxf#Cp>Zx6CCFn~nkjSBM1L05et$sGbUY7>hy4kL*j z0S%DlmxJdTjv|R4V_{(MFV6#Y2^o&EFhGvG2GtM8LGc6~Do56E0-T#cj>=0-P02|; ziDcL*76t}bKp=~s2AP$a9-5g~l9E`G$Z!Tp&si1*hI4SfFayJR6afZ?3)7uvse3am z5Scz4=JfTW$K#Tm$2ShLb_bMn`md#cXvgrHgR085l0HFff1| zfGl>IW%`BXia|_&M5jy4QFmji5u2VcM_r0(j@a~?IqGU$JH#M`@hP$CYv!n%XSnAx5@HOxpthIg^a+a;*`}YGr!EtCL_!Qaad&|cGCTw0zk-eyyQUbKni^U%+(2^B zO;DzT6xEC>^ZDxLOa+qD3+AhfF&&YZ-Z5WY2}G}f(ii5d%P}31*#2R@ zdK4p*hV*owh3ZjE6QrlFSg3Brdk4v$yVKt!V?FSYcwI5h)+RaN0|Nt0 z{Vho2Y`W@F^Vqx?c{Olx{|Q>~!1&)7AdN~G{}*Uz1hk|Gs{SuDVM8l=1;@0s%)C?v zh9B~3;8s9Ld1_*|LVjt9LVlV;5oq?6fk8lF`iG_FQf4{|YS4xVxS64ln_66)n4Zeu zp`ZqCDZtDuN=?o$OD(EY@N{8FP?+wp%v_48Mqzr)GIJ@p847CPRtQXOab|j6B6Ko! zi^B9N%goz&?;)j$`_t8zn{Q@1s5t%3a`Q<-4?u+ov{C;M)IC?4-mt>lis^{b^gS!g z>!e(j)xZm&ekiGd%3g-8Q1AXw+8(mf+=z)OL3Mk_YI8nDrh2vMGuD`UDb=e%RD$-K zgKn}x=7Yx1>eZ&RtTpfBf{8C+m@Z(VWHVi1ley^hw`x`-yetRg6qLn$ul2n5Q{)XsLml4xqtDP&X0A zU(EoSu!HeITYf<|LBja^pcZv#O@Fh&+)N23ejF|iG4})m1Gw?np*7uQqq!MVht~9( zjplYBde27lbwUa{YT%(@&?ah-#}ss?*K9KP^JCBj^@11}xVW4XOF^UhNtIR{x@zFn z1)w2m8C^ASyWt5^JU(S%V0gyD!0;S2h@-&3-~ctlL3g^uW^<$IpEj9GOi$WuZW8zs zRLnu6_$>wOVSY*rWCUyphZ`dULr!K=QDRZ0eqv5eezJaXQL=toZi!w|af9*nl%3{9 zQumA@rN<{@HSnUygT|0la>#i4hn?n1UM41xl3}&68hFqHCZCX4lAusrkds-W0In4k zG%|}pRdIp|Bto&67qiP;sUGA$P`H6GBP#=gBgkFg24YTPWqxT1vOE(j14CYZUVLgr zMq+7kNoH9pYEUqd64C- z)7f{MS2IMx2Gy_Z_x$2Fn8o2fS*%T5!dU^~D zJZ97H>^4tQaxzl`w_cOXAYsJ|s&Alqg^!hiA;5Hc!X9(K`sHS7;6;lEpz1D}L2~Ck zGc|B$CV_#00hbyUbBMiG3Lx_!ZqhJU1FygX*#}$3!_UgVAi&DNAjrzVpa25ZTsmAj z3JTQ5TdG9ed5~xc-={f#;Ubm`~eh zZpYO?Nn8F2+@3r3Rkp@v@qpaKK!PYmOBp{cf_FKIMS9o9G2ANIHFLr3Rko2FL4k zhdL$M=>iAMlO`*0vrH>ga+<#7pm`RPhRt+^L*_Xs+VGe%*w&!J>dN5R}Pt*3CY^3ftTB8*g_o5Vm@8w zu(_60ge{~wkY=j}PRCic5Kpq0Pfs{(Zlwg%H^){DJSTC;Rt-D`bjnr@ysnVNeEOcl z=1NRIY^OgsY;Go`Vy6Zk8v$1jpdPB-c8w$En^>7%I8VQG(p*ay6g{AX0>WaTl$=;p zoa&iZ0?x3Yij);G1t>n<_>_6HBC-|s zxml47134HT3X>PHS=%ymfz06J-}g_~87m64T|k&6*z7ArGIGdL!}@xaXiiXN~l6hUzTic>~b4pvqr z7G6j|u(0rgd_fs;a82 ztgOsR+^pPO^{kBCyu4spW=2M4P(<W@ZJYOjcHAZcR`~F@lo<<77h) z33mt+qz@F_+>prT;?iPdWM*MyWM<*!7G`B-WC2Ge$Qn?zaC0+rar3frbAe0*rE+HG z$rCul>a}&aIaxqTc{q7kS(#Y5Ko)@<$jl0jOm1+J1StVCm{~#I<^?$xtQ6z~Mn*( zEG(>?N}$*Tr5jdO7G`EfVj+{0)T~ug`1U!n+u#*SXh{uLE*&A%)$tE zI4F*}xm6gsxws%q5Xr*B!3~NuW*$&jLBfU62viI(b8~Tnk{cH*7Z*Dh7l;DI9mw0P z%si~%xaMVM204O}nR)U@PP6G7KZ}b_w&Ch_VPlaq;)iIEYUH@TR(xmlQ*LFtf@nVSVvMDcP@FI;b~&jwDE%#$6sE$W#WSwUKv znORwwS$TLExfuCaxfr<_Sy(tZxwyc71qVAb7b7nZ4=)cR3o|b$C|J0`If9vym6Zz= z^xWLsyu9E7iHWs!%t4`c!|1}PEH;ug@F zEXJd)$;`sd$->15D)K;%0xJY%M`low$His9!wt5CnR#*+j|@9VFEcaqQ zl!F3;}pz%pl)^B^W`aB_ks@FEbA#Hw!l?CZM{wxfwyWFfudCGBb0sf*i>S2H=1K*#XAP zljC`1C7`Ya*&)LM&SEUAp!_{~3a@HCDE)A=GJ^^jP>N>eX5j(XA)xdM(#XTZ!^p_R z#mvkNE^EL!k(m)xYJvO&Qo+p33WBVlstlA%xLF}#1$F_904ro<P9_~bo736mF;4?sm2 zGdHMA0676vV{vhTayKZovx2PTVdZA#1|cI>77=b^R&G`nZdMakPA(o!7FJL;;LDN$ zg%GGf0r`xDl@$~%OwcNZd2$KAA|vzUY5brd1J!S!ya94DD=21IL1hdVBP%Z}7q}4P z04GIOkR7192I3}Afe6Yate^m9Gb0xZ3n=!vWI%SwaC6ImA)_!i z$OE9FNrr_Rlqwh*nJ1qSka1>aW#(c8$+0rBGV}9r^6)Zq^Kx;qGBI+quz->bE2v@s zRr9Qn8V{5Sc$t}5mB7UnBM%?*WNkqQV^BI|?Np1fU9UWrA=Fc%jWBO@;_udS`Eoh_)K;k9F7XDnb`$hB~CfRG4R z%Z{0h-1Q8O6Lw6_6Ov|}Ik`(nwtlY&BZDI&_X4i#>^3i@GQP3C=9nsVRO}C9$pY4j z0}@{tKQneQ_AvG_PGFqGIEC>F^Et7ljO*CuGtTBX$gzO2sBj+RPsRqOL*g67|1q{n z9F(3T_LcEI(-rBPOp};yFl}aD&-{t`0@Hb>KGsi6Uzs|X*D`lA_A*XnT*I`2c>-(w z7pCt_UCe8kI~n^KCo`^KTE+aE@h0;$=H=qEm}fB0Wd6=LiFph2Wr+^)mCUP|&oWJ6 z-o(6>A#G-m<#4I?qUAI`i=3YME)hFPmJrBzq0;doXUEUDQ^e!XXdTUvl%xq zZ)aY@vW@F6^E;LoENv`vSQ=S+S-vvAW_iof!%{z!rGcf7r7#A`wVqDDl zkNG{zOO_UvewMH7?HoVY?=szDy3KTl=>^A2j%KD-rbebFrWU53%#WBKGaqHX#C(AH z2=f`{>&(}fPcUC(-p_oD`84x>i8iMH%r}^?GM{JO$9#zSB=ZC2hsMn8e#O$kGJ)lw_yO??%mH&oMko31(usE>sZdSTw&SEvV-L;%MF&NEE`#lvs`1@#&U?|Hp^O;(=3-+wy>OJ zxyrJc;mi;X2S&p$>WO-80vYT}q>n_%vtlwF;vR;#JWt+nGh50Y*WTs!NEo@C} z&1`cRw=w6gX8R&>lkEoEb+&74@7P|ky=8mD_MYuE+cowR?EM_e*q^f>V?WORg?%@B z2S*pja`qeSui0O)zhr;KzJYxO`)c;J>{q4kNv&aD&%Tm<75h5&U+mx6f3lxuKWo5# zlKm9>8TO;>OW8X)cCmkEKf>O}ah3fy`#1JG>^IqOvrple%<+`t3CAmr>zq3|-)uf2 zD#p&#d1&$-nO%%clOHO?GR~W9uNcI5VzP&v4r9yY{fecGntsAJdB0KuJ{CjZmbo2;O40IFv$hMvth^>A%2QSM@9Y?}OEEuC@R^p6dU;*;ytEf`NsKUdDE z$+&LvL-i!a6Vn~47(wD7*9-Y)CKwDp#jMJf4YmI>gQsp-;7ng#bi^%my9PS%NyA+wYP1K zHQLL}czm*+uLa}r$?3jjn@^efFfp#1tQC;SxPNn_=3Nacw%xv z@MOjllRw&kY*z?b$=EdcR7eryyveqqxr`?^uMXv6WZX4*Ti9*Jr<3a)k{Q=d{uXY= z_;j*vgq8G(wuS}$#`ON zXk-;*)8q@0nT+!$TSb9_qAN<1@zCUj&PI$UCO?mQ&iH)t`Djo;na6x&JTY0!&6DxO z!ZF+QFAvQ8S75?C~tWR#d(c^N?_N+>Xa zQ-XZGxYUz&kbamn1G02LeXHyqur#Y9N0tJI0#lI!vjU3(rvj_v4~8s(9h3j3Niy!3 z%+nCe_B_GdgdS*S;w@fB5~Xfj`a8e`Ms*%M0{=S~)!l*@Qxa{VN4#+{Q-Pf}q#G5NzJ z4JmLU10`q|P#FkL`3}%BkY}Pg=J$@_NtGM<>sv&(_;)MVdXe;D^p-mr8jc1JNj zoxE`wsM0vQOos8vO8#F<66XUTI#?7ZU z>M${$*!*L23M1pu$+24<8J|v`zZGQA?yaC|BL8$7J+xFsi*E}S5odmmUKgsU$ zV%jWp;4mw)<0de}+;t46yS|++VQO!ioO4Ew@xn|@xmO9Efx#~Ko0v5f<&bayYjY*)yTX)Npvk6qNGC43gO#ffOs5AM+Eo*q8 z%nT}&8F?8Ln8AfIGo(;5d!I)As2$4}>LT83n*G z!mYpzDwi2S${^KY z8qhjS16+ma2t1p-?tVO|3gdsEtO%}xc$l~qSQJ<^nOw}7EfiQBHL@I8iWFEJEwTjK zCI>$NrNyZa%o$H?KKtMR6XWj5eUJSZpH9B}7?d!-KmNgZV)KV5TbLMkAxmuLd-0ix z@%-eEe`Gexy^Oxn z3ts;$V9XMj)->7pyP^~<5jd`4MAS(;Kx!xFeYa)YKY7jfwY-qJiqY`_1E{V_`|+G< zPSa%npRzF97(u3$|CD7sF?s6GF0~cC2O1d6m~JpCFgr1tGo4{nV0OF#5jz25pJ2># z?CG2A`m2E-ZhZ%17Rbq0ekm$K#F!iuSi$KVi^Ii!D{4VhDKKL?98|ILFmfv}J3{@L z_*B!I-7N#Gu6B%F7B$-Ytv@4B+I?@=ulV#AL01peCRvn4SMm z6`MA2u7GLVyyf3SCdQ@H-542Fm7swj0SN;h1!l)Rec)gLHG(;^9FO!(?`33^WqdMy zH6x=D)02kj_Zb7zCQ97cwyhGoF}! zl!bQH*PVlZcB;9*2G zj}J_k?kmSw$hc$remO=-#vRl36dA)ApHDZGXVhbSGCe__$|k>rnY>kz@jc_x>AqTw zYK%{&pHX7Gqyo)b9gGSrpaP~wfd!ViDil~i9RtTBecQ9N8KoH+PfWk3!l=x6Vmgy5 z<95aq(+li492ieb-)P67$arG9tQw;+w2ipSk2fxJyruOH&27ngb!MAV zjp8S zb}^oqzCoXHHRFltF$Rp*j8C@DFkt+{2-7$ZMdLa`8WS0}o0&7NWnx@E{fQ-`Go-%b zf_jt9@xgXobH;5dk1$$k;Odybog!c+lvRVN0Ma|1KGB!4gz?05Hb2H=;wKJWZ(zvMWM*(;4B`cK zcNrDf94{Q2{yd1Wh3RM0_S|4bE9U8ogBW%3EByghn#asIY5Scp#*d&BdM<+TAya$X z^o@~>DvT$l^CmG`F`nNp7{zGE$asFbU=*X=^t@=sGcfjq6vkQGKgTdef%N*tG0HHW zn4TTSn80{q`k6RJH^xcR?}Ra)+x{?~Q5mFyIMZFHze;9ohgz|HLJBDSPfSNOojINH zE93d;6Z05Vx65TPaxgOPpRS$>b{JSpGK*0dWTS32<1CoEx7mywOpGU{f6HYw;)isH z7!)`h4=`j2Kunq*lgDTRQEkh3V*2?!xE<5wG8p5gdlWFPg4p9R-MWym1)@}SJIu15 zMR3cezs+X+y?sjwXrTh}HqI_%1dTm`M))v??M|T&+rdWoFb4xqqAQi&US7qR&B(ZK z`r~TG3dX(DV`>=V7!OR}UBl?axPSY<8b&ctw(M}wCMZ4|8KW3a zO!up2bY?s;ovVp4Wcssu#$}96)4|HYw!@VlpPr4b{2t@+=>^9*B(^WP!cok`czpW4 z(;O1p4X$%cV%;v^&8WrBczn9oBu00}S=Yf4k^^#(GA^6H})$8Ek(%m+?Qd)Q48^P=+qU8b(KEcV0I5Fv^VWe-<(ZGU{yU z1`n%%ntqH~jt{`R6`-LOftJ|~4Gaw2jypg+M@7dwJ<}@}GcIR5Ftp%Cdolxu+|xU~FMp(>s0n3PvZ!|rIJ7O=18SKHJemb6D(%)XHZd*&>r*1EZ~FOljNy#i zwyUoPm8>VGCvE`Or0p9RBNseF#X&XRx8F6(-S}NiVA)PNpOSpJIXk+2%MOny@}D2@x=74n;0EoLvjp` zGFeI>D_nUQLCtH3Chn<>jLg#?{E`4Ah&l%mYi34)6Vn;@^2toU?I0o!i+NpZ4g;p| z4b$VTIpi4sPp<<}C#KJ}<^VM}4q9_4KzrEWq{ERV@V#Mrpc5M?d)=|&&;TX(+3fO+ zC#J7E!z(`B#+HMF@x=7IO>An6C#L7va;UR{6U_9Be*~r2SW7_NlIc5aIf!q=7%`rh zzQ~?KxgKl|H+KvpW4!`{V*_KBz+&joE`wtaqyxn03aZi^A>APbM#mdWIgT7q=Ys~( zLA^&%M+u@%gJ}Yz0;40uQQ%>I?j%OWdXPd5rVfZ2ggw*$p5c`=LpD)?fuMOa*qAu$ znd+u5>|+-Za1_W=V00A7(qLdPV`5NXntnf-O`MTo`UVSDk$M);$QpwJvmy&Pu9a97 z*_a&^So9g$l-M0bauhin>lHa2859|r9GD%L927Vd7~Odp6xbCx!A)HS#wMMlSZ1ttY9P%0G>cm_&$N?eW%?h0Iv3?9--T#k%xybRn5T#o-43tf3x z>bVuzTzQ!k*c|J#6xl#S(~e9fS&mP@;i|~O1M0RhYA|ppaw#xsFt8}HfG7qUn~lY3e09qPe7@M!J3gx0p=-?Ei4Mmjttg} zEDFpZ9;k)I>d2S{azCpAi#so?0wX9+Ssb~%dD#>g6<8caaOu1YOpXFsN^F`; z4CYLr#)UwZ0-Ga87Mw2u;tPO!`XJLlS{bvHSRnR4Va!rs0Yw=ksJIkZKu+KSJAqpP zT>fx?oxuU>3^6Klaw{-_hTK#dK>k+X4SG?@Y@h)O?upyy_;GMCGJR{9zQUg) zS^L6=JA34vE?g8+;5B8Mz~uCStq#PiQIK+C43t)qu2qs!kaBA1T)bC)x&r@zL}jK^%sRJ=?W{Im(%Ie}ZFx!LfnKnvnri3-c?8 zfie=mqXsA=@jJem03MxTP~aDsKmA-NhpO6w^I(w;918rPUgi=G1%Ag1m%(BSKA0j#QBp@CE zjdz2v0)yj&g$EiK1h!2#i{gl4>TR1oDT+grapCkmQ5-VRaZ5)AMJ5FXS6*gERz)UI z>BcCqcKW9%4sXUa)9s=;Jb6GSIG&hwuz^9~&GgC99C~sKL4~X$6BBr1Ge?OP6elbi zOc@HS;41chG>59?>DdQC1DG2?Ma2fjEP+L!a8+dGVdMtYagI|Kff_GAKxPYU1Q`eF zI5H?O39OxN8^aL`a_XEI4gU~$~Q2pZnoyFEOXBZ-l5 z&GcPy9Py0%woAoxB!IZp2^?1#Ur!H6zV2p>)Gl!>y^PJpyLDnY$aBh z3db94psIS$KTyOSX`Q~2gGHpCRg?J!n-ZH7Qy?#c0;{7y7O2Q(1u1ou0ClL%nW4f0 zSqczg1r%WkkZ=P#ikJdOtb;vEmw~~GfkA;)fmM_F1)DjufC8&2(-SsDc2I}@0h=O+ z0&9Zf52h>yMu8Kc@CT(V(8#hT^9*K~gFtR(1u1fTz%1|_RN+f0usTlQ&jMAdpn+IT zX3$_5R7?O=@d+RtGl75lxl9fTrV0Gh1yeahEEaHsoCYy-0zZgtktJ}Z6VzJ*yHSx7 zUZ#F zDR4ppYy)o=s5%CP-3s0;1zxbI0-rha0$v5K0A5A~R>w08S)ghhqy$=+c_^@g$}$@T zR#;JHp}^{B0V>EqQ3mb;FmNldI_}^Hh1oPv>J~WG)zH8oaBx~fLnz27Xvl!oAjcp` z92|u^__G{QLI@h;AaM?O$br1QgWsHa0{?W4bPl(AP{1)eK43sZ0cs#BusSZ_&Js8Y z2};MNh9eASOcVGOSV3M~!>z#TbfBT3LBX793CR6xCP4~nZcy3)MWz|k29US~C`Lf$ zbb`mvKt_Z>!NJ1?9xZZ!Dp6zx z%PR@E@`6?+9N^7TVp0%L;1{?!4IJknM?;f!0~5k;J9r^OtO~4-8^BCsa4uK@W`mec z44{}~a!_Cfl~4kpx)$0X2S*qQ}u>_8Gb z!JDN73i}3xm;$S&Eb|X`bLIoQ5DyDLDqT?e0$Icja;`Yj0^aE>GdY|=PL;?~V1{Qd zkUIsk6a-KNIIJ`34gxB5$x|3ADl{NWs~LRfFjU8z{y=iF5}SI3ytD z2_i9q%y__N&U}EY9+WUNnC`HdG40_}UG<+aEDEiiH8-W_y;6iusTBgrNjhk z97BDk#BI(DvJG5Fb7X-62UN&%n={{FgND&cP#A$~Uq?nO28QWpvN<^F*+AyDzzRS| zjw~fcP@fG_Kx;7EWiw-F1SzREW9k5BOptr57#cug;NUT1`T+_#CM$+NVA@fl%!=VZ zgvn86&F~i#mJ_(M1Uex;1G!Iu)$s#YmcaAYhI;UNC2%qTjjznfL(#rvHl4= zCqDX<8%G=kS- zfr>0$h6((jl1i6hBDAq*#lWb*Q11w;40%|<<ooh*{{L$fy)t8!GJu%B+v?SnGzH4^eed>0`)AQZW9xz zQOy8O8juhNnM+l7fRZ&Rn>qgA%7VE?pslgNp@9KZ1~5Y78#JM7#Q^U4vVyccU^8O^ z=N)-7CUD+*1Zt~5@)oEKATS@2pIAXnJywuM1$sa!9lUygRg?Jv7pUR}RVX0SK5!{9 zDzFGl2Gt9oG6)hl;K*TjQfO1)SlglqDhwMKvlInE(a)6SsF0;7q`>O<;^3?WQjg^2 z2Yld)pVbjmvm&yxBS;)%PCZxxQ8$7mzy^Udzzq@sHP=N!tp`XmSOipVh$6}i5m0c8 zA|)VD9lL`GQh|WjH<-+sAMhy%IZ8mAJVKE9<$7iY1tCWcm>{Sg1=ZZ3k^HK?7|KJdjq!4iL>~&b)y~fmK1=jA;#sW;SD50iwmsn3nKB8ovubd~S2*89WN0 z5(N~1@TMlXC;&Gh!9If4UI#!Oo%#mQN)vDy=Lqi1LOQkr8$c--Qid`KtOaEZ^hy*` zk_r3`*n*nleX>F07e#Om46t8j3`4rHW67HH%c*0W#(x3L*vVF-2%2U43J zlqn##L9BuVoFg=s3$%d}hY}O0iH%aRdVtd;qGna#26dW2Wv44R53_=MXpEo^3#3tp zRLMiy914)}@#*JFI7I6~?L}}p1UUkd3K>C6NGb#keuLLMf)XLfNG5?5*wQ?>QH3jY zLQ?o1MB3efNV^gY;H2$%h6~if1SNcM9yr1^ed01kF@6ScZ3CL+0xvzAzMzytD(VD8 zEx2rB)nGaTGL0t(G>ZjtC8!1afFC+6!_Te2s=#js?)8Fd+6CN>u&Gx_K5Sq0h%ti^ zq^fQoo5XaTCye~CC4Wqg6BwsIlx31+?*=u+xmQfR%k-D=`1IS1OfD(=KoJWXoMHe) zq6QO(5>u8UE2uB)_@4pX$980J{Li4koUOzRE9OD*z?=nE2=X7OB@4>_S&B@cRhdkn zv04_#3yfKy`qYs@;PCV=CZfcHYk8c^FiIBozpKeGo2FN43*fy z0vhHANo<(Dj)h5*aq4sd9wtfQE!gEHShE}z1g1_GWMz^Pn>`gY+^4O;;&_84%kc!5 z_hRaHM^>gBM#kgQ*Re4@(FO+~s2Tw;ApOH+&U}N#5u3&vQ>X7`X9CSS|7K^B<(&vB z&jfl$gOL0noP-pFtET7jGySG{GW@`RNQM%EOiLM8Z{H`#WXdSK9h#g#3RpnRD}kNU z1EiQvi^9_(GbkO-0CfWd)=xK(W|DD(CqaZ1DDkZa83meTRAP2ycH?DIU{PSUVz|$Y zl&bDCXE}CE10~KK)24ffFdeahBtv#kj$zSdD70d@!Gxq9)U1Q3p8?VZUx;x4RPr33 z?jg$bL>*!RE64=g)~%Q}eXcB%D$|dt)2qao40tDlqX1G6j7C920|RJ4hXu4%ie6E` zJ_Q^Fz1x4wGU+oiotQRVN1kaZWd$PES^5ng9`hJ^j846F)@!3`FP`gl9YbiyBiuMCkSOd=0Rw zdJU$NP$2;k8A=5r@Lq|bqTBmrDjk~2i`;`uy*=AEv9LVJGPf zTS36Fp*~B2+404+=@Sf@MC^W`$vS`}JEnui)DT({K!P(+1r?YbS4^MI=*e`D@zC@o zMoc>(Gc}<8Ad3bQiy|mvIeuWy64*1n#F%NB9IXbicBptrZ@C3X-dFn2L&CW^R^`lf{r_; zPe0hhq{p;l%Jh#tOy-Oyrfc>xnShpC&0-Q~nlfX1)hwn+#_bpSnAR~e&2F0BFo6lQ zgl^$nCeRe$vs!Ega2V8+0pAn5pqA6-D6xaq z1qo^}c_^?ueqaC(HcV%n&Lj&89EIsj(u^mj+e~L7enA&}QM$%VCM$B|On(*=XthEj zD9)~cnqz@1hvMQwW3Stdc51C4YDY1BhhXk-a2 z0L{LFDq;wRsDX^@Fgw0r0-3Xb8MJytgNZ?j5!91pc5Gk<%{+j%V}ThOOyDJJ5OJO? z@JcHMW(8(VrX|cuEauD)n7};d4b0}u6PQ8Uz0K>HT0jgY@X$T8Bg8cg%vl1I%$`55Sg#7Vv@n_W(3>0t*gg_d=Y@3~JDT4WTGX*vy%IG2(;`&9NWA_JCsg z>P%1)W))ZsakB=~7bZwr`oN^b=*aEP%Q9W=GLv*Yt2y%qCLV6ka%f1pS;GttP4F}% zYH|P#Mu4IUv?h?noQZ>n6Qm0?O~>qrO&26|k#(_}GjS*|I5C6vG=T@VnCmr|o`44x zAfgHkjyzcktmaJMwPCQNjKlB;ObWORXXOT^mmf@u?2sWSn5_^E?4Xnawuz}8v>X#O zRR(sH0)r#SF`xkiW(}ql%mlTg>t-=y;s7-=863GlBPAf`Ida2nb36r#6Oa~0ZUq+5 zvKL0C>AY8%qBqO7EsKC@(+_cFKGEFNSPypzn#0JtP$ax|F! zUyVi9%)y*lK>=hFlZiQ#2xv6hj0v<-qdtp|iG!Vu8=B-`u?t!|s=;J2J?B5O>hwx= z7HKgXkWV1xB*Yl7gBF>C(vJlwI$*gSoDjig!F&lak`c6A88(Lj${S3MQhdxq6T15HqcUKCdU?-s0LV+9W3hW_=gE<1b8K!5(ik=@e528JpQl52@!n* z69td{D{+BEA+F~(XL`akeY+Nmn*ftJGXp4A7cfII?Dl}GOs7D@mvN0es!UUxwzoF& zOlD%)$IQe&{U9Tw*mU(XfQE2Du7ncGdb#HIWlD_u_!P)GQk$% zftJdFGB2Z}coukl5hyw(KvAf~s=(+d4_BwasL#M)&8P#)Fq#bf=FAe)AFN=Ks0U9| zfeH!u*#ryw16;ylnYSy^y$19e>%K=YphxD*DRji|t+$;6__38`H`yIi1&nL&ZmoQZ|okx>z} z?L-0WG$sy514!IVzkHLapJ_$o_LN&p9E>1F-fgC@pj})k_m~VBUr(QQj|sFc^!Ys| z(7I5u`%Iv9p>g+_Odz8T;Hio^Y@oI3oUnDFtL`&_wxyiA&s4?K);itm0h2w`l!Mc| zA23;Qc7P@o6j&W+Oh5O4Nu6oVtm)q$fcrtF51CX{;aw;2KLe)Ev-y zpdHhv*F9u10`;IaJp}9g@DSY1P zeUHE$NHl3l9&oh;%Ac%`GpFZ2W>RPRGHd#b$4miYOTkk!Y)lRc5}>k3Qb7Wg_on}Q z%w)=VV!Fu_CeXf`*e76PCp`fN&%r0);Ng7A1lkc}^OR{4(~B9?FFb{NoW*g*bm3=A zDoiV8Pq%!=WF-f-9yIF00dDKDLL-gEaSsz{Y4*ftOd@%6y2pe5u--!f?0%|f$|NoXrp7F$V`FBk2jBBR<)n=EN zUjL5C3*^Yt@0cz!GPSo(pZ9?YwDao42e4^!A3>&Vcm2qu!Nj<8d){ZJbkN3vYhS>! zJYSjAAVCLe&oDc7uz>?lprduV`&Xt2#uL*Qd}Rs%%}IUw%A^nLnlU>r;GFuACx-Fl zbj4yONyg*T?HBTdO@B}$YYbU@ugC-{oI#7^Pfce%C8IZ;sf4MMaou!*dZvWwZ%UXZ zGOcTzo~XjReENouV!lvL{PgqRWZL1J`ESHLrn6Kq`N2ivK8blu|6Rf40~PrKrI%0V zp3a9b1+4K-HIhcK$mJR&k=jK(UenLiGWoz9W#7!?HT`fMOyCDhJZ=fkWEeZP5#b5@ zW~OOSai(p|(;H0{#ioB?X0Bu0I6a?*c`AgG+%Ct;?99e^V!DnHb1>tH=?y~6OSVVx zFkfVai*0WZVt&ZTxN&-H3$xVr8WHC6FwXQE5#~wTe~2;nFfnf29^1m~%DDZM6!R&l zeDih*S!N|B#*NeC!daxZhsiS+!#LB!)5W9mh%W=ot?Ky_bhKxiio_^Sf`8wmq z>9dWQH-R?PnlMX((zOZmI>xQj#Z8&Jp+zQ>185%?g93*F8+2pa^j)UR^^7OB+j}ry z=U_V5I9(!;*_7#A<97c*<`pb3>vu3i+`5KYfyMC+#QiHk>=n#lx5|bwKWE(j-CWs*4LfJE!5nylS%C>;-5F5B3u@m95c>q! zfz$8BFdrpW?a5f?KTH=Jw;zvVt^~!OVL7G5 zI$oFqA2;8A@GFlm#z)iVFJaPVJTd*_4W80z$9N7ht!$ir_!!S)#^ckMALscC;x0SEbA)Mc=+hp=)M$mxqX$bGG6syE^?JbOw&~*pg{frEt@gxOCT?Pe5 zCO6*cGXk09nf|v-pMQ-ToqI>cEO4vORDr=!5;X9@0BU>+W+|{iTBN*L3e1pZC~KAiJ4B4p zih&W_8fBU;xQt18`tnswVvGm2KVHd{#3;1`R7^rvmxFrT3ZN~RAXn^|H$8qe(>}&u z)8*DM88E(??!Sh~nsLYU?lnw7j0>mVTf?L*u?^H1k%BaGIYG@T4$y{JffLgu*D^`# zK{B=@g93ZDA}eTOlL@p{GQsgV$VNwPP?wD%%W=y50}Tw0TjozsTFX>izZGPn5*N6` z2~zEWr1}J0^%0OB*etXHqa)Z4Q1dt(83eXKOyOk#wZ4%Z1`-E}F=;T_C~<&X%%s6& zp}+xZ3xedPhpc0gsYf{QJwuk`6_90)Pe3HxN+wWHrI;~ccis{-wOqIqqWXi$@dE>> z1f2eU9TOYNSw2R#>58(9!qa)yGih*u_KYd83cQ?dvz}?T3^-^(?GhHp37|s~K(dff z5O_2F^LnOPj3=h|ZD1;7JU(qBlXN{u&5pST8$ikM21AxW$BYKhig(CXwh4?%%-};h zRm_+`2jVQ72j0U5IuK_9WK|64@J`1QU=pOe7u1vn^_M|9!TaCAYgeW)nlnvd1g$nO zW10Y}bbo+#Okm6sbDRva+)-7a31l%yYXvVm_jL1(OreawruS}SGGu%+eg8%#H}JMQ z(8fT9EPJYGOzyvN)(PtPzz>&EOlG~BH@V&Jnuh+(TZU{BRti!IL>Fp zo&;GygHjWaRf1v}o0q^lzo&253Z8ocIZz**d_et_6AW1b;6Ma%7BGTRUqb@}cLy^g zD|lDFBX}5Q`m6Jd(z+~=wdA1ib@Tyk&|qTVV*y=Z10Eh=$$~VLSsVjEE3c;i3zLw9 z9w5Nvpa9xt4jR}8uS;WbOaK*Xpha4c0Tob=WOM|VbfD34P%6!Vs$hZ-A3_uvfW)DS zKn8+$VS-k2!g~H-%MLJrmDNM71A9V&$r0VKD-dN+RWcww=#F}TqC^8t2_&V0w&sIY z+bc0CFuQ}+88SJ5kNnV>p6MXM&+~!-vHotmi7!(>v&ef;x&^O|Ww2sU04+=tcsBid z0Mmi#yg^J{f-gbiTS#YC9G{-QkujQiL(9SGXE!pMPM3*heSS%9p|^s*o( zFQx-6)Bo+@F`51?h)IQMUEA~puSGqkrvx)eO?QiC6P;cc%*4h260~T6TMvAkgTVjB z>HL3qrKZ>KXJUmNOu>I1eCkO2c}5+^=IK4>88snin1IKo860^)L%Gx6N{C2^F)?r> zPaoX?C1f+E>F@V5Ny_msI89l4`u?=}tqtYeJPb}p_W#(}{^R4hbnahFjI7fSh>3_# zH`U@b1RbZ6p#?flWqOAe_&k+kTD+h+#vfX|ii{_wOKJ1UF`k%ism&_~?bm@up+RS< zFbK4RI_oe9{F7b#@FK}gJ)duY(Vg{uX@E9DE0wZW^KQpAwz~aaV z8j)fE73B;{jMEj^CB>)PUYC=Mg?8J)CmC=kFhMK>DPsX0_{XRK+9fRmk5o`G%;3lh zuJIujFo9;&c(OqKaL|kuX!J|~mbK1LU%!Jj4F(EKpfhkl%@FXAm;fksL&ucC5}^HC zpr!zP6)<=xRRVmV17slW00U^a5#&Nfm4p5wdViGh<30c=VW75ebY~H+}!@(?a zlsFw3JV5*I9A|=rJsp`#K+9m6927V~+qV?KOPDzoSfN7{jNG6RWhT%`Lk!?q90fM; zHYx>1cW}y5U^i!$fJ|e6CL35llMPG?9H237a3TjC*TLY(k!8lD0vcL1V^RPgwxhrV zIzp)#l=7zkJHjYY&nj>p62zw=6$ID^;Np|Xktauq*|8)`iN%p8540(V)sejrbgqfx z6$XD^Q1g>jfl-kKG&aWo+II^Y3THHD0`>J69q%w?DYAgpc>n+ZpSe(x-H}0&l^MLx z9#j{UfYPM`i(^JTlo11^1E91El->bTum-|l&4L0&Rs|N&8KjCV3ha&*SxW4ngIHJ` zm(*t|f}4oowgQ_Y52!Q4;>eMu$O5ySH4Chl2jo6>UXcGldcnJ;rYGzX7p-RjHC0&^ zU}vy^j&uQS2LY7;(5PUAL=lFuE44U+la^jQk$g&n$A;TbmReT zVqgMSM*P!1`f!MH^|P=rf%`fyJIT0>`OLxt(`EPYNKa2X#i$LwSwMXH(o>9}CD3=J zSjDIRIt8w+=8KBRgU?y27lShTPJ<6_+;o~TknzNHmNQ@~>A(iHj$V?ZE{7>X~~d-8LQ4QR>(Gks&54bMP|_1 z_258OV1y09Gfa292zFxqMX(JEFER$g!V@%ss|YF-OQ2i8rgPtA+{V~4{m@;;8H~rL zN8e+7&)72E`#$4D#@*BJ-e+7r{o6k#SxBRoN#Nyl>HkdM7*9+UVz!5iO^syk0gW5~ zWKx)F!VFjY1|e<>QOhXsX8L>+4wdQtjLaFbkj65oKGk3nfz)a&8cYJ9{SX2trt|$` zlA7-D6J|A|z)RA!zGH;B1f-RNnb{2D29O^DnV9t$mrQS9Vg{}5n#;s239Z~g%k?3d zg9Y4RKfuf^G5s+U0h4AEYm!+Dld{EG&;cBv;*Hr+z>G;of!T2{L_|UXEFz-7?6?*p z0-BB$G-CptzdL8q^ocD@VvKFuSF|uiGc&DPJe{?JDNJP5Vo>d)Bybfp(FqxJUOqj) zgGoi?1H_CB(B^wHrWDY6ibdO(cQ83HN}mB~G6SD+3@VZ!$J~J`M1cj{nYx(Nn5K73 zWL6Q~3R=6Pz^KX0Q3E0w!gv`3woX4dk=ciF#dN+&%t}l*mQOdD#H@i>bjJ=Gq4!Z> zcf7Dp0+@#*?gnL%frc}->ZVq7_W{X*u_ddMn0M$pY2jG$F| zAC^E@>4C~NkiZXw0A!V3!&0~k$SS=KgaBlf-UNgIWR>0wkN{|$gB^5YDq@u$yTbI& zY0Sc~ReI2n_&6Qi_G^qWjQhkX)+vwi9r1@{oZ0`S;8)#UN?i8gYm@l z*-MyZf}X$<8arsHHb#Nnv1b{0*gHaj9n^F?1+v4@9(2qLLzciQP^(!1YF$GE=%^Y7 z1@vTtEwGqS0*eWJYz#w|z-p*@Z(zrTusdQp=naa4)_{19b|g6HKm)_{OADAaph+2; z^wjGaQQQP-0zo3s3ONEn^UMsI3|~ODB1hmKga9N0Tb84x!5)MFBm$=(1VCv}O_N~` zLc{>Pm~;t3z#_|$L7!pG^63V%nWg36Q=#mRR-obslt01I1X|+RHa&ATvkt2F^!dQ) z5_GiS1W<2qx0>c3Q17Q3v|@$|LM;UFoV{ra34f+ zm(^=#=jm++nfW+(fNFJ6mvwr>9%d6x@Bs_pmgcR4%%Ib{{SPrmF@hbUI{o}1W*MkE zK?`jhS+XDp@BW+q{}8h|`wvK{O}9PF9Kbk#df#DYeZhaA78}GZ%o6QpL6tLjXrI9m zH2eh~r&3@R0G(StUEu(m7-ZxOBFv)8AR_Q@`jz9%1~5~$bDv=LV$=pHXW#~n+3SFo zT7s`4(g3wnf103#$f` z0<`P$_B3-k`wXZP4!&WQpWc6qS&t3m27&q0*PUTjQHMknXbCN7gw6yUAW(N0WI@gj zRA3f(IsNAuW2aA%RnYvz@sdnTXG!>LCdee?gJ&=gtN?`vk0f3WmaN5F@4ur zW&^kjKAvUXt_-)33G7t?@JWK8<|U|KsQ~i&|LLdCG23fEQUPcjM}Y<6Ebz!HxPu11 zFa*{?Gdj;~iIzRu&NDkOuG@b6JhL^U2sD&I-6W^t^y(V3 zAJe9`>4EQ<#i#4uW|p5`a2?#%t-Q_*UchskS!DXN>&ya-C#HYD&aB4xf4bZaW(7o& z0p}QSlKD41=mxVTH`IyX;;sBDvoGWR=}&GjTSAjQIHZ|%8FU2xP1n20tOP5+B(elv zPLICHJcseb^dC2wRYCUL0vCA}x0sDl3{5=4?9PRhXpY}vHfG#3-R~{46l_%8{yMYa zbf4Q`kA&W41}%?Ta2wnkJ9-=Jhc~yGB^m!sXS>5}$9Q78>m8(^t-k{f+N*b%RT=+H z|9yuUG#hSwm-#9iBwtSdu#!=P@x*lHdq}|;bB{TQasTx7_h6c|rvJak%nQ09;6Ae) ztQ?1BBW4XI7EtVf6BuZ80(53|+e-DYKjqL=3bp8gwuTBk0()-A|c|8MjW?f5t4%_RthFKh<)03Yw zdrCqwG8=d(7_>K>(Ggbl9DNS1dc-R`sfSo~8A=2olHen6Salf+ zK|8}8nIU7&9~fZe9joI7@RV!q3uax$h0|BR0FTa`c)_d!OD?jI1P3{=A_U|~29PHM zAby;#_>x%?x(6JbtDu=5qy$rO;!AL5s(#6A$PSH_=~l0q1I_P%q6oC`0et%yXt3Z4 zLgWAgXjLUh@C-tbL6hOgis{y`m?arEO~3P+c@i{Ppw-&HUol%y(W=e(t&*HR`wg=^ zJaHX-gVr>Xd&{iPxC@qXGT$=mG5(uA<1IMj?0(A}%XnhC+^3ssmM6{gE>V=7=;-ZZ^`8&en4gvHaPw=)HU=z{G`*^JAl-`UQjE(RT! z`T$zO$!Ny(21LJDv|VxslK}H{&QHuQr|Z?TaWSpxn*Qz+v$6J#1E2veZpX)9njJhT z;P?j2`2!|FLOfZHEeD||@TYucw&A}3mf}!ga%9PJ+;Cv}`p?YL0zdYHi~_0W$Z|Yz z;K201_jsfP7J!xVgV%^VZa8pYx}h(R}~+7{|6QVS-_L! zIN<=)Zt&^uU7~7}M{KA~UbfsxKVyzbU0nn(E0C*ENWHH%vwx7(PD-?`>GCMJz zm|pgi*%(%0gAeGx-bC~P{nwko2lT_VJ6=#wgbZqOqs)^2SP9u=_XE1gZr%jE0mMEre`=^_7uz*JSqBvM&re|DXa#R8j$2c+wECa3C zPz0Z52fC3JG$#tGj9CPhO+S5wsZbWOJeq+UX&_sHfqMrF6JtF~-Spf?;!@K?zcD!p z%$Rntfx!{FKA%Hi;q>L-n6#L#HBG<#jY-W3Y?~RA0c7EziUO142T)XjMm)e%Ne@9y zQbk5kVaNp9GzV(5flUO@G&ynzEShfpok@vt&GfkMOfmv*rlMKa^_|HYWZCiWObL8o zS%gN@A52R1kfV|rK{Kw9wKSl$UyR(#nHX7M`xg%|W-Bp6j~#}TG7_MZhb6L%fE1`~kVPylMef@UKGPIQ7!0%d?q0y2ZUCLnP~ zmLdx!M#nP@uqh#C1qL&w0?^6%pp1wl4pJ=u4=QHI1B}z3qMLGC}Gpe=`{}-rT0MK?70i?ZE1)x?wlO|IMVsF(S@TwKi)Gx}mBT%CNyvPhP z$q3$E1vU|Mg%z^`6KKP`1``AF{wkpY#0Dz^Q1z?CGTl~_#gLI@dcG!$R6P@@vIbu~ zfxJNq)La7Xw*xOA0HtTh(gIK~6f_O5$y@>2A7ud93I-NMaVK~(8+r5s6c1pBLpG)% zJYUa5g73kb(?G5PuLmN=_n4knU;=fgU<*VPru%5JC_%zPt{#W8!NCS93K>8H9viw5KNU4NKanHZmMKk$!v4I|Tn)l>6W zWEdY#7tm(WU^>@2bt0$I^cZax3y+JC0t$4y`VnT(kpm1M<^g5}cF>pzDD{KyU>5)t zT#O2A`ivq<>}s* z#>>;+>#$fbUf!;u%aY0n+BMX#$6_Ph0Ww^H4O9w&wn43eO+>IcuAcr(k42y9&g$vn z`YfP%-cWrO1r_+4VmQyB~{MlkQHjIkkw?<*O-87 zWvI@#CM+h5kEbh{vKTS$n;vS)Qo*=y`Z-gU490!a&COVv8Lw>LZN_2&S_b~bf@MC_ zfhE(YTCxg~&e><>5GImZ6 zb!3SN?FJdwRuF)m?I-{`PLWaIHKG;5df_PW)#>mJ;I4)9^;zn-jK-+SRomuo5 zPfSmCW^s{1-p&M?m{t@}04>Y_?Pxma%o4i+}{o zm;w}79NVYIxUi@)tywd@*@eX$HeH&czyeD`F(BsZ>CaqP^gt;{%oUvULR?uuYthg^@PnY*#$znV*y~~3on!6M1brxQ39-iqN z-B~23uk~QD2!;eG3ojRDc(S!iaI%0dB>@HJGf$Rc#x>KUyjb*6wu7-lF4kcO1>OQLaNvFRf(IT8w}LRJ1`$yZ zMr3?;(0x8O3ha*U)2+Q(R6v23=*{9K1xt_6(ub#1vt)8 z!UnJ7JHTbmTt5L+?StfgzhD-I6jcSqx zlLy!eP}d*DZe%N592p!hfE?ziB5)F94a_o-;b3b(41_HfS&m=8%4G%W*MQVR+9Vd{ z%saS1H37(M0Z4hr?8u+RC&0*r0vJILZG;XzaMbH2`=>9VlF=!VCECxDB*YO7ns9~qT30F>6!0DFAQM5yJA<+ZhzGre zSb+&7cz_+;9cA7D8hikag@bJaMH+iny})*8nx6yCRSk@wpaA76&`y5GC2&EA)nLIj za6#~HdibvS2GIToXnI(~3_6?|tb7TAIS0;kVlZc#!mPjq$^X|tH7IEE2NIFsz`O%a z5h$_CF zsEcxd5p=4$5-4IoPDDziAQ@0M8=5vjp(g@95SYmkBn7&O4J%s*JnnHxa19^uLYRbC9>_y(QH3u=r)c~`igJ$i7A-{Hzq04?l< zMBWRoECmj@V?S_ZDR9DhKe)0KxZu17?kojv7_T0*y#rK5fRj3-Iq0qta7Z_Bm@_{B zc?oo?HKhH+3`#r9@Dd5!`-1uq6b*N{vXoe0T^4XaN@OX42Gp)_Wht@46BI~?Ko&TJ z&v0ecD{-R8a6rQG2v?R8H(UY~b{ttspsP7waAhg+!W<7RJ(Tz$$xDeJMM45}DGU?n z`UNFH6bXeaB_U7;i#tn6*cB!NItc-k(m;^_3JXX|Q{aXK920{ACnR{87!=syQ3ARw z5p-JA^wKyEg?eEHA-HMGW=yb9ZQwwJDkz#ULKR%@J^+t8gHIm;B}pDc4g|>vfR3_Y z0u>bSKmiFu19%NHNOe7|$YPoT?z_MWIf!e)DHT$>!AFH4DmXx9!>+jj$9)30iedr< zFR1+D$`a^BZQX#XoF6QptDhV}-UVZ8CuSwi*n3xy%@jf^tzk zlP<#^E-Qv3AP%z`(*e*93MP;PK^qVlvjmoaJi*HZsUJYe5NskSaY0V<0Urkj3IL`* zETDmd1`Y)l$mw6;h7~A2L2ea*+$;krf~OpRF#r@=kXSWiIsqz2CV=ZRP-$`<)I^80 z&RRGi4P+(_kfWFpJp(2UrYX#d%%FCX2Gay)&}lmwOf#4Tj)5Ce%%D^OI-CO9U&$ zWY~ca0Y$kc!vTbV8F+2rF_-|8qaFSjw=-iREyn9HqMWWV&QK59^a+a+P-l)wgXst( zJOLd5g*-GtKxOx^!)14XMwMW);QL{*6-gSPk`I!4K#|Oqh1@`&ZlcQ}QV%IK-++$N zQD78k0ky?J$z=x@cuy#kF2fTpP@@_&^9d=pRA8-X6;LS+sn_i&jrfyz8k%5>BPE8@y>)Xj2S48J~#NrA0psV@7y)sZJ?SY08sA~+$IjrCtY*;`e7R-(;ZoG_++=`5#@g63}23GLq z5>Scj2x`v3s#eDi)~tGPy8=`fD1e$4u+}}uN(o5Q0wkxArG(T5Vga`oK_wAL&H&WD zK-Q-LXMsUtNQK#c@&kqIg+VNEYCZjfm|SQJIUjn^#4jy<3X z^#LM|9c9dzzJN|8`_GdFy13c#15cJBsLj;Couw!SO3tiVisIlhxgK=lq@pmW5yX+@ zc!VKKQ352-1s0YBT_DVwr6>ilNRh>nQIQjL$B+W28Pf+A&=M^MP__b9CM=FDkltYm zq-IG_U~+_B!ny>M+?YUn4%3yCdfa_(D z=fO1v$Yt!{Ryjx$q~2Cyhcz@oVGC-jg1cSNaibPc#RMHU0##m)NR=AcwE8TFn{d=* z_=`0(=Rqnm+$D_$Qws;IB5U9PC0q@r`VJ0AO~wShJ`r?^5~6Sd`6GzQdzBGd?=nFemyTaR$QzZ+r&=xTD%h!QxVAc;Hf;F_L&n@vgxQqF)%Hc0gB;F{jp%Pv_Dxh;qpQo?|T z??8EgF-rivQV5j8AUZ*;9b6!{J2EPAJF+SYf(A_?r5rm*@&K2>GSK!cM<&pnW}pb$ z!KK9N#2l!^3u+c?FrDC16apzc!lft(q7QH>ax2t>TTu#}SX^$)214s}2W2TT>nC7{+Ls7PW};0B%l2Py!e2L!Kx?+q8G3#%7f??tcnUCdIPJXBFGGV#x-2lj2l4a zF@tTX-^8WB1sPs|^at5N!?{Y#3T$9$aF0rpc>yD++vdcms07MD3am~{LA(qK(u%AK zGK$g)vWhYaa*DDF@``c_3X1Xyii!%L#kr7_E$;XMmh7CE6qOVd6_r85(#qz{KR~Xi zS1@P(0Ak3SGrs`Qa*#m=1zB_E8z8<6_{vfy1!;3;P*ngrvJ+fODuLQ%3ZP016t8eQ z6nH>q-!SPiY~liSa(F;NxPc3Fu{Z}P9Cm;Yrr`kXAqNkCfKE{40FD1aLIdPoJ~M{j zJPJ$-{ALW_L9~Dw!)H*Pc>p{G0?F_q3Zeq5K$%^MnHRK)mI=K44xDS5z{~HD`YoW@ zBSjX_@ibXVoQ|^YybL@XpfiMB!P7GJh~5Sd7dN=y0Nv@Vzy!*ZV85~>w+I{;fL6AE zPq6`|)<2*s({TxCSQ&nv2fG5dz-mxK4z!;fbV?~BsLXTx1HKIwl!q8VdFTgdk6AsU zj&W>Z2OWkR0v^8n6QQ zvK^6%5m2iQHs1g%tQcK+>%l7@&=)MioAKb*BXTny+*JqJ47y+nG*<+60VBi(pauoF zrUDfx&}I_YE=VU1Y!yl;j)@yG55Nxh=njxap}8eb-@*tQ@BlS9K>6mt^xnO! z64T%MvT!j?+&}%NFUxl)h@lo)j&r~(?Dzy8f^r1Ja9&VTVgnIU33+%R1`h(%}myFeB#VNkjNsYjEQntmjRMTn7o`uji@ zF-G?3?}AvQn6@xZfBKkFm5Wo6f!RTULEvfQbkMD7`W&EXSx(gZLAe#c#T#gdg|!6U zJK1|8) zES5ILjoahGS)xFP$mPYecx+eAV|flbUJk^W9$LVn;CU2mhBVBK!(gryjC&Bwl>~DI zPJuZR5Y9<3M;y#iU>3O7IDKCMOF6{u=;gVwET9u1^Ws^wL3ZyeWyz>N0M;P{({UHf z6@+mwfw=-O?hP;(baoqP#!=ujn9B#2b!1Rr7B~YI;Drc)JP#4zfe0|cRd7QDm=&1o zp?bI=A}nwvoL~V3W`WyaGdaLquqD^P0^o(?jE*2nAOfIsyg`>cC@>401*-tB(1xgh z2!J=CFgk*q0TE#4R^S3HKw}2$*{)a4au*g2+YM4#KEpWECsebjY@d+MQieUoZ-MQD z$M^|yV*D7`40wzm0dwIoehADZBF67i8snG2Ho;^3I+#n}7{3Fy6Dh{8fCZ3Z93p@e znz@RZ z7+dNYrzdY@mSfyJecm=^BgW0sFK%Pr%lK`2|8`~{#^c)$Y+|0xs5b*{izCQd4W+k#oLOLc!D?pN>C3h-YcW2WesK%)XQ4-+{m-CA0JGx_P_ZoV zX!^CS%*l+8rdw@ePR3(*I^*^Y4J>Z`(?i}f&u5x)aQfHx%*G&E>jSfjNCU`1fybaO zGz0iN6~_+;rzd@2PG#zBntt*Fb28(J>AD}8?LcQf=YC|?W9n#|KKCQDHjK{+S;ofX zs4)H97FN)qqlq7QMaBPt;(;4vTPS77NCO(>HLi^f0|^oo>g; z@``ccc1QLle!Fy3M{$|3qgXQ{X2}_pamc-po4)F6j;Dll_`KOV*np=$D_aky2OJ+ zfyJ>^$eJ-ifdw?&0=iYR9(4Sa0<*wEP+&pq2OUqR!L)!;i50TRg$2CKP$mna$x#MW zql3~O_{hR7jOL(m3^02QqdDmKLs0OpU{qo=W2#U952-C-RAM({Dghm@W5!efN{3)0 zLF$&&gN`|bwA?`JW)F0MTJ0>L_1<9H89|CFK!+e{FqJ5RE?0Ea05wJwSR7lxO$)d~ zYRs86K(l`xjG!CYK?jq;OqR$}0v%q&0b1e!9a;l>AJj+XoUYEzA~>DfM4EHDBR7j! z04O39xRyKe6*{tk7Lss+R-1y)zhrS-1GW*=0fKZMpy_P~mh=WnvY^;wo}MVdBEq3z z&cp$_e0_SY1dG0d0W<_bbIvT-{R3J@3>pXr`3W5SkftFUC^$-{zms55^42hC0yWn- z%$Xz<7(ln|usFgE2JIgLr34uT253qEsdWS&k_IZI>arkbTroK^WtlOtOc&&55uUzT zlEr~>-u5q&ERrmYPq*{Qu_S@cBPx_<5$A*CB_;=GZki^~V#6HH$HV zX~FU7CbJpcrW?qx+AuYMw*|^icc>O%**;N*^)#c{tHYpyd~MLhHjG)07fyh9drodI zl4G6B!gyjkn=&g0D2ef_u!2?s>!`3wL6!i6Jk19x#rYNZpl41_k5gflfbA0G03|n2 zyPgStxFx7q5dmotRS*G%%=QH;tSn4ShYn9)rpCIIam#ccbyf++tdd%(`Wq0nW4eI`t25)y=>mGJE{waT@6=#*Vcb3ap9ZUo@*ddIYDUK^j9HF*5nL_> z@G;E-bEh-vv&t|YpDw4*x<~`&V@AgrM?k)P0U}}J8IBW}99bX}xzi2mSdc?a!up93?(%&Qm+yzT`~bw|2O%y$1abLch|7;aTz(Yd z@?!|6f?R$a!G*be4%Jz{U@O2ff>^ZMg>;T$vSfw6<8hj90kvd z%mA@xFlITegtYlOyBsE`32*N?I(;`SHa9sBhHNJyUbWC82h&yo3jQpPQSK= z6?EGKs4XD@DYrmn3vydxF5C11Wj^ug`~s{-Ovg`8m#<+{pPnVan!)xC)Z~97 zGX0GJD-Y8#sH~zOYdq7BBh#A%S<{(*9sz05m@X{D8V)&$6f~iPIEb`q`o$g|k?E6! zSbK%8gNF5yP9lBKHC<4cRb;yGPF7317I2Q>cI*e!ps5{}EXOHe&Jr*Q8t&!Da$EuC z>;RJ>RXkaa2TmNAKG8x%V){E9)-8-DrWe?8I53`=zR`|Dk@3WISvByfY=LTwsvyA` zOrVn^^6fc{U>ocVk1PD1t|Y>m#k}U&f$5H7e6rKmh_JRZuA6Qm%KAm@z;RIG)pmRX zqG6{(ew%(!g;#QVxEO0JG=4vs9x4PgC`rVA8` zNlj01WVL4O-#*8Y^(GVJgzaT6tlZ2@eNEe&-C5T&GA(P`ZsN(R!#Lekob?9diRpY2 zth!QvK>E#?KqoJPE}k)C(okRmU6j7&*z`~dR_*C~C0Q-FZoL3GR@rgJ&*}dqSwZJe zlt{6Hw@^s2x-g!Yepd>dAOxgYV;N6O&yxnrO_GMmNlbq)%_?O9E&Es$LDxOAgU_S` zouaS6=-BZSlt{t*9vQgb$}+Rov(~Z0Hp6Y0Ug*WTak_#x>pn)_>G!=^j-=FJ>R^IY0GyyRyC;Ae zEFz$0f+Cj!r-Gn4(-c;)LM~ng1;OQtOioOSf}j$Q(-CAWmm^OOsAa&D+A)c6gm_H zoj5w2{xdc!2!hA}B_?S_K}S|c76m40MJ~`>6WmmgOB{K!Oqm!Ig&WpH9p6jI=HT)+xi?a9ob!09*x&II*sCa^j(C~`S5K)tIV099kbhgVH;|!TW&)bQZ*ZP!B?Z)A0aP7HB9;5aea29ZbB;kO)xVbcCo| z2T`ZNw1bJ4NdX*|pyO`26*wI)fVF}e3lL#}EG3@lIex4%^&L#0<%b8D!0tx2btA$w zB`!x6cV0FHa72K{=wXWzAp!zf3Ou0UG?0HmhIKHRGf!XzrIMu`@*8c4XVyK zH9!;7+@LBA6rbFZ3S8j*=M3(OTp)*TU;)i@fNYws;Lj?qHGvhxhnp^B&b)y|ffHoQ z1XgqA9V`lh3apyU8bQ2V(-Zw!MKU^=K<#2BkWm*{z)ZN)z%eS2r6ddr53n^#A~1u& zavWJoqEI=GEG03R9LTZ@EauFhkOC!m&>9Ev>398EC8Z@m%E7z1V2Z&CII@%^rwazK zDhq>>GbESn0xv7(R^XY=>%}Rp4)y}nRB;7f#0qB#1ztz^idD(!2fbOvxxm2;j?n3= z0$4SexfHmjUkzYY2;_pM08n~A!H}iEA#e~Bs-U3X!Q{y221_CWJ)r&&D19?HF@grI z!C?(cPu!pc1&S&j*6Arhth#2J%#ie;z^Tb#YR=#a32+0@F~6MP#r+(h={i=&MNF{U zxj@3x4+gQyGX_k56vS#!&#b_!AObmz7L;pPxD~h*I23pxJ5fQUfa6UT=;BreP&RqU zlBK`{>dt_83c^+l7ogD`V9sz6lp#O~g9o%!mcbP?ObZS_2Xlt)AZ2_C{0ah20&Oi$ z3T-V)f_6+B>OsPSP6iz|4BH?~g$`TBEg&YZ8Pf_Vy#z#anK3N@SpZ6D5}+~-+_Qqm zCrDTTDh!VoaD;#|0;eN*6*5dUD5-FO690685Y||x3n!=Nhp?(>USI(kumMaiV99b~ zQ~(tc6Iel_pacs#xQ^YCL15bSJt3@H4gP}_Hb4Rw6ds`b4YBPfBRs@Gk@Jz!ocROG z_JyIW1&lI~i4`XJO@ZJpG7l%W6N93_blq@PBN6Zr8K)+5fjNUDq!00dWqNTqYpwVP z@QQzsH^5`!4;VmB`_D3+J%V+amV-INbkGUca~R>_58AK=O-gLsprUvWs03%4t{=%N zS^tFvvfB-k*O}mXU4he4FG~qjGJ$q)@WU=~r0Z@k* zB7+nGplzEHpkxS%c zMnM~f10dh;V9Ijj&r%R{vgoh@NAFQ45Kp7S7Q_Qpn0r9V7|ob=FhQJUV9tC3%+zPp zv1YgmW`d%T`2mOts?_Wl4l;qF)Nu!sX%=Me3f##9-w6t;S|PCoDi=4vFWTIr$HoMn zoMNownqCpjy2a%OxcEdak9a_S0?ouC6-y8?jw}UUNBDw#9tB94{9u}15X0)n^n+>o zff!bidXR|%AeHdA!>?O`8MNsKv?_(kL4kicA2S0JXzeGDBcwQoEbV4yP=E-an+#Hf z;x0u6n8PlxDDXJW0N-E1k)^;4F+gBX+jP@7)@A_^{{edzRCI6K^b>KcmUbY=!&4TI z;|WHP0+1k*XF&7MFfTz<1rMk`{J}KcKAzQcdQUv7V-P2-x#P&J$N^dd%c#h~(f zGaknS9H0tZfeTToLBu$+6u6L64|v+2`2Ytu#D1rGfrFqLlL=()0S;)m3mgWCfg23} zLF0ywOp4&UYI!u7PjEOf1o3hz@MyX-Ux2fjZ*T;-f<>7Ra43p`JfgtO%izeU2;N)= zYKK6Al-ZRRH2JR}2oG@P>5WOO!i>z*rzWwgrh_szkK+$ees)~ImZcyn@CMWa1w|2L z?>r<>xxk}b4>&+!`Uljef<%TGc*P_nrW_Trl*AQ892LN8M!_lh0~@%dBB3BMT``$e z*iuqK1Qc9M;6eo)y`XlSl!6E-z+j>`m_Z|lO414(plXweL4ij>WO{Bgt4zI&0xx7M zn4+vBqoSN6B(3p6_fvwW3z;43eRzezhqgid&*93;!>z!fAfvzxO>i=hh=8OZfg7Mc zEh5Fj*3HYg^73*k$RP!roPs+KD1<;RmRI0{yNySa`3I9Z^8z-<7YvRph-A*IzyVtH zB%;6pnr7#LP#hqaO!rS=l@FDMn!o{?yOjcEFeU~C4o8zL1xYx^CQCsA&N;%6r63OD zftG4SC~$zN5CskeInV}R4h7lihf`Qhg8ncm@PMX?e=vc(3R?88zzAY7WeL0ib(}$I zPlM?P=q?;yM+4C6BVjjQejY|{ZgBK6D++;v){#|_7gWH43Z&_tsjRZ~7g!v*6geCj z6nVi4?|{2Pj37NXm=N6th@Kmub`R+8R;V}O`4VafBghbNF(Ie`O0Cdt9gictutHkQ z!2=4(8}%%pGS7_Z3W(+~V*(d^cfj^MUeUw>Rao`YwUnH~n)vt1T~BUIEkqVG!6d-L`{OCIaSA4JHRZCT12UZUtrqUNa^K z#~o)u!#|>+L1u<5#}#KlybB;P*sv?;h7gd#2OvR5B@~4%=caG$U8X6ujnnS`C8qRp45ISTI@s4x2`I+D-@Vf{tyF>R|<)#cA8a z3c7zb1wwU0s7(;+W)C=)IeWo*z_6E9l<~xL_g+>7&^4dE;6b<9y{w?|$i2O+8qo8+ zKr~R#W3Aa5+$4ss)@BrhrJ84Pp$SrBI-?{*G5baU#$={rpVU2=VQp zLuo-LNWrfW04-11KHY8>s~h8r>DlvHRhUkkpFVLuE7C;*@RKo2K(nUjr(c}Us>9TA ze)|9Utf14^gJ!dWZjWx9&DzR1WBZ2%tip_pGp0+=W!=s=efpk7tS*elr!y{Q?VkQp zmWiAFD%d&Q)3?r}k#j5-fMXn=bG9=sW@Tk&?A^X*9V-VT(~OJL1(&m4;rx67l-pDU zE>C~AoK>1>!TISMHn7fSyfocsBkL;0Q`5h1WYuFlHN9~qYZBwB>7AQc(-|L5|G0@& zgYndKsm-jph|?>;OSSkFKzA%bauaBUA}E~*K#qU`Rae{!oUXhA3XF&;SRMgx1ujPg z$0;CpK#rzk0JX|Ep&~CptuO|Nnk5)&mRzs^6+!szq^`MMq~$?471~oi`#kEu+C!| z4MR%8a60cAR+Z_JJ6Hv#_dMp{n*L6KS8)173)X0X8IM3o5j0`KljS()(Shmf-6W+% z8o;8U75zL}jvXM5z>4V#UnIo%UpxeqSN;+6%d`~EGx*u z==kQ+^b0#!r37AF0+|E#|ANclgCLbzkAV7r(*u?Yh~ZP-08uVE{UwvI!Ssx3DITRo zk3q&k&z0N);=n_K3FN<7kEbuRVijhd@c6*=hrc+ar#sx|;bQ5S-q0}pf)%TS_{4i4 z{UXpnVFc}MV03J}H(lMDRXyk{*ta}r0Ra|74G54BG$0s3%Ow~cpMr$oF~A5~M$PDW z=I-bXoM11Ji9qWTXUUfJK=hhi}e#0uFP@>GOqUc&4x0$*Lu~;5>M` z6KQ&E$<+hX9bd|bPG{Q1sw{U6RI-CAf6yjlCeZX*%T=%rP};aY{oES`<>_g=SY@Z5 z{w%@GJguQ&dgCtEWd9p*ZQ!e0khm70ZElXJ0-%%(*Wkov4!WVt@ys=_J)m34ZcI1c z&6+YjDU8XMX z|Jkw5Vf-)BUBUQc`gR9a1;$6yZ#b|vvm8)*WJn>&Y^AB*T3%jc_$IXxv=B;&TrEn ze>UUhWpLVddGWr+A4{gLsR!|%%=!N1VZ-BJz4g;4{Nj-3-~}xmeRJu+^hO^kk?9lO z3UZ)ktPhu&!1qGVuZ-S zmO((|nrDK{l7yS}0=mBgmsxXWPLDnbHw)FCO*5x2Jjp5vwTJP<^cyExI~iY0PddeV zhpA!ibcfSmjnSuBWgrLcbAx+fOd3ot7?nVQ2XWGa>(i&4X7%AhY$cxl>NM+m#^cjx zoncjAY@fdS468cRh3nIwoI!4xGQqaxuVDfmrFd<+=2=!FP_rraEVyMl`z*Mfa`r5% zFQPFCzQ2?Wv>r#`#B}|0;6`iEIabiTcLju+2ceFf15NyHe{qgAg;BNT1}Kw*Zcqj_ z2RDFucR(bpIk=OFk!8B#L1s}-1t!osI%db))1|6d)tElqnBK9GO>=s76>B)-yXl;p z*c7Het^&JHv6|I{z2PRPP4I4eOf~BQ(BhWAHLS8i&>X}H+B2%asK738d%8|7>qN$_ z)A!Y~nlhf4{-u_+4W@N^V;yTUsYNB7f)BL2e-gI>RDw4;pQlS=6ONJl-0AE zFfN|Hx*lxI!+O?azS$z+QEK*j);h*|mgy6j*o>#2U}6hqd^25!nN5>%+H^N&Hch69 zZPN>x*}N1X;~C7L)Biy`jTk_~N-Us;6@w##H6sHL|MWY|Y(|X7r}MM0l`tNk-onBb z#&~@CZ5B3f#^ck~S=nYXy=|I)h?PwxbPZ?}2(&Em0V6L5h|J|Gsy7vKeX zN}P_hZoCYRtcpxLOyJ2I&~!0qV%dp7Q5YnwzzI4IiW77k6sIGTTaha-_yAoN4W=iI zicH)Jpp|o=;Wtju)xu0!O0dIbz~bQ96qb6&8BAG9u<;MD1b8xq1$3?&{MZ(-xB_TP zHH+g4rY!h$DQI~lGia9A0JKE0fk{yqME_t^6avv77!?IU^b1Bs0R?8zK6NgTn;w7$ z&lMO2)`9|cx*a>479;=kOm;R)rZYFEFJWi%gdN0Z13G;VQv5)>8>}2`2B3Un&cO!i z=ofRa88e=kzMO;2T0>MpFa$bTAONzIqee+gK_G;eL4kR#B0Fe|P1K38MoDx!7bly# zzc@&MO@X~eiCuv$WUT`8+8RZ11$IR?ZUwLx6hIQfFayOwBg$Zd!1~w~#A}o!6xiYV zB&IiTvWdBinlqnZRA5mMGiN@)s30ET%F6>w6rkP`c*fxXW0t@qP=W!iYk0t@1P&Hn zs4^aKs7$}h$)+j7%LCeo;K+!Sba|&saj^vmftHqo&W{E4>zJ(=774hH1Np`x+4=ZQV*JnQi5I_4;hFDonEZO4q6ES+5iWd8366PR}uw_fI`qf zN!*+nGyn@0;sV_i%Amlj05L>C*qpfmw4y}FocRaH(}MNp%pX7u0dwXTAezaH=?REt zHe-6gs2~FBX@ZBbSro*FvyHCX8#Qf8b%$WBSBAy)cwXWcq9ozdA)F*z?0>;1;i16^+`b|XMitC2i>yC z=!nv#or9v16Vzwx1_?O|Li=Q(?Yjz$j(?wljOT+3vV(RtgHGp$n#l*22OZ4;>PS4B zesKn?w7?m#AgDV87CbP$;ERM*#s;t`s2c<7et|e}mx6ZlfzSMgnA!;L9fF2-c(NQ9 zpr{1*p1VLoj)*QbxXalB7Gx8cJ>5}6Moi!hD0w(S!{y6UXuEup44dcnbY3=5MyB?* z?R9)?#-K)+qY|6>^jLW|Ey<^l(NSFn1;?5!J|;ZI zrVmZi=P9ryF+Q8lsK^Ey?^jf0Tg`Z4x}y?X`1B1zY%&mb=5#Y*Hb2H^+gpX%v>2Iw zyxzW1giVo=@!9svqHMQ87Oxj)1C6P^6=wt8Z**3I&0>0t1e+z}iRo{}+2p5hm0%NR zJhA<(1X~H%z0Oi>Iv~dMLTR>1jK{aL$gsTu@yYhcM`As~Xuy`q_;z}>0h1)l{ z+93{N0i8bma=N`a+YH7N+i#e&HGu*++LFzm@$K~0mTWdW;JedUK+7QnUQYjP$)?4) zaJrlon;heb?Y35I+>EfruYvj;BHYlXG>hW}#_9j<*wm+Y8L^2>=Rd%qHa)?fjT^-m z*3(ZO;7~{LO7!%3Mr?)>#3;Rao;4T_GR&C?g|Win>^-AwdNAHSQYyE(CaWjrz6#+fac@x=5A z&TOE;@cqtgpgY;vUD!;#pmD>X!NdZ(CJeOD-jM^ccoftiWpI?p(qLkMESduCeF5!< zfG?Zk=Y}|sBTL|C^Ym61HhpM+8D-RB6KK&e`l!XG7t`;#uw^iPcs1R_m2EfEi`UaD z-Pm&3#TgVB99uqYuXJNmWrXm)e4oDFolR=`b$2%Z>Bb&xX4A_&*vzNz@?g{8DgXvj~GvE_w#0}1l>e(!iTMuRUYb9X2%PRur2Tx zd0D|5#OfLAn5SFTa7s^an8eC6eg6$s!|649Smmbk-DH(vG?=b)lT}I(blxiDyirE* znh4hEYkXOx>i;l;TCoP8qcSwXJ&y^X18La6o3+3@`5Qo+&VPV*1A>m@7g!03bI=hr zKNxvILl$~jAkJ@avziHXNd*UD)fSi!KDTBD6KqWy_>h~QjG%R4puW524@S@`7I5Pl z)Mf*5AzPSOK@EBaMHbNZ`ag_{?9=o8Smc;iFiu~f$RfdXgK_%(eXL^jH^4jYK|N9E zzVR54cUFM>z@*8X0d6`oDX^I{-2n+Pf-i$+a)fvXr1#5jP^HEp@Dj;epbfGH;vAqxKNI|3hDNX`TudNK0ii%5 z3(^Ass|NMfK^+v(35*Os8A0plm>^p*L751Cmcb41SqAK&Lv2rhm-Q)tRXKteAt^C~ z$CSVe{=jYp`4gNE5aK*pNI`Z7oCHpQ0*FbI`330Y6A+utoM{b+W(04|fCU<88Q~vr zps@(NY^(?E!ei29_yOw1LxKSuYM^LT1VuTnfWsedHxLJbA_pBv7<~LJH1uvTD1nnQ z7c2xp3KT#~7a`H5z@*9WbGq^~dy$hggMk!5N&P8LkE7Hw89x2Ds_qqgOA0wSZCzx-a0V z1LRh0R)S7OaYVLK47-)vqYktBGBVx&J$>a7)@Ph8e;_&U`Suw{S=$(y8vaaIIL-=c zDOet7HIxUJq!V6(8}=-q30FssEKn&77T@!7dVLU^7}F0Zz2y~z{{c#`c@5@Ey?BjX z|B^Rgd8P+Ydd^!2{|1zv@(#ooX9QDXOg-g7D8k=^s#f$!Cc81u!kb2&ROY zc6@;de}U2)zC!qSpmfJK2>-~p>Gwj}Y7|f3I{stf`lI`d0;RdZQ3hJ?q`>HOWdDzi z?LR)AOW$4{#^%Ks{S(y6=2jpWL;`T%fkO=8S$>db;ei1S3vhr=SBPNC2Q?caAkBsd zHhHEG-=;r^U=!8+`VEx$pmTbEKpcVZpc!Dtp6?(DHgFHbamx1t)8h?g<)+(2vPqGs zcL@c0w@{$>2nBktK=p2yiDt89n%*G6n#*`%`a22GaQJi~NmkGvsc=c~a*ZxYR_IOB z+}vxK8JS_boGvhAD=|VYhhTDWG=r~m0dF8;0xdvV2`b}2>s&zlv_JwI5dx4UN;?q( z65y3E2N43GV+}MJPJ#vGK*t}0wnZ~&GF$|UfCcoxdanPTUVWWa6E^e-nyrDZW)V?f zbX@U!`kw2oicA}RPQQPh6*T54e1lcb0Mf={a!_D!Jn##Y5axhLfeoM*v=ZntHwMQA zAd4LTK*YBf-eA>dWLn;`ebG%;CNN{!E!H4LrkB5`|GLeZ$n@^__SieDv5cUT4Bp>o zwS=Bz!0h;Wy5R#>C8imFriVUY-NpEJy1+wL&{Zo2_gN(&GcBMAOJ-e$5P=obyC1U3 zGOn1u@*%4RN9~8)Av7OHDhXMo&Nn1s~zK^>1K~v<(U5bnI86- zRf%!&^vcJq(vYiwK!*?zn{b6&D4fRy&V zWL05YJiY1_t1RP*=@(zJibGX;U{?fN7RJiU1itu3fe~~Blt5GK_Vuq=OBtD3Tc@kN zVU-6Z3imgxPK*bqcY(ME{!E8D>iip!P21nTVLc31z3CmRAIM6k_pHux$3P(mIVs`{ z_^?KBnmGYl4ag{PVtev?)prnA0XZn-GpjG-;pvM$vpO=}`!oINXI3pxD18Bi(sY9_tk#@=z?36@f`Y|q?uJesmMsUeraD!t7_(CT3EP+MSBfo*&Quz(6b~>2azV#cZ z*l2Fu{_H!e53^V^D2%{Kki~HY=+H|AMuFzm?H<2bC7GC-Tem0wW&I2e*@*wFagfph zG&Qk@1$27d^rQd5Haz{$+QZb?I<=V1k#Wb=t!ySt%NnP?W&_>j?83-q0t%igMmA8& zn9s-tx-a-8Bip>`n`7A;KQ^yB_S1fzJ~56>nepHB zt#NFi)oJhI*yIschJpGl%o`X%bD;3~S#ai9@pHOiJew}4uuX^u4{6Pc2kXBa&(@*% z8svFUHxIP1RNxOZSF(V!mqM1~iht8<64>$>-%Wp=!1jT0>-0N`Y%=`+z`^VQnh<9I zg)(~*o4ORF^ahE+OBWXInF5T^BjV~E<>1v3bg4drCPU+Y=!#j`sq~!)0Z4T;5g{N3 zu3DzU1ehH6Fd`oy59(7LU{qjong?2#$qYS`8d~ja0bO(9xB|3A7_>eS)ZqplDr3f! z0cO5n$TDNv0V+$FAZ3aZGw6^MCdUmB9Ti|z8$bsHgN}>^AIrkz_=6z}a;7b$Aj5SM zIH)*UBFqRnTm!^hzz8`@eg)(7kAK)jpeb z!aJzziX5`A)d5>T-B<7d_w_Ni?8Q2}**QKqxDKkArrEG%O(Nn!#tu zg4PCsy00h_p!fw9#-K=x5jYN70|L2l2_#Shnw$4o0JwZJ1(RGd$ z@Ow(Q!RPK?V90{BYoK?FGHEacfbV=dfi8h;u@CCCQeYcF>n)iym}-=mc|lVPpsb5- zvIE#;3%HH-AlHM=jbs4d+zK+r#*xAC1gItDsEB-<6iBK9bZ`g62GArtxCagn8mKjp zCK)p?=$tS}YYfsdgS6EYK{Y@4M8+Qsp!r(`Mn{F|tCHEcG(mjmCA69h;OSFvCISuK zfNyVti%q|q%qCf10lKOQbn+1>Km^W$Y5AWq>X)V|DIq6=w>}jxt%G(9mEqP-1iCg)|RLKq8<$AfTMhycV=woo#IkB+rAg z_43w+hI$4?X3(@M=oCftB%=Y=uaJc*4ss_f#i-zqIPg$`1e$)(5_?cm6ab6YH!#4G z3bMf>j-ci=N}NH;p9-XO!3^rv?Ew|ku=@jeK?Z}aq+ScU<93usF5p3D+AwG`%!ifMuo7%JLI6^Ntw#um zgA4d=Fah)e9(+>}xP+hI(9rM!y@UtFJ(dD~4x|{G11h^IE8&fBU-keBsU^6|o;Y~b z_<|uzUjllnUYK5x&Socq+R^}>!0PyU`k{0-6{Z{ir@u%C zw-ppK*i@C^TNA)-4e+sL@TP`~0+Zv4pVKok*t9_{jj0*nmd5!EHbce}+Zi+2A{kX6 zO$|^ifv$~)HZ_QDAcH zXaMim3ILr13T}MpXS2yOo|x{R%@)A);{Wu8*=$mb$EWYfX6q4H2~q2zzzCjfnm;`v z2duUthwUlj{q1qNY`LH-MbG51xu-y?UPMRvEl4k@>V?OjXEOo?nO+fi3R0|q&4ve>U_i%uzMLLc zz~(9S2Xq}dv@~D@6%$Mfpc2#Z&$Q_W3)o!5(d0Q4LGlnu@#)5eYzFKNAm<8fo1Rt3 zCL?$n#4%%P0I6zV0=40$7qY3^LDrao)@La&I(}fxa_j^7z)@OY9;lh90QCl}Wy%Pv z>F+RtI`u!N|0+cBN=^}*A#^56fzh#nDNBJtU~1d+bwzAGpqp5W*gzdT&0;qBdWe4= z89=>TM$k%1$QXtK6Zc0ZCeS6A$_*e(9Tl>bSRhi444}&_Km|C50%%bUGq@54SHz$Q z15G=D%6d>{U{C~I;`@RjN0Aj&O@JyJCIuFO_h2u9u3S~BX9M5+_<|uzkx7BoaYlWX z5-X^lU;!V325Rhs?k!hf7HFLT8vX<8VRHo^ z!$1)NI*gcAfklDcoJmB1MS;zX33Q+@i(@_5cqV~Hknx~w3Nj6HnjV89Xbl~+1{1h9 z&Y{GV4eB0oD6#s3mV$xq+Z5Obo;+a&xfN6(fG62N%MMv#`yrV@%0NfSF*zuJ1BFq6 z%@Nuo22~Rb)3<)+6=3X}p0C9wE4mG|x&ySl3BHkrL15eTg<5O@j4P(=DYL0EPiQ(g zT}qox3wB8=g91A|B`_(lJ3enbI6Y3AO`mx~Q-AApZGAQ+#`V+v^x66uFHFCu&!)`sfR&MHx}64_SUrQ|1tx)~ zpoR8IOrYf9cz^+vt(d@xiqX*mG#dn&-vP}nF*+I`1U`TkF@lakhP5rg>uy22lwks( z1$^N9Bw+%e!#6>h3*JPT{y>9GTprxcy#YEh!SM#{@&wTJ9pE|O8%)#Hr}OBsF9+Wl z!#KTgI-|z)Fio~C(+y`Zo|ndj1y<@#*ht*(9g)*02dMuk1WHU7?0eOL{Um<1y(n zD1h3Q;Q0^GnOu%5IuA}ytzo+lR%yS7Nq)KmH!p{r0;9kNuntCq4(L_&ARQM}Sk%A@ zr|+s|iw5hJsAG#_2FaDyvE8h{$H>T74;oa|WL9uu3It7w3(No+$PZo=4U*Ad(okY_ zO-)yyDYsY&keUr)f2@fi?u@*m9_|f{WMb7yk%KaU-3jJ^g_Z z>vK-995*);!}QQ*a6)QtW&>@NUEj>+#CT%*r)D-&6^I&;cQ_n3Fu^BNAm_C;FoFf9 z^G;;TWIVoIZZ_LDM$rqcphhNa#};T&(}mW9+coF1ZDbUE0G31S#^QE-(0XwC`+00~ zjN7;K&1bv9r2YY{1a@RCuY!PMLmRSz0-*Y&?cj9IMQl??#C0Mf+qoCBg)mOvF^esAh`6?jk@5I+!*>c6)Auc5*5EYn)pMjWzYWRybu=kXBtRb!g%|0EU zenCc9YI^NzHg54hAfJGyZJD?+!=|AVqIvr5)!@ZK&sVd_iNEOpw;>r67_sO$(gD%o zXo6%NC|@dp+zYZC<{?G}2GGV4M#nGhaPzRck!J(UMkemk>Ahj{64T$UVUt7(sT-gP zMVP@1j#D}hPFG&bX3ThediYv4Iq^9#{n%W51L|TE;$7SUH*fpf+iaGM%tty8PS?E4 zrXvI{=|H_XMnx7!6Ht$Cdiq^9g|zwIAU`rND6m53e5Qj0K&@R?@M+hY4E+cJNPD;) zApmJH|L=k}kXfPov!y2d7)#V@qZHF@51Z zHZ_n-x1YMlW(HbS#`u5@bg1IC2W+6pvEL8aKzpHNAF>%Ro|x|UkWGv6#PrICY_5za zrtg2qrVne2GJ($e0yiV4|7m0MWSZAE-MyVHfoWUc@|EpuOq^4CL6sSkz^mz-I@zvs zP6Kn91zt>_)Ww$0cw+jmF18}hnP5>)ffv(DyTPJ&yV;637lB1t1zt>#=wS81VEj6LK_7TIo_If7qXaYP#0qB6 zS!TT4jx36xBR7~FC-ffNzM-Ejk#RcXBQ_Pr_0!cJu{~qlG@bV`n?B?5>9&vAf*IFO zpZJ)qp7F$V!6$4^Oq*M$UwkIuI9*_tB+K+!PuR9IZr&dBl+7L#YLlL^DKYMwzV#V+ zCD-3)Y>JQ$2WaOWkHGBhTF=?ILF&w2uw8*n8iCrRjE)UFSqj_=oC2G+%e`dNV3Y-y zt~`v~pgx=iQwxid0BA^nTR{NSxSXE+ip>~mE+e-BtHA8-i(au=GcjJbbeNLj+^%FCg^=?F?^8Vt`tu>e|V0zSr!L6hM=NC1>pIYCpN z*Lx36pZ}3f$zU!hTZ5{#1|Cpl%&5uK!lTH}?Z~7ksK73;9#rQma`JG)1XfM|_>nD| zaou#^Piz@XKU%kM|HP)u$T)5K?ayrQSr>4CPUATLg-wZZ@AOY!*vv)OK@9-!3h&}HcCJJ;OKbxgAH`-g3eF2EsQg!Km5sND+1{ya)Q?3Fgk)xe*>NHcKb71 z!SqGH*y?@30Ri$l4+q4ZB8ozepu>LQ9%O~b)GUy*kYj2RNC586uDu6b^mqT*Kxcyp|7VL~Y@c56pY06Ofwt*|DMG?i z1KC$HO=+6?hkYgUitdBcS1_`N%QwtFwMSlobFI?{wz^s+b_I5)hR(%%<-?>M85|h| zW=xl3VsGUImxKz8jzW&0VYm%U>|#c%q2UH~zdplmkbpJlcr$2;wizS>C+pPLE?{hi`CXbUeb5B`~LHdM7Jb$!b=1b=YJWqvIWpEP-iF(;u>e z+o6nX>?+0(KSRofJ4}#~E=CQe8%*HSnc%YEGJ_9VW<;>DYlAkmva^d#pT)+mYY0&W z3X?lb;K5rE^9HCt59_}&IVhkQ@q>*WG&yF-&JJ3wn!wIp!gy->Rd%qO7jm$J+O$?2 z?4~fMGeH}))9X0cLFZ^7DUpL(4pRckWuW0;Mn_NzZ=G(=$sWbnzI_rWy9TI*wwsIn z8#sk+;bu>SrZ7He3gcJcM@wNQJnZJ88$r25fzgrMjOhUjXvBpnOQ2zT0}nfBLVYd| zyFDZE6Cjfc*q$F)_$|M2ft@ zl;sFXku!wYK}*E<3b8K`ISq1|BBuf`s1D{*;B{maII+D@nEezZEcb(?7!;sV)BQ!+ zO<>Emb*(uJn0B-hz0!C`>-0b;wpXCFLW+DPOq(00Z{(9Y!L$!di%jq5mvV)2M5j9_ z^XW|&lVs0g+Hh%llO($ZbV&!3W9#(8lI)sHQzlG*C&|8wcguu>4WNy@2N<#hUQS;s z#SW^td8OGwtKZe7*-aQvOplRf*XP|c5meWo0g(c4rt{0Pt4!Y`&3=gS#PoU@cF?lt z%QA3PcOa^^^UJccg6c=8icC3n1Ex={(;XGq^BK2J->ATz$n>EZnaenHx`P6H0Zj5E zvZV9$K=s<8iHTs!@kD*Fb;9n;Iz*v*($v`k;G#{P@(#Pn6_>@kdMwzF%nPhezRJAH;G zSdpg|y9d+qmg$qV*vlDDOy|~Sk6>IgeSbEG#Pk|%_6Eka)BkF-uVvgZeYFm|KI5|K zw{_TOGM<=Ts>}X`an1BBJ@yZbYo|x+v%4|wo4!b&eL3Tv>0Soxc8oiwcN(yNVmz_E z#*lqIXt}hGF?&8JaORk>8!*k8IQ^Un`$~35_`U;O3L-i^_b5B}^m(T2_Uw=VeK-Ay zDf=eKt^j67(2l~F(-)bsuVg$i-N&3=5+-qh5fqb!=Il!tPfQoHU;+LeFj7dyqPX!#Xgzw z`1EB~;3DIy6}tiB-RW%B?AsX^Pv2+F4r)cdv}Omb53;dg{{Xrz#TJ|$J#E=7n6C6q zZ?J9Z=hm_gIgj!XJM zDY;?7^iq3pVK?2L{Vd~&>8TFvrx@o?H*jQEXPPrP z7YjInbBe1IyTfz?XLdf}C6mF~3N&QFq`}1E2s-vD(3xF|e+@{&j0v<=NB}gPeBO!O zfbqmMXLbX{NuaU>G^qg^YH=jmgeqtD9L5vVpF6V~LgVWRG`=qGW)_)l>B8Q}czpT^ z7jUF~cVRbTygOaX6`ZV_UD=HoS5DvN%B}=jU2)5m-40q#FgvzRS9D`H29*S zpMc8=X3%nNftS-Y+}X2G(o+wk66A(W&@v?jc2F@meWN@3SH8udSsc*L1||h2fwj}+ z{n*8)pY~t}t@(NB!LH7DV!NOxdo?5Dn(4h>>>kq4xMS8}5>a9S4Gl4CFbODtPQE-b z{eu@f=nyUiZ*~iiYookTT)WVl-2mj;%iipVd8bSS1wS)rf==M&^u<2x8H^{U^Z0^O zqlPd0OQ^G0L9JO-zTFQ27wSJl*o_%iPuC5Fm>(F*euVKYWZS=47}&qH zVeEeFe?T4*csKo082cB-6Vs1}vj;Gqm@W~)Zpe6Ux>p3dCF?>^JwJVYF1yn7RT1nW zj3>75k6`CyWIQ+hWF)&gm7pB`svEO4nF$^sZR;kBk?l*Tk`hG47gvIgZ_kanp3R zcy?XJP18-{*}WJyO|Oq+Di5#HL4iDrIrs;eM>{l80 zO@ETW4!T%CH4$8idnK|PFfN>4oyhLUcw+kAM0QDba1!KUpYC7CF3t;Dp}?#Fz4LiG zV-h=P+nYraxZsFNVm|@3lgUAWRf9`9EUK;EvD%Fe{dcz(KS8hav-on4jb&Xno9)7e2==f9`3t0=>ZR#wo- z#R=xj9ty0miHR$q+F;3~>2?|HhMWf@BWWI{kbeyCfr4TNX^) z-kXoGg=xXG=^qNPD6T7H*HbtOnq+j8fjR+l$lC+(ZavUGHG!AY&lIxTvTg#!&*TeH zpiPFVMc_tiY7zT-#_iihi`m^7A-e#f8q!PH7lWD`rR;u;C#FZ0vRg16m_FU0mt71* zuPJ3uXL>Px`aux?#q{aAW$ZVYK1`p^Ud}!pvWS!$dR!i(!2Rj#%Gp78!F(!bS7N+7 zU9^JT&tf~MYH?yzWOHIrWCfix$fUqp13J!~88jyKVmfHd7_!oVS%XPIkwpQtFVFGC z^yz%RnPjK$s9-k%IpbXg#5sJwnZ&2dR1Lkb9m~vR`C8F@0MVyDqdU z+5@eMK2)*KU_3s(vl{Hb8`bP7jLp++YuFtbk4&$xVON#83toZ(o-t%{vR`66KK)o7`zyxn(>K<$i^+iFnunR&QN@uFaw83B z`3jhKV*2BHc3bu*pkrkOwog}YV0UEPK0UL6T@$vX6ttiewCX_zl!vk$pUeaWyg1{` z>4zHF9hsiY1cf_@E8ECEL#kmGN?=KV14|&wv0>Kq^Ns9|;%M?5V0nn7*mT<__CoGC zU=y~3QpfZQ|0G1FpKW5#VLU$Fsu^7THa4?^*7eS5X16z30#fRz3{7ZEpb%jc_za3n zN63UHXxSqZsETCLU=k5nJe|9RU5ft#NS7HC=rAM&P#eRf1>A*>ZDBWHS~6>Te+#<= zTG(wE*G?}y$tEfST0h`uk>v<0WlA+~|;h_wLO1~PE^mR5ER#?I+?TiLTfbzB>}3e&>b)AQQcB^j518UbR{ z=e4nOnS-MZx(t~Cx|RyMP#Y9Hpn3vUfr2fD%1yuD#;zy+XEq`xm_W0-poKesW=~gX zXAfXpJH51>U6UQ6X8ZJ|?d+gY#=q_0zDi&RyA)!`jagvr^zsh&2&O-?r(f(~7X#5R zJJ_Afz?wmqh=Q7LAoqaU%-}IP$mR4bpt_bxgGmNdFf)J_Bs+pmfK2RU*B75K2jMtI zkmEq}WE190U*5?cBm&V6K7pFS5u$S2blxs@DgGHCZJ_2MXkJxd(R8yeb|a<u{g^ZTW-mftb|1Up^j;Yb6UK?#56N)cVq#jyJpBVBvv_?wpEZMm z0=Vb_wF;X-v-w~yXsfWmVc0?DphXIh-im?}XrV1w1LzuPP>B!ry+9v0C_rTvsI|xl zD%qGdnN&b$f`QK;1=%8y1vcAp=Uh;`Uqzs?9%7#clYkNnXl(+h2v%TpJOf%lC-4Gd zJE&s>9xee}3OX+yG-L|i@(G$j0ryD+%$XGwm?4JW1skp^0A85@(#)X5!V6ku0M4?G zcfe*(gP0APWCb;AL4&|V8s9Vz>UNmZ8I+hnPG|g*jbr=+wHJMmI(<}@Mpwqf| zKzHVW#6%!sETA);L045PFoP6MyTL0ia!HVdqn@!2bOiu(-ADt|^fmGvTA(o&mg(>L z*+i$mkmpbaElHcMC?FwH4?3LywEU9;bbBI4mJ+iD6N3`yN;m~31s3qp=Mj)tgOCcW zj^IP+AzLmvvOsAxLWu=*JUrwSb0)_L;Nx-NXQ4w>N`Q>lfSr#H5mU%gV5tW!Sb*td zFk?ypTg$*`&inwhc#TDqNx+=B0n7xQl+M6l&hVTObZ!%95e$>#4Tda%c2Iu=Ql7;? z#@axY9b)kpw*o8Zh$lx@$QntAXF=|{RckVD zsAmLcR?vpg?TqFO`U>E!%N$us?4ZRi44{+=GK)FFoEfxB*#f-n6tw;M4+ChL94rqi z<^{5pKr#7+0TIL&;KSrO6_^~~AVd|IG?`M&nJqx;VyqY%80!_7L3ZndMpD5RX_zxK zf-f(Do?Z?XlrU!o?al@Tw*ols1onXvK4=4WiW0LUvl}nS@^y@$5PHr4+I|aOqoTm1 z&yZ@(2-?i6!IYrL4oWOBimV_iLJ_ptc>`lT$U_LPf)CdP?NWw^FX*&g4$vhf%#cO1 zpexcXl(@j5$+a9Du`KSqT#&{0;MM#f9V|tlOUiW_HZm%4g09H~)gybrXK}gmGVySN zmH@tH%u-<1sApgRjlqM`Iw);D23MP)yHc1OUo&QDFu-Gg;V~%I98ZC>E$CD>P*V8; z=AD=isu)^8Yji+I7zum;g$-yuF35gGPHqKGuroQ`d07=$AhNE!ph@XHj9K*>Obno_ zKtbFKkR8>aW0By256OZTKuZTf7II`Mfi4w5>vJND!PP8W@%Mz{wbN z_!B5^fQlo~8guZrdIhj3a5(ZHmXj*5Kw@D7Bj~aQ(1ia6 z#w>x4pvD%clLZQ_dQc`&;6PmXfEJ>l)3mTe2&hB?6(0gf4ryTo)mUJMG%zZ#pg06% z6+AA-KCi_mMMOF@Ww>We1(1#Q<6(3fiX3 z1}X{|6qxiG*DzW$@G3AUaDkTEF@OSFK!L%LACx!OF~ajEs6jZlsiD4s0TPVRZFQhl z7iix&QXn$wGBAKH3u6b(dNDYHZHI}mDX_rHUq(nELRwDXrGUswa6t_#&{8u{^#b-f zBk1x}hUw?jI7BAP+3+!*nEp|X!w|9_5)?b2q}Kz^vLK&<(i~F@&MdeCB@03w$>eAO zi*3-7b4Yl)^D-!Kz}?K`xC3kjq~2iCV5;8&8iquQ4h0rS94jz69)T!jfwpQ7phhyd zWeY05APEe#I0_t8@Y5d=H-Uni#~iR-6atVCV{qijQDm8(slg$L2oLe;3p6;`ETNGD zIsp+mc|&3WRIM>WECsm%$^;d04NTL63V8LH+MA|7n9nQEcw*WDUeG86<6b`T>E8=@ zL7kF<1-zic&?he71r6W@7V<)ma0IWkVgar0YHyleU&t%Vc>>g4=H|Y~G`#?HH6?g? z+uABNe&!u>4^H1-#pcP}w-~(6O$~HYCC_x*YBp}h57RxX*(R|}U}xl|cc6gQotZ6qrCK;3ad~mz@a<&r2=~>4aeHo8W zH#ouQH2uPIo-~kdixoWmP|F;qbFSoR1qp8ClM>AP36 z2QzJ4FkN5`dot6m1=CB{um>|8T`>I=h<|s%bp5sL!A#E=OmA7sUc)qR!E~l|>>)~! z^r-;O^^3v12u9FwGpOZzgDD5JQg3?2I`$`w$G69>2U)*ydjAIYM~o+?7j0zs-oAD- zdod$uEr!xo_8z7WY|}SvWfx~|cy(j?sjcjRj2pMhY-4}I$kfxcooNUAZbqgl2dD4f z$!-H3mt%80Hl1Y`yDHOyh10cnfydX;aFa&D#T-DwuwL4>;v~-NO!AuVcNJU0)OI8BmK~7;;%KIPWnzD2Rf(7-AqoR6z{f zH=Vo}JZgM$FK9$y`=`C^iy0ZuOrN%&T}$xDLeRn`rUrHeHpd3`EP?skFYaeQ$i#Sd z`s73GCW7}N(l0>LFF?}MZyW-T#{53S{!9Vv0#K<9?h$}*5NCF*0W~_ILj{aSz!sYy zVfP_g@y#RP(bIoN*ezsR7lB=leB zrnekpcad3yN7wWx$Jm#E#-xse)ia%74`5t8{m*HzofRk8tz}N&(|!H~`%=c^(@Rf+ zbZ>umlKn9w-P_czWy^a31eH!wxD? z*FmWBAh{FMze6bbv+T;Sm6?p-_QT@o0cXL^D?Q7u2u;FF4hrB(1GEGTHrEeY^~sne zuz30oi1NESRRp8zB`J32`K%;b* zHnUA->TR38(UM(wdd(I#9j5-a>8rM|$uRY`O+T@PZ5J;%wScN0&z zGh*C7{rXlm4aO7Gwy`OL%D1|GY!cILx3P&MhS`}lm`Wg3AhQN&c^EiV7j9z%%~yAC z1D%aFeHDZ{xsA<)aqsqj+t_|E!wnPI4LYE1y2frcGsYj&<9D+i0=ZOq51T8+QW8$@x*lRy=<|d`O3X)8jz*EkTqP)8cY+IAY);mle}^i8JQgv7zCa+P6xY} zcORQ1bYKfIdQk&+Zv|r9o*Ohs0G^~_1hF(AGSg%CvB^Un3tC*fY#&=S$bk>lM1-fC z?Pt>jxiWD-nzin({j0>hG9A=Z|S;7W7$QUHMf^E9Zb~c%M@bJe9Ch*QiX7H6@EJaG7 zMUc?`3Nz?TVNhp)6)_+H5d&@WKwN+Z5d$6A1?tp8y8q0MC&1UADKI-;U<2KX3+gjK z1i|AyH`ua3{Suhy^ui--!u2363ZT)T7YHq&$>kGl=FBIU6_^!R!QG=3OrQZ3W=GIY zD+!SD0|@0{L9h)Az<0Jmd!7)*;9(+=ID9MsJWjNN&764#qXKiiV*@9s1M39tn=*rW z0?>PcnL&aboC?gK>scE(6+jsSWHso%La<7K?Vy_v6qp^iFoDED8$>z4{$>IN`5w3+ z#A>kM5x5}a3d8AkN7=aR*Fb%Dgb8FdSm7Q7a|@j5#9+>}2DAog0b7>94{$FCHA0WD zfr@ufa~l#t;Go*W1{+d<2!exZ3z8r>&cOk-21yhYGhjhnkqHmy6U=zyl4%L(;3+21 zu$(3{Bwo2eX@n7!3Y9<`2q6g)o&-VNXo)N(P&*zZ0|_Z+P?&;b1hSMsbAKQiNWj8m zz#~DR&;dz7A_6S+feF+_RAL9+VhK*5aEF6rz~e5kREi=a0qUwlWRRQy(xZ^2#051C zK48SGP|vK%yaKu=0-S`I&6z)d+_Q!)3pD7#U=EJiEo@l|;L#^AZx34*XulFv?g(2J zXvz*eW&zGc3hZzv-C)atU$n{W_<#*Dq{8g@f-OsdD;TB})MH%01_|#AjOI*BpzIG! z=FBHRVFyY+kcE)oqr5=r1>DVKft3G{aVJpSxMKR7<7^W3dzcU@2r_^LGUW(D6f~&0 zh6yw(1u0ZOC)2@P11@Dir3Z=tN0t&R=wxe1z5@l91?VC|NT`BVg|KA_^n%(}zkGso-*igR#Q0Obj=ouH8y25<;7 zoncnu21hh2DBKwo>X{X|p!In8J4hFF`QwRRsavPg9=a3;ried z2rgkyFlSBQXvra54-Pwl-Jo6dj!fX|$3QLt9}up=B;yFmXdoXm37h~afgT%x7I?1U z)9@J;SQJ@#*g%a;7DpyGUIs^QMesc=%=(NUAoq+jYk)!sJYc}A!E}OIfkg<^J^)26 zC=9@b(T(X7ZZeD4gT{ivu2O)yg-75F$OTH=PW9ouj0)V#9qY3k|Nmz$RAN!!f-qR! zc%hM}!0HRywgkGFiy=z@yb=NwexR^nF=JZ6roimf*wD~$fdMIUAen#-G+M!|E61>e zO_9}+MUfHIK;#zK4ze4b5Ll-toMsaTjkbcL%#3LdBWR#Uff+R14?2{_i3N1lJSh4g zjX!3`Eo@nee2}#42pZ1>$uT=X1R%~-U=ip8g#;wogGRDhk%zLFp@V}bm_b@WZIXI$ zvIU>y3Cabmurd>rfle?(*JD9q6Rb!8JXZ+Pxr9xT&5==&A7m0N2Y?Qy0;POMMnwTg z)(2^20x4g?CeQ|Q8Av&Zzkm(2NSmSFkx5Yiqy?m$Re=vOVgxEcm=*ZIH8m*RX)>>1 zQ{r|~=vb~OsKC8kQOJ>7Q2=Dh1~x@@P+|e^CGbV76$ZgKF1yp!}vL-C{ zSwIO9QfVl$A@tYgp(THY0>pZuwJnO=jtq+Y zkVeY_w&{u2*ktQL4gi&g0+2ER934E&pzr|Y3`S5@2->9&8sGx2B~)M)*aRA40fpQN zM$jSw7DvV`(B!oS6L^InPY$RQg;>r6+TFsDrND+r5*kb=7#%^A=qJGYaO*Xgt{|2e zUH~mBfp<<=z_|&UsXTc>(^ufu@D=EgD6VqzTb!2wuWq_qZ zX3(`6pddN`Znd9a6zBzwEyJ>z2Ga~CB~FmM_yQ(@*U%Q*3UE6NlnCB8fjdR@8^GJ= z!HEwVzb6>rn~*^*TLngeeW0=&lp~R|?zT^dXc%#f`6 z2eh$-8FY=cA{QuUd|*-pr;rY2MSf7|PGANlOi*Fi0J>n3!<@MST%juPE3i1SmSib{ zjxqx^#Cft5K~1p(%%BbH{E95#67dMgekRZqBlyr<(Bu=m{m$Yjj+n<`ag>LRfHNzw z=rb@_GadmK@tO?$kS4tXiw1+V8PgtS5Q7=C(_WK-T~Sy8+++uJZNPJ#kp0pSF#+&2 zra%^S&oo33I-Lp=Q(ytJz})~)A;}9~gV4a4C9oQnMOUyXvcVFECi4O|B@rhU(3V|r zb*sSccm=-kTEvMth!@l{oWhjl2u_Jm|LZb8Pgv|M`qCR0E(bI1iG$<%VB@ z&k?e#wjNa2Luztn4WVAb8J9T%K~zRBC7%$I5n{dJO#THBnl~IR@5RDGmd|l5VnAJ*Mi3u z>!D+|j*N;-puJ?EULsQqCn!n5rwk#nv1SQq-v17Wgl!>LUD}W_KH88VBStT?SAU4`D521J65xN;?Gsupe0z zxD>%BL4YbG7RME}U=M<976HdamLjWyNB}PbX!{-bC=6x=E=c1?K@eIKazSfCE{Ks? zW=w0?KpkOFBtuGv2jJjCN`#P}Ei4g&a(@LVeSyxr0Ilz0RRlK~maxGZOWfe11(J+F zBb}h60tOz>eiWzj(lLE}sFuyu}0ZlT4vmJ7Eug^Gz$(rFJBe(|uKKuLu zgw6Da(VXcGnC&ssSyT=7 zr2-Q#sQ>$c0aUTP0nb~(ni@<`7|oe8Kw0|%qar(Kh?yB`2rmn=8Q^3L&V@W#j>kb2 z2iOG16AgQq7t%fyz{cdT^<0#`FWE2xd7m z%yP&$H`MYEOj%INPcVZ*2ULq+2OYr+$}}2GYe2yXsl!%)R}sRZ8{897WC0c2ppFQn zxpjeA;25Z#KYe)%D<5R;5|nruLBYF+5z&nR-QNLOA_i(bf@ZM)fEoilETDECJE(_t zfe~_ing-~eI`Hr>vj)=xNV5ocx`!uwkcIV65DlOQpyn2Ga)tQr1W8RUMA3=S;sV)+ z-rnLu%uP;ry2WM)I@^UEoM<$dVnD?*_#hY1bT_me2uWg~Z7;Jxi3(vRxIjQ_!$DK( z8D_|4I8d9H8Tl|5aJLmy7J+8O!HxGQ25ZJ;pjJJjH6v&c!;ukEc7Yqw(AGO>nihO; zIs@oT8n6SwPGtZ&2Fa=5GM5u}|G}f_f%kdjr&sy%2-Sm6YzCc~&gl4Y6{u_nE#+Xz za{K|}Am1*-==cC6gmk+NXjU3@Mh57B8U;qjBVcLJG8MOLfOGH1OnTp@4n4uJiUdDLyqzO^u=r(_B`OhL2l6UM}fQ3-?4FMgC@qL**R>L4%Pp6+?=dd)K4_2%JX&1VJ7SAz( z7AHei%R&|>Gl3Q-gF*~+9^9*yjw58A#34oRjfi{}X0V|Sbn!jxNY7P!p zLGV~NC~Yu-&jOq?YdRw*hZxhGS<@vsIb1+=JST^kJc@CkAzx5F1}#L=ab$3uzij#x zP7XgAu(v^7Q^-am&`tpcP@@=>52pX)7Duan*S_yg~bUOL#e~85wU)-@wNqDYFFW zG&%;*34fsD^B*u|IWAdyaQYen4yoz?`8aIqA^V9LL7QC|L6azp^ z4i@$!D?tfNc=|^X4w32g0vtk8PfmlbtAr#M1`Q?)uttL{$0w(!uNL5l(_Ri5_W~6q z32e*yCjfX;6}0GHgda(ba4 zhll}effs`#Lhc60P4LzlgX06xd0wCp5V!{30U|s7fCVed^lO3~Cm63zpD)A#-qinI zh$D#m4mb;dwpMSR?jy{h%y?pYfiQ;{jP`2uLtQmuy(qyD2F_o z3gq0vHzFLG7LZB@v`Q4@YDn5tVB`glS%Ge)Kso-90kon$O{^=gM=&8InzPW4hs7N%u0-)%ORN*K=5-Di0+9P&&HnWh)6lopvjPm9BX@%Z#NIvlo4v)iU?>vFg-KA&Eo%c045 zV)`sy4z=y8wK*I>Tfjj|7?)1h(&cbPQQ^k;cKbtJ4rWHi$J3wcaTrNAfbMKmfUa_8 z0!>namI3QBs0cipZluovIuSojpTm&x?erP?905G@!3_fz&?PjFr+?AsP-AN7m@Z?$ zA;I`;x~TzJd8Pq}5#!tKa|}3G7#W{WUuejoj5xXjbl)jxxv+`Av*|YsIcyl;P8T)e zaOVJT?O_pkIsKt7huHKgBMvEV@R%=nQ5FkmuOfKG0}E&)1|y&ybrA^rkQN+_65mp{NJj_e48AGwS<{xHs;&Thh?!#IDsi3x|k%o30v zL4&CZ431Ev6~Lx42|S-(Z^9t~aV?|3%jxq?IP@47PCsYD0oo`3+Jr-a@%eNfQx4F1 z3Z|wUFBq3hmowv#W_&)~%8cU_d z2Wa)W0?6K<7GRA^mK=7VP))Sr(12Y?#_V{2Vfuyw=4_@FZQBKeIQf{SYZo)ybKhAF zS_cb0-D>;6uROkt(^vdpHex(6J@EstsNhOaM&Sk(6AX?rkTa>Ku_q{l>u*q-8G1_= zWXO*J67G;CbJO#$h>A_un$9l7cw)NkbaoX^h$hg^ z)iyogf&^$u+q+$S;+z^xpp!5`TRHyDVh0t%&|||KXR}8_7G!|eyK!U*teL)IHhAaY ztJ&<1&~+`KvqZC$7&Mp|cp14t3I!mZ`OH53Vx5%a^vo@cBFqO`4o+{_!YB=9%!4uZ zz!LsoEu4s`M}PnIKwEE`@~cD%BnOKW&Qi_Ag2DX7WQ zOSUqKgWcD+73$D6Fvh8^*xbj9*A70svix{u1+d6YPuT`_U)?sS`{uwHyS8C-pC}en z5TPrES5_RatOOR>=^@*p?#tT_bzcvRv1&V`bQ(0A5iXF$VhTc54zH{{F4^e@yLcoR z-+)^7;_QwM3ZQdvrtfm#$YngSUBi*%8WZF3>HnQMmNTB1&f&(PKK+~v$3({C(-T}l zLfbjqIBHlJk56y);+W2OV!Nz2hbgE45B33Zr^|YC*iF~;<&cp&fYcHNuhj)@cLE=x zJU!l*LyGCd+U?c8914t#x2G%iDTq$jJIu^BeU=it9HYeaT}tdyt}=>Dpf(FK26d_= zco`I!_*j^jSy(~M642Hb7D#nm0lMLe1=M~7U4{%E9%7k(;Xjj@9+(Z<{^H1F#Q>T( zW8z^19k2ruQec7%_bR|TXNM;5pC?|=2pR+hpE?S1fC8iA6v((88+hm+G?1yl=-2}m zQv@9f3Z5GLZ(pdy=E#_(#O}yksK^1<$>zxHkI=*J_~-xs{|tqS?2ZhIY|IV{YzokI z&!ACi1yI`?w4$H2z9b8B^e&hO=DYy!*Z?U59m1su(%8V5rO2qj?pTwh#LmmW&8@%z z8fgL<2ws8220HSE0jxtL3#>r_q@KgEK1+!MtR7rVunHUl4cIHNfO|mG7(v|n22jrh zEDaWhE;a$P71%&3Kng%r7YjrmvI0kmEG6iU1L&+fSf3+!?F9G;F%)4A$lj9^4B*u( zpsT7Cn8Y-h9YDKLL8gN$KakS|c1@dpVIP~jJ7{bIz9s@Rh6-Pa!2!Mq1ZFy@GGzdn z0@@Ra zc(e-1#3}2*A}|v_tT{M6;Vq*CaVl@TWz=JAn$G@?F@f>z^o)0mvW(BBx4mP`0JUX4 zyknGPTs58RJ!3ZGuIXj(8FLxeO@H#9(N7S3uCXI%l>z8DViAFb+nql!N-#3snI7|z zQC^}0bSyAvbOp3H-~s3o2k^M~^y!m7GAc4ZSa)#x_K%GIj7z7pe`1`+cxU>uPmJ!2 zP1E0fVzgjh=8Ba{N`pPJ638|eyvv?Y?jg%}J zOcJ2+3+P}PM2-itiVk$tFhp*8-&aP^+R61_86`Eqrhr<~tO8Jnaf9{=@jw~~U`^nL z+4K)z8P9Re07aQ2gTR5d?I*r5I)fH1^88=~Ewv5&0d`sO4@S_@cuRgTg4WcX`oX9+ zy-tG>babe|Pey&{(47LS;|B&mD6lx96&)arprV5Xqv!x_ zRRIrZvx343UUYyoD1gTLk%|sBP!~dh8B!F~E3kobs3WBCXkY*>7-q~;fT#gWLCXg) zTLD($z~mdiYC#7MLDsZ^Re?$o(Bf-EP6t~d0Gf0L?S+Nra||t_p8lIrR~A$gDX@Sl7dFt*JdoJup2Ez; zSkF{9y}(^SV)}$bysV5Y(-prl3fF^r8lbJAsO6&pc*dUzbO<}tW){$5E(g#Bn=GJu z05qitTCxt41&e{VAR54nQ?M9luO;X(XNar8rYM**2Y}O%0*hn40Vvg60F6gMYd(1W z2Cw`C4nPV{T?P&%CPzMZUPeb=P$dmoLRJ7-P$f_cTEh?qIw}}+wvpw8h3hUwzx*wYwyPOm!$K9^_DIrh7ZFQ?Bs z&mIF2l$g$cfqg&YmFed%uzNGEnJ#^i-JWsH^yrK1@~lk!^^A4X8!xgeO#h(B$TEHP zMRp;<`=D_Fa7zR%pC7}d(O(A%B9enMd1ZXcN`0xacEF}(TG(qMm z6d+6dB(fY0vXr<`q%=U6fr52eK(@|-W;P+Z46>AXA?tUP_z-&dnX()$vXuB0m>nN5 zWGM+um%G9)&Ls$%EmKewQec|ScvVhzdhBa%uIXZbndG>b6@(z0l?A8wU168zgp|n) zJS@}QFR?ERnE;MyW(_6@kS9Sg&7cS_*_kz&LFR$i9f77%K%1bapq>^Xpa_~f;>dDD z5_e=#WS!1+iCrZURQ^FG6F@CFW>68&2-;r9_KZhA~F&YmO>@aK4IuSl5M&{`UuCOaWYZ?U>P{R*2aXtOu6?S=HaIFF|WC~N3 zB6#H)+jOO?>?+gW@8RQ#VJ$&)^%)((jV&g}ge)Z{aAS)NZBfb;P>Yxqe!w-zRD{#G zK`RDWpmm7?1NYJC?AO>;*};jA$zi(THFhm=r0@l$N65hvQ>ITZy2frQ_yRQ6z^uXa zhFOUP6u!*cPh4YnW|V*g1tVnU6g<%cQlZE;z4s=&1~eHk@-R*pxxqe*@zwP8H`u3g zf&)|$B zc&jCd4_YWB0AAC@&o6uA`G9qY0jLFeh$g69hsA~#qesUCETfa4R^>D`~% zHR{i>g1y5I^3DlXh_`xJl{g%0viO*o8JV~h*g%uQjvF_ChN3N@7fG-=&OyGqiw!oc zIR(@SIRWZ(nK4ZOZNO#&9RXyX!pGt(+iOJ26m8FZ!jS)>SEJidILSxiw!i-2szaYR8nw*Jh6pckzIii#M;2F z1dgR0?2z$&CI`?OHqaC^_#7~>4olEBQBYj4IX19n39JDLg3haDbG!fv7!Ht09juC6 zAi9NBkr_lcuqrZ6-*J~+h6}WI19YaY0>^ZLuk51Y+@P)x3*>lt@WKwLB-cH5C1k~B z_t=%{5t@-Emlzy*Km&6;pn$)@1UiF=OJFHzs2mh+pyM||HXtjSz?kKz0SzS3IRwlM zN<5%)8XStC`iaf)1`|jLxZH9{jFf=X3QGJ4 zLqSXIz=jHBLAF^7faO4KkOxdkg5Z7jY>v;FvJ?bBTk_c)-!o+?@I#p2nX(l4z)UB{ z|4dm5ykNFtJ9Cx-4~WU&2yU%_4%UYVuqgVUEpsAI#X$$W!J5wz8r19W~0g8~n@ zZQ#fXie)a43qhgH1JXBx72H^20!6_Ra07AylE@mc$O(( z4j@E8u{43zoC%ayK_v?)pK356C2cNHF`)nrAy9P$E-w|pc^i|G07P{XUlxV?8O@R%3109FJHt>-lY#K}tm=uLTy6=D% z)3Je4xFV=Q=E$fh85|iwi&Y?|aVQ80xbA~Au{D_=FgY;< z@v?(__yWQFz!U(|%;pF#OF+>f@UXL?0kmbD#Zd(83C9bJ)93$S7iZeQK0Tk2LkvV; z_`xn#zkwap^o2HX*c>M?f#M0Y0|UOdf(^X%5?szX3cw>B)`Pq9(Bkq0 zXf+79xZDADAiTH)^?e`~!p~NNm(@!^=0eNr1rQ5&fXvwfVQ&Gk>sNpjp<9kxRxbc4 z1Y3Rr)pAhuYcTC$QUb4HV$)#SfwB~ZO@rwS6L={Kn+DSfCM9qpxWEK2t3kTz6@-x2 z13}6ZNQDH600vNA0hKNgLC6pcSP)dsKm;Ygxe6=@DsUizkoG!Q5LEO)1T_#U`WwLk8J0$XOy zhP2EYWIwo8Czw)D6AGk$#1$IgVhSD_jG!_Yl+RnhO&nc#XuM#|st3(GU}l{+pe77z zfPk|gG(a|hCN;2TThyF`2#^clLK>cJAvtFYsEGiIO*Rdt4WPmg9;0j;Ojj5cIUvoP z3!v*rLFFbRJnMi5U|AsNOM+T7pwVbhs{*nX1SN5RTLJ>BK&p7S;Of}G6#|2T3!4U0 z11o3@8MEo6z~IWur2swo46Yy4j%6@oP*7k{;4}lD@WC;C;&XOY18`N>z?!ANp};Ay z8+0ZL#Fq`=Wnz#B1FyXW2|G5hPM7=7Zd4C$41sEg23B5B@z?=wm4VK5g*M0#tv`_S z*&L^U6)1v+StdZ3oL~c?8o?n0_8oHQfPLx83)&UM=GemuT3qeOSLn#*4qB1O2EIfa zrf~vja|$9N9OtlRDS?im0iCnW0hv()ui^kZoQIPeT!q2z1z~dptz8E1Y-4i-5B8Zc z{a{pJbAl|GWOJOb23)LzGMOW&=wbS>W_tBYb`29y=R}Fa@joM|x?*tT05u+1xfR$Q z>p@pza)P!*u!E{?1Xkdfe*Go8`t-2Z>@J{zG0=fl?2ZbMae#y@B~F3mph$x>?;%ZY z_~Lg^p%02Gb_Gs>Z=fk*P!MV|H?S)4I57o*8(5&^1PO6aBNg0w1`UI(fUR|Q1a~4K zbvOI;gRj^nnQkymzw?S+$-03FR?M=4szZnipu=AbpuW=qa6JO@KfI8K)ai`VEnl9|f!5}OIwPR%tP>bP zp`{=U%3|z}N?D5R;5G*Xc-Dg1QNa^@hZJaXW7->bx%vjyEYJWRXt)wmR)g&Ti3)(W zLW0l#frWz-H>jD%puna8IuD2y)Vl;F;wj+h17|q}PJxY$po4+fG?*qZLRvsG7(wSO zfg(wfT|r2J6EtU{!~v>n8d%Na7#I{dKrMC_P-_It5y(;ikJo@X99at7P#Mtu6O36( zoZx;Jvtt4%i7-Mow+MTJ2LV8BX=Z3!8f5+i#_7M`uuEEefJY63Be=GDfh2%jr7?r= zNn~&YH-aZHPWO4sE)h8e+%4l!5K>@=uBZp4Fdh!j#5l8~yf-4@aKOr3^k@W?!|2ht zfgKW!8`!5`f6H!U0g6UY;*bE%*swcVf$KhSWPn7$qp9qUMyR43SxPL^9pABw)PwUD zBr_ah07V?L?^%5`vGnfDgDr8gBtP?*cn?6p8z@8Vh4RV;yTfBkY`k z2hdR@CoVff`9km7?MdEaXk0Nn# zF>`S{aXN8SOl1Gom-z=|^J)WQTFDg;G$15>>MC#(etZlHc)QsjiR z$38HD%52akF?f576O_V1*Bil8ID-@TY&mdM03CG_0;RzRkbnV?GReCLAqAVpe~OB zL|r{-ngUeRfCWLj<-rQ!bp!C~VBz7UKL8mOSHVQh}|D;UA;AaFuH0v^%bfFyDTEV2VhW zT8GT8yzHQzpP*fTu%Vp}(54mz9)W$Zk(~+5@R6Mv2<8H2=*SM}Zelh~<_>1ek(~uh zSqfZ^A_8Y1Mu9Rps1?Nqx_TBqkq2rZcQ9u`QXHt@fu%SFu-8DvB}45o0MYXRq^<#E`~`3!_5n6@uD}M`pohIf zTfYZn5VQo{0Ws(T$ROyb)EN-_07wnG<8<3DEL&2Dpj`7fBqTG<<_GO9|8tgKoiObz%VBh{2%5uE4m~=>mUU ztrD*SuL66RG$`HIvq6u@XaHS)E|Dd01vIp-$N?!dpgd;SnHr!ie~=R^KqvWvhAu#} zwhRiakVXJ_iW5}vgKjwZis<`qU{zv=_Wi*z%>$mG0+rKj-k@3+bZ!UeNC-rW5@rZ^ zm;re>fCIGannM9xGjcdFfxG}}VuFj>=|2D1HS15Xf_rb^el28B8C1zadiG#J&TQR}XF2uoOYsypV84Yxz#M{m(8_ zzk!t()MwoRt}j6=0{B3+;ucoOdNELu0kQZ9SOKV2?05jeI0)D&QfO!;&qe4FF13@Zug^96*`?AaQt+4-p6FOOQBH697~*fJZ<;;ySSQ zBSbxTCJ-cU0urwWoqGk5umNRokc17W4+O6EL5;Kxtnd~B(-l^8rZu3x3#S zOkuQQXkc{f#Uc=;DNUI;ZB(!kT{$gKwO&Kyq2DWsqx06a(r%Hg0hLXa})6>v!aDmB1$ z&IROB1GKmglB~g_>k}BKuVLYksGkB_nhZArQfPth@dTMp$VO16aYWb&p5R5c6XZ-b z4W>2BAQypUSAh1~!EIx6+*1!Zm4X3e9cb1MRbGRs#F5>d7aYwJSpwjp86H-!u^7dd zBcw!xS_Lf>5v3+5rGUyX(4H31_&Won46Ek>A3Y8lZB&7~k`pu~#)9a= zgBoby2w_Ev5Cx2GJ1B6#t50BldjZ-=1viz=@dv2;F3teA^$W86^m8BB#Ur6>x7ZvX zz=xZJ!AB%3FbX^YB?Lt#1txxOeg*~5N>3(%rywzYZgHp@1ttY%foC8wMHU4Xer~wl z=hG9)IHE-0eJap2Ig6trcw5D}GLBlNmW|VW%Q>_ek58{G=U4*b%2#k0D?&6dy7IDu zwo0=putI8Z@XZDsS&j=fPA{$i>DoTOfErd8q;L7y+S`N7sup0#~g9H_zRw^(+Eda|YvMPX&P-0bJ5;zA^20E~c zm7g1C=ns3CdTuTT1qOlhAT``93F?S(v>Dr`Z|LKYVEjD&WFLn*B~Dgv{~&MLrN5xnH@lvPAaiN z6bt+T2`hl_ZebPZoo?F0@htfZNDSmmR)Gm16L}dF*cI3XIzenuBU<1)NPz-Jc9s$c z!~jK3fiAEtmm>#6R*~CL1kUDh6o9jN6*vSM+Nam`au_k*nZB`?Ly`Y8$T(1I23%L( zo&KTSQ$cm$_V!n6OvDv zk$lSH$N=F@pFe@aTp3*(Gmcjkp;;`Y!DZLVg|hWk4d0?dgCMx1IByPH%;O&W4t^4@x5bDl=5m64 zqrfQ8IbD4QhdeJNoEa5ZN(u#jP7j{J;U)_S7I;W1f#!jjOF#*UO`vu9wiz6)jGfbM zW^x1wfz1Mk49G?$c3#Hmi7!MXrf-|cpvz3W^rgSexE*b7Ke%(*dmalLG~!JgF2~j_ko9sSL-JAD6t{@p~REzm+V{DnuGM6KW8sXtswGJBTupU4a$qJ~p@;I22eE*cBMFK_|8`L%q!oI#)%YWqR&B z4nxHTkPW=x85(#czzVmGQQ*$>{qr~i8QZ4|&gal)?40g6pF>$0>^LQMGp0Gr3hbca z%_8t2Jn;Mtium^V9L9_fr|+K6p=tq17|_sDWCtCnz^=fozzFvrGu%dY1!e(oT?`8B z=@JV#(iuCqH!R@LV0MF~ZdSP8kkW)A7gG3whEZ5R+Cg4Zf`^X+W402vK>PG}i{WvF z-7F3yv$#M9+6uH!cU;OLGCh6?hbd8h-@b%H9#^gKW(kKHG^t>(6;R4@1x5u>t>Czn zL&Fl{e&gEVN(2Ix#kCQoT_ z-=>~H5meeT3fu?jRbU3qDYEl(!_-SDFhepw_akOTwt6N9L?TvT^yP)Nl0aG&8M&e5 z9??k&l#p0J`EL52l^hNx;E+H|L`p0u^-E0_)Q{j%JZ6FJ=?1GfG{qsQj2+=NMP>yi zfj`p=R&gjR!`k|wY6cPuObYDqFa@!1Pv5qRLp2Gm5Smh%5aubcWch-d8Z6LA1?{SU zMG-sbg2QYjCb*gG3QUlAf>)@Zb{HtB+pgx2>0&dm5uoiy zpxZnVE(X;puAtTK3d{muL7oD2MHmIZ@dNVzpEVp(jMJuzujNnzZ7p8QQNnWrG-3xD z_+xauIeph!4r8V#8>hct%aM&Na|>BUVfyZM9MX(0re9yjk;L4w>EQH>J6I+8zkqtr zjx3-P)Uq6ZY@BZ3%Of?tZas%G4kbOCph{Nqv2TC7p2LQTsb$M{?M)o!j7ZBN|pF<>|*R@WME)m=wW1F z=w<9<>}Q++I*89{!a0UIer^RuryX(-x=$QJe~0ofOF{S(WFYius5p#|PR~|>sDp^t zGdguaHTFR1qt*}w%c1lYBMASgHiUj5i=AF73K4&EkP*VTb_eS8haaJg6HlRx|H=?0 zXX=F@jM-ce`WTdd21?I{8oK2#)X=+7SAFh>3hWn#=-ds}(GS(JfD@5>S1QfLO;IIX;z>M=yLl!~}fzfaU6U88U=fHfj;5^hFaFOl25GB+9LM^% zXD`RS`tAG>`591kd!Xw6a6`l&LHTE(QU3(WpCtg1Uj|i2h+YC!cL$ZOcY+B_hDwl2 zPb5o!J);xM!V}Oa_ymm;6Nm?mArv%)D?xbcp($n$h<5tj%nVK%@1gnXH`IhbAWcrq z8zHjrD0|9K2iow?#63fbkx^oLLjbqP^#8{=3K)-XFF4NO%ffhk`@Yj0YuWYQ>;{!~ z;KQyMxE;5Ec#ay5cR)1!Sj?V1pq-zljz{)PpLv->)`18;3S5pnj(@A9I9@@7N1olFxv0W#Nv!+xI`_n8w1maeLScj%!RzEB0>Jd(C0R z$hdfV<{OS(j0>l$yyd82Trz#(TMkdgMblru8xMTXtj~sg# zcTG?G#9;<9YThRfV~ZpEKoR+37NpV!9YqQefd;<xp1=lsl}3AZ5P zGlvA@%jt!mIeKMYfadVU z&p}XwMTPPD^xoebvHWXJ!!+?^Ikudf{_{77bbTjSPyo^hngim%ZR7zRr}pC%NRyzz zZ19{XXqPDX&@vYA!BmWnSHRLD5bZBO9JqEaZWNUpK$4D7l}A7vkjm+k|8R&1OaO5m zp^jK^>frSCZjxft&;H?%PZ{Mu;Y=Me^9SIgWad2t|XDQDbkT1-bG!&Q|A5Rxx;WU~q&B)0w0(HNI0uyMv zjgA77W6z1{0<4^(DxkG2OpZ2Lpv@tmdx|ktzBvw7IlYIGQ=I3_aj;iG=0Aa$|B#VW zjAsHu_$fr#l!;S}=gu*>>SxpAm^l@vUtr`EoZiXA$<6;9))8QGG|6&&K7BD0r#{aH zhz5{DUQEBo#OcTQV!AFfrz+2lqi~a6fJ_SF`Evv=@)Ba@J7$oT2w`vlIAZbpmLm`! zRk3giV3GcF7%Z&<3UB;Da|NPu`Wx&9%>heKVcu~Xami~6W5;xTHcok_hBMm(*f@1S zC%4tIbAoPXJeRJ}Kxet)IXg@GY&= z7>`dsz$_ywa1zw{QUsl;2A;z`KK*Ww!Xu^+?b8qTD!c&Eg7r-C)601|?fIXa2jv)H zNIv^2j6VsP7)3Zf56PYHQ znSM@$(}MFoxChPT*fpJBlv9am!`bP^qMV?EO4CI-=YtOR664h8xdC#K0_c2ef!WiY z#5h4Wxps(g<}#j`{!NV2g#86bUSQ^QLvhY&Ad^pub6P@8W_IkF&Mm>I3^Lh3g43Mw z#Pkda&UD5T(=SMHdNajd6Sza`1Jjp~uI6Li_{ zZbs|v&!jndK*xrDmf>_{JigsjmQ$J0rQ-r931~Y`xd^H_pF=86$1g07ECSHodX5iw zfs`0HP60P$U`n2W`izbWj!SkQoc?APqcg;ojZ6#Lr$64!=)ib8L$6N^Wryo?{ zlvE&O*!EuvoEycpmw=q($m_TfOmjd|=pHcV447nt6#jcI9-PkTBr7rfodstI$_SkV)#ae0T$r;I7zIGQ>5`6|QPYjA zIfEHbOmDO1{KYtJd!r4fC?n&v?bB^JyO>z#gY-<-wdWL{ZtK9A$GBko8VAmJX2u!Q zd0aT>FfN(C(uFgealv**S56*AQIMISOMnhAfNp4SV9Zit6*#$F$&IrcbcoqHcg~ND zC#Em(;Jm|lVtTD7h}s_I#mUadcw&2!H-yge;ml=XoId@AALo0<>Dy2Ea|(mFcLKrO zGeMj?7#XKcZw=vm#yD+yPAF#>3&_&xGQpf-(`CXq7c!pMzAub30HlaNg7ZD&wC(>R zI5|Mpb3}3e5vf0q_+>4QyEgC#Q=>bN*wTK3yb+^D5)??XO}u--C27%;Jog zZWPa1!#HjF`gqQ3jMJyLC4i{yv5B0;AU9o1=Dfl%IXBIeG7^X{jat2N3 z$l+YZIDPv19I(4ub2-%*8K+NQlLz8XZ_4MK%y?qDSOKRVIXyrwyVS(FmT|`PhGxz;s-PGHRcxSS!U$T81@W~4 z6XWr{8Vo3}ZaG-K2xl3KR_aot)1Zr*9AM;%owO zZ*_BiV4S}FbPwlDQ0S)ifkJn?RX=Abh`V6|nAC*#Fa(-l-w%zFz#2c=s zA%Wt11}toUmXi&n+3g%yc)QpYTwM5 zF8G+!o*$O{C$MKJ$O@d?9{-s0C@5auzv48U9`=;;Amg;@jyzlj(>1AtTon#%bHxn7GtITs>wGcRDi**Hy;p({HkHU16NQeH|;89mwNv*|<_bbPxxZ zBs1f*>5u@}?#Khto5{-siYhlgt{}#_(`WK=S;?%p3|dzPT4T)O2;Owfg7*A}M7vfq6O6TW< zxm+1fY!?yXx(edH66JDaJh5FzjOz!8t11DO&6ePr%EY*GI-@k$f(~geo#}qkToQ1h z?H$rwCzu#dOb?XfddN6^y0JXhKgQ|XjTE@%fGVo)!U9H6Ro^ks0Y-O$}F-Z7A zu0jMISq`ZurU&YBg-$n6;abReV)`W&F3^43y{cSq7*A}kQsasM1?XjUuB(jGwy)IS zx&q?XX@SExSepw}C28q^sO^lpT+Ej~qD?cyd}W+12gnR4v}9o1|GRPEZTn8g3Ex3am92#Yp$(~$G0D`<~jgMrLDGH zq9A&<9hWpHfVbOo{brmoeX|2sG~==9{El2IlJF?zWmI5Pldg9bLRTaIAi)w7qAgqUAaOTk8S66ntonuS?Oq97 z!HkTHx6e!DI?N<<1RN2Jjt#K0^SJrID-ac!1XgXYP2q}VWSqDCb}H9*Mzt+hKn-Cb zNY4l44abFG5n&{e8CRzNNayloJUrbggUg5U()9ieE;n6>B}|S7PJr8m2kf&PnFP*& zZDw*b0F@XZp#zLy;q6SBAX`sNPsrkW#CT%5b2isw#uL-kbGTv{k8E$r;SyqGJUabA zK9}C~qq$t>j7O&b&E<+zy#zJx01wza&MbkWFcE&R2v3&4(dpHBT&|#dgz~ulK@7=+ z=$D%AQov;|3^zmqtVI;05sPXC$zAW>Cg}cA1zR53pnj zoS$ye!KKM~VR~E#moDRl?L8e_<*bY+wzKqcb%RRS3H@B4PDjH8E-jFoS5M^91PR-& z<1(DiHkoTbN&s)>EJ~B?< zer5(2xDA>$3v6`MY%UH)7EokQUp1R+*>s+{T+2bV;UX@>>390M7Bfzp4mNAoJg`}_ z=5zgHoHpHd9jGFJ*}ZWgrrqBbgVjUrZe9wuyL1`EZs8SRyO~#VfqQG*tGN6?-g=L) zbi4ivtc_Rer#=1r)$H9)h`RA8}0w zab2H)xl&KLesVINm@e|3Yaio@>6hPg?PWZ%ec}hMsUSt_pSV6TPTMZ^nQJA8d*ln( z2gYgJw|)iHsne#Hedl`1IBk2%4=y*5?CPIj#q)k~@q$8Q&2O$tAmRGIU`+-8Ac3^x zKbJitfJYZQjUhW$p#q#`Mu7Ciy9;mZtF9hZq2y^p;Y;X|aW&%aOz8d#^#_7}f z)wxZlM~HF%0=2)zxj~u3Rf3xbq%uenV*E2HumRVlxfgw_$}*8tmOs0r~;suuTt#uM9BwILSn)B&5ZN*Cgv zW_>WX!~kMsqaj3Dyau zxPO8))!A`hWt_G>#GZRUh%4gAeVcLG_79HS1|Y7YGxuH4sE0GeNFi5lS&%0T+_>*B zPT$V!&aJ{cJuZNoW4omnH>hOZ-s;U=0V@6e`EbLEJtoHkpk^|tz5#X0nL))~kT16; z_V@s9UrrI~(#+}JHV>(MX_bSjJ2bkI(6~SEy(taiq6#p}(--+Tr0@5DM z{c`&0IPUuCoUz=XPMTsY_e#d;%TLF0gW5f3;<)P>r%yk7om+f*ay<88#%bHt6S#9g z22Dxi<^w5NoW%W^amMuN$zYY@DctKBXH7qz!o8Yt#`NM;ZcyhgI*t1)D;qe z8E0&NlfzvP(wURT9mjPH+|uE9+;DaJl{{|HAd`I=_ZN`#`4VpT?VAd@)j@#*72JNl zggYOJKOL;7x&lQJNYH!w<7)1?j3>4?)^NKpGM?Oitd_e4q|v*c`xGcL#TvOmwFz4j z_ZCnj?r!FO#yEZZq89F4kgPx(C?QOL*2ZnkcyhW@JNGWe6Wi~$bA!vX+)i##=g+B& z8#KtVu#3A6R5&a2a35owHvM@IIFTIfeg76W9foEP)f#edln0VVu6*X)ZShNVE4m z?kL8S)0fTTe#UrWdhdMhr;I127cbxj4U||fWjMJtUEa$$)IBmQ83UKBCX$N&zL{@<% z@2mnzPT#zm+nVvz^!KZ|pK(Im%&fpT-B3eZc>0F5+;-FT*K(&~kyyfbVteR1?tP%> z6WPEGE=`p-f|Bux?M9opdqIJDU^6&6H*Dcv2ja$W;|7glx^3r72@$xGazQPA8=;6&qm8InM9 zu7DEAcE79Kb)b>5v)93;)2bWX2S9$#z6C1ow|n2_J`Lg?e9HZRar*WjcR`A$f%5qs z#%bFjilkYRYGt+@<)4Setdox|Qw*C5hZb?Rw4c9$`t)@_xb2u;T;Klg2X`%_Ll26btd0zhKfwB+UUFP;1JtjR zbnF1p@bw-SKs-lF$2~Wuul~hd$#`nI>Tm9Rra3paPy5Yn$H=ti=5+Ue+0vB9I!u3VZEs=WsbyrEb9*{78;=Q7&+X}!Y&_v0dJ-GYc`nGNMK)Jn zmgxuCc|@l-u=AKR9$&tLorjU}+Vq_qJPwSfrvKvLk>m`Q*rvi(>z3C=gJVA`7rnhtPlrWy!{)dZa z8fd<9G7pb~*gcR*3ap@>Ea*&8P6Yu4K7qT_U-IxMFrJ#u#mkeyczk*>FHbz>mjaLD84Qs>x2NZe z@Ypb(n!ZMaN0ssV^h+W<%NcJ?uM*{%z<7N-w-`?vqdeGt(AgduOfHa%i&-^5dtsrj zn?6CDM~?Bt^z{(x9E5r+&Lao8m5y6MKmp|76VoLnc%m6^Z7-GJab;vYHGQ`vk0j%@ z=~pFrjKjco@N+x%+yNy@ZO0pTK@kF*b%TkXKoNyRAV?iFNh^RNdIeYwBy&vv5Gy5$ zFm%V=>2*>(4;W8PkC*1r;=T%wKhRdl`_rdL^Jp`kntni<$As@XSR5R$ECTnZGs*Di zGM<`lAj4D7cxC!W86L6e$7Fc4AZ$knWhkIf$jb@Zd8Gh40FhAutk7`!Qdu5;sEX;& zkl5;S2=NR!TW9(bIUaSMD`5LUcWa%vGyS?8k38d*=?w}zV$*r$c?=mZPq&xnv4jX2 zPhTU?BZekqpui)FBIJR>GoEgyh^D}J`c6zC8zl@?`{6?R(^-^xB$;m9nJ%x)W23eM z6l?HNEkOlF#}{A`*!m-01vbYYccwQg^GGvw+?_s8nJ1F*^7J3dJTi>8ri-fZEMYt` z9h6|C!O4JIffY141i7q+pIZTB-i*83KdbO`GjeUX2TCB8j&tsB?@;4WXJouNeS)t@)|rUi~{$;fyW6tK%&HvL*T^rU`?JHMlM(i`g3plO)Z|&%y5A-_ouJZ<57uy z12R_tl57wuX3c$2@`5HqQ1m+XfJLAQ&JpICJz!C&I#AvK?a5*R?apFQU=z4GU02i-`xTh!k@R&L7eFREi(7{c}eKU-X8^MA+kP%Ns2GGG2 zjE*b7f}C(c@XD$wkEY-9;gJ>i@epJTXdxR%mSfAKgVS}LWu^JRf}num$#Q)05VX22 zUGxIT81SkQ&^i#1{IMZO0n{{y@HpGOe=YK)*^aVAF@_}V5+yWT+6 zPS5hgYS$g8{Px9uJPwQ+El$#1OQ4shMg;QAVw(PR z`Gp3?Jb_G12cJ#%jO8h0e7k*jEKdtF)8A*?9TR!xfOXtY;hD+A_#^}he z$iySe?YQvy^ao`;>V^<`MsCMxP`av#~w7xw7ibT543crj>n1d#B|Gg9?;#$`Sm=K zOkW;v@2cmy3~GtQHS*|!Rs{F7^6UY%Y?ukJNCQ)#XYo818)F>Eu?{|nDb)#jD8+B#*fSI_w#Twt$8v1 z;VhnH#t+k7XY(k?d;pb1ko`c63QPj8!RPgX)|4;^e3;%in@5Tld>j?G5(DT$>KD`3 z&EYBHX?X=sjS>n>j#H-V%;j+rfu>IlNcsdVs=D%WI(SjlhiR;w(_c(w<>T4%60U3N z^gVNV9I@z{0oGNVdIn^JBPdgHWI5gdap23sz}fu(NXQXUFff4^je?FfV02spmg9mf z+1UW%!1aPxkM)3r93=#1PjB48Dmwk&Jf5lb2i}0)2FguW7_uBUAh>53vK$v6xJMYW z92*c^n=Ho(2%brnL9gLF_-s-W;>P*jTWXE{DVXuR-xy5a(!Caw!0lR*{NtLbYO z@RY+_`P=Om^893BJTd*Q6syGaz-2tbj3=h2F5|Ife*5O&^hO^kk?H*Rc{uoAg7t$6 z3!W^;DQ~A=SjOXoP%`1IAexddZ>Bpe=W#_S0huCzVoJ-~gVP_%$;xcMu$(86iD}E* z=?-Fi)3%>n#S_g4<;hK7+s3A{J!1`z8>4prJ5X`V=lJI>h-QbZtXcpTYzC8{DCWs> z-0%*(vPydUm$f`aOcLN63_ce>%aI4PXNv)J%z5*>>2(`;5*bfSf3N}6UwJ#7ZzIoa zwR>QL*dX-*c%tk&ScDx(nFU%ce|{U!R8T-~=K(F2T(F%dj`76w|J!-~ zGTnJQ{of9rPNp|+r+4n;>0~+srcI`M?BXe7JU)H@E}kWf$EWw5WZcg9e!9#a9(PFG ziEppo!&45*+MoCG>;;tu8xQe(1<}io^N6!Cy?MX=z*!z+W=L>A&evfE?G99A1C>yJ z-cRSg$RovgV!PT!9y?IUka~$Hh8G-mpd8I0@Ne4mgU4Bgw?DkZV+|U2lD)#Sg7NtD zV^?@UGs{6&d72qdOb@uuBR&1&RUQ!`uuf2@8=5hJ&NKe=e!BQIo-oGa)AO!@J$v>V zPZLCkz6xBi2t@JP4+k3Z0(2Xi?8zpF&>}(?K)2^-^rcN1*p+nYR~g;kBWc&uQTaWgn_f%apAQ>A4-^cC{2q@o zQ|rg+HTQTxH`*_|$K%d__cKx|fADGgpL;yg{CB{DjF95!!6#7TLuIxNupq4T`g(BshR@7m;5GWaU>WFA#3^6Fi}y7+z>DP-q08!9 zz)GO4pAVl7Hh>B=o-D@?pQh_P;0dw23=(qWcDw+lL2hEna(n>hTm+LKAr6pwkjpN? zg}_D}oIcS)L}Gg17iO;M4<7Ki^ZfY&FY7itc|t=NzroN z$2`0$dp?3)(ZC3)drB0T98Z88ZpKugzy!LJ)p5$F>4qP8B(bU70?~|6xjpX#PaiYm ziRlv*`AR_L8XMzuE@eLX=^1NybhjV=%A>^0^yB;V=RbIkGrjmZeZxf8~jlVqK*+A=sS$N$TPfQnQK}xXX9MeV08`r& z*?40ZwSIgDr6L7^yP%e-0+(YCW0oVj*bK1P^ylon-xyC!zsCVKM|bR-pj))2r3rm z^MY*Met?&^2|PH&&s)UGbpOZn?IOJMn4bKY9xlqefa%?j=|4qzCoz5hF}+uecL`JT z&+W$Iycx_)Yky3iE5)nAwEf5S!&1B}8JTAMn4TxYo6a=v$MowmyhcomeoW_<<<+h~ z@dKPtVI?FF=umA(UP$SA2~CcLTR|FBAjv97BVFpitsn^!1P@b5D#*YJFm44gkgx=Z z5L1vq2n)ONGAf8F2!lnW8yY}&Y$`B-4*yi(RuBM53MmMHB&T1H<&|bUvHguKuLBd) zji1x?6nOO*Pi&7>;Qh-4Z+CzfI&VL%%*(~fyrALGbgvTOW)LbCLbX7s)w;YYpj502*65B==1V{B46DAY^WcEDuqyUAk<+4UeNaOX9l43 zF`eCz7gUR-8iFK24zGzS}_YR>Dycw%~ zSn&P>IVbT0ujuq0R=fg?C#IjY;%#RC^3a^%+l0 zKW+y$^|c+?t338#O4pv(i1Ebq1bf~apq`8a?^?za)1Nzlvg-DGj=XuGHmIQ&ugvsJ zH{MN*$G6M4^ICv%P^bs*ZIBg)UcB!ZPfS4$0&sN4HIbXUpVhoPyzfkidUZT_;k@|-c5`rrk{xBz0LIF=k%p9yrxWl zeons=!>iBK`D^;bSYEN|Yg2eRr|ZP>D#ArlV|lfhy1>$2Ox<8wZ2IR|UK2RSK8`n* zspr@Bd2zhcSUEa>fl8UaU(;<;cq8Fz)~4`wGxdUXi){Bx<(&lb)WbAhZ_t{Nblzam zIe)-e8q`?Y#|UY&^#7VZHJ$eY`mrqD zYQ_`O4{YGmV>~gvFq>B!)C9`rm0?=*XZr4JUQ@>7(?4eON-?eZvz<4GcM1#RiD?VK zxsh=%pZN6e1-w#>C#DxH0LS#i1-zgUsK7!nm0!rK3o@*bH-%}>pY6;=yxNSS7eIb> z)K*||a1Lk!6o9P2LLIMyz-*8d=u&AGM+Oas8ULqGr~`-X-a6j50)Ie~j-b{DN0#G*{|Ber zipWUue*lX@dnph8gIaG=+yB<{GJ}>IGq&(@gOV(78?QDfX)K(;tGGR?oi`ekuD5mY zet-(fZ$H+>o6H1SsNBnY0wnmkk9Q^GiS2XyLD}}i_JtF8)j*l)#1wE51J1qHQ$e|R zyU$eK-JrE69P@d@n4WB(zHt|?`1JDmyd5M*=kEo)t&Gd3H!kE=5}na_2z2(Sk(OZJN^4I-sg-brr%%AJCXTk%O9@hWz_6yIMl$P z!0N~hIRe|2m(j5uU5LrCrQy(auC=_3Opwk2s9(bZs^>u0(lZL2n69v%*H_>JNS`C9 zcgd3F_@m*_^hO(2DS<0sQD|fMLBkr3MB9dYy=;q%;We0bf^}%faYQ2 zR=_IG%B{fSc!vQxy368tq#c}@A{1Cay%Zk>7RNmh5f23xM^I=i=$KxAj8D>v2!)3l z7(l0YgHC~Q{Lpl$fx*$zaZU4~>7fUB3s9Uq{p|r>3C82o*$(nHGM<>;agZ0Z>fqEt z-Z{*Bnh#CSJjA<(8)m?brbE*e4)c0}4A{7fS9p5;VcuX6=iw1vmFYhY^C~hPpDuNT z*8wipaD-Qh@%Z$`M|f?ZVuu({OkZ*oTwGo}3T~wQfKc+sz&tkyl?$P!90NDUb{+$3 zcn0BdALj)%$IOoNmV?%heBc!o+yn}BZqTd^gQE%XC5togWdYFzpFJh1<_R<;^3`eQRD2G;KOK5SF~+-GS31nzJz2T>FK&3z%9bW54@_3C#JW5 z;GMv?p#xH}vSc}K=r}Z8^&@Ybz^P79Q35)Bf+x%INXMb+A3w@S2^;~7LPwOYbR3$# zK#EgJU_V$CbeaWEmgAESaBV6k0y-sP4_F3j%9PGS(*-~A>e+n(+2_dO_ybIX8c-}* zjtyX?6Tl>>vgOEfoC4-70h3TW*K{75Ui*pHnE7DGq3N4H@lInrG2QDkFKCE&&1c?H zu&~M(-U?7-^b5E{$^Df#g7NtDl&`#dn9p_|ny&nf_b>-Ilku={PhaqjS7o~2cV4mS z8sEXata;ygtC=r$9-1!mgI9|ALg%6BmOpsy7>`e{_`$m$qK{jFdHM!XKGEs?b0xW^ z$Nl70;&12yg%)TlCg?Pbp6QKm1g-g>bb|z;19Km`L4uOgKmFuYX9HW$Jw5+4uM!RO z`^n$Dsf;J4>;K`sz<7MxU*1~gOPz4(`mmtP`0T_Ufc>bg!0c#{<=6v`m@D0frpI&efi}DQv-62hf6Bop z$arGJU%@}l;;*yVB&TwIlfS4#uM8oDDs6cF>RPQ{h2afAc(e9;oI#C$=DG4V9R10PfP^4!W=Zr z44Mm^1mfKRk#JXFS25jDmG6|u8<0vfCZvhdDU+wmtMRGvESL;#MS><(pH2@{<8zP# zt99fPSPtsTDlmaAPhkShgZ-H_eYF~&7P5|K(;uqwStE;p&Cr-0pw7pS#nLU4rx&a9 zfkq7GtMh@zxDKiF?PWYZy+MNyH0ZKGgU^WZ`1H#fe4$)Brht5?;&^AubR$i^olG;P zOnQ-{=QZMc!!!fT51H<7%qJ((FddX2pbLc*I23pse@vg=Xw28hczpUk8$JmR zPS9yoECR=;-?QP9pYCMBC(L+!x}Yte!uB!~J{cyE|IUQ*$xYv6#-|N3`o0;TI@cVi zGxtoLE?~|#0j}tPIiEgA(MNMsMM@TY*?N0GPBCLT0J`MsZ8P{%_Z|>?4Bf)Uy!3bv#P<m6BM6*;glE;gg7NB z#5MhWk|4+SWGlW-Mv)bu_=Uxv0_dXc8B?a&@VO&Le4q^B&G}S#<&YI`zvjRf&Ippz zcj8;kczpV8Cq6gEC?GG_?B(+;B#Pv`#8aq&j=&~3ZCgZ zJoyeHC#hyHzPlhvP;kg|AqNMNI}|`yq|TT!eW^EJ1vw!BN?OG}e80f%^yPa5vM}F} zPhz@WG+*fS1ActVKq3M$d`1+^Y#PRWNuM6Pw zVMIzF+ph%jd4cn%LNMP;riSU;xkLE&!_r0oQ^WM>Ab<0+BYSPSe>mSZkQ93apSlbp zxnS|KR|H=Z1zt9t9v;be1LSYRD89!aD`EbA0OH{G^7gJ6z6>TFXmEhKMen9B%oZ>L zg@#c)-*b?W`M!Lj+YJ)?M7*QYZ)D| zCT#^a1#ZU~DEXg9f!%QhO4-8$ntGctT|R?PRJ^6-a03H)40r)!mg9pq5bs3y;pyHP ze9oZ2n2^Euj_JgV=?$5DM;MP!cg+Hq7pYl%YK+IX_hj+)fir|m4xb-LRZb4yUF2*K zoXhtTB)&h1PeopaK+rViAxczkEy~v5xm6r)rK7*!!SREOy z7#Miq%?#suJ}t)M)8pz-mhBbf8Uy0tFUFXqHX^4Ie@p2n(P&8ho?ZgXz9&r8Pg}W@+lCJz&SBe0VszNy0EGxmep{A`Z%AT*>uzGVOOf>(l)(;Jrac`|L8GyU{(zL~xc&Vy9) zIlcqapaGdbU{=oskT|F(&ywXh2h3RmCP6|RS&nZ(PAQn`zGb z>3%EuCfZ(D0jj*X9B+YX(0CMRDHNFV0Zf7hz&NrTe}Fk1D?zG34gf8sTseJ$g$UTG zYSRz+Ny$yGT*arF(z6d7grFr?Hd&5;_QH84S&nZIJe@4ZI|!aimg5-&PbSN84}vF> z<+ujHTIvv>N*6#}tLJ$t7ouI4M}ngg=Ykp*-}@XD0}3e!)2mf)JsvxW~eP0zTO zPiA`d0WopL6VvN|2>LUgn123;pbO)P>0lXypMnyMC#HM;6a=lTDEKL8HeGZbV)SJ8 zIzG@IgbSi#puwKPY+iL%9q@P!=XyRJ#^&i}>-oY!n?*sq6VrFC=SyHbFWsAXM!smq6Whx-@_`P$nI7;>5HzOK=phLjFxnp=1sdpiz6m_uW4KR1ixu4Gp8j?d zpEPK;JWxt{y1+LOb{n4uXy9qtc0Oas^dacDRpdGM>F>6KJHb*r_$)yS6nF4}Mp3JF@I{C~?BW(= z01ehNID#h+wm$=@1FdM-#a9eEn`alF321@EE|7K8-|gaC#&}}-)ZKib1rtx9^#7?c`y&u&V<#btd2~M zALea$I?U(7#MLk#l&cIJCoGsg;V54*&yAhnBn+CxdN-Z_7@vvFiCrMg;GG5xph+;; z4hI&;C3C=PB_M53(4FCLKx#p&n?O5a9KY-WPk|{z)gjH5LDhk50nL?t*)@IlF}__) zR~Ae!KhEbZ3e|u#V6tVwq3IK+v5HLZD-q$J{_8kjux7_Xu^8Pl9a)7PB<2lR;(d_@S|jIc^rM}ZMEm1m;Bh|taG_FVeCEI?~?&hvqmp>~}I52q%a=M!gk>{vEk?gAgE z05H42*Tr~Z`oRm}A=GylKnZTU$wfXtR>l+4o3DX#-}a@~_{@YEk8i*8lJAfp)0QRM z7yRbyVq}^!XS&W`K2@eAbEXIX<-5#yV!Qf3z7iqEDMu&dbq?L7Y#W+iw+2G0`9D6lv} zQ@(@(3&>+%c1_p6%P+p2`3k=dBQdH2ukuR}qYh;1^hHc{+NO!E;)Vw6aMAI*wyirKad!8zn}8|N2p^4)h99v%!o`6o~-+_Yr4W) ze#z;k&-u?1t=RSj|5V1N>6c$1CnvB4piOrwP-yzv6dhI`V1ypI7|1VxS3F1EL?CF5m5Ys4$i54$3Fq#95zUVvmqj!4N}T)*MHBih*WIgR5)G# zJ-_7i?hpK*h%t5kM}8MZ#-`~{KJi<_)JrIU4d+pSy8?1mJ*YM2_?f@S54FeuwG&ZG zWj1&T&jyPXd}a!M;r{@$TLWUZ48m>+1!xFNU-u2U<^sDBo4W0>U-|Wk3MnEDoF4m? zKV`blcmDM-SK{*xIQY$e@F#+j^voapy)aGq%F);V_*JLx`^zspz2PUntLTR%hZ`6i zwIDV8oTVVnnx)%s{p6Qq^v5a(8dPin&G&)Z*RVVRuV3+5O>BFh<~RQqm{;&sLqUJ| zQ`HfUvjwYzpk4R>HkM{4-&O;&UV{d@`{I&2*c8M2B-04kNPu^Dkm-n#wC+ z2y+k~UrtRB=&UE`Nl1AJDz9K|ACL%YULm_Rv|xJ%qX6%~rH6k^0`*)QR)P8x+KxS| zr@!JBkeR-iSzs|-@XxC00W1PXa$rq$7DtgR$2VXdJ*z>X0!^`w2f%$4NyiV{K%&rH z$&N6y?|^i`hkscVSTvYq%$P(Ru^9Vj)%FHf0U4yskGs{pk4@k&>(jE=B%FH$15NP?=v77vu5@5 zoxB3m;MTrbJw1|7;3%AbXZ3Uqet}3(pRAc*AOS=_gt3kdiyaxHiTNXwJNB%BD4eo(y1B4`0j%?_fEWR{fizQHK!+ zXemvev4H$^BPjuWWOEn`7 zLHQ7x-r%LhjCI?e$qE=Ts)B>Tkr8xZEQ{j>hAhZR90hiMZn)YPTc_K~3+TXns)2}Y z7f5V_j%tC91A!K*zn?xyUciKD&Z6xn|7qs>AQ>tWT&^P2y6yzol+I>f_rxgC>UVHAlwTp)=l@&7SM%x zApqfp92{Plr!8O#iYx;)0Rt`Q2pA|SLr1_=6yU9f1c(VC3M`H{)=k&f5m1zPuny!? z=tv&i5g*n~uk#g9njYsbzz1^)l94_LbD)6!fECxr!Mr*Bags6h@nD-EPfFk$`nLJa{nP@dkWB_O$dqNV`o)UN6Kv;-R9 znzpPR1mU${Jw@U5TSuT7?xBYD(>rtpE!ar^o3dCn0#5lmqF6ffimtBMx-L$NTA9^dU*;wLWqZf@=fq3xY;x0>p$61!hnZ zay7u2gbu8qUT1(PJq#4!ruiU@fI1>T0aP$vH-MxbK|_Jd$f5DhP{0w+pR#tkr4dpZ zxv+kEfsp{{1cviQ0-o?P5hAQK-Njfylkvp%JYxYhMow_>DX=*zfD6&>n@j{a8IcV> zYARr;4b4CejEGWl4kM(PG(i-T2H;{+(M-S^l-}da$kh1VOu$eFYGVSz!Vm>`H){ga z?iP@HZmgRgVlJS9Bhx-uKYfBZ!XZfJ)j-@2HUk>uVE?_J{>EIu7UTnM3juvti4F4G zyXk2b0v4bWdx3?3B&_}H05Jy?4$!;|QfmMjh?{=fLZAuNgiK3_35zX}%KQuKr%PE8 zEb~9CpB|VaAhG>{ynsBprSkUqb^_U;&1T$A0;w>Ufy$|O(`%drOe9d|FyPIR8yi45 znfP*a!v=6U8nt5sC?}$qqbI>6ju9TuMS>pm_FB8K#yqmZ&^#0`z3yWU5f7h z2OB}AkzEgvR3n|(2o6cR3mcI_Qh~+s31Wj4ybJ<&0zlOmG#P@T6||D~%dY86ZUVia zV;kHAlnK}$>2E1M%yM3`;HAr9!BP`>3C@?#|oBlLd zz!XOi-PkbQCE5z#8Xzy%UOQv^l)L$Pqfy`5$Zkr;&4{O;WCy^^i=>nQsK`HM2^zsw|d-getKxyI8 zbomqkx#_o41o*L~G91BtV&imBFf(1)INc^yKvD%-bs;B2Xx#;}@CO694ON*cZ~-}M z+>;QHnVz2}APBEk9&DQKm@c3+eNCDGXrI)(G^92!L=JT1;DmI6KxA`Xrz4t$AnTwR zBnQ%*12u19-G6XOeLwwShJX#+`ybK;bYOu;v~EzNQa)3l11$?|$%M2C-(?Dvz{dd| zY}%faC7=l}D-jE|+HBHiO!Y4;hbdH_jFCXYqmc+)3-tgJK<4 z^| z7UPNOuSx~9U|9n+?)7fELK)8bVa1l|xn+p@0c1Kf8bJeO(Bx$RaRsQ$|6ud<<7EO$ z5--4o5_-d~W6N~Lazv9KWZJvwHsu0lILetBTc&rF3mC#0FQ9=qsO>d~;RU2Hc(8eT zLZg6k)DIlCBL^|8*yz}TEQ(gjKvpZl2Pk%InZB_RG0+2QfFRrhnsEaK0W?R0g7*D% z!74}>_g#g+G?YqDfmvWZsM_OUMf9toMH`x>8#a?^>2{AQfd=A|%Ig{deLYx++&~Ty z1zujzv6Z?E6L>+#Jix+d%i8HRO#-^pKhz2sOkY|nAOcTlFSfvC?txbQ)d?IJpwxDQ zKB-L)dul@oMR*FjK}iado*vO8AO#QU6I-^|GzoyNo|t~VPC#b*vSxv7c=@|!ExD;? zd5b_WQmO$DC&wU`4n%;)U?2sIY`cI3+%+9rr^mMom?GjD)bd==j;~~S+m2kaz(;Ca z5G_vwNV5(!67*p6boUP2CCk?7jUC7(3&{389r#KXu1@5V1#Wu{!uAY^?I6!T*gQS8 zQ$QILp#;o20M_02cG43Yz4LA^;Cs<#Bmk%u%`Tp zt<&YFAiMw#$(Shu=4cfpB0{#Wo+9v;2_AzhwoYF(U0@q55TGW|JuX(zFD~k_7r!g8 z#s!L~0-NI*M(DC1_{b+pbYtchP+I}ks)3{<77fQKYo|Y-C7_5L2|}|4z9DBLaGP3h z4pN(X##T_9T5Nj!90Aa&1@F=XG^byiBcK2`1xW$VbfvihprZ&UqzkA`FP$r(jcoR+ zxrpK10>p4GC=r9o32@edHcG(h;r(>>c>=cZhW7fo0y?lR2JzZKE$v715G`%6$?v9@ z&lfNUjo)sVkJQqhv30uM0)amSTG2PQPWM_Uun}~l{bB)`?GlRw)IbNB*)JAg1g$J` zTp|!60$DKxyX=4!ba2?t=_{8ARER)ULmAFFdt`}tK`hj1UmgAOvkX=9fmI^4E z%;1F{V|)axgcnIE2S_Q%i-=0Z7*euoP%3lK@y( z1B2syaEO8S{lK=_IPQiENn|orP^L+x6JW;UV24CRg2np{GC?3G3;sHSw9}Z2wa896U`km7P9Aemv_;6^t zzy*Ph=}l(@dT8wmIc75^1|AVaB1Q2n*de{vLO7%ediB9!kXO5K`Lf`=08Tl93jz~p z?fL077x72IcBM-Ka=aF>NMdok!I%Y2340D8!1Rjy0(x-IBg-u~Jbll7 zfhF*~ha!iP`LNlIJ&mE5fi-H7ReFCLn1#3*>)50*NRbuT%HocG>A2=D$d^$6D6lE8I_?3BK#yU9mpLdl6HI>}4uK+l zJ=2-H+jDpXxfrnq#)m`Gdw2ywyOcNb3W83u`Y$LbHT@m0pd`FVMz)o3Y+^65kj;2- zXnP``U=?W6?v5bLPG_u%=K><|7_g_j1BbR(2?_3G659ew6OP&n5St!=c@2Y05zn+CZpQ(;UFaUJQfp_#~R8P4o|;mFDSfSTU?Nh4XaOyDNd%ZRuoi` zWWw%`4~ModlNEf=47VS-b-Um&Nbgd(&B$`tOBiGo4-QZ7P!ep%YVwCe(^ZuP`*6t} z*dWj$#|vtBFe99eZ1#sk(?M#ce^(KFj>C}cUsMHSx#5z`jt%gtdBNf7>4t(eaDO4o z;Yx@|x{pkkHWEC~cw+l&BSCg%g)PTGCx0?I?f}sOb9)=W#|WPQ@ft`-+*ZNLexJXo+H2Gi=&{t4DApoa4E1m_JBoTd3g?q=V;@2Xa_z}{UDbWz1Ucfl*LTQrdtDf4qHa4T>)_S~I*)6`TByO_xA4sCUVe<=6q@2rLBc{Q=!{IDKK0tc2Emuu5LXsbCu9M9?-IFy{@J z1PMV;x9}8{mbnBLL{<+vHUcCluyFcBIax9B10as05R!>t71Kq%1XcBWz>=Iul5p$R zfTf___6;D8z#_;6YV(2H5p>paU6>PhS@&D9dYfXYp}@&J0RQ5;SxAaT3{F76qQQ=F9<(h_kgoE7~5w z&elRY-SPm)J&r1lPfkp)>E)B3Zm@)vcRO3M;Cj#~-L@1#7Dh6{KsHTKvL3t`NP)o- z)C5ytP~bLWV&UQ8R^S9Jn*mu0KOPVyf*LH`3Y@TWmY~z7pktQMPxrw*U>6R`Fr(bha$P zRU%JLBS#pAf`H?f)6*5I1ZAc_$Px@;JigsDTTqr!yyXm%G6n{21(3=qXQpT72>LNC zIWv7{j$oR|5wId?*$h^(<;-^DTtN{~Y2uM52s%RKeV$-A;uJvBZCv8IWt(fBZC5yCNqZ; zi#hX;?b8Db1x1)XY@eQ9DCo#^Vb=6jg@U?_$EV*Y6r9F%<@EG|B0&|VEl~Q%>Fs-p z1eq8`uYerw2s(L{Bg?VjEU46)aCZ9TVnGYV6`*Y6sO`7_Bnq!gV9O^SG#uWpQzAGW zblSs_GQpXQC#J`hgFUyc9PGK!3Xtcf*H;KG^MPb^c3#lwN7%;71n|ck8|Zv^$XMEk zxzh_P1)G_koSy!zQc!~l5?y7C$G1of{ksiS|My@{~WuS8J%Jz^x!555NORj-ZpoZg_Yunu>2<~BI`f_DD z%Ot_SOkb`}e=t{2e7n?S!ELPdPe87L7hNg}Opd4`j0%E|M^Mx-Bd&E|b_Bb}j0tJ& zCDePMRga*fYPNv&LMNjXgcVpEzko%cbqKqHumY3gm#fpmW(sO56Jgr+MKcAt89|;% zm@gsi9kEogS(>l)(e8}I}_L-2s&NM974rGs8%qwea!|zbDFw$Hy124 z4nRX=3p6xN9D;<#vqSLE(3^hou;6wggJk=~CKKNuN(d~Yx1>Z7? z^tOV}JT`$0>w_)@-gA4p|5-s-?Va~PkqW9$B(fZzfH_}4By5;Pfx+=VV<9L}+?>Au ztY94D@$GWw1dCY=7Tf}r7|;x+z^%aJxaKxU1bVcz0>1_mgCZ;F2rO0wZpRI`rXRc{ zD9<$E*7ir21kbU0^?((_v@`bbWJk5!13t|9twhPjZu0e2s#7Y?~&j$#uL+*JrjIsN z&XeVM1Z=J~|Az+9^c5fE?7)V`=@*!UC8vXx|M>$l4^;H>WI0aw3vz}v|75W7ARBqI z9QQl|2}({s|3y%NOP7HGbfvE2j|bBmUkZv&2VaZ)kXNQZ2$SN_ zJ_B*T<0UW+ay00cYB1*om;@a}1`31+P=D-ODj+(|SyqsR5o(Xfbb+seZ2Tzp{CNnn z$A*6a*a+yH_!_VWAa0$$_k|!g6U3p|47dX|;L0zM>!F^#^9#wd8cfKZl|{9G4OqJr zI9Paf88{r7+>t^Cn}u&4fm|##-TalHlK2yF5c4~J2Gh`<;Gch>=7u#tH0B}EH3uAr zl8~EZ@4gZ=#N($w(7^9}E~d&n;r^lN8=s4*OWp_Np>|MLSqi+GK!M3oCd+Zl{X^3~ zJ{MD&e*d+gp7wHxJ5VEO16c3?n1ptn*F1to5;*nrfKv}N?56wyg`GA39&n66Bee&b zdWeeC9;7fOBB{MWQqHTv#NfzGC<^9)qrirL3E17xvo1G)-3?7Nv)|!OG=HE5Tmc&Z zjW(Dcqn7h%LnB8Na;G>-iai6>djPB#ln+2T6l}Q-A2<<09rOd52*Gy;yL}MU;6DzI z0%#(?@(&cwlG8Pwiz%}A{0F68&gltX1tpkg{6923`?;7LI8ja~;FUFC=YSJ1%+=UZ z?HOnwYdjYdn|>ioN?`imkAfUhGr=wbB?{01qK_aWX^_℘ZW4xLg63MIc2yS&nz0 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 z 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

FfFTb|8yNG*&vg$=w@eD?$3qPkX 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 YgHK{*ekr8?$l&;6^Grr=7SKvH01Lj)3jhEB diff --git a/tezt/lib_tezos/constant.ml b/tezt/lib_tezos/constant.ml index 28cc94271697..b2fa75f02c84 100644 --- a/tezt/lib_tezos/constant.ml +++ b/tezt/lib_tezos/constant.ml @@ -103,7 +103,7 @@ module WASM = struct ~path: "etherlink/kernel_evm/kernel/tests/resources/ghostnet_evm_kernel.wasm" - let ghostnet_evm_commit = "0a81ce76b3d4f57d8c5194bcb9418f9294fd2be1" + let ghostnet_evm_commit = "d517020b58afef0e15c768ee0b5acbda1786cdd8" let tx_kernel = Uses.make ~tag:"tx_kernel" ~path:"tx_kernel.wasm" -- GitLab From 02468da15367e818d4f93852695a5175185790c1 Mon Sep 17 00:00:00 2001 From: Hantang Sun Date: Thu, 28 Mar 2024 12:21:27 +0000 Subject: [PATCH 2/4] Etherlink: snapshot node at d517020b --- etherlink/bin_node/lib_prod/block_producer.ml | 171 ++- .../bin_node/lib_prod/block_producer.mli | 2 +- .../bin_node/lib_prod/blueprint_events.ml | 16 +- .../bin_node/lib_prod/blueprint_events.mli | 7 +- .../bin_node/lib_prod/blueprint_types.ml | 16 + .../bin_node/lib_prod/blueprint_types.mli | 9 + .../bin_node/lib_prod/blueprints_publisher.ml | 78 +- .../lib_prod/blueprints_publisher.mli | 4 +- etherlink/bin_node/lib_prod/delayed_inbox.ml | 260 ---- etherlink/bin_node/lib_prod/delayed_inbox.mli | 26 - .../bin_node/lib_prod/delayed_inbox_events.ml | 89 -- .../lib_prod/encodings/ethereum_types.ml | 65 +- etherlink/bin_node/lib_prod/encodings/rlp.ml | 2 +- etherlink/bin_node/lib_prod/events.ml | 47 +- etherlink/bin_node/lib_prod/events.mli | 8 + etherlink/bin_node/lib_prod/evm_context.ml | 1343 +++++++++++------ etherlink/bin_node/lib_prod/evm_context.mli | 99 +- .../bin_node/lib_prod/evm_context_events.ml | 30 + .../bin_node/lib_prod/evm_events_follower.ml | 67 +- .../bin_node/lib_prod/evm_events_follower.mli | 5 +- .../lib_prod/evm_events_follower_events.ml | 2 +- etherlink/bin_node/lib_prod/evm_services.ml | 35 +- etherlink/bin_node/lib_prod/evm_services.mli | 9 +- etherlink/bin_node/lib_prod/evm_state.ml | 89 +- etherlink/bin_node/lib_prod/evm_state.mli | 42 +- .../lib_prod/{store.ml => evm_store.ml} | 158 +- .../lib_prod/{store.mli => evm_store.mli} | 35 +- .../{store_events.ml => evm_store_events.ml} | 18 +- ...{store_events.mli => evm_store_events.mli} | 6 - etherlink/bin_node/lib_prod/filter_helpers.ml | 12 +- etherlink/bin_node/lib_prod/helpers.ml | 8 + etherlink/bin_node/lib_prod/helpers.mli | 4 + etherlink/bin_node/lib_prod/node_error.ml | 2 +- etherlink/bin_node/lib_prod/observer.ml | 187 ++- etherlink/bin_node/lib_prod/observer.mli | 20 +- etherlink/bin_node/lib_prod/publisher.ml | 9 +- etherlink/bin_node/lib_prod/rollup_node.ml | 8 +- .../bin_node/lib_prod/rollup_node_follower.ml | 318 ++-- .../lib_prod/rollup_node_follower.mli | 14 +- .../lib_prod/rollup_node_follower_events.ml | 22 + .../bin_node/lib_prod/rollup_services.ml | 43 +- etherlink/bin_node/lib_prod/sequencer.ml | 108 +- .../bin_node/lib_prod/sequencer_blueprint.ml | 99 +- .../bin_node/lib_prod/sequencer_blueprint.mli | 26 +- .../bin_node/lib_prod/services_backend_sig.ml | 1 - etherlink/bin_node/lib_prod/tx_pool.ml | 326 ++-- etherlink/bin_node/lib_prod/tx_pool.mli | 29 +- etherlink/bin_node/main.ml | 21 +- 48 files changed, 2287 insertions(+), 1708 deletions(-) delete mode 100644 etherlink/bin_node/lib_prod/delayed_inbox.ml delete mode 100644 etherlink/bin_node/lib_prod/delayed_inbox.mli delete mode 100644 etherlink/bin_node/lib_prod/delayed_inbox_events.ml create mode 100644 etherlink/bin_node/lib_prod/evm_context_events.ml rename etherlink/bin_node/lib_prod/{store.ml => evm_store.ml} (80%) rename etherlink/bin_node/lib_prod/{store.mli => evm_store.mli} (83%) rename etherlink/bin_node/lib_prod/{store_events.ml => evm_store_events.ml} (77%) rename etherlink/bin_node/lib_prod/{store_events.mli => evm_store_events.mli} (81%) diff --git a/etherlink/bin_node/lib_prod/block_producer.ml b/etherlink/bin_node/lib_prod/block_producer.ml index 578ceac45091..ee0da822950d 100644 --- a/etherlink/bin_node/lib_prod/block_producer.ml +++ b/etherlink/bin_node/lib_prod/block_producer.ml @@ -6,12 +6,57 @@ (*****************************************************************************) type parameters = { - ctxt : Evm_context.t; cctxt : Client_context.wallet; smart_rollup_address : string; sequencer_key : Client_keys.sk_uri; + maximum_number_of_chunks : int; } +(* The size of a delayed transaction is overapproximated to the maximum size + of an inbox message, as chunks are not supported in the delayed bridge. *) +let maximum_delayed_transaction_size = 4096 + +(* + The legacy transactions are as follows: + ----------------------------- + | Nonce | Up to 32 bytes | + ----------------------------- + | GasPrice | Up to 32 bytes | + ----------------------------- + | GasLimit | Up to 32 bytes | + ----------------------------- + | To | 20 bytes addr | + ----------------------------- + | Value | Up to 32 bytes | + ----------------------------- + | Data | 0 - unlimited | + ----------------------------- + | V | 1 (usually) | + ----------------------------- + | R | 32 bytes | + ----------------------------- + | S | 32 bytes | + ----------------------------- + + where `up to` start at 0, and encoded as the empty byte for the 0 value + according to RLP specification. +*) +let minimum_ethereum_transaction_size = + Rlp.( + List + [ + Value Bytes.empty; + Value Bytes.empty; + Value Bytes.empty; + Value (Bytes.make 20 '\000'); + Value Bytes.empty; + Value Bytes.empty; + Value Bytes.empty; + Value (Bytes.make 32 '\000'); + Value (Bytes.make 32 '\000'); + ] + |> encode |> Bytes.length) + module Types = struct type nonrec parameters = parameters @@ -23,7 +68,7 @@ module Name = struct let encoding = Data_encoding.unit - let base = ["evm_node"; "prod"; "block"; "producer"; "worker"] + let base = ["evm_node"; "dev"; "block"; "producer"; "worker"] let pp _ _ = () @@ -65,9 +110,6 @@ type worker = Worker.infinite Worker.queue Worker.t let get_hashes ~transactions ~delayed_transactions = let open Result_syntax in - let delayed_hashes = - List.map Ethereum_types.Delayed_transaction.hash delayed_transactions - in let hashes = List.map (fun transaction -> @@ -76,49 +118,79 @@ let get_hashes ~transactions ~delayed_transactions = Hash Hex.(of_string tx_hash_str |> show |> hex_of_string))) transactions in - return (delayed_hashes @ hashes) + return (delayed_transactions @ hashes) + +let take_delayed_transactions maximum_number_of_chunks = + let open Lwt_result_syntax in + let maximum_cumulative_size = + Sequencer_blueprint.maximum_usable_space_in_blueprint + maximum_number_of_chunks + in + let maximum_delayed_transactions = + maximum_cumulative_size / maximum_delayed_transaction_size + in + let* delayed_transactions = Evm_context.delayed_inbox_hashes () in + let delayed_transactions = + List.take_n maximum_delayed_transactions delayed_transactions + in + let remaining_cumulative_size = + maximum_cumulative_size - (List.length delayed_transactions * 4096) + in + return (delayed_transactions, remaining_cumulative_size) -let produce_block ~(ctxt : Evm_context.t) ~cctxt ~smart_rollup_address - ~sequencer_key ~force ~timestamp = +let produce_block ~cctxt ~smart_rollup_address ~sequencer_key ~force ~timestamp + ~maximum_number_of_chunks = let open Lwt_result_syntax in - let* tx_pool_response = Tx_pool.pop_transactions () in - match tx_pool_response with - | Transactions (transactions, delayed_transactions) -> - let n = List.length transactions + List.length delayed_transactions in - if force || n > 0 then + let* is_locked = Tx_pool.is_locked () in + if is_locked then + let*! () = Block_producer_events.production_locked () in + return 0 + else + let* delayed_transactions, remaining_cumulative_size = + take_delayed_transactions maximum_number_of_chunks + in + let* transactions = + (* Low key optimization to avoid even checking the txpool if there is not + enough space for the smallest transaction. *) + if remaining_cumulative_size <= minimum_ethereum_transaction_size then + return [] + else + Tx_pool.pop_transactions + ~maximum_cumulative_size:remaining_cumulative_size + in + let n = List.length transactions + List.length delayed_transactions in + if force || n > 0 then + let*! head_info = Evm_context.head_info () in + Helpers.with_timing + (Blueprint_events.blueprint_production head_info.next_blueprint_number) + @@ fun () -> + let*? hashes = get_hashes ~transactions ~delayed_transactions in + let* blueprint = Helpers.with_timing - (Blueprint_events.blueprint_production - ctxt.session.next_blueprint_number) + (Blueprint_events.blueprint_proposal head_info.next_blueprint_number) @@ fun () -> - let*? hashes = get_hashes ~transactions ~delayed_transactions in - let* blueprint = - Helpers.with_timing - (Blueprint_events.blueprint_proposal - ctxt.session.next_blueprint_number) - @@ fun () -> - Sequencer_blueprint.create - ~sequencer_key - ~cctxt - ~timestamp - ~smart_rollup_address - ~transactions - ~delayed_transactions - ~parent_hash:ctxt.Evm_context.session.current_block_hash - ~number:ctxt.Evm_context.session.next_blueprint_number - in - let* _ctxt = - Evm_context.apply_and_publish_blueprint ctxt timestamp blueprint - in - let*! () = - List.iter_p - (fun hash -> Block_producer_events.transaction_selected ~hash) - hashes - in - return n - else return 0 - | Locked -> - let*! () = Block_producer_events.production_locked () in - return 0 + Sequencer_blueprint.create + ~sequencer_key + ~cctxt + ~timestamp + ~smart_rollup_address + ~transactions + ~delayed_transactions + ~parent_hash:head_info.current_block_hash + ~number:head_info.next_blueprint_number + in + let* () = + Evm_context.apply_blueprint timestamp blueprint delayed_transactions + in + let (Qty number) = head_info.next_blueprint_number in + let* () = Blueprints_publisher.publish number blueprint in + let*! () = + List.iter_p + (fun hash -> Block_producer_events.transaction_selected ~hash) + hashes + in + return n + else return 0 module Handlers = struct type self = worker @@ -132,14 +204,21 @@ module Handlers = struct match request with | Request.Produce_block (timestamp, force) -> protect @@ fun () -> - let {ctxt; cctxt; smart_rollup_address; sequencer_key} = state in + let { + cctxt; + smart_rollup_address; + sequencer_key; + maximum_number_of_chunks; + } = + state + in produce_block - ~ctxt ~cctxt ~smart_rollup_address ~sequencer_key ~force ~timestamp + ~maximum_number_of_chunks type launch_error = error trace diff --git a/etherlink/bin_node/lib_prod/block_producer.mli b/etherlink/bin_node/lib_prod/block_producer.mli index d68633baa1b4..457eaf7add09 100644 --- a/etherlink/bin_node/lib_prod/block_producer.mli +++ b/etherlink/bin_node/lib_prod/block_producer.mli @@ -6,10 +6,10 @@ (*****************************************************************************) type parameters = { - ctxt : Evm_context.t; cctxt : Client_context.wallet; smart_rollup_address : string; sequencer_key : Client_keys.sk_uri; + maximum_number_of_chunks : int; } (** [start parameters] starts the events follower. *) diff --git a/etherlink/bin_node/lib_prod/blueprint_events.ml b/etherlink/bin_node/lib_prod/blueprint_events.ml index 799efc3c9eb7..cc55d432803e 100644 --- a/etherlink/bin_node/lib_prod/blueprint_events.ml +++ b/etherlink/bin_node/lib_prod/blueprint_events.ml @@ -89,13 +89,15 @@ let invalid_blueprint = ~level:Error ("level", Data_encoding.n) -let missing_blueprint = - declare_1 +let missing_blueprints = + declare_3 ~section - ~name:"blueprint_blueprint" - ~msg:"Could not fetch the blueprint for level {level}" + ~name:"missing_blueprints" + ~msg:"Store is missing {count} blueprints in the range [{from}; {to_}]" ~level:Error - ("level", Data_encoding.n) + ("count", Data_encoding.int31) + ("from", Data_encoding.n) + ("to_", Data_encoding.n) let publisher_is_ready () = emit publisher_ready () @@ -111,7 +113,9 @@ let invalid_blueprint_produced level = emit invalid_blueprint level let catching_up min max = emit blueprint_catchup (min, max) -let missing_blueprint level = emit missing_blueprint level +let missing_blueprints count Ethereum_types.(Qty from) Ethereum_types.(Qty to_) + = + emit missing_blueprints (count, from, to_) let blueprint_proposal Ethereum_types.(Qty level) time = emit blueprint_proposal (level, time) diff --git a/etherlink/bin_node/lib_prod/blueprint_events.mli b/etherlink/bin_node/lib_prod/blueprint_events.mli index 99a744596073..d5b73e82df80 100644 --- a/etherlink/bin_node/lib_prod/blueprint_events.mli +++ b/etherlink/bin_node/lib_prod/blueprint_events.mli @@ -34,10 +34,11 @@ val blueprint_injection_failed : Z.t -> unit Lwt.t Ethereum block. *) val invalid_blueprint_produced : Z.t -> unit Lwt.t -(** [missing_blueprint level] advertizes that a sequencer has tried to fetch - the blueprint for level [level] from its store and failed. This means the +(** [missing_blueprints count from to_] advertizes that a sequencer has detect + it is missing [count] blueprints in the provided range. This means the sequencer store is inconsistent. *) -val missing_blueprint : Z.t -> unit Lwt.t +val missing_blueprints : + int -> Ethereum_types.quantity -> Ethereum_types.quantity -> unit Lwt.t (** [catching_up min max] advertizes that the sequencer is reinjecting blueprints from level [min] to [max] because the rollup node is lagging. *) diff --git a/etherlink/bin_node/lib_prod/blueprint_types.ml b/etherlink/bin_node/lib_prod/blueprint_types.ml index a7c8037ec01b..c38dee573a98 100644 --- a/etherlink/bin_node/lib_prod/blueprint_types.ml +++ b/etherlink/bin_node/lib_prod/blueprint_types.ml @@ -13,6 +13,11 @@ type t = { payload : payload; } +type with_events = { + delayed_transactions : Ethereum_types.Delayed_transaction.t list; + blueprint : t; +} + let payload_encoding = let open Data_encoding in list @@ -30,3 +35,14 @@ let encoding = (req "number" n) (req "timestamp" Time.Protocol.encoding) (req "payload" payload_encoding)) + +let with_events_encoding = + let open Data_encoding in + conv + (fun {delayed_transactions; blueprint} -> (delayed_transactions, blueprint)) + (fun (delayed_transactions, blueprint) -> {delayed_transactions; blueprint}) + (obj2 + (req + "delayed_transactions" + (list Ethereum_types.Delayed_transaction.encoding)) + (req "blueprint" encoding)) diff --git a/etherlink/bin_node/lib_prod/blueprint_types.mli b/etherlink/bin_node/lib_prod/blueprint_types.mli index b54d9cd9e465..0500e328a422 100644 --- a/etherlink/bin_node/lib_prod/blueprint_types.mli +++ b/etherlink/bin_node/lib_prod/blueprint_types.mli @@ -14,6 +14,15 @@ type t = { payload : payload; } +(** Blueprint with events contains: *) +type with_events = { + delayed_transactions : Ethereum_types.Delayed_transaction.t list; + (** The delayed transactions to apply before applying the blueprint. *) + blueprint : t; (** The blueprint to execute. *) +} + val encoding : t Data_encoding.t val payload_encoding : payload Data_encoding.t + +val with_events_encoding : with_events Data_encoding.t diff --git a/etherlink/bin_node/lib_prod/blueprints_publisher.ml b/etherlink/bin_node/lib_prod/blueprints_publisher.ml index a3e7bffe4149..b055121eb485 100644 --- a/etherlink/bin_node/lib_prod/blueprints_publisher.ml +++ b/etherlink/bin_node/lib_prod/blueprints_publisher.ml @@ -7,7 +7,6 @@ type parameters = { rollup_node_endpoint : Uri.t; - store : Store.t; max_blueprints_lag : int; max_blueprints_ahead : int; max_blueprints_catchup : int; @@ -16,7 +15,6 @@ type parameters = { } type state = { - store : Store.t; rollup_node_endpoint : Uri.t; max_blueprints_lag : Z.t; max_blueprints_ahead : Z.t; @@ -68,8 +66,6 @@ module Worker = struct let set_latest_level_confirmed worker level = (state worker).latest_level_confirmed <- level - let blueprint_store worker = (state worker).store - let max_blueprints_lag worker = (state worker).max_blueprints_lag let max_level_ahead worker = (state worker).max_blueprints_ahead @@ -132,27 +128,29 @@ module Worker = struct let*! () = Blueprint_events.catching_up lower_bound upper_bound in - let rec catching_up curr = - if Z.Compare.(curr <= upper_bound) then - let* payload = - Store.Publishable_blueprints.find (blueprint_store worker) (Qty curr) - in - match payload with - | Some payload -> - let* () = publish worker payload curr in - catching_up Z.(succ curr) - | None -> - let*! () = Blueprint_events.missing_blueprint curr in - Stdlib.failwith - Format.( - asprintf - "Blueprint for level %a missing from the store" - Z.pp_print - curr) - else return_unit + let* blueprints = + Evm_context.blueprints_range (Qty lower_bound) (Qty upper_bound) + in + + let expected_count = Z.(to_int (sub upper_bound lower_bound)) + 1 in + let actual_count = List.length blueprints in + let* () = + when_ (actual_count < expected_count) (fun () -> + let*! () = + Blueprint_events.missing_blueprints + (expected_count - actual_count) + (Qty lower_bound) + (Qty upper_bound) + in + return_unit) in - let* () = catching_up lower_bound in + let* () = + List.iter_es + (fun (Ethereum_types.Qty current, payload) -> + publish worker payload current) + blueprints + in (* We give ourselves a cooldown window Tezos blocks to inject everything *) set_cooldown worker (catchup_cooldown worker) ; @@ -171,7 +169,6 @@ module Handlers = struct let on_launch _self () ({ rollup_node_endpoint; - store; max_blueprints_lag; max_blueprints_ahead; max_blueprints_catchup; @@ -182,7 +179,6 @@ module Handlers = struct let open Lwt_result_syntax in return { - store; latest_level_confirmed = (* Will be set at the correct value once the next L2 block is received from the rollup node *) @@ -239,7 +235,7 @@ let table = Worker.create_table Queue let worker_promise, worker_waker = Lwt.task () let start ~rollup_node_endpoint ~max_blueprints_lag ~max_blueprints_ahead - ~max_blueprints_catchup ~catchup_cooldown ~latest_level_seen store = + ~max_blueprints_catchup ~catchup_cooldown ~latest_level_seen () = let open Lwt_result_syntax in let* worker = Worker.launch @@ -247,7 +243,6 @@ let start ~rollup_node_endpoint ~max_blueprints_lag ~max_blueprints_ahead () { rollup_node_endpoint; - store; max_blueprints_lag; max_blueprints_ahead; max_blueprints_catchup; @@ -266,12 +261,22 @@ let worker = lazy (match Lwt.state worker_promise with | Lwt.Return worker -> Ok worker - | Lwt.Fail e -> Error (TzTrace.make @@ error_of_exn e) - | Lwt.Sleep -> Error (TzTrace.make No_worker)) + | Lwt.Fail e -> Result_syntax.tzfail (error_of_exn e) + | Lwt.Sleep -> Result_syntax.tzfail No_worker) + +let bind_worker f = + let open Lwt_result_syntax in + let res = Lazy.force worker in + match res with + | Error [No_worker] -> + (* There is no worker, nothing to do *) + return_unit + | Error errs -> fail errs + | Ok w -> f w let worker_add_request ~request = let open Lwt_result_syntax in - let*? w = Lazy.force worker in + bind_worker @@ fun w -> let*! (_pushed : bool) = Worker.Queue.push_request w request in return_unit @@ -282,11 +287,8 @@ let new_l2_head rollup_head = worker_add_request ~request:(New_l2_head {rollup_head}) let shutdown () = - let open Lwt_syntax in - match Lazy.force worker with - | Error _ -> - (* There is no publisher, nothing to do *) - Lwt.return_unit - | Ok w -> - let* () = Blueprint_events.publisher_shutdown () in - Worker.shutdown w + let open Lwt_result_syntax in + bind_worker @@ fun w -> + let*! () = Blueprint_events.publisher_shutdown () in + let*! () = Worker.shutdown w in + return_unit diff --git a/etherlink/bin_node/lib_prod/blueprints_publisher.mli b/etherlink/bin_node/lib_prod/blueprints_publisher.mli index 68eea3ebd6e3..8441ed5f0e65 100644 --- a/etherlink/bin_node/lib_prod/blueprints_publisher.mli +++ b/etherlink/bin_node/lib_prod/blueprints_publisher.mli @@ -12,10 +12,10 @@ val start : max_blueprints_catchup:int -> catchup_cooldown:int -> latest_level_seen:Z.t -> - Store.t -> + unit -> unit tzresult Lwt.t -val shutdown : unit -> unit Lwt.t +val shutdown : unit -> unit tzresult Lwt.t (** [publish level payload] sends a request to the publisher worker to forward the chunked blueprint [payload] for level [level] to the diff --git a/etherlink/bin_node/lib_prod/delayed_inbox.ml b/etherlink/bin_node/lib_prod/delayed_inbox.ml deleted file mode 100644 index 7d90e4f37820..000000000000 --- a/etherlink/bin_node/lib_prod/delayed_inbox.ml +++ /dev/null @@ -1,260 +0,0 @@ -(*****************************************************************************) -(* *) -(* SPDX-License-Identifier: MIT *) -(* Copyright (c) 2024 Nomadic Labs *) -(* Copyright (c) 2024 Marigold *) -(* *) -(*****************************************************************************) - -type parameters = {rollup_node_endpoint : Uri.t; delayed_inbox_interval : int} - -module StringSet = Set.Make (String) - -module Types = struct - type state = { - rollup_node_endpoint : Uri.t; - delayed_inbox_interval : int; - mutable pending_transactions : StringSet.t; - } - - type nonrec parameters = parameters -end - -module Name = struct - (* We only have a single delayed inbox in the evm node *) - type t = unit - - let encoding = Data_encoding.unit - - let base = ["evm_node"; "delayed-inbox"; "prod"; "worker"] - - let pp _ _ = () - - let equal () () = true -end - -module Request = struct - type ('a, 'b) t = New_rollup_node_block : Int32.t -> (unit, error trace) t - - type view = View : _ t -> view - - let view (req : _ t) = View req - - let encoding = - let open Data_encoding in - union - [ - case - (Tag 0) - ~title:"New_rollup_node_block" - (obj2 - (req "request" (constant "new_rollup_node_block")) - (req "rollup_head" int32)) - (function - | View (New_rollup_node_block rollup_head) -> Some ((), rollup_head)) - (fun ((), rollup_head) -> View (New_rollup_node_block rollup_head)); - ] - - let pp ppf (View r) = - match r with - | New_rollup_node_block rollup_head -> - Format.fprintf ppf "New_rollup_node_block (level %ld)" rollup_head -end - -module Worker = Worker.MakeSingle (Name) (Request) (Types) - -type worker = Worker.infinite Worker.queue Worker.t - -let subkeys_from_rollup_node path level rollup_node_endpoint = - let open Rollup_services in - call_service - ~base:rollup_node_endpoint - durable_state_subkeys - ((), Block_id.Level level) - {key = path} - () - -let read_from_rollup_node path level rollup_node_endpoint = - let open Rollup_services in - call_service - ~base:rollup_node_endpoint - durable_state_value - ((), Block_id.Level level) - {key = path} - () - -let delayed_transaction_hashes level rollup_node_endpoint = - let open Lwt_result_syntax in - let* keys = - subkeys_from_rollup_node - Durable_storage_path.Delayed_transaction.hashes - level - rollup_node_endpoint - in - match keys with - | None -> return [] - | Some keys -> - let hashes = - (* Remove the empty, meta keys *) - List.filter (fun key -> not (key = "" || key = "meta")) keys - in - return hashes - -let fetch_delayed_inbox_hashes ~level ~rollup_node_endpoint = - delayed_transaction_hashes level rollup_node_endpoint - -let fetch_delayed_transactions ~hashes ~level ~rollup_node_endpoint = - let open Lwt_syntax in - List.filter_map_p - (fun key -> - let hash = Ethereum_types.hash_of_string key in - let path = Durable_storage_path.Delayed_transaction.transaction hash in - let* bytes = read_from_rollup_node path level rollup_node_endpoint in - match bytes with - | Ok (Some bytes) -> - return (Ethereum_types.Delayed_transaction.of_bytes hash bytes) - | _ -> - let* () = - Delayed_inbox_events.transaction_fetch_failed ~tx_hash:hash ~level - in - return_none) - hashes - -let include_delayed_transaction delayed_transaction = - let open Lwt_syntax in - let* () = Delayed_inbox_events.add_transaction ~delayed_transaction in - let* _sent = Tx_pool.add_delayed delayed_transaction in - return_unit - -let on_new_head - ({delayed_inbox_interval; rollup_node_endpoint; _} as state : Types.state) - level = - let open Lwt_syntax in - (* Fetch the delayed inbox with the given interval *) - if Int32.(rem level (of_int delayed_inbox_interval) <> 0l) then return_unit - else - (* Hashes in the delayed inbox *) - let* delayed_transaction_hashes = - fetch_delayed_inbox_hashes ~level ~rollup_node_endpoint - in - let* () = - match delayed_transaction_hashes with - | Error _err -> Delayed_inbox_events.fetch_failed ~level - | Ok delayed_transaction_hashes -> - (* Compute new hashes to avoid fetching transactions we already - know about. *) - let new_transaction_hashes = - List.filter - (fun tx_hash -> - not (StringSet.mem tx_hash state.pending_transactions)) - delayed_transaction_hashes - in - let* () = - Delayed_inbox_events.fetch_succeeded - ~level - ~nb_txs:(List.length new_transaction_hashes) - in - (* The new pending set is just the fetched delayed inbox. - It's important to drop the transactions from the pending - set that are no longer present in the delayed inbox. - On the contrary, a transaction that is sent twice to the - delayed inbox at different levels would only be added to the - tx-pool once. - *) - let pending = StringSet.of_list delayed_transaction_hashes in - (* Fetch transactions for new hashes *) - let* new_delayed_transactions = - fetch_delayed_transactions - ~hashes:new_transaction_hashes - ~level - ~rollup_node_endpoint - in - state.pending_transactions <- pending ; - (* Add new transactions to the tx-pool *) - let* () = - List.iter_p include_delayed_transaction new_delayed_transactions - in - return_unit - in - return_unit - -module Handlers = struct - type self = worker - - let on_request : - type r request_error. - worker -> (r, request_error) Request.t -> (r, request_error) result Lwt.t - = - fun worker request -> - let open Lwt_result_syntax in - match request with - | Request.New_rollup_node_block rollup_block_lvl -> - protect @@ fun () -> - let*! () = on_new_head (Worker.state worker) rollup_block_lvl in - return_unit - - type launch_error = error trace - - let on_launch _w () - ({rollup_node_endpoint; delayed_inbox_interval} : Types.parameters) = - let state = - Types. - { - rollup_node_endpoint; - delayed_inbox_interval; - pending_transactions = StringSet.empty; - } - in - Lwt_result_syntax.return state - - let on_error (type a b) _w _st (_r : (a, b) Request.t) (_errs : b) : - unit tzresult Lwt.t = - Lwt_result_syntax.return_unit - - let on_completion _ _ _ _ = Lwt.return_unit - - let on_no_request _ = Lwt.return_unit - - let on_close _ = Lwt.return_unit -end - -let table = Worker.create_table Queue - -let worker_promise, worker_waker = Lwt.task () - -type error += No_delayed_inbox - -let worker = - lazy - (match Lwt.state worker_promise with - | Lwt.Return worker -> Ok worker - | Lwt.Fail e -> Error (TzTrace.make @@ error_of_exn e) - | Lwt.Sleep -> Error (TzTrace.make No_delayed_inbox)) - -let start parameters = - let open Lwt_result_syntax in - let*! () = Delayed_inbox_events.started () in - let+ worker = Worker.launch table () parameters (module Handlers) in - Lwt.wakeup worker_waker worker - -let shutdown () = - let open Lwt_syntax in - let w = Lazy.force worker in - match w with - | Error _ -> - (* There is no delayed inbox, nothing to do *) - Lwt.return_unit - | Ok w -> - let* () = Delayed_inbox_events.shutdown () in - Worker.shutdown w - -let worker_add_request ~request : unit tzresult Lwt.t = - let open Lwt_result_syntax in - match Lazy.force worker with - | Ok w -> - let*! (_pushed : bool) = Worker.Queue.push_request w request in - return_unit - | Error e -> Lwt.return (Error e) - -let new_rollup_block rollup_level = - worker_add_request ~request:(New_rollup_node_block rollup_level) diff --git a/etherlink/bin_node/lib_prod/delayed_inbox.mli b/etherlink/bin_node/lib_prod/delayed_inbox.mli deleted file mode 100644 index c8726730c2b5..000000000000 --- a/etherlink/bin_node/lib_prod/delayed_inbox.mli +++ /dev/null @@ -1,26 +0,0 @@ -(*****************************************************************************) -(* *) -(* SPDX-License-Identifier: MIT *) -(* Copyright (c) 2024 Nomadic Labs *) -(* Copyright (c) 2024 Marigold *) -(* *) -(*****************************************************************************) - -type parameters = { - rollup_node_endpoint : Uri.t; - (** Rollup node endpoint used to monitor the delayed inbox. *) - delayed_inbox_interval : int; - (** Number of levels every which the worker will fetch the - delayed inbox. *) -} - -(** [start parameters] starts the delayed inbox worker. *) -val start : parameters -> unit tzresult Lwt.t - -(** [shutdown ()] stops the delayed inbox worker. *) -val shutdown : unit -> unit Lwt.t - -(** [new_rollup_block rollup_level] tells the worker that a new L2 - head has been published and that the rollup head is now - [rollup_level]. *) -val new_rollup_block : Int32.t -> unit tzresult Lwt.t diff --git a/etherlink/bin_node/lib_prod/delayed_inbox_events.ml b/etherlink/bin_node/lib_prod/delayed_inbox_events.ml deleted file mode 100644 index e0672aea6217..000000000000 --- a/etherlink/bin_node/lib_prod/delayed_inbox_events.ml +++ /dev/null @@ -1,89 +0,0 @@ -(*****************************************************************************) -(* *) -(* SPDX-License-Identifier: MIT *) -(* Copyright (c) 2024 Nomadic Labs *) -(* *) -(*****************************************************************************) - -module Event = struct - open Internal_event.Simple - - let section = Events.section - - let started = - declare_0 - ~section - ~name:"delayed_inbox_started" - ~msg:"Delayed inbox has been started" - ~level:Notice - () - - let add_transaction = - declare_1 - ~section - ~name:"delayed_inbox_add_transaction" - ~msg:"Add delayed transaction {transaction} to the tx-pool" - ~level:Notice - ("transaction", Ethereum_types.Delayed_transaction.encoding) - ~pp1:Ethereum_types.Delayed_transaction.pp_short - - let pp_int32 fmt i = Format.fprintf fmt "%ld" i - - let fetch_succeeded = - declare_2 - ~section - ~name:"delayed_inbox_fetch_succeeded" - ~msg: - "Fetching delayed inbox for level {level} succeeded, {nb} new \ - transactions fetched" - ~level:Notice - ("level", Data_encoding.int32) - ~pp1:pp_int32 - ("nb", Data_encoding.int31) - ~pp2:Format.pp_print_int - - let fetch_failed = - declare_1 - ~section - ~name:"delayed_inbox_fetch_failed" - ~msg:"Fetching delayed inbox for level {level} failed" - ~level:Error - ("level", Data_encoding.int32) - ~pp1:pp_int32 - - let transaction_fetch_failed = - declare_2 - ~section - ~name:"delayed_inbox_transaction_fetch_failed" - ~msg: - "Fetching transaction {tx_hash} from delayed inbox for level {level} \ - failed" - ~level:Error - ("tx_hash", Ethereum_types.hash_encoding) - ~pp1:Ethereum_types.pp_hash - ("level", Data_encoding.int32) - ~pp2:pp_int32 - - let shutdown = - declare_0 - ~section - ~name:"shutting_down_delayed_inbox" - ~msg:"Stopping the delayed inbox" - ~level:Notice - () -end - -let started = Internal_event.Simple.emit Event.started - -let add_transaction ~delayed_transaction = - Internal_event.Simple.emit Event.add_transaction delayed_transaction - -let fetch_succeeded ~level ~nb_txs = - Internal_event.Simple.emit Event.fetch_succeeded (level, nb_txs) - -let fetch_failed ~level = Internal_event.Simple.emit Event.fetch_failed level - -let transaction_fetch_failed ~tx_hash ~level = - Internal_event.Simple.emit Event.transaction_fetch_failed (tx_hash, level) - -let shutdown = Internal_event.Simple.emit Event.shutdown diff --git a/etherlink/bin_node/lib_prod/encodings/ethereum_types.ml b/etherlink/bin_node/lib_prod/encodings/ethereum_types.ml index 68bee98e6e0c..62767abe4623 100644 --- a/etherlink/bin_node/lib_prod/encodings/ethereum_types.ml +++ b/etherlink/bin_node/lib_prod/encodings/ethereum_types.ml @@ -1220,13 +1220,13 @@ module Delayed_transaction = struct case (Tag 0) ~title:"transaction" - unit + (constant "transaction") (function Transaction -> Some () | _ -> None) (function () -> Transaction); case (Tag 1) ~title:"deposit" - unit + (constant "deposit") (function Deposit -> Some () | _ -> None) (function () -> Deposit); ] @@ -1236,16 +1236,17 @@ module Delayed_transaction = struct conv (fun {kind; hash; raw} -> (kind, hash, raw)) (fun (kind, hash, raw) -> {kind; hash; raw}) - (obj3 - (req "kind" encoding_kind) - (req "hash" hash_encoding) - (req "raw" string)) + (tup3 encoding_kind hash_encoding (string' Hex)) - let of_bytes hash bytes = - match bytes |> Rlp.decode with - | Ok Rlp.(List [List [Value tag; content]; _timestamp; _level]) -> ( + let of_rlp_content hash rlp_content = + match rlp_content with + | Rlp.(List [Value tag; content]) -> ( match (Bytes.to_string tag, content) with - | "\x01", Rlp.Value raw_tx -> + (* This is a bit counter intuitive but what we decode is actually + the TransactionContent, which is Ethereum|Deposit|DelayedTransaction. + Transaction cannot be in the delayed inbox by construction, therefore + we care only about Deposit and DelayedTransaction. *) + | "\x03", Rlp.Value raw_tx -> let hash = raw_tx |> Bytes.to_string |> hash_raw_tx |> Hex.of_string |> Hex.show |> hash_of_string @@ -1257,6 +1258,21 @@ module Delayed_transaction = struct | _ -> None) | _ -> None + let to_rlp {kind; raw; hash} = + let open Rlp in + let tag = + (match kind with Transaction -> "\x03" | Deposit -> "\x02") + |> Bytes.of_string + in + let hash = hash_to_bytes hash |> Bytes.of_string in + let content = + match kind with + | Transaction -> Value (Bytes.of_string raw) + | Deposit -> decode_exn (Bytes.of_string raw) + in + let rlp = List [Value hash; List [Value tag; content]] in + encode rlp + let pp_kind fmt = function | Transaction -> Format.pp_print_string fmt "Transaction" | Deposit -> Format.pp_print_string fmt "Deposit" @@ -1264,7 +1280,8 @@ module Delayed_transaction = struct let pp fmt {raw; kind; _} = Format.fprintf fmt "%a: %a" pp_kind kind Hex.pp (Hex.of_string raw) - let pp_short fmt {hash = Hash (Hex h); _} = Format.pp_print_string fmt h + let pp_short fmt {kind; hash; _} = + Format.fprintf fmt "%a: %a" pp_kind kind pp_hash hash end module Upgrade = struct @@ -1369,6 +1386,7 @@ module Evm_events = struct | Upgrade_event of Upgrade.t | Sequencer_upgrade_event of Sequencer_upgrade.t | Blueprint_applied of Blueprint_applied.t + | New_delayed_transaction of Delayed_transaction.t let of_bytes bytes = match bytes |> Rlp.decode with @@ -1383,6 +1401,15 @@ module Evm_events = struct | "\x03" -> let blueprint_applied = Blueprint_applied.of_rlp rlp_content in Option.map (fun u -> Blueprint_applied u) blueprint_applied + | "\x04" -> ( + match rlp_content with + | List [Value hash; transaction_content] -> + let hash = decode_hash hash in + let transaction = + Delayed_transaction.of_rlp_content hash transaction_content + in + Option.map (fun u -> New_delayed_transaction u) transaction + | _ -> None) | _ -> None) | _ -> None @@ -1412,6 +1439,12 @@ module Evm_events = struct Z.pp_print number hash + | New_delayed_transaction delayed_transaction -> + Format.fprintf + fmt + "New delayed transaction:@ %a" + Delayed_transaction.pp_short + delayed_transaction let encoding = let open Data_encoding in @@ -1444,5 +1477,15 @@ module Evm_events = struct ~event_encoding:Blueprint_applied.encoding ~proj:(function Blueprint_applied info -> Some info | _ -> None) ~inj:(fun info -> Blueprint_applied info); + case + ~kind:"new_delayed_transaction" + ~tag:3 + ~event_encoding:Delayed_transaction.encoding + ~proj:(function + | New_delayed_transaction delayed_transaction -> + Some delayed_transaction + | _ -> None) + ~inj:(fun delayed_transaction -> + New_delayed_transaction delayed_transaction); ] end diff --git a/etherlink/bin_node/lib_prod/encodings/rlp.ml b/etherlink/bin_node/lib_prod/encodings/rlp.ml index 02dda42d8316..38bfa9f21c6a 100644 --- a/etherlink/bin_node/lib_prod/encodings/rlp.ml +++ b/etherlink/bin_node/lib_prod/encodings/rlp.ml @@ -27,7 +27,7 @@ type error += Rlp_decoding_error of string let () = register_error_kind - ~id:"evm-node.prod.rlp-decoding-error" + ~id:"evm-node.dev.rlp-decoding-error" ~title:"Unable to decode an RLP value" ~description:"Unable to decode an RLP value" ~pp:(fun ppf msg -> diff --git a/etherlink/bin_node/lib_prod/events.ml b/etherlink/bin_node/lib_prod/events.ml index 81bdf5ac6984..43e72657c7bb 100644 --- a/etherlink/bin_node/lib_prod/events.ml +++ b/etherlink/bin_node/lib_prod/events.ml @@ -7,7 +7,7 @@ include Internal_event.Simple -let section = ["evm_node"; "prod"] +let section = ["evm_node"; "dev"] let received_upgrade = declare_1 @@ -110,6 +110,40 @@ let event_callback_log = ("method", Data_encoding.string) ("body", Data_encoding.string) +type kernel_log_kind = Application | Simulation + +type kernel_log_level = Debug | Info | Error | Fatal + +let kernel_log_kind_to_string = function + | Application -> "application" + | Simulation -> "simulation" + +let event_kernel_log kind level = + Internal_event.Simple.declare_1 + ~section:(section @ ["kernel"; kernel_log_kind_to_string kind]) + ~name: + (Format.sprintf "kernel_log_%s" (Internal_event.Level.to_string level)) + ~msg:"{msg}" + ~pp1:(fun fmt msg -> Format.pp_print_string fmt (String.trim msg)) + ~level + ("msg", Data_encoding.string) + +let event_kernel_log_application_debug = event_kernel_log Application Debug + +let event_kernel_log_simulation_debug = event_kernel_log Simulation Debug + +let event_kernel_log_application_info = event_kernel_log Application Notice + +let event_kernel_log_simulation_info = event_kernel_log Simulation Info + +let event_kernel_log_application_error = event_kernel_log Application Error + +let event_kernel_log_simulation_error = event_kernel_log Simulation Error + +let event_kernel_log_application_fatal = event_kernel_log Application Fatal + +let event_kernel_log_simulation_fatal = event_kernel_log Simulation Fatal + let received_upgrade payload = emit received_upgrade payload let pending_upgrade (upgrade : Ethereum_types.Upgrade.t) = @@ -136,3 +170,14 @@ let shutdown_rpc_server ~private_ = let shutdown_node ~exit_status = emit event_shutdown_node exit_status let callback_log ~uri ~meth ~body = emit event_callback_log (uri, meth, body) + +let event_kernel_log ~level ~kind ~msg = + match (level, kind) with + | Debug, Application -> emit event_kernel_log_application_debug msg + | Debug, Simulation -> emit event_kernel_log_simulation_debug msg + | Info, Application -> emit event_kernel_log_application_info msg + | Info, Simulation -> emit event_kernel_log_simulation_info msg + | Error, Application -> emit event_kernel_log_application_error msg + | Error, Simulation -> emit event_kernel_log_simulation_error msg + | Fatal, Application -> emit event_kernel_log_application_fatal msg + | Fatal, Simulation -> emit event_kernel_log_simulation_fatal msg diff --git a/etherlink/bin_node/lib_prod/events.mli b/etherlink/bin_node/lib_prod/events.mli index 923cb04c8cd5..7e6bb865f7a7 100644 --- a/etherlink/bin_node/lib_prod/events.mli +++ b/etherlink/bin_node/lib_prod/events.mli @@ -58,3 +58,11 @@ val shutdown_node : exit_status:int -> unit Lwt.t (** [callback_log ~uri ~meth ~body] is used as the debug event used as callback for resto to logs the requests. *) val callback_log : uri:string -> meth:string -> body:string -> unit Lwt.t + +type kernel_log_kind = Application | Simulation + +type kernel_log_level = Debug | Info | Error | Fatal + +(** Logs kernel log [Debug]. *) +val event_kernel_log : + level:kernel_log_level -> kind:kernel_log_kind -> msg:string -> unit Lwt.t diff --git a/etherlink/bin_node/lib_prod/evm_context.ml b/etherlink/bin_node/lib_prod/evm_context.ml index b15f150417da..68cfb4ab9bce 100644 --- a/etherlink/bin_node/lib_prod/evm_context.ml +++ b/etherlink/bin_node/lib_prod/evm_context.ml @@ -5,11 +5,28 @@ (* *) (*****************************************************************************) +type init_status = Loaded | Created + +type head = { + current_block_hash : Ethereum_types.block_hash; + next_blueprint_number : Ethereum_types.quantity; + evm_state : Evm_state.t; +} + +type parameters = { + kernel_path : string option; + data_dir : string; + preimages : string; + preimages_endpoint : Uri.t option; + smart_rollup_address : string; +} + type session_state = { mutable context : Irmin_context.rw; mutable next_blueprint_number : Ethereum_types.quantity; mutable current_block_hash : Ethereum_types.block_hash; mutable pending_upgrade : Ethereum_types.Upgrade.t option; + mutable evm_state : Evm_state.t; } type t = { @@ -18,508 +35,922 @@ type t = { preimages : string; preimages_endpoint : Uri.t option; smart_rollup_address : Tezos_crypto.Hashed.Smart_rollup_address.t; - blueprint_watcher : Blueprint_types.t Lwt_watcher.input; - store : Store.t; + store : Evm_store.t; session : session_state; - head_lock : Lwt_mutex.t; - (* TODO: https://gitlab.com/tezos/tezos/-/issues/7073 - [head_lock] is only necessary because several workers can modify the - current HEAD of the chain *) } -let with_store_transaction ctxt k = - Store.with_transaction ctxt.store (fun txn_store -> - k {ctxt with store = txn_store}) - -let store_path ~data_dir = Filename.Infix.(data_dir // "store") - -let load ~data_dir index = - let open Lwt_result_syntax in - let* store = Store.init ~data_dir in - let* latest = Store.Context_hashes.find_latest store in - match latest with - | Some (Qty latest_blueprint_number, checkpoint) -> - let*! context = Irmin_context.checkout_exn index checkpoint in - let*! evm_state = Irmin_context.PVMState.get context in - let+ current_block_hash = Evm_state.current_block_hash evm_state in - ( store, - context, - Ethereum_types.Qty Z.(succ latest_blueprint_number), - current_block_hash, - true ) - | None -> - let context = Irmin_context.empty index in - return +let blueprint_watcher : Blueprint_types.with_events Lwt_watcher.input = + Lwt_watcher.create_input () + +let session_to_head_info session = + { + evm_state = session.evm_state; + next_blueprint_number = session.next_blueprint_number; + current_block_hash = session.current_block_hash; + } + +module Types = struct + type state = t + + type nonrec parameters = parameters +end + +module Name = struct + type t = unit + + let encoding = Data_encoding.unit + + let base = Evm_context_events.section @ ["worker"] + + let pp _fmt () = () + + let equal () () = true +end + +module Request = struct + type (_, _) t = + | Apply_evm_events : { + finalized_level : int32 option; + events : Ethereum_types.Evm_events.t list; + } + -> (unit, tztrace) t + | Apply_blueprint : { + timestamp : Time.Protocol.t; + payload : Blueprint_types.payload; + delayed_transactions : Ethereum_types.hash list; + } + -> (unit, tztrace) t + | Last_produce_blueprint : (Blueprint_types.t, tztrace) t + | Blueprint : { + level : Ethereum_types.quantity; + } + -> (Blueprint_types.with_events option, tztrace) t + | Blueprints_range : { + from : Ethereum_types.quantity; + to_ : Ethereum_types.quantity; + } + -> ((Ethereum_types.quantity * Blueprint_types.payload) list, tztrace) t + | Last_known_L1_level : (int32 option, tztrace) t + | New_last_known_L1_level : int32 -> (unit, tztrace) t + | Delayed_inbox_hashes : (Ethereum_types.hash list, tztrace) t + + type view = View : _ t -> view + + let view req = View req + + let encoding = + let open Data_encoding in + union + [ + case + (Tag 0) + ~title:"Apply_evm_events" + (obj3 + (req "request" (constant "apply_evm_events")) + (opt "finalized_level" int32) + (req "events" (list Ethereum_types.Evm_events.encoding))) + (function + | View (Apply_evm_events {finalized_level; events}) -> + Some ((), finalized_level, events) + | _ -> None) + (fun ((), finalized_level, events) -> + View (Apply_evm_events {finalized_level; events})); + case + (Tag 1) + ~title:"Apply_blueprint" + (obj4 + (req "request" (constant "apply_blueprint")) + (req "timestamp" Time.Protocol.encoding) + (req "payload" Blueprint_types.payload_encoding) + (req "delayed_transactions" (list Ethereum_types.hash_encoding))) + (function + | View (Apply_blueprint {timestamp; payload; delayed_transactions}) + -> + Some ((), timestamp, payload, delayed_transactions) + | _ -> None) + (fun ((), timestamp, payload, delayed_transactions) -> + View (Apply_blueprint {timestamp; payload; delayed_transactions})); + case + (Tag 2) + ~title:"Last_produce_blueprint" + (obj1 (req "request" (constant "last_produce_blueprint"))) + (function View Last_produce_blueprint -> Some () | _ -> None) + (fun () -> View Last_produce_blueprint); + case + (Tag 4) + ~title:"Blueprint" + (obj2 + (req "request" (constant "blueprint")) + (req "level" Ethereum_types.quantity_encoding)) + (function View (Blueprint {level}) -> Some ((), level) | _ -> None) + (fun ((), level) -> View (Blueprint {level})); + case + (Tag 5) + ~title:"Blueprints_range" + (obj3 + (req "request" (constant "Blueprints_range")) + (req "from" Ethereum_types.quantity_encoding) + (req "to" Ethereum_types.quantity_encoding)) + (function + | View (Blueprints_range {from; to_}) -> Some ((), from, to_) + | _ -> None) + (fun ((), from, to_) -> View (Blueprints_range {from; to_})); + case + (Tag 6) + ~title:"Last_known_L1_level" + (obj1 (req "request" (constant "last_known_l1_level"))) + (function View Last_known_L1_level -> Some () | _ -> None) + (fun () -> View Last_known_L1_level); + case + (Tag 7) + ~title:"New_last_known_L1_level" + (obj2 + (req "request" (constant "new_last_known_l1_level")) + (req "value" int32)) + (function + | View (New_last_known_L1_level l) -> Some ((), l) | _ -> None) + (fun ((), l) -> View (New_last_known_L1_level l)); + case + (Tag 8) + ~title:"Delayed_inbox_hashes" + (obj1 (req "request" (constant "Delayed_inbox_hashes"))) + (function View Delayed_inbox_hashes -> Some () | _ -> None) + (fun () -> View Delayed_inbox_hashes); + ] + + let pp ppf view = + Data_encoding.Json.pp ppf @@ Data_encoding.Json.construct encoding view +end + +let head_info, head_info_waker = Lwt.task () + +let init_status, init_status_waker = Lwt.task () + +let execution_config, execution_config_waker = Lwt.task () + +module State = struct + let with_store_transaction ctxt k = + Evm_store.with_transaction ctxt.store (fun txn_store -> + k {ctxt with store = txn_store}) + + let store_path ~data_dir = Filename.Infix.(data_dir // "store") + + let load ~data_dir index = + let open Lwt_result_syntax in + let* store = Evm_store.init ~data_dir in + let* latest = Evm_store.Context_hashes.find_latest store in + match latest with + | Some (Qty latest_blueprint_number, checkpoint) -> + let*! context = Irmin_context.checkout_exn index checkpoint in + let*! evm_state = Irmin_context.PVMState.get context in + let+ current_block_hash = Evm_state.current_block_hash evm_state in ( store, context, - Ethereum_types.Qty Z.zero, - Ethereum_types.genesis_parent_hash, - false ) - -let commit_next_head (ctxt : t) evm_state = - let open Lwt_result_syntax in - let*! context = Irmin_context.PVMState.set ctxt.session.context evm_state in - let*! checkpoint = Irmin_context.commit context in - let* () = - Store.Context_hashes.store + Ethereum_types.Qty Z.(succ latest_blueprint_number), + current_block_hash, + Loaded ) + | None -> + let context = Irmin_context.empty index in + return + ( store, + context, + Ethereum_types.Qty Z.zero, + Ethereum_types.genesis_parent_hash, + Created ) + + let commit store context evm_state number = + let open Lwt_result_syntax in + let*! context = Irmin_context.PVMState.set context evm_state in + let*! checkpoint = Irmin_context.commit context in + let* () = Evm_store.Context_hashes.store store number checkpoint in + return context + + let commit_next_head (ctxt : t) evm_state = + commit ctxt.store + ctxt.session.context + evm_state ctxt.session.next_blueprint_number - checkpoint - in - return context -let replace_current_commit (ctxt : t) evm_state = - let open Lwt_result_syntax in - let (Qty next) = ctxt.session.next_blueprint_number in - let*! context = Irmin_context.PVMState.set ctxt.session.context evm_state in - let*! checkpoint = Irmin_context.commit context in - let* () = - Store.Context_hashes.store ctxt.store (Qty Z.(pred next)) checkpoint - in - return context + let replace_current_commit (ctxt : t) evm_state = + let (Qty next) = ctxt.session.next_blueprint_number in + commit ctxt.store ctxt.session.context evm_state (Qty Z.(pred next)) + + let inspect ctxt path = + let open Lwt_syntax in + let* res = Evm_state.inspect ctxt.session.evm_state path in + return res + + let on_modified_head ctxt evm_state context = + ctxt.session.evm_state <- evm_state ; + ctxt.session.context <- context + + let apply_evm_event_unsafe on_success ctxt evm_state event = + let open Lwt_result_syntax in + let open Ethereum_types in + let*! () = Evm_events_follower_events.new_event event in + match event with + | Evm_events.Upgrade_event upgrade -> + let on_success session = + session.pending_upgrade <- Some upgrade ; + on_success session + in + let payload = + Ethereum_types.Upgrade.to_bytes upgrade |> String.of_bytes + in + let*! evm_state = + Evm_state.modify + ~key:Durable_storage_path.kernel_upgrade + ~value:payload + evm_state + in + let* () = + Evm_store.Kernel_upgrades.store + ctxt.store + ctxt.session.next_blueprint_number + upgrade + in + let*! () = Events.pending_upgrade upgrade in + return (evm_state, on_success) + | Sequencer_upgrade_event sequencer_upgrade -> + let payload = + Sequencer_upgrade.to_bytes sequencer_upgrade |> String.of_bytes + in + let*! evm_state = + Evm_state.modify + ~key:Durable_storage_path.sequencer_upgrade + ~value:payload + evm_state + in + return (evm_state, on_success) + | Blueprint_applied {number = Qty number; hash = expected_block_hash} -> ( + let* block_hash_opt = + let*! bytes = + inspect + ctxt + (Durable_storage_path.Indexes.block_by_number (Nth number)) + in + return (Option.map decode_block_hash bytes) + in + match block_hash_opt with + | Some found_block_hash -> + if found_block_hash = expected_block_hash then + let*! () = + Evm_events_follower_events.upstream_blueprint_applied + (number, expected_block_hash) + in + return (evm_state, on_success) + else + let*! () = + Evm_events_follower_events.diverged + (number, expected_block_hash, found_block_hash) + in + tzfail + (Node_error.Diverged + (number, expected_block_hash, Some found_block_hash)) + | None -> + let*! () = + Evm_events_follower_events.missing_block + (number, expected_block_hash) + in + tzfail (Node_error.Diverged (number, expected_block_hash, None))) + | New_delayed_transaction delayed_transaction -> + let*! data_dir, config = execution_config in + let* evm_state = + Evm_state.execute + ~data_dir + ~config + evm_state + [ + `Input + ("\254" + ^ Bytes.to_string + (Delayed_transaction.to_rlp delayed_transaction)); + ] + in + let* () = + Evm_store.Delayed_transactions.store + ctxt.store + ctxt.session.next_blueprint_number + delayed_transaction + in + return (evm_state, on_success) + + let apply_evm_events ?finalized_level (ctxt : t) events = + let open Lwt_result_syntax in + let* context, evm_state, on_success = + with_store_transaction ctxt @@ fun ctxt -> + let* on_success, ctxt, evm_state = + List.fold_left_es + (fun (on_success, ctxt, evm_state) event -> + let* evm_state, on_success = + apply_evm_event_unsafe on_success ctxt evm_state event + in + return (on_success, ctxt, evm_state)) + (ignore, ctxt, ctxt.session.evm_state) + events + in + let* _ = + Option.map_es + (Evm_store.L1_latest_known_level.store ctxt.store) + finalized_level + in + let* ctxt = replace_current_commit ctxt evm_state in + return (ctxt, evm_state, on_success) + in + on_modified_head ctxt evm_state context ; + on_success ctxt.session ; + return_unit + + type error += Cannot_apply_blueprint of {local_state_level : Z.t} + + let () = + register_error_kind + `Permanent + ~id:"evm_node_dev_cannot_apply_blueprint" + ~title:"Cannot apply a blueprint" + ~description: + "The EVM node could not apply a blueprint on top of its local EVM \ + state." + ~pp:(fun ppf local_state_level -> + Format.fprintf + ppf + "The EVM node could not apply a blueprint on top of its local EVM \ + state at level %a." + Z.pp_print + local_state_level) + Data_encoding.(obj1 (req "current_state_level" n)) + (function + | Cannot_apply_blueprint {local_state_level} -> Some local_state_level + | _ -> None) + (fun local_state_level -> Cannot_apply_blueprint {local_state_level}) + + let check_pending_upgrade ctxt timestamp = + match ctxt.session.pending_upgrade with + | None -> None + | Some upgrade -> + if Time.Protocol.(upgrade.timestamp <= timestamp) then Some upgrade.hash + else None + + let check_upgrade ctxt evm_state = + let open Lwt_result_syntax in + function + | Some root_hash -> + let* () = + Evm_store.Kernel_upgrades.record_apply + ctxt.store + ctxt.session.next_blueprint_number + in -let evm_state ctxt = Irmin_context.PVMState.get ctxt.session.context + let*! bytes = + Evm_state.inspect evm_state Durable_storage_path.kernel_root_hash + in + let new_hash_candidate = + Option.map + (fun bytes -> + let (`Hex hex) = Hex.of_bytes bytes in + Ethereum_types.hash_of_string hex) + bytes + in -let inspect ctxt path = - let open Lwt_syntax in - let* evm_state = evm_state ctxt in - Evm_state.inspect evm_state path + let*! () = + match new_hash_candidate with + | Some current_root_hash when root_hash = current_root_hash -> + Events.applied_upgrade + root_hash + ctxt.session.next_blueprint_number + | _ -> + Events.failed_upgrade root_hash ctxt.session.next_blueprint_number + in -let on_modified_head ctxt context = ctxt.session.context <- context + return_true + | None -> return_false + + (** [apply_blueprint_store_unsafe ctxt payload delayed_transactions] applies + the blueprint [payload] on the head of [ctxt], and commit the resulting + state to Irmin and the node’s store. + + However, it does not modifies [ctxt] to make it aware of the new state. + This is because [apply_blueprint_store_unsafe] is expected to be called + within a SQL transaction to make sure the node’s store is not left in an + inconsistent state in case of error. *) + let apply_blueprint_store_unsafe ctxt timestamp payload delayed_transactions = + let open Lwt_result_syntax in + Evm_store.assert_in_transaction ctxt.store ; + let*! data_dir, config = execution_config in + let (Qty next) = ctxt.session.next_blueprint_number in + + let* try_apply = + Evm_state.apply_blueprint ~data_dir ~config ctxt.session.evm_state payload + in -let apply_evm_event_unsafe on_success ctxt evm_state event = - let open Lwt_result_syntax in - let open Ethereum_types in - let*! () = Evm_events_follower_events.new_event event in - match event with - | Evm_events.Upgrade_event upgrade -> - let on_success session = - session.pending_upgrade <- Some upgrade ; - on_success session - in - let payload = - Ethereum_types.Upgrade.to_bytes upgrade |> String.of_bytes - in - let*! evm_state = - Evm_state.modify - ~key:Durable_storage_path.kernel_upgrade - ~value:payload - evm_state - in - let* () = - Store.Kernel_upgrades.store - ctxt.store - ctxt.session.next_blueprint_number - upgrade - in - let*! () = Events.pending_upgrade upgrade in - return (evm_state, on_success) - | Sequencer_upgrade_event sequencer_upgrade -> - let payload = - Sequencer_upgrade.to_bytes sequencer_upgrade |> String.of_bytes - in - let*! evm_state = - Evm_state.modify - ~key:Durable_storage_path.sequencer_upgrade - ~value:payload - evm_state - in - return (evm_state, on_success) - | Blueprint_applied {number = Qty number; hash = expected_block_hash} -> ( - let* block_hash_opt = - let*! bytes = - inspect - ctxt - (Durable_storage_path.Indexes.block_by_number (Nth number)) + match try_apply with + | Apply_success + (evm_state, Block_height blueprint_number, current_block_hash) + when Z.equal blueprint_number next -> + let* () = + Evm_store.Blueprints.store + ctxt.store + {number = Qty blueprint_number; timestamp; payload} in - return (Option.map decode_block_hash bytes) - in - match block_hash_opt with - | Some found_block_hash -> - if found_block_hash = expected_block_hash then - let*! () = - Evm_events_follower_events.upstream_blueprint_applied - (number, expected_block_hash) - in - return (evm_state, on_success) + + let root_hash_candidate = check_pending_upgrade ctxt timestamp in + let* applied_upgrade = + check_upgrade ctxt evm_state root_hash_candidate + in + + let* delayed_transactions = + List.map_es + (fun hash -> + let* delayed_transaction = + Evm_store.Delayed_transactions.at_hash ctxt.store hash + in + match delayed_transaction with + | None -> + failwith + "Delayed transaction %a is missing from store" + Ethereum_types.pp_hash + hash + | Some delayed_transaction -> return delayed_transaction) + delayed_transactions + in + let* context = commit_next_head ctxt evm_state in + return + ( evm_state, + context, + current_block_hash, + applied_upgrade, + delayed_transactions ) + | Apply_success _ (* Produced a block, but not of the expected height *) + | Apply_failure (* Did not produce a block *) -> + (* TODO: https://gitlab.com/tezos/tezos/-/issues/6826 *) + let*! () = Blueprint_events.invalid_blueprint_produced next in + tzfail (Cannot_apply_blueprint {local_state_level = Z.pred next}) + + let on_new_head ctxt ~applied_upgrade evm_state context block_hash + blueprint_with_events = + let open Lwt_syntax in + let (Qty level) = ctxt.session.next_blueprint_number in + ctxt.session.evm_state <- evm_state ; + ctxt.session.context <- context ; + ctxt.session.next_blueprint_number <- Qty (Z.succ level) ; + ctxt.session.current_block_hash <- block_hash ; + Lwt_watcher.notify blueprint_watcher blueprint_with_events ; + if applied_upgrade then ctxt.session.pending_upgrade <- None ; + let* head_info in + head_info := session_to_head_info ctxt.session ; + Blueprint_events.blueprint_applied (level, block_hash) + + let apply_blueprint ctxt timestamp payload delayed_transactions = + let open Lwt_result_syntax in + let* ( evm_state, + context, + current_block_hash, + applied_upgrade, + delayed_transactions ) = + with_store_transaction ctxt @@ fun ctxt -> + apply_blueprint_store_unsafe ctxt timestamp payload delayed_transactions + in + let*! () = + on_new_head + ctxt + ~applied_upgrade + evm_state + context + current_block_hash + { + delayed_transactions; + blueprint = + {number = ctxt.session.next_blueprint_number; timestamp; payload}; + } + in + return_unit + + let init ?kernel_path ~data_dir ~preimages ~preimages_endpoint + ~smart_rollup_address () = + let open Lwt_result_syntax in + let*! () = + Lwt_utils_unix.create_dir (Evm_state.kernel_logs_directory ~data_dir) + in + let* index = + Irmin_context.load ~cache_size:100_000 Read_write (store_path ~data_dir) + in + let destination = + Tezos_crypto.Hashed.Smart_rollup_address.of_string_exn + smart_rollup_address + in + let* store, context, next_blueprint_number, current_block_hash, init_status + = + load ~data_dir index + in + let* pending_upgrade = + Evm_store.Kernel_upgrades.find_latest_pending store + in + + let* evm_state, context = + match kernel_path with + | Some kernel -> + if init_status = Loaded then + let*! () = Events.ignored_kernel_arg () in + let*! evm_state = Irmin_context.PVMState.get context in + return (evm_state, context) else - let*! () = - Evm_events_follower_events.diverged - (number, expected_block_hash, found_block_hash) - in - tzfail - (Node_error.Diverged - (number, expected_block_hash, Some found_block_hash)) + let* evm_state = Evm_state.init ~kernel in + let (Qty next) = next_blueprint_number in + let* context = commit store context evm_state (Qty Z.(pred next)) in + return (evm_state, context) | None -> - let*! () = - Evm_events_follower_events.missing_block - (number, expected_block_hash) - in - tzfail (Node_error.Diverged (number, expected_block_hash, None))) + if init_status = Loaded then + let*! evm_state = Irmin_context.PVMState.get context in + return (evm_state, context) + else + failwith + "Cannot compute the initial EVM state without the path to the \ + initial kernel" + in -let apply_evm_events ~finalized_level (ctxt : t) events = - let open Lwt_result_syntax in - Lwt_mutex.with_lock ctxt.head_lock @@ fun () -> - let* context, on_success = - with_store_transaction ctxt @@ fun ctxt -> - let*! evm_state = evm_state ctxt in - let* on_success, ctxt, evm_state = - List.fold_left_es - (fun (on_success, ctxt, evm_state) event -> - let* evm_state, on_success = - apply_evm_event_unsafe on_success ctxt evm_state event - in - return (on_success, ctxt, evm_state)) - (ignore, ctxt, evm_state) - events + let ctxt = + { + index; + data_dir; + preimages; + preimages_endpoint; + smart_rollup_address = destination; + session = + { + context; + next_blueprint_number; + current_block_hash; + pending_upgrade; + evm_state; + }; + store; + } in - let* _ = Store.L1_latest_known_level.store ctxt.store finalized_level in - let* ctxt = replace_current_commit ctxt evm_state in - return (ctxt, on_success) - in - on_modified_head ctxt context ; - on_success ctxt.session ; - return_unit -let execution_config ctxt = - Config.config - ~preimage_directory:ctxt.preimages - ?preimage_endpoint:ctxt.preimages_endpoint - ~kernel_debug:true - ~destination:ctxt.smart_rollup_address - () - -type error += Cannot_apply_blueprint of {local_state_level : Z.t} - -let () = - register_error_kind - `Permanent - ~id:"evm_node_prod_cannot_apply_blueprint" - ~title:"Cannot apply a blueprint" - ~description: - "The EVM node could not apply a blueprint on top of its local EVM state." - ~pp:(fun ppf local_state_level -> - Format.fprintf - ppf - "The EVM node could not apply a blueprint on top of its local EVM \ - state at level %a." - Z.pp_print - local_state_level) - Data_encoding.(obj1 (req "current_state_level" n)) - (function - | Cannot_apply_blueprint {local_state_level} -> Some local_state_level - | _ -> None) - (fun local_state_level -> Cannot_apply_blueprint {local_state_level}) - -let check_pending_upgrade ctxt timestamp = - match ctxt.session.pending_upgrade with - | None -> None - | Some upgrade -> - if Time.Protocol.(upgrade.timestamp <= timestamp) then Some upgrade.hash - else None - -let check_upgrade ctxt evm_state = - let open Lwt_result_syntax in - function - | Some root_hash -> - let* () = - Store.Kernel_upgrades.record_apply - ctxt.store - ctxt.session.next_blueprint_number - in + let*! () = + Option.iter_s + (fun upgrade -> Events.pending_upgrade upgrade) + pending_upgrade + in + + return (ctxt, init_status) - let*! bytes = - Evm_state.inspect evm_state Durable_storage_path.kernel_root_hash + let init_from_rollup_node ~data_dir ~rollup_node_data_dir = + let open Lwt_result_syntax in + let* Sc_rollup_block.(_, {context; _}) = + let open Rollup_node_storage in + let* last_finalized_level, levels_to_hashes, l2_blocks = + Rollup_node_storage.load ~rollup_node_data_dir () in - let new_hash_candidate = - Option.map - (fun bytes -> - let (`Hex hex) = Hex.of_bytes bytes in - Ethereum_types.hash_of_string hex) - bytes + let* final_level = Last_finalized_level.read last_finalized_level in + let*? final_level = + Option.to_result + ~none: + [ + error_of_fmt + "Rollup node storage is missing the last finalized level"; + ] + final_level in - - let*! () = - match new_hash_candidate with - | Some current_root_hash when root_hash = current_root_hash -> - Events.applied_upgrade root_hash ctxt.session.next_blueprint_number - | _ -> - Events.failed_upgrade root_hash ctxt.session.next_blueprint_number + let* final_level_hash = + Levels_to_hashes.find levels_to_hashes final_level in + let*? final_level_hash = + Option.to_result + ~none: + [ + error_of_fmt + "Rollup node has no block hash for the l1 level %ld" + final_level; + ] + final_level_hash + in + let* final_l2_block = L2_blocks.read l2_blocks final_level_hash in + Lwt.return + @@ Option.to_result + ~none: + [ + error_of_fmt + "Rollup node has no l2 blocks for the l1 block hash %a" + Block_hash.pp + final_level_hash; + ] + final_l2_block + in + let checkpoint = + Smart_rollup_context_hash.to_bytes context |> Context_hash.of_bytes_exn + in + let rollup_node_context_dir = + Filename.Infix.(rollup_node_data_dir // "context") + in + let* rollup_node_index = + Irmin_context.load ~cache_size:100_000 Read_only rollup_node_context_dir + in + let evm_context_dir = store_path ~data_dir in + let*! () = Lwt_utils_unix.create_dir evm_context_dir in + let* () = + Irmin_context.export_snapshot + rollup_node_index + checkpoint + ~path:evm_context_dir + in + let* evm_node_index = + Irmin_context.load ~cache_size:100_000 Read_write evm_context_dir + in + let*! evm_node_context = + Irmin_context.checkout_exn evm_node_index checkpoint + in + let*! evm_state = Irmin_context.PVMState.get evm_node_context in - return_true - | None -> return_false + (* Tell the kernel that it is executed by an EVM node *) + let*! evm_state = Evm_state.flag_local_exec evm_state in + (* We remove the delayed inbox from the EVM state. Its contents will be + retrieved by the sequencer by inspecting the evm events. *) + let*! evm_state = Evm_state.clear_delayed_inbox evm_state in -(** [apply_blueprint_store_unsafe ctxt payload] applies the blueprint [payload] - on the head of [ctxt], and commit the resulting state to Irmin and the - node’s store. + (* For changes made to [evm_state] to take effect, we commit the result *) + let*! evm_node_context = + Irmin_context.PVMState.set evm_node_context evm_state + in + let*! checkpoint = Irmin_context.commit evm_node_context in - However, it does not modifies [ctxt] to make it aware of the new state. - This is because [apply_blueprint_store_unsafe] is expected to be called - within a SQL transaction to make sure the node’s store is not left in an - inconsistent state in case of error. *) -let apply_blueprint_store_unsafe ctxt timestamp payload = - let open Lwt_result_syntax in - Store.assert_in_transaction ctxt.store ; - let*! evm_state = evm_state ctxt in - let config = execution_config ctxt in - let (Qty next) = ctxt.session.next_blueprint_number in - - let* try_apply = Evm_state.apply_blueprint ~config evm_state payload in - - match try_apply with - | Apply_success (evm_state, Block_height blueprint_number, current_block_hash) - when Z.equal blueprint_number next -> - let* () = - Store.Executable_blueprints.store - ctxt.store - {number = Qty blueprint_number; timestamp; payload} + (* Assert we can read the current blueprint number *) + let* current_blueprint_number = + let*! current_blueprint_number_opt = + Evm_state.inspect evm_state Durable_storage_path.Block.current_number in + match current_blueprint_number_opt with + | Some bytes -> return (Bytes.to_string bytes |> Z.of_bits) + | None -> failwith "The blueprint number was not found" + in - let root_hash_candidate = check_pending_upgrade ctxt timestamp in - let* applied_upgrade = check_upgrade ctxt evm_state root_hash_candidate in - - let* context = commit_next_head ctxt evm_state in - return (context, current_block_hash, applied_upgrade) - | Apply_success _ (* Produced a block, but not of the expected height *) - | Apply_failure (* Did not produce a block *) -> - (* TODO: https://gitlab.com/tezos/tezos/-/issues/6826 *) - let*! () = Blueprint_events.invalid_blueprint_produced next in - tzfail (Cannot_apply_blueprint {local_state_level = Z.pred next}) - -let on_new_head ctxt ~applied_upgrade timestamp context block_hash payload = - let (Qty level) = ctxt.session.next_blueprint_number in - ctxt.session.context <- context ; - ctxt.session.next_blueprint_number <- Qty (Z.succ level) ; - ctxt.session.current_block_hash <- block_hash ; - Lwt_watcher.notify - ctxt.blueprint_watcher - {number = Qty level; timestamp; payload} ; - if applied_upgrade then ctxt.session.pending_upgrade <- None ; - Blueprint_events.blueprint_applied (level, block_hash) - -let apply_and_publish_blueprint (ctxt : t) timestamp - (blueprint : Sequencer_blueprint.t) = - let open Lwt_result_syntax in - Lwt_mutex.with_lock ctxt.head_lock @@ fun () -> - let (Qty level) = ctxt.session.next_blueprint_number in - let* context, current_block_hash, applied_upgrade = - with_store_transaction ctxt @@ fun ctxt -> - let* current_block_hash = - apply_blueprint_store_unsafe ctxt timestamp blueprint.to_execute + (* Assert we can read the current block hash *) + let* () = + let*! current_block_hash_opt = + Evm_state.inspect evm_state Durable_storage_path.Block.current_hash + in + match current_block_hash_opt with + | Some _bytes -> return_unit + | None -> failwith "The block hash was not found" in + (* Init the store *) + let* store = Evm_store.init ~data_dir in let* () = - Store.Publishable_blueprints.store - ctxt.store - (Qty level) - blueprint.to_publish + Evm_store.Context_hashes.store + store + (Qty current_blueprint_number) + checkpoint in - return current_block_hash - in - let*! () = - on_new_head - ctxt - ~applied_upgrade - timestamp - context - current_block_hash - blueprint.to_execute - in - Blueprints_publisher.publish level blueprint.to_publish - -let apply_blueprint ctxt timestamp payload = + return_unit + + let last_produced_blueprint (ctxt : t) = + let open Lwt_result_syntax in + let (Qty next) = ctxt.session.next_blueprint_number in + let current = Ethereum_types.Qty Z.(pred next) in + let* blueprint = Evm_store.Blueprints.find ctxt.store current in + match blueprint with + | Some blueprint -> return blueprint + | None -> failwith "Could not fetch the last produced blueprint" + + let delayed_inbox_hashes evm_state = + let open Lwt_syntax in + let* keys = + Evm_state.subkeys + evm_state + Durable_storage_path.Delayed_transaction.hashes + in + let hashes = + (* Remove the empty, meta keys *) + List.filter_map + (fun key -> + if key = "" || key = "meta" then None + else Some (Ethereum_types.hash_of_string key)) + keys + in + return hashes + + let blueprint_with_events ctxt level = + let open Lwt_result_syntax in + let* blueprint = Evm_store.Blueprints.find ctxt.store level in + match blueprint with + | None -> return None + | Some blueprint -> + let* delayed_transactions = + Evm_store.Delayed_transactions.at_level ctxt.store level + in + return_some Blueprint_types.{delayed_transactions; blueprint} +end + +module Worker = Worker.MakeSingle (Name) (Request) (Types) + +type worker = Worker.infinite Worker.queue Worker.t + +module Handlers = struct + open Request + + type self = worker + + type launch_error = tztrace + + let on_launch _self () + { + kernel_path : string option; + data_dir : string; + preimages : string; + preimages_endpoint : Uri.t option; + smart_rollup_address : string; + } = + let open Lwt_result_syntax in + let* ctxt, status = + State.init + ?kernel_path + ~data_dir + ~preimages + ~preimages_endpoint + ~smart_rollup_address + () + in + Lwt.wakeup execution_config_waker + @@ ( ctxt.data_dir, + Config.config + ~preimage_directory:ctxt.preimages + ?preimage_endpoint:ctxt.preimages_endpoint + ~kernel_debug:true + ~destination:ctxt.smart_rollup_address + () ) ; + Lwt.wakeup init_status_waker status ; + let first_head = ref (session_to_head_info ctxt.session) in + Lwt.wakeup head_info_waker first_head ; + return ctxt + + let on_request : + type r request_error. + self -> (r, request_error) Request.t -> (r, request_error) result Lwt.t = + fun self request -> + let open Lwt_result_syntax in + match request with + | Apply_evm_events {finalized_level; events} -> + let ctxt = Worker.state self in + State.apply_evm_events ?finalized_level ctxt events + | Apply_blueprint {timestamp; payload; delayed_transactions} -> + let ctxt = Worker.state self in + State.apply_blueprint ctxt timestamp payload delayed_transactions + | Last_produce_blueprint -> + let ctxt = Worker.state self in + State.last_produced_blueprint ctxt + | Blueprint {level} -> + let ctxt = Worker.state self in + State.blueprint_with_events ctxt level + | Blueprints_range {from; to_} -> + let ctxt = Worker.state self in + Evm_store.Blueprints.find_range ctxt.store ~from ~to_ + | Last_known_L1_level -> + let ctxt = Worker.state self in + Evm_store.L1_latest_known_level.find ctxt.store + | New_last_known_L1_level l -> + let ctxt = Worker.state self in + Evm_store.L1_latest_known_level.store ctxt.store l + | Delayed_inbox_hashes -> + let ctxt = Worker.state self in + let*! hashes = State.delayed_inbox_hashes ctxt.session.evm_state in + return hashes + + let on_completion (type a err) _self (_r : (a, err) Request.t) (_res : a) _st + = + Lwt_syntax.return_unit + + let on_no_request _self = Lwt.return_unit + + let on_close _self = Lwt.return_unit + + let on_error (type a b) _self _st (req : (a, b) Request.t) (errs : b) : + unit tzresult Lwt.t = + let open Lwt_result_syntax in + match (req, errs) with + | Apply_evm_events _, [Node_error.Diverged _divergence] -> + Lwt_exit.exit_and_raise Node_error.exit_code_when_diverge + | _ -> return_unit +end + +let table = Worker.create_table Queue + +let worker_promise, worker_waker = Lwt.task () + +type error += No_worker + +let worker = + lazy + (match Lwt.state worker_promise with + | Lwt.Return worker -> Ok worker + | Lwt.Fail e -> Error (TzTrace.make @@ error_of_exn e) + | Lwt.Sleep -> Error (TzTrace.make No_worker)) + +let bind_worker f = let open Lwt_result_syntax in - Lwt_mutex.with_lock ctxt.head_lock @@ fun () -> - let* context, current_block_hash, applied_upgrade = - with_store_transaction ctxt @@ fun ctxt -> - apply_blueprint_store_unsafe ctxt timestamp payload - in - let*! () = - on_new_head - ctxt - ~applied_upgrade - timestamp - context - current_block_hash - payload - in + let res = Lazy.force worker in + match res with + | Error [No_worker] -> + (* There is no worker, nothing to do *) + return_unit + | Error errs -> fail errs + | Ok w -> f w + +let worker_add_request ~request = + let open Lwt_result_syntax in + bind_worker @@ fun w -> + let*! (_pushed : bool) = Worker.Queue.push_request w request in return_unit -let init ?kernel_path ~data_dir ~preimages ~preimages_endpoint +let return_ : (_, _ Worker.message_error) result -> _ = + let open Lwt_result_syntax in + function + | Ok res -> return res + | Error (Closed (Some trace)) -> Lwt.return (Error trace) + | Error (Closed None) -> + failwith + "Cannot interact with the EVM context worker because it is closed" + | Error (Request_error err) -> Lwt.return (Error err) + | Error (Any exn) -> fail_with_exn exn + +let worker_wait_for_request req = + let open Lwt_result_syntax in + let*? w = Lazy.force worker in + let*! res = Worker.Queue.push_request_and_wait w req in + return_ res + +let start ?kernel_path ~data_dir ~preimages ~preimages_endpoint ~smart_rollup_address () = let open Lwt_result_syntax in - let* index = - Irmin_context.load ~cache_size:100_000 Read_write (store_path ~data_dir) - in - let destination = - Tezos_crypto.Hashed.Smart_rollup_address.of_string_exn smart_rollup_address - in - let* store, context, next_blueprint_number, current_block_hash, loaded = - load ~data_dir index - in - let* pending_upgrade = Store.Kernel_upgrades.find_latest_pending store in - let ctxt = - { - index; - data_dir; - preimages; - preimages_endpoint; - smart_rollup_address = destination; - session = - {context; next_blueprint_number; current_block_hash; pending_upgrade}; - blueprint_watcher = Lwt_watcher.create_input (); - store; - head_lock = Lwt_mutex.create (); - } + let* worker = + Worker.launch + table + () + { + kernel_path; + data_dir; + preimages; + preimages_endpoint; + smart_rollup_address; + } + (module Handlers) in + let*! () = Blueprint_events.publisher_is_ready () in + Lwt.wakeup worker_waker worker ; + let*! init_status in + let*! () = Evm_context_events.ready () in + return init_status - let* () = - match kernel_path with - | Some kernel -> - if loaded then - let*! () = Events.ignored_kernel_arg () in - return_unit - else - let* evm_state = Evm_state.init ~kernel in - let* context = replace_current_commit ctxt evm_state in - on_modified_head ctxt context ; - return_unit - | None -> - if loaded then return_unit - else - failwith - "Cannot compute the initial EVM state without the path to the \ - initial kernel" - in +let init_from_rollup_node = State.init_from_rollup_node - let*! () = - Option.iter_s - (fun upgrade -> Events.pending_upgrade upgrade) - pending_upgrade - in +let apply_evm_events ?finalized_level events = + worker_add_request ~request:(Apply_evm_events {finalized_level; events}) + +let apply_blueprint timestamp payload delayed_transactions = + worker_wait_for_request + (Apply_blueprint {timestamp; payload; delayed_transactions}) - return (ctxt, loaded) +let last_produced_blueprint () = worker_wait_for_request Last_produce_blueprint + +let head_info () = + let open Lwt_syntax in + let+ head_info in + !head_info -let init_from_rollup_node ~data_dir ~rollup_node_data_dir = +let execute_and_inspect ?wasm_entrypoint input = let open Lwt_result_syntax in - let* Sc_rollup_block.(_, {context; _}) = - let open Rollup_node_storage in - let* last_finalized_level, levels_to_hashes, l2_blocks = - Rollup_node_storage.load ~rollup_node_data_dir () - in - let* final_level = Last_finalized_level.read last_finalized_level in - let*? final_level = - Option.to_result - ~none: - [ - error_of_fmt - "Rollup node storage is missing the last finalized level"; - ] - final_level - in - let* final_level_hash = - Levels_to_hashes.find levels_to_hashes final_level - in - let*? final_level_hash = - Option.to_result - ~none: - [ - error_of_fmt - "Rollup node has no block hash for the l1 level %ld" - final_level; - ] - final_level_hash - in - let* final_l2_block = L2_blocks.read l2_blocks final_level_hash in - Lwt.return - @@ Option.to_result - ~none: - [ - error_of_fmt - "Rollup node has no l2 blocks for the l1 block hash %a" - Block_hash.pp - final_level_hash; - ] - final_l2_block - in - let checkpoint = - Smart_rollup_context_hash.to_bytes context |> Context_hash.of_bytes_exn - in - let rollup_node_context_dir = - Filename.Infix.(rollup_node_data_dir // "context") - in - let* rollup_node_index = - Irmin_context.load ~cache_size:100_000 Read_only rollup_node_context_dir - in - let evm_context_dir = store_path ~data_dir in - let*! () = Lwt_utils_unix.create_dir evm_context_dir in - let* () = - Irmin_context.export_snapshot - rollup_node_index - checkpoint - ~path:evm_context_dir - in - let* evm_node_index = - Irmin_context.load ~cache_size:100_000 Read_write evm_context_dir - in - let*! evm_node_context = - Irmin_context.checkout_exn evm_node_index checkpoint - in - let*! evm_state = Irmin_context.PVMState.get evm_node_context in + let*! {evm_state; _} = head_info () in + let*! data_dir, config = execution_config in + Evm_state.execute_and_inspect + ~data_dir + ?wasm_entrypoint + ~config + ~input + evm_state + +let inspect path = + let open Lwt_result_syntax in + let*! {evm_state; _} = head_info () in + let*! res = Evm_state.inspect evm_state path in + return res - (* Tell the kernel that it is executed by an EVM node *) - let*! evm_state = Evm_state.flag_local_exec evm_state in - (* We remove the delayed inbox from the EVM state. Its contents will be - retrieved by the sequencer by inspecting the rollup node durable storage. +let blueprints_watcher () = Lwt_watcher.create_stream blueprint_watcher - If we do not remove the delayed inbox from the state, the contents will - never be flushed (because of the distinction between executable / - publishable) *) - let*! evm_state = Evm_state.clear_delayed_inbox evm_state in +let blueprint level = worker_wait_for_request (Blueprint {level}) - (* For changes made to [evm_state] to take effect, we commit the result *) - let*! evm_node_context = - Irmin_context.PVMState.set evm_node_context evm_state - in - let*! checkpoint = Irmin_context.commit evm_node_context in +let blueprints_range from to_ = + worker_wait_for_request (Blueprints_range {from; to_}) - (* Assert we can read the current blueprint number *) - let* current_blueprint_number = - let*! current_blueprint_number_opt = - Evm_state.inspect evm_state Durable_storage_path.Block.current_number - in - match current_blueprint_number_opt with - | Some bytes -> return (Bytes.to_string bytes |> Z.of_bits) - | None -> failwith "The blueprint number was not found" - in +let last_known_l1_level () = worker_wait_for_request Last_known_L1_level - (* Assert we can read the current block hash *) - let* () = - let*! current_block_hash_opt = - Evm_state.inspect evm_state Durable_storage_path.Block.current_hash - in - match current_block_hash_opt with - | Some _bytes -> return_unit - | None -> failwith "The block hash was not found" - in - (* Init the store *) - let* store = Store.init ~data_dir in - let* () = - Store.Context_hashes.store store (Qty current_blueprint_number) checkpoint - in - return_unit +let new_last_known_l1_level l = + worker_add_request ~request:(New_last_known_L1_level l) -let execute_and_inspect ?wasm_entrypoint ~input ctxt = - let open Lwt_result_syntax in - let config = execution_config ctxt in - let*! evm_state = evm_state ctxt in - Evm_state.execute_and_inspect ?wasm_entrypoint ~config ~input evm_state +let delayed_inbox_hashes () = worker_wait_for_request Delayed_inbox_hashes -let last_produced_blueprint (ctxt : t) = +let shutdown () = let open Lwt_result_syntax in - let (Qty next) = ctxt.session.next_blueprint_number in - let current = Ethereum_types.Qty Z.(pred next) in - let* blueprint = Store.Executable_blueprints.find ctxt.store current in - match blueprint with - | Some blueprint -> return blueprint - | None -> failwith "Could not fetch the last produced blueprint" + bind_worker @@ fun w -> + let*! () = Evm_context_events.shutdown () in + let*! () = Worker.shutdown w in + return_unit diff --git a/etherlink/bin_node/lib_prod/evm_context.mli b/etherlink/bin_node/lib_prod/evm_context.mli index e13a5c1ce546..096fd2aa7149 100644 --- a/etherlink/bin_node/lib_prod/evm_context.mli +++ b/etherlink/bin_node/lib_prod/evm_context.mli @@ -5,42 +5,29 @@ (* *) (*****************************************************************************) -type session_state = { - mutable context : Irmin_context.rw; (** Irmin read and write context. *) - mutable next_blueprint_number : Ethereum_types.quantity; - (** Number for the next bluerpint to be produced. *) - mutable current_block_hash : Ethereum_types.block_hash; - (** Hash of the latest processed block *) - mutable pending_upgrade : Ethereum_types.Upgrade.t option; -} +type init_status = Loaded | Created -type t = { - data_dir : string; (** Data dir of the EVM node. *) - index : Irmin_context.rw_index; - preimages : string; (** Path to the preimages directory. *) - preimages_endpoint : Uri.t option; (** URI to fetch missing pre-images. *) - smart_rollup_address : Tezos_crypto.Hashed.Smart_rollup_address.t; - blueprint_watcher : Blueprint_types.t Lwt_watcher.input; - store : Store.t; - session : session_state; - head_lock : Lwt_mutex.t; - (** Lock to acquire to modify the head of the chain *) +type head = { + current_block_hash : Ethereum_types.block_hash; + next_blueprint_number : Ethereum_types.quantity; + evm_state : Evm_state.t; } -(** [init ~data_dir ~preimages ~preimages_endpoint ~smart_rollup_address ()] - creates a context where it initializes the {!type-index}, and use a - checkpoint mechanism to load the latest {!type-store} if any. +(** [start ~data_dir ~preimages ~preimages_endpoint ~smart_rollup_address ()] + creates a new worker to manage a local EVM context where it initializes the + {!type-index}, and use a checkpoint mechanism to load the latest + {!type-store} if any. - Returns an additional boolean telling if the context was loaded from disk - ([true]) or was initialized from scratch ([false]). *) -val init : + Returns a value telling if the context was loaded from disk + ([Loaded]) or was initialized from scratch ([Created]). *) +val start : ?kernel_path:string -> data_dir:string -> preimages:string -> preimages_endpoint:Uri.t option -> smart_rollup_address:string -> unit -> - (t * bool) tzresult Lwt.t + init_status tzresult Lwt.t (** [init_from_rollup_node ~data_dir ~rollup_node_data_dir ~inspect_current_blueprint_number] @@ -50,18 +37,20 @@ val init : val init_from_rollup_node : data_dir:string -> rollup_node_data_dir:string -> unit tzresult Lwt.t -(** [apply_evm_events ~finalized_level ctxt events] applies all the - events [events] on the local context [ctxt]. The events are - performed in a transactional context. *) +(** [apply_evm_events ~finalized_level events] applies all the + events [events] on the local context. The events are performed in a + transactional context. + + Stores [finalized_level] with {!new_last_known_l1_level} if provided. +*) val apply_evm_events : - finalized_level:int32 -> - t -> + ?finalized_level:int32 -> Ethereum_types.Evm_events.t list -> unit tzresult Lwt.t (** [inspect ctxt path] returns the value stored in [path] of the freshest EVM state, if it exists. *) -val inspect : t -> string -> bytes option Lwt.t +val inspect : string -> bytes option tzresult Lwt.t (** [execute_and_inspect ~input ctxt] executes [input] using the freshest EVM state, and returns [input.insights_requests]. @@ -70,21 +59,41 @@ val inspect : t -> string -> bytes option Lwt.t executed. *) val execute_and_inspect : ?wasm_entrypoint:string -> - input:Simulation.Encodings.simulate_input -> - t -> + Simulation.Encodings.simulate_input -> bytes option list tzresult Lwt.t -(** [last_produced_blueprint ctxt] returns the pair of publishable and - executable blueprints used to create the current head of the chain. *) -val last_produced_blueprint : t -> Blueprint_types.t tzresult Lwt.t +(** [last_produced_blueprint ctxt] returns the blueprint used to + create the current head of the chain. *) +val last_produced_blueprint : unit -> Blueprint_types.t tzresult Lwt.t -(** [apply_blueprint ctxt blueprint] applies [blueprint] in the freshest EVM - state stored under [ctxt]. It commits the result if the blueprint produces - the expected block. *) +(** [apply_blueprint timestamp payload delayed_transactions] applies + [payload] in the freshest EVM state stored under [ctxt] at + timestamp [timestamp], forwards the {!Blueprint_types.with_events}. + It commits the result if the blueprint produces the expected block. *) val apply_blueprint : - t -> Time.Protocol.t -> Blueprint_types.payload -> unit tzresult Lwt.t + Time.Protocol.t -> + Blueprint_types.payload -> + Ethereum_types.hash list -> + unit tzresult Lwt.t + +val head_info : unit -> head Lwt.t + +val blueprints_watcher : + unit -> Blueprint_types.with_events Lwt_stream.t * Lwt_watcher.stopper + +val blueprint : + Ethereum_types.quantity -> Blueprint_types.with_events option tzresult Lwt.t + +val blueprints_range : + Ethereum_types.quantity -> + Ethereum_types.quantity -> + (Ethereum_types.quantity * Blueprint_types.payload) list tzresult Lwt.t + +val last_known_l1_level : unit -> int32 option tzresult Lwt.t + +val new_last_known_l1_level : int32 -> unit tzresult Lwt.t + +val shutdown : unit -> unit tzresult Lwt.t -(** Same as {!apply_blueprint}, but additionally publish the blueprint if it is - correct. *) -val apply_and_publish_blueprint : - t -> Time.Protocol.t -> Sequencer_blueprint.t -> unit tzresult Lwt.t +(** [delayed_inbox_hashes ctxt] returns the hashes in the delayed inbox. *) +val delayed_inbox_hashes : unit -> Ethereum_types.hash list tzresult Lwt.t diff --git a/etherlink/bin_node/lib_prod/evm_context_events.ml b/etherlink/bin_node/lib_prod/evm_context_events.ml new file mode 100644 index 000000000000..270ba3d6badb --- /dev/null +++ b/etherlink/bin_node/lib_prod/evm_context_events.ml @@ -0,0 +1,30 @@ +(*****************************************************************************) +(* *) +(* SPDX-License-Identifier: MIT *) +(* Copyright (c) 2024 Nomadic Labs *) +(* *) +(*****************************************************************************) + +include Internal_event.Simple + +let section = Events.section @ ["evm_context"] + +let ready = + declare_0 + ~section + ~name:"evm_context_is_ready" + ~msg:"EVM Context worker is ready" + ~level:Info + () + +let shutdown = + declare_0 + ~section + ~name:"evm_context_shutdown" + ~msg:"EVM Context worker is shutting down" + ~level:Info + () + +let ready () = emit ready () + +let shutdown () = emit shutdown () diff --git a/etherlink/bin_node/lib_prod/evm_events_follower.ml b/etherlink/bin_node/lib_prod/evm_events_follower.ml index cc5312fdb8b4..e34fff41ce91 100644 --- a/etherlink/bin_node/lib_prod/evm_events_follower.ml +++ b/etherlink/bin_node/lib_prod/evm_events_follower.ml @@ -5,7 +5,10 @@ (* *) (*****************************************************************************) -type parameters = {rollup_node_endpoint : Uri.t; ctxt : Evm_context.t} +type parameters = { + rollup_node_endpoint : Uri.t; + filter_event : Ethereum_types.Evm_events.t -> bool; +} module StringSet = Set.Make (String) @@ -21,7 +24,7 @@ module Name = struct let encoding = Data_encoding.unit - let base = ["evm_node"; "prod"; "events_follower"; "worker"] + let base = ["evm_node"; "dev"; "events_follower"; "worker"] let pp _ _ = () @@ -84,7 +87,7 @@ let fetch_event ({rollup_node_endpoint; _} : Types.state) rollup_block_lvl in return event_opt -let on_new_head ({rollup_node_endpoint; ctxt} as state : Types.state) +let on_new_head ({rollup_node_endpoint; filter_event} as state : Types.state) rollup_block_lvl = let open Lwt_result_syntax in let* nb_of_events_bytes = @@ -94,7 +97,7 @@ let on_new_head ({rollup_node_endpoint; ctxt} as state : Types.state) rollup_node_endpoint in match nb_of_events_bytes with - | None -> return_unit + | None -> Evm_context.new_last_known_l1_level rollup_block_lvl | Some nb_of_events_bytes -> let (Qty nb_of_events) = Ethereum_types.decode_number nb_of_events_bytes @@ -109,8 +112,13 @@ let on_new_head ({rollup_node_endpoint; ctxt} as state : Types.state) nb_of_events (fetch_event state rollup_block_lvl) in - let events = List.filter_map Fun.id events in - Evm_context.apply_evm_events ~finalized_level:rollup_block_lvl ctxt events + let events = + List.filter_map + (function + | Some event when filter_event event -> Some event | _ -> None) + events + in + Evm_context.apply_evm_events ~finalized_level:rollup_block_lvl events module Handlers = struct type self = worker @@ -140,12 +148,9 @@ module Handlers = struct (r, request_error) Request.t -> request_error -> unit tzresult Lwt.t = - fun _w _ req errs -> + fun _w _ _req _errs -> let open Lwt_result_syntax in - match (req, errs) with - | New_rollup_node_block _, [Node_error.Diverged _divergence] -> - Lwt_exit.exit_and_raise Node_error.exit_code_when_diverge - | _ -> return_unit + return_unit let on_completion _ _ _ _ = Lwt.return_unit @@ -164,8 +169,18 @@ let worker = lazy (match Lwt.state worker_promise with | Lwt.Return worker -> Ok worker - | Lwt.Fail e -> Error (TzTrace.make @@ error_of_exn e) - | Lwt.Sleep -> Error (TzTrace.make No_worker)) + | Lwt.Fail e -> Result_syntax.tzfail (error_of_exn e) + | Lwt.Sleep -> Result_syntax.tzfail No_worker) + +let bind_worker f = + let open Lwt_result_syntax in + let res = Lazy.force worker in + match res with + | Error [No_worker] -> + (* There is no worker, nothing to do *) + return_unit + | Error errs -> fail errs + | Ok w -> f w let start parameters = let open Lwt_result_syntax in @@ -174,23 +189,17 @@ let start parameters = Lwt.wakeup worker_waker worker let shutdown () = - let open Lwt_syntax in - let w = Lazy.force worker in - match w with - | Error _ -> - (* There is no events follower, nothing to do *) - Lwt.return_unit - | Ok w -> - let* () = Evm_events_follower_events.shutdown () in - Worker.shutdown w - -let worker_add_request ~request : unit tzresult Lwt.t = let open Lwt_result_syntax in - match Lazy.force worker with - | Ok w -> - let*! (_pushed : bool) = Worker.Queue.push_request w request in - return_unit - | Error e -> Lwt.return (Error e) + bind_worker @@ fun w -> + let*! () = Evm_events_follower_events.shutdown () in + let*! () = Worker.shutdown w in + return_unit + +let worker_add_request ~request = + let open Lwt_result_syntax in + bind_worker @@ fun w -> + let*! (_pushed : bool) = Worker.Queue.push_request w request in + return_unit let new_rollup_block rollup_level = worker_add_request ~request:(New_rollup_node_block rollup_level) diff --git a/etherlink/bin_node/lib_prod/evm_events_follower.mli b/etherlink/bin_node/lib_prod/evm_events_follower.mli index 95db737c8d5f..bdb86f554ef0 100644 --- a/etherlink/bin_node/lib_prod/evm_events_follower.mli +++ b/etherlink/bin_node/lib_prod/evm_events_follower.mli @@ -8,14 +8,15 @@ type parameters = { rollup_node_endpoint : Uri.t; (** Rollup node endpoint used to monitor kernel events. *) - ctxt : Evm_context.t; + filter_event : Ethereum_types.Evm_events.t -> bool; + (** Filter event the follower applies. *) } (** [start parameters] starts the events follower. *) val start : parameters -> unit tzresult Lwt.t (** [shutdown ()] stops the events follower. *) -val shutdown : unit -> unit Lwt.t +val shutdown : unit -> unit tzresult Lwt.t (** [new_rollup_block rollup_level] tells the worker that a new L2 head has been published and that the rollup head is now diff --git a/etherlink/bin_node/lib_prod/evm_events_follower_events.ml b/etherlink/bin_node/lib_prod/evm_events_follower_events.ml index c024e7731136..eed15a4cfa20 100644 --- a/etherlink/bin_node/lib_prod/evm_events_follower_events.ml +++ b/etherlink/bin_node/lib_prod/evm_events_follower_events.ml @@ -32,7 +32,7 @@ module Event = struct ~section ~name:"evm_events_new_event" ~msg:"Evm events follower: applying {event}" - ~level:Notice + ~level:Debug ~pp1:Ethereum_types.Evm_events.pp ("event", Ethereum_types.Evm_events.encoding) diff --git a/etherlink/bin_node/lib_prod/evm_services.ml b/etherlink/bin_node/lib_prod/evm_services.ml index 89a8b9b3465d..db69f5709beb 100644 --- a/etherlink/bin_node/lib_prod/evm_services.ml +++ b/etherlink/bin_node/lib_prod/evm_services.ml @@ -20,7 +20,7 @@ let get_blueprint_service = Service.get_service ~description:"Fetch the contents of a blueprint" ~query:Query.empty - ~output:Blueprint_types.encoding + ~output:Blueprint_types.with_events_encoding Path.(evm_services_root / "blueprint" /: Arg.uint63) let blueprint_watcher_service = @@ -31,13 +31,13 @@ let blueprint_watcher_service = Service.get_service ~description:"Watch for new blueprints" ~query:level_query - ~output:Blueprint_types.encoding + ~output:Blueprint_types.with_events_encoding Path.(evm_services_root / "blueprints") -let create_blueprint_watcher_service (ctxt : Evm_context.t) from_level = +let create_blueprint_watcher_service from_level = let open Lwt_syntax in (* input source block creating a stream to observe the events *) - let* head_res = Evm_context.last_produced_blueprint ctxt in + let* head_res = Evm_context.last_produced_blueprint () in let (Qty head_level) = match head_res with | Ok head -> @@ -51,9 +51,7 @@ let create_blueprint_watcher_service (ctxt : Evm_context.t) from_level = in (* generate the next asynchronous event *) - let blueprint_stream, stopper = - Lwt_watcher.create_stream ctxt.blueprint_watcher - in + let blueprint_stream, stopper = Evm_context.blueprints_watcher () in let shutdown () = Lwt_watcher.shutdown stopper in let next = let next_level_requested = ref Z.(of_int64 from_level) in @@ -61,9 +59,7 @@ let create_blueprint_watcher_service (ctxt : Evm_context.t) from_level = if Z.Compare.(!next_level_requested <= head_level) then ( let current_request = !next_level_requested in (next_level_requested := Z.(succ current_request)) ; - let* blueprint = - Store.Executable_blueprints.find ctxt.store (Qty current_request) - in + let* blueprint = Evm_context.blueprint (Qty current_request) in match blueprint with | Ok (Some blueprint) -> return_some blueprint | Ok None -> return_none @@ -74,26 +70,25 @@ let create_blueprint_watcher_service (ctxt : Evm_context.t) from_level = in Tezos_rpc.Answer.return_stream {next; shutdown} -let register_get_smart_rollup_address_service ctxt dir = +let register_get_smart_rollup_address_service smart_rollup_address dir = Directory.register0 dir get_smart_rollup_address_service (fun () () -> let open Lwt_syntax in - return_ok ctxt.Evm_context.smart_rollup_address) + return_ok smart_rollup_address) -let register_get_blueprint_service (ctxt : Evm_context.t) dir = +let register_get_blueprint_service dir = Directory.opt_register1 dir get_blueprint_service (fun level () () -> let open Lwt_result_syntax in let number = Ethereum_types.Qty (Z.of_int64 level) in - let* blueprint = Store.Executable_blueprints.find ctxt.store number in + let* blueprint = Evm_context.blueprint number in return blueprint) -let register_blueprint_watcher_service ctxt dir = +let register_blueprint_watcher_service dir = Directory.gen_register0 dir blueprint_watcher_service (fun level () -> - create_blueprint_watcher_service ctxt level) + create_blueprint_watcher_service level) -let register ctxt dir = - register_get_smart_rollup_address_service ctxt dir - |> register_get_blueprint_service ctxt - |> register_blueprint_watcher_service ctxt +let register smart_rollup_address dir = + register_get_smart_rollup_address_service smart_rollup_address dir + |> register_get_blueprint_service |> register_blueprint_watcher_service let get_smart_rollup_address ~evm_node_endpoint = Tezos_rpc_http_client_unix.RPC_client_unix.call_service diff --git a/etherlink/bin_node/lib_prod/evm_services.mli b/etherlink/bin_node/lib_prod/evm_services.mli index 1fcf3090b2ac..ad7e45bfb764 100644 --- a/etherlink/bin_node/lib_prod/evm_services.mli +++ b/etherlink/bin_node/lib_prod/evm_services.mli @@ -14,11 +14,14 @@ val get_smart_rollup_address : val get_blueprint : evm_node_endpoint:Uri.t -> Ethereum_types.quantity -> - Blueprint_types.t tzresult Lwt.t + Blueprint_types.with_events tzresult Lwt.t -val register : Evm_context.t -> unit Directory.t -> unit Directory.t +val register : + Tezos_crypto.Hashed.Smart_rollup_address.t -> + unit Directory.t -> + unit Directory.t val monitor_blueprints : evm_node_endpoint:Uri.t -> Ethereum_types.quantity -> - Blueprint_types.t Lwt_stream.t Lwt.t + Blueprint_types.with_events Lwt_stream.t Lwt.t diff --git a/etherlink/bin_node/lib_prod/evm_state.ml b/etherlink/bin_node/lib_prod/evm_state.ml index 97811836fd9f..78b530c74b69 100644 --- a/etherlink/bin_node/lib_prod/evm_state.ml +++ b/etherlink/bin_node/lib_prod/evm_state.ml @@ -32,13 +32,68 @@ module Wasm_utils = Wasm_utils.Make (Tezos_tree_encoding.Encodings_util.Make (Bare_context)) module Wasm = Wasm_debugger.Make (Wasm_utils) -let execute ?(wasm_entrypoint = Tezos_scoru_wasm.Constants.wasm_entrypoint) - ~config evm_state inbox = +let kernel_logs_directory ~data_dir = Filename.concat data_dir "kernel_logs" + +let level_prefix = function + | Events.Debug -> "[Debug]" + | Info -> "[Info]" + | Error -> "[Error]" + | Fatal -> "[Fatal]" + +let event_kernel_log ~kind ~msg = + let is_level ~level msg = + let prefix = level_prefix level in + String.remove_prefix ~prefix msg |> Option.map (fun msg -> (level, msg)) + in + let level_and_msg = + Option.either_f (is_level ~level:Debug msg) @@ fun () -> + Option.either_f (is_level ~level:Info msg) @@ fun () -> + Option.either_f (is_level ~level:Error msg) @@ fun () -> + is_level ~level:Fatal msg + in + Option.iter_s + (fun (level, msg) -> Events.event_kernel_log ~level ~kind ~msg) + level_and_msg + +let execute ?(kind = Events.Application) ~data_dir ?(log_file = "kernel_log") + ?(wasm_entrypoint = Tezos_scoru_wasm.Constants.wasm_entrypoint) ~config + evm_state inbox = let open Lwt_result_syntax in + let path = Filename.concat (kernel_logs_directory ~data_dir) log_file in let inbox = List.map (function `Input s -> s) inbox in let inbox = List.to_seq [inbox] in + let messages = ref [] in + let write_debug = + Tezos_scoru_wasm.Builtins.Printer + (fun msg -> + messages := msg :: !messages ; + event_kernel_log ~kind ~msg) + in let* evm_state, _, _, _ = - Wasm.Commands.eval ~wasm_entrypoint 0l inbox config Inbox evm_state + Wasm.Commands.eval + ~write_debug + ~wasm_entrypoint + 0l + inbox + config + Inbox + evm_state + in + (* The messages are accumulated during the execution and stored + atomatically at the end to preserve their order. *) + let*! () = + Lwt_io.with_file + ~flags:Unix.[O_WRONLY; O_CREAT; O_APPEND] + ~perm:0o644 + ~mode:Output + path + @@ fun chan -> + Lwt_io.atomic + (fun chan -> + let msgs = List.rev !messages in + let*! () = List.iter_s (Lwt_io.write chan) msgs in + Lwt_io.flush chan) + chan in return evm_state @@ -62,6 +117,13 @@ let inspect evm_state key = let* value = Wasm.Commands.find_key_in_durable evm_state key in Option.map_s Tezos_lazy_containers.Chunked_byte_vector.to_bytes value +let subkeys evm_state key = + let open Lwt_syntax in + let key = Tezos_scoru_wasm.Durable.key_of_string_exn key in + let* durable = Wasm_utils.wrap_as_durable_storage evm_state in + let durable = Tezos_scoru_wasm.Durable.of_storage_exn durable in + Tezos_scoru_wasm.Durable.list durable key + let current_block_height evm_state = let open Lwt_syntax in let* current_block_number = @@ -87,8 +149,10 @@ let current_block_hash evm_state = | Some h -> return (decode_block_hash h) | None -> return genesis_parent_hash -let execute_and_inspect ?wasm_entrypoint ~config - ~input:Simulation.Encodings.{messages; insight_requests; _} ctxt = +let execute_and_inspect ~data_dir ?wasm_entrypoint ~config + ~input: + Simulation.Encodings. + {messages; insight_requests; log_kernel_debug_file; _} ctxt = let open Lwt_result_syntax in let keys = List.map @@ -101,7 +165,16 @@ let execute_and_inspect ?wasm_entrypoint ~config in (* Messages from simulation requests are already valid inputs. *) let messages = List.map (fun s -> `Input s) messages in - let* evm_state = execute ?wasm_entrypoint ~config ctxt messages in + let* evm_state = + execute + ~kind:Simulation + ?log_file:log_kernel_debug_file + ~data_dir + ?wasm_entrypoint + ~config + ctxt + messages + in let*! values = List.map_p (fun key -> inspect evm_state key) keys in return values @@ -109,7 +182,8 @@ type apply_result = | Apply_success of t * block_height * block_hash | Apply_failure -let apply_blueprint ~config evm_state (blueprint : Blueprint_types.payload) = +let apply_blueprint ~data_dir ~config evm_state + (blueprint : Blueprint_types.payload) = let open Lwt_result_syntax in let exec_inputs = List.map @@ -119,6 +193,7 @@ let apply_blueprint ~config evm_state (blueprint : Blueprint_types.payload) = let*! (Block_height before_height) = current_block_height evm_state in let* evm_state = execute + ~data_dir ~wasm_entrypoint:Tezos_scoru_wasm.Constants.wasm_entrypoint ~config evm_state diff --git a/etherlink/bin_node/lib_prod/evm_state.mli b/etherlink/bin_node/lib_prod/evm_state.mli index c09c58564e14..cb2dc6c4504e 100644 --- a/etherlink/bin_node/lib_prod/evm_state.mli +++ b/etherlink/bin_node/lib_prod/evm_state.mli @@ -7,10 +7,22 @@ type t = Irmin_context.PVMState.value -(** [execute ~wasm_entrypoint ~config evm_state messages] executes the - [wasm_entrypoint] function (default to [kernel_run]) with [messages] within - the inbox of [evm_state]. *) +(** Directory where the kernel logs are stored. The function {!execute} below + expect the directory to exist.*) +val kernel_logs_directory : data_dir:string -> string + +(** [execute ?simulation ~data_dir ?log_file ~wasm_entrypoint ~config + evm_state messages] executes the [wasm_entrypoint] function + (default to [kernel_run]) with [messages] within the inbox of + [evm_state]. + + Kernel logs are stored under the {!kernel_logs_directory} in [log_file]. + [simulation] adds a prefix to the event to differenciate the logs. +*) val execute : + ?kind:Events.kernel_log_kind -> + data_dir:string -> + ?log_file:string -> ?wasm_entrypoint:string -> config:Config.config -> t -> @@ -28,10 +40,16 @@ val modify : key:string -> value:string -> t -> t Lwt.t [evm_state], if any. *) val inspect : t -> string -> bytes option Lwt.t -(** [execute_and_inspect ?wasm_entrypoint ~config ~input evm_state] executes - the [wasm_entrypoint] function (default to [kernel_run]) with [input] - within the inbox of [evm_state], and returns [input.insights_requests]. *) +(** [subkeys evm_state key] returns the list of value stored under [key] in + [evm_state]. *) +val subkeys : t -> string -> string trace Lwt.t + +(** [execute_and_inspect ~data_dir ?wasm_entrypoint ~config ~input + evm_state] executes the [wasm_entrypoint] function (default to + [kernel_run]) with [input] within the inbox of [evm_state], and + returns [input.insights_requests]. *) val execute_and_inspect : + data_dir:string -> ?wasm_entrypoint:string -> config:Config.config -> input:Simulation.Encodings.simulate_input -> @@ -49,10 +67,16 @@ type apply_result = | Apply_success of t * Ethereum_types.block_height * Ethereum_types.block_hash | Apply_failure -(** [apply_blueprint ~config state payload] applies the blueprint [payload] on - top of [evm_state]. If the payload produces a block, the new updated EVM - state is returned along with the new block’s height. *) +(** [apply_blueprint ~data-dir ~config state payload] applies the + blueprint [payload] on top of [evm_state]. If the payload produces + a block, the new updated EVM state is returned along with the new + block’s height. + + The [data-dir] is used to store the kernel logs in the + {!kernel_logs_directory}. +*) val apply_blueprint : + data_dir:string -> config:Config.config -> t -> Blueprint_types.payload -> diff --git a/etherlink/bin_node/lib_prod/store.ml b/etherlink/bin_node/lib_prod/evm_store.ml similarity index 80% rename from etherlink/bin_node/lib_prod/store.ml rename to etherlink/bin_node/lib_prod/evm_store.ml index 304eaa1863b1..f67dab404d65 100644 --- a/etherlink/bin_node/lib_prod/store.ml +++ b/etherlink/bin_node/lib_prod/evm_store.ml @@ -19,6 +19,9 @@ module Db = struct let start (module Db : Caqti_lwt.CONNECTION) = caqti @@ Db.start () + let collect_list (module Db : Caqti_lwt.CONNECTION) req arg = + caqti @@ Db.collect_list req arg + let commit (module Db : Caqti_lwt.CONNECTION) = caqti @@ Db.commit () let rollback (module Db : Caqti_lwt.CONNECTION) = caqti @@ Db.rollback () @@ -99,6 +102,20 @@ module Q = struct Ok Ethereum_types.Upgrade.{hash; timestamp}) (t2 root_hash timestamp) + let delayed_transaction = + custom + ~encode:(fun payload -> + Ok + (Data_encoding.Binary.to_string_exn + Ethereum_types.Delayed_transaction.encoding + payload)) + ~decode:(fun bytes -> + Option.to_result ~none:"Not a valid blueprint payload" + @@ Data_encoding.Binary.of_string_opt + Ethereum_types.Delayed_transaction.encoding + bytes) + string + let table_exists = (string ->! bool) @@ {| @@ -248,28 +265,60 @@ module Q = struct ] end + module V5 = struct + let name = "create_blueprints_table" + + let up = + [ + migration_step + {| + CREATE TABLE blueprints ( + id SERIAL PRIMARY KEY, + payload BLOB NOT NULL, + timestamp DATETIME NOT NULL + )|}; + migration_step {| + DROP TABLE executable_blueprints +|}; + migration_step {| + DROP TABLE publishable_blueprints +|}; + migration_step + {| + CREATE TABLE delayed_transactions ( + injected_before INT NOT NULL, + hash TEXT NOT NULL, + payload TEXT NOT NULL + ) + |}; + ] + end + let all : migration list = - [(module V0); (module V1); (module V2); (module V3); (module V4)] + [ + (module V0); + (module V1); + (module V2); + (module V3); + (module V4); + (module V5); + ] end - module Executable_blueprints = struct + module Blueprints = struct let insert = (t3 level timestamp payload ->. unit) - @@ {eos|INSERT INTO executable_blueprints (id, timestamp, payload) VALUES (?, ?, ?)|eos} + @@ {eos|INSERT INTO blueprints (id, timestamp, payload) VALUES (?, ?, ?)|eos} let select = (level ->? t2 payload timestamp) - @@ {eos|SELECT payload, timestamp FROM executable_blueprints WHERE id = ?|eos} - end - - module Publishable_blueprints = struct - let insert = - (t2 level payload ->. unit) - @@ {eos|INSERT INTO publishable_blueprints (id, payload) VALUES (?, ?)|eos} + @@ {eos|SELECT payload, timestamp FROM blueprints WHERE id = ?|eos} - let select = - (level ->? payload) - @@ {eos|SELECT payload FROM publishable_blueprints WHERE id = ?|eos} + let select_range = + (t2 level level ->* t2 level payload) + @@ {|SELECT id, payload FROM blueprints + WHERE ? <= id AND id <= ? + ORDER BY id ASC|} end module Context_hashes = struct @@ -306,6 +355,20 @@ module Q = struct |} end + module Delayed_transactions = struct + let insert = + (t3 level root_hash delayed_transaction ->. unit) + @@ {|INSERT INTO delayed_transactions (injected_before, hash, payload) VALUES (?, ?, ?)|} + + let select_at_level = + (level ->* delayed_transaction) + @@ {|SELECT payload FROM delayed_transactions WHERE ? = injected_before|} + + let select_at_hash = + (root_hash ->? delayed_transaction) + @@ {|SELECT payload FROM delayed_transactions WHERE ? = hash|} + end + module L1_latest_level = struct let insert = (l1_level ->. unit) @@ -370,7 +433,7 @@ module Migrations = struct if applied <= known then return (List.drop_n applied all_migrations) else let*! () = - Store_events.migrations_from_the_future ~applied ~known:0 + Evm_store_events.migrations_from_the_future ~applied ~known:0 in failwith "Cannot use a store modified by a more up-to-date version of the \ @@ -382,20 +445,6 @@ module Migrations = struct with_connection store @@ fun conn -> let* () = List.iter_es (fun up -> Db.exec conn up ()) M.up in Db.exec conn Q.Migrations.register_migration (id, M.name) - - let assume_old_store store = - let open Lwt_result_syntax in - with_connection store @@ fun conn -> - let* () = Db.exec conn Q.Migrations.create_table () in - Db.exec conn Q.Migrations.register_migration (0, Q.Migrations.V0.name) - - let check_V0 store = - let open Lwt_result_syntax in - with_connection store @@ fun conn -> - let* publishable = Db.find conn Q.table_exists "publishable_blueprints" in - let* executable = Db.find conn Q.table_exists "executable_blueprints" in - let* context_hashes = Db.find conn Q.table_exists "context_hashes" in - return (publishable && executable && context_hashes) end let init ~data_dir = @@ -409,24 +458,13 @@ let init ~data_dir = let* () = if not exists then let* () = Migrations.create_table store in - let*! () = Store_events.init_store () in + let*! () = Evm_store_events.init_store () in return_unit else let* table_exists = Migrations.table_exists store in let* () = when_ (not table_exists) (fun () -> - (* The database already exists, but the migrations table does not. - This probably means it was created before the introduction of - the migration system. We check that the three initial tables are - there and if so, we assume the first migration is applied moving - forward, with a warning. *) - let* old_db = Migrations.check_V0 store in - if old_db then - let* () = Migrations.assume_old_store store in - let*! () = Store_events.assume_old_store () in - return_unit - else - failwith "A store already exists, but its content is incorrect.") + failwith "A store already exists, but its content is incorrect.") in return_unit in @@ -435,7 +473,7 @@ let init ~data_dir = List.iter_es (fun (i, ((module M : Q.MIGRATION) as mig)) -> let* () = Migrations.apply_migration store i mig in - let*! () = Store_events.applied_migration M.name in + let*! () = Evm_store_events.applied_migration M.name in return_unit) migrations in @@ -443,32 +481,26 @@ let init ~data_dir = in return store -module Executable_blueprints = struct +module Blueprints = struct let store store (blueprint : Blueprint_types.t) = with_connection store @@ fun conn -> Db.exec conn - Q.Executable_blueprints.insert + Q.Blueprints.insert (blueprint.number, blueprint.timestamp, blueprint.payload) let find store number = let open Lwt_result_syntax in with_connection store @@ fun conn -> - let+ opt = Db.find_opt conn Q.Executable_blueprints.select number in + let+ opt = Db.find_opt conn Q.Blueprints.select number in match opt with | Some (payload, timestamp) -> Some Blueprint_types.{payload; timestamp; number} | None -> None -end -module Publishable_blueprints = struct - let store store number blueprint = + let find_range store ~from ~to_ = with_connection store @@ fun conn -> - Db.exec conn Q.Publishable_blueprints.insert (number, blueprint) - - let find store number = - with_connection store @@ fun conn -> - Db.find_opt conn Q.Publishable_blueprints.select number + Db.collect_list conn Q.Blueprints.select_range (from, to_) end module Context_hashes = struct @@ -502,6 +534,24 @@ module Kernel_upgrades = struct Db.exec conn Q.Kernel_upgrades.record_apply level end +module Delayed_transactions = struct + let store store next_blueprint_number + (delayed_transaction : Ethereum_types.Delayed_transaction.t) = + with_connection store @@ fun conn -> + Db.exec + conn + Q.Delayed_transactions.insert + (next_blueprint_number, delayed_transaction.hash, delayed_transaction) + + let at_level store blueprint_number = + with_connection store @@ fun conn -> + Db.collect_list conn Q.Delayed_transactions.select_at_level blueprint_number + + let at_hash store hash = + with_connection store @@ fun conn -> + Db.find_opt conn Q.Delayed_transactions.select_at_hash hash +end + module L1_latest_known_level = struct let store store level = with_connection store @@ fun conn -> @@ -516,7 +566,7 @@ end let () = register_error_kind `Permanent - ~id:"evm_node_prod_caqti_error" + ~id:"evm_node_dev_caqti_error" ~title:"Error raised by Caqti" ~description:"Caqti raised an error while processing a SQL statement" ~pp:(fun ppf msg -> diff --git a/etherlink/bin_node/lib_prod/store.mli b/etherlink/bin_node/lib_prod/evm_store.mli similarity index 83% rename from etherlink/bin_node/lib_prod/store.mli rename to etherlink/bin_node/lib_prod/evm_store.mli index 9da69fc8b81b..a90f8a483b23 100644 --- a/etherlink/bin_node/lib_prod/store.mli +++ b/etherlink/bin_node/lib_prod/evm_store.mli @@ -25,24 +25,17 @@ val with_transaction : t -> (t -> 'a tzresult Lwt.t) -> 'a tzresult Lwt.t @raise Assert_failure *) val assert_in_transaction : t -> unit -module Executable_blueprints : sig +module Blueprints : sig val store : t -> Blueprint_types.t -> unit tzresult Lwt.t val find : t -> Ethereum_types.quantity -> Blueprint_types.t option tzresult Lwt.t -end - -module Publishable_blueprints : sig - val store : - t -> - Ethereum_types.quantity -> - Blueprint_types.payload -> - unit tzresult Lwt.t - val find : + val find_range : t -> - Ethereum_types.quantity -> - Blueprint_types.payload option tzresult Lwt.t + from:Ethereum_types.quantity -> + to_:Ethereum_types.quantity -> + (Ethereum_types.quantity * Blueprint_types.payload) list tzresult Lwt.t end module Context_hashes : sig @@ -68,6 +61,24 @@ module Kernel_upgrades : sig val record_apply : t -> Ethereum_types.quantity -> unit tzresult Lwt.t end +module Delayed_transactions : sig + val store : + t -> + Ethereum_types.quantity -> + Ethereum_types.Delayed_transaction.t -> + unit tzresult Lwt.t + + val at_level : + t -> + Ethereum_types.quantity -> + Ethereum_types.Delayed_transaction.t list tzresult Lwt.t + + val at_hash : + t -> + Ethereum_types.hash -> + Ethereum_types.Delayed_transaction.t option tzresult Lwt.t +end + module L1_latest_known_level : sig val store : t -> int32 -> unit tzresult Lwt.t diff --git a/etherlink/bin_node/lib_prod/store_events.ml b/etherlink/bin_node/lib_prod/evm_store_events.ml similarity index 77% rename from etherlink/bin_node/lib_prod/store_events.ml rename to etherlink/bin_node/lib_prod/evm_store_events.ml index 82687a10de02..94acf2cc96db 100644 --- a/etherlink/bin_node/lib_prod/store_events.ml +++ b/etherlink/bin_node/lib_prod/evm_store_events.ml @@ -13,20 +13,10 @@ let init_store = declare_0 ~section ~name:"store_init" - ~msg:"Store is being initialized for the first time" + ~msg:"Evm_store is being initialized for the first time" ~level:Notice () -let assume_old_store = - declare_0 - ~section - ~name:"store_assume_old" - ~msg: - "A store already exists, provides the tables created by V0, but is \ - missing the migrations table. We assume it is correct." - ~level:Warning - () - let applied_migration = declare_1 ~section @@ -40,8 +30,8 @@ let migrations_from_the_future = ~section ~name:"migrations_from_the_future" ~msg: - "Store has {applied} migrations applied but the EVM node is only aware \ - of {known}" + "Evm_store has {applied} migrations applied but the EVM node is only \ + aware of {known}" ~level:Error ("applied", Data_encoding.int31) ("known", Data_encoding.int31) @@ -60,8 +50,6 @@ let init_store () = emit init_store () let applied_migration name = emit applied_migration name -let assume_old_store () = emit assume_old_store () - let migrations_from_the_future ~applied ~known = emit migrations_from_the_future (applied, known) diff --git a/etherlink/bin_node/lib_prod/store_events.mli b/etherlink/bin_node/lib_prod/evm_store_events.mli similarity index 81% rename from etherlink/bin_node/lib_prod/store_events.mli rename to etherlink/bin_node/lib_prod/evm_store_events.mli index e1b44fdd56f8..0aefe815fbfc 100644 --- a/etherlink/bin_node/lib_prod/store_events.mli +++ b/etherlink/bin_node/lib_prod/evm_store_events.mli @@ -13,12 +13,6 @@ val init_store : unit -> unit Lwt.t on a store that was previously missing it. *) val applied_migration : string -> unit Lwt.t -(** [assume_old_store ()] advertizes that the EVM node is promoting its store - to be compatible with the migrations table. It does that when its store is - missing the migrations table, but has the tables expected from the first - migration. *) -val assume_old_store : unit -> unit Lwt.t - (** [migration_from_the_future ~applied ~known] advertizes that there is more migrations applied to the store than known from the EVM node, which suggests the EVM node is outdated. *) diff --git a/etherlink/bin_node/lib_prod/filter_helpers.ml b/etherlink/bin_node/lib_prod/filter_helpers.ml index 48dbafcced91..845ce5a88a1b 100644 --- a/etherlink/bin_node/lib_prod/filter_helpers.ml +++ b/etherlink/bin_node/lib_prod/filter_helpers.ml @@ -50,12 +50,12 @@ type valid_filter = { } module Event = struct - let section = ["evm_node"; "prod"; "logs_filter"] + let section = ["evm_node"; "dev"; "logs_filter"] let incompatible_block_params = Internal_event.Simple.declare_0 ~section - ~name:"incompatible_block_params_prod" + ~name:"incompatible_block_params_dev" ~msg:"block_hash field cannot be set when from_block and to_block are set" ~level:Error () @@ -63,7 +63,7 @@ module Event = struct let block_range_too_large = Internal_event.Simple.declare_0 ~section - ~name:"block_range_too_large_prod" + ~name:"block_range_too_large_dev" ~msg:"Requested block range is above the maximum" ~level:Error () @@ -71,7 +71,7 @@ module Event = struct let topic_list_too_large = Internal_event.Simple.declare_0 ~section - ~name:"topic_list_too_large_prod" + ~name:"topic_list_too_large_dev" ~msg:"Topic list length should be at most 4" ~level:Error () @@ -79,7 +79,7 @@ module Event = struct let receipt_not_found = Internal_event.Simple.declare_1 ~section - ~name:"receipt_not_found_prod" + ~name:"receipt_not_found_dev" ~msg:"Receipt not found for {tx_hash}" ~level:Error ("tx_hash", hash_encoding) @@ -87,7 +87,7 @@ module Event = struct let too_many_logs = Internal_event.Simple.declare_0 ~section - ~name:"too_many_logs_prod" + ~name:"too_many_logs_dev" ~msg:"Too many logs requested" ~level:Error () diff --git a/etherlink/bin_node/lib_prod/helpers.ml b/etherlink/bin_node/lib_prod/helpers.ml index 6939b723f12c..cafb0c4a4a84 100644 --- a/etherlink/bin_node/lib_prod/helpers.ml +++ b/etherlink/bin_node/lib_prod/helpers.ml @@ -21,3 +21,11 @@ let with_timing event k = let* () = event diff in return res + +let unwrap_error_monad f = + let open Lwt_syntax in + let* res = f () in + match res with + | Ok v -> return v + | Error errs -> + Lwt.fail_with (Format.asprintf "%a" Error_monad.pp_print_trace errs) diff --git a/etherlink/bin_node/lib_prod/helpers.mli b/etherlink/bin_node/lib_prod/helpers.mli index 57776f4fa20a..fd3394a7b2aa 100644 --- a/etherlink/bin_node/lib_prod/helpers.mli +++ b/etherlink/bin_node/lib_prod/helpers.mli @@ -11,3 +11,7 @@ val now : unit -> Time.Protocol.t (** [with_timing event k] computes how much time [k ()] takes to be computed and advertises it with [event]. *) val with_timing : (Ptime.span -> unit Lwt.t) -> (unit -> 'a Lwt.t) -> 'a Lwt.t + +(** [unwrap_error_monad f] execute f and fails with a Failure when the + error monad returns an error. *) +val unwrap_error_monad : (unit -> 'a tzresult Lwt.t) -> 'a Lwt.t diff --git a/etherlink/bin_node/lib_prod/node_error.ml b/etherlink/bin_node/lib_prod/node_error.ml index afcc6e479c59..8ad290a3363a 100644 --- a/etherlink/bin_node/lib_prod/node_error.ml +++ b/etherlink/bin_node/lib_prod/node_error.ml @@ -14,7 +14,7 @@ type error += let () = register_error_kind `Permanent - ~id:"evm_node.prod.evm_event_follower.rollup_diverged" + ~id:"evm_node.dev.evm_event_follower.rollup_diverged" ~title:"Sequencer diverged from rollup node." ~description:"Sequencer diverged from rollup node." ~pp:(fun ppf (level, expected_hash, found_hash) -> diff --git a/etherlink/bin_node/lib_prod/observer.ml b/etherlink/bin_node/lib_prod/observer.ml index 18d98067b18d..3f1926ab48a5 100644 --- a/etherlink/bin_node/lib_prod/observer.ml +++ b/etherlink/bin_node/lib_prod/observer.ml @@ -8,27 +8,20 @@ open Ethereum_types module MakeBackend (Ctxt : sig - val ctxt : Evm_context.t - val evm_node_endpoint : Uri.t + + val smart_rollup_address : Tezos_crypto.Hashed.Smart_rollup_address.t end) : Services_backend_sig.Backend = struct module Reader = struct - let read path = - let open Lwt_result_syntax in - let*! res = Evm_context.inspect Ctxt.ctxt path in - return res + let read path = Evm_context.inspect path end module TxEncoder = struct - type transactions = { - raw : string list; - delayed : Ethereum_types.Delayed_transaction.t list; - } + type transactions = string list type messages = string list - let encode_transactions ~smart_rollup_address:_ - ~(transactions : transactions) = + let encode_transactions ~smart_rollup_address:_ ~transactions = let open Result_syntax in let hashes = List.map @@ -36,9 +29,9 @@ end) : Services_backend_sig.Backend = struct let tx_hash_str = Ethereum_types.hash_raw_tx transaction in Ethereum_types.( Hash Hex.(of_string tx_hash_str |> show |> hex_of_string))) - transactions.raw + transactions in - return (hashes, transactions.raw) + return (hashes, transactions) end module Publisher = struct @@ -96,49 +89,181 @@ end) : Services_backend_sig.Backend = struct module SimulatorBackend = struct let simulate_and_read ~input = let open Lwt_result_syntax in - let* raw_insights = Evm_context.execute_and_inspect Ctxt.ctxt ~input in + let* raw_insights = Evm_context.execute_and_inspect input in match raw_insights with | [Some bytes] -> return bytes | _ -> Error_monad.failwith "Invalid insights format" end let smart_rollup_address = - Tezos_crypto.Hashed.Smart_rollup_address.to_string - Ctxt.ctxt.smart_rollup_address + Tezos_crypto.Hashed.Smart_rollup_address.to_string Ctxt.smart_rollup_address end -let on_new_blueprint (ctxt : Evm_context.t) (blueprint : Blueprint_types.t) = +let on_new_blueprint next_blueprint_number + ({delayed_transactions; blueprint} : Blueprint_types.with_events) = + let open Lwt_result_syntax in let (Qty level) = blueprint.number in - let (Qty number) = ctxt.session.next_blueprint_number in + let (Qty number) = next_blueprint_number in if Z.(equal level number) then - Evm_context.apply_blueprint ctxt blueprint.timestamp blueprint.payload + let events = + List.map + (fun delayed_transaction -> + Ethereum_types.Evm_events.New_delayed_transaction delayed_transaction) + delayed_transactions + in + let* () = Evm_context.apply_evm_events events in + let delayed_transactions = + List.map + (fun Ethereum_types.Delayed_transaction.{hash; _} -> hash) + delayed_transactions + in + Evm_context.apply_blueprint + blueprint.timestamp + blueprint.payload + delayed_transactions else failwith "Received a blueprint with an unexpected number." -let main (ctxt : Evm_context.t) ~evm_node_endpoint = +module Make (Ctxt : sig + val evm_node_endpoint : Uri.t + + val smart_rollup_address : Tezos_crypto.Hashed.Smart_rollup_address.t +end) : Services_backend_sig.S = + Services_backend_sig.Make (MakeBackend (Ctxt)) + +let callback_log server conn req body = + let open Cohttp in + let open Lwt_syntax in + let uri = req |> Request.uri |> Uri.to_string in + let meth = req |> Request.meth |> Code.string_of_method in + let* body_str = body |> Cohttp_lwt.Body.to_string in + let* () = Events.callback_log ~uri ~meth ~body:body_str in + Tezos_rpc_http_server.RPC_server.resto_callback + server + conn + req + (Cohttp_lwt.Body.of_string body_str) + +let observer_start + ({rpc_addr; rpc_port; cors_origins; cors_headers; max_active_connections; _} : + Configuration.observer Configuration.t) ~directory = let open Lwt_result_syntax in - let rec loop stream = + let open Tezos_rpc_http_server in + let p2p_addr = P2p_addr.of_string_exn rpc_addr in + let host = Ipaddr.V6.to_string p2p_addr in + let node = `TCP (`Port rpc_port) in + let acl = RPC_server.Acl.allow_all in + let cors = + Resto_cohttp.Cors. + {allowed_headers = cors_headers; allowed_origins = cors_origins} + in + let server = + RPC_server.init_server + ~acl + ~cors + ~media_types:Media_type.all_media_types + directory + in + let*! () = + RPC_server.launch + ~max_active_connections + ~host + server + ~callback:(callback_log server) + node + in + let*! () = Events.is_ready ~rpc_addr ~rpc_port in + return server + +let install_finalizer_observer server = + let open Lwt_syntax in + Lwt_exit.register_clean_up_callback ~loc:__LOC__ @@ fun exit_status -> + let* () = Events.shutdown_node ~exit_status in + let* () = Tezos_rpc_http_server.RPC_server.shutdown server in + let* () = Events.shutdown_rpc_server ~private_:false in + Helpers.unwrap_error_monad @@ fun () -> + let open Lwt_result_syntax in + let* () = Tx_pool.shutdown () in + let* () = Evm_events_follower.shutdown () in + Evm_context.shutdown () + +let main_loop ~evm_node_endpoint = + let open Lwt_result_syntax in + let rec loop (Qty next_blueprint_number) stream = let*! candidate = Lwt_stream.get stream in match candidate with | Some blueprint -> - let* () = on_new_blueprint ctxt blueprint in + let* () = on_new_blueprint (Qty next_blueprint_number) blueprint in let* _ = Tx_pool.pop_and_inject_transactions () in - loop stream + loop (Qty (Z.succ next_blueprint_number)) stream | None -> return_unit in + let*! head = Evm_context.head_info () in + (* TODO: https://gitlab.com/tezos/tezos/-/issues/6876 Should be resilient to errors from the EVM node endpoint *) let*! blueprints_stream = Evm_services.monitor_blueprints ~evm_node_endpoint - ctxt.session.next_blueprint_number + head.next_blueprint_number in - loop blueprints_stream + loop head.next_blueprint_number blueprints_stream -module Make (Ctxt : sig - val ctxt : Evm_context.t +let main ?kernel_path ~rollup_node_endpoint ~evm_node_endpoint ~data_dir + ~(config : Configuration.observer Configuration.t) () = + let open Lwt_result_syntax in + let* smart_rollup_address = + Evm_services.get_smart_rollup_address ~evm_node_endpoint + in - val evm_node_endpoint : Uri.t -end) : Services_backend_sig.S = - Services_backend_sig.Make (MakeBackend (Ctxt)) + let* _loaded = + Evm_context.start + ~data_dir + ?kernel_path + ~preimages:config.mode.preimages + ~preimages_endpoint:config.mode.preimages_endpoint + ~smart_rollup_address: + (Tezos_crypto.Hashed.Smart_rollup_address.to_string + smart_rollup_address) + () + in + + let observer_backend = + (module Make (struct + let smart_rollup_address = smart_rollup_address + + let evm_node_endpoint = evm_node_endpoint + end) : Services_backend_sig.S) + in + + let* () = + Tx_pool.start + { + rollup_node = observer_backend; + smart_rollup_address = + Tezos_crypto.Hashed.Smart_rollup_address.to_b58check + smart_rollup_address; + mode = Observer; + } + in + + let directory = + Services.directory config (observer_backend, smart_rollup_address) + in + let directory = directory |> Evm_services.register smart_rollup_address in + + let* server = observer_start config ~directory in + + let (_ : Lwt_exit.clean_up_callback_id) = install_finalizer_observer server in + let* () = + Evm_events_follower.start + { + rollup_node_endpoint; + filter_event = + (function New_delayed_transaction _ -> false | _ -> true); + } + in + let () = Rollup_node_follower.start ~proxy:false ~rollup_node_endpoint in + + main_loop ~evm_node_endpoint diff --git a/etherlink/bin_node/lib_prod/observer.mli b/etherlink/bin_node/lib_prod/observer.mli index 190f5e98422c..df46a8d47c8c 100644 --- a/etherlink/bin_node/lib_prod/observer.mli +++ b/etherlink/bin_node/lib_prod/observer.mli @@ -5,12 +5,20 @@ (* *) (*****************************************************************************) -(** [main ctxt ~evm_node_endpoint] starts the main event-loop of the Observer, - consuming the blueprints received from [evm_node_endpoint]. *) -val main : Evm_context.t -> evm_node_endpoint:Uri.t -> unit tzresult Lwt.t - module Make (Ctxt : sig - val ctxt : Evm_context.t - val evm_node_endpoint : Uri.t + + val smart_rollup_address : Tezos_crypto.Hashed.Smart_rollup_address.t end) : Services_backend_sig.S + +(** [main ?kernel_path ~rollup_node_endpoint ~evm_node_endpoint + ~data_dir ~config] starts the main event-loop of the Observer, + consuming the blueprints received from [evm_node_endpoint]. *) +val main : + ?kernel_path:string -> + rollup_node_endpoint:Uri.t -> + evm_node_endpoint:Uri.t -> + data_dir:string -> + config:Configuration.observer Configuration.t -> + unit -> + unit tzresult Lwt.t diff --git a/etherlink/bin_node/lib_prod/publisher.ml b/etherlink/bin_node/lib_prod/publisher.ml index f3e6e1f3bc9a..4bcb43c94766 100644 --- a/etherlink/bin_node/lib_prod/publisher.ml +++ b/etherlink/bin_node/lib_prod/publisher.ml @@ -9,7 +9,7 @@ open Ethereum_types module type TxEncoder = sig (* Transactions to be encoded *) - type transactions = {raw : string list; delayed : Delayed_transaction.t list} + type transactions = string list (* Encoded messages to be injected *) type messages @@ -34,13 +34,10 @@ module Make (TxEncoder : TxEncoder) (Publisher : Publisher with type messages = TxEncoder.messages) = struct - let inject_raw_transactions ~timestamp ~smart_rollup_address ~transactions - ~delayed = + let inject_raw_transactions ~timestamp ~smart_rollup_address ~transactions = let open Lwt_result_syntax in let*? tx_hashes, to_publish = - TxEncoder.encode_transactions - ~smart_rollup_address - ~transactions:{raw = transactions; delayed} + TxEncoder.encode_transactions ~smart_rollup_address ~transactions in let* () = Publisher.publish_messages diff --git a/etherlink/bin_node/lib_prod/rollup_node.ml b/etherlink/bin_node/lib_prod/rollup_node.ml index 38916db7938e..796db591997a 100644 --- a/etherlink/bin_node/lib_prod/rollup_node.ml +++ b/etherlink/bin_node/lib_prod/rollup_node.ml @@ -45,15 +45,11 @@ end) : Services_backend_sig.Backend = struct end module TxEncoder = struct - type transactions = { - raw : string list; - delayed : Ethereum_types.Delayed_transaction.t list; - } + type transactions = string list type messages = string list - let encode_transactions ~smart_rollup_address - ~transactions:({raw = transactions; _} : transactions) = + let encode_transactions ~smart_rollup_address ~transactions = let open Result_syntax in let* rev_hashes, messages = List.fold_left_e diff --git a/etherlink/bin_node/lib_prod/rollup_node_follower.ml b/etherlink/bin_node/lib_prod/rollup_node_follower.ml index 39e639326e2d..bf26de51c108 100644 --- a/etherlink/bin_node/lib_prod/rollup_node_follower.ml +++ b/etherlink/bin_node/lib_prod/rollup_node_follower.ml @@ -5,86 +5,6 @@ (* *) (*****************************************************************************) -type parameters = {rollup_node_endpoint : Uri.t} - -module Types = struct - type state = Uri.t - - type nonrec parameters = parameters -end - -module Name = struct - (* We only have a single rollup node follower in the evm node *) - type t = unit - - let encoding = Data_encoding.unit - - let base = ["evm_node"; "prod"; "l2_block"; "follower"; "worker"] - - let pp _ _ = () - - let equal () () = true -end - -module Request = struct - type ('a, 'b) t = Unit : (unit, tztrace) t - - type view = View : _ t -> view - - let view (req : _ t) = View req - - let encoding : view Data_encoding.t = - let open Data_encoding in - conv (fun (View _) -> ()) (fun () -> View Unit) unit - - let pp _ppf (View _) = () -end - -module Worker = Worker.MakeSingle (Name) (Request) (Types) - -type worker = Worker.infinite Worker.queue Worker.t - -module Handlers = struct - type self = worker - - let on_request : - type r request_error. - worker -> (r, request_error) Request.t -> (r, request_error) result Lwt.t - = - fun _w request -> - match request with - | Request.Unit -> protect @@ fun () -> Lwt_result_syntax.return_unit - - type launch_error = error trace - - let on_launch _w () ({rollup_node_endpoint; _} : Types.parameters) = - let state = rollup_node_endpoint in - Lwt_result_syntax.return state - - let on_error (type a b) _w _st (_r : (a, b) Request.t) (_errs : b) : - unit tzresult Lwt.t = - Lwt_result_syntax.return_unit - - let on_completion _ _ _ _ = Lwt.return_unit - - let on_no_request _ = Lwt.return_unit - - let on_close _ = Lwt.return_unit -end - -let table = Worker.create_table Queue - -let worker_promise, worker_waker = Lwt.task () - -type error += No_l2_block_follower - -let worker = - lazy - (match Lwt.state worker_promise with - | Lwt.Return worker -> Ok worker - | Lwt.Fail e -> Error (TzTrace.make @@ error_of_exn e) - | Lwt.Sleep -> Error (TzTrace.make No_l2_block_follower)) - let read_from_rollup_node path level rollup_node_endpoint = let open Rollup_services in call_service @@ -95,7 +15,7 @@ let read_from_rollup_node path level rollup_node_endpoint = () let advertize_blueprints_publisher rollup_node_endpoint finalized_level = - let open Lwt_syntax in + let open Lwt_result_syntax in let* finalized_current_number = read_from_rollup_node Durable_storage_path.Block.current_number @@ -103,57 +23,213 @@ let advertize_blueprints_publisher rollup_node_endpoint finalized_level = rollup_node_endpoint in match finalized_current_number with - | Ok (Some bytes) -> + | Some bytes -> let (Qty evm_block_number) = Ethereum_types.decode_number bytes in - let* _ = Blueprints_publisher.new_l2_head evm_block_number in + let* () = Blueprints_publisher.new_l2_head evm_block_number in return_unit - | _ -> return_unit + | None -> return_unit -let process_new_block ~rollup_node_endpoint block = - let open Lwt_syntax in - let finalized_level = Sc_rollup_block.(Int32.(sub block.header.level 2l)) in - let* _ = Delayed_inbox.new_rollup_block finalized_level in - let* _ = Evm_events_follower.new_rollup_block finalized_level in +let process_new_block ~rollup_node_endpoint ~finalized_level = + let open Lwt_result_syntax in + let* () = Evm_events_follower.new_rollup_block finalized_level in let* () = advertize_blueprints_publisher rollup_node_endpoint finalized_level in - return_unit + Tx_pool.pop_and_inject_transactions_lazy () + +type error += Connection_lost | Connection_timeout -let rec process_rollup_node_stream ~stream ~rollup_node_endpoint worker = +(** [process_finalized_level ~oldest_rollup_node_known_l1_level + ~finalized_level ~rollup_node_endpoint] process the rollup node + block level [finalized_level] iff it's known by the rollup node + (i.e. superior to [oldest_rollup_node_known_l1_level]. + + This is necessary for the very beginning of the rollup life, when + the evm node is started at the same moment at the origination of + the rollup, and so `finalized_level` is < origination level. *) +let process_finalized_level ~oldest_rollup_node_known_l1_level ~finalized_level + ~rollup_node_endpoint = + let open Lwt_result_syntax in + if oldest_rollup_node_known_l1_level <= finalized_level then + process_new_block ~finalized_level ~rollup_node_endpoint + else return_unit + +let reconnection_delay = 5.0 + +let min_timeout = 10. + +let timeout_factor = 10. + +type rollup_node_connection = { + close : unit -> unit; (** stream closing function *) + stream : Sc_rollup_block.t Lwt_stream.t; + (** current rollup node block stream *) + rollup_node_endpoint : Uri.t; (** endpoint used to reconnect to the node *) + timeout : Float.t; + (** expected time to receive a l2 block from the rollup node. is + recalculated at each received block. *) +} + +(** [timeout] is updated to reflect reality of how long we should with + the next block or assume the connection is failing/hanging. *) +let update_timeout ~elapsed ~connection = + let new_timeout = elapsed *. timeout_factor in + if new_timeout < min_timeout then connection + else {connection with timeout = new_timeout} + +let sleep_before_reconnection ~factor = let open Lwt_syntax in - let* new_head = Lwt_stream.get stream in - match new_head with - | None -> - let* () = Rollup_node_follower_events.connection_lost () in - Worker.shutdown worker - | Some block -> + if factor = 0 then return_unit + else + (* randomised the sleep time to not DoS the rollup node if + multiple evm node are connected to the same rollup node *) + let fcount = float_of_int (factor - 1) in + (* Randomized exponential backoff capped to 1.5h: 1.5^count * delay ± 50% *) + let delay = reconnection_delay *. (1.5 ** fcount) in + let delay = min delay 3600. in + let randomization_factor = 0.5 (* 50% *) in + let delay = + delay + +. Random.float (delay *. 2. *. randomization_factor) + -. (delay *. randomization_factor) + in + let* () = Rollup_node_follower_events.trying_reconnection delay in + Lwt_unix.sleep delay + +(**[connect_to_stream ?count ~rollup_node_endpoint ()] try to connect + to the stream of rollup node block. If [count] is superior to [0] + then sleep some time with [sleep_before_reconnection] before trying + to reconnect. + + [count] is the number of time we tried to reconnect in a row. *) +let[@tailrec] rec connect_to_stream ?(count = 0) ~rollup_node_endpoint () = + let open Lwt_result_syntax in + let*! () = sleep_before_reconnection ~factor:count in + let*! res = Rollup_services.make_streamed_call ~rollup_node_endpoint in + match res with + | Ok (stream, close) -> + let*! () = Rollup_node_follower_events.connection_acquired () in + return {close; stream; rollup_node_endpoint; timeout = 300.} + | Error _e -> + (connect_to_stream [@tailcall]) + ~count:(count + 1) + ~rollup_node_endpoint + () + +(** [catchup_evm_event ~rollup_node_endpoint ~from ~to_] catchup on + evm events from [from] to [to_] from the rollup node. *) +let[@tailrec] rec catchup_evm_event ~rollup_node_endpoint ~from ~to_ = + let open Lwt_result_syntax in + if from = to_ then (*we are catch up *) return_unit + else if from > to_ then + failwith + "Internal error: The catchup of evm_event went too far, it should be \ + impossible." + else + (* reading event from [from] level then catching up from [from + + 1]. *) + let next_l1_level = Int32.succ from in + let* () = Evm_events_follower.new_rollup_block next_l1_level in + let* () = Evm_context.new_last_known_l1_level next_l1_level in + catchup_evm_event ~rollup_node_endpoint ~from:next_l1_level ~to_ + +(** [catchup_and_next_block ~proxy ~catchup_event ~connection] + returns the next block found in [connection.stream]. + + - If the connection drops then it tries to reconnect the stream + using [connect_to_stream]. + + - If the connection timeout (takes more than [connection.timeout]) + or if the connection fails then reconnect with [connect_to_stream] + and try to fetch [catchup_and_next_block] with that new stream.*) +let[@tailrec] rec catchup_and_next_block ~proxy ~catchup_event ~connection = + let open Lwt_result_syntax in + let get_promise () = + let*! res = Lwt_stream.get connection.stream in + match res with None -> tzfail Connection_lost | Some block -> return block + in + let timeout_promise timeout = + let*! () = Lwt_unix.sleep timeout in + tzfail Connection_timeout + in + let*! get_or_timeout = + Lwt.pick [get_promise (); timeout_promise connection.timeout] + in + match get_or_timeout with + | Ok block -> let* () = - Rollup_node_follower_events.new_block - Sc_rollup_block.(block.header.level) + if catchup_event then + let* latest_known_l1_level = Evm_context.last_known_l1_level () in + match latest_known_l1_level with + | None -> + (* sequencer has no value to start from, it must be the + initial start. *) + let*! () = Evm_store_events.no_l1_latest_level_to_catch_up () in + return_unit + | Some from -> + let to_ = Sc_rollup_block.(Int32.(sub block.header.level 2l)) in + catchup_evm_event + ~rollup_node_endpoint:connection.rollup_node_endpoint + ~from + ~to_ + else return_unit in - let* () = process_new_block ~rollup_node_endpoint block in - process_rollup_node_stream ~stream ~rollup_node_endpoint worker - -let start ({rollup_node_endpoint} as parameters) = + return (block, connection) + | Error [Connection_lost] | Error [Connection_timeout] -> + connection.close () ; + let* connection = + connect_to_stream + ~count:1 + ~rollup_node_endpoint:connection.rollup_node_endpoint + () + in + (catchup_and_next_block [@tailcall]) + ~proxy + ~catchup_event:(not proxy) + (* catchup event if not in proxy mode, proxy does not have + `evm_context` and would fail to fetch some data. Else + catchup possible missed event.*) + ~connection + | Error errs -> fail errs + +(** [loop_on_rollup_node_stream ~proxy + ~oldest_rollup_node_known_l1_level ~connection] main loop to + process the block. + + get the current rollup node block with [catchup_and_next_block], process it + with [process_finalized_level] then loop over. *) +let[@tailrec] rec loop_on_rollup_node_stream ~proxy + ~oldest_rollup_node_known_l1_level ~connection = let open Lwt_result_syntax in - let*! () = Rollup_node_follower_events.started () in - let+ worker = Worker.launch table () parameters (module Handlers) in - let () = - Lwt.dont_wait - (fun () -> - let*! stream = - Rollup_services.make_streamed_call ~rollup_node_endpoint - in - process_rollup_node_stream ~stream ~rollup_node_endpoint worker) - (fun _ -> ()) + let start_time = Unix.gettimeofday () in + let* block, connection = + catchup_and_next_block ~proxy ~catchup_event:false ~connection + in + let elapsed = Unix.gettimeofday () -. start_time in + let connection = update_timeout ~elapsed ~connection in + let finalized_level = Sc_rollup_block.(Int32.(sub block.header.level 2l)) in + let* () = + process_finalized_level + ~oldest_rollup_node_known_l1_level + ~rollup_node_endpoint:connection.rollup_node_endpoint + ~finalized_level in - Lwt.wakeup worker_waker worker + (loop_on_rollup_node_stream [@tailcall]) + ~proxy + ~oldest_rollup_node_known_l1_level + ~connection -let shutdown () = +let start ~proxy ~rollup_node_endpoint = + Lwt.async @@ fun () -> let open Lwt_syntax in - let w = Lazy.force worker in - match w with - | Error _ -> Lwt.return_unit - | Ok w -> - let* () = Rollup_node_follower_events.shutdown () in - Worker.shutdown w + let* () = Rollup_node_follower_events.started () in + Helpers.unwrap_error_monad @@ fun () -> + let open Lwt_result_syntax in + let* oldest_rollup_node_known_l1_level = + Rollup_services.oldest_known_l1_level rollup_node_endpoint + in + let* connection = connect_to_stream ~rollup_node_endpoint () in + loop_on_rollup_node_stream + ~proxy + ~oldest_rollup_node_known_l1_level + ~connection diff --git a/etherlink/bin_node/lib_prod/rollup_node_follower.mli b/etherlink/bin_node/lib_prod/rollup_node_follower.mli index 9fa26081f732..aef30b12129f 100644 --- a/etherlink/bin_node/lib_prod/rollup_node_follower.mli +++ b/etherlink/bin_node/lib_prod/rollup_node_follower.mli @@ -5,14 +5,6 @@ (* *) (*****************************************************************************) -type parameters = { - rollup_node_endpoint : Uri.t; - (** Rollup node endpoint used to monitor the stream of rollup - node block. *) -} - -(** [start parameters] starts the rollup node follower. *) -val start : parameters -> unit tzresult Lwt.t - -(** [shutdown ()] stops the rollup node follower. *) -val shutdown : unit -> unit Lwt.t +(** [start ~proxy ~rollup_node_endpoint] starts the rollup node + follower. In proxy mode does not try to catchup evm event. *) +val start : proxy:bool -> rollup_node_endpoint:Uri.t -> unit diff --git a/etherlink/bin_node/lib_prod/rollup_node_follower_events.ml b/etherlink/bin_node/lib_prod/rollup_node_follower_events.ml index 5f1ef9402c9a..37252a65d355 100644 --- a/etherlink/bin_node/lib_prod/rollup_node_follower_events.ml +++ b/etherlink/bin_node/lib_prod/rollup_node_follower_events.ml @@ -34,6 +34,14 @@ module Event = struct ~level:Notice () + let connection_acquired = + declare_0 + ~section + ~name:"rollup_node_follower_connection_acquired" + ~msg:"Rollup node follower connected to the rollup node" + ~level:Info + () + let connection_lost = declare_0 ~section @@ -41,6 +49,15 @@ module Event = struct ~msg:"Connection with the rollup node has been lost" ~level:Error () + + let trying_reconnection = + declare_1 + ~section + ~name:"rollup_node_follower_trying_reconnection" + ~msg: + "Waiting {duration} sec before trying to reconnect to the rollup node" + ~level:Info + ("duration", Data_encoding.float) end let started = Internal_event.Simple.emit Event.started @@ -50,3 +67,8 @@ let new_block level = Internal_event.Simple.emit Event.new_block level let shutdown = Internal_event.Simple.emit Event.shutdown let connection_lost = Internal_event.Simple.emit Event.connection_lost + +let trying_reconnection duration = + Internal_event.Simple.emit Event.trying_reconnection duration + +let connection_acquired = Internal_event.Simple.emit Event.connection_acquired diff --git a/etherlink/bin_node/lib_prod/rollup_services.ml b/etherlink/bin_node/lib_prod/rollup_services.ml index 717a4d1ea237..f65ed2315769 100644 --- a/etherlink/bin_node/lib_prod/rollup_services.ml +++ b/etherlink/bin_node/lib_prod/rollup_services.ml @@ -28,7 +28,7 @@ let () = in register_error_kind `Temporary - ~id:"evm_node_prod_lost_connection" + ~id:"evm_node_dev_lost_connection" ~title:"Lost connection with rollup node" ~description ~pp:(fun ppf () -> Format.fprintf ppf "%s" description) @@ -56,6 +56,27 @@ let smart_rollup_address : ~output:(Data_encoding.Fixed.bytes 20) (open_root / "global" / "smart_rollup_address") +let gc_info_encoding = + Data_encoding.( + obj3 + (req "last_gc_level" int32) + (req "first_available_level" int32) + (opt "last_context_split_level" int32)) + +let gc_info : + ( [`GET], + unit, + unit, + unit, + unit, + int32 * int32 * int32 option ) + Service.service = + Service.get_service + ~description:"Smart rollup address" + ~query:Query.empty + ~output:gc_info_encoding + (open_root / "local" / "gc_info") + type state_value_query = {key : string} module Block_id = struct @@ -171,10 +192,10 @@ let call_service ~base ?(media_types = Media_type.all_media_types) a b c d = | Error trace -> fail trace let make_streamed_call ~rollup_node_endpoint = - let open Lwt_syntax in + let open Lwt_result_syntax in let stream, push = Lwt_stream.create () in let on_chunk v = push (Some v) and on_close () = push None in - let* _spill_all = + let* spill_all = Tezos_rpc_http_client_unix.RPC_client_unix.call_streamed_service [Media_type.json] ~base:rollup_node_endpoint @@ -185,7 +206,11 @@ let make_streamed_call ~rollup_node_endpoint = () () in - return stream + let close () = + spill_all () ; + if Lwt_stream.is_closed stream then () else on_close () + in + return (stream, close) let publish : rollup_node_endpoint:Uri.t -> @@ -234,6 +259,16 @@ let smart_rollup_address base = | Ok address -> return (Bytes.to_string address) | Error trace -> fail trace +let oldest_known_l1_level base = + let open Lwt_result_syntax in + let*! answer = + call_service ~base ~media_types:[Media_type.octet_stream] gc_info () () () + in + match answer with + | Ok (_last_gc_level, first_available_level, _last_context_split) -> + return first_available_level + | Error trace -> fail trace + (** [tezos_level base] asks for the smart rollup node's latest l1 level, using the endpoint [base]. *) let tezos_level base = diff --git a/etherlink/bin_node/lib_prod/sequencer.ml b/etherlink/bin_node/lib_prod/sequencer.ml index e21ac3e78a4c..f819c2dc590e 100644 --- a/etherlink/bin_node/lib_prod/sequencer.ml +++ b/etherlink/bin_node/lib_prod/sequencer.ml @@ -6,20 +6,14 @@ (*****************************************************************************) module MakeBackend (Ctxt : sig - val ctxt : Evm_context.t + val smart_rollup_address : Tezos_crypto.Hashed.Smart_rollup_address.t end) : Services_backend_sig.Backend = struct module Reader = struct - let read path = - let open Lwt_result_syntax in - let*! res = Evm_context.inspect Ctxt.ctxt path in - return res + let read path = Evm_context.inspect path end module TxEncoder = struct - type transactions = { - raw : string list; - delayed : Ethereum_types.Delayed_transaction.t list; - } + type transactions = string list type messages = transactions @@ -37,19 +31,18 @@ end) : Services_backend_sig.Backend = struct module SimulatorBackend = struct let simulate_and_read ~input = let open Lwt_result_syntax in - let* raw_insights = Evm_context.execute_and_inspect Ctxt.ctxt ~input in + let* raw_insights = Evm_context.execute_and_inspect input in match raw_insights with | [Some bytes] -> return bytes | _ -> Error_monad.failwith "Invalid insights format" end let smart_rollup_address = - Tezos_crypto.Hashed.Smart_rollup_address.to_string - Ctxt.ctxt.smart_rollup_address + Tezos_crypto.Hashed.Smart_rollup_address.to_string Ctxt.smart_rollup_address end module Make (Ctxt : sig - val ctxt : Evm_context.t + val smart_rollup_address : Tezos_crypto.Hashed.Smart_rollup_address.t end) = Services_backend_sig.Make (MakeBackend (Ctxt)) @@ -66,11 +59,11 @@ let install_finalizer_seq server private_server = Events.shutdown_rpc_server ~private_:true) private_server in + Helpers.unwrap_error_monad @@ fun () -> + let open Lwt_result_syntax in let* () = Tx_pool.shutdown () in - let* () = Rollup_node_follower.shutdown () in let* () = Evm_events_follower.shutdown () in let* () = Blueprints_publisher.shutdown () in - let* () = Delayed_inbox.shutdown () in return_unit let callback_log server conn req body = @@ -187,52 +180,6 @@ let loop_sequencer : let now = Helpers.now () in loop now -let[@tailrec] rec catchup_evm_event ~rollup_node_endpoint store = - let open Lwt_result_syntax in - let* rollup_node_l1_level = - Rollup_services.tezos_level rollup_node_endpoint - in - let* latest_known_l1_level = Store.L1_latest_known_level.find store in - match latest_known_l1_level with - | None -> - (* sequencer has no value to start from, it must be the initial - start or we went from prod to dev. *) - let*! () = Store_events.no_l1_latest_level_to_catch_up () in - return_unit - | Some latest_known_l1_level -> - let finalized_level = Int32.(sub rollup_node_l1_level 2l) in - if latest_known_l1_level = finalized_level then return_unit - else if latest_known_l1_level > finalized_level then - tzfail - (error_of_fmt - "Internal error: The sequencer has processed more l1 level than \ - the rollup node, it should be impossible. ") - else - let*! () = - Events.catching_up_evm_event - ~from:latest_known_l1_level - ~to_:finalized_level - in - catch_evm_event_aux - ~rollup_node_endpoint - store - ~from:latest_known_l1_level - ~to_:finalized_level - -and[@tailrec] catch_evm_event_aux ~rollup_node_endpoint store ~from ~to_ = - let open Lwt_result_syntax in - if from = to_ then catchup_evm_event ~rollup_node_endpoint store - else if from > to_ then - tzfail - (error_of_fmt - "Internal error: The catchup of evm_event went too far, it should be \ - impossible.") - else - let next_l1_level = Int32.succ from in - let* () = Evm_events_follower.new_rollup_block next_l1_level in - let* () = Store.L1_latest_known_level.store store next_l1_level in - catch_evm_event_aux ~rollup_node_endpoint store ~from:next_l1_level ~to_ - let main ~data_dir ~rollup_node_endpoint ~max_blueprints_lag ~max_blueprints_ahead ~max_blueprints_catchup ~catchup_cooldown ?(genesis_timestamp = Helpers.now ()) ~cctxt ~sequencer @@ -242,8 +189,8 @@ let main ~data_dir ~rollup_node_endpoint ~max_blueprints_lag let* smart_rollup_address = Rollup_services.smart_rollup_address rollup_node_endpoint in - let* ctxt, loaded = - Evm_context.init + let* status = + Evm_context.start ?kernel_path:kernel ~data_dir ~preimages:configuration.mode.preimages @@ -251,7 +198,8 @@ let main ~data_dir ~rollup_node_endpoint ~max_blueprints_lag ~smart_rollup_address () in - let (Qty next_blueprint_number) = ctxt.session.next_blueprint_number in + let*! head = Evm_context.head_info () in + let (Qty next_blueprint_number) = head.next_blueprint_number in let* () = Blueprints_publisher.start ~rollup_node_endpoint @@ -260,10 +208,10 @@ let main ~data_dir ~rollup_node_endpoint ~max_blueprints_lag ~max_blueprints_catchup ~catchup_cooldown ~latest_level_seen:(Z.pred next_blueprint_number) - ctxt.store + () in let* () = - if not loaded then + if status = Created then (* Create the first empty block. *) let* genesis = Sequencer_blueprint.create @@ -276,12 +224,17 @@ let main ~data_dir ~rollup_node_endpoint ~max_blueprints_lag ~number:Ethereum_types.(Qty Z.zero) ~parent_hash:Ethereum_types.genesis_parent_hash in - Evm_context.apply_and_publish_blueprint ctxt genesis_timestamp genesis + let* () = Evm_context.apply_blueprint genesis_timestamp genesis [] in + Blueprints_publisher.publish Z.zero genesis else return_unit in + let smart_rollup_address_typed = + Tezos_crypto.Hashed.Smart_rollup_address.of_string_exn smart_rollup_address + in + let module Sequencer = Make (struct - let ctxt = ctxt + let smart_rollup_address = smart_rollup_address_typed end) in let* () = Tx_pool.start @@ -289,18 +242,25 @@ let main ~data_dir ~rollup_node_endpoint ~max_blueprints_lag in let* () = Block_producer.start - {ctxt; cctxt; smart_rollup_address; sequencer_key = sequencer} + { + cctxt; + smart_rollup_address; + sequencer_key = sequencer; + maximum_number_of_chunks = configuration.mode.max_number_of_chunks; + } in let* () = - Delayed_inbox.start {rollup_node_endpoint; delayed_inbox_interval = 1} + Evm_events_follower.start + {rollup_node_endpoint; filter_event = (fun _ -> true)} in - let* () = Evm_events_follower.start {rollup_node_endpoint; ctxt} in - let* () = catchup_evm_event ~rollup_node_endpoint ctxt.store in - let* () = Rollup_node_follower.start {rollup_node_endpoint} in + let () = Rollup_node_follower.start ~proxy:false ~rollup_node_endpoint in + let directory = Services.directory configuration ((module Sequencer), smart_rollup_address) in - let directory = directory |> Evm_services.register ctxt in + let directory = + directory |> Evm_services.register smart_rollup_address_typed + in let private_info = Option.map (fun private_rpc_port -> diff --git a/etherlink/bin_node/lib_prod/sequencer_blueprint.ml b/etherlink/bin_node/lib_prod/sequencer_blueprint.ml index 5decfe173cb1..be819f065748 100644 --- a/etherlink/bin_node/lib_prod/sequencer_blueprint.ml +++ b/etherlink/bin_node/lib_prod/sequencer_blueprint.ml @@ -41,73 +41,37 @@ let max_chunk_size = - blueprint_tag_size - blueprint_number_size - nb_chunks_size - chunk_index_size - rlp_tags_size - signature_size -let encode_transaction hash raw = +let maximum_usable_space_in_blueprint chunks_count = + chunks_count * max_chunk_size + +let maximum_chunks_per_l1_level = 512 * 1024 / 4096 + +let encode_transaction raw = let open Rlp in - List - [ - Value (Bytes.of_string hash); - List [Value (Bytes.of_string "\001"); Value (Bytes.of_string raw)]; - ] - -let encode_delayed_transaction Delayed_transaction.{kind; hash; raw} = - match kind with - | Transaction -> - let open Rlp in - let hash = hash_to_bytes hash in - List - [ - Value (Bytes.of_string hash); - List [Value (Bytes.of_string "\003"); Value (Bytes.of_string raw)]; - ] - | Deposit -> - let open Rlp in - let hash = hash_to_bytes hash in - let rlp = decode_exn (Bytes.of_string raw) in - List - [ - Value (hash |> Bytes.of_string); - List [Value (Bytes.of_string "\002"); rlp]; - ] - -let make_blueprint_chunks ~timestamp ~transactions ~delayed_transactions - ~parent_hash = + Value (Bytes.of_string raw) + +let make_blueprint_chunks ~timestamp ~transactions + ~(delayed_transactions : Ethereum_types.hash list) ~parent_hash = let open Rlp in - let delayed_hashes = + let delayed_transactions = List (List.map - (fun tx -> - Value - (Delayed_transaction.hash tx |> hash_to_bytes |> Bytes.of_string)) + (fun hash -> Value (hash_to_bytes hash |> Bytes.of_string)) delayed_transactions) in - let delayed_transactions = - List.map encode_delayed_transaction delayed_transactions - in - let messages, full_messages = - let m = - List.map - (fun transaction -> - let tx_hash_str = Ethereum_types.hash_raw_tx transaction in - encode_transaction tx_hash_str transaction) - transactions - in - (List m, List (delayed_transactions @ m)) + let messages = + let m = List.map encode_transaction transactions in + List m in let timestamp = Value (Ethereum_types.timestamp_to_bytes timestamp) in let parent_hash = Value (block_hash_to_bytes parent_hash |> Bytes.of_string) in - let to_publish = - List [parent_hash; delayed_hashes; messages; timestamp] |> encode - in - let to_execute = - List [parent_hash; List []; full_messages; timestamp] |> encode + let blueprint = + List [parent_hash; delayed_transactions; messages; timestamp] |> encode in - match - ( String.chunk_bytes max_chunk_size to_publish, - String.chunk_bytes max_chunk_size to_execute ) - with - | Ok to_publish, Ok to_execute -> (to_publish, to_execute) + match String.chunk_bytes max_chunk_size blueprint with + | Ok chunks -> chunks | _ -> (* [chunk_bytes] can only return an [Error] if the optional argument [error_on_partial_chunk] is passed. As this is not @@ -119,29 +83,22 @@ let encode_u16_le i = Bytes.set_uint16_le bytes 0 i ; bytes -type t = { - to_publish : Blueprint_types.payload; - to_execute : Blueprint_types.payload; -} +type t = Blueprint_types.payload let create ~cctxt ~sequencer_key ~timestamp ~smart_rollup_address ~number - ~parent_hash ~delayed_transactions ~transactions = + ~parent_hash ~(delayed_transactions : Ethereum_types.hash list) + ~transactions = let open Lwt_result_syntax in let open Rlp in let number = Value (encode_u256_le number) in - let to_publish_chunks, to_execute_chunks = + let chunks = make_blueprint_chunks ~timestamp ~transactions ~delayed_transactions ~parent_hash in - let nb_chunks_publish = - Rlp.Value (encode_u16_le @@ List.length to_publish_chunks) - in - let nb_chunks_execute = - Rlp.Value (encode_u16_le @@ List.length to_execute_chunks) - in + let nb_chunks = Rlp.Value (encode_u16_le @@ List.length chunks) in let message_from_chunk nb_chunks chunk_index chunk = let chunk_index = Rlp.Value (encode_u16_le chunk_index) in let value = Value (Bytes.of_string chunk) in @@ -165,10 +122,4 @@ let create ~cctxt ~sequencer_key ~timestamp ~smart_rollup_address ~number rlp_sequencer_blueprint) |> return in - let* to_publish = - List.mapi_ep (message_from_chunk nb_chunks_publish) to_publish_chunks - in - let* to_execute = - List.mapi_ep (message_from_chunk nb_chunks_execute) to_execute_chunks - in - return {to_publish; to_execute} + List.mapi_ep (message_from_chunk nb_chunks) chunks diff --git a/etherlink/bin_node/lib_prod/sequencer_blueprint.mli b/etherlink/bin_node/lib_prod/sequencer_blueprint.mli index e58842598c7e..78fc1777a3c2 100644 --- a/etherlink/bin_node/lib_prod/sequencer_blueprint.mli +++ b/etherlink/bin_node/lib_prod/sequencer_blueprint.mli @@ -5,21 +5,7 @@ (* *) (*****************************************************************************) -(** Type representing the messages describing a blueprint. - - The sequencer has to produce two different versions of every blueprint. - The first one is the version published to L1. In this one, only the hashes - of delayed transactions are added, as the kernel already has the full - transactions in the delayed inbox. - The second one is the one the sequencer executes locally. In this case, - instead of replicating the state of the delayed inbox, the full delayed - transactions are added in the blueprint, respecting the same order as - their corresponding hashes. -*) -type t = { - to_publish : Blueprint_types.payload; - to_execute : Blueprint_types.payload; -} +type t = Blueprint_types.payload (** [create ~secret_key ~timestamp ~smart_rollup_address ~number ~parent_hash ~delayed_transactions ~transactions] @@ -34,6 +20,14 @@ val create : smart_rollup_address:string -> number:Ethereum_types.quantity -> parent_hash:Ethereum_types.block_hash -> - delayed_transactions:Ethereum_types.Delayed_transaction.t list -> + delayed_transactions:Ethereum_types.hash list -> transactions:string list -> t tzresult Lwt.t + +(** [maximum_usable_size_in_blueprint chunks_count] returns the available space + for transactions in a blueprint composed of [chunks_count] chunks. *) +val maximum_usable_space_in_blueprint : int -> int + +(* [maximum_chunks_per_l1_level] is the maximum number of chunks a L1 block can + hold at once. *) +val maximum_chunks_per_l1_level : int diff --git a/etherlink/bin_node/lib_prod/services_backend_sig.ml b/etherlink/bin_node/lib_prod/services_backend_sig.ml index 1013c3f038de..d46dbe0acb94 100644 --- a/etherlink/bin_node/lib_prod/services_backend_sig.ml +++ b/etherlink/bin_node/lib_prod/services_backend_sig.ml @@ -26,7 +26,6 @@ module type S = sig timestamp:Time.Protocol.t -> smart_rollup_address:string -> transactions:string list -> - delayed:Ethereum_types.Delayed_transaction.t list -> Ethereum_types.hash list tzresult Lwt.t (** [current_block ~full_transaction_object] returns the most recent diff --git a/etherlink/bin_node/lib_prod/tx_pool.ml b/etherlink/bin_node/lib_prod/tx_pool.ml index 34132e303eb2..8405d0ce7c98 100644 --- a/etherlink/bin_node/lib_prod/tx_pool.ml +++ b/etherlink/bin_node/lib_prod/tx_pool.ml @@ -19,22 +19,16 @@ module Pool = struct } type t = { - delayed_transactions : Ethereum_types.Delayed_transaction.t list; transactions : transaction Nonce_map.t Pkey_map.t; global_index : int64; (* Index to order the transactions. *) } - let empty : t = - { - transactions = Pkey_map.empty; - global_index = Int64.zero; - delayed_transactions = []; - } + let empty : t = {transactions = Pkey_map.empty; global_index = Int64.zero} (** Add a transaction to the pool. *) let add t pkey raw_tx = let open Result_syntax in - let {transactions; global_index; delayed_transactions} = t in + let {transactions; global_index} = t in let* nonce = Ethereum_types.transaction_nonce raw_tx in let* gas_price = Ethereum_types.transaction_gas_price raw_tx in let* gas_limit = Ethereum_types.transaction_gas_limit raw_tx in @@ -60,18 +54,7 @@ module Pool = struct user_transactions)) transactions in - return - { - transactions; - global_index = Int64.(add global_index one); - delayed_transactions; - } - - (** Add a delayed transaction to the pool.*) - let add_delayed t tx = - let open Result_syntax in - let delayed_transactions = tx :: t.delayed_transactions in - return {t with delayed_transactions} + return {transactions; global_index = Int64.(add global_index one)} (** Returns all the addresses of the pool *) let addresses {transactions; _} = @@ -79,8 +62,7 @@ module Pool = struct (** Returns the transaction matching the predicate. And remove them from the pool. *) - let partition pkey predicate - {transactions; global_index; delayed_transactions} = + let partition pkey predicate {transactions; global_index} = (* Get the sequence of transaction *) let selected, remaining = transactions |> Pkey_map.find pkey @@ -94,7 +76,7 @@ module Pool = struct in (* Convert the sequence to a list *) let selected = selected |> Nonce_map.bindings |> List.map snd in - (selected, {transactions; global_index; delayed_transactions}) + (selected, {transactions; global_index}) (** Removes from the pool the transactions matching the predicate for the given pkey. *) @@ -133,32 +115,6 @@ type parameters = { mode : mode; } -type add_transaction = - | Transaction of string - | Delayed of Ethereum_types.Delayed_transaction.t - -let add_transaction_encoding = - let open Data_encoding in - union - [ - case - (Tag 0) - ~title:"transaction" - string - (function Transaction transaction -> Some transaction | _ -> None) - (function transaction -> Transaction transaction); - case - (Tag 1) - ~title:"delayed" - Ethereum_types.Delayed_transaction.encoding - (function Delayed delayed -> Some delayed | _ -> None) - (fun delayed -> Delayed delayed); - ] - -type popped_transactions = - | Locked - | Transactions of string list * Ethereum_types.Delayed_transaction.t list - module Types = struct type state = { rollup_node : (module Services_backend_sig.S); @@ -177,7 +133,7 @@ module Name = struct let encoding = Data_encoding.unit - let base = ["evm_node"; "tx-pool"; "prod"; "worker"] + let base = ["evm_node"; "tx-pool"; "dev"; "worker"] let pp _ _ = () @@ -187,12 +143,13 @@ end module Request = struct type ('a, 'b) t = | Add_transaction : - add_transaction + string -> ((Ethereum_types.hash, string) result, tztrace) t - | Pop_transactions : (popped_transactions, tztrace) t + | Pop_transactions : int -> (string list, tztrace) t | Pop_and_inject_transactions : (unit, tztrace) t | Lock_transactions : (unit, tztrace) t | Unlock_transactions : (unit, tztrace) t + | Is_locked : (bool, tztrace) t type view = View : _ t -> view @@ -207,7 +164,7 @@ module Request = struct ~title:"Add_transaction" (obj2 (req "request" (constant "add_transaction")) - (req "transaction" add_transaction_encoding)) + (req "transaction" string)) (function | View (Add_transaction transaction) -> Some ((), transaction) | _ -> None) @@ -215,9 +172,15 @@ module Request = struct case (Tag 1) ~title:"Pop_transactions" - (obj1 (req "request" (constant "pop_transactions"))) - (function View Pop_transactions -> Some () | _ -> None) - (fun () -> View Pop_transactions); + (obj2 + (req "request" (constant "pop_transactions")) + (req "maximum_cumulatize_size" int31)) + (function + | View (Pop_transactions maximum_cumulative_size) -> + Some ((), maximum_cumulative_size) + | _ -> None) + (fun ((), maximum_cumulative_size) -> + View (Pop_transactions maximum_cumulative_size)); case (Tag 2) ~title:"Pop_and_inject_transactions" @@ -236,28 +199,31 @@ module Request = struct (obj1 (req "request" (constant "unlock_transactions"))) (function View Unlock_transactions -> Some () | _ -> None) (fun () -> View Unlock_transactions); + case + (Tag 5) + ~title:"Is_locked" + (obj1 (req "request" (constant "is_locked"))) + (function View Is_locked -> Some () | _ -> None) + (fun () -> View Is_locked); ] let pp ppf (View r) = match r with - | Add_transaction transaction -> ( - match transaction with - | Transaction tx_raw -> - Format.fprintf - ppf - "Add tx [%s] to tx-pool" - (Hex.of_string tx_raw |> Hex.show) - | Delayed delayed -> - Format.fprintf - ppf - "Add delayed inbox tx [%a] to tx-pool" - Ethereum_types.Delayed_transaction.pp_short - delayed) - | Pop_transactions -> Format.fprintf ppf "Popping transactions" + | Add_transaction tx_raw -> + Format.fprintf + ppf + "Add tx [%s] to tx-pool" + (Hex.of_string tx_raw |> Hex.show) + | Pop_transactions maximum_cumulative_size -> + Format.fprintf + ppf + "Popping transactions of maximum cumulative size %d bytes" + maximum_cumulative_size | Pop_and_inject_transactions -> Format.fprintf ppf "Popping and injecting transactions" | Lock_transactions -> Format.fprintf ppf "Locking the transactions" | Unlock_transactions -> Format.fprintf ppf "Unlocking the transactions" + | Is_locked -> Format.fprintf ppf "Checking if the tx pool is locked" end module Worker = Worker.MakeSingle (Name) (Request) (Types) @@ -291,24 +257,6 @@ let on_normal_transaction state tx_raw = state.pool <- pool ; return (Ok hash) -let on_delayed_transaction state delayed_tx = - let open Lwt_result_syntax in - let open Types in - let {rollup_node = (module Rollup_node); pool; _} = state in - (* Add the tx to the pool*) - let*? pool = Pool.add_delayed pool delayed_tx in - state.pool <- pool ; - return_unit - -let on_transaction state transaction = - let open Lwt_result_syntax in - match transaction with - | Transaction transaction -> on_normal_transaction state transaction - | Delayed delayed_transaction -> - let hash = Ethereum_types.Delayed_transaction.hash delayed_transaction in - let* () = on_delayed_transaction state delayed_transaction in - return (Ok hash) - (** Checks that [balance] is enough to pay up to the maximum [gas_limit] the sender defined parametrized by the [gas_price]. *) let can_prepay ~balance ~gas_price ~gas_limit = @@ -319,7 +267,7 @@ let can_prepay ~balance ~gas_price ~gas_limit = let can_pay_with_current_base_fee ~gas_price ~base_fee_per_gas = gas_price >= base_fee_per_gas -let pop_transactions state = +let pop_transactions state ~maximum_cumulative_size = let open Lwt_result_syntax in let Types. { @@ -330,7 +278,7 @@ let pop_transactions state = } = state in - if locked then return Locked + if locked then return [] else (* Get all the addresses in the tx-pool. *) let addresses = Pool.addresses pool in @@ -360,24 +308,40 @@ let pop_transactions state = pool) pool in - (* Select transaction with nonce equal to user's nonce and that - can be prepaid. + (* Select transaction with nonce equal to user's nonce, that can be prepaid + and selects a sum of transactions that wouldn't go above the size limit + of the blueprint. Also removes the transactions from the pool. *) - let txs, pool = + let txs, pool, _ = addr_with_nonces |> List.fold_left - (fun (txs, pool) (pkey, _, current_nonce) -> + (fun (txs, pool, cumulative_size) (pkey, _, current_nonce) -> + (* This mutable counter is purely local and used only for the + partition. *) + let accumulated_size = ref cumulative_size in let selected, pool = Pool.partition pkey - (fun nonce {gas_price; _} -> - nonce = current_nonce - && can_pay_with_current_base_fee ~gas_price ~base_fee_per_gas) + (fun nonce {gas_price; raw_tx; _} -> + let check_nonce = nonce = current_nonce in + let can_fit = + !accumulated_size + String.length raw_tx + <= maximum_cumulative_size + in + let can_pay = + can_pay_with_current_base_fee ~gas_price ~base_fee_per_gas + in + let selected = check_nonce && can_pay && can_fit in + (* If the transaction is selected, this means it will fit *) + if selected then + accumulated_size := + !accumulated_size + String.length raw_tx ; + selected) pool in let txs = List.append txs selected in - (txs, pool)) - ([], pool) + (txs, pool, !accumulated_size)) + ([], pool, 0) in (* Sorting transactions by index. First tx in the pool is the first tx to be sent to the batcher. *) @@ -387,13 +351,9 @@ let pop_transactions state = Int64.compare index_a index_b) |> List.map (fun Pool.{raw_tx; _} -> raw_tx) in - (* Add delayed transactions and empty the list *) - let delayed, pool = - (pool.delayed_transactions, {pool with delayed_transactions = []}) - in (* update the pool *) state.pool <- pool ; - return (Transactions (txs, delayed)) + return txs let pop_and_inject_transactions state = let open Lwt_result_syntax in @@ -402,41 +362,45 @@ let pop_and_inject_transactions state = | Sequencer -> failwith "Internal error: the sequencer is not supposed to use this function" - | Observer | Proxy _ -> ( - let* res = pop_transactions state in - match res with - | Locked -> return_unit - | Transactions (txs, delayed) -> - if not (List.is_empty txs && List.is_empty delayed) then - let (module Rollup_node : Services_backend_sig.S) = - state.rollup_node - in - let*! hashes = - Rollup_node.inject_raw_transactions - (* The timestamp is ignored in observer and proxy mode, it's just for - compatibility with sequencer mode. *) - ~timestamp:(Helpers.now ()) - ~smart_rollup_address:state.smart_rollup_address - ~transactions:txs - ~delayed + | Observer | Proxy _ -> + (* We over approximate the number of transactions to pop in proxy and + observer mode to the maximum size an L1 block can hold. If the proxy + sends more, they won't be applied at the next level. For the observer, + it prevents spamming the sequencer. *) + let maximum_cumulative_size = + Sequencer_blueprint.maximum_usable_space_in_blueprint + Sequencer_blueprint.maximum_chunks_per_l1_level + in + let* txs = pop_transactions state ~maximum_cumulative_size in + if not (List.is_empty txs) then + let (module Rollup_node : Services_backend_sig.S) = state.rollup_node in + let*! hashes = + Rollup_node.inject_raw_transactions + (* The timestamp is ignored in observer and proxy mode, it's just for + compatibility with sequencer mode. *) + ~timestamp:(Helpers.now ()) + ~smart_rollup_address:state.smart_rollup_address + ~transactions:txs + in + match hashes with + | Error trace -> + let*! () = Tx_pool_events.transaction_injection_failed trace in + return_unit + | Ok hashes -> + let*! () = + List.iter_s + (fun hash -> Tx_pool_events.transaction_injected ~hash) + hashes in - match hashes with - | Error trace -> - let*! () = Tx_pool_events.transaction_injection_failed trace in - return_unit - | Ok hashes -> - let*! () = - List.iter_s - (fun hash -> Tx_pool_events.transaction_injected ~hash) - hashes - in - return_unit - else return_unit) + return_unit + else return_unit let lock_transactions state = state.Types.locked <- true let unlock_transactions state = state.Types.locked <- false +let is_locked state = state.Types.locked + module Handlers = struct type self = worker @@ -461,15 +425,17 @@ module Handlers = struct match request with | Request.Add_transaction transaction -> protect @@ fun () -> - let* res = on_transaction state transaction in + let* res = on_normal_transaction state transaction in let* () = observer_self_inject_request w in return res - | Request.Pop_transactions -> protect @@ fun () -> pop_transactions state + | Request.Pop_transactions maximum_cumulative_size -> + protect @@ fun () -> pop_transactions state ~maximum_cumulative_size | Request.Pop_and_inject_transactions -> protect @@ fun () -> pop_and_inject_transactions state | Request.Lock_transactions -> protect @@ fun () -> return (lock_transactions state) | Request.Unlock_transactions -> return (unlock_transactions state) + | Request.Is_locked -> protect @@ fun () -> return (is_locked state) type launch_error = error trace @@ -502,7 +468,7 @@ let table = Worker.create_table Queue let worker_promise, worker_waker = Lwt.task () -type error += No_tx_pool +type error += No_worker type error += Tx_pool_terminated @@ -510,8 +476,18 @@ let worker = lazy (match Lwt.state worker_promise with | Lwt.Return worker -> Ok worker - | Lwt.Fail e -> Error (TzTrace.make @@ error_of_exn e) - | Lwt.Sleep -> Error (TzTrace.make No_tx_pool)) + | Lwt.Fail e -> Result_syntax.tzfail (error_of_exn e) + | Lwt.Sleep -> Result_syntax.tzfail No_worker) + +let bind_worker f = + let open Lwt_result_syntax in + let res = Lazy.force worker in + match res with + | Error [No_worker] -> + (* There is no worker, nothing to do *) + return_unit + | Error errs -> fail errs + | Ok w -> f w let handle_request_error rq = let open Lwt_syntax in @@ -523,62 +499,22 @@ let handle_request_error rq = | Error (Closed (Some errs)) -> Lwt.return_error errs | Error (Any exn) -> Lwt.return_error [Exn exn] -let rec subscribe_l2_block ~stream_l2 worker = - let open Lwt_syntax in - let* new_head = Lwt_stream.get stream_l2 in - match new_head with - | Some _block -> - let* _pushed = - Worker.Queue.push_request worker Request.Pop_and_inject_transactions - in - subscribe_l2_block ~stream_l2 worker - | None -> - let* () = Tx_pool_events.connection_lost () in - let* () = Lwt_unix.sleep 1. in - subscribe_l2_block ~stream_l2 worker - -let start ({mode; _} as parameters) = +let start parameters = let open Lwt_result_syntax in let+ worker = Worker.launch table () parameters (module Handlers) in - let () = - Lwt.dont_wait - (fun () -> - match mode with - | Proxy {rollup_node_endpoint} -> - let*! stream_l2 = - Rollup_services.make_streamed_call ~rollup_node_endpoint - in - subscribe_l2_block ~stream_l2 worker - | Sequencer | Observer -> Lwt.return_unit) - (fun _ -> ()) - in Lwt.wakeup worker_waker worker let shutdown () = - let open Lwt_syntax in - let w = Lazy.force worker in - match w with - | Error _ -> - (* There is no tx-pool, nothing to do *) - Lwt.return_unit - | Ok w -> - let* () = Tx_pool_events.shutdown () in - Worker.shutdown w - -let add raw_tx = let open Lwt_result_syntax in - let*? w = Lazy.force worker in - Worker.Queue.push_request_and_wait - w - (Request.Add_transaction (Transaction raw_tx)) - |> handle_request_error + bind_worker @@ fun w -> + let*! () = Tx_pool_events.shutdown () in + let*! () = Worker.shutdown w in + return_unit -let add_delayed delayed = +let add raw_tx = let open Lwt_result_syntax in let*? w = Lazy.force worker in - Worker.Queue.push_request_and_wait - w - (Request.Add_transaction (Delayed delayed)) + Worker.Queue.push_request_and_wait w (Request.Add_transaction raw_tx) |> handle_request_error let nonce pkey = @@ -593,10 +529,12 @@ let nonce pkey = in return next_nonce -let pop_transactions () = +let pop_transactions ~maximum_cumulative_size = let open Lwt_result_syntax in let*? worker = Lazy.force worker in - Worker.Queue.push_request_and_wait worker Request.Pop_transactions + Worker.Queue.push_request_and_wait + worker + (Request.Pop_transactions maximum_cumulative_size) |> handle_request_error let pop_and_inject_transactions () = @@ -605,6 +543,14 @@ let pop_and_inject_transactions () = Worker.Queue.push_request_and_wait worker Request.Pop_and_inject_transactions |> handle_request_error +let pop_and_inject_transactions_lazy () = + let open Lwt_result_syntax in + bind_worker @@ fun w -> + let*! (_pushed : bool) = + Worker.Queue.push_request w Request.Pop_and_inject_transactions + in + return_unit + let lock_transactions () = let open Lwt_result_syntax in let*? worker = Lazy.force worker in @@ -616,3 +562,9 @@ let unlock_transactions () = let*? worker = Lazy.force worker in Worker.Queue.push_request_and_wait worker Request.Unlock_transactions |> handle_request_error + +let is_locked () = + let open Lwt_result_syntax in + let*? worker = Lazy.force worker in + Worker.Queue.push_request_and_wait worker Request.Is_locked + |> handle_request_error diff --git a/etherlink/bin_node/lib_prod/tx_pool.mli b/etherlink/bin_node/lib_prod/tx_pool.mli index 73e9a60251df..b9ea9394a968 100644 --- a/etherlink/bin_node/lib_prod/tx_pool.mli +++ b/etherlink/bin_node/lib_prod/tx_pool.mli @@ -13,38 +13,36 @@ type parameters = { mode : mode; } -type popped_transactions = - | Locked - | Transactions of string list * Ethereum_types.Delayed_transaction.t list - (** [start parameters] starts the tx-pool *) val start : parameters -> unit tzresult Lwt.t (** [shutdown ()] stops the tx-pool, waiting for the ongoing request to be processed. *) -val shutdown : unit -> unit Lwt.t +val shutdown : unit -> unit tzresult Lwt.t (** [add raw_tx] adds a raw eth transaction to the tx-pool. *) val add : string -> (Ethereum_types.hash, string) result tzresult Lwt.t -(** [add_delayed transaction] adds a delayed transaction to the tx-pool. *) -val add_delayed : - Ethereum_types.Delayed_transaction.t -> - (Ethereum_types.hash, string) result tzresult Lwt.t - (** [nonce address] returns the nonce of the user - Returns the first gap in the tx-pool, or the nonce stored on the rollup + Returns the first gap in the tx-pool, or the nonce stored on the rollup if no transactions are in the pool. *) val nonce : Ethereum_types.Address.t -> Ethereum_types.quantity tzresult Lwt.t -(** [pop_transactions ()] pops the valid transactions from the pool. *) -val pop_transactions : unit -> popped_transactions tzresult Lwt.t +(** [pop_transactions maximum_cumulative_size] pops as much valid transactions + as possible from the pool, until their cumulative size exceeds + `maximum_cumulative_size`. Returns no transactions if the pool is locked. *) +val pop_transactions : maximum_cumulative_size:int -> string list tzresult Lwt.t (** [pop_and_inject_transactions ()] pops the valid transactions from - the pool using {!pop_transactions }and injects them using + the pool using {!pop_transactions} and injects them using [inject_raw_transactions] provided by {!parameters.rollup_node}. *) val pop_and_inject_transactions : unit -> unit tzresult Lwt.t +(** [pop_and_inject_transactions_lazy ()] same as + [pop_and_inject_transactions] but don't wait for the request to + complete *) +val pop_and_inject_transactions_lazy : unit -> unit tzresult Lwt.t + (** [lock_transactions] locks the transactions in the pool, new transactions can be added but nothing can be retrieved with {!pop_transactions}. *) val lock_transactions : unit -> unit tzresult Lwt.t @@ -52,3 +50,6 @@ val lock_transactions : unit -> unit tzresult Lwt.t (** [unlock_transactions] unlocks the transactions if it was locked by {!lock_transactions}. *) val unlock_transactions : unit -> unit tzresult Lwt.t + +(** [is_locked] checks if the pools is locked. *) +val is_locked : unit -> bool tzresult Lwt.t diff --git a/etherlink/bin_node/main.ml b/etherlink/bin_node/main.ml index c5ad68e4bbec..3e52923cd93a 100644 --- a/etherlink/bin_node/main.ml +++ b/etherlink/bin_node/main.ml @@ -64,7 +64,7 @@ module Event = struct ~level:Notice ("exit_status", Data_encoding.int8) - let event_shutdown_tx_pool = + let _event_shutdown_tx_pool = Internal_event.Simple.declare_0 ~section ~name:"shutting_down_tx_pool" @@ -127,8 +127,10 @@ let install_finalizer_prod server = let* () = emit Event.event_shutdown_node exit_status in let* () = Tezos_rpc_http_server.RPC_server.shutdown server in let* () = emit (Event.event_shutdown_rpc_server ~private_:false) () in - let* () = Evm_node_lib_prod.Tx_pool.shutdown () in - emit Event.event_shutdown_tx_pool () + Evm_node_lib_dev.Helpers.unwrap_error_monad @@ fun () -> + let open Lwt_result_syntax in + let* () = Evm_node_lib_dev.Tx_pool.shutdown () in + Evm_node_lib_dev.Evm_context.shutdown () let install_finalizer_dev server = let open Lwt_syntax in @@ -611,6 +613,11 @@ let proxy_command = mode = Proxy {rollup_node_endpoint}; } in + let () = + Evm_node_lib_prod.Rollup_node_follower.start + ~proxy:true + ~rollup_node_endpoint + in let* directory = prod_directory config rollup_config in let* server = start config ~directory in let (_ : Lwt_exit.clean_up_callback_id) = @@ -863,8 +870,8 @@ let observer_command = let make_prod_messages ~kind ~smart_rollup_address data = let open Lwt_result_syntax in - let open Evm_node_lib_prod in - let open Evm_node_lib_prod_encoding in + let open Evm_node_lib_dev in + let open Evm_node_lib_dev_encoding in let transactions = List.map (fun s -> Ethereum_types.hex_of_string s |> Ethereum_types.hex_to_bytes) @@ -873,7 +880,7 @@ let make_prod_messages ~kind ~smart_rollup_address data = let* messages = match kind with | `Blueprint (cctxt, sk_uri, timestamp, number, parent_hash) -> - let* Sequencer_blueprint.{to_publish; _} = + let* blueprint = Sequencer_blueprint.create ~cctxt ~sequencer_key:sk_uri @@ -884,7 +891,7 @@ let make_prod_messages ~kind ~smart_rollup_address data = ~transactions ~delayed_transactions:[] in - return @@ List.map (fun (`External s) -> s) to_publish + return @@ List.map (fun (`External s) -> s) blueprint | `Transaction -> let*? chunks = List.map_e -- GitLab From c48f667b2407258ec7bd7084a4a182641ebc671d Mon Sep 17 00:00:00 2001 From: Hantang Sun Date: Thu, 28 Mar 2024 12:32:52 +0000 Subject: [PATCH 3/4] Etherlink: Replace dev mentions --- etherlink/bin_node/lib_prod/block_producer.ml | 2 +- etherlink/bin_node/lib_prod/encodings/rlp.ml | 2 +- etherlink/bin_node/lib_prod/events.ml | 2 +- etherlink/bin_node/lib_prod/evm_context.ml | 2 +- etherlink/bin_node/lib_prod/evm_events_follower.ml | 2 +- etherlink/bin_node/lib_prod/evm_store.ml | 2 +- etherlink/bin_node/lib_prod/filter_helpers.ml | 12 ++++++------ etherlink/bin_node/lib_prod/node_error.ml | 2 +- etherlink/bin_node/lib_prod/rollup_services.ml | 2 +- etherlink/bin_node/lib_prod/tx_pool.ml | 2 +- etherlink/bin_node/main.ml | 6 +++--- 11 files changed, 18 insertions(+), 18 deletions(-) diff --git a/etherlink/bin_node/lib_prod/block_producer.ml b/etherlink/bin_node/lib_prod/block_producer.ml index ee0da822950d..7f84cb7f81f1 100644 --- a/etherlink/bin_node/lib_prod/block_producer.ml +++ b/etherlink/bin_node/lib_prod/block_producer.ml @@ -68,7 +68,7 @@ module Name = struct let encoding = Data_encoding.unit - let base = ["evm_node"; "dev"; "block"; "producer"; "worker"] + let base = ["evm_node"; "prod"; "block"; "producer"; "worker"] let pp _ _ = () diff --git a/etherlink/bin_node/lib_prod/encodings/rlp.ml b/etherlink/bin_node/lib_prod/encodings/rlp.ml index 38bfa9f21c6a..02dda42d8316 100644 --- a/etherlink/bin_node/lib_prod/encodings/rlp.ml +++ b/etherlink/bin_node/lib_prod/encodings/rlp.ml @@ -27,7 +27,7 @@ type error += Rlp_decoding_error of string let () = register_error_kind - ~id:"evm-node.dev.rlp-decoding-error" + ~id:"evm-node.prod.rlp-decoding-error" ~title:"Unable to decode an RLP value" ~description:"Unable to decode an RLP value" ~pp:(fun ppf msg -> diff --git a/etherlink/bin_node/lib_prod/events.ml b/etherlink/bin_node/lib_prod/events.ml index 43e72657c7bb..7ee96e699dde 100644 --- a/etherlink/bin_node/lib_prod/events.ml +++ b/etherlink/bin_node/lib_prod/events.ml @@ -7,7 +7,7 @@ include Internal_event.Simple -let section = ["evm_node"; "dev"] +let section = ["evm_node"; "prod"] let received_upgrade = declare_1 diff --git a/etherlink/bin_node/lib_prod/evm_context.ml b/etherlink/bin_node/lib_prod/evm_context.ml index 68cfb4ab9bce..75b63a030d83 100644 --- a/etherlink/bin_node/lib_prod/evm_context.ml +++ b/etherlink/bin_node/lib_prod/evm_context.ml @@ -367,7 +367,7 @@ module State = struct let () = register_error_kind `Permanent - ~id:"evm_node_dev_cannot_apply_blueprint" + ~id:"evm_node_prod_cannot_apply_blueprint" ~title:"Cannot apply a blueprint" ~description: "The EVM node could not apply a blueprint on top of its local EVM \ diff --git a/etherlink/bin_node/lib_prod/evm_events_follower.ml b/etherlink/bin_node/lib_prod/evm_events_follower.ml index e34fff41ce91..5db1d3e42a97 100644 --- a/etherlink/bin_node/lib_prod/evm_events_follower.ml +++ b/etherlink/bin_node/lib_prod/evm_events_follower.ml @@ -24,7 +24,7 @@ module Name = struct let encoding = Data_encoding.unit - let base = ["evm_node"; "dev"; "events_follower"; "worker"] + let base = ["evm_node"; "prod"; "events_follower"; "worker"] let pp _ _ = () diff --git a/etherlink/bin_node/lib_prod/evm_store.ml b/etherlink/bin_node/lib_prod/evm_store.ml index f67dab404d65..6e5260fe4565 100644 --- a/etherlink/bin_node/lib_prod/evm_store.ml +++ b/etherlink/bin_node/lib_prod/evm_store.ml @@ -566,7 +566,7 @@ end let () = register_error_kind `Permanent - ~id:"evm_node_dev_caqti_error" + ~id:"evm_node_prod_caqti_error" ~title:"Error raised by Caqti" ~description:"Caqti raised an error while processing a SQL statement" ~pp:(fun ppf msg -> diff --git a/etherlink/bin_node/lib_prod/filter_helpers.ml b/etherlink/bin_node/lib_prod/filter_helpers.ml index 845ce5a88a1b..48dbafcced91 100644 --- a/etherlink/bin_node/lib_prod/filter_helpers.ml +++ b/etherlink/bin_node/lib_prod/filter_helpers.ml @@ -50,12 +50,12 @@ type valid_filter = { } module Event = struct - let section = ["evm_node"; "dev"; "logs_filter"] + let section = ["evm_node"; "prod"; "logs_filter"] let incompatible_block_params = Internal_event.Simple.declare_0 ~section - ~name:"incompatible_block_params_dev" + ~name:"incompatible_block_params_prod" ~msg:"block_hash field cannot be set when from_block and to_block are set" ~level:Error () @@ -63,7 +63,7 @@ module Event = struct let block_range_too_large = Internal_event.Simple.declare_0 ~section - ~name:"block_range_too_large_dev" + ~name:"block_range_too_large_prod" ~msg:"Requested block range is above the maximum" ~level:Error () @@ -71,7 +71,7 @@ module Event = struct let topic_list_too_large = Internal_event.Simple.declare_0 ~section - ~name:"topic_list_too_large_dev" + ~name:"topic_list_too_large_prod" ~msg:"Topic list length should be at most 4" ~level:Error () @@ -79,7 +79,7 @@ module Event = struct let receipt_not_found = Internal_event.Simple.declare_1 ~section - ~name:"receipt_not_found_dev" + ~name:"receipt_not_found_prod" ~msg:"Receipt not found for {tx_hash}" ~level:Error ("tx_hash", hash_encoding) @@ -87,7 +87,7 @@ module Event = struct let too_many_logs = Internal_event.Simple.declare_0 ~section - ~name:"too_many_logs_dev" + ~name:"too_many_logs_prod" ~msg:"Too many logs requested" ~level:Error () diff --git a/etherlink/bin_node/lib_prod/node_error.ml b/etherlink/bin_node/lib_prod/node_error.ml index 8ad290a3363a..afcc6e479c59 100644 --- a/etherlink/bin_node/lib_prod/node_error.ml +++ b/etherlink/bin_node/lib_prod/node_error.ml @@ -14,7 +14,7 @@ type error += let () = register_error_kind `Permanent - ~id:"evm_node.dev.evm_event_follower.rollup_diverged" + ~id:"evm_node.prod.evm_event_follower.rollup_diverged" ~title:"Sequencer diverged from rollup node." ~description:"Sequencer diverged from rollup node." ~pp:(fun ppf (level, expected_hash, found_hash) -> diff --git a/etherlink/bin_node/lib_prod/rollup_services.ml b/etherlink/bin_node/lib_prod/rollup_services.ml index f65ed2315769..ef5c2750e2db 100644 --- a/etherlink/bin_node/lib_prod/rollup_services.ml +++ b/etherlink/bin_node/lib_prod/rollup_services.ml @@ -28,7 +28,7 @@ let () = in register_error_kind `Temporary - ~id:"evm_node_dev_lost_connection" + ~id:"evm_node_prod_lost_connection" ~title:"Lost connection with rollup node" ~description ~pp:(fun ppf () -> Format.fprintf ppf "%s" description) diff --git a/etherlink/bin_node/lib_prod/tx_pool.ml b/etherlink/bin_node/lib_prod/tx_pool.ml index 8405d0ce7c98..034c34e6e47b 100644 --- a/etherlink/bin_node/lib_prod/tx_pool.ml +++ b/etherlink/bin_node/lib_prod/tx_pool.ml @@ -133,7 +133,7 @@ module Name = struct let encoding = Data_encoding.unit - let base = ["evm_node"; "tx-pool"; "dev"; "worker"] + let base = ["evm_node"; "tx-pool"; "prod"; "worker"] let pp _ _ = () diff --git a/etherlink/bin_node/main.ml b/etherlink/bin_node/main.ml index 3e52923cd93a..dd11c8acc7a3 100644 --- a/etherlink/bin_node/main.ml +++ b/etherlink/bin_node/main.ml @@ -127,10 +127,10 @@ let install_finalizer_prod server = let* () = emit Event.event_shutdown_node exit_status in let* () = Tezos_rpc_http_server.RPC_server.shutdown server in let* () = emit (Event.event_shutdown_rpc_server ~private_:false) () in - Evm_node_lib_dev.Helpers.unwrap_error_monad @@ fun () -> + Evm_node_lib_prod.Helpers.unwrap_error_monad @@ fun () -> let open Lwt_result_syntax in - let* () = Evm_node_lib_dev.Tx_pool.shutdown () in - Evm_node_lib_dev.Evm_context.shutdown () + let* () = Evm_node_lib_prod.Tx_pool.shutdown () in + Evm_node_lib_prod.Evm_context.shutdown () let install_finalizer_dev server = let open Lwt_syntax in -- GitLab From 3fea04c6dc5da25cf861bba6d8cc41d6dc8e614c Mon Sep 17 00:00:00 2001 From: Hantang Sun Date: Tue, 2 Apr 2024 13:53:04 +0100 Subject: [PATCH 4/4] update changelog for d517020b58afef0e15c768ee0b5acbda1786cdd8 --- etherlink/CHANGES_KERNEL.md | 15 +++++++++++++++ etherlink/CHANGES_NODE.md | 23 +++++++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/etherlink/CHANGES_KERNEL.md b/etherlink/CHANGES_KERNEL.md index e67dcae61d6e..105a40900ea9 100644 --- a/etherlink/CHANGES_KERNEL.md +++ b/etherlink/CHANGES_KERNEL.md @@ -10,6 +10,21 @@ ### Internal +## Version d517020b58afef0e15c768ee0b5acbda1786cdd8 + +### Features + +- Limit the size of blueprints to 128 chunks. (!12631) + +### Bug fixes + +### Breaking changes + +### Internal + +- Improve tick model of the delayed inbox. (!12524) +- Update tick model. (!12631) + ## Version 0a81ce76b3d4f57d8c5194bcb9418f9294fd2be1 ### Features diff --git a/etherlink/CHANGES_NODE.md b/etherlink/CHANGES_NODE.md index 6f1647dd9734..57967cff07bf 100644 --- a/etherlink/CHANGES_NODE.md +++ b/etherlink/CHANGES_NODE.md @@ -10,6 +10,29 @@ ### Internal +## Version for d517020b58afef0e15c768ee0b5acbda1786cdd8 + +### Features + +- Observers now follows a rollup node. (!12547) +- Wait for rollup node to reconnect if it's not available. (!12561) +- Filter out irrelevant events in observer mode. (!12607) +- Forward delayed transactions to observer nodes. (!12606) +- Limit the size of blueprints. (!12666) + +### Bug fixes + +- Store last known level even if there are no events. (!12590) + +### Breaking changes + +### Internal + +- Improve internal storage handling. (!12551,!12516, !12572, !12627) +- Merge publishable and executable blueprints. (!12571) +- Store delayed transactions in the EVM Context. (!12605) +- Reduce verbosity of events. (!12622) + ## Version for 0a81ce76b3d4f57d8c5194bcb9418f9294fd2be1 ### Features -- GitLab