From a2c22c0e1b6340f5bcb45781416cb1fa22fbd032 Mon Sep 17 00:00:00 2001 From: Aki Wu Date: Tue, 11 Oct 2022 15:23:26 +0800 Subject: [PATCH 1/2] add lcmp > xcmp routing guide --- ...xecute-remote-smart-contract-by-routing.md | 265 ++++++++++++++++++ static/img/address-deriving.png | Bin 0 -> 42767 bytes 2 files changed, 265 insertions(+) create mode 100644 docs/sdk/guides/05-execute-remote-smart-contract-by-routing.md create mode 100644 static/img/address-deriving.png diff --git a/docs/sdk/guides/05-execute-remote-smart-contract-by-routing.md b/docs/sdk/guides/05-execute-remote-smart-contract-by-routing.md new file mode 100644 index 00000000..270a95ff --- /dev/null +++ b/docs/sdk/guides/05-execute-remote-smart-contract-by-routing.md @@ -0,0 +1,265 @@ +--- +sidebar_position: 5 +--- + +# Execute Remote Smart Contract Though LCMP-XCMP Routing + +We first deploy a example Dapp. And then mock a user to use the Dapp to call a function on `Moonbase Alpha` from `Pangolin Smart Chain`. + +## Prepare + +### Accounts + +1. **Dapp Account 1**: a `Pangolin Smart Chain` account to deploy contracts including `PangolinEndpoint` and `Caller`. +2. **Dapp Account 2**: a `Moonbase Alpha` account to deploy contracts including `MoonbaseEndpoint` and `Callee`. +3. **Dapp Account 3**: a `Pangolin Parachain` account which will be used to recharge user's derived account(**B**). +4. **User Account**: a user account to send transaction on `Pangolin Smart Chain`. Below is the deriving path of the user account. + ![Address deriving](/img/address-deriving.png) + **A1**: **User Account**. + **A2**: **User Account** in substrate address format. + **B**: derived substrate address of the **User Account** on Pangolin Parachain. + **C**: derived evm address of the **User Account** on Moonbase Alpha. + +### Prepare Contracts(Dapp) + +You need to prepair 4 contracts. These contracts form a very simple Dapp. + +#### 1. PangolinEndpoint +```javascript +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.9; + +import "../../moonbeam/AbstractDarwiniaEndpoint.sol"; + +contract PangolinEndpoint is AbstractDarwiniaEndpoint { + constructor() { + remoteMessageTransactCallIndex = 0x2600; + routerForwardCallIndex = 0x1a01; + dispatchAddress = address(1025); + sendMessageCallIndex = 0x3f03; + storageAddress = address(1024); + storageKeyForMarketFee = 0x39bf2363dd0720bd6e11a4c86f4949322edb70953213f33a6ef6b8a5e3ffcab2; + storageKeyForLatestNonce = 0xdcdffe6202217f0ecb0ec75d8a09b32c96c246acb9b55077390e3ca723a0ca1f; + storageKeyForLastDeliveredNonce = 0xdcdffe6202217f0ecb0ec75d8a09b32ce5f83cf83f2127eb47afdc35d6e43fab; + outboundLaneId = 0x70616c69; + inboundLaneId = 0x70616c69; + } + + function _executable(address, bytes calldata) + internal + pure + override + returns (bool) + { + return true; + } + + function remoteExecute( + uint32 _routerSpecVersion, + address _callReceiver, + bytes calldata _callPayload, + uint256 _gasLimit + ) external payable returns (uint256) { + return + _remoteExecute( + _routerSpecVersion, + _callReceiver, + _callPayload, + _gasLimit + ); + } + + function setRemoteEndpoint(bytes4 routerChainId, address remoteEndpoint) + external + { + _setRemoteEndpoint(routerChainId, remoteEndpoint); + } + + // origin from pangolin to moonbase, B + function getMessageOriginOnPangolinParachain() external view returns (bytes32) { + // H160(sender on the sourc chain) > AccountId32 + bytes32 derivedSubstrateAddress = AccountId.deriveSubstrateAddress( + address(this) + ); + + // AccountId32 > derived AccountId32 + bytes32 derivedAccountId = SmartChainXLib.deriveAccountId( + 0x7061676c, // pangolin chain id // pagl + derivedSubstrateAddress + ); + + return derivedAccountId; + } +} + +``` + +#### 2. MoonbaseEndpoint +```javascript +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.9; + +import "../../moonbeam/AbstractMoonbeamEndpoint.sol"; + +contract MoonbaseEndpoint is AbstractMoonbeamEndpoint { + constructor() { + remoteSmartChainId = 43; + remoteMessageTransactCallIndex = 0x2901; + routerSendMessageCallIndex = 0x1503; + routerOutboundLaneId = 0x70616c69; // pali + routerParachainId = 0x00000839; + feeLocationAddress = 0xFFFffFfF8283448b3cB519Ca4732F2ddDC6A6165; + } + + function _executable(address, bytes calldata) + internal + pure + override + returns (bool) + { + return true; + } + + function remoteExecute( + uint32 _tgtSpecVersion, + address _callReceiver, + bytes calldata _callPayload, + uint256 _gasLimit, + uint128 _deliveryAndDispatchFee + ) external payable { + _remoteExecute( + _tgtSpecVersion, + _callReceiver, + _callPayload, + _gasLimit, + _deliveryAndDispatchFee + ); + } + + function setRemoteEndpoint( + bytes4 _remoteChainId, + bytes4 _parachainId, + address _remoteEndpoint + ) external + { + _setRemoteEndpoint(_remoteChainId, _parachainId, _remoteEndpoint); + } + + // origin from moonbase to pangolin, A2 + function getMessageOriginOnPangolinParachain() external view returns (bytes32) { + // H160(sender on the source chain) > AccountId32 + bytes32 derivedSubstrateAddress = AccountId.deriveSubstrateAddress( + address(this) + ); + + return derivedSubstrateAddress; + } +} +``` + +#### 3. Callee +```javascript +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.9; + +contract Callee { + uint256 public sum = 0; + + function add(uint256 _value) external { + sum = sum + _value; + } +} +``` + +#### 4. Caller +```javascript +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.9; + +import "./PangolinEndpoint.sol"; + +// pangolin > pangolin-parachain > moonbase +contract Caller { + address public endpoint; + + constructor(address _endpoint) { + endpoint = _endpoint; + } + + event Hello(address); + + function remoteAdd(address callee) external payable returns (uint256) { + uint256 messageId = PangolinEndpoint(endpoint).remoteExecute{value: msg.value}( + 5320, // pangolin-parachain spec version + callee, + hex"1003e2d20000000000000000000000000000000000000000000000000000000000000002", // add(2), + 120000 // gas limit + ); + + return messageId; + } + + function latestNonce() public view returns (uint64) { + return SmartChainXLib.latestNonce( + address(1024), + 0xdcdffe6202217f0ecb0ec75d8a09b32c96c246acb9b55077390e3ca723a0ca1f, + 0x70616c69 + ); + } +} +``` +## Deploy + +### 1. Deploy Endpoints & Let Them Know Each Other + +1. Deploy endpoints + + Deploy `PangolinEndpoint` to Pangolin Smart Chain. + Deploy `MoonbaseEndpoint` to Moonbase Alpha. + +2. Let Them Know Each Other + * Let moonbase endpoint know pangolin endpoint: + + ``` js + moonbaseEndpoint.setRemoteEndpoint("0x7061676c", "0x00000839", pangolinEndpoint) + ``` + "0x7061676c" is the Pangolin chain id. + "0x00000839" is the Pangolin Parachain ParaId. + + * Let pangolin endpoint know moonbase endpoint: + ``` js + pangolinEndpoint.setRemoteEndpoint("0x70676c70", moonbaseEndpoint) + ``` + "0x70676c70" is the Pangolin Parachain chain id. + + * Let moonbase endpoint know pangolin endpoint: + + Not needed for this example. + +### 2. Deploy Caller & Callee + + ```js + Caller.deploy(pangolin_endpoint_address) + ``` + + ```js + Callee.deploy() + ``` +## Recharge User Account Address `B` + +Transfer some PRING from **Dapp Account 3** to **User Account B** as gas fee and cross-chain fee. + +> How much? + +## Run + +Use **User Account A1** to send a transaction to call `Callee.add(2)` from Pangolin Smart Chain + +```js +const fee = hre.ethers.utils.parseEther("300"); +caller.remoteAdd(callee_adderss, { value: fee }) +``` \ No newline at end of file diff --git a/static/img/address-deriving.png b/static/img/address-deriving.png new file mode 100644 index 0000000000000000000000000000000000000000..4c52e6de043c41de187afdc2164bdce069883fa5 GIT binary patch literal 42767 zcmeFYdHB=Rx;6|5f}mRg6;Kqn%npzy=@11aX)`o!+NNV#P-vP?X`7~Lnxt3jG*_uTt^ziHQQ*cUn} z=p{3gFQ(fKM4W$q8wf+Wa#bIQxCX*-QdNgZ`D9j0ma4;)v<`~E^-@{NXYy(3&wF49 zhOf6k*IO)M$UYFkVGDRekYSL`lKAufWHzn*yF%+Q2vjhHOQ!OQUasZ_A_VyDR`hfc ze1c-|?hk=C0sL8@u@>uC`%v%|SJh%VmKHsE&Bx%G%MrZH<)u&kB?z==~q7Fp#tl#GS1dm=o|fki-V!mVt!z&wA}q zRZLl{C>200nL?dr@i1H-2oqdEjEPB+FpRLzuP}V0(G2pkQ}J*ZmNsyP4%eNeSoiVa zfSH3>CTwjgDSxo3awzQ87Mo zpw1PWAut^TDkcp-OGtTH45DrWbO-~bh5@Vw7#f9TH zu~02Q^KJqbs<15ULDq1Us!XIT7?lzwrP3wNmJmrD@#br)oe}k#-{!12gKniPXq9+G z&pV1PS|u_yD%33H-99sjcp475l*9d=ven}TR!UUEtgLg{hEFT#LWQBdelF=U9TkSB zIXNkEMzWy<<&>JJIyBVl_7!|4=(O8cb9?-$7($03mqRV+DLGWBMLY@-O&SE1iBKME zFe`+cKCuxj!x^pY$rRs}#I; z)EfZ{f-y-f3-%r5$z?>8iqbGG%QdKp#EGU6)FZm2lnu9#_S#TuT8p8j9FohcAv4YE zuB;ISMo$@G8O>0+Or?pS9!*T3M-4V#-N(6+E0trxQd}i1Y4v zwSiI5Oufv9(pmyZi{N=mi(Gxx=gzUGl_Z`#+zltS1ptq zih#Sw1XeSh@d{C^yHjAd5+uQpMvj()P|}FeEprSiaRLP>k1?3x$Mv`JWkOiqKqq);dXu#vDb@und|Y&{)F*<(zKBl0CbleK$E zJK@KZ(I~hR1G}c|;t{J=&A95`VwE@31w0bqdD31hWW{WO(A-%K+}R*%6{jyrXjLp@ zT2PS`nrK$AH0mzXYqoCi;dRicJHQ5-MJB{(Et_OqtV(!dGUW<5prDq3%DEck@LI~G z9MafArjggeRRu!Iu39QWH?cC~tt;UuVF#6#EG4jsXwieKsM;(hQfR7{YuYkag*3`p zu$z3LVhk~{G|I3n7Wb2}2+w(qa5Andd23v(h44f;8ZElLeuZ+-F{h9dNTcTRO8z2Z zk|G*pn?)8)Hr--8-{jS*$5yZkP1RBHIjsmw)Jw@EYpT_pn+emtQdJ6ZO{_+;ws?y3 z=c1BsO{8PaTDrhFb9TkAWEnkbRF!5es~0OdUoGzgrVjR&*XJhHa#75R$p{s$g|Hki zMWXSrNSf|aMk4FMM51M+5)aXVaJqpCAp^B|bMZo$)EE*AMuDp!SY5BNLPqe$P)pYB z&4+OZ)?{P#QY|00CNivq1Q|kVa-@$p@L0lP`Ut<2a}ZU@PAj1HQn5yYYUHFhL}D7t z>0UFC_S?*4(`t(%bXjO5%reC>AtDZL%Yi3|yy^_XIIS6xL>~2X81VFzUGkVR-K25a zoz508E&}|p1=3KZWGmZiwt4~en2waiU4VT#*qgCMgCQs+CGlJ&nerE{j21Vl_P7^~ zLZ0BdN4ZK4aH#m%R)z zDL2bUft3-cQm@rYyrfvU8l06Rx|YqGVa}2k0s3+tkD19-lF3{+6Nm(W*Q8Jv@Uh_Y zKiuqJ_*{*o^T~{y#FFvrn*y99fD``jd@fk-|LSv_nY6WRqXSkgT`XkyLLLvnny5># ziiu$nu31VhYpg8N*;HH?nwHk4;e$?^4dr#-Rx^F!6i*^GQ0i@YsDO`xtl3o4Wv9Fq z&>1R^SVD|5pTz7{g0*FAt_rT^7;qtkXr+dUdaD40ZH!SZD*}@R<&I1|0VQo#1Z8qX z#aphIT_F~f7yU>T^3%NJVL8RD(Gpw1G_vNhd+M?dr3-R7?WY}iOtzx}CKbare-bb& z3e`{}Y|GFw0!%ECLU3y^-DFJ#5#pFXVnOO?mWO$$B3qLgLL*B~!qxD%2mp%|O)xA% zkSy_#I}ub`CI`3@B^f2FLrNfarz2p7Qi6mA7`>*5EHC)1`8ol|5!wM+@jNZLTyV(c z@kn*APelNGqTF?dtg}AMAGaz@CIeuG<8`t%9bkhI1%_8~(nqy=N;S<2L2wxiZR86E zq*Q3s5-*hm3UTBE^*=UTj-V5&sKw(5U}2;)pCYW8dJE_%7wsv69{J&2Gftc(myO_mW}&4n>GC>9wf1KOe`dHpJ~R znrW_7XH+)N6|#YnX_YJ0RyPQ{AbZ$IDUqlo;yJ>Jd+SlJ8)xH1yy8n)LL$yPf{}`t z^o7%M7L;1-zKZHo6ZL?QsWCQ8v_SS0jEFTQos6b1$QE@83{M4{ZoEM9R3oQkeRkc( zB5aNE;^hb_HNB9+@lCU8@uO}#lgX#FV#6#Y{0S!PP?TJ?m_*E!o}=VuhE3WWN)uQ{ z0EH9wkPNy^sivVac`WYmMM7eZv2iZEh&W>wj)iF^kal5;t(GYuSlLoegL{-8^AN&b46&N=ah zOR^NHSRvHV%OQU@ZbEXSiCaiGqQqRNPB#O(wH#HeEGd}|%^$CL^ePmr!A^hBN7kw> z-i10OsZg%PoDT3KTJW`;D8yM>s6#Letz#kGG#DtC@*)8*&Zk&cQVy9CVzCqw$&9HK zszE6M6$(`&=ap>Hn5%|ygq)SUHgDME>O>|S6a_CZA%aY!fZ|YfI>QMzr!^S{%~Lrq z7Y|8km!pt}Q>iSgW!&+S9fupmfTSs?$B_@`Gc=(YL?N1rGqqepjwaF8CMr^ruafuH zQnb?mo0+gR7$!iVb;T=MU`HqzP*YW>l#OM`Vjl6(M2;%v%bqxH(F-l=;H!khd<_R( z5L_q4mjRcuTQGy`})0p^HmWYnk?un8g& z#&S_xp0JZ#JQAtkSsUKOE72?ut~r_#YkC8isXz*^mN@X7qf~O*!hWAyR{1QTFZE2r z2krzfv`ok9bz37A5&eOL9QHfRYF2U9X?r})b7|B_6yye>#{C+TokC~ub8cIma1?pz<}V1l4VCyP0~S z*JJfS%Zmo9qBBtx*#d~EJS83uWx0f1h_}qj;#89b8P7o1PdbWsA3gNiODIS zCuNJqv6$&0{JiN5OSx#w|DEzT%}#Xpb{JR7E9 z22mh0QFH*%P+6y*XTx5dPzq@b$pvC2jpZ6J>ZVb;WD#V|syZT(7{f!Hkw9gCkYiic zQL2>7lub-oSfR<23L`6uBc@r%qJ_;d6-Pv|nzUbu`cTYY5?IOS&-fZb=?r6kc z&y*RqT8py0KkCT|<))BieRW60-|*;GsKsa$H(X3YaUUE3jg@`%yq$IH1r_`NQ5=;7 zpA%nECcjyz`Hj3M4k6hLi_jti!O?f26>@^8MO%G^q2EwsA7pB z3B&*$@v*5CpsKBIS*fh*vP4vimuhJFBvf!yq?9bxQU#mpjb!|_l$dnuiG-omV4E+- z=PAvV1Fk9L=92+X0m0`@&R3`Nay|o#NI{IdAQu8I)D+t7NjnrLjQMRXuTiCJ_EgjB z%?kt|P?FOs(y6%YEKs8ERV}E~AGg)KVo7kw*;tjw-EpZVRnn^QRGy5-Dlj62d9cis9HLOE?7>)X#HE`~(3D+}%zV|EDHXJEO|Z!c zFN~_Zv%nelWUS6+LLF$?`P| z>xq{&!5e}!l`j$be5uIu@kYeof=a(pRAnppBDlS*NJL5*yrTO3rbRL>&Jb;>3Q!Ox zX)s>G>#(FNA-COcgwsr2tl2OSiqH`!pK@?zpP`GiI}&J=oo+26@!lL4^fldV#_bJ8 zQ*H?|vnboLYG*K;j9J8d*3TI&9+8paHc@x@0sx#S&Mt{c&gPP6p|v*(x?jwsP&el> z>=1vNFW;5sfJfAmI?w<%UX0=vyz|%G#D*gVis?O%L+`;-}G@% zv*NSr7!@cq!jJ>90iGzREgoQ1U9gfe(nhL;CPH-(sI-C}0l*~92W(c6N!1a1i&Ht1 z0X2@8O2Teb!lh_BBLEUKq?W^FxjlZRRf|Gosh7+mV^wZAt4zvX|!g@QL;B3iAo%1d|W{j z%y87S!ReIUumS4r;cSe;c@@P6q6yLqfQ zfEYT=MP*A4v1G+UIKgu*S6|4dZ7owQc$FYc*PMAGZzga!$h%VcLY;#WNe4mO6}uH` zFh#GO1J*88vyHG7HxuPpK=C4O(m{tBHPQhIFdB|P_)xTnDVSDM1`C{lONt5toYm=c(Fw#HU<(Pg zHLV`fjH3)vV1-H;6?heC=9?Lf#pG$1#>pK9?m!cl=u`=2pCSns>Bc}2H6N#rOMkH3A&=lT0%9- zO*tK4EEbGwk(+wd3OK4OLdh;#R)S#@*K+}{D8;kQoDFowVYNssBT^ZN*JZzH4f|Cq z()48_sw)su!!?&r1ZY!o5J@i6h_#|4sFdSz3CVe~yu(MKMkU^A292wZXd!RUgqjK- z=L!vPB4LG6UODTuG~k@z1|hW1ZRWBuZ`1`_szlixOhcmIPZKTG%wN<>xj2v{*kr^f z6A2ris=~FRSPugVp@eKuhRwIs5IB)3!c5%-Izs7)fnY!>Y^rjtCHMGHPl(TzII5D1 zH;euNpsyP@VRvdAkpcRUp4D|j&XTwXvv!kHD#G9Iej&% zwe^dFF$AXz-aNO|h}K3Q{0MA{EvYnW+ep?6>7ZRT02<0ufyfAdAqP z!&Yv^I*~wH2)G(WN6A;TVnNN~s^t_5LCG9%kvxHr2^2^$pmHG+xBTI{nykZ~q+_Vv z6?f-MPgxH7ova%r$YNM4;#wx)a|(HX!(LTNYBA`blZ8k%mJiWn(ZNaO1RkV~BopRg zyv7#2?s6dq_*IOmAnAP62ckO3hfx)4+#&OcuurfVVhd$`GT(Ad!H7SW=P*8u`iVp> zn9#*!5TT;(vfx#K>*j}vYr<7}d!q?;}GFQB*r0s5OS z7VVU~X_~cA5v~Aj)EU(9D!8F4&_qg!kVpdP^^GPCf%GxxC8sc{Dr5n1ts+d!aS&3KQ(TQR16b20lO#q{VYyy_tfHd;1&dBHN>2KfI5E9L{mg0oIGvd&P@Xy7iO zelX2Ku3l0~ek2+I`B1NDN^BapC7nShC0SuXlw1)fLM1|wTgv7#g2#`$Nk1&-aF({_ z5zb%$c(^ioENjO71r~x#IKn8JSj)KzULfm$snPui-ZDX>=qwiagj`l~fR_^*n_V!2|hTyr9P94%D5d0Ws~REUAcVUAEg{UbZ;IgdRd*Oe*j;i;!`Wt#Ay(G7&+fb4{aUglO0e z;!P^m3~QlCAuG5Q)hVU2p-L`LVKF-#54eQ}?zFf_6UNdGPdE$-;j$k%FDjunW1Kyo z{{wo(76#_iPPZ(i6K0X%;Y2P1*4~xUWxWNLeq5*Pn2(K1(JC!rY_$Y*Wt3~O@toFj zzQ7_)!x|A1Wf3Z;D9KrnLBQlA(%CpyiO>v45I3|a8*QLYDD6YJgrD?)pNUE=l(jVB z9PG}jh#b_SG{Gc5oXA!3iXg{0NUd0PivW5jW$+SH&=?J^CBm93T*Ab7SuMC7d@D^s zx>}K)4adEulvs=@X{!ZzVvQ79{3oBymAv7ow-V3ks>Pl{)2;*~icFF4h%p|`%eo=q z<*dw=M2^*ilw5|YIzXs&Apn~K2)}%+l277sJ{Cp_e!t-g)6N!l`U?rwtXAQ=pDZSm z2_xsu!<<|zSps$&S?e>@o;sp zl&aO|;~dUJFok7-rl=U0)Qp#sIXMS1E}np3sYzwnNrLpO8>sDpI!G-#n{F2ln^}tn zPA1gdVjh4c1!NvOq2#4}(@fUNrDlVGm{7|r5k*=lxRWh|grmWx&+y1Dv>NbZ7C0Sf zv^a1r(DMC^UmAAp0hVb97&7Iq*`J>4)8R2rPdXb}WgB>EI1NaAgwev@5)uj%21k3+kfQR0BDORDCr=Y@doYo!CxT8N z9!v|8%9*;sd0=0oN=4F z69%_ZNG4`ei@d9W$DLBi=j2KjmtOYdA~@b~+AE0)SyDnoS+n}(G*}canBtgnl<@j_ z!&fdw#0UuRQB-%5o`j7?2{V@Elf`D#?uz1OJr28S4zIr&%@x(8r`2BGn@BRE+2q}g zW&re(sQ)4I{NL$31uBp+6b2GGGFuU>){r*>G=EU-U+6r*j{d98qb9(KCEFh-mNcGW zy#cfk&iP<#p{nHLO)=rHan)R$L>nkyume}!g0`ALaBkWe!t^Q&i!Gpaix1 z6N*|ls2rBa=S2h~-E7m64JNB;!;ccU2WQMk)MKd#;NTQYm?6@|g^Ec}5@i`j-YW1B z-CfKJuC$HIs^PHAmZ~0J%@_RXh@YlCexn&fnaiJO*T?&eUgH14-Yek(b z=7{h*?(+MiO&t&-P*f+&723wLO+A;8EVz*lk#tq!Op68NOk$2CUI900oDDXkh|^hQ zGgQg$gn6`(Xbm@5L-A}tsG;c=Z?YL#N5an&S~~1SK}3kPoPmgX6ND2kdZaiX&3hsR zS2o%N$I+~KHWX^OAwT8H6Y)acA1P=OWP$xa(j$OoktG$HFj6);Lqr756}HKF*j<JCJP^n4&ycI_Cz;y(xp^WNo7*Q#JB|@46BxH-}NY=c`QZUNPMLf{rIjL%sNENdn zvm{Y1A7^!otzx|t)BwxW*-$3yE;@nYSn^tYt~4KtrgAwzZwUnWbV7vGOb(Vn(ohRI z3~L}MMWvQ2FuWk%)oTq8II@DMc_bYVI+9+!=*=dC0s-*K?eQ5-z@HszgA8YE$%fw@ zMS*ovz}r(XoXo~rp4IEqct_LKw zXqnQWXvUy?iJU~`!cNtmMr$QMtMCdCFH{MZB2~Luu12ycTZMuftkJ9mvw2IT8mc#3 zo}f3DVDX^f%@QV)=gn%gS_BLaGJ;i>wKg@9Nry99+JO{fhNqSf;Yht22U#<>)Z$nn zn-I-%F>AD#;1Z=^F&w5`e2NL=f;F~bZQ4l(5s9SKvd5xWR4IVR;AYbRdM1-{RY1*& zm{oUK4Lq&Hy;Y9GWG!bGI5=sBldX*kk`uazk-Q=mq^?u-q#m?0Ubv`fEoT|7su3#E;xderuqk+6a=4w8 z=u8%MGLsbeOw3w!#*}8>WsiaLS1M=A_#!FEY1$B$Ni=eWsK8j*5ZJ{O)(DVgd9YLz|$dJ#A0DbK4mi+Ud>%L z)P`2ZD(R|e;jp0BisBWj3Dj7+q-L9FC1ayl4g|Y}SPbGSMl{uImIS39r^#%wPC{{& zVV%4xb9os@#T?DjDT2$%)gaYS0*Pd*Kqk_(O~yQB#?D&IT9GcgYkI?F2Pw-$H4vy; z!Z8_TI5Zdn=X=PYHIx>hBnBf{m)#8kSWxP+A3_3hB3+>*Mi$t zt&B^-P%U4}SYo=tSKt<;`q5;Iae`p8m74lLu@-Rk->2CT@`ZV?c-ytRsvTh9Ve{61 zJ>1z0zkTM8br*N|`+&9&+*1O?aJKtJ-MhDm`0A^hmvk>a$*i!C;&Jk!FJI{|T=e$r zDOX){^;KlP>+L<7<@0X8h&grhzAq+!*~7Lu^V_c94>gWf2V&VRH?A0b$lu<>0b@DefK$iKkEILbJ4zg7Zx;v@A^)D`7h_Z{Zqcm1&r4(yZ$fN_3Epzr!9ZI>{nmZ)^Pwm z?WNB@%KgQ{x8`Uwf6re})kXhf8vof+{>L=_lOg?&Y5c!n8s87^Fxavxr&{sTqLMWdR{8`$~R zHEzY9O}w&kPkmqM^mgyIhpfnB2On|X8F<629N0AaRfT-`hMKzRiu$-CJD*zp$=ctJ zzHa{Z-K#H7IHeuPzHWR6AAiVRzV)cpzDMu5xB2a}W7;>5f92ji{@9w6U(NMv&p#De ze(6o8zjwY|-naMUt|{%$xu{2v4u=-o_f)r!bWHpeeVqG8X3U8*za2ZUc=8#1+PN2K z!|$0fV?%cF#5ojzuRYlz9*?g&IDhm9YsS}I6!qG|=i!Um zkL~_}XX9;~vzg3g`>ZFi=M%47LpYriKZ?vBVjn!Xb9wElL5JRdxbQ~!5OVyT%gZmj z_C(y>hg{R1?l9z~6)Rqx_?yu-gx_f1aq^nVq}oqk^Wo*uZLvsT^{I=1WBTAvn|i^s zf9F%7yJpVZ`0Bn%cYB7d?wH-a=xzJH3DY`XX|}uERvh*FuRp(Ne3uB!h9{obQ(txH zp~9@Qwu3{?{`Se($>g1XyJFVjbw9p;<2z@E&cMwM`W9NN;V&CKg zcU-QFT1wqBOFMP&%u8E`owJS!$j5(eYrA+>ALQKBrrFlxkG!x3RB_LY55e@-@zFrWfH4S!?Y!_dtZNxyz|N3XJ*cxZM&&_?@hlx`9qJLr+=Hg zr}oJguY7Xrn;$<Uf>Sn`H~W2kW`$lTRkBKDB?^h2pz&{=Rzhw8n-vFT8nH<-j}1 zw`X3G+x1fV=*YH5-@9{h6|r1+hAV&a+!eq4YuB_@s~pdaUAOn-(Q%J&o;&!!pm z{$b5V@99P2^NadTKKoz^&0lpC9yGI z9E-$$zinZ=!@V!K-1gS81-H(8`|e(g>7|8Fo})&+{gAaV3!B=%{lyDC>fZH-yNo3) zKVZLXx%T-P-roB8#?y*Hmf6-#dH zcwq0aTVCru_wq?RJa;H};J|@<;JdG;|M}sEvzV^b3)*d)24F`vOnvMba{acBCkHO# zuP(pw!yWe_XV0!aya;*gj{Cc;nmgsz9v%8qv)T>bId;;iWmA9o{);#FcfD}!14{zq zj_i5;)gS8fdREwO2tQ=P?>~QX5^UIe`tiDU$-DjU9U-2cXpc?){$Qb4e5SGuSpS_1 z#!kZQ7k0gA=1tVhADffjKXvu(%juQHUE+vtCvUmx`MwW3Dv$n9-y5BMD7GD#To+*e z>;B%cZ)5eh?^_N%^~R8?r>=fr---vGd+o?IXnF7H5i1v6Gy2rbDc5#f_1e}6J2qgq z^+|5d`loljWY#mM7ADo{VDYz)`0@OcBlfR2d}R6awnOlQMZ1m9OTBNN^u`Z;zBmFu zXDmh2x4(93#G`$my>-oNmSbOxnY#VzwF?g}ymPzjCVTO)yVJ<6tM0$2{gvl;N&a-r z*pGKl`t7?1knG=vOguFq1sHUw!U}>C-*CPIaC?_R^E|;;~o0x4F~4#PJJ%-@jqnJzsbF{9XRcEOB1X z!PO7n8h%~on&>mVZ=Lvar2p}0rw(!pb<1bddM+@>g zFX~8FiCTJJzjfOW-gDWHfgiR+J1!hFZp#i^>9gLG_YJ-3!QPGyrB~-)KRWa7j%l4Q zy!5hB_=B6X9S`>#?78KsLye7kAEr3ai!4RtU4-+2PP*AFS-U`_-BJ=+o2Qd-dMa{oh|h4YjVm z`6+Cd<=~KYtFDW`^w!C%@$OrOUv%iD=3dW+^(y5=vA$}zvRi7F7mSns|L*5*K)d5ee)>kEdbG!xH-6vxE=H*JY~T4S z_y2fDb>_wnLr(s_r1bg9Pghr;_+jA--02a}@wOdb&zf-fjoX&*SQUPF`0YcoKZ0@o zL%VVKnbNqghAh6h?e0Slb~`n4t1xU?|HaN%_coVz-@x{fFW=2)>?&+a)-raH`nOHS_J^$9#-BLa=|uJLO-Fa%vEKGWr^vlmj?@->)N7}2 z@|B~ff5d4oL&UFZT9IJKq2T|!zdO9^>8sbjwQS(5uO)b$`j5$(Zqo zu7A4k!A01ZwcEiYoH;dk*t*l&74KgB*nu(IRt{=^)8!}6ANSLcP8XaQ1?H>X6R?h| z*7kYy(?Lgh`iEVsKyrD6y84E(3$+Vx9@b~sUHcd9edCV%mNa?}Y~O$V1GD?xtn^)< zJ8IoBZQ9AzhweAm{I^GuoAJz0>7`#~vGy`neY%8o%_qbQIp$f^`}D z`0-9tOXBzEF1~!>I`w_r{qEsTV_!SoY1`A0<+GOkvU2N@)wM3m1{@sl?fUEA?0w(1 z=A}Pfms&ld@BEkM2j~5E7Ou>=@o>Ct@q~|mAm^;U=ACD*T^cE!2p!sf#d)nw^qIE5 z+gw1$_Re_;$-D=BmD_ucJoNrPjjg9b$?twT{9;7dGl1^a|FL~7KR0Slj~8BD_<;+b zvDw|l-o<{R!@&g)0-D!nZf|AI`_nFStX|SL{n&X6z5p|D-jx>yzkKV?%O62rnl^UC zd(zs?2YX%Od+uaw$jNVb4~9S@)a2-M;oT{MbK_Ow*Sv-!;Gg`t8?} zolkT>FksMi*S)8e0@I(x|JYFcu&16FB|SQB|1~`Z`Mw%@&B^kx$xqyV;KVt@#veR# zKBDcMb;H4Z%F*99oo90d?z`>S!RIcahA+OaZRDY;547#rJ$laWd9L+~TkgEa?B(yR+GJTgeE0j)g7;nf z(U3uXuDDfb*J-hJcfVbG=l2*xzVqgs-Z^||4s0~(`_=Dssdo*J#^l$ZS#(<)ai7?B z@Zz7YTk2Z2=iEzCY3Vwgp)Z4y#5^RCD-kvq!;3Hke{B6_lUSm3l*V1v0TBP3p z_K@%v{?K;&3uErsWPkmQ1%r3~c-h)MwhIgUdyQ9S`x=`IL&x@cWaF!kAA0 zTX*vFL2EDAHa;Fu z)zDVX-F3v)ebp2|C_dX)-P!T&b>A-BkBB?HBZ@PYTTa$L-n(dNX6JpY^+l5p483~Q z&bApFrw$LUzH{i?=bY$t_{`$n9X5Fn9claS^H(n)PItX=&QmWmFC9RCw`TV%8|mrq z4O!l2v#0&WbB3&r;CqLRyY^+WcK)yqE44O$-sv;jdkyNlu5HHSeGk@80MuHw=iFll ztDApWV()Qq%-gdbfBYx(;E>6iwD_fmyN_v>uY6a!mTp{e@W_^V*WSbY^R`9l3ob*U z0rIWM%~;oS+>W!A@a!8dTk_@CiyKX`&B_x{dq`*zhA4*%Np=v9X=eSXEf zrEko>ZTd^3w)4$%*j;x|`A3)Uv5mcktemlZ_8U(uf9)wpy60ORf4U!&H=aH9m3D6CXVfc*zINV3)5(KD&3!sg1uLnz*_!{oanRp8sXH zu`8#|*iqm8<_=@o>`Oj-^yzYWM!Cp_}B4w zu5Z_S==O7Vob(b%9rp8}4N~sT};XiOg z`#T(c4!}1I{I`7a{Qy9VZvXowt6tvu%gasJe&X8$lcq#K9QfV2NB3=7cW}&}4QtkX zx0&~SI<(Wt6AL>}{C?TfrAOad0_{H@op}*^{^w5)_Z@BYOP{m#@Y%zI=~Errh9|l` zJvjE*`F$N9m>ce|Z`VKGx_9d>{@FLy4{p0;pkJ+cp#3F>kX;iV`I2eZi5%pA^ze%Jyt}*JzP-+s)B96z|VC$+NIFV`(S|KQIPsE2-A{L7J#wqEqgh!19b_ti~X8$F*t_2u2ewaNd= zO=0&=7^1Ci-g}$vW^BulTh4v#tBJeb>lJN#^x|ixgZO0oWt(~bgh%H+@xQCAj!^(i zyWQ!+-8<;+g`=OxPTukw(b08P?=FrWqc$w)G^R#04lnN_&rB$tH%|1e-nnS-JJ+7N z5D1xPzv=do>%S-w|DOW8{%#;itm!hEoblJv?aBYC=il>lNtZWHeg8!C$;Xcj0aSHh zhjYfRdD}BE{zUJQgP;9p?CGbvnA4^#n!9(&GjL19US9=sJ91ML`y<>Oc%J&^s}%p`XUS8{Y0dF&jBJs6%wn{^f_i8outdIPTj|UtBu&%WFr< z&y4-pGp`5mDi=&`>wfR4$H#T{%ItmdBSS zZA6c42Mr$YHd9?tT-Ntt+mh#BeeuZ=U{BsW;DZxu@^kwB{N`+a-k+NM@xe>n>!>?{ zae|D(&NIRX)!^dp-GLfLUhEJo zOoua$Z%%anpy~V7IsD1LZ5Xxw;s;jp3o}1G{_O7Sp8j;e>u;QJY(;u6nmc`S^z(iH zID18O#if^ppOVIvc0Yc_Wv~7ov)PsLYwt4VuQ>{)>V;Omr|{EUdFUURgK*y2HaSFx#zdBwyy_`_s|dCxne8*^TM53SI04f_uq9A?euu*;wSp7`DWPa zZ)DGe-xunyoLThR%}3rJ|ATa5`K*6^GW?dAKW{y=XXTW$w#S}&7AjSJ53r9mpQhWM z?{acBNQ)f%bh-2=$_+j*_u;Vtjy;1qv}e|b=1!W)h0M?HcEJ2+TRikHTUHF_f9(0x zq3zoyoI3l<{5wATHac?fIqD0`-OAumr@mp{dgA80{qz#^2=)!L>&%3E`fok*$?!FS z2X45U9~k(3_2G!U`>HvhJ!<-&_;IjH?!)rxVWH{d`c%i=mT$ISOPngtWJ2r>*9;i> z5%c-i;UCxixTr(vTHu13zUI^Rw&x>VI^KO!f9&SnKP=QA>%07x19$bUz05uCviA4= z*fkuQ|Jks8pL{rx{^rOH-M=3JrgS?JJ@3!dlQIYx$3LcCb7S`xpsA1gex>iZEdBC) zZATRPY-S+4;HBR>r0_4>Jk2|Af_6VSf8BM*e(uzNUY}1p76%SF@hiGuWA(k!BftFT zEhA$)4?p($mY+{d*gcf)R#^V*2eE0AF2HHHPMu+~pO^~BILOrmB z?RcGU$qVkA(@#FzYghp6g4l?*npY?+5-l^3OisG!XPTbo!bx9Z%0}H~9C?OXtqIfxrEs@zb@%fore7 zw{G9LanamEAErX{A39j*v-b7z#HoYys2)4Vr<~f(rWXEi=lI1J&KuAH4E^cKpNXz< zScmD{uh)NaRYd6MTJmnkcl?cyR%JI{e&GC}TP`l{c%&14?UCw-i>{kD>>wWqvKhtKv0 zGctMNqnG{ZgDxi4f8<`*4gi91XS@Ec()8S|s~>f*`+co`xEg$P=M9T{l|SA&Yp?C* z#Ven9({o#M#o(^PJ=-_$pSQFzTDh{FHFbLRo4DaFQ%wEGDwD))2x%cb~d!qRdk2NrPG_mBa4;L=%d;9ITcU(XC z?HjpwuO;G7pW4;db)IEz&OGBTJ=}%p|_=Y_ND_Gy?x0a7$f4JFp zARF89>Wd!eSUk~vnYr12*Jmqlojd8+7JkLcr+*pp^Q+5FxL^Ne+_sNPpT1n^WgNZv zF6X9@dOUo?OI7Wn%X-`v9N3?K#M>wQ{FwGXA2_h%W#jq*@5H*jci{umo_*<-E4TN$ z*t?Q{WcGw%S6s&~Xv_fK=KiH*ANk_P6EnwNEWT#Ds0$b^G5qNZ{ur$Uz;)U)Z+^6U z%HVO-jE6crKIAw#chbIh`Okyfa={<7|BJ4#j*9Bv+x@91NC-&7&>ezwgHl7|(2X?G z4Be%4NQ*Q>cXvvIq#)glba&s4ob#^to_j894U4~+z4!Oi&+~k?KyP0{w8MJ4=(pn@ zoLo%dG6&)r~{t9ex-5#xu}6#Uptm z6XT3k@xhVZXw^L3a*=o5cSoV?%mx4E0?g8m&rw#c{x4=%Kc; zsapsP_N%28@>3t3q8_+VPJFSpD+F13L*^7`r%xp`w=D^gwfWavqE-CkJ*LW z3zv40qN%c%yINeLp){wMYS{)+l{3xzWU9rpL0ycK=_>wi7dGqic`DV=sN=&PqAGy} zQunT7$1!_F==eNLb~JmBrr^dy4)E_u!Stg?C^|&;9ki;q*TEm@0_}-u{1Be9tK8MC zOvLx3eiX3ldeyHM6{mc z@U?kqG~=>(T)ecdFF|3pnl2jI)@fckkFz+~tUW#)C$7yjJkBXGSwFh1flU3Bg=8>O zqD`TmB*%hIPnU9-QdsZip4gZuD(9EFi^FFDI>3a>zn~ou5Y`7A6B$6C5$2jbgoHnT zKhXk5@KH#~@k)=XeW+TU6IM0opIlrn5t@YQ7H{cZf3}*b!P+0Xc=60#*AO(dHW4rIJ$z%{e~*KCbMf4|(JvMgR_e)xf_`#~Zr-hOct!i^de76va0Usf1g;1}^pY@9IZLHPMkRY0@%WBHmx!`CQq6VcXpme1SDP0 zq!^t@*nLZ#HSy|w(qysmjdvwq^=(K#OIF@XplZ4nZ4ViivX}Cdb&xFqg%{#RE_!RH z&h|FyCHmC7Npdlc9Q`3=H0STI+3)DG9!35|$Nc=4_li zuCvZ2#E{kMo!-EiMY`JDLWX?!Y!&+}=V&IhlZA7yYoIY1)}{{m+nCfzwuQua;UyK# zKKtAjX#a=k^+}8?3ZzvP&1ij%jFnud*3l8GVEvAt-c@aHn45N=<1R@U1?^>fw-x_L zmebQK=hpt*%<%+8WoXqB`j?5+80;?{X@q|B?svrJCMbiq;QRA=^eN91BwIz(C1c%Zm~1DYdQ?9PiWiD}|qXO^C;rgstUe zH!8&8J(T53R3EFQylu~-HLYHk;baPy?)dynW;)q$$RF^blQw0!A(ranZ)TRheIFtn z@gf4m*@LCknK#-LEVFZsj_(J*R`|F!(uk?V&<`JuY-E!ZObm!xU2I+itGC$&O8g$n%Gj6ASz+U~IcH~Vnl{8XE57=A=L zloDxir}w!*H0aNywHBnG`uw)R@k~;T9(LW`$~we@9neRbInS|KE6h-IlDt;Oz~tFt z$@$uRLM-7`F-qh3c57Oz8E*tJZ-nX90&)u7zT*wU$djjT^3oA}Z)KT0r4~d}up#D~ zdnZzG0DJM%`SP#x6KRu<@lu<~cQ2OmiOS5uKFz|Y1_wsR${e)nUGVR1%sh8?*k0iZ zy2E~BK1(NeRm=iLAa!mj-4(F1fJ9ME`)VTk-`4mN!3var-_ zbwn_=$?V3R{R0yRwzFgFOg5e3tQo{R2zziqHs%f}Tx>kgpD7L{cb}>`9;|`8vztr@ zHG-yk6<_TOZYk95p8oB#K?hxQtMQgLXilcCaQHN+P_ew%a7v4NXTcfcA!4QpU4O0(QRbysdJDKAHJF%$>4`@Mj@ah+ zu2%isVU%*W(NZ4h0hwlvd3Y#`c|}3GF zo~krOkB*5czf1EzSl25ohju|bRf~fD5Ho{+G4f?-Tn{|0bJnr>zLvL*8t4DmnIr&3 znHxb}$UuS*OTq|Vww8-6R>DjqsY9tKB>A5&_{|LxI~5_dkes zR~aP~+(?H{ZdqQh7GBoTFz6x-(US2p@D>brwjx-f+pj1P)qV=>wwlcZ@~u#NmFYI_ z%~==T#bu#J9>7U(({(0paNZ38V6F!3v^Yk!mB4!Y!@=4`gW-kdx|IMTyJ>H0k?I*o z?IHdVHh`{HMWW*Vkf_O!kP!N_gpnE;(vu`v8=%J~RO5Mn)J8Ke-A7e#B&invh*VnaC=d@F z*&pH`y^jC_n-o?grf#h@@xr|=VUE{h(lcwzfOB7QH)sO|5;$#Bys-?6f}@m}}EI0dI=+eE_l_ z67U{K!S{Ot`@o)iw_4Xmq8>K=R%}$}qHOBtQ|}vJ{f+>GUQu)cnYHG)I&AMBS$!_M z)srI|(J~|UBcdTx&jB|r#>|60R!MUbWFKg5t)FFvHA%M>7>s{5QuwN=5>_Gi{RFWF z)Vv<|a>H>jE{{O1D|@(}9xR+z*~?Ss_vw%YL$cO*s#zSE`bcl`W%F7^44^C`ZsGcNe(o;wciqs_v%#{dh>&;Db+8|NT z<$#`;HN7>*wkF~N2_mAM89}_#YS;1>oue2Y6Z+SL2NLAxQY3Yqus=9i6QT+$>!hte zz9I&6kSb(4XQgp&qFeI1btu6O*8FcVfcPG@{B@r*2h?oS3kzbv36C`dvtDlx+d&4n z@Q*r?5{|fRJ%bwz06E7np zkw3UO;BvL6E;#`p4LQFau^$tX>w`E)Q~>bN{(E^#J56bZ==;lAGY>DnlXZeLgE1Jo z;SrI|lCSTxTio$&o0i}}fb4_be8W((VIR8q`d54~#2z4pnSU33BqYkR=s>Mlon1a*@2;4HjbYV#TW52@J) ziAMy8>6p?D-6;rsXkOT&h;x1?hS%YiNjh`=Dbv>+rPC@BU}t#-p!M)a3i|y5zgitgWXHt9G9*yV&(E(bceaTQdK1~$(_)b5)~E^TgQ&gS z@_L+Fm0~@Fj>-1RvNlREy5Ure|6%LPeToXPEOZOSlg!0ieP+dBlXP&dOt{$qcyB*) zCit|y8D*YYYBBYMq2*#twCS!Lm5R$OR;w@8u;*a2%DLR?n1uT)Uh%7rJm`emI=6qUzC!h|b64?3f?P&J3qcuSf zU-7~l{J3C5qz&Frqy=Z7)3%Q&2Tb%5z;Mz{myxK}%HpOG$cf$e>;@bwI~p>fkV;?d zEYlDiln^AvzR`c~4+>l#(ga2j(32GZDnxv>*JE!8CZj&BTkIb-W{jVDK9i%ukNTbC zxtgP8Xy@mPIg6au>l||M`TnfoO_5?;fy+hWs605TM7;sORNx$Y4|IVcR2Tl&9;}IE`}5vCoijZ7I7Y+tji39Yq~qQU4i47#^Ba<^XxI~WqX~=$8%H7m z;>Pdo?Qkg~+f%fZCPH56&H9u3uJsD|eG7b;QI!7uZuU(UeZrW%YqM1**&7_<)p5mZ zR!S0Z{nXKheUHw?@I=Bgd~)%*!nnMG@RzkWQf58_dlCGps4Ot_|uA&hU zX-5SR^pFoBa?-nid^5 z?F1Rr@>R2p&wj3U5A8zF2|dj>-YMs)6Nskb+vzTNm#7D@4hsdip%JZK+Sy?D&&HwD zHF@2nyN?#hTd7qX&NKtLyaXiZutUeSGZzx})6;CRi9-4#I-4RlIrS-md@5h)&ms^& zwxuXALg?>|1&*HD_R5mANaj`h=7CsjQ2v)O<9;_Qrij!Nq14T5Jz#EjteMCli2!#?l7TCEkgK8TD%48y;m z0vX`ZxUIG;LC3K(u@>+H$|0rLB#Xbcl}S4OTP!RQNLQ=NbQp3ts$lEP#|OG!Ya=e1*9~7?1|(&Pzuz> zNbHXMpJtu0%z;qjehO+d_14;_A#p88a7N`bpi}8}KX37Oaqi~6IGLsu(2YmN@Xh?2 zbXj+KHOHf}wvQ|= z&;x`br#PyrMfg58gkQP~1rYl!ls0G&r`c zc{25yi80tm7!xQ(ylem>+Aq3lYn_%<0ZeeMWjA-FiAF8vtKTN5 zMfQnnd5%}ooH&2cfeY`as;MW47PJjA5i`;dXB0@K%}&aP;YCPD$*n#0cip+M&5i`i zYw!C7!3}rANt81T;>!(Dr1idZ|A5uARJGM<)>R05hWuW!aeo~98TYACh2lvbaQ9$8 zm9!XoS_QIC=c-kfxZ(3!-Xh%@dUlW>QnB>Jz9&Bocw%05#{O)d(TOWJ&{Co5+>_v< zu)R9b(AK=nSn%=;Xa} zsd_u5F`W{o?U%oC6BsGXCkgusYSn(UU6%)z#ESqwZ7^whc?kmp3L0khAoJ?`TWdlj zv;+{^XI*8Yzdcefk~#ns7|lEA+H+ei1QojJ`nKLnisUPf%4gKo>#-Q3LlmSSm5Tnf z&A~&&v)UM(Tgureb(@u&`-Th7dMmeyi)qdie!PpzaEQW6c@&GmPA@G>ul@+7!t#u+ z=bTQ;@evI4?;2qgIu}(Bqzr1Xnw5GepW^`8aVHyS;p)u{x1_jHzGU(cYKL%RX4H3r zz_KEL$$@;|)m%f!%8p)8gjLuee`E&ump6vqUDy+QvOKi$v~tBT?~@J=Vk2%3pacFX@FkhAF#ouc+B%6M=-lt;5I%d|o$> z_#$0@L>gJ-JT94t7s}2BtbY?K2uP^@u(UzdBU|ba$R7RHC)R$p`mBY8_pj@T3SzyPyHWM~v)Gu@s7a^^Wdw({&SoahpVb(r*Opkp+(?d{fZ1U9j&K*BGTf@>yecEEQR9LZo+k~1OigSMLpUAO^ z4&rTC*`F}`T}0tT#1*pHv;4iCdH&2;qL;FS4#Ex28$QdTfiH-^+O5)l9Lm&VH9Ly+`P8^(*5;5+ zNb%4yw2K1TIG3vi2^hnLnjOLt$Dqf_BSuGdc&C}Sd$6nY(aYs&I|KIFR0@me>zk0)Y0Or0Z7>lrKcumQZG z*$lV#*@OXmxRydHeJH7_+K=q;j`ELI^vcpZ{$*uvYdxyG^y**8sFif^N21!vc=d}R z2#7ySlpqS>#UBR~+{1+&4HZB_E+banN=2Q~h(YnC>Xedd<;fe)qe z)sr4dcbIm)dID)?Qq6AXT0Z+>ciDT%u+l$Jul{!k0#c7R5mEZ_r+fDlYo4OO)6(WE z>9<^qX2&Cer0sWMs3)#F!9E`WsU^mIp2S02^v)K@F=#h;e}rJGi}jt*>NzE!*iwW$9x5KtJktJrTxiyQwRe%xQSJ=I!oJcicww=SGK&P>H`1gqpmY{B4 zTLF;88D|^LuI9&yE#Y!bUIM&HzAqj58NDHUzMvB3c7572R9Abf{BUgdvIWTUs{G} z{w*r%NkCcxlg8My`fI)TE&KcJn0EzHYi4ApIkz=$%^fzLbu`x`r&f=6!SK$yF3wFp zE^z|n&NmkT>}3y~ShN_evvajv;6NQlhgTy4_C3Xw+d-;<5SpL}bpcS8|Ydgf-*~m+>f`;-Uafrq~G%M11O;6*TZcW%X zfC*Ty_QGu5maTJcI7u<)9*>4oEXn;HIWK^0e06^VY(BH*& zw`GB&MYqOZbhr2MfOP7P&a2+)d3}~)K2fl)GoP2d0?~Xf{6JX-rn7g$*|N@UZWf>;mv1dWzD5=TTYFb-KW3z|L|aou^Jz8 zWa63HAA~5Tsje@E1`~Egh zueGJ)lE-}+P;{7_5MPJiuA8y#9~-6JpSRw3(WZGAD1QP}L}uf8m}6sO9}1M|S4{y* zfBRUr3~@0us?_3l5dkpkjQajvbIpC;&VP6P?)H4KC&hW;lTlJkjQ_~UhrpSA%lih{ zUCEk$wNxvk6Zrn*)NVx1x0&#(#1T?-UEi z{340_Hb}L+64D~l=?dlGCz^6CdhL|uEYd7JTW&Vt1>$o4Px7`i@K*NBj)VdgG za@aUp)BXwj`rb+$jn^#)Q}rgsZ!1pZU|?uZegLw^di8+LoeP@^)@VMp0!b42odOESW)yxHdi(aPyS3)ViCeI+azXE~# zR;DkuFT%xjRny$q&=&9Nkgm~5+9^G)$4Fq}#9<8!>p%qGb@pA$8xG8&W_;TuL;Lfa z5b+zWnku8)d5upE!9ul*5q8IT4eVNJYt+13SUYcS{_u0dyV@-lq<2D z11znbc@S9GHQiN?LRtiob={MWKy<``?BtA~u&^*O;QZTzAk4(Iaj-ZB6}JAy-I`h3 zNgd}5nFMCDg(lv*@tel|7SZ*gl*64$`Y!o{e{%tb36F-kSZAVL75C!lm2%$M=70pf zZg`{RS1 zqfW+S!xI|neRzVNwHVP2p!W#yVAg99Sa9DLY&x5<2%xfhElVIvgyuODx`8 ztVVw0wKwtoX+>n-KT7I#@npWiQPjkQ2H+i=2JHh6ivSXOHggJa>Ipr^a}`Ko-gL-` zcwbI;rYpmD(Rvd+`}05&+xMk4f|8&9cHxN+<*iOmUg__ zzx`8a-NoRV+iJ$h*86yn8v+ns1+F$=8vvp2m!~zLh`?UraRuawhk#0o&=V{KP^IHv zS*`=xK$9k(kBJX*#KHSTd!|;Q8^F1cK}0zqW7ivyO1@&(MUf7)k6Hr3!mG%6cjgP= zcZ8?Gp`oIsy3Gf`ff9j)?r-c@D=Xd4t+kz|jU@z+CB7uJ&D2;WG4@ZRyPxf_mH?FK z%jtW-*V-j#BZcqqdm@NC3?l^tT0F0R#KJC5Szsxb({oL(?3z_(PuN;-&t~WEF&GUZ zRFh8d%3a@kUtZ9c5~2nyc<|2Q6Ps@a`Ub5ihAvgCbF4&Asl@YWVp*`DOC z#*u<63FRPO3!lDT=1}9=6$tqil@sx+p2O%`J`XY_RaGwByO!7XUOIjjEEa*+CA)jY zJyHFbPip`6weo$C+E^ka)AafwIGxy|7eHKDMOY%r-SL9x>T@Prtq<#BlhNKV8oon1GD1=^? zwN94kSgiHkna&@r_VdkHXSdy(DAQsMkWp$S+Nf61J(z62rnHsB*n-Py_>x!dqQ|jZ z35avHn^mtKY79f$*#;D$_)wu%AtO>e4lY?<>G;FL!){YwM!gs? zbahgRXUE6gtQ|K~;2UBMRy_&PSsHuLf%vm7A!Ax_R5Mfr`bg_9UCIt`x=b-qs53K1`7spO-KsX1e;YLpt5l zANA*bBLf5VS^biYxvpR1IdNx!BT=~voUqFL1N!~$+{@|$)w9`Q9|oGIUmnt~5P9F| z4~Yn`w1l=J(sljIpTlpx_dxBJ-cNNJoJ6-5xM8O%_YH`QKcYa@2Bp*al>j%Nv7bPR z?r0I)Y0mrWsDG?6_FHV-SWp-)04k`VLcp#PQPSkyy_^zdkP5}M53dy0zKy11zrEq5 zoCQD@S9ZQggV0Mhw(zJzKr81CjeQyv{YB;{0gm*`&R&t(P7nNg>EKTx;1G3b-u^Lz zt`N8`aNd6gjHG4vr1}~Zo1mo%63mJ_iGI$Nq}58=P>*(UJp$y1bgBXrbD*}afFsq1c)0Ual?R~k=5V~6JzOa9rXD|ry9 zd(4Wz9J$Q{m6MGx$ggqAf1$)ynsXqM4b-3TR z(_A`J4(4khm{PU+bqCOcCyO);o9M_2OIxmxZ@9Y(1%G2lg93|CdOiZe_po8c9!_EQ zu)VttSR^0J}*nN`~{>%%c>|Xi39syx=-wi59Iw_0{lUKKyykd{Vl3}?hi%l z9UKKkVuH;EYD~q~gC@Mcqo+qxD0k)A*B@ehEgkXde+K6+j0VT*DTqS1Y`DOr%kZ-C zdpS@6zSKPAtv>>~WzBnRCrho6x)pD-atXQ$dyz5ft>-q zUq@DW9QhE9rN59<(Gnv@CU=(1_ic>4eclxcC!@{6j*b}b+IyCtho2HsI;rOuAU8wF zz&55{G2A;+b>aXLObziwL^oVdeKwWcgoRyA%wlc=s#9(@c&-+hw}~w^eA>!$Bf$oqeLAqgT?ea$RUdvuNZED*>k>$;L2KnC5OyQ+e zgd0xnIx--fiKPqsnN?)CMw#$~Ejk?2Pn*y>$r7GNFF^N!ZjH{2j;bEvJH#qhP* z6BiR($_!;@n;FjIVx1xm8 z4Wv(H%2L_KpeIPNuT+)wLfn7SQ(MK*gXtLvy3}A2Xq1{UMfINVymr~(bk7Olv=D4)@^oHf<&)6M@mDLBo zwlJ!Soskz=2HVyd3s*LR9g+p&A}mRC@&Csgz|l&1R{`5dbp1|I|6n&q2T~(q;JX^RGP(0>h-uBYHPX#Gp_5|W& zf3MGKO*cM0`v&Nf1_i;yRtfZAJ(uO@hBhiRN_kOFC~-AR*`cw!MhLXCeV(TD7=58p zxiyGvfYivoRncAhI0j}ql*~#p2gne?*K@Hj?4mGhBR0wepewTIg|uL#ijclhD-u~Yub7i=Wt4`$Xf-eKli$t%xb1^iM5!t>hoy*}smaYNy{69rOD} zBOyEkFx~5BCSF2R*kZGl$Di)hZ$~pc4~tNm3HZMf)v~V5CATaCt2sDS#g05MO2Ula zp?C(cy!Q9rBjo}OdtX+wgg9#@0+UbC&Dk(O+h%e?4tqzhg+JfjDQZZkME7zxm=BrD z>mT}fx=K2$Z*<^G-z?PZ5q$@W?RUZE%)8ZqcP>=8f!F8~ZlL-6SkLF0&lfD1o&y#8 z)$=x#XjrUTQyOMQtiHCN9C^1He}AbT!Z-S{x}8+3>FYHF3MWR9E{zw_`jX)bgr!7&C56QO0vuw$svJZG%s6m7oZCa2k&`z<3)fnoX3fuGl{nU#6I z*0$NdO{i&K(etWbBKtIH&nyu5pu1Mj=)KIailtj`L+xKq{*4#Rh&SuJ6GY#dc1)!z z2dDvd>jh4^C@JYbU7V5G7<3XX(tQZ}@D=#HI(kPQ@=E##u$o}vtA;j%oQ5GY9RB*_ z9z?ReFX)#>r3t~nUj179O5oVIcEJ!*EikD1%`=+f4p9_Q#6D8CUl{N{4u6pyLkW#_ z|8~R|LfN0&6gW0j^9$QMR&MSWt4*fEO2_A5ikRJWfi=<3#s~Txl9CdqoHh#r&I$^9 zoYEPc&A8Jq_IBTIivM8>jB+tDrm;`*ZOWaPCF$*q=|?fJ);e!OWaFJ-mO!uYjGg-9 zAI%nPrJuRODb4~Xn*9`kd6z0%x5${VG<&3vBwTC$Heq7DCyr@QC^sz2XO$`m@gKXS zXFwP;_@(NEmpx3s-MbLR0l%PNk>H)_hul3`ehsz1eDa(ImO_Bpx3PJ1^))RRsLcq1 z2Zo7-6=Y-k!wBC5al(8M(MggUx!(>fd1}8JKI~{V8uaw9pG(y;n4&?}t@*Ut9o}sk z9(?_b{VE|%T!M|AZ7Q|{C~{{-J1!Cpcs+h4=-nTQKdl{oTdV)Elk40ZZkjav`hty@ zZ!-aOYRtl`ceX=a8J6T;wGH>6k)NwKTh$)7QDHo96QHd?s?!2k5VP44LbSK#U)<42 z+FCjaZ6UilJZ@`rib`i09^zK5jCbqP|9Eg`9;jum39H^bTgkjC~ zv0o`BM#V0F9xfGnTJB8z0(^Zf57xY+H+d-yluD{<+(5fS@XABK(qMtFG}OEjIRxZ* zSGl=iKX&^GZ6m7J=fAC*uUMj83ab~*MdDIKu9~<7}w_HvD;&0^UwGKYTi}7Nu z$smbB_3}*2L5cESBmojA7HTl!#9L_mE*GUy{hKG^<QXfrA~Wx7U{{gvlP5rRx7wnk(id+x<9F# zI4yp2$otgRuID~a`tuY1dRS$%*Sax;q!GxF87kH$^>pseZ`R6|Ua4KhA9#ASVrUIF(Pv}0_xOB)0rK@Ae>Ou|gXFFABN z4TKb-2?z4jDj`T0ybt-DII9;TOj_rqF4zyT#!?$`@=h(NslQzYs+!@XUv{$s)>^$2 z%`K8ZRg5g!4`HP3gD{?_ZZSW=eeb2){+eGkVo)s%Ob@=FI>d@+x}Kj|np3}avSRL{ z<}8T?IZ`Uw7{dYk(>k@w21#sZnI?AwwcJ-PzUPRMdmX_sJyD5$o+>(G@Qz^82e_h7I-qcB+3qLzLB?Zk(*%e>O%q$PH z3ybjeR+4nSGUkE(UkJxbNbHSLbE76l&yn$f2UJs#ycig-3&egy6ieC!@C;Uj{LU;dh@N_Ro)q`hs=z`^KvzS&|+^Ke0b!i9htkD%cE*D6;&c_Z* z@6e;eQrhKWIgr(Qj;Bby{3$RsZ%VghPGiuh$SQX(tBo!_Cj!LN#kqhzHmHW|0RpJ9 zr+`TT1`?*kIDVMFUD|Fa8nARWYf~%Y*sRzCpml~nFJ8JF&h9rWrsg68Q^WsFHT~<_ zg1?{Z4o_icIj$19dECp`uoSO%-<6k_zxV}!T@}&P$hWBZdR5ZB^jaFaINh6mq920^zY+%X7Aym8O?SNg!T3yOv6~l2CZ*b)`AQ_$AHrHO zKCxDuecBUA3I-PC*`E{cE;RG6tgIXW2YxLZ!Db!{9Z$#|PYR#(l^u#S`dekD^8^34 z2q5YzL&q5mCy-A)(yc5!ZYR{7&Vy=207#|>kP&3MN0PXhPMABJY{xVKdiMVSZP&}CZR-Yv#v-`J!&*xY#E)Zd#jNT$yGaoqMvV)1!r*K2eqtbpoB{Qy>N zEVi~{;`CQp%|5)aV-;982|zGE2WOI^V8D*TAGG_P0p!hTcG;h->w&d)u3`V-X}75i zg62#)Xd4!B*2;pnpWE_;xR)D-QdpsDlEV2>`vm|(GrV$sx_vm3#qFW?k~@xxcZ=q0 z|Kr-qHg^P2%85*bTdBfLK9!Pfg?y6pt)X%_W{ye4t>=Q1L>!g=Ul5N2+y+z?#L zQ4hc=wqSeOVXyx#* z>p}%Ex0!wVK1gBM$NPfy2VfaynkJ#B811d{6R~>Pd1^M5DBNV1<@o*P-WvdQZx)D4 zdW;5m|B418rUie>-l5Q;;o0>88n+{5!`dgE)r9=G5)q#T~}Pd`lgU z_bLFs(;%AAD>%8p!3`HAI)F_!L8tq#O?^aGejOfYd)fxj3;!UsJ3Gb%I%LXN2X9dIG)K$!;TC6w>@V}Nu zN#?`wruFspRr70Rw-V#xz5rPGDty}hL$MQaEqr?*?El{1@ZfzwF8WcJbcCT^Wyic# zTL6#RfOz{3ihkoNnF@Gy+IS@s7v?4z!M8~KA11q&2PB8MtxMTq3p=g-1(%aiaIvyg z?f7Y&nr?g2ev|(pinpVT*WK4(AZVTVZ9S^rKTthJp3u)KczEyHVg|N7(NYIC2{`$T zFKAmz`k%vPfbXLI@889{-jRQCQ>|vV){DugGW*6c8~}>sI!GjH`LF7!g}r;lpyQ-& z?;Rg?s&ucPfN5_5#r2PZP!zH@`04d8Cj-d{5thK>Z4_KZ+|Lq4(FC%UykIKj<_-`&69tijgdWl{@T`IjD@$r zcTN5&b{4quT)(ekaXztl_=v5`EV8Eg=8pqFR6R#S1io#L5yA_U3Kxujvza$>l4>d5 zISKK2J|(d7(GS4R3%PSgu4rj#Ve%<_-yX1cjr?#K6aba{piw0~7g&BtRw1o| z>S8C`#;F43SZYv41Gbi6__on5J(P(Y2R(i)nr4pg&2d-(ebdZ_6JTahl#g;^Nseu@{Kd< zMT4>Gy#Khg0T80AArD2+|C7b)BOW9%2YYIUk6Ti+$wV*<3|Io&QX-!Lk9=IN^jUbH^?NO* zrmCJgXxt~+xpEi$4aA~v-|!i^;Y|&>IXRgS zn1q@0En3~_A??!~9aka>Ucxe+!hna85AgNBhfi2%*rul$UuE%(=BLNP*9c%e=s|+H z&IfeH5D1qDbo`S1p-jDe{XbC@NZQ6ln$4+(R|^4Oe{HH)7zIxxMQeFWgav?mmJUCW zK9^0};S_^%q&KRC|6L)|M)i0=Z?6|gwW@(8ct>IO6Oy8L2nA=hSsIDwXoi=Xx0u>T zKvtTv&-Py|n-gP;_b5j1H4OGC_wCBDM!b!TKH68%n=p5VfA;_R z2e0no9RXjxSRTbX&X2M3N@w!9!xwz!btkQM}=Yz6ll4`^zB)pdo(@jzFoBs?!2(;Z}dcL5?{a%#f!YxHuQwHjO}s0hrIeKU z{Lk^9q3UsxEMOxXCM;2Z`8_79c?56Y=)0?v{5KCyi$V2pM|dg`5)ujT=0nZb6a^~I zdCn|(zh2u&Akc6`bS%nnQ8Kd6UbwDwaYn^|Pj%OkltlWj9UoL3%0xeYI$dYD4(6P{)Yfd3;9%&D&66W8EC;Cl_ zBRh(g>i*B>7H#-gkW7)~nmgaFwobu#fzL(-WIZl!gznX7Ii&tP8^q_El5|F110_%{ zRyy<>?LFI_cROfGQ!7+@S)HW9J=1hHDc60UgnF-A(UnJ}w0Sg|hp#uZWJ*(WIv)IM z{S-zLo8=Iq6|8LW&loP& zh$5k(h-VX)t6$xk7ilFMjmJ59tp_IpowK~y0!I~NzZzrc{^A`$V|4G+jeBhtY!(9F zPs5cdxnXJZXXB3PMS>0Yb>x(Wh4Jr^M9R#5BXd}4_0$C%9gpl8^4MRY*4#HET6pu* zh9@@6Ipvclq3`pCg#9vw&~|P!mGp6BnzavOxRYX^+>b7_kJ{e3JrHJX)KKyja+Qrou}T%&O%Z34n38! zm;>~dV)XUE9zypJ#h`PuNyc;%bRdB`=lx(%A za>SLDp?Yf|i5n7eNj+}Ig2#Z(_GW$vfIo&59X+!15AYw3{C;vF1<^`n-ua*Ve3f?y z?-4jDLWr2jsKlf)>%_8|!;x7-eg#M;f49s0lp~Ryf?vxsk#EOVtzkZI7^eBmTtz$c zITpn3eRc>0>Ai;7bH9)vq7?h&^W9J;&n7q5JDu?IpO? z>FE7vy+v-_W^|+Go3o3tA>O5AzQaVG%av8bt@+{3D#TQa+nXSpT~g1Q?YL*t5So zJFC|hXZZNfVrArmw7j4SO7?yJ*oK|r?VWV zJvIFn|4(~Y{?2B)hRe~h&1gzXRg{{ls;U~Hu|>M3YMp71T1whl8YQT`mJqFKtHO*P zd(cKPRSaTZn=0KRf?8rkBS_Fx5le;Sym8JibLO1uI)A|Ar+inw=Xu`mzMuPf-n`eF zH^JnV0pGqNYr|WMlY=4$kw?|WSmYXAmuCXO&S^vSacWpT!lmUKZCOZZa(qxI)lwT; z{!XSM&iuMv!9J@^rf-#JJMQM!sZ10&pja>DM{p85p~|zn>z%xEX9O^harGYFP*^RPs1z;u z-J~|MJ-@o?1*ffXJ4=?1ypry=QZ_1~`VvjerazI`i8`FlN23J~nWNa9u@NI?XwifE zaq9j#t`Xs0Ssc7AOf`1hzrIz_Eit|)<8KT=;;K`N%2-r@vW-fss&1$I1vrD`unK3r z|DOGF2jacWYJVR;Lp4v=*7k*WCe^IF(xB~onvZ%+M*zJxIo{* zjeICBBVjnSD2TrqF`jB_q&zuNW3IqBDiYOl>@Yk|Z6fK^juE3i|6Z8qG8>hXl9RwC z7l~f(xHO%5d&r8vIjw^uh1i#LT3lFafI#W+ zPQcyZu1Ce}SD99F-JByi*`iMax6&ggvQs6w_+|wHzWLh#;)&dhcO@jtBiVtIKAKSM zX3$hSkU!~*xrQbN>Ni$@rb~ z6uQrBS?)FoNhvv5*m^G-2E~pj!Sr47g9T*gwZ12C*7NU|5Tu%XoNikrw>N=`NGfT6+4&+(%2fxNQcYoZJ?(8C(^wg+!qr(F| z+L+-pk(6^a>g_>a_BFr+1dTcUv z!huG8clCyxQoo6W??E3qOH_UoriH(;G3>V%4<+;v8;{wyao1wT0`*;#b%Qpj?abWU zeY*(ZO!9@6&FRG$JKwXsiS0H^-!d{hu`DiU2g7p3)W0%@sA1(wp>y_SXJ5B2_RJN= zJ{dBx42Cx?E3|q}{+cuiF~{nq`A~|n-#ArVZhTw4J}~IllMV5tY3z=Rj0rzF{?L0l z@tekzE=ag*j3z9q;E2cVU!-IP&LH83fqX z3=C;Gd{K#!NZNaO_KH1K0k2@{I z<@`Jn3=N<7!mS_W1iuC~HZ@h}bDW7mRiJ5`aBOFl3$5bTiZ_YHC0?>6+;&(C=8wka z4hOybj{S3UzK1uBev$JKb$zN_qR%jB-2Ga+=iM%Yo(99D`{@BV*j;r5+{bb$_*=vk zq=&NAv^0tnL>6R>Ek?MlsE(1{GP4Afgoe3i(wE$v3M4sT0P`Ob@SeuFpA8cDb2|Mh??+d*nt2edthyemDwX5~ zpa1soO=|&IH()=|tGK6E+44j9o@1ITYGM9RVZBbB!|#%pKuwGRITO(60@-6KbL$XWZXn80oOq_qyBf&S=|Qn9twmz!do_puo9>i_-%Bvt_&H z2$!iuTVI!0&@Vh5k2ifBZsE+_W^16eq3R3NSdv4#$Jb~Z<)c(1bkaVvV+Lb^vZ(su zVpP#cp00&03nLeB0p2wJ`tibgi&b~*kkz9~KcK=XO=I`*?p3H=^xfieslM8$E_E}` zZt$EHnB`1@r{@CYsUfRcu(+>8*VbcUO~eNB(A-nD4fOBp}Q_Or!aMrhYAl!NQUi% z5advEKRB6RGw-+U8;x7(kDO#iKXI668iLK}@YzxlBE5dJq@E@kQjh4Y3~bo1Y~Z43 z{@L`Hy~TWt(V3xRy?03J3qzb7S%{`%2>z_by46j%8KxP|4{WPu{4~!mUg2mI5LXqj zruG&QUhhS0KYCz?NjVF%ex%jWS72F3<(!L-DIWP*mv0;AU_(O-UnXp5JthzN$hn}1 zCR(%@|F0W~I>JZeJ_UqbgyN}nY$`0bnm0P@MxpbGV=E(u3T6SrH&_@(2n=}a4HTSo1jJ~-P&vDUeb+mQUnd~n!BN^bO_E z)vHi3>yJAn8C~9tW_Cj_>5KOh?SOha!K9OX+zA2ANj&LHazL_vSWF3!m zm%2lu(3>89ATWDM;zZ3^G5slqv2RZ;tWXM8 z!_=doz35@T3gUXbe$zB>n=8{5y>?oz&RhaW`sg2~Bp2bXnN`n-BAws7Sd<3Qv>Lm% zF~sxplF>vtSU^j8mF)R-ajFVzxojE2Fd) z==6}X@-&k}pmjpt4#|K~7n(_?AoxJ?<%GNpNNHw#5IHi=_)oR`Lr>Rs&@8%a)~1^P zu3ggN>M&prssoON;WatkmVK_J3Drkv?rn8Yt~_BaDK!hOcM}G^pWo2I`^d_ma9718f7ym_l953rlEPHW7}kX@lAx8pDa+hyr0 z{?0qldj!B;Gx@N z*0Q2FQLc(boJdN%zx#lrteEaUR`7q*EtR7Uc*Q{)Qy&*rd=YopOq$cf>3m z|8vLvU@u8kgb++@JX!(LnvTx@;^*qM?Xnk7f-c>n_J7dx@p1bxVuBQd7@s6Gj`&sJ z)vPvq^d9o6#Huw5!+Jr|#Dnv%pgc`=-Vb14z4=lW{Q44RsJ;{eSm0RP615ZOl`ta7 z&*>EUiq%{9{dfl*P3UGQ?!1!t*_8mUcF0TG_y=;40BfgE%nfDyTbTy%6+zEvkMSMk zneBH-yLo%4Thr)Tc^OoSf~1ryh$4^L+$#fdu8$WK1q}q=*@h1je+UsLRVfi567F97 zLh8KI7cuMDAX7tpxYkF6E)=VCYQ!6I$PPUJ-g2d_F^Kb|+KZTp+}v_Icl<_eR>%78 zpn_e5it(K#CX&la5W-+3jhqFNLfr!}$4c6^O%kl91J-Z~QZmooI%0o<&mKP+-_Zny zdv>c?4%mYb%}4vMNIsPnKU#)KLtYlre5crLUHaosKgc{f2=YB;@ctH|;>2^Q?y)Jv zZMj`mt97-#vMDD9Vrc%}1vUISP|e)Xbyr)EWeNsqlpn>SbCt4hoRr$5p%hdAJ0JtW z=zT;qu15}Uv?Q~e(!2H?0$|9nN>6~y6bnaOmbTu69>VV;n1SnFt>5^0HHTBGUVz`L zTyknk+>82;TeocRihw5VLNo0@c=@-x4=NCXQ+p~o?T<13G87~E7dU@q&R^>I-=$*> Y-Qk~2?c*}fZ38dsGxnz|PF_j)C!jMBl>h($ literal 0 HcmV?d00001 From 480a4789eb9024f2b6c5938c2521d2076eee64a6 Mon Sep 17 00:00:00 2001 From: Aki Wu Date: Thu, 13 Oct 2022 09:49:38 +0800 Subject: [PATCH 2/2] update --- ...xecute-remote-smart-contract-by-routing.md | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/docs/sdk/guides/05-execute-remote-smart-contract-by-routing.md b/docs/sdk/guides/05-execute-remote-smart-contract-by-routing.md index 270a95ff..2fb219c0 100644 --- a/docs/sdk/guides/05-execute-remote-smart-contract-by-routing.md +++ b/docs/sdk/guides/05-execute-remote-smart-contract-by-routing.md @@ -10,15 +10,17 @@ We first deploy a example Dapp. And then mock a user to use the Dapp to call a f ### Accounts -1. **Dapp Account 1**: a `Pangolin Smart Chain` account to deploy contracts including `PangolinEndpoint` and `Caller`. -2. **Dapp Account 2**: a `Moonbase Alpha` account to deploy contracts including `MoonbaseEndpoint` and `Callee`. -3. **Dapp Account 3**: a `Pangolin Parachain` account which will be used to recharge user's derived account(**B**). -4. **User Account**: a user account to send transaction on `Pangolin Smart Chain`. Below is the deriving path of the user account. - ![Address deriving](/img/address-deriving.png) - **A1**: **User Account**. - **A2**: **User Account** in substrate address format. - **B**: derived substrate address of the **User Account** on Pangolin Parachain. - **C**: derived evm address of the **User Account** on Moonbase Alpha. +1. **PSC Account 1**: a `Pangolin Smart Chain` account to deploy contracts including `PangolinEndpoint` and `Caller`. +2. **MA Account 1**: a `Moonbase Alpha` account to deploy contracts including `MoonbaseEndpoint` and `Callee`. +3. **PP Account 1**: a `Pangolin Parachain` account which will be used to recharge Dapp's derived account(**B**). +4. **Dapp Accounts**: accounts belongs to the Dapp. `PangolinEndpoint`, `Caller`, `MoonbaseEndpoint` and `Callee` 's addresses are Dapp accounts. + **Sender Account**: `PangolinEndpoint`'s address is the sender of the cross-chain message. Below is the deriving path of the **Sender Account**. + ![Address deriving](/img/address-deriving.png) + **A1**: **Sender Account**, `PangolinEndpoint`'s address. + **A2**: **Sender Account** in substrate address format. + **B**: derived substrate address of the **Sender Account** on Pangolin Parachain. + **C**: derived evm address of the **Sender Account** on Moonbase Alpha. +5. **User Account**: a user account to send transaction on `Pangolin Smart Chain`. This account will pay for the cross-chain fee. ### Prepare Contracts(Dapp)