From 0e5832fa340a28aaf2aa8ed73d948e0cf6aea5b0 Mon Sep 17 00:00:00 2001 From: danielAlvess <48626389+danielAlvess@users.noreply.github.com> Date: Thu, 10 Dec 2020 14:57:43 +0700 Subject: [PATCH] Feat/#63 add revoke code for new badge (#66) * feat/#63 add revoke code for new badge --- community/community.abi | 21 +- community/community.wasm | Bin 330227 -> 342089 bytes community/include/community.hpp | 30 +- community/src/community.cpp | 489 ++++++++++++++++++++---------- package.json | 2 +- test/codeProposal.test.ts | 509 ++++++++++++++++++++++++++++++++ test/community/community.abi | 21 +- test/community/community.wasm | Bin 341384 -> 358658 bytes yarn.lock | 303 ++++++++++++------- 9 files changed, 1099 insertions(+), 276 deletions(-) create mode 100644 test/codeProposal.test.ts diff --git a/community/community.abi b/community/community.abi index 512ba4c..b8ab306 100644 --- a/community/community.abi +++ b/community/community.abi @@ -553,6 +553,20 @@ } ] }, + { + "name": "revokebadge", + "base": "", + "fields": [ + { + "name": "community_account", + "type": "name" + }, + { + "name": "revoke_badge_propose_name", + "type": "name" + } + ] + }, { "name": "setaccess", "base": "", @@ -1319,6 +1333,11 @@ "type": "proposecode", "ricardian_contract": "" }, + { + "name": "revokebadge", + "type": "revokebadge", + "ricardian_contract": "" + }, { "name": "setaccess", "type": "setaccess", @@ -1429,7 +1448,7 @@ "key_types": [] }, { - "name": "v1.cert", + "name": "v1.certs", "type": "v1_cert", "index_type": "i64", "key_names": [], diff --git a/community/community.wasm b/community/community.wasm index 4987733d65d43fe74214262a0d6066bcb0fd0c75..1ab42b8c391a4c0927acbdccf42806af0434e1df 100755 GIT binary patch delta 39967 zcmeIb34Bz=(lQ^%BH)?1!ECmED-0u1f%|<{#e;PG1oqst(#ypK0HoPwQeROJYTeK0J7+s~R-%k|z z{eJw_Kk)k^{{{C%`vPWN0E2e?o19Dm{W9^lbh5WD{v?=*_+yqby{5}>vw^H)MYmus z7L_Uj%%79*iVL{>dy2w=CziQ;3>?_^Dc4ROa}#s?B*oe&rk4=X@Jq!^W|X`CEJef4XmM{^XR+!s9aA zns4PTjA>JzuR9#%RqFC{hl35P)Z%X(3HGegFM8?`m+6YLJi*D;t`54Z_U7x41P4~l z<@=5Vld4tc6AObas#$zaVX%9(#(e6L;KXWg5=g`9M-b#yzIubf3W8^A-_OS#3*KL6 z5dyjGeWPZuZQVxf`(RGpFZf%>@~*3QiXjX(Z!nI}JR1D5L3O_CXx_O7Z8#CtwsHOX zZx9)lyPD|aOR!?QB=C3<=Xd$f9ahwZzIRSw^mU#3DodYYwWN8UFoN3~H>|2atx{HO zXP*bz6`;oId{bXgdW$C4Q0<;+(!SEfLMk=dD%ClZV@~lG1rNXjVZek70M(Ze;N4Bz zCn${ZoT!{rm^Z(vR}f=1G_QjoFXq~(7+-TNIJCvh?1$jm7O$}%gZEzd5OL<~>sqJ1 zbxc*(WpV#rml<8I6k*wQESS}@&-F_|*X=&;k8Ydb!q??QChBPM)?i61mzRl_yd^Sz zUFgcL>2mpm|I0wO{~R0SFQ;>yC=9M{xt~P$ssA$y2De&BLGA0`Ba#lEE*m^_eI>rN zD42XhbqcP#VKRT!2yVNf8!tKht>-cCjG9<1{wG=_QvBR;gL68rzE_x z&G!_Y)D}_b$FDd07^y@;DyuC!tQ48S4(+3eBe73b59YM@>7V6;OWN1*jHBvXuAo0V zIT&|K8e5lF@s@Z&#MSNeDtj%sxYG;l^`O6VdqU_PY}`cQ_Lq$c@~%gXxR^DV~>;0c{_EX-(2f7(QRO_Qh zs9NE#X{pR|`OR!|6R5(kCiE-r7?X2%3F~~|7L>D7WuYoIsj?_9SDg?E!6CisQUX}l znZoX=tab2gFOT!Pd@vS#dZ~AL#DmSVuL`c{P240fN+Ny3XF?eqnf*0Ywqu`iN<@A7 zb|6+PLNM=mUR=KsM%udLqSy2 zg7qFHrUV|nj~E&Jb?}W;M3u*1zm&LD9Xh7526M4_O`w{p z=EFIYi89ZSRzz95A(f)|Uk8JOhIQdH59KWz7EnMpj<|z>CXdMEdk^J(G2%}{t3zE` zD;Z=QdEL*>1?!G_fxp6uI$z#~QJga7Z5};RP|4e8-XHvC>@oV8JMEdgM&s{b`gcn3 z@RUdLVkZb50_*=~Q3&j}x4M-8TlmiJDo)tqa>HOb?}owh4o|rwjA`2Y1d^9K?Z*;W z3TGUlc;5DzAtIj1TQEC}LJ>6bqYp@6a&c8rhwAaj$DfeIf?4ycQ_ybyRJJQvIN!$$ zPslOXb1SdG0(6+WW#kyyPw|6A%#IJZ>4PWj`oBwYOH!T@0qU? zxo0n$k>R&w%{F}erQzlFc3fv*`+_5vO**gOe&2)(4nDj5jZ5RntFbDPT{>A66CAs2 z?0NV<{Qf_S|In6yC;r>^oKJtvy`@5e`QP&=FZlb-ob=(>GQl-8pQ&n{6 zpH*T=7x)HjHyvk=@;A!7c^7%I8BDkJ9fsc!#5o~^%|1E^b2AIyQ};$WOD zN?9m>W$X!R8r?W+-Z9jFpuVrKq>A}n-b8@S<&kvda!uC^gnrjGY(By;eWNMD8jA^> zx0KsCtDG?!GPcz$_T~?YS+AymYf<;!8#aiX$9QbAZ(kZ#!EMa2&p;D61p?|tw8pOVs)JAy&ix%cu0%#70WC^)zUE&3ewCK zilt{;yf_UMcyt zSQEGef5k9w%|gN%Z+ZIo;{Bd>s&R*1h z4J}ociG;sbRaT=ZiDhrNst_4u34PIROUKf)eO|3SZvTChY=!JqNL5`Z+vh{+O65@f zRbRiK|Jj7~h?9~L7}2$t`M+A@GCyHnkNE(}UnyC97#pWQ}WhkQ}0m_t_ZKbG~mE4F| zQYC=oM%+>b;Gc~m+gzlY73qw{v{_mY5mBdWC6PKgYNeBuLQzsG#)Ez~h#Ddp2x^4H zH}6%JW@muJ-NqYDu+dhSn}4n!ty&3jGfA`YJo8N-Lripd=+T_HC=a0oiiZeG@GuZ& zqR(?NHeQY+pI^X{MQg*>KB8%W!)O_mL)w5S{?}H{AHdH_h+V^AfD|LiyFlaA>II`~ zfiGkza`KPOdKZ0DGT4Xi$wS>!ENLUK!FGMYe4eVjj*3QhPJjTXqc0(z%Bc{FFAn12 zEgf87rmu>u6~h_?DkCw%PF4xqNm$Zixu$8ks_dk>N}(OwODeADBlRK^9ELJgd(#$L zK|wzu91UevM0@nrt7uiaDZv#-U0n{#HW#BcdWqhO#q^Su0l_}{?6E4!+KH@6eX0-a zAlia5>~W-Z@$^qc%R>ki7G1H5)B*UAaYQ1sVDx7uGHIePQX;2cg|X>eiX}Iruc1CP zxn$=VQqhP$lS~sih|tj_`A#WTErYB8iJB@|8s-Xpt*S7&f7?s3%mCE|#S%YtYee!= zLW3}$LS-LSv(y|>9V{_VNnLlOD8+mnT+UD&Ax5MX^A+Ed!r#%Ih52nksmd!u3lAc? zq^UBgi5AH>O_ovKV_~+=yv2vSun(lBFiHTRAVu}bSEs0?loEY1>WXfeI%PAWQ%;dq zX?Be{gZmPS1v;9`KBd_mY=->0H1j4e6p`BbxybeEVjo5**WUQp8xg5!++;OlF~xe_a`0hLwx`o#tCC2KwcYYuQt5vn=$pN^(sZb}fdL zky9UPZsem>rb5hdRF{?0SQP@ooWdt?+ig!e%U~?uu2_~O(hyzNFURVY{t_-gRi0wG zZdAQ2K0jWL)y1Gieo&6JrSNz;)||q68LS=utw;tkSZ|8&&tNxDyiO(?PN7wS-6|8x zvkL5>tWlm#XNTmv^6X|OX%IUg8zmc6|WV?^~`Drz^RGH#EPKab#2UA({ zm9>T{uK3H(=Y2_&lY5D1cf2_R;L-ir6fLp}^1J@*U#w8J7{G?Jqw?DUtgh{=$QpB` z%e${)k5EBNuVR(iOnKlc_5#~)_pi*#(O6NAtje}$eg(2SSyBEXS9pj+b{U$o{Chd9 z8tX-nN2@`e2(PQoK4)Lsr>nDljF0`n-cy5h;j(u@Gma zggWdVzWE2cPaSramH9>)-fi&3(8q@?uYA59>#Xy=fuXE?s6Km%eJl6ZXObbbhHDXh#)<$FY8apQ6Xv{_+e`XU_o2{_h zH(_t98L$0Kp;hCK+2xx-7$LoXxh31h{*ZnBn8H7xRGTfctro2QMIkmg5VA}wHjJIL z-)Y4jW~|6IZeZtll@oeSCA*R<&gX&=VPsd}b3;4K6-@s!%oTR^n?N@xtJQ{8Rn4GV zTQ=4Dius~RAcATaY6=ht98QSjn;&K7&1&##kGmNRm8>I6t{xgX*L0<0l3C4ZdojxO zPgsYHeiuIL+4v*tWI=n>9$3UJ2p6rFjc#GyvZvPr&N8W&qIqa>lLnvvlN@*p1ieh& z)qzdF7P5m)g6stPn~>~CRV=qtumKX!FIX)Opx_oASu3aD>J>DN{zc((eQrN@N9{2r@hu=##|m28H2=!A%Qh5bLt`?|7!k&6G=l^tT= z$R&4ZjsNKmc5lX7=8LV0;aikHpV|<~NoS6WliTlLjpWd7EK}y+!BV32cSC(|Do=D{ zWvzls=LVwRH^^FdVg*TuGvrHmu})ygPj|6C6_=rlkD;DA+KN>@b(DXjOF77~@gAaL z(gqoS4||VPVbTU0KQma&_e_mamTa`^+{=8*N(6eayVxmv&i!l+P4`L_KP?d-BJX~H zeZbF^kx>t_w@`oky$4yGvK@1KvZiq!%*m+nkvCo*@5w%nLAUQUF{3zC&Uu(!-BtD8 z+FvuQ_{O5UWgu}I4RKrI2l{V=ct%c}Up$7M)cgS>EH8O#24)X@m>zIh(SEqYmwzq5&*O8ZhrJQQyuV$l&6`Rz3G9 zdyuWOw?E3-D*dVP7^`0fB1Kn*@w|U7wPB4+KK2-EO<5K_#-3#BQa>tEzC_k3TJHb1p2qL$Lyg`uo%XEqMYM1Hz*Hbg7CtxAUA1(uw1mlWVy^` zvgK2(7qsMqr`Q14v9eFI9~j#u4?Y8d7oM=qXIWEcLegvZd5)FB{IJaF#A$+94tbG3 z#CFL1ne176UJjc`Y3*KQUHNt~ekQ*iu|HpA?bsPvelhdf4-aKWn1CY6&hvSO{MXA& z5|84Cv1ySF=!Kumisa-vaeUjNU<~sm6p-;z3oI^k ztK2Y}`BLYpg&BOT178@EE0k*fDoc%F_oTo;TmsSB2t?cLkH)aZm#+TlH`r#j+uj(2 z^e$!NoH<+@bGZ92jp=iF<(Qs%lijKseBF;&9tp7RdR9RibJ!?3aSm)-uSv{H6?7Cn zf>ZBIVwuJc7VnmU?aV7X&Sjopa58(E?UV;5vvP+vVcvARl^>JcE&1KRJVSmyb+imH%h?ZRCHA0d2|F zVxzTuaN%cJrv-mj=6=XV5#P?|-$8PQz%|v}&tpWw9@V-npOFw19~b6dJy|$M_dCSf zguP*)nD|&Z=wnvhVO1qrY99LSeR5VFYbGn@!iUo=brSYd!Wgze9-Yt1!A^9W&u&C8 zc|P2*1EG)c3ql`j*ntJC;-%H;(@)r&#PY7{ z5^B8^9p3V9HHUxs7E|M%Wvn(>XE$5UW-zd3`!|YTr@v9GY5g5Q27JrzBuS!yD@mHg zrUED|c0`{2mNj#bV4bN@wp#(WZ9@px*%gG#1}-=qmss7Er`KZ0bv|bguTq?Cwwj$T z$rqSvS=g1QN^>o1;5h?#lwomwO+L$zbAM!a%Oz`BrT;`x5X7h-nMd_!(Dr7*+#Eyx zw2ln|bEm^>u&IVRiZu^OK zmTiAx$mK2TQ(h8Sp2M?fn5z|X8kM|ZDi9fS?@Yq*d$Wof-UTEV&EW~ zQD;|Di=l+w<+06|F&|fsX4Y2riencpbP<@n@p_gyN5mQXk`S)uB5?V5eCKVoA&88x@{kuM%)^{pWVr4Y?i<6 zXFcVU2U&8YoAJwL+3NtSnC$e$QRHCK9B`CbBqtrfI>j=XcnFGg;sATm0*8favji6M z385`|pmk|ff66rn*>z~LK-K@!O?Fu!d-;MU>+nX^Y;Nm;RI&y=3NA#kDZeB|15zn{x8-7Tx|Cj8*RXH zY&pve&d!Y6&QFpTwu$i!c2@qucvj@lFN^a!)iCt)f93L~#rGp83{}P`Xf^X!$CtkJ zr7EWQs`47<3i%}G->{YTbppr~?i71~!CQ({&<|H%8SLQ^F8VSLUxX?SiRObMo$*MJ z=$H^lhWs^#U(3F?%g6H7j8KMpb4)UZo%hlSyu2(Q&$r6`aXf`YhA)4jkhnzNM+X(; zxJ2Fzhzb(zhPg#Bd_{})X@)KB44mFfMt3?GrS<`<|k zc){E1vHWXW?Z;AiSH^R=T$RSXv}@!@8vlg|T9eM3Qy5>CuOvs|P$mAL99y23k(;vk zlX68lKA1kg>%*+&FBb15mt`UCi>f@$K3$oYV)A4r&vGE1m94$JhMixY=c@4$;bKE& z=d1XuvWs;dBKDH~ePz^K=J+BI6jas-(wOXC3EO!bir6q4SeU{ZCWQ?r40nb;KFdZ( z#IKepzqMVq8b1crk_okVZ^H6qE&e1MDUa6Tlh`Zv=-M3H#9oy**W=Hy*W@?#`2Fm4 zyK;U0wVQAHLz*ueWu?&+BAfb$yzXTqjl%j(`TUZbQ)KO%gxk(}j+eoR%EsQCS{Dwc zZ1{nf+xKE)dks8;&~6?ZyLp=Z+pwv3{&cZVPqwl z*OgygdI%Pkg`TU&COY#4LmuhM+wd0+yXhVL0Rc1k_FYhe?c?v}&Bz&#*eF+BUb{xb zvURfXSCJJw*GuiqQ?tfvi$r47O9pmIns(`}q7sw0+{?+6wzuBP)h1Pm$r`1&WxGQK zM$3P7=lw{|tNK8cV`PoKyn^iBgKwp8Egyg;FL)Sw`}zPLBWFFt6XYGecyHPMLH;cP zumJ$5(TjWSj~?RFltK|6$+D5BWnUgE*F9W}ij9-6Kg2EjmR=B5IQx73cm+Evo6ibo zXOhS`6QY1kpls!(9KaLpwf%UVa9%c1rPxS0Njf{~F|M5UKOaNuepB`v%qK!;J&*I+ zp0J`Q(O!uHs)2}oY6!}sF6qLNzPz<5JmV`=z<-GCN)+(#QSJ!xkr&ak=f?6jo)-=B zaNV-S9X!L{GnOal8I^H-Y^pYcaW!4%M1(1nx#RiZNXOy3t5c;t z=bu4)k$^nTUx1~ex8-Y+H{rv!+22auo3VFf-HBYyeBU^cw`G&$=!yJplJ%j9{986z zE_jo_Q4Twgu$UX|bpr|JX|U-+P1Cr|cV&;a`2EeMaGF-Nkc!E>P`5!ovHpVMJ?49~ zOImIE#6(y(ZTeBnUvKfMY^tpIHoBqrWskS{RyNIU`40b>vFY;IB>oB(h60m$S@waP zIGJ~e#q_zZ$YOb7GM~-fwWs9r!I$=7YE9w(GLgGVX$_0oce(LfSsj^?!qd>mRmCGcdV_c-NWgGlqO=GVOZNfYSb&$xCtZF4yx=jm*=z58=s ziSh5Y+VP8d$|e1X@j^69xtLI82O-F4%e71RQ6l84ulS<+VL~v;U&GI|f{x!o3W|XR zmNhJH8P&vSZhpiSnHzS=Pj_dAg&kc* zr~~cX$w5tNU&3&N;SF(xGG_(%wkV{{K4wIn@!^6&#o~ihIr6ws25bQ)a1_FA^4Ar- z1=}kte8omXgt@8Cg@`7ju1t}%cG#Cokn z_>`^|%wrwq5;N0f=N-I7bh@r{rj$E)jl@hWixb_MM0UFT9uQbTF@NI~Jx*0*v)_1? zG%Ppxu_r|B08pYDP7GkdqhnHn34OBU7yDRDOT!N^5T-Vqsz{^)DWdQXVDx@dBC>e9 zDPl5f4bO)oMTFZEc+wqVv)(zCIDl1xZ)5=zg zg&m;8NNo8mg`i0`cB&fw=Cs4n@Hdd(@8rH)Y0U%}Xpf7k5^;uTqVI-(0y-qxF&V4Y zOQQ993AIEN_cqu21u&kYwG!+O(F-PVvfVB|FbZXWB)Mc4&uWv;e6b0h_~&|bZ!FaX2&nS0O6OydsOvYJ`(lvd zV1AX$7Q1W?veIUSxSKE zjUl`L?=g>ae!ZA^Ox$(_=5f?E=;j6HaR;*g*F63w%wy_KUiSj?`0!4C^?%Ld|7GTp z`*Y>NJ-pT>J>a@~`Ca6ezqXgZK~~YbPg%t_`*>?L!Wy-o&$*^}9?`E%3E66NKIyFj z&$jx_b(?kx_mJO12_-D2eChzdtJqHzC9EU-#Ol%ARQBAxGUFh>t0rtCte%CbhKLC^ z!feIBT?~69R?u;`Lt6X0G%!@dd{E}Dz%v4?p(GO*i@z`*hezsW{N z`DfIP+;WV2OT%`ftHZ{>a7R$-cixrHJ}IC5ov*z#m>oFAcQ8J}upd0Z@8$I4tCQHD zn>5mZKS?$6DR0~yiP6_7On823FFeI-G4`q4bDGz?q?GHNfnyCR-*tx9(Bqw^GXKn_ z2S!&kez;Hmeil=AsB_>Pf4}5Vdt6^ORtQA zJ5QuVhmJ2%XyPv%{Tw%rCBP|QIJ^|^UuZbqV>~(dGq6d8oV>XRwS%94LqQZlm}@A< zBf&}tj%kw?NDQ5LiT6)1vaLkzUaCk)uu3)K{c~}6Lw(o&rTS3pV5+D-MI7EtlYn3O zE;@JMD`i^PP!sPTj_vLtPnXCEh|vPXMxF^6P9IPU>;zG@$VEu`pc~HlfJB@RD2gD$r`WLA5)CiDDnH15 zi2w=^ls<-#41VJa*i1~rp)38n0iC->akPN$Cc z3OaNZ?=M1_iLd~Q5>Lmg^v{$49kJ5bacC>c`3X0PKA#YaPQ2^NV2sm>XRa)<>G&Cp*{bdafsL0W-H^fZXo z=OvO5%SQ!Z^z`TOc?l(@rKI7IRz8IavJo%BZ&hjJNvEMld3`!Ue>AhN)#oEB=#vrp zE6z!%lM(S&S!j+%2B|dS1r9QxEHbjqFL`iYn}2%o4>h{7=dlnZExv=S)7F+gN#fOHL@I}RtJX7Ic! zow~IMUi*@0>=NR#J|vN(M=<)M-pUWCKnM(b`N4b~-Jn5CGR_`gH-945!7;$bZhoCB zJ(~_SXLzx5uu^C?r+P@U$#gTa;6i8bhIy|B?Wx{CTTun%e z!7vPXp<`765+FmNv;-k(hy@HAwbr1uX%*Df*Q!Y>j5ukKvLv9&q|N&Zn=euGy#NFO z4=O?2EQMa#%<%d&RK5s75!r!aFwGQ)xeGx&@j)>Q&5l|HF?qS+@JOkx;*)AnIOLioX!QH(i;=6f3chu3nvQ)5l? zrW3KmVStd1llH(gsPj~c7Ok>@c>g-2sJWZ?3)I(lIrYuS$(^|YY*6fjb#nBMCg@Zz zrSxwV6|0mFI^jzxp?gGq;BvZGsPzyg)G>w7I#i_)y0-*{P@T;4bPp^F>D|TD?YzVs z9&nVAvJp#3U&(b)1oe{}FB#I(QbXu1BIm~$=ip~y;-}sSg#acL< zV}3a8VZZd25+X0w&#gdm{MoQmLn-Ml!U_0OEN=ADD1o>Ba{>! zh)8n;?=!#V;h#&L_Ly%(C9lM3Gm4oRZF z7y1-x0%X3a$?=u}i@GZ02jikc9Kb2CFb8yplxk65L`@ne^;ILHR-WojjI+|UXow(9 z#$3%whm83K?2INOXS*e;Xr}8;&%+o7j?lz5#Q_?17=w=LsN*!@m`R6g!Z94lccL z0twVp?G;u6IsSzd!YmdcqzUAql#339`;c`TeOwsM3hS@(!gMOkFr^B|ateW?fWSwG z!5!!c4)kaTI@f`oLC|~QZ-#~_3U?vAUZQ$0LZYvTLh8K$9iSiEpyEndgj!g#1bV9k z>L3f|zq%;DDFMI<(w|1Z6P)6FQcDUis80bKC}^wg#V za{L1O(3xZWlF-VHo)@8&Pz@Ycrw<7bFc@6m-?`AOWr{>Aflea`vO9o99#Pj-^(Fd^ zk&eK0KA8N{&`v5H87Gtb0#}SmqaFlg;AbvBV?6@e>Cumc!M+)j%L@n{yq)S$$O%5fF{s^GPQ_R)Db1)sf{y z*g^xdD)0~l3C6Tk5Um29jw*sOns|X$RkBFfii=I~11%MkDBltrh4Rx7Ix45oW7?&; z&uGMFJHu!HX;`OHRRb_j9%Ro^4ZR~6i_?-MFf5HJCQym+rZBTXy=o~O0o6+&U>_VK zEOEd&Qo<*o*6LC)#4%jMzvL)t$`bsu(Ph60$)A@kppff@3JWvt={_6=01+555dm0! zfK}5A6U7yx$)A#cP|OTv7Ja4gbGH6TGdtL1))LrYcEJFb4~t}2hoDOc1SV@rSt8&# z_*63*zhX+L4KSd^m7LEfQBrI3PY`<42+wEQ`)}fCa~#e!Lm+La%}_o_VXfNL7RKWW zEgnF%6a?G~6S|jB(=|C@&|X_w#Dn0#>Q!15W{`%#Z&k`PH>^yfFH|O_G+IMZct}H` z4Uirdd`Xi?TO1XFg9p8W?y4XY^`|IQiNst(Yg-+i*hGJ9snkrNrV6213UkH9w2Ybt zc-+2N$~17VQMNjprpf2bF~%4$pZ>Mkp6}6;6Wv zr-d>v{03$JVWo>(5k>`yMOV;@F5ZaH%U#%rsDq=siqH^SVfYZ(ux=?`UQ?nKAtP9Y z)k&u{Dnya3$Z{)1r+(C;5rQ({-{}@*gjy3|F5j9KqBY@ONtZvuHb*okApghB>B?G@ z!mL|U02N*N51JE%Qrw(2UeKKWX=_RdIIRhCzpypEeUaAWnCfr?`d_vm)Spa!SR?{>gMY`>ag?dlrn&Fxqv=+L}OBs+E6P?SiO4tv0z-U%W zLwn1WOAIR(LPT9HHnmWv83q1R$AxV@@Cbo;5_O!~wHr-8wQDz=e!{gQ-@4e~tO6z2 z&BJ{H-3snK0y>Qq$O#*eYD}s(r(zuZ8mYn`Acrx*uL`j6vxM)s7dIW9XP+W`N6>PC z>sZKihu_SloW*OHr8{%<@MM~F56>IuSaY((@^zQdZB&Y)fY3HAzybVgdgGTLK%zACe~umv1u`7kHAgVd zg?!2{@TfBMRvrsi2w=_t?!BtAS5O-=ywFu_dm_stX!Zr^@b75dXBMc_qf|&J9Dj4e?tyYbvds-Ku)+rWKjf>rHDw3Hx!YY#sY(`ayU|2 z&?=&v#_WYmZ5Bj}#8^EaTh9Dg0uGOT4K??UuWCt=LMZ86f`VQ{=hWW8fXj!`Csfv; zRqv8{p9BaJ2WkvC4hE<>4bjen?WAGbXxMJLu}WU9(2_ zCDCRy{9~!{v8qs20AVytN$}b90euDFjD_JG#rvYD|HY^VJC)Q>7(c6G=TPKGm}tNx zCK)|Y~uEAnVZ|DP!JFqDYAHhBahM#rt3w!NCd9mY@=7u-IJ;k^drA%QtwtGiI{?0t7p|!?{5!GH4x?3-r(_n|QDP3E?ihh3-K+SmM+B&=x+j9ji^b2K z>Rt=qMTl1$9mB-O784(v^2?qen%<&^03mk zDbXL3qATUrjR&NK8V^((x+v%6vYQ}rl|WTPGmbKUxR}DD_7-%YeX+hP&V${>8oyWZ zp1Q4nrtwiIS+@xo3rFL(fsG-JSH^`D9)oAC@Fj96c1AhlW!m=%^Mc_roEs3L`>QCw z9xgknu0#>;k!v*PwM*%arW;KavraJ;Hoeng16u3R6Nv zk=KMqeh$U6QrKsAmhzeOpSVWjHs1=AMRiWUr zR#@9lVk*o#aC)Q2`HA*M#aXd%|7qZ-)eCOKf55T$JHG<+@UYk9n*2u`3w06YrTvO1 zY+U)zITq`*mAR~6(bjQF{$q~C`ir&a|2h``bu7X&_y1PM;wPvZbv4Sd*nr6YamNCy zZ_4rsCWMVqGOR*(y@@ItB8EsfbF~=A`7dE z_8FJBV2E}qOY;VCqkM<%6W?vO$rfHFr(Z3KPleMt?(*`wzTyVCq=wj{Um6)COVtwg zCHI#9QcLvL?|n?~R9kRtGauhx48$?oLG6XQmMguUzk^4+ohg|L83`LtwZ%ZmEp#BU;E!V{yq{*Bj3h zuVv#li%jQgz_ar0TB7=;_#^*;XuHc-Z~6CN`dcO0T2G9+v?9^FH&-N#j^_&_|Al=Y z{zBVNu2dKn-Oc7|*~nE5_g6;A5xqsGnUBf4D0=g&nG2ID*8fUU9)}{?;ue0L9DI`~ zXGAq~RSk~Wn{MD%>L|%-innze{r{;TrFEB37wh3d&i3*1_hXEPiF>?yvfqxmTO8ti zGnYf=u(G9aAvb1JoN2=a`=xcCsLbCvV7IwX;O5JGIrjl^oh`eIbk3GgTD`xs&W4?Ku(2cZAgrT9$rNJkS~A zagLWmL1b}wv=W2hA^5fxzWY8NjTkBzq| zbMwe)v;O+&=T^6?A}6n3JnhJ)Hz}%0oF010M9zLvR14r74K5^6JJ%H6jlhc~0*x2* z2Ig+y%~E(H9!1f#%MaIM`+mdQ9nvT0ns-hpr)uInkwxOgM z*!`i4nt`JBpr{I}sOjG?Ucc&anC5d|{<>w>A&M#{ZE-5tIU$isqM6?1JAQ7}C84}7 zX)2Y3)ty|Yq+FDQF@Y`!licQB6jWXn6o9<+J1n7E%yb0iAkV=&F3#B)Y!)I(Or;Ze z*jkZ`km`|(Re@e1u>N-FT{?o2O zb3bt7CRyI?!Ki3P#UB=BsBm zb(sgLOsoX&b;{g}GN~P+Nb>;7D~s|1twx8Ngj2+iCywvjxf4yIOMoDy^EN2Ne(jj`vxux@jp`uP5QhS=;Xt9< ziyG#JYM6@}9s#ao2iI3xBRePH*nk#9l)joJeGj5Qyx1V@rQOiHWp7hz*t!_j{&xn%zj>E1PVh1V)j%?2%Ezd zb@K@aHm}chaLfgcZVnFItYjVs4pdCRzDk0}n?Bf2t;!n?!ACo=SfD%s(D)E(#6TQD z7_AwIbC=*?QHY2l5b+0~aZpPkrnPiGo)N-wk3w7k;DsSzEFG#w6YBuaCSaVhnBf4= z0PwaD@HPiHCIn2?D~svl8BYCXpnlyQnz5{6o&*`u4)AfpTn_Ec!CVN;6GE6L0CN$5 z@s^8b1_5V)84mDp0O#m)2*OYM>;D8WX0H`+0Gm&+a|&{GpqB$WKZF{~z2;wl#yujM z9Yl0_u*0Fb05msoXl{~io&sp->bTQ{w*suNgSQBHM~Co^2Hw*E7I99?eVY(xsawzS z3#-CFJkUXm$uRQ_fU&Tl>qoE_>gNzK9I!bd%sIe(7QmRISHL?7*o*Gc0p14Sst)3+ z5ML=?4y%UdLx93Qno2JD^lRcdasmH*O*Eyj!Rul}LJkfNsCj1GD8%H69I*;_g%u7H zKDl#<*poU*@RsmYhZuP97q2L`LD^=GklSAnLuBq$@f~|h4){Q1$&v4iL#c0H9Qd_q z;zoPKTeuewmliAN)o+XasV`g{di6VExc$U9@fK%eY(S^8tT!$SNpzE66O_|tiZg5& zp|)g`d7_FuFiR{;9e&YV_BYu2%-BoeI<}LOJ`$5tU%oi>t#d>>_0&r4Trmi*%G$~E zL}`{f^y1LXJ{C7I_MW`|OL0UFnlEmWoyUokDDslPv>)b+A8?Cfh+pkwsZUVwYZphg z^b^sD;W|AMh5hSGB8kb`pNe=nAz!4(?jwW&+h*VXsYo(du0}cR3sIQ$?nSYMST#kC zUo4i(A$fSru0y`KnHiD|6UiY0Kh76lkYWs4A{wNOREhz!3pO9bVxHR^DeO;|fRNNz zs1WWbg&?JfQcCfaXd~a6BJ$XH&0UaPAomUzsq&7gq9SusVQC(%ak;X?B(ajc9%jd( z)KM3uT{h1ZwPkBtEMVvC(qlzS#)Lu??I7Z^^F&~pN@ezw1K$uC@|ocxN#64n3O@H9 zCV@)7CAu(-Gf}#eX)c%SC9w!MF^2eyIiyI|%5uZt$4|78d?N#!8jlb)iQ^BC5Oo=Q z-<~iMtdbADB~s$a{Ap4Og-jj=QYK%Nlu@I_n{x0J4Bns%*N?#fXoMdTqA+zA>=(T ziWf+x+g{X-K4YlZdS0WSyIa&F5WFT-TfXwO@Hvrca^u&cEJaRl63u08cv*RWRi#=+M z_?9~eFC-*hPCpDi{9=#rD3X4|V@;Vqhz`!{PIt*~eh_JFj@NnbE+0;zv=B zK`m#lgSi2vp;wk#L`Kr(TkC~4@=KcRxDj`gek_lzNB%rn`6tmfCQo2H4J&Q9|9;$o#y5!`gyyo^ayvoXx>*c%AWL!^0>K@s>d`4B z0lGgGx1e^~Ci<{9>IOl|@ zE@$izbsg*_wEb#%=Wm*+s9CiOM0b8oYRFepaY@*~En2v!M-6G<9d<&E22oeeIV?(3 z1Ugb%PTVD~rN}=M=M4GLZd@LTeCIP;5t}XtEXT~RPEMASeuj`|?a?hZ|2LF+V$Wqt zRVw32!r*}{y>4Hm`!nqC_KLw|WLxeRBO-~;lz;8l#-YLi%}|6jKY>d`1c!uC0%djCz7T3QPTpMzpGw+W3dJrFS-lI}LwYo}mtp6Z7FYb+K(KhHL>4YneVBq7@?{-NJEcsj{mm(i z3#c2)KO^SjLAk+a#mB6qS(+7LmijnJ<>WACOhF;`)!Zn@-KyTQu%1y~K4KV4$vvv+ zHl9Lw@GL4WyuNmB+Z6!aqI6bRuC&v@wd}^mN)~CKb5S!XB5}9|2ff6wfCkQs`h=-jRtamDcpe#l=xUqmNyOcf?aD9 zr<*>uhnYq)iz3r#E|IyVjX^|1a*{E}spGxUn{1@8`SkGK2ZUsMvO#a|#ibZ2hJ!Rz z()ARtn`QVtAEOCjfFxftjVw7K%NQ$Xl{LEQV&+jXSIJuCjP_L4v*nDf$QLO}54MCV zSvJfx1`^K6_Zd|vEXXt}QTRuup?Wp&E+eTd?q`JmW%$d6wG+IoDTkCdhIrOEm|`ku zu3nTciezf_A(Cy7jGNhil<{87fr7|dUSn*m^AfV~FO=Um(vSWf@@j&TeMT)JOcgxP zXFQ*Ti4Cd(;l$7iyO7_NEi;Xt7pu+T`*2_R+KNUJC01_=8J($UjP+n!p<+V2TAK9Q z)r^(|F~|wK*ESB2ise=}a0U5xIqz!YG13ojRU=+ml*?z>9m*h)VVL}=hJj16FJyJk znnqpvKB1;D+jH8$$`s-3o5eJI#!W z6lveeXk8xe5tU6&82Z<#Xpns(i1?_L(TYHOU1O+MFY8=yw5IqW9k;J;Zs4gEc!rB_ zFn%QwPHt`7%Gf#CF%=$r_nQn{)-LSsEsgh-98tW={vRuuzr|&zRM9uG=n70mw>4fO zve9Ph%KWxQDT;iLU04EbMfNt0^01_^AJ^ND-)yvHc%?GGoo+5W+8MJ5cvO3%8ik*= zH|kS(q`fiC^Pyv^-o8akB?J_b$|D`Lbf|I5xgE5XR1ND$2ejyqo$OC^RM}xS%1YkJ zC`0(EAMh-206y!a+fBR9y4}3i*=R>Vn>xer&9F1O7*WiFRRYz>s@-bLro;`mYSCrf z25XCWkK0t-e*ZQ{WFOtGL?%adRYls>^I(}mvGS>&#sIoS0q?mrlvxj>PKb0IYE+a@KMWg($m{&Zs6M{4%1Dy^9WbQSkaPPRF>+>K zBZXk{`)XLE)RIm685vGS)wXN*M{hr`pP{@ZU<-XzUQtB6yuGKtaUzqtK zQ;19|j!f(1?7>EVDp2ve?c-V^LmoGJ)5n948;?`?&=W>GybV0}2~C{uNkq5E{!bd| z>=!xgNuw_Tf%L1T^%Oi3L|Q(DHiGcwr;LsiUU;!O3tz0>{b^$Y!6*`{Jflgt{~4np zKHB4-F|MT^Y~8cQ2)4t%?>R`8ZL|LjK=PDHUE1-?3%WE!8dv%`?4r{}AdxZC{0(Vp zz?{3oNRf43G-3%y^B0W$*p(XWY{0L-&>ZFY@nx&2`QBK$iIy^xaQl0=2sU73-v05hQ?!p>9 z5<)|}D|sQgoUBrC{wvCZFZlAc{$lSeFn(fqC3x*m+WA6Lzm7`uO5IQPlEwoR|9jq5 zmWA_hul6ldjbsch!~CrvKc8TvRQQ;9Py@>km*nrwR15@CS$3bOU2M=&UXGt=)Wj>b z-99$1A-1tMwHuL<2U+I7Y0&J4z2Z&dRXl7Y_sln5lAGT)Iw3=icZ@FyRqN8S#rt3!R2YwXs;ZZgkG`+11sePNlrn6ZGR^ihj7<=Q5veVo znr^5EWzKw#2N*=iPT0q$8yU*!sXNmcOcfdSfiZ*X8H&%CsT&ANQw^r>EFB*(OV?%L zEbwE8=En}r515ocW*c|~@QgkABXq*xdbhd89x%M+Joqa>4o#^npI&67!19)Cvz~UL z5$}R|mu+g5rS&-^l4Hmw9~*a{CwB7N?R)cJ-9Q5*?!$9gC1|l{ehLDKIWQ-h6tNC# z4ojXw7lg0V7yX?*ampWR$eN#{WnP5MO61pkVJxP^Q(qXJDeRt#hY+7$3^s%!`*#}| zC0_F>^QF-P9DU+T<3R+Qztj%)73!#4u3V>075c&oa?4l7y%E~FXbHw~DEK16Y#HMT zDTRcLovd20AmgpC^@#AIZCtJ9+`Lrvs&;Ux(O1xwyKK2JMO>n^rt<0jMy#y;l~!dG zSXoY9Wuy`~G^>XE4fjG&#Jw7}Mt@YkK$&o!F{_R1Ddp@MJY)OnETgpatT8g_3sS1e zTh_pDD3RR1Kjx=GB`TQh#W0QR!~w=^CLdmBTtynH*qz(gNR;2KGZK}~ZZNJ^_p4$3 zoUVNzg~O}V?T<3N_OGupo5?jlmCReg$)+41I5U-Hm9=erD}4RR8zBN%9T-* zF|nI;`%n=mhH`AxJd9F`7nM@b0H*I|11~3m&i@^brh4kL&1jN74y8~HnoTR@Cm>Nn#fE}+6%JYl)Luo-tXpp zx+fjJ&$t!mJ25wwlkYNnmMazKKlqi)yvr3AXJ0$iK6b#!@x(pSx=WX4&APPi+OeH9 zj~Vxuno@u#MM{1w7kz!tM<46`aPJ4l<-1edE|>qe0y*dyy#M9j%U_P6(T@E=);W%9 zZ2mz$e;mFVUW6|^Zrs7~3}D+6aG~*F`}7ll!wd0$oq)%QN7-BbVO&d(vJd$K9THwd zU;GDNN5c!_fBs?I>Hd9#E3P9R3^c0AoRdaX_mYhuO4j`gzSEMEMs4>CKfB_p>3CM5 z;g*R-aN_YKr>_WpI9~f4S!CSd-nz*Zce8x02>yKXpXkZ)%wvN;Vc_u=Y$jeFyES6mC7ui!KWH{*B6v!{(4-5Yj&Xtx-JD|s;~M7f=YHpaEAC!*fVZ?(xt= zy&vm6puaV^|3f_=eYo#{C!kVq9C5`Zg;NGR9!{8gM7A^BjmobFKuYiakN4=?`yuOJ zPxX6XKwqnWkA6Loci#~?$#6Hkablq>F7;o7A9(E19uHnnz#Jr&iA;;1O@ z*YZMH*6psxPZY{q-0o(4=21Dq?QWU1>nJE6+`q>IeS2Du4X_^W-Txu0PtT{2qX;RL zWv1KhjdAFi^t()oa<}2zf0y?}xto?6cgz(R^~9sSA0uM1hkk05y9qrWvNg(`$#)%- zr=#2zXn$g+2jB5pWmk{8DqnY8=6Kxo`3ooH0{V`<<3~J@2wqyO8|`jNZhzlsNEX9@ z52D=-`N)%UTeQ0h-TWRC8Pm-QRUa(`smc4M2d#rte^ zo}*DRbJ$(3W-i0waMa_CT=?f`FEwf8Kg|4H)_nss5=vHKrsGBM^i#i4*ZLXM*H<#^;{8-viRQ->2Nu0!p?>;x7%(o8w-jvGMOhU z&lZ+x^Q^t>PlC%Zd*2~L2EAY_;Gu1q&BMZ6YgsPe%|7Kj`HP#`6n2VD=RdQr*-^Hg z)m_TJ;~(;c{1E$-onx=CCnoSW*;ammEn|Dx8h(W>W`oMC{W5xs5o~jGbiA3nC$vKn zUv$Rns$P%pIpghKy*58}#yh(D6Cr<`u{msE&S3B7sWrUGDUb8TXT1|sa`?Kl-g>EN z{QOz(L#a+a=A1V(wK4zWjCWP)3Lj?-aE4HY9w;aJED#^ zqh3SyrFTxf&-lgjxxMQD&X9V0Hk`s=F7jSzn8rUV%B|F>11F*eG;Yw~6p`Vyry5<{ z5zaE*B6zqF=COJ9XzG0BT_YHkE>fl5QDbY%y004IttO396reNGS*EKy7?l;6#%YzQ z614qLlUt~7Gn#ZtK7W?l3~@$w_0<@2&R?S70a&J~4=~~eKvm)ce6eY#2!%166OCie z<$l-HWe{6_X^ypoE|$vuTOM@acdLiyPRZ;Ms~Z<_@o?{RZaNXG~pN^^*2blAz;f;+8kE@rgi ztx$31Ia@|8o6T)_)@EjSuCbw>^18;i=e(y|ogyg~cs`|Ma_d!;biVB!(C3Z#GtnE~ zCYgVH*;~I&8YR8j%;DDz@3l7f^KC`m2ii{MpPcueZ@V($mm=LZ$UsSMyGtbO_uIEr z!amhuJ7quXh%8j)>g{eu+Tl7UqP>+f?B27_H6`w(KA+~D)5)zLle~vJ5wpDI?ySQ$ z=C-~w+#r&=bQ#aGya&3x%tm?pbnQfF*3A>`DIK*!RFc2V5n-Y03@7tc%y6vtrgnS1 zjN%}%MaZr_S-f{=w+h7E^WEC>-4}A3-96kO;>>%057G^E@c!{oLzbUguU95xUwfDJ z?!>;yz1sT|&Nk()>eok5TYZ;;^sL9?<&apzE)SnG?B33gB?Y{x6#gxUaN0agG92F; zvTK}?8t_)tt4;-5;|$e_q!+H@Py;q-U zheR%&YsBRCc=p9o1l<+XZRN5^C;p#J0TBcRX6Rpfc6bN7$?RcM;(c|#_)XGPvF6JO@zI7o8m{xXqM zmE7O5UpLU^TOaoJ9-DlTT3@?hcwbFc{YVba-ShSZ zdZzkmIev&abBiIKey7L>@zuKok-K)mcmDd3@1LXR1eJ`_H@~dXtUM`vU*H!E7 z*)Xhc=AJ+G5C@~Pzqy+#M{VmLw2QRbkgiTf1-bPB{$TEmFUs=ZeMWhw@Hpl9)_iJd zRoO1N)QKB<*QxOTT64L}FWk;axvpM%kW%l1mur!VzHvEDW#9R=dYK=7 zhONM4F#4C=oxe6#raR)#bW9<+ZU20k$ItuaCT3>qFLLN~Hi?hAJY^``dDjYeFw0~k z>0dDZMQ2vAc@7%`-S%WmhK@=wKsiPR*&=ugtuq@N*#=TuV`CapWxU)$jg2hIARTMS zE|*zat1KhK8SEIG!Uv!}GVPRsvnE-)XByAY<&Gz5#!v;0A?3qh$er|Nn&g~4M+0m) zXU*^QO)co?o8M56JT_NZfMxSQ!m_v~Y%Efb?G`o}sh_|ih74Cur0$=H^Y@+Jtk+k60Jv6D{sM8%y3n(O7R$q$AV5Q1BTyK##z==HN#cWdK;7B zO2XrKmf<47Oh#JSXhrY<56^H52nKR0V~NWdfw`rzQ6Rer=E1mpOR&yJjtDj@EzfYq z6GLpyIFhQ(8B0R7Ib(cvX*z@nuzR_vAqr!aX5yswl~Dp?0c~XUJQFShCv>1xERx@VbxF&~xJIt#Wh_ ztE;K5C4+ur{qBeKgGp&}6px$+k*#wM=tDD`FPDHxx%eFvD_FlHnS^AtF8bj8`7_sk zvZsfJIc$@&f>}an4rxkAW22A!JeYOsoI?@Q$J3s|L)^h_BhYQ42C$C1!kn?PRVZui ziUqx{U>am$#Iy>|FlrSLaGDhknG?!x1$z&MvL-A{#+PBPTH6RM@ChPg8fm^-NTwQJYj{qXo=?^m|_Kuu8VtgNgBI*)aP%D?{2=66m` z`vndUSNUm+mz~~J@D1_|>kq5w;>qnR8$tY(UASoZn+hXVDDan{BF_)?gtRY7(=?vx zBMRfCZU!`$NSnri7B-{sTWF%PGo<4As&h9(lke{uI77R#{OY=T>17#tF z3&wCRRy8GItzM9DcMYb|I7~)nWSi_6&dO&7>q00aD!bhnp~^g@0HNbkR$hxN#pwcv zx{<;F5Un8xS@~o`FXDAaqka7)>xaHo2~gT;WM)ylA~i*W8rqI!j~Xl}b{3NlJzhlf z1JZ?*s&SFdSJ4Q8aiA)3YAmQ+c!o2!IOoW4#uVpbGMv%HIgIae#kq8w6WOhL~=G{~x; zyBJ`^N`Lp=;cEDKGF8W^qc&%F0FXn8!vX>f`r(Ihx*_b840kY;I*i67ERACggz8ix z1Y+JwHAWg)5i+3SV5cS9V9x+lMG+(r?2$QbTB8Z!7&Gu50c4)Y%KdqIiGzk?=!4a=rgSGB`s>4)}2`2e1f?K z`b|y(7#}CUk7B76NUf5sVGs-Y9q5ae=royBj#Ye&`V10c&_OL)yq-@68Yzu1unQns z#F}-=9D|?8LASKsMKg|P!IcV%b;OkzLZIxR61$vJj>X;@2I;HOnLv$}u+W&lVVapM z1Xu*HILqMAKy7t{J(-;%g5>#fEG7hSB-x6}Y|H%LSwtnDxlSN+O~yJQz*tw5J)_wz zj1?n0K`eV(#Xg+z><;#$92C!9=HD|cujm*tm9>~YGkix<(dbtM3!@R>?%ET!wN8h6WXm02ZrNDi&c z-eZSlqLbZjz3L&?I$1nBDBox)Qsgx!8x^UhEvFhEK?vB$>}euCh%0L|QpUN?=3R9J8<}!$X3MN@kV(7(%MDij=8Vm3hqW zDXcMvgye)Y_8658+{3G}*)pjHdzl?Db85gc6U)}rVn-_G0d*H=kmri6goA~7EN7ei zq&6EskX7oiPLvL{a%atk{%Ewn46F%Br%B za&J@ic1%8D$Bd~=RgfnePn*m)nlXa`sm#7bsU(HoCa|OO%jRqx>UX}CA;@Hoyp_#T z0gDNra?(UI?^8aH$@8t)9G@DmYRitX6LNMt_6k2qYFmYUVRpNXH6S)3l2K0vLhQ02 zWc&7P3@bFZwr7trcG67m$gc6~$Mvc?BiR<_hAnk6G5~O-AVJ4Qrk{jkqxoPb5D)VD z+{sdu2EX2!&3EQ8cL)i@pf38fSo;$Y$?P4n^IdACVs5+(e7qH`#}EhW4cH(b>$M|X z%a(wEp$b;Iut4z??LfK5hGHFL-T0m4-JtKl*@#l_PC1|(b0zNF2{@;NW*~|w8tpas z_+4^dH;DZUIsR_;p8TpSi%#<`u&ky8EtIZnN=13m)R6A1wbfLbJlLHDBVy-k$8Gm; ztCgKQTmrnncb5;MT%;Fke!h` z9%3<+33-S;6#Ff6!zy=xTISKvp#Uykz4#Ejzapf9S8710cS5~Gcf&=P%z2Qd%j90H zqI1j5Fc4H2A^Uo_?9+=a<~m&{&EBjF_z}{F4b({zvHF)?vPEC^j(#-pSb>FZWy*|B z-(&Xc$K1*iEPIsoV5iL^kFYJuPOJPGiTo%z;W73;egs%e4x9Z3v9d&nIczYy!pekW<)VC( zaQXBQ){0(yJcNznvVS!;SC7+5vRZZa6#G-osLsZ+tFlT8t0z5AGcQSP`zWJ<8Tt%^ zLk3f`;aT=D+hL|X$2uz6Kl40m5DST5{^)>dZfU>*{j=v;TdE>nV9&Gf%$HtZd8$gw z;jDffWQ{72weqBV#V%j(dp> zfIKg}#GZuB={J(?V5~qk%7WnXFPRTyv8Gn^%w?_^#Uc^7lXrc@C~_w&-NPSYyJVfQ ze1!SiXzU;1UH`j{dy)J!hEdXbET-eL=9^=ggQJl-ud@}ziF@8)3j+0g?;aU4o;^XY zo*U0n*&aD}JmwR0dF^=iAjqjWf&IX~H?K`#^I2)(TlwikC}@EU%VxcZy72v?rj*&t z8GME|I}l!UEEO?wM>bP2^DR<1&7?`}9;Iqed)dd-e9g%$frFfOlUdccaVlyJ#@2;b zh*hXsgYJ`~CbI`)ASuj(B&iU;-IM1hGk3%mvJEPXZFB6G&M9EzxQp_M$*i(`cna$p zgK=9*&2Iy09yBjcVU0`gY-BSdR`$Rw1-7`RK}e+m!$bz^eU^s+*`jfkxWRM#rm5Sgo79yLty7Ax|!26R&5V3HFs? z^6M4aOCd(FV{+gM)|;Fi-*~@{mF&3uV+BjMIFc;On3yh4$V(=~^2B^NQkqrPi$Z!a z3Egh?2`i7WId>Inhh)|#tfq|l1dh*1-7Z3%*J_Gx1oWo9jcupIw`+iwF7hGGRLfE!%KrOqrUPR zq$JsLBa-`s!#-c_MET)yb|UD$O-1AC-oPC02$8QLzk%h_59|$Vl;4C^ zG1`;0I;*37-zz@J)%y^p9Da<|vshLA?^qRBn_c>QJ}oF!FM1YYg#s4+QK(pCjcJQh z|9DLQV=UQc^f*jC%N7u;wx4AW@T|SE<~i2iiC!C)OG{>t;+z4F^2)t(**R7v+M2P0 zR2+w*FOFa2iE{|}ej%$Cu~~A`ITju0c$8l6vW!2^TEgtzcb*L{eLR-^nZ0(ycr0ek zYo+q`Zz}eY#$`5vxbW6xy($Z(RT=hxZn7#nw^!bK1)d!o((kUoQ%w#~k(3*lBuCf+j;N+_;Td?2FssSix;*P`sPcrrisKvRNkhpXDxn})3a{zdDAxt?4Q!J+Hkczu^Se1e zgm*XMzGQBMvXn(18{k}*4d<)T&4{wRf;<+^?+tXQ1K|+Dx8Uvh~i1|Q3pR5h$O!_upt5PD;moy$1BNU<@lZY`F^(5OpNBw7^P~#GZAZOwKDOWdtUSM$al}1h zD{>d@(Ko5c4^V~pB;K6Tdy@D!15*TrMx+m-nMmSs+? z%9}CS%Ec>NZ$`*hEAd!ay9SS!Nws)ed95msmZz%owbEGyM;t7q((VM*N2&aIIWze> zwDN$9*EBz^%4@5Y5tdKZg2EJ`Qt>|y88Ti1Rk3;;Ir8{^ZN!I=W$+_-gG{ky&)qT^WJQ{`DA1M zg`F?|SuV{LiSo`{A?rUb$wRp!p3)Jw@)cNh1RQ>-YQETl$70oF;`Br98y8F_+`h7` zv~vh>2wkjR1ieCOS9%sx+J#kPvize5uMu?tyIh7| zof|mTbJ37Zdh!nZl3~8wllL=VI*;{&ICsj9y?HZQwf*HOrP?wlLixJn4k!^%sVX}@!sAKB`#r)RU~kGbkMJi*@^dmE+==p9 z26xFt{rNsB`*R?)AzPjq%9G5>kMUcTzV#Y_!bz%7qA)@}GnhYaW<1UtsMmx?BFq^p z=k&)*=fGlAa`ylrA2^toF>?m-y2aQg>m~*a<{uX0cxI5sQAT=)@IyXw7D7^D;6!YKX`)h^#OMFWt4`MgbyA9K{-Z`do91?~;w4A{w$7x#` zR?BwH2(Xv(y(&_v^U;NN>yGDQun`lmoSWM}CmQ53>2@xVd~eWADo5 z@9;M&EWj|qXap)uNlqJ5>?nr8RdT#1e|U#?D}xw!7##p{tdT9|^F?fq`O|#sN&m}@JJ3KWX|iXqB&$4g7Us-d)r)|$bU6tpIknQ z&nH6a$Z{)q)l$jmyaLnWJ8}y%n#%Pncor#Go0Ysitod^*`3$mEI8fSDE`3ipD1%d_ zjRLltW_`@*u&H_MW8RtL!8%xH_WgvXUB7iOh_iRiTAx9isgdW_^0~48)kB$Dwweg{ z!@-+-NY={3+ApzTSG-xw&7>|Taf3{|JQQs7lFx47D(V@wk*{vxC(sT8JxoU_&mOiGcy!8xJ4LFI z%^i!lB7eyd`RhjBy?8*0z!4$q7V)%@dllpdKgcQhyk|Av&=CQ9Kx*WmNe7)=22+0f zLB?(3PgGdUX_HO_gzg9u04si!vp4Z-G)OmW;&-u+WZc($8e1Zle9fzc&pQAx1y^*$ zJn}W~$}mJ4Z023qorj_fj?-ji=rmb2ALtgz5Q58&HpXJlS8e7BI(}5doPrKnT%i=F zGjNDY_z!IrVy7NUz#uv50LOMRDi_ib4Ts;VsDc|7KU06w)VqRF15LrjRk#ae$`;4%F{9t6~P8FaNz-U^KtM)@B4(%F_d6e2u?}U#;zx)x7z$%yPzS1nXB9R9B2csjX<51J81MBc@M9B4 zw;M{@1T!2CZ@G2W=AGZXy?Hlw0T_b+Sp9Us=^RB5crJXlLwptTi6*#Aer z%2@Ivc{$|t#N)7$TQ!=haiO z#aWUAS=3{6_Ib^Su@)n;r|#f2S^ygKsWXM*`rT1Q8~y-BA1NeSi%%3HCz}`Y3OH7! zG{Gjv@8ESlTDJd@?(ov`ECa_uQz*+DIl;ZRBlRg-5=@t4>tIp`Y5Q zVSr5rI%oofI5bg)I*yw3vWyx}W&G`B@xb;*bNSIuUNd$MjB*Ge2(?bCV0Vklyi>d) z_hiclcVh~=Za2NmRkGtA8~~~)E7xFIdn`6yzx?_C@3;2QXL`9VLr{UWPdO zway!TYbG6qyB7J%{mLT$d{o9B!*FTrH#s+0Lh4z3|#-|fB67V|5PM=T!NV~wQpx6gi zS^aUV{{#_zaFb`FQ$X$rhZAmWxaW!}_Q|O~nMM|lw1TY7U%Z?5>9k$w!WDr6bZIQT zKt3BO)q`4D$J_;uxksXK6_8cT01Vbx;hv+y|41(y`g2&LeF>cO?M6P~2K;6#-JgjE zXQXnf-t#oam|8^z7!&yB0RxOONEfL>-)Oln1V?euvY?#m{vy z9Mu_loSxn<+=OJ6z>#)+nBGB40L?_O4BrOnXL$eRtVgT|qOC`K#uH;b;+vpY>k(_U zIO`Fsg?Ky`*y-D#a8Du9M5Id%`i=)52I)t9?~_>p&yXxA#b-eJu{k~iGDsn=;QJC` z9qh-_?h0aAbb4RCzz|o9J^F%T%FI(=sRRGkM?M-2K4_>!^7D1eNdiI6I`yx=0myVF z=+Y>iBN)==}%&+b!s;EQ%<@ITQ zU5Is1bb2OKr-DA`uS*f5i=s7qIDIs*LgNB|()m(669e(rnc?`1OfPtngAkgI3C=In z<3yeE$3PS`<^unBM$s8deab&Eg--c9%hk%XiYUm4td+xal7{eq8K40CIRM0KfEZsL z1>nyCprQtd)c|U#?zA$r%yL$u_kGpMO!HH*SueAE3?}8b`POf`P=9Qo7Gt^qUmN(L z@b!>@Lc4|j+JFG0Gs1|;Bo%`~U=gaBi&OtuG^k*upjP3uDj$n{2}1zhQbAVM&TkK{ zY}D9TXc>g1c8>!A7PXYeqECTjtz135K7H!s(`MZeg=lcZxF-+f01f&;i_r+oj%6#jB1y4QK%CoxBBG0-G)JuN5=V%2ic=U| zh14=QTx3`rQW}aumkB=5xJd;Q)rcgF1a0w$svra2oHo#Yq%%Sd^g!0Cwjy*}oJ)+~ptjH;PNkr>D~jd{3X1_Djp+jHN4YYi@dv_p#rj5sGYbBI?xOIBXWUU9k~F(3 zf=uUOBf}jFuH1>(NR&rBo#9sB<*0F9K!idF`-xE1q$a=}1#})pCrwcamFa^(dbJ;( zN2dDn15fIMHJDLE4h&bU4wuCe#l&T$#y;bvKLt{>SW4^p5;{_f{zm?l{$^!m=6tXR zyih!ZC9*URywTH<(!ez|M3nkLFWgZWo&N>xTT9xPW6!)n`@kWe=KZC@>6ZnDrHxdJ z7)lE38z(-VKoQjtr5K|%R9Df^!pE|iUy`Q!{1Q@E8Y&nb0d)iIftvrx9)M}tNY%_$ z0$Pnd@`s3pXfe-Hw|t~(nkWICnT=vHHe)UDX%=`6m8*`V^DI1rB>c$&ZCPL298*ad zA@M8VB9T%=Y4N9QjSVN>7va-YHPR)Z391lt1O4yhD)jE;5iC>H%i6YL{OY`>1VLLv zYA9#F?VV>8sbJ{%lh!n15p|fF#F*WNR82SnLkiED(8H>2+C$1y6H*FKwgiPwClTwe zXG?jNYT>9_6Z*MgUvjLjZ=*$E$=(wNTd?-rk3|A&N0p^5K!F+>kU?gCE!24WpJoTI|69b4O!X z!Kf(Pi^sc^wNTJ78fXA-&^sW)%t7NL+8K;_OU+p@89~a1Ws<{XLA8xAlqfx`U_an+ z!G%^tg_9dNL)k{FRzM{^7Xun!kRe(I;t;q?a7U3`f-wu}IVy_An2K{2cPgJ$E7R{* zpsjo(gSteX;b#3vYdPKu4xIXU4=k{`qrekq7=0xxusn-)()0|n@!_G4^~2b700K;8 zB}0NFAR1uwVWaZ)V8#}_D@Rl?LiECc#s~RC!tpI5ljX-^D~{`Hh$v^I;|s{C7FINL zHj#D?AR(}EGf52{A+5=$XXr;BAnFDxx=!cq; zi5LuL;rQ}q`a#ML=5(_3Lk(EP!(tuTrWpFKb%fRwmVRIg*BvD}p;YUKvN6z)**^UU zs6d{X#iVxX8Y5_j!2L5yZ&i>R%ame=OTA4Fe4CQ-_;s%n0$)SB)HLUd$?HXp6?1)wN!`#)zWEKs-pm*ou~qD?JG+~ zefkNQztqnwM%NlD0CR(aD*Z&GH`Py7?$^%^|6D)8&tm8DRUAu=$aqjL^Uuna)_4 zw*U>!DYmNf{}ZcvSdEyQsqk1*;cUySW-gq5VAqW*Olt_tZc2rVF_q9^?26L-8>F=i z+sP?P?>5kESyMf(qDM@@Xl^MzVg^==6TixDS&{KMh9KkMHk+$tM}1`kLYBOPM+4u2n{*f+5jG#i3h?rO&4IBQsc<6^7E~9k(J`Q z4Mo%%q*U)qoyScKx}3K0)eL}Cvs)b#u-ujW8-{ykvA=Q@(pC-&EPJ>I%2zzx7yi$t zqY{&gc2=O?K(0qSEekWrTRB!eDH~!dc!VaZg{wzoMkIJel@%-p1jA$LT>1$dsyorPnF+6oaOZ=~r3 zf91kb2d#NSVN!mL;&?jWMjN!G>$Fxtyab8t-Jh2abZg<`fZ<oH)D$Tvq2@rr!-bu^cecVD{y9bLlz zMr6b1f8$mPiu+5~U|K$)#zqW&`vi0sr&1>=(o+|uj4QomfHtuW=y1mpKhm0-5~ z3&H$z$Ml~H##%UO&-6OMXxFr)VARS<>#vq76y{$^3D@fci0MC+l5Z#}M-{59CQO<` zNsUu@j-i(OmJ!j@JoX|G)Q*Bdz~Wud%{v$X2%F*=^0uL(in<4@=~%7M5X7TEJG50h ztS&)wYLrXR${ucn&6>4U_zYA0hnUB8j z5LJH}ywK4Gq7hRG^+(YdO*F>p7^{yfnG{D3h%=t{#~HDoM;C!;)@57dYWq7GL7jg^ zYKSk+f{Tk3i~MnxOe-=%v}XSet&m_)2?+*ScIh7p5P_Wl(FIv-NxHf0ih}5Fk>lR; zkGiD8C4x9^c$ric7qsX!O|G42l)07eiNU#Vb!$wxx;4g^bCk&G8)ba&66jsn3c1t} zF4-d12%d^5N#jbzkKq$=+V0jeO}=W52%dbg2BMg<+P4Q%>w<4A$TNyqDL* z;B=0_`IIpP=h7!Vr9Vgiy06h6=f>;yGtT|pM?zn;H~za{tJ9Ysa$2X-v6{O&K`4UG zf6Ha7S+pGdAs0c#lz2e%Q>IT0$rZ_XP^Y#Qn3)tvf5O%J3dWTB(TtjV$`e&b|Ii zsQy;0+5L=(rHTHAdunB?QHHue0QZY@3g37VrWwmUyJzD`GxcTT4CmW8ZZc1xo6O7d z{FAcPt41}x^prW^RRgzqd@i?*Gg_MF7$bqRwUl|DtuZ^kZal#F_>*$}8%9HxC%=Eg z=*qUs8sm)@>1_Oa;|;pIBy57wjNf$hxA;#+|I2@)4j7fU%kkO9K1&HqjLgZ`eUg-9 zVpK-^wP5HJ#Uk&i4o)*+rcse@?rJHGmel3U=|-V^XpS+4%);?G#ukjdl{v<8WO40u zg50?Q=e(!PH4^DPT|muubMJ%CR>UnOKhFINjYytn+`|7bWZ!wlgT%D8^NenkkABD4 zh0CE%zGE~BJsrguowUi4)#n@inmRcS(#pl^LdbjIP9r-9vBdlzzHfaGV&%y0JGJ24 z-Wim|@|I5Bel=zE^zU2CZtohYnedkl4?dv5dLAdTC?Y(HblGV1k>(#Bt@AUV<+_m{EbxE~EYa!~eucf?0`#(JMed}%! zNxG$3bl42vuVBMWH8c%7_kC15nTF@EEyJ-74JE0DcKm$l=+UERFZnuk?b_D2UZ0DN zPhY2SU8iD#uPxv8oZTWS>c)-|N8u`A<4HAk7`;MFM)wLQ+Z_ARSVh&?d%H5XPTKXM zzaRT8N%?SRUEIBC9`&PwMm?HPBbtjZKosgMpuXZmeFdlw0Cfe8+IOVIPj^;U3A(e^ zk4HX}&b*Y@*mnY_2l2CQNJ$m8flDbC-6kSpvd7!$9MRk)5$6=sOAk^5H-=OqfW6Ig}IgN@;;%>ag z^ao)=#1Mgbh3N_~;o4azjReG3jsR1X5t8F5P(}M0Rzmqcm^Vq~yJbd{)7a({$I9Zy zN~ENGIpEm+7RT^iqvIHmmD9*9?ej5z+TtaojNKxlG^W!;S0qk`SacPFF2q8$9C2xY z<2X>^fCm_M=#)G>-$=}K=$ebDrh|^8Y8n=zCZ+X)BBKywoCIQAimVJS)*^-nCpQW$*h0W20JaHfI2KbRFzlx) z*v$ls(_{G-Y(8M?T6l2?@DxDHgvn*^8L^qu)GwdtYB*M5cyPCDfmN*l)!@!M(SqYA z)CslF;}jB_RHu;eL~)_Uh=6NOV`oFDA-(`pq#PyKM0FTP!5#*z(}HzoIFe2SFRo@) zu=9y`<)KCv?{Z|`LWG)dv88%_iBMHg2Za=>BA{|usPNSXF#sP0DbPg(T2Woct3Ve5 zw2K9b3y2+O0gL6Ig56K8CZX3>s|Ao)j!$AaEJH4N->_%;K5Jh=(3Q}43wkM_5p=gY z5BU}WHGOqUlO!V4hNm(pwt$NOJk|$17Qp8Lj5U`6UPClH)tN3u^D5BX%0iqM4Wcjb z@(9H_9swA39+Pdd@FQb0K2#ri+;Gc1ON;(?2u89vFYag!^UU4s<3ga$33G2ei;S_tUJ)hS)}&5 z(INwMdzid^vGEeovuUxWOMGPPDW+@GkH$C5t6DVCVhUq+KQ+sa8Eg5UT=xFXI4>VQ z0iw_BH4=g~`W(4-gRzERv|bO+H(FDl!kO-k56ZmrV`Cm?W6h#fMgn8w6xYgW6l5vJ zD+X;dM|TfQL-z?v`R8g&@|nM>Dlqmtab!Z;Q83mt*6 z2X@{-$K~dg##p&zr|~6w*>o-kIqVg`pr-CN>c~wej4#-D-QgvLMlzG~n2|uO$T>TV z&v8KoWOPAx*@=&h-#HP`-OkI5?QEijG~17~b*|CQ{PmN@P*M{es|J{30kVuM&A9Uu>*HIfpHl! z`zvD(8|CY#*>;1G&Tz$pPlG#If+n@xoo|#AY%8 z+hKHId%Q(=q{)_5mK-G4UXliw~8hzZO&9OH$$ z%r_?RGT*fD;$RFqcI;&X3o8g8JUdeumkMVE~#`Z-C~zk(nP$m(?kYwuZd z<`n}sa7g*9F@j11deE?ze`zRivdH15hmPqM2Zrb~Q_9Id%Ip5FjS_Xt=-+XFA0fPs zmey2OAx6}aL$4a0xxP7hC=6avP4O_^nbWQrxFPqIDc8hM0!6f{mYl-`{RS0fYRDoc zTvkTKuYz#VbcSPr?7&5R+meA#g>Y zAzK8A7pZD#N^lRoTo^2#p)`@r zY-W@ZU9Z=jhNV}2O;;XcqH<+bPjRSsS8J-E|$HpP8yylKT6i1Zfm?MQL}4Tok2814KTE-uwe;g%X1)a(MGW=A$t| zwkpz$LrFA-ojq=9jMgt`&rKWC+7M0Okyr7{>mwPJ)B25cZC@{5?dbLRqO`%>R6T}@MP%nH=6%}G`PY^NJ3y&C=D2v=W z+Ip}8kXKG*K#$}GrxJVe6hH_jj(b#%dUhc0Y z<`IUh+5$J7qq$ji#nFh%}S#sbvMr`{(L%?0%Y!fa@PH4tYAuBd^iL#eBws6lDx zhT=VXf4QNUNcpjigoj_{@|#8=5eDU_MxqU;>8)N9@R1+_J0CoO>)zMCMfZN)ExPx4 zZA3%qyh8-Zw$1fe!<+JQ${iv~Iz|d1$5_QPnuARX%>B(pGz%j8=U6LywG&n4#1_!N zb}hhtP&c53SYq|PhkUA~h-VAwPWtzWp7d5C6};=yO2i1t2as?Z zyE}?ebRC0IhhDd9eg;r;9YcsN;_#+Bgk%VP_Pta0^_4rtWWt%)SyT_wzY-&BHq^s> zKxa|g-`-c9#mL~@R(rSKb#rpVx@b9P_6PgBbrF+;_gXb_dT0vk^%SiLXI@vGuI?>< zBLC@JH-T%I4o&SYo+f71=_kg>rM<+f1pC)@j+UrnJRlyWI@dGu(+9NWIP-v56nyGm z5p}La1OJSu3juZ1NVuM!Cmt5c!I=KA=JBS7#ggEkExIxv(d<3{h$i~Y7e!6#RJZ7?A=MkL8kn~O5C%d;Zhz|zo!HLmIyzh)o&q@4J7x3jWS|`T3h-7}cmhQEPPniCUw*R=RGY*6g!ZS|M9BB>1k` zx_o3de!Ud=joG3WrN3DDmXj2m`OGBoHVZ~9ONk-TE1smSQ{0K(NUrr_`b6g3GEqgA zpDfBzruJk^L`d<|yS1f#3MLz5Qm2RqDIGIKbfk306mSQrW2$(9(#)y4{OhT(G04}K zLfwRgW)@TarD>uLTQ3(+6Wxi%dglR-bkaw`9#HuEbbnz@*=3dpmAB6j zF$C6Uh6V$8Z8_trh?QHXTRYP;^$^}V6CLXB$_Dn|uP`tnKUm|5^!iM}BP zq7H6p!$g3LXO8GXRS)NB&i47*`d!#W>`18Jg?*b+wTMAV%NMg!j+m=3-SA_wi5sm- zh|Q@=DvwGVWv6$IV=feve@KVu+jIXrEqISgIRCrg8G-5^K-EoWrpj?{LL- zjBMqw$H*aZMj67ff2nAQowcZCH`mD41k+%-Ul|pLJh>o1-_Kbq@M_L0xmq8u@2^tQ zwJSuk#61Sx@{Nsw6b_Xh=qdgIpd-6Pby?dK@v_TG5lXG1q_!MxigI$MRkC2E#(#9B zcB`No>V~&6A-*4xlhBfCa?Zyhj#Ov(CS-C>!|nQMg(w?$l?OKNGd}W8Q@5-v1~O_5 zHN{j4YJO+phlp>ghM`9+jhZccu7exy`}v@g>o61jAVb!xm9TtbJ!A>jbpCp=5+Rn2 zqAFp-(5oTq7VQ!-l@<^wH4*49!QQ|g)|QdGMO+C! z-D(k%B-eZ`YT=U4kw1!Cs2i()6r<@KKB#XRYWP@dp8H0O$L+o{;<$KKvMr(us&v~T z)>>$8G$pgP>e=9jtztOM-F+`%A%Zk-n@(NZ#RcpO$LtUbe1o>cg?&D?sU{siixBz# zCj40QxvuJjiu#dg>bmQc)%BlBbp1NbQs-1qr<#22YY`RV8+>xmZvW`3B^&G!&y(IQ z-lMGKfj#iyk;TYX=3rleQa&^Bdr?8T0Qc=fya3(VvJXo8 zBjQBpMivX>B?CoSrY~cedr}bMQFv23Oa< z0p7k{Bpyb>&TF^!rgI<^w}l+Y?P}m-s;VUUCGk+83Lm+EWe<@4y?BEIh=mepR3N|- z^}0)XJ@pr3KBCw;9P+c83(Ze{7K04qH-zivToDz_+kO?V8GlQT`dxF7p!5@rb7fy zTUdc1ml>iObcdo!DhjgwOC6h0QKn8`3H7UJDl;Q6Q>Zg$=mxQynd`ZI5q?>h+kMv4 za!2}cdpSaWSlDZ*-*_Y)M(F5e+zmjk!OOz6@-Dl{*c1lc{EQwc88S z;P%C~w7V#dkbNP89mH*(lhiJ(3X`<+P5 zB@X*X%8%|HZSO@dR9{a<+uc@1{W!f^3EmrHS8-B66c_#yW51UmJIC79oFrrIFOubm zjWB7HkY036m>DR^fB-?M{_?>Rrtq&+)q!&sVcQ%JCB#hpVBPkH42qtK09Q-$;19y1kiw z`_kC(0#yOS>azb(by(tdECEv$paJ2M4GP!{Z$-=)~w z@MHUBVyeA0u7H&frP>?PZO7hJ`(#{iEK}3$?d@|9*}^)>`)b%L%gJf>I`%Wj-=^{G zPqWvfJ7yzm*l*)!56kW~(A_0R(2aN*QOlkvH`lPo(QQvhYuHSCZvb^SVz=E z9@nmZR@2_te*8yUSUZgnl^XIzN9Ap`?43Do6!g}DU~y;QPqplg`ITcbxwgHzeaUfK zSVs;2LTxHPE|=E^K3r&Zu{QWyctYYAhT>)WI`%X^zfe9^$NmJJYWuvdy;WrXNn6-} zw%xilYj#_=ww~^Csneb;qw7K!mY$Mb>)HqMsXtAvXZP55{A3HOD_^RI*BSNfW%SO~LO|9PgJk*@moM84>ZY+m19m+v_v2iLbJR5%5&a(y3p zpQ{hl7y_u=c&&B8lzo2NUf<(!jGHn7*{ z-=352G_W`0FBi!}4eYJ>XGMrG+7tM;B6&+gdky|eksQ#_-hqE|UM_EFZyJdo%nA#7 zZrI~bQ`>JhYfpjm~&YFzK=XU_%SB{hV^~=$zg!{3~v*kLgAqP zPs?R4J5I@6ki#0;o6ud^iyGNe_@aw)cO!cPzW1UGOGh~lzP3#VG59rtG3gitxJ!S1 zI)nyC{#v@dksZJF9_E%y8rdtBK`T!YDYyo#cVl}MKJOPfx-t5NpLSo>7;?wY>YZ #include @@ -61,6 +61,7 @@ CONTRACT community : public contract POSITION_DISMISS, BADGE_CONFIG, BADGE_ISSUE, + BADGE_REVOKE, }; enum BadgeIssueType { @@ -247,6 +248,8 @@ CONTRACT community : public contract ACTION issuebadge(name community_account, name badge_propose_name); + ACTION revokebadge(name community_account, name revoke_badge_propose_name); + ACTION setconfig( name community_creator_name, name cryptobadge_contract_name, @@ -260,6 +263,25 @@ CONTRACT community : public contract ); private: + void create_issue_badge_code( + name community_account, + uint64_t badge_id, + uint8_t issue_type, + uint8_t issue_exec_type, + RightHolder right_issue_sole_executor, + RightHolder right_issue_proposer, + uint8_t issue_approval_type, + RightHolder right_issue_approver, + RightHolder right_issue_voter, + double issue_pass_rule, + uint64_t issue_vote_duration, + name ram_payer + ); + + void create_config_badge_code_for_admin(name community_account, uint64_t badge_id, name ram_payer); + + void create_revoke_badge_code_for_admin(name community_account, uint64_t badge_id, name ram_payer); + bool verify_approver(name community_account, name voter, uint64_t code_id, bool is_ammnend_code); bool verify_voter(name community_account, name voter, uint64_t code_id, bool is_amend_code); @@ -552,7 +574,7 @@ CONTRACT community : public contract } }; - typedef eosio::multi_index<"v1.cert"_n, v1_cert, + typedef eosio::multi_index<"v1.certs"_n, v1_cert, eosio::indexed_by<"badgeid"_n, eosio::const_mem_fun>, eosio::indexed_by<"owner"_n, eosio::const_mem_fun>> v1_cert_table; @@ -575,6 +597,10 @@ CONTRACT community : public contract ((v1.position)(v1_position)(v1_position_table)) ((v1.codeexec)(v1_sole_decision)(v1_code_sole_decision_table)) ((v1.amenexec)(v1_sole_decision)(v1_amend_sole_decision_table)) + ((v1.filling)(v1_election_rule)(v1_election_table)) + ((v1.pproposal)(v1_pos_proposal)(v1_posproposal_table)) + ((v1.cproposal)(v1_code_proposal)(v1_code_proposals_table)) + ((v1.candidate)(v1_pos_candidate)(v1_poscandidate_table)) ) #endif }; \ No newline at end of file diff --git a/community/src/community.cpp b/community/src/community.cpp index 414db7d..ecb98be 100644 --- a/community/src/community.cpp +++ b/community/src/community.cpp @@ -32,12 +32,14 @@ const name BA_Create = "ba.create"_n; const name BA_Issue = "ba.issue"_n; const name BA_Claim = "ba.claim"_n; const name BA_Config = "ba.config"_n; +const name BA_Revoke = "ba.revoke"_n; const name BA_Adopt = "ba.adopt"_n; const name BA_Discard = "ba.discard"_n; const name badge_update_action = "updatebadge"_n; const name badge_create_action = "createbadge"_n; const name badge_issue_action = "issuebadge"_n; +const name cert_revoke_action = "revokecert"_n; struct createbadge_params { @@ -73,6 +75,14 @@ struct issuebadge_params bool require_claim; }; +struct revokecert_params +{ + name issuer; + uint64_t cert_id; + name owner; + string reason; +}; + void community::transfer(name from, name to, asset quantity, string memo) { if (from == _self) @@ -504,7 +514,7 @@ ACTION community::execcode(name community_account, name exec_account, uint64_t c packed_params_datastream >> packed_refer_id; check(code_itr->code_type.refer_id == packed_refer_id, "ERR:INVALID_BADGE_POSITION_CODE::Please use correct code to execute badge/position action"); } - else if (execution_data.code_action == "issuebadge"_n) + else if (execution_data.code_action == "issuebadge"_n || execution_data.code_action == "revokebadge"_n) { name packed_proposal_name; packed_params_datastream >> packed_proposal_name; @@ -522,6 +532,18 @@ ACTION community::execcode(name community_account, name exec_account, uint64_t c check(cb_data.issuer == community_account, "ERR::ISSUE_BADGE_PROPOSAL_INVALID::Issuer in issue badge proposal not the same with community account"); check(cb_data.badge_id == code_itr->code_type.refer_id, "ERR:INVALID_BADGE_POSITION_CODE::Please use correct code to execute badge/position action"); } + + if (action.account == _config.cryptobadge_contract_name && action.name == cert_revoke_action) + { + auto cb_data = unpack(&action.data[0], action.data.size()); + + check(cb_data.issuer == community_account, "ERR::REVOKE_BADGE_PROPOSAL_INVALID::Issuer in issue badge proposal not the same with community account"); + + v1_cert_table _badges(_config.cryptobadge_contract_name, cb_data.owner.value); + auto owner_badge_itr = _badges.find(cb_data.cert_id); + check(owner_badge_itr != _badges.end(), "ERR::REVOKE_BADGE_PROPOSAL_INVALID::Certification does not exist"); + check(owner_badge_itr->badge_id == code_itr->code_type.refer_id, "ERR:INVALID_BADGE_POSITION_CODE::Please use correct code to execute badge/position action"); + } } } } @@ -1952,8 +1974,8 @@ ACTION community::createbadge( RightHolder right_issue_approver, RightHolder right_issue_voter, double issue_pass_rule, - uint64_t issue_vote_duration) -{ + uint64_t issue_vote_duration +){ require_auth(community_account); v1_global_table config(_self, _self.value); @@ -2000,6 +2022,80 @@ ACTION community::createbadge( std::make_tuple(cryptobadge_contract, badge_propose_name, ram_payer)) .send(); + create_issue_badge_code( + community_account, + badge_id, + issue_type, + issue_exec_type, + right_issue_sole_executor, + right_issue_proposer, + issue_approval_type, + right_issue_approver, + right_issue_voter, + issue_pass_rule, + issue_vote_duration, + ram_payer + ); + + create_config_badge_code_for_admin(community_account, badge_id, ram_payer); + + create_revoke_badge_code_for_admin(community_account, badge_id, ram_payer); +} + +ACTION community::configbadge( + name community_account, + uint64_t badge_id, + uint8_t issue_type, + name update_badge_proposal_name) +{ + require_auth(community_account); + + v1_global_table config(_self, _self.value); + _config = config.exists() ? config.get() : v1_global{}; + const name ram_payer_system = _config.ram_payer_name; + const name cryptobadge_contract = _config.cryptobadge_contract_name; + + auto ram_payer = community_account; + if (has_auth(ram_payer_system)) + ram_payer = ram_payer_system; + + if (update_badge_proposal_name != name("")) + { + multisig_proposals proptable("eosio.msig"_n, cryptobadge_contract.value); + auto &prop = proptable.get(update_badge_proposal_name.value, "proposal not found"); + transaction trx; + datastream ds(prop.packed_transaction.data(), prop.packed_transaction.size()); + ds >> trx; + for (auto action : trx.actions) + { + if (action.account == cryptobadge_contract && action.name == badge_update_action) + { + auto cb_data = unpack(&action.data[0], action.data.size()); + + check(cb_data.issuer == community_account, "ERR::CREATE_BADGE_PROPOSAL_INVALID::Issuer in update badge proposal not the same with community account"); + check(cb_data.badge_id == badge_id, "ERR::CREATE_BADGE_PROPOSAL_INVALID::Issuer in update badge proposal not the same with config badge id"); + } + } + + action( + permission_level{community_account, "active"_n}, + "eosio.msig"_n, + "approve"_n, + std::make_tuple(cryptobadge_contract, update_badge_proposal_name, permission_level{community_account, "active"_n})) + .send(); + + vector action_permission = {{community_account, "active"_n}}; + if (ram_payer == ram_payer_system) + action_permission.push_back({ram_payer_system, "active"_n}); + + action( + action_permission, + "eosio.msig"_n, + "exec"_n, + std::make_tuple(cryptobadge_contract, update_badge_proposal_name, ram_payer)) + .send(); + } + v1_code_table _codes(_self, community_account.value); v1_code_sole_decision_table _code_execution_rule(_self, community_account.value); @@ -2010,11 +2106,167 @@ ACTION community::createbadge( v1_position_table _positions(_self, community_account.value); - auto getByCodeName = _codes.get_index<"by.code.name"_n>(); - auto ba_create_code = getByCodeName.find(BA_Create.value); + name issue_badge_code_name; + if (issue_type == BadgeIssueType::WITHOUT_CLAIM) + { + issue_badge_code_name = BA_Issue; + } + else if (issue_type == BadgeIssueType::CLAIM_APPROVE_BY_ISSUER) + { + issue_badge_code_name = BA_Claim; + } + else + { + check(false, "ERR::BADGE_ISSUE_TYPE_INVALID::Badge issue type is invalid"); + } - vector code_actions; - code_actions.push_back("issuebadge"_n); + auto getByCodeReferId = _codes.get_index<"by.refer.id"_n>(); + uint128_t issue_badge_reference_id = build_reference_id(badge_id, CodeTypeEnum::BADGE_ISSUE); + auto issue_badge_code_itr = getByCodeReferId.find(issue_badge_reference_id); + uint64_t issue_badge_code_id; + + // save new code to the table + if (issue_badge_code_itr == getByCodeReferId.end()) + { + vector code_actions; + code_actions.push_back("issuebadge"_n); + auto new_issue_badge_code = _codes.emplace(ram_payer, [&](auto &row) { + row.code_id = _codes.available_primary_key(); + row.code_name = issue_badge_code_name; + row.contract_name = get_self(); + row.code_actions = code_actions; + row.code_type = {CodeTypeEnum::BADGE_ISSUE, badge_id}; + }); + issue_badge_code_id = new_issue_badge_code->code_id; + } + else + { + getByCodeReferId.modify(issue_badge_code_itr, ram_payer, [&](auto &row) { + row.code_name = issue_badge_code_name; + row.code_type = {CodeTypeEnum::BADGE_ISSUE, badge_id}; + }); + issue_badge_code_id = issue_badge_code_itr->code_id; + } +} + +ACTION community::issuebadge(name community_account, name badge_propose_name) +{ + require_auth(community_account); + + v1_global_table config(_self, _self.value); + _config = config.exists() ? config.get() : v1_global{}; + const name ram_payer_system = _config.ram_payer_name; + const name cryptobadge_contract = _config.cryptobadge_contract_name; + + auto ram_payer = community_account; + if (has_auth(ram_payer_system)) + ram_payer = ram_payer_system; + + action( + permission_level{community_account, "active"_n}, + "eosio.msig"_n, + "approve"_n, + std::make_tuple(cryptobadge_contract, badge_propose_name, permission_level{community_account, "active"_n})) + .send(); + + vector action_permission = {{community_account, "active"_n}}; + if (ram_payer == ram_payer_system) + action_permission.push_back({ram_payer_system, "active"_n}); + + action( + action_permission, + "eosio.msig"_n, + "exec"_n, + std::make_tuple(cryptobadge_contract, badge_propose_name, ram_payer)) + .send(); +} + +ACTION community::revokebadge(name community_account, name revoke_badge_propose_name) +{ + require_auth(community_account); + + v1_global_table config(_self, _self.value); + _config = config.exists() ? config.get() : v1_global{}; + const name ram_payer_system = _config.ram_payer_name; + const name cryptobadge_contract = _config.cryptobadge_contract_name; + + auto ram_payer = community_account; + if (has_auth(ram_payer_system)) + ram_payer = ram_payer_system; + + action( + permission_level{community_account, "active"_n}, + "eosio.msig"_n, + "approve"_n, + std::make_tuple(cryptobadge_contract, revoke_badge_propose_name, permission_level{community_account, "active"_n})) + .send(); + + vector action_permission = {{community_account, "active"_n}}; + if (ram_payer == ram_payer_system) + action_permission.push_back({ram_payer_system, "active"_n}); + + action( + action_permission, + "eosio.msig"_n, + "exec"_n, + std::make_tuple(cryptobadge_contract, revoke_badge_propose_name, ram_payer)) + .send(); +} + +ACTION community::setconfig( + name community_creator_name, + name cryptobadge_contract_name, + name token_contract_name, + name ram_payer_name, + symbol core_symbol, + uint64_t init_ram_amount, + asset min_active_contract, + asset init_net, + asset init_cpu +){ + require_auth(_self); + + v1_global_table config(_self, _self.value); + _config = config.exists() ? config.get() : v1_global{}; + + _config.community_creator_name = community_creator_name; + _config.cryptobadge_contract_name = cryptobadge_contract_name; + _config.token_contract_name = token_contract_name; + _config.ram_payer_name = ram_payer_name; + _config.core_symbol = core_symbol; + _config.init_ram_amount = init_ram_amount; + _config.init_net = init_net; + _config.init_cpu = init_cpu; + _config.min_active_contract = min_active_contract; + + config.set(_config, _self); +} + +void community::create_issue_badge_code( + name community_account, + uint64_t badge_id, + uint8_t issue_type, + uint8_t issue_exec_type, + RightHolder right_issue_sole_executor, + RightHolder right_issue_proposer, + uint8_t issue_approval_type, + RightHolder right_issue_approver, + RightHolder right_issue_voter, + double issue_pass_rule, + uint64_t issue_vote_duration, + name ram_payer + ) { + v1_code_table _codes(_self, community_account.value); + + v1_code_sole_decision_table _code_execution_rule(_self, community_account.value); + v1_amend_sole_decision_table _amend_execution_rule(_self, community_account.value); + + v1_code_collective_decision_table _code_vote_rule(_self, community_account.value); + v1_ammend_collective_decision_table _amend_vote_rule(_self, community_account.value); + + v1_position_table _positions(_self, community_account.value); + + auto getByCodeName = _codes.get_index<"by.code.name"_n>(); name issue_badge_code_name; if (issue_type == BadgeIssueType::WITHOUT_CLAIM) @@ -2030,6 +2282,9 @@ ACTION community::createbadge( check(false, "ERR::BADGE_ISSUE_TYPE_INVALID::Badge issue type is invalid"); } + vector code_actions; + code_actions.push_back("issuebadge"_n); + auto getByCodeReferId = _codes.get_index<"by.refer.id"_n>(); uint128_t issue_badge_reference_id = build_reference_id(badge_id, CodeTypeEnum::BADGE_ISSUE); @@ -2125,8 +2380,23 @@ ACTION community::createbadge( }); } } +} - code_actions.clear(); +void community::create_config_badge_code_for_admin(name community_account, uint64_t badge_id, name ram_payer) { + v1_code_table _codes(_self, community_account.value); + + v1_code_sole_decision_table _code_execution_rule(_self, community_account.value); + v1_amend_sole_decision_table _amend_execution_rule(_self, community_account.value); + + v1_code_collective_decision_table _code_vote_rule(_self, community_account.value); + v1_ammend_collective_decision_table _amend_vote_rule(_self, community_account.value); + + v1_position_table _positions(_self, community_account.value); + + auto getByCodeName = _codes.get_index<"by.code.name"_n>(); + auto getByCodeReferId = _codes.get_index<"by.refer.id"_n>(); + + vector code_actions; code_actions.push_back("configbadge"_n); uint128_t config_badge_reference_id = build_reference_id(badge_id, CodeTypeEnum::BADGE_CONFIG); @@ -2149,7 +2419,7 @@ ACTION community::createbadge( else { getByCodeReferId.modify(config_badge_code_itr, ram_payer, [&](auto &row) { - row.code_name = issue_badge_code_name; + row.code_name = BA_Config; row.code_exec_type = ExecutionType::SOLE_DECISION; row.code_type = {CodeTypeEnum::BADGE_CONFIG, badge_id}; }); @@ -2182,60 +2452,7 @@ ACTION community::createbadge( } } -ACTION community::configbadge( - name community_account, - uint64_t badge_id, - uint8_t issue_type, - name update_badge_proposal_name) -{ - require_auth(community_account); - - v1_global_table config(_self, _self.value); - _config = config.exists() ? config.get() : v1_global{}; - const name ram_payer_system = _config.ram_payer_name; - const name cryptobadge_contract = _config.cryptobadge_contract_name; - - auto ram_payer = community_account; - if (has_auth(ram_payer_system)) - ram_payer = ram_payer_system; - - if (update_badge_proposal_name != name("")) - { - multisig_proposals proptable("eosio.msig"_n, cryptobadge_contract.value); - auto &prop = proptable.get(update_badge_proposal_name.value, "proposal not found"); - transaction trx; - datastream ds(prop.packed_transaction.data(), prop.packed_transaction.size()); - ds >> trx; - for (auto action : trx.actions) - { - if (action.account == cryptobadge_contract && action.name == badge_update_action) - { - auto cb_data = unpack(&action.data[0], action.data.size()); - - check(cb_data.issuer == community_account, "ERR::CREATE_BADGE_PROPOSAL_INVALID::Issuer in update badge proposal not the same with community account"); - check(cb_data.badge_id == badge_id, "ERR::CREATE_BADGE_PROPOSAL_INVALID::Issuer in update badge proposal not the same with config badge id"); - } - } - - action( - permission_level{community_account, "active"_n}, - "eosio.msig"_n, - "approve"_n, - std::make_tuple(cryptobadge_contract, update_badge_proposal_name, permission_level{community_account, "active"_n})) - .send(); - - vector action_permission = {{community_account, "active"_n}}; - if (ram_payer == ram_payer_system) - action_permission.push_back({ram_payer_system, "active"_n}); - - action( - action_permission, - "eosio.msig"_n, - "exec"_n, - std::make_tuple(cryptobadge_contract, update_badge_proposal_name, ram_payer)) - .send(); - } - +void community::create_revoke_badge_code_for_admin(name community_account, uint64_t badge_id, name ram_payer) { v1_code_table _codes(_self, community_account.value); v1_code_sole_decision_table _code_execution_rule(_self, community_account.value); @@ -2246,108 +2463,63 @@ ACTION community::configbadge( v1_position_table _positions(_self, community_account.value); - name issue_badge_code_name; - if (issue_type == BadgeIssueType::WITHOUT_CLAIM) - { - issue_badge_code_name = BA_Issue; - } - else if (issue_type == BadgeIssueType::CLAIM_APPROVE_BY_ISSUER) - { - issue_badge_code_name = BA_Claim; - } - else - { - check(false, "ERR::BADGE_ISSUE_TYPE_INVALID::Badge issue type is invalid"); - } - + auto getByCodeName = _codes.get_index<"by.code.name"_n>(); auto getByCodeReferId = _codes.get_index<"by.refer.id"_n>(); - uint128_t issue_badge_reference_id = build_reference_id(badge_id, CodeTypeEnum::BADGE_ISSUE); - auto issue_badge_code_itr = getByCodeReferId.find(issue_badge_reference_id); - uint64_t issue_badge_code_id; - // save new code to the table - if (issue_badge_code_itr == getByCodeReferId.end()) + vector code_actions; + code_actions.push_back("revokebadge"_n); + + uint128_t revoke_badge_reference_id = build_reference_id(badge_id, CodeTypeEnum::BADGE_REVOKE); + auto revoke_badge_code_itr = getByCodeReferId.find(revoke_badge_reference_id); + uint64_t revoke_badge_code_id; + + // save revoke badge code to the table + if (revoke_badge_code_itr == getByCodeReferId.end()) { - vector code_actions; - code_actions.push_back("issuebadge"_n); - auto new_issue_badge_code = _codes.emplace(ram_payer, [&](auto &row) { + auto new_revoke_badge_code = _codes.emplace(ram_payer, [&](auto &row) { row.code_id = _codes.available_primary_key(); - row.code_name = issue_badge_code_name; + row.code_name = BA_Revoke; row.contract_name = get_self(); row.code_actions = code_actions; - row.code_type = {CodeTypeEnum::BADGE_ISSUE, badge_id}; + row.amendment_exec_type = ExecutionType::SOLE_DECISION; + row.code_type = {CodeTypeEnum::BADGE_REVOKE, badge_id}; }); - issue_badge_code_id = new_issue_badge_code->code_id; + revoke_badge_code_id = new_revoke_badge_code->code_id; } else { - getByCodeReferId.modify(issue_badge_code_itr, ram_payer, [&](auto &row) { - row.code_name = issue_badge_code_name; - row.code_type = {CodeTypeEnum::BADGE_ISSUE, badge_id}; + getByCodeReferId.modify(revoke_badge_code_itr, ram_payer, [&](auto &row) { + row.code_name = BA_Revoke; + row.code_exec_type = ExecutionType::SOLE_DECISION; + row.code_type = {CodeTypeEnum::BADGE_REVOKE, badge_id}; }); - issue_badge_code_id = issue_badge_code_itr->code_id; + revoke_badge_code_id = revoke_badge_code_itr->code_id; } -} - -ACTION community::issuebadge(name community_account, name badge_propose_name) -{ - require_auth(community_account); - - v1_global_table config(_self, _self.value); - _config = config.exists() ? config.get() : v1_global{}; - const name ram_payer_system = _config.ram_payer_name; - const name cryptobadge_contract = _config.cryptobadge_contract_name; - auto ram_payer = community_account; - if (has_auth(ram_payer_system)) - ram_payer = ram_payer_system; - - action( - permission_level{community_account, "active"_n}, - "eosio.msig"_n, - "approve"_n, - std::make_tuple(cryptobadge_contract, badge_propose_name, permission_level{community_account, "active"_n})) - .send(); - - vector action_permission = {{community_account, "active"_n}}; - if (ram_payer == ram_payer_system) - action_permission.push_back({ram_payer_system, "active"_n}); - - action( - action_permission, - "eosio.msig"_n, - "exec"_n, - std::make_tuple(cryptobadge_contract, badge_propose_name, ram_payer)) - .send(); -} - -ACTION community::setconfig( - name community_creator_name, - name cryptobadge_contract_name, - name token_contract_name, - name ram_payer_name, - symbol core_symbol, - uint64_t init_ram_amount, - asset min_active_contract, - asset init_net, - asset init_cpu) -{ - require_auth(_self); - - v1_global_table config(_self, _self.value); - _config = config.exists() ? config.get() : v1_global{}; + auto revoke_badge_code_sole_decision = _code_execution_rule.find(revoke_badge_code_id); + auto revoke_badge_amend_code_sole_decision = _amend_execution_rule.find(revoke_badge_code_id); + if (revoke_badge_code_sole_decision == _code_execution_rule.end()) + { + _amend_execution_rule.emplace(ram_payer, [&](auto &row) { + row.code_id = revoke_badge_code_id; + row.right_executor = admin_right_holder(); + }); - _config.community_creator_name = community_creator_name; - _config.cryptobadge_contract_name = cryptobadge_contract_name; - _config.token_contract_name = token_contract_name; - _config.ram_payer_name = ram_payer_name; - _config.core_symbol = core_symbol; - _config.init_ram_amount = init_ram_amount; - _config.init_net = init_net; - _config.init_cpu = init_cpu; - _config.min_active_contract = min_active_contract; + _code_execution_rule.emplace(ram_payer, [&](auto &row) { + row.code_id = revoke_badge_code_id; + row.right_executor = admin_right_holder(); + }); + } + else + { + _amend_execution_rule.modify(revoke_badge_amend_code_sole_decision, ram_payer, [&](auto &row) { + row.right_executor = admin_right_holder(); + }); - config.set(_config, _self); + _code_execution_rule.modify(revoke_badge_code_sole_decision, ram_payer, [&](auto &row) { + row.right_executor = admin_right_holder(); + }); + } } bool community::verify_voter(name community_account, name voter, uint64_t code_id, bool is_amend_code) @@ -2433,8 +2605,9 @@ bool community::is_pos_candidate(name community_account, uint64_t pos_id, name o for (int i = 0; i < _required_badge_ids.size(); i++) { v1_cert_table _badges(cryptobadge_contract, owner.value); - auto owner_badge_itr = _badges.find(_required_badge_ids[i]); - if (owner_badge_itr != _badges.end()) + auto get_cert_by_badge_id = _badges.get_index<"badgeid"_n>(); + auto owner_badge_itr = get_cert_by_badge_id.find(_required_badge_ids[i]); + if (owner_badge_itr != get_cert_by_badge_id.end()) { return true; } @@ -2492,8 +2665,9 @@ bool community::is_pos_voter(name community_account, uint64_t pos_id, name owner for (int i = 0; i < _required_badge_ids.size(); i++) { v1_cert_table _badges(cryptobadge_contract, owner.value); - auto owner_badge_itr = _badges.find(_required_badge_ids[i]); - if (owner_badge_itr != _badges.end()) + auto get_cert_by_badge_id = _badges.get_index<"badgeid"_n>(); + auto owner_badge_itr = get_cert_by_badge_id.find(_required_badge_ids[i]); + if (owner_badge_itr != get_cert_by_badge_id.end()) { return true; } @@ -2549,8 +2723,9 @@ bool community::verify_account_right_holder(name community_account, RightHolder for (int i = 0; i < _required_badge_ids.size(); i++) { v1_cert_table _badges(cryptobadge_contract, owner.value); - auto owner_badge_itr = _badges.find(_required_badge_ids[i]); - if (owner_badge_itr != _badges.end()) + auto get_cert_by_badge_id = _badges.get_index<"badgeid"_n>(); + auto owner_badge_itr = get_cert_by_badge_id.find(_required_badge_ids[i]); + if (owner_badge_itr != get_cert_by_badge_id.end()) { return true; } @@ -2727,4 +2902,4 @@ community::RightHolder community::admin_right_holder() #endif EOSIO_ABI_CUSTOM(community, - (setapprotype)(setvoter)(setapprover)(setaccess)(transfer)(createacc)(create)(initcode)(inputmembers)(initadminpos)(execcode)(createcode)(setverify)(createpos)(configpos)(nominatepos)(approvepos)(voteforcode)(voteforpos)(dismisspos)(setexectype)(appointpos)(proposecode)(execproposal)(verifyholder)(createbadge)(issuebadge)(configbadge)(setsoleexec)(setproposer)(setvoterule)(setconfig)) + (setapprotype)(setvoter)(setapprover)(setaccess)(transfer)(createacc)(create)(initcode)(inputmembers)(initadminpos)(execcode)(createcode)(setverify)(createpos)(configpos)(nominatepos)(approvepos)(voteforcode)(voteforpos)(dismisspos)(setexectype)(appointpos)(proposecode)(execproposal)(verifyholder)(createbadge)(issuebadge)(configbadge)(revokebadge)(setsoleexec)(setproposer)(setvoterule)(setconfig)) diff --git a/package.json b/package.json index 36bead6..50802ff 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "test": "jest" }, "dependencies": { - "@klevoya/hydra": "1.1.0", + "@klevoya/hydra": "1.2.2", "jest": "^25.1.0" }, "devDependencies": { diff --git a/test/codeProposal.test.ts b/test/codeProposal.test.ts new file mode 100644 index 0000000..f27a407 --- /dev/null +++ b/test/codeProposal.test.ts @@ -0,0 +1,509 @@ +import { loadConfig, Blockchain } from '@klevoya/hydra'; +import { initGovernanceContract } from './testHelper'; +import { ApprovalType } from './type/smart-contract-enum'; + +const config = loadConfig("hydra.yml"); + +describe("test create/vote/execute proposal", () => { + let blockchain = new Blockchain(config); + let governanceContract; + let communityCreator; + const communityAccountName = 'community1.c'; + let communityAccount; + const proposer = blockchain.createAccount('proposer'); + const approver = blockchain.createAccount('approver'); + const voter1 = blockchain.createAccount('voter11'); + const voter2 = blockchain.createAccount('voter22'); + const voter3 = blockchain.createAccount('voter44'); + + const codeAmendId = 0; + const proposalName = 'testproposal'; + + const collectiveDecisionRule = { + code_id: codeAmendId, + vote_duration: 0, + pass_rule: 65, + approval_type: ApprovalType.BOTH_TYPE, + right_proposer: { + is_anyone: false, + is_any_community_member: false, + required_badges: [], + required_positions: [], + required_tokens: [], + required_exp: 0, + accounts: [proposer.accountName], + }, + right_approver: { + is_anyone: false, + is_any_community_member: false, + required_badges: [], + required_positions: [], + required_tokens: [], + required_exp: 0, + accounts: [approver.accountName], + }, + right_voter: { + is_anyone: false, + is_any_community_member: false, + required_badges: [], + required_positions: [], + required_tokens: [], + required_exp: 0, + accounts: [voter1.accountName, voter2.accountName, voter3.accountName], + }, + }; + + beforeAll(async () => { + const initAccount = await initGovernanceContract(blockchain, communityAccountName); + governanceContract = initAccount.governanceContract; + communityCreator = initAccount.communityCreator; + communityAccount = initAccount.communityAccount; + + const setExecTypePackData = '8040f0d94d2d254500000000000000000100'; + const setApprovalTypePackData = '8040f0d94d2d254500000000000000000002'; + const setProposerPackData = '8040f0d94d2d2545000000000000000000000000000000000000000000000100000057615ae9ad'; + const setApproverPackData = '8040f0d94d2d25450000000000000000000000000000000000000000000001000000576d7a6b35'; + const setVoterPackData = '8040f0d94d2d254500000000000000000000000000000000000000000000030000002084ab32dd0000004088ab32dd000000608cab32dd'; + const setVoteRulePackData = '8040f0d94d2d254500000000000000000000000000004050400100000000000000'; + await governanceContract.contract.execcode({ + community_account: communityAccount.accountName, + exec_account: communityCreator.accountName, + code_id: collectiveDecisionRule.code_id, + code_actions: [{ + code_action: 'setexectype', + packed_params: setExecTypePackData, + },{ + code_action: 'setapprotype', + packed_params: setApprovalTypePackData, + },{ + code_action: 'setapprover', + packed_params: setApproverPackData, + },{ + code_action: 'setproposer', + packed_params: setProposerPackData, + },{ + code_action: 'setvoter', + packed_params: setVoterPackData, + },{ + code_action: 'setvoterule', + packed_params: setVoteRulePackData, + } + ], + }, [{ + actor: communityCreator.accountName, + permission: 'active', + }]); + }); + + beforeEach(async () => { + // governanceContract.resetTables(); + }); + + it("should propose to create new code", async () => { + const inputActionData = { + community_account: communityAccount.accountName, + code_name: 'codetest12', + contract_name: governanceContract.accountName, + code_actions: ['testaction1', 'testaction2'] + }; + + const serializeActionData = '8040f0d94d2d254500800819abac1245008042d3ccab36650200c2a42e2393b1ca00c4a42e2393b1ca'; + await governanceContract.contract.proposecode({ + community_account: communityAccount.accountName, + proposer: proposer.accountName, + proposal_name: proposalName, + code_id: codeAmendId, + code_actions: [{ + code_action: 'createcode', + packed_params: serializeActionData, + }], + }, [{ + actor: proposer.accountName, + permission: 'active', + }]); + + const codeProposals = governanceContract.getTableRowsScoped( + `v1.cproposal` + )[communityAccount.accountName]; + + expect(codeProposals[0].proposal_name).toBe(proposalName); + expect(codeProposals[0].proposer).toBe(proposer.accountName); + expect(+codeProposals[0].voted_percent).toBe(0); + expect(+codeProposals[0].code_id).toBe(codeAmendId); + expect(codeProposals[0].code_actions[0].code_action).toBe('createcode'); + expect(codeProposals[0].code_actions[0].packed_params).toBe(serializeActionData.toUpperCase()); + }); + + it("should throw error if create proposal with name that already exist", async () => { + const inputActionData = { + community_account: communityAccount.accountName, + code_name: 'codetest12', + contract_name: governanceContract.accountName, + code_actions: ['testaction1', 'testaction2'] + }; + + const newProposalName = proposalName; + + const serializeActionData = '8040f0d94d2d254500800819abac1245008042d3ccab36650200c2a42e2393b1ca00c4a42e2393b1ca'; + await expect(governanceContract.contract.proposecode({ + community_account: communityAccount.accountName, + proposer: proposer.accountName, + proposal_name: newProposalName, + code_id: codeAmendId, + code_actions: [{ + code_action: 'createcode', + packed_params: serializeActionData, + }], + }, [{ + actor: proposer.accountName, + permission: 'active', + }])).rejects.toThrowError('ERR::PROPOSAL_NAME_EXIST::The proposal with the this name has already exist'); + }); + + it("should throw error if create proposal with code doesn't exist", async () => { + const inputActionData = { + community_account: communityAccount.accountName, + code_name: 'codetest12', + contract_name: governanceContract.accountName, + code_actions: ['testaction1', 'testaction2'] + }; + + const newProposalName = 'testproposa1'; + + const serializeActionData = '8040f0d94d2d254500800819abac1245008042d3ccab36650200c2a42e2393b1ca00c4a42e2393b1ca'; + await expect(governanceContract.contract.proposecode({ + community_account: communityAccount.accountName, + proposer: proposer.accountName, + proposal_name: newProposalName, + code_id: 9999, + code_actions: [{ + code_action: 'createcode', + packed_params: serializeActionData, + }], + }, [{ + actor: proposer.accountName, + permission: 'active', + }])).rejects.toThrowError('ERR::VERIFY_FAILED::Code doesn\'t exist.'); + }); + + it("should throw error if create proposal with action doesn't existed", async () => { + const inputActionData = { + community_account: communityAccount.accountName, + code_name: 'codetest12', + contract_name: governanceContract.accountName, + code_actions: ['testaction1', 'testaction2'] + }; + + const newProposalName = 'testproposa1'; + + const serializeActionData = '8040f0d94d2d254500800819abac1245008042d3ccab36650200c2a42e2393b1ca00c4a42e2393b1ca'; + await expect(governanceContract.contract.proposecode({ + community_account: communityAccount.accountName, + proposer: proposer.accountName, + proposal_name: newProposalName, + code_id: codeAmendId, + code_actions: [{ + code_action: 'abccode', + packed_params: serializeActionData, + }], + }, [{ + actor: proposer.accountName, + permission: 'active', + }])).rejects.toThrowError('ERR::VERIFY_FAILED::Action doesn\'t exist.'); + }); + + it("should throw error if create proposal with sole decision code", async () => { + const inputActionData = { + community_account: communityAccount.accountName, + code_name: 'codetest12', + contract_name: governanceContract.accountName, + code_actions: ['testaction1', 'testaction2'] + }; + + // init in test/init-data-test/v1.code.json, position create code is sole decision code + const positionCreateCode = 1; + const newProposalName = 'testproposa1'; + + const serializeActionData = '8040f0d94d2d254500800819abac1245008042d3ccab36650200c2a42e2393b1ca00c4a42e2393b1ca'; + await expect(governanceContract.contract.proposecode({ + community_account: communityAccount.accountName, + proposer: proposer.accountName, + proposal_name: newProposalName, + code_id: positionCreateCode, + code_actions: [{ + code_action: 'createpos', + packed_params: serializeActionData, + }], + }, [{ + actor: proposer.accountName, + permission: 'active', + }])).rejects.toThrowError('ERR::INVALID_EXEC_TYPE::Can not create proposal for sole decision code'); + }); + + it("should throw error if user does not have right to create proposal", async () => { + const inputActionData = { + community_account: communityAccount.accountName, + code_name: 'codetest12', + contract_name: governanceContract.accountName, + code_actions: ['testaction1', 'testaction2'] + }; + + const newProposalName = 'testproposa1'; + + const serializeActionData = '8040f0d94d2d254500800819abac1245008042d3ccab36650200c2a42e2393b1ca00c4a42e2393b1ca'; + await expect(governanceContract.contract.proposecode({ + community_account: communityAccount.accountName, + // approver doesn't have right to proposal + proposer: approver.accountName, + proposal_name: newProposalName, + code_id: codeAmendId, + code_actions: [{ + code_action: 'createcode', + packed_params: serializeActionData, + }], + }, [{ + actor: approver.accountName, + permission: 'active', + }])).rejects.toThrowError('ERR::VERIFY_FAILED::Owner doesn\'t belong to code\'s right holder.'); + }); + + it("should vote for code proposal", async () => { + await governanceContract.contract.voteforcode({ + community_account: communityAccount.accountName, + proposal_name: proposalName, + approver: voter1.accountName, + vote_status: 1, + }, [{ + actor: voter1.accountName, + permission: 'active', + }]); + + let codeProposals = governanceContract.getTableRowsScoped( + `v1.cproposal` + )[communityAccount.accountName]; + + expect(codeProposals[0].voters_detail.length).toBe(1); + expect(codeProposals[0].voters_detail[0].key).toBe(voter1.accountName); + expect(+codeProposals[0].voted_percent).toBe(100); + + await governanceContract.contract.voteforcode({ + community_account: communityAccount.accountName, + proposal_name: proposalName, + approver: voter2.accountName, + vote_status: 0, + }, [{ + actor: voter2.accountName, + permission: 'active', + }]); + + codeProposals = governanceContract.getTableRowsScoped( + `v1.cproposal` + )[communityAccount.accountName]; + + expect(codeProposals[0].voters_detail.length).toBe(2); + expect(codeProposals[0].voters_detail[1].key).toBe(voter2.accountName); + expect(+codeProposals[0].voted_percent).toBe(50); + }); + + it("should throw error if vote for proposal that not exist", async () => { + const notExistProposalName = 'notexist'; + await expect(governanceContract.contract.voteforcode({ + community_account: communityAccount.accountName, + proposal_name: notExistProposalName, + approver: voter1.accountName, + vote_status: 1, + }, [{ + actor: voter1.accountName, + permission: 'active', + }])).rejects.toThrowError('ERR::PROPOSAL_NOT_EXISTED::The proposal is not exist'); + }); + + it("should throw error if user does not have right to vote for code", async () => { + await expect(governanceContract.contract.voteforcode({ + community_account: communityAccount.accountName, + proposal_name: proposalName, + // approver does not have right to vote for proposal + approver: approver.accountName, + vote_status: 1, + }, [{ + actor: approver.accountName, + permission: 'active', + }])).rejects.toThrowError('ERR::VERIFY_FAILED::You do not have permission to vote for this action.'); + }); + + it("should throw error if user does not have right to vote for code", async () => { + await expect(governanceContract.contract.voteforcode({ + community_account: communityAccount.accountName, + proposal_name: proposalName, + // approver does not have right to vote for proposal + approver: approver.accountName, + vote_status: 1, + }, [{ + actor: approver.accountName, + permission: 'active', + }])).rejects.toThrowError('ERR::VERIFY_FAILED::You do not have permission to vote for this action.'); + }); + + it("should throw error if execute proposal is not exist", async () => { + const notExistProposal = 'notexist'; + + const codeProposals = governanceContract.getTableRowsScoped( + `v1.cproposal` + )[communityAccount.accountName]; + + await expect(governanceContract.contract.execproposal({ + community_account: communityAccount.accountName, + proposal_name: notExistProposal, + }, [{ + actor: communityCreator.accountName, + permission: 'active', + }])).rejects.toThrowError('ERR::VOTE_NOT_FINISH::Proposal does not exist'); + }); + + it("should not execute proposal if voting for proposal have not been finish yet", async () => { + const inputActionData = { + community_account: communityAccount.accountName, + code_name: 'codetest12', + contract_name: governanceContract.accountName, + code_actions: ['testaction1', 'testaction2'] + }; + + const executeProposalName = 'initproposal'; + + const serializeActionData = '8040f0d94d2d254500800819abac1245008042d3ccab36650200c2a42e2393b1ca00c4a42e2393b1ca'; + // console.log('--------- governance contract: ', JSON.stringify(governanceContract.abi)); + await governanceContract.loadFixtures(`v1.cproposal`, { + 'community1.c': [{ + proposal_name: executeProposalName, + proposer: proposer.accountName, + voted_percent: 100, + code_id: 0, + code_actions: [{ + code_action: 'createcode', + packed_params: serializeActionData + }], + voters_detail: [{ + key: voter1.accountName, + value: 1, + }, + { + key: voter2.accountName, + value: 1, + }], + proposal_status: 0, + propose_time: '2020-12-10T04:01:08', //new Date().toString(), + exec_at: '2020-12-10T04:01:08', //new Date().toString(), + }], + }); + await expect(governanceContract.contract.execproposal({ + community_account: communityAccount.accountName, + proposal_name: executeProposalName, + }, [{ + actor: communityCreator.accountName, + permission: 'active', + }])).rejects.toThrowError('ERR::VOTE_NOT_FINISH::The voting proposal for this code has not been finished yet'); + }); + + it("should not execute proposal if voting percent less than pass rule", async () => { + const inputActionData = { + community_account: communityAccount.accountName, + code_name: 'codetest12', + contract_name: governanceContract.accountName, + code_actions: ['testaction1', 'testaction2'] + }; + + const executeProposalName = 'initproposa1'; + + const serializeActionData = '8040f0d94d2d254500800819abac1245008042d3ccab36650200c2a42e2393b1ca00c4a42e2393b1ca'; + await governanceContract.loadFixtures(`v1.cproposal`, { + // scope: [row1, row2, ...], + 'community1.c': [{ + proposal_name: executeProposalName, + proposer: proposer.accountName, + // pass rule is 65 + voted_percent: 64, + code_id: 0, + code_actions: [{ + code_action: 'createcode', + packed_params: serializeActionData + }], + voters_detail: [{ + key: voter1.accountName, + value: 1, + }, + { + key: voter2.accountName, + value: 1, + }], + proposal_status: 0, + // server time always 2000-00-00T00:00:00 + propose_time: '1999-12-31T23:59:59', + exec_at: '1999-12-31T23:59:59', + }], + }); + await expect(governanceContract.contract.execproposal({ + community_account: communityAccount.accountName, + proposal_name: executeProposalName, + }, [{ + actor: communityCreator.accountName, + permission: 'active', + }])).rejects.toThrowError('ERR::CODE_NOT_ACCEPTED::This code has not been accepted by voter'); + }); + + it("should execute proposal successfully", async () => { + const inputActionData = { + community_account: communityAccount.accountName, + code_name: 'codetest12', + contract_name: governanceContract.accountName, + code_actions: ['testaction1', 'testaction2'] + }; + + const executeProposalName = 'initproposa2'; + + const serializeActionData = '8040f0d94d2d254500800819abac1245008042d3ccab36650200c2a42e2393b1ca00c4a42e2393b1ca'; + await governanceContract.loadFixtures(`v1.cproposal`, { + // scope: [row1, row2, ...], + 'community1.c': [{ + proposal_name: executeProposalName, + proposer: proposer.accountName, + // pass rule is 65 + voted_percent: 70, + code_id: 0, + code_actions: [{ + code_action: 'createcode', + packed_params: serializeActionData + }], + voters_detail: [{ + key: voter1.accountName, + value: 1, + }, + { + key: voter2.accountName, + value: 1, + }], + proposal_status: 0, + // server time always 2000-00-00T00:00:00 + propose_time: '1999-12-31T23:59:59', + exec_at: '1999-12-31T23:59:59', + }], + }); + await governanceContract.contract.execproposal({ + community_account: communityAccount.accountName, + proposal_name: executeProposalName, + }, [{ + actor: communityCreator.accountName, + permission: 'active', + }]); + + const codeTable = governanceContract.getTableRowsScoped( + `v1.code` + )[communityAccount.accountName]; + + const newCreatedCode = codeTable.find(c => c.code_name === inputActionData.code_name); + + expect(newCreatedCode).toBeTruthy(); + expect(newCreatedCode.code_name).toBe(inputActionData.code_name); + expect(newCreatedCode.contract_name).toBe(inputActionData.contract_name); + expect(newCreatedCode.code_actions).toEqual(inputActionData.code_actions); + }); +}); diff --git a/test/community/community.abi b/test/community/community.abi index c81c6c2..085961a 100644 --- a/test/community/community.abi +++ b/test/community/community.abi @@ -581,6 +581,20 @@ } ] }, + { + "name": "revokebadge", + "base": "", + "fields": [ + { + "name": "community_account", + "type": "name" + }, + { + "name": "revoke_badge_propose_name", + "type": "name" + } + ] + }, { "name": "setaccess", "base": "", @@ -1352,6 +1366,11 @@ "type": "proposecode", "ricardian_contract": "" }, + { + "name": "revokebadge", + "type": "revokebadge", + "ricardian_contract": "" + }, { "name": "setaccess", "type": "setaccess", @@ -1462,7 +1481,7 @@ "key_types": [] }, { - "name": "v1.cert", + "name": "v1.certs", "type": "v1_cert", "index_type": "i64", "key_names": [], diff --git a/test/community/community.wasm b/test/community/community.wasm index 1ca4495037ae664e44224340cb0764fe71ba0078..90c397587c396d5d8e34d0d6507fd7fe23e1d490 100755 GIT binary patch delta 46709 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 2.1.2 < 3" -ignore@^5.1.1: - version "5.1.4" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.4.tgz#84b7b3dbe64552b6ef0eca99f6743dbec6d97adf" - integrity sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A== +ignore@^5.1.1, ignore@^5.1.4: + version "5.1.8" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" + integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== import-local@^3.0.2: version "3.0.2" @@ -1910,11 +1945,6 @@ imurmurhash@^0.1.4: resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= -indent-string@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289" - integrity sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok= - indent-string@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" @@ -1934,20 +1964,20 @@ inherits@2, inherits@^2.0.1, inherits@^2.0.3: integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== inquirer@^7.0.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.1.0.tgz#1298a01859883e17c7264b82870ae1034f92dd29" - integrity sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg== + version "7.3.3" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.3.3.tgz#04d176b2af04afc157a83fd7c100e98ee0aad003" + integrity sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA== dependencies: ansi-escapes "^4.2.1" - chalk "^3.0.0" + chalk "^4.1.0" cli-cursor "^3.1.0" - cli-width "^2.0.0" + cli-width "^3.0.0" external-editor "^3.0.3" figures "^3.0.0" - lodash "^4.17.15" + lodash "^4.17.19" mute-stream "0.0.8" run-async "^2.4.0" - rxjs "^6.5.3" + rxjs "^6.6.0" string-width "^4.1.0" strip-ansi "^6.0.0" through "^2.3.6" @@ -2180,9 +2210,9 @@ istanbul-reports@^3.0.2: istanbul-lib-report "^3.0.0" jake@^10.6.1: - version "10.6.1" - resolved "https://registry.yarnpkg.com/jake/-/jake-10.6.1.tgz#c9c476cfd6e726ef600ee9bb2b880d5425ff8c79" - integrity sha512-pHUK3+V0BjOb1XSi95rbBksrMdIqLVC9bJqDnshVyleYsET3H0XAq+3VB2E3notcYvv4wRdRHn13p7vobG+wfQ== + version "10.8.2" + resolved "https://registry.yarnpkg.com/jake/-/jake-10.8.2.tgz#ebc9de8558160a66d82d0eadc6a2e58fbc500a7b" + integrity sha512-eLpKyrfG3mzvGE2Du8VoPbeSkRry093+tyNjdYaBbJS9v17knImYGNXQCUV0gLxQtF82m3E8iRb/wdSQZLoq7A== dependencies: async "0.9.x" chalk "^2.4.2" @@ -2736,6 +2766,11 @@ lodash@^4.17.13, lodash@^4.17.15: resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.19.tgz#e48ddedbe30b3321783c5b4301fbd353bc1e4a4b" integrity sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ== +lodash@^4.17.19: + version "4.17.20" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" + integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== + lolex@^5.0.0: version "5.1.2" resolved "https://registry.yarnpkg.com/lolex/-/lolex-5.1.2.tgz#953694d098ce7c07bc5ed6d0e42bc6c0c6d5a367" @@ -2748,6 +2783,13 @@ long@^4.0.0: resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + make-dir@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" @@ -2785,9 +2827,9 @@ merge-stream@^2.0.0: integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== merge2@^1.2.3, merge2@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.3.0.tgz#5b366ee83b2f1582c48f87e47cf1a9352103ca81" - integrity sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw== + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== micromatch@4.x, micromatch@^4.0.2: version "4.0.2" @@ -3237,9 +3279,9 @@ realpath-native@^2.0.0: integrity sha512-v1SEYUOXXdbBZK8ZuNgO4TBjamPsiSgcFr0aP+tEKpQZK8vooEUqV6nm6Cv502mX4NF2EfsnVqtNAHG+/6Ur1Q== regenerator-runtime@^0.13.2: - version "0.13.5" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz#d878a1d094b4306d10b9096484b33ebd55e26697" - integrity sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA== + version "0.13.7" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz#cac2dacc8a1ea675feaabaeb8ae833898ae46f55" + integrity sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew== regex-not@^1.0.0, regex-not@^1.0.2: version "1.0.2" @@ -3381,14 +3423,14 @@ run-async@^2.4.0: integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== run-parallel@^1.1.9: - version "1.1.9" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.9.tgz#c9dd3a7cf9f4b2c4b6244e173a6ed866e61dd679" - integrity sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q== + version "1.1.10" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.10.tgz#60a51b2ae836636c81377df16cb107351bcd13ef" + integrity sha512-zb/1OuZ6flOlH6tQyMPUrE3x3Ulxjlo9WIVXR4yVYi4H9UXQaeIsPbLn2R3O3vQCnDKkAl2qHiuocKKX4Tz/Sw== -rxjs@^6.5.3: - version "6.5.5" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.5.tgz#c5c884e3094c8cfee31bf27eb87e54ccfc87f9ec" - integrity sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ== +rxjs@^6.6.0: + version "6.6.3" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.3.tgz#8ca84635c4daa900c0d3967a6ee7ac60271ee552" + integrity sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ== dependencies: tslib "^1.9.0" @@ -3436,7 +3478,7 @@ saxes@^3.1.9: dependencies: xmlchars "^2.1.1" -"semver@2 || 3 || 4 || 5", semver@^5.4.1, semver@^5.5.0, semver@^5.6.0: +"semver@2 || 3 || 4 || 5", semver@^5.4.1, semver@^5.5.0: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== @@ -3446,6 +3488,13 @@ semver@6.x, semver@^6.0.0, semver@^6.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== +semver@^7.3.2: + version "7.3.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.4.tgz#27aaa7d2e4ca76452f98d3add093a72c943edc97" + integrity sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw== + dependencies: + lru-cache "^6.0.0" + set-blocking@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" @@ -3670,7 +3719,7 @@ string-width@^3.0.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^5.1.0" -string-width@^4.1.0, string-width@^4.2.0: +string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== @@ -3860,9 +3909,14 @@ ts-jest@^25.4.0: yargs-parser "18.x" tslib@^1.10.0, tslib@^1.9.0, tslib@^1.9.3: - version "1.11.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.11.1.tgz#eb15d128827fbee2841549e171f45ed338ac7e35" - integrity sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA== + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tslib@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.0.3.tgz#8e0741ac45fc0c226e58a17bfc3e64b9bc6ca61c" + integrity sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ== tunnel-agent@^0.6.0: version "0.6.0" @@ -4061,6 +4115,13 @@ widest-line@^2.0.1: dependencies: string-width "^2.1.1" +widest-line@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca" + integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg== + dependencies: + string-width "^4.0.0" + word-wrap@~1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" @@ -4084,6 +4145,15 @@ wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" @@ -4119,6 +4189,11 @@ y18n@^4.0.0: resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + yargs-parser@18.x, yargs-parser@^18.1.1: version "18.1.3" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0"