From 57bf5c21433df6afc9c14b33b182bfa53a9ad3b4 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Thu, 5 Aug 2021 10:53:12 -0700 Subject: [PATCH] feat: add ChainGetTipSetAfterHeight This is identical to ChainGetTipSetByHeight, but returns the tipset following any null tipsets. This is what the user usually wants anyways. (and I need it for another PR) --- api/api_full.go | 5 +++ api/api_gateway.go | 1 + api/mocks/mock_full.go | 15 +++++++++ api/proxy_gen.go | 26 +++++++++++++++ build/openrpc/full.json.gz | Bin 25240 -> 25304 bytes build/openrpc/miner.json.gz | Bin 9596 -> 9597 bytes build/openrpc/worker.json.gz | Bin 2710 -> 2711 bytes documentation/en/api-v1-unstable-methods.md | 33 ++++++++++++++++++++ gateway/node.go | 27 +++++++++++++--- node/impl/full/chain.go | 9 ++++++ storage/miner.go | 1 + 11 files changed, 112 insertions(+), 5 deletions(-) diff --git a/api/api_full.go b/api/api_full.go index 412e223cd..6b43fb8ad 100644 --- a/api/api_full.go +++ b/api/api_full.go @@ -113,6 +113,11 @@ type FullNode interface { // will be returned. ChainGetTipSetByHeight(context.Context, abi.ChainEpoch, types.TipSetKey) (*types.TipSet, error) //perm:read + // ChainGetTipSetAfterHeight looks back for a tipset at the specified epoch. + // If there are no blocks at the specified epoch, the first non-nil tipset at a later epoch + // will be returned. + ChainGetTipSetAfterHeight(context.Context, abi.ChainEpoch, types.TipSetKey) (*types.TipSet, error) //perm:read + // ChainReadObj reads ipld nodes referenced by the specified CID from chain // blockstore and returns raw bytes. ChainReadObj(context.Context, cid.Cid) ([]byte, error) //perm:read diff --git a/api/api_gateway.go b/api/api_gateway.go index 6db1c8e45..29cd8ce24 100644 --- a/api/api_gateway.go +++ b/api/api_gateway.go @@ -35,6 +35,7 @@ type Gateway interface { ChainGetMessage(ctx context.Context, mc cid.Cid) (*types.Message, error) ChainGetTipSet(ctx context.Context, tsk types.TipSetKey) (*types.TipSet, error) ChainGetTipSetByHeight(ctx context.Context, h abi.ChainEpoch, tsk types.TipSetKey) (*types.TipSet, error) + ChainGetTipSetAfterHeight(ctx context.Context, h abi.ChainEpoch, tsk types.TipSetKey) (*types.TipSet, error) ChainNotify(context.Context) (<-chan []*HeadChange, error) ChainReadObj(context.Context, cid.Cid) ([]byte, error) GasEstimateMessageGas(ctx context.Context, msg *types.Message, spec *MessageSendSpec, tsk types.TipSetKey) (*types.Message, error) diff --git a/api/mocks/mock_full.go b/api/mocks/mock_full.go index 124532c14..02ad126ae 100644 --- a/api/mocks/mock_full.go +++ b/api/mocks/mock_full.go @@ -343,6 +343,21 @@ func (mr *MockFullNodeMockRecorder) ChainGetTipSet(arg0, arg1 interface{}) *gomo return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ChainGetTipSet", reflect.TypeOf((*MockFullNode)(nil).ChainGetTipSet), arg0, arg1) } +// ChainGetTipSetAfterHeight mocks base method. +func (m *MockFullNode) ChainGetTipSetAfterHeight(arg0 context.Context, arg1 abi.ChainEpoch, arg2 types.TipSetKey) (*types.TipSet, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ChainGetTipSetAfterHeight", arg0, arg1, arg2) + ret0, _ := ret[0].(*types.TipSet) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ChainGetTipSetAfterHeight indicates an expected call of ChainGetTipSetAfterHeight. +func (mr *MockFullNodeMockRecorder) ChainGetTipSetAfterHeight(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ChainGetTipSetAfterHeight", reflect.TypeOf((*MockFullNode)(nil).ChainGetTipSetAfterHeight), arg0, arg1, arg2) +} + // ChainGetTipSetByHeight mocks base method. func (m *MockFullNode) ChainGetTipSetByHeight(arg0 context.Context, arg1 abi.ChainEpoch, arg2 types.TipSetKey) (*types.TipSet, error) { m.ctrl.T.Helper() diff --git a/api/proxy_gen.go b/api/proxy_gen.go index a4feb7be1..7e8305725 100644 --- a/api/proxy_gen.go +++ b/api/proxy_gen.go @@ -132,6 +132,8 @@ type FullNodeStruct struct { ChainGetTipSet func(p0 context.Context, p1 types.TipSetKey) (*types.TipSet, error) `perm:"read"` + ChainGetTipSetAfterHeight func(p0 context.Context, p1 abi.ChainEpoch, p2 types.TipSetKey) (*types.TipSet, error) `perm:"read"` + ChainGetTipSetByHeight func(p0 context.Context, p1 abi.ChainEpoch, p2 types.TipSetKey) (*types.TipSet, error) `perm:"read"` ChainHasObj func(p0 context.Context, p1 cid.Cid) (bool, error) `perm:"read"` @@ -474,6 +476,8 @@ type GatewayStruct struct { ChainGetTipSet func(p0 context.Context, p1 types.TipSetKey) (*types.TipSet, error) `` + ChainGetTipSetAfterHeight func(p0 context.Context, p1 abi.ChainEpoch, p2 types.TipSetKey) (*types.TipSet, error) `` + ChainGetTipSetByHeight func(p0 context.Context, p1 abi.ChainEpoch, p2 types.TipSetKey) (*types.TipSet, error) `` ChainHasObj func(p0 context.Context, p1 cid.Cid) (bool, error) `` @@ -1171,6 +1175,17 @@ func (s *FullNodeStub) ChainGetTipSet(p0 context.Context, p1 types.TipSetKey) (* return nil, ErrNotSupported } +func (s *FullNodeStruct) ChainGetTipSetAfterHeight(p0 context.Context, p1 abi.ChainEpoch, p2 types.TipSetKey) (*types.TipSet, error) { + if s.Internal.ChainGetTipSetAfterHeight == nil { + return nil, ErrNotSupported + } + return s.Internal.ChainGetTipSetAfterHeight(p0, p1, p2) +} + +func (s *FullNodeStub) ChainGetTipSetAfterHeight(p0 context.Context, p1 abi.ChainEpoch, p2 types.TipSetKey) (*types.TipSet, error) { + return nil, ErrNotSupported +} + func (s *FullNodeStruct) ChainGetTipSetByHeight(p0 context.Context, p1 abi.ChainEpoch, p2 types.TipSetKey) (*types.TipSet, error) { if s.Internal.ChainGetTipSetByHeight == nil { return nil, ErrNotSupported @@ -2997,6 +3012,17 @@ func (s *GatewayStub) ChainGetTipSet(p0 context.Context, p1 types.TipSetKey) (*t return nil, ErrNotSupported } +func (s *GatewayStruct) ChainGetTipSetAfterHeight(p0 context.Context, p1 abi.ChainEpoch, p2 types.TipSetKey) (*types.TipSet, error) { + if s.Internal.ChainGetTipSetAfterHeight == nil { + return nil, ErrNotSupported + } + return s.Internal.ChainGetTipSetAfterHeight(p0, p1, p2) +} + +func (s *GatewayStub) ChainGetTipSetAfterHeight(p0 context.Context, p1 abi.ChainEpoch, p2 types.TipSetKey) (*types.TipSet, error) { + return nil, ErrNotSupported +} + func (s *GatewayStruct) ChainGetTipSetByHeight(p0 context.Context, p1 abi.ChainEpoch, p2 types.TipSetKey) (*types.TipSet, error) { if s.Internal.ChainGetTipSetByHeight == nil { return nil, ErrNotSupported diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index db41fb2d3a18922fe3b5b9960853ec350fb7ee91..daf522a99f18308bd4186a8e06b195428a510ecb 100644 GIT binary patch literal 25304 zcmb4~QbA|U|& z_xxUUTR3gDHSm3@$b0HaCn$3791z!VJ}X``+ffO?@KTHfCC>Z zOtZ$uKT~+Xy>AT?d+fL0BRUabKdQ**`~7kfq#I`^#dRO(Yjkr!@GjuxJXN^5FU8mU zmS}_ImSpcZ#tOaIC4guJz}}A@q!>D~5$`@%x;w(m4GlY=F$Hpn(?{^f!UoYtk-vo+3OWQRTBaL^@Nf>n@Lxp$ zw@1m7V#I(G#OP1|V00kvc`*OsE`ph~E7v0!)G2jTF+@gq%;9opYi017v2;d#> zjbVU8e7%u_)v@gb!f+)$M3T)bs1=#G1D9?Cnf@UA)%AArU}Fowfqw@2CF(!&oq{XH zeyyT>zxMvHATSH;rYgY(E{27WAE+;-62pV%-=B5bo_y+ucvJsk7yuQ%YaJ-yC5FE_ z$K`kH)O#(Xz+%J>W#SD6WkuNKMPBUk`5He;iTM%4YR%XUGu_`Wt#B0NU<>-%?i%q% zi{T40O&~(hxBr0wcR+!80auz4YWcmaMbIZfnfbK~7#j)t@gu9%vkNCk)=1N?0XHn9mnCwhZZp>6Rh<_FW%7c`nbLn# z@rkfgr%z;fntR2Q*{Uo!w?uo1%FE1n$!*!USvD#+wN)7+!H${71R@%%0}nb1H9e(XfZK0};Y zgndV3Tk7t8-eCcGg63l(p^4H14v3rgjhzh(^-VEyerzAy?`0d6(&bBly3p@vp({Gg zO$)B>D$B$QPj{`ewNyVy=L;f)e1-^w`v%nVzU%#a1v`HwxoN{9iqk}U`zxY>dknR_ z8KJ8{@haXB2=uwceEl!&WXy1#qjT20Td^>PBjBu-7QmQxfGR_#NNj zB6#lhbVEBR`ulqI{eoBxZ2PP5)>)x59Rj{!K8+Kd)gHNvU?#AK6rfft!4W0R{a(`d#hK-HluraI|%9!N#|K zS>0UG-M}z&F03HQyIwzld(4?Wvq~3MEo^550retwY{`$^B^L-RNryV(-u24kv zjt_jj_}u9a|8{et$M&A%D_SO^aG=HC!z^~h_wk-B+K&xmU>7hO6JkHA>OFB8Bx&Mp|7b-oi@GT4h55^^$gXr8S@5JKUe&h?p)dp zQzQpv|9Zvr~P5Y(@Zhn?|Tt{TM=HyLgHy&M2zp^}6u_}Yu^=RP z8-F?_VH67`jF7OpeUf})`HMFUF=`uR?sy-n>2I({3WzgULu~tT(A<*1dvb#{vG}*J z07vJ@E_G@tj=)^HotwZ&_|en7!_7$e+}OVN(AnNx?7y?QvOlnJI{~}1ySRVda%cNK zThY-+b9Vw`?Ph0pyZpT1V)*{D?R`D{yKS9^LiY9#?{{qT2lHlk=a0c8mNan`xAAKq-IKOyJnXblp|F-NSso-LzyDukteE{Ltq$yqw=~8{8mp2I`cSk+}y` z_I`PcOA#~n+koToiVG8U_;Nuin}#?%{oGWLEk5JF00Y|sNgu=x09Rrat5eR2R>7gL z+BQoTpSM+Aw3>6PDW~b6qPM^UR}UATbi1rqo_2@=Fm7rN&p(!REkCM`fkICOjWnv} z&R0BDjv1jcQQL~_9?2aFaw&?U4C4LiY`_g-~b z=-z}uTy^d`dY% zM)dmvwR6+ZADiOYBD4eN!Pka`qLoRfr!{WwDosm#r>Ux53cD;}gY5ntaw6BCSi8Fc zebbZ~5{YWjd3~#>96PF6WwwM0N4B&c#Qf{!KrHhOb^Aiv1-)oR0_%z7F^IGa=eCw4 zX6$x)acoRRiumyB!O=s~nb@m)b@j&O>=ybf(=up-y|W`*Xl3Ua4aV0~4I-pAzU=%r z$#mYk(fua~>CPriJ-nx7VFq;0^7d(Nyrs!lO@_1Qo&jdB@agMwnorM;^--=LitADO zzA8qpLJmJE^N{|IZ}Pm^Ag*9qclnQuG0)>=xYId{S>wL5hCR(bf2}-M<`v`2Om|}w z#?vXsyT?=NR`9jHO{q+6hv(4iK?`f9ZB7bYIv10_H&Y}mPIaDQ&wVmr@d5_gU=ffB zEG{+yGe1(Ek;y0dr!)KF=peHXd)Nv72BB{EvU4cMF>871jbj(5#Yl+SDXddR3D2o) zhvm^$vJZ9tX!QO1!+p|BP^{Q^AVV}`iEjV2ihmLz8#uaBQgiOoicu(mgh z)#BYPjK+rB?9qt&ir42pRN{3>9$B_;Vqk7@Ao-O7ZvNB zsTb>(Yhp{5{gk?3viMZDPBp&t_G|>_EFQhN7t9+((CSP;8=6_%o3ki_(JdjT((7L? z=*EhX4G1>6jLZLby@^1AeVJq+LY}i&*h#c98$-^r@C%&wK}|l79)6R##=t~qKp;L z``a?X$<^D)>t*HLQu}E#bBqfN1YMfklx`YiIN8q53-c0UWH?R>_rn1gs4S`G*2DP~ zwzmiyAGC>->y@iYl8*;U^xK^t=@MGxRzO50MlL{SW*BW-({;&AN!_4o1j|=Fm`*6? zn3^%I7&Pl9#N`~i=VKmGH)?%B4}pzb<`j#l@}9$e5T0sCpr!L>3Hpo_m5S$5v=X%3 zaQPBP85a*iL~}6tN9}0=RlpEHV+utPx(UPs(vIT0cvxL#;!`-v?7TfI-e1Q7SUr}m z@F(5$_eJTs{r!nOYJEM?2F?516e5+TTc&|=03d|`T)Nlp&4{-OI*X7=hl#tfgcd+mNUe@A}so+uC_AHQbLD-6zaqXk$~s04SxP z!M;?Bfi#^g!gdN;2~x3QXK}mmJ}msP+k1=^iB*=wn)CjHKUr)wR6-jT9S-&}?r!0g zR9bjlETxo7)z1lK^o7=dz>=Iei(^8E><}mZ1T%`5RdF40Ls)xmCA9$_@*@;(rB-}G zi+Rdo&?HGxhL%YeWQo> zB$x!gfzA@XLVq_v;nKNbj2EtgPkN?24MeA1B@;7wTIaoH@A)`Qk0D6~&$qX2F*(Fm z8{3sDIlY|wL0k2hJyfXLo=n0M1sXxUZW*4B0OVrE4JpiB=kcMYSvMyK2iVd0cd#XJ zvxDo`PT4MA(?mgSI;Fa-LtQ@mJ5CzP(#M{PgDW~Y+?7+>x;bkX0f+|R4fb#r)~}j) zZpT*ju=VB8xU}>=XV^Ak0Xu}vfvw1&Zu|Qpfgu4w_~hY}{rE?)hC0u>9xja7}{&T3B1%vI&z9I~QkH0mt zOI~R6`1pDgCnI212+c^^ahIEZsGUeRH6n=-cFSL>U#`5&&)6mTdi>5_^Ywn8?yjB< z{@&ev?_i;Q|LB45q;A54-_Er1)wMo-58FK5AAPj`?jPQ;K9*R?xj9MRSVxg*ZPs3V z(MQvGhPVgKv%th4P|wO@jig$Y$2^KiFh|w5MRb zjz-)DIq<5!v?`&q>e$}9rM)pa*|WW*D!1P2c$j*Q{J2FGyr147iQ-l%#yMer2>{C7r2XJ{GuJ z5M|nH6#KDoF3Z8qj&1x_-Vey~YCmwlQBcMlejy?)MSS5jZu$y?jNnw|5b( zllX*dR#Yr^bDmSLNSMeSc!xox<#=s|g0@cVWL7&*b4LuQg0(iUwXS|CvtxhDrYG)^ z3?8ID{l5 zU*P_}n@$&|M6D4!aPaFBo=t2%=_@_wosR(<>}TNeb}CshmD(0qmG)3^6esZrKC2iS z=DY-!!O*A4qQ=dn@H-XBhVI=#S=e)s9%*6<6xUL>hWAWC(WwH!ynZ>0ODc7Zrx`2i z?;@e97R1&kFdpUarzI z&eg3YG;k22e5_Z!CTn_ny886N4?Q#U^TF>IbBy>0$(4ALK7D_Xf*1tUl6(}z35EkT zw>YtM%HBRiT|E4w0Vflo>FP`VlE6iT2`$*Wc13>*>{Dy7AJF*QH`>TlIyj@w$TeoE zZRwWJ{7UAS9=fv8Rml5fQP}5-lVu!5+?Oy#a2m`i`;@&kqz67}NrBezj00VcDv8Qy zu%(`<^wXyJ)MnVnN~JI{Cf!W+S$uV_BT}k!_zBah8z;S;MJITv5monjMSNV-azlL` z)vl3c!!S*Q#D>W-6;idz?1*f#J$w0hEU6XskRv~FCMbJO!X&dd)K@K_awXL_j~bpY zBv8&?_4`~L(hFKiS0 z+csuvidNf52HOL&G==-ix-$&wLUgkSxjN6L^@UNllGf%;0*rlCs?zqlZb@ zX1Ij0NDu80{u;%%_6DljLVKRjjN&lSvT)`L#c1HwH8+6lqEkIHN4au&q;#_XIIr=U zf@F2!rwEdvP<%*QD+B+oY&VxJA)_+c!{pXgR#C|$L;`k#Z+)h#=JVF%kYouyE?d6# z(IukD6TV)_>G~O!w^{tCpgZLy7n9bmL|pfBVoUR1vodr5C)}?OXS~OjD*e0v$5RJn znNVqc+q&zIBR4WvBaxIsGI|yZAE;bTd4O3N2WZ~BX)KvIMSLVi#0}=8UmB-b45%V? z7ISD^q|8t`^@5Z1$*AL={$+Wb=UF zC;*s%=WSA{$+`MYr8?(;^YIu}7g42D^@_{_4$PM|aCxH-Z$aQ+@XO2g&PDe|IYt|h zz~Z5_GCiuEDx9{3k_?k%+uBP1g(g}g>4-RC@?@OWptJ{*bj&9Oq*tAb_rAnx>RbQ< zEbC-x%R{!ND165mkeT#81F%p`Y*YLH)f~v|W&xvz(szBz`P(B}KR_>3R_BZpaklxg zIEuB`Nd()U^tYr%YY#~#79dZ#PAD}0tXL?RswI7oEVL} z-Z);9hAYZBqA=img&tKZkWZOox?S&5K&))!gnX7e zx62dD)Y;ZDZ23pcFCw&$!L6cdmOEiA#zbRr_Qj@4$)C{B8#XqFPpO`D0|L^b=2UZw zZ&rbc03nk@L}OSFhmql?g=;FlUa~z&>{G3^n_Oz0R!U$VF`iVHgWDR3f}so4>_Rxg zYPXp@vD;|12eKnbAcRq43!$0FiW>ey74JnT0y1C@Wsz|unNwmtW1uNgg~KMdpfKlu z81V!BC>i;=%;eF%YRQjYLSRG3l6cZ#8LHYLnl%cV|A2+$N}DQ(ZEqeoK#!cae2*rRi1PS zD#-$u8v<7on;0&ajZsg3BsYeaCWibR1uc1z7wXf{4vD&G_^5#XLURj64Qh}}THDx4 z@Ig|S&GXI9@8+6^I!{S3sfLtc7pt;39yV9agMvB_VSBDrMaitA*D->g^!^;C=+yqP z1J2FI>=u>M*=5QsOEgdfS9IGN>JdfLSe`Qdgv8Rqcb*sN!3K=~%CCJa4}9DilJjs> zO~tiYJQmY3r0cewTJ|J$S03^bU(uXj$TqgBK5MP5R%5}}nlwe#h;w3w<^awL5bt&y z*V1`VP3?N7#n_LW9yzMs7%#NSsW0-xnUwMo=N03PQ0~cQmh2ORE8Vz>tS(O4DC@L1 zRnL~bFpkq8RpkVuAI~3z@j*w{h>N&?DSbIPy)WGgt7W*I2%|=V{*Pxr8#u+b=st5u zj_iCIe9MH{RobN|b_m+ctq0-N$*9{6wd9_er6pi3D)OAXk;lSSS+j)DN(McMFt2)! zFc{psNAaZp(31M9@fk;^(DF(6eN6w=Y7W%Fp)qK^W|w&-3lhX8S=wty~i5E^Rs+A{G; zNo7s2JfU!Vq;M9|a282jzPL-8DR!Axntq2q?BqII#B;ZcnY=(vZu?h`=mj)ky088nIP1;^@nP!x4dsd}2L>vr30j?wK@Fpz9s+d9WgJl;rNCj8R-u1sC7NhoR8Pq6F ztp+~N4K?)oZ-hcSTt2nzA6w>zrej7qdEh&GuID3oFoLk!kEq{2xR0oK-!YC zgeinv#rlrp0)2lug4K95_bGq)`6#4%@4_^M`Xyw#WGTmo_k-8RUoLm2x6RwqU$?uH zuj}9Jp7u8Yg!U0cl7$uzSRxoPKp+^0zb+Wr1elV(WrwZ&z7oQAj9uQM$I~c?d;Rzb zJSQXJ=|%i_46*o1E?&UmwBN6@YwL7YH-|l;S2Tz2U>u&Ia|G7C-BL75mIQ{J>mfY? zblc3vDFo*+B|AEMci8v4b6*th{|wRIID-XDmGVXJK55OmX=P`dN}%>twJIs>c`l4J zKCn@cKltE}bL6sFhq@%y$Q%O722*1*>S{3jX zPwYJo5-}VYLfG{FqZS0u{!0F~@#v4Zhr#UBhjmedjF(X+*tB({ppZA6c;@yp`~8<0 znUx;zDfCIl00Fke9I4JK5MUP5;yX7lMyq3I8ud0rZ1#&i1S5vPv`CCh?hZ`B+J;f| z1Gqrel81fZL`C$YX`%qS2_Uln1Nna`a-;?PYvuh*lRo@o07-QbpnbvV0sRud ze?iELc9NdKc~)58pT8r1=E{_7s4geXX&bG`?y?BI$r5bs8c%fF`>mS|pKx1xqvh8n zp-tY>e;i`M{BQ|tNBs4wEJ!XG13VpADzGf6HoFCsbZt^j6(6=Rhk^)lDux%@Vio2N zWq?ZIxqQ~n2QRDO(bo%(alaw#b_trdHEBb5>atj%xa-?&erw37?W^OiLV|J<`rSnx!Frg5P%d{Xe9FcACb#Z5wcNWOq z8m@GrB^xrgvnj*EmSRCVinUyrVs`^iyUs+^ZUUaQloC2)dT~9zX zkolz6nJm=9JJc|Wss~aFrI;dv+{9x+J(|DbAHrQqRxG?^H@(U>c64Q^5r-Rk^m(6& z+!q!85HI_s5Q~54g`?1enNa~MdfGnW!3+`SIZ{}0#2FJfg7r0*tb~J*A>metyK5lV z2!t@tr+$DgTGF9F!7g!zj<=$lqk+X0PMu2e{)~}ENA=E$(f#P62CZ&>emqP~$OKfc ziZNI&P(%&cUfEQ?9-}c}YwO=i4(GieUTs?lpSNAq>5aT9(DlOi=sSuV6=Xr8EphVC z6$;~mHWDKxyZVazodOGBuJ^jOh88ddj2|WCIBmy973|LF;mZxb0-l(+u)lb_keADz zp8k99s-Yh$^J!1O$?QL3oO-ST=?SqbhDGaS*X$eCf1R=HTlhPCDuy~sbZAbM53(dJ z(T+HB5Xy|lw(p~ub+xPlY|_M6`^>}ft+W^tncPOhD^BuF9LF2p&PNg)Vb!mw6`u5G z6jryJ-65a;h|hu zJ)WWmktx;aQ1YGO{W&T_Vmz~$Rp2uj)C9;OfZvzDUh&OfBXQ!R!OhC*O_wHQMm+QU z?L6_^6q@Fu>XiZ{ydcj&-n_UqcP8QR#Al12z#}QS24GC`w2E}qK&;3iqU)OAvxXL# z7KPPyrX zkHaV;;vJ~S|K&FT#`I?R|3tC=OTCZ{*_k_=@N$abmMWMo$Xm#IV(mfVf}Y_-FWGY)b9m@OnGP2%9f3&jxoCmp=%HRe z1}3fab*Gs-DQxD=I2Sr=DV#FGH?fSM4#)2jM7jx<9eny!3kK3`DIkQffJW3>5x)Au zP{6|Bzm}9TWVVEcw_mv6-(Rx%c-qI1fxK&?dqCxQf14iqr(G8I12WiDXG0r0K)}Av zJ|smA>ETDMD_1Z|!@*(XKbV@6T0Wt_)p!zC7gfxJ6l(OTxnbPG9c~+VZw|T(VPI5* zCa`V`I8U@vzI+O{E|k#x0O-g{-Q?r+4rWZ8r)IJcI6oGY(lRS>IaF(DkT+)vLQ4|p zk|bS`bkxj|uTk9#xl!asd-uyMOA10e@{zhxyx&TmaGhTlxyg8!)KI@7j-FJaeX{89 z82FB|;6kk0r};(KpQy?pTykH$XWx;Vc1gt*T)5s0NG7?q7&^sskZW}+h-Ov;N^F}% zFM39e#D{uHm+cuxB{Im4Y?)ymUP;c>ED>L}ULGt!y*sjt=$;U)NKBn(n8)39j9CbC zsNfxruiEMLo{u&pJHdHOp-p^f$3`3WRJ^}1_OcIv9`MTPh7s0>VM3gNc+msoxK9I+ z09a!1FBV0AgR)nq*^@10%lGODe#2wv^JS(5K#xzDn4`Xyt(mh7b6z#ecFK-Dtl**x z`ft#*v?>@&`>qUtSJ{dL#X;+OWE5H)YJ6)d?B>D2W9t1r+DUmogOd)qT^vA`0-d5D z)<1j29S5ge9YWI)%|K`GBrDU!E{nFIhgT=wGvXT{_{%5D6?ZLM5Txx{3FDg48;DM5&WtwCb!&z*{GU8b3oO%Hg6NDV( zTu(#4jenj6z}iqvypSCXNvm3#)YV27q*SXX3G}-c^j1Wo(D0sk4nmWn95_%Cmo4Qg z)vDZyUK_Pd8@2=?(p%PMzc&fvVL$ONHJS(ekRiDL%mCu>C2R4Uy(?%5z_>+`Rl5o+ z;m%pdSUUYZiCAN=$reo$O`8q&%n2qP_{E3p;oTc|uIp{?Hsa>WXZwg39RYuIgUA+$ zDR=LwXTr`BWe^BW0^{u_2>kAze(Hr;_306fmrbAv#kXv6&aSk&@B+n{gkOAt(v;x6 z06*`p84$M#@*1vELC}5!QB~V<)H|Cm?(%-GpdG8<>455VGcjyv>3(Jy3A(-BxMN(m zXQA4>8W=+oL?3%%F}`i`^q*ZF(P;XNqGho8WNiyA$ce6$(b@Y6-EbOVox=I z5QX5EHCx*R=w&J*opDwh4RQea{^<(73ARw62|~I)KU@|jS=+wBPSBTed%f&{AaYEn zklwIyx}0$F%1jjuaqcoN_-qgSBv}tbqyHOJ1Ttg1rVE$`a`@V6)(&mCkNud9Grx|Q zy?C@SxuupV)BmSq)WRHUUjES2?$W&%pHaw6%&RjFrs1_SYH%+7{&dZ)!_KW0wRemV zox(Nyd&OG{Wl35POkg7I>JqzAR=0#(g;yNoSaoD;LLept7^kZkzfmkdmUML^obMi=c+5tUtZpO!T_dzl*u}Zdq zbNphVsGZruEz+$eBS4oL=XQW_DOe{j(sm_O1d+BQE3+xaz(6rSDwrPP1b`7RrHDbQ z?lyl&)|wpMA)=Hyu7j9^m?iP`bQrFHI4w~9swR_y5I@vb2X&{b>Ui2&hBIFEMav>4l4(gx&&~n)R z!KUJ32jGD!TZOaYSUQqlWHd9NO%Y#KaB1vcu&9=`a`{@l*DGzVX=H5LMoBIX^`};? zSNEg`-we{%n4sMve38t_VS#8n5UxiamPO%GxDu{s!sh~hSV*%drRbREfErS~0!dNU zkwRy&V8aDRdFbB0xv{L6%x2qa znarj)Lmx)lX63Q#v0c?%GXtTePcg<}8q#nbRMx8m&Pu7-t!IY;uFA9C%yeTltG@Bf z?$m9)xOBM@eHdS(*)rQ51@|1LOK&*|Cu zEkc29RKS`<+>U*eb-gDD5K+46qw56PRaS7I(ngM{!1@^ms2*_+^ z!8iiF=0|%vAyzUoT_elM^t9F222)X&_lR@O+51Q@k?Wm5pk(DxMcUV{OSDT5hg@?^ zhwrXqiPzLDGm49q#U(!8=buq`ddtJuifa!DNbt!nxKjSLmbDnWbbpUgeS8GporhG! zdk}}MG`ZhrIrZH|B+wyl`8$Bm;fiVzin!J;^=kvW;a)h`Hc?-CYM>QM`_{?_*mWFg zYkH{fX!tgDz^*MTK7u;e`6Jz15id!T%*n@x#6iuMY1b4E$ddY2Pz$tW0sx(GB3#H_ ztIKH$)k48>aGl-f_60)0xeoeQGhGa1K=n07CiA-^g)DEV0sCazYVF*DCG~>AnpTgp z?zkICNatu6C}U3i#p3AC!q>q@#k%$TntBB{8{`9!Q9-7c{fg4AdDk9p09~E>#sSH| zv#{+w!}=^LX<2PZKk018!PiK{ZOX%a^_8zB8Xjo*`Vx%>iZjjI=O(MR)%Gr1=d%h) zt2zA?8ITx)g4<~F>qxw@G8ncEN%c3v9xMP|&pWG?<^>F6khOsvP#91J zWif&1!Y?4fu=WPTJp@KG=*i({`XS0Svw(!vu?gr)>!HL;!R;mHXrA2ZQ@hiT!VKKhBP?;F_)hj#0UGZXs*%s)zyH(@coJSC?zEm!$Irw?8?$)rGJ=0ysB=P z0Oc$-k>Fy?Du>sy<|M93Xo0FBpoXdWn8{mdZ7sgz9U0qt)k9WqXHw^-;vk~YAJJ7w zYoVkg#MYj(d{H7>_QH7~v@Fqfbr{~vy&*`*$;<8pl+#>bx2mTit>xYk(x=f(>{OKQ zRJgZll?F>Y`%-0MdGlAT!fDwI4|W|DH1lak@}TlUaLz13uSl7c}t+(9x* z$uJ9PF%hXz3H?yk#abIhuM88oON(!Wgd zn*;HoAW58F_s~Br1WX_BcaE>B#;4*w86_Fg7(c3RwN=ppZ%dQr~)xYy9Gwh(ro zft)aj)rN(WZ~vpf@;^`FQMVhlPQ_^lVU)XwuyOEy;Xn&vtS4lMw50oI$$~f* z;%p7zqqh!34wyHX`<}bA-}^%BE(G8YAR6HSUip4@r~KE7eu;n63Q9;d6||26`hb?r zwNi3a0oCc!a;j09UM~;ww2tvsHoN;hZ&kPI~lQgbJxK2{xm|ive~?MG#(q z%YRw!5m;XnoOOU)(A}ykNFtCChd7SQ525)5Z4ysX6p$ood1ncI3_^^*6bZ5&F{7Ng zo#cz+2DQp2m=x$5HX(@D`gF^|IRi~p$M*Gt^P+O?bQ7b4a_aXVCPMTtuVKG`J4gUo ztmp_XkM8>xpaKbvf-MC(Wjik?F(pbg0sb|IjJwO7hsebs+LelFX=FeTsiA~$41fd? z^v|E|Dg*3M?ED1JCGY5AZzo3o9p={WRLo5| zSY(^Zv6_+$MOR@Drp#L_nI~iCCF7|U%qCi_p5flY{&5_Wj|nO#*>gv1N5oKOG*=7U z$6IUJlbB>YAwwuNGt*NbkaD9-ACDex>@V7Ef|w?{Am6PA^~yCht>Ld>M`by; z?SbJ}ZK5#b(Gjq|}cu9jL$c0SU zDkXQH#G0KwFN3-lf)}TyA^=@})%){WgS;wE&V_UKf=2B&9~V(T9{6C1fm@IPCn(c9 zsPar8C2>*+c}C`W`;cLdZepOEN;Ky;s`+%vTvT8p8H|TePSUg;oKz5GJTH08qJ+Lr zW}qO)WOHn}uqUE4(J&c{JuHJ)V9!9pqriD=`2bo-m@;#aM~fOS9-`RglIEGEo!8BI zTI$}x1UM;9>hn5dHR|?dgp}Veu#m~16Sj+5b|H)9;5A&qPb}awSjQ8x;_l_OqH;!4 zYg1-a5maFv1JBY8`O?V7G*)oaWc5ZuE@cL*q`+h=vFb^U52mWYOX+K#Fs}>w9-()* zW3HrM1ce`0AvnmtNU34#=_819F613K|hOp1r-Tm|F~ z75vwqh%)Q?fBxC?y1N7Xyq#pvXCwBw{E|l2rAZ|eoxL~$Um(ogjV+X5HrEgpyIlhy z;HlG!vDg&DvN^BF43{8Zy2m}y3aR7DG%ep8EqM)|N7aDB10&bNsrTX~(}-uqMuOE3 zPnYz8P*N=2rJ#78U?;l|Qi!s=H;{yvmOw@5l$F5JJqbs3RXTdfXtl}cY1V*(h&@k_ zdwG=uN{#rO)U8ybB$jP!FBU+tTG zX52oI2|-CJkSIoF)AuvD7543VqqwptoC;^c`$j0i|2Tt>WR9tEASILMA?;gqo19J)Fw<%YlBTA^#;@p&QRN&pZTP$RP{ z>4>Dr&7KWsPGjKgHa5W6PX5R1{n8={{``2_uz(<;OJcb0j!eTlC};er8hPAuT|T&i zw@~jEbcQ!M7Z~VxBIOjui_u-{MY&=5Izmd-6jbXQRgg#&ZYy3(@zGskE!0Dl+(m$S zvEym9#;msru!ZLV@yqIHqs_k@;3ih1@i*upJ$UmlnQ=X92+eQ0z1E=@N_DzH;XZe> zoq{Km{9E8)=&dc5f}tc=GE>W#0Y6<#jdEILhaZq_z;cpZz6^A7T6X-gBE}oR)0u_p z97)dRS7ZhClp&faGMBWSD@ohdtHP=An^z!>F=>iRRr+*{nEF~Jgd3L9z-`Q2^GmeT zf)z})G@6yKl(9b{xsiSKsc_gV{Pq- zbx*+G5s{vTO?tB8`k=dq$d zvTy)C#r8lvC`BA#^4Tw6WaA!120|S(XQ`B;$%1~*+vMKG{Iz{+nMq2a0PSQ!pCEZy z4rosl%)5B;yQ$dF8LqdItmkrZDXp=xJk?TTeJD6N$=^`luEG7MS=igKn$aE;LNdd2 zs6o+M;qj2cJyxEcq3NoVa3tM@Stw^wa)_`A7n)#hg-JhfEBqn7~knm?-0iAX~i`X-i@mOb6L z&>@H!Ov=`9MXr^VQp+|b+SyC7DT{47^AA(H7S~m?Y=+lWaf@w=cN^1k63LR0rT z$`cXdCt`rN1W}fC0qom&E>tPUcTND=tfNiNxSY9-N21Gz6DtMW?6!0{i0Gvea&Kz* z1?9IVrK+snVZ+S@Zx}f`OpNLf3XKuaNyGb`vvh9S zr!kk}v&aJi`$f8?A&u_j!J(e48^)tW^ikH7nD{K0n%O)0KNR&uWrsB;z;wasBn*MPi0Har6 z$AV&c;vh{GZtkAXlppi6)AHjgzNcie;q5kIcrP}X{RReOSUA~wjmzG{JPG_>eHi5m zf-^|#=8m3&8EqVT%fyVAd(NwIMHZJAmN3%h_X-J#R z#BQC|<74lt45 zG17v1u|B?I^;zzBhn*cmUvVGiwOwqunWD97(mfvIUZ(qCJ*pBH@pNnac-d~B&?X`d z9`LyQe{((L9Ycw;tK^=O>^TDUu2JYn*^; zap;k(bcAK<#ac)&QU}%i8RggjtBy~D{R-Fu&7-fZi@!@i83SAQ_S_Hp2*eza8!T%` zNX9m6VL~!vuMI_1wQ0HhK^)23aJqaFU^??nZ1qHN+bgeS!om`c;7ga1HS*1r<38w# z)InDF$B->tIxQTGrYVmDHj^5L!&aN{jy6*J%{bwzr)L#%p;I`Fw_#J$?^4AISe2@j zZPa|V3A(Jo$P8;12bExH;hj;CDXc0gBEX)_X&Km27j-rX>6V?)iq>nSG-8Mo%{Qzf zJ~mdW29qr|#Q2RiJixK8%q=Icu|^{?n6D#I%_ZB8=zP|sKXW&|*ULrU@~$ox=C8%C zmZOE|+Q`s~4wHk?)HJU!A$rT9Zza;U4e`UHSf;VCrwhx|t$f9_F>@!x#9{>=qSK`i z{LgQul9-BOsM2^I{)h)`5amn|zCzCg5!Ar{Qh946?Qh;s9(Y-D7T9n8aty%Ox+G-y zdr;GuegBc&-`-Xt=u?E)ZrDh<(B%MzuG%MC+TR>z+I#tzxy#vQ(JZJO{9 zuI3+XF=XKN0ghw)OE}M<3DB`$m_rd+bDCBCoExiaLs8 z3F48`*&hx79HmJG8NqS7!=$E{1QMV|_Yrs6^3=l0w8SDE#Oo_bfA_sNarniD+b-yi zSLe(;kqWiW9QI610F;8yFo^ZQ_;np)Hrt5Nfn3bpBGkhG#ZTCjQ1X|&2n(`2nE}$E zF&UGzv6=WK=+TjYh$9ueG0|p^&~Ii32eNlt?f_@#rXRsHMbO+39s-fX*Sg;O1y>K_UKW zIAj>nkB$$BW$2+x4IQ=(YQ zNirliX0&&kBFehgp?JpP7wLVh-o|v00CED!f+kju02qLy3gtN-qUX{?A+%?g)Q_jE zz&WoyLlYJkN-JnwJS(0x5keCoKEz>w652CF`r7un?5Dy13` zJb>QbErPKy-aCdN%JH1qX_1hglq9Ub$%CSpQvW?xnisPmEdq$l(AA*-X*Yq_jGOUY!PiZ5q>n($nqc^EDt*06epOBp; z3$$e#yQP zL;G8rHkn$GV^m4|Z7#AzpQX}p9A&c}CtNlcQeSBW42f9KJk-$&`JJC3e!dhy~q%~12sdv&x%M#Q}&=&ojy z%Sf+_kc|X#`$FQ}xjUDxYon<$UBq1NBW6(N+bQ{v>(%E5KfgTUM`6dC7^EEf0_NwN z7{oL0Hb3T}Z_(C3Rnl#ADYI16y_Z}MO0H7D5Y9OLyMZG^SI4buOU8>{8+3Pm2f4-v z`7W>VQLA|kof>3Kk@iv3EP_@x1=aoIc@?z}IdI4{BR6F=P6#FB11Q*5&Ds4ryT!1O zF#o|H7Y3`26Fn0krZi)U8VSQSp0j2pSs_q93Jc_P3#HOi2*U-aShBi`SOnP{rfmQZ#c72{TGuBXvlo*VPwzmgQ7!b)b~e9$^>P4t}pE0 z|AQzl8XRQ`@GLpra9i2w^d9|x2yfHO-npoBz8;o zP(|lrm61V-RoV<2COGWH@m0OKCq$!S{LqtH`uSEJ3x`V|n+ZGjO!mx(?@7Eg9!EUV z$jwf9ZolFaG~lmN;nKR$8%$;K#$jc}IoXStL9mr!R$i(Jg$#LjQILdrJ1B&x!4xi< zz5TvO6lsx>iI4QOd6)!}uE4+bl!jSh`JU;W18Li9Ck(*Gr)kDtYAR*p0*FDI@3w0I zP`4Q6oMm_ix&}r?v8G-D+pRo&`8~wGPO@z%y4*^Sl#aU@{ytCTTuSJ-eeFEU%;aJ^)bTWlQ)B%9C>*M- zWmoT(8!Sif_yHEvJ;o}IE4p-@YgHRQ0zLwJ?F0yBtO)@o2l*3A3VMDN4La~II++3+ zH)O!BM~cYhMrQ&;@iwpRgw1i*-0VI~qzS(C8NQgd89D~kfx&*Ay(98tEh1U|+r6Uge!RRHTzQ;|Gh4gY}7Ng)zP_jR}yrgC5W5o_38=c0^nG}ADW;eqjePTD6;b;p#gxzbfk3`ka-rYAxFlix|Rm z`|9MnHBbZ0erxOj@My}0uyjH!_)!_KqMho2^g64$yP*}Eop_n-T3WPIp7<`ZyX&rU z4tt{bII{nbs2p@zk(j!!bxHAh)@rd3?I70tkS6n?09{v9Vt^{v;_eIZtN=LeMv@bXT6348^!IV&JPT!slr*mh{Gx--Cz>|&5JbW ztl*|5&lFC#lmsov*COSw2?~HtU?sjnBAqB~mOuxH%KP+EK&n6;6NrQo_!~uz8}uV) z7azmjmXr4rLs`OTMnv2;y3iV9MzP}iPm7nZ=vfbc5!kYef}(7Fzzp&alwQpQJ#hoo zCKAKW*DTiU3Za0>r(;~x^`M5ym^$NA?`k1PVW!_j6&yIsqqw9Rx@9_FZK_05+4ZZ{ zJ@^M0W7_**v0TU}P+Hwb6es?931%44ETZ#M={>hx)E}O4NvjNFif%&=UyF=FS7)K!%C?=`XnH&B``kQ*9ry|M%pKEz9AJ0Q3FB<= z7xZURpN3Clq^o{Tv)O-mtwyVa6qp3m39qdStv|&suv~q#za6!HyuJ|m{Uayq+3^`H z*!ei?dvSjGv%B^50RI5&>1~S@%F+FJ5cU-$Kr=ljs_$y-VZA-NxrD2TkLYH3Ao$T z(iQGu)A1<-K?b&?Im;%M(^BJ&5q7KWdO4Os2ZTD5Mx5roWFEPChhCnPc-f1_a`YQ^^2%Ral{d)>&m^~muCalj>7tt z1>+o=cVFbQk#Hbb(Wl)aIdI_S#KKua$iTOzJ$EJmFYCu7QQ=4W!*|@P1<2MAC=W2= z{7QHpr-s?+;Ci~vyuS~6V8>76vx>Qe#(qr;8!*ben22gB;&gV!JEQMI1>0VdTzr=8 zrP=wd7L}c%W(?xaM)faUgWlrUb;_EUuo1D9CQZqh6k=;)O|vDcks!8QdnJ-;gndTGMQDR@t8pKl0b3@t`^-rUJHav^C6=ZFgH3Mla` zm@VCUibiW4!riHz}&d$ z7Gjfpx;hGn*CqW`OXzWDCMK(m1UuU`fdV}5tBnaIqRi&*LXlK>Xcjcn2VTe|EEC~C z5>|dO2t;mLB^)^ilTg}$rCw_D5xK^jTLjnz^F+=#IwNM7Fq0Z&yKf+7h7ASht19J* zQKb+BmX6%0W`mD4kLL*^&xN1hU-W5RSHxdF>a^&L$X%v=oL<}z5edh8oQs%(JjResa2QU0#mr7Z4v zaCb5aZNLuB9IhJ`dkXWdoqndFO-;Msu|NLoZA2(}A0OLO^AGLWQ@{IicXYBQ{%%O= zLWHV_xSEkgW@XyBo_Bni?$FDJ%0P&}Y%V7+OcQpxxM|gK>*{f*e zvXwq52LM70M&A&!G5J&cy<%zC`MK#ZILg&K{8A6a9Y1($*wBM*EdYws8-yc!fxXAW z+3`%h?ItQA0gc;tOy{}B0Oydb6JZ(CfErk`>F7g|RN4dCnMQr6s(CF!K8>L!@h0y_ z{SP-28~rJ8QC+Gi>M=E3=h-j?z~~sID+z4^I{WU`yZTmHQYYXY_b!52*`Wb4KRM$* zPeK~RI1);>?{n8V-a{2AED4_3pd$Vgq&fhL#paNyWI2&~miRWmA3f~4ZWgdz2&QGM znk0mMYSS4n)})2IMTVA3_Np3z7)90b^faIBwN)MOZmcK#Mi=Xvqj_3Lc13*Bm0`y* zSi;#nb6qj+P`=1j`k}f5Hrn~OxnUa>M^TG5-Ff4yw2I{^6Lw`3u#fQ)G*6ynbDBMl zYS@1Qko0Ttl5fL}PxX_$AqO5dh{yCJ5OCkAdiAjiciRKI0!z1z@AT(dmT=2|A`|eCd7(2KO)J^H{^XD z;>;SnnK`kySC3QW?YWl@9}Mwd&vA%S2uwUl{(gdvP%?CIM`f?ckZB0A3B@s<7n@{H z#slBKe=kp=&hJW0s&k=)A_1eU7}>?`K12L`L+_vDW6+Z-siu!bF$gp8Jh5)=7Q^H}`UkrF6LIwZX&fIFEoomij9ms8ioaHZNOLZDU-l;5 zo=UtyKlWv>%gZ80O>htud_8@sh2BW!*gVnGWqfB2tlOxy*uuWSApPZlDNH*v4}wq> z0{nhfh$xIGN2l!w7_cPqI@Ta(i;Lv^j>dwRKO`om_6rqqZ+k?gbfB7`iSx_%=`H*- z)075*9pD;!kQznU5L#&9|JI)Y{+w`g65yfm{8w2yOjSsD({G7JAyrL+fk6A`*Eee_ zYD+!l3*Ox|Y=_+NIqXfw6M)=`%5aS*&_!eoB%38#4<^p+g=e%!M_rd3`Z#Y_AT2uhi+2bq{ABk9&vZclITrtMU{%`ioP7^~E8dZ9$9`#Lb8~~G|ybBC@OY~%L)T_9p z_4?GU#qAw<+B^4?O)j*h_5jV-(F|t zX5mls1$=u;@!$10@l5IYsfOwB1{6pXxW`wJEpk?I5uS;&5$I)w4y@u8BsOj|F89Kxhsf9Gr_@zgXIx;Y z9O&0%N*B|cyu+c1yksHb{)XMHrx;0xeX4kUZoIUe_f7sJ4A*TN zBz~@;`$`jzT?qF>L}$lX$Q}Ze9v<@NkJEFYL1mg2iYdL+6J+Ua-wMQCev&00Z)t*_ zrWnmP1#{_sN?%;ZklbS&M+Z9V1`JT-@$erPd|0@fQ_{-7y4TJBrOV`2$PwUkli$DPJ^ zj!j7^%|(O$vP?{UD!8H=z#OwU3k>%-3fJ%6n3O7O$wFm(mSg_Q7>)mmC(+-PS+=TH z4YhQtK&}^)*u7OERdtH}nRDH62O!fGWokAfSYzi?OKR>w(Goi_oFpll=#$7~=bI@e z0?NI(`_gM<_b4FJOyB3FkAKXgaCdj6ys^3E;=yvG@bLz_obZ1ah49uV`4K1H$-dBS znT7geN|6f;krjlvXEiJv)Zn39$6tRk1g65ul%H1uM#bKA^XDh0J5)U0DTj(Hn@6OG zd#Ad{rW>&prJAXAp*$5}P>BmwMtCOr=p&f0uaUS${sQj}Eph+Z8>;fiN_&X`7;uI* zGK1N4pkhm6tBB%r6l-IDP#0G^@LHp_;ZjV~5`A{;oI3NhM$e*TphL=&!WpcSgspvX z_i=rPFgFQ0V!70x4e67WAfW*B=%S?R1%MDIThl5|W+(rfjfavccN3J8YIR)LG`=*MTlmc=VD9ZC)r=a8wsXf9|T%PKh)|eoIkW6Yq{P@M#rc3^)S9PN1k%BP%Ba9*xwg- z4H@lBT0_xPM)8cVRwI>nI7u^?q#-^q=}XT#Vo-7^ur4savi zUVz?P;``{Pk`o$2m6eZZE|`(4RDlo1s%o9njGjUU_}h+KAd_+z>yJIo{b(;E-TyLd zjCr+O^mRg9nT-1T+kl98ISSty#K-K|kYXa|8FS=H5@q+MtxRKHs^1bcOpHJMzi4%s zmjbjv7H7rTAKhH$)o7>pgIcW_?1a9*(mc?Bg$%3L3yh32+!1Vld^+C%WAl2Cqf(9a zO%ZWPit}9DGhqrOd9@iRkYM^JNNBb{yko^Afl48@m>f`BB74Dz%K7@#9@B}(p2;!w z@e$#H@uEUoj=x-WDM<09ET*AP+R|9hFtJNeHj`hq(=ApnA7pepb*YK*$43ASPQPt+ zsWWp+{q0r(4B6OMiWH5|$E_N@F%!s3wWYg}&t0+nDf9Zx3T}LDBu&Z{H#ppD{nIsH zRm~vc7a1L)e$ECLw5F@dg?GmHkeZeva-tHt!N=Q8ocySgup)5FAFP$qi%B zCXv|889*kGU)K=|3ufW$5LJ5rvc_J18PojtcmSu%SIr|==DgmMbMRG!BGg`xrP3fg zHHQv^WzyF)3ASzAvJU+`xwMv0I9<;tArKR)9s(r`ipBsE0igpC+!vi7sH+YnbW?42 zl1A9$5yjtIj2KBO=Xa%Ex?(wSFk)s(--n0sb7NAb(dJm((f?eV+RX{iY@cjon-#Vj z%0VWU^Dh$T8L;vdu_+Nc@(*V#?LVHTwz z9p%?y!s4#pB-rITaK?Ju^s|jV&!$N<{I??qnj{4Ikh#qdp|%7@TOVHDAd(f|)c^Kf zlrg7Hnz{WyPFb)ksTUk(O%gthR|Yy1FjnImx`e)GO2C@3_z_WcH-x{zU9fvN6W|(X z_m>-6Qd3%y;o+~!TcTT92%HLd?_RsAdS#O!H#3iVIakdW{R!CJU`s7*-Vc=eKMi%IMY>uxi~D zuAmOY>4mZun|(x77oqtrifoGSGy}n%&7@Y2JR4px-n-phtuFiG#`NXztRs5QW$#VF zoVCLn8%8f)XbO&=DLuBMQ>zpGuv?zVO$B*vgN&_Aj!bk)Yq`&uS4wtl+5sJRhX6n^EpxqU^gzwPW5+Dos>*IZ~A6Bm< zli{Kju5Ro!IPkdUnVw`LkIiXR@~Ae*cvPsbybdl`j=T2L=-{9&VGs^yB9FfDURw%( ztvNUB1h0ef31A|~`yjAt-+uYkv>bl@_j#lU1@wQeE;7@8)I5bn5S#l{57^cmDNiN6|MoA5|L3ByndIpk$?+Q+kW zkapMd>7=>MWW^-x1Rf&uRyoUu(!AL{QtCEXPvfo| zUn*XKX|vMlQGN2@qFU3Fv^BEAHXf>(c*eo9hn6b}`bPvrW&$Bz`L|#-{H~oo6l{5q(5xvv4BcC`6{^xWHZ;?i4_o-WHrCsXa z&talWP&v_eLY1`2}KUZ^!Va9URB`HUf5=51>My5#7 zLrw91UTY{W7}_%48ccr|5@d4oD~9#}%$&;(gG1j>D^tYs>X%UID!XDY?@t4|we~Lx zdmg{JE;?NYi1JK-%k9m73Ke8_V9^!M&rFd~2fTc#r!P}{bWQ7MRjCG>Tb1K(nt6U1 z>2{Ld{v2P7<#mgy02>?7B_N5R!nzz^hPRi2*GDetor@SkS~l#az@?U9Sd8|4K|492S8GczyU8aDY_#dV3Y&70tN%;Pb%2Ds-2TnnZL z6P6jJHp?sGYzF+wsD1e-VZwZ!)S{wMT_c;;x@^QJ)0cbqSc~8KT%O7b6ZY)^e?yug zi$3l*EN4O;{lI|RgvHofM*6ca*Yr^jmNF|vJmHf(-sYa7Q>b6z21KS*Eq^=by@q$> z6BQO!T-ivPN|RrzK%}l{Xm!@o8rAOd=waBU3;a`HY5tC(S+{sh{8h*b>oH%zV3DcG z$YI^M$i^JrynyfEY}7sLli}ZH8Jrw3oqWXNk2+^T9K9egOqpiY@#AI$_;^%i9^fy< zsQmpu5|M1?H*~@tMF6}fItVex2sil?z`DZV4>5YU;S}W{nY{~+XD|3LG#JKA$jzfS zbTlJ+`kydkpk2w0m;&b|yDM>`{Yyo)*<3ThZCBBahvcbldEsXhovq8oo%%`=t*oFP zPOR>CZ4Ftxm(wEkK|YT-?A42H<9r}x4|%^k85;YVDIw?nkrVd*A}`s2r=ld8>9!U3 z>ifFrTR4&8+r53Eikma6C135SD1)0!;Ip6}8Zr`T)!lBMU>YE7=!@Gp?9`MJ9L*6N zJ+LK?7)%xaJn=#lM2rJ7d(R~CJz~2lNC5ruqUx1lbKWO5XO~^i?B!t4{P2NWCcV7I zl&ayuN@eTebOjhUH1%_}EfN=%ME~%0G#nyhyzU^@nqO=pue{ra{%vnT<|KCfQ}u16 z+x?f$m_2<9NB^5fD|z(Q=5soL7+Z|*tn@bgJldys6N?@c|A7wy@$msAg|M4_4FmDN E0Jo=7JOBUy literal 25240 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 delta 8340 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 diff --git a/build/openrpc/worker.json.gz b/build/openrpc/worker.json.gz index 07740e5e2ccfab4bbc3b6ce6333159c762d09d90..5c6e4a866be993d0dfe3a93e1fe3a320dfabeec9 100644 GIT binary patch literal 2711 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 RUjP6A|Nq%I*>_ob001~kUK#)Z literal 2710 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 Q3jhHB|I`R(ZdrN&0E<6PJpcdz diff --git a/documentation/en/api-v1-unstable-methods.md b/documentation/en/api-v1-unstable-methods.md index cbaed82af..4ed1509e0 100644 --- a/documentation/en/api-v1-unstable-methods.md +++ b/documentation/en/api-v1-unstable-methods.md @@ -27,6 +27,7 @@ * [ChainGetRandomnessFromBeacon](#ChainGetRandomnessFromBeacon) * [ChainGetRandomnessFromTickets](#ChainGetRandomnessFromTickets) * [ChainGetTipSet](#ChainGetTipSet) + * [ChainGetTipSetAfterHeight](#ChainGetTipSetAfterHeight) * [ChainGetTipSetByHeight](#ChainGetTipSetByHeight) * [ChainHasObj](#ChainHasObj) * [ChainHead](#ChainHead) @@ -766,6 +767,38 @@ Response: } ``` +### ChainGetTipSetAfterHeight +ChainGetTipSetAfterHeight looks back for a tipset at the specified epoch. +If there are no blocks at the specified epoch, the first non-nil tipset at a later epoch +will be returned. + + +Perms: read + +Inputs: +```json +[ + 10101, + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: +```json +{ + "Cids": null, + "Blocks": null, + "Height": 0 +} +``` + ### ChainGetTipSetByHeight ChainGetTipSetByHeight looks back for a tipset at the specified epoch. If there are no blocks at the specified epoch, a tipset at an earlier epoch diff --git a/gateway/node.go b/gateway/node.go index 3c7a67196..84b616f26 100644 --- a/gateway/node.go +++ b/gateway/node.go @@ -36,6 +36,7 @@ type TargetAPI interface { ChainGetNode(ctx context.Context, p string) (*api.IpldObject, error) ChainGetTipSet(ctx context.Context, tsk types.TipSetKey) (*types.TipSet, error) ChainGetTipSetByHeight(ctx context.Context, h abi.ChainEpoch, tsk types.TipSetKey) (*types.TipSet, error) + ChainGetTipSetAfterHeight(ctx context.Context, h abi.ChainEpoch, tsk types.TipSetKey) (*types.TipSet, error) ChainHasObj(context.Context, cid.Cid) (bool, error) ChainHead(ctx context.Context) (*types.TipSet, error) ChainNotify(context.Context) (<-chan []*api.HeadChange, error) @@ -163,32 +164,48 @@ func (gw *Node) ChainGetTipSet(ctx context.Context, tsk types.TipSetKey) (*types } func (gw *Node) ChainGetTipSetByHeight(ctx context.Context, h abi.ChainEpoch, tsk types.TipSetKey) (*types.TipSet, error) { + if err := gw.checkTipSetHeight(ctx, h, tsk); err != nil { + return nil, err + } + + return gw.target.ChainGetTipSetByHeight(ctx, h, tsk) +} + +func (gw *Node) ChainGetTipSetAfterHeight(ctx context.Context, h abi.ChainEpoch, tsk types.TipSetKey) (*types.TipSet, error) { + if err := gw.checkTipSetHeight(ctx, h, tsk); err != nil { + return nil, err + } + + return gw.target.ChainGetTipSetAfterHeight(ctx, h, tsk) +} + +func (gw *Node) checkTipSetHeight(ctx context.Context, h abi.ChainEpoch, tsk types.TipSetKey) error { var ts *types.TipSet if tsk.IsEmpty() { head, err := gw.target.ChainHead(ctx) if err != nil { - return nil, err + return err } ts = head } else { gts, err := gw.target.ChainGetTipSet(ctx, tsk) if err != nil { - return nil, err + return err } ts = gts } // Check if the tipset key refers to gw tipset that's too far in the past if err := gw.checkTipset(ts); err != nil { - return nil, err + return err } // Check if the height is too far in the past if err := gw.checkTipsetHeight(ts, h); err != nil { - return nil, err + return err } - return gw.target.ChainGetTipSetByHeight(ctx, h, tsk) + return nil } func (gw *Node) ChainGetNode(ctx context.Context, p string) (*api.IpldObject, error) { diff --git a/node/impl/full/chain.go b/node/impl/full/chain.go index c5c2334ad..433573010 100644 --- a/node/impl/full/chain.go +++ b/node/impl/full/chain.go @@ -50,6 +50,7 @@ type ChainModuleAPI interface { ChainGetMessage(ctx context.Context, mc cid.Cid) (*types.Message, error) ChainGetTipSet(ctx context.Context, tsk types.TipSetKey) (*types.TipSet, error) ChainGetTipSetByHeight(ctx context.Context, h abi.ChainEpoch, tsk types.TipSetKey) (*types.TipSet, error) + ChainGetTipSetAfterHeight(ctx context.Context, h abi.ChainEpoch, tsk types.TipSetKey) (*types.TipSet, error) ChainReadObj(context.Context, cid.Cid) ([]byte, error) } @@ -266,6 +267,14 @@ func (m *ChainModule) ChainGetTipSetByHeight(ctx context.Context, h abi.ChainEpo return m.Chain.GetTipsetByHeight(ctx, h, ts, true) } +func (m *ChainModule) ChainGetTipSetAfterHeight(ctx context.Context, h abi.ChainEpoch, tsk types.TipSetKey) (*types.TipSet, error) { + ts, err := m.Chain.GetTipSetFromKey(tsk) + if err != nil { + return nil, xerrors.Errorf("loading tipset %s: %w", tsk, err) + } + return m.Chain.GetTipsetByHeight(ctx, h, ts, false) +} + func (m *ChainModule) ChainReadObj(ctx context.Context, obj cid.Cid) ([]byte, error) { blk, err := m.ExposedBlockstore.Get(obj) if err != nil { diff --git a/storage/miner.go b/storage/miner.go index 59c64eb41..5308a3e3b 100644 --- a/storage/miner.go +++ b/storage/miner.go @@ -113,6 +113,7 @@ type fullNodeFilteredAPI interface { ChainGetRandomnessFromTickets(ctx context.Context, tsk types.TipSetKey, personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte) (abi.Randomness, error) ChainGetRandomnessFromBeacon(ctx context.Context, tsk types.TipSetKey, personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte) (abi.Randomness, error) ChainGetTipSetByHeight(context.Context, abi.ChainEpoch, types.TipSetKey) (*types.TipSet, error) + ChainGetTipSetAfterHeight(context.Context, abi.ChainEpoch, types.TipSetKey) (*types.TipSet, error) ChainGetBlockMessages(context.Context, cid.Cid) (*api.BlockMessages, error) ChainGetMessage(ctx context.Context, mc cid.Cid) (*types.Message, error) ChainReadObj(context.Context, cid.Cid) ([]byte, error)