├── .eslintrc.js ├── .gitignore ├── .prettierrc.js ├── LICENSE ├── README.md ├── out.log ├── package.json ├── src ├── ChainSync.ts ├── keyring.ts ├── main.ts ├── sidecar │ ├── SidecarApi.ts │ └── types │ │ ├── AccountBalanceInfo.ts │ │ ├── At.ts │ │ ├── Block.ts │ │ └── TransactionMaterial.ts ├── static │ └── architecture.png ├── transaction │ ├── TransactionConstruct.ts │ └── types │ │ ├── BaseInfo.ts │ │ ├── MaybeTimepoint.ts │ │ ├── TransactionOpts.ts │ │ ├── UnsignedMaterial.ts │ │ └── index.ts └── util │ ├── display.ts │ ├── index.ts │ ├── input.ts │ ├── sleep.ts │ └── sortAddreses.ts ├── tsconfig.json └── yarn.lock /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | extends: [ 3 | 'eslint:recommended', 4 | 'plugin:@typescript-eslint/recommended', 5 | 'plugin:@typescript-eslint/recommended-requiring-type-checking', 6 | 'prettier/@typescript-eslint', 7 | 'plugin:prettier/recommended' 8 | ], 9 | parser: '@typescript-eslint/parser', 10 | parserOptions: { 11 | project: './tsconfig.json' 12 | }, 13 | plugins: [ 14 | '@typescript-eslint', 15 | 'prettier', 16 | 'simple-import-sort' 17 | ], 18 | rules: { 19 | // Sort imports 20 | 'simple-import-sort/sort': 'error', 21 | // https://github.com/eslint/eslint/issues/2321#issuecomment-134665757 22 | 'no-unused-vars': [2, { args: 'all', argsIgnorePattern: '^_' }], 23 | '@typescript-eslint/no-unused-vars': [ 24 | 2, 25 | { args: 'all', argsIgnorePattern: '^_' } 26 | ], 27 | "@typescript-eslint/ban-types": 0, 28 | }, 29 | }; -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | build 3 | yarn-error.log 4 | -------------------------------------------------------------------------------- /.prettierrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | semi: true, 3 | singleQuote: true, 4 | tabWidth: 4, 5 | useTabs: true, 6 | }; -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright [yyyy] [name of copyright owner] 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Proxy hot wallet demo for Substrate (Polkadot & Kusama) 2 | 3 | Demo for a safe and effective custodial hot wallet architecture using features innovated by [Substrate](https://substrate.dev/) FRAME pallets and featured in production chains such [Polkadot](https://polkadot.network/) and [Kusama](https://kusama.network/). 4 | 5 | By [@joepetrowski](https://github.com/joepetrowski) & [@emostov](https://github.com/emostov) 6 | 7 | **N.B.** This demo needs some updates to reflect best practices. Primarily, there should be NonTransfer proxies that have the ability to remove the Transfer proxies if a questionable proxy announcement is made. Please file an issue if would like clarification and/or see the updates reflected in the demo. 8 | 9 | ## Disclaimer 10 | 11 | This repo is for demonstration purposes only. 12 | 13 | ## Table of contents 14 | 15 | - [Background](#background) 16 | - [Technologies](#technologies) 17 | - [Architecture](#architecture) 18 | - [Demo outline](#demo-outline) 19 | - [Run](#run) 20 | 21 | ## Background 22 | 23 | When managing significant sums of funds on behalf of other entities, a major challenge is moving around funds without compromising the private key of the deposit addresses. In traditional block chains the private key must be "hot" (on a device exposed to the internet) in order to efficiently and programmatically move funds from the account (i.e. accounts that a user might deposit funds to). The moment this "hot" key is comprised the attacker has total control of funds. 24 | 25 | In this repo we demonstrate an architecture pattern enabled by the [Substrate FRAME](https://substrate.dev/docs/en/knowledgebase/runtime/frame) [`proxy`](https://github.com/paritytech/substrate/tree/master/frame/proxy), [`multisig`](https://github.com/paritytech/substrate/tree/master/frame/multisig) and [`utility`](https://github.com/paritytech/substrate/tree/master/frame/utility#for-pseudonymal-dispatch) (see pseudonymal dispatch) pallets, that minimizes attack vectors associated with operating a hot wallet as a custodian. 26 | 27 | The "hot" account is a multisig composite address that adds a proxy which announces transactions that can be executed after some delay. Pseudonymal accounts are derived from the multisig address and can be generated for every new deposit by a user to keep accounting clear. The proxy account can regularly transfer funds from the derivative accounts to a cold storage location(s). If the system detects a announcement by the proxy for a transfer to a non-certified address, then the multisig accounts can broadcast transactions to revoke the proxies privileges within the announcement period and prevent any of the proxies announced transactions from being executed. 28 | 29 | ## Technologies 30 | 31 | - [Parity Polkadot node implementation](https://github.com/paritytech/polkadot#polkadot) 32 | - [@substrate/txwrapper: offline transaction construction lib for Substrate](https://github.com/paritytech/txwrapper) 33 | - [@substrate/api-sidecar: RESTful api microservice for Substrate nodes](https://github.com/paritytech/substrate-api-sidecar) 34 | - [@polkadot/util-crypto: Substrate cryptography utility lib](https://github.com/polkadot-js/common/tree/master/packages/util-crypto) 35 | 36 | ## Architecture 37 | 38 | ![architecture](/src/static/architecture.png) 39 | 40 | ### Setup 41 | 42 | 1) Create m-of-n multisig MS from K = {k} keys, held by trusted parties (e.g. founders). 43 | 2) Set a proxy H with time delay T for MS. 44 | 3) Create derivative addresses D = {d} for user deposits. 45 | 4) Create cold storage S (not discussed here). 46 | 47 | #### Simple use 48 | 49 | 1) Proxy H announces call hash on-chain. 50 | 2) H sends actual call to backend system. 51 | 3) Backend ensures that call hash matches and parses call. 52 | 4) Applies internal rule (e.g. to whitelisted address). 53 | 5) If alerted, m-of-n K can reject the transaction. 54 | 6) If timeout, H broadcasts the actual call. 55 | 56 | #### Normal transaction flow 57 | 58 | 1) User i sends a deposit of v tokens to their addresses, di 59 | 2) Listener observes balances.Transfer event to address di 60 | 3) A machine** constructs the following call C***: 61 | 62 | ```c 63 | C = utility.as_derivative( 64 | index: i, 65 | call: balances.transfer( 66 | dest: S_pub, 67 | value: v, 68 | ) 69 | ) 70 | ``` 71 | 72 | 4) Key H signs and broadcasts the transaction: 73 | 74 | ```c 75 | proxy.announce(real: MS_pub, call_hash: hash(C)) 76 | ``` 77 | 78 | 5) Listener observes announce transaction on-chain and asks for the call C. It verifies two things: 79 | 80 | 1) Its hash matches the announcement, and 81 | 2) Any internal rules, e.g. the transfer is to a whitelisted S. 82 | 83 | 6) Verifications pass, no alarm. 84 | 7) After time delay T, any account can broadcast the transaction: 85 | 86 | ```c 87 | proxy.proxy_announced( 88 | delegate: H_pub, 89 | real: MS_pub, 90 | force_proxy_type: Any, 91 | call: C, 92 | ) 93 | ``` 94 | 95 | 8) Listener verifies that the transfer was successful when it sees a `balances.Transfer` event to address MS. 96 | 97 | ** Can be any machine, even without access to key H. 98 | *** Note that it can transfer the full value v as the address H will pay the transaction fees. 99 | 100 | #### Call rejection 101 | 102 | 1) Verification does not pass. 103 | 2) Owners of K are alerted and have time T to react. 104 | 3) Construct the following call R**: 105 | 106 | ```c 107 | R = proxy.reject_announcement( 108 | delegate: H_pub, 109 | call_hash: hash(C), 110 | ) 111 | ``` 112 | 113 | 4) Owners of K broadcast the call R. 114 | 5) Fallback: owners cannot either override the flag or broadcast their multisig transactions in time. 115 | 6) System hold immortal transaction ready to remove H as a proxy for MS (`proxy.remove_proxies()`). The system can submit this at any point. Note: only the first multisig transaction can be immortal and stored; the remaining need the `TimePoint` of the first multisig transaction so they need to be constructed in real time. 116 | 117 | ** In the event of a malicious announcement it is always recommended to call `proxy.remove_proxies()` ASAP. 118 | 119 | #### Misc. optimizations 120 | 121 | 1) Use batch transactions, e.g.: 122 | 123 | ```c 124 | utility.batch( 125 | utility.as_derivative(index: 0, call: C0), 126 | utility.as_derivative(index: 1, call: C1), 127 | utility.as_derivative(index: 2, call: C2), 128 | … 129 | ) 130 | ``` 131 | 132 | 2) Reduce T and only use the fallback for faster settlement. 133 | 3) Use anonymous proxies for MS to allow member change, in case some Ki is compromised. 134 | 135 | ## Demo Outline 136 | 137 | 1) Generate 6 keyrings and make sure accounts have funds 138 | - 3 for multisig 139 | - 1 for proxy 140 | - 1 for stash 141 | - 1 for depositor 142 | 2) Generate a 2-of-3 multisig address and log it to console 143 | 3) Transfer funds from Alice to the multisig 144 | - `balances.transfer()` 145 | 4) Set the 4th key as a proxy for the multisig 146 | - `Call = proxy.addProxy(key4, Any, 10)` // 10 blocks = 1 min 147 | - `multisig.approve_as_multi(hash(Call))` 148 | - `multisig.as_multi(Call)` 149 | 5) Create derivative accounts from multisig address for depositor(s) to send tokens to 150 | 6) Transfer funds `v` from depositor to two derivative accounts 151 | - `balances.transfer()` 152 | 7) Create two calls: one good and one bad 153 | - `C0 = utility.as_derivative(0, balances.transfer(stash, v))` 154 | - `C1 = utility.as_derivative(1, balances.transfer(attacker, v))` 155 | 8) Demonstrate the happy path 156 | - `key4` broadcasts `proxy.announce(hash(C0))` and sends `C0` to another worker 157 | - safety worker decodes `C0` and ensures that destination address is `stash` 158 | - after 10 blocks, `key4` broadcasts `proxy.proxy_announced(C0)` 159 | 9) Demonstrate adversarial path 160 | - `key4` broadcasts `proxy.announce(hash(C1))` and sends `C1` to safety worker 161 | - safety worker decodes `C1` and sees that destination address is not `stash` 162 | - `multisig.approve_as_multi(proxy.remove_proxies(hash(C1)))` 163 | - `multisig.as_multi(proxy.reject_announcement(hash(C1)))` 164 | 165 | ## Run 166 | 167 | 1) This demo relies on using a parity polkadot development node; you can download the [source here](https://github.com/paritytech/polkadot). Follow the instructions to download and compile the code. 168 | 2) Make sure the node's database is empty by running: `./target/release/polkadot purge-chain --dev` (**N.B.** the nodes DB must be purged before every run of the demo script) 169 | 3) Start the node by running `./target/release/polkadot --dev` 170 | 4) In another terminal session change directories to this project and install dependencies by running `yarn` 171 | 5) Start up Sidecar by running `yarn sidecar` 172 | 6) In another terminal session, make sure you are in this project directory and start the demo by running `yarn start` 173 | 174 | Note: this script assumes the polkadot node and Sidecar are using the defualt development ports. 175 | 176 | [Sample demo output](/out.log) 177 | -------------------------------------------------------------------------------- /out.log: -------------------------------------------------------------------------------- 1 | yarn run v1.22.5 2 | $ yarn run build && yarn run main 3 | $ tsc 4 | $ node ./build/main.js 5 | Multisig address generation info 6 | Addresses: 5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY 5FHneW46xGXgs5mUiveU4sbTyGBzmstUspZC92UhjJM694ty 5DAAnrj7VHTznn2AWBemMuyBwZWs6FNFjdyVXUeYum3PTXFy 7 | Threshold: 2 8 | Multisig Address (SS58: 42): 5CGrv4qEk299n1UCcDiJSFQsa3yqgnQct8m4rpHq9eMrHrfd 9 | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 10 | 11 | balances.transfer(origin: Alice, dest: multisig address) 12 | ...submiting transaction to the node 🚀 13 | Node response: 0x3bd7249258dbbb6745743a3703c0f1ff9283cfe7aca118076f19b61745adcfdf 14 | ...waiting for transaction inclusion ⌛️⌛⌛️ 15 | Balances.transfer(origin: Alice, dest: multisig address) succesfully included at { height: 8, index: 2 } 16 | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 17 | 18 | multisig.approveAsMulti(origin: Bob , callHash: h(proxy.addProxy(origin: multisig address, proxy: eve))) 19 | ...submiting transaction to the node 🚀 20 | Node response: 0x54034163ea524504ff0db9752ac44dbd18c45d99b5b4656c3711a2136857fbd2 21 | ...waiting for transaction inclusion ⌛️⌛⌛️ 22 | multisig.approveAsMulti(origin: Bob , callHash: h(proxy.addProxy(origin: multisig address, proxy: eve))) succesfully included at { height: 13, index: 2 } 23 | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 24 | 25 | multisig.asMulti(origin: Dave, call: proxy.addProxy(origin: multisig address, proxy: eve)) 26 | ...submiting transaction to the node 🚀 27 | Node response: 0xca8a5d8b8a936ec78f54cb8396a778279c1d0b311d1c2582e80d18c20dd99b20 28 | ...waiting for transaction inclusion ⌛️⌛⌛️ 29 | multisig.asMulti(origin: Dave, call: ${addProxyEveDisplay}) succsefully included at { height: 17, index: 2 } 30 | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 31 | 32 | Created two derived addresses from the multisig address 33 | Multisig derive 0: 5Gis6jjHxRjr52UqcyE8AS1UXSWdisNH9ykvLnP76d7RzEoJ 34 | Multisig derive 1: 5DYJ9G7PsDAtNE6EzjnqhKfoezaLVF6JK1k1A441mAN2eTj8 35 | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 36 | 37 | balances.transfer(origin: Charlie, dest: derive address 0) 38 | ...submiting transaction to the node 🚀 39 | Node response: 0x48ddc25cfd39fe4822ae2e87aa21a13d00f94c6c7f4c21d52211ebad4e5a288a 40 | ...waiting for transaction inclusion ⌛️⌛⌛️ 41 | balances.transfer(origin: Charlie, dest: derive address 0) sucessfully included at { height: 22, index: 2 } 42 | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 43 | 44 | balances.transfer(origin: Charlie, dest: derive address 1) 45 | ...submiting transaction to the node 🚀 46 | Node response: 0xdadf2207e0bb1e6d9957e606be114e3fe0ebff37f1f88ec6d7cda86b7124c83d 47 | ...waiting for transaction inclusion ⌛️⌛⌛️ 48 | balances.transfer(origin: Charlie, dest: derive address 1) succesfully included at { height: 22, index: 2 } 49 | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 50 | 51 | Now demonstrating the happy path of using the proxy to transfer funds from a multisig derivative account to cold storage. 52 | 53 | proxy.announce(origin: eve, callHash: h(utility.asDerivative(origin: multisig addres, index: 0, call: balances.transfer(origin: derive address 0, dest: cold storage))) 54 | ...submiting transaction to the node 🚀 55 | Node response: 0x58d2383a2b542d891bff8a3a0fb0b5e520769dc0583a9e176daaceb3431cd6d6 56 | ...waiting for transaction inclusion ⌛️⌛⌛️ 57 | proxy.announce(origin: eve, callHash: h(utility.asDerivative(origin: multisig addres, index: 0, call: balances.transfer(origin: derive address 0, dest: cold storage))) sucessfully included at { height: 28, index: 2 } 58 | 59 | Now that the transaction was succesfuly submitted, we will wait 10 blocks after the announcement (until block 38) for the delay periood to pass and execute with proxyAnnounced. 60 | There is a process in the background that will fire proxyAnnounced to execute the actual balance transfer to cold storage once the delay period is over; the demo will keep moving forward 61 | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 62 | 63 | 64 | Simultanously sending utility.asDerivative(origin: multisig addres, index: 0, call: balances.transfer(origin: derive address 0, dest: cold storage)) to the safety worker for decoding and verification that the transfer is going to cold storage. 65 | Decoded attempt to transfer from derivative account: 66 | { dest: '5GNJqTPyNqANBkUVMN1LPPrxXnFouWXoe2wNSmmEoLctxiZY', value: 1 } 67 | Destination is correct cold storage: true 68 | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 69 | 70 | Now demonstrating the adversarial path. 71 | 72 | proxy.announce(origin: Alice, callHash: h(utility.asDerivative(origin: multisig address, index: 1, call: balances.transfer(origin: derivate address 1, dest: Attacker)) 73 | ...submiting transaction to the node 🚀 74 | Node response: 0xe91d6af9f08bba8927a39bcacd034e9ea55e51f8a116e342f1f48023d63300c6 75 | ...waiting for transaction inclusion ⌛️⌛⌛️ 76 | proxy.announce of c1 sucessful at { height: 33, index: 2 } 77 | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 78 | 79 | Now that the transacstion was succesfuly submitted, wait 10 blocks after announcement (until block43) for the delay periood to pass and execute with proxyAnnounced. 80 | ...but hopefully we can stop the Attacker before then! 81 | there is a process in the background that will fire proxyAnnounced to execute the actual balance transfer to the attacker if we do not act fast enough; the demo will keep moving forward 82 | 83 | Simultanously sending utility.asDerivative(origin: multisig address, index: 1, call: balances.transfer(origin: derivate address 1, dest: Attacker) to the safety worker for decoding and verification of the transfer - the system will catch the attacker here and kickoff the security procedure to stop the malicious transfer 84 | Decoded attempt to transfer from derivative account: 85 | { 86 | dest: '5FcMRihF5cwGEqLS2PWLGbebXCATwrUEzY1SJja7s4KtBYR6', 87 | value: 1234666 88 | } 89 | Destination is correct cold storage: false 90 | 91 | 🚧 Malicious proxy transfer detected, kicking off proxy removal protocol! 🚧 92 | 93 | multisig.approveAsMulti(origin: Alice, callHash: h(proxy.removeProxies(origin: multisig address))) 94 | ...submiting transaction to the node 🚀 95 | Node response: 0x6fe489f8286e278b48761a2b49071af8031426db258f8075dda006c2717e229f 96 | ...waiting for transaction inclusion ⌛️⌛⌛️ 97 | multisig.approveAsMulti(origin: Alice, callHash: h(proxy.removeProxies(origin: multisig address))) succesfuly included at { height: 38, index: 2 } 98 | 99 | (💤 background task) proxy.proxyAnnounced(origin: Eve, call: utility.asDerivative(origin: multisig addres, index: 0, call: balances.transfer(origin: derive address 0, dest: cold storage)))) 100 | ...submiting transaction to the node 🚀 101 | 102 | multisig.asMulti(origin: Bob, call: proxy.removeProxies(origin: multisig address)) 103 | ...submiting transaction to the node 🚀 104 | Node response: 0x3174e14984fa42802f0a38b9347137edcc51740ab4690f0ff488922fbb0d3751 105 | ...waiting for transaction inclusion ⌛️⌛⌛️ 106 | Node response: 0x8cb6e2dcd01076580b5d229025074addc3df5e8d29d20547c8f965d64581b73c 107 | ...waiting for transaction inclusion ⌛️⌛⌛️ 108 | proxy.proxyAnnounced(origin: Eve, call: utility.asDerivative(origin: multisig addres, index: 0, call: balances.transfer(origin: derive address 0, dest: cold storage)))) succesfully included at { height: 43, index: 2 } 109 | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 110 | 111 | multisig.asMulti(origin: Bob, call: proxy.removeProxies(origin: multisig address)) succsefully included at { height: 43, index: 2 } 112 | Crisis averted 👩‍🚒 attacker transfer cancelled 👌! 113 | 114 | (💤background task) proxy.proxyAnnounced(utility.asDerivative(origin: multisig address, index: 1, call: balances.transfer(origin: derivate address 1, dest: Attacker)) 115 | ...submiting transaction to the node 🚀 116 | Node response: 0xe811903a17c073070fdccf9d389ba42dad78c2f4d28125acf070ed6edf2e2818 117 | ...waiting for transaction inclusion ⌛️⌛⌛️ 118 | Attacker tranasction failed! The system worked succesfully! 119 | Done in 272.19s. 120 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "proxy-hot-wallet", 3 | "version": "0.1.0", 4 | "description": "Demo for a safe and effective custodial hot wallet using features unique to Substrate", 5 | "main": "build/main.js", 6 | "repository": "https://github.com/emostov/proxy-hot-wallet.git", 7 | "author": "Zeke Mostov <32168567+emostov@users.noreply.github.com>", 8 | "license": "Apache-2.0", 9 | "private": false, 10 | "scripts": { 11 | "lint": "tsc && eslint . --ext ts", 12 | "build": "tsc", 13 | "main": "node ./build/main.js", 14 | "start": "yarn run build && yarn run main", 15 | "demo": "yarn run main", 16 | "sidecar": "SAS_LOG_LEVEL=http ./node_modules/.bin/substrate-api-sidecar" 17 | }, 18 | "dependencies": { 19 | "@polkadot/util": "^6.2.1", 20 | "@polkadot/util-crypto": "^6.2.1", 21 | "@substrate/api-sidecar": "^4.0.8", 22 | "@substrate/txwrapper": "^4.1.0", 23 | "@types/memoizee": "^0.4.5", 24 | "axios": "^0.21.1" 25 | }, 26 | "devDependencies": { 27 | "@types/node": "^14.14.41", 28 | "@typescript-eslint/eslint-plugin": "^4.22.0", 29 | "@typescript-eslint/parser": "^4.22.0", 30 | "eslint": "^7.24.0", 31 | "eslint-config-prettier": "^8.2.0", 32 | "eslint-plugin-prettier": "^3.4.0", 33 | "eslint-plugin-simple-import-sort": "^7.0.0", 34 | "prettier": "^2.2.1", 35 | "typescript": "^4.2.4" 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/ChainSync.ts: -------------------------------------------------------------------------------- 1 | import { SidecarApi } from './sidecar/SidecarApi'; 2 | import { sleep } from './util'; 3 | 4 | export class ChainSync { 5 | private sidecarApi: SidecarApi; 6 | private readonly SECOND = 1_000; 7 | 8 | constructor(sidecarURL: string) { 9 | this.sidecarApi = new SidecarApi(sidecarURL); 10 | } 11 | 12 | async pollingEventListener( 13 | pallet: string, 14 | method: string, 15 | // In real life you would need to check the events data, however for this demo we don't 16 | _data?: string[] 17 | ): Promise<{ height: number; index: number } | null> { 18 | const searching = true; 19 | while (searching) { 20 | const block = await this.sidecarApi.getBlock(); 21 | 22 | for (const [idx, ext] of block.extrinsics.entries()) { 23 | for (const { 24 | method: { method: evMethod, pallet: evPallet }, 25 | } of ext.events) { 26 | if (evMethod === 'ExtrinsicFailed') { 27 | throw `unexepcted extrinsic failure at block number ${block.number}`; 28 | } 29 | 30 | if (evMethod === method && evPallet === pallet) { 31 | await sleep(this.SECOND / 2); 32 | return { 33 | height: parseInt(block.number), 34 | index: idx, 35 | }; 36 | } 37 | 38 | if (pallet === evPallet && method === evMethod) 39 | throw 'debug error'; 40 | } 41 | } 42 | 43 | await sleep(this.SECOND); 44 | } 45 | 46 | return null; 47 | } 48 | 49 | async waitUntilHeight(height: number): Promise { 50 | const waiting = true; 51 | while (waiting) { 52 | const block = await this.sidecarApi.getBlock(); 53 | const curHeight = parseInt(block.number); 54 | if (curHeight >= height) { 55 | return curHeight; 56 | } 57 | await sleep(this.SECOND); 58 | } 59 | 60 | return -1; 61 | } 62 | 63 | private eventDataEq(d1: string[], d2: string[]) { 64 | return ( 65 | d1.length === d2.length && d1.every((ele, idx) => ele === d2[idx]) 66 | ); 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /src/keyring.ts: -------------------------------------------------------------------------------- 1 | import { Keyring } from '@polkadot/api'; 2 | import { KeyringPair } from '@polkadot/keyring/types'; 3 | import { cryptoWaitReady } from '@polkadot/util-crypto'; 4 | 5 | export interface Keys { 6 | alice: KeyringPair; 7 | aliceStash: KeyringPair; 8 | bob: KeyringPair; 9 | dave: KeyringPair; 10 | eve: KeyringPair; 11 | charlie: KeyringPair; 12 | ferdie: KeyringPair; 13 | attacker: KeyringPair; 14 | } 15 | 16 | export async function createDemoKeyPairs(): Promise { 17 | // References 18 | // https://github.com/paritytech/substrate/blob/833fe6259115625f61347c8413bab29fded31210/primitives/core/src/crypto.rs#L52 19 | // Alice is 'bottom drive obey lake curtain smoke basket hold race lonely fit walk//Alice' 20 | 21 | await cryptoWaitReady(); 22 | 23 | const keyring: Keyring = new Keyring(); 24 | 25 | const alice = keyring.addFromUri('//Alice', { name: 'Alice' }, 'sr25519'); 26 | const aliceStash = keyring.addFromUri( 27 | '//Alice//stash', 28 | { name: 'Alice Stash' }, 29 | 'sr25519' 30 | ); 31 | const bob = keyring.addFromUri('//Bob', { name: 'Bob' }, 'sr25519'); 32 | const dave = keyring.addFromUri('//Dave', { name: 'Dave' }, 'sr25519'); 33 | const eve = keyring.addFromUri('//Eve', { name: 'Eve' }, 'sr25519'); 34 | const charlie = keyring.addFromUri( 35 | '//Charlie', 36 | { name: 'Charlie' }, 37 | 'sr25519' 38 | ); 39 | const ferdie = keyring.addFromUri( 40 | '//Ferdie', 41 | { name: 'Ferdie' }, 42 | 'sr25519' 43 | ); 44 | const attacker = keyring.addFromUri( 45 | '//Attacker', 46 | { name: 'Attacker' }, 47 | 'sr25519' 48 | ); 49 | 50 | return { 51 | // Comments represent roles in proxy + multisig hot wallet demo 52 | // stash 53 | aliceStash, 54 | // multisig 55 | alice, 56 | // multisig 57 | bob, 58 | // multisig 59 | dave, 60 | // proxy 61 | eve, 62 | // depositer 63 | charlie, 64 | // extra pair for convience 65 | ferdie, 66 | attacker, 67 | }; 68 | } 69 | -------------------------------------------------------------------------------- /src/main.ts: -------------------------------------------------------------------------------- 1 | import { blake2AsHex } from '@polkadot/util-crypto'; 2 | import { 3 | encodeDerivedAddress, 4 | encodeMultiAddress, 5 | } from '@polkadot/util-crypto'; 6 | 7 | import { ChainSync } from './ChainSync'; 8 | import { createDemoKeyPairs, Keys } from './keyring'; 9 | import { SidecarApi } from './sidecar/SidecarApi'; 10 | import { TransactionConstruct } from './transaction/TransactionConstruct'; 11 | import { 12 | logSeperator, 13 | sortAddresses, 14 | submiting, 15 | waiting, 16 | waitToContinue, 17 | } from './util'; 18 | 19 | const sidecarUrl = 'http://127.0.0.1:8080'; 20 | 21 | async function main() { 22 | const keys = await createDemoKeyPairs(); 23 | const transactionConstruct = new TransactionConstruct( 24 | sidecarUrl, 25 | keys.aliceStash.address 26 | ); 27 | const sidecarApi = new SidecarApi(sidecarUrl); 28 | const chainSync = new ChainSync(sidecarUrl); 29 | 30 | const addresses = [keys.alice.address, keys.bob.address, keys.dave.address]; 31 | const threshold = 2; 32 | const ss58Prefix = 42; 33 | const multisigAddr = encodeMultiAddress(addresses, threshold, ss58Prefix); 34 | 35 | console.log('Multisig address generation info'); 36 | console.log(`Addresses: ${addresses.join(' ')}`); 37 | console.log(`Threshold: ${threshold}`); 38 | console.log(`Multisig Address (SS58: ${ss58Prefix}): ${multisigAddr}`); 39 | logSeperator(); 40 | await waitToContinue(); 41 | 42 | // Load up multisig account with currency so it can make transactions 43 | const trasnferValue = '0123456789012345'; 44 | const transferToMultiSigCall = await transactionConstruct.balancesTransfer( 45 | { origin: keys.alice.address }, 46 | multisigAddr, 47 | trasnferValue 48 | ); 49 | const signedTransferToMultiSigCall = transactionConstruct.createAndSignTransaction( 50 | keys.alice, 51 | transferToMultiSigCall 52 | ); 53 | console.log(`balances.transfer(origin: Alice, dest: multisig address)`); 54 | submiting(); 55 | const nodeRes1 = await sidecarApi.submitTransaction( 56 | signedTransferToMultiSigCall 57 | ); 58 | console.log(`Node response: `, nodeRes1.hash); 59 | waiting(); 60 | const inclusionPoint1 = await chainSync.pollingEventListener( 61 | 'balances', 62 | 'Transfer' 63 | ); 64 | console.log( 65 | 'Balances.transfer(origin: Alice, dest: multisig address) succesfully included at ', 66 | inclusionPoint1 67 | ); 68 | logSeperator(); 69 | await waitToContinue(); 70 | 71 | const delayPeriod = 10; // 10 blocks = 1 min 72 | const maxWeight = 1000000000; 73 | // Make Eve the proxy for the multisig address and set up the proxy with `delayPeriod` 74 | // delay between a proxied calls announcement and earliest possible point of execution 75 | await setupProxyForMultisig( 76 | multisigAddr, 77 | transactionConstruct, 78 | chainSync, 79 | sidecarApi, 80 | keys, 81 | ss58Prefix, 82 | delayPeriod, 83 | maxWeight 84 | ); 85 | 86 | // Create derivative addresses from the multisig address. 87 | const deriveAddr0 = encodeDerivedAddress(multisigAddr, 0, ss58Prefix); 88 | const deriveAddr1 = encodeDerivedAddress(multisigAddr, 1, ss58Prefix); 89 | console.log('Created two derived addresses from the multisig address'); 90 | console.log('Multisig derive 0: ', deriveAddr0); 91 | console.log('Multisig derive 1: ', deriveAddr1); 92 | logSeperator(); 93 | await waitToContinue(); 94 | 95 | // Depositer transfers money into multisig derive addresses 0 and 1. 96 | await depositerTransferToDeriv( 97 | transactionConstruct, 98 | chainSync, 99 | sidecarApi, 100 | keys, 101 | deriveAddr0, 102 | deriveAddr1 103 | ); 104 | 105 | // the proxy transfers funds from multisig derive address 0 to cold storage 106 | await happyPath( 107 | transactionConstruct, 108 | chainSync, 109 | sidecarApi, 110 | keys, 111 | deriveAddr0, 112 | multisigAddr, 113 | delayPeriod 114 | ); 115 | 116 | // An attacker compromises the proxy and uses the proxy to send funds from multisig 117 | // derive address 1 to the attackers address. The safety worker will see the announcement 118 | // for the proxy call and alert the system that there is a transfer from a derivative 119 | // address that does not go to cold storage. The system will the have two of the composite 120 | // addresses for the multisig create a transaction to remove all proxies from the multisig 121 | // address and thus prevent the attacker from making the call as a proxy. 122 | await adversarialPath( 123 | transactionConstruct, 124 | chainSync, 125 | sidecarApi, 126 | keys, 127 | deriveAddr1, 128 | multisigAddr, 129 | delayPeriod, 130 | maxWeight 131 | ); 132 | } 133 | 134 | main().catch(console.log); 135 | 136 | async function adversarialPath( 137 | transactionConstruct: TransactionConstruct, 138 | chainSync: ChainSync, 139 | sidecarApi: SidecarApi, 140 | keys: Keys, 141 | deriveAddr1: string, 142 | multisigAddr: string, 143 | delayPeriod: number, 144 | maxWeight: number 145 | ): Promise { 146 | console.log('Now demonstrating the adversarial path.\n'); 147 | 148 | const c1Display = 149 | 'utility.asDerivative(origin: multisig address, index: 1, call: balances.transfer(origin: derivate address 1, dest: Attacker)'; 150 | const { 151 | unsigned: transferToAttacker, 152 | registry: transferToAttackerRegistry, 153 | metadataRpc: transferToAttackerMetadataRpc, 154 | } = await transactionConstruct.balancesTransfer( 155 | { origin: deriveAddr1 }, 156 | keys.attacker.address, 157 | '01234666' 158 | ); 159 | const { unsigned: c1 } = await transactionConstruct.utilityAsDerivative( 160 | { origin: multisigAddr }, 161 | 1, 162 | transferToAttacker.method 163 | ); 164 | const c1Method = c1.method; 165 | const c1Hash = blake2AsHex(c1Method, 256); 166 | const proxyAnnounceC1 = await transactionConstruct.proxyAnnounce( 167 | { origin: keys.eve.address }, 168 | multisigAddr, 169 | c1Hash 170 | ); 171 | const signedProxyAnnounceC1 = transactionConstruct.createAndSignTransaction( 172 | keys.eve, 173 | proxyAnnounceC1 174 | ); 175 | 176 | console.log(`proxy.announce(origin: Alice, callHash: h(${c1Display})`); 177 | submiting(); 178 | const result8 = await sidecarApi.submitTransaction(signedProxyAnnounceC1); 179 | console.log(`Node response: `, result8.hash); 180 | waiting(); 181 | const inclusionPoint5 = await chainSync.pollingEventListener( 182 | 'proxy', 183 | 'Announced' 184 | ); 185 | if (!inclusionPoint5) throw 'blockInclusionAnnounceC1 is null'; 186 | console.log( 187 | `proxy.announce(origin: Alice, callHash: h(${c1Display}) succesfully included at`, 188 | inclusionPoint5 189 | ); 190 | logSeperator(); 191 | await waitToContinue(); 192 | 193 | console.log( 194 | `Now that the transacstion was succesfuly submitted, wait ${delayPeriod} blocks after announcement (until block${ 195 | inclusionPoint5?.height + delayPeriod 196 | }) ` + 197 | 'for the delay periood to pass and execute with proxyAnnounced.\n' + 198 | '...but hopefully we can stop the Attacker before then!' 199 | ); 200 | console.log( 201 | 'There is a process in the background that will fire proxyAnnounced to execute the actual balance ' + 202 | 'transfer to the attacker if we do not act fast enough; the demo will keep moving forward.' 203 | ); 204 | void chainSync 205 | .waitUntilHeight(inclusionPoint5?.height + delayPeriod) 206 | .then(async () => { 207 | const proxyAnnouncedCallC1 = await transactionConstruct.proxyProxyAnnounced( 208 | { origin: keys.eve.address }, 209 | multisigAddr, 210 | keys.eve.address, 211 | 'Any', 212 | c1Method 213 | ); 214 | const signedProxyAnnoucedTxC1 = transactionConstruct.createAndSignTransaction( 215 | keys.eve, 216 | proxyAnnouncedCallC1 217 | ); 218 | console.log( 219 | `\n(💤background task) proxy.proxyAnnounced(${c1Display})` 220 | ); 221 | submiting(); 222 | const result7 = await sidecarApi.submitTransaction( 223 | signedProxyAnnoucedTxC1 224 | ); 225 | console.log(`\nNode response: `, result7.hash); 226 | waiting(); 227 | let inclusionPoint6; 228 | try { 229 | inclusionPoint6 = await chainSync.pollingEventListener( 230 | 'balances', 231 | 'Transfer' 232 | ); 233 | } catch { 234 | console.log( 235 | '\nAttacker tranasction failed! The system worked succesfully!' 236 | ); 237 | process.exit(); 238 | } 239 | console.log( 240 | `\nproxy.proxyAnnounced(${c1Display}) succesfully included at `, 241 | inclusionPoint6 242 | ); 243 | console.log('\nSecurity system failed!'); 244 | process.exit(); 245 | }); 246 | 247 | console.log( 248 | `\nSimultanously sending ${c1Display} to the safety worker for decoding` + 249 | ' and verification of the transfer - the system will catch the attacker here and kickoff' + 250 | ' the security procedure to stop the malicious transfer' 251 | ); 252 | const isSafe = transactionConstruct.safetyWorker({ 253 | unsigned: transferToAttacker, 254 | registry: transferToAttackerRegistry, 255 | metadataRpc: transferToAttackerMetadataRpc, 256 | }); 257 | if (isSafe) throw 'error when processing unsafe transaction'; 258 | console.log( 259 | '\n🚧 Malicious proxy transfer detected, kicking off proxy removal protocol! 🚧\n' 260 | ); 261 | const removeProxiesDisplay = 262 | 'proxy.removeProxies(origin: multisig address)'; 263 | const { 264 | unsigned: { method: removeProxiesMethod }, 265 | } = await transactionConstruct.proxyRemoveProxies({ origin: multisigAddr }); 266 | const removeProxiesHash = blake2AsHex(removeProxiesMethod); 267 | const removeProxiesApproveAsMulti = await transactionConstruct.multiSigApproveAsMulti( 268 | { origin: keys.alice.address }, 269 | 2, 270 | sortAddresses([keys.bob.address, keys.dave.address]), 271 | null, 272 | removeProxiesHash, 273 | maxWeight 274 | ); 275 | const signedRemoveProxiesApproveAsMulti = transactionConstruct.createAndSignTransaction( 276 | keys.alice, 277 | removeProxiesApproveAsMulti 278 | ); 279 | 280 | console.log( 281 | `multisig.approveAsMulti(origin: Alice, callHash: h(${removeProxiesDisplay}))` 282 | ); 283 | submiting(); 284 | const nodeRes4 = await sidecarApi.submitTransaction( 285 | signedRemoveProxiesApproveAsMulti 286 | ); 287 | console.log(`Node response: `, nodeRes4.hash); 288 | waiting(); 289 | const inclusionPoint7 = await chainSync.pollingEventListener( 290 | 'multisig', 291 | 'NewMultisig' 292 | ); 293 | if (!inclusionPoint7) throw 'timepoint1 null'; 294 | console.log( 295 | `multisig.approveAsMulti(origin: Alice, callHash: h(${removeProxiesDisplay})) succesfuly included at`, 296 | inclusionPoint7 297 | ); 298 | 299 | const removeProxiesAsMulti = await transactionConstruct.multiSigAsMulti( 300 | { origin: keys.bob.address }, 301 | 2, 302 | sortAddresses([keys.alice.address, keys.dave.address]), 303 | inclusionPoint7, 304 | removeProxiesMethod, 305 | true, 306 | maxWeight 307 | ); 308 | const signedremoveProxiesAsMulti = transactionConstruct.createAndSignTransaction( 309 | keys.bob, 310 | removeProxiesAsMulti 311 | ); 312 | console.log( 313 | `\nmultisig.asMulti(origin: Bob, call: ${removeProxiesDisplay})` 314 | ); 315 | submiting(); 316 | const nodeRes5 = await sidecarApi.submitTransaction( 317 | signedremoveProxiesAsMulti 318 | ); 319 | console.log(`Node response: `, nodeRes5.hash); 320 | waiting(); 321 | const inclusionPoint8 = await chainSync.pollingEventListener( 322 | 'proxy', 323 | 'ProxyExecuted' 324 | ); 325 | if (!inclusionPoint8) throw 'inclusionPoint8 is null'; 326 | console.log( 327 | `multisig.asMulti(origin: Bob, call: ${removeProxiesDisplay}) succsefully included at `, 328 | inclusionPoint8 329 | ); 330 | console.log('Crisis averted 👩‍🚒 attacker transfer cancelled 👌!'); 331 | } 332 | 333 | async function happyPath( 334 | transactionConstruct: TransactionConstruct, 335 | chainSync: ChainSync, 336 | sidecarApi: SidecarApi, 337 | keys: Keys, 338 | deriveAddr0: string, 339 | multisigAddr: string, 340 | delayPeriod: number 341 | ): Promise { 342 | console.log( 343 | 'Now demonstrating the happy path of using the proxy to transfer funds from a multisig derivative account to cold storage.\n' 344 | ); 345 | 346 | const c0Display = 347 | 'utility.asDerivative(origin: multisig addres, index: 0, call: balances.transfer(origin: derive address 0, dest: cold storage))'; 348 | const { 349 | unsigned: transferToColdStorage, 350 | registry: transferToColdStorageRegistry, 351 | metadataRpc: transferToColdStorageMetadataRpc, 352 | } = await transactionConstruct.balancesTransfer( 353 | { origin: deriveAddr0 }, 354 | keys.aliceStash.address, 355 | '1' 356 | ); 357 | const { unsigned: c0 } = await transactionConstruct.utilityAsDerivative( 358 | { origin: multisigAddr }, 359 | 0, 360 | transferToColdStorage.method 361 | ); 362 | const c0Method = c0.method; 363 | const c0Hash = blake2AsHex(c0Method, 256); 364 | const proxyAnnounceC0 = await transactionConstruct.proxyAnnounce( 365 | { origin: keys.eve.address }, 366 | multisigAddr, 367 | c0Hash 368 | ); 369 | const signedProxyAnnounceC0 = transactionConstruct.createAndSignTransaction( 370 | keys.eve, 371 | proxyAnnounceC0 372 | ); 373 | console.log(`proxy.announce(origin: eve, callHash: h(${c0Display})`); 374 | submiting(); 375 | const nodeRes3 = await sidecarApi.submitTransaction(signedProxyAnnounceC0); 376 | console.log(`Node response: `, nodeRes3.hash); 377 | waiting(); 378 | const inclusionPoint3 = await chainSync.pollingEventListener( 379 | 'proxy', 380 | 'Announced' 381 | ); 382 | if (!inclusionPoint3) throw 'inclusionPoint3 is null'; 383 | console.log( 384 | `proxy.announce(origin: eve, callHash: h(${c0Display}) sucessfully included at `, 385 | inclusionPoint3 386 | ); 387 | console.log( 388 | `\nNow that the transaction was succesfuly submitted, we will wait ${delayPeriod} blocks after the announcement (until block ${ 389 | inclusionPoint3?.height + delayPeriod 390 | }) ` + 391 | 'for the delay periood to pass and execute with proxyAnnounced.' + 392 | '\nThere is a process in the background that will fire proxyAnnounced to execute the actual balance ' + 393 | 'transfer to cold storage once the delay period is over; the demo will keep moving forward' 394 | ); 395 | logSeperator(); 396 | await waitToContinue(); 397 | 398 | // wait until the delay period has passed and then execute the announce call 399 | void chainSync 400 | .waitUntilHeight(inclusionPoint3?.height + delayPeriod) 401 | .then(async () => { 402 | const proxyAnnounced = await transactionConstruct.proxyProxyAnnounced( 403 | { origin: keys.eve.address }, 404 | multisigAddr, 405 | keys.eve.address, 406 | 'Any', 407 | c0Method 408 | ); 409 | const signedProxyAnnouced = transactionConstruct.createAndSignTransaction( 410 | keys.eve, 411 | proxyAnnounced 412 | ); 413 | console.log( 414 | `\n(💤 background task) proxy.proxyAnnounced(origin: Eve, call: ${c0Display}))` 415 | ); 416 | submiting(); 417 | const result7 = await sidecarApi.submitTransaction( 418 | signedProxyAnnouced 419 | ); 420 | console.log(`\n(💤 background task) Node response: `, result7.hash); 421 | waiting(); 422 | const inclusionPoint4 = await chainSync.pollingEventListener( 423 | 'balances', 424 | 'Transfer' 425 | ); 426 | console.log( 427 | `\n(💤 background task) proxy.proxyAnnounced(origin: Eve, call: ${c0Display})) succesfully included at`, 428 | inclusionPoint4 429 | ); 430 | logSeperator(); 431 | await waitToContinue(); 432 | }); 433 | 434 | console.log( 435 | `\nSimultanously sending ${c0Display} to the safety worker for decoding` + 436 | ' and verification that the transfer is going to cold storage.' 437 | ); 438 | transactionConstruct.safetyWorker({ 439 | unsigned: transferToColdStorage, 440 | registry: transferToColdStorageRegistry, 441 | metadataRpc: transferToColdStorageMetadataRpc, 442 | }); 443 | logSeperator(); 444 | await waitToContinue(); 445 | } 446 | 447 | async function setupProxyForMultisig( 448 | multisigAddr: string, 449 | transactionConstruct: TransactionConstruct, 450 | chainSync: ChainSync, 451 | sidecarApi: SidecarApi, 452 | keys: Keys, 453 | ss58Prefix: number, 454 | delayPeriod: number, 455 | maxWeight: number 456 | ): Promise { 457 | // construct tx to add Eve as a proxy to multisig address 458 | const { 459 | unsigned: { method: addProxyEveMethod }, 460 | } = await transactionConstruct.proxyAddProxy( 461 | { origin: multisigAddr }, 462 | keys.eve.address, 463 | 'Any', 464 | delayPeriod 465 | ); 466 | const addProxyEveDisplay = 467 | 'proxy.addProxy(origin: multisig address, proxy: eve)'; 468 | const addProxyEveHash = blake2AsHex(addProxyEveMethod, 256); 469 | 470 | // construct tx for Bob to approve adding Eve as a proxy to the multi sig address 471 | const approveAsMulti = await transactionConstruct.multiSigApproveAsMulti( 472 | { origin: keys.bob.address }, 473 | 2, 474 | sortAddresses([keys.alice.address, keys.dave.address], ss58Prefix), 475 | null, 476 | addProxyEveHash, 477 | maxWeight 478 | ); 479 | const signedApproveAsMulti = transactionConstruct.createAndSignTransaction( 480 | keys.bob, 481 | approveAsMulti 482 | ); 483 | console.log( 484 | `multisig.approveAsMulti(origin: Bob , callHash: h(${addProxyEveDisplay}))` 485 | ); 486 | submiting(); 487 | const nodeRes2 = await sidecarApi.submitTransaction(signedApproveAsMulti); 488 | console.log(`Node response: `, nodeRes2.hash); 489 | waiting(); 490 | const inclusionPoint2 = await chainSync.pollingEventListener( 491 | 'multisig', 492 | 'NewMultisig' 493 | ); 494 | console.log( 495 | `multisig.approveAsMulti(origin: Bob , callHash: h(${addProxyEveDisplay})) succesfully included at `, 496 | inclusionPoint2 497 | ); 498 | logSeperator(); 499 | await waitToContinue(); 500 | 501 | // construct transaction for Dave to approve and execute adding Eve as a proxy to the multisig address 502 | const asMulti = await transactionConstruct.multiSigAsMulti( 503 | { origin: keys.dave.address }, 504 | 2, 505 | sortAddresses([keys.alice.address, keys.bob.address], ss58Prefix), 506 | inclusionPoint2, 507 | addProxyEveMethod, 508 | false, 509 | maxWeight 510 | ); 511 | const signedAsMulti = transactionConstruct.createAndSignTransaction( 512 | keys.dave, 513 | asMulti 514 | ); 515 | console.log(`multisig.asMulti(origin: Dave, call: ${addProxyEveDisplay})`); 516 | submiting(); 517 | const result3 = await sidecarApi.submitTransaction(signedAsMulti); 518 | console.log(`Node response: `, result3.hash); 519 | waiting(); 520 | const inlusionPoint3 = await chainSync.pollingEventListener( 521 | 'multisig', 522 | 'MultisigExecuted' 523 | ); 524 | console.log( 525 | 'multisig.asMulti(origin: Dave, call: ${addProxyEveDisplay}) succsefully included at ', 526 | inlusionPoint3 527 | ); 528 | logSeperator(); 529 | await waitToContinue(); 530 | } 531 | 532 | async function depositerTransferToDeriv( 533 | transactionConstruct: TransactionConstruct, 534 | chainSync: ChainSync, 535 | sidecarApi: SidecarApi, 536 | keys: Keys, 537 | deriveAddr0: string, 538 | deriveAddr1: string 539 | ): Promise { 540 | // construct tx to transfer funds from charlie (depositer) to mulisig derive address 0 541 | const transferToD0 = await transactionConstruct.balancesTransfer( 542 | { origin: keys.charlie.address }, 543 | deriveAddr0, 544 | '1234567890123450' 545 | ); 546 | const signedTransferToD0 = transactionConstruct.createAndSignTransaction( 547 | keys.charlie, 548 | transferToD0 549 | ); 550 | console.log('balances.transfer(origin: Charlie, dest: derive address 0)'); 551 | submiting(); 552 | const nodeRes1 = await sidecarApi.submitTransaction(signedTransferToD0); 553 | console.log(`Node response: `, nodeRes1.hash); 554 | waiting(); 555 | const inclusionPoint1 = await chainSync.pollingEventListener( 556 | 'balances', 557 | 'Transfer' 558 | ); 559 | if (!inclusionPoint1) throw 'inclusionPoint1 is null'; 560 | console.log( 561 | 'balances.transfer(origin: Charlie, dest: derive address 0) sucessfully included at ', 562 | inclusionPoint1 563 | ); 564 | logSeperator(); 565 | await waitToContinue(); 566 | 567 | // construct tx to transfer funds from charlie (depositer) to mulisig derive address 1 568 | const transferToD1 = await transactionConstruct.balancesTransfer( 569 | { origin: keys.charlie.address, height: inclusionPoint1.height + 1 }, 570 | deriveAddr1, 571 | '1234567890123450' 572 | ); 573 | const signedTransferToD1 = transactionConstruct.createAndSignTransaction( 574 | keys.charlie, 575 | transferToD1 576 | ); 577 | 578 | console.log('balances.transfer(origin: Charlie, dest: derive address 1)'); 579 | submiting(); 580 | const nodeRes2 = await sidecarApi.submitTransaction(signedTransferToD1); 581 | console.log(`Node response: `, nodeRes2.hash); 582 | waiting(); 583 | const inclusionPoint2 = await chainSync.pollingEventListener( 584 | 'balances', 585 | 'Transfer' 586 | ); 587 | console.log( 588 | 'balances.transfer(origin: Charlie, dest: derive address 1) succesfully included at ', 589 | inclusionPoint2 590 | ); 591 | logSeperator(); 592 | await waitToContinue(); 593 | } 594 | -------------------------------------------------------------------------------- /src/sidecar/SidecarApi.ts: -------------------------------------------------------------------------------- 1 | import axios, { AxiosError, AxiosInstance } from 'axios'; 2 | 3 | import { sleep } from '../util'; 4 | import { AccountBalanceInfo } from './types/AccountBalanceInfo'; 5 | import { Block } from './types/Block'; 6 | import { TransactionMaterial } from './types/TransactionMaterial'; 7 | 8 | type ApiResponse = { 9 | data: TransactionMaterial | Block | AccountBalanceInfo; 10 | }; 11 | 12 | export class SidecarApi { 13 | private api: AxiosInstance; 14 | readonly SECOND = 1_000; 15 | constructor(sidecarBaseUrl: string) { 16 | this.api = axios.create({ baseURL: sidecarBaseUrl }); 17 | } 18 | 19 | /** 20 | * Execute a get request to `uri` with exponential backoff for failed request 21 | * retry attempts. 22 | * 23 | * @param uri URI 24 | * @param attempts only for recursive cases 25 | */ 26 | private async retryGet(uri: string, attempts = 0): Promise { 27 | try { 28 | return await this.api.get(uri); 29 | } catch (e) { 30 | // Exponential back for up to 3 trys 31 | if (attempts < 3) { 32 | console.error( 33 | `Attempt ${attempts} for sidecar endpoint ${uri}` 34 | ); 35 | attempts += 1; 36 | await sleep(2 * attempts * this.SECOND); 37 | return await this.retryGet(uri, attempts); 38 | } 39 | // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access 40 | if (e?.isAxiosError) { 41 | const { 42 | response, 43 | config: { url, method }, 44 | } = e as AxiosError; 45 | 46 | throw { 47 | method, 48 | url, 49 | status: response?.status, 50 | statusText: response?.statusText, 51 | }; 52 | } 53 | 54 | throw e; 55 | } 56 | } 57 | 58 | async getBlock(num?: number): Promise { 59 | const response = num 60 | ? await this.retryGet(`/blocks/${num}`) 61 | : await this.retryGet(`/blocks/head`); 62 | 63 | return response.data as Block; 64 | } 65 | 66 | async getAccountBalance( 67 | account: string, 68 | height?: number 69 | ): Promise { 70 | const response = height 71 | ? await this.retryGet( 72 | `/accounts/${account}/balance-info?at=${height}` 73 | ) 74 | : await this.retryGet(`/accounts/${account}/balance-info`); 75 | 76 | return response.data as AccountBalanceInfo; 77 | } 78 | 79 | async getTransactionMaterial({ 80 | height, 81 | noMeta, 82 | }: { 83 | height?: number; 84 | noMeta?: boolean; 85 | }): Promise { 86 | let uri = `transaction/material`; 87 | if (typeof height === 'number' || noMeta) { 88 | uri += '?'; 89 | } 90 | 91 | if (typeof height === 'number') { 92 | uri += `at=${height}&`; 93 | } 94 | 95 | if (noMeta) { 96 | uri += 'noMeta=true'; 97 | } 98 | 99 | const response = await this.retryGet(uri); 100 | 101 | return response.data as TransactionMaterial; 102 | } 103 | 104 | async submitTransaction(tx: string): Promise<{ hash: string }> { 105 | try { 106 | return (await this.api.post('/transaction', { tx })).data as { 107 | hash: string; 108 | }; 109 | } catch (e) { 110 | // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access 111 | if (e?.isAxiosError) { 112 | const { 113 | response, 114 | config: { url, method }, 115 | } = e as AxiosError; 116 | 117 | throw { 118 | method, 119 | url, 120 | status: response?.status, 121 | statusText: response?.statusText, 122 | }; 123 | } 124 | 125 | throw e; 126 | } 127 | } 128 | } 129 | -------------------------------------------------------------------------------- /src/sidecar/types/AccountBalanceInfo.ts: -------------------------------------------------------------------------------- 1 | import { At } from './At'; 2 | 3 | export interface AccountBalanceInfo { 4 | at: At; 5 | nonce: string; 6 | free: string; 7 | reserved: string; 8 | miscFrozen: string; 9 | feeFrozen: string; 10 | locks: Array; 11 | } 12 | -------------------------------------------------------------------------------- /src/sidecar/types/At.ts: -------------------------------------------------------------------------------- 1 | export interface At { 2 | hash: string; 3 | height: string; 4 | } 5 | -------------------------------------------------------------------------------- /src/sidecar/types/Block.ts: -------------------------------------------------------------------------------- 1 | export interface Block { 2 | number: string; 3 | hash: string; 4 | parentHash: string; 5 | stateRoot: string; 6 | extrinsicsRoot: string; 7 | authorId: string; 8 | logs: Log[]; 9 | onInitialize: IOnInitializeOrFinalize; 10 | extrinsics: Extrinsic[]; 11 | onFinalize: IOnInitializeOrFinalize; 12 | } 13 | 14 | interface Log { 15 | type: string; 16 | index: string; 17 | value: string; 18 | } 19 | 20 | interface IOnInitializeOrFinalize { 21 | events: SanitizedEvent[]; 22 | } 23 | 24 | interface SanitizedEvent { 25 | method: FrameMethod; 26 | data: string[]; 27 | } 28 | 29 | interface FrameMethod { 30 | pallet: string; 31 | method: string; 32 | } 33 | 34 | interface Extrinsic { 35 | method: FrameMethod; 36 | signature: Signature | null; 37 | nonce: string | null; 38 | args: SanitizedArgs; 39 | tip: string | null; 40 | hash: string; 41 | info: RuntimeDispatchInfo | { error: string } | {}; 42 | events: SanitizedEvent[]; 43 | success: boolean; 44 | paysfee: boolean | null; 45 | } 46 | 47 | interface Signature { 48 | signature: string; 49 | signer: string; 50 | } 51 | 52 | interface SanitizedArgs { 53 | call?: ISanitizedCall; 54 | calls?: ISanitizedCall[]; 55 | [key: string]: unknown; 56 | } 57 | 58 | export interface ISanitizedCall { 59 | [key: string]: unknown; 60 | method: FrameMethod; 61 | args: SanitizedArgs; 62 | } 63 | 64 | interface RuntimeDispatchInfo { 65 | weight: string; 66 | class: string; 67 | partialFee: string; 68 | } 69 | -------------------------------------------------------------------------------- /src/sidecar/types/TransactionMaterial.ts: -------------------------------------------------------------------------------- 1 | import { At } from './At'; 2 | 3 | export interface TransactionMaterial { 4 | at: At; 5 | genesisHash: string; 6 | chainName: string; 7 | specName: string; 8 | specVersion: string; 9 | txVersion: string; 10 | metadata: string; 11 | } 12 | -------------------------------------------------------------------------------- /src/static/architecture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/canontech/proxy-hot-wallet/c1fee91dd153ef67d6ff0c0c8418d7a52b862fa5/src/static/architecture.png -------------------------------------------------------------------------------- /src/transaction/TransactionConstruct.ts: -------------------------------------------------------------------------------- 1 | import { TypeRegistry } from '@polkadot/types'; 2 | import { EXTRINSIC_VERSION } from '@polkadot/types/extrinsic/v4/Extrinsic'; 3 | import { AnyJson } from '@polkadot/types/types'; 4 | import * as txwrapper from '@substrate/txwrapper'; 5 | import { KeyringPair } from '@substrate/txwrapper'; 6 | import { createMetadata } from '@substrate/txwrapper/lib/util'; 7 | import { Args, createMethod } from '@substrate/txwrapper/lib/util/method'; 8 | import { 9 | BaseTxInfo, 10 | OptionsWithMeta, 11 | } from '@substrate/txwrapper/lib/util/types'; 12 | 13 | import { SidecarApi } from '../sidecar/SidecarApi'; 14 | import { 15 | BaseInfo, 16 | MaybeTimepoint, 17 | TransactionOpts, 18 | UnsignedMaterial, 19 | } from './types'; 20 | 21 | type ChainName = 'Kusama' | 'Polkadot' | 'Polkadot CC1' | 'Westend'; 22 | 23 | type SpecName = 'kusama' | 'polkadot' | 'westend'; 24 | 25 | export class TransactionConstruct { 26 | private sidecarApi: SidecarApi; 27 | private readonly ERA_PERIOD = 64; 28 | 29 | constructor(sidecarURL: string, readonly coldStorage: string) { 30 | this.sidecarApi = new SidecarApi(sidecarURL); 31 | } 32 | 33 | private async fetchTransactionMaterial({ 34 | origin, 35 | height: heightParam, 36 | metadataRpc: metadataRpcParam, 37 | }: TransactionOpts): Promise<{ 38 | baseInfo: BaseInfo; 39 | registry: TypeRegistry; 40 | }> { 41 | const { 42 | genesisHash, 43 | txVersion, 44 | specVersion, 45 | chainName, 46 | specName, 47 | metadata: metadataRpc, 48 | } = await this.sidecarApi.getTransactionMaterial({ 49 | height: heightParam, 50 | noMeta: !!metadataRpcParam, 51 | }); 52 | 53 | const { 54 | at: { hash: blockHash, height }, 55 | nonce, 56 | } = await this.sidecarApi.getAccountBalance(origin); 57 | 58 | const registry = txwrapper.getRegistry( 59 | chainName as ChainName, 60 | specName as SpecName, 61 | parseInt(specVersion), 62 | metadataRpc || metadataRpcParam 63 | ); 64 | 65 | const baseInfo = { 66 | nonce: parseInt(nonce), 67 | eraPeriod: this.ERA_PERIOD, 68 | blockHash, 69 | blockNumber: parseInt(height), 70 | specVersion: parseInt(specVersion), 71 | genesisHash, 72 | metadataRpc, 73 | transactionVersion: parseInt(txVersion), 74 | }; 75 | 76 | return { baseInfo, registry }; 77 | } 78 | 79 | async multiSigApproveAsMulti( 80 | { origin, tip, height, metadataRpc }: TransactionOpts, 81 | threshold: number, 82 | otherSignatories: string[], 83 | maybeTimepointArg: MaybeTimepoint | null, 84 | callHash: string, 85 | maxWeight: number 86 | ): Promise { 87 | interface ApproveAsMultiArgs extends Args { 88 | threshold: number; 89 | otherSignatories: string[]; 90 | maybeTimepoint: AnyJson; 91 | callHash: string; 92 | maxWeight: number; 93 | } 94 | 95 | const approveAsMulti = function ( 96 | args: ApproveAsMultiArgs, 97 | info: BaseTxInfo, 98 | options: OptionsWithMeta 99 | ): txwrapper.UnsignedTransaction { 100 | return createMethod( 101 | { 102 | method: { 103 | args, 104 | name: 'approveAsMulti', 105 | pallet: 'multisig', 106 | }, 107 | ...info, 108 | }, 109 | options 110 | ); 111 | }; 112 | 113 | const { baseInfo, registry } = await this.fetchTransactionMaterial({ 114 | origin, 115 | height, 116 | metadataRpc, 117 | }); 118 | 119 | const unsigned = approveAsMulti( 120 | { 121 | threshold, 122 | otherSignatories, 123 | maybeTimepoint: 124 | maybeTimepointArg === null 125 | ? null 126 | : registry 127 | .createType( 128 | 'Option', 129 | maybeTimepointArg 130 | ) 131 | .toJSON(), 132 | callHash, 133 | maxWeight, 134 | }, 135 | { 136 | address: origin, 137 | tip, 138 | ...baseInfo, 139 | }, 140 | { metadataRpc: baseInfo.metadataRpc, registry } 141 | ); 142 | 143 | return { unsigned, metadataRpc: baseInfo.metadataRpc, registry }; 144 | } 145 | 146 | async multiSigAsMulti( 147 | { origin, tip, height, metadataRpc }: TransactionOpts, 148 | threshold: number, 149 | otherSignatories: string[], 150 | maybeTimepointArg: MaybeTimepoint | null, 151 | call: string, 152 | storeCall: boolean, 153 | maxWeight: number 154 | ): Promise { 155 | interface AsMultiArgs extends Args { 156 | threshold: number; 157 | otherSignatories: string[]; 158 | maybeTimepoint: AnyJson; 159 | call: string; 160 | storeCall: boolean; 161 | maxWeight: number; 162 | } 163 | 164 | const asMulti = function ( 165 | args: AsMultiArgs, 166 | info: BaseTxInfo, 167 | options: OptionsWithMeta 168 | ): txwrapper.UnsignedTransaction { 169 | return createMethod( 170 | { 171 | method: { 172 | args, 173 | name: 'asMulti', 174 | pallet: 'multisig', 175 | }, 176 | ...info, 177 | }, 178 | options 179 | ); 180 | }; 181 | 182 | const { baseInfo, registry } = await this.fetchTransactionMaterial({ 183 | origin, 184 | height, 185 | metadataRpc, 186 | }); 187 | 188 | const unsigned = asMulti( 189 | { 190 | threshold, 191 | otherSignatories, 192 | maybeTimepoint: registry 193 | .createType('Option', maybeTimepointArg) 194 | .toJSON(), 195 | call, 196 | storeCall, 197 | maxWeight, 198 | }, 199 | { 200 | address: origin, 201 | tip, 202 | ...baseInfo, 203 | }, 204 | { metadataRpc: baseInfo.metadataRpc, registry } 205 | ); 206 | 207 | return { unsigned, metadataRpc: baseInfo.metadataRpc, registry }; 208 | } 209 | 210 | async proxyAddProxy( 211 | { origin, tip, height, metadataRpc }: TransactionOpts, 212 | delegate: string, 213 | proxyType: string, 214 | delay: number 215 | ): Promise { 216 | const { baseInfo, registry } = await this.fetchTransactionMaterial({ 217 | origin, 218 | height, 219 | metadataRpc, 220 | }); 221 | 222 | const unsigned = txwrapper.proxy.addProxy( 223 | { delegate, proxyType, delay }, 224 | { 225 | address: origin, 226 | tip, 227 | ...baseInfo, 228 | }, 229 | { metadataRpc: baseInfo.metadataRpc, registry } 230 | ); 231 | 232 | return { 233 | unsigned, 234 | metadataRpc: baseInfo.metadataRpc, 235 | registry, 236 | }; 237 | } 238 | 239 | async proxyProxyAnnounced( 240 | { origin, tip, height, metadataRpc }: TransactionOpts, 241 | real: string, 242 | delegate: string, 243 | forceProxyType: string, 244 | call: string 245 | ): Promise { 246 | const { baseInfo, registry } = await this.fetchTransactionMaterial({ 247 | origin, 248 | height, 249 | metadataRpc, 250 | }); 251 | 252 | const unsigned = txwrapper.proxy.proxyAnnounced( 253 | { 254 | real, 255 | delegate, 256 | forceProxyType, 257 | call, 258 | }, 259 | { 260 | address: origin, 261 | tip, 262 | ...baseInfo, 263 | }, 264 | { metadataRpc: baseInfo.metadataRpc, registry } 265 | ); 266 | 267 | return { unsigned, registry, metadataRpc: baseInfo.metadataRpc }; 268 | } 269 | 270 | async proxyProxy( 271 | { origin, tip, height, metadataRpc }: TransactionOpts, 272 | real: string, 273 | forceProxyType: string, 274 | call: string 275 | ): Promise { 276 | const { baseInfo, registry } = await this.fetchTransactionMaterial({ 277 | origin, 278 | height, 279 | metadataRpc, 280 | }); 281 | 282 | const unsigned = txwrapper.proxy.proxy( 283 | { 284 | real, 285 | forceProxyType, 286 | call, 287 | }, 288 | { 289 | address: origin, 290 | tip, 291 | ...baseInfo, 292 | }, 293 | { metadataRpc: baseInfo.metadataRpc, registry } 294 | ); 295 | 296 | return { unsigned, registry, metadataRpc: baseInfo.metadataRpc }; 297 | } 298 | 299 | async proxyAnnounce( 300 | { origin, tip, height, metadataRpc }: TransactionOpts, 301 | real: string, 302 | callHash: string 303 | ): Promise { 304 | const { baseInfo, registry } = await this.fetchTransactionMaterial({ 305 | origin, 306 | height, 307 | metadataRpc, 308 | }); 309 | 310 | const unsigned = txwrapper.proxy.announce( 311 | { real, callHash }, 312 | { 313 | address: origin, 314 | tip, 315 | ...baseInfo, 316 | }, 317 | { metadataRpc: baseInfo.metadataRpc, registry } 318 | ); 319 | 320 | return { unsigned, registry, metadataRpc: baseInfo.metadataRpc }; 321 | } 322 | 323 | async proxyRemoveProxies({ 324 | origin, 325 | tip, 326 | height, 327 | metadataRpc, 328 | }: TransactionOpts): Promise { 329 | const { baseInfo, registry } = await this.fetchTransactionMaterial({ 330 | origin, 331 | height, 332 | metadataRpc, 333 | }); 334 | 335 | const unsigned = txwrapper.proxy.removeProxies( 336 | {}, 337 | { 338 | address: origin, 339 | tip, 340 | ...baseInfo, 341 | }, 342 | { metadataRpc: baseInfo.metadataRpc, registry } 343 | ); 344 | 345 | return { unsigned, registry, metadataRpc: baseInfo.metadataRpc }; 346 | } 347 | 348 | async proxyRejectAnnouncement( 349 | { origin, tip, height, metadataRpc }: TransactionOpts, 350 | delegate: string, 351 | callHash: string 352 | ): Promise { 353 | const { baseInfo, registry } = await this.fetchTransactionMaterial({ 354 | origin, 355 | height, 356 | metadataRpc, 357 | }); 358 | 359 | const unsigned = txwrapper.proxy.rejectAnnouncement( 360 | { delegate, callHash }, 361 | { 362 | address: origin, 363 | tip, 364 | ...baseInfo, 365 | }, 366 | { metadataRpc: baseInfo.metadataRpc, registry } 367 | ); 368 | return { unsigned, registry, metadataRpc: baseInfo.metadataRpc }; 369 | } 370 | 371 | async proxyAnonymous( 372 | { origin, tip, height, metadataRpc }: TransactionOpts, 373 | proxyType: string, 374 | delay: number, 375 | index: number, 376 | ): Promise { 377 | const { baseInfo, registry } = await this.fetchTransactionMaterial({ 378 | origin, 379 | height, 380 | metadataRpc, 381 | }); 382 | 383 | const unsigned = txwrapper.proxy.anonymous( 384 | { proxyType, delay, index }, 385 | { 386 | address: origin, 387 | tip, 388 | ...baseInfo, 389 | }, 390 | { metadataRpc: baseInfo.metadataRpc, registry } 391 | ); 392 | return { unsigned, registry, metadataRpc: baseInfo.metadataRpc }; 393 | } 394 | 395 | async balancesTransfer( 396 | { origin, tip, height, metadataRpc }: TransactionOpts, 397 | dest: string, 398 | value: string 399 | ): Promise { 400 | const { baseInfo, registry } = await this.fetchTransactionMaterial({ 401 | origin, 402 | height, 403 | metadataRpc, 404 | }); 405 | 406 | const unsigned = txwrapper.balances.transfer( 407 | { dest, value }, 408 | { 409 | address: origin, 410 | tip, 411 | ...baseInfo, 412 | }, 413 | { metadataRpc: baseInfo.metadataRpc, registry } 414 | ); 415 | 416 | return { unsigned, registry, metadataRpc: baseInfo.metadataRpc }; 417 | } 418 | 419 | async utilityAsDerivative( 420 | { origin, tip, height, metadataRpc }: TransactionOpts, 421 | index: number, 422 | call: string 423 | ): Promise { 424 | const { baseInfo, registry } = await this.fetchTransactionMaterial({ 425 | origin, 426 | height, 427 | metadataRpc, 428 | }); 429 | 430 | const unsigned = txwrapper.utility.asDerivative( 431 | { index, call }, 432 | { 433 | address: origin, 434 | tip, 435 | ...baseInfo, 436 | }, 437 | { metadataRpc: baseInfo.metadataRpc, registry } 438 | ); 439 | 440 | return { unsigned, registry, metadataRpc: baseInfo.metadataRpc }; 441 | } 442 | 443 | /** 444 | * Create the signing payload, create a signature from the payload, and then 445 | * returned the payload with the signature attached 446 | * 447 | * @param origin 448 | * @param unsignedMaterial 449 | */ 450 | createAndSignTransaction( 451 | origin: KeyringPair, 452 | { unsigned, registry, metadataRpc }: UnsignedMaterial 453 | ): string { 454 | registry.setMetadata(createMetadata(registry, metadataRpc)); 455 | 456 | const signingPayload = txwrapper.createSigningPayload(unsigned, { 457 | registry, 458 | }); 459 | 460 | const { signature } = registry 461 | .createType('ExtrinsicPayload', signingPayload, { 462 | version: EXTRINSIC_VERSION, 463 | }) 464 | .sign(origin); 465 | 466 | return txwrapper.createSignedTx(unsigned, signature, { 467 | registry, 468 | metadataRpc, 469 | }); 470 | } 471 | 472 | /** 473 | * Simple function to check if a call is balance transfer to the cold storage 474 | * address given on instance initizilation. 475 | */ 476 | safetyWorker({ 477 | unsigned, 478 | registry, 479 | metadataRpc, 480 | }: UnsignedMaterial): boolean { 481 | const decodedC0 = txwrapper.decode(unsigned, { 482 | registry, 483 | metadataRpc, 484 | }); 485 | console.log( 486 | 'Decoded attempt to transfer from derivative account:\n', 487 | decodedC0.method.args 488 | ); 489 | const isColdStorageAddress = 490 | decodedC0.method.args.dest === this.coldStorage; 491 | console.log( 492 | 'Destination is correct cold storage: ', 493 | isColdStorageAddress 494 | ); 495 | 496 | return isColdStorageAddress; 497 | } 498 | } 499 | -------------------------------------------------------------------------------- /src/transaction/types/BaseInfo.ts: -------------------------------------------------------------------------------- 1 | export interface BaseInfo { 2 | nonce: number; 3 | eraPeriod: number; 4 | blockHash: string; 5 | blockNumber: number; 6 | specVersion: number; 7 | genesisHash: string; 8 | metadataRpc: string; 9 | transactionVersion: number; 10 | } 11 | -------------------------------------------------------------------------------- /src/transaction/types/MaybeTimepoint.ts: -------------------------------------------------------------------------------- 1 | export interface MaybeTimepoint { 2 | height: number; 3 | index: number; 4 | } 5 | -------------------------------------------------------------------------------- /src/transaction/types/TransactionOpts.ts: -------------------------------------------------------------------------------- 1 | export interface TransactionOpts { 2 | /** 3 | * Address of the signer 4 | */ 5 | origin: string; 6 | /** 7 | * Value of tip in native currency 8 | */ 9 | tip?: number; 10 | /** 11 | * Block height to fetch tranaction material at 12 | */ 13 | height?: number; 14 | /** 15 | * Scale encoded hex metadata blob. Optional performance enhancement that reduces payload size 16 | * from `transaction/material` endpoint. Should only be used if it is known that there will be no 17 | * runtime upgrade between transaction contruction and submission. 18 | */ 19 | metadataRpc?: string; 20 | } 21 | -------------------------------------------------------------------------------- /src/transaction/types/UnsignedMaterial.ts: -------------------------------------------------------------------------------- 1 | import { TypeRegistry } from '@polkadot/types'; 2 | import * as txwrapper from '@substrate/txwrapper'; 3 | 4 | export interface UnsignedMaterial { 5 | unsigned: txwrapper.UnsignedTransaction; 6 | metadataRpc: string; 7 | registry: TypeRegistry; 8 | } 9 | -------------------------------------------------------------------------------- /src/transaction/types/index.ts: -------------------------------------------------------------------------------- 1 | export * from './BaseInfo'; 2 | export * from './UnsignedMaterial'; 3 | export * from './MaybeTimepoint'; 4 | export * from './TransactionOpts'; 5 | -------------------------------------------------------------------------------- /src/util/display.ts: -------------------------------------------------------------------------------- 1 | export function logSeperator(): void { 2 | console.log(Array(80).fill('━').join(''), '\n'); 3 | } 4 | 5 | export function submiting(): void { 6 | console.log('...submiting transaction to the node 🚀'); 7 | } 8 | 9 | export function waiting(): void { 10 | console.log('...waiting for transaction inclusion ⌛️⌛⌛️'); 11 | } 12 | -------------------------------------------------------------------------------- /src/util/index.ts: -------------------------------------------------------------------------------- 1 | export * from './display'; 2 | export * from './sleep'; 3 | export * from './sortAddreses'; 4 | export * from './input'; 5 | -------------------------------------------------------------------------------- /src/util/input.ts: -------------------------------------------------------------------------------- 1 | import readline from 'readline'; 2 | 3 | export function waitToContinue(): Promise { 4 | const rl = readline.createInterface({ 5 | input: process.stdin, 6 | output: process.stdout, 7 | }); 8 | 9 | return new Promise((resolve, _reject) => { 10 | rl.question('Press enter to continue:\n', (_answer) => { 11 | console.log(_answer); 12 | rl.close(); 13 | resolve(undefined); 14 | }); 15 | }); 16 | } 17 | -------------------------------------------------------------------------------- /src/util/sleep.ts: -------------------------------------------------------------------------------- 1 | import { promisify } from 'util'; 2 | 3 | export async function sleep(ms: number): Promise { 4 | const s = promisify(setTimeout); 5 | await s(ms); 6 | return; 7 | } 8 | -------------------------------------------------------------------------------- /src/util/sortAddreses.ts: -------------------------------------------------------------------------------- 1 | import { decodeAddress, encodeAddress } from '@polkadot/keyring'; 2 | import { u8aSorted } from '@polkadot/util'; 3 | 4 | export function sortAddresses( 5 | addresses: string[], 6 | ss58Prefix?: number 7 | ): string[] { 8 | return u8aSorted( 9 | addresses.map((addr) => decodeAddress(addr)) 10 | ).map((pubkey) => encodeAddress(pubkey, ss58Prefix)); 11 | } 12 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "declaration": true, 4 | "module": "CommonJS", 5 | "target": "ES6", 6 | "outDir": "build", 7 | "esModuleInterop": true, 8 | "strict": true, 9 | "sourceMap": true, 10 | "pretty": true 11 | }, 12 | "include": [ 13 | "src" 14 | ] 15 | } 16 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@acala-network/type-definitions@^0.7.2-4": 6 | version "0.7.3" 7 | resolved "https://registry.yarnpkg.com/@acala-network/type-definitions/-/type-definitions-0.7.3.tgz#e03872a79a48a39e3055ce5fdf20adc6a9b7ca65" 8 | integrity sha512-ZSlBgvUNBhVKCDKFrAoI8EMW3GUfEsmzbTzuXnT/CbI4fiTomiqyZ3LOCP7Mh+N6gkd58xr1nUHRzs8LZ1nsig== 9 | dependencies: 10 | "@open-web3/orml-type-definitions" "^0.9.3" 11 | 12 | "@babel/code-frame@7.12.11": 13 | version "7.12.11" 14 | resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" 15 | integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw== 16 | dependencies: 17 | "@babel/highlight" "^7.10.4" 18 | 19 | "@babel/helper-validator-identifier@^7.12.11": 20 | version "7.12.11" 21 | resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz#c9a1f021917dcb5ccf0d4e453e399022981fc9ed" 22 | integrity sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw== 23 | 24 | "@babel/highlight@^7.10.4": 25 | version "7.13.10" 26 | resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.13.10.tgz#a8b2a66148f5b27d666b15d81774347a731d52d1" 27 | integrity sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg== 28 | dependencies: 29 | "@babel/helper-validator-identifier" "^7.12.11" 30 | chalk "^2.0.0" 31 | js-tokens "^4.0.0" 32 | 33 | "@babel/runtime@7.10.4": 34 | version "7.10.4" 35 | resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.10.4.tgz#a6724f1a6b8d2f6ea5236dbfe58c7d7ea9c5eb99" 36 | integrity sha512-UpTN5yUJr9b4EX2CnGNWIvER7Ab83ibv0pcvvHc4UOdrBI5jb8bj+32cCwPX6xu0mt2daFNjYhoi+X7beH0RSw== 37 | dependencies: 38 | regenerator-runtime "^0.13.4" 39 | 40 | "@babel/runtime@^7.13.10", "@babel/runtime@^7.13.9", "@babel/runtime@^7.9.6": 41 | version "7.13.17" 42 | resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.13.17.tgz#8966d1fc9593bf848602f0662d6b4d0069e3a7ec" 43 | integrity sha512-NCdgJEelPTSh+FEFylhnP1ylq848l1z9t9N0j1Lfbcw0+KXGjsTvUmkxy+voLLXB5SOKMbLLx4jxYliGrYQseA== 44 | dependencies: 45 | regenerator-runtime "^0.13.4" 46 | 47 | "@crustio/type-definitions@0.0.5": 48 | version "0.0.5" 49 | resolved "https://registry.yarnpkg.com/@crustio/type-definitions/-/type-definitions-0.0.5.tgz#6be9cd9ed8ee34d6b67176f8860793b94ed72699" 50 | integrity sha512-MhozPIjg4iFelKebCgQKSlz+Nm/swbdZpAeJkw+Q6IHxDws57sodpy5EMDBEgszTsB71XDouSmQzgh3or1XrsQ== 51 | dependencies: 52 | "@open-web3/orml-type-definitions" "^0.8.2-9" 53 | 54 | "@dabh/diagnostics@^2.0.2": 55 | version "2.0.2" 56 | resolved "https://registry.yarnpkg.com/@dabh/diagnostics/-/diagnostics-2.0.2.tgz#290d08f7b381b8f94607dc8f471a12c675f9db31" 57 | integrity sha512-+A1YivoVDNNVCdfozHSR8v/jyuuLTMXwjWuxPFlFlUapXoGc+Gj9mDlTDDfrwl7rXCl2tNZ0kE8sIBO6YOn96Q== 58 | dependencies: 59 | colorspace "1.1.x" 60 | enabled "2.0.x" 61 | kuler "^2.0.0" 62 | 63 | "@darwinia/types-known@^1.1.0-alpha.8": 64 | version "1.1.0-alpha.8" 65 | resolved "https://registry.yarnpkg.com/@darwinia/types-known/-/types-known-1.1.0-alpha.8.tgz#0139dae5fb6c4d7451cf6be22abefb4d6d954894" 66 | integrity sha512-1Vo3/UE1HQZheUfbuJi8bmJajoY7PMuIpo65DRAT96UGfZm/MYf9/8y6DFFrhLe4cyoCAb+ni1Q+/O9Uh6mQag== 67 | dependencies: 68 | "@babel/runtime" "^7.9.6" 69 | "@polkadot/types" "4.0.4-5" 70 | "@polkadot/util" "6.0.5" 71 | bn.js "^5.1.2" 72 | 73 | "@darwinia/types@^1.1.0-alpha.7": 74 | version "1.1.0-alpha.8" 75 | resolved "https://registry.yarnpkg.com/@darwinia/types/-/types-1.1.0-alpha.8.tgz#138851b82d57a1b9cf20fdceaab383c76ab294ca" 76 | integrity sha512-225XlOYSai1QkpPOTWBTrEidRitcXHSptzNgvZ5RO1qVwbgb8Q0++SNsD0ikkDRpn1g5/ySDQFExWSfRcTi6bg== 77 | dependencies: 78 | "@darwinia/types-known" "^1.1.0-alpha.8" 79 | 80 | "@edgeware/node-types@^3.3.4": 81 | version "3.3.4" 82 | resolved "https://registry.yarnpkg.com/@edgeware/node-types/-/node-types-3.3.4.tgz#6666cc636a11dc197813b6f56bc54f9db0a200d4" 83 | integrity sha512-wCud1L4hmVeu2dkBsP3f89lWIwtg87Hh6t1AT6KvFlpR0vGWR1HLAe2ITmB9RhJdWy8NR5rLoCAEzaq4TDcctA== 84 | 85 | "@equilab/definitions@1.0.3": 86 | version "1.0.3" 87 | resolved "https://registry.yarnpkg.com/@equilab/definitions/-/definitions-1.0.3.tgz#4cd92830d811dbb29dff58f81d6ddead869b8980" 88 | integrity sha512-9Dn4kCRmyc0Jxg9TDXDkQYods0HgT0pTqlD2II7CejUY3J8G4jbVTmTgZqb5izoUw+Ei1YCDUBmNl8gt9TecSA== 89 | 90 | "@eslint/eslintrc@^0.4.0": 91 | version "0.4.0" 92 | resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.0.tgz#99cc0a0584d72f1df38b900fb062ba995f395547" 93 | integrity sha512-2ZPCc+uNbjV5ERJr+aKSPRwZgKd2z11x0EgLvb1PURmUrn9QNRXFqje0Ldq454PfAVyaJYyrDvvIKSFP4NnBog== 94 | dependencies: 95 | ajv "^6.12.4" 96 | debug "^4.1.1" 97 | espree "^7.3.0" 98 | globals "^12.1.0" 99 | ignore "^4.0.6" 100 | import-fresh "^3.2.1" 101 | js-yaml "^3.13.1" 102 | minimatch "^3.0.4" 103 | strip-json-comments "^3.1.1" 104 | 105 | "@interlay/polkabtc-types@^0.6.2": 106 | version "0.6.2" 107 | resolved "https://registry.yarnpkg.com/@interlay/polkabtc-types/-/polkabtc-types-0.6.2.tgz#0eeef460850e4b82abd58aa2ebbd8b92497d7e7a" 108 | integrity sha512-uhlzcp9rcwGtsEWStzcWrKWVIQtmnQTVgpXL2RdWSF2Ed4cF+Y2fQe5SsKBSR56T6GImHTYds0Psare+HzI0vw== 109 | 110 | "@laminar/type-definitions@^0.3.1": 111 | version "0.3.1" 112 | resolved "https://registry.yarnpkg.com/@laminar/type-definitions/-/type-definitions-0.3.1.tgz#e1b62ab353245f9b3454cb5d909a329f66aaac8f" 113 | integrity sha512-QWC2qtvbPIxal+gMfUocZmwK0UsD7Sb0RUm4Hallkp+OXXL+3uBLwztYDLS5LtocOn0tfR//sgpnfsEIEb71Lw== 114 | dependencies: 115 | "@open-web3/orml-type-definitions" "^0.8.2-9" 116 | 117 | "@nodelib/fs.scandir@2.1.4": 118 | version "2.1.4" 119 | resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz#d4b3549a5db5de2683e0c1071ab4f140904bbf69" 120 | integrity sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA== 121 | dependencies: 122 | "@nodelib/fs.stat" "2.0.4" 123 | run-parallel "^1.1.9" 124 | 125 | "@nodelib/fs.stat@2.0.4", "@nodelib/fs.stat@^2.0.2": 126 | version "2.0.4" 127 | resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz#a3f2dd61bab43b8db8fa108a121cfffe4c676655" 128 | integrity sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q== 129 | 130 | "@nodelib/fs.walk@^1.2.3": 131 | version "1.2.6" 132 | resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz#cce9396b30aa5afe9e3756608f5831adcb53d063" 133 | integrity sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow== 134 | dependencies: 135 | "@nodelib/fs.scandir" "2.1.4" 136 | fastq "^1.6.0" 137 | 138 | "@open-web3/orml-type-definitions@^0.8.2-9": 139 | version "0.8.2-11" 140 | resolved "https://registry.yarnpkg.com/@open-web3/orml-type-definitions/-/orml-type-definitions-0.8.2-11.tgz#56358d371b63f83761234a7b1283ac9008e6dddd" 141 | integrity sha512-cUv5+mprnaGNt0tu3FhK1nFRBK7SGjPhA1O0nxWWeRmuuH5fjkr0glbHE9kcKuCBfsh7nt6NGwxwl9emQtUDSA== 142 | 143 | "@open-web3/orml-type-definitions@^0.9.3": 144 | version "0.9.3" 145 | resolved "https://registry.yarnpkg.com/@open-web3/orml-type-definitions/-/orml-type-definitions-0.9.3.tgz#6bf2ff02c108fa0b4416798f27449f14b16f420f" 146 | integrity sha512-Sq88InH7Ca5XbPP2xIzXaZukw0lHG9prpK/y/UA51owscJYQr1y3f6+x8qSUVXMQwowajtODKVVZr4a9wBWi/w== 147 | 148 | "@polkadot/api-derive@4.6.2": 149 | version "4.6.2" 150 | resolved "https://registry.yarnpkg.com/@polkadot/api-derive/-/api-derive-4.6.2.tgz#a456cf10b4db39be2f17b568e7d863a1dce01891" 151 | integrity sha512-wDcg4qOo0uWJrUoDadApJnPApZbzJSq8huXokbev4AfaGGN8HDnW3XesOBfhW7S1Fga0ZJZMXkrVyrfQH1UzyA== 152 | dependencies: 153 | "@babel/runtime" "^7.13.10" 154 | "@polkadot/api" "4.6.2" 155 | "@polkadot/rpc-core" "4.6.2" 156 | "@polkadot/types" "4.6.2" 157 | "@polkadot/util" "^6.2.1" 158 | "@polkadot/util-crypto" "^6.2.1" 159 | "@polkadot/x-rxjs" "^6.2.1" 160 | bn.js "^4.11.9" 161 | 162 | "@polkadot/api@4.6.2", "@polkadot/api@^4.6.2": 163 | version "4.6.2" 164 | resolved "https://registry.yarnpkg.com/@polkadot/api/-/api-4.6.2.tgz#945ae56c2a83ce88d7db62c7320cd8828a2c751f" 165 | integrity sha512-QGLD+K/IcmYIMZklxM//1SUW4s83CHiSm5wplz2Lmasy6uEnM14UGdJ2O9MbObb9ZopSBNsLsMfnvM3JePQ44w== 166 | dependencies: 167 | "@babel/runtime" "^7.13.10" 168 | "@polkadot/api-derive" "4.6.2" 169 | "@polkadot/keyring" "^6.2.1" 170 | "@polkadot/metadata" "4.6.2" 171 | "@polkadot/rpc-core" "4.6.2" 172 | "@polkadot/rpc-provider" "4.6.2" 173 | "@polkadot/types" "4.6.2" 174 | "@polkadot/types-known" "4.6.2" 175 | "@polkadot/util" "^6.2.1" 176 | "@polkadot/util-crypto" "^6.2.1" 177 | "@polkadot/x-rxjs" "^6.2.1" 178 | bn.js "^4.11.9" 179 | eventemitter3 "^4.0.7" 180 | 181 | "@polkadot/apps-config@^0.88.1": 182 | version "0.88.1" 183 | resolved "https://registry.yarnpkg.com/@polkadot/apps-config/-/apps-config-0.88.1.tgz#82fa313403eaa1dcc56e9fd7113367f0d87e79fa" 184 | integrity sha512-kQ6o9IQaU73Dp9JoCLQ0PKa4stpE/iNtIAZV+kbsl44VvdxRron4VzQZsrRj9F+UNG63vBd2gY7R2grRbpYflA== 185 | dependencies: 186 | "@acala-network/type-definitions" "^0.7.2-4" 187 | "@babel/runtime" "^7.13.10" 188 | "@crustio/type-definitions" "0.0.5" 189 | "@darwinia/types" "^1.1.0-alpha.7" 190 | "@edgeware/node-types" "^3.3.4" 191 | "@equilab/definitions" "1.0.3" 192 | "@interlay/polkabtc-types" "^0.6.2" 193 | "@laminar/type-definitions" "^0.3.1" 194 | "@polkadot/networks" "^6.2.1" 195 | "@snowfork/snowbridge-types" "^0.2.3" 196 | "@sora-substrate/type-definitions" "^0.8.0" 197 | "@subsocial/types" "^0.4.36" 198 | "@zeitgeistpm/type-defs" "^0.1.36" 199 | moonbeam-types-bundle "1.1.12" 200 | 201 | "@polkadot/keyring@^6.2.1": 202 | version "6.2.1" 203 | resolved "https://registry.yarnpkg.com/@polkadot/keyring/-/keyring-6.2.1.tgz#8074b19e96c9722214fecbc31b9e9877868b42ff" 204 | integrity sha512-0suOIagCC6p6fJw3pEZaXpDP1tPXDGUIQXZaArh+t+TKAG5OJ2HUmeGv3FeiljGnnI7iZmrjrrshx1GSp0B+gA== 205 | dependencies: 206 | "@babel/runtime" "^7.13.10" 207 | "@polkadot/util" "6.2.1" 208 | "@polkadot/util-crypto" "6.2.1" 209 | 210 | "@polkadot/metadata@4.0.4-5": 211 | version "4.0.4-5" 212 | resolved "https://registry.yarnpkg.com/@polkadot/metadata/-/metadata-4.0.4-5.tgz#397b446ebc9270472688a4899caf25728548ffb7" 213 | integrity sha512-aVmgR56Qn+sexI9hL9pOiTT91ZppNbnx/SXjMvPQDQsbJjODe6An8t1q5Y+qm3HNjryv+xM17Bekzl5zihBXfg== 214 | dependencies: 215 | "@babel/runtime" "^7.13.9" 216 | "@polkadot/types" "4.0.4-5" 217 | "@polkadot/types-known" "4.0.4-5" 218 | "@polkadot/util" "^6.0.5" 219 | "@polkadot/util-crypto" "^6.0.5" 220 | bn.js "^4.11.9" 221 | 222 | "@polkadot/metadata@4.6.2": 223 | version "4.6.2" 224 | resolved "https://registry.yarnpkg.com/@polkadot/metadata/-/metadata-4.6.2.tgz#9806157af86f3571607a7d64d66e6d573160b141" 225 | integrity sha512-0v1j0xenHed06sUI8RbWspbSvPH38z4F8RzS4h24z5PaWq4sKwTSqXJjBAeYNRDYSX8WyTACUZsrWinfTQivHA== 226 | dependencies: 227 | "@babel/runtime" "^7.13.10" 228 | "@polkadot/types" "4.6.2" 229 | "@polkadot/types-known" "4.6.2" 230 | "@polkadot/util" "^6.2.1" 231 | "@polkadot/util-crypto" "^6.2.1" 232 | bn.js "^4.11.9" 233 | 234 | "@polkadot/networks@6.2.1", "@polkadot/networks@^6.0.5", "@polkadot/networks@^6.2.1": 235 | version "6.2.1" 236 | resolved "https://registry.yarnpkg.com/@polkadot/networks/-/networks-6.2.1.tgz#9c4d6d34cc6a4a8cd66a00ed13ec01b898f84cf3" 237 | integrity sha512-q6qJ5UWea+NICg5tX3cLhBPsfUvQnE4SLnux66zfZcnRdhKNqw34dd2SrVdAW1oIYOm36br/wyQ8oK/MP5URiw== 238 | dependencies: 239 | "@babel/runtime" "^7.13.10" 240 | 241 | "@polkadot/rpc-core@4.6.2": 242 | version "4.6.2" 243 | resolved "https://registry.yarnpkg.com/@polkadot/rpc-core/-/rpc-core-4.6.2.tgz#664c492b49bd0b56c813d3ea305cb69bcd34f174" 244 | integrity sha512-WHfDtTJANxT8SPiOy+619Z9vd6HvbQe7XPo6Dv7WCqcMdBRmF1ZDb28UEoT+5fasixe8rVADek5536NOkbqXBQ== 245 | dependencies: 246 | "@babel/runtime" "^7.13.10" 247 | "@polkadot/metadata" "4.6.2" 248 | "@polkadot/rpc-provider" "4.6.2" 249 | "@polkadot/types" "4.6.2" 250 | "@polkadot/util" "^6.2.1" 251 | "@polkadot/x-rxjs" "^6.2.1" 252 | 253 | "@polkadot/rpc-provider@4.6.2": 254 | version "4.6.2" 255 | resolved "https://registry.yarnpkg.com/@polkadot/rpc-provider/-/rpc-provider-4.6.2.tgz#1625fc084c5053967d5265cbfcb11c54e0d5bc90" 256 | integrity sha512-yCdBCQWhQ/RS8ooUAN67w2OZarFI+TrQ196j2LmVacKPjT8+fxXOIcqKwQs+6pYh0svX3v6FJINOc0c9B87tZw== 257 | dependencies: 258 | "@babel/runtime" "^7.13.10" 259 | "@polkadot/types" "4.6.2" 260 | "@polkadot/util" "^6.2.1" 261 | "@polkadot/util-crypto" "^6.2.1" 262 | "@polkadot/x-fetch" "^6.2.1" 263 | "@polkadot/x-global" "^6.2.1" 264 | "@polkadot/x-ws" "^6.2.1" 265 | bn.js "^4.11.9" 266 | eventemitter3 "^4.0.7" 267 | 268 | "@polkadot/types-known@4.0.4-5": 269 | version "4.0.4-5" 270 | resolved "https://registry.yarnpkg.com/@polkadot/types-known/-/types-known-4.0.4-5.tgz#f6ccefc679e12071b8ca0e40ff88a03994ed4d54" 271 | integrity sha512-e3s69I79xyR81AuVfw1vEiPLjDveRwbDCggA4xp/Vw9NmdennB4CLYNl3xiegaXJjW+gsnVGER9phJ0jTExXuQ== 272 | dependencies: 273 | "@babel/runtime" "^7.13.9" 274 | "@polkadot/networks" "^6.0.5" 275 | "@polkadot/types" "4.0.4-5" 276 | "@polkadot/util" "^6.0.5" 277 | bn.js "^4.11.9" 278 | 279 | "@polkadot/types-known@4.6.2": 280 | version "4.6.2" 281 | resolved "https://registry.yarnpkg.com/@polkadot/types-known/-/types-known-4.6.2.tgz#121e5c3f929f305af0c2853ed257ab271a69bbbf" 282 | integrity sha512-rRrs9z1Jz6KdV/j26e7PeSy3TcNVbQ7ESwJhouCF9WDeHzam9eACTJY3eZoYBVEXwthUK9OyyzcJQFhjJyumoQ== 283 | dependencies: 284 | "@babel/runtime" "^7.13.10" 285 | "@polkadot/networks" "^6.2.1" 286 | "@polkadot/types" "4.6.2" 287 | "@polkadot/util" "^6.2.1" 288 | bn.js "^4.11.9" 289 | 290 | "@polkadot/types@4.0.4-5": 291 | version "4.0.4-5" 292 | resolved "https://registry.yarnpkg.com/@polkadot/types/-/types-4.0.4-5.tgz#f157a3d32b84ac7d7c1356bc5a55d4c31c10cfd5" 293 | integrity sha512-atDPNtdTChPlt8kLpdMWjAH1eL+Zc74iTgqB4no9Ir6FkgM/RAIOUuD660JydCRkFCHvJJ+HO9vN9oh3G6qcOw== 294 | dependencies: 295 | "@babel/runtime" "^7.13.9" 296 | "@polkadot/metadata" "4.0.4-5" 297 | "@polkadot/util" "^6.0.5" 298 | "@polkadot/util-crypto" "^6.0.5" 299 | "@polkadot/x-rxjs" "^6.0.5" 300 | "@types/bn.js" "^4.11.6" 301 | bn.js "^4.11.9" 302 | 303 | "@polkadot/types@4.6.2", "@polkadot/types@^4.2.1": 304 | version "4.6.2" 305 | resolved "https://registry.yarnpkg.com/@polkadot/types/-/types-4.6.2.tgz#b7f37fa7e8c8c8ad165d7b07604bae98ac7b0763" 306 | integrity sha512-iH/fdrFmO8qgZmJwRPgYM2AZWde6Et2mlNLejWm9gwqxsTy/2c/Jgf3pWyNqiy46tQOfIeJSwfiVWgRaju9nmA== 307 | dependencies: 308 | "@babel/runtime" "^7.13.10" 309 | "@polkadot/metadata" "4.6.2" 310 | "@polkadot/util" "^6.2.1" 311 | "@polkadot/util-crypto" "^6.2.1" 312 | "@polkadot/x-rxjs" "^6.2.1" 313 | "@types/bn.js" "^4.11.6" 314 | bn.js "^4.11.9" 315 | 316 | "@polkadot/util-crypto@6.2.1", "@polkadot/util-crypto@^6.0.5", "@polkadot/util-crypto@^6.2.1": 317 | version "6.2.1" 318 | resolved "https://registry.yarnpkg.com/@polkadot/util-crypto/-/util-crypto-6.2.1.tgz#a713f5e354354f73984eef7b192106e0d93466ec" 319 | integrity sha512-tj1FsIQoQdXZpGnnptqhoY2aJkHQWHMy6une2CG9qEZ4Ur8X64Yg6sh1DyOgiXjORf3iGlTBed+7zDWXIp0Nxw== 320 | dependencies: 321 | "@babel/runtime" "^7.13.10" 322 | "@polkadot/networks" "6.2.1" 323 | "@polkadot/util" "6.2.1" 324 | "@polkadot/wasm-crypto" "^4.0.2" 325 | "@polkadot/x-randomvalues" "6.2.1" 326 | base-x "^3.0.8" 327 | base64-js "^1.5.1" 328 | blakejs "^1.1.0" 329 | bn.js "^4.11.9" 330 | create-hash "^1.2.0" 331 | elliptic "^6.5.4" 332 | hash.js "^1.1.7" 333 | js-sha3 "^0.8.0" 334 | scryptsy "^2.1.0" 335 | tweetnacl "^1.0.3" 336 | xxhashjs "^0.2.2" 337 | 338 | "@polkadot/util@6.0.5": 339 | version "6.0.5" 340 | resolved "https://registry.yarnpkg.com/@polkadot/util/-/util-6.0.5.tgz#aa52995d3fe998eed218d26b243832a7a3e2944d" 341 | integrity sha512-0EnYdGAXx/Y2MLgCKtlfdKVcURV+Twx+M+auljTeMK8226pR7xMblYuVuO5bxhPWBa1W7+iQloEZ0VRQrIoMDw== 342 | dependencies: 343 | "@babel/runtime" "^7.13.9" 344 | "@polkadot/x-textdecoder" "6.0.5" 345 | "@polkadot/x-textencoder" "6.0.5" 346 | "@types/bn.js" "^4.11.6" 347 | bn.js "^4.11.9" 348 | camelcase "^5.3.1" 349 | ip-regex "^4.3.0" 350 | 351 | "@polkadot/util@6.2.1", "@polkadot/util@^6.0.5", "@polkadot/util@^6.2.1": 352 | version "6.2.1" 353 | resolved "https://registry.yarnpkg.com/@polkadot/util/-/util-6.2.1.tgz#67ca7573782263cf6a833ebe2d040e012df7b5ff" 354 | integrity sha512-+r70J4s7b0Mmdz4AxQPO2wYbTJ9/hbKXbtLQzjz7X7T7PcKqWHDzue+b3CGgGq65n2My4PEzVw7qHGAyPdtRVw== 355 | dependencies: 356 | "@babel/runtime" "^7.13.10" 357 | "@polkadot/x-textdecoder" "6.2.1" 358 | "@polkadot/x-textencoder" "6.2.1" 359 | "@types/bn.js" "^4.11.6" 360 | bn.js "^4.11.9" 361 | camelcase "^5.3.1" 362 | ip-regex "^4.3.0" 363 | 364 | "@polkadot/wasm-crypto-asmjs@^4.0.2": 365 | version "4.0.2" 366 | resolved "https://registry.yarnpkg.com/@polkadot/wasm-crypto-asmjs/-/wasm-crypto-asmjs-4.0.2.tgz#f42c353a64e1243841daf90e4bd54eff01a4e3cf" 367 | integrity sha512-hlebqtGvfjg2ZNm4scwBGVHwOwfUhy2yw5RBHmPwkccUif3sIy4SAzstpcVBIVMdAEvo746bPWEInA8zJRcgJA== 368 | dependencies: 369 | "@babel/runtime" "^7.13.9" 370 | 371 | "@polkadot/wasm-crypto-wasm@^4.0.2": 372 | version "4.0.2" 373 | resolved "https://registry.yarnpkg.com/@polkadot/wasm-crypto-wasm/-/wasm-crypto-wasm-4.0.2.tgz#89f9e0a1e4d076784d4a42bea37fc8b06bdd8bb6" 374 | integrity sha512-de/AfNPZ0uDKFWzOZ1rJCtaUbakGN29ks6IRYu6HZTRg7+RtqvE1rIkxabBvYgQVHIesmNwvEA9DlIkS6hYRFQ== 375 | dependencies: 376 | "@babel/runtime" "^7.13.9" 377 | 378 | "@polkadot/wasm-crypto@^4.0.2": 379 | version "4.0.2" 380 | resolved "https://registry.yarnpkg.com/@polkadot/wasm-crypto/-/wasm-crypto-4.0.2.tgz#9649057adee8383cc86433d107ba526b718c5a3b" 381 | integrity sha512-2h9FuQFkBc+B3TwSapt6LtyPvgtd0Hq9QsHW8g8FrmKBFRiiFKYRpfJKHCk0aCZzuRf9h95bQl/X6IXAIWF2ng== 382 | dependencies: 383 | "@babel/runtime" "^7.13.9" 384 | "@polkadot/wasm-crypto-asmjs" "^4.0.2" 385 | "@polkadot/wasm-crypto-wasm" "^4.0.2" 386 | 387 | "@polkadot/x-fetch@^6.2.1": 388 | version "6.2.1" 389 | resolved "https://registry.yarnpkg.com/@polkadot/x-fetch/-/x-fetch-6.2.1.tgz#531815ab5e4272a3a3d68fff3ed36339d3b15f7e" 390 | integrity sha512-CnPGO/GlqmGPp/BGmMBmW1NKrwZJqVilMmxzSp85XbyxcK3QlRZDU5TtQ1r1MKAEfutLapqX9Ki8S+jzK4GRuA== 391 | dependencies: 392 | "@babel/runtime" "^7.13.10" 393 | "@polkadot/x-global" "6.2.1" 394 | "@types/node-fetch" "^2.5.10" 395 | node-fetch "^2.6.1" 396 | 397 | "@polkadot/x-global@6.0.5": 398 | version "6.0.5" 399 | resolved "https://registry.yarnpkg.com/@polkadot/x-global/-/x-global-6.0.5.tgz#eb2a0980e4c2012f251e7b61832e185f5037ae80" 400 | integrity sha512-KjQvICngNdB2Gno0TYJlgjKI0Ia0NPhN1BG6YzcKLO/5ZNzNHkLmowdNb5gprE8uCBnOFXXHwgZAE/nTYya2dg== 401 | dependencies: 402 | "@babel/runtime" "^7.13.9" 403 | "@types/node-fetch" "^2.5.8" 404 | node-fetch "^2.6.1" 405 | 406 | "@polkadot/x-global@6.2.1", "@polkadot/x-global@^6.2.1": 407 | version "6.2.1" 408 | resolved "https://registry.yarnpkg.com/@polkadot/x-global/-/x-global-6.2.1.tgz#bed7240317769b507f8afbaa9390e68ec5509aae" 409 | integrity sha512-j1Hg9ZIujvXjNnTtbWio6E5YX8hMb9zfBq/vevlNa0OrMsCadqEFaM4poMhfYcjFSenSsZlnIBvqfP0zOx8w+A== 410 | dependencies: 411 | "@babel/runtime" "^7.13.10" 412 | "@types/node-fetch" "^2.5.10" 413 | node-fetch "^2.6.1" 414 | 415 | "@polkadot/x-randomvalues@6.2.1": 416 | version "6.2.1" 417 | resolved "https://registry.yarnpkg.com/@polkadot/x-randomvalues/-/x-randomvalues-6.2.1.tgz#219adde1feea0a2b45b757effd21643fd171a2b4" 418 | integrity sha512-l9K6W44i62e2i5nKJ3/E/f1pd8yuVaMvbf1A4wuvLCgZv37vH1+dZrdSnHXN6i/ZuuixjlmqUNrBW8Bu9HZLpg== 419 | dependencies: 420 | "@babel/runtime" "^7.13.10" 421 | "@polkadot/x-global" "6.2.1" 422 | 423 | "@polkadot/x-rxjs@^6.0.5", "@polkadot/x-rxjs@^6.2.1": 424 | version "6.2.1" 425 | resolved "https://registry.yarnpkg.com/@polkadot/x-rxjs/-/x-rxjs-6.2.1.tgz#5118498ed7736e6e84494d0a2129d498a63c360a" 426 | integrity sha512-NcGC/GKZnbEz2FTdvGiJICfQW+J4wGrK1EAJSjwz2VY/st9SrQOIH1Uzq98Evx1lP8wmmL3RLDw7aNxDUE+rrA== 427 | dependencies: 428 | "@babel/runtime" "^7.13.10" 429 | rxjs "^6.6.7" 430 | 431 | "@polkadot/x-textdecoder@6.0.5": 432 | version "6.0.5" 433 | resolved "https://registry.yarnpkg.com/@polkadot/x-textdecoder/-/x-textdecoder-6.0.5.tgz#919a8991c9e81610a3c4f6bf314331071f2f8345" 434 | integrity sha512-Vd2OftcEYxg2jG37lJw5NcZotnOidinN84m1HJszLIQT9vZDnFfN60gobHsuzHaGjEDexe4wqe0PfbgA4MfWIQ== 435 | dependencies: 436 | "@babel/runtime" "^7.13.9" 437 | "@polkadot/x-global" "6.0.5" 438 | 439 | "@polkadot/x-textdecoder@6.2.1": 440 | version "6.2.1" 441 | resolved "https://registry.yarnpkg.com/@polkadot/x-textdecoder/-/x-textdecoder-6.2.1.tgz#e9f3092d7d485e491ef25d1b70d4ea841c55b215" 442 | integrity sha512-fS8CeQGWSWvUyJXleHWGfP4T8Uv4IOWfSdP8+zQE0E++wMR7ZDQqFIHPdMEoj35YKwEGGscAU1GTEz1V/H5brA== 443 | dependencies: 444 | "@babel/runtime" "^7.13.10" 445 | "@polkadot/x-global" "6.2.1" 446 | 447 | "@polkadot/x-textencoder@6.0.5": 448 | version "6.0.5" 449 | resolved "https://registry.yarnpkg.com/@polkadot/x-textencoder/-/x-textencoder-6.0.5.tgz#fc851259de97a98f3417e51807c1f5ebe265fdf0" 450 | integrity sha512-wAheP9/kzpfBw5uU/jCnHtd9uN9XzUPYH81aPbx3X026dXNMa4xpOoroCfEuNu2RtFXm0ONuYfpHxvHUsst9lA== 451 | dependencies: 452 | "@babel/runtime" "^7.13.9" 453 | "@polkadot/x-global" "6.0.5" 454 | 455 | "@polkadot/x-textencoder@6.2.1": 456 | version "6.2.1" 457 | resolved "https://registry.yarnpkg.com/@polkadot/x-textencoder/-/x-textencoder-6.2.1.tgz#95a35f8b3d24ab742f193f663d2345fe117611ff" 458 | integrity sha512-uhmY+SGaC5zkOl2Q9YXlWi5Y2FZu3UCezOs8rjwH1N2kP/OdCML1WeSrga4l763DS0xmhLL4B89OGVcX6i4ijA== 459 | dependencies: 460 | "@babel/runtime" "^7.13.10" 461 | "@polkadot/x-global" "6.2.1" 462 | 463 | "@polkadot/x-ws@^6.2.1": 464 | version "6.2.1" 465 | resolved "https://registry.yarnpkg.com/@polkadot/x-ws/-/x-ws-6.2.1.tgz#10e4956b259999558dd77c957fc5ef20bde012b6" 466 | integrity sha512-n2dVOak1xlLEyBrTygP+Njt9WYVORQGpXeMlqTcRbgJSeYChS8WqCgLUyVzfkqeuYPeS1gG2Op7m2Rxx9Ve9Nw== 467 | dependencies: 468 | "@babel/runtime" "^7.13.10" 469 | "@polkadot/x-global" "6.2.1" 470 | "@types/websocket" "^1.0.2" 471 | websocket "^1.0.34" 472 | 473 | "@sindresorhus/slugify@^1.1.0": 474 | version "1.1.2" 475 | resolved "https://registry.yarnpkg.com/@sindresorhus/slugify/-/slugify-1.1.2.tgz#c2c0129298b8caace2d9156176fe244d0e83156c" 476 | integrity sha512-V9nR/W0Xd9TSGXpZ4iFUcFGhuOJtZX82Fzxj1YISlbSgKvIiNa7eLEZrT0vAraPOt++KHauIVNYgGRgjc13dXA== 477 | dependencies: 478 | "@sindresorhus/transliterate" "^0.1.1" 479 | escape-string-regexp "^4.0.0" 480 | 481 | "@sindresorhus/transliterate@^0.1.1": 482 | version "0.1.2" 483 | resolved "https://registry.yarnpkg.com/@sindresorhus/transliterate/-/transliterate-0.1.2.tgz#ffce368271d153550e87de81486004f2637425af" 484 | integrity sha512-5/kmIOY9FF32nicXH+5yLNTX4NJ4atl7jRgqAJuIn/iyDFXBktOKDxCvyGE/EzmF4ngSUvjXxQUQlQiZ5lfw+w== 485 | dependencies: 486 | escape-string-regexp "^2.0.0" 487 | lodash.deburr "^4.1.0" 488 | 489 | "@snowfork/snowbridge-types@^0.2.3": 490 | version "0.2.3" 491 | resolved "https://registry.yarnpkg.com/@snowfork/snowbridge-types/-/snowbridge-types-0.2.3.tgz#f562d4acb9aa75217c6183abc140daa8030723fb" 492 | integrity sha512-utxjBiUhtUY/O9dDsnABP6NwF9i4z71/Ywa7cFjohO/8xFxabjRppvE2QLwOIOuBp6OBsvNPtXAaUSUAsrOYRA== 493 | 494 | "@sora-substrate/type-definitions@^0.8.0": 495 | version "0.8.12" 496 | resolved "https://registry.yarnpkg.com/@sora-substrate/type-definitions/-/type-definitions-0.8.12.tgz#91090ed97f7b4702a5b26325a35c118b863e3bf7" 497 | integrity sha512-enCKSxUnDdWtvaM7KoqS93xJS2CK/WTiHLSlsMGpKjOk7aP48uOTfziIuzA2kNSG2DmzABOpq8nscTOd1nqrqg== 498 | dependencies: 499 | "@open-web3/orml-type-definitions" "^0.8.2-9" 500 | 501 | "@subsocial/types@^0.4.36": 502 | version "0.4.36" 503 | resolved "https://registry.yarnpkg.com/@subsocial/types/-/types-0.4.36.tgz#0abf5e422c3a90faeaf9e615ad98d7aa3da0d9a7" 504 | integrity sha512-+hqI/BCKEfW7VeIbz0R0FF7stILb+zjOsBRS5MJGh4eQGN2I4vNX9Gus134VwufPSb0Y+SrnIgQFIv1ePK3RVQ== 505 | dependencies: 506 | "@subsocial/utils" "^0.4.33" 507 | cids "^0.7.1" 508 | 509 | "@subsocial/utils@^0.4.33": 510 | version "0.4.39" 511 | resolved "https://registry.yarnpkg.com/@subsocial/utils/-/utils-0.4.39.tgz#0b069a0e55950ffef6ceb002aea1cdec96d5f133" 512 | integrity sha512-pvD5f5r0W8dGVNCmEO2LV4vWY3dvThgABMvzHmtIAXHAo7aixyz5vSc+t0x8kDRVEEAYL09URaL32bVKnAyaxw== 513 | dependencies: 514 | "@sindresorhus/slugify" "^1.1.0" 515 | bn.js "^5.1.1" 516 | chalk "^3.0.0" 517 | dotenv "^8.0.0" 518 | lodash.isempty "^4.4.0" 519 | lodash.truncate "^4.4.2" 520 | loglevel "^1.7.0" 521 | loglevel-plugin-prefix "^0.8.4" 522 | remark "^13.0.0" 523 | strip-markdown "^4.0.0" 524 | 525 | "@substrate/api-sidecar@^4.0.8": 526 | version "4.0.8" 527 | resolved "https://registry.yarnpkg.com/@substrate/api-sidecar/-/api-sidecar-4.0.8.tgz#870103068533e8338e2825bf075d88de4e3c45ab" 528 | integrity sha512-4ghrYSe11NzsOFBI7uHRV5EYApb2KNUcQilCRG0uzLpS6/QzTW1NHmS3EByzXsB0ZrSg8j87l9+IosKsKXFxOQ== 529 | dependencies: 530 | "@polkadot/api" "^4.6.2" 531 | "@polkadot/apps-config" "^0.88.1" 532 | "@polkadot/util-crypto" "^6.2.1" 533 | "@substrate/calc" "^0.2.0" 534 | confmgr "^1.0.6" 535 | express "^4.17.1" 536 | express-winston "^4.1.0" 537 | http-errors "^1.8.0" 538 | winston "^3.3.3" 539 | 540 | "@substrate/calc@^0.2.0": 541 | version "0.2.0" 542 | resolved "https://registry.yarnpkg.com/@substrate/calc/-/calc-0.2.0.tgz#f558d3059d43f52cd911e1107abf9094d295b910" 543 | integrity sha512-LymmCHIUhN3KD/70CYs0XwUldu0UHg+D1xxdFxEtCzPPeTcyhmlOm2c9EhBjImwb2OiIvpEUONkppxvHMXkNvg== 544 | 545 | "@substrate/txwrapper@^4.1.0": 546 | version "4.1.0" 547 | resolved "https://registry.yarnpkg.com/@substrate/txwrapper/-/txwrapper-4.1.0.tgz#2589052c0a6d4ab315da3c1eddc7f478c8d2bbf5" 548 | integrity sha512-mwf2MgI/1Oz4ENOifNbYe3LOfnuvdWrV+T3qx+Ze1FvAhXCeBfyvd9FArGUnO1yeuZTRos/iayYVJIhHbFPuZg== 549 | dependencies: 550 | "@polkadot/api" "4.6.2" 551 | memoizee "^0.4.14" 552 | 553 | "@types/bn.js@^4.11.6": 554 | version "4.11.6" 555 | resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-4.11.6.tgz#c306c70d9358aaea33cd4eda092a742b9505967c" 556 | integrity sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg== 557 | dependencies: 558 | "@types/node" "*" 559 | 560 | "@types/json-schema@^7.0.3": 561 | version "7.0.7" 562 | resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.7.tgz#98a993516c859eb0d5c4c8f098317a9ea68db9ad" 563 | integrity sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA== 564 | 565 | "@types/mdast@^3.0.0": 566 | version "3.0.3" 567 | resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.3.tgz#2d7d671b1cd1ea3deb306ea75036c2a0407d2deb" 568 | integrity sha512-SXPBMnFVQg1s00dlMCc/jCdvPqdE4mXaMMCeRlxLDmTAEoegHT53xKtkDnzDTOcmMHUfcjyf36/YYZ6SxRdnsw== 569 | dependencies: 570 | "@types/unist" "*" 571 | 572 | "@types/memoizee@^0.4.5": 573 | version "0.4.5" 574 | resolved "https://registry.yarnpkg.com/@types/memoizee/-/memoizee-0.4.5.tgz#cb4e7031decf698c52c4f57c348180b0385aa7da" 575 | integrity sha512-+ZzZZ3+0a7/ajBPeAAD4+LxrBsCat0EFZQtO3o0rwpIeLmDmSaM8KF/oYPuFxeUFAMiHIHFcGucFnY/8S4Hszg== 576 | 577 | "@types/node-fetch@^2.5.10", "@types/node-fetch@^2.5.8": 578 | version "2.5.10" 579 | resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.5.10.tgz#9b4d4a0425562f9fcea70b12cb3fcdd946ca8132" 580 | integrity sha512-IpkX0AasN44hgEad0gEF/V6EgR5n69VEqPEgnmoM8GsIGro3PowbWs4tR6IhxUTyPLpOn+fiGG6nrQhcmoCuIQ== 581 | dependencies: 582 | "@types/node" "*" 583 | form-data "^3.0.0" 584 | 585 | "@types/node@*", "@types/node@^14.14.41": 586 | version "14.14.41" 587 | resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.41.tgz#d0b939d94c1d7bd53d04824af45f1139b8c45615" 588 | integrity sha512-dueRKfaJL4RTtSa7bWeTK1M+VH+Gns73oCgzvYfHZywRCoPSd8EkXBL0mZ9unPTveBn+D9phZBaxuzpwjWkW0g== 589 | 590 | "@types/unist@*", "@types/unist@^2.0.0", "@types/unist@^2.0.2": 591 | version "2.0.3" 592 | resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.3.tgz#9c088679876f374eb5983f150d4787aa6fb32d7e" 593 | integrity sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ== 594 | 595 | "@types/websocket@^1.0.2": 596 | version "1.0.2" 597 | resolved "https://registry.yarnpkg.com/@types/websocket/-/websocket-1.0.2.tgz#d2855c6a312b7da73ed16ba6781815bf30c6187a" 598 | integrity sha512-B5m9aq7cbbD/5/jThEr33nUY8WEfVi6A2YKCTOvw5Ldy7mtsOkqRvGjnzy6g7iMMDsgu7xREuCzqATLDLQVKcQ== 599 | dependencies: 600 | "@types/node" "*" 601 | 602 | "@types/yaml@1.9.7": 603 | version "1.9.7" 604 | resolved "https://registry.yarnpkg.com/@types/yaml/-/yaml-1.9.7.tgz#2331f36e0aac91311a63d33eb026c21687729679" 605 | integrity sha512-8WMXRDD1D+wCohjfslHDgICd2JtMATZU8CkhH8LVJqcJs6dyYj5TGptzP8wApbmEullGBSsCEzzap73DQ1HJaA== 606 | dependencies: 607 | yaml "*" 608 | 609 | "@typescript-eslint/eslint-plugin@^4.22.0": 610 | version "4.22.0" 611 | resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.22.0.tgz#3d5f29bb59e61a9dba1513d491b059e536e16dbc" 612 | integrity sha512-U8SP9VOs275iDXaL08Ln1Fa/wLXfj5aTr/1c0t0j6CdbOnxh+TruXu1p4I0NAvdPBQgoPjHsgKn28mOi0FzfoA== 613 | dependencies: 614 | "@typescript-eslint/experimental-utils" "4.22.0" 615 | "@typescript-eslint/scope-manager" "4.22.0" 616 | debug "^4.1.1" 617 | functional-red-black-tree "^1.0.1" 618 | lodash "^4.17.15" 619 | regexpp "^3.0.0" 620 | semver "^7.3.2" 621 | tsutils "^3.17.1" 622 | 623 | "@typescript-eslint/experimental-utils@4.22.0": 624 | version "4.22.0" 625 | resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.22.0.tgz#68765167cca531178e7b650a53456e6e0bef3b1f" 626 | integrity sha512-xJXHHl6TuAxB5AWiVrGhvbGL8/hbiCQ8FiWwObO3r0fnvBdrbWEDy1hlvGQOAWc6qsCWuWMKdVWlLAEMpxnddg== 627 | dependencies: 628 | "@types/json-schema" "^7.0.3" 629 | "@typescript-eslint/scope-manager" "4.22.0" 630 | "@typescript-eslint/types" "4.22.0" 631 | "@typescript-eslint/typescript-estree" "4.22.0" 632 | eslint-scope "^5.0.0" 633 | eslint-utils "^2.0.0" 634 | 635 | "@typescript-eslint/parser@^4.22.0": 636 | version "4.22.0" 637 | resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.22.0.tgz#e1637327fcf796c641fe55f73530e90b16ac8fe8" 638 | integrity sha512-z/bGdBJJZJN76nvAY9DkJANYgK3nlRstRRi74WHm3jjgf2I8AglrSY+6l7ogxOmn55YJ6oKZCLLy+6PW70z15Q== 639 | dependencies: 640 | "@typescript-eslint/scope-manager" "4.22.0" 641 | "@typescript-eslint/types" "4.22.0" 642 | "@typescript-eslint/typescript-estree" "4.22.0" 643 | debug "^4.1.1" 644 | 645 | "@typescript-eslint/scope-manager@4.22.0": 646 | version "4.22.0" 647 | resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.22.0.tgz#ed411545e61161a8d702e703a4b7d96ec065b09a" 648 | integrity sha512-OcCO7LTdk6ukawUM40wo61WdeoA7NM/zaoq1/2cs13M7GyiF+T4rxuA4xM+6LeHWjWbss7hkGXjFDRcKD4O04Q== 649 | dependencies: 650 | "@typescript-eslint/types" "4.22.0" 651 | "@typescript-eslint/visitor-keys" "4.22.0" 652 | 653 | "@typescript-eslint/types@4.22.0": 654 | version "4.22.0" 655 | resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.22.0.tgz#0ca6fde5b68daf6dba133f30959cc0688c8dd0b6" 656 | integrity sha512-sW/BiXmmyMqDPO2kpOhSy2Py5w6KvRRsKZnV0c4+0nr4GIcedJwXAq+RHNK4lLVEZAJYFltnnk1tJSlbeS9lYA== 657 | 658 | "@typescript-eslint/typescript-estree@4.22.0": 659 | version "4.22.0" 660 | resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.22.0.tgz#b5d95d6d366ff3b72f5168c75775a3e46250d05c" 661 | integrity sha512-TkIFeu5JEeSs5ze/4NID+PIcVjgoU3cUQUIZnH3Sb1cEn1lBo7StSV5bwPuJQuoxKXlzAObjYTilOEKRuhR5yg== 662 | dependencies: 663 | "@typescript-eslint/types" "4.22.0" 664 | "@typescript-eslint/visitor-keys" "4.22.0" 665 | debug "^4.1.1" 666 | globby "^11.0.1" 667 | is-glob "^4.0.1" 668 | semver "^7.3.2" 669 | tsutils "^3.17.1" 670 | 671 | "@typescript-eslint/visitor-keys@4.22.0": 672 | version "4.22.0" 673 | resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.22.0.tgz#169dae26d3c122935da7528c839f42a8a42f6e47" 674 | integrity sha512-nnMu4F+s4o0sll6cBSsTeVsT4cwxB7zECK3dFxzEjPBii9xLpq4yqqsy/FU5zMfan6G60DKZSCXAa3sHJZrcYw== 675 | dependencies: 676 | "@typescript-eslint/types" "4.22.0" 677 | eslint-visitor-keys "^2.0.0" 678 | 679 | "@zeitgeistpm/type-defs@^0.1.36": 680 | version "0.1.45" 681 | resolved "https://registry.yarnpkg.com/@zeitgeistpm/type-defs/-/type-defs-0.1.45.tgz#75262786b14a8cbd7b3cd5b37752b35a5cc8219a" 682 | integrity sha512-nJp/1MDhUEiZibKMBUei5bX1SwbXShEwu/Od8Jp7aad+/OFz9TtETmESFc5o+pYOPFV3mJqu82vek1y7S9+FUw== 683 | 684 | accepts@~1.3.7: 685 | version "1.3.7" 686 | resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" 687 | integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== 688 | dependencies: 689 | mime-types "~2.1.24" 690 | negotiator "0.6.2" 691 | 692 | acorn-jsx@^5.3.1: 693 | version "5.3.1" 694 | resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.1.tgz#fc8661e11b7ac1539c47dbfea2e72b3af34d267b" 695 | integrity sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng== 696 | 697 | acorn@^7.4.0: 698 | version "7.4.1" 699 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" 700 | integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== 701 | 702 | ajv@^6.10.0, ajv@^6.12.4: 703 | version "6.12.6" 704 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" 705 | integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== 706 | dependencies: 707 | fast-deep-equal "^3.1.1" 708 | fast-json-stable-stringify "^2.0.0" 709 | json-schema-traverse "^0.4.1" 710 | uri-js "^4.2.2" 711 | 712 | ajv@^8.0.1: 713 | version "8.1.0" 714 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.1.0.tgz#45d5d3d36c7cdd808930cc3e603cf6200dbeb736" 715 | integrity sha512-B/Sk2Ix7A36fs/ZkuGLIR86EdjbgR6fsAcbx9lOP/QBSXujDNbVmIS/U4Itz5k8fPFDeVZl/zQ/gJW4Jrq6XjQ== 716 | dependencies: 717 | fast-deep-equal "^3.1.1" 718 | json-schema-traverse "^1.0.0" 719 | require-from-string "^2.0.2" 720 | uri-js "^4.2.2" 721 | 722 | ansi-colors@^4.1.1: 723 | version "4.1.1" 724 | resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" 725 | integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== 726 | 727 | ansi-regex@^5.0.0: 728 | version "5.0.0" 729 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" 730 | integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== 731 | 732 | ansi-styles@^3.2.1: 733 | version "3.2.1" 734 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" 735 | integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== 736 | dependencies: 737 | color-convert "^1.9.0" 738 | 739 | ansi-styles@^4.0.0, ansi-styles@^4.1.0: 740 | version "4.3.0" 741 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" 742 | integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== 743 | dependencies: 744 | color-convert "^2.0.1" 745 | 746 | argparse@^1.0.7: 747 | version "1.0.10" 748 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" 749 | integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== 750 | dependencies: 751 | sprintf-js "~1.0.2" 752 | 753 | array-flatten@1.1.1: 754 | version "1.1.1" 755 | resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" 756 | integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= 757 | 758 | array-union@^2.1.0: 759 | version "2.1.0" 760 | resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" 761 | integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== 762 | 763 | astral-regex@^2.0.0: 764 | version "2.0.0" 765 | resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" 766 | integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== 767 | 768 | async@^3.1.0: 769 | version "3.2.0" 770 | resolved "https://registry.yarnpkg.com/async/-/async-3.2.0.tgz#b3a2685c5ebb641d3de02d161002c60fc9f85720" 771 | integrity sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw== 772 | 773 | asynckit@^0.4.0: 774 | version "0.4.0" 775 | resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" 776 | integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= 777 | 778 | axios@^0.21.1: 779 | version "0.21.1" 780 | resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.1.tgz#22563481962f4d6bde9a76d516ef0e5d3c09b2b8" 781 | integrity sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA== 782 | dependencies: 783 | follow-redirects "^1.10.0" 784 | 785 | bail@^1.0.0: 786 | version "1.0.5" 787 | resolved "https://registry.yarnpkg.com/bail/-/bail-1.0.5.tgz#b6fa133404a392cbc1f8c4bf63f5953351e7a776" 788 | integrity sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ== 789 | 790 | balanced-match@^1.0.0: 791 | version "1.0.2" 792 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" 793 | integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== 794 | 795 | base-x@^3.0.8: 796 | version "3.0.8" 797 | resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.8.tgz#1e1106c2537f0162e8b52474a557ebb09000018d" 798 | integrity sha512-Rl/1AWP4J/zRrk54hhlxH4drNxPJXYUaKffODVI53/dAsV4t9fBxyxYKAVPU1XBHxYwOWP9h9H0hM2MVw4YfJA== 799 | dependencies: 800 | safe-buffer "^5.0.1" 801 | 802 | base64-js@^1.3.1, base64-js@^1.5.1: 803 | version "1.5.1" 804 | resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" 805 | integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== 806 | 807 | blakejs@^1.1.0: 808 | version "1.1.0" 809 | resolved "https://registry.yarnpkg.com/blakejs/-/blakejs-1.1.0.tgz#69df92ef953aa88ca51a32df6ab1c54a155fc7a5" 810 | integrity sha1-ad+S75U6qIylGjLfarHFShVfx6U= 811 | 812 | bn.js@^4.11.9: 813 | version "4.12.0" 814 | resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" 815 | integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== 816 | 817 | bn.js@^5.1.1, bn.js@^5.1.2: 818 | version "5.2.0" 819 | resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002" 820 | integrity sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw== 821 | 822 | body-parser@1.19.0: 823 | version "1.19.0" 824 | resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" 825 | integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== 826 | dependencies: 827 | bytes "3.1.0" 828 | content-type "~1.0.4" 829 | debug "2.6.9" 830 | depd "~1.1.2" 831 | http-errors "1.7.2" 832 | iconv-lite "0.4.24" 833 | on-finished "~2.3.0" 834 | qs "6.7.0" 835 | raw-body "2.4.0" 836 | type-is "~1.6.17" 837 | 838 | brace-expansion@^1.1.7: 839 | version "1.1.11" 840 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 841 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 842 | dependencies: 843 | balanced-match "^1.0.0" 844 | concat-map "0.0.1" 845 | 846 | braces@^3.0.1: 847 | version "3.0.2" 848 | resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" 849 | integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== 850 | dependencies: 851 | fill-range "^7.0.1" 852 | 853 | brorand@^1.1.0: 854 | version "1.1.0" 855 | resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" 856 | integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= 857 | 858 | buffer@^5.5.0, buffer@^5.6.0: 859 | version "5.7.1" 860 | resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" 861 | integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== 862 | dependencies: 863 | base64-js "^1.3.1" 864 | ieee754 "^1.1.13" 865 | 866 | bufferutil@^4.0.1: 867 | version "4.0.3" 868 | resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.3.tgz#66724b756bed23cd7c28c4d306d7994f9943cc6b" 869 | integrity sha512-yEYTwGndELGvfXsImMBLop58eaGW+YdONi1fNjTINSY98tmMmFijBG6WXgdkfuLNt4imzQNtIE+eBp1PVpMCSw== 870 | dependencies: 871 | node-gyp-build "^4.2.0" 872 | 873 | bytes@3.1.0: 874 | version "3.1.0" 875 | resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" 876 | integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== 877 | 878 | call-bind@^1.0.0: 879 | version "1.0.2" 880 | resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" 881 | integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== 882 | dependencies: 883 | function-bind "^1.1.1" 884 | get-intrinsic "^1.0.2" 885 | 886 | callsites@^3.0.0: 887 | version "3.1.0" 888 | resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" 889 | integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== 890 | 891 | camelcase@^5.3.1: 892 | version "5.3.1" 893 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" 894 | integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== 895 | 896 | chalk@4.1.0: 897 | version "4.1.0" 898 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" 899 | integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== 900 | dependencies: 901 | ansi-styles "^4.1.0" 902 | supports-color "^7.1.0" 903 | 904 | chalk@^2.0.0, chalk@^2.4.2: 905 | version "2.4.2" 906 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" 907 | integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== 908 | dependencies: 909 | ansi-styles "^3.2.1" 910 | escape-string-regexp "^1.0.5" 911 | supports-color "^5.3.0" 912 | 913 | chalk@^3.0.0: 914 | version "3.0.0" 915 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" 916 | integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== 917 | dependencies: 918 | ansi-styles "^4.1.0" 919 | supports-color "^7.1.0" 920 | 921 | chalk@^4.0.0: 922 | version "4.1.1" 923 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.1.tgz#c80b3fab28bf6371e6863325eee67e618b77e6ad" 924 | integrity sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg== 925 | dependencies: 926 | ansi-styles "^4.1.0" 927 | supports-color "^7.1.0" 928 | 929 | character-entities-legacy@^1.0.0: 930 | version "1.1.4" 931 | resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz#94bc1845dce70a5bb9d2ecc748725661293d8fc1" 932 | integrity sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA== 933 | 934 | character-entities@^1.0.0: 935 | version "1.2.4" 936 | resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-1.2.4.tgz#e12c3939b7eaf4e5b15e7ad4c5e28e1d48c5b16b" 937 | integrity sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw== 938 | 939 | character-reference-invalid@^1.0.0: 940 | version "1.1.4" 941 | resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz#083329cda0eae272ab3dbbf37e9a382c13af1560" 942 | integrity sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg== 943 | 944 | cids@^0.7.1: 945 | version "0.7.5" 946 | resolved "https://registry.yarnpkg.com/cids/-/cids-0.7.5.tgz#60a08138a99bfb69b6be4ceb63bfef7a396b28b2" 947 | integrity sha512-zT7mPeghoWAu+ppn8+BS1tQ5qGmbMfB4AregnQjA/qHY3GC1m1ptI9GkWNlgeu38r7CuRdXB47uY2XgAYt6QVA== 948 | dependencies: 949 | buffer "^5.5.0" 950 | class-is "^1.1.0" 951 | multibase "~0.6.0" 952 | multicodec "^1.0.0" 953 | multihashes "~0.4.15" 954 | 955 | cipher-base@^1.0.1: 956 | version "1.0.4" 957 | resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" 958 | integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== 959 | dependencies: 960 | inherits "^2.0.1" 961 | safe-buffer "^5.0.1" 962 | 963 | class-is@^1.1.0: 964 | version "1.1.0" 965 | resolved "https://registry.yarnpkg.com/class-is/-/class-is-1.1.0.tgz#9d3c0fba0440d211d843cec3dedfa48055005825" 966 | integrity sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw== 967 | 968 | color-convert@^1.9.0, color-convert@^1.9.1: 969 | version "1.9.3" 970 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" 971 | integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== 972 | dependencies: 973 | color-name "1.1.3" 974 | 975 | color-convert@^2.0.1: 976 | version "2.0.1" 977 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 978 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 979 | dependencies: 980 | color-name "~1.1.4" 981 | 982 | color-name@1.1.3: 983 | version "1.1.3" 984 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 985 | integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= 986 | 987 | color-name@^1.0.0, color-name@~1.1.4: 988 | version "1.1.4" 989 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 990 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 991 | 992 | color-string@^1.5.2: 993 | version "1.5.5" 994 | resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.5.5.tgz#65474a8f0e7439625f3d27a6a19d89fc45223014" 995 | integrity sha512-jgIoum0OfQfq9Whcfc2z/VhCNcmQjWbey6qBX0vqt7YICflUmBCh9E9CiQD5GSJ+Uehixm3NUwHVhqUAWRivZg== 996 | dependencies: 997 | color-name "^1.0.0" 998 | simple-swizzle "^0.2.2" 999 | 1000 | color@3.0.x: 1001 | version "3.0.0" 1002 | resolved "https://registry.yarnpkg.com/color/-/color-3.0.0.tgz#d920b4328d534a3ac8295d68f7bd4ba6c427be9a" 1003 | integrity sha512-jCpd5+s0s0t7p3pHQKpnJ0TpQKKdleP71LWcA0aqiljpiuAkOSUFN/dyH8ZwF0hRmFlrIuRhufds1QyEP9EB+w== 1004 | dependencies: 1005 | color-convert "^1.9.1" 1006 | color-string "^1.5.2" 1007 | 1008 | colors@^1.2.1: 1009 | version "1.4.0" 1010 | resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" 1011 | integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== 1012 | 1013 | colorspace@1.1.x: 1014 | version "1.1.2" 1015 | resolved "https://registry.yarnpkg.com/colorspace/-/colorspace-1.1.2.tgz#e0128950d082b86a2168580796a0aa5d6c68d8c5" 1016 | integrity sha512-vt+OoIP2d76xLhjwbBaucYlNSpPsrJWPlBTtwCpQKIu6/CSMutyzX93O/Do0qzpH3YoHEes8YEFXyZ797rEhzQ== 1017 | dependencies: 1018 | color "3.0.x" 1019 | text-hex "1.0.x" 1020 | 1021 | combined-stream@^1.0.8: 1022 | version "1.0.8" 1023 | resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" 1024 | integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== 1025 | dependencies: 1026 | delayed-stream "~1.0.0" 1027 | 1028 | concat-map@0.0.1: 1029 | version "0.0.1" 1030 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 1031 | integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= 1032 | 1033 | confmgr@^1.0.6: 1034 | version "1.0.6" 1035 | resolved "https://registry.yarnpkg.com/confmgr/-/confmgr-1.0.6.tgz#d94e58dca6e9b6054a89c28eab50a93acb2b9741" 1036 | integrity sha512-acY0rWPHJCEruIxYQUUK17iwB1SAundkBAi47N16RIxdgLuEfbJO6flJUui0l1HeX2HvVupaz7iT1yVnzSFU1A== 1037 | dependencies: 1038 | "@babel/runtime" "7.10.4" 1039 | "@types/yaml" "1.9.7" 1040 | chalk "4.1.0" 1041 | dotenv "8.2.0" 1042 | typescript "3.9.6" 1043 | yaml "1.10.0" 1044 | 1045 | content-disposition@0.5.3: 1046 | version "0.5.3" 1047 | resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" 1048 | integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== 1049 | dependencies: 1050 | safe-buffer "5.1.2" 1051 | 1052 | content-type@~1.0.4: 1053 | version "1.0.4" 1054 | resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" 1055 | integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== 1056 | 1057 | cookie-signature@1.0.6: 1058 | version "1.0.6" 1059 | resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" 1060 | integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= 1061 | 1062 | cookie@0.4.0: 1063 | version "0.4.0" 1064 | resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" 1065 | integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== 1066 | 1067 | core-util-is@~1.0.0: 1068 | version "1.0.2" 1069 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 1070 | integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= 1071 | 1072 | create-hash@^1.2.0: 1073 | version "1.2.0" 1074 | resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" 1075 | integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== 1076 | dependencies: 1077 | cipher-base "^1.0.1" 1078 | inherits "^2.0.1" 1079 | md5.js "^1.3.4" 1080 | ripemd160 "^2.0.1" 1081 | sha.js "^2.4.0" 1082 | 1083 | cross-spawn@^7.0.2: 1084 | version "7.0.3" 1085 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" 1086 | integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== 1087 | dependencies: 1088 | path-key "^3.1.0" 1089 | shebang-command "^2.0.0" 1090 | which "^2.0.1" 1091 | 1092 | cuint@^0.2.2: 1093 | version "0.2.2" 1094 | resolved "https://registry.yarnpkg.com/cuint/-/cuint-0.2.2.tgz#408086d409550c2631155619e9fa7bcadc3b991b" 1095 | integrity sha1-QICG1AlVDCYxFVYZ6fp7ytw7mRs= 1096 | 1097 | d@1, d@^1.0.1: 1098 | version "1.0.1" 1099 | resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a" 1100 | integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA== 1101 | dependencies: 1102 | es5-ext "^0.10.50" 1103 | type "^1.0.1" 1104 | 1105 | debug@2.6.9, debug@^2.2.0: 1106 | version "2.6.9" 1107 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 1108 | integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== 1109 | dependencies: 1110 | ms "2.0.0" 1111 | 1112 | debug@^4.0.0, debug@^4.0.1, debug@^4.1.1: 1113 | version "4.3.1" 1114 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" 1115 | integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== 1116 | dependencies: 1117 | ms "2.1.2" 1118 | 1119 | deep-is@^0.1.3: 1120 | version "0.1.3" 1121 | resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" 1122 | integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= 1123 | 1124 | delayed-stream@~1.0.0: 1125 | version "1.0.0" 1126 | resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" 1127 | integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= 1128 | 1129 | depd@~1.1.2: 1130 | version "1.1.2" 1131 | resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" 1132 | integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= 1133 | 1134 | destroy@~1.0.4: 1135 | version "1.0.4" 1136 | resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" 1137 | integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= 1138 | 1139 | dir-glob@^3.0.1: 1140 | version "3.0.1" 1141 | resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" 1142 | integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== 1143 | dependencies: 1144 | path-type "^4.0.0" 1145 | 1146 | doctrine@^3.0.0: 1147 | version "3.0.0" 1148 | resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" 1149 | integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== 1150 | dependencies: 1151 | esutils "^2.0.2" 1152 | 1153 | dotenv@8.2.0, dotenv@^8.0.0: 1154 | version "8.2.0" 1155 | resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.2.0.tgz#97e619259ada750eea3e4ea3e26bceea5424b16a" 1156 | integrity sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw== 1157 | 1158 | ee-first@1.1.1: 1159 | version "1.1.1" 1160 | resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" 1161 | integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= 1162 | 1163 | elliptic@^6.5.4: 1164 | version "6.5.4" 1165 | resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" 1166 | integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== 1167 | dependencies: 1168 | bn.js "^4.11.9" 1169 | brorand "^1.1.0" 1170 | hash.js "^1.0.0" 1171 | hmac-drbg "^1.0.1" 1172 | inherits "^2.0.4" 1173 | minimalistic-assert "^1.0.1" 1174 | minimalistic-crypto-utils "^1.0.1" 1175 | 1176 | emoji-regex@^8.0.0: 1177 | version "8.0.0" 1178 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" 1179 | integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== 1180 | 1181 | enabled@2.0.x: 1182 | version "2.0.0" 1183 | resolved "https://registry.yarnpkg.com/enabled/-/enabled-2.0.0.tgz#f9dd92ec2d6f4bbc0d5d1e64e21d61cd4665e7c2" 1184 | integrity sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ== 1185 | 1186 | encodeurl@~1.0.2: 1187 | version "1.0.2" 1188 | resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" 1189 | integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= 1190 | 1191 | enquirer@^2.3.5: 1192 | version "2.3.6" 1193 | resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" 1194 | integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== 1195 | dependencies: 1196 | ansi-colors "^4.1.1" 1197 | 1198 | es5-ext@^0.10.35, es5-ext@^0.10.46, es5-ext@^0.10.50, es5-ext@^0.10.53, es5-ext@~0.10.14, es5-ext@~0.10.2, es5-ext@~0.10.46: 1199 | version "0.10.53" 1200 | resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.53.tgz#93c5a3acfdbef275220ad72644ad02ee18368de1" 1201 | integrity sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q== 1202 | dependencies: 1203 | es6-iterator "~2.0.3" 1204 | es6-symbol "~3.1.3" 1205 | next-tick "~1.0.0" 1206 | 1207 | es6-iterator@^2.0.3, es6-iterator@~2.0.3: 1208 | version "2.0.3" 1209 | resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" 1210 | integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c= 1211 | dependencies: 1212 | d "1" 1213 | es5-ext "^0.10.35" 1214 | es6-symbol "^3.1.1" 1215 | 1216 | es6-symbol@^3.1.1, es6-symbol@~3.1.3: 1217 | version "3.1.3" 1218 | resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18" 1219 | integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA== 1220 | dependencies: 1221 | d "^1.0.1" 1222 | ext "^1.1.2" 1223 | 1224 | es6-weak-map@^2.0.3: 1225 | version "2.0.3" 1226 | resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.3.tgz#b6da1f16cc2cc0d9be43e6bdbfc5e7dfcdf31d53" 1227 | integrity sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA== 1228 | dependencies: 1229 | d "1" 1230 | es5-ext "^0.10.46" 1231 | es6-iterator "^2.0.3" 1232 | es6-symbol "^3.1.1" 1233 | 1234 | escape-html@~1.0.3: 1235 | version "1.0.3" 1236 | resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" 1237 | integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= 1238 | 1239 | escape-string-regexp@^1.0.5: 1240 | version "1.0.5" 1241 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 1242 | integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= 1243 | 1244 | escape-string-regexp@^2.0.0: 1245 | version "2.0.0" 1246 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" 1247 | integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== 1248 | 1249 | escape-string-regexp@^4.0.0: 1250 | version "4.0.0" 1251 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" 1252 | integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== 1253 | 1254 | eslint-config-prettier@^8.2.0: 1255 | version "8.2.0" 1256 | resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.2.0.tgz#78de77d63bca8e9e59dae75a614b5299925bb7b3" 1257 | integrity sha512-dWV9EVeSo2qodOPi1iBYU/x6F6diHv8uujxbxr77xExs3zTAlNXvVZKiyLsQGNz7yPV2K49JY5WjPzNIuDc2Bw== 1258 | 1259 | eslint-plugin-prettier@^3.4.0: 1260 | version "3.4.0" 1261 | resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.0.tgz#cdbad3bf1dbd2b177e9825737fe63b476a08f0c7" 1262 | integrity sha512-UDK6rJT6INSfcOo545jiaOwB701uAIt2/dR7WnFQoGCVl1/EMqdANBmwUaqqQ45aXprsTGzSa39LI1PyuRBxxw== 1263 | dependencies: 1264 | prettier-linter-helpers "^1.0.0" 1265 | 1266 | eslint-plugin-simple-import-sort@^7.0.0: 1267 | version "7.0.0" 1268 | resolved "https://registry.yarnpkg.com/eslint-plugin-simple-import-sort/-/eslint-plugin-simple-import-sort-7.0.0.tgz#a1dad262f46d2184a90095a60c66fef74727f0f8" 1269 | integrity sha512-U3vEDB5zhYPNfxT5TYR7u01dboFZp+HNpnGhkDB2g/2E4wZ/g1Q9Ton8UwCLfRV9yAKyYqDh62oHOamvkFxsvw== 1270 | 1271 | eslint-scope@^5.0.0, eslint-scope@^5.1.1: 1272 | version "5.1.1" 1273 | resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" 1274 | integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== 1275 | dependencies: 1276 | esrecurse "^4.3.0" 1277 | estraverse "^4.1.1" 1278 | 1279 | eslint-utils@^2.0.0, eslint-utils@^2.1.0: 1280 | version "2.1.0" 1281 | resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" 1282 | integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== 1283 | dependencies: 1284 | eslint-visitor-keys "^1.1.0" 1285 | 1286 | eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: 1287 | version "1.3.0" 1288 | resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" 1289 | integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== 1290 | 1291 | eslint-visitor-keys@^2.0.0: 1292 | version "2.0.0" 1293 | resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz#21fdc8fbcd9c795cc0321f0563702095751511a8" 1294 | integrity sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ== 1295 | 1296 | eslint@^7.24.0: 1297 | version "7.24.0" 1298 | resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.24.0.tgz#2e44fa62d93892bfdb100521f17345ba54b8513a" 1299 | integrity sha512-k9gaHeHiFmGCDQ2rEfvULlSLruz6tgfA8DEn+rY9/oYPFFTlz55mM/Q/Rij1b2Y42jwZiK3lXvNTw6w6TXzcKQ== 1300 | dependencies: 1301 | "@babel/code-frame" "7.12.11" 1302 | "@eslint/eslintrc" "^0.4.0" 1303 | ajv "^6.10.0" 1304 | chalk "^4.0.0" 1305 | cross-spawn "^7.0.2" 1306 | debug "^4.0.1" 1307 | doctrine "^3.0.0" 1308 | enquirer "^2.3.5" 1309 | eslint-scope "^5.1.1" 1310 | eslint-utils "^2.1.0" 1311 | eslint-visitor-keys "^2.0.0" 1312 | espree "^7.3.1" 1313 | esquery "^1.4.0" 1314 | esutils "^2.0.2" 1315 | file-entry-cache "^6.0.1" 1316 | functional-red-black-tree "^1.0.1" 1317 | glob-parent "^5.0.0" 1318 | globals "^13.6.0" 1319 | ignore "^4.0.6" 1320 | import-fresh "^3.0.0" 1321 | imurmurhash "^0.1.4" 1322 | is-glob "^4.0.0" 1323 | js-yaml "^3.13.1" 1324 | json-stable-stringify-without-jsonify "^1.0.1" 1325 | levn "^0.4.1" 1326 | lodash "^4.17.21" 1327 | minimatch "^3.0.4" 1328 | natural-compare "^1.4.0" 1329 | optionator "^0.9.1" 1330 | progress "^2.0.0" 1331 | regexpp "^3.1.0" 1332 | semver "^7.2.1" 1333 | strip-ansi "^6.0.0" 1334 | strip-json-comments "^3.1.0" 1335 | table "^6.0.4" 1336 | text-table "^0.2.0" 1337 | v8-compile-cache "^2.0.3" 1338 | 1339 | espree@^7.3.0, espree@^7.3.1: 1340 | version "7.3.1" 1341 | resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6" 1342 | integrity sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g== 1343 | dependencies: 1344 | acorn "^7.4.0" 1345 | acorn-jsx "^5.3.1" 1346 | eslint-visitor-keys "^1.3.0" 1347 | 1348 | esprima@^4.0.0: 1349 | version "4.0.1" 1350 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" 1351 | integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== 1352 | 1353 | esquery@^1.4.0: 1354 | version "1.4.0" 1355 | resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" 1356 | integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== 1357 | dependencies: 1358 | estraverse "^5.1.0" 1359 | 1360 | esrecurse@^4.3.0: 1361 | version "4.3.0" 1362 | resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" 1363 | integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== 1364 | dependencies: 1365 | estraverse "^5.2.0" 1366 | 1367 | estraverse@^4.1.1: 1368 | version "4.3.0" 1369 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" 1370 | integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== 1371 | 1372 | estraverse@^5.1.0, estraverse@^5.2.0: 1373 | version "5.2.0" 1374 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" 1375 | integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== 1376 | 1377 | esutils@^2.0.2: 1378 | version "2.0.3" 1379 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" 1380 | integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== 1381 | 1382 | etag@~1.8.1: 1383 | version "1.8.1" 1384 | resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" 1385 | integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= 1386 | 1387 | event-emitter@^0.3.5: 1388 | version "0.3.5" 1389 | resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39" 1390 | integrity sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk= 1391 | dependencies: 1392 | d "1" 1393 | es5-ext "~0.10.14" 1394 | 1395 | eventemitter3@^4.0.7: 1396 | version "4.0.7" 1397 | resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" 1398 | integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== 1399 | 1400 | express-winston@^4.1.0: 1401 | version "4.1.0" 1402 | resolved "https://registry.yarnpkg.com/express-winston/-/express-winston-4.1.0.tgz#3fd3ecea55d50ff6aee49a66e1aaa3cba8b67c93" 1403 | integrity sha512-0DaIjvNADBzC/K4Qw3UwEQc8HRjbajTaP/M43rw0LJpZcQ7SQTPfxkLsnx3ABHEO7EFNQXTpqL0BZPiwkGV8hg== 1404 | dependencies: 1405 | chalk "^2.4.2" 1406 | lodash "^4.17.20" 1407 | 1408 | express@^4.17.1: 1409 | version "4.17.1" 1410 | resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" 1411 | integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== 1412 | dependencies: 1413 | accepts "~1.3.7" 1414 | array-flatten "1.1.1" 1415 | body-parser "1.19.0" 1416 | content-disposition "0.5.3" 1417 | content-type "~1.0.4" 1418 | cookie "0.4.0" 1419 | cookie-signature "1.0.6" 1420 | debug "2.6.9" 1421 | depd "~1.1.2" 1422 | encodeurl "~1.0.2" 1423 | escape-html "~1.0.3" 1424 | etag "~1.8.1" 1425 | finalhandler "~1.1.2" 1426 | fresh "0.5.2" 1427 | merge-descriptors "1.0.1" 1428 | methods "~1.1.2" 1429 | on-finished "~2.3.0" 1430 | parseurl "~1.3.3" 1431 | path-to-regexp "0.1.7" 1432 | proxy-addr "~2.0.5" 1433 | qs "6.7.0" 1434 | range-parser "~1.2.1" 1435 | safe-buffer "5.1.2" 1436 | send "0.17.1" 1437 | serve-static "1.14.1" 1438 | setprototypeof "1.1.1" 1439 | statuses "~1.5.0" 1440 | type-is "~1.6.18" 1441 | utils-merge "1.0.1" 1442 | vary "~1.1.2" 1443 | 1444 | ext@^1.1.2: 1445 | version "1.4.0" 1446 | resolved "https://registry.yarnpkg.com/ext/-/ext-1.4.0.tgz#89ae7a07158f79d35517882904324077e4379244" 1447 | integrity sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A== 1448 | dependencies: 1449 | type "^2.0.0" 1450 | 1451 | extend@^3.0.0: 1452 | version "3.0.2" 1453 | resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" 1454 | integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== 1455 | 1456 | fast-deep-equal@^3.1.1: 1457 | version "3.1.3" 1458 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" 1459 | integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== 1460 | 1461 | fast-diff@^1.1.2: 1462 | version "1.2.0" 1463 | resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" 1464 | integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== 1465 | 1466 | fast-glob@^3.1.1: 1467 | version "3.2.5" 1468 | resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.5.tgz#7939af2a656de79a4f1901903ee8adcaa7cb9661" 1469 | integrity sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg== 1470 | dependencies: 1471 | "@nodelib/fs.stat" "^2.0.2" 1472 | "@nodelib/fs.walk" "^1.2.3" 1473 | glob-parent "^5.1.0" 1474 | merge2 "^1.3.0" 1475 | micromatch "^4.0.2" 1476 | picomatch "^2.2.1" 1477 | 1478 | fast-json-stable-stringify@^2.0.0: 1479 | version "2.1.0" 1480 | resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" 1481 | integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== 1482 | 1483 | fast-levenshtein@^2.0.6: 1484 | version "2.0.6" 1485 | resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" 1486 | integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= 1487 | 1488 | fast-safe-stringify@^2.0.4: 1489 | version "2.0.7" 1490 | resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz#124aa885899261f68aedb42a7c080de9da608743" 1491 | integrity sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA== 1492 | 1493 | fastq@^1.6.0: 1494 | version "1.11.0" 1495 | resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.11.0.tgz#bb9fb955a07130a918eb63c1f5161cc32a5d0858" 1496 | integrity sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g== 1497 | dependencies: 1498 | reusify "^1.0.4" 1499 | 1500 | fecha@^4.2.0: 1501 | version "4.2.1" 1502 | resolved "https://registry.yarnpkg.com/fecha/-/fecha-4.2.1.tgz#0a83ad8f86ef62a091e22bb5a039cd03d23eecce" 1503 | integrity sha512-MMMQ0ludy/nBs1/o0zVOiKTpG7qMbonKUzjJgQFEuvq6INZ1OraKPRAWkBq5vlKLOUMpmNYG1JoN3oDPUQ9m3Q== 1504 | 1505 | file-entry-cache@^6.0.1: 1506 | version "6.0.1" 1507 | resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" 1508 | integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== 1509 | dependencies: 1510 | flat-cache "^3.0.4" 1511 | 1512 | fill-range@^7.0.1: 1513 | version "7.0.1" 1514 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" 1515 | integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== 1516 | dependencies: 1517 | to-regex-range "^5.0.1" 1518 | 1519 | finalhandler@~1.1.2: 1520 | version "1.1.2" 1521 | resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" 1522 | integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== 1523 | dependencies: 1524 | debug "2.6.9" 1525 | encodeurl "~1.0.2" 1526 | escape-html "~1.0.3" 1527 | on-finished "~2.3.0" 1528 | parseurl "~1.3.3" 1529 | statuses "~1.5.0" 1530 | unpipe "~1.0.0" 1531 | 1532 | flat-cache@^3.0.4: 1533 | version "3.0.4" 1534 | resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" 1535 | integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== 1536 | dependencies: 1537 | flatted "^3.1.0" 1538 | rimraf "^3.0.2" 1539 | 1540 | flatted@^3.1.0: 1541 | version "3.1.1" 1542 | resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.1.1.tgz#c4b489e80096d9df1dfc97c79871aea7c617c469" 1543 | integrity sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA== 1544 | 1545 | fn.name@1.x.x: 1546 | version "1.1.0" 1547 | resolved "https://registry.yarnpkg.com/fn.name/-/fn.name-1.1.0.tgz#26cad8017967aea8731bc42961d04a3d5988accc" 1548 | integrity sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw== 1549 | 1550 | follow-redirects@^1.10.0: 1551 | version "1.13.3" 1552 | resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.13.3.tgz#e5598ad50174c1bc4e872301e82ac2cd97f90267" 1553 | integrity sha512-DUgl6+HDzB0iEptNQEXLx/KhTmDb8tZUHSeLqpnjpknR70H0nC2t9N73BK6fN4hOvJ84pKlIQVQ4k5FFlBedKA== 1554 | 1555 | form-data@^3.0.0: 1556 | version "3.0.1" 1557 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" 1558 | integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg== 1559 | dependencies: 1560 | asynckit "^0.4.0" 1561 | combined-stream "^1.0.8" 1562 | mime-types "^2.1.12" 1563 | 1564 | forwarded@~0.1.2: 1565 | version "0.1.2" 1566 | resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" 1567 | integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= 1568 | 1569 | fresh@0.5.2: 1570 | version "0.5.2" 1571 | resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" 1572 | integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= 1573 | 1574 | fs.realpath@^1.0.0: 1575 | version "1.0.0" 1576 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 1577 | integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= 1578 | 1579 | function-bind@^1.1.1: 1580 | version "1.1.1" 1581 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" 1582 | integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== 1583 | 1584 | functional-red-black-tree@^1.0.1: 1585 | version "1.0.1" 1586 | resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" 1587 | integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= 1588 | 1589 | get-intrinsic@^1.0.2: 1590 | version "1.1.1" 1591 | resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" 1592 | integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== 1593 | dependencies: 1594 | function-bind "^1.1.1" 1595 | has "^1.0.3" 1596 | has-symbols "^1.0.1" 1597 | 1598 | glob-parent@^5.0.0, glob-parent@^5.1.0: 1599 | version "5.1.2" 1600 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" 1601 | integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== 1602 | dependencies: 1603 | is-glob "^4.0.1" 1604 | 1605 | glob@^7.1.3: 1606 | version "7.1.6" 1607 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" 1608 | integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== 1609 | dependencies: 1610 | fs.realpath "^1.0.0" 1611 | inflight "^1.0.4" 1612 | inherits "2" 1613 | minimatch "^3.0.4" 1614 | once "^1.3.0" 1615 | path-is-absolute "^1.0.0" 1616 | 1617 | globals@^12.1.0: 1618 | version "12.4.0" 1619 | resolved "https://registry.yarnpkg.com/globals/-/globals-12.4.0.tgz#a18813576a41b00a24a97e7f815918c2e19925f8" 1620 | integrity sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg== 1621 | dependencies: 1622 | type-fest "^0.8.1" 1623 | 1624 | globals@^13.6.0: 1625 | version "13.8.0" 1626 | resolved "https://registry.yarnpkg.com/globals/-/globals-13.8.0.tgz#3e20f504810ce87a8d72e55aecf8435b50f4c1b3" 1627 | integrity sha512-rHtdA6+PDBIjeEvA91rpqzEvk/k3/i7EeNQiryiWuJH0Hw9cpyJMAt2jtbAwUaRdhD+573X4vWw6IcjKPasi9Q== 1628 | dependencies: 1629 | type-fest "^0.20.2" 1630 | 1631 | globby@^11.0.1: 1632 | version "11.0.3" 1633 | resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.3.tgz#9b1f0cb523e171dd1ad8c7b2a9fb4b644b9593cb" 1634 | integrity sha512-ffdmosjA807y7+lA1NM0jELARVmYul/715xiILEjo3hBLPTcirgQNnXECn5g3mtR8TOLCVbkfua1Hpen25/Xcg== 1635 | dependencies: 1636 | array-union "^2.1.0" 1637 | dir-glob "^3.0.1" 1638 | fast-glob "^3.1.1" 1639 | ignore "^5.1.4" 1640 | merge2 "^1.3.0" 1641 | slash "^3.0.0" 1642 | 1643 | has-flag@^3.0.0: 1644 | version "3.0.0" 1645 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 1646 | integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= 1647 | 1648 | has-flag@^4.0.0: 1649 | version "4.0.0" 1650 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" 1651 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 1652 | 1653 | has-symbols@^1.0.1: 1654 | version "1.0.2" 1655 | resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" 1656 | integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== 1657 | 1658 | has@^1.0.3: 1659 | version "1.0.3" 1660 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" 1661 | integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== 1662 | dependencies: 1663 | function-bind "^1.1.1" 1664 | 1665 | hash-base@^3.0.0: 1666 | version "3.1.0" 1667 | resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" 1668 | integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== 1669 | dependencies: 1670 | inherits "^2.0.4" 1671 | readable-stream "^3.6.0" 1672 | safe-buffer "^5.2.0" 1673 | 1674 | hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7: 1675 | version "1.1.7" 1676 | resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" 1677 | integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== 1678 | dependencies: 1679 | inherits "^2.0.3" 1680 | minimalistic-assert "^1.0.1" 1681 | 1682 | hmac-drbg@^1.0.1: 1683 | version "1.0.1" 1684 | resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" 1685 | integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= 1686 | dependencies: 1687 | hash.js "^1.0.3" 1688 | minimalistic-assert "^1.0.0" 1689 | minimalistic-crypto-utils "^1.0.1" 1690 | 1691 | http-errors@1.7.2: 1692 | version "1.7.2" 1693 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" 1694 | integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== 1695 | dependencies: 1696 | depd "~1.1.2" 1697 | inherits "2.0.3" 1698 | setprototypeof "1.1.1" 1699 | statuses ">= 1.5.0 < 2" 1700 | toidentifier "1.0.0" 1701 | 1702 | http-errors@^1.8.0: 1703 | version "1.8.0" 1704 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.8.0.tgz#75d1bbe497e1044f51e4ee9e704a62f28d336507" 1705 | integrity sha512-4I8r0C5JDhT5VkvI47QktDW75rNlGVsUf/8hzjCC/wkWI/jdTRmBb9aI7erSG82r1bjKY3F6k28WnsVxB1C73A== 1706 | dependencies: 1707 | depd "~1.1.2" 1708 | inherits "2.0.4" 1709 | setprototypeof "1.2.0" 1710 | statuses ">= 1.5.0 < 2" 1711 | toidentifier "1.0.0" 1712 | 1713 | http-errors@~1.7.2: 1714 | version "1.7.3" 1715 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" 1716 | integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== 1717 | dependencies: 1718 | depd "~1.1.2" 1719 | inherits "2.0.4" 1720 | setprototypeof "1.1.1" 1721 | statuses ">= 1.5.0 < 2" 1722 | toidentifier "1.0.0" 1723 | 1724 | iconv-lite@0.4.24: 1725 | version "0.4.24" 1726 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" 1727 | integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== 1728 | dependencies: 1729 | safer-buffer ">= 2.1.2 < 3" 1730 | 1731 | ieee754@^1.1.13: 1732 | version "1.2.1" 1733 | resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" 1734 | integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== 1735 | 1736 | ignore@^4.0.6: 1737 | version "4.0.6" 1738 | resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" 1739 | integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== 1740 | 1741 | ignore@^5.1.4: 1742 | version "5.1.8" 1743 | resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" 1744 | integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== 1745 | 1746 | import-fresh@^3.0.0, import-fresh@^3.2.1: 1747 | version "3.3.0" 1748 | resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" 1749 | integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== 1750 | dependencies: 1751 | parent-module "^1.0.0" 1752 | resolve-from "^4.0.0" 1753 | 1754 | imurmurhash@^0.1.4: 1755 | version "0.1.4" 1756 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 1757 | integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= 1758 | 1759 | inflight@^1.0.4: 1760 | version "1.0.6" 1761 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 1762 | integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= 1763 | dependencies: 1764 | once "^1.3.0" 1765 | wrappy "1" 1766 | 1767 | inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: 1768 | version "2.0.4" 1769 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 1770 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 1771 | 1772 | inherits@2.0.3: 1773 | version "2.0.3" 1774 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 1775 | integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= 1776 | 1777 | ip-regex@^4.3.0: 1778 | version "4.3.0" 1779 | resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-4.3.0.tgz#687275ab0f57fa76978ff8f4dddc8a23d5990db5" 1780 | integrity sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q== 1781 | 1782 | ipaddr.js@1.9.1: 1783 | version "1.9.1" 1784 | resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" 1785 | integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== 1786 | 1787 | is-alphabetical@^1.0.0: 1788 | version "1.0.4" 1789 | resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.4.tgz#9e7d6b94916be22153745d184c298cbf986a686d" 1790 | integrity sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg== 1791 | 1792 | is-alphanumerical@^1.0.0: 1793 | version "1.0.4" 1794 | resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz#7eb9a2431f855f6b1ef1a78e326df515696c4dbf" 1795 | integrity sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A== 1796 | dependencies: 1797 | is-alphabetical "^1.0.0" 1798 | is-decimal "^1.0.0" 1799 | 1800 | is-arrayish@^0.3.1: 1801 | version "0.3.2" 1802 | resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" 1803 | integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== 1804 | 1805 | is-boolean-object@^1.1.0: 1806 | version "1.1.0" 1807 | resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.0.tgz#e2aaad3a3a8fca34c28f6eee135b156ed2587ff0" 1808 | integrity sha512-a7Uprx8UtD+HWdyYwnD1+ExtTgqQtD2k/1yJgtXP6wnMm8byhkoTZRl+95LLThpzNZJ5aEvi46cdH+ayMFRwmA== 1809 | dependencies: 1810 | call-bind "^1.0.0" 1811 | 1812 | is-buffer@^2.0.0: 1813 | version "2.0.5" 1814 | resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" 1815 | integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== 1816 | 1817 | is-decimal@^1.0.0: 1818 | version "1.0.4" 1819 | resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-1.0.4.tgz#65a3a5958a1c5b63a706e1b333d7cd9f630d3fa5" 1820 | integrity sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw== 1821 | 1822 | is-extglob@^2.1.1: 1823 | version "2.1.1" 1824 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 1825 | integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= 1826 | 1827 | is-fullwidth-code-point@^3.0.0: 1828 | version "3.0.0" 1829 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" 1830 | integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== 1831 | 1832 | is-glob@^4.0.0, is-glob@^4.0.1: 1833 | version "4.0.1" 1834 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" 1835 | integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== 1836 | dependencies: 1837 | is-extglob "^2.1.1" 1838 | 1839 | is-hexadecimal@^1.0.0: 1840 | version "1.0.4" 1841 | resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz#cc35c97588da4bd49a8eedd6bc4082d44dcb23a7" 1842 | integrity sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw== 1843 | 1844 | is-number-object@^1.0.4: 1845 | version "1.0.4" 1846 | resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.4.tgz#36ac95e741cf18b283fc1ddf5e83da798e3ec197" 1847 | integrity sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw== 1848 | 1849 | is-number@^7.0.0: 1850 | version "7.0.0" 1851 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" 1852 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== 1853 | 1854 | is-plain-obj@^2.0.0: 1855 | version "2.1.0" 1856 | resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" 1857 | integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== 1858 | 1859 | is-promise@^2.2.2: 1860 | version "2.2.2" 1861 | resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.2.2.tgz#39ab959ccbf9a774cf079f7b40c7a26f763135f1" 1862 | integrity sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ== 1863 | 1864 | is-stream@^2.0.0: 1865 | version "2.0.0" 1866 | resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" 1867 | integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== 1868 | 1869 | is-string@^1.0.5: 1870 | version "1.0.5" 1871 | resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.5.tgz#40493ed198ef3ff477b8c7f92f644ec82a5cd3a6" 1872 | integrity sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ== 1873 | 1874 | is-typedarray@^1.0.0: 1875 | version "1.0.0" 1876 | resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" 1877 | integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= 1878 | 1879 | isarray@~1.0.0: 1880 | version "1.0.0" 1881 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 1882 | integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= 1883 | 1884 | isexe@^2.0.0: 1885 | version "2.0.0" 1886 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 1887 | integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= 1888 | 1889 | js-sha3@^0.8.0: 1890 | version "0.8.0" 1891 | resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" 1892 | integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== 1893 | 1894 | js-tokens@^4.0.0: 1895 | version "4.0.0" 1896 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" 1897 | integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== 1898 | 1899 | js-yaml@^3.13.1: 1900 | version "3.14.1" 1901 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" 1902 | integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== 1903 | dependencies: 1904 | argparse "^1.0.7" 1905 | esprima "^4.0.0" 1906 | 1907 | json-schema-traverse@^0.4.1: 1908 | version "0.4.1" 1909 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" 1910 | integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== 1911 | 1912 | json-schema-traverse@^1.0.0: 1913 | version "1.0.0" 1914 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" 1915 | integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== 1916 | 1917 | json-stable-stringify-without-jsonify@^1.0.1: 1918 | version "1.0.1" 1919 | resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" 1920 | integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= 1921 | 1922 | kuler@^2.0.0: 1923 | version "2.0.0" 1924 | resolved "https://registry.yarnpkg.com/kuler/-/kuler-2.0.0.tgz#e2c570a3800388fb44407e851531c1d670b061b3" 1925 | integrity sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A== 1926 | 1927 | levn@^0.4.1: 1928 | version "0.4.1" 1929 | resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" 1930 | integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== 1931 | dependencies: 1932 | prelude-ls "^1.2.1" 1933 | type-check "~0.4.0" 1934 | 1935 | lodash.clonedeep@^4.5.0: 1936 | version "4.5.0" 1937 | resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" 1938 | integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= 1939 | 1940 | lodash.deburr@^4.1.0: 1941 | version "4.1.0" 1942 | resolved "https://registry.yarnpkg.com/lodash.deburr/-/lodash.deburr-4.1.0.tgz#ddb1bbb3ef07458c0177ba07de14422cb033ff9b" 1943 | integrity sha1-3bG7s+8HRYwBd7oH3hRCLLAz/5s= 1944 | 1945 | lodash.flatten@^4.4.0: 1946 | version "4.4.0" 1947 | resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" 1948 | integrity sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8= 1949 | 1950 | lodash.isempty@^4.4.0: 1951 | version "4.4.0" 1952 | resolved "https://registry.yarnpkg.com/lodash.isempty/-/lodash.isempty-4.4.0.tgz#6f86cbedd8be4ec987be9aaf33c9684db1b31e7e" 1953 | integrity sha1-b4bL7di+TsmHvpqvM8loTbGzHn4= 1954 | 1955 | lodash.truncate@^4.4.2: 1956 | version "4.4.2" 1957 | resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" 1958 | integrity sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM= 1959 | 1960 | lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.21: 1961 | version "4.17.21" 1962 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" 1963 | integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== 1964 | 1965 | logform@^2.2.0: 1966 | version "2.2.0" 1967 | resolved "https://registry.yarnpkg.com/logform/-/logform-2.2.0.tgz#40f036d19161fc76b68ab50fdc7fe495544492f2" 1968 | integrity sha512-N0qPlqfypFx7UHNn4B3lzS/b0uLqt2hmuoa+PpuXNYgozdJYAyauF5Ky0BWVjrxDlMWiT3qN4zPq3vVAfZy7Yg== 1969 | dependencies: 1970 | colors "^1.2.1" 1971 | fast-safe-stringify "^2.0.4" 1972 | fecha "^4.2.0" 1973 | ms "^2.1.1" 1974 | triple-beam "^1.3.0" 1975 | 1976 | loglevel-plugin-prefix@^0.8.4: 1977 | version "0.8.4" 1978 | resolved "https://registry.yarnpkg.com/loglevel-plugin-prefix/-/loglevel-plugin-prefix-0.8.4.tgz#2fe0e05f1a820317d98d8c123e634c1bd84ff644" 1979 | integrity sha512-WpG9CcFAOjz/FtNht+QJeGpvVl/cdR6P0z6OcXSkr8wFJOsV2GRj2j10JLfjuA4aYkcKCNIEqRGCyTife9R8/g== 1980 | 1981 | loglevel@^1.7.0: 1982 | version "1.7.1" 1983 | resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.7.1.tgz#005fde2f5e6e47068f935ff28573e125ef72f197" 1984 | integrity sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw== 1985 | 1986 | longest-streak@^2.0.0: 1987 | version "2.0.4" 1988 | resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-2.0.4.tgz#b8599957da5b5dab64dee3fe316fa774597d90e4" 1989 | integrity sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg== 1990 | 1991 | lru-cache@^6.0.0: 1992 | version "6.0.0" 1993 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" 1994 | integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== 1995 | dependencies: 1996 | yallist "^4.0.0" 1997 | 1998 | lru-queue@^0.1.0: 1999 | version "0.1.0" 2000 | resolved "https://registry.yarnpkg.com/lru-queue/-/lru-queue-0.1.0.tgz#2738bd9f0d3cf4f84490c5736c48699ac632cda3" 2001 | integrity sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM= 2002 | dependencies: 2003 | es5-ext "~0.10.2" 2004 | 2005 | md5.js@^1.3.4: 2006 | version "1.3.5" 2007 | resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" 2008 | integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== 2009 | dependencies: 2010 | hash-base "^3.0.0" 2011 | inherits "^2.0.1" 2012 | safe-buffer "^5.1.2" 2013 | 2014 | mdast-util-from-markdown@^0.8.0: 2015 | version "0.8.5" 2016 | resolved "https://registry.yarnpkg.com/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.5.tgz#d1ef2ca42bc377ecb0463a987910dae89bd9a28c" 2017 | integrity sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ== 2018 | dependencies: 2019 | "@types/mdast" "^3.0.0" 2020 | mdast-util-to-string "^2.0.0" 2021 | micromark "~2.11.0" 2022 | parse-entities "^2.0.0" 2023 | unist-util-stringify-position "^2.0.0" 2024 | 2025 | mdast-util-to-markdown@^0.6.0: 2026 | version "0.6.5" 2027 | resolved "https://registry.yarnpkg.com/mdast-util-to-markdown/-/mdast-util-to-markdown-0.6.5.tgz#b33f67ca820d69e6cc527a93d4039249b504bebe" 2028 | integrity sha512-XeV9sDE7ZlOQvs45C9UKMtfTcctcaj/pGwH8YLbMHoMOXNNCn2LsqVQOqrF1+/NU8lKDAqozme9SCXWyo9oAcQ== 2029 | dependencies: 2030 | "@types/unist" "^2.0.0" 2031 | longest-streak "^2.0.0" 2032 | mdast-util-to-string "^2.0.0" 2033 | parse-entities "^2.0.0" 2034 | repeat-string "^1.0.0" 2035 | zwitch "^1.0.0" 2036 | 2037 | mdast-util-to-string@^2.0.0: 2038 | version "2.0.0" 2039 | resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz#b8cfe6a713e1091cb5b728fc48885a4767f8b97b" 2040 | integrity sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w== 2041 | 2042 | media-typer@0.3.0: 2043 | version "0.3.0" 2044 | resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" 2045 | integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= 2046 | 2047 | memoizee@^0.4.14: 2048 | version "0.4.15" 2049 | resolved "https://registry.yarnpkg.com/memoizee/-/memoizee-0.4.15.tgz#e6f3d2da863f318d02225391829a6c5956555b72" 2050 | integrity sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ== 2051 | dependencies: 2052 | d "^1.0.1" 2053 | es5-ext "^0.10.53" 2054 | es6-weak-map "^2.0.3" 2055 | event-emitter "^0.3.5" 2056 | is-promise "^2.2.2" 2057 | lru-queue "^0.1.0" 2058 | next-tick "^1.1.0" 2059 | timers-ext "^0.1.7" 2060 | 2061 | merge-descriptors@1.0.1: 2062 | version "1.0.1" 2063 | resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" 2064 | integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= 2065 | 2066 | merge2@^1.3.0: 2067 | version "1.4.1" 2068 | resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" 2069 | integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== 2070 | 2071 | methods@~1.1.2: 2072 | version "1.1.2" 2073 | resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" 2074 | integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= 2075 | 2076 | micromark@~2.11.0: 2077 | version "2.11.4" 2078 | resolved "https://registry.yarnpkg.com/micromark/-/micromark-2.11.4.tgz#d13436138eea826383e822449c9a5c50ee44665a" 2079 | integrity sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA== 2080 | dependencies: 2081 | debug "^4.0.0" 2082 | parse-entities "^2.0.0" 2083 | 2084 | micromatch@^4.0.2: 2085 | version "4.0.4" 2086 | resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" 2087 | integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg== 2088 | dependencies: 2089 | braces "^3.0.1" 2090 | picomatch "^2.2.3" 2091 | 2092 | mime-db@1.47.0: 2093 | version "1.47.0" 2094 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.47.0.tgz#8cb313e59965d3c05cfbf898915a267af46a335c" 2095 | integrity sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw== 2096 | 2097 | mime-types@^2.1.12, mime-types@~2.1.24: 2098 | version "2.1.30" 2099 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.30.tgz#6e7be8b4c479825f85ed6326695db73f9305d62d" 2100 | integrity sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg== 2101 | dependencies: 2102 | mime-db "1.47.0" 2103 | 2104 | mime@1.6.0: 2105 | version "1.6.0" 2106 | resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" 2107 | integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== 2108 | 2109 | minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: 2110 | version "1.0.1" 2111 | resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" 2112 | integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== 2113 | 2114 | minimalistic-crypto-utils@^1.0.1: 2115 | version "1.0.1" 2116 | resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" 2117 | integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= 2118 | 2119 | minimatch@^3.0.4: 2120 | version "3.0.4" 2121 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 2122 | integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== 2123 | dependencies: 2124 | brace-expansion "^1.1.7" 2125 | 2126 | moonbeam-types-bundle@1.1.12: 2127 | version "1.1.12" 2128 | resolved "https://registry.yarnpkg.com/moonbeam-types-bundle/-/moonbeam-types-bundle-1.1.12.tgz#1385cc5faf975ffba17167d04ffd68dc8579e238" 2129 | integrity sha512-Ns03F3gYWTJeSVFXtfWbVVBu/k2L+oPsM6V9yHzIV4111nSRJAT8h0aa6oexIhnKG9FIBwFfcQhPPNKBmD5VkA== 2130 | dependencies: 2131 | "@polkadot/types" "^4.2.1" 2132 | typescript "^4.1.3" 2133 | 2134 | ms@2.0.0: 2135 | version "2.0.0" 2136 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 2137 | integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= 2138 | 2139 | ms@2.1.1: 2140 | version "2.1.1" 2141 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" 2142 | integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== 2143 | 2144 | ms@2.1.2: 2145 | version "2.1.2" 2146 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 2147 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 2148 | 2149 | ms@^2.1.1: 2150 | version "2.1.3" 2151 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" 2152 | integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== 2153 | 2154 | multibase@^0.7.0: 2155 | version "0.7.0" 2156 | resolved "https://registry.yarnpkg.com/multibase/-/multibase-0.7.0.tgz#1adfc1c50abe05eefeb5091ac0c2728d6b84581b" 2157 | integrity sha512-TW8q03O0f6PNFTQDvh3xxH03c8CjGaaYrjkl9UQPG6rz53TQzzxJVCIWVjzcbN/Q5Y53Zd0IBQBMVktVgNx4Fg== 2158 | dependencies: 2159 | base-x "^3.0.8" 2160 | buffer "^5.5.0" 2161 | 2162 | multibase@~0.6.0: 2163 | version "0.6.1" 2164 | resolved "https://registry.yarnpkg.com/multibase/-/multibase-0.6.1.tgz#b76df6298536cc17b9f6a6db53ec88f85f8cc12b" 2165 | integrity sha512-pFfAwyTjbbQgNc3G7D48JkJxWtoJoBMaR4xQUOuB8RnCgRqaYmWNFeJTTvrJ2w51bjLq2zTby6Rqj9TQ9elSUw== 2166 | dependencies: 2167 | base-x "^3.0.8" 2168 | buffer "^5.5.0" 2169 | 2170 | multicodec@^1.0.0: 2171 | version "1.0.4" 2172 | resolved "https://registry.yarnpkg.com/multicodec/-/multicodec-1.0.4.tgz#46ac064657c40380c28367c90304d8ed175a714f" 2173 | integrity sha512-NDd7FeS3QamVtbgfvu5h7fd1IlbaC4EQ0/pgU4zqE2vdHCmBGsUa0TiM8/TdSeG6BMPC92OOCf8F1ocE/Wkrrg== 2174 | dependencies: 2175 | buffer "^5.6.0" 2176 | varint "^5.0.0" 2177 | 2178 | multihashes@~0.4.15: 2179 | version "0.4.21" 2180 | resolved "https://registry.yarnpkg.com/multihashes/-/multihashes-0.4.21.tgz#dc02d525579f334a7909ade8a122dabb58ccfcb5" 2181 | integrity sha512-uVSvmeCWf36pU2nB4/1kzYZjsXD9vofZKpgudqkceYY5g2aZZXJ5r9lxuzoRLl1OAp28XljXsEJ/X/85ZsKmKw== 2182 | dependencies: 2183 | buffer "^5.5.0" 2184 | multibase "^0.7.0" 2185 | varint "^5.0.0" 2186 | 2187 | natural-compare@^1.4.0: 2188 | version "1.4.0" 2189 | resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" 2190 | integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= 2191 | 2192 | negotiator@0.6.2: 2193 | version "0.6.2" 2194 | resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" 2195 | integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== 2196 | 2197 | next-tick@1, next-tick@^1.1.0: 2198 | version "1.1.0" 2199 | resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.1.0.tgz#1836ee30ad56d67ef281b22bd199f709449b35eb" 2200 | integrity sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ== 2201 | 2202 | next-tick@~1.0.0: 2203 | version "1.0.0" 2204 | resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" 2205 | integrity sha1-yobR/ogoFpsBICCOPchCS524NCw= 2206 | 2207 | node-fetch@^2.6.1: 2208 | version "2.6.1" 2209 | resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" 2210 | integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== 2211 | 2212 | node-gyp-build@^4.2.0: 2213 | version "4.2.3" 2214 | resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.2.3.tgz#ce6277f853835f718829efb47db20f3e4d9c4739" 2215 | integrity sha512-MN6ZpzmfNCRM+3t57PTJHgHyw/h4OWnZ6mR8P5j/uZtqQr46RRuDE/P+g3n0YR/AiYXeWixZZzaip77gdICfRg== 2216 | 2217 | on-finished@~2.3.0: 2218 | version "2.3.0" 2219 | resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" 2220 | integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= 2221 | dependencies: 2222 | ee-first "1.1.1" 2223 | 2224 | once@^1.3.0: 2225 | version "1.4.0" 2226 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 2227 | integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= 2228 | dependencies: 2229 | wrappy "1" 2230 | 2231 | one-time@^1.0.0: 2232 | version "1.0.0" 2233 | resolved "https://registry.yarnpkg.com/one-time/-/one-time-1.0.0.tgz#e06bc174aed214ed58edede573b433bbf827cb45" 2234 | integrity sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g== 2235 | dependencies: 2236 | fn.name "1.x.x" 2237 | 2238 | optionator@^0.9.1: 2239 | version "0.9.1" 2240 | resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" 2241 | integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== 2242 | dependencies: 2243 | deep-is "^0.1.3" 2244 | fast-levenshtein "^2.0.6" 2245 | levn "^0.4.1" 2246 | prelude-ls "^1.2.1" 2247 | type-check "^0.4.0" 2248 | word-wrap "^1.2.3" 2249 | 2250 | parent-module@^1.0.0: 2251 | version "1.0.1" 2252 | resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" 2253 | integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== 2254 | dependencies: 2255 | callsites "^3.0.0" 2256 | 2257 | parse-entities@^2.0.0: 2258 | version "2.0.0" 2259 | resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-2.0.0.tgz#53c6eb5b9314a1f4ec99fa0fdf7ce01ecda0cbe8" 2260 | integrity sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ== 2261 | dependencies: 2262 | character-entities "^1.0.0" 2263 | character-entities-legacy "^1.0.0" 2264 | character-reference-invalid "^1.0.0" 2265 | is-alphanumerical "^1.0.0" 2266 | is-decimal "^1.0.0" 2267 | is-hexadecimal "^1.0.0" 2268 | 2269 | parseurl@~1.3.3: 2270 | version "1.3.3" 2271 | resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" 2272 | integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== 2273 | 2274 | path-is-absolute@^1.0.0: 2275 | version "1.0.1" 2276 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 2277 | integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= 2278 | 2279 | path-key@^3.1.0: 2280 | version "3.1.1" 2281 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" 2282 | integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== 2283 | 2284 | path-to-regexp@0.1.7: 2285 | version "0.1.7" 2286 | resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" 2287 | integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= 2288 | 2289 | path-type@^4.0.0: 2290 | version "4.0.0" 2291 | resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" 2292 | integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== 2293 | 2294 | picomatch@^2.2.1, picomatch@^2.2.3: 2295 | version "2.2.3" 2296 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.3.tgz#465547f359ccc206d3c48e46a1bcb89bf7ee619d" 2297 | integrity sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg== 2298 | 2299 | prelude-ls@^1.2.1: 2300 | version "1.2.1" 2301 | resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" 2302 | integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== 2303 | 2304 | prettier-linter-helpers@^1.0.0: 2305 | version "1.0.0" 2306 | resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" 2307 | integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== 2308 | dependencies: 2309 | fast-diff "^1.1.2" 2310 | 2311 | prettier@^2.2.1: 2312 | version "2.2.1" 2313 | resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.2.1.tgz#795a1a78dd52f073da0cd42b21f9c91381923ff5" 2314 | integrity sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q== 2315 | 2316 | process-nextick-args@~2.0.0: 2317 | version "2.0.1" 2318 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" 2319 | integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== 2320 | 2321 | progress@^2.0.0: 2322 | version "2.0.3" 2323 | resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" 2324 | integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== 2325 | 2326 | proxy-addr@~2.0.5: 2327 | version "2.0.6" 2328 | resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.6.tgz#fdc2336505447d3f2f2c638ed272caf614bbb2bf" 2329 | integrity sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw== 2330 | dependencies: 2331 | forwarded "~0.1.2" 2332 | ipaddr.js "1.9.1" 2333 | 2334 | punycode@^2.1.0: 2335 | version "2.1.1" 2336 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" 2337 | integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== 2338 | 2339 | qs@6.7.0: 2340 | version "6.7.0" 2341 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" 2342 | integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== 2343 | 2344 | queue-microtask@^1.2.2: 2345 | version "1.2.3" 2346 | resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" 2347 | integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== 2348 | 2349 | range-parser@~1.2.1: 2350 | version "1.2.1" 2351 | resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" 2352 | integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== 2353 | 2354 | raw-body@2.4.0: 2355 | version "2.4.0" 2356 | resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" 2357 | integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q== 2358 | dependencies: 2359 | bytes "3.1.0" 2360 | http-errors "1.7.2" 2361 | iconv-lite "0.4.24" 2362 | unpipe "1.0.0" 2363 | 2364 | readable-stream@^2.3.7: 2365 | version "2.3.7" 2366 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" 2367 | integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== 2368 | dependencies: 2369 | core-util-is "~1.0.0" 2370 | inherits "~2.0.3" 2371 | isarray "~1.0.0" 2372 | process-nextick-args "~2.0.0" 2373 | safe-buffer "~5.1.1" 2374 | string_decoder "~1.1.1" 2375 | util-deprecate "~1.0.1" 2376 | 2377 | readable-stream@^3.4.0, readable-stream@^3.6.0: 2378 | version "3.6.0" 2379 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" 2380 | integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== 2381 | dependencies: 2382 | inherits "^2.0.3" 2383 | string_decoder "^1.1.1" 2384 | util-deprecate "^1.0.1" 2385 | 2386 | regenerator-runtime@^0.13.4: 2387 | version "0.13.7" 2388 | resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz#cac2dacc8a1ea675feaabaeb8ae833898ae46f55" 2389 | integrity sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew== 2390 | 2391 | regexpp@^3.0.0, regexpp@^3.1.0: 2392 | version "3.1.0" 2393 | resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.1.0.tgz#206d0ad0a5648cffbdb8ae46438f3dc51c9f78e2" 2394 | integrity sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q== 2395 | 2396 | remark-parse@^9.0.0: 2397 | version "9.0.0" 2398 | resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-9.0.0.tgz#4d20a299665880e4f4af5d90b7c7b8a935853640" 2399 | integrity sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw== 2400 | dependencies: 2401 | mdast-util-from-markdown "^0.8.0" 2402 | 2403 | remark-stringify@^9.0.0: 2404 | version "9.0.1" 2405 | resolved "https://registry.yarnpkg.com/remark-stringify/-/remark-stringify-9.0.1.tgz#576d06e910548b0a7191a71f27b33f1218862894" 2406 | integrity sha512-mWmNg3ZtESvZS8fv5PTvaPckdL4iNlCHTt8/e/8oN08nArHRHjNZMKzA/YW3+p7/lYqIw4nx1XsjCBo/AxNChg== 2407 | dependencies: 2408 | mdast-util-to-markdown "^0.6.0" 2409 | 2410 | remark@^13.0.0: 2411 | version "13.0.0" 2412 | resolved "https://registry.yarnpkg.com/remark/-/remark-13.0.0.tgz#d15d9bf71a402f40287ebe36067b66d54868e425" 2413 | integrity sha512-HDz1+IKGtOyWN+QgBiAT0kn+2s6ovOxHyPAFGKVE81VSzJ+mq7RwHFledEvB5F1p4iJvOah/LOKdFuzvRnNLCA== 2414 | dependencies: 2415 | remark-parse "^9.0.0" 2416 | remark-stringify "^9.0.0" 2417 | unified "^9.1.0" 2418 | 2419 | repeat-string@^1.0.0: 2420 | version "1.6.1" 2421 | resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" 2422 | integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= 2423 | 2424 | require-from-string@^2.0.2: 2425 | version "2.0.2" 2426 | resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" 2427 | integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== 2428 | 2429 | resolve-from@^4.0.0: 2430 | version "4.0.0" 2431 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" 2432 | integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== 2433 | 2434 | reusify@^1.0.4: 2435 | version "1.0.4" 2436 | resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" 2437 | integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== 2438 | 2439 | rimraf@^3.0.2: 2440 | version "3.0.2" 2441 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" 2442 | integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== 2443 | dependencies: 2444 | glob "^7.1.3" 2445 | 2446 | ripemd160@^2.0.1: 2447 | version "2.0.2" 2448 | resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" 2449 | integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== 2450 | dependencies: 2451 | hash-base "^3.0.0" 2452 | inherits "^2.0.1" 2453 | 2454 | run-parallel@^1.1.9: 2455 | version "1.2.0" 2456 | resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" 2457 | integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== 2458 | dependencies: 2459 | queue-microtask "^1.2.2" 2460 | 2461 | rxjs@^6.6.7: 2462 | version "6.6.7" 2463 | resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" 2464 | integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== 2465 | dependencies: 2466 | tslib "^1.9.0" 2467 | 2468 | safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: 2469 | version "5.1.2" 2470 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 2471 | integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== 2472 | 2473 | safe-buffer@^5.0.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: 2474 | version "5.2.1" 2475 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" 2476 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== 2477 | 2478 | "safer-buffer@>= 2.1.2 < 3": 2479 | version "2.1.2" 2480 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 2481 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 2482 | 2483 | scryptsy@^2.1.0: 2484 | version "2.1.0" 2485 | resolved "https://registry.yarnpkg.com/scryptsy/-/scryptsy-2.1.0.tgz#8d1e8d0c025b58fdd25b6fa9a0dc905ee8faa790" 2486 | integrity sha512-1CdSqHQowJBnMAFyPEBRfqag/YP9OF394FV+4YREIJX4ljD7OxvQRDayyoyyCk+senRjSkP6VnUNQmVQqB6g7w== 2487 | 2488 | semver@^7.2.1, semver@^7.3.2: 2489 | version "7.3.5" 2490 | resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" 2491 | integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== 2492 | dependencies: 2493 | lru-cache "^6.0.0" 2494 | 2495 | send@0.17.1: 2496 | version "0.17.1" 2497 | resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" 2498 | integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== 2499 | dependencies: 2500 | debug "2.6.9" 2501 | depd "~1.1.2" 2502 | destroy "~1.0.4" 2503 | encodeurl "~1.0.2" 2504 | escape-html "~1.0.3" 2505 | etag "~1.8.1" 2506 | fresh "0.5.2" 2507 | http-errors "~1.7.2" 2508 | mime "1.6.0" 2509 | ms "2.1.1" 2510 | on-finished "~2.3.0" 2511 | range-parser "~1.2.1" 2512 | statuses "~1.5.0" 2513 | 2514 | serve-static@1.14.1: 2515 | version "1.14.1" 2516 | resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" 2517 | integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== 2518 | dependencies: 2519 | encodeurl "~1.0.2" 2520 | escape-html "~1.0.3" 2521 | parseurl "~1.3.3" 2522 | send "0.17.1" 2523 | 2524 | setprototypeof@1.1.1: 2525 | version "1.1.1" 2526 | resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" 2527 | integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== 2528 | 2529 | setprototypeof@1.2.0: 2530 | version "1.2.0" 2531 | resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" 2532 | integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== 2533 | 2534 | sha.js@^2.4.0: 2535 | version "2.4.11" 2536 | resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" 2537 | integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== 2538 | dependencies: 2539 | inherits "^2.0.1" 2540 | safe-buffer "^5.0.1" 2541 | 2542 | shebang-command@^2.0.0: 2543 | version "2.0.0" 2544 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" 2545 | integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== 2546 | dependencies: 2547 | shebang-regex "^3.0.0" 2548 | 2549 | shebang-regex@^3.0.0: 2550 | version "3.0.0" 2551 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" 2552 | integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== 2553 | 2554 | simple-swizzle@^0.2.2: 2555 | version "0.2.2" 2556 | resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" 2557 | integrity sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo= 2558 | dependencies: 2559 | is-arrayish "^0.3.1" 2560 | 2561 | slash@^3.0.0: 2562 | version "3.0.0" 2563 | resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" 2564 | integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== 2565 | 2566 | slice-ansi@^4.0.0: 2567 | version "4.0.0" 2568 | resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" 2569 | integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== 2570 | dependencies: 2571 | ansi-styles "^4.0.0" 2572 | astral-regex "^2.0.0" 2573 | is-fullwidth-code-point "^3.0.0" 2574 | 2575 | sprintf-js@~1.0.2: 2576 | version "1.0.3" 2577 | resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" 2578 | integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= 2579 | 2580 | stack-trace@0.0.x: 2581 | version "0.0.10" 2582 | resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" 2583 | integrity sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA= 2584 | 2585 | "statuses@>= 1.5.0 < 2", statuses@~1.5.0: 2586 | version "1.5.0" 2587 | resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" 2588 | integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= 2589 | 2590 | string-width@^4.2.0: 2591 | version "4.2.2" 2592 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.2.tgz#dafd4f9559a7585cfba529c6a0a4f73488ebd4c5" 2593 | integrity sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA== 2594 | dependencies: 2595 | emoji-regex "^8.0.0" 2596 | is-fullwidth-code-point "^3.0.0" 2597 | strip-ansi "^6.0.0" 2598 | 2599 | string_decoder@^1.1.1: 2600 | version "1.3.0" 2601 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" 2602 | integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== 2603 | dependencies: 2604 | safe-buffer "~5.2.0" 2605 | 2606 | string_decoder@~1.1.1: 2607 | version "1.1.1" 2608 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" 2609 | integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== 2610 | dependencies: 2611 | safe-buffer "~5.1.0" 2612 | 2613 | strip-ansi@^6.0.0: 2614 | version "6.0.0" 2615 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" 2616 | integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== 2617 | dependencies: 2618 | ansi-regex "^5.0.0" 2619 | 2620 | strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: 2621 | version "3.1.1" 2622 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" 2623 | integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== 2624 | 2625 | strip-markdown@^4.0.0: 2626 | version "4.0.0" 2627 | resolved "https://registry.yarnpkg.com/strip-markdown/-/strip-markdown-4.0.0.tgz#1f48aeb5ce81b646487d9f8fbdc18f8bf1416ba2" 2628 | integrity sha512-jwoS5zwHNFjergQjg4RFzmdS4n5WOd5DXDIwRY0jye9ALYMscLWfwZVBMt4P/va5aRmm7Dlj6O4NjMuaD7609Q== 2629 | 2630 | supports-color@^5.3.0: 2631 | version "5.5.0" 2632 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" 2633 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== 2634 | dependencies: 2635 | has-flag "^3.0.0" 2636 | 2637 | supports-color@^7.1.0: 2638 | version "7.2.0" 2639 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" 2640 | integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== 2641 | dependencies: 2642 | has-flag "^4.0.0" 2643 | 2644 | table@^6.0.4: 2645 | version "6.3.2" 2646 | resolved "https://registry.yarnpkg.com/table/-/table-6.3.2.tgz#afa86bee5cfe305f9328f89bb3e5454132cdea28" 2647 | integrity sha512-I9/Ca6Huf2oxFag7crD0DhA+arIdfLtWunSn0NIXSzjtUlDgIBGVZY7SsMkNPNT3Psd/z4gza0nuEpmra9eRbg== 2648 | dependencies: 2649 | ajv "^8.0.1" 2650 | is-boolean-object "^1.1.0" 2651 | is-number-object "^1.0.4" 2652 | is-string "^1.0.5" 2653 | lodash.clonedeep "^4.5.0" 2654 | lodash.flatten "^4.4.0" 2655 | lodash.truncate "^4.4.2" 2656 | slice-ansi "^4.0.0" 2657 | string-width "^4.2.0" 2658 | 2659 | text-hex@1.0.x: 2660 | version "1.0.0" 2661 | resolved "https://registry.yarnpkg.com/text-hex/-/text-hex-1.0.0.tgz#69dc9c1b17446ee79a92bf5b884bb4b9127506f5" 2662 | integrity sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg== 2663 | 2664 | text-table@^0.2.0: 2665 | version "0.2.0" 2666 | resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" 2667 | integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= 2668 | 2669 | timers-ext@^0.1.7: 2670 | version "0.1.7" 2671 | resolved "https://registry.yarnpkg.com/timers-ext/-/timers-ext-0.1.7.tgz#6f57ad8578e07a3fb9f91d9387d65647555e25c6" 2672 | integrity sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ== 2673 | dependencies: 2674 | es5-ext "~0.10.46" 2675 | next-tick "1" 2676 | 2677 | to-regex-range@^5.0.1: 2678 | version "5.0.1" 2679 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" 2680 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== 2681 | dependencies: 2682 | is-number "^7.0.0" 2683 | 2684 | toidentifier@1.0.0: 2685 | version "1.0.0" 2686 | resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" 2687 | integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== 2688 | 2689 | triple-beam@^1.2.0, triple-beam@^1.3.0: 2690 | version "1.3.0" 2691 | resolved "https://registry.yarnpkg.com/triple-beam/-/triple-beam-1.3.0.tgz#a595214c7298db8339eeeee083e4d10bd8cb8dd9" 2692 | integrity sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw== 2693 | 2694 | trough@^1.0.0: 2695 | version "1.0.5" 2696 | resolved "https://registry.yarnpkg.com/trough/-/trough-1.0.5.tgz#b8b639cefad7d0bb2abd37d433ff8293efa5f406" 2697 | integrity sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA== 2698 | 2699 | tslib@^1.8.1, tslib@^1.9.0: 2700 | version "1.14.1" 2701 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" 2702 | integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== 2703 | 2704 | tsutils@^3.17.1: 2705 | version "3.21.0" 2706 | resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" 2707 | integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== 2708 | dependencies: 2709 | tslib "^1.8.1" 2710 | 2711 | tweetnacl@^1.0.3: 2712 | version "1.0.3" 2713 | resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596" 2714 | integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw== 2715 | 2716 | type-check@^0.4.0, type-check@~0.4.0: 2717 | version "0.4.0" 2718 | resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" 2719 | integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== 2720 | dependencies: 2721 | prelude-ls "^1.2.1" 2722 | 2723 | type-fest@^0.20.2: 2724 | version "0.20.2" 2725 | resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" 2726 | integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== 2727 | 2728 | type-fest@^0.8.1: 2729 | version "0.8.1" 2730 | resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" 2731 | integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== 2732 | 2733 | type-is@~1.6.17, type-is@~1.6.18: 2734 | version "1.6.18" 2735 | resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" 2736 | integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== 2737 | dependencies: 2738 | media-typer "0.3.0" 2739 | mime-types "~2.1.24" 2740 | 2741 | type@^1.0.1: 2742 | version "1.2.0" 2743 | resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0" 2744 | integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg== 2745 | 2746 | type@^2.0.0: 2747 | version "2.5.0" 2748 | resolved "https://registry.yarnpkg.com/type/-/type-2.5.0.tgz#0a2e78c2e77907b252abe5f298c1b01c63f0db3d" 2749 | integrity sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw== 2750 | 2751 | typedarray-to-buffer@^3.1.5: 2752 | version "3.1.5" 2753 | resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" 2754 | integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== 2755 | dependencies: 2756 | is-typedarray "^1.0.0" 2757 | 2758 | typescript@3.9.6: 2759 | version "3.9.6" 2760 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.6.tgz#8f3e0198a34c3ae17091b35571d3afd31999365a" 2761 | integrity sha512-Pspx3oKAPJtjNwE92YS05HQoY7z2SFyOpHo9MqJor3BXAGNaPUs83CuVp9VISFkSjyRfiTpmKuAYGJB7S7hOxw== 2762 | 2763 | typescript@^4.1.3, typescript@^4.2.4: 2764 | version "4.2.4" 2765 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.2.4.tgz#8610b59747de028fda898a8aef0e103f156d0961" 2766 | integrity sha512-V+evlYHZnQkaz8TRBuxTA92yZBPotr5H+WhQ7bD3hZUndx5tGOa1fuCgeSjxAzM1RiN5IzvadIXTVefuuwZCRg== 2767 | 2768 | unified@^9.1.0: 2769 | version "9.2.1" 2770 | resolved "https://registry.yarnpkg.com/unified/-/unified-9.2.1.tgz#ae18d5674c114021bfdbdf73865ca60f410215a3" 2771 | integrity sha512-juWjuI8Z4xFg8pJbnEZ41b5xjGUWGHqXALmBZ3FC3WX0PIx1CZBIIJ6mXbYMcf6Yw4Fi0rFUTA1cdz/BglbOhA== 2772 | dependencies: 2773 | bail "^1.0.0" 2774 | extend "^3.0.0" 2775 | is-buffer "^2.0.0" 2776 | is-plain-obj "^2.0.0" 2777 | trough "^1.0.0" 2778 | vfile "^4.0.0" 2779 | 2780 | unist-util-stringify-position@^2.0.0: 2781 | version "2.0.3" 2782 | resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz#cce3bfa1cdf85ba7375d1d5b17bdc4cada9bd9da" 2783 | integrity sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g== 2784 | dependencies: 2785 | "@types/unist" "^2.0.2" 2786 | 2787 | unpipe@1.0.0, unpipe@~1.0.0: 2788 | version "1.0.0" 2789 | resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" 2790 | integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= 2791 | 2792 | uri-js@^4.2.2: 2793 | version "4.4.1" 2794 | resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" 2795 | integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== 2796 | dependencies: 2797 | punycode "^2.1.0" 2798 | 2799 | utf-8-validate@^5.0.2: 2800 | version "5.0.4" 2801 | resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.4.tgz#72a1735983ddf7a05a43a9c6b67c5ce1c910f9b8" 2802 | integrity sha512-MEF05cPSq3AwJ2C7B7sHAA6i53vONoZbMGX8My5auEVm6W+dJ2Jd/TZPyGJ5CH42V2XtbI5FD28HeHeqlPzZ3Q== 2803 | dependencies: 2804 | node-gyp-build "^4.2.0" 2805 | 2806 | util-deprecate@^1.0.1, util-deprecate@~1.0.1: 2807 | version "1.0.2" 2808 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 2809 | integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= 2810 | 2811 | utils-merge@1.0.1: 2812 | version "1.0.1" 2813 | resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" 2814 | integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= 2815 | 2816 | v8-compile-cache@^2.0.3: 2817 | version "2.3.0" 2818 | resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" 2819 | integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== 2820 | 2821 | varint@^5.0.0: 2822 | version "5.0.2" 2823 | resolved "https://registry.yarnpkg.com/varint/-/varint-5.0.2.tgz#5b47f8a947eb668b848e034dcfa87d0ff8a7f7a4" 2824 | integrity sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow== 2825 | 2826 | vary@~1.1.2: 2827 | version "1.1.2" 2828 | resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" 2829 | integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= 2830 | 2831 | vfile-message@^2.0.0: 2832 | version "2.0.4" 2833 | resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-2.0.4.tgz#5b43b88171d409eae58477d13f23dd41d52c371a" 2834 | integrity sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ== 2835 | dependencies: 2836 | "@types/unist" "^2.0.0" 2837 | unist-util-stringify-position "^2.0.0" 2838 | 2839 | vfile@^4.0.0: 2840 | version "4.2.1" 2841 | resolved "https://registry.yarnpkg.com/vfile/-/vfile-4.2.1.tgz#03f1dce28fc625c625bc6514350fbdb00fa9e624" 2842 | integrity sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA== 2843 | dependencies: 2844 | "@types/unist" "^2.0.0" 2845 | is-buffer "^2.0.0" 2846 | unist-util-stringify-position "^2.0.0" 2847 | vfile-message "^2.0.0" 2848 | 2849 | websocket@^1.0.34: 2850 | version "1.0.34" 2851 | resolved "https://registry.yarnpkg.com/websocket/-/websocket-1.0.34.tgz#2bdc2602c08bf2c82253b730655c0ef7dcab3111" 2852 | integrity sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ== 2853 | dependencies: 2854 | bufferutil "^4.0.1" 2855 | debug "^2.2.0" 2856 | es5-ext "^0.10.50" 2857 | typedarray-to-buffer "^3.1.5" 2858 | utf-8-validate "^5.0.2" 2859 | yaeti "^0.0.6" 2860 | 2861 | which@^2.0.1: 2862 | version "2.0.2" 2863 | resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" 2864 | integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== 2865 | dependencies: 2866 | isexe "^2.0.0" 2867 | 2868 | winston-transport@^4.4.0: 2869 | version "4.4.0" 2870 | resolved "https://registry.yarnpkg.com/winston-transport/-/winston-transport-4.4.0.tgz#17af518daa690d5b2ecccaa7acf7b20ca7925e59" 2871 | integrity sha512-Lc7/p3GtqtqPBYYtS6KCN3c77/2QCev51DvcJKbkFPQNoj1sinkGwLGFDxkXY9J6p9+EPnYs+D90uwbnaiURTw== 2872 | dependencies: 2873 | readable-stream "^2.3.7" 2874 | triple-beam "^1.2.0" 2875 | 2876 | winston@^3.3.3: 2877 | version "3.3.3" 2878 | resolved "https://registry.yarnpkg.com/winston/-/winston-3.3.3.tgz#ae6172042cafb29786afa3d09c8ff833ab7c9170" 2879 | integrity sha512-oEXTISQnC8VlSAKf1KYSSd7J6IWuRPQqDdo8eoRNaYKLvwSb5+79Z3Yi1lrl6KDpU6/VWaxpakDAtb1oQ4n9aw== 2880 | dependencies: 2881 | "@dabh/diagnostics" "^2.0.2" 2882 | async "^3.1.0" 2883 | is-stream "^2.0.0" 2884 | logform "^2.2.0" 2885 | one-time "^1.0.0" 2886 | readable-stream "^3.4.0" 2887 | stack-trace "0.0.x" 2888 | triple-beam "^1.3.0" 2889 | winston-transport "^4.4.0" 2890 | 2891 | word-wrap@^1.2.3: 2892 | version "1.2.3" 2893 | resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" 2894 | integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== 2895 | 2896 | wrappy@1: 2897 | version "1.0.2" 2898 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 2899 | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= 2900 | 2901 | xxhashjs@^0.2.2: 2902 | version "0.2.2" 2903 | resolved "https://registry.yarnpkg.com/xxhashjs/-/xxhashjs-0.2.2.tgz#8a6251567621a1c46a5ae204da0249c7f8caa9d8" 2904 | integrity sha512-AkTuIuVTET12tpsVIQo+ZU6f/qDmKuRUcjaqR+OIvm+aCBsZ95i7UVY5WJ9TMsSaZ0DA2WxoZ4acu0sPH+OKAw== 2905 | dependencies: 2906 | cuint "^0.2.2" 2907 | 2908 | yaeti@^0.0.6: 2909 | version "0.0.6" 2910 | resolved "https://registry.yarnpkg.com/yaeti/-/yaeti-0.0.6.tgz#f26f484d72684cf42bedfb76970aa1608fbf9577" 2911 | integrity sha1-8m9ITXJoTPQr7ft2lwqhYI+/lXc= 2912 | 2913 | yallist@^4.0.0: 2914 | version "4.0.0" 2915 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" 2916 | integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== 2917 | 2918 | yaml@*: 2919 | version "1.10.2" 2920 | resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" 2921 | integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== 2922 | 2923 | yaml@1.10.0: 2924 | version "1.10.0" 2925 | resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.0.tgz#3b593add944876077d4d683fee01081bd9fff31e" 2926 | integrity sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg== 2927 | 2928 | zwitch@^1.0.0: 2929 | version "1.0.5" 2930 | resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-1.0.5.tgz#d11d7381ffed16b742f6af7b3f223d5cd9fe9920" 2931 | integrity sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw== 2932 | --------------------------------------------------------------------------------