From 0c07613ec51137352d78935fe4fe11a92c4ea96f Mon Sep 17 00:00:00 2001 From: "Sam H. Smith" Date: Sun, 16 Jun 2024 00:25:03 +0200 Subject: [PATCH] refactor: Make domain structure shallow Signed-off-by: Sam H. Smith --- cli/src/lib.rs | 10 +- configs/swarm/executor.wasm | Bin 514602 -> 509698 bytes core/benches/blocks/common.rs | 14 ++- core/benches/validation.rs | 1 - core/src/block.rs | 23 ++-- core/src/metrics.rs | 7 +- core/src/queue.rs | 11 +- core/src/smartcontracts/isi/account.rs | 21 ++-- core/src/smartcontracts/isi/asset.rs | 51 +++------ core/src/smartcontracts/isi/domain.rs | 45 ++++---- core/src/smartcontracts/isi/mod.rs | 2 +- core/src/smartcontracts/isi/query.rs | 16 +-- core/src/smartcontracts/isi/world.rs | 9 ++ core/src/smartcontracts/wasm.rs | 5 +- core/src/state.rs | 148 +++++++++++++++++++++---- core/src/sumeragi/main_loop.rs | 5 +- core/src/tx.rs | 15 +-- data_model/src/account.rs | 7 +- data_model/src/domain.rs | 33 ------ data_model/src/events/data/filters.rs | 6 +- docs/source/references/schema.json | 10 -- 21 files changed, 230 insertions(+), 209 deletions(-) diff --git a/cli/src/lib.rs b/cli/src/lib.rs index 0749c3bce2b..b84c0ebbea8 100644 --- a/cli/src/lib.rs +++ b/cli/src/lib.rs @@ -259,6 +259,7 @@ impl Iroha { let (events_sender, _) = broadcast::channel(10000); let world = World::with( [genesis_domain(config.genesis.public_key.clone())], + [genesis_account(config.genesis.public_key.clone())], config .sumeragi .trusted_peers @@ -554,14 +555,7 @@ fn genesis_account(public_key: PublicKey) -> Account { fn genesis_domain(public_key: PublicKey) -> Domain { let genesis_account = genesis_account(public_key); - let mut domain = - Domain::new(iroha_genesis::GENESIS_DOMAIN_ID.clone()).build(&genesis_account.id); - - domain - .accounts - .insert(genesis_account.id.clone(), genesis_account); - - domain + Domain::new(iroha_genesis::GENESIS_DOMAIN_ID.clone()).build(&genesis_account.id) } /// Error of [`read_config_and_genesis`] diff --git a/configs/swarm/executor.wasm b/configs/swarm/executor.wasm index b20774feb8defd90489385b02de847c82052c69e..77897205ba089b8b76616dc717c3bdef284e6fda 100644 GIT binary patch delta 116784 zcmeFa2Ygh;_6NQ*cWbgCH>8IoY&HP`gkA*%Hi(F#g7v8=MX>}FQGCyyP=wF}7no3l zphz!)0HG6#8j2xNK%@qdDkUHY2*Uq+=I(BGA^7}1-~adfyx;pr+9i9%(Yg1q7J<{_G}-h%nK^KH)@Ah{6ldjP$St!^`IsNg;b~Vf5?A(EJYc#(dGzkg}IuR zYc|XO_nIR@c~z4I>^I9FFxZGRX8DQj(<)i31ikjg+x_2q=f(c7^?k#zA2BtQA6dMn zTBFnZz0>Qh_YB8aWVhGe>icSsZoS^^_2N7I`@Yrf_19i`t4IG{hM!p#chcLh_js#+ zw-@`q(f_R;FZS=&qfei{FBKr6aGO?a4NR|EV!N-y4$Dfm$8wBsQVNxgN`~=wWsNb9f63?Yp~^nvLE|CgVdD?R zBgP+%M@{?qaXvrbJIh{PYB^&0o)_^iEc=bcwjcN*Uds3L1^j2r_mTW{tpjZ9t>>*@Shrd)TR*d|u}-w^wft)N#d6Vd!E)Ae#xgx1;LzIG!aQ5R zw~TGm4g_}Qw^&|X``cWLtNtMi$(vlg6021d5aX!q2yi8<^cLa>b`>!B${pd&lnj$Y zad20LDNPO6zOC`GgMe%f<_2dDqkKzH97czYUbQ!q-?2y7S)jwLBh9;ze2WFf0m&Sm z=1|ml?Ru@6frN&;2J=It&P1 zHKeH_nj@vDg>nU{PVM=WM_7@zAY~|v(;C;gpEO7+*g})hio;eIP6@!DTr?u(f z5Mdr1T2@5Z zy|RqT6~Tpg;HWGW0iq&@&<48$gR~XBW4Ux&* zh)Aofha|}w=yD*prJ^*mFG{U{q}pE6V5|rh%~D=G_YI)c{fpJMMy{=L!f3A^=uliq zX-?+i>JldFjiw!H(sH6AW6m*qk~iJxlYU(*iE0>g!)SMSldXQqanVtfJKmcd;FEkp zdlbpnjrLe?vfU^7oHigjs?iLKJ;s|{$tM}5LQLF52m2&k*LDEyFcZm&J2}KBIa9kC zU5$u>Ot_Q7e3Gwg_r|ngOgWXk#}}6&;ABfiL5b6C`^+Ot*f(RS4t-f*mqx22r1?Tu|6M)iip zWlS)-3<(OdyRw)%%jPt;4>H0ca#yURL(8iBARDXgulo`ERePph6Bw&8^|1S0QWb4deFrZ#YHRAZd`dbuA0jaw62`eDv@J=fQZAt;lF(vB`wX=bF21t;4zn0PX28jHqNg94nHtB%gUU6kZTx{s=TQq$RVqE`$ zcrELZCV8itR%HOPHE)RDR?YoEM>qEcz4smo`g{ul&1&(4AJ+3N2=vXV&*jZ(c|T!1 z+ls&(_cmZfd5_(D5K(#c+i(SsMyY)WAg5hl1l0TXa5IT|c%a4}3e|4iKNo3pJ2?EX z@9F^TdG#N7m@*FN8>LO`7>&2wj{ac#JL>d4sf~Q_ssgN9*N3CD=?_JksDu!0VTago zA67V&no72@bNiq`?NEmKE! zJ|cPY=|5t$TaQM`j4@in&XIU~u=Atvezrd~JI~c6k|W}o$2;M7*5kubl?G2trK%J? z`7wS!?i!=L@>CGs-g)Xt7MHjEsr3Xu{27A({uzSr`K*M$^_&i00|~Rbe(XnBz2|)i zJM_FH?B)y93Jtn7kQ@lp7QIwY%YDZfWm1U`ZF@W6I?7j%bnH#ju^dJv&vl=P%vz6z zl9i8ijL;7Ch?a;#fhbZ7?OD^0f(|_?FUi2op7%2eXx6&)jnKNiM64OmH%1%x60v69 zOZWL@y!Mh_=)+oB&q{f@z4{SvoUah+`(BID`o0n=MIo>wxVNSg@hQ2B*J^M91 zCqz%Pr=@_Vd(y`HW%Jb1ovpW?txtJHFZQ9fx4+&o;x2sZ{kl%_bDHyw!6;$&8($#9 z!+jg!cR=5UvhtNR_4Pz;f8RP43SA|wOHUFy;@7q}AD}9SzD3!o%D?rqYp=g$_f$J~ zNEL1JTaEqd;1NWfX<2W-t#jO{&G<)z7XJ>>UjniGxxZa|;T=0dz2AANLIgS!KKOeA zk?`q1h=h`V5C@I#f_Hfh-nCLfi}xtujrS;F#(Smso%Ugbmi>Ml-rk=TqZPl8HqJZs zel!6q9}-y84;x9z>HL0}mhmA0PNVp|k`E=&&mR#`{KtBM5!$OC6G)5qVziu(NnTcc zJjY9K01Q{3^k+>Dht*-!8qAK#JC+{GEEvT|n|3SXS#Yva_xQYb2h1Y^5(g3Prv?%3 z;qrIAjJYt#Uz>9>^=8z0aCNZcLCg@!_Q()IFqhvJ)Mun5Y4j*h<^!XM zHaF{Wzuv+J`&tw(mOwshR%Zq;5l z?ZLb!wE2w1jhj#awr-q|h~L~PVLQ2&-g zsQb?-Cw|6zEwy?dBx;YQSN1ZG+BEqyAHmX&rMJ=!e)hdrw$^;^mM!hw0j=`hocRW^ z`0y9R;>xqARY(uI&eHXOVi(Se_M)c-Ety4(UqAXuZQ$(Rkp9seg36uqR1I>s6jytqX!qUqI%u`K2X z;KW{Sm*;e-U4YO&k2-lllNRyB)oX#JLkY6W>g^@dyQn3j+*Bg%7*^yc)iLZ34jtlh|qw`Z0E z4%4bHi;qNv2g$JVw1L`@6%pFf@XFeo%M*>4jP^LKL4G*9tQ9PaO8?bpuR^0xW15q@ z6dHvR4H#iwG3ujlnIK30?u4uE(YH)6`Q*4}qzM~0Dzi_*Z$=uB%eoD;1SViWNX41Z zP+TipVbNY#-h{}iBFQ?ZEnF_g&T@!<2U*v(!$`&qfE?oALBlyMWJOdk2IiOxq5`RD zC&>CgvLed(yU`v-g#_O;+Cy&#n5hF)CICACJgqkt**mdYTHX98o?+4+$WJs5FxgcJ zHqa}2YL+ZzR(?G`$fVWFkK}_*T3LSNL!U^H3K%@ZM0(&(@MZ8IlSeCVZ**$MS69|E zV&Wv2$~O)L4lQ?icpfKX&Y8IV57AQtDE7y<{J9# zv1S3xYo)bhkWj9>*&R#dsXqlKD&%CT#JXV{&4^ifIv(T0+D6x)jL9EO0WP z>Q2frsXW1~r(raS85uQHLMblZfozq!iY81}v&V?ndktv`jJKu#XaLmN8IYRt7!6C4 z`3|07p(myV&@m{USpZmhWJ3_MFifAdp^nQD&`g=5J-0sE4DgytuJ-==*z`>nJLV{X zW2Hiqi}wc+oAzP~L2<1`-Hk3x1L)meEX_F?T`BIMibMd7SICSv!wj*4c@RuJDXx*_ zQ7DHGR`gVKFBrX8-3Tn0Fi;#Uy(#aEEW5x2n-_H!Ch?4rD}B}^6CpFCs~OFq5aD>s zpc)=PCa%6EYYQ%_ni<3CXvzeMY+*2xtyf%BEV0Mo;f{MUg1Vq&H6C>%C9M4=+ zT9N@BmCT1Zq?H>EvaQ<0f*$UvmIBFDeL6$VT!145p6PybGi4=B_Ctj5yAlq@xT{o`TX*q(6aOaJqZe;{3u51HQ*sD(%^=?3ilN#tb-VWACQ3WM>8Zd{23Md8 z{?Fy&NH&X5N6>15U7BjO$daIl0mHG_bZ~1c5MHv`!R88AT~^(EW5z~xq^P}j|lg02+R!!YrkLQ{-*Y;>#=5p)R+I9xpK$n=L}pSZeSInzT0s z(nKHH?Q2ockv+jjQo#|TdoPw4o@>@8)uNj6WDFG0K56P)(V!u7u$@|`q834O&2o+q zX;9&bFS8n2zrw0S^ti&5#NC)n!bDU88di3WfI*ZD$seP-LpxIVn0>n?Fajb1lclcL z+H8GO&9nX~2Clu0f$i9TIPX>$?WY+?InyL39Wet5O+a^TgKfeLBy=rP+OjOn#nKEU z%tQgb7Hd0pMqvu_*v`J;MF9zDZC56y7ok2_k0N!@UMudvHfc+W6G@hlu!VW8hjy&E zU2TdrV<-qCKo$^oBfz8nWUTFo#x$y#;Mlk8PCPt^O2b<|bCT&@a-o@CEJ6-0x-v)3TcqJD3)6KLQ3TvyEj z-@ih!ot|dR*-jDC$NaXxDu}Ut%yqSry+<71fhw1=x3r1IG^s6^rj{#NbqrQ@m-g)s zHI3U%fscriBy*@pZ(z1+G5cPugszG_2uX4o6Ap`|iZ*MX)41En+lqcecx$b6Uy9ar ze?&T}ht7vg|L%nw4X#k=d=QKo!Y3&lL1A=|2;Zb|G=*uNS8<6&2**&EruG%r5(+yh zj2Ul)zoT#%g<(PvK0)Ddggph`Kt#HX392a}#x4d#BIQVy;bjz#q%b5H7`9VbmKY$z z$0!_2>47plAQ$1P6t>H74uvH}K{C9F!ts<|Nrp>vH>Mk04vGkt5gAJWAgip(@I(sB z0z+gt*Bh=Z!`mpVQvOgG-scU6$?$0k%L2n?ICCk&k|hx`JauV0A|y{EWyEpw)b{?!9{D}=##ENbYKh1+I+LCK66)To=&R>hQ(E?c^eA~HNpF_3HBR`|= zPy6&xXEsSYcL>H?3%(pn{a)w8bul(hKOAX9|IOn-?E4ZZ-3^TG_QkP;m5OqHS#s)zGXi)`EYj7BC+M1bS&wcWSMF z$*^AYWE^|#c~s>5wIr$nMi*MYL)FbwKbOpT|B}uer*`&ILOFx#T&^4Aki9l_;5MoQ z>|6UFE3l*QZF~JmFS9mWzfWgPkk+HLnwMkqeyt87OMb0_-?P8!%nH?R+z9bu7_E9u z(YjnAhPC~@HJhcS|K3n%oAepHY}2k?aiPJoZpD-HQ0H=Wt9~Zs7owYY1sA+q9duVgcjCoy3y>#nAYKPog&?5gfm=MBlZ-WUPS;dGC zveV*x6&4k_(q>Oa(>O3VHPX0&yRy*bmx&pbST(NB5Eo)uf>>u_)fJ<B3EH1R*oCM6OF8$5wuhn zU4mE?aCbMdSU$og`k7cYbJU&4e{pB1CNsomV}YDJ%;xrL<+X9RYm=vw=(rQhag$zb zlBd}F%`Aoeq{An}$5(TR106$_0)HJtwh=1maGCE9N)pV*8WF{bGOJAz0RPz`x>#5e z|HMss^FP3mC~<(D^{uRmDiJgX0=tt`rC9W^u?X7(?kWhKaXD6IW;#iBUy{TPD{D^F zBuHukBr+OfImELzR*hYg*)15_-n~i*-YTIEXapSzvH(f<03f-gBRTm;NF1IzxdK@g z9RuKj;pISJ_)f=w{ZL*q{HsyPu2&=8hXOz&e;+%m&b|?2qgf3zd|Q+HxojASSwN5! zvqyrYn56}=dhD#ut%4wM%L^A$NpI^|i5nu;uM$8P5NJv{R8+7IRmB7KZZM$c>IjR1 zeGyhwb=o@o;UY^=Jt6#|8rF4jl0j;PV2 zm37!C5A5Q~pkbJsdH#5x3e{mFJ+Lc60Xs`)6m4!OXVmjyl2J3lB%{`au`aAw$B7LM zPDS;WKO|ho8ScS(JRGzR)GH=lhyWA3u!|#f*f0-la3rfICURB-+ZX+cUlFN8hI$|) zqCmmdI%h{m`64|WrGr-XfVPPS=vb;$N_o-N7#%9a1NCYQpgt#rHO!cW@TpOQDmtj@ z0UcX~g|b{}0)wD7m~-T=To}F^-YB@Ndek6ql-$!sP~Ur_Fk7fY9g=OUbj8L@hl6%mdCc}+jC`cs z{zd0zX&kuunb&rcF>VmAbHL)|Ks@B+gxDAlmfpq4S-cj(EOY7lTuP;j8C5YKu}!DH z4D=gS|MKcO^zuxe@YgyMM|cuY@|N4LYI> z44!Wv?Nw2#SG4hX*Je$J$u_Cb} zg~e9VXDG0!Cub1EuPN+_kee3bHce`l8RV*%c&-kdiz4ynSaXb?L%k{I(=iQK+@3|L zzx=sbq#ZNK)z+usrpalz1K*Gb`EQzrqoJJd6x?+86xmTU%(Ebfa(sg*!8cgdKZq@_-qdwAdz^m|J6?TL zvH0d2#Eh{a-BU0!V-d_Z8S87_;9484f%yip8QM39B{1J0Hof`=vHs-^uCdX&p(mKG z0yS2@JYfoA{n8r*H0^}+P>CS=6mJl~=uf;sq@pkJ4Wb|M4F&|dqA{lgcU)a%GotP$ znxXrA4u<0A3~HfxupO(11$bHwi5D5|(Cs$6AZd_cALh6qD~`4PFGp zpg3Oa>ut0F*BeACR+zj&q{7_#1~Coj8b7UqMCI0O{Qu|{%e~$$ zmfwoeZP-6BV=wnuinz9{f1D%Gvo*E(9WM^Cs4e>dOsnN$;{O-z|9#P3F&m<@-3 za^WiL30Gw7MY%w=} z-{jHfAZGRS^TW(VCms`75g)SCeZWOahEy~>!59nKl7 zx6_zp5c@l`j_IE$37jTzjI_G!RM0JBUprHmVPc+EacSv7_RUK{sJg;PyFmbx;)SV? z0fK}{NmBu10*r(AQ;%|op^o7R2g8qgT1L2Tv3@Q?2NXw^8pwgznwX|eCJM+}yQ9+7 z44wcGBQ04cp`#IO8jBKdc3}?%E$}vTg{wH4`kjf*5x$E!*&F4o+<)F8j;Q@Ei=aTf*J;cU|8Sk-9=EAK~ z)t`Bm3BX-=*1d=oA?iH`*J-Zk`W#}miUG4R0GKP-QI=Q*!o&2TVt7;jCd5-7R)F)X z&Yd_1nXt&))la-lSiRFk_pYoXzhV;eyRv~mRrh)Jv@Ygyaf@~j!R`B6H28@1BB{Rl zJR3tRSz}&cHDggE_J)ujh^eetY&L0Oh}APdFH7dJQ3Tn2K6?hkl6BqKa1wCZfUgrr z0)8Q#H5X&LOAYpji&5C>-STS9-MR<8lPvEZTAJ2LF8sIj4&vA+FgI;8U~c;KV;zFddO22+ zrLF0f8edC0vw#@(AGlmjmiE=4vEB+-XjoIsH*`fQx2|2_Jp4Bp*2(IIKVwO%n-Azd zmfTpR&uA1B{~Jxo|F{Wlt?NVT%dD{o9?q&v9Kxmq(D7^dE;PLTVu&2xUKzrMuubCQ zp=`EqYQ0SMI9#?tnJklim2V%$dafO~nJgw~pnFf6 zf~}1e_$w*q9lFrC)hc8hSo&X}Rz0%WM0MYvQ>z6&12|o+e%kq;tX4I&)kTpadK&!s zS^q>IcHFru>&%z`(fUyAt?^y-VWi&L<=spt(Rr2}sQ#btYoHX5iq99oXW#ZuHKX4$ zR>P!AhfjZ#^?yJy>`U3BL8sjexa+FMjz3z}=%de!Ov?i+%l;`Vu_?GVhK-Vq`Uv2_ zihrYh`Cl3Vl&xehbjGGuCXdx)+JcVNGxxE2tXCl*kJV$dBaYQ$O$rhE{(0KQkJn|` zUq#QAW~?pYxz?$uf!^~mu@iFTc86-4h?%U*L6odGhrdwVRS9r3pjeU*sbB8k2VqN|DC>)2UeqI<4q z8^depMAyQD4%pWUoE*fB;^Qlr7+am+Z3BCYDGqyt=&=#g1=x47k`2~;?1lD5BkY#Gw(8bJD?ka^3hwH|Dt(4k-8o8 zlB)&y{;Jr$ojnFFRw6FOiRn9-9igD|5ZWPQ2dj<9!173h0{lWY(O?T}C^{Fh(ENwK zf&U5!UJk(=6L+$XLEm_rk75%hTzZ9*`V8O&8o;<^vU{Pem8O&oBi1TOIw$RN?o{GgF8yA={S6G_5S?oB= zqN^Z*&gJ4FAoV@!;jHbk_n!8CsGBFA!+8jYxaS-j+F&zt(UyWVxk*N%NTL&6bTUy+ z8GE8qWmF(`3|%ubSzED>!Mm(R0%5LvGb{gOjWEn^SjaiR>J*;iuj z1=f{sW@6`;7~!7qn!yTtr&=amDat#i7Us1@(!ctznOl7S3K`G*FRoz8ENImq^Q)%$ zj6Tuk%di_e{#zK9kEJ>XXVWJ%;L+^U2@mn+&*S7fUDroPcW?opRh=Zy?;5Zz8e!bG zgd_9VH^Ee#f5(OirVf+`Io)S^X>HH*ibXZgE7nf**9oQk@k;W-K3ak!bW?gF)eZD-)uL!rKLoH9_0yjw^Mn7^LtPVdG8M&w%AZI!=q_ zKd7%NM2W&(4Ne$kioCK8n>N(zdRU%dr|=Cutmj1dQhqxl|B%I($&0z*%~JhUB=%MoGz5b(%B`z+6h*)G4mRA&gnOS;g~Ao4LT#4ItIjpn*cjWWgB2e z@P1BcX6|Bp#cne%V9Uis3+}8uVipfuc~t~oxAMnf8#Y>b4LnX+c}+Y*ZM+s9t?}SL znnjw8{~e%5Y`iHyY!=Z0{LQE%W~WWAf2#N6NE0VlAB7z?ix~m3n4W?BIsTJbYzX8{ z==m$2?6^p=qtxS~6Frt=qcMLDk3u_&TP}XF^VHfu;-D+;HNdLbyRHyAFpTZlSjMH( zdr9(iE-mMxMG(mE9>g25;1ce@5gA;Y6`+=I^&9b7C4O(jW{YPZ$`+qDak&z2-N_+Y zqi#Zr(l++ZEHD&2L{VsGL?!i6SFpgq>WrmJ&Z2Cc`@LOZZ>U9Jvb#YH>KZ0a)-*MM zoqtBnt|56f;72e>Q2N%T!m~SD9C47sb<+ z`2;LMb}lxy5;a44f4;~hn9Ed0>*XL(UA|#B{prdUVPeN=jJoq-I)wMgt z!Z1F7{U+*#^9Rr~z8lWtMWYBl3?~5AMet_%t0Q>=!xn)9Q9Qai?gYf5JROzC>i2N> zF?ce84R@&xJ<;C#HBjm#Q8xxep-S~V$sopusP0H^ z4y1K`l5y>Ze)eCFL#6eLA4yf1J;eiw!w5@|`xV>)S<4$Y=yuBWOCgaJb;Z#RovnT} z+@3?fEmE(my!cW!#7NPg3Xg7&yAqN-Skw`>XVq_#L{{9j;MBozSZoQS&4J#M!Luw!>c&6V-30lUP z=pqZf9RIeN5{q(9h~=>`DO1E@gor3?&8vv0kT?j8ej`K$xNave!G}C-_x2)0}s1Zt)=WB`6ek9(GR=)!il{z7QkKZAn4T2P1~K zBGIlYA6~gYH&RR`@5R;x{-{x!I9#@w1Wk82c^umz zx;bG?3q`t<4`By{Ig!_`b5Is#pu?rqB_ssM!VV#}rc%tEw$#|ig5;hR2kkHKkqDzz zBtA^!DR|6HS2}|o1kw!q=_b&$dlv-D@pu5er25Kn8fQul`;nqb_p`z z{2p>)TF0V8jZQ+Razw01g6S_3XAqK?@+v4YrW#L)J;69Qn#{w9PV&lmloJ;!P!F~$ zzh^am4`au~)av{x^ccTXhuu6OUaf)d>ZDj(gMZ7WiZQr%f}Ij6H6hBUMgN+7I?4&F z#h=IHty<`9i^Ta_=;Vt;&)WPURw@?N=BdDPp*Aey0TG&l{^O+Rkir`P%X=vRIU&AG zLD~s%fZj`SI)EJ0 z1XbFL&I?sKfc8$t1ui(b$X$DJzN|Uz_MkZ_hge^qzkytJ8X(t6@mvF551|p{Fge5* z4fr&Wa9=~-1%*y*DAT@b2ygwA7~Tkx)5L*Byl!Pb{512nIX|{Bf0D(Y@Dv=bGkLJd zX=|orVtx%&9VZ&A;?Tn4CVVgoZQPXC;m4V{)tpCIbi$X4jHWyury%GiV;63Fh6KaM z5Q~~ZUS$4oQPz|P0LgXSMFO(2nt?1mB`^>dbKq(Vd7cLKlUDe zi6J(mrHrlH5?Bw2=UVbQm5;kAC-HD|YH~|d>7*zlsN*886*{X^qID}-UREpqa(Qio zytT#MAeaR-%i4zB%R6CvP>*|gdz3P{4e!NHOl*si4`3%N#9^!G(iTZ4glNmtM5Q)( z|C7)IkSW^5>$9K51s9(n4!d}W{yvMJF$-5aUQ=vJg(@r;S5qOd+eF)Tyd^?-)XJaL z4)WIMrfvsd0M3!)NuyWwy!Wll`*y+mb`i%POm(dioI#S7B$;Bx-`n#B?olI?qei3v znH)8e&qJd|Z&WH$qS9#8xVJrj5dzohe%?gMum+2TQ_W2go_{~zjEhc*96I%f2L`AP zk=}tfNd zpc|%AI@T&O9)N`_64M^wxTZ{$JizZU;pnyclL+p}pX6VT6)$%L!%Kze2(36GzV66} z%G<*YxU`n?Kl31e6t3^w2Z3g}`1(PN0uG4E5AjA(2g&wWl6f-BmZhdrKOsU2$U*V^ zL%c5TB^IL|;w_-^g%9z#YB?qX-KF62gFuJHg^N%Qr4JGfyn|-Hc4|tHZ!0jMDX zA(}nUd!~ayI2K)iA`q?fiAY6lp#aw@v3R=-PKAufaE2bn%)fgf0r%1CQJ1_?wEzDM zWkyBuJ7+U2>=~Fto?yZ_C_$kgqtceQ6;UtnhudaI&SNfV?GlhHL&aMpGU6y2g#wue zuoIisTX16%E=&H>CrW(r0O_Yx+Qm&x)~9G9K^;z^_qC18~Us( z;_uzK3$QEy5cW5~R=m4*Vlj1_c(o^NQIVL`lgC-g%FyaJ6|t@-k4#75WF_ku_Ev+n zq3V4~+NY?asM1o65O&ok&2wd3LC(*lHC6P$NN;0F&Jny0i_DVO2$4`RcQ(RAVX{7y zH^mJG@HwyvvTVKap|F{pNOBRqy3>~aBK9ipDifc*$nU9C$}s21+qza>1W^mcsTX;* zguNFefk6gWCdGnOvWl_{$cGgMzurrHBp9*wC3J5^;_6G>6?TEzTvE=}i^Mg^k$AWl z|C^j))ssN(B}FXj#p?uJCU9y|BSoF-1qbaH;dq(HxxsZ2Gpj>IrR?T$=y+L~nBq0Nn8tvfrE!II_-NVU@CVgN%xB)`TZ;ztm32P0@zhY?cDov7pV z7o$2(bbXEYNXM;6RN6QcP*b^T?o3ywp_BsL&q0#rDqI73A!Z_k8bO&0m=roppns>E z2CP!MlQZ@}ViD4X5?3sN0IX5pPrp;|R}aYGs}$KY}^J#YC1=%sZkGTQcd+v3KXDm%NeArDfp%9sh&?tqeoHo z+`3$Yq1Dn-skriPPaUi)Dv{_a^mNiQVTN77G-~AZmuv`ap+IlIG4)pu>f~==CVqVY1_eqNEQWMZ)_!zZZ{B@raT-O!dPw(XS*!R7I$> zxcEB8e7Yo11t2=*_KAEC*jiM*NPPST=B%zLV&)q>p$b%-x!U6TKcu$pEloJ^If6;y zOW#1>_lvOi<@ySY$AFpD0pgy%QsJNND;0i3UmoZF3IioB>B}RmIwd={h#q};lsM6s zhmZw^`G>L>-UpsmBAp^-AFsO@UiqO85#+nIOg1I<9(bUqkhNY}2#_GifIJ5-Z8z>u zQl}9nt49(^bta;Z(-nZZ(&uD@%Yz6;DvMKRh}2g_o#o~w_~E6bph!{@A6b5uCi-EXpV)D%qj0dup^{gN{eAhbkioaI=3l}_o?L& zG=pnk7b*oW2}Z_KH+8ajtRJtHIDs6Xe$s*0M{8!-HgLJU9PYwrQg@5#{a^z1)*&qD z>J^=hXn3&QtnP-Bg(8T@>i1-kbYodA?=Up#7%sauPb4)L2qQ7_(1dK%c7%e2%o|PZ zicz8T;NW{giNt+x@osmT@W-4tKnYcdZjGc`d)yZCa@|XfNpJJ|ogqjx@mv=mbKr48 zE+$Y7sCYbJ*Yz+}knU`PS@M`?(DfUH0^JT-lqpnO>T71c&6A;U-@MIJ;$fY2Lv2!F zvvsFzl>TB?M~TS({FOTmH3=E+ZTu64I%lVpF)xEaUI~N+?D99%dz+B$JkZ2#n{!PR zTxOC%@q2%s7(a&UoJkiAfZYx>5ruVIrl^NS>v#Cy*kK{w;hoe;lC2(|VhZ<{cQDgd zBnJPTcW6PfVZ-?<^5@A+qi=FK)FZ?OaE=B#II^zyKdKy=m{=wUsCsV#D z;*o#wnCEpl^B7dpC$A4$i0;bkdQ<;Jg9YF&-n-ENT|UaysZ@bNxwB{vhIpUK`Xo`4 z;(8pjI!%1}4-Azj=hu9f-_O$ZI$``v6NJgUtg-qdSEtL0N?jo7&jE^Le$|X5V3A}Y zjzo+!gt>At6i{an|CW6(-!R4sRN9i?h-^u>VT3rkG0rin0TSgLI1@SI>U;d{?w=94 z2;vwE zNWAj_mW6hRoDcYu&woLw(md0SjgvosMJSFr?5<1{rOIS!j02E7hoU4kP(UYrQ6)f~ zMbLq+LT{3;(X^;GOFZ@=-;qAs=m>>jOZLb~Wdtw<>Xn+D)-e3)6k|dqkWz?1Fa<(@ zHb|wf1-Z%)7w$mc08=@a9ED&#J{zJNU;ox$!N=W`W8{Rx`5z==;5|QCf6o| z%#c9v2?S1WF)oJNEv+sXIhJ5;FJeE&a#NA0_c4DieKBR;+lrVMpvnLlKG~l%BATr# zxCNi`-ZUo|pypCw4gxkf(o3i!Ha(8`PikzVlay#c38JWZUJ#$et4PGjdrC~FhLuM) z(cgfpcBne$4+#Y^zA}PtjKp&cT2U+rau*Andg;V?8!&>r@+3Vc8Cw(tyMoyk0AZz- zLL?O6c{*A^;ot{a1!2*1S3(fW(qq=81swmJrk$t2Zi6Rd)$izFpd zB24Z?BicTV%qfJ1d@TtkKF#3u8+x;nPb{;-zlSiH2`Q8Ls8gkUMvM^vBW`8zsPyGj zB()?av=A%#1SwKwJT;;|f}d@a19Q5JTG7*}CDD#3K;|)d;;Bjf;<*m5w=Mbr9p2^& zr1*45wcZz?E!>DA^bDT1#3Y7Hpj($ERkHP989X@xa5Pv?ku8Ivyr=mBJy|@)q&$ne z7U?9@5ExH2Y`D=;uR7X=s_rh_j7bd{Pntv3bF-?v+D09Zw|eesOW(l_uHf)7dJ+s< z&1m`b$`=Bc=7uG3(i9e4!We(By@^^{4RAIzI4lLTUpmV6?M3zt_r zf!)zQv+fV6nPB@-1qVF)CBpPP&%3jcD9rQ)S0q5T{(a{_blQMZz%oY`AqVyAj4dd1C zJ>f=O*#M{2qi$;qjdkFAd`^Ae=RfH^v}# z|1kbA3adGszm7;T94nK@#m3?ASx<-`hx6)K2P57%a1pD!Ff7lMQehm+Gf5+OGc0a( z9f29G17h_Eka}8N&_j=oMCgPVG7^jKC&a>$SjIap3P&Qtfr+DJQnOL0;R*39Jr0PE zMqzQvAyP*3JlryQB(kBHJk=N=V#n}C!47%V3%RT=<6D?Ie_;&vW;n#^F?>GKXuD2% zTK_Ce$T-BTEL6oIinBOA$0CkpVW-EkED<}F*GecQ$6tPcgK{CS1G3_3BPE3d@Q8S2 zEM|us;`6as$jKAMW4SYQHwiFKqCwVG`Uz8)3DY>N_Z%0`jpOZ5kLly&8qwNuygOJK zr(wD5fOtsbi?KXhfpX4XG#h4E*e1(WuWd)77*3YKAM5_Nc2ri_`0Q&88KC0^vg3 zQ?KS@9U3!Y5*|k#XsHC&z@$!{IGeu|ac=&UTUkHPE1sI3y8qDewdX!veXgB)R`i?1 zQ|cF@^;19DGXBQqjLSu<(&Z=Z45>S39=yEqi^9`$5rL&TDQPhKCUt?BJ{5k^1u-_8 zr!=VuaXCp4pfz+KjhikUoRB1m9_xAUh|fMbweZ`$Uth^cPu+f1TwgiAZ2U)mjiz;y zrWO?;zAH^Q((TWy$aT5X%Jy9!wrE{?YR>V4m)8G&=!Z>)zed;ti}?1N zOH+RvI{t?@Q%|h9xn=ae3Af-|{3ZEXq03iAi0?`lE}JjsSmdZxCr^!=JblTA^wfDH z#!p%|?Z(txXqE_>&Qt11q2E}rfBNL_HqCg-E%QZ3zuNHi=^H=JyNk>plQgxg5V0Ro zt9^tXM=fq+)}C=o_AZ}2YFp#fvZ2|-@|PD4IZe#^m+9g|d|I+eMcD63oV?>1Mnc!f zt^3v#i@cfJe>9}tJdiPB@ztr?-~I|=xObC`M2m{>-jyWW6MP%LKKXL}#WRC`9^W{1 z+o9omH||_A5#G~Z;1{;4N!wKs-n)_|FM0NGD)PJWw?6%O^p?>-7*fv{{&wcnm20Qh z|0UVt89r^;vO@HCB@I_G+{Up>U#*_HY{-qBGtyJf%$>OZ@`AmS`}`%2?b10`5#GC! zg$snrwJ~De>ce9D?9p@XN!@Vj;@UkYZw<^NhM@G*Qr`4sk)~E+;^o4 zHw5|fE8^Rwt50O+&OI|TJ@xA?vnOoM`Fz}yf1R{>x{OtX{I0a&8x-Xni##@X`jjD8 zf1kNLJvBdP#Q8mAW(;2W*M*Fa@m0+V%eX6jIML+KyYOA-uYUULmy752NIkfq_?un1 zLw|VR!@8oS9yORV^Va-L8AEUF@~FX#4aGnIRbjV*hFF)`Iy{M=VWG&HR4V_|u;ZTvORY+`q1)qjepv2)Q3!zB-Cq9sKzgadPa+ zS)5K!T6{f6_5>9nzbkDxVPDR($RCd`S#a}cS=RLQ)Z9I# zhxW|BzIlh+^{FQQg!kuK_~oO&jQw%x^dYaM9y?k3*_nMi zmj-(p^k1fp5Av0^3QD*ueFJ@^E%L;tvyZKqG34afm#rO@-z|0PH%H2rFS@bk`Ai|1bWZUd=f>y^BAiuA4jsR?V_8^tXUW549#tgR?p&g+W}8+kyJiZI`m zFx=gy>*C?nym!^C!H4rU933#@j3IT)iu|L4vJM_Dg+$4*G``bFqv&cau!f#mA)sCe z_Zvy)-d6EMF@GI*Rb8?pZ^DFM_6)gZNL@PYho3Wd4mfh8yrAD@K~1Qj3IQuBNPc{T z+)JuRd{*(|qa%*Y9}f5Olag_RrhJjV0KJ5}9)l(Ndt^N-fU5}mpo*)JKmEJYpR8SY zEk8Z=)0`pMC9~%&S&UY6m$SFL8WjRoRM7Xn?Gbe z9R1<)YE%SQ5%xnBS7ZPFjbE%TE?)me>L*`s8FOyZvU7*a8>84FeqPU$8WX!J0<5SU zT!39};j8YQJ7(F!AATx5Ye+qtF>q$?f=M%IaO>vMk5rACO)CV_ar@8B;4G`ZDmmsZ z8nB}9^DoPOH>6I?Ih?WN%B^+6!zKeJiiPV-9x4uR;K6nN@!g5wbhjUAhj&dqJY?CVU9c z@4q}#v?6D_$8k9}|3JY{H?E$2+3mPsezKgl(HlYArE=O@RD|D;wD~^13oZrs=VZjG zlBGw7t)IW{q12_97OXf~IC0-VGD;t9@{spW2mEC|`kE)F;a+Y*JAXeiZsL z59e6RnHM=I^Z1qFTLw=4+K_tf>->pBm+U;Uh{)T&nWy|o?&11QFZTj6n47-s<@B|z zun<22eOZW0VfNxu&YB6|WR2f2rz=Qo{^g%0k-jhK7QT44znrqh z6=1$AUAV@noN*Czw`Lbz`h46E4N`MgUMTu`-j1!;N$Rq{`qM<^xQV*(6_3YZIj=Ib zs0j64sluIY{@kj%Ds$1f-4`|=T9KYAM(q7;`;NSU)5}%2P_+G$huvF%`BhgoKHfJH zm(jZ{s#M~Cswf5Jd<+jL@HBN!Iqgj=Ec~v-dN_r8NW^Wtgyt8 zTKMbW-%Iz7`HF_*Zo4*An&*}@^P7}bF|1yee}{<=7!Z$;BhggsK{dQ&q6rp02KYmbuG;L z<4xTv9@)uL?pDTYD8sJrW3Y9=Zp44F4Eg;+nKzl}t55W~s}x050>QFMsBzt59`i@k z1jys~uD}l1zwxhAY)(vqH;Za4^a1i9?kCt$@dR`8;CVdvi*@$@b}8JFK)+{Fh-P=!F_a6W-R zjXLP?-Mp*3ZGmniz+yPIFNjOKaVB-X`1>CIF0!BB!z1v0Nb~o67H}^7o>xQKci&^@ z<#u7)%a`EOKx_8$Uh;#Ql9@?L+A)j$m~^gvspxc=J5-s7fk542;FnDR3Zy}ih_Kl3)>$b)ZdxTV@AGvku1E+=?(>i}Yt z8H@)nlSI!m{OJyN5-1tEL}w^^59&1VL!E|?(%r5-U@|Gs184m!K>P(UeiabKXC>p< zIsQ=v0)mrYu6b0t33N_9hofRk#F=ya!|Jj~5Ets&OUXFF1(m*|wZ-W3I7_%x>_0En z_||#e1_zznl;Nydws^jbxAe%{v@+g`;L3O#k3={w@TToRF*MUdF`Zb;w$UL=Fcf}p zVCtCtL-u^JYR%}m>8V$CE&XPF=E_~Y{dqH4WM9BC`ckp$0)Na?T*^ghIbONQlP$V2 z!GzIKUN4le8dQ|(F?o={y%%{kKPZbEO0@WeH|*)ok0VwFX-4RK@vs@X6#=z$O^0sO z^yY_636$H7aMhdJ%D6MoL04oz(X^#n;*e3I=oiVbGr#b$*a-0PCB6v{*JX4H%fv62 zc`hC^f5nyg3q-3cI9+;1lw9HI`0QMltNf{tXTC%f##0MNlSsT;~Vbm!i!L-ZA+r`DrBBO6-pz8(No6 zy2-Bvd~Kl^cXXl1y&;cy?7e}5v9xW$?aI)0!sEjHJ8v3Y2CGXO4&*KlW1ti7=pEHP zM)BnDeB5Js7V>|R0l!S1`Ao(^VK}Nds-P~HNnuD@;Z6#pgeW!tcF2`p$W@j=@dgf3 zu*>4vn|w5`emHfL*AbT@_|rHT)+v(5hU~>5HHSPwMw@@QdR4p^$z3Ai7HaZ?XnhO& zFs_K+x3Hz+vY2!WM^~=rue!zGWNf{t#ejLec!(*ZFf;lCQ~KkW*&|%h0!zRjjvG^w z3@$M~oOcepiY+o=2JwwHb2DrVyCTm1WKIy#5j-Z{%aUy@a3E(E`Sk{KZ=7cbf7Aio zi7fOm^-EBATOcsewhi)v;gI9=V>lCm6DHVbgzZc+3TG23ic-N0BBC&sq z`cqKj0YP~<9ZlOL-E`0)1LOgio)uPPusE+Macr;%GAc3lq5w$jCpx@nWK*>!YYcJhh}NN<7>7%P>gsfM8FaH19sS^y*{pnKy&ZIdD}SO8BVS*fZ!& z#&OnoA7~m&V%~;eJ$w)sj7k^|jo~{##x zI*d!g?Jh^YVLOmIg7&KG#9_}cu%Y6zx)i{kIRlQbA)RuU*BZ)3=jJ5eAq7TH7Du{C zo~I*c7D&|5lI?n`E{%HmdP!bds3eKpO^{w3?JU=$pSIgYfZg%Yv=HvZ{6A*uM+`w zTT^GA*}Qzru4UOL40@!4A~$?7e(KJ$Z`b_fj#Me~`yUof{^{3Kqqggjh?)G&t?i$$ z+maEZZqJ`)Qz|ihHFIHraz2Sh6mH%G+NB8uFN*`(%WHOADZw9W~oW??h0o#bXkwV{&B^>8r+qOUF5jbLUm#kql3|HaLR2p zgSP5$QO+s^ClXX8yrslitS2~}u^t4)V6k#rg`uH3T(UDxBIu_oVWBz#+SU$l9|9W& z%-O2a>v5S-h8!kGv`$q9pp3T@Uw|$6CI=Wu6)pqa#yjZF!hTMZqY4mr4pGAYCLv2@ zT&$k0SZ4EY9NUQ}GEPPXa{kYuk5QRb7x!YF{K01w$&$ZETt>|zPw zCL1;c5dMP1jM}BqJlky!vr{t zB0Eg6H<5KMmWgi0mr|myqDcNiEFdoqY-0!g`9Fjy%~*YzHwWZZ_Edlr{Whfq&m;sY zAlgPK;d-@c&vs=G#aS}f?G$H$sLCFS$@<)`&kzR*;-;I7mY;$X-B~)_$<8REn_}{J zMJVq|I|qRSWl5Vy&z+)PEFs)7150GQLu7J5WR#~KFiS=fm>NEI z2^^9jdOeWtBlP(fqm+kDur+Ptl_WA&y{am|RYAW>9U1knhQJVVLa5`Qn9<^WhZ4g^ z$&NZjcGOvVM-BTXclst70wbh-lRX6T=-uH+vEQLoPahyVKQllJ$T`tn0`z*=8BGV8 zs4J$fxm5R9=q6<8u@EqAyLQLBJqX%(JP182IwBLi7K}|K1?Y)zE>!wpHsS`XMJ#FT9BLx(Ce)PQ_*Mls!n#J)ifxH)TZRix48(hJeJK&Z+3{+cQ03%&4 zFMv)B4iuv_LWCM(pFS)J_2M2V)K;$|nh{mRg%Z@Sx;X$>%BX7ST2a4oGM;de4}gc2 zP?DcU3hZ-2kwo8%9_85}5}wj4$t>hz*VkLBMEi1nw)+KPLBwq><}UlgqoN9Q4$;}cLB%<0Z^p$0Kk*c z2;L%}RZW*tVxjytN+fm>K14%?ba0{>12#+q0u^2ey^mXN)+NzQ%>{QZK+oi)1_U6v zyd(~wN~#3?PLKm95T&FA1I}AbsIv&J<`xQ_W|V{C;lzVBd0v8uG4r;mm}hb~0rA9- zS6qrd0ZKMVR(d6w{7p%}m+9^pm=Vw>%Yn8_C-=@~pz#j5*?L{vM3M7K4Th?E$fR1M zqI#P_8hqHLTQF)Rpdu*9r>8}UW~fmks0Ub0&N)bx;zG5j0(6$@s_!6{yZ=oPPghqS z#pN5c9>70_$l`FI^q+}KsZe)y7!RTbaur^M{KEaF`;ZWnp1IU63d;e6I8$Az-EA@l z7KMzX)JbALfl2+uSjtD&vGYo59|r5?zTcSxrzqHc5Wjc6sQGipWS6L)55Bhc7B zxaAPyF1Wo?A@LILcZkz9Fdm#NtjS6(Ooui~RuZCda@r`*h2m&4YCv{`DuMa%*OQfz z5!Wc7_m+6n6DhORetgkO4ifbw1dhJUkNj}}X zxL!+{fU1nGt%T`rGK{jre1~UBZlBo?t1L^#-tI+{b7%JTA;j;sm6dKrAiMan@1xJt>)04Az=&F9XiiowY(&aA&39Lz(@`6J6>m zp=^78ue!=6E>asPvF_ve&7tqE%!#^|;eZ|H+RH=5ve4|YI{6#K6u?p(OM3==hhE~&cFgk8bw33=r@8c~dZ>X#=Vy+eE2dd)$(nrmdQ&o`bc%{tC#$N@E`8XKn630v z*X2L{H^s%+y8H>xC`%ZY(K|e+yoRkMOP+(>*dh)*hdON$QC*eC!nVLCgbRs!7;w0l z^~NOJ8u4*gr9KK=+*L_tYsB8JN=h@p!H|P4d8w^EM4>evoR&tML0yYpi|#n1$vuZz zj^r1*7`VAfw0vG!1p+QVuN=hVyBCzsxN|+Jn{o-4jYoG^VzKkCX?LX^mLK2mu4Ln; zyU-p=FGRlALrKTuS`TF`4t9^|iEe4TSkP0c3dkKjm5Z!cYWx4x$AP2CM9>NDk+W)|SgqHD_+ zc;s-`PqXn{$kpALJk(vhrks4J4A#Oxv*ZwG8ltKaPnGoW8eig;S?aom8i)ya$0ax1bo!^l@-jl;Ci| z2=soLSu?^rtl(YO8wgmiF!R1Cxx)LKzm}5#PGzutIGz1vHFsR$&3BwvYP$Z@>x^G> z+Ev~W&K5J_DsO2{t-bEnTy(A1++1+Am)pD+UDJSv8e={?=kRQ}8?W{*Fn_ea{~CU4R7EEr+y4F?WM< zKOr3(mTftzZai}ixB-#i$-FSeYuD)qG9B07BPfh;yf47PwHWU8kzl-0?RVH6>&4mu zwd}CHDahsab!aKzAwUt*YL2?wJI_ruP?ZH22E#|mZ}_%RP);Qgn1Qw|Xyra;YzUT= z1xSH%F6&=1LN?h-ARN#Ed58hV9$U%%6LN#kL1;)@koV9xHG0X$&P}eyJ8zIs_HzSX z0STx;F6e$uS;b)#*PU?(T>=tKZQ zvyQZ8dnz<5x{#dt_>99RU!3T*1YdrCq8IP-BR{ZW z&boa<>jk81?f(kYvw6T)jT2x@>;bRz*imw3Tmcsa<>b%&Hlk)w?!mF;6+BYmMpI?C zfC<&&UiY--VZg{|(LDgrH*Bw8{*q1ez-7MG7TUN6*fosmZ7*dH9D%_e^~pwL%M*;MFF zubPq>0Q=;rUTb{0e5y1#+5Ws@fA&n3>^L}z*?UZbQn$)nFimofwLiC3qmH_10{s^} z*YH&n#hvu{sd!M}IN>3$U2&VrkC(i+ZS)7z7j?baUuABcj zn8#baYJQzAFt>h4UWZZOr_cUK7+>GgCUWai(DPXIrN2Y_FX;ewJ5c zdsS*KnC;~kH>;fX!Slbq`PGbhodcA%Gu1ZJ6SD-RAIuVz{y0loW-TS{E7wjQ{ooU8 z9^F|N32%j)q)OG6<}Bjx3cJHSJJd{ z(zrc~et+?$hrShT&zl|Mr8)4@8h8mXj03}oVdCY}*-~ZBTtL^n(%kX=*jGON{DY6B zJn${;knC=sBdDG>N8ovGj==N59O)Vgli>TzbIr?uwWVU*PFW@@oofT!|~VcRvP|{2uejV_qkFqZL|nhWB-I3obJEJO(6cMe6 za9pbSqM6)l&U@5r)h`?3fmMN>?lJH)a8J^O8PfwI*Hdo$69}K{-)Ambgi)w76Bl9F zo-nU0^7@rSqQlUKeV_4x(;X?UHPifYuV;?`SHU&LZ5CVcEHgi(JN81Y! zA~L11q*+448;*;V#2aqM$w^nqg&}s6`G^S_w?@EAZ$c*$dxHe&4K*gf75Ku#q9LrT zn9e2kP5$7=LP~9j&0xl)`-M!LK!79!FdSz)>Vd0Du{K&%#D_(O*B|r_#M3?mWLzHN zN7gQoqVfMmF;8|GYf_87UY9&1I{+9>Lh2#`qp)l17IM`g++y3HE=#x$JSEIay0bk+ zgX3LyAmGys*}((G2hEQ$O_q42;`+l-5-2->85*(FNZig0yDb>DXoeF+G`yfWaqe-L z1r$rU0#fijm{BrLLdh1RDNY~@Fl<&^*e*OqN#Nu>(se?QVE`o)t4Ow36}as5FBa}<0Gjt#%9QOZ`S%`?n5HB)J zX%=Swz0_-;3!MuL2;t&0mwH{ph^}-VVMhU*las;26$^U^`F}SB>f%)A&^B%j`ZA!# zl!V}_ah+T-*WECh?ja8>#PPun6FFDMbKQYp6ggoyov=E~NQ490b&PuX8eNr6{L`W#+b8~c@=GBUSZ*%Y$iZ2$VSA;gUh@` zZ`c`#<^qKP|G+RW@_}H4`%9t~sSrppWU{lw>|EycW>5x;&X018o8Ltc1fnW-v^KRp%4WM2U8;9iJW91U zPwI!T-miYP3YQd88?QP67D>%+a@KP114~zn<=cK;0=fT5lM^I08*OZIl%($8BqlCu z$ZC>V*CP>uN{d~b@tGep-#_c^3-Btr_XA?FBOh_CPp6bPNC^*QnEJ823eE22d00LQ23$w}>a=Dh`tHZSp zL5QzE$E;Z8br_0!9-u+EvdC==suXzz=nyfd1!OS(Mz6uYeO=5|RK1NMMR58r1jD#UGWN58r z{h;jZ68__IA~{Z2K9*rGs2^c60Vo6s*?pLvFmS8YP>hw!gD%lE#4Q1M8YUueS@4NQ z+3JxEY%}b#EOvsYr}KyE1{+BO*8sRPqLWJ!R-%F}WJ*eSdj$j(dW#sZfF!~QjY@df zb8!GoL>8rR8^_Gog18flUmT0f(AvhpT722@2s>mWnHg`I1rnta&;bhX;!W^|qVZfB zI+SA=A2BsVwL~{*atN`4c3KIYRXQPDF3|z-=bDpV_hMysEK$jR#Zb!J^}5%+tynTp zK-gtIgEBDAGS9G(u>N(dA&L6SY4;PNK!|0d)_8x1gC?dqZd4QO977%`5Hf>sxN#)T zZ$h<6oWPIgd1l5Muk(n2kV&e{jYTXHD#;M@GE`|?D&LJrn`)K>q67o&(&n+<@&-b; zlH#uaq$jfkr7^>vG`-*O+MY1REei@oq*bg&a=oudq&Ga#c2;5LVqzd^0(MMXEmg2R z36_3L7BBIN<2uY6*dlO`D@W7+;qX=yD*KB`YXAp-nGLp@6d|8sKkRpWvAOtNrUF0N zR%_F(vQt^D;uTp6BXB9esSv5exdIW>Z!Mf)V`>JkMa;HLS6&Pvlh0r3xdW3wJzYyJ z>nXdHS*!)x0M+(71p5eM++QYV--qd(Lr`}T1X-pYIa=_Dv6gtSoOFUem$6bgu~axc zzzot&fG@Ce*t52Bc$UwH-jOi71Rohg>R@z5NLaV`UpHkbsho6Lkx0ReUaD0`5?NCR&LVBH8{?L<+4U`+v9Zc30{GV(+jXR9jc3my-WWoASL%JMe} z)|LuWNKdx(9Y8f$XF+E)fg%X-5;H{dH^mJHe9z>bY|g9mc+Uf5Lp4Mi^IBFaA&(eU ziAWQ)(l}0!wp0p(H=STnFFSb2&rk zpz~^UZ2n1ZDb(0`^MsYV^)!cDrj1>qwQi!$LGtsry*=OlzF`9fg-Kws&M zR1s37lmY^s9)24oOa6ib@+ELHtCB48L{0x)E(d4n2e{AA5Dm6rhN&UR03cK=@wGr0 zc@5?ixDC2XIuM4M!ym5n=b+;l89NZdZ)BXZBG)leg1%t>19}uolR+Nq2fAcbdH*)p z0#qUh_!Nc>j|EQz4vktBDz8CJ;42(9A%QTi9>ku_SL`-F;z~RcX&SS`hT9y&zLO&h zXUX6#1uUcyp2){|V<44uB6UjvA0xBR{NCk)4!ASR#;xxd{|4jxsy~KR@t~b5x zevUnc6^4!D%L|8vRB^w#?>+2w39OY-FV|w?-|iNS^PDK%F}3-DWfpb=v#}l<0n)I9 z2q6&=Apu-&5+j4^ZxjD128nn`kEo3R7a=YC5!@6j1x{pOP*!Afx&U!Wc!h&ybslZQ zVG=ZAd1x8{hEe>ceAt7Jh~AJYctI1jR+CgU`jsp4moHQpvLy|V~S*GL2-br!ad%9mEbBr z>vQnoHFMpEh!A|;H2KK8vUsHwAI375`fF;&f8;?~TWMB(>>ZH*2CJau{)_qcWA6<2 zbL{JP+)n17o3Qrvg}HB&cc}YAo_S-F_jiPp9=O@-)Mgu0CT=Z5Q015^2K3ik4>v|Y$7?9x9_=GFfXK(Q;5FYr(7DO<9ZT4>Qh7BcjHhxHo?v&#J zT-q=RMuow7ljHAV9*%>XjHTZZ%Vb3HR}z231kg6Rsx!?+|K#?6pm1Uu+y)Xd(Bc*+4=y-v=X=Ax}$ z_u>XYW=!w_G)>=%nBuR^TU)&okfY6~-a!a-9P%mRUf(qLf9jorhPHm{%|@8z?Vo}4 z*O>XAc^4t>HRp40wt5rInyXy2@UrX0I%M|I7xWVc4EE526=K_e;bDE!%FC*Bu}(7`WB5p9xZ%1)kuIioa_axGWpBdx`Ht0zO{wG5M; zX~eC?mn95cEIjgg*&0OmL&}3BMz6>`@PmfZ0y#_1&fz!8X4zy%Q7)V8SSZ|JXH8tt zA{G|{h=9z1?Nb>hixn0Ue3dOXcc$!?Ix_!kj@)QV9r&+UdH^lEYO?!$u`rnHA?O~B9j51M?WD0pif>#xxzIxfCx(94>@aZ) z9XpCx=-b2Px6D?$YB7bytds3Wzv<8bHVt2S`B7Q7xns%>uagJ@^qbcV0$AKZ z*msB5y@$A^kcyiZG3H_SK*tzdTZF?3Dt_5W?&8;*KX!S8oKI^8?e@kx%)iHLA%|Mwlr4G*9sg7F-5#%dlTT^#Qw}5tVsil9 zzy~&XJxjNF1=m<~3n7p1kd$JNM;OVIaPHZr@~F_9)d~&}7_< z3Ez5EvF6DS_ue-PON%Cc>@bHkG3=*I6TkoF zod;3c@RN6?1^Ybn{JzZR-TUP8i9csPxA-OVdGIgtxrw7LFzQ#&w^dx=Z+m;*Y)Gf( z$qlb9>`QZ0! z%jATwHth1!XvlyTG|8Vd7#El~u!SJ(aX(L`2PA;ybx);1ov1RO0Y-oGn^GNtw1k#C z_sh?eD0^stisoiwRGp2wcShy=xjE`h)3ivHH?tm9ECZ5LlfrPYUb0B_Dz5e_RlJn0 z&e{T8C3p)mJ9EtRB6R@h^yMPeoSGh(j#b;n2xknGwf}iHcC|#D;zqq_xb6#iPLCv- zB_N*l1A{t{8l$zsIKEzI-6h`eXCc?z;B&?v=u@nH;mTo$0iv1a|e)c_7TR-3gYsxW_&m*mQY z#>&pt5>?*bcBmRxZKlJ!;=FtnyZq6)b*9``*QA2AGZn6#fnE^fg}5Kt{pk4*c~E}X z2tf?OBV^17mcnOIX(zyH;fgs32a*FXQTRdRr2#MW##p7EZWu8Jsv#QlFc>MDo(DBk z($|aG6kfWE;3y{3Cn8@F@Qj+91eH-oKyp;dLc8HD+7e{L{J2$JwBN;21f+$n=e8}5 zAE7E>6bsgx>XC!a9Q#$miEx{+4XT=e*l8@o2j6l?eWW`9rWW70`wl<_-}%N4G-b^U zUSUhfg*zF89OyC&Lm`p`e`X4CS%6<`D$W;r7!hLw^s^3Lors^JSX0T4%i^U@l0Usi z7Ggh*T@((|O0q(3I5l%(*kHsMn@lVYJyqk~X22opw98>!lfbpfW=2!h=5$gIXD9-P zg~pt)mzKgY2Qn$7$&FM~mZvu`5=LrU+pXpZ!xdzi-wbweo$1z0Sk0-;)S%7`)ZwzL zjr!oK5#96=P`8U)84I}m4@fOE9dp66EK9?EhyhE(1e|Zq&Q(2}S>~=>)fQ}Qey-{$ z3IxHak6_^mOHk%Rlt#n9AWtw?r%F`3oPYqXB}4*n_q$g-ntiYMYS0WZfy|-4f^|7o z!&ic)(nd6r!$b~ca51?wnS=R?ThSMqnR&{d*p#J|O6@2h7gBErRBUi#9`3&t-8i{C zpO5Z9P&@0joUYi7IM{NBDJqnV@v#LgbOFe=hDOX0d-M7SJ=ninKNSckv&S`n66Dy| z3U^cqS>_!jV3{}MtL}$d4r4QC&_Yngl#tcda_LZ(m!&==0$EHnpX94>=j(R(TR=_7 z0pg(3I4H9mn;&?XQa0Pn6SkQjvQ1=R2Fo_{L$*oV2`sz_RAP(Ap<dH{lx@Rl>~)ga&_sfItr5Wvbw$9!cpg<2XKisP%1<8D6LoeQYZWL?BuEw{@Z2 z{p-RmC8^82RH#~uJd+y(ZChb0yt`fyo-v{#Np7>{uvIrPE1IdpTJmCg@&fA=(p;h? zjho_9)vZ4vqDldF<@R+UgNP^?Z<_Hc!Y+djF&+wr5KeWqU|n6RT5~~~e1@vN%_j5R zRzJT~C0oo1+P162(l({lucgXHCS;nvTv`S{m7~0}88sRPOJ&0WSBIU<3tnX(e^6x> zAd<<#A?k`O=!yBk)sC1`Id9>TKfe3myMbG;sr+>E(%+x`V)uI7L*W(p@)=a+`Ac(> zk>d*5+x*Xe+)y)m-z(F$Mk;4LxMk7G6=VPSo+sv;b6Tpu77&3@@cVhOnDK9mb}`G{ zsBgY+3B|9@Y~h{KN*#=STWedXo|pXL5L}&HEC#yc z@1dTvU`1^t*@U-sM;W4WJp>D$wM2&d4Sbr1q1W_AL0H3ff-Cb4>P)x|Qfk9z2rGP9 zUxwOVqKZS3>1t+`cbYT`)-P+p0SN z=)AU&UUlZnw(4uVz1>drbLN};_Nqh2YG`S3@*4V3sEyi5ZFNT+9Y=~ar?ywuqre;O zRh4WPfCxlxx?iT6K{3_g9FR~Fl~9$0Wa#TwV{CA1D7w+zvd_v*Z2Q*~ejF$buMn+h$k0LIn? z4KPy|Vh_`*5~3NZh+{xJ&UzojQ(>b*&B1Zip-HuefCjn`gcGFEJZhjCY%VBQ$AtLZ zQI4UnGyM~)L$e>CjPRgO_6zPaIL_+Kl?l}eM_Nx#z)V_ThICLJ%;tn@(R6QC-rhE= z?f{COW4d*~_|LIf7gebE(dbpu5&nRBYwJLn%KwRDR5(0Yy8*ABeQgCc_)g|)N4< zyc)lYYMI)>LU43~*dZt@642Kx-0mPM`G9DUj4i=X%Zy@9AqkI5njF5vv+JX~kSKb; zdQa9BCWt_>{DT^ zxG;F63+-3WbnY&?+~Dqk-PJUfA4n3k{W;7xkK3`?V`y5?LYu*0u#yH)hORSwTL4cU ztYG37+B8)^d{3{8!$h;tjsa7W?uV6d$3{?Jw}Mz{_^jc^jxa>W)<|_hdW(@n2he35u%!5VTe3?;}o2hbODI;I+WM zVhLgKr+D@4Yj?bE&%AEL09Z8Q-gb@y2H?zqnKsFA)N$N4ue=ZqNGh$D4aQs&1g9=Q^q> zm~*Edp#I_h;h7Z&s6&vt_W;n>A8ec3?!lhG_+d8S$0y8|W8r>kvZExs#n=Q3xn%BW z`&kiYE(uIC&?MB7ASdL3O}3|R+v21=JBppzTz8P(w}P`6M$0~x;uwAV#Qg~0n$?|f z_c5+U5gvCo+a%W;rZ~^@qv_`V0pu zupx(G%<@2*79pbO0&_t}Y4X_WNtgCXWyq4drfD^#kx9eD=5muD1AO|UN> z-dX)Kpi=y}Jypk)tkZ&DK&@WzU2Pa5iY4;2_At ze3+r+g5RPxT-xrDl?6Iy)>Nex`mk4+l6isR(t0p>90#7c07G*xDnWg$-tr-upwzw5 z1QZ>Cemj!DtnABbF5f~)l&Ozuib=gv4K9R7N2qvMAlLh7A%&DEKPU@uj%{Uub#R1P z$H4vxnJ*%G%M-w~Mr)$DfVrjX%X8zd|IJ3y>$1sGX~n!0!kibYPR zlB;3gf%zsE1Dyc}g2@ls2T*_?whNpSg2-5oN6B3}F{ot_O0qYHaxK@VRVeW*iHUkNFHwAFpEDpw1Mlb{u@;04; zCZuGuNzf+TWW+qvTa{Q!H^Q+P&JSy7z3EW%RJgvA#P+tDAY3w7}7jZX1W~&{in_hJxI02 z{TwiP9SIc$jk*44bHhQZtjTEl^sr$G+a9pg${QpeK1g**$(kU>(60P>{ye(;kOzt) zY%!U200Pqlpn)7Ow^}2}o`^$DAy`mS1z*7#;Wn5%wDLeM!SR|5h=u`yQnutJ>^ukv zoe2!dbdZvbZ2}_?hysS{fJm(fq!5AmL7q%~s4mP$JCpjwI>J{CMk>e@+YqLC6{Nu6Hwuw3&74Z{FZDF1^6SbJZjU8z6RBkFQ!1L z$dqBeUN!*f2Eb@B>H;RlMyLJf(c0c)pLLMa0mbf!Pz&dP>22yfvWVpZi~ zUFkgt%TWa?W)H zkhYMdST+uKF`eaht_AevrEJ3%%%FOi8UgLwc>=m(OZ6C14z1+2Z3(Go=84SXY*6f6 zU?XX=5w2t_+#cykdXkCHE}#J{B5<9VZ=`^L3DMH#qq(TR>gxXPneqKqd4cs-IWcn8 zW&Kt6c6Jl7uq9Z@^MbuQ+^>UidBXhOU$qK^DFdT8Si(TU?GNd3sK)$&(=mUEFJ*?!fZP_dWX~D3I1)R~QY|%^OME0hV=Ka#UP7t zS72hD*>tGt-5JXk5C_nCX&;EvgIUtx4n2k%0Z|wj|9u9i!3RP@H9;BxMHAMkFtAF5 zLZB|A+wwX*(ZXW;@d4^$953J>rkdlY(_yN;pwEMHFLoBTTteYW+t*P17(Wb|gxQmi zOrrncZ1F@vtcexq1&qsp$!CK#7SmsxDUTx|euPvA#+;)et#F}>%UMj90B`U$sYPN< z(SLl0F_bBnpLr~?4RM92Std&}3n==L$=M{xiIp3Qi2w-HZdE+nmkFt2PAv2<%#hs| ze3_6@6S+1g0Ww?;^8*#9B0v#`eRkBsc5p;dy8Y@Ee(qFX&x4VL6A;{ zp=#;lf5FYQ&UBB9!$<0iLF)f&4f&ZG3b05BoZ%{!eE$9^8YJRM=&>;+pq)&U1r}&f zWaCU>jflldgC`YotudXFD#<)IOHZQ4H37v$J|#OwuMk2mC>}P^h`HwyfIg5!s%XbdROx z?{9{I5s$*nA-*U?m^Y;=0Av+fj4hq{w;3tO? zMF*XskPsj+(zQHS$2(S?n4o4;oGD94(?v^I$2xP>vFh5+Hp~G*4p`TsYy;tl-JQrs zr=iCQT(}@R|2Q>7)@O=v(v{;cHy0nL1_cQ)oRF~OICV%76-Vwd?*)pfzx*z>7uD z9|-UeGpHY%{bJM*WvsUzuew1bV(%K@68Y=+?^ve;!U-X@SQ4IT|3!+$Q5`AnoZzJ? z>xa%m=R`Ox@KV@E@K7pih&&9V-P=G6U@Ht%ZFEHDLmX2Eb1sEl3Djf>P(IY2mxA`u zR|X&mv#Q5SA^4@d)Rt2^O8_dBvh>^vFOOX)Afz(Zb5P{4_ zOfJY%k33oW0s7OPqA(8~37ahdvl1y;9b?}7tWSB6f5N~-vN4Jx4Qig9*rVb=PbwSM zdZgrM*lj+DPI!{+5X!0opd_f%d0FlKS5E_0T?;KGOC_M4BB7>OJD@FwJrW@XasqRG zR8zaRy1E0~fHl!H%~fdA1^Ky=4!~uN0iY5YjB=SwL0{{$Ma z1{vummi&tO*{b|Vdv!-~mRksAbQ{+u1qlzzL(2-`kl2_Uc{AUfq(-Nf*pqOO0jey_ zjc{!E$Y^B=#O7R=fd#ifzN}nQ3@9em1hz?rWQ7G-`oTBo%@o_2>A_6|a`gkiAuXk4 zE2$8~Ll%ZPlBLv0E#!KLBhAzkNIY>jp@`^ambYci>`pqH?Va87 z19}qsjg6&|BE3(;`RCx+R0-KeeKxQ!Tc?&pJ2|ik1|77mqF5HH{;QLM1;o-xehiH5 zs4dDt1FV?}f-%DI2_hX^oBbXPVURl|JC%V0nfHJJWpKXOe|I`Pv;VJ72YZ$NtJ6}W z#D9Yp?bR28N$lePKReBG+{q-JW-LCP(->cDc>*=b*NnR`2jql|+{h@EGVGj44K_j% zC+Jtk>nWY2H`9_Xj<;#lZ7Cd%o2?6lC9^Pj$YE&)!WT21>AXiHtgbrHI)G1`jlNw` z%*cE)@SRGGTL>sr*(m5PQ$*C<^gOa)AOlN8kr#v@kM@JSndGUe6E1d+yYOK}LW#`? z{fPgtx#d(f8-W0^)6|xtM}k8GFkA?GD>z+kOCgE=S;S=JG03UH9hDc?Ft4KiJlX}Q zB|!&qz|PnVYhF+5$TCEID5cD&!_aGPe0tRZXK120x z2fl7ke@AqBqvq|J@l#vo%#j)Dy*AlA%hAA{Z-BC_?hfB zYRH#x4T;Y5rO^ePs9=9+x6b68r5N9T)>-PZ4r^ef(PM<#$vyqoApVih@$ms70u)zg zK0Qm#!QQYt&sLR)3|W1)x~cp*Rd88)H;;?>eg+3?s)d@J`{e=tFI$X7I&oH&q*=YWKk-8Q) zE+E&Drpv`DQMi%DDCP!ee`C#GFIKPQ=5FG)YUOXLiC3wnxhQn-wd($6pOH}7U*}6h z*YIbv*?6tGm|CWs5T0DW5ts8)`v*#8#bCdb?U);l^KgPSPT8pTPgxJcr*WRunAn*V zG)CW4Z4S`6a-`~5j2@9c4#zP`?9=xn)ykkxp1;Y|-mDJk#4LY)FBNvVH1AJ(i*sYKM-Yng-*jWh7c`R zp1JC<9xh%vH;F0c=Fw{K@mmp3B|FiPpfUVxW7YWCcC`2| z3>}pgct%0={uk!(yVMV$ygp-8XZ)NyMs+>xGwvqx*Z^3Q=Rc~@Iq)d|(>%_tu!-Pm zNHmU7Csponv9qOijOtYYaKnr>KaWxMUj7!F!VY~tPA#&$&)us!V1Lh+d(|BZH0PM<<5k=IPtq0F zjK5EP>gFNAMc@4|YObHCy1UM&X8t5~y!)$T_DsTLdeIy-Ssej0_o~V2rk3BqE~;=3 zrsKTA?Vo@!L1)niZwj!r+H{)&(BGu70#y{#XiKkeskBwY1i7!Ifr*KHL(m=2?s9$U}Z1X&gU zr-ryg{ZaxBP6Y)(38*+IxD0(r%o&$47dX&{L|)NLyY1D%u3u@H9%^BoX* z(kyt;Mq>~(=mO}Q^)IvM_Sz66$ua~cP0$KBO(4)vyP%B|Dy#q^5r_mbhz9T=KqR01 z*+d;Q82m*k`}#PCx`kiOPrxevGC+p<3q;=e)79DSr4+D=O1CvFbV*goosdqv1zau};6*zr$TP+yNSUbrEdhXU9{QUOW-VQDE-$$N z9|LM&VS|2<9iWJ6#|SDZokKXF>)6kz*5Ad;2pL6<%K%sk?_@jj&Iayysup%T3iEtj ze5A-k8Wck&3fQrzh@YSNn&bcO`oEFDJSL(hm3#^uG)EwnKV*_vzlr6`8(PEC55_3$ z3$9v0n3!eZZMggTnDfA`^86KwbRv1_4(SnTpUe^Iht_}(Dh&8#yjaln}730V;!NjY@33g7k`YRaq(rR@D7)NZjnvnkzY$41u?jU?_wmK4D_sv#qJ8?p) z9+96k`1~u1?kT@k0WX64q;n0KykBb$pQGaaAeC1tUb%w>Omvwv%e!VI6%$&<2jjj9 z_9(|4f2VMUejeoQb~9tXIsj@8(9keXmCF6aD!B}U zO5#LZYq0YOFe1j)O-^FYiuo#D^s0&#KN2ghjE#B3uQuHuRtK0Hk?wrODl24z0%T8L zw-7b?oPQ5lEw*v(fodDnK98Q$-~Y7suBFlgL3Q$7=n%etM{Y2n_Ml{KS<& zXo0~HV`>NKT#N^qh3QcQzDj=D){HGeWD@-vIbr(hAU&1-fU~^V0E7Uj2J1w&fJWe= zq)!!T1hNS$YGKoBk8simt=9?!~soC%(ME)4F>q*rIKk>!t&^*IYUO)=I zWU;z8`jo2>Mr2ON&uL?hTC8&N3i2Y z`EkmKG`2yRcj};`y=RU(Alktk`j%=H`+%HEZne6ivF#&AE?}Sd)o-bj^Hx%2;@Q6@ z{)#%${mwO?`0fR!%X-zx{Xm&h*Q>|*>m+p#(_@3W08NbBppI84=b4wgMf)57ZB>B? z#zWs$W$s30&U{;Sa5pJ)xmv>bAj_--CSQv->#rS4O7#~UUCV!M) zugr*d)D2M!mAUF2Y`=BhRTp(hgDDpnbMr+h|FrTqsshY;U_!Y38rN*zp!%2>-xZj) zy^D~o7fj)MkPG|FrSGYO&ss}|2$~NX%p6Jqj6M@}b5kzQLT&KEvrwUxK^WaiEFl~Y zX9t1J;x6`hK7U%p1Emy4{QR*@Ey1WQd0HKWpURN*G?}FoWIJ=znjM+^nP@Y?7Ci^rKBuSxGS1a0jY@qNNrwOp-!#1!+r`nLnnoQr%lT4%xG;6dqJHLzbh*@8yJ(7mG5_( zhhKmavfIR8L>TzJ_G>ZW%_qDi(oIB!b4VEv-rxW*7Tg^^{9?Nx0}|l-x2#?ve4Zfw z&ZOY^cH2sJiF+jJ$Z*u8$XJ^#yQAZn6f`nkp0hzS#n9zIZM|MnLz*{;Y34v=2px!^ z-fixGNwqo`pP-cmgAovIgOcs&xZEz2{TtCm9mpi6f!3fy%R^xT8_7srr6b}I7}^o~ z^Jv@dF{&1nzQG(^t6qhN>E~L^@xA7(m$5Htx4G?Qbxn_Ng~MU8k$TH5^~NxPV%$4r z`D`d3zE-B{71bWqjeSKOdf;B75Qm=PKW~UQ_h6X1P+a`o7T9E`nGyG6Eyr7rEdAnC;J=mweQ^{e2b__YOkygjNr5x06 zR6%fP9a)IYgtP<63Sh81{x9j|`=O-9Iz@U!4i;pF)d>GVk;AwLDX8^Vvw5W|@6(V) zL?k%mn&dbh^{@2d^CUymOWK5*zRPr9r7rI>flKDZl$=-pc%F-6K6#2Tga4#Jz{kEa zFRW4>i-0M76t@x1XWG3Al69gv<5g^EdcfTHs+#0XGX86DpEj6Yuc?l$cF`>UPMiUF zfS1SOyTMc;Q=5>qEIYt?)pGtlnti~`eN9yte#geR%Lag$Q(jj+5892fKnl6`63 zs%L5A=1~~_1vbzr*7yt7>z!m?FcHXYcbk`2tG+o?1U}zv0An`o)~IM|ibO1=dqI0B zi)1DT7n3$7A5s={a#rgINm*z~K1kbU$t+pU3=K97JtyheO;EdS8p^hfSZzn>QAkj# z7F41dyOmS~-u?ud`T8q~RtS@A*;fDT>o@ymI^ZpZ%?T52cY7^m+Ns~GRlbN&$7(_dxLsSdG0`P-0G?&STvZKK& zf@!|naR=IeID9C!R+XPlMFKhy%52Y?#uzT7+cCQ@o4Yfe^dEj~#L%o((O~XdtIB#d zICjIY%iQ3h_$eqOAZduR+GsEv*Q!1(g4#GI3vkOG1|(mLIf6a!{ zHW%~5Z{{M}|QdQ-*P0TcA90b2OJ!8>I0 zBt65BTmWL$o6r`fnYuT@Zyq$?zp1Xtov!gYf}_>`S*QMLZfL5@VM?2(`YxQY*S?uP z)|qMk-b~}NS<|LecQ!}-rpCZdcUWQImfDj zNfpn7vjbsG4Y*%enftcDi8kAme4_phBj&D8z%u8U@_N;#WP?gHIi?6!a&i=OL}iYt z$KKDmHC6cL;O6PkTfuARo1I%#c^hQSKc)x=V#K(m+8aq9ARlptdg4>;xqjIE^-~y0 zb;kKjRpV#QXV@!QXDUAj-rh3*_*_+Vn6C@`M|2!S!M*f!n9}R;F5fw4lGvP5v+Q&A z564+(+I^|c$lD|fML5OZ-1wzBt;J*LWQBVM|D5D6!V8MwjEK*^RFm7hC0+t(qS#eh zK&@1wAWKK!dgF=PU`W)N=eNNQtTP{MQ#+b7H{ET8a2*d%u7EyIXUY59)s|+DOCzN; z4j{DR1lhd)m0E*+pZD(ob{;o1JK&xGEJZMW7ftyZeP3w~`C4^1$M40^erfLCs}j!A znq_-2kj|qu>%LXXTo=P|+YhR$(;QtOH!S=8F|=?LKdG@D9vX@ReE~W#-P<^%&NTZ` z9nCUl{Rj(si5Ys7ZfBPNs17wheXY)Gu~-)bl93;UqFIO&9%R%w?HIE z|EfN87Mr%esaV-PIb?KT&Eja_xmn5kbQ z*UM%VFl)|ku18~Cw7$8189#Gc=)V!xA#HRk6K|=H1Zsx0)E7H1nUyW|0MOa*E%kW( zjBBNPyDw=IAEIOC!bwq`BVk%W(X!7ydkIl>dM=T0s2^@OZ@s4u$AA{Tuevu|r4h^p z$5PTewg~J2-(NK+z7PFzrn&Kb5Y;9#?|n7Cbsd7U21EuHLi$INIPC!j5BE3wE6oWX zsKuD%AtHu@&}4+Jplg7J#c32FlJ!GGO+@gXL~YE$r$I?gQq7+|igdFx|U-~il@ zH^CRO#vHI&%><3C+6<%e4YOynDl^Ga-3I*kyi%~vH_U%Z^%!&Mo%$>@u^dcvof*1b z9d6ESt4F%)v~^qTYpdZFt~s@xZtmd9@5|cjJMputy{^S&>`%n>O=zcET+cThTkH2) zeyr&y>+24)pmG5b!|{Ug+vvjr`l)q3F~w!NJS3-@L1ntF1DGx@*S*d9xV{EQC>)*8 zeFnTCSfn8<7r{A{!(je$wuHQZi&0d(Av$~MaQ{oXdt-FRT+vk<_e*V}-E{BPn$d$j@<+1^iH`i?Lrk{75MP^zL-RWUjvsn=t6#psziiLw-W_DNoib7ES4?4{rW=KGJZ|EZP-A5#AU7 z6EnD{ZtLTdq)KgtNWHG7z5}-({?b!dm?a5)M)Y%Gw&wAK?qUw^pnFx>1oW|>17s8{ z#Gg_gD?!c7j{!qFsI!2sS5klG=Lo5f;@JN>unes_;rA>kMFxKr3R73dALYO56nw44 zFnC~V%Z_Gm2YqIrU7>O5?@mAMNk28DpT0>y?KL-c)ID=0yW_{ql8*X_WK3A5KivOM z2q1p30?Bk_!b`{D!k%00msW{SOf$U>(7m0Q8Fql~vf;5$T63H$#o5{SfE+WKlx4#oZFh*OXivK2EM z0mLU9Y}Z-00H?a3scz-rqv_IFp9Y8cO`UZc^*vBvPB}E%+&tM?m&AUs7(ubu=oOF( zeoUwRq|KJjx@-A9LNv;OxRLm}kHFJGD8oi@waArOkBTZPVPM1cTo{ExSwn?rql5KvV2z1G^xyGw_aXXt zFuS)8fkazv&hD$bgGG++tFOk}PknViXsx~b>GSb+Z$F(v@#6k^FV?`EL-i3zJnB$z zz?Y3VRCfR%&mXEUL-7s+zz1J53kN`}8fDfF(EW*TeV9Jh{au?Ohv|#i)g_1NLyt~( z)raT?348TFd6ZecwO9ze(*ce(XVl$Q;);-ykZccll*ZM zBucKo%r)x|*F7kB57&K@V4$$>FnzJ4f}dRfPMnKt&F|6Cg07*SBS~Zg_(YZw>OD!{ zI4wZ3mmaPCE5`6h-JO^ock=;eynj!$;J+Fen{Hs-pL`vk{(A49e7!IIb%NP?v@Uf) zk3Sx*4}zNCbr7&T$(%e$U*&$UP3<7v`X4#uonA6}N?EbSgxQ@|<$8rp73;)3-KlB)VNDB1t`g?U@F&!nC{{O)b z)Lq`%`J^r^;@1^UVIhBGh4iL?F)%R0@6TGL2oqxIB6$U26ZV(Gj0?J;b0#Cm=vF18 zgUbRiqmhd&WPT+9Ku~X#O-dgt*{En;VbSU4Z2I$6{W@%RHE^lUOoqx*2* z;MelW{^XNL1Ri4PI>>~}iH8WTI+}i*zT2G=<*LYG=Az^ENN38Fr0!|dVBO5UKWeIv z)Xh!L!TMnL$6y_0(h<6|J2fcr(-9~!RZ2`hQlD%(Hr0ps7W;M-RE+5Wq>C4+jGrcK zb03s_iZ&dq&OaxKeDuH4X5wJ|Jrs~JC+HI}ncq19L^s1kPt^aw-jJ(Kgauh=YEIOZ za;`2S_OQf@`S*g!IY}P^-Sdc(bVdJa*Z^J$lf0Krb6jbRZSHY9!0yEgs zHzO+1k6am`S7@f0agsi?Xp5B2#XK$aKQy16qz}jGfUzO^X#89{L{#ZnLvRw%W?gWE ziMP)wH6IPpEt|n^!l{n4=eyE!aB_~fvBJM-wtdcgkWAKtJ0ULBVINwfUjO)}+oG|>ah z=O^n4trtddY7t2=nLi-X8$UEQF<%}v<4@5o%OB-ukR%pyz{~prn_xGyz}`InF;jbr zZgH^Wpj#{}M*|rkazqmfMzNP1ksOz8MNV`AL&=s!saL zVadYJ8OMfN#Ny$Yup>vnDUmu=k8(bra+*HadEXpznm)GqdqOB)QVR+IGiKj=X2NN@ zGjc3HO&@?|!!4&_uD)kFpN{-5<}(n)OBVIzx&t0CpbO1yr|aQ}GTU{!ek1;JK08U} z$mLS7|B{r*yw{qIXTYv|)I9hXeI=~TyfgJVofqdzm>7yN4kM`cbM=M>H#}nqj_WTmlP^1UL z_cfqc^S_&?3~SHPC8+b`bM!#`l%EUgz&UH@ zY95+#-MP9a4$Xk$Bxne+WPp2U6Y$GBFVaohJWOspuqw{ONec=NfGz;P(rTHQ<9t1$ zVm@ZCq%s18z2Btd@3F{VVH8lN2%%Nw`HK^0-(O)aBgaNwN>THv!8 zd$DfY4(%~K(eoSS=aiE?gM8hoR2JYhL4*4$2r4z#ov)9g@mF)c9^pa*KHvgb1^X({Q0~#ccV*^ayy({yj{e-l0)bnzZ7Dfhq(}qEvPb(_Nc4%1D^x zQ}>H>H(cu^5p)h@Kg_*%5$qZ@zg`Thc(rMH3Fg`wbHpVW`i18FOVIE_^Ts7GPaiYe zFVV5C;3_cwtwbh&#aYP0w+j3>HrQ`kP*ahT8sJS0U@&f7jhG)1Uskz5|Y%0hfXP)|e|UgM?aWKDZ3Dxz@xl zhoD+$F27v2!?(LG7jPfBT*pcX2DqZciPBFReEZ>Y-J8t^L6l8w^P;LOG)MeH_eC|^ z%29TqG5>&Rwa~o&4-CRm^T2S>>r%66I1sbMxK;XGPB>ZdfE^IQM6IgQXP8Gu=rJ6t z1Fz7}xErG8YB!oN1y|}y=WTQHm3k`tTFbwP_VDj^94&fkB<`T}2GjAM`Y+I7Z}=y? z1{@gkVwG+UuD7vDpIPv9z(28L-yAwZUukCjQ%{1M>fo#NW@ox-dbK{vJU2&|mwy&a zxN0aa^Og1!d?-H*8J(_{<)Zsi^l5H-A|&%8K=vIIY>oLvLhhr zHV%Dz+FUkXcQyYUrw`2j&Op2;#=+v*V%`|1+i=$c<&gihFo_22&A@-x!^I444g=2} zuX%sR;p24~-N76Ygtm&0T^bl-+Kq;jZml_gv_76A^T=r32X%iu8X({_$kBQ%#^lz! z^rd+F@-E%p{aTxxG03yi95zN@Yij30_H8zM=IU-{*?17&SEk*)Ac^f}$G!Sy_}?zS z50V3p{E2V~?zs>4@R#O5bwL!gYmh4ST2P6U?bs>sDxJ z_|-6Dx0!FQhJ<_7G`$8!;7l{{8vT;9Y09-=9Wzb$Yauja=ILuOgxk&M*TTYGY05|H z#%@(^3#421+>yvO)7&!>+^)|2I8s;P)OmC1zoeC~|AmRa*)+LMp94SHi0i;6)Q4ef1@+4gT(-n-5D*Td1*5H$~8uU`bPXa7f!YPt^HsBm#&6uLbI zeuy8m`T9Q~qHX3MH-Oo!Gt+K>`TR}Pyo1*!HuqKO+^?BtH-eRZWrp9VZ)s+~UVlsx zPVbeE0Xz_;8oH=#pjIR>s4 zGEE#)7VHCoen{TOa8d9?VWCs+);mERcitnEQ#e)+LhYxH)d?VU<2Lu-!?BjsAcV}kZWg!^vH&5XL!Wg+4m2kiib_t z>6&Y2?@rehsN%Qj`YgPi`4FIf$Nc9ZtZ>wsO%G|VqScd;z?IT(47a3+`)$q1rsHkj_Sv99@+sh_R?*5*x(eL*??^JFAFBFD+9Lvl6h zUTZF#qt9)93$`>gUN(}IZV+;xd9bMQd)_=uskP>*c_4wU=GS?;BZWj_z8-?ttL9?_ ze=tAJ*OwCi%@D$q4A&`#KTQ1BOn6w|<6wT5EwD(=JqF7(IPin9w|0S&+vag$_X0uk z=mmo0-U}f!>ddT#;OKRx=uzFN3p)-S|QTHNDo==Z1qRl_N;(X4n3V(2Y%;vx)Pof)}E zpMmta-jpi4uZ9;yOKMqFmkvZjY2&paR?~m()i#M@OhRL9e z|AATXIMDEsse4=}%g}lW_NTu`PxZAj#de;A0lQb4c3{|VtvWs%)@^q zvhE@`n6GyN+6xYmLB21A2)k2O+Ao-}G5NC8v|FMdET3|yTb9yXUE~d#c4eD~{6Q=^ zX2W>hE>+>KcG6X^a}u$B-t|BO92$}N7hnW?v6Mcs49i(MsfLunJ^gNEL>${alAkV~S~wWXhj#}&aiMJP8eI+Y_J*>BDh8aTtj!+|PzIR)T&lqR3e=Ff@7aPA2|G{;qb=mxrU z9l=htLWn`47^n>AaiT!*ijP(C7MN+QxHRdH@QhgOys7$MwGb=+Rm*XxobHS4NN0CYlO-o!Q39*G7Xl8&uW%uv z33!_TEJ>I5#{xB({fA+xfk+RIgS;wS+(gd?^YB)JgLh#4ARJ`~8$-|s zCXUBvo&wCueJ(^a#j7W;%^2N-KaoUhWIT~w10M1~Oicx?*bspdkwkO8CA1}RJf`9~ zq_J3YlxP}jKD;W?@E0(}U+kDK^9AI0BDt8D_opZ`HvXY{bi&Dvm zj7F8rpsIk%urvD)=h#F`Ip`+G=3>%uNXUt`EK9yC$F-mZjHVq$aH8SymS~x~GSMcG zXxqeSpF(h?O>XZ1UelftEcdXXHmH$~6#NANA_tR?V+Yt96>DQ3m2FBPOA3c}%RV^L zSe57l&0U>t?iwZl2uK}Q=H0%a@ri#Vht ze1YHtXu!j&4iGEG+gcKl>ArCB2tPxu#gaM%20K0-i?p0yFL+ThSv zxY)P$GU0}lwH?5AQy!sM;nq3{#B#-4C=;ukL{pifISdNN?!jKpoE*!ta!9b`r1P-Z z4q*-FE}Gg1ES8yZ@ev< zE0k}AmZIYASPipa%9qC4@yCs|6>{JS0ZQ5zU_9FlFM^MiWtv=`!q|JU7TIIJ8u!If zF%x=$z7ggwi8aHXGPEpfB5Vs&pbN6{F&B(j+LOLuBqI=x95o#8h=EDq+8~e~o)~UI zR6}M0cWzJEHOK}<8Pp!i|77%72vS)N#Y*>KPIV4tFVscH9JoTaNab>blLdpp5abb* zP;g2SL?K#mhRf*kkyyk`=6Rk3F^`}Zu%`mA3@sMfi5}{vRP~n2`~s~9ln#OB4g_Dy z#eO&^kxMCq1{6p#*Id0uH&4}qu;&TEcelK-0!jqgC#fFnb0;Q8EZWxvml0Y9e1VF? zxKQ*8Q(>n^TFUAOV6H$3D3Z2A0pW&S0(%U*gwvt^Klcfh+9*q+J&*kcRSAyK9&v0( z9@%mNK7WU2`!>pp=N5XR(NGw>$(X33pl9F!>@I?T=x#A|d9ovjBwD;NANsyH$YtkVRJHIN>Uc7?4%dy({jJAg7n2wMe1$VmZk z`nuoo8<-loC%eB?22!jd*cQbg8>>;nQh|CMfocFlWE~DAz$4ptY0C%mwwR%UA_mh5 z7*jYI(>X*YA%zkt%dmk&I+Y?xPCtNAlZuxlV{z#6@g^SiqY|pLTz~?g_zUizfm0N6 zAKD^-!!}P$Q}L$6nwTX6am25t730yl921jVX_r96AGiT16IdjgLGiSuCv<6n^MC~`11 zqm0c$bV!I552i$^JkCjULet5I5D4%PYC8e-z~ud=tVtMNp#l@l+ihZ!{cES%w;pL{Bgp4zXG(QU)w76r4sBoH}T$E+z^`0Sq?O zaq<~t8C!H*)@2zj5qHIY9}XPS!9_7dO~p#IuZ|;XN+Kq*r_4jja1i|-qldQ>ONM+gzzuZ+)NpCLt$kiA(M{LyhuLnR(0TMTqfo!Htw-<+5r~`*>SXi`s+6&PFZb z7`$09p^+@L2oji*h^5sc##_YYBDjYWKy|^Bbs23)Y&Wttn7bHZtDru@!u6D4|5@r# zlwwi=!#mX7B?}6Bt2^Zh|J)HixAPPgOl0>|BfMHBLGFb{87eRw9O^^2GBUa;2SFfA zg?i8q2Z@*xyPRacB;})WnEk#P!iB?O5hGY?wn?z#W)g^JKnXjt#!MCy_91JYfEE+P zv#?kNhO*o}kX6`JhZ{>~EfS515?MNq7uI0Gv(sn?+YWKeOGYcIC#(Uta;B&}X(TcO z)-HZY%vRt{7N#XqRz2=sU;&k8lDX+*k%2@>*(zKGSyGsSu)z!zqNrtHl+`AyyTUEQ z&f-yNI!pbGXYe#*5LV3;kWR(9Ys89-(&xB=%VaS-(!!*hLOw9VxD^>~i%R(wBF)WV#ErNct#r4z$tWllaW_%t zr<^QAwA_aglg+MQ`CDpy_DHR1H3L~py+Orp5R0?G$u%4q)uizc(4K>LrkYd@DP3@N};jT3hO~;nv(K<7pyQi zk@=2vPgqxerl|`di4V-geIt@Au@>LAA}GURr1C+zQGh`P>luDF!kWN8H|jtctYK*- z7Y*1T3=LRrjzq7Rl5CUCR3e(Tr_+!eCRB`9~%K5pT8{2t+P8q6R6B zFkTlq2fdj(E3A!3*k&>z90_d61x_+YOdAmkDE7H9wL&V7#1ryBRdx_&Wq2jNFsd>E zj3Fi7np9;$beee04j>Y0CnG?LstgT_0AW;R2wLg$-|)KBVRzdF(4u}3+sdp!J0uoo zj!a(|kz~pfGfxp~7&KeLXg^_60VpY_`2#Qu{ z*Tp)V2t1gUS;JDH{|y=pQmUI`kh4D(ivwt5lP$PC^NsbA6Q(cdMjOih0$oamLB4p) zOtUo(Q^y=L538>WK??&4K^;vsm@8ZmU(+?pCaFlz>E8@Be7f2_7ql_z^)z<4eHAO< zsbMOwHSwHyyqcrv;yp{lY~+TdlT#ipmpH!lVhE1B}Wx3UE zAJPY-muIKfRJ-CaT{9&Ou{dPrqz|@l^akjw4_u7KNIufIGyN2rPC$q~Fe@6sD0 z-Y=^kH+lklDk2dSVwjf0_3$i2E2Ac`C5?m(%k^}p{Oe75RLU-Y@+&e4`;dcx`#3@0TY#1sQ@H+ROvq|uZ!ED z8g5lyp+i6K^}W+1l&qj+HjJt;Sgv%(Ja1r}MCMDzS_{5}Bc!dh_b7cG%Tyjv-7b^(qu4NBiy;B|BF#gV4KJ5aiUV+>sYC4F-) z6@KWZ_CT1==(0jw&u-TU1s$Dd^qGa;h2lFZWDT34ge9zq{=-|iJievpy#>4<>s4=Y zd@rs`-^PRKEj{jSZ~rp8>pe=UmdRa{RMio@!(kr}>s#LT9-{czcNn{E`q%Gx$A`ry zri&k*%&U%^6&8Q@9sDuZ>%;!Z@t?Q#-T(9s#_8!(`SrR!a0>??-`0&=ypA2LTTXyp z$PjV#la}QW;b&U_6*t9#_q_7DwK#G}u;ZM#Grla=TRe2}gRGL^F;yHqo95$QgFh(+ zsyKp&A4{fend6$W!F)OU?(i^tG9H;w7V93?BTLARO*RatDUyWEiKnkip)v{$m)2|! zlM}XX_)``n5_mws39b$y!95kPgWy(u_~%~xHU-jpGYIvz&%N>jTUvTB-_yN5_sU|o znsQRpeEGEeblbHmH!zT=F#u+4udX!hRk`KOvWJ;Y3(#`L!a@>O95)5Qgmg||3jU#2 zeCBm6PdC(k-vUY>{+ZVft>n}cK%3i6vZTI>|Gs8JwZ+(y6&eyT`@z%Lj_kZ78ieuW_?|Zi$a)mF4J&eQo zTwnYv&FehhMjYZe)2+T}Q6}{^U$&SXi4r5{X#pabZ!QgWf(82N54^#3wl=0XIi9Ia z;vG4n3Py53xv5nqn4A=rQqxTBTtHx|PJbvI#?~SBA&w=0E!Jw;0Wg42nj((iZ;o$@ z6q+I(f1-@O=0mTt$Bnj);3oN+8et4MBDMrK+vp%836NK&Pt@u05*Y#UjRd3gex5B%w^!3!O zUPt}@R6gdxrDQa!kuO%xukrf}8k{Oj!{{Gx2VA=jsjJRk>dK1xx7b`rR)$&`LnV9e82B zs;BK>DZ4@M*x{w>Bp9HCS>jKniK|sJg~Q}#2G4$+qg8&em7Y+$k@$fa%UYQIDA_8V zO*$}SWnceN_SgGlPkWYZFBtSwwQqci{Ghek@6=EFs#Av#?|-ZDgFU-G`&I3&Ghcsh z`}#*0t|Qi%u8(ropg2$E^~W&d)GnO!*!(-*{pXz%Wg&NJUs^YJ%eV7(Z9hrGd2=-1 zT;f1TtOxW%`FuIVQQdH4ydh6j_G_&Lj5|xwWP-o=EHw|xbV%V^2*z&J1E#7&^tX;W z5aD*qL%B72&r}uY>s)n!zVjx)p2@4Z9Xi-lT_Q4KS;YT13{O`rL_Hx*H5+xOl? zgp8rPJ#kPxWw+O!pcb9QwmH(dUF?KnC=!D<7j^3!b|V))s~dMSK!obw?fuDFrBB;q zjtt$o$E)O?2DUkuVd@bzei))(9)J1p-8~Qm(R=rJBh8@$WA8%O#QnSW2blVLec=z@ zWX?0M`T@Vj_4<<^ypdcJB?1_pQmMs8Rrf^e340;xj2JGIumob22dnav80GQB5WAW+ zB2f96KXU$Ry~t|G2`3H_{+A5SY&cJP2Y7d5Im!Qw%44#oU@l$neVsHJ@kmb zf^ldR5`V;JVd9<88}cX*{${cy3frS$7E%KFK|{-u%QGb(^JDtmFTINP8IowC709T= zSM+?D9`%*iz4ZPkzSuP9+c}?Ms({_qem{4`?Cnp!v+5On$yW%0Tl7<3d6jjoRD*B} ztrQqq5d^_?z)mu&hMd~znaYFDB4&3E(J*+(#}b`+iKVu0GE>c%8gobFoXQqQPVKBW zuYT?B$DWwEq^|bc%_ARv>8TmZH&1EaCTvIA#Jx^D2%YAigkK;D-|;p6r#I??o!(lx zEls>0Ib4P$FJmVGdA99@(r#=h|HdOm+>N^Dx86eBS66@Q9nmR+jqJYg(NewtF7KeD z7&SOc4U^>&yFB4LhSWsbU>P=^eaL&%E?M$}lmU#J5Qn^`%QA3b*~fhS!Y)oU{7XOC z!L9Dn)o`8Gd-j=rXRmjbvvSTjRjcbeOZhcfI}1%DdNmvV??7U<=rq&@)8SCUVRJvMaOW21YSIFrUA?dBtC!`}_J$kEB0; z?5mY4SN!E)?_DTgiz)d5eM3YY0(rd_QGHHo4ITLLupM$^(($5C&Q<#zYQTcT1$MT>7tkjx74*RiUJ&!ny80&Q!(xspmMO70ETK2# zs`iEEqqij~kB|>vk_5^4o*GVV-v?*M!`<$`Qgp#GYsonHi&8}N!wU+tx$Sj)4we#uUt@D`i znN1}zCCpk@_Mxo-)2vG}o0=`}O&wYE^u|xW-}LZ(vD(FV?Y;k*`ssV|<1}(dk13mF zhDR+#P2IGjN2bl6>P{$b8DwO5j{UZ2_RGh%KZq;o{_NKpOwIc9r1a-;eRoXtbsF_6 zF*V_YrwzkE&zG1ve>6v0*>PrgL zFHigT0fEM*>uQQ1baSSL6*e{wP2QME`^vx-G=&}-tB)&od%Ms2`l@30=!P+cYG#Ck z!RrInx5ML6qwlfuN%z7&KA}rW;1iGOBTG~*XXWOWs2==UQKCjTD;mBnQL7whga!?)9)V@xUz{OYc!DZV#?1N|RCDAzb{NWrjqT%fN0gTX)pBb1iY_2( ziC)}ARq5ZJhm5yHf7M0Z72Cqv8Ir{>^0*@*%*r%dkdL-+| zYyQoL4w|eM&s>=kyn6GZL7mltdFFNHpe|~;dDWZZY7}r6CDge*E=_P2`Bi;;LOsdj zq@?-9Eg+J3r+qwUA6xAs*3IPgvyaL4aglv!`*_?w-Zqc9-PI848rof5*!D?T?6Bdp zbnk7<36@BFiYL0OacEH{9(+$i1>5(LJTC2_UO@(*)Ki_vvt*kp0j*K*tW@1;QNqUa!C6)6X!rh`^wU*pkZ;1X*G$ppRjF~h zrkBcdcg`|76#P>!HBwm&>r`)5rvK4Pokseo-fAk3r+TZ?c_jO&i>Z8GAA(}Miq5P5 zlu#8Uyh8#Hr?2^y=xcr*WFKeR$F=sc)IK)a$Jc$;WWGDNpSqjJr~S-#Mg7fVAdkqa zM7_GKhpNyQ_gD9JUg^r@X4s!KFER_A;AuB@wX6H~flQ7Vp#Dic`wvtf@+jTkKr_rf zj|>sNEVqw0>|>XGlnzoi^Z5gV3>X^*nOeRWq)s7m(qNN#A&(~59v!THO=nkhhQx@)oi|-a1UAZ0>v@f(a+u5dwp~CSSIrnizL|o?+aT?k$eho#qh|9R`lOx5F4+ZC=l{ zS?32frW0#%aJ|X6#AaL;*l?-=-=0**d#w{Zn@zp++CR8Wx2hX;uL_AZb<|*kx91QGvL9v)< zfR&OQglNisPCqn4RYZP3cf8;*)eh_DgQuzX%{b~HeeW*}i(K;yHPo5jT7l@1raUQ5K4K~^=wv4{x|e!bAOLBomdX8FH~ z>9AJcQO0aqqMs>Ky?K0IhMU1!-L+ixlNb`_PAn(Y!N!mf>ng!#PA^vj+CLc$TgXeu z`f1vT>qL#}M36Frfr`;Ab!&BMv{_%y9IXbbHwgF>EY^#Thqv{eprQoaStX^W>W@aN zU&lT)XEwye=0W{X1tH3QdjMQ#{%NW$0j%~Ji*kMGAxzh``j$fsCd-df!=v5NuH?Ku zV4iXmDCOk6pmg|nP&!8!91Vk7Jzh23bLsdb$Y^=`7Genf5-#rd{(Yjxoo?L$@ zC|au@JXH0JS=7Xtbk8Lot$a2frwCX_i<6X@-K5#TxU6bi<7ro+mGmgc_s6@?PzZTD z%<9_N^zPu!>6sPw?gDpFo*r7Js_B``s&=i+szv%A$Ehm)r=OumGDe23^`fqZ&O!`q z>B`JDMBIb19$ldl5(V(o3N^MR0VmbQji?L>J?k{+ICY5X(2SWJiKw;n1S-3?MQ7@N zs|M@W4`a>SqQ5c^m!4>bd%=mSn?CSir?hYxwk?<} zRw}vRtGLoRm?6EOw<9blbt-PR4=j|ashD{ydppUf1ivX1%G!WT;s6_}`4mK(#!>U(!QEyv9>1)VO^{Mo&E*a(;YY zcn9ez=i5ntJ{@{;-vWbm?(wQ3SBOJT0@nx;`>>`#y6j|A$*7YVfI+`f?Fyd_2Y|WG z09!}8(YaPnK2wc$-n)6xE7K{Iy58B(S#tB_&13j` zD)3X*iLnQoCm!qAt zpr-zJI^&B!#<0vf%*>QBtMxlaJIA}%=jnmJbIx{`DLr6{Ss2d$AE&c>L*C6(Uq4e) zCm!pFV@Juk>bHd^#*vuvSdJdlH=c|BwW8`UCr{3$-@XLAM=~iaqADOUU?T5PO$2lJmdh!HI<}T)=zvuxcW$+X+esB3)PI2l< z&Ulw7Bln-=TtQX+e(oIGrU_4QHxU|E>w%X$zZ6vc_;Y8LAZ6CcPE|Qg8VLqpguXfD z>;{dzrY_-yzJjH7(F+CiRp< zIrD9ql0ND%HISGN%_(odg$CKvE`)N|x5%4)vdR14Wb!t(%=?Ya`we-UTjZIR$Nkb! z^I5-4vy<2V6Fb@SU$B!mT5IZ@!%b7y9S$sSwpL(M7hK}Z?0c?4#VvPx=RbmD7{kBi zZo2a+E%@^wJ)*_{b7BqsHe$$otwHqoWK-(R$$@}J zl6T9`$@{iN9#eU+UU7i|@~sOf@O_H{2EK<8fAcMoB6aFFj$yI>p+!N{-L{iWP1p*C za#eT>X#xp2!Wy=y<&Nq+_1`zk^mYD{Uvfmg?je@G(Yg#Swiz7^lE03VW z^{tlJYZtdT(!M*Z)e`GYGIeY}33Si8SRKNSUJ~1{Q92RR<;)Zl+^C#8E>`2&`x@~( zbt;R-{NJg|+FT*~(`NHk99kFRuBZQek(#()i%P_6Oqh>UBO8pV8Pw_pFYDl9bzZ?0 zc_|4&fz3NLTlf4u@Z6%u{a&RKbJ*kQn^T!m;x*^d5DJDT7rD5>T(a1KU-El349|`C zeh)HlYZ!Won&NO1#hrgp^TZ_!k2)nMM%Y{Atbpt-{_KzH4E*W-`bYICQp+8es>P-p zf-Ae0S>;Z=OkHUU&l4v~F9D~5_FE%pqiAzb?wBKB= zMje>mj3ln1Y;UGee#4sy%~m998!;he2O$#N%Ndk7V&Oct7sak4PSvQ&i}mN1tJgX$ zF-l6h8ay*|*;GKNxktbKCv~`UcSFBA);KiP$@QvZ;e7Uu%=K-em+Fh_QC`ZiztC%;y&#uu%&TQNp&Wb32vR5deeOZWtEzw8FpU0-^Is!?Fs1ni=W@gv**9PFL+-qsC{-$%VTvECqfI#cOo*QsmVMNtW7*rlQS^(rR*oC9tE z_6_>H8&uD}LK4^vtd&=05;5f2Dj#FbsX^8is4ly0Z_iW*`Ca0ucR^QOISVR_>p#p= z^~8z&ewMlgDjIkr&~a(yjjA(`jW?lZ#%=^ht>!FkEvN5IXlJbymoVtfYrpVjRG~Hc z)|=Ha?CkEiS&a@>GxLqx08<-MT%$+d!XTK;GJWMO>MAK=9Sd-?Wti6J(m4iGN6t~R zLCObn)Y$GE_7*E3@qu6t5$h-**Gr1SHh(3!{ge7D!J6}y7 z_$)d#>i#*#=g$lt)*A7IFSYmarITt+QVi=y@d6f|xV~rsM#Xx4-vTz7tD%O)cW1FXKw-DrQ2cgT`Zbx-_TEBHWTeT1C{qJBl za-Gi|oIAbgY6uDTwa_UQyp1cLcejCG2aVP;^r&k|0QLycE-o( z6BnvuLr6X{RwJMw9!LT0XG5_s4EsWm)xNY|>nEyBp!<~V=*MC82b<8%+1O&-Y?O}|gNo2usy3g(W__{^ZwreOMS*ih24yc6XO4@|tO--F z%3v|m?uug5hbUDcS@E42tPiQGzXOW6U`UQ4X7}PhcOph*P?D+4bYi!Ktj?fZ_V8>k zY{ZY+0*YhZZYusm*b#A{N|!aENNWozDuLt#OjGkS#(rkUQslj66&F!jTtU;N>w*PY z#bsa17RSdw+PSuv(%9BaX%PPjZC6DgvFciXvcyL)g`t+>tWYKMh#ldkrV;qjz$Y^_ z{r%3c6KKjLnbD|gJ{!VQuC`Qe-qw#52RVr8Ffn*bG7?>w(e9|dRL>8vdn>xB< zM!QX-S^!;`Z{t>ig>-Ne&IjSfEvTVuwo^=>YVql?4wdPGa(TK?q8*oRfLq%q25B^> z-cKAC+ic&Q*NY|mL!ANLo_vA|b8wrH`2cb_>c+-yRvO@Q^NGPWCu75sbRoy~!1!Uk znI55GwaLliypxi9#U148HCF0(Q(NR<2J4V*NIQ33_b5mPv zSRPrIP^09Re(4@$y>&WvuR2(Q5E9x$rmqQj!f9p+rn0=)9H7ORHq>n-V1qr((ui)t z*$+b#68cESOb!z!ss+6!^9@VtoaGjRVX;`@NOUY&G~zb$l}zSfnQ?zxQJm<)iD;@S zmQY|th*fe}QdxQ>ii+NTuc|mjKA2{ zdY)1{m+vM#gCV*pGnzEo+d}7s>m~zxzmc1IltGX%8%5_-IXTsi0I^J0EK#L{S@q}* z6$)0YlY;7=Bk-o`<Ru3O)ItoGQ;3pj+djwg05gB;F%e@Sogk9 zRUJa-^X1sCIJOEt04tc09)|kjeTHEg!?2LCmSI>R5z+9g1u5(Fg8S6rLT6m_n8)#c zvs9#!%b8_^T)r{Lg*!_$k_g&+HfA%dqPjLIcUV|vt}=|G1tud|n3N-k$*7)kzd8%8 zb@TmdL>(xAOb{>)3ZkH3qXQ1|h3>-mN~VEK^^{;FmwM-ly9NeJ;+_bQ%DR{O9TZ8db3JbEM*g|MjyCT zofry0pFnb!Czr|u+*q6dBZ%|G5|<0%zBnO)dLqoKlsuOgCu*q)5es*EGs5xY$Xa)D zq4~Pf%wD7}uB$bZx0I1(p(0a4b%z7G9CD3UBLFRvmyxmx$<%wKByoT|A7I6ckGz-Y zJ$OqCVP;Q4%ajf->?pvzQJnah)V#Skv7bBvzEaWw+H_)7*a?6)od9?`A!|1lle!+E zgSO1>CM-zBQW3p0SODfKmx>H%Fd5jBFdza`aEq`?MpJV2B31Ni<32L}!intjx(7n)9q6#;wd*NhFNM!uZb;hw2Frs#C%dN^=5{zZgY= z!xa;E1*m{#R0vI^Hb)@ih_0E+Et!aX3N8G^r-tXsr?JHFcw}j9{OWl1v;&OAbp+i1$jgE$G!$b8~>> zQuqG~;5rwG_xq`OEB@E@MyR%DQ?>OhV^$y-Ti8`_vb|XPS?ShoEvD1|OXw|f6Or0n zTI=3=YhAKi+qbd0|9)^Yt$DQ8t*N!N5HEwwuFij;5M?LX8^s0YENe)A_Ds7alrpIU z@*iRJEmO*_n%RYzUtu9pq$--A$u86>Q%Dr3u1$r0H2h1NBf1m(YY6ireo&g;TA^#v zn#x-H-Y~2G__^pw<^Z(qNK^9%*A;g7FPay{sZ;CC!^r<*^P)_ZHhsRA-lvJNuAL04 zo#X$0VuGdd zWDbG6D))op#KH0#24L1Anl|NGImSyq%iTntqT-Fb7Y>&)>~i@b`rx=CY0O|_xj@a_%v~5^xW*WK!aJ$r5nxRVDjtZxttrbZGAmvwY;^G_4^ym`+tgF)BW`4h}XB;7f?6Z7vwI#lO!Q zdjtll+b-oy5QC0ZAA80*C)_)hkq@lT?** zGfDvXOlMy}_WmYYu6lzkdM}L+&u}SdwJI{h$j8L0ky*nPNb!n9fnK#j^$S;z3^Yc@ zhnlK^Hp^<4$xln$h{V~TWb)GtgSly8LA?=*iH`~aidVCgOcQC{KohA>#q>qQ1e;{B z_b=P!;5`r5h1oQuVid`W701VFgU+ zKH=c>W zN(MC^8Sk6eKRzjORQ&M7(faA9RFAxx_!03)S)xX7e@b<&J6hhW;|Ii#l9vMr zMYF%W6k^92C@)3vRQyPJNyTg9ljWthIgihb1$@+YCutSSW{awcw`vqXZg>?FcgPY4 z`Y7=uX&2sT?`2Fg0x_ZpQp{?cRk42jX*KWwTgqNMhUnm>hYL)bnvaQ5>#>%m&^ie# zWCOgiq#T` zX{9=Kyo?ikAkhZal+XW8q{a>ZVSR~>O&WJs{L2VXE36Cy$piAlC?_g6G4CRIVhdcZ zA6uz@=?R37>u%4eiFL@j#%Q&Qr);KRaRaTQIS*ywu~jr;*NYQa{A423ndNhhgfJ6y zttk!;GtX$k(A-8786JiZm1WMbt4OfYBX*m7o-DzZNa)EVQLRtL$XGC`P=Ef6>e`iT zg6_N*KAQO~N$L@x6)O`0ZX(r_u7EC^P3$+mj+vubev zws9w3YO2f&tHk#y?n{*fn?5<&R$A{VR|ZW1thTz>D%Gvdjsg(`xUL|0(g+NMrjw4e z6Wfp2V>Ze&8YeP%83>Xe_*j@9YobKjtR`mBQv}z7pdF45!YOZnO=b?iV4a5>BlAU=r)MUJ!59=Ip2=&+zsuGf{3 z!a{3W)h9ovYH-!O<2kco{`hmaY`m=Beol?+2K6R=f=Y;62u^g;Wa>p+847}VM9z`x z6k>YZ^Qz*UkLVW&{!q38GJ6S00)X4~M~FQ%#e)?glHdb8Wo7rxZs=ii&k_F`6Aw%* z`{@LLG;tm!ms%jijnAw8G-ilzqpT8`L|&99U0owjkiA(~tX3UsUcw7vO0vC)4JsFM zcn~2zx0pcr9Meniis67S7K!l(<4}<`)NL-Zl(9ztZnf%Dw^>Z8)(XeSij5|fi04iT zUc$kW?^A1tBP$5q8fBjGe2n=fcvwbzd;E3ra+k+`NfnD zH#pYttAn1phFy-0deIuyqYd0N<&H<3y23%FDIQISf{Gkpf51L3_F(adj!h31~Hrtq;IJH#;e8IL#@S?eh+;-AQb!^^86Q?J=Jtke0#?jd+6z!qNLMuI%LSdNaCn4ugu)gU%rSADicodLlY8&nJf`k zWbQJaBXTN8?tinx)=$8yewW?D5JPh;tPQBNlV zKv$s_WI4~ua>%x(!Ld>??Uk6ihfl&Tl8ddx$BvSRO@+qdW3aId!*0?BTgvFf!Lq%7 z7!9CJ<;J_QFm~rk1h(3Tz&A~LQ*!(ueZvNoteX&To4`_=Woyo9*?6)bF@#nQqxB@M zccb<0^!*?ML0j0>fr-(=m#tBqHOJc7u`)y{R?DX;J}n|DdSQGNlHHiZp;SS*m_%88 zbQ?A|Mki|I(kC(B=i9qrU^ceGv;m)?#5O-P=SpZ-hP9E^x4uYUuui+Jc<# zVdF}cN&K{c1871xh{ii2r=F!vV5lz|nlqL6)HFDWn_CHR`mIgqHrJZHu*HSv1lO3i z1-#8LZ!3fXb=k|RD;u>VURIY45~0zCHEy;u_DWju7*^Y-X=f~!+A552+smqIV1aBP z!Wx~6xU`DM;qf-arI!fea_?IkJZ#T}a0*h_+<0g1cmyo;tpi_Cy}A}4QJEW@*;+)z zDUdZN+*%|Yy1woeb!eUpp=s#tS8yO&rz4xyFwu{UYX=%qtNZYLWHzRa=K<{1>`PlW zgkDVY&<(+nL+Y#;ZS}RA)gN&D&V5yNAGQN$AdcjrQ|`#c$&OHP0Wl8=u9Zi+iH%0q ztND^rN{Wf(B`NyUS5;-<4)KFxJm7)BW<7@rIT-NxtGN38U4Qec`bDsoy0YT%ysXcB zP5sGP+wjqA>VC(0v*D&UREg6O`P5}Cj-(oMgj37H*2uPc!{dMF>~y<-Fd)H}d|@s) z=kdo0-fUR(rn<-J{JtBT=Q%}kCcP11H5Z>$T!biouRiT<)v@m0TrkdgQX|#LQ!pUU zg1}_q(!nAjapoVEk`jtV_RQVj5urqaD%o`Q7>P=rNoVYBI^AMML4G_LWZY5i~Z7mXAx>TwTptF$rj9y zM{WHC%9fX`atj$T8~~(T4pW)iwxdZCmlqN={`2OTGSh`$`tSc#`^6SWNg*NVHnv5r z&uvF|f1D1?GK(7qc~0=H{_F$w0&J7p&1*`Zj~FjY`IDD4w^SM0MX&uxb$7qaH-6*C zeWb>?U*+ptKT<>7Z}auWkJRz*H~G5v$Lc}%U-|m2k8wTOr8{p`XS=)d^;KKdpCsGc zrp|M}%hwlgQ`-GLUl)C%M)_ZfM>yY17FRBwzx_o0wrIDBvn4DScg8RD&QI9Z|5E?_ zQ`{{#=((S&Xreuk&@uXR1T+ z91*nXo^*_;qaf>&_HI{w^k=Gz`(eHwdw-;dzV$Pe%>P(oNkxJm^7X3E)R;qd@zZF5 z^2mcMc@!`esD=h}gCE5MnX`yYHd!tZuMuc?_;Rg-qK_dP)D6Lk+7CnBLHnzff!35AyXLV6$sbrkG{gM z`gvXWwR*3U9RpVwF}g0pkk6SqSn*n&w^NXlYwye=Ic+sQGNUE75D16InWU& z1PR6gCdrh5Wc)!6V}qPPzQQ?B#!1u%|4a3)Gv8Pq7&U`|))aTmN8-X`*@qX@NBMXM zKdA|JV}91du=ob1GgWel>H?c2RI>ePxg$q*f-59foPa#OG(Q%@mV`hGg1RduQ=-$! zJsgFB`PoQKvh@4GG|Am)7-JO1$j96*!1Sh=WM5_4R$e=S+ zL+E&0t8IOH6rA+UdBi1nlbr8}1fS^oZ&{RQNKIVe5=@sb>)mts>KaBByFzg=U9b68 z_3m_SR4m@CafbNFC6YOTR3WQ``honR5eN}Sb$YrP6i#91wC~HTk#?H3AKak7{!UGi z332N8YQFUAhwssd*GlYeV!tpNNctcZTJ67^qwCxBvAb1Go0$xrpevXWHU6o=EWKp6 zsw|o<* zwYu_0HBi8SqF6x;l-=~zKdQ>I4ESN!+?bFPXee-WZ?>!TwjWi8?9Qj>amii`nrn5< zUUhul^k_J_7wuJNkG3eRHxx0=4KcdIc%SX$IDtX%GV}A1^v{Ln=Ux1qGtQsn+%QKI zvHtt~IV=4^u`h*VApydy=Ir&4q0M6)zqbbs6N2Rq*YBVgIDWtAO;KS^W(;QLlK6?^ zmw+kobV3iW?wABjD3n`ud1J zr1SMA6uB7dMA~wL9dLW97I@!`_=kEj8ZrH67tUXs>(@qav3<=YpT2ej(1&yV!O=OA zjOuB-Y3(vxy8s~<=lOj*nrs>n3WjNmebDgjlRbZ~%R2Qh&mTPGhkUVXgDbixV&qQQ zWs;KcZswo)$df_D3l6d5dQ0`ED1TJ+2Z36^pP}zo{-F%i4(0bIXh*s4pWSO)zAQUM zt{b842$HyH02FTOOB%cSLErE56P=ND<|jKN%gd2@{y7l*Q+a+zT7E6h9|v~2=KI5i zhJ`>(_t9e+Mtyd^-&>|dm@dST)Q$OmWk;q(rf?cpQvKe1f0X}`Orn3~>)NRQ;|l{l$r>MSOXLJdDUu)#tUMVYxkN`+36~Y0W%qmQ3Co*ZVj(PWcx=q? z>wMgBRm{(GL{6Gj;CCozG9WmV%bz&t%L{IRw-DNcFIMZ71^#hi2`*`qD8UeEvl2rJ z{rlj24eu5be7DE@AG5mF@*CK5a;Il z?eqo3elMTaa|9E27W@5)i2ZW0Kd!wNHiJSK)-6|Q3qG)6S=vre~Z3wmB^sBP=-ah=@_V>2ATuUMwBRVP$cUXoaPYz9{+VqS*c3z+vC~298}!n0{{Y0Z?d5)HcwQ3$AF|{u zTbnNaAUwnCpUh*HeY|TQgA$V1a8<%T!69PZmZX0}@B&mKG|C?o@nE;Uyc+;6)GNCA zqc|A&T{piMO?U6^-x&KFB!vQ>$PNCY8@v05xvwdG+OevAF?V+p_tp#|QFtEJgL?Sm zr8HJIrW>V)pX>F}f9>Jl;WX$Yd-{WTOz-IrCn(3tp8i;8xz5|qAJ(k?3H$kzvJ)Ea z-Vcle*Xx!3H0QyFldAmTF6W}=_Vz2;r+T`#{|Z47Ztg>&CHlEO{{AH^qavw<1Oe(B zbzWcpDM^NtWGBDg*FVpBO^@y8_aFq$x&8bx?yE{)Fq!~5js5%^3A%Mee}5xc-3It; zomU$^8{psV_IQy~h69LckBMLzS0Oo=2u$czH+Wu{mWxw0T1mqo|9Gt4C4>DAMY7W+ z$^{aG6TF~@4EBd~cmX?NB(=oho+~p2g?jj`elV2qyk0vPRIS%P4EDQpd|#9lp(C8N zP2Ex3!oVT^#m@T;_YU#j^PGnot{v&u=R3I#v4j1iJGzaIUVVZ;K;Lu{f7+bs|H9q4 zLI3Vdf3>?~lOA&x&n>U$ytDmZxjQ!N^Us#wuj%3E$nV$nqI3M!{+7Qt=EP=nYIx=( z|L~}ubgsWrZ=B+vUcRe3$my4plhbopkfV6^;kh4A`A`35ihq{QJI|k;pOc#RH5J@m zq)UJ8?`W8Jo?otj?r#_QfA^eRJ?oGDb9(7zevK}@%ungP3t00PUka=XFY^oaQJ0d| Z?sC6Ee|(ugQMb9w|3$-~%l&Up`hT{MvIhVF delta 120485 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
v8^cciWgEKRXCjQ7m>*4I(XHT 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 JeC*5P{~r~q7HI$g diff --git a/core/benches/blocks/common.rs b/core/benches/blocks/common.rs index 7f658ac61a4..30ac642aee4 100644 --- a/core/benches/blocks/common.rs +++ b/core/benches/blocks/common.rs @@ -172,12 +172,16 @@ pub fn build_state(rt: &tokio::runtime::Handle, account_id: &AccountId) -> State let _guard = rt.enter(); LiveQueryStore::test().start() }; - let mut domain = Domain::new(account_id.domain().clone()).build(account_id); - domain.accounts.insert( - account_id.clone(), - Account::new(account_id.clone()).build(account_id), + let domain = Domain::new(account_id.domain().clone()).build(account_id); + let state = State::new( + World::with( + [domain], + [Account::new(account_id.clone()).build(account_id)], + UniqueVec::new(), + ), + kura, + query_handle, ); - let state = State::new(World::with([domain], UniqueVec::new()), kura, query_handle); { let mut state_block = state.block(); diff --git a/core/benches/validation.rs b/core/benches/validation.rs index 009e39fe00a..bb2820d1379 100644 --- a/core/benches/validation.rs +++ b/core/benches/validation.rs @@ -51,7 +51,6 @@ fn build_test_and_transient_state() -> State { let (account_id, _account_keypair) = gen_account_in(&*STARTER_DOMAIN); let mut domain = Domain::new(STARTER_DOMAIN.clone()).build(&account_id); let account = Account::new(account_id.clone()).build(&account_id); - assert!(domain.add_account(account).is_none()); World::with([domain], UniqueVec::new()) }, kura, diff --git a/core/src/block.rs b/core/src/block.rs index aaa63fa433a..9e5f89c3945 100644 --- a/core/src/block.rs +++ b/core/src/block.rs @@ -1004,9 +1004,8 @@ mod tests { let (alice_id, alice_keypair) = gen_account_in("wonderland"); let account = Account::new(alice_id.clone()).build(&alice_id); let domain_id = DomainId::from_str("wonderland").expect("Valid"); - let mut domain = Domain::new(domain_id).build(&alice_id); - assert!(domain.add_account(account).is_none()); - let world = World::with([domain], UniqueVec::new()); + let domain = Domain::new(domain_id).build(&alice_id); + let world = World::with([domain], [account], UniqueVec::new()); let kura = Kura::blank_kura_for_testing(); let query_handle = LiveQueryStore::test().start(); let state = State::new(world, kura, query_handle); @@ -1061,9 +1060,8 @@ mod tests { let (alice_id, alice_keypair) = gen_account_in("wonderland"); let account = Account::new(alice_id.clone()).build(&alice_id); let domain_id = DomainId::from_str("wonderland").expect("Valid"); - let mut domain = Domain::new(domain_id).build(&alice_id); - assert!(domain.add_account(account).is_none()); - let world = World::with([domain], UniqueVec::new()); + let domain = Domain::new(domain_id).build(&alice_id); + let world = World::with([domain], [account], UniqueVec::new()); let kura = Kura::blank_kura_for_testing(); let query_handle = LiveQueryStore::test().start(); let state = State::new(world, kura, query_handle); @@ -1136,12 +1134,8 @@ mod tests { let (alice_id, alice_keypair) = gen_account_in("wonderland"); let account = Account::new(alice_id.clone()).build(&alice_id); let domain_id = DomainId::from_str("wonderland").expect("Valid"); - let mut domain = Domain::new(domain_id).build(&alice_id); - assert!( - domain.add_account(account).is_none(), - "{alice_id} already exist in the blockchain" - ); - let world = World::with([domain], UniqueVec::new()); + let domain = Domain::new(domain_id).build(&alice_id); + let world = World::with([domain], [account], UniqueVec::new()); let kura = Kura::blank_kura_for_testing(); let query_handle = LiveQueryStore::test().start(); let state = State::new(world, kura, query_handle); @@ -1219,12 +1213,11 @@ mod tests { GENESIS_DOMAIN_ID.clone(), genesis_wrong_key.public_key().clone(), ); - let mut genesis_domain = + let genesis_domain = Domain::new(GENESIS_DOMAIN_ID.clone()).build(&genesis_correct_account_id); let genesis_wrong_account = Account::new(genesis_wrong_account_id.clone()).build(&genesis_wrong_account_id); - assert!(genesis_domain.add_account(genesis_wrong_account).is_none(),); - let world = World::with([genesis_domain], UniqueVec::new()); + let world = World::with([genesis_domain], [genesis_wrong_account], UniqueVec::new()); let kura = Kura::blank_kura_for_testing(); let query_handle = LiveQueryStore::test().start(); let state = State::new(world, kura, query_handle); diff --git a/core/src/metrics.rs b/core/src/metrics.rs index f555e677ae4..379690e74a1 100644 --- a/core/src/metrics.rs +++ b/core/src/metrics.rs @@ -137,7 +137,12 @@ impl MetricsReporter { .accounts .get_metric_with_label_values(&[domain.id.name.as_ref()]) .wrap_err("Failed to compose domains")? - .set(domain.accounts.len() as u64); + .set( + state_view + .world() + .accounts_in_domain_iter(&domain.id) + .count() as u64, + ); } self.metrics.queue_size.set(self.queue.tx_len() as u64); diff --git a/core/src/queue.rs b/core/src/queue.rs index 1e343eb4033..658ffafe405 100644 --- a/core/src/queue.rs +++ b/core/src/queue.rs @@ -437,10 +437,9 @@ pub mod tests { pub fn world_with_test_domains() -> World { let domain_id = DomainId::from_str("wonderland").expect("Valid"); let (account_id, _account_keypair) = gen_account_in("wonderland"); - let mut domain = Domain::new(domain_id).build(&account_id); + let domain = Domain::new(domain_id).build(&account_id); let account = Account::new(account_id.clone()).build(&account_id); - assert!(domain.add_account(account).is_none()); - World::with([domain], PeersIds::new()) + World::with([domain], [account], PeersIds::new()) } fn config_factory() -> Config { @@ -833,12 +832,10 @@ pub mod tests { let (bob_id, bob_keypair) = gen_account_in("wonderland"); let world = { let domain_id = DomainId::from_str("wonderland").expect("Valid"); - let mut domain = Domain::new(domain_id).build(&alice_id); + let domain = Domain::new(domain_id).build(&alice_id); let alice_account = Account::new(alice_id.clone()).build(&alice_id); let bob_account = Account::new(bob_id.clone()).build(&bob_id); - assert!(domain.add_account(alice_account).is_none()); - assert!(domain.add_account(bob_account).is_none()); - World::with([domain], PeersIds::new()) + World::with([domain], [alice_account, bob_account], PeersIds::new()) }; let query_handle = LiveQueryStore::test().start(); let state = State::new(world, kura, query_handle); diff --git a/core/src/smartcontracts/isi/account.rs b/core/src/smartcontracts/isi/account.rs index 09afde491a1..bea9b9c375f 100644 --- a/core/src/smartcontracts/isi/account.rs +++ b/core/src/smartcontracts/isi/account.rs @@ -546,13 +546,7 @@ pub mod query { &self, state_ro: &'state impl StateReadOnly, ) -> Result + 'state>, Error> { - Ok(Box::new( - state_ro - .world() - .domains_iter() - .flat_map(|domain| domain.accounts.values()) - .cloned(), - )) + Ok(Box::new(state_ro.world().accounts_iter().cloned())) } } @@ -561,6 +555,10 @@ pub mod query { fn execute(&self, state_ro: &impl StateReadOnly) -> Result { let id = &self.id; iroha_logger::trace!(%id); + state_ro + .world() + .domain(id.domain()) + .map_err(|_| FindError::Domain(id.domain().clone()))?; state_ro .world() .map_account(id, Clone::clone) @@ -578,7 +576,7 @@ pub mod query { iroha_logger::trace!(%id); Ok(Box::new( - state_ro.world().domain(id)?.accounts.values().cloned(), + state_ro.world().accounts_in_domain_iter(id).cloned(), )) } } @@ -609,11 +607,8 @@ pub mod query { Ok(Box::new( state_ro .world() - .map_domain(&asset_definition_id.domain.clone(), move |domain| { - domain.accounts.values().filter(move |account| { - account.assets.contains_key(&asset_definition_id) - }) - })? + .accounts_iter() + .filter(move |account| account.assets.contains_key(&asset_definition_id)) .cloned(), )) } diff --git a/core/src/smartcontracts/isi/asset.rs b/core/src/smartcontracts/isi/asset.rs index 3c75c35cf35..38621f4ec5d 100644 --- a/core/src/smartcontracts/isi/asset.rs +++ b/core/src/smartcontracts/isi/asset.rs @@ -442,13 +442,8 @@ pub mod query { Ok(Box::new( state_ro .world() - .domains_iter() - .flat_map(|domain| { - domain - .accounts - .values() - .flat_map(|account| account.assets.values()) - }) + .accounts_iter() + .flat_map(|account| account.assets.values()) .cloned(), )) } @@ -507,18 +502,14 @@ pub mod query { Ok(Box::new( state_ro .world() - .domains_iter() - .flat_map(move |domain| { + .accounts_iter() + .flat_map(move |account| { let name = name.clone(); - domain.accounts.values().flat_map(move |account| { - let name = name.clone(); - - account - .assets - .values() - .filter(move |asset| asset.id().definition.name == name) - }) + account + .assets + .values() + .filter(move |asset| asset.id().definition.name == name) }) .cloned(), )) @@ -548,18 +539,14 @@ pub mod query { Ok(Box::new( state_ro .world() - .domains_iter() - .flat_map(move |domain| { + .accounts_iter() + .flat_map(move |account| { let id = id.clone(); - domain.accounts.values().flat_map(move |account| { - let id = id.clone(); - - account - .assets - .values() - .filter(move |asset| asset.id().definition == id) - }) + account + .assets + .values() + .filter(move |asset| asset.id().definition == id) }) .cloned(), )) @@ -577,9 +564,7 @@ pub mod query { Ok(Box::new( state_ro .world() - .domain(id)? - .accounts - .values() + .accounts_in_domain_iter(id) .flat_map(|account| account.assets.values()) .cloned(), )) @@ -601,9 +586,9 @@ pub mod query { .ok_or_else(|| FindError::AssetDefinition(asset_definition_id.clone()))?; iroha_logger::trace!(%domain_id, %asset_definition_id); Ok(Box::new( - domain - .accounts - .values() + state_ro + .world() + .accounts_in_domain_iter(&domain_id) .flat_map(move |account| { let domain_id = domain_id.clone(); let asset_definition_id = asset_definition_id.clone(); diff --git a/core/src/smartcontracts/isi/domain.rs b/core/src/smartcontracts/isi/domain.rs index 34efd4848b8..5dcad8e7b58 100644 --- a/core/src/smartcontracts/isi/domain.rs +++ b/core/src/smartcontracts/isi/domain.rs @@ -2,7 +2,6 @@ use eyre::Result; use iroha_data_model::{ - account::AccountsMap, asset::{AssetDefinitionsMap, AssetTotalQuantityMap}, prelude::*, query::error::FindError, @@ -19,7 +18,6 @@ impl Registrable for iroha_data_model::domain::NewDomain { fn build(self, authority: &AccountId) -> Self::Target { Self::Target { id: self.id, - accounts: AccountsMap::default(), asset_definitions: AssetDefinitionsMap::default(), asset_total_quantities: AssetTotalQuantityMap::default(), metadata: self.metadata, @@ -56,15 +54,18 @@ pub mod isi { )); } - let domain = state_transaction.world.domain_mut(&account_id.domain)?; - if domain.accounts.contains_key(&account_id) { + let _domain = state_transaction.world.domain_mut(&account_id.domain)?; + if state_transaction.world.account(&account_id).is_ok() { return Err(RepetitionError { instruction_type: InstructionType::Register, id: IdBox::AccountId(account_id), } .into()); } - domain.add_account(account.clone()); + state_transaction + .world + .accounts + .insert(account_id, account.clone()); state_transaction .world @@ -103,8 +104,8 @@ pub mod isi { if state_transaction .world - .domain_mut(&account_id.domain)? - .remove_account(&account_id) + .accounts + .remove(account_id.clone()) .is_none() { return Err(FindError::Account(account_id).into()); @@ -168,22 +169,20 @@ pub mod isi { let asset_definition_id = self.object; let mut assets_to_remove = Vec::new(); - for domain in state_transaction.world.domains_iter() { - for account in domain.accounts.values() { - assets_to_remove.extend( - account - .assets - .values() - .filter_map(|asset| { - if asset.id().definition == asset_definition_id { - return Some(asset.id()); - } - - None - }) - .cloned(), - ) - } + for (_, account) in state_transaction.world.accounts.iter() { + assets_to_remove.extend( + account + .assets + .values() + .filter_map(|asset| { + if asset.id().definition == asset_definition_id { + return Some(asset.id()); + } + + None + }) + .cloned(), + ) } let mut events = Vec::with_capacity(assets_to_remove.len() + 1); diff --git a/core/src/smartcontracts/isi/mod.rs b/core/src/smartcontracts/isi/mod.rs index e5746fdb1c3..72282ac66b4 100644 --- a/core/src/smartcontracts/isi/mod.rs +++ b/core/src/smartcontracts/isi/mod.rs @@ -259,7 +259,7 @@ mod tests { }; fn state_with_test_domains(kura: &Arc) -> Result { - let world = World::with([], PeersIds::new()); + let world = World::with([], [], PeersIds::new()); let query_handle = LiveQueryStore::test().start(); let state = State::new(world, kura.clone(), query_handle); let asset_definition_id = AssetDefinitionId::from_str("rose#wonderland")?; diff --git a/core/src/smartcontracts/isi/query.rs b/core/src/smartcontracts/isi/query.rs index 2d8a14982b1..a7f295cba25 100644 --- a/core/src/smartcontracts/isi/query.rs +++ b/core/src/smartcontracts/isi/query.rs @@ -313,12 +313,11 @@ mod tests { let domain_id = DomainId::from_str("wonderland").expect("Valid"); let mut domain = Domain::new(domain_id).build(&ALICE_ID); let account = Account::new(ALICE_ID.clone()).build(&ALICE_ID); - assert!(domain.add_account(account).is_none()); let asset_definition_id = AssetDefinitionId::from_str("rose#wonderland").expect("Valid"); assert!(domain .add_asset_definition(AssetDefinition::numeric(asset_definition_id).build(&ALICE_ID)) .is_none()); - World::with([domain], PeersIds::new()) + World::with([domain], [account], PeersIds::new()) } fn world_with_test_asset_with_metadata() -> World { @@ -344,8 +343,7 @@ mod tests { let asset = Asset::new(asset_id, AssetValue::Store(store)); assert!(account.add_asset(asset).is_none()); - assert!(domain.add_account(account).is_none()); - World::with([domain], PeersIds::new()) + World::with([domain], [account], PeersIds::new()) } fn world_with_test_account_with_metadata() -> Result { @@ -360,12 +358,11 @@ mod tests { let account = Account::new(ALICE_ID.clone()) .with_metadata(metadata) .build(&ALICE_ID); - assert!(domain.add_account(account).is_none()); let asset_definition_id = AssetDefinitionId::from_str("rose#wonderland").expect("Valid"); assert!(domain .add_asset_definition(AssetDefinition::numeric(asset_definition_id).build(&ALICE_ID)) .is_none()); - Ok(World::with([domain], PeersIds::new())) + Ok(World::with([domain], [account], PeersIds::new())) } fn state_with_test_blocks_and_transactions( @@ -619,7 +616,6 @@ mod tests { .with_metadata(metadata) .build(&ALICE_ID); let account = Account::new(ALICE_ID.clone()).build(&ALICE_ID); - assert!(domain.add_account(account).is_none()); let asset_definition_id = AssetDefinitionId::from_str("rose#wonderland")?; assert!(domain .add_asset_definition( @@ -627,7 +623,11 @@ mod tests { ) .is_none()); let query_handle = LiveQueryStore::test().start(); - State::new(World::with([domain], PeersIds::new()), kura, query_handle) + State::new( + World::with([domain], [account], PeersIds::new()), + kura, + query_handle, + ) }; let domain_id = DomainId::from_str("wonderland")?; diff --git a/core/src/smartcontracts/isi/world.rs b/core/src/smartcontracts/isi/world.rs index 0839db60a3b..72b65dc194b 100644 --- a/core/src/smartcontracts/isi/world.rs +++ b/core/src/smartcontracts/isi/world.rs @@ -141,6 +141,15 @@ pub mod isi { .expect("should succeed") }); + let remove_accounts: Vec = state_transaction + .world + .accounts_in_domain_iter(&domain_id) + .map(|account| account.id().clone()) + .collect(); + for account in remove_accounts { + state_transaction.world.accounts.remove(account); + } + if state_transaction .world .domains diff --git a/core/src/smartcontracts/wasm.rs b/core/src/smartcontracts/wasm.rs index 716153983b5..9ab00dcbcf3 100644 --- a/core/src/smartcontracts/wasm.rs +++ b/core/src/smartcontracts/wasm.rs @@ -1719,10 +1719,9 @@ mod tests { fn world_with_test_account(authority: &AccountId) -> World { let domain_id = authority.domain.clone(); let account = Account::new(authority.clone()).build(authority); - let mut domain = Domain::new(domain_id).build(authority); - assert!(domain.add_account(account).is_none()); + let domain = Domain::new(domain_id).build(authority); - World::with([domain], PeersIds::new()) + World::with([domain], [account], PeersIds::new()) } fn memory_and_alloc(isi_hex: &str) -> String { diff --git a/core/src/state.rs b/core/src/state.rs index e8faf74a6b1..0c00cb5467b 100644 --- a/core/src/state.rs +++ b/core/src/state.rs @@ -31,7 +31,7 @@ use iroha_data_model::{ use iroha_logger::prelude::*; use iroha_primitives::{must_use::MustUse, numeric::Numeric, small::SmallVec}; use parking_lot::Mutex; -use range_bounds::RoleIdByAccountBounds; +use range_bounds::{AccountByDomainBounds, AsAccountIdDomainCompare, RoleIdByAccountBounds}; use serde::{ de::{DeserializeSeed, MapAccess, Visitor}, Deserializer, Serialize, @@ -75,6 +75,8 @@ pub struct World { pub(crate) trusted_peers_ids: Cell, /// Registered domains. pub(crate) domains: Storage, + /// Registered accounts. + pub(crate) accounts: Storage, /// Roles. [`Role`] pairs. pub(crate) roles: Storage, /// Permission tokens of an account. @@ -97,6 +99,8 @@ pub struct WorldBlock<'world> { pub(crate) trusted_peers_ids: CellBlock<'world, PeersIds>, /// Registered domains. pub(crate) domains: StorageBlock<'world, DomainId, Domain>, + /// Registered accounts. + pub(crate) accounts: StorageBlock<'world, AccountId, Account>, /// Roles. [`Role`] pairs. pub(crate) roles: StorageBlock<'world, RoleId, Role>, /// Permission tokens of an account. @@ -121,6 +125,8 @@ pub struct WorldTransaction<'block, 'world> { pub(crate) trusted_peers_ids: CellTransaction<'block, 'world, PeersIds>, /// Registered domains. pub(crate) domains: StorageTransaction<'block, 'world, DomainId, Domain>, + /// Registered accounts. + pub(crate) accounts: StorageTransaction<'block, 'world, AccountId, Account>, /// Roles. [`Role`] pairs. pub(crate) roles: StorageTransaction<'block, 'world, RoleId, Role>, /// Permission tokens of an account. @@ -153,6 +159,8 @@ pub struct WorldView<'world> { pub(crate) trusted_peers_ids: CellView<'world, PeersIds>, /// Registered domains. pub(crate) domains: StorageView<'world, DomainId, Domain>, + /// Registered accounts. + pub(crate) accounts: StorageView<'world, AccountId, Account>, /// Roles. [`Role`] pairs. pub(crate) roles: StorageView<'world, RoleId, Role>, /// Permission tokens of an account. @@ -268,17 +276,23 @@ impl World { } /// Creates a [`World`] with these [`Domain`]s and trusted [`PeerId`]s. - pub fn with(domains: D, trusted_peers_ids: PeersIds) -> Self + pub fn with(domains: D, accounts: A, trusted_peers_ids: PeersIds) -> Self where D: IntoIterator, + A: IntoIterator, { let domains = domains .into_iter() .map(|domain| (domain.id().clone(), domain)) .collect(); + let accounts = accounts + .into_iter() + .map(|account| (account.id().clone(), account)) + .collect(); World { trusted_peers_ids: Cell::new(trusted_peers_ids), domains, + accounts, ..World::new() } } @@ -289,6 +303,7 @@ impl World { parameters: self.parameters.block(), trusted_peers_ids: self.trusted_peers_ids.block(), domains: self.domains.block(), + accounts: self.accounts.block(), roles: self.roles.block(), account_permissions: self.account_permissions.block(), account_roles: self.account_roles.block(), @@ -305,6 +320,7 @@ impl World { parameters: self.parameters.block_and_revert(), trusted_peers_ids: self.trusted_peers_ids.block_and_revert(), domains: self.domains.block_and_revert(), + accounts: self.accounts.block_and_revert(), roles: self.roles.block_and_revert(), account_permissions: self.account_permissions.block_and_revert(), account_roles: self.account_roles.block_and_revert(), @@ -321,6 +337,7 @@ impl World { parameters: self.parameters.view(), trusted_peers_ids: self.trusted_peers_ids.view(), domains: self.domains.view(), + accounts: self.accounts.view(), roles: self.roles.view(), account_permissions: self.account_permissions.view(), account_roles: self.account_roles.view(), @@ -337,6 +354,7 @@ pub trait WorldReadOnly { fn parameters(&self) -> &Parameters; fn trusted_peers_ids(&self) -> &PeersIds; fn domains(&self) -> &impl StorageReadOnly; + fn accounts(&self) -> &impl StorageReadOnly; fn roles(&self) -> &impl StorageReadOnly; fn account_permissions(&self) -> &impl StorageReadOnly; fn account_roles(&self) -> &impl StorageReadOnly; @@ -378,6 +396,26 @@ pub trait WorldReadOnly { self.domains().iter().map(|(_, domain)| domain) } + /// Iterate accounts in domain + #[allow(clippy::type_complexity)] + fn accounts_in_domain_iter<'slf>( + &'slf self, + id: &DomainId, + ) -> core::iter::Map< + RangeIter<'slf, AccountId, Account>, + fn((&'slf AccountId, &'slf Account)) -> &'slf Account, + > { + self.accounts() + .range::(AccountByDomainBounds::new(id)) + .map(|(_, account)| account) + } + + /// Returns reference for domains map + #[inline] + fn accounts_iter(&self) -> impl Iterator { + self.accounts().iter().map(|(_, account)| account) + } + // Account-related methods /// Get `Account` and return reference to it. @@ -385,12 +423,9 @@ pub trait WorldReadOnly { /// # Errors /// Fails if there is no domain or account fn account(&self, id: &AccountId) -> Result<&Account, FindError> { - self.domain(&id.domain).and_then(|domain| { - domain - .accounts - .get(id) - .ok_or_else(|| FindError::Account(id.clone())) - }) + self.accounts() + .get(id) + .ok_or_else(|| FindError::Account(id.clone())) } /// Get `Account` and pass it to closure. @@ -402,9 +437,8 @@ pub trait WorldReadOnly { id: &AccountId, f: impl FnOnce(&'slf Account) -> T, ) -> Result { - let domain = self.domain(&id.domain)?; - let account = domain - .accounts + let account = self + .accounts() .get(id) .ok_or(FindError::Account(id.clone()))?; Ok(f(account)) @@ -578,6 +612,9 @@ macro_rules! impl_world_ro { fn domains(&self) -> &impl StorageReadOnly { &self.domains } + fn accounts(&self) -> &impl StorageReadOnly { + &self.accounts + } fn roles(&self) -> &impl StorageReadOnly { &self.roles } @@ -611,6 +648,7 @@ impl<'world> WorldBlock<'world> { parameters: self.parameters.transaction(), trusted_peers_ids: self.trusted_peers_ids.transaction(), domains: self.domains.transaction(), + accounts: self.accounts.transaction(), roles: self.roles.transaction(), account_permissions: self.account_permissions.transaction(), account_roles: self.account_roles.transaction(), @@ -633,6 +671,7 @@ impl<'world> WorldBlock<'world> { self.account_roles.commit(); self.account_permissions.commit(); self.roles.commit(); + self.accounts.commit(); self.domains.commit(); self.trusted_peers_ids.commit(); self.parameters.commit(); @@ -648,6 +687,7 @@ impl WorldTransaction<'_, '_> { self.account_roles.apply(); self.account_permissions.apply(); self.roles.apply(); + self.accounts.apply(); self.domains.apply(); self.trusted_peers_ids.apply(); self.parameters.apply(); @@ -671,12 +711,9 @@ impl WorldTransaction<'_, '_> { /// # Errors /// Fail if domain or account not found pub fn account_mut(&mut self, id: &AccountId) -> Result<&mut Account, FindError> { - self.domain_mut(&id.domain).and_then(move |domain| { - domain - .accounts - .get_mut(id) - .ok_or_else(|| FindError::Account(id.clone())) - }) + self.accounts + .get_mut(id) + .ok_or_else(|| FindError::Account(id.clone())) } /// Add [`permission`](Permission) to the [`Account`] if the account does not have this permission yet. @@ -746,11 +783,7 @@ impl WorldTransaction<'_, '_> { } let account_id = &asset_id.account; - let account_domain = self - .domains - .get_mut(&asset_id.account.domain) - .ok_or(FindError::Domain(asset_id.account.domain.clone()))?; - let account = account_domain + let account = self .accounts .get_mut(account_id) .ok_or(FindError::Account(account_id.clone()))?; @@ -1558,6 +1591,71 @@ mod range_bounds { key: RoleIdByAccount<'_>, trait: AsRoleIdByAccount } + + /// `DomainId` wrapper for fetching accounts beloning to a domain from the global store + #[derive(PartialEq, Eq, PartialOrd, Copy, Clone)] + pub struct AccountIdDomainCompare<'a> { + domain_id: &'a DomainId, + signatory: MinMaxExt<&'a PublicKey>, + } + + // Sorting needed to be flipped for the storage lookup to work. + impl Ord for AccountIdDomainCompare<'_> { + fn cmp(&self, other: &AccountIdDomainCompare<'_>) -> std::cmp::Ordering { + if self.domain_id == other.domain_id { + other.signatory.cmp(&self.signatory) + } else { + other.domain_id.cmp(self.domain_id) + } + } + } + + /// Bounds for range quired over accounts by domain + pub struct AccountByDomainBounds<'a> { + start: AccountIdDomainCompare<'a>, + end: AccountIdDomainCompare<'a>, + } + + impl<'a> AccountByDomainBounds<'a> { + /// Create range bounds for range quires over accounts by domain + pub fn new(domain_id: &'a DomainId) -> Self { + Self { + start: AccountIdDomainCompare { + domain_id, + signatory: MinMaxExt::Min, + }, + end: AccountIdDomainCompare { + domain_id, + signatory: MinMaxExt::Max, + }, + } + } + } + + impl<'a> RangeBounds for AccountByDomainBounds<'a> { + fn start_bound(&self) -> Bound<&(dyn AsAccountIdDomainCompare + 'a)> { + Bound::Excluded(&self.start) + } + + fn end_bound(&self) -> Bound<&(dyn AsAccountIdDomainCompare + 'a)> { + Bound::Excluded(&self.end) + } + } + + impl AsAccountIdDomainCompare for AccountId { + fn as_key(&self) -> AccountIdDomainCompare<'_> { + AccountIdDomainCompare { + domain_id: &self.domain, + signatory: (&self.signatory).into(), + } + } + } + + impl_as_dyn_key! { + target: AccountId, + key: AccountIdDomainCompare<'_>, + trait: AsAccountIdDomainCompare + } } pub(crate) mod deserialize { @@ -1654,6 +1752,7 @@ pub(crate) mod deserialize { let mut parameters = None; let mut trusted_peers_ids = None; let mut domains = None; + let mut accounts = None; let mut roles = None; let mut account_permissions = None; let mut account_roles = None; @@ -1672,6 +1771,9 @@ pub(crate) mod deserialize { "domains" => { domains = Some(map.next_value()?); } + "accounts" => { + accounts = Some(map.next_value()?); + } "roles" => { roles = Some(map.next_value()?); } @@ -1705,6 +1807,8 @@ pub(crate) mod deserialize { .ok_or_else(|| serde::de::Error::missing_field("trusted_peers_ids"))?, domains: domains .ok_or_else(|| serde::de::Error::missing_field("domains"))?, + accounts: accounts + .ok_or_else(|| serde::de::Error::missing_field("accounts"))?, roles: roles.ok_or_else(|| serde::de::Error::missing_field("roles"))?, account_permissions: account_permissions.ok_or_else(|| { serde::de::Error::missing_field("account_permissions") diff --git a/core/src/sumeragi/main_loop.rs b/core/src/sumeragi/main_loop.rs index 8f798cd2101..861bb556f66 100644 --- a/core/src/sumeragi/main_loop.rs +++ b/core/src/sumeragi/main_loop.rs @@ -1350,9 +1350,8 @@ mod tests { ); let account = Account::new(alice_id.clone()).build(&alice_id); let domain_id = "wonderland".parse().expect("Valid"); - let mut domain = Domain::new(domain_id).build(&alice_id); - assert!(domain.add_account(account).is_none()); - let world = World::with([domain], topology.iter().cloned().collect()); + let domain = Domain::new(domain_id).build(&alice_id); + let world = World::with([domain], [account], topology.iter().cloned().collect()); let kura = Kura::blank_kura_for_testing(); let query_handle = LiveQueryStore::test().start(); let state = State::new(world, Arc::clone(&kura), query_handle); diff --git a/core/src/tx.rs b/core/src/tx.rs index a13b81ce40c..5c7bc266c35 100644 --- a/core/src/tx.rs +++ b/core/src/tx.rs @@ -19,10 +19,11 @@ use iroha_data_model::{ use iroha_genesis::GenesisTransaction; use iroha_logger::{debug, error}; use iroha_macro::FromVariant; +use storage::storage::StorageReadOnly; use crate::{ smartcontracts::wasm, - state::{StateBlock, StateTransaction, WorldReadOnly}, + state::{StateBlock, StateTransaction}, }; /// `AcceptedTransaction` — a transaction accepted by Iroha peer. @@ -212,17 +213,7 @@ impl TransactionExecutor { ) -> Result<(), TransactionRejectionReason> { let authority = tx.as_ref().authority(); - if !state_transaction - .world - .domain(&authority.domain) - .map_err(|_e| { - TransactionRejectionReason::AccountDoesNotExist(FindError::Domain( - authority.domain.clone(), - )) - })? - .accounts - .contains_key(authority) - { + if state_transaction.world.accounts.get(authority).is_none() { return Err(TransactionRejectionReason::AccountDoesNotExist( FindError::Account(authority.clone()), )); diff --git a/data_model/src/account.rs b/data_model/src/account.rs index 101581312da..0e99bf6d495 100644 --- a/data_model/src/account.rs +++ b/data_model/src/account.rs @@ -1,9 +1,7 @@ //! Structures, traits and impls related to `Account`s. #[cfg(not(feature = "std"))] -use alloc::{collections::btree_map, format, string::String, vec::Vec}; +use alloc::{format, string::String, vec::Vec}; use core::str::FromStr; -#[cfg(feature = "std")] -use std::collections::btree_map; use derive_more::{Constructor, DebugCustom, Display}; use getset::Getters; @@ -21,9 +19,6 @@ use crate::{ HasMetadata, Identifiable, ParseError, PublicKey, Registered, }; -/// API to work with collections of [`Id`] : [`Account`] mappings. -pub type AccountsMap = btree_map::BTreeMap; - #[model] mod model { use super::*; diff --git a/data_model/src/domain.rs b/data_model/src/domain.rs index 89df2d7bcfd..db01cd686c1 100644 --- a/data_model/src/domain.rs +++ b/data_model/src/domain.rs @@ -14,7 +14,6 @@ use serde_with::{DeserializeFromStr, SerializeDisplay}; pub use self::model::*; use crate::{ - account::{Account, AccountsMap}, asset::{AssetDefinition, AssetDefinitionsMap, AssetTotalQuantityMap}, ipfs::IpfsPath, metadata::Metadata, @@ -73,8 +72,6 @@ mod model { pub struct Domain { /// Identification of this [`Domain`]. pub id: DomainId, - /// [`Account`]s of the domain. - pub accounts: AccountsMap, /// [`Asset`](AssetDefinition)s defined of the `Domain`. pub asset_definitions: AssetDefinitionsMap, /// Total amount of [`Asset`]. @@ -158,12 +155,6 @@ impl Domain { } impl Domain { - /// Return a reference to the [`Account`] corresponding to the account id. - #[inline] - pub fn account(&self, account_id: &AccountId) -> Option<&Account> { - self.accounts.get(account_id) - } - /// Return a reference to the asset definition corresponding to the asset definition id #[inline] pub fn asset_definition( @@ -182,18 +173,6 @@ impl Domain { self.asset_total_quantities.get(asset_definition_id) } - /// Get an iterator over [`Account`]s of the `Domain` - #[inline] - pub fn accounts(&self) -> impl ExactSizeIterator { - self.accounts.values() - } - - /// Return `true` if the `Domain` contains [`Account`] - #[inline] - pub fn contains_account(&self, account_id: &AccountId) -> bool { - self.accounts.contains_key(account_id) - } - /// Get an iterator over asset definitions of the `Domain` #[inline] pub fn asset_definitions(&self) -> impl ExactSizeIterator { @@ -203,18 +182,6 @@ impl Domain { #[cfg(feature = "transparent_api")] impl Domain { - /// Add [`Account`] into the [`Domain`] returning previous account stored under the same id - #[inline] - pub fn add_account(&mut self, account: Account) -> Option { - self.accounts.insert(account.id().clone(), account) - } - - /// Remove account from the [`Domain`] and return it - #[inline] - pub fn remove_account(&mut self, account_id: &AccountId) -> Option { - self.accounts.remove(account_id) - } - /// Add asset definition into the [`Domain`] returning previous /// asset definition stored under the same id #[inline] diff --git a/data_model/src/events/data/filters.rs b/data_model/src/events/data/filters.rs index db34033eb82..86bb1a886f3 100644 --- a/data_model/src/events/data/filters.rs +++ b/data_model/src/events/data/filters.rs @@ -740,10 +740,7 @@ mod tests { use iroha_crypto::KeyPair; use super::*; - use crate::{ - account::AccountsMap, - asset::{AssetDefinitionsMap, AssetTotalQuantityMap}, - }; + use crate::asset::{AssetDefinitionsMap, AssetTotalQuantityMap}; #[test] #[cfg(feature = "transparent_api")] @@ -755,7 +752,6 @@ mod tests { let domain = Domain { id: domain_id.clone(), - accounts: AccountsMap::default(), asset_definitions: AssetDefinitionsMap::default(), asset_total_quantities: AssetTotalQuantityMap::default(), logo: None, diff --git a/docs/source/references/schema.json b/docs/source/references/schema.json index 3cb73c6c563..1b9ce3711d9 100644 --- a/docs/source/references/schema.json +++ b/docs/source/references/schema.json @@ -940,10 +940,6 @@ "name": "id", "type": "DomainId" }, - { - "name": "accounts", - "type": "SortedMap" - }, { "name": "asset_definitions", "type": "SortedMap" @@ -3705,12 +3701,6 @@ } ] }, - "SortedMap": { - "Map": { - "key": "AccountId", - "value": "Account" - } - }, "SortedMap": { "Map": { "key": "AssetDefinitionId",