diff --git a/.github/workflows/benchmark.yml b/.github/workflows/benchmark.yml deleted file mode 100644 index 5d0762b2..00000000 --- a/.github/workflows/benchmark.yml +++ /dev/null @@ -1,47 +0,0 @@ -name: Benchmark - -on: - workflow_dispatch: - inputs: - run_benchmark: - description: "Please confirm running the benchmarks by typing 'yes' in the input box." - required: true - default: "no" - -jobs: - wakeup: - runs-on: ubuntu-latest - if: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.run_benchmark == 'yes' }} - permissions: - id-token: write - contents: read - steps: - - uses: actions/checkout@v3 - - - name: Configure AWS Credentials - uses: aws-actions/configure-aws-credentials@v4 - with: - role-to-assume: arn:aws:iam::490752553772:role/summa-solvency-ec2-slc - role-duration-seconds: 900 - aws-region: us-west-2 - - - name: Wakeup runner - run: .github/scripts/wakeup.sh - - benchmark: - runs-on: [summa-solvency-runner] - needs: [wakeup] - if: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.run_benchmark == 'yes' }} - steps: - - uses: actions/checkout@v3 - - - name: Run Benchmark Tests - run: | - cd prover - cargo bench - - - name: Upload Benchmark Results - uses: actions/upload-artifact@v2 - with: - name: benchmark-results - path: prover/target/criterion diff --git a/.github/workflows/contracts.yml b/.github/workflows/contracts.yml deleted file mode 100644 index f05c06f8..00000000 --- a/.github/workflows/contracts.yml +++ /dev/null @@ -1,23 +0,0 @@ -name: Contracts - -on: - push: - branches: ["*"] - pull_request: - branches: ["*"] - -jobs: - tests: - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v3 - - name: Install packages - uses: actions/setup-node@v3 - - run: | - cd contracts - npm ci - - name: Run Tests - run: | - cd contracts - npx hardhat test diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index 1ba15d57..cb62be56 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -14,53 +14,29 @@ env: CARGO_TERM_COLOR: always jobs: - wakeup: + test-zk-prover: runs-on: ubuntu-latest - permissions: - id-token: write - contents: read - steps: - uses: actions/checkout@v3 + - name: Test Zk Prover + run: | + cd prover + cargo test --release --features dev-graph -- --nocapture - - name: Configure AWS Credentials - uses: aws-actions/configure-aws-credentials@v4 - with: - role-to-assume: arn:aws:iam::490752553772:role/summa-solvency-ec2-slc - role-duration-seconds: 900 - aws-region: us-west-2 - - - name: Wakeup runner - run: .github/scripts/wakeup.sh - - build: - runs-on: [summa-solvency-runner] - needs: [wakeup] - + test-backend: + runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - - - name: Set Environment - run: echo "PATH=/home/ubuntu/.cargo/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" >> "$GITHUB_ENV" - - - name: Install solc - run: (hash svm 2>/dev/null || cargo install --version 0.2.23 svm-rs) && svm install 0.8.20 && solc --version - - - name: Test Prover + - name: Test backend run: | - cd prover + cd backend cargo test --release -- --nocapture - - name: Install Foundry - uses: foundry-rs/foundry-toolchain@v1 - - # TODO restore workflow - # - name: Test backend - # run: | - # cd backend - # cargo test --release -- --nocapture - - # - name: Test example - # run: | - # cd backend - # cargo run --release --example summa_solvency_flow + test-backend-examples: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Test backend example + run: | + cd backend + cargo run --release --example summa_solvency_flow diff --git a/README.md b/README.md index a1b4a1d5..812bb104 100644 --- a/README.md +++ b/README.md @@ -4,9 +4,8 @@ A monorepo for Summa, zk proof of solvency protocol ### Subdirectories -- `prover`: Halo2 based zk prover and KZG polynomial interpolation for Summa -- `contracts`: Solidity smart contracts for Summa -- `backend` : Rust API to interact with Summa +- `prover`: HyperPlonk based ZK prover and Multilinear KZG for Summa +- `backend` : Rust API to interact with Summa prover and verifier ## License diff --git a/backend/.gitignore b/backend/.gitignore index 5e48149c..9253bccd 100644 --- a/backend/.gitignore +++ b/backend/.gitignore @@ -2,4 +2,4 @@ # will have compiled files and executables /target .env -*_proof.json +*.json diff --git a/backend/Cargo.lock b/backend/Cargo.lock index 318a51e5..fd0d4202 100644 --- a/backend/Cargo.lock +++ b/backend/Cargo.lock @@ -2,68 +2,6 @@ # It is not intended for manual editing. version = 3 -[[package]] -name = "Inflector" -version = "0.11.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3" -dependencies = [ - "lazy_static", - "regex", -] - -[[package]] -name = "addr2line" -version = "0.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4fa78e18c64fce05e902adecd7a5eed15a5e0a3439f7b0e169f0252214865e3" -dependencies = [ - "gimli", -] - -[[package]] -name = "adler" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" - -[[package]] -name = "aes" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac1f845298e95f983ff1944b728ae08b8cebab80d684f0a832ed0fc74dfa27e2" -dependencies = [ - "cfg-if", - "cipher", - "cpufeatures", -] - -[[package]] -name = "ahash" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c99f64d1e06488f620f932677e24bc6e2897582980441ae90a671415bd7ec2f" -dependencies = [ - "cfg-if", - "once_cell", - "version_check", -] - -[[package]] -name = "aho-corasick" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43f6cb1bf222025340178f382c426f13757b2960e89779dfcb319c32542a5a41" -dependencies = [ - "memchr", -] - -[[package]] -name = "android-tzdata" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" - [[package]] name = "ark-std" version = "0.4.0" @@ -86,150 +24,18 @@ version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" -[[package]] -name = "ascii-canvas" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8824ecca2e851cec16968d54a01dd372ef8f95b244fb84b84e70128be347c3c6" -dependencies = [ - "term", -] - -[[package]] -name = "askama" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b79091df18a97caea757e28cd2d5fda49c6cd4bd01ddffd7ff01ace0c0ad2c28" -dependencies = [ - "askama_derive", - "askama_escape", -] - -[[package]] -name = "askama_derive" -version = "0.12.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19fe8d6cb13c4714962c072ea496f3392015f0989b1a2847bb4b2d9effd71d83" -dependencies = [ - "askama_parser", - "basic-toml", - "mime", - "mime_guess", - "proc-macro2", - "quote", - "serde", - "syn 2.0.25", -] - -[[package]] -name = "askama_escape" -version = "0.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "619743e34b5ba4e9703bba34deac3427c72507c7159f5fd030aea8cac0cfe341" - -[[package]] -name = "askama_parser" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acb1161c6b64d1c3d83108213c2a2533a342ac225aabd0bda218278c2ddb00c0" -dependencies = [ - "nom", -] - -[[package]] -name = "async-trait" -version = "0.1.71" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a564d521dd56509c4c47480d00b80ee55f7e385ae48db5744c67ad50c92d2ebf" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.25", -] - -[[package]] -name = "async_io_stream" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6d7b9decdf35d8908a7e3ef02f64c5e9b1695e230154c0e8de3969142d9b94c" -dependencies = [ - "futures", - "pharos", - "rustc_version", -] - -[[package]] -name = "auto_impl" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fee3da8ef1276b0bee5dd1c7258010d8fffd31801447323115a25560e1327b89" -dependencies = [ - "proc-macro-error", - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "autocfg" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" -[[package]] -name = "backtrace" -version = "0.3.68" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4319208da049c43661739c5fade2ba182f09d1dc2299b32298d3a31692b17e12" -dependencies = [ - "addr2line", - "cc", - "cfg-if", - "libc", - "miniz_oxide", - "object", - "rustc-demangle", -] - -[[package]] -name = "base16ct" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" - [[package]] name = "base64" version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" -[[package]] -name = "base64" -version = "0.21.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "604178f6c5c21f02dc555784810edfb88d34ac2c73b2eae109655649ee73ce3d" - -[[package]] -name = "base64ct" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" - -[[package]] -name = "basic-toml" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7bfc506e7a2370ec239e1d072507b2a80c833083699d3c6fa176fbb4de8448c6" -dependencies = [ - "serde", -] - -[[package]] -name = "bech32" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dabbe35f96fb9507f7330793dc490461b2962659ac5d427181e451a623751d1" - [[package]] name = "bincode" version = "1.3.3" @@ -239,43 +45,6 @@ dependencies = [ "serde", ] -[[package]] -name = "bit-set" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" -dependencies = [ - "bit-vec", -] - -[[package]] -name = "bit-vec" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" - -[[package]] -name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "bitflags" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4682ae6287fcf752ecaabbfcc7b6f9b72aa33933dc23a554d853aea8eea8635" - -[[package]] -name = "bitvec" -version = "0.17.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41262f11d771fd4a61aa3ce019fca363b4b6c282fca9da2a31186d3965a47a5c" -dependencies = [ - "either", - "radium 0.3.0", -] - [[package]] name = "bitvec" version = "1.0.1" @@ -283,7 +52,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" dependencies = [ "funty", - "radium 0.7.0", + "radium", "tap", "wyz", ] @@ -324,196 +93,18 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8d696c370c750c948ada61c69a0ee2cbbb9c50b1019ddb86d9317157a99c2cae" -[[package]] -name = "bs58" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "771fe0050b883fcc3ea2359b1a96bcfbc090b7116eae7c3c512c7a083fdf23d3" -dependencies = [ - "sha2 0.9.9", -] - -[[package]] -name = "bumpalo" -version = "3.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3e2c3daef883ecc1b5d58c15adae93470a91d425f3532ba1695849656af3fc1" - -[[package]] -name = "byte-slice-cast" -version = "1.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3ac9f8b63eca6fd385229b3675f6cc0dc5c8a5c8a54a59d4f52ffd670d87b0c" - -[[package]] -name = "byteorder" -version = "1.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" - -[[package]] -name = "bytes" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" -dependencies = [ - "serde", -] - -[[package]] -name = "camino" -version = "1.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c530edf18f37068ac2d977409ed5cd50d53d73bc653c7647b48eb78976ac9ae2" -dependencies = [ - "serde", -] - -[[package]] -name = "cargo-platform" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbdb825da8a5df079a43676dbe042702f1707b1109f713a01420fbb4cc71fa27" -dependencies = [ - "serde", -] - -[[package]] -name = "cargo_metadata" -version = "0.15.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eee4243f1f26fc7a42710e7439c149e2b10b05472f88090acce52632f231a73a" -dependencies = [ - "camino", - "cargo-platform", - "semver", - "serde", - "serde_json", - "thiserror", -] - -[[package]] -name = "cc" -version = "1.0.79" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" - [[package]] name = "cfg-if" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" -[[package]] -name = "chrono" -version = "0.4.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec837a71355b28f6556dbd569b37b3f363091c0bd4b2e735674521b4c5fd9bc5" -dependencies = [ - "android-tzdata", - "num-traits", -] - -[[package]] -name = "cipher" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" -dependencies = [ - "crypto-common", - "inout", -] - -[[package]] -name = "coins-bip32" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b30a84aab436fcb256a2ab3c80663d8aec686e6bae12827bb05fef3e1e439c9f" -dependencies = [ - "bincode", - "bs58", - "coins-core", - "digest 0.10.7", - "getrandom", - "hmac", - "k256", - "lazy_static", - "serde", - "sha2 0.10.7", - "thiserror", -] - -[[package]] -name = "coins-bip39" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84f4d04ee18e58356accd644896aeb2094ddeafb6a713e056cef0c0a8e468c15" -dependencies = [ - "bitvec 0.17.4", - "coins-bip32", - "getrandom", - "hmac", - "once_cell", - "pbkdf2 0.12.2", - "rand", - "sha2 0.10.7", - "thiserror", -] - -[[package]] -name = "coins-core" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b949a1c63fb7eb591eb7ba438746326aedf0ae843e51ec92ba6bec5bb382c4f" -dependencies = [ - "base64 0.21.2", - "bech32", - "bs58", - "digest 0.10.7", - "generic-array", - "hex", - "ripemd", - "serde", - "serde_derive", - "sha2 0.10.7", - "sha3 0.10.8", - "thiserror", -] - -[[package]] -name = "const-oid" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "795bc6e66a8e340f075fcf6227e417a2dc976b92b91f3cdc778bb858778b6747" - [[package]] name = "constant_time_eq" version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "21a53c0a4d288377e7415b53dcfc3c04da5cdc2cc95c8d5ac178b58f0b861ad6" -[[package]] -name = "convert_case" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" - -[[package]] -name = "core-foundation" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "core-foundation-sys" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" - [[package]] name = "cpufeatures" version = "0.2.9" @@ -556,24 +147,6 @@ dependencies = [ "cfg-if", ] -[[package]] -name = "crunchy" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" - -[[package]] -name = "crypto-bigint" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf4c2f4e1afd912bc40bfd6fed5d9dc1f288e0ba01bfcc835cc5bc3eb13efe15" -dependencies = [ - "generic-array", - "rand_core", - "subtle", - "zeroize", -] - [[package]] name = "crypto-common" version = "0.1.6" @@ -605,44 +178,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "ctr" -version = "0.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" -dependencies = [ - "cipher", -] - -[[package]] -name = "der" -version = "0.7.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c7ed52955ce76b1554f509074bb357d3fb8ac9b51288a65a3fd480d1dfba946" -dependencies = [ - "const-oid", - "zeroize", -] - -[[package]] -name = "derive_more" -version = "0.99.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" -dependencies = [ - "convert_case", - "proc-macro2", - "quote", - "rustc_version", - "syn 1.0.109", -] - -[[package]] -name = "diff" -version = "0.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8" - [[package]] name = "digest" version = "0.9.0" @@ -659,3211 +194,652 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer 0.10.4", - "const-oid", "crypto-common", - "subtle", ] [[package]] -name = "dirs-next" -version = "2.0.0" +name = "either" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" -dependencies = [ - "cfg-if", - "dirs-sys-next", -] +checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91" [[package]] -name = "dirs-sys-next" -version = "0.1.2" +name = "ff" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" +checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" dependencies = [ - "libc", - "redox_users", - "winapi", + "bitvec", + "rand_core", + "subtle", ] [[package]] -name = "dunce" -version = "1.0.4" +name = "funty" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56ce8c6da7551ec6c462cbaf3bfbc75131ebbfa1c944aeaa9dab51ca1c5f0c3b" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" [[package]] -name = "ecdsa" -version = "0.16.7" +name = "futures" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0997c976637b606099b9985693efa3581e84e41f5c11ba5255f88711058ad428" +checksum = "23342abe12aba583913b2e62f22225ff9c950774065e4bfb61a19cd9770fec40" dependencies = [ - "der", - "digest 0.10.7", - "elliptic-curve", - "rfc6979", - "signature", - "spki", + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", ] [[package]] -name = "either" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91" - -[[package]] -name = "elliptic-curve" -version = "0.13.5" +name = "futures-channel" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "968405c8fdc9b3bf4df0a6638858cc0b52462836ab6b1c87377785dd09cf1c0b" +checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2" dependencies = [ - "base16ct", - "crypto-bigint", - "digest 0.10.7", - "ff", - "generic-array", - "group", - "pkcs8", - "rand_core", - "sec1", - "subtle", - "zeroize", + "futures-core", + "futures-sink", ] [[package]] -name = "ena" -version = "0.14.2" +name = "futures-core" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c533630cf40e9caa44bd91aadc88a75d75a4c3a12b4cfde353cbed41daa1e1f1" -dependencies = [ - "log", -] +checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" [[package]] -name = "encoding_rs" -version = "0.8.32" +name = "futures-executor" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071a31f4ee85403370b58aca746f01041ede6f0da2730960ad001edc2b71b394" +checksum = "ccecee823288125bd88b4d7f565c9e58e41858e47ab72e8ea2d64e93624386e0" dependencies = [ - "cfg-if", + "futures-core", + "futures-task", + "futures-util", ] [[package]] -name = "enr" -version = "0.8.1" +name = "futures-io" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf56acd72bb22d2824e66ae8e9e5ada4d0de17a69c7fd35569dde2ada8ec9116" -dependencies = [ - "base64 0.13.1", - "bytes", - "hex", - "k256", - "log", - "rand", - "rlp", - "serde", - "sha3 0.10.8", - "zeroize", -] +checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964" [[package]] -name = "enumn" -version = "0.1.10" +name = "futures-macro" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9838a970f5de399d3070ae1739e131986b2f5dcc223c7423ca0927e3a878522" +checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" dependencies = [ "proc-macro2", "quote", - "syn 2.0.25", + "syn", ] [[package]] -name = "equivalent" -version = "1.0.1" +name = "futures-sink" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" +checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e" [[package]] -name = "errno" -version = "0.3.1" +name = "futures-task" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a" -dependencies = [ - "errno-dragonfly", - "libc", - "windows-sys", -] +checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65" [[package]] -name = "errno-dragonfly" -version = "0.1.2" +name = "futures-util" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" +checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" dependencies = [ - "cc", - "libc", + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", ] [[package]] -name = "eth-keystore" -version = "0.5.0" +name = "generic-array" +version = "0.14.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fda3bf123be441da5260717e0661c25a2fd9cb2b2c1d20bf2e05580047158ab" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ - "aes", - "ctr", - "digest 0.10.7", - "hex", - "hmac", - "pbkdf2 0.11.0", - "rand", - "scrypt", "serde", - "serde_json", - "sha2 0.10.7", - "sha3 0.10.8", - "thiserror", - "uuid", + "typenum", + "version_check", ] [[package]] -name = "ethabi" -version = "18.0.0" +name = "getrandom" +version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7413c5f74cc903ea37386a8965a936cbeb334bd270862fdece542c1b2dcbc898" +checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" dependencies = [ - "ethereum-types", - "hex", - "once_cell", - "regex", - "serde", - "serde_json", - "sha3 0.10.8", - "thiserror", - "uint", + "cfg-if", + "libc", + "wasi", ] [[package]] -name = "ethbloom" +name = "group" version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c22d4b5885b6aa2fe5e8b9329fb8d232bf739e434e6b87347c63bdd00c120f60" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" dependencies = [ - "crunchy", - "fixed-hash", - "impl-codec", - "impl-rlp", - "impl-serde", - "scale-info", - "tiny-keccak", + "ff", + "rand_core", + "subtle", ] [[package]] -name = "ethereum-types" -version = "0.14.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02d215cbf040552efcbe99a38372fe80ab9d00268e20012b79fcd0f073edd8ee" +name = "halo2_proofs" +version = "0.2.0" +source = "git+https://github.com/han0110/halo2.git?branch=feature/for-benchmark#4981b8d5bdaab04af9b56a5d2c482b6eec9f7fa4" dependencies = [ - "ethbloom", - "fixed-hash", - "impl-codec", - "impl-rlp", - "impl-serde", - "primitive-types", - "scale-info", - "uint", + "ark-std", + "blake2b_simd", + "ff", + "group", + "halo2curves 0.3.3", + "rand_chacha", + "rand_core", + "rayon", + "sha3 0.9.1", + "tracing", ] [[package]] -name = "ethers" -version = "2.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a58ce802c65cf3d0756dee5a61094a92cde53c1583b246e9ee5b37226c7fc15" +name = "halo2curves" +version = "0.3.2" +source = "git+https://github.com/privacy-scaling-explorations/halo2curves.git?tag=0.3.2#9f5c50810bbefe779ee5cf1d852b2fe85dc35d5e" dependencies = [ - "ethers-addressbook", - "ethers-contract", - "ethers-core", - "ethers-etherscan", - "ethers-middleware", - "ethers-providers", - "ethers-signers", - "ethers-solc", + "ff", + "group", + "lazy_static", + "num-bigint", + "num-traits", + "pasta_curves", + "paste", + "rand", + "rand_core", + "static_assertions", + "subtle", ] [[package]] -name = "ethers-addressbook" -version = "2.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b856b7b8ff5c961093cb8efe151fbcce724b451941ce20781de11a531ccd578" +name = "halo2curves" +version = "0.3.3" +source = "git+https://github.com/privacy-scaling-explorations/halo2curves?tag=0.3.3#8e4cb9f0c66c864e8ca25da07f50ae95f664a5b7" dependencies = [ - "ethers-core", - "once_cell", + "ff", + "group", + "lazy_static", + "num-bigint", + "num-traits", + "pasta_curves", + "paste", + "rand", + "rand_core", "serde", - "serde_json", + "static_assertions", + "subtle", ] [[package]] -name = "ethers-contract" -version = "2.0.7" +name = "hex" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e066a0d9cfc70c454672bf16bb433b0243427420076dc5b2f49c448fb5a10628" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" dependencies = [ - "ethers-contract-abigen", - "ethers-contract-derive", - "ethers-core", - "ethers-providers", - "futures-util", - "hex", - "once_cell", - "pin-project", "serde", - "serde_json", - "thiserror", ] [[package]] -name = "ethers-contract-abigen" -version = "2.0.7" +name = "itertools" +version = "0.10.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c113e3e86b6bc16d98484b2c3bb2d01d6fed9f489fe2e592e5cc87c3024d616b" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" dependencies = [ - "Inflector", - "dunce", - "ethers-core", - "eyre", - "hex", - "prettyplease", - "proc-macro2", - "quote", - "regex", - "serde", - "serde_json", - "syn 2.0.25", - "toml", - "walkdir", + "either", ] [[package]] -name = "ethers-contract-derive" -version = "2.0.7" +name = "itoa" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c3fb5adee25701c79ec58fcf2c63594cd8829bc9ad6037ff862d5a111101ed2" -dependencies = [ - "Inflector", - "ethers-contract-abigen", - "ethers-core", - "hex", - "proc-macro2", - "quote", - "serde_json", - "syn 2.0.25", -] +checksum = "62b02a5381cc465bd3041d84623d0fa3b66738b52b8e2fc3bab8ad63ab032f4a" [[package]] -name = "ethers-core" -version = "2.0.7" +name = "keccak" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6da5fa198af0d3be20c19192df2bd9590b92ce09a8421e793bec8851270f1b05" +checksum = "8f6d5ed8676d904364de097082f4e7d240b571b67989ced0240f08b7f966f940" dependencies = [ - "arrayvec", - "bytes", - "cargo_metadata", - "chrono", - "elliptic-curve", - "ethabi", - "generic-array", - "hex", - "k256", - "num_enum", - "once_cell", - "open-fastrlp", - "rand", - "rlp", - "serde", - "serde_json", - "strum", - "syn 2.0.25", - "tempfile", - "thiserror", - "tiny-keccak", - "unicode-xid", + "cpufeatures", ] [[package]] -name = "ethers-etherscan" -version = "2.0.7" +name = "lazy_static" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84ebb401ba97c6f5af278c2c9936c4546cad75dec464b439ae6df249906f4caa" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" dependencies = [ - "ethers-core", - "ethers-solc", - "reqwest", - "semver", - "serde", - "serde_json", - "thiserror", - "tracing", + "spin", ] [[package]] -name = "ethers-middleware" -version = "2.0.7" +name = "libc" +version = "0.2.147" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "740f4a773c19dd6d6a68c8c2e0996c096488d38997d524e21dc612c55da3bd24" -dependencies = [ - "async-trait", - "auto_impl", - "ethers-contract", - "ethers-core", - "ethers-etherscan", - "ethers-providers", - "ethers-signers", - "futures-channel", - "futures-locks", - "futures-util", - "instant", - "reqwest", - "serde", - "serde_json", - "thiserror", - "tokio", - "tracing", - "tracing-futures", - "url", -] +checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" [[package]] -name = "ethers-providers" -version = "2.0.7" +name = "memchr" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56b498fd2a6c019d023e43e83488cd1fb0721f299055975aa6bac8dbf1e95f2c" -dependencies = [ - "async-trait", - "auto_impl", - "base64 0.21.2", - "bytes", - "enr", - "ethers-core", - "futures-core", - "futures-timer", - "futures-util", - "hashers", - "hex", - "http", - "instant", - "once_cell", - "pin-project", - "reqwest", - "serde", - "serde_json", - "thiserror", - "tokio", - "tracing", - "tracing-futures", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "ws_stream_wasm", -] +checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" [[package]] -name = "ethers-signers" -version = "2.0.7" +name = "memoffset" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02c4b7e15f212fa7cc2e1251868320221d4ff77a3d48068e69f47ce1c491df2d" -dependencies = [ - "async-trait", - "coins-bip32", - "coins-bip39", - "elliptic-curve", - "eth-keystore", - "ethers-core", - "hex", - "rand", - "sha2 0.10.7", - "thiserror", - "tracing", -] - -[[package]] -name = "ethers-solc" -version = "2.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a81c89f121595cf8959e746045bb8b25a6a38d72588561e1a3b7992fc213f674" -dependencies = [ - "cfg-if", - "dunce", - "ethers-core", - "glob", - "hex", - "home", - "md-5", - "num_cpus", - "once_cell", - "path-slash", - "rayon", - "regex", - "semver", - "serde", - "serde_json", - "solang-parser", - "thiserror", - "tiny-keccak", - "tokio", - "tracing", - "walkdir", - "yansi", -] - -[[package]] -name = "eyre" -version = "0.6.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c2b6b5a29c02cdc822728b7d7b8ae1bab3e3b05d44522770ddd49722eeac7eb" -dependencies = [ - "indenter", - "once_cell", -] - -[[package]] -name = "fastrand" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" -dependencies = [ - "instant", -] - -[[package]] -name = "ff" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" -dependencies = [ - "bitvec 1.0.1", - "rand_core", - "subtle", -] - -[[package]] -name = "fixed-hash" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "835c052cb0c08c1acf6ffd71c022172e18723949c8282f2b9f27efbc51e64534" -dependencies = [ - "byteorder", - "rand", - "rustc-hex", - "static_assertions", -] - -[[package]] -name = "fixedbitset" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" - -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[package]] -name = "foreign-types" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" -dependencies = [ - "foreign-types-shared", -] - -[[package]] -name = "foreign-types-shared" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" - -[[package]] -name = "form_urlencoded" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652" -dependencies = [ - "percent-encoding", -] - -[[package]] -name = "funty" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" - -[[package]] -name = "futures" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23342abe12aba583913b2e62f22225ff9c950774065e4bfb61a19cd9770fec40" -dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-channel" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2" -dependencies = [ - "futures-core", - "futures-sink", -] - -[[package]] -name = "futures-core" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" - -[[package]] -name = "futures-executor" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccecee823288125bd88b4d7f565c9e58e41858e47ab72e8ea2d64e93624386e0" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-io" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964" - -[[package]] -name = "futures-locks" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45ec6fe3675af967e67c5536c0b9d44e34e6c52f86bedc4ea49c5317b8e94d06" -dependencies = [ - "futures-channel", - "futures-task", -] - -[[package]] -name = "futures-macro" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.25", -] - -[[package]] -name = "futures-sink" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e" - -[[package]] -name = "futures-task" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65" - -[[package]] -name = "futures-timer" -version = "3.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e64b03909df88034c26dc1547e8970b91f98bdb65165d6a4e9110d94263dbb2c" -dependencies = [ - "gloo-timers", - "send_wrapper 0.4.0", -] - -[[package]] -name = "futures-util" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" -dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-macro", - "futures-sink", - "futures-task", - "memchr", - "pin-project-lite", - "pin-utils", - "slab", -] - -[[package]] -name = "fxhash" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" -dependencies = [ - "byteorder", -] - -[[package]] -name = "generic-array" -version = "0.14.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" -dependencies = [ - "serde", - "typenum", - "version_check", - "zeroize", -] - -[[package]] -name = "getrandom" -version = "0.2.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" -dependencies = [ - "cfg-if", - "js-sys", - "libc", - "wasi", - "wasm-bindgen", -] - -[[package]] -name = "gimli" -version = "0.27.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c80984affa11d98d1b88b66ac8853f143217b399d3c74116778ff8fdb4ed2e" - -[[package]] -name = "glob" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" - -[[package]] -name = "gloo-timers" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b995a66bb87bebce9a0f4a95aed01daca4872c050bfcb21653361c03bc35e5c" -dependencies = [ - "futures-channel", - "futures-core", - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "group" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" -dependencies = [ - "ff", - "rand_core", - "subtle", -] - -[[package]] -name = "h2" -version = "0.3.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97ec8491ebaf99c8eaa73058b045fe58073cd6be7f596ac993ced0b0a0c01049" -dependencies = [ - "bytes", - "fnv", - "futures-core", - "futures-sink", - "futures-util", - "http", - "indexmap 1.9.3", - "slab", - "tokio", - "tokio-util", - "tracing", -] - -[[package]] -name = "halo2_proofs" -version = "0.2.0" -source = "git+https://github.com/han0110/halo2.git?branch=feature/for-benchmark#4981b8d5bdaab04af9b56a5d2c482b6eec9f7fa4" -dependencies = [ - "ark-std", - "blake2b_simd", - "ff", - "group", - "halo2curves 0.3.3", - "rand_chacha", - "rand_core", - "rayon", - "sha3 0.9.1", - "tracing", -] - -[[package]] -name = "halo2_proofs" -version = "0.2.0" -source = "git+https://github.com/summa-dev/halo2#8386d6e64fc33baccf626869123185890b8284dc" -dependencies = [ - "blake2b_simd", - "ff", - "group", - "halo2curves 0.1.0", - "maybe-rayon", - "rand_chacha", - "rand_core", - "sha3 0.9.1", - "tracing", -] - -[[package]] -name = "halo2_solidity_verifier" -version = "0.1.0" -source = "git+https://github.com/summa-dev/halo2-solidity-verifier#d33972567f83f3218257b286b541ad97ba32928c" -dependencies = [ - "askama", - "blake2b_simd", - "halo2_proofs 0.2.0 (git+https://github.com/summa-dev/halo2)", - "hex", - "itertools 0.11.0", - "revm", - "ruint", - "sha3 0.10.8", -] - -[[package]] -name = "halo2curves" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6b1142bd1059aacde1b477e0c80c142910f1ceae67fc619311d6a17428007ab" -dependencies = [ - "blake2b_simd", - "ff", - "group", - "lazy_static", - "num-bigint", - "num-traits", - "pasta_curves", - "paste", - "rand", - "rand_core", - "static_assertions", - "subtle", -] - -[[package]] -name = "halo2curves" -version = "0.3.2" -source = "git+https://github.com/privacy-scaling-explorations/halo2curves.git?tag=0.3.2#9f5c50810bbefe779ee5cf1d852b2fe85dc35d5e" -dependencies = [ - "ff", - "group", - "lazy_static", - "num-bigint", - "num-traits", - "pasta_curves", - "paste", - "rand", - "rand_core", - "static_assertions", - "subtle", -] - -[[package]] -name = "halo2curves" -version = "0.3.3" -source = "git+https://github.com/privacy-scaling-explorations/halo2curves?tag=0.3.3#8e4cb9f0c66c864e8ca25da07f50ae95f664a5b7" -dependencies = [ - "ff", - "group", - "lazy_static", - "num-bigint", - "num-traits", - "pasta_curves", - "paste", - "rand", - "rand_core", - "serde", - "static_assertions", - "subtle", -] - -[[package]] -name = "hashbrown" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" - -[[package]] -name = "hashbrown" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" -dependencies = [ - "ahash", -] - -[[package]] -name = "hashbrown" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a" - -[[package]] -name = "hashers" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2bca93b15ea5a746f220e56587f71e73c6165eab783df9e26590069953e3c30" -dependencies = [ - "fxhash", -] - -[[package]] -name = "heck" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" - -[[package]] -name = "hermit-abi" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "443144c8cdadd93ebf52ddb4056d257f5b52c04d3c804e657d19eb73fc33668b" - -[[package]] -name = "hex" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" -dependencies = [ - "serde", -] - -[[package]] -name = "hex-literal" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fe2267d4ed49bc07b63801559be28c718ea06c4738b7a03c94df7386d2cde46" - -[[package]] -name = "hmac" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" -dependencies = [ - "digest 0.10.7", -] - -[[package]] -name = "home" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5444c27eef6923071f7ebcc33e3444508466a76f7a2b93da00ed6e19f30c1ddb" -dependencies = [ - "windows-sys", -] - -[[package]] -name = "http" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - -[[package]] -name = "http-body" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" -dependencies = [ - "bytes", - "http", - "pin-project-lite", -] - -[[package]] -name = "httparse" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" - -[[package]] -name = "httpdate" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" - -[[package]] -name = "hyper" -version = "0.14.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffb1cfd654a8219eaef89881fdb3bb3b1cdc5fa75ded05d6933b2b382e395468" -dependencies = [ - "bytes", - "futures-channel", - "futures-core", - "futures-util", - "h2", - "http", - "http-body", - "httparse", - "httpdate", - "itoa", - "pin-project-lite", - "socket2", - "tokio", - "tower-service", - "tracing", - "want", -] - -[[package]] -name = "hyper-tls" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" -dependencies = [ - "bytes", - "hyper", - "native-tls", - "tokio", - "tokio-native-tls", -] - -[[package]] -name = "idna" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c" -dependencies = [ - "unicode-bidi", - "unicode-normalization", -] - -[[package]] -name = "impl-codec" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba6a270039626615617f3f36d15fc827041df3b78c439da2cadfa47455a77f2f" -dependencies = [ - "parity-scale-codec", -] - -[[package]] -name = "impl-rlp" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f28220f89297a075ddc7245cd538076ee98b01f2a9c23a53a4f1105d5a322808" -dependencies = [ - "rlp", -] - -[[package]] -name = "impl-serde" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc88fc67028ae3db0c853baa36269d398d5f45b6982f95549ff5def78c935cd" -dependencies = [ - "serde", -] - -[[package]] -name = "impl-trait-for-tuples" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11d7a9f6330b71fea57921c9b61c47ee6e84f72d394754eff6163ae67e7395eb" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "indenter" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" - -[[package]] -name = "indexmap" -version = "1.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" -dependencies = [ - "autocfg", - "hashbrown 0.12.3", -] - -[[package]] -name = "indexmap" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5477fe2230a79769d8dc68e0eabf5437907c0457a5614a9e8dddb67f65eb65d" -dependencies = [ - "equivalent", - "hashbrown 0.14.0", -] - -[[package]] -name = "inout" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" -dependencies = [ - "generic-array", -] - -[[package]] -name = "instant" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "io-lifetimes" -version = "1.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" -dependencies = [ - "hermit-abi", - "libc", - "windows-sys", -] - -[[package]] -name = "ipnet" -version = "2.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28b29a3cd74f0f4598934efe3aeba42bae0eb4680554128851ebbecb02af14e6" - -[[package]] -name = "is-terminal" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b" -dependencies = [ - "hermit-abi", - "rustix 0.38.11", - "windows-sys", -] - -[[package]] -name = "itertools" -version = "0.10.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" -dependencies = [ - "either", -] - -[[package]] -name = "itertools" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" -dependencies = [ - "either", -] - -[[package]] -name = "itoa" -version = "1.0.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62b02a5381cc465bd3041d84623d0fa3b66738b52b8e2fc3bab8ad63ab032f4a" - -[[package]] -name = "js-sys" -version = "0.3.64" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a" -dependencies = [ - "wasm-bindgen", -] - -[[package]] -name = "k256" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cadb76004ed8e97623117f3df85b17aaa6626ab0b0831e6573f104df16cd1bcc" -dependencies = [ - "cfg-if", - "ecdsa", - "elliptic-curve", - "once_cell", - "sha2 0.10.7", - "signature", -] - -[[package]] -name = "keccak" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f6d5ed8676d904364de097082f4e7d240b571b67989ced0240f08b7f966f940" -dependencies = [ - "cpufeatures", -] - -[[package]] -name = "lalrpop" -version = "0.19.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a1cbf952127589f2851ab2046af368fd20645491bb4b376f04b7f94d7a9837b" -dependencies = [ - "ascii-canvas", - "bit-set", - "diff", - "ena", - "is-terminal", - "itertools 0.10.5", - "lalrpop-util", - "petgraph", - "regex", - "regex-syntax 0.6.29", - "string_cache", - "term", - "tiny-keccak", - "unicode-xid", -] - -[[package]] -name = "lalrpop-util" -version = "0.19.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3c48237b9604c5a4702de6b824e02006c3214327564636aef27c1028a8fa0ed" - -[[package]] -name = "lazy_static" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" -dependencies = [ - "spin", -] - -[[package]] -name = "libc" -version = "0.2.147" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" - -[[package]] -name = "linux-raw-sys" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" - -[[package]] -name = "linux-raw-sys" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09fc20d2ca12cb9f044c93e3bd6d32d523e6e2ec3db4f7b2939cd99026ecd3f0" - -[[package]] -name = "lock_api" -version = "0.4.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16" -dependencies = [ - "autocfg", - "scopeguard", -] - -[[package]] -name = "log" -version = "0.4.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4" - -[[package]] -name = "maybe-rayon" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ea1f30cedd69f0a2954655f7188c6a834246d2bcf1e315e2ac40c4b24dc9519" -dependencies = [ - "cfg-if", - "rayon", -] - -[[package]] -name = "md-5" -version = "0.10.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6365506850d44bff6e2fbcb5176cf63650e48bd45ef2fe2665ae1570e0f4b9ca" -dependencies = [ - "digest 0.10.7", -] - -[[package]] -name = "memchr" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" - -[[package]] -name = "memoffset" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" -dependencies = [ - "autocfg", -] - -[[package]] -name = "mime" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" - -[[package]] -name = "mime_guess" -version = "2.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4192263c238a5f0d0c6bfd21f336a313a4ce1c450542449ca191bb657b4642ef" -dependencies = [ - "mime", - "unicase", -] - -[[package]] -name = "minimal-lexical" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" - -[[package]] -name = "miniz_oxide" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" -dependencies = [ - "adler", -] - -[[package]] -name = "mio" -version = "0.8.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2" -dependencies = [ - "libc", - "wasi", - "windows-sys", -] - -[[package]] -name = "native-tls" -version = "0.2.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" -dependencies = [ - "lazy_static", - "libc", - "log", - "openssl", - "openssl-probe", - "openssl-sys", - "schannel", - "security-framework", - "security-framework-sys", - "tempfile", -] - -[[package]] -name = "new_debug_unreachable" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4a24736216ec316047a1fc4252e27dabb04218aa4a3f37c6e7ddbf1f9782b54" - -[[package]] -name = "nom" -version = "7.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" -dependencies = [ - "memchr", - "minimal-lexical", -] - -[[package]] -name = "num" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43db66d1170d347f9a065114077f7dccb00c1b9478c89384490a3425279a4606" -dependencies = [ - "num-bigint", - "num-complex", - "num-integer", - "num-iter", - "num-rational", - "num-traits", -] - -[[package]] -name = "num-bigint" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f93ab6289c7b344a8a9f60f88d80aa20032336fe78da341afc91c8a2341fc75f" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-complex" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02e0d21255c828d6f128a1e41534206671e8c3ea0c62f32291e808dc82cff17d" -dependencies = [ - "num-traits", -] - -[[package]] -name = "num-integer" -version = "0.1.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" -dependencies = [ - "autocfg", - "num-traits", -] - -[[package]] -name = "num-iter" -version = "0.1.43" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d03e6c028c5dc5cac6e2dec0efda81fc887605bb3d884578bb6d6bf7514e252" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-rational" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" -dependencies = [ - "autocfg", - "num-bigint", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-traits" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f30b0abd723be7e2ffca1272140fac1a2f084c77ec3e123c192b66af1ee9e6c2" -dependencies = [ - "autocfg", -] - -[[package]] -name = "num_cpus" -version = "1.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" -dependencies = [ - "hermit-abi", - "libc", -] - -[[package]] -name = "num_enum" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a015b430d3c108a207fd776d2e2196aaf8b1cf8cf93253e3a097ff3085076a1" -dependencies = [ - "num_enum_derive", -] - -[[package]] -name = "num_enum_derive" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96667db765a921f7b295ffee8b60472b686a51d4f21c2ee4ffdb94c7013b65a6" -dependencies = [ - "proc-macro-crate", - "proc-macro2", - "quote", - "syn 2.0.25", -] - -[[package]] -name = "object" -version = "0.31.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bda667d9f2b5051b8833f59f3bf748b28ef54f850f4fcb389a252aa383866d1" -dependencies = [ - "memchr", -] - -[[package]] -name = "once_cell" -version = "1.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" - -[[package]] -name = "opaque-debug" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" - -[[package]] -name = "open-fastrlp" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "786393f80485445794f6043fd3138854dd109cc6c4bd1a6383db304c9ce9b9ce" -dependencies = [ - "arrayvec", - "auto_impl", - "bytes", - "ethereum-types", - "open-fastrlp-derive", -] - -[[package]] -name = "open-fastrlp-derive" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "003b2be5c6c53c1cfeb0a238b8a1c3915cd410feb684457a36c10038f764bb1c" -dependencies = [ - "bytes", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "openssl" -version = "0.10.55" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "345df152bc43501c5eb9e4654ff05f794effb78d4efe3d53abc158baddc0703d" -dependencies = [ - "bitflags 1.3.2", - "cfg-if", - "foreign-types", - "libc", - "once_cell", - "openssl-macros", - "openssl-sys", -] - -[[package]] -name = "openssl-macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.25", -] - -[[package]] -name = "openssl-probe" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" - -[[package]] -name = "openssl-sys" -version = "0.9.90" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "374533b0e45f3a7ced10fcaeccca020e66656bc03dac384f852e4e5a7a8104a6" -dependencies = [ - "cc", - "libc", - "pkg-config", - "vcpkg", -] - -[[package]] -name = "parity-scale-codec" -version = "3.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "756d439303e94fae44f288ba881ad29670c65b0c4b0e05674ca81061bb65f2c5" -dependencies = [ - "arrayvec", - "bitvec 1.0.1", - "byte-slice-cast", - "impl-trait-for-tuples", - "parity-scale-codec-derive", - "serde", -] - -[[package]] -name = "parity-scale-codec-derive" -version = "3.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d884d78fcf214d70b1e239fcd1c6e5e95aa3be1881918da2e488cc946c7a476" -dependencies = [ - "proc-macro-crate", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "parking_lot" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" -dependencies = [ - "lock_api", - "parking_lot_core", -] - -[[package]] -name = "parking_lot_core" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447" -dependencies = [ - "cfg-if", - "libc", - "redox_syscall 0.3.5", - "smallvec", - "windows-targets", -] - -[[package]] -name = "pasta_curves" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3e57598f73cc7e1b2ac63c79c517b31a0877cd7c402cdcaa311b5208de7a095" -dependencies = [ - "blake2b_simd", - "ff", - "group", - "hex", - "lazy_static", - "rand", - "serde", - "static_assertions", - "subtle", -] - -[[package]] -name = "paste" -version = "1.0.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4b27ab7be369122c218afc2079489cdcb4b517c0a3fc386ff11e1fedfcc2b35" - -[[package]] -name = "path-slash" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e91099d4268b0e11973f036e885d652fb0b21fedcf69738c627f94db6a44f42" - -[[package]] -name = "pbkdf2" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" -dependencies = [ - "digest 0.10.7", -] - -[[package]] -name = "pbkdf2" -version = "0.12.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" -dependencies = [ - "digest 0.10.7", - "hmac", -] - -[[package]] -name = "percent-encoding" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" - -[[package]] -name = "petgraph" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dd7d28ee937e54fe3080c91faa1c3a46c06de6252988a7f4592ba2310ef22a4" -dependencies = [ - "fixedbitset", - "indexmap 1.9.3", -] - -[[package]] -name = "pharos" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9567389417feee6ce15dd6527a8a1ecac205ef62c2932bcf3d9f6fc5b78b414" -dependencies = [ - "futures", - "rustc_version", -] - -[[package]] -name = "phf" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc" -dependencies = [ - "phf_macros", - "phf_shared 0.11.2", -] - -[[package]] -name = "phf_generator" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48e4cc64c2ad9ebe670cb8fd69dd50ae301650392e81c05f9bfcb2d5bdbc24b0" -dependencies = [ - "phf_shared 0.11.2", - "rand", -] - -[[package]] -name = "phf_macros" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3444646e286606587e49f3bcf1679b8cef1dc2c5ecc29ddacaffc305180d464b" -dependencies = [ - "phf_generator", - "phf_shared 0.11.2", - "proc-macro2", - "quote", - "syn 2.0.25", -] - -[[package]] -name = "phf_shared" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" -dependencies = [ - "siphasher", -] - -[[package]] -name = "phf_shared" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b" -dependencies = [ - "siphasher", -] - -[[package]] -name = "pin-project" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "030ad2bc4db10a8944cb0d837f158bdfec4d4a4873ab701a95046770d11f8842" -dependencies = [ - "pin-project-internal", -] - -[[package]] -name = "pin-project-internal" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec2e072ecce94ec471b13398d5402c188e76ac03cf74dd1a975161b23a3f6d9c" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.25", -] - -[[package]] -name = "pin-project-lite" -version = "0.2.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c40d25201921e5ff0c862a505c6557ea88568a4e3ace775ab55e93f2f4f9d57" - -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - -[[package]] -name = "pkcs8" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" -dependencies = [ - "der", - "spki", -] - -[[package]] -name = "pkg-config" -version = "0.3.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" - -[[package]] -name = "plonkish_backend" -version = "0.1.0" -source = "git+https://github.com/summa-dev/plonkish?branch=summa#fa852d0a4cd79621e5ee31ffcedd9ba348d17d5c" -dependencies = [ - "bincode", - "bitvec 1.0.1", - "generic-array", - "halo2_proofs 0.2.0 (git+https://github.com/han0110/halo2.git?branch=feature/for-benchmark)", - "halo2curves 0.3.3", - "itertools 0.10.5", - "num-bigint", - "num-integer", - "pasta_curves", - "poseidon", - "rand", - "rayon", - "serde", - "sha3 0.10.8", -] - -[[package]] -name = "poseidon" -version = "0.2.0" -source = "git+https://github.com/han0110/poseidon?branch=feature/with-spec#fa4c2544ed38666f1f72d1c4fd0956756a7112b3" -dependencies = [ - "halo2curves 0.3.2", - "subtle", -] - -[[package]] -name = "ppv-lite86" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" - -[[package]] -name = "precomputed-hash" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" - -[[package]] -name = "prettyplease" -version = "0.2.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92139198957b410250d43fad93e630d956499a625c527eda65175c8680f83387" -dependencies = [ - "proc-macro2", - "syn 2.0.25", -] - -[[package]] -name = "primitive-types" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f3486ccba82358b11a77516035647c34ba167dfa53312630de83b12bd4f3d66" -dependencies = [ - "fixed-hash", - "impl-codec", - "impl-rlp", - "impl-serde", - "scale-info", - "uint", -] - -[[package]] -name = "proc-macro-crate" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" -dependencies = [ - "once_cell", - "toml_edit", -] - -[[package]] -name = "proc-macro-error" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" -dependencies = [ - "proc-macro-error-attr", - "proc-macro2", - "quote", - "syn 1.0.109", - "version_check", -] - -[[package]] -name = "proc-macro-error-attr" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" -dependencies = [ - "proc-macro2", - "quote", - "version_check", -] - -[[package]] -name = "proc-macro2" -version = "1.0.64" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78803b62cbf1f46fde80d7c0e803111524b9877184cfe7c3033659490ac7a7da" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "quote" -version = "1.0.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "573015e8ab27661678357f27dc26460738fd2b6c86e46f386fde94cb5d913105" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "radium" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "def50a86306165861203e7f84ecffbbdfdea79f0e51039b33de1e952358c47ac" - -[[package]] -name = "radium" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" - -[[package]] -name = "rand" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" -dependencies = [ - "libc", - "rand_chacha", - "rand_core", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core", -] - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom", -] - -[[package]] -name = "rayon" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c27db03db7734835b3f53954b534c91069375ce6ccaa2e065441e07d9b6cdb1" -dependencies = [ - "either", - "rayon-core", -] - -[[package]] -name = "rayon-core" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ce3fb6ad83f861aac485e76e1985cd109d9a3713802152be56c3b1f0e0658ed" -dependencies = [ - "crossbeam-deque", - "crossbeam-utils", -] - -[[package]] -name = "redox_syscall" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" -dependencies = [ - "bitflags 1.3.2", -] - -[[package]] -name = "redox_syscall" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" -dependencies = [ - "bitflags 1.3.2", -] - -[[package]] -name = "redox_users" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" -dependencies = [ - "getrandom", - "redox_syscall 0.2.16", - "thiserror", -] - -[[package]] -name = "regex" -version = "1.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2eae68fc220f7cf2532e4494aded17545fce192d59cd996e0fe7887f4ceb575" -dependencies = [ - "aho-corasick", - "memchr", - "regex-automata", - "regex-syntax 0.7.4", -] - -[[package]] -name = "regex-automata" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83d3daa6976cffb758ec878f108ba0e062a45b2d6ca3a2cca965338855476caf" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax 0.7.4", -] - -[[package]] -name = "regex-syntax" -version = "0.6.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" - -[[package]] -name = "regex-syntax" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5ea92a5b6195c6ef2a0295ea818b312502c6fc94dde986c5553242e18fd4ce2" - -[[package]] -name = "reqwest" -version = "0.11.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cde824a14b7c14f85caff81225f411faacc04a2013f41670f41443742b1c1c55" -dependencies = [ - "base64 0.21.2", - "bytes", - "encoding_rs", - "futures-core", - "futures-util", - "h2", - "http", - "http-body", - "hyper", - "hyper-tls", - "ipnet", - "js-sys", - "log", - "mime", - "native-tls", - "once_cell", - "percent-encoding", - "pin-project-lite", - "serde", - "serde_json", - "serde_urlencoded", - "tokio", - "tokio-native-tls", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "winreg", -] - -[[package]] -name = "revm" -version = "3.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f293f351c4c203d321744e54ed7eed3d2b6eef4c140228910dde3ac9a5ea8031" -dependencies = [ - "auto_impl", - "revm-interpreter", - "revm-precompile", -] - -[[package]] -name = "revm-interpreter" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a53980a26f9b5a66d13511c35074d4b53631e157850a1d7cf1af4efc2c2b72c9" -dependencies = [ - "derive_more", - "enumn", - "revm-primitives", - "sha3 0.10.8", -] - -[[package]] -name = "revm-precompile" -version = "2.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41320af3bd6a65153d38eb1d3638ba89104cc9513c7feedb2d8510e8307dab29" -dependencies = [ - "k256", - "num", - "once_cell", - "revm-primitives", - "ripemd", - "secp256k1", - "sha2 0.10.7", - "sha3 0.10.8", - "substrate-bn", -] - -[[package]] -name = "revm-primitives" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "304d998f466ffef72d76c7f20b05bf08a96801736a6fb1fdef47d49a292618df" -dependencies = [ - "auto_impl", - "bitvec 1.0.1", - "bytes", - "derive_more", - "enumn", - "fixed-hash", - "hashbrown 0.13.2", - "hex", - "hex-literal", - "primitive-types", - "rlp", - "ruint", - "sha3 0.10.8", -] - -[[package]] -name = "rfc6979" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" -dependencies = [ - "hmac", - "subtle", -] - -[[package]] -name = "ripemd" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd124222d17ad93a644ed9d011a40f4fb64aa54275c08cc216524a9ea82fb09f" -dependencies = [ - "digest 0.10.7", -] - -[[package]] -name = "rlp" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb919243f34364b6bd2fc10ef797edbfa75f33c252e7998527479c6d6b47e1ec" -dependencies = [ - "bytes", - "rlp-derive", - "rustc-hex", -] - -[[package]] -name = "rlp-derive" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e33d7b2abe0c340d8797fe2907d3f20d3b5ea5908683618bfe80df7f621f672a" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "ruint" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d470e29e933dac4101180fd6574971892315c414cf2961a192729089687cc9b" -dependencies = [ - "derive_more", - "primitive-types", - "rlp", - "ruint-macro", - "rustc_version", - "thiserror", -] - -[[package]] -name = "ruint-macro" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62cc5760263ea229d367e7dff3c0cbf09e4797a125bd87059a6c095804f3b2d1" - -[[package]] -name = "rustc-demangle" -version = "0.1.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" - -[[package]] -name = "rustc-hex" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" - -[[package]] -name = "rustc_version" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" -dependencies = [ - "semver", -] - -[[package]] -name = "rustix" -version = "0.37.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d69718bf81c6127a49dc64e44a742e8bb9213c0ff8869a22c308f84c1d4ab06" -dependencies = [ - "bitflags 1.3.2", - "errno", - "io-lifetimes", - "libc", - "linux-raw-sys 0.3.8", - "windows-sys", -] - -[[package]] -name = "rustix" -version = "0.38.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0c3dde1fc030af041adc40e79c0e7fbcf431dd24870053d187d7c66e4b87453" -dependencies = [ - "bitflags 2.4.0", - "errno", - "libc", - "linux-raw-sys 0.4.3", - "windows-sys", -] - -[[package]] -name = "rustversion" -version = "1.0.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc31bd9b61a32c31f9650d18add92aa83a49ba979c143eefd27fe7177b05bd5f" - -[[package]] -name = "ryu" -version = "1.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe232bdf6be8c8de797b22184ee71118d63780ea42ac85b61d1baa6d3b782ae9" - -[[package]] -name = "salsa20" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97a22f5af31f73a954c10289c93e8a50cc23d971e80ee446f1f6f7137a088213" -dependencies = [ - "cipher", -] - -[[package]] -name = "same-file" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" -dependencies = [ - "winapi-util", -] - -[[package]] -name = "scale-info" -version = "2.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35c0a159d0c45c12b20c5a844feb1fe4bea86e28f17b92a5f0c42193634d3782" -dependencies = [ - "cfg-if", - "derive_more", - "parity-scale-codec", - "scale-info-derive", -] - -[[package]] -name = "scale-info-derive" -version = "2.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "912e55f6d20e0e80d63733872b40e1227c0bce1e1ab81ba67d696339bfd7fd29" -dependencies = [ - "proc-macro-crate", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "schannel" -version = "0.1.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c3733bf4cf7ea0880754e19cb5a462007c4a8c1914bff372ccc95b464f1df88" -dependencies = [ - "windows-sys", -] - -[[package]] -name = "scopeguard" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" - -[[package]] -name = "scrypt" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f9e24d2b632954ded8ab2ef9fea0a0c769ea56ea98bddbafbad22caeeadf45d" -dependencies = [ - "hmac", - "pbkdf2 0.11.0", - "salsa20", - "sha2 0.10.7", -] - -[[package]] -name = "sec1" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0aec48e813d6b90b15f0b8948af3c63483992dee44c03e9930b3eebdabe046e" -dependencies = [ - "base16ct", - "der", - "generic-array", - "pkcs8", - "subtle", - "zeroize", -] - -[[package]] -name = "secp256k1" -version = "0.27.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25996b82292a7a57ed3508f052cfff8640d38d32018784acd714758b43da9c8f" -dependencies = [ - "secp256k1-sys", -] - -[[package]] -name = "secp256k1-sys" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70a129b9e9efbfb223753b9163c4ab3b13cff7fd9c7f010fbac25ab4099fa07e" -dependencies = [ - "cc", -] - -[[package]] -name = "security-framework" -version = "2.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fc758eb7bffce5b308734e9b0c1468893cae9ff70ebf13e7090be8dcbcc83a8" -dependencies = [ - "bitflags 1.3.2", - "core-foundation", - "core-foundation-sys", - "libc", - "security-framework-sys", -] - -[[package]] -name = "security-framework-sys" -version = "2.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f51d0c0d83bec45f16480d0ce0058397a69e48fcdc52d1dc8855fb68acbd31a7" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "semver" -version = "1.0.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bebd363326d05ec3e2f532ab7660680f3b02130d780c299bca73469d521bc0ed" -dependencies = [ - "serde", -] - -[[package]] -name = "send_wrapper" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f638d531eccd6e23b980caf34876660d38e265409d8e99b397ab71eb3612fad0" - -[[package]] -name = "send_wrapper" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" - -[[package]] -name = "serde" -version = "1.0.171" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30e27d1e4fd7659406c492fd6cfaf2066ba8773de45ca75e855590f856dc34a9" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.171" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "389894603bd18c46fa56231694f8d827779c0951a667087194cf9de94ed24682" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.25", -] - -[[package]] -name = "serde_json" -version = "1.0.102" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5062a995d481b2308b6064e9af76011f2921c35f97b0468811ed9f6cd91dfed" -dependencies = [ - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "serde_spanned" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96426c9936fd7a0124915f9185ea1d20aa9445cc9821142f0a73bc9207a2e186" -dependencies = [ - "serde", -] - -[[package]] -name = "serde_urlencoded" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" -dependencies = [ - "form_urlencoded", - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "sha2" -version = "0.9.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" -dependencies = [ - "block-buffer 0.9.0", - "cfg-if", - "cpufeatures", - "digest 0.9.0", - "opaque-debug", -] - -[[package]] -name = "sha2" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "479fb9d862239e610720565ca91403019f2f00410f1864c5aa7479b950a76ed8" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest 0.10.7", -] - -[[package]] -name = "sha3" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f81199417d4e5de3f04b1e871023acea7389672c4135918f05aa9cbf2f2fa809" -dependencies = [ - "block-buffer 0.9.0", - "digest 0.9.0", - "keccak", - "opaque-debug", -] - -[[package]] -name = "sha3" -version = "0.10.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" -dependencies = [ - "digest 0.10.7", - "keccak", -] - -[[package]] -name = "signal-hook-registry" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" -dependencies = [ - "libc", -] - -[[package]] -name = "signature" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e1788eed21689f9cf370582dfc467ef36ed9c707f073528ddafa8d83e3b8500" -dependencies = [ - "digest 0.10.7", - "rand_core", -] - -[[package]] -name = "siphasher" -version = "0.3.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7bd3e3206899af3f8b12af284fafc038cc1dc2b41d1b89dd17297221c5d225de" - -[[package]] -name = "slab" -version = "0.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d" -dependencies = [ - "autocfg", -] - -[[package]] -name = "smallvec" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62bb4feee49fdd9f707ef802e22365a35de4b7b299de4763d44bfea899442ff9" - -[[package]] -name = "socket2" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662" -dependencies = [ - "libc", - "winapi", -] - -[[package]] -name = "solang-parser" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a94494913728908efa7a25a2dd2e4f037e714897985c24273c40596638ed909" -dependencies = [ - "itertools 0.10.5", - "lalrpop", - "lalrpop-util", - "phf", - "thiserror", - "unicode-xid", -] - -[[package]] -name = "spin" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" - -[[package]] -name = "spki" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d1e996ef02c474957d681f1b05213dfb0abab947b446a62d37770b23500184a" -dependencies = [ - "base64ct", - "der", -] - -[[package]] -name = "static_assertions" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" - -[[package]] -name = "string_cache" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f91138e76242f575eb1d3b38b4f1362f10d3a43f47d182a5b359af488a02293b" -dependencies = [ - "new_debug_unreachable", - "once_cell", - "parking_lot", - "phf_shared 0.10.0", - "precomputed-hash", -] - -[[package]] -name = "strum" -version = "0.24.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "063e6045c0e62079840579a7e47a355ae92f60eb74daaf156fb1e84ba164e63f" -dependencies = [ - "strum_macros", -] - -[[package]] -name = "strum_macros" -version = "0.24.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e385be0d24f186b4ce2f9982191e7101bb737312ad61c1f2f984f34bcf85d59" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "rustversion", - "syn 1.0.109", -] - -[[package]] -name = "substrate-bn" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b5bbfa79abbae15dd642ea8176a21a635ff3c00059961d1ea27ad04e5b441c" -dependencies = [ - "byteorder", - "crunchy", - "lazy_static", - "rand", - "rustc-hex", -] - -[[package]] -name = "subtle" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" - -[[package]] -name = "summa-backend" -version = "0.1.0" -dependencies = [ - "base64 0.13.1", - "bincode", - "csv", - "ethers", - "futures", - "halo2_proofs 0.2.0 (git+https://github.com/han0110/halo2.git?branch=feature/for-benchmark)", - "halo2_solidity_verifier", - "num-bigint", - "num-traits", - "rand", - "reqwest", - "serde", - "serde_json", - "summa-hyperplonk", - "tokio", -] - -[[package]] -name = "summa-hyperplonk" -version = "0.3.0" -dependencies = [ - "csv", - "halo2_proofs 0.2.0 (git+https://github.com/han0110/halo2.git?branch=feature/for-benchmark)", - "num-bigint", - "plonkish_backend", - "rand", - "rayon", -] - -[[package]] -name = "syn" -version = "1.0.109" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "syn" -version = "2.0.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15e3fc8c0c74267e2df136e5e5fb656a464158aa57624053375eb9c8c6e25ae2" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "tap" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" - -[[package]] -name = "tempfile" -version = "3.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31c0432476357e58790aaa47a8efb0c5138f137343f3b5f23bd36a27e3b0a6d6" +checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" dependencies = [ "autocfg", - "cfg-if", - "fastrand", - "redox_syscall 0.3.5", - "rustix 0.37.23", - "windows-sys", -] - -[[package]] -name = "term" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c59df8ac95d96ff9bede18eb7300b0fda5e5d8d90960e76f8e14ae765eedbf1f" -dependencies = [ - "dirs-next", - "rustversion", - "winapi", -] - -[[package]] -name = "thiserror" -version = "1.0.43" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a35fc5b8971143ca348fa6df4f024d4d55264f3468c71ad1c2f365b0a4d58c42" -dependencies = [ - "thiserror-impl", ] [[package]] -name = "thiserror-impl" -version = "1.0.43" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "463fe12d7993d3b327787537ce8dd4dfa058de32fc2b195ef3cde03dc4771e8f" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.25", -] - -[[package]] -name = "tiny-keccak" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" -dependencies = [ - "crunchy", -] - -[[package]] -name = "tinyvec" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" -dependencies = [ - "tinyvec_macros", -] - -[[package]] -name = "tinyvec_macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" - -[[package]] -name = "tokio" -version = "1.29.1" +name = "num-bigint" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "532826ff75199d5833b9d2c5fe410f29235e25704ee5f0ef599fb51c21f4a4da" +checksum = "f93ab6289c7b344a8a9f60f88d80aa20032336fe78da341afc91c8a2341fc75f" dependencies = [ "autocfg", - "backtrace", - "bytes", - "libc", - "mio", - "num_cpus", - "parking_lot", - "pin-project-lite", - "signal-hook-registry", - "socket2", - "tokio-macros", - "windows-sys", -] - -[[package]] -name = "tokio-macros" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.25", -] - -[[package]] -name = "tokio-native-tls" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" -dependencies = [ - "native-tls", - "tokio", -] - -[[package]] -name = "tokio-util" -version = "0.7.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "806fe8c2c87eccc8b3267cbae29ed3ab2d0bd37fca70ab622e46aaa9375ddb7d" -dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "pin-project-lite", - "tokio", - "tracing", -] - -[[package]] -name = "toml" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c17e963a819c331dcacd7ab957d80bc2b9a9c1e71c804826d2f283dd65306542" -dependencies = [ - "serde", - "serde_spanned", - "toml_datetime", - "toml_edit", -] - -[[package]] -name = "toml_datetime" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" -dependencies = [ - "serde", -] - -[[package]] -name = "toml_edit" -version = "0.19.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c500344a19072298cd05a7224b3c0c629348b78692bf48466c5238656e315a78" -dependencies = [ - "indexmap 2.0.0", - "serde", - "serde_spanned", - "toml_datetime", - "winnow", -] - -[[package]] -name = "tower-service" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" - -[[package]] -name = "tracing" -version = "0.1.37" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" -dependencies = [ - "cfg-if", - "pin-project-lite", - "tracing-attributes", - "tracing-core", -] - -[[package]] -name = "tracing-attributes" -version = "0.1.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.25", + "num-integer", + "num-traits", ] [[package]] -name = "tracing-core" -version = "0.1.31" +name = "num-integer" +version = "0.1.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a" +checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" dependencies = [ - "once_cell", + "autocfg", + "num-traits", ] [[package]] -name = "tracing-futures" -version = "0.2.5" +name = "num-traits" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97d095ae15e245a057c8e8451bab9b3ee1e1f68e9ba2b4fbc18d0ac5237835f2" +checksum = "f30b0abd723be7e2ffca1272140fac1a2f084c77ec3e123c192b66af1ee9e6c2" dependencies = [ - "pin-project", - "tracing", + "autocfg", ] [[package]] -name = "try-lock" -version = "0.2.4" +name = "once_cell" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" +checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" [[package]] -name = "typenum" -version = "1.16.0" +name = "opaque-debug" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" +checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" [[package]] -name = "uint" -version = "0.9.5" +name = "pasta_curves" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76f64bba2c53b04fcab63c01a7d7427eadc821e3bc48c34dc9ba29c501164b52" +checksum = "d3e57598f73cc7e1b2ac63c79c517b31a0877cd7c402cdcaa311b5208de7a095" dependencies = [ - "byteorder", - "crunchy", + "blake2b_simd", + "ff", + "group", "hex", + "lazy_static", + "rand", + "serde", "static_assertions", + "subtle", ] [[package]] -name = "unicase" -version = "2.7.0" +name = "paste" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7d2d4dafb69621809a81864c9c1b864479e1235c0dd4e199924b9742439ed89" -dependencies = [ - "version_check", -] +checksum = "b4b27ab7be369122c218afc2079489cdcb4b517c0a3fc386ff11e1fedfcc2b35" [[package]] -name = "unicode-bidi" -version = "0.3.13" +name = "pin-project-lite" +version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" +checksum = "4c40d25201921e5ff0c862a505c6557ea88568a4e3ace775ab55e93f2f4f9d57" [[package]] -name = "unicode-ident" -version = "1.0.10" +name = "pin-utils" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22049a19f4a68748a168c0fc439f9516686aa045927ff767eca0a85101fb6e73" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] -name = "unicode-normalization" -version = "0.1.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" +name = "plonkish_backend" +version = "0.1.0" +source = "git+https://github.com/summa-dev/plonkish?branch=feat-read-params#64274584d00c1744bae042d3007f1f9df2bb2d30" dependencies = [ - "tinyvec", + "bincode", + "bitvec", + "generic-array", + "halo2_proofs", + "halo2curves 0.3.3", + "itertools", + "num-bigint", + "num-integer", + "pasta_curves", + "poseidon", + "rand", + "rayon", + "serde", + "sha3 0.10.8", ] [[package]] -name = "unicode-xid" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" +name = "poseidon" +version = "0.2.0" +source = "git+https://github.com/han0110/poseidon?branch=feature/with-spec#fa4c2544ed38666f1f72d1c4fd0956756a7112b3" +dependencies = [ + "halo2curves 0.3.2", + "subtle", +] [[package]] -name = "url" -version = "2.4.0" +name = "ppv-lite86" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50bff7831e19200a85b17131d085c25d7811bc4e186efdaf54bbd132994a88cb" -dependencies = [ - "form_urlencoded", - "idna", - "percent-encoding", -] +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" [[package]] -name = "uuid" -version = "0.8.2" +name = "proc-macro2" +version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" +checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" dependencies = [ - "getrandom", - "serde", + "unicode-ident", ] [[package]] -name = "vcpkg" -version = "0.2.15" +name = "quote" +version = "1.0.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" +checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" +dependencies = [ + "proc-macro2", +] [[package]] -name = "version_check" -version = "0.9.4" +name = "radium" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" [[package]] -name = "walkdir" -version = "2.3.3" +name = "rand" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36df944cda56c7d8d8b7496af378e6b16de9284591917d307c9b4d313c44e698" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ - "same-file", - "winapi-util", + "libc", + "rand_chacha", + "rand_core", ] [[package]] -name = "want" +name = "rand_chacha" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" dependencies = [ - "try-lock", + "ppv-lite86", + "rand_core", ] [[package]] -name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" +name = "rand_core" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] [[package]] -name = "wasm-bindgen" -version = "0.2.87" +name = "rayon" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342" +checksum = "9c27db03db7734835b3f53954b534c91069375ce6ccaa2e065441e07d9b6cdb1" dependencies = [ - "cfg-if", - "wasm-bindgen-macro", + "either", + "rayon-core", ] [[package]] -name = "wasm-bindgen-backend" -version = "0.2.87" +name = "rayon-core" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd" +checksum = "5ce3fb6ad83f861aac485e76e1985cd109d9a3713802152be56c3b1f0e0658ed" dependencies = [ - "bumpalo", - "log", - "once_cell", - "proc-macro2", - "quote", - "syn 2.0.25", - "wasm-bindgen-shared", + "crossbeam-deque", + "crossbeam-utils", ] [[package]] -name = "wasm-bindgen-futures" -version = "0.4.37" +name = "ryu" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c02dbc21516f9f1f04f187958890d7e6026df8d16540b7ad9492bc34a67cea03" -dependencies = [ - "cfg-if", - "js-sys", - "wasm-bindgen", - "web-sys", -] +checksum = "fe232bdf6be8c8de797b22184ee71118d63780ea42ac85b61d1baa6d3b782ae9" + +[[package]] +name = "scopeguard" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" [[package]] -name = "wasm-bindgen-macro" -version = "0.2.87" +name = "serde" +version = "1.0.204" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d" +checksum = "bc76f558e0cbb2a839d37354c575f1dc3fdc6546b5be373ba43d95f231bf7c12" dependencies = [ - "quote", - "wasm-bindgen-macro-support", + "serde_derive", ] [[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.87" +name = "serde_derive" +version = "1.0.204" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" +checksum = "e0cd7e117be63d3c3678776753929474f3b04a43a080c744d6b0ae2a8c28e222" dependencies = [ "proc-macro2", "quote", - "syn 2.0.25", - "wasm-bindgen-backend", - "wasm-bindgen-shared", + "syn", ] [[package]] -name = "wasm-bindgen-shared" -version = "0.2.87" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1" - -[[package]] -name = "web-sys" -version = "0.3.64" +name = "serde_json" +version = "1.0.120" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b85cbef8c220a6abc02aefd892dfc0fc23afb1c6a426316ec33253a3877249b" +checksum = "4e0d21c9a8cae1235ad58a00c11cb40d4b1e5c784f1ef2c537876ed6ffd8b7c5" dependencies = [ - "js-sys", - "wasm-bindgen", + "itoa", + "ryu", + "serde", ] [[package]] -name = "winapi" -version = "0.3.9" +name = "sha3" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +checksum = "f81199417d4e5de3f04b1e871023acea7389672c4135918f05aa9cbf2f2fa809" dependencies = [ - "winapi-i686-pc-windows-gnu", - "winapi-x86_64-pc-windows-gnu", + "block-buffer 0.9.0", + "digest 0.9.0", + "keccak", + "opaque-debug", ] [[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" +name = "sha3" +version = "0.10.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" +checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" +dependencies = [ + "digest 0.10.7", + "keccak", +] [[package]] -name = "winapi-util" -version = "0.1.5" +name = "slab" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +checksum = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d" dependencies = [ - "winapi", + "autocfg", ] [[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" +name = "spin" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" [[package]] -name = "windows-sys" -version = "0.48.0" +name = "static_assertions" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" -dependencies = [ - "windows-targets", -] +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" [[package]] -name = "windows-targets" -version = "0.48.1" +name = "subtle" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05d4b17490f70499f20b9e791dcf6a299785ce8af4d709018206dc5b4953e95f" +checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" + +[[package]] +name = "summa-backend" +version = "0.1.0" dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", + "base64", + "bincode", + "csv", + "futures", + "halo2_proofs", + "num-bigint", + "num-traits", + "plonkish_backend", + "rand", + "serde", + "serde_json", + "summa-hyperplonk", ] [[package]] -name = "windows_aarch64_gnullvm" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" +name = "summa-hyperplonk" +version = "0.3.0" +dependencies = [ + "csv", + "halo2_proofs", + "num-bigint", + "plonkish_backend", + "rand", + "rayon", +] [[package]] -name = "windows_aarch64_msvc" -version = "0.48.0" +name = "syn" +version = "2.0.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" +checksum = "2f0209b68b3613b093e0ec905354eccaedcfe83b8cb37cbdeae64026c3064c16" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] [[package]] -name = "windows_i686_gnu" -version = "0.48.0" +name = "tap" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] -name = "windows_i686_msvc" -version = "0.48.0" +name = "tracing" +version = "0.1.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" +checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" +dependencies = [ + "cfg-if", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] [[package]] -name = "windows_x86_64_gnu" -version = "0.48.0" +name = "tracing-attributes" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" +checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] [[package]] -name = "windows_x86_64_gnullvm" -version = "0.48.0" +name = "tracing-core" +version = "0.1.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" +checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a" +dependencies = [ + "once_cell", +] [[package]] -name = "windows_x86_64_msvc" -version = "0.48.0" +name = "typenum" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" +checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" [[package]] -name = "winnow" -version = "0.4.9" +name = "unicode-ident" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81a2094c43cc94775293eaa0e499fbc30048a6d824ac82c0351a8c0bf9112529" -dependencies = [ - "memchr", -] +checksum = "22049a19f4a68748a168c0fc439f9516686aa045927ff767eca0a85101fb6e73" [[package]] -name = "winreg" -version = "0.10.1" +name = "version_check" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d" -dependencies = [ - "winapi", -] +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" [[package]] -name = "ws_stream_wasm" -version = "0.7.4" +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7999f5f4217fe3818726b66257a4475f71e74ffd190776ad053fa159e50737f5" -dependencies = [ - "async_io_stream", - "futures", - "js-sys", - "log", - "pharos", - "rustc_version", - "send_wrapper 0.6.0", - "thiserror", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", -] +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wyz" @@ -3873,15 +849,3 @@ checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" dependencies = [ "tap", ] - -[[package]] -name = "yansi" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec" - -[[package]] -name = "zeroize" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a0956f1ba7c7909bfb66c2e9e4124ab6f6482560f6628b5aaeba39207c9aad9" diff --git a/backend/Cargo.toml b/backend/Cargo.toml index 41afc304..3f9367b9 100644 --- a/backend/Cargo.toml +++ b/backend/Cargo.toml @@ -12,15 +12,9 @@ csv = "1.2.2" futures = "0.3.28" num-bigint = "0.4.3" serde = { version = "1.0.166", features = ["derive"] } -halo2_solidity_verifier = { git = "https://github.com/summa-dev/halo2-solidity-verifier", version = "0.1.0", features = ["evm"] } -ethers = { version = "2.0.7", default-features = false, features = ["ethers-solc", "legacy"] } -reqwest = { version = "0.11", features = ["json"] } serde_json = "1.0.64" -tokio = { version = "1.7.1", features = ["full"] } base64 = "0.13" bincode = "1.3.3" num-traits = "0.2.14" rand = "0.8.5" - -[build-dependencies] -ethers = { version = "2.0.7", default-features = false, features = ["ethers-solc", "legacy"] } +plonkish_backend = { git = "https://github.com/summa-dev/plonkish", branch="feat-read-params", package = "plonkish_backend", features= ["frontend-halo2", "benchmark"] } diff --git a/backend/README.md b/backend/README.md index 59905f15..18a755d3 100644 --- a/backend/README.md +++ b/backend/README.md @@ -7,141 +7,112 @@ This directory contains the backend implementation for the Summa Proof of Solven ### Round The `Round` component represents a specific period or cycle in the Summa Proof of Solvency protocol. It encapsulates the state of the system at a given time, including the snapshot of assets and liabilities, as well as the associated proofs. -The `Round` struct integrates with the `Snapshot` and `SummaSigner` to facilitate the generation and submission of proofs to the contract. +The `Round` struct integrates with the `Snapshot` to facilitate the generation of proofs. Key Features: - Initialization of a new round with specific parameters. - Building a snapshot of the current state. -- Submitting commitment to the contract. +- Generating commitment and verifier parameters used in the verification process. - Retrieving proofs of inclusion for specific users. -### AddressOwnership +## Prerequisites -The `AddressOwnership` component is responsible for managing and verifying the ownership of addresses. It ensures that addresses used in the protocol owned by the respective participants. This component interacts with the `SummaSigner` to submit proofs of address ownership to on-chain. +Before testing or running the Summa backend, you must download the ptau file, which contains the Powers of Tau trusted setup parameters essential for building the Summa circuits. Specifically, the `hyperplonk-srs-17` file is required for the [Summa flow](./examples/summa_solvency_flow.rs) example and its associated test case. -Key Features: +You can generate this through `hyperplonk-srs-generator` in [summa-dev/plonkish](https://github.com/summa-dev/plonkish). Also, It can be downloaded `hyperplonk-srs-17`, use the following command: -- Initialization with specific signer details. -- Dispatching proofs of address ownership to the contract. +```bash +wget https://summa-solvency.s3.eu-central-1.amazonaws.com/trusted-setup-hyperplonk2kzg/hyperplonk-srs-17 +``` -## Prerequisites +
+Additional hermez files are available here -Before testing or running the Summa backend, the ptau file, containing the Powers of Tau trusted setup parameters essential for building the ZK circuits, must be downloaded. Specifically, the `hermez-raw-17` file is required for the [Summa flow](./examples/summa_solvency_flow.rs) example and its associated test case. +| Curve | Source | K | File in raw format | +| ------- | ------- | ---- | -------------------------------------------------------------------------------------------------------------------- | +| `bn254` | `hermez`| `17` | [hyperplonk-srs-17](https://summa-solvency.s3.eu-central-1.amazonaws.com/trusted-setup-hyperplonk2kzg/hyperplonk-srs-17) | +| `bn254` | `hermez`| `18` | [hyperplonk-srs-18](https://summa-solvency.s3.eu-central-1.amazonaws.com/trusted-setup-hyperplonk2kzg/hyperplonk-srs-18) | +| `bn254` | `hermez`| `19` | [hyperplonk-srs-19](https://summa-solvency.s3.eu-central-1.amazonaws.com/trusted-setup-hyperplonk2kzg/hyperplonk-srs-19) | +| `bn254` | `hermez`| `20` | [hyperplonk-srs-20](https://summa-solvency.s3.eu-central-1.amazonaws.com/trusted-setup-hyperplonk2kzg/hyperplonk-srs-20) | +| `bn254` | `hermez`| `21` | [hyperplonk-srs-21](https://summa-solvency.s3.eu-central-1.amazonaws.com/trusted-setup-hyperplonk2kzg/hyperplonk-srs-21) | +| `bn254` | `hermez`| `22` | [hyperplonk-srs-22](https://summa-solvency.s3.eu-central-1.amazonaws.com/trusted-setup-hyperplonk2kzg/hyperplonk-srs-22) | +| `bn254` | `hermez`| `23` | [hyperplonk-srs-23](https://summa-solvency.s3.eu-central-1.amazonaws.com/trusted-setup-hyperplonk2kzg/hyperplonk-srs-23) | +| `bn254` | `hermez`| `24` | [hyperplonk-srs-24](https://summa-solvency.s3.eu-central-1.amazonaws.com/trusted-setup-hyperplonk2kzg/hyperplonk-srs-24) | +| `bn254` | `hermez`| `25` | [hyperplonk-srs-25](https://summa-solvency.s3.eu-central-1.amazonaws.com/trusted-setup-hyperplonk2kzg/hyperplonk-srs-25) | -You can find this and other necessary files at https://github.com/han0110/halo2-kzg-srs. To download `hermez-raw-17`, use the command: +Note that these files are generated for testing purposes only. They are created temporarily and are not produced through a formal ceremony process. -``` -wget https://trusted-setup-halo2kzg.s3.eu-central-1.amazonaws.com/hermez-raw-17 -``` +

Ensure this file is downloaded before proceeding with the example or test case. ## Running Test -To build the binary executable and test it +To build the binary executable and test it, use the following commands: -``` +```bash cargo build cargo test --release -- --nocapture ``` -## Important Notices - -### Generating and updating verifier contract for Backend - -The verifier contract in the backend were generated using a predefined set of parameters: `N_CURRENCIES = 2`, `N_USERS = 16` and `K = 17` as indicated [here](../prover/bin/gen_verifier.rs#L26-L28) -If you intend to work with different parameters, you'll need to adjust these hard-coded values and then generate new verifier contract. - -The process described below assists in both generating the verifier and updating the Summa contract, which integrates the new verifier as constructors. - -#### Using the Bash Script - -We have provided a bash script to automate the process of updating the verifier contract and the Summa contract. To use the script: - -Ensure you have the necessary permissions to execute the script. - -``` -backend $ scripts/update_verifier_contract.sh -``` - ## Summa solvency flow example -This example illustrates how Summa interacts with the Summa contract and the user side. +This example illustrates how Summa can generate commitment proofs and verifier parameters, and then verify inclusion proofs on the user side. To execute this example, use the command: -``` +```bash cargo run --release --example summa_solvency_flow ``` -### 1. Submitting Address Ownership to the Summa Contract +### 1. Generate Commitment -First, we submit proof of address ownership to the Summa contract. This is a critical step to register these proofs on-chain, facilitating the validation of asset ownership within Summa. +The CEX must publicly share a commitment for each round. This commitment consists of a timestamp, a grand sum proof, and total balances. -Key points: +Without the CEX publishing the commitment, users cannot verify their inclusion proofs. This is because the inclusion verifier function internally requires the commitment, which is a SNARK proof along with Verifier Parameters. -- An instance of `AddressOwnership`, named `address_ownership_client`, is initialized with the `signatures.csv` file, which contains the signature data. +In this step, we'll guide you through the process of generating a commitment using the `Round` component. +The `Round` serves as the core of the backend in Summa, and we have briefly described it in the Components section. -- The `dispatch_proof_of_address_ownership` function sends a transaction to the Summa contract to register CEX-owned addresses. +To initialize the `Round` instance, you'll need the paths to the liabilities CSV file (`entry_16.csv`) and the SRS (`hyperplonk-srs-17`) file. These files serve the following purposes: -Note: This demonstration takes place in a test environment. In real-world production, always ensure that the Summa contract is correctly deployed on the target chain. +- `entry_16.csv`: contains the username and liabilities entries for each CEX user (necessary to build the commitment). Liabilities column names have the following format: `balance__`, where and are the names of the cryptocurrencies and their corresponding blockchains. +- `ptau/hyperplonk-srs-17`: contains parameters for constructing the zk circuits. -If executed successfully, you'll see: +If this step runs successfully, you will see the following message: +```bash +1. Commitment and Verifier Parameters successfully Exported! ``` -1. Ownership proofs are submitted successfully! -``` - -### 2. Submit Commitment - -The CEX must submit a commitment to the Summa contract for each round. This commitment consists of a timestamp, a SNARK proof, a grand sum proof and total balances. - -Without CEX publishing the commitment, users cannot verify their inclusion proof on the Summa contract. This is because the inclusion verifier function internally requires the SNARK proof, but users only know the timestamp associated with the round and the verifier functions does not requre the SNARK proof directly. -In here, we'll introduce you through the process of submitting a commitment using the `Round` to the Summa contract. -The Round serves as the core of the backend in Summa, and we have briefly described it in the Components section. +### 2. Generating and Exporting Inclusion Proofs -To initialize the `Round` instance, you'll need paths to the liabilities CSV file (`entry_16.csv`) and the `ptau/hermez-raw-17` file. The files serve the following purpose: +Assuming you're a CEX, after committing the commitment publicly, you should generate inclusion proofs for every user. This proof verifies the presence of specific elements in the polynomials encoding the username and balances. -- `entry_16.csv`: contains the username and liabilities entries for each CEX user (necessary to build the commitment). Liabilities column names have the following format: `balance__`, where and are the names of the cryptocurrencies and their corresponding blockchains. values are the same as in the Address Ownership Proof step; -- `ptau/hermez-raw-17`: contains parameters for constructing the zk circuits. - -Using the `Round` instance, the solvency proof is dispatched to the Summa contract with the `dispatch_solvency_proof` method. - -If this step successfully ran, you can see this message: - -``` -2. Solvency proof is submitted successfully! -``` - -### 3. Generating and Exporting Inclusion Proofs - -Assuming you're a CEX, after committing the commitment and ownership proofs to the Summa contract, you should generate inclusion proofs for every user. This proof verifies the presence of specific elements in the polynomials encoding the username, balances. - -After generating the inclusion proof, it's transformed into a JSON format for easy sharing. +After generating the inclusion proof, it is transformed into a JSON format for easy sharing. Upon successful execution, you'll find a file named `user_0_proof.json` and see the following message: +```bash +2. Exported proof to user #0, as `user_0_proof.json`, with verifier params `verifier_params.json` ``` -3. Exported proof to user #0, as `user_0_proof.json` -``` -### 4. Verify Proof of Inclusion +Note that the `verifier_params.json` file can be used in any other round unless the same circuit configurations, such as `N_CURRENCIES` and `K`. + +### 3. Verify Proof of Inclusion This is the final step in the Summa process and the only part that occurs on the user side. -Users receive the proof for a specific round and use methods available on the deployed Summa contract. Importantly, the Summa contract verifier function is a view function, meaning it doesn't consume gas or change the blockchain's state. +Users receive the proof and commitment for a specific round along with the verifier parameters. Unlike the commitment and proof, the verifier parameters are independent of the round. Moreover, users have the option to generate the verifier parameters themselves, instead of fetching them from the CEX. In this step, the user has to: -- Ensure the user values in the proof file aligns with `username` and `balances` provided by the CEX. -- Submit the proof to the `verify_inclusion_proof` method on the Summa contract. +- Ensure that the user values in the proof file align with the `username` and `balances` provided by the CEX. +- Perform the verifier locally with commitment and verifier parameters files. -The result will display as: +The result will be displayed as: +```bash +3. Verified the proof with veirifer parameters for User #0: true ``` -4. Verifying the proof on contract verifier for User #0: true -``` - -**Note:** In a production environment, users can independently verify their proof using public interfaces, such as Etherscan. diff --git a/backend/build.rs b/backend/build.rs deleted file mode 100644 index 213e4e66..00000000 --- a/backend/build.rs +++ /dev/null @@ -1,91 +0,0 @@ -use ethers::prelude::Abigen; -use std::{fs::OpenOptions, io::Write, path::PathBuf}; - -fn main() { - let contracts = [ - ( - "src/contracts/generated/summa_contract.rs", - "Summa", - "Summa", - ), - ( - "src/contracts/generated/verifying_key.rs", - "Halo2VerifyingKey", - "VerifyingKey", - ), - ( - "src/contracts/generated/snark_verifier.rs", - "Verifier", - "SnarkVerifier", - ), - ( - "src/contracts/generated/grandsum_verifier.rs", - "GrandSumVerifier", - "GrandSumVerifier", - ), - ( - "src/contracts/generated/inclusion_verifier.rs", - "InclusionVerifier", - "InclusionVerifier", - ), - ]; - - let mut submodule_names = Vec::new(); - for (out_path, contract_name, abi_source) in contracts.iter() { - if let Some(submodule_name) = - generate_rust_contract_interface(out_path, contract_name, abi_source) - { - submodule_names.push(submodule_name); - } - } - - let mod_out_file: PathBuf = std::env::current_dir() - .unwrap() - .join("src/contracts/generated/mod.rs"); - if mod_out_file.exists() { - std::fs::remove_file(&mod_out_file).unwrap(); - } - - let mut mod_file = OpenOptions::new() - .write(true) - .create(true) - .open(mod_out_file) - .unwrap(); - - let final_content = submodule_names - .iter() - .map(|name| format!("pub mod {};", name)) - .collect::>() - .join("\n"); - - mod_file.write_all(final_content.as_bytes()).unwrap(); -} - -fn generate_rust_contract_interface<'a>( - out_path: &'a str, - contract_name: &str, - abi_source: &str, -) -> Option<&'a str> { - let contract_out_file = std::env::current_dir().unwrap().join(out_path); - if contract_out_file.exists() { - std::fs::remove_file(&contract_out_file).unwrap(); - } - - Abigen::new( - contract_name, - format!("./src/contracts/abi/{}.json", abi_source), - ) - .unwrap() - .format(true) - .generate() - .unwrap() - .write_to_file(contract_out_file) - .unwrap(); - - let submodule_name = out_path - .rsplit('/') // Split the string from the right at each / - .next() // Take the substring right after the last / - .and_then(|s| s.split('.').next()); // Take the substring before the first . (from the right) - - submodule_name -} diff --git a/backend/examples/summa_solvency_flow.rs b/backend/examples/summa_solvency_flow.rs index 953a040d..44a59a7d 100644 --- a/backend/examples/summa_solvency_flow.rs +++ b/backend/examples/summa_solvency_flow.rs @@ -1,26 +1,29 @@ #![feature(generic_const_exprs)] -use std::{error::Error, fs::File, io::BufReader, io::Write}; +use std::{fs::File, io::Write}; -use ethers::types::U256; -use halo2_proofs::halo2curves::bn256::Fr as Fp; -use serde_json::{from_reader, to_string_pretty}; +use serde_json::to_string_pretty; -use summa_backend::{ - apis::{ - address_ownership::AddressOwnership, - round::{KZGProof, Round}, +use plonkish_backend::{ + backend::{ + hyperplonk::{HyperPlonk, HyperPlonkVerifierParam}, + PlonkishBackend, PlonkishCircuit, }, - contracts::signer::{AddressInput, SummaSigner}, - tests::initialize_test_env, -}; -use summa_solvency::{ - circuits::{ - univariate_grand_sum::{UnivariateGrandSum, UnivariateGrandSumConfig}, - utils::{full_prover, generate_setup_artifacts}, + frontend::halo2::Halo2Circuit, + halo2_curves::bn256::{Bn256, Fr as Fp}, + pcs::{multilinear::MultilinearKzg, Evaluation, PolynomialCommitmentScheme}, + util::{ + test::seeded_std_rng, + transcript::{FieldTranscriptRead, InMemoryTranscript, Keccak256Transcript}, }, - cryptocurrency::Cryptocurrency, - entry::Entry, - utils::parse_csv_to_entries, +}; + +use summa_backend::{ + apis::round::{KZGProof, Round}, + load_from_file, save_to_file, +}; +use summa_hyperplonk::{ + circuits::summa_circuit::summa_hyperplonk::SummaHyperplonk, cryptocurrency::Cryptocurrency, + entry::Entry, utils::parse_csv_to_entries, }; const K: u32 = 17; @@ -28,144 +31,142 @@ const N_CURRENCIES: usize = 2; const N_USERS: usize = 16; const USER_INDEX: usize = 0; -#[tokio::main] -async fn main() -> Result<(), Box> { - // Initialize test environment without `address_ownership` instance from `initialize_test_env` function. - let (anvil, _, _, _, summa_contract) = initialize_test_env(None).await; - - // 1. Submit ownership proof - // - // The signer instance would be shared with `address_ownership` and `round` instances - // - // Using `AddressInput::Address`` to directly provide the summa_contract's address. - // - // If the address of a deployed contract is stored in a configuration file, - // you can use `AddressInput::Path` to provide the path to that file. - // - // For example, if the contract address is in "backend/src/contracts/deployments.json" located - // you would use `AddressInput::Path` as follows:`AddressInput::Path("backend/src/contracts/deployments.json".to_string())`. - // - let signer = SummaSigner::new( - "0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80", - anvil.endpoint().as_str(), - AddressInput::Address(summa_contract.address()), - ) - .await?; - - // Each CEX prepares its own `signature` CSV file. - let signature_csv_path = "../csv/signatures.csv"; - let mut address_ownership_client = AddressOwnership::new(&signer, signature_csv_path).unwrap(); +fn main() { + type ProvingBackend = HyperPlonk>; - // Dispatch the proof of address ownership. - // the `dispatch_proof_of_address_ownership` function sends a transaction to the Summa contract. - address_ownership_client - .dispatch_proof_of_address_ownership() - .await?; - - println!("1. Ownership proofs are submitted successfully!"); - - // 2. Submit Commitment + // 1. Generate Commitment // - // Initialize the `Round` instance to submit the liability commitment. + // Initialize the `Round` instance to generate the commitment and verifier parameters. let entry_csv = "../csv/entry_16.csv"; let mut entries: Vec> = vec![Entry::init_empty(); N_USERS]; let mut cryptos = vec![Cryptocurrency::init_empty(); N_CURRENCIES]; parse_csv_to_entries::<&str, N_CURRENCIES>(entry_csv, &mut entries, &mut cryptos).unwrap(); - let univariate_grand_sum_circuit = UnivariateGrandSum::< - N_USERS, - N_CURRENCIES, - UnivariateGrandSumConfig, - >::init(entries.to_vec()); - - // This ptau file is also utilized in the generation of the verifier contract. - // It corresponds to the same file used in the `gen_verifier.rs` script. - let params_path = "../backend/ptau/hermez-raw-17"; - let (params, pk, vk) = - generate_setup_artifacts(K, Some(params_path), &univariate_grand_sum_circuit).unwrap(); - - // Create a proof - let instances = vec![Fp::zero(); 1]; // This instance is necessary to verify proof on solidity verifier. - let (zk_snark_proof, advice_polys, _) = full_prover( - ¶ms, - &pk, - univariate_grand_sum_circuit.clone(), - &[instances.clone()], - ); + let circuit = SummaHyperplonk::::init(entries.to_vec()); + let num_vars = K; + + let circuit_fn = |num_vars, initialized_circuit| { + let circuit = Halo2Circuit::>::new::< + ProvingBackend, + >(num_vars, initialized_circuit); + (circuit.circuit_info().unwrap(), circuit) + }; - // Using the `round` instance, the commitment is dispatched to the Summa contract with the `dispatch_commitment` method. - let timestamp = 1u64; + let (circuit_info, circuit) = circuit_fn(num_vars as usize, circuit); + let instances = circuit.instances(); + + let param = ProvingBackend::setup_custom("../backend/ptau/hyperplonk-srs-17").unwrap(); + let (pp, vp) = ProvingBackend::preprocess(¶m, &circuit_info).unwrap(); + + let (advice_polys, proof_transcript) = { + let mut proof_transcript = Keccak256Transcript::new(()); + + let advice_polys = + ProvingBackend::prove(&pp, &circuit, &mut proof_transcript, seeded_std_rng()).unwrap(); + (advice_polys, proof_transcript) + }; + + let zk_snark_proof = proof_transcript.into_proof(); + + // Simple check of the proof before initializing the `Round` instance. + let mut transcript; + let result: Result<(), plonkish_backend::Error> = { + transcript = Keccak256Transcript::from_proof((), zk_snark_proof.as_slice()); + ProvingBackend::verify(&vp, instances, &mut transcript, seeded_std_rng()) + }; + assert_eq!(result, Ok(())); + + // Using the `round` instance, the custodian can get commitment proof and verifier params. + let snapshot_time = 1u64; let mut round = Round::::new( - &signer, - zk_snark_proof, + zk_snark_proof.clone(), advice_polys, - params, - vk, - timestamp, + pp, + vp.clone(), + snapshot_time, ); - // Sends the commitment, which should ideally complete without errors. - round.dispatch_commitment().await?; + // The commitment and verifier parameters should be publicly available to all users. + let (zk_proof, vp) = round.gen_commitment_and_vp().unwrap(); + + let vp_filename = "verifier_params.json"; + let _ = save_to_file::<_, HyperPlonkVerifierParam>>(vp_filename, &vp); - println!("2. Commitment is submitted successfully!"); + let commitment_proof_filename = "commitment_proof.json"; + let _ = save_to_file::<_, KZGProof>(commitment_proof_filename, &zk_proof); - // 3. Generate Inclusion Proof + println!("1. Commitment and Verifier Parameters successfully Exported!"); + + // 2. Generate Inclusion Proof // - // Generate and export the inclusion proof for the specified user to a JSON file. + // Generate then export the inclusion proof for the specified user to a JSON file. let inclusion_proof = round.get_proof_of_inclusion(USER_INDEX).unwrap(); - let filename = format!("user_{}_proof.json", USER_INDEX); - let mut file = File::create(filename.clone()).expect("Unable to create file"); + let proof_filename = format!("user_{}_proof.json", USER_INDEX); + let mut file = File::create(proof_filename.clone()).expect("Unable to create inclusion file"); let output = to_string_pretty(&inclusion_proof).unwrap(); file.write_all(output.as_bytes()) - .expect("Failed to write JSON to file"); + .expect("Failed to write inclusion proof to a JSON file"); + + let _ = save_to_file("user_proof.json", &inclusion_proof); println!( - "3. Exported proof to user #{}, as `{}`", - USER_INDEX, filename + "2. Exported proof to user #{}, as `{}`, with verifier params `{}`", + USER_INDEX, proof_filename, vp_filename ); - // 4. Verify Inclusion Proof + // 3. Verify Inclusion Proof // - // The `snapshot_time` denotes the specific moment when entries were created for polynomal interpolation. - // This timestamp is established during the initialization of the Round instance. - let snapshot_time = U256::from(timestamp); + // Users can generate verifier parameters using only the configurations for "N_CURRENCIES" and "N_USERS", along with the SRS. + let dummy_circuit = SummaHyperplonk::::init_empty(); + + let (circuit_info, _) = circuit_fn(num_vars as usize, dummy_circuit); + + let param = ProvingBackend::setup_custom("../backend/ptau/hyperplonk-srs-17").unwrap(); + let (_, verifier_params) = ProvingBackend::preprocess(¶m, &circuit_info).unwrap(); + + let loaded_verifier_params: HyperPlonkVerifierParam> = + load_from_file(vp_filename).unwrap(); + + // Load the commitment from the files + let commitment: KZGProof = load_from_file(commitment_proof_filename).unwrap(); // When verifying the inclusion proof from the user's perspective, the user have to fetch `proof`. - // Assume that the `proof` file has been downloaded from the CEX. - let proof_file = File::open(format!("user_{}_proof.json", USER_INDEX))?; - let reader = BufReader::new(proof_file); - - let downloaded_inclusion_proof: KZGProof = from_reader(reader)?; - - // Fetch commitment data from the contract with timestamp, `snapshot_time`. - let commitment = summa_contract.commitments(snapshot_time).call().await?; - - // Ensure the length of the commitment matches the expected size for the number of points. - assert_eq!(commitment.to_vec().len(), 0x40 * (N_CURRENCIES + 1)); - - // Validate the inclusion proof using the contract verifier. - let mut verification_result = false; - - if let Some(challenges) = downloaded_inclusion_proof.get_challenge().as_ref() { - verification_result = summa_contract - .verify_inclusion_proof( - snapshot_time, - inclusion_proof.get_proof().clone(), - challenges.clone(), - inclusion_proof.get_input_values().clone(), - ) - .await?; - } else { - eprintln!("No challenges found in the proof, This may not a inclusion proof"); + // Assume that the `proof` file has been downloaded from the CEX along with commitment and verifier parameters. + let proof: KZGProof = load_from_file(format!("user_{}_proof.json", USER_INDEX)) + .expect("Failed to load proof from JSON file"); + + // Load commitment from the commitment file + let mut transcript = Keccak256Transcript::from_proof((), commitment.get_proof().as_slice()); + let user_entry_commitments = MultilinearKzg::::read_commitments( + &verifier_params.pcs, + N_CURRENCIES + 1, + &mut transcript, + ) + .unwrap(); + + let mut kzg_transcript = Keccak256Transcript::from_proof((), proof.get_proof().as_slice()); + let mut multivariate_challenge: Vec = Vec::new(); + for _ in 0..num_vars { + multivariate_challenge.push(kzg_transcript.read_field_element().unwrap()); } + let input_values = proof.get_input_values(); + let evals: Vec> = (0..N_CURRENCIES + 1) + .map(|i| Evaluation::new(i, 0, input_values[i])) + .collect(); + + MultilinearKzg::::batch_verify( + &verifier_params.pcs, + &user_entry_commitments, + &[multivariate_challenge.clone()], + &evals, + &mut kzg_transcript, + ) + .unwrap(); + println!( - "4. Verifying the proof on contract veirifer for User #{}: {}", - USER_INDEX, verification_result + "3. Verified the proof with veirifer parameters for User #{}", + USER_INDEX ); - - // Wrapping up - drop(anvil); - Ok(()) } diff --git a/backend/ptau/hermez-raw-11 b/backend/ptau/hermez-raw-11 deleted file mode 100644 index 2205b729..00000000 Binary files a/backend/ptau/hermez-raw-11 and /dev/null differ diff --git a/backend/ptau/hermez-raw-17 b/backend/ptau/hyperplonk-srs-17 similarity index 65% rename from backend/ptau/hermez-raw-17 rename to backend/ptau/hyperplonk-srs-17 index 8dc765eb..28d31dca 100644 Binary files a/backend/ptau/hermez-raw-17 and b/backend/ptau/hyperplonk-srs-17 differ diff --git a/backend/scripts/update_verifier_contract.sh b/backend/scripts/update_verifier_contract.sh deleted file mode 100755 index 91a70a93..00000000 --- a/backend/scripts/update_verifier_contract.sh +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/bash -set -e - -# Build the verifier contract -echo "1. Building verifier contracts" -cd ../prover -cargo run --release --bin generate_verifier - -# Generate Commitment and Proofs for Encoded Polynomials -echo "2. Generate Commitment and Proofs for Encoded Polynomials" -cd ../prover -cargo run --release --bin generate_commitment_and_proofs - -# Deploy contracts to local environment -echo "3. Deploying contracts to local environment" -cd ../contracts -npm install -npx hardhat run scripts/deploy.ts - -# Generate interface files for Backend -echo "4. Generating interface files for Backend" -cd ../backend -cargo build diff --git a/backend/src/apis/address_ownership.rs b/backend/src/apis/address_ownership.rs deleted file mode 100644 index 42a405d1..00000000 --- a/backend/src/apis/address_ownership.rs +++ /dev/null @@ -1,38 +0,0 @@ -use crate::contracts::{generated::summa_contract::AddressOwnershipProof, signer::SummaSigner}; -use std::{error::Error, result::Result}; - -use super::csv_parser::parse_signature_csv; - -pub struct AddressOwnership<'a> { - address_ownership_proofs: Vec, - signer: &'a SummaSigner, -} - -impl AddressOwnership<'_> { - pub fn new<'a>( - signer: &'a SummaSigner, - signature_csv_path: &str, - ) -> Result, Box> { - let address_ownership_proofs = parse_signature_csv(signature_csv_path)?; - - Ok(AddressOwnership { - address_ownership_proofs, - signer, - }) - } - - pub fn get_ownership_proofs(&self) -> &Vec { - &self.address_ownership_proofs - } - - // This function dispatches the proof of address ownership. Before calling this function, - // ensure externally that the provided `addresses` in `address_ownership_proof` are not already registered - // on the Summa contract. - pub async fn dispatch_proof_of_address_ownership(&mut self) -> Result<(), Box> { - self.signer - .submit_proof_of_address_ownership(self.address_ownership_proofs.clone()) - .await?; - - Ok(()) - } -} diff --git a/backend/src/apis/csv_parser.rs b/backend/src/apis/csv_parser.rs deleted file mode 100644 index 672fd14d..00000000 --- a/backend/src/apis/csv_parser.rs +++ /dev/null @@ -1,68 +0,0 @@ -use std::{error::Error, fs::File, path::Path}; - -use ethers::{abi::AbiEncode, types::Bytes}; -use serde::{Deserialize, Serialize}; - -use crate::contracts::generated::summa_contract::AddressOwnershipProof; - -#[derive(Debug, Deserialize, Serialize)] -pub struct SignatureRecord { - chain: String, - address: String, - signature: String, - message: String, -} - -impl SignatureRecord { - pub fn new(chain: String, address: String, signature: String, message: String) -> Self { - Self { - chain, - address, - signature, - message, - } - } -} - -pub fn parse_signature_csv>( - path: P, -) -> Result, Box> { - let file = File::open(path)?; - let mut rdr = csv::ReaderBuilder::new().delimiter(b';').from_reader(file); - - let mut address_ownership_proofs = Vec::::new(); - - for result in rdr.deserialize() { - let record: SignatureRecord = result?; - - address_ownership_proofs.push(AddressOwnershipProof { - cex_address: record.address.to_string(), - chain: record.chain.to_string(), - signature: record.signature.parse()?, - message: Bytes::from(record.message.encode()), - }); - } - - Ok(address_ownership_proofs) -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn test_parse_csv_to_signature() { - let path = "../csv/signatures.csv"; - let address_ownership = parse_signature_csv(path).unwrap(); - - let first_address_ownership = AddressOwnershipProof { - chain: "ETH".to_string(), - cex_address: "0x70997970C51812dc3A010C7d01b50e0d17dc79C8".to_string(), - signature: - ("0x089b32327d332c295dc3b8873c205b72153211de6dc1c51235782b091cefb9d06d6df2661b86a7d441cd322f125b84901486b150e684221a7b7636eb8182af551b").parse().unwrap(), - message: "Summa proof of solvency for CryptoExchange".encode().into(), - }; - - assert_eq!(address_ownership[0], first_address_ownership); - } -} diff --git a/backend/src/apis/mod.rs b/backend/src/apis/mod.rs index 82fca001..1449dc2f 100644 --- a/backend/src/apis/mod.rs +++ b/backend/src/apis/mod.rs @@ -1,3 +1 @@ -pub mod address_ownership; -pub mod csv_parser; pub mod round; diff --git a/backend/src/apis/round.rs b/backend/src/apis/round.rs index da1b0d34..4afcb04f 100644 --- a/backend/src/apis/round.rs +++ b/backend/src/apis/round.rs @@ -1,42 +1,36 @@ -use ethers::types::{Bytes, U256}; -use halo2_proofs::{ - arithmetic::{best_fft, Field}, - halo2curves::{ - bn256::{Bn256, Fr as Fp, G1Affine, G2Affine}, - group::{cofactor::CofactorCurveAffine, Curve}, +use plonkish_backend::{ + backend::hyperplonk::{HyperPlonkProverParam, HyperPlonkVerifierParam}, + halo2_curves::bn256::{Bn256, Fr as Fp}, + pcs::{multilinear::MultilinearKzg, Evaluation, PolynomialCommitmentScheme}, + poly::multilinear::MultilinearPolynomial, + util::{ + transcript::{FieldTranscriptWrite, InMemoryTranscript, Keccak256Transcript}, + Itertools, }, - plonk::{AdviceSingle, VerifyingKey}, - poly::{ - kzg::commitment::{KZGCommitmentScheme, ParamsKZG}, - Coeff, - }, - transcript::TranscriptRead, }; -use halo2_solidity_verifier::Keccak256Transcript; + use serde::{Deserialize, Serialize}; use std::error::Error; +use summa_hyperplonk::utils::uni_to_multivar_binary_index; -use crate::contracts::signer::SummaSigner; -use summa_solvency::utils::amortized_kzg::{create_naive_kzg_proof, verify_kzg_proof}; - -#[derive(Debug, Clone, Serialize, Deserialize)] +#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] pub struct KZGProof { - proof_calldata: Bytes, - input_values: Vec, - challenge_s_g2: Option>, + proof: Vec, + input_values: Vec, + challenge: Option>, } impl KZGProof { - pub fn get_input_values(&self) -> &Vec { + pub fn get_input_values(&self) -> &Vec { &self.input_values } - pub fn get_proof(&self) -> &Bytes { - &self.proof_calldata + pub fn get_proof(&self) -> &Vec { + &self.proof } - pub fn get_challenge(&self) -> &Option> { - &self.challenge_s_g2 + pub fn get_challenge(&self) -> &Option> { + &self.challenge } } @@ -54,35 +48,31 @@ impl KZGProof { /// * `timestamp`: A Unix timestamp marking the initiation of this round. It serves as a temporal reference point /// for the operations carried out in this phase of the protocol. /// * `snapshot`: A `Snapshot` struct capturing the round's state, including user identities and balances. -/// * `signer`: A reference to a `SummaSigner`, the entity responsible for signing transactions with the Summa contract in this round. /// -pub struct Round<'a, const N_CURRENCIES: usize, const N_USERS: usize> { +pub struct Round { timestamp: u64, snapshot: Snapshot, - signer: &'a SummaSigner, } -impl Round<'_, N_CURRENCIES, N_USERS> +impl Round where [usize; N_CURRENCIES + 1]: Sized, { pub fn new( - signer: &SummaSigner, zk_snark_proof: Vec, - advice_polys: AdviceSingle, - params: ParamsKZG, - verifying_key: VerifyingKey, + advice_polys: Vec>, + prover_params: HyperPlonkProverParam>, + verifier_params: HyperPlonkVerifierParam>, timestamp: u64, - ) -> Round<'_, N_CURRENCIES, N_USERS> { + ) -> Round { Round { timestamp, snapshot: Snapshot::::new( zk_snark_proof, advice_polys, - params, - verifying_key, + prover_params, + verifier_params, ), - signer, } } @@ -90,16 +80,15 @@ where self.timestamp } - pub async fn dispatch_commitment(&mut self) -> Result<(), Box> { + /// This method returns the commitment proof and verification parameters for verifying proofs. + /// Both the commitment and verification parameters should be posted publicly. + #[allow(clippy::complexity)] + pub fn gen_commitment_and_vp( + &mut self, + ) -> Result<(KZGProof, HyperPlonkVerifierParam>), Box> + { let grand_sum_proof = self.snapshot.generate_grand_sum_proof().unwrap(); - let submit_tx = self.signer.submit_commitment( - Bytes::from(self.snapshot.zk_snark_proof.clone()), - grand_sum_proof.proof_calldata, - grand_sum_proof.input_values, - self.timestamp.into(), - ); - - submit_tx.await + Ok((grand_sum_proof, self.snapshot.verifier_params.clone())) } pub fn get_proof_of_inclusion(&self, user_index: usize) -> Result { @@ -111,16 +100,16 @@ where /// /// # Fields /// -/// * `zk_snark_proof`: The zk-SNARK proof for the round, which is used to verify the validity of the round's commitments. +/// * `zk_snark_proof`: The zk-SNARK proof for the round, which is used to verify the validity of the round's commitment. /// * `advice_polys`: Composed of the unblinded advice polynomial, `advice_poly`, and the polynomials of blind factors, `advice_blind`. -/// * `params`: The parameters for the KZG commitment scheme. -/// * `verifying_key`: The verifying key for getting domains, which is used for generating inclusion proofs. +/// * `prover_params`: The parameters for generating KZG proofs, which are commitment and inclusions. +/// * `verifier_params`: The verifying params for verifying inclusion proofs. /// pub struct Snapshot { zk_snark_proof: Vec, - advice_polys: AdviceSingle, - params: ParamsKZG, - verifying_key: VerifyingKey, + advice_polys: Vec>, + prover_params: HyperPlonkProverParam>, + verifier_params: HyperPlonkVerifierParam>, } impl Snapshot @@ -129,121 +118,85 @@ where { pub fn new( zk_snark_proof: Vec, - advice_polys: AdviceSingle, - params: ParamsKZG, - verifying_key: VerifyingKey, + advice_polys: Vec>, + prover_params: HyperPlonkProverParam>, + verifier_params: HyperPlonkVerifierParam>, ) -> Self { Snapshot { zk_snark_proof, advice_polys, - params, - verifying_key, + prover_params, + verifier_params, } } pub fn generate_grand_sum_proof(&self) -> Result { - let challenge = Fp::zero(); - let (proof_calldata, input_values) = self.generate_kzg_proof(None, challenge).unwrap(); + let mut input_values = vec![Fp::zero(); N_CURRENCIES + 1]; + + // First input values as instance would be zero like Summa V2 + for i in 1..N_CURRENCIES + 1 { + let poly = self.advice_polys.get(i).unwrap(); + input_values[i] = poly.evals().iter().fold(Fp::zero(), |acc, x| acc + x); + } Ok(KZGProof { - proof_calldata, + proof: self.zk_snark_proof.clone(), input_values, - challenge_s_g2: None, + challenge: None, }) } pub fn generate_proof_of_inclusion(&self, user_index: usize) -> Result { - let omega = self.verifying_key.get_domain().get_omega(); - let challenge = omega.pow_vartime([user_index as u64]); - let (proof_calldata, input_values) = self - .generate_kzg_proof(Some(user_index), challenge) - .unwrap(); - - // Prepare S_G2 points with the challenge for proof verification on the KZG Solidity verifier. - let s_g2 = -self.params.s_g2() + (G2Affine::generator() * challenge); - let s_g2_affine = s_g2.to_affine(); - - let s_g2_point = vec![ - U256::from_little_endian(s_g2_affine.x.c1.to_bytes().as_slice()), - U256::from_little_endian(s_g2_affine.x.c0.to_bytes().as_slice()), - U256::from_little_endian(s_g2_affine.y.c1.to_bytes().as_slice()), - U256::from_little_endian(s_g2_affine.y.c0.to_bytes().as_slice()), - ]; + let num_vars = self.prover_params.pcs.num_vars(); + let multivariate_challenge: Vec = uni_to_multivar_binary_index(&user_index, num_vars); - Ok(KZGProof { - proof_calldata, - input_values, - challenge_s_g2: Some(s_g2_point), - }) - } + let mut kzg_transcript = Keccak256Transcript::new(()); - fn generate_kzg_proof( - &self, - user_index: Option, - challenge: Fp, - ) -> Result<(Bytes, Vec), &'static str> { - let domain = self.verifying_key.get_domain(); - let omega = domain.get_omega(); - - let mut opening_proofs = Vec::new(); - let mut input_values = Vec::new(); - - // Evaluate the commitments from the SNARK proof - let mut kzg_commitments = Vec::with_capacity(N_CURRENCIES); - let mut transcript = Keccak256Transcript::new(self.zk_snark_proof.as_slice()); - for _ in 0..(N_CURRENCIES + 1) { - let point: G1Affine = transcript.read_point().unwrap(); - kzg_commitments.push(point); - } + let mut transcript = Keccak256Transcript::from_proof((), self.zk_snark_proof.as_slice()); + + let num_points = N_CURRENCIES + 1; + let user_entry_commitments = MultilinearKzg::::read_commitments( + &self.verifier_params.pcs, + num_points, + &mut transcript, + ) + .unwrap(); + + let user_entry_polynomials = self + .advice_polys + .iter() + .take(num_points) + .collect::>(); - // If the user index is None, assign 1 or else 0, for skipping the usename polynomial. - let start_index = user_index.map_or(1, |_| 0); - - for column_index in start_index..N_CURRENCIES + 1 { - let f_poly = self.advice_polys.advice_polys.get(column_index).unwrap(); - - // Perform iDFT to obtain the actual value that is encoded in the polynomial. - let mut vec_f_poly = f_poly.to_vec(); - best_fft(&mut vec_f_poly, omega, f_poly.len().trailing_zeros()); - - let z = if let Some(user_index) = user_index { - let _z = vec_f_poly[user_index]; - input_values.push(U256::from_little_endian(&_z.to_bytes())); - _z - } else { - let total_balance: Fp = vec_f_poly.iter().sum(); - input_values.push(U256::from_little_endian(&total_balance.to_bytes())); - total_balance * Fp::from(f_poly.len() as u64).invert().unwrap() - }; - - let kzg_proof = create_naive_kzg_proof::>( - &self.params, - domain, - f_poly, - challenge, - z, - ); - - if !verify_kzg_proof( - &self.params, - kzg_commitments[column_index].to_curve(), - kzg_proof, - &challenge, - &z, - ) { - return Err("KZG proof verification failed"); - } - - // Convert the KZG proof to an affine point and serialize it to bytes. - let kzg_proof_affine = kzg_proof.to_affine(); - let mut kzg_proof_affine_x = kzg_proof_affine.x.to_bytes(); - let mut kzg_proof_affine_y = kzg_proof_affine.y.to_bytes(); - kzg_proof_affine_x.reverse(); - kzg_proof_affine_y.reverse(); - - opening_proofs.push([kzg_proof_affine_x, kzg_proof_affine_y].concat()); + for binary_var in multivariate_challenge.iter() { + kzg_transcript.write_field_element(binary_var).unwrap(); } - Ok((Bytes::from(opening_proofs.concat()), input_values)) + let evals = user_entry_polynomials + .iter() + .enumerate() + .map(|(poly_idx, poly)| { + Evaluation::new(poly_idx, 0, poly.evaluate(&multivariate_challenge)) + }) + .collect_vec(); + + MultilinearKzg::::batch_open( + &self.prover_params.pcs, + user_entry_polynomials, + &user_entry_commitments, + &[multivariate_challenge.clone()], + &evals, + &mut kzg_transcript, + ) + .unwrap(); + + let proof = kzg_transcript.into_proof(); + let input_values = evals.iter().map(|eval| *eval.value()).collect::>(); + + Ok(KZGProof { + proof, + input_values, + challenge: Some(multivariate_challenge), + }) } } diff --git a/backend/src/contracts/abi/GrandSumVerifier.json b/backend/src/contracts/abi/GrandSumVerifier.json deleted file mode 100644 index 4618cea6..00000000 --- a/backend/src/contracts/abi/GrandSumVerifier.json +++ /dev/null @@ -1 +0,0 @@ -{"_format":"hh-sol-artifact-1","contractName":"GrandSumVerifier","sourceName":"src/GrandSumVerifier.sol","abi":[{"inputs":[{"internalType":"address","name":"vk","type":"address"},{"internalType":"bytes","name":"proof","type":"bytes"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"verifyProof","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}],"bytecode":"0x608060405234801561001057600080fd5b506104fe806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063af83a18d14610030575b600080fd5b61004361003e36600461040b565b610057565b604051901515815260200160405180910390f35b6000610135565b6020820135838110833585811084169190911691856003818085800985090886828309148316925050509392505050565b8160c0528260e05260006040608080608060065afa9091169392505050565b8160c0526000604060806060608060075afa90911692915050565b81600052826020526102c0516040526102e051606052610300516080526103205160a0528360c0528460e0526103405161010052610360516101205261038051610140526103a05161016052600060206000610180600060085afa600051921690911695945050505050565b7f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd477f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016001602060406102208b3c6101406101606102808b3c6064356080810660001482169150816101c15773092dcecc2d8d2c840e0e4dedecc40d8cadccee8d60631b60005260206000fd5b6020816064010180356020810283046004148416935083610206577f4e756d626572206f66206576616c756174696f6e206d69736d6174636800000060005260206000fd5b60005b818110156103b15760208102600281026020820185013588610220518209610280516080526102a05160a0528903905061024381896100ae565b881697505086610277577f4661696c656420746f206d756c7469706c79204731206279206d696e75735f7a60005260206000fd5b80600287046084010161028b8a828a61005e565b9750876102c457826000527f436f6d6d69746d656e7420706f696e74206973206e6f7420454320706f696e746020528060405260606000fd5b80359250602001356102d781848a61008f565b97505086610309577f4661696c656420746f20616464204320616e6420675f746f5f6d696e75735f7a60005260206000fd5b6080516102405260a05161026052608401905061032788828861005e565b955085610358577f4f70656e696e6720706f696e74206973206e6f7420454320706f696e7400000060005260206000fd5b803560208201359150610374828261026051610240518b6100c9565b871696505050846103a9577f4661696c656420746f20706572666f726d2070616972696e6720636865636b0060005260206000fd5b600101610209565b505050508060005260206000f35b60008083601f8401126103d157600080fd5b50813567ffffffffffffffff8111156103e957600080fd5b6020830191508360208260051b850101111561040457600080fd5b9250929050565b60008060008060006060868803121561042357600080fd5b85356001600160a01b038116811461043a57600080fd5b9450602086013567ffffffffffffffff8082111561045757600080fd5b818801915088601f83011261046b57600080fd5b81358181111561047a57600080fd5b89602082850101111561048c57600080fd5b6020830196508095505060408801359150808211156104aa57600080fd5b506104b7888289016103bf565b96999598509396509294939250505056fea2646970667358221220318c6c9ebb11e67ace979383e4cfbec7fca0a102ec89df3b690514cac14726e164736f6c63430008120033","deployedBytecode":"0x608060405234801561001057600080fd5b506004361061002b5760003560e01c8063af83a18d14610030575b600080fd5b61004361003e36600461040b565b610057565b604051901515815260200160405180910390f35b6000610135565b6020820135838110833585811084169190911691856003818085800985090886828309148316925050509392505050565b8160c0528260e05260006040608080608060065afa9091169392505050565b8160c0526000604060806060608060075afa90911692915050565b81600052826020526102c0516040526102e051606052610300516080526103205160a0528360c0528460e0526103405161010052610360516101205261038051610140526103a05161016052600060206000610180600060085afa600051921690911695945050505050565b7f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd477f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016001602060406102208b3c6101406101606102808b3c6064356080810660001482169150816101c15773092dcecc2d8d2c840e0e4dedecc40d8cadccee8d60631b60005260206000fd5b6020816064010180356020810283046004148416935083610206577f4e756d626572206f66206576616c756174696f6e206d69736d6174636800000060005260206000fd5b60005b818110156103b15760208102600281026020820185013588610220518209610280516080526102a05160a0528903905061024381896100ae565b881697505086610277577f4661696c656420746f206d756c7469706c79204731206279206d696e75735f7a60005260206000fd5b80600287046084010161028b8a828a61005e565b9750876102c457826000527f436f6d6d69746d656e7420706f696e74206973206e6f7420454320706f696e746020528060405260606000fd5b80359250602001356102d781848a61008f565b97505086610309577f4661696c656420746f20616464204320616e6420675f746f5f6d696e75735f7a60005260206000fd5b6080516102405260a05161026052608401905061032788828861005e565b955085610358577f4f70656e696e6720706f696e74206973206e6f7420454320706f696e7400000060005260206000fd5b803560208201359150610374828261026051610240518b6100c9565b871696505050846103a9577f4661696c656420746f20706572666f726d2070616972696e6720636865636b0060005260206000fd5b600101610209565b505050508060005260206000f35b60008083601f8401126103d157600080fd5b50813567ffffffffffffffff8111156103e957600080fd5b6020830191508360208260051b850101111561040457600080fd5b9250929050565b60008060008060006060868803121561042357600080fd5b85356001600160a01b038116811461043a57600080fd5b9450602086013567ffffffffffffffff8082111561045757600080fd5b818801915088601f83011261046b57600080fd5b81358181111561047a57600080fd5b89602082850101111561048c57600080fd5b6020830196508095505060408801359150808211156104aa57600080fd5b506104b7888289016103bf565b96999598509396509294939250505056fea2646970667358221220318c6c9ebb11e67ace979383e4cfbec7fca0a102ec89df3b690514cac14726e164736f6c63430008120033","linkReferences":{},"deployedLinkReferences":{}} \ No newline at end of file diff --git a/backend/src/contracts/abi/InclusionVerifier.json b/backend/src/contracts/abi/InclusionVerifier.json deleted file mode 100644 index 33c86ffd..00000000 --- a/backend/src/contracts/abi/InclusionVerifier.json +++ /dev/null @@ -1 +0,0 @@ -{"_format":"hh-sol-artifact-1","contractName":"InclusionVerifier","sourceName":"src/InclusionVerifier.sol","abi":[{"inputs":[{"internalType":"address","name":"vk","type":"address"},{"internalType":"bytes","name":"proofs","type":"bytes"},{"internalType":"uint256[]","name":"challenges","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"verifyProof","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"bytecode":"0x608060405234801561001057600080fd5b50610459806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c806347f6b5aa14610030575b600080fd5b61004361003e36600461033c565b610057565b604051901515815260200160405180910390f35b6000610135565b6020820135838110833585811084169190911691856003818085800985090886828309148316925050509392505050565b8160c0528260e05260006040608080608060065afa9091169392505050565b8160c0526000604060806060608060075afa90911692915050565b8160005282602052610280516040526102a0516060526102c0516080526102e05160a0528360c0528460e0526103005161010052610320516101205261034051610140526103605161016052600060206000610180600060085afa600051921690911695945050505050565b7f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd477f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600160c06101606102408d3c60843560808106600014821691508161019b57600080fd5b6020816084010180356004811484169350836101b657600080fd5b6020820135610300526040820135610320526060820135610340526080820135610360526020808202830101915050803560208102830460041484169350836101fe57600080fd5b60005b818110156102e257610240516080526102605160a052602081810284010135860360c08190526040820261023582886100ae565b871696508661024357600080fd5b806002870460a40101915061025989838961005e565b96508661026557600080fd5b6020820135913561027783828a61008f565b9750508661028457600080fd5b6080516102005260a0516102205260a40190506102a288828861005e565b9550856102ae57600080fd5b8035602082013591506102ca828261022051610200518b6100c9565b871696505050846102da57600080fd5b600101610201565b505050508060005260206000f35b60008083601f84011261030257600080fd5b50813567ffffffffffffffff81111561031a57600080fd5b6020830191508360208260051b850101111561033557600080fd5b9250929050565b60008060008060008060006080888a03121561035757600080fd5b87356001600160a01b038116811461036e57600080fd5b9650602088013567ffffffffffffffff8082111561038b57600080fd5b818a0191508a601f83011261039f57600080fd5b8135818111156103ae57600080fd5b8b60208285010111156103c057600080fd5b6020830198508097505060408a01359150808211156103de57600080fd5b6103ea8b838c016102f0565b909650945060608a013591508082111561040357600080fd5b506104108a828b016102f0565b989b979a5095985093969295929350505056fea26469706673582212207e5e1287edc06ab08a7594afbc051dee662a5f5969372ab655cac10baa4d2fb264736f6c63430008120033","deployedBytecode":"0x608060405234801561001057600080fd5b506004361061002b5760003560e01c806347f6b5aa14610030575b600080fd5b61004361003e36600461033c565b610057565b604051901515815260200160405180910390f35b6000610135565b6020820135838110833585811084169190911691856003818085800985090886828309148316925050509392505050565b8160c0528260e05260006040608080608060065afa9091169392505050565b8160c0526000604060806060608060075afa90911692915050565b8160005282602052610280516040526102a0516060526102c0516080526102e05160a0528360c0528460e0526103005161010052610320516101205261034051610140526103605161016052600060206000610180600060085afa600051921690911695945050505050565b7f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd477f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600160c06101606102408d3c60843560808106600014821691508161019b57600080fd5b6020816084010180356004811484169350836101b657600080fd5b6020820135610300526040820135610320526060820135610340526080820135610360526020808202830101915050803560208102830460041484169350836101fe57600080fd5b60005b818110156102e257610240516080526102605160a052602081810284010135860360c08190526040820261023582886100ae565b871696508661024357600080fd5b806002870460a40101915061025989838961005e565b96508661026557600080fd5b6020820135913561027783828a61008f565b9750508661028457600080fd5b6080516102005260a0516102205260a40190506102a288828861005e565b9550856102ae57600080fd5b8035602082013591506102ca828261022051610200518b6100c9565b871696505050846102da57600080fd5b600101610201565b505050508060005260206000f35b60008083601f84011261030257600080fd5b50813567ffffffffffffffff81111561031a57600080fd5b6020830191508360208260051b850101111561033557600080fd5b9250929050565b60008060008060008060006080888a03121561035757600080fd5b87356001600160a01b038116811461036e57600080fd5b9650602088013567ffffffffffffffff8082111561038b57600080fd5b818a0191508a601f83011261039f57600080fd5b8135818111156103ae57600080fd5b8b60208285010111156103c057600080fd5b6020830198508097505060408a01359150808211156103de57600080fd5b6103ea8b838c016102f0565b909650945060608a013591508082111561040357600080fd5b506104108a828b016102f0565b989b979a5095985093969295929350505056fea26469706673582212207e5e1287edc06ab08a7594afbc051dee662a5f5969372ab655cac10baa4d2fb264736f6c63430008120033","linkReferences":{},"deployedLinkReferences":{}} \ No newline at end of file diff --git a/backend/src/contracts/abi/SnarkVerifier.json b/backend/src/contracts/abi/SnarkVerifier.json deleted file mode 100644 index f2ecf10e..00000000 --- a/backend/src/contracts/abi/SnarkVerifier.json +++ /dev/null @@ -1 +0,0 @@ -{"_format":"hh-sol-artifact-1","contractName":"Verifier","sourceName":"src/SnarkVerifier.sol","abi":[{"inputs":[{"internalType":"address","name":"vk","type":"address"},{"internalType":"bytes","name":"proof","type":"bytes"},{"internalType":"uint256[]","name":"instances","type":"uint256[]"}],"name":"verifyProof","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"bytecode":"0x608060405234801561001057600080fd5b50612188806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063af83a18d14610030575b600080fd5b61004361003e366004612095565b610057565b604051901515815260200160405180910390f35b6000610263565b60008060008435602086013588821086169450888110851694508860038a8b858609850908898283099289526020890191909152149290921696604094850196509390940193505050565b60016020536021600090812092830682529190915260200190565b6000838351602085015b602087038110156100f0578781518309808452602093840193909250016100ce565b8781518309915060208352602080840152602060408401528160608401526002880360808401528760a084015260208360c08560055afa851693508251915085602081016020850394505b828110156101635789855185098a84518609908452601f19958601959094509092019161013b565b8981518509945089825185099490915292909252509095945050505050565b81604052826060526000604060006080600060065afa9091169392505050565b816040526000604060006060600060075afa90911692915050565b8160c0528260e05260006040608080608060065afa9091169392505050565b8160c0526000604060806060608060075afa90911692915050565b8160005282602052610b4051604052610b6051606052610b8051608052610ba05160a0528360c0528460e052610bc05161010052610be05161012052610c005161014052610c205161016052600060206000610180600060085afa600051921690911695945050505050565b7f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd477f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600161056060006109a08b3c6064356115001481169050610a6051611584358114821691506109a05160005260206115a48260200281015b8082101561030057813580845286119490941693602092830192909101906102dd565b5060849250610f0090506103445b8084101561032d576103228784868861005e565b94509450945061030e565b5060009182208581068252909152602090810161040083015b808410156103655761035a8784868861005e565b945094509450610346565b5060009182208581068252909152602090810161038285826100a9565b905061038083015b808410156103a95761039e8784868861005e565b94509450945061038a565b5060009182208581068252909152602090810160c083015b808410156103e0576103d58784868861005e565b9450945094506103c1565b5060009182208581068252909152602090810161098083015b8084101561041c57833580845286119490941693602093840193909201916103f9565b5060009182208581068252909152602090810161043985826100a9565b90506104478683858761005e565b600090812088810690945292909252935091506020905061046a8582848661005e565b9250925092505050610a80511561053757610ac051610ae0516020610aa051026115a4016020830260028102600382028335838501358386013583870135896020028801895b818a10156104ee5760208a0199508935811b86019550888a0135811b85019450878a0135811b84019350868a0135811b830192508a810190506104b0565b50508c60038e8f8788098709088d848509148b169a508c60038e8f8586098509088d828309148b169a508361100052826110205281611040528061106052505050505050505050505b8061054157600080fd5b6109c0519250610f80518060005b858110156105655784828309915060010161054f565b50610a005194506110806006610a6051016020028101610a6051610587576020015b610a40515b818310156105ad57868188038608835286888209905060208301925061058c565b508560018703840893508381526105cb8660208301611080886100c4565b94506110809150856109e05185099350610a40515b8183101561060357868782855109860983528688820990506020830192506105e0565b506110a05196506110c0935061114091505b8184101561062f5785845188089650602084019350610615565b600091506115a4610a605160200281015b80821015610664578788833588510985089350602082019150602086019550610640565b505051611080805161114051949091526110a0919091526110c0526110e0959095526111008190526111209490945250610f60516000937f09226b6e22c6f0ca64ec26aad4c86e715b5f898e5e963f25870e56bbe533e9a291908480610e4435830986038208955050610fc435848082810381848009086110c051099050848186848909089550508384610e84358603610ea435086111005109848186848909089550508384610ee4358603610f0435086111005109848186848909089550508384610f44358603610f6435086111005109848186848909089550508384610fa4358603610fc43508611100510984818684890908955050610f4051610f2051610e6435610e44358788858a8b610d04358809610cc4350808830991508788858a8b610d243588096111205108088309915087610f805184096000528788858a600051610cc4350808820990508786600051096000528788858a6000516111205108088209905087866000510960005287818903830893505050508485866110e0516110c05108830986038208905084818684890908955050610f4051610f2051610ec435610ea4358788858a8b610d44358809610b84350808830991508788858a8b610d64358809610ba4350808830991508788858a600051610b84350808820990508786600051096000528788858a600051610ba43508088209905087866000510960005287818903830893505050508485866110e0516110c05108830986038208905084818684890908955050610f4051610f2051610f2435610f04358788858a8b610d84358809610bc4350808830991508788858a8b610da4358809610be4350808830991508788858a600051610bc4350808820990508786600051096000528788858a600051610be43508088209905087866000510960005287818903830893505050508485866110e0516110c05108830986038208905084818684890908955050610f4051610f2051610f8435610f64358788858a8b610dc4358809610c24350808830991508788858a8b610de4358809610c44350808830991508788858a600051610c24350808820990508786600051096000528788858a600051610c443508088209905087866000510960005287818903830893505050508485866110e0516110c05108830986038208905084818684890908955050610f4051610f2051610fe435610fc4358788858a8b610e04358809610c64350808830991508788858a8b610e24358809610c84350808830991508788858a600051610c64350808820990508786600051096000528788858a600051610c843508088209905087818903830893505050508485866110e0516110c05108830986038208905084818684890908955050611100518485611004358703830982089050848186848909089550506110c051848561100435870387611004356110043509088209905084818684890908955060009050610c0435610b8435620100008781830988039150879050818308610f2051610f4051919450610cc435935091508780808361108435088a85611044350809611024350988898a8487088b86890809611004350994508889868b0383088a8b6110c0516110e051088c0360010809945050505050848186848909089550508384611084358603611044350861110051098481868489090895505083848561106435870361104435088661108435880361104435080985866110c0516110e05108870360010809848186848909089550506111005184856110a4358703830982089050848186848909089550506110c05184856110a4358703876110a4356110a43509088209905084818684890908955060009050610b8435610ba435620100008781830988039150879050818308610f2051610f4051919450610cc435935091508780808361112435088a856110e43508096110c4350988898a8487088b868908096110a4350994508889868b0383088a8b6110c0516110e051088c03600108099450505050508481868489090895505083846111243586036110e435086111005109848186848909089550508384856111043587036110e43508866111243588036110e435080985866110c0516110e0510887036001080984818684890908955050611100518485611144358703830982089050848186848909089550506110c051848561114435870387611144356111443509088209905084818684890908955060009050610ba435610bc435620100008781830988039150879050818308610f2051610f4051919450610cc43593509150878080836111c435088a85611184350809611164350988898a8487088b86890809611144350994508889868b0383088a8b6110c0516110e051088c03600108099450505050508481868489090895505083846111c435860361118435086111005109848186848909089550508384856111a43587036111843508866111c435880361118435080985866110c0516110e05108870360010809848186848909089550506111005184856111e4358703830982089050848186848909089550506110c05184856111e4358703876111e4356111e43509088209905084818684890908955060009050610bc435610be435620100008781830988039150879050818308610f2051610f4051919450610cc435935091508780808361126435088a85611224350809611204350988898a8487088b868908096111e4350994508889868b0383088a8b6110c0516110e051088c0360010809945050505050848186848909089550508384611264358603611224350861110051098481868489090895505083848561124435870361122435088661126435880361122435080985866110c0516110e0510887036001080984818684890908955050611100518485611284358703830982089050848186848909089550506110c051848561128435870387611284356112843509088209905084818684890908955060009050610ca435610c2435620100008781830988039150879050818308610f2051610f4051919450610cc435935091508780808361130435088a856112c43508096112a4350988898a8487088b86890809611284350994508889868b0383088a8b6110c0516110e051088c03600108099450505050508481868489090895505083846113043586036112c435086111005109848186848909089550508384856112e43587036112c43508866113043588036112c435080985866110c0516110e0510887036001080984818684890908955050611100518485611324358703830982089050848186848909089550506110c051848561132435870387611324356113243509088209905084818684890908955060009050610c2435610c4435620100008781830988039150879050818308610f2051610f4051919450610cc43593509150878080836113a435088a85611364350809611344350988898a8487088b86890809611324350994508889868b0383088a8b6110c0516110e051088c03600108099450505050508481868489090895505083846113a435860361136435086111005109848186848909089550508384856113843587036113643508866113a435880361136435080985866110c0516110e05108870360010809848186848909089550506111005184856113c4358703830982089050848186848909089550506110c05184856113c4358703876113c4356113c43509088209905084818684890908955060009050610c4435610c6435620100008781830988039150879050818308610f2051610f4051919450610cc435935091508780808361144435088a856114043508096113e4350988898a8487088b868908096113c4350994508889868b0383088a8b6110c0516110e051088c0360010809945050505050848186848909089550508384611444358603611404350861110051098481868489090895505083848561142435870361140435088661144435880361140435080985866110c0516110e0510887036001080984818684890908955050611100518485611464358703830982089050848186848909089550506110c051848561146435870387611464356114643509088209905084818684890908955060009050610c6435610c8435620100008781830988039150879050818308610f2051610f4051919450610cc43593509150878080836114e435088a856114a4350809611484350988898a8487088b86890809611464350994508889868b0383088a8b6110c0516110e051088c03600108099450505050508481868489090895505083846114e43586036114a435086111005109848186848909089550508384856114c43587036114a43508866114e43588036114a435080985866110c0516110e05108870360010809848186848909089550505050816110a051840961114052610b4435600052610b6435602052611080519250610b04610a845b818110156113415761132285846101a2565b92506113346020830135833585610182565b9250604082039150611310565b50506000516111605260205161118052610f80519250610a0051610a205183828609915081610360528461034052838186099150816103205283818309915083818309915083818309915083818309915083818309915050806103005250610fe05192506103806104006103005b818310156113cc57848151860387088352602092830192016113af565b50506103c0516104005250610380516103a051909350829084099250816103e05184096104208190526000526103a0516104408190526103805193508290840961046052610380516103e05190935082908409610480526103c0516001935082908409602052610300516103405161036051919450906000848381038708905084858387038808820990508461038051820990508060405284868603840890508485838703850882099050846103c051820990508060605284868603830890508485848703840882099050846103e051820960805250506103405161036051909450905060008382810386089050836103c051820990508060a0528385850383089050836103e051820960c0525050610320516103405190935060008382810386089050836103a051820990508060e0528385850383089050836103c051820961010052506115229050826101206000846100c4565b9050600051925082610420526104406104a05b8082101561154f5783858351098252602082019150611535565b50506020519250610fa05160008384610ce435870982089050838282099050838461114051870982089050610e24610ce45b818110156115a15785868335890987868609089250602082039150611581565b50508382820990508384610cc43587098208905083828209905083846114e43587098208905083828209905083846114443587098208905083828209905083846113a43587098208905083828209905083846113043587098208905083828209905083846112643587098208905083828209905083846111c435870982089050838282099050838461112435870982089050838282099050838461108435870982089050610ca4610b645b8181101561166c578586833589098786860908925060208203915061164c565b5050806104a0525050610fa051925060008283610fa43560405109820890508283610f643560605109820890508283610f843560805109820890508284820990508283610f443560405109820890508283610f043560605109820890508283610f243560805109820890508284820990508283610ee43560405109820890508283610ea43560605109820890508283610ec43560805109820890508284820990508283610e843560405109820890508283610e443560605109820890508283610e64356080510982089050826104405182099050806104c05250610fa0519250600082836114643560a051098208905082836114843560c051098208905082848209905082836113c43560a051098208905082836113e43560c051098208905082848209905082836113243560a051098208905082836113443560c051098208905082848209905082836112843560a051098208905082836112a43560c051098208905082848209905082836111e43560a051098208905082836112043560c051098208905082848209905082836111443560a051098208905082836111643560c051098208905082848209905082836110a43560a051098208905082836110c43560c051098208905082848209905082836110043560a051098208905082836110243560c05109820890508284820990508283610fc43560a05109820890508283610fe43560c0510982089050826104605182099050806104e05250610fa0519250600082836114c43560e051098208905082836114a43561010051098208905082848209905082836114243560e051098208905082836114043561010051098208905082848209905082836113843560e051098208905082836113643561010051098208905082848209905082836112e43560e051098208905082836112c43561010051098208905082848209905082836112443560e051098208905082836112243561010051098208905082848209905082836111a43560e051098208905082836111843561010051098208905082848209905082836111043560e051098208905082836110e43561010051098208905082848209905082836110643560e0510982089050828361104435610100510982089050826104805182096105005250602051610520526040516060519093508290840892508160805184086105405260a05160c051909350829084086105605260e0516101005190935082908408610580526000925060806105205b81851015611a145780518552602094850194016119fc565b5050611a248260806000846100c4565b90508161050051606051099250604060806104e05b81831015611a625784610fc051870995508485825185510987089550601f199283019201611a39565b505050826111a052610fc0519250610a8435600052610aa435602052611a8b610fa051826101a2565b9050611a9e611180516111605183610182565b9050610ec0610c005b81811015611adb57611abc610fa051846101a2565b9250611ace6020830151835185610182565b9250604082039150611aa7565b5050611aea610fa051826101a2565b9050611afd610724356107043583610182565b9050611b0c610fa051826101a2565b9050611b1f6106a4356106843583610182565b9050611b2e610fa051826101a2565b9050611b41610624356106043583610182565b9050611b50610fa051826101a2565b9050611b636105a4356105843583610182565b9050611b72610fa051826101a2565b9050611b85610524356105043583610182565b9050611b94610fa051826101a2565b9050611ba76104a4356104843583610182565b9050611bb6610fa051826101a2565b9050611bc9610424356104043583610182565b9050611bd8610fa051826101a2565b9050611beb6103a4356103843583610182565b9050611bfa610fa051826101a2565b9050611c0d610124356101043583610182565b90506103046102045b81811015611c4a57611c2b610fa051846101a2565b9250611c3d6020830135833585610182565b9250604082039150611c16565b5050611c59610fa051826101a2565b9050611c6a60e43560c43583610182565b90506102046101045b81811015611ca757611c88610fa051846101a2565b9250611c9a6020830135833585610182565b9250604082039150611c73565b5050610804356080526108243560a0526107c46107045b81811015611cf257611cd3610fa051846101dc565b9250611ce560208301358335856101bd565b9250604082039150611cbe565b5050611d0482610440518509826101dc565b9050611d1560a05160805183610182565b905081610fc05184099250610a4435608052610a643560a052610a046108045b81811015611d6957611d4a610fa051846101dc565b9250611d5c60208301358335856101bd565b9250604082039150611d35565b5050611d7b82610460518509826101dc565b9050611d8c60a05160805183610182565b905081610fc051840992506106c4356080526106e43560a052611db2610fa051826101dc565b9050611dc56106643561064435836101bd565b9050611dd4610fa051826101dc565b9050611de76105e4356105c435836101bd565b9050611df6610fa051826101dc565b9050611e096105643561054435836101bd565b9050611e18610fa051826101dc565b9050611e2b6104e4356104c435836101bd565b9050611e3a610fa051826101dc565b9050611e4d6104643561044435836101bd565b9050611e5c610fa051826101dc565b9050611e6f6103e4356103c435836101bd565b9050611e7e610fa051826101dc565b9050611e916103643561034435836101bd565b9050611ea382610480518509826101dc565b9050611eb460a05160805183610182565b9050610b0051608052610b205160a052611ed36111a0518303826101dc565b9050611ee460a05160805183610182565b9050611504356080526115243560a052611f03610400518303826101dc565b9050611f1460a05160805183610182565b9050611544356080526115643560a052611f31610fe051826101dc565b9050611f4260a05160805183610182565b90506000516111c0526020516111e05261154435611200526115643561122052610a80511561201657611000516000526110205160205261104051604052611060516060526111c0516080526111e05160a0526112005160c0526112205160e05281610100600020069250611fb783826101a2565b9050611fca6111e0516111c05183610182565b90506000516111c0526020516111e0526110405160005261106051602052611ff283826101a2565b9050612005611220516112005183610182565b905060005161120052602051611220525b61202f61122051611200516111e0516111c051856101f7565b90508061203b57600080fd5b505050600160005260206000f35b60008083601f84011261205b57600080fd5b50813567ffffffffffffffff81111561207357600080fd5b6020830191508360208260051b850101111561208e57600080fd5b9250929050565b6000806000806000606086880312156120ad57600080fd5b85356001600160a01b03811681146120c457600080fd5b9450602086013567ffffffffffffffff808211156120e157600080fd5b818801915088601f8301126120f557600080fd5b81358181111561210457600080fd5b89602082850101111561211657600080fd5b60208301965080955050604088013591508082111561213457600080fd5b5061214188828901612049565b96999598509396509294939250505056fea26469706673582212206980435f9591390378e255f4026eeb42c56814114f9e4b0fa8fa6f9c5badec5b64736f6c63430008120033","deployedBytecode":"0x608060405234801561001057600080fd5b506004361061002b5760003560e01c8063af83a18d14610030575b600080fd5b61004361003e366004612095565b610057565b604051901515815260200160405180910390f35b6000610263565b60008060008435602086013588821086169450888110851694508860038a8b858609850908898283099289526020890191909152149290921696604094850196509390940193505050565b60016020536021600090812092830682529190915260200190565b6000838351602085015b602087038110156100f0578781518309808452602093840193909250016100ce565b8781518309915060208352602080840152602060408401528160608401526002880360808401528760a084015260208360c08560055afa851693508251915085602081016020850394505b828110156101635789855185098a84518609908452601f19958601959094509092019161013b565b8981518509945089825185099490915292909252509095945050505050565b81604052826060526000604060006080600060065afa9091169392505050565b816040526000604060006060600060075afa90911692915050565b8160c0528260e05260006040608080608060065afa9091169392505050565b8160c0526000604060806060608060075afa90911692915050565b8160005282602052610b4051604052610b6051606052610b8051608052610ba05160a0528360c0528460e052610bc05161010052610be05161012052610c005161014052610c205161016052600060206000610180600060085afa600051921690911695945050505050565b7f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd477f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600161056060006109a08b3c6064356115001481169050610a6051611584358114821691506109a05160005260206115a48260200281015b8082101561030057813580845286119490941693602092830192909101906102dd565b5060849250610f0090506103445b8084101561032d576103228784868861005e565b94509450945061030e565b5060009182208581068252909152602090810161040083015b808410156103655761035a8784868861005e565b945094509450610346565b5060009182208581068252909152602090810161038285826100a9565b905061038083015b808410156103a95761039e8784868861005e565b94509450945061038a565b5060009182208581068252909152602090810160c083015b808410156103e0576103d58784868861005e565b9450945094506103c1565b5060009182208581068252909152602090810161098083015b8084101561041c57833580845286119490941693602093840193909201916103f9565b5060009182208581068252909152602090810161043985826100a9565b90506104478683858761005e565b600090812088810690945292909252935091506020905061046a8582848661005e565b9250925092505050610a80511561053757610ac051610ae0516020610aa051026115a4016020830260028102600382028335838501358386013583870135896020028801895b818a10156104ee5760208a0199508935811b86019550888a0135811b85019450878a0135811b84019350868a0135811b830192508a810190506104b0565b50508c60038e8f8788098709088d848509148b169a508c60038e8f8586098509088d828309148b169a508361100052826110205281611040528061106052505050505050505050505b8061054157600080fd5b6109c0519250610f80518060005b858110156105655784828309915060010161054f565b50610a005194506110806006610a6051016020028101610a6051610587576020015b610a40515b818310156105ad57868188038608835286888209905060208301925061058c565b508560018703840893508381526105cb8660208301611080886100c4565b94506110809150856109e05185099350610a40515b8183101561060357868782855109860983528688820990506020830192506105e0565b506110a05196506110c0935061114091505b8184101561062f5785845188089650602084019350610615565b600091506115a4610a605160200281015b80821015610664578788833588510985089350602082019150602086019550610640565b505051611080805161114051949091526110a0919091526110c0526110e0959095526111008190526111209490945250610f60516000937f09226b6e22c6f0ca64ec26aad4c86e715b5f898e5e963f25870e56bbe533e9a291908480610e4435830986038208955050610fc435848082810381848009086110c051099050848186848909089550508384610e84358603610ea435086111005109848186848909089550508384610ee4358603610f0435086111005109848186848909089550508384610f44358603610f6435086111005109848186848909089550508384610fa4358603610fc43508611100510984818684890908955050610f4051610f2051610e6435610e44358788858a8b610d04358809610cc4350808830991508788858a8b610d243588096111205108088309915087610f805184096000528788858a600051610cc4350808820990508786600051096000528788858a6000516111205108088209905087866000510960005287818903830893505050508485866110e0516110c05108830986038208905084818684890908955050610f4051610f2051610ec435610ea4358788858a8b610d44358809610b84350808830991508788858a8b610d64358809610ba4350808830991508788858a600051610b84350808820990508786600051096000528788858a600051610ba43508088209905087866000510960005287818903830893505050508485866110e0516110c05108830986038208905084818684890908955050610f4051610f2051610f2435610f04358788858a8b610d84358809610bc4350808830991508788858a8b610da4358809610be4350808830991508788858a600051610bc4350808820990508786600051096000528788858a600051610be43508088209905087866000510960005287818903830893505050508485866110e0516110c05108830986038208905084818684890908955050610f4051610f2051610f8435610f64358788858a8b610dc4358809610c24350808830991508788858a8b610de4358809610c44350808830991508788858a600051610c24350808820990508786600051096000528788858a600051610c443508088209905087866000510960005287818903830893505050508485866110e0516110c05108830986038208905084818684890908955050610f4051610f2051610fe435610fc4358788858a8b610e04358809610c64350808830991508788858a8b610e24358809610c84350808830991508788858a600051610c64350808820990508786600051096000528788858a600051610c843508088209905087818903830893505050508485866110e0516110c05108830986038208905084818684890908955050611100518485611004358703830982089050848186848909089550506110c051848561100435870387611004356110043509088209905084818684890908955060009050610c0435610b8435620100008781830988039150879050818308610f2051610f4051919450610cc435935091508780808361108435088a85611044350809611024350988898a8487088b86890809611004350994508889868b0383088a8b6110c0516110e051088c0360010809945050505050848186848909089550508384611084358603611044350861110051098481868489090895505083848561106435870361104435088661108435880361104435080985866110c0516110e05108870360010809848186848909089550506111005184856110a4358703830982089050848186848909089550506110c05184856110a4358703876110a4356110a43509088209905084818684890908955060009050610b8435610ba435620100008781830988039150879050818308610f2051610f4051919450610cc435935091508780808361112435088a856110e43508096110c4350988898a8487088b868908096110a4350994508889868b0383088a8b6110c0516110e051088c03600108099450505050508481868489090895505083846111243586036110e435086111005109848186848909089550508384856111043587036110e43508866111243588036110e435080985866110c0516110e0510887036001080984818684890908955050611100518485611144358703830982089050848186848909089550506110c051848561114435870387611144356111443509088209905084818684890908955060009050610ba435610bc435620100008781830988039150879050818308610f2051610f4051919450610cc43593509150878080836111c435088a85611184350809611164350988898a8487088b86890809611144350994508889868b0383088a8b6110c0516110e051088c03600108099450505050508481868489090895505083846111c435860361118435086111005109848186848909089550508384856111a43587036111843508866111c435880361118435080985866110c0516110e05108870360010809848186848909089550506111005184856111e4358703830982089050848186848909089550506110c05184856111e4358703876111e4356111e43509088209905084818684890908955060009050610bc435610be435620100008781830988039150879050818308610f2051610f4051919450610cc435935091508780808361126435088a85611224350809611204350988898a8487088b868908096111e4350994508889868b0383088a8b6110c0516110e051088c0360010809945050505050848186848909089550508384611264358603611224350861110051098481868489090895505083848561124435870361122435088661126435880361122435080985866110c0516110e0510887036001080984818684890908955050611100518485611284358703830982089050848186848909089550506110c051848561128435870387611284356112843509088209905084818684890908955060009050610ca435610c2435620100008781830988039150879050818308610f2051610f4051919450610cc435935091508780808361130435088a856112c43508096112a4350988898a8487088b86890809611284350994508889868b0383088a8b6110c0516110e051088c03600108099450505050508481868489090895505083846113043586036112c435086111005109848186848909089550508384856112e43587036112c43508866113043588036112c435080985866110c0516110e0510887036001080984818684890908955050611100518485611324358703830982089050848186848909089550506110c051848561132435870387611324356113243509088209905084818684890908955060009050610c2435610c4435620100008781830988039150879050818308610f2051610f4051919450610cc43593509150878080836113a435088a85611364350809611344350988898a8487088b86890809611324350994508889868b0383088a8b6110c0516110e051088c03600108099450505050508481868489090895505083846113a435860361136435086111005109848186848909089550508384856113843587036113643508866113a435880361136435080985866110c0516110e05108870360010809848186848909089550506111005184856113c4358703830982089050848186848909089550506110c05184856113c4358703876113c4356113c43509088209905084818684890908955060009050610c4435610c6435620100008781830988039150879050818308610f2051610f4051919450610cc435935091508780808361144435088a856114043508096113e4350988898a8487088b868908096113c4350994508889868b0383088a8b6110c0516110e051088c0360010809945050505050848186848909089550508384611444358603611404350861110051098481868489090895505083848561142435870361140435088661144435880361140435080985866110c0516110e0510887036001080984818684890908955050611100518485611464358703830982089050848186848909089550506110c051848561146435870387611464356114643509088209905084818684890908955060009050610c6435610c8435620100008781830988039150879050818308610f2051610f4051919450610cc43593509150878080836114e435088a856114a4350809611484350988898a8487088b86890809611464350994508889868b0383088a8b6110c0516110e051088c03600108099450505050508481868489090895505083846114e43586036114a435086111005109848186848909089550508384856114c43587036114a43508866114e43588036114a435080985866110c0516110e05108870360010809848186848909089550505050816110a051840961114052610b4435600052610b6435602052611080519250610b04610a845b818110156113415761132285846101a2565b92506113346020830135833585610182565b9250604082039150611310565b50506000516111605260205161118052610f80519250610a0051610a205183828609915081610360528461034052838186099150816103205283818309915083818309915083818309915083818309915083818309915050806103005250610fe05192506103806104006103005b818310156113cc57848151860387088352602092830192016113af565b50506103c0516104005250610380516103a051909350829084099250816103e05184096104208190526000526103a0516104408190526103805193508290840961046052610380516103e05190935082908409610480526103c0516001935082908409602052610300516103405161036051919450906000848381038708905084858387038808820990508461038051820990508060405284868603840890508485838703850882099050846103c051820990508060605284868603830890508485848703840882099050846103e051820960805250506103405161036051909450905060008382810386089050836103c051820990508060a0528385850383089050836103e051820960c0525050610320516103405190935060008382810386089050836103a051820990508060e0528385850383089050836103c051820961010052506115229050826101206000846100c4565b9050600051925082610420526104406104a05b8082101561154f5783858351098252602082019150611535565b50506020519250610fa05160008384610ce435870982089050838282099050838461114051870982089050610e24610ce45b818110156115a15785868335890987868609089250602082039150611581565b50508382820990508384610cc43587098208905083828209905083846114e43587098208905083828209905083846114443587098208905083828209905083846113a43587098208905083828209905083846113043587098208905083828209905083846112643587098208905083828209905083846111c435870982089050838282099050838461112435870982089050838282099050838461108435870982089050610ca4610b645b8181101561166c578586833589098786860908925060208203915061164c565b5050806104a0525050610fa051925060008283610fa43560405109820890508283610f643560605109820890508283610f843560805109820890508284820990508283610f443560405109820890508283610f043560605109820890508283610f243560805109820890508284820990508283610ee43560405109820890508283610ea43560605109820890508283610ec43560805109820890508284820990508283610e843560405109820890508283610e443560605109820890508283610e64356080510982089050826104405182099050806104c05250610fa0519250600082836114643560a051098208905082836114843560c051098208905082848209905082836113c43560a051098208905082836113e43560c051098208905082848209905082836113243560a051098208905082836113443560c051098208905082848209905082836112843560a051098208905082836112a43560c051098208905082848209905082836111e43560a051098208905082836112043560c051098208905082848209905082836111443560a051098208905082836111643560c051098208905082848209905082836110a43560a051098208905082836110c43560c051098208905082848209905082836110043560a051098208905082836110243560c05109820890508284820990508283610fc43560a05109820890508283610fe43560c0510982089050826104605182099050806104e05250610fa0519250600082836114c43560e051098208905082836114a43561010051098208905082848209905082836114243560e051098208905082836114043561010051098208905082848209905082836113843560e051098208905082836113643561010051098208905082848209905082836112e43560e051098208905082836112c43561010051098208905082848209905082836112443560e051098208905082836112243561010051098208905082848209905082836111a43560e051098208905082836111843561010051098208905082848209905082836111043560e051098208905082836110e43561010051098208905082848209905082836110643560e0510982089050828361104435610100510982089050826104805182096105005250602051610520526040516060519093508290840892508160805184086105405260a05160c051909350829084086105605260e0516101005190935082908408610580526000925060806105205b81851015611a145780518552602094850194016119fc565b5050611a248260806000846100c4565b90508161050051606051099250604060806104e05b81831015611a625784610fc051870995508485825185510987089550601f199283019201611a39565b505050826111a052610fc0519250610a8435600052610aa435602052611a8b610fa051826101a2565b9050611a9e611180516111605183610182565b9050610ec0610c005b81811015611adb57611abc610fa051846101a2565b9250611ace6020830151835185610182565b9250604082039150611aa7565b5050611aea610fa051826101a2565b9050611afd610724356107043583610182565b9050611b0c610fa051826101a2565b9050611b1f6106a4356106843583610182565b9050611b2e610fa051826101a2565b9050611b41610624356106043583610182565b9050611b50610fa051826101a2565b9050611b636105a4356105843583610182565b9050611b72610fa051826101a2565b9050611b85610524356105043583610182565b9050611b94610fa051826101a2565b9050611ba76104a4356104843583610182565b9050611bb6610fa051826101a2565b9050611bc9610424356104043583610182565b9050611bd8610fa051826101a2565b9050611beb6103a4356103843583610182565b9050611bfa610fa051826101a2565b9050611c0d610124356101043583610182565b90506103046102045b81811015611c4a57611c2b610fa051846101a2565b9250611c3d6020830135833585610182565b9250604082039150611c16565b5050611c59610fa051826101a2565b9050611c6a60e43560c43583610182565b90506102046101045b81811015611ca757611c88610fa051846101a2565b9250611c9a6020830135833585610182565b9250604082039150611c73565b5050610804356080526108243560a0526107c46107045b81811015611cf257611cd3610fa051846101dc565b9250611ce560208301358335856101bd565b9250604082039150611cbe565b5050611d0482610440518509826101dc565b9050611d1560a05160805183610182565b905081610fc05184099250610a4435608052610a643560a052610a046108045b81811015611d6957611d4a610fa051846101dc565b9250611d5c60208301358335856101bd565b9250604082039150611d35565b5050611d7b82610460518509826101dc565b9050611d8c60a05160805183610182565b905081610fc051840992506106c4356080526106e43560a052611db2610fa051826101dc565b9050611dc56106643561064435836101bd565b9050611dd4610fa051826101dc565b9050611de76105e4356105c435836101bd565b9050611df6610fa051826101dc565b9050611e096105643561054435836101bd565b9050611e18610fa051826101dc565b9050611e2b6104e4356104c435836101bd565b9050611e3a610fa051826101dc565b9050611e4d6104643561044435836101bd565b9050611e5c610fa051826101dc565b9050611e6f6103e4356103c435836101bd565b9050611e7e610fa051826101dc565b9050611e916103643561034435836101bd565b9050611ea382610480518509826101dc565b9050611eb460a05160805183610182565b9050610b0051608052610b205160a052611ed36111a0518303826101dc565b9050611ee460a05160805183610182565b9050611504356080526115243560a052611f03610400518303826101dc565b9050611f1460a05160805183610182565b9050611544356080526115643560a052611f31610fe051826101dc565b9050611f4260a05160805183610182565b90506000516111c0526020516111e05261154435611200526115643561122052610a80511561201657611000516000526110205160205261104051604052611060516060526111c0516080526111e05160a0526112005160c0526112205160e05281610100600020069250611fb783826101a2565b9050611fca6111e0516111c05183610182565b90506000516111c0526020516111e0526110405160005261106051602052611ff283826101a2565b9050612005611220516112005183610182565b905060005161120052602051611220525b61202f61122051611200516111e0516111c051856101f7565b90508061203b57600080fd5b505050600160005260206000f35b60008083601f84011261205b57600080fd5b50813567ffffffffffffffff81111561207357600080fd5b6020830191508360208260051b850101111561208e57600080fd5b9250929050565b6000806000806000606086880312156120ad57600080fd5b85356001600160a01b03811681146120c457600080fd5b9450602086013567ffffffffffffffff808211156120e157600080fd5b818801915088601f8301126120f557600080fd5b81358181111561210457600080fd5b89602082850101111561211657600080fd5b60208301965080955050604088013591508082111561213457600080fd5b5061214188828901612049565b96999598509396509294939250505056fea26469706673582212206980435f9591390378e255f4026eeb42c56814114f9e4b0fa8fa6f9c5badec5b64736f6c63430008120033","linkReferences":{},"deployedLinkReferences":{}} \ No newline at end of file diff --git a/backend/src/contracts/abi/Summa.json b/backend/src/contracts/abi/Summa.json deleted file mode 100644 index c260ae38..00000000 --- a/backend/src/contracts/abi/Summa.json +++ /dev/null @@ -1 +0,0 @@ -{"_format":"hh-sol-artifact-1","contractName":"Summa","sourceName":"src/Summa.sol","abi":[{"inputs":[{"internalType":"address","name":"_verifyingKey","type":"address"},{"internalType":"contract IVerifier","name":"_polynomialInterpolationVerifier","type":"address"},{"internalType":"contract IVerifier","name":"_grandSumVerifier","type":"address"},{"internalType":"contract IInclusionVerifier","name":"_inclusionVerifier","type":"address"},{"internalType":"string[]","name":"cryptocurrencyNames","type":"string[]"},{"internalType":"string[]","name":"cryptocurrencyChains","type":"string[]"},{"internalType":"uint8","name":"balanceByteRange","type":"uint8"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"components":[{"internalType":"string","name":"cexAddress","type":"string"},{"internalType":"string","name":"chain","type":"string"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"bytes","name":"message","type":"bytes"}],"indexed":false,"internalType":"struct Summa.AddressOwnershipProof[]","name":"addressOwnershipProofs","type":"tuple[]"}],"name":"AddressOwnershipProofSubmitted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"uint256[]","name":"totalBalances","type":"uint256[]"},{"indexed":false,"internalType":"bytes","name":"snarkProof","type":"bytes"},{"indexed":false,"internalType":"bytes","name":"grandSumProof","type":"bytes"}],"name":"LiabilitiesCommitmentSubmitted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"addressOwnershipProofs","outputs":[{"internalType":"string","name":"cexAddress","type":"string"},{"internalType":"string","name":"chain","type":"string"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"bytes","name":"message","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"commitments","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"config","outputs":[{"internalType":"uint8","name":"balanceByteRange","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"addressHash","type":"bytes32"}],"name":"getAddressOwnershipProof","outputs":[{"components":[{"internalType":"string","name":"cexAddress","type":"string"},{"internalType":"string","name":"chain","type":"string"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"bytes","name":"message","type":"bytes"}],"internalType":"struct Summa.AddressOwnershipProof","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"snarkProof","type":"bytes"},{"internalType":"bytes","name":"grandSumProof","type":"bytes"},{"internalType":"uint256[]","name":"totalBalances","type":"uint256[]"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"submitCommitment","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"string","name":"cexAddress","type":"string"},{"internalType":"string","name":"chain","type":"string"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"bytes","name":"message","type":"bytes"}],"internalType":"struct Summa.AddressOwnershipProof[]","name":"_addressOwnershipProofs","type":"tuple[]"}],"name":"submitProofOfAddressOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"bytes","name":"inclusionProof","type":"bytes"},{"internalType":"uint256[]","name":"challenges","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"verifyInclusionProof","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"verifyingKey","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}],"bytecode":"0x6101006040523480156200001257600080fd5b50604051620029003803806200290083398101604081905262000035916200075b565b62000040336200042a565b6001600160a01b0387166200009c5760405162461bcd60e51b815260206004820152601d60248201527f496e76616c696420766572696679696e67206b6579206164647265737300000060448201526064015b60405180910390fd5b6001600160a01b0387166080528151835114620001145760405162461bcd60e51b815260206004820152602f60248201527f43727970746f63757272656e6379206e616d657320616e6420636861696e732060448201526e0dceadac4cae440dad2e6dac2e8c6d608b1b606482015260840162000093565b60005b8351811015620001d15783818151811062000136576200013662000837565b6020026020010151516000141580156200016e575082818151811062000160576200016062000837565b602002602001015151600014155b620001bc5760405162461bcd60e51b815260206004820152601660248201527f496e76616c69642063727970746f63757272656e637900000000000000000000604482015260640162000093565b80620001c88162000863565b91505062000117565b50620001e6878451836200047a60201b60201c565b6200025a5760405162461bcd60e51b815260206004820152603c60248201527f54686520636f6e66696720706172616d657465727320646f206e6f7420636f7260448201527f726573706f6e6420746f2074686520766572696679696e67206b657900000000606482015260840162000093565b6001600160a01b038616620002cc5760405162461bcd60e51b815260206004820152603160248201527f496e76616c696420706f6c796e6f6d69616c20696e746572706f6c6174696f6e604482015270207665726966696572206164647265737360781b606482015260840162000093565b6001600160a01b0380871660a0528516620003355760405162461bcd60e51b815260206004820152602260248201527f496e76616c6964206772616e642073756d207665726966696572206164647265604482015261737360f01b606482015260840162000093565b6001600160a01b0380861660c05284166200039e5760405162461bcd60e51b815260206004820152602260248201527f496e76616c696420696e636c7573696f6e207665726966696572206164647265604482015261737360f01b606482015260840162000093565b6001600160a01b03841660e05260408051606081018252848152602080820185905260ff84169282019290925284519091600191620003e39183919088019062000507565b506020828101518051620003fe926001850192019062000507565b50604091909101516002909101805460ff191660ff9092169190911790555062000a5795505050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600080836200048b6002856200087f565b60ff166200049a9190620008b0565b620004a7906002620008d0565b90506102e06000620004bb836040620008b0565b620004c79083620008d0565b90506000620004d8601083620008e6565b9050600060208260008b3c50506000516001600160801b0381161560809190911c151916979650505050505050565b82805482825590600052602060002090810192821562000552579160200282015b828111156200055257825182906200054190826200098b565b509160200191906001019062000528565b506200056092915062000564565b5090565b80821115620005605760006200057b828262000585565b5060010162000564565b5080546200059390620008fc565b6000825580601f10620005a4575050565b601f016020900490600052602060002090810190620005c49190620005c7565b50565b5b80821115620005605760008155600101620005c8565b6001600160a01b0381168114620005c457600080fd5b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715620006355762000635620005f4565b604052919050565b6000601f83818401126200065057600080fd5b825160206001600160401b03808311156200066f576200066f620005f4565b8260051b620006808382016200060a565b93845286810183019383810190898611156200069b57600080fd5b84890192505b858310156200074e57825184811115620006bb5760008081fd5b8901603f81018b13620006ce5760008081fd5b8581015185811115620006e557620006e5620005f4565b620006f8818a01601f191688016200060a565b81815260408d81848601011115620007105760008081fd5b60005b8381101562000730578481018201518382018b0152890162000713565b505060009181018801919091528352509184019190840190620006a1565b9998505050505050505050565b600080600080600080600060e0888a0312156200077757600080fd5b87516200078481620005de565b60208901519097506200079781620005de565b6040890151909650620007aa81620005de565b6060890151909550620007bd81620005de565b60808901519094506001600160401b0380821115620007db57600080fd5b620007e98b838c016200063d565b945060a08a01519150808211156200080057600080fd5b506200080f8a828b016200063d565b92505060c088015160ff811681146200082757600080fd5b8091505092959891949750929550565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600182016200087857620008786200084d565b5060010190565b600060ff831680620008a157634e487b7160e01b600052601260045260246000fd5b8060ff84160491505092915050565b8082028115828204841417620008ca57620008ca6200084d565b92915050565b80820180821115620008ca57620008ca6200084d565b81810381811115620008ca57620008ca6200084d565b600181811c908216806200091157607f821691505b6020821081036200093257634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200098657600081815260208120601f850160051c81016020861015620009615750805b601f850160051c820191505b8181101562000982578281556001016200096d565b5050505b505050565b81516001600160401b03811115620009a757620009a7620005f4565b620009bf81620009b88454620008fc565b8462000938565b602080601f831160018114620009f75760008415620009de5750858301515b600019600386901b1c1916600185901b17855562000982565b600085815260208120601f198616915b8281101562000a285788860151825594840194600190910190840162000a07565b508582101562000a475787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e051611e5a62000aa66000396000610cb801526000610514015260006103500152600081816101380152818161037d015281816105410152610ce50152611e5a6000f3fe608060405234801561001057600080fd5b50600436106100a95760003560e01c80637950c5f8116100715780637950c5f8146101335780638da5cb5b146101725780639c38255914610183578063a3c4bcf8146101a6578063c7ddca0e146101c9578063f2fde38b146101dc57600080fd5b806305ab9860146100ae57806319b33968146100c357806349ce8997146100ec578063715018a61461010c57806379502c5514610114575b600080fd5b6100c16100bc3660046114cb565b6101ef565b005b6100d66100d1366004611567565b610660565b6040516100e3919061163b565b60405180910390f35b6100ff6100fa366004611567565b610973565b6040516100e39190611655565b6100c1610a0d565b6003546101219060ff1681565b60405160ff90911681526020016100e3565b61015a7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016100e3565b6000546001600160a01b031661015a565b6101966101913660046116d8565b610a21565b60405190151581526020016100e3565b6101b96101b4366004611567565b610d5f565b6040516100e3949392919061176a565b6100c16101d73660046117b7565b610fbf565b6100c16101ea366004611911565b611260565b6101f76112d9565b600082511161024d5760405162461bcd60e51b815260206004820152601d60248201527f496e76616c696420746f74616c2062616c616e636573206c656e67746800000060448201526064015b60405180910390fd5b815161025a906040611950565b83146102a85760405162461bcd60e51b815260206004820152601e60248201527f496e76616c6964206772616e642073756d2070726f6f66206c656e67746800006044820152606401610244565b8285116102f75760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420736e61726b2070726f6f66206c656e6774680000000000006044820152606401610244565b6040805160018082528183019092526000916020808301908036833701905050905060008160008151811061032e5761032e61196d565b602090810291909101015260405163af83a18d60e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063af83a18d906103ab907f0000000000000000000000000000000000000000000000000000000000000000908b908b9087906004016119e7565b602060405180830381865afa1580156103c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103ec9190611a1e565b61042e5760405162461bcd60e51b815260206004820152601360248201527224b73b30b634b21039b730b93590383937b7b360691b6044820152606401610244565b6001548351146104a65760405162461bcd60e51b815260206004820152603a60248201527f4c696162696c69747920636f6d6d69746d656e747320616e642063727970746f60448201527f63757272656e63696573206e756d626572206d69736d617463680000000000006064820152608401610244565b3660008881896104b7896040611a40565b926104c493929190611a53565b9092509050600087876104da8460408188611a53565b6040516020016104ed9493929190611a7d565b60408051601f198184030181529082905263af83a18d60e01b825291506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063af83a18d9061056d907f00000000000000000000000000000000000000000000000000000000000000009085908b90600401611a9f565b602060405180830381865afa15801561058a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105ae9190611a1e565b6105fa5760405162461bcd60e51b815260206004820152601760248201527f496e76616c6964206772616e642073756d2070726f6f660000000000000000006044820152606401610244565b6000858152600560205260409020610613838583611b68565b50847f7603a12a8838a565715ddb5bbf625b3f00a5e6f4793437537963e30c3b9495dc8785858c8c60405161064c959493929190611c29565b60405180910390a250505050505050505050565b61068b6040518060800160405280606081526020016060815260200160608152602001606081525090565b6000828152600660205260409020546106dd5760405162461bcd60e51b81526020600482015260146024820152731059191c995cdcc81b9bdd081d995c9a599a595960621b6044820152606401610244565b6000828152600660205260409020546004906106fb90600190611c70565b8154811061070b5761070b61196d565b906000526020600020906004020160405180608001604052908160008201805461073490611adf565b80601f016020809104026020016040519081016040528092919081815260200182805461076090611adf565b80156107ad5780601f10610782576101008083540402835291602001916107ad565b820191906000526020600020905b81548152906001019060200180831161079057829003601f168201915b505050505081526020016001820180546107c690611adf565b80601f01602080910402602001604051908101604052809291908181526020018280546107f290611adf565b801561083f5780601f106108145761010080835404028352916020019161083f565b820191906000526020600020905b81548152906001019060200180831161082257829003601f168201915b5050505050815260200160028201805461085890611adf565b80601f016020809104026020016040519081016040528092919081815260200182805461088490611adf565b80156108d15780601f106108a6576101008083540402835291602001916108d1565b820191906000526020600020905b8154815290600101906020018083116108b457829003601f168201915b505050505081526020016003820180546108ea90611adf565b80601f016020809104026020016040519081016040528092919081815260200182805461091690611adf565b80156109635780601f1061093857610100808354040283529160200191610963565b820191906000526020600020905b81548152906001019060200180831161094657829003601f168201915b5050505050815250509050919050565b6005602052600090815260409020805461098c90611adf565b80601f01602080910402602001604051908101604052809291908181526020018280546109b890611adf565b8015610a055780601f106109da57610100808354040283529160200191610a05565b820191906000526020600020905b8154815290600101906020018083116109e857829003601f168201915b505050505081565b610a156112d9565b610a1f6000611333565b565b60008251600414610a745760405162461bcd60e51b815260206004820152601960248201527f496e76616c6964206368616c6c656e676573206c656e677468000000000000006044820152606401610244565b6001805483519091610a8591611c70565b14610add5760405162461bcd60e51b815260206004820152602260248201527f56616c756573206c656e677468206d69736d61746368207769746820636f6e66604482015261696760f01b6064820152608401610244565b60008581526005602052604081208054610af690611adf565b80601f0160208091040260200160405190810160405280929190818152602001828054610b2290611adf565b8015610b6f5780601f10610b4457610100808354040283529160200191610b6f565b820191906000526020600020905b815481529060010190602001808311610b5257829003601f168201915b50505050509050600085518251610b869190611a40565b67ffffffffffffffff811115610b9e57610b9e6113cc565b6040519080825280601f01601f191660200182016040528015610bc8576020820181803683370190505b50905060005b8651811015610c2f57868181518110610be957610be961196d565b602001015160f81c60f81b828281518110610c0657610c0661196d565b60200101906001600160f81b031916908160001a90535080610c2781611c83565b915050610bce565b5060005b8251811015610ca057828181518110610c4e57610c4e61196d565b602001015160f81c60f81b82885183610c679190611a40565b81518110610c7757610c7761196d565b60200101906001600160f81b031916908160001a90535080610c9881611c83565b915050610c33565b506040516323fb5ad560e11b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906347f6b5aa90610d13907f00000000000000000000000000000000000000000000000000000000000000009085908a908a90600401611c9c565b602060405180830381865afa158015610d30573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d549190611a1e565b979650505050505050565b60048181548110610d6f57600080fd5b9060005260206000209060040201600091509050806000018054610d9290611adf565b80601f0160208091040260200160405190810160405280929190818152602001828054610dbe90611adf565b8015610e0b5780601f10610de057610100808354040283529160200191610e0b565b820191906000526020600020905b815481529060010190602001808311610dee57829003601f168201915b505050505090806001018054610e2090611adf565b80601f0160208091040260200160405190810160405280929190818152602001828054610e4c90611adf565b8015610e995780601f10610e6e57610100808354040283529160200191610e99565b820191906000526020600020905b815481529060010190602001808311610e7c57829003601f168201915b505050505090806002018054610eae90611adf565b80601f0160208091040260200160405190810160405280929190818152602001828054610eda90611adf565b8015610f275780601f10610efc57610100808354040283529160200191610f27565b820191906000526020600020905b815481529060010190602001808311610f0a57829003601f168201915b505050505090806003018054610f3c90611adf565b80601f0160208091040260200160405190810160405280929190818152602001828054610f6890611adf565b8015610fb55780601f10610f8a57610100808354040283529160200191610fb5565b820191906000526020600020905b815481529060010190602001808311610f9857829003601f168201915b5050505050905084565b610fc76112d9565b60005b8151811015611225576000828281518110610fe757610fe761196d565b6020026020010151600001516040516020016110039190611ce6565b60408051601f1981840301815291815281516020928301206000818152600690935291205490915080156110795760405162461bcd60e51b815260206004820152601860248201527f4164647265737320616c726561647920766572696669656400000000000000006044820152606401610244565b600484848151811061108d5761108d61196d565b602090810291909101810151825460018101845560009384529190922082516004909202019081906110bf9082611d02565b50602082015160018201906110d49082611d02565b50604082015160028201906110e99082611d02565b50606082015160038201906110fe9082611d02565b50506004546000848152600660205260409020555083518490849081106111275761112761196d565b6020026020010151600001515160001415801561116357508383815181106111515761115161196d565b60200260200101516020015151600014155b801561118e575083838151811061117c5761117c61196d565b60200260200101516040015151600014155b80156111b957508383815181106111a7576111a761196d565b60200260200101516060015151600014155b6112105760405162461bcd60e51b815260206004820152602260248201527f496e76616c69642070726f6f66206f662061646472657373206f776e65727368604482015261069760f41b6064820152608401610244565b5050808061121d90611c83565b915050610fca565b507f382315d4d56a6035e1899bffe77d9becefaf5f2650e4323b27854857a0454658816040516112559190611dc2565b60405180910390a150565b6112686112d9565b6001600160a01b0381166112cd5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610244565b6112d681611333565b50565b6000546001600160a01b03163314610a1f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610244565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60008083601f84011261139557600080fd5b50813567ffffffffffffffff8111156113ad57600080fd5b6020830191508360208285010111156113c557600080fd5b9250929050565b634e487b7160e01b600052604160045260246000fd5b6040516080810167ffffffffffffffff81118282101715611405576114056113cc565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715611434576114346113cc565b604052919050565b600067ffffffffffffffff821115611456576114566113cc565b5060051b60200190565b600082601f83011261147157600080fd5b813560206114866114818361143c565b61140b565b82815260059290921b840181019181810190868411156114a557600080fd5b8286015b848110156114c057803583529183019183016114a9565b509695505050505050565b600080600080600080608087890312156114e457600080fd5b863567ffffffffffffffff808211156114fc57600080fd5b6115088a838b01611383565b9098509650602089013591508082111561152157600080fd5b61152d8a838b01611383565b9096509450604089013591508082111561154657600080fd5b5061155389828a01611460565b925050606087013590509295509295509295565b60006020828403121561157957600080fd5b5035919050565b60005b8381101561159b578181015183820152602001611583565b50506000910152565b600081518084526115bc816020860160208601611580565b601f01601f19169290920160200192915050565b60008151608084526115e560808501826115a4565b9050602083015184820360208601526115fe82826115a4565b9150506040830151848203604086015261161882826115a4565b9150506060830151848203606086015261163282826115a4565b95945050505050565b60208152600061164e60208301846115d0565b9392505050565b60208152600061164e60208301846115a4565b600082601f83011261167957600080fd5b813567ffffffffffffffff811115611693576116936113cc565b6116a6601f8201601f191660200161140b565b8181528460208386010111156116bb57600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080608085870312156116ee57600080fd5b84359350602085013567ffffffffffffffff8082111561170d57600080fd5b61171988838901611668565b9450604087013591508082111561172f57600080fd5b61173b88838901611460565b9350606087013591508082111561175157600080fd5b5061175e87828801611460565b91505092959194509250565b60808152600061177d60808301876115a4565b828103602084015261178f81876115a4565b905082810360408401526117a381866115a4565b90508281036060840152610d5481856115a4565b600060208083850312156117ca57600080fd5b823567ffffffffffffffff808211156117e257600080fd5b818501915085601f8301126117f657600080fd5b81356118046114818261143c565b81815260059190911b8301840190848101908883111561182357600080fd5b8585015b838110156119045780358581111561183e57600080fd5b86016080818c03601f190112156118555760008081fd5b61185d6113e2565b888201358781111561186f5760008081fd5b61187d8d8b83860101611668565b825250604080830135888111156118945760008081fd5b6118a28e8c83870101611668565b8b84015250606080840135898111156118bb5760008081fd5b6118c98f8d83880101611668565b838501525060808401359150888211156118e35760008081fd5b6118f18e8c84870101611668565b9083015250845250918601918601611827565b5098975050505050505050565b60006020828403121561192357600080fd5b81356001600160a01b038116811461164e57600080fd5b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176119675761196761193a565b92915050565b634e487b7160e01b600052603260045260246000fd5b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b600081518084526020808501945080840160005b838110156119dc578151875295820195908201906001016119c0565b509495945050505050565b6001600160a01b0385168152606060208201819052600090611a0c9083018587611983565b8281036040840152610d5481856119ac565b600060208284031215611a3057600080fd5b8151801515811461164e57600080fd5b808201808211156119675761196761193a565b60008085851115611a6357600080fd5b83861115611a7057600080fd5b5050820193919092039150565b8385823760008482016000815283858237600093019283525090949350505050565b6001600160a01b0384168152606060208201819052600090611ac3908301856115a4565b8281036040840152611ad581856119ac565b9695505050505050565b600181811c90821680611af357607f821691505b602082108103611b1357634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115611b6357600081815260208120601f850160051c81016020861015611b405750805b601f850160051c820191505b81811015611b5f57828155600101611b4c565b5050505b505050565b67ffffffffffffffff831115611b8057611b806113cc565b611b9483611b8e8354611adf565b83611b19565b6000601f841160018114611bc85760008515611bb05750838201355b600019600387901b1c1916600186901b178355611c22565b600083815260209020601f19861690835b82811015611bf95786850135825560209485019460019092019101611bd9565b5086821015611c165760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b606081526000611c3c60608301886119ac565b8281036020840152611c4f818789611983565b90508281036040840152611c64818587611983565b98975050505050505050565b818103818111156119675761196761193a565b600060018201611c9557611c9561193a565b5060010190565b6001600160a01b0385168152608060208201819052600090611cc0908301866115a4565b8281036040840152611cd281866119ac565b90508281036060840152610d5481856119ac565b60008251611cf8818460208701611580565b9190910192915050565b815167ffffffffffffffff811115611d1c57611d1c6113cc565b611d3081611d2a8454611adf565b84611b19565b602080601f831160018114611d655760008415611d4d5750858301515b600019600386901b1c1916600185901b178555611b5f565b600085815260208120601f198616915b82811015611d9457888601518255948401946001909101908401611d75565b5085821015611db25787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015611e1757603f19888603018452611e058583516115d0565b94509285019290850190600101611de9565b509297965050505050505056fea26469706673582212209a722da9dd0f80b828b07566849d43bf66d6ec20c2cd3e06b9d08cd3fa7ded4164736f6c63430008120033","deployedBytecode":"0x608060405234801561001057600080fd5b50600436106100a95760003560e01c80637950c5f8116100715780637950c5f8146101335780638da5cb5b146101725780639c38255914610183578063a3c4bcf8146101a6578063c7ddca0e146101c9578063f2fde38b146101dc57600080fd5b806305ab9860146100ae57806319b33968146100c357806349ce8997146100ec578063715018a61461010c57806379502c5514610114575b600080fd5b6100c16100bc3660046114cb565b6101ef565b005b6100d66100d1366004611567565b610660565b6040516100e3919061163b565b60405180910390f35b6100ff6100fa366004611567565b610973565b6040516100e39190611655565b6100c1610a0d565b6003546101219060ff1681565b60405160ff90911681526020016100e3565b61015a7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016100e3565b6000546001600160a01b031661015a565b6101966101913660046116d8565b610a21565b60405190151581526020016100e3565b6101b96101b4366004611567565b610d5f565b6040516100e3949392919061176a565b6100c16101d73660046117b7565b610fbf565b6100c16101ea366004611911565b611260565b6101f76112d9565b600082511161024d5760405162461bcd60e51b815260206004820152601d60248201527f496e76616c696420746f74616c2062616c616e636573206c656e67746800000060448201526064015b60405180910390fd5b815161025a906040611950565b83146102a85760405162461bcd60e51b815260206004820152601e60248201527f496e76616c6964206772616e642073756d2070726f6f66206c656e67746800006044820152606401610244565b8285116102f75760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420736e61726b2070726f6f66206c656e6774680000000000006044820152606401610244565b6040805160018082528183019092526000916020808301908036833701905050905060008160008151811061032e5761032e61196d565b602090810291909101015260405163af83a18d60e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063af83a18d906103ab907f0000000000000000000000000000000000000000000000000000000000000000908b908b9087906004016119e7565b602060405180830381865afa1580156103c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103ec9190611a1e565b61042e5760405162461bcd60e51b815260206004820152601360248201527224b73b30b634b21039b730b93590383937b7b360691b6044820152606401610244565b6001548351146104a65760405162461bcd60e51b815260206004820152603a60248201527f4c696162696c69747920636f6d6d69746d656e747320616e642063727970746f60448201527f63757272656e63696573206e756d626572206d69736d617463680000000000006064820152608401610244565b3660008881896104b7896040611a40565b926104c493929190611a53565b9092509050600087876104da8460408188611a53565b6040516020016104ed9493929190611a7d565b60408051601f198184030181529082905263af83a18d60e01b825291506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063af83a18d9061056d907f00000000000000000000000000000000000000000000000000000000000000009085908b90600401611a9f565b602060405180830381865afa15801561058a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105ae9190611a1e565b6105fa5760405162461bcd60e51b815260206004820152601760248201527f496e76616c6964206772616e642073756d2070726f6f660000000000000000006044820152606401610244565b6000858152600560205260409020610613838583611b68565b50847f7603a12a8838a565715ddb5bbf625b3f00a5e6f4793437537963e30c3b9495dc8785858c8c60405161064c959493929190611c29565b60405180910390a250505050505050505050565b61068b6040518060800160405280606081526020016060815260200160608152602001606081525090565b6000828152600660205260409020546106dd5760405162461bcd60e51b81526020600482015260146024820152731059191c995cdcc81b9bdd081d995c9a599a595960621b6044820152606401610244565b6000828152600660205260409020546004906106fb90600190611c70565b8154811061070b5761070b61196d565b906000526020600020906004020160405180608001604052908160008201805461073490611adf565b80601f016020809104026020016040519081016040528092919081815260200182805461076090611adf565b80156107ad5780601f10610782576101008083540402835291602001916107ad565b820191906000526020600020905b81548152906001019060200180831161079057829003601f168201915b505050505081526020016001820180546107c690611adf565b80601f01602080910402602001604051908101604052809291908181526020018280546107f290611adf565b801561083f5780601f106108145761010080835404028352916020019161083f565b820191906000526020600020905b81548152906001019060200180831161082257829003601f168201915b5050505050815260200160028201805461085890611adf565b80601f016020809104026020016040519081016040528092919081815260200182805461088490611adf565b80156108d15780601f106108a6576101008083540402835291602001916108d1565b820191906000526020600020905b8154815290600101906020018083116108b457829003601f168201915b505050505081526020016003820180546108ea90611adf565b80601f016020809104026020016040519081016040528092919081815260200182805461091690611adf565b80156109635780601f1061093857610100808354040283529160200191610963565b820191906000526020600020905b81548152906001019060200180831161094657829003601f168201915b5050505050815250509050919050565b6005602052600090815260409020805461098c90611adf565b80601f01602080910402602001604051908101604052809291908181526020018280546109b890611adf565b8015610a055780601f106109da57610100808354040283529160200191610a05565b820191906000526020600020905b8154815290600101906020018083116109e857829003601f168201915b505050505081565b610a156112d9565b610a1f6000611333565b565b60008251600414610a745760405162461bcd60e51b815260206004820152601960248201527f496e76616c6964206368616c6c656e676573206c656e677468000000000000006044820152606401610244565b6001805483519091610a8591611c70565b14610add5760405162461bcd60e51b815260206004820152602260248201527f56616c756573206c656e677468206d69736d61746368207769746820636f6e66604482015261696760f01b6064820152608401610244565b60008581526005602052604081208054610af690611adf565b80601f0160208091040260200160405190810160405280929190818152602001828054610b2290611adf565b8015610b6f5780601f10610b4457610100808354040283529160200191610b6f565b820191906000526020600020905b815481529060010190602001808311610b5257829003601f168201915b50505050509050600085518251610b869190611a40565b67ffffffffffffffff811115610b9e57610b9e6113cc565b6040519080825280601f01601f191660200182016040528015610bc8576020820181803683370190505b50905060005b8651811015610c2f57868181518110610be957610be961196d565b602001015160f81c60f81b828281518110610c0657610c0661196d565b60200101906001600160f81b031916908160001a90535080610c2781611c83565b915050610bce565b5060005b8251811015610ca057828181518110610c4e57610c4e61196d565b602001015160f81c60f81b82885183610c679190611a40565b81518110610c7757610c7761196d565b60200101906001600160f81b031916908160001a90535080610c9881611c83565b915050610c33565b506040516323fb5ad560e11b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906347f6b5aa90610d13907f00000000000000000000000000000000000000000000000000000000000000009085908a908a90600401611c9c565b602060405180830381865afa158015610d30573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d549190611a1e565b979650505050505050565b60048181548110610d6f57600080fd5b9060005260206000209060040201600091509050806000018054610d9290611adf565b80601f0160208091040260200160405190810160405280929190818152602001828054610dbe90611adf565b8015610e0b5780601f10610de057610100808354040283529160200191610e0b565b820191906000526020600020905b815481529060010190602001808311610dee57829003601f168201915b505050505090806001018054610e2090611adf565b80601f0160208091040260200160405190810160405280929190818152602001828054610e4c90611adf565b8015610e995780601f10610e6e57610100808354040283529160200191610e99565b820191906000526020600020905b815481529060010190602001808311610e7c57829003601f168201915b505050505090806002018054610eae90611adf565b80601f0160208091040260200160405190810160405280929190818152602001828054610eda90611adf565b8015610f275780601f10610efc57610100808354040283529160200191610f27565b820191906000526020600020905b815481529060010190602001808311610f0a57829003601f168201915b505050505090806003018054610f3c90611adf565b80601f0160208091040260200160405190810160405280929190818152602001828054610f6890611adf565b8015610fb55780601f10610f8a57610100808354040283529160200191610fb5565b820191906000526020600020905b815481529060010190602001808311610f9857829003601f168201915b5050505050905084565b610fc76112d9565b60005b8151811015611225576000828281518110610fe757610fe761196d565b6020026020010151600001516040516020016110039190611ce6565b60408051601f1981840301815291815281516020928301206000818152600690935291205490915080156110795760405162461bcd60e51b815260206004820152601860248201527f4164647265737320616c726561647920766572696669656400000000000000006044820152606401610244565b600484848151811061108d5761108d61196d565b602090810291909101810151825460018101845560009384529190922082516004909202019081906110bf9082611d02565b50602082015160018201906110d49082611d02565b50604082015160028201906110e99082611d02565b50606082015160038201906110fe9082611d02565b50506004546000848152600660205260409020555083518490849081106111275761112761196d565b6020026020010151600001515160001415801561116357508383815181106111515761115161196d565b60200260200101516020015151600014155b801561118e575083838151811061117c5761117c61196d565b60200260200101516040015151600014155b80156111b957508383815181106111a7576111a761196d565b60200260200101516060015151600014155b6112105760405162461bcd60e51b815260206004820152602260248201527f496e76616c69642070726f6f66206f662061646472657373206f776e65727368604482015261069760f41b6064820152608401610244565b5050808061121d90611c83565b915050610fca565b507f382315d4d56a6035e1899bffe77d9becefaf5f2650e4323b27854857a0454658816040516112559190611dc2565b60405180910390a150565b6112686112d9565b6001600160a01b0381166112cd5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610244565b6112d681611333565b50565b6000546001600160a01b03163314610a1f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610244565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60008083601f84011261139557600080fd5b50813567ffffffffffffffff8111156113ad57600080fd5b6020830191508360208285010111156113c557600080fd5b9250929050565b634e487b7160e01b600052604160045260246000fd5b6040516080810167ffffffffffffffff81118282101715611405576114056113cc565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715611434576114346113cc565b604052919050565b600067ffffffffffffffff821115611456576114566113cc565b5060051b60200190565b600082601f83011261147157600080fd5b813560206114866114818361143c565b61140b565b82815260059290921b840181019181810190868411156114a557600080fd5b8286015b848110156114c057803583529183019183016114a9565b509695505050505050565b600080600080600080608087890312156114e457600080fd5b863567ffffffffffffffff808211156114fc57600080fd5b6115088a838b01611383565b9098509650602089013591508082111561152157600080fd5b61152d8a838b01611383565b9096509450604089013591508082111561154657600080fd5b5061155389828a01611460565b925050606087013590509295509295509295565b60006020828403121561157957600080fd5b5035919050565b60005b8381101561159b578181015183820152602001611583565b50506000910152565b600081518084526115bc816020860160208601611580565b601f01601f19169290920160200192915050565b60008151608084526115e560808501826115a4565b9050602083015184820360208601526115fe82826115a4565b9150506040830151848203604086015261161882826115a4565b9150506060830151848203606086015261163282826115a4565b95945050505050565b60208152600061164e60208301846115d0565b9392505050565b60208152600061164e60208301846115a4565b600082601f83011261167957600080fd5b813567ffffffffffffffff811115611693576116936113cc565b6116a6601f8201601f191660200161140b565b8181528460208386010111156116bb57600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080608085870312156116ee57600080fd5b84359350602085013567ffffffffffffffff8082111561170d57600080fd5b61171988838901611668565b9450604087013591508082111561172f57600080fd5b61173b88838901611460565b9350606087013591508082111561175157600080fd5b5061175e87828801611460565b91505092959194509250565b60808152600061177d60808301876115a4565b828103602084015261178f81876115a4565b905082810360408401526117a381866115a4565b90508281036060840152610d5481856115a4565b600060208083850312156117ca57600080fd5b823567ffffffffffffffff808211156117e257600080fd5b818501915085601f8301126117f657600080fd5b81356118046114818261143c565b81815260059190911b8301840190848101908883111561182357600080fd5b8585015b838110156119045780358581111561183e57600080fd5b86016080818c03601f190112156118555760008081fd5b61185d6113e2565b888201358781111561186f5760008081fd5b61187d8d8b83860101611668565b825250604080830135888111156118945760008081fd5b6118a28e8c83870101611668565b8b84015250606080840135898111156118bb5760008081fd5b6118c98f8d83880101611668565b838501525060808401359150888211156118e35760008081fd5b6118f18e8c84870101611668565b9083015250845250918601918601611827565b5098975050505050505050565b60006020828403121561192357600080fd5b81356001600160a01b038116811461164e57600080fd5b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176119675761196761193a565b92915050565b634e487b7160e01b600052603260045260246000fd5b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b600081518084526020808501945080840160005b838110156119dc578151875295820195908201906001016119c0565b509495945050505050565b6001600160a01b0385168152606060208201819052600090611a0c9083018587611983565b8281036040840152610d5481856119ac565b600060208284031215611a3057600080fd5b8151801515811461164e57600080fd5b808201808211156119675761196761193a565b60008085851115611a6357600080fd5b83861115611a7057600080fd5b5050820193919092039150565b8385823760008482016000815283858237600093019283525090949350505050565b6001600160a01b0384168152606060208201819052600090611ac3908301856115a4565b8281036040840152611ad581856119ac565b9695505050505050565b600181811c90821680611af357607f821691505b602082108103611b1357634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115611b6357600081815260208120601f850160051c81016020861015611b405750805b601f850160051c820191505b81811015611b5f57828155600101611b4c565b5050505b505050565b67ffffffffffffffff831115611b8057611b806113cc565b611b9483611b8e8354611adf565b83611b19565b6000601f841160018114611bc85760008515611bb05750838201355b600019600387901b1c1916600186901b178355611c22565b600083815260209020601f19861690835b82811015611bf95786850135825560209485019460019092019101611bd9565b5086821015611c165760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b606081526000611c3c60608301886119ac565b8281036020840152611c4f818789611983565b90508281036040840152611c64818587611983565b98975050505050505050565b818103818111156119675761196761193a565b600060018201611c9557611c9561193a565b5060010190565b6001600160a01b0385168152608060208201819052600090611cc0908301866115a4565b8281036040840152611cd281866119ac565b90508281036060840152610d5481856119ac565b60008251611cf8818460208701611580565b9190910192915050565b815167ffffffffffffffff811115611d1c57611d1c6113cc565b611d3081611d2a8454611adf565b84611b19565b602080601f831160018114611d655760008415611d4d5750858301515b600019600386901b1c1916600185901b178555611b5f565b600085815260208120601f198616915b82811015611d9457888601518255948401946001909101908401611d75565b5085821015611db25787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015611e1757603f19888603018452611e058583516115d0565b94509285019290850190600101611de9565b509297965050505050505056fea26469706673582212209a722da9dd0f80b828b07566849d43bf66d6ec20c2cd3e06b9d08cd3fa7ded4164736f6c63430008120033","linkReferences":{},"deployedLinkReferences":{}} \ No newline at end of file diff --git a/backend/src/contracts/abi/VerifyingKey.json b/backend/src/contracts/abi/VerifyingKey.json deleted file mode 100644 index 4ff9d945..00000000 --- a/backend/src/contracts/abi/VerifyingKey.json +++ /dev/null @@ -1 +0,0 @@ -{"_format":"hh-sol-artifact-1","contractName":"Halo2VerifyingKey","sourceName":"src/VerifyingKey.sol","abi":[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"}],"bytecode":"0x608060405234801561001057600080fd5b5060007e996ed64113d5d86f42caab0f3d25466b0856015472de4bb809f168aabc2567815260116020527f30643640b9f82f90e83b698e5ea6179c7c05542e859533b48b9953a2f53608016040527f304cd1e79cfa5b0f054e981a27ed7706e7ea6b06a7f266ef8db819c179c2c3ea6060527f193586da872cdeff023d6ab2263a131b4780db8878be3c3b7f8f019c06fcb0fb6080527f299110e6835fd73731fb3ce6de87151988da403c265467a96b9cda0d7daa72e460a052600160c0528060e0528061010052806101205280610140526001610160526002610180527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c26101a0527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6101c0527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b6101e0527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa610200527f26186a2d65ee4d2f9c9a5b91f86597d35f192cd120caf7e935d8443d1938e23d610220527f30441fd1b5d3370482c42152a8899027716989a6996c2535bc9f7fee8aaef79e610240527f16f363f103c80d7bbc8ad3c6867e0822bbc6000be91a4689755c7df40221c145610260527f2b1cbb3e521edf5a622d82762a44a5e63f1e50b332d71154a4a7958d6011deff610280527f1404a2d17cd02c8f9fd79d74ac73c67d1881e62c6af354fa74d235c5e37dacfe6102a0527f2c1e30781f735e7977820d4ca9145010e28dcc808ee0f1e976477289057b7aec6102c0527f2dd3fd59098a5b4b4a616568bb6ba1a1e4c40e4b0df9ae94e37944d55ab651cf6102e0527f25680c3525ba04435a9034d6e69c96de5133edfe37c226d3e31b60eff6b34ef0610300527f1a224e6aeb9bb7de12c761fd1f49a733ff410c3f772aad6a2ec3c4decad43307610320527f300a66b376af1187694e25dbcea3aac63114716af822fd4661519adbf9c649e9610340527f27a7a66087a8c17b00ffb7fe9b76ba2199ca308bcb0ad100fa181886d6c9b936610360527f23bc951a3c4307384bdec5d61be122a19c933db3266d6327a472e5203a9f785a610380527f0743ea40f14084db2673217283aa053f986896ee7c181f52118442e99c4529746103a0527f0203e3493a2594ece57d22cc75dd081ac68271ec7c758153cfd2152bfb5c19e36103c0527f0f85936c44708409e3e9fb5e2a7ea6604b06997f0ac7fd488e3f147e05a88dbe6103e0527f0497fbb7c4436dcf36ede6a30ad62e016e059a11a6548eb6980edeb2f1052133610400527f0dcbacf368c01f61375c242e35edab12a22147e9d46bf685fb75454d60f5edbc610420527f17720c95139aa3f5dec5b6bd56082f8deded2e4a1425d0a91e2743dd294fdc9c610440527f284ac053d96a33fca69eca00e16eea75ad1bf008d2a742fc846ac73d17d46d73610460527f14f45666a26b8d472186dbf78e606a82891e0f122a54264418cfe2615003dfb9610480527f1c517c335ad634422ef2eb5f615926e875afa9e9c589abf528d315a8a586b22d6104a0527f1220b1b13c91e8115106144bc417d4d3e6a9de3fb70406e68b4a5fd8a92f43276104c0527f0cbaead666e172b1801b7ad17c3450ea2ce7d53c1e392cedf05023e59e53c95a6104e0527f0ce200ab515efc390c459e0b492c15a50024c57fa70768c18389924e1e72982b610500527f1d4848e8db74251fd01e018fedb71ca8e04c41746474ad4b4a39da132f86f30b610520527f148a2252b7b6a07e21aa1bc5b1cc4826ac7f4a7a3e29fb7399dd7029d4bdaf276105405261056081f3fe","deployedBytecode":"0x6080604052600080fdfea26469706673582212207c80617d071a4e94f54a68097fd35e2444402dadbf01772e6352e9def6be37da64736f6c63430008120033","linkReferences":{},"deployedLinkReferences":{}} \ No newline at end of file diff --git a/backend/src/contracts/deployments.json b/backend/src/contracts/deployments.json deleted file mode 100644 index 81e8bab9..00000000 --- a/backend/src/contracts/deployments.json +++ /dev/null @@ -1 +0,0 @@ -{"31337":{"address":"0xDc64a140Aa3E981100a9becA4E685f962f0cF6C9"}} \ No newline at end of file diff --git a/backend/src/contracts/generated/grandsum_verifier.rs b/backend/src/contracts/generated/grandsum_verifier.rs deleted file mode 100644 index 8b6f7014..00000000 --- a/backend/src/contracts/generated/grandsum_verifier.rs +++ /dev/null @@ -1,2747 +0,0 @@ -pub use grand_sum_verifier::*; -/// This module was auto-generated with ethers-rs Abigen. -/// More information at: -#[allow( - clippy::enum_variant_names, - clippy::too_many_arguments, - clippy::upper_case_acronyms, - clippy::type_complexity, - dead_code, - non_camel_case_types, -)] -pub mod grand_sum_verifier { - #[rustfmt::skip] - const __ABI: &str = "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"vk\",\"type\":\"address\",\"components\":[]},{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\",\"components\":[]},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\",\"components\":[]}],\"stateMutability\":\"nonpayable\",\"type\":\"function\",\"name\":\"verifyProof\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\",\"components\":[]}]}]"; - ///The parsed JSON ABI of the contract. - pub static GRANDSUMVERIFIER_ABI: ::ethers::contract::Lazy< - ::ethers::core::abi::Abi, - > = ::ethers::contract::Lazy::new(|| { - ::ethers::core::utils::__serde_json::from_str(__ABI) - .expect("ABI is always valid") - }); - #[rustfmt::skip] - const __BYTECODE: &[u8] = &[ - 96, - 128, - 96, - 64, - 82, - 52, - 128, - 21, - 97, - 0, - 16, - 87, - 96, - 0, - 128, - 253, - 91, - 80, - 97, - 4, - 254, - 128, - 97, - 0, - 32, - 96, - 0, - 57, - 96, - 0, - 243, - 254, - 96, - 128, - 96, - 64, - 82, - 52, - 128, - 21, - 97, - 0, - 16, - 87, - 96, - 0, - 128, - 253, - 91, - 80, - 96, - 4, - 54, - 16, - 97, - 0, - 43, - 87, - 96, - 0, - 53, - 96, - 224, - 28, - 128, - 99, - 175, - 131, - 161, - 141, - 20, - 97, - 0, - 48, - 87, - 91, - 96, - 0, - 128, - 253, - 91, - 97, - 0, - 67, - 97, - 0, - 62, - 54, - 96, - 4, - 97, - 4, - 11, - 86, - 91, - 97, - 0, - 87, - 86, - 91, - 96, - 64, - 81, - 144, - 21, - 21, - 129, - 82, - 96, - 32, - 1, - 96, - 64, - 81, - 128, - 145, - 3, - 144, - 243, - 91, - 96, - 0, - 97, - 1, - 53, - 86, - 91, - 96, - 32, - 130, - 1, - 53, - 131, - 129, - 16, - 131, - 53, - 133, - 129, - 16, - 132, - 22, - 145, - 144, - 145, - 22, - 145, - 133, - 96, - 3, - 129, - 128, - 133, - 128, - 9, - 133, - 9, - 8, - 134, - 130, - 131, - 9, - 20, - 131, - 22, - 146, - 80, - 80, - 80, - 147, - 146, - 80, - 80, - 80, - 86, - 91, - 129, - 96, - 192, - 82, - 130, - 96, - 224, - 82, - 96, - 0, - 96, - 64, - 96, - 128, - 128, - 96, - 128, - 96, - 6, - 90, - 250, - 144, - 145, - 22, - 147, - 146, - 80, - 80, - 80, - 86, - 91, - 129, - 96, - 192, - 82, - 96, - 0, - 96, - 64, - 96, - 128, - 96, - 96, - 96, - 128, - 96, - 7, - 90, - 250, - 144, - 145, - 22, - 146, - 145, - 80, - 80, - 86, - 91, - 129, - 96, - 0, - 82, - 130, - 96, - 32, - 82, - 97, - 2, - 192, - 81, - 96, - 64, - 82, - 97, - 2, - 224, - 81, - 96, - 96, - 82, - 97, - 3, - 0, - 81, - 96, - 128, - 82, - 97, - 3, - 32, - 81, - 96, - 160, - 82, - 131, - 96, - 192, - 82, - 132, - 96, - 224, - 82, - 97, - 3, - 64, - 81, - 97, - 1, - 0, - 82, - 97, - 3, - 96, - 81, - 97, - 1, - 32, - 82, - 97, - 3, - 128, - 81, - 97, - 1, - 64, - 82, - 97, - 3, - 160, - 81, - 97, - 1, - 96, - 82, - 96, - 0, - 96, - 32, - 96, - 0, - 97, - 1, - 128, - 96, - 0, - 96, - 8, - 90, - 250, - 96, - 0, - 81, - 146, - 22, - 144, - 145, - 22, - 149, - 148, - 80, - 80, - 80, - 80, - 80, - 86, - 91, - 127, - 48, - 100, - 78, - 114, - 225, - 49, - 160, - 41, - 184, - 80, - 69, - 182, - 129, - 129, - 88, - 93, - 151, - 129, - 106, - 145, - 104, - 113, - 202, - 141, - 60, - 32, - 140, - 22, - 216, - 124, - 253, - 71, - 127, - 48, - 100, - 78, - 114, - 225, - 49, - 160, - 41, - 184, - 80, - 69, - 182, - 129, - 129, - 88, - 93, - 40, - 51, - 232, - 72, - 121, - 185, - 112, - 145, - 67, - 225, - 245, - 147, - 240, - 0, - 0, - 1, - 96, - 1, - 96, - 32, - 96, - 64, - 97, - 2, - 32, - 139, - 60, - 97, - 1, - 64, - 97, - 1, - 96, - 97, - 2, - 128, - 139, - 60, - 96, - 100, - 53, - 96, - 128, - 129, - 6, - 96, - 0, - 20, - 130, - 22, - 145, - 80, - 129, - 97, - 1, - 193, - 87, - 115, - 9, - 45, - 206, - 204, - 45, - 141, - 44, - 132, - 14, - 14, - 77, - 237, - 236, - 196, - 13, - 140, - 173, - 204, - 238, - 141, - 96, - 99, - 27, - 96, - 0, - 82, - 96, - 32, - 96, - 0, - 253, - 91, - 96, - 32, - 129, - 96, - 100, - 1, - 1, - 128, - 53, - 96, - 32, - 129, - 2, - 131, - 4, - 96, - 4, - 20, - 132, - 22, - 147, - 80, - 131, - 97, - 2, - 6, - 87, - 127, - 78, - 117, - 109, - 98, - 101, - 114, - 32, - 111, - 102, - 32, - 101, - 118, - 97, - 108, - 117, - 97, - 116, - 105, - 111, - 110, - 32, - 109, - 105, - 115, - 109, - 97, - 116, - 99, - 104, - 0, - 0, - 0, - 96, - 0, - 82, - 96, - 32, - 96, - 0, - 253, - 91, - 96, - 0, - 91, - 129, - 129, - 16, - 21, - 97, - 3, - 177, - 87, - 96, - 32, - 129, - 2, - 96, - 2, - 129, - 2, - 96, - 32, - 130, - 1, - 133, - 1, - 53, - 136, - 97, - 2, - 32, - 81, - 130, - 9, - 97, - 2, - 128, - 81, - 96, - 128, - 82, - 97, - 2, - 160, - 81, - 96, - 160, - 82, - 137, - 3, - 144, - 80, - 97, - 2, - 67, - 129, - 137, - 97, - 0, - 174, - 86, - 91, - 136, - 22, - 151, - 80, - 80, - 134, - 97, - 2, - 119, - 87, - 127, - 70, - 97, - 105, - 108, - 101, - 100, - 32, - 116, - 111, - 32, - 109, - 117, - 108, - 116, - 105, - 112, - 108, - 121, - 32, - 71, - 49, - 32, - 98, - 121, - 32, - 109, - 105, - 110, - 117, - 115, - 95, - 122, - 96, - 0, - 82, - 96, - 32, - 96, - 0, - 253, - 91, - 128, - 96, - 2, - 135, - 4, - 96, - 132, - 1, - 1, - 97, - 2, - 139, - 138, - 130, - 138, - 97, - 0, - 94, - 86, - 91, - 151, - 80, - 135, - 97, - 2, - 196, - 87, - 130, - 96, - 0, - 82, - 127, - 67, - 111, - 109, - 109, - 105, - 116, - 109, - 101, - 110, - 116, - 32, - 112, - 111, - 105, - 110, - 116, - 32, - 105, - 115, - 32, - 110, - 111, - 116, - 32, - 69, - 67, - 32, - 112, - 111, - 105, - 110, - 116, - 96, - 32, - 82, - 128, - 96, - 64, - 82, - 96, - 96, - 96, - 0, - 253, - 91, - 128, - 53, - 146, - 80, - 96, - 32, - 1, - 53, - 97, - 2, - 215, - 129, - 132, - 138, - 97, - 0, - 143, - 86, - 91, - 151, - 80, - 80, - 134, - 97, - 3, - 9, - 87, - 127, - 70, - 97, - 105, - 108, - 101, - 100, - 32, - 116, - 111, - 32, - 97, - 100, - 100, - 32, - 67, - 32, - 97, - 110, - 100, - 32, - 103, - 95, - 116, - 111, - 95, - 109, - 105, - 110, - 117, - 115, - 95, - 122, - 96, - 0, - 82, - 96, - 32, - 96, - 0, - 253, - 91, - 96, - 128, - 81, - 97, - 2, - 64, - 82, - 96, - 160, - 81, - 97, - 2, - 96, - 82, - 96, - 132, - 1, - 144, - 80, - 97, - 3, - 39, - 136, - 130, - 136, - 97, - 0, - 94, - 86, - 91, - 149, - 80, - 133, - 97, - 3, - 88, - 87, - 127, - 79, - 112, - 101, - 110, - 105, - 110, - 103, - 32, - 112, - 111, - 105, - 110, - 116, - 32, - 105, - 115, - 32, - 110, - 111, - 116, - 32, - 69, - 67, - 32, - 112, - 111, - 105, - 110, - 116, - 0, - 0, - 0, - 96, - 0, - 82, - 96, - 32, - 96, - 0, - 253, - 91, - 128, - 53, - 96, - 32, - 130, - 1, - 53, - 145, - 80, - 97, - 3, - 116, - 130, - 130, - 97, - 2, - 96, - 81, - 97, - 2, - 64, - 81, - 139, - 97, - 0, - 201, - 86, - 91, - 135, - 22, - 150, - 80, - 80, - 80, - 132, - 97, - 3, - 169, - 87, - 127, - 70, - 97, - 105, - 108, - 101, - 100, - 32, - 116, - 111, - 32, - 112, - 101, - 114, - 102, - 111, - 114, - 109, - 32, - 112, - 97, - 105, - 114, - 105, - 110, - 103, - 32, - 99, - 104, - 101, - 99, - 107, - 0, - 96, - 0, - 82, - 96, - 32, - 96, - 0, - 253, - 91, - 96, - 1, - 1, - 97, - 2, - 9, - 86, - 91, - 80, - 80, - 80, - 80, - 128, - 96, - 0, - 82, - 96, - 32, - 96, - 0, - 243, - 91, - 96, - 0, - 128, - 131, - 96, - 31, - 132, - 1, - 18, - 97, - 3, - 209, - 87, - 96, - 0, - 128, - 253, - 91, - 80, - 129, - 53, - 103, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 129, - 17, - 21, - 97, - 3, - 233, - 87, - 96, - 0, - 128, - 253, - 91, - 96, - 32, - 131, - 1, - 145, - 80, - 131, - 96, - 32, - 130, - 96, - 5, - 27, - 133, - 1, - 1, - 17, - 21, - 97, - 4, - 4, - 87, - 96, - 0, - 128, - 253, - 91, - 146, - 80, - 146, - 144, - 80, - 86, - 91, - 96, - 0, - 128, - 96, - 0, - 128, - 96, - 0, - 96, - 96, - 134, - 136, - 3, - 18, - 21, - 97, - 4, - 35, - 87, - 96, - 0, - 128, - 253, - 91, - 133, - 53, - 96, - 1, - 96, - 1, - 96, - 160, - 27, - 3, - 129, - 22, - 129, - 20, - 97, - 4, - 58, - 87, - 96, - 0, - 128, - 253, - 91, - 148, - 80, - 96, - 32, - 134, - 1, - 53, - 103, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 128, - 130, - 17, - 21, - 97, - 4, - 87, - 87, - 96, - 0, - 128, - 253, - 91, - 129, - 136, - 1, - 145, - 80, - 136, - 96, - 31, - 131, - 1, - 18, - 97, - 4, - 107, - 87, - 96, - 0, - 128, - 253, - 91, - 129, - 53, - 129, - 129, - 17, - 21, - 97, - 4, - 122, - 87, - 96, - 0, - 128, - 253, - 91, - 137, - 96, - 32, - 130, - 133, - 1, - 1, - 17, - 21, - 97, - 4, - 140, - 87, - 96, - 0, - 128, - 253, - 91, - 96, - 32, - 131, - 1, - 150, - 80, - 128, - 149, - 80, - 80, - 96, - 64, - 136, - 1, - 53, - 145, - 80, - 128, - 130, - 17, - 21, - 97, - 4, - 170, - 87, - 96, - 0, - 128, - 253, - 91, - 80, - 97, - 4, - 183, - 136, - 130, - 137, - 1, - 97, - 3, - 191, - 86, - 91, - 150, - 153, - 149, - 152, - 80, - 147, - 150, - 80, - 146, - 148, - 147, - 146, - 80, - 80, - 80, - 86, - 254, - 162, - 100, - 105, - 112, - 102, - 115, - 88, - 34, - 18, - 32, - 49, - 140, - 108, - 158, - 187, - 17, - 230, - 122, - 206, - 151, - 147, - 131, - 228, - 207, - 190, - 199, - 252, - 160, - 161, - 2, - 236, - 137, - 223, - 59, - 105, - 5, - 20, - 202, - 193, - 71, - 38, - 225, - 100, - 115, - 111, - 108, - 99, - 67, - 0, - 8, - 18, - 0, - 51, - ]; - ///The bytecode of the contract. - pub static GRANDSUMVERIFIER_BYTECODE: ::ethers::core::types::Bytes = ::ethers::core::types::Bytes::from_static( - __BYTECODE, - ); - #[rustfmt::skip] - const __DEPLOYED_BYTECODE: &[u8] = &[ - 96, - 128, - 96, - 64, - 82, - 52, - 128, - 21, - 97, - 0, - 16, - 87, - 96, - 0, - 128, - 253, - 91, - 80, - 96, - 4, - 54, - 16, - 97, - 0, - 43, - 87, - 96, - 0, - 53, - 96, - 224, - 28, - 128, - 99, - 175, - 131, - 161, - 141, - 20, - 97, - 0, - 48, - 87, - 91, - 96, - 0, - 128, - 253, - 91, - 97, - 0, - 67, - 97, - 0, - 62, - 54, - 96, - 4, - 97, - 4, - 11, - 86, - 91, - 97, - 0, - 87, - 86, - 91, - 96, - 64, - 81, - 144, - 21, - 21, - 129, - 82, - 96, - 32, - 1, - 96, - 64, - 81, - 128, - 145, - 3, - 144, - 243, - 91, - 96, - 0, - 97, - 1, - 53, - 86, - 91, - 96, - 32, - 130, - 1, - 53, - 131, - 129, - 16, - 131, - 53, - 133, - 129, - 16, - 132, - 22, - 145, - 144, - 145, - 22, - 145, - 133, - 96, - 3, - 129, - 128, - 133, - 128, - 9, - 133, - 9, - 8, - 134, - 130, - 131, - 9, - 20, - 131, - 22, - 146, - 80, - 80, - 80, - 147, - 146, - 80, - 80, - 80, - 86, - 91, - 129, - 96, - 192, - 82, - 130, - 96, - 224, - 82, - 96, - 0, - 96, - 64, - 96, - 128, - 128, - 96, - 128, - 96, - 6, - 90, - 250, - 144, - 145, - 22, - 147, - 146, - 80, - 80, - 80, - 86, - 91, - 129, - 96, - 192, - 82, - 96, - 0, - 96, - 64, - 96, - 128, - 96, - 96, - 96, - 128, - 96, - 7, - 90, - 250, - 144, - 145, - 22, - 146, - 145, - 80, - 80, - 86, - 91, - 129, - 96, - 0, - 82, - 130, - 96, - 32, - 82, - 97, - 2, - 192, - 81, - 96, - 64, - 82, - 97, - 2, - 224, - 81, - 96, - 96, - 82, - 97, - 3, - 0, - 81, - 96, - 128, - 82, - 97, - 3, - 32, - 81, - 96, - 160, - 82, - 131, - 96, - 192, - 82, - 132, - 96, - 224, - 82, - 97, - 3, - 64, - 81, - 97, - 1, - 0, - 82, - 97, - 3, - 96, - 81, - 97, - 1, - 32, - 82, - 97, - 3, - 128, - 81, - 97, - 1, - 64, - 82, - 97, - 3, - 160, - 81, - 97, - 1, - 96, - 82, - 96, - 0, - 96, - 32, - 96, - 0, - 97, - 1, - 128, - 96, - 0, - 96, - 8, - 90, - 250, - 96, - 0, - 81, - 146, - 22, - 144, - 145, - 22, - 149, - 148, - 80, - 80, - 80, - 80, - 80, - 86, - 91, - 127, - 48, - 100, - 78, - 114, - 225, - 49, - 160, - 41, - 184, - 80, - 69, - 182, - 129, - 129, - 88, - 93, - 151, - 129, - 106, - 145, - 104, - 113, - 202, - 141, - 60, - 32, - 140, - 22, - 216, - 124, - 253, - 71, - 127, - 48, - 100, - 78, - 114, - 225, - 49, - 160, - 41, - 184, - 80, - 69, - 182, - 129, - 129, - 88, - 93, - 40, - 51, - 232, - 72, - 121, - 185, - 112, - 145, - 67, - 225, - 245, - 147, - 240, - 0, - 0, - 1, - 96, - 1, - 96, - 32, - 96, - 64, - 97, - 2, - 32, - 139, - 60, - 97, - 1, - 64, - 97, - 1, - 96, - 97, - 2, - 128, - 139, - 60, - 96, - 100, - 53, - 96, - 128, - 129, - 6, - 96, - 0, - 20, - 130, - 22, - 145, - 80, - 129, - 97, - 1, - 193, - 87, - 115, - 9, - 45, - 206, - 204, - 45, - 141, - 44, - 132, - 14, - 14, - 77, - 237, - 236, - 196, - 13, - 140, - 173, - 204, - 238, - 141, - 96, - 99, - 27, - 96, - 0, - 82, - 96, - 32, - 96, - 0, - 253, - 91, - 96, - 32, - 129, - 96, - 100, - 1, - 1, - 128, - 53, - 96, - 32, - 129, - 2, - 131, - 4, - 96, - 4, - 20, - 132, - 22, - 147, - 80, - 131, - 97, - 2, - 6, - 87, - 127, - 78, - 117, - 109, - 98, - 101, - 114, - 32, - 111, - 102, - 32, - 101, - 118, - 97, - 108, - 117, - 97, - 116, - 105, - 111, - 110, - 32, - 109, - 105, - 115, - 109, - 97, - 116, - 99, - 104, - 0, - 0, - 0, - 96, - 0, - 82, - 96, - 32, - 96, - 0, - 253, - 91, - 96, - 0, - 91, - 129, - 129, - 16, - 21, - 97, - 3, - 177, - 87, - 96, - 32, - 129, - 2, - 96, - 2, - 129, - 2, - 96, - 32, - 130, - 1, - 133, - 1, - 53, - 136, - 97, - 2, - 32, - 81, - 130, - 9, - 97, - 2, - 128, - 81, - 96, - 128, - 82, - 97, - 2, - 160, - 81, - 96, - 160, - 82, - 137, - 3, - 144, - 80, - 97, - 2, - 67, - 129, - 137, - 97, - 0, - 174, - 86, - 91, - 136, - 22, - 151, - 80, - 80, - 134, - 97, - 2, - 119, - 87, - 127, - 70, - 97, - 105, - 108, - 101, - 100, - 32, - 116, - 111, - 32, - 109, - 117, - 108, - 116, - 105, - 112, - 108, - 121, - 32, - 71, - 49, - 32, - 98, - 121, - 32, - 109, - 105, - 110, - 117, - 115, - 95, - 122, - 96, - 0, - 82, - 96, - 32, - 96, - 0, - 253, - 91, - 128, - 96, - 2, - 135, - 4, - 96, - 132, - 1, - 1, - 97, - 2, - 139, - 138, - 130, - 138, - 97, - 0, - 94, - 86, - 91, - 151, - 80, - 135, - 97, - 2, - 196, - 87, - 130, - 96, - 0, - 82, - 127, - 67, - 111, - 109, - 109, - 105, - 116, - 109, - 101, - 110, - 116, - 32, - 112, - 111, - 105, - 110, - 116, - 32, - 105, - 115, - 32, - 110, - 111, - 116, - 32, - 69, - 67, - 32, - 112, - 111, - 105, - 110, - 116, - 96, - 32, - 82, - 128, - 96, - 64, - 82, - 96, - 96, - 96, - 0, - 253, - 91, - 128, - 53, - 146, - 80, - 96, - 32, - 1, - 53, - 97, - 2, - 215, - 129, - 132, - 138, - 97, - 0, - 143, - 86, - 91, - 151, - 80, - 80, - 134, - 97, - 3, - 9, - 87, - 127, - 70, - 97, - 105, - 108, - 101, - 100, - 32, - 116, - 111, - 32, - 97, - 100, - 100, - 32, - 67, - 32, - 97, - 110, - 100, - 32, - 103, - 95, - 116, - 111, - 95, - 109, - 105, - 110, - 117, - 115, - 95, - 122, - 96, - 0, - 82, - 96, - 32, - 96, - 0, - 253, - 91, - 96, - 128, - 81, - 97, - 2, - 64, - 82, - 96, - 160, - 81, - 97, - 2, - 96, - 82, - 96, - 132, - 1, - 144, - 80, - 97, - 3, - 39, - 136, - 130, - 136, - 97, - 0, - 94, - 86, - 91, - 149, - 80, - 133, - 97, - 3, - 88, - 87, - 127, - 79, - 112, - 101, - 110, - 105, - 110, - 103, - 32, - 112, - 111, - 105, - 110, - 116, - 32, - 105, - 115, - 32, - 110, - 111, - 116, - 32, - 69, - 67, - 32, - 112, - 111, - 105, - 110, - 116, - 0, - 0, - 0, - 96, - 0, - 82, - 96, - 32, - 96, - 0, - 253, - 91, - 128, - 53, - 96, - 32, - 130, - 1, - 53, - 145, - 80, - 97, - 3, - 116, - 130, - 130, - 97, - 2, - 96, - 81, - 97, - 2, - 64, - 81, - 139, - 97, - 0, - 201, - 86, - 91, - 135, - 22, - 150, - 80, - 80, - 80, - 132, - 97, - 3, - 169, - 87, - 127, - 70, - 97, - 105, - 108, - 101, - 100, - 32, - 116, - 111, - 32, - 112, - 101, - 114, - 102, - 111, - 114, - 109, - 32, - 112, - 97, - 105, - 114, - 105, - 110, - 103, - 32, - 99, - 104, - 101, - 99, - 107, - 0, - 96, - 0, - 82, - 96, - 32, - 96, - 0, - 253, - 91, - 96, - 1, - 1, - 97, - 2, - 9, - 86, - 91, - 80, - 80, - 80, - 80, - 128, - 96, - 0, - 82, - 96, - 32, - 96, - 0, - 243, - 91, - 96, - 0, - 128, - 131, - 96, - 31, - 132, - 1, - 18, - 97, - 3, - 209, - 87, - 96, - 0, - 128, - 253, - 91, - 80, - 129, - 53, - 103, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 129, - 17, - 21, - 97, - 3, - 233, - 87, - 96, - 0, - 128, - 253, - 91, - 96, - 32, - 131, - 1, - 145, - 80, - 131, - 96, - 32, - 130, - 96, - 5, - 27, - 133, - 1, - 1, - 17, - 21, - 97, - 4, - 4, - 87, - 96, - 0, - 128, - 253, - 91, - 146, - 80, - 146, - 144, - 80, - 86, - 91, - 96, - 0, - 128, - 96, - 0, - 128, - 96, - 0, - 96, - 96, - 134, - 136, - 3, - 18, - 21, - 97, - 4, - 35, - 87, - 96, - 0, - 128, - 253, - 91, - 133, - 53, - 96, - 1, - 96, - 1, - 96, - 160, - 27, - 3, - 129, - 22, - 129, - 20, - 97, - 4, - 58, - 87, - 96, - 0, - 128, - 253, - 91, - 148, - 80, - 96, - 32, - 134, - 1, - 53, - 103, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 128, - 130, - 17, - 21, - 97, - 4, - 87, - 87, - 96, - 0, - 128, - 253, - 91, - 129, - 136, - 1, - 145, - 80, - 136, - 96, - 31, - 131, - 1, - 18, - 97, - 4, - 107, - 87, - 96, - 0, - 128, - 253, - 91, - 129, - 53, - 129, - 129, - 17, - 21, - 97, - 4, - 122, - 87, - 96, - 0, - 128, - 253, - 91, - 137, - 96, - 32, - 130, - 133, - 1, - 1, - 17, - 21, - 97, - 4, - 140, - 87, - 96, - 0, - 128, - 253, - 91, - 96, - 32, - 131, - 1, - 150, - 80, - 128, - 149, - 80, - 80, - 96, - 64, - 136, - 1, - 53, - 145, - 80, - 128, - 130, - 17, - 21, - 97, - 4, - 170, - 87, - 96, - 0, - 128, - 253, - 91, - 80, - 97, - 4, - 183, - 136, - 130, - 137, - 1, - 97, - 3, - 191, - 86, - 91, - 150, - 153, - 149, - 152, - 80, - 147, - 150, - 80, - 146, - 148, - 147, - 146, - 80, - 80, - 80, - 86, - 254, - 162, - 100, - 105, - 112, - 102, - 115, - 88, - 34, - 18, - 32, - 49, - 140, - 108, - 158, - 187, - 17, - 230, - 122, - 206, - 151, - 147, - 131, - 228, - 207, - 190, - 199, - 252, - 160, - 161, - 2, - 236, - 137, - 223, - 59, - 105, - 5, - 20, - 202, - 193, - 71, - 38, - 225, - 100, - 115, - 111, - 108, - 99, - 67, - 0, - 8, - 18, - 0, - 51, - ]; - ///The deployed bytecode of the contract. - pub static GRANDSUMVERIFIER_DEPLOYED_BYTECODE: ::ethers::core::types::Bytes = ::ethers::core::types::Bytes::from_static( - __DEPLOYED_BYTECODE, - ); - pub struct GrandSumVerifier(::ethers::contract::Contract); - impl ::core::clone::Clone for GrandSumVerifier { - fn clone(&self) -> Self { - Self(::core::clone::Clone::clone(&self.0)) - } - } - impl ::core::ops::Deref for GrandSumVerifier { - type Target = ::ethers::contract::Contract; - fn deref(&self) -> &Self::Target { - &self.0 - } - } - impl ::core::ops::DerefMut for GrandSumVerifier { - fn deref_mut(&mut self) -> &mut Self::Target { - &mut self.0 - } - } - impl ::core::fmt::Debug for GrandSumVerifier { - fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { - f.debug_tuple(stringify!(GrandSumVerifier)).field(&self.address()).finish() - } - } - impl GrandSumVerifier { - /// Creates a new contract instance with the specified `ethers` client at - /// `address`. The contract derefs to a `ethers::Contract` object. - pub fn new>( - address: T, - client: ::std::sync::Arc, - ) -> Self { - Self( - ::ethers::contract::Contract::new( - address.into(), - GRANDSUMVERIFIER_ABI.clone(), - client, - ), - ) - } - /// Constructs the general purpose `Deployer` instance based on the provided constructor arguments and sends it. - /// Returns a new instance of a deployer that returns an instance of this contract after sending the transaction - /// - /// Notes: - /// - If there are no constructor arguments, you should pass `()` as the argument. - /// - The default poll duration is 7 seconds. - /// - The default number of confirmations is 1 block. - /// - /// - /// # Example - /// - /// Generate contract bindings with `abigen!` and deploy a new contract instance. - /// - /// *Note*: this requires a `bytecode` and `abi` object in the `greeter.json` artifact. - /// - /// ```ignore - /// # async fn deploy(client: ::std::sync::Arc) { - /// abigen!(Greeter, "../greeter.json"); - /// - /// let greeter_contract = Greeter::deploy(client, "Hello world!".to_string()).unwrap().send().await.unwrap(); - /// let msg = greeter_contract.greet().call().await.unwrap(); - /// # } - /// ``` - pub fn deploy( - client: ::std::sync::Arc, - constructor_args: T, - ) -> ::core::result::Result< - ::ethers::contract::builders::ContractDeployer, - ::ethers::contract::ContractError, - > { - let factory = ::ethers::contract::ContractFactory::new( - GRANDSUMVERIFIER_ABI.clone(), - GRANDSUMVERIFIER_BYTECODE.clone().into(), - client, - ); - let deployer = factory.deploy(constructor_args)?; - let deployer = ::ethers::contract::ContractDeployer::new(deployer); - Ok(deployer) - } - ///Calls the contract's `verifyProof` (0xaf83a18d) function - pub fn verify_proof( - &self, - vk: ::ethers::core::types::Address, - proof: ::ethers::core::types::Bytes, - values: ::std::vec::Vec<::ethers::core::types::U256>, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([175, 131, 161, 141], (vk, proof, values)) - .expect("method not found (this should never happen)") - } - } - impl From<::ethers::contract::Contract> - for GrandSumVerifier { - fn from(contract: ::ethers::contract::Contract) -> Self { - Self::new(contract.address(), contract.client()) - } - } - ///Container type for all input parameters for the `verifyProof` function with signature `verifyProof(address,bytes,uint256[])` and selector `0xaf83a18d` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethcall(name = "verifyProof", abi = "verifyProof(address,bytes,uint256[])")] - pub struct VerifyProofCall { - pub vk: ::ethers::core::types::Address, - pub proof: ::ethers::core::types::Bytes, - pub values: ::std::vec::Vec<::ethers::core::types::U256>, - } - ///Container type for all return fields from the `verifyProof` function with signature `verifyProof(address,bytes,uint256[])` and selector `0xaf83a18d` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - pub struct VerifyProofReturn(pub bool); -} diff --git a/backend/src/contracts/generated/inclusion_verifier.rs b/backend/src/contracts/generated/inclusion_verifier.rs deleted file mode 100644 index 32ad6740..00000000 --- a/backend/src/contracts/generated/inclusion_verifier.rs +++ /dev/null @@ -1,2422 +0,0 @@ -pub use inclusion_verifier::*; -/// This module was auto-generated with ethers-rs Abigen. -/// More information at: -#[allow( - clippy::enum_variant_names, - clippy::too_many_arguments, - clippy::upper_case_acronyms, - clippy::type_complexity, - dead_code, - non_camel_case_types, -)] -pub mod inclusion_verifier { - #[rustfmt::skip] - const __ABI: &str = "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"vk\",\"type\":\"address\",\"components\":[]},{\"internalType\":\"bytes\",\"name\":\"proofs\",\"type\":\"bytes\",\"components\":[]},{\"internalType\":\"uint256[]\",\"name\":\"challenges\",\"type\":\"uint256[]\",\"components\":[]},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\",\"components\":[]}],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"verifyProof\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\",\"components\":[]}]}]"; - ///The parsed JSON ABI of the contract. - pub static INCLUSIONVERIFIER_ABI: ::ethers::contract::Lazy< - ::ethers::core::abi::Abi, - > = ::ethers::contract::Lazy::new(|| { - ::ethers::core::utils::__serde_json::from_str(__ABI) - .expect("ABI is always valid") - }); - #[rustfmt::skip] - const __BYTECODE: &[u8] = &[ - 96, - 128, - 96, - 64, - 82, - 52, - 128, - 21, - 97, - 0, - 16, - 87, - 96, - 0, - 128, - 253, - 91, - 80, - 97, - 4, - 89, - 128, - 97, - 0, - 32, - 96, - 0, - 57, - 96, - 0, - 243, - 254, - 96, - 128, - 96, - 64, - 82, - 52, - 128, - 21, - 97, - 0, - 16, - 87, - 96, - 0, - 128, - 253, - 91, - 80, - 96, - 4, - 54, - 16, - 97, - 0, - 43, - 87, - 96, - 0, - 53, - 96, - 224, - 28, - 128, - 99, - 71, - 246, - 181, - 170, - 20, - 97, - 0, - 48, - 87, - 91, - 96, - 0, - 128, - 253, - 91, - 97, - 0, - 67, - 97, - 0, - 62, - 54, - 96, - 4, - 97, - 3, - 60, - 86, - 91, - 97, - 0, - 87, - 86, - 91, - 96, - 64, - 81, - 144, - 21, - 21, - 129, - 82, - 96, - 32, - 1, - 96, - 64, - 81, - 128, - 145, - 3, - 144, - 243, - 91, - 96, - 0, - 97, - 1, - 53, - 86, - 91, - 96, - 32, - 130, - 1, - 53, - 131, - 129, - 16, - 131, - 53, - 133, - 129, - 16, - 132, - 22, - 145, - 144, - 145, - 22, - 145, - 133, - 96, - 3, - 129, - 128, - 133, - 128, - 9, - 133, - 9, - 8, - 134, - 130, - 131, - 9, - 20, - 131, - 22, - 146, - 80, - 80, - 80, - 147, - 146, - 80, - 80, - 80, - 86, - 91, - 129, - 96, - 192, - 82, - 130, - 96, - 224, - 82, - 96, - 0, - 96, - 64, - 96, - 128, - 128, - 96, - 128, - 96, - 6, - 90, - 250, - 144, - 145, - 22, - 147, - 146, - 80, - 80, - 80, - 86, - 91, - 129, - 96, - 192, - 82, - 96, - 0, - 96, - 64, - 96, - 128, - 96, - 96, - 96, - 128, - 96, - 7, - 90, - 250, - 144, - 145, - 22, - 146, - 145, - 80, - 80, - 86, - 91, - 129, - 96, - 0, - 82, - 130, - 96, - 32, - 82, - 97, - 2, - 128, - 81, - 96, - 64, - 82, - 97, - 2, - 160, - 81, - 96, - 96, - 82, - 97, - 2, - 192, - 81, - 96, - 128, - 82, - 97, - 2, - 224, - 81, - 96, - 160, - 82, - 131, - 96, - 192, - 82, - 132, - 96, - 224, - 82, - 97, - 3, - 0, - 81, - 97, - 1, - 0, - 82, - 97, - 3, - 32, - 81, - 97, - 1, - 32, - 82, - 97, - 3, - 64, - 81, - 97, - 1, - 64, - 82, - 97, - 3, - 96, - 81, - 97, - 1, - 96, - 82, - 96, - 0, - 96, - 32, - 96, - 0, - 97, - 1, - 128, - 96, - 0, - 96, - 8, - 90, - 250, - 96, - 0, - 81, - 146, - 22, - 144, - 145, - 22, - 149, - 148, - 80, - 80, - 80, - 80, - 80, - 86, - 91, - 127, - 48, - 100, - 78, - 114, - 225, - 49, - 160, - 41, - 184, - 80, - 69, - 182, - 129, - 129, - 88, - 93, - 151, - 129, - 106, - 145, - 104, - 113, - 202, - 141, - 60, - 32, - 140, - 22, - 216, - 124, - 253, - 71, - 127, - 48, - 100, - 78, - 114, - 225, - 49, - 160, - 41, - 184, - 80, - 69, - 182, - 129, - 129, - 88, - 93, - 40, - 51, - 232, - 72, - 121, - 185, - 112, - 145, - 67, - 225, - 245, - 147, - 240, - 0, - 0, - 1, - 96, - 1, - 96, - 192, - 97, - 1, - 96, - 97, - 2, - 64, - 141, - 60, - 96, - 132, - 53, - 96, - 128, - 129, - 6, - 96, - 0, - 20, - 130, - 22, - 145, - 80, - 129, - 97, - 1, - 155, - 87, - 96, - 0, - 128, - 253, - 91, - 96, - 32, - 129, - 96, - 132, - 1, - 1, - 128, - 53, - 96, - 4, - 129, - 20, - 132, - 22, - 147, - 80, - 131, - 97, - 1, - 182, - 87, - 96, - 0, - 128, - 253, - 91, - 96, - 32, - 130, - 1, - 53, - 97, - 3, - 0, - 82, - 96, - 64, - 130, - 1, - 53, - 97, - 3, - 32, - 82, - 96, - 96, - 130, - 1, - 53, - 97, - 3, - 64, - 82, - 96, - 128, - 130, - 1, - 53, - 97, - 3, - 96, - 82, - 96, - 32, - 128, - 130, - 2, - 131, - 1, - 1, - 145, - 80, - 80, - 128, - 53, - 96, - 32, - 129, - 2, - 131, - 4, - 96, - 4, - 20, - 132, - 22, - 147, - 80, - 131, - 97, - 1, - 254, - 87, - 96, - 0, - 128, - 253, - 91, - 96, - 0, - 91, - 129, - 129, - 16, - 21, - 97, - 2, - 226, - 87, - 97, - 2, - 64, - 81, - 96, - 128, - 82, - 97, - 2, - 96, - 81, - 96, - 160, - 82, - 96, - 32, - 129, - 129, - 2, - 132, - 1, - 1, - 53, - 134, - 3, - 96, - 192, - 129, - 144, - 82, - 96, - 64, - 130, - 2, - 97, - 2, - 53, - 130, - 136, - 97, - 0, - 174, - 86, - 91, - 135, - 22, - 150, - 80, - 134, - 97, - 2, - 67, - 87, - 96, - 0, - 128, - 253, - 91, - 128, - 96, - 2, - 135, - 4, - 96, - 164, - 1, - 1, - 145, - 80, - 97, - 2, - 89, - 137, - 131, - 137, - 97, - 0, - 94, - 86, - 91, - 150, - 80, - 134, - 97, - 2, - 101, - 87, - 96, - 0, - 128, - 253, - 91, - 96, - 32, - 130, - 1, - 53, - 145, - 53, - 97, - 2, - 119, - 131, - 130, - 138, - 97, - 0, - 143, - 86, - 91, - 151, - 80, - 80, - 134, - 97, - 2, - 132, - 87, - 96, - 0, - 128, - 253, - 91, - 96, - 128, - 81, - 97, - 2, - 0, - 82, - 96, - 160, - 81, - 97, - 2, - 32, - 82, - 96, - 164, - 1, - 144, - 80, - 97, - 2, - 162, - 136, - 130, - 136, - 97, - 0, - 94, - 86, - 91, - 149, - 80, - 133, - 97, - 2, - 174, - 87, - 96, - 0, - 128, - 253, - 91, - 128, - 53, - 96, - 32, - 130, - 1, - 53, - 145, - 80, - 97, - 2, - 202, - 130, - 130, - 97, - 2, - 32, - 81, - 97, - 2, - 0, - 81, - 139, - 97, - 0, - 201, - 86, - 91, - 135, - 22, - 150, - 80, - 80, - 80, - 132, - 97, - 2, - 218, - 87, - 96, - 0, - 128, - 253, - 91, - 96, - 1, - 1, - 97, - 2, - 1, - 86, - 91, - 80, - 80, - 80, - 80, - 128, - 96, - 0, - 82, - 96, - 32, - 96, - 0, - 243, - 91, - 96, - 0, - 128, - 131, - 96, - 31, - 132, - 1, - 18, - 97, - 3, - 2, - 87, - 96, - 0, - 128, - 253, - 91, - 80, - 129, - 53, - 103, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 129, - 17, - 21, - 97, - 3, - 26, - 87, - 96, - 0, - 128, - 253, - 91, - 96, - 32, - 131, - 1, - 145, - 80, - 131, - 96, - 32, - 130, - 96, - 5, - 27, - 133, - 1, - 1, - 17, - 21, - 97, - 3, - 53, - 87, - 96, - 0, - 128, - 253, - 91, - 146, - 80, - 146, - 144, - 80, - 86, - 91, - 96, - 0, - 128, - 96, - 0, - 128, - 96, - 0, - 128, - 96, - 0, - 96, - 128, - 136, - 138, - 3, - 18, - 21, - 97, - 3, - 87, - 87, - 96, - 0, - 128, - 253, - 91, - 135, - 53, - 96, - 1, - 96, - 1, - 96, - 160, - 27, - 3, - 129, - 22, - 129, - 20, - 97, - 3, - 110, - 87, - 96, - 0, - 128, - 253, - 91, - 150, - 80, - 96, - 32, - 136, - 1, - 53, - 103, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 128, - 130, - 17, - 21, - 97, - 3, - 139, - 87, - 96, - 0, - 128, - 253, - 91, - 129, - 138, - 1, - 145, - 80, - 138, - 96, - 31, - 131, - 1, - 18, - 97, - 3, - 159, - 87, - 96, - 0, - 128, - 253, - 91, - 129, - 53, - 129, - 129, - 17, - 21, - 97, - 3, - 174, - 87, - 96, - 0, - 128, - 253, - 91, - 139, - 96, - 32, - 130, - 133, - 1, - 1, - 17, - 21, - 97, - 3, - 192, - 87, - 96, - 0, - 128, - 253, - 91, - 96, - 32, - 131, - 1, - 152, - 80, - 128, - 151, - 80, - 80, - 96, - 64, - 138, - 1, - 53, - 145, - 80, - 128, - 130, - 17, - 21, - 97, - 3, - 222, - 87, - 96, - 0, - 128, - 253, - 91, - 97, - 3, - 234, - 139, - 131, - 140, - 1, - 97, - 2, - 240, - 86, - 91, - 144, - 150, - 80, - 148, - 80, - 96, - 96, - 138, - 1, - 53, - 145, - 80, - 128, - 130, - 17, - 21, - 97, - 4, - 3, - 87, - 96, - 0, - 128, - 253, - 91, - 80, - 97, - 4, - 16, - 138, - 130, - 139, - 1, - 97, - 2, - 240, - 86, - 91, - 152, - 155, - 151, - 154, - 80, - 149, - 152, - 80, - 147, - 150, - 146, - 149, - 146, - 147, - 80, - 80, - 80, - 86, - 254, - 162, - 100, - 105, - 112, - 102, - 115, - 88, - 34, - 18, - 32, - 126, - 94, - 18, - 135, - 237, - 192, - 106, - 176, - 138, - 117, - 148, - 175, - 188, - 5, - 29, - 238, - 102, - 42, - 95, - 89, - 105, - 55, - 42, - 182, - 85, - 202, - 193, - 11, - 170, - 77, - 47, - 178, - 100, - 115, - 111, - 108, - 99, - 67, - 0, - 8, - 18, - 0, - 51, - ]; - ///The bytecode of the contract. - pub static INCLUSIONVERIFIER_BYTECODE: ::ethers::core::types::Bytes = ::ethers::core::types::Bytes::from_static( - __BYTECODE, - ); - #[rustfmt::skip] - const __DEPLOYED_BYTECODE: &[u8] = &[ - 96, - 128, - 96, - 64, - 82, - 52, - 128, - 21, - 97, - 0, - 16, - 87, - 96, - 0, - 128, - 253, - 91, - 80, - 96, - 4, - 54, - 16, - 97, - 0, - 43, - 87, - 96, - 0, - 53, - 96, - 224, - 28, - 128, - 99, - 71, - 246, - 181, - 170, - 20, - 97, - 0, - 48, - 87, - 91, - 96, - 0, - 128, - 253, - 91, - 97, - 0, - 67, - 97, - 0, - 62, - 54, - 96, - 4, - 97, - 3, - 60, - 86, - 91, - 97, - 0, - 87, - 86, - 91, - 96, - 64, - 81, - 144, - 21, - 21, - 129, - 82, - 96, - 32, - 1, - 96, - 64, - 81, - 128, - 145, - 3, - 144, - 243, - 91, - 96, - 0, - 97, - 1, - 53, - 86, - 91, - 96, - 32, - 130, - 1, - 53, - 131, - 129, - 16, - 131, - 53, - 133, - 129, - 16, - 132, - 22, - 145, - 144, - 145, - 22, - 145, - 133, - 96, - 3, - 129, - 128, - 133, - 128, - 9, - 133, - 9, - 8, - 134, - 130, - 131, - 9, - 20, - 131, - 22, - 146, - 80, - 80, - 80, - 147, - 146, - 80, - 80, - 80, - 86, - 91, - 129, - 96, - 192, - 82, - 130, - 96, - 224, - 82, - 96, - 0, - 96, - 64, - 96, - 128, - 128, - 96, - 128, - 96, - 6, - 90, - 250, - 144, - 145, - 22, - 147, - 146, - 80, - 80, - 80, - 86, - 91, - 129, - 96, - 192, - 82, - 96, - 0, - 96, - 64, - 96, - 128, - 96, - 96, - 96, - 128, - 96, - 7, - 90, - 250, - 144, - 145, - 22, - 146, - 145, - 80, - 80, - 86, - 91, - 129, - 96, - 0, - 82, - 130, - 96, - 32, - 82, - 97, - 2, - 128, - 81, - 96, - 64, - 82, - 97, - 2, - 160, - 81, - 96, - 96, - 82, - 97, - 2, - 192, - 81, - 96, - 128, - 82, - 97, - 2, - 224, - 81, - 96, - 160, - 82, - 131, - 96, - 192, - 82, - 132, - 96, - 224, - 82, - 97, - 3, - 0, - 81, - 97, - 1, - 0, - 82, - 97, - 3, - 32, - 81, - 97, - 1, - 32, - 82, - 97, - 3, - 64, - 81, - 97, - 1, - 64, - 82, - 97, - 3, - 96, - 81, - 97, - 1, - 96, - 82, - 96, - 0, - 96, - 32, - 96, - 0, - 97, - 1, - 128, - 96, - 0, - 96, - 8, - 90, - 250, - 96, - 0, - 81, - 146, - 22, - 144, - 145, - 22, - 149, - 148, - 80, - 80, - 80, - 80, - 80, - 86, - 91, - 127, - 48, - 100, - 78, - 114, - 225, - 49, - 160, - 41, - 184, - 80, - 69, - 182, - 129, - 129, - 88, - 93, - 151, - 129, - 106, - 145, - 104, - 113, - 202, - 141, - 60, - 32, - 140, - 22, - 216, - 124, - 253, - 71, - 127, - 48, - 100, - 78, - 114, - 225, - 49, - 160, - 41, - 184, - 80, - 69, - 182, - 129, - 129, - 88, - 93, - 40, - 51, - 232, - 72, - 121, - 185, - 112, - 145, - 67, - 225, - 245, - 147, - 240, - 0, - 0, - 1, - 96, - 1, - 96, - 192, - 97, - 1, - 96, - 97, - 2, - 64, - 141, - 60, - 96, - 132, - 53, - 96, - 128, - 129, - 6, - 96, - 0, - 20, - 130, - 22, - 145, - 80, - 129, - 97, - 1, - 155, - 87, - 96, - 0, - 128, - 253, - 91, - 96, - 32, - 129, - 96, - 132, - 1, - 1, - 128, - 53, - 96, - 4, - 129, - 20, - 132, - 22, - 147, - 80, - 131, - 97, - 1, - 182, - 87, - 96, - 0, - 128, - 253, - 91, - 96, - 32, - 130, - 1, - 53, - 97, - 3, - 0, - 82, - 96, - 64, - 130, - 1, - 53, - 97, - 3, - 32, - 82, - 96, - 96, - 130, - 1, - 53, - 97, - 3, - 64, - 82, - 96, - 128, - 130, - 1, - 53, - 97, - 3, - 96, - 82, - 96, - 32, - 128, - 130, - 2, - 131, - 1, - 1, - 145, - 80, - 80, - 128, - 53, - 96, - 32, - 129, - 2, - 131, - 4, - 96, - 4, - 20, - 132, - 22, - 147, - 80, - 131, - 97, - 1, - 254, - 87, - 96, - 0, - 128, - 253, - 91, - 96, - 0, - 91, - 129, - 129, - 16, - 21, - 97, - 2, - 226, - 87, - 97, - 2, - 64, - 81, - 96, - 128, - 82, - 97, - 2, - 96, - 81, - 96, - 160, - 82, - 96, - 32, - 129, - 129, - 2, - 132, - 1, - 1, - 53, - 134, - 3, - 96, - 192, - 129, - 144, - 82, - 96, - 64, - 130, - 2, - 97, - 2, - 53, - 130, - 136, - 97, - 0, - 174, - 86, - 91, - 135, - 22, - 150, - 80, - 134, - 97, - 2, - 67, - 87, - 96, - 0, - 128, - 253, - 91, - 128, - 96, - 2, - 135, - 4, - 96, - 164, - 1, - 1, - 145, - 80, - 97, - 2, - 89, - 137, - 131, - 137, - 97, - 0, - 94, - 86, - 91, - 150, - 80, - 134, - 97, - 2, - 101, - 87, - 96, - 0, - 128, - 253, - 91, - 96, - 32, - 130, - 1, - 53, - 145, - 53, - 97, - 2, - 119, - 131, - 130, - 138, - 97, - 0, - 143, - 86, - 91, - 151, - 80, - 80, - 134, - 97, - 2, - 132, - 87, - 96, - 0, - 128, - 253, - 91, - 96, - 128, - 81, - 97, - 2, - 0, - 82, - 96, - 160, - 81, - 97, - 2, - 32, - 82, - 96, - 164, - 1, - 144, - 80, - 97, - 2, - 162, - 136, - 130, - 136, - 97, - 0, - 94, - 86, - 91, - 149, - 80, - 133, - 97, - 2, - 174, - 87, - 96, - 0, - 128, - 253, - 91, - 128, - 53, - 96, - 32, - 130, - 1, - 53, - 145, - 80, - 97, - 2, - 202, - 130, - 130, - 97, - 2, - 32, - 81, - 97, - 2, - 0, - 81, - 139, - 97, - 0, - 201, - 86, - 91, - 135, - 22, - 150, - 80, - 80, - 80, - 132, - 97, - 2, - 218, - 87, - 96, - 0, - 128, - 253, - 91, - 96, - 1, - 1, - 97, - 2, - 1, - 86, - 91, - 80, - 80, - 80, - 80, - 128, - 96, - 0, - 82, - 96, - 32, - 96, - 0, - 243, - 91, - 96, - 0, - 128, - 131, - 96, - 31, - 132, - 1, - 18, - 97, - 3, - 2, - 87, - 96, - 0, - 128, - 253, - 91, - 80, - 129, - 53, - 103, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 129, - 17, - 21, - 97, - 3, - 26, - 87, - 96, - 0, - 128, - 253, - 91, - 96, - 32, - 131, - 1, - 145, - 80, - 131, - 96, - 32, - 130, - 96, - 5, - 27, - 133, - 1, - 1, - 17, - 21, - 97, - 3, - 53, - 87, - 96, - 0, - 128, - 253, - 91, - 146, - 80, - 146, - 144, - 80, - 86, - 91, - 96, - 0, - 128, - 96, - 0, - 128, - 96, - 0, - 128, - 96, - 0, - 96, - 128, - 136, - 138, - 3, - 18, - 21, - 97, - 3, - 87, - 87, - 96, - 0, - 128, - 253, - 91, - 135, - 53, - 96, - 1, - 96, - 1, - 96, - 160, - 27, - 3, - 129, - 22, - 129, - 20, - 97, - 3, - 110, - 87, - 96, - 0, - 128, - 253, - 91, - 150, - 80, - 96, - 32, - 136, - 1, - 53, - 103, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 128, - 130, - 17, - 21, - 97, - 3, - 139, - 87, - 96, - 0, - 128, - 253, - 91, - 129, - 138, - 1, - 145, - 80, - 138, - 96, - 31, - 131, - 1, - 18, - 97, - 3, - 159, - 87, - 96, - 0, - 128, - 253, - 91, - 129, - 53, - 129, - 129, - 17, - 21, - 97, - 3, - 174, - 87, - 96, - 0, - 128, - 253, - 91, - 139, - 96, - 32, - 130, - 133, - 1, - 1, - 17, - 21, - 97, - 3, - 192, - 87, - 96, - 0, - 128, - 253, - 91, - 96, - 32, - 131, - 1, - 152, - 80, - 128, - 151, - 80, - 80, - 96, - 64, - 138, - 1, - 53, - 145, - 80, - 128, - 130, - 17, - 21, - 97, - 3, - 222, - 87, - 96, - 0, - 128, - 253, - 91, - 97, - 3, - 234, - 139, - 131, - 140, - 1, - 97, - 2, - 240, - 86, - 91, - 144, - 150, - 80, - 148, - 80, - 96, - 96, - 138, - 1, - 53, - 145, - 80, - 128, - 130, - 17, - 21, - 97, - 4, - 3, - 87, - 96, - 0, - 128, - 253, - 91, - 80, - 97, - 4, - 16, - 138, - 130, - 139, - 1, - 97, - 2, - 240, - 86, - 91, - 152, - 155, - 151, - 154, - 80, - 149, - 152, - 80, - 147, - 150, - 146, - 149, - 146, - 147, - 80, - 80, - 80, - 86, - 254, - 162, - 100, - 105, - 112, - 102, - 115, - 88, - 34, - 18, - 32, - 126, - 94, - 18, - 135, - 237, - 192, - 106, - 176, - 138, - 117, - 148, - 175, - 188, - 5, - 29, - 238, - 102, - 42, - 95, - 89, - 105, - 55, - 42, - 182, - 85, - 202, - 193, - 11, - 170, - 77, - 47, - 178, - 100, - 115, - 111, - 108, - 99, - 67, - 0, - 8, - 18, - 0, - 51, - ]; - ///The deployed bytecode of the contract. - pub static INCLUSIONVERIFIER_DEPLOYED_BYTECODE: ::ethers::core::types::Bytes = ::ethers::core::types::Bytes::from_static( - __DEPLOYED_BYTECODE, - ); - pub struct InclusionVerifier(::ethers::contract::Contract); - impl ::core::clone::Clone for InclusionVerifier { - fn clone(&self) -> Self { - Self(::core::clone::Clone::clone(&self.0)) - } - } - impl ::core::ops::Deref for InclusionVerifier { - type Target = ::ethers::contract::Contract; - fn deref(&self) -> &Self::Target { - &self.0 - } - } - impl ::core::ops::DerefMut for InclusionVerifier { - fn deref_mut(&mut self) -> &mut Self::Target { - &mut self.0 - } - } - impl ::core::fmt::Debug for InclusionVerifier { - fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { - f.debug_tuple(stringify!(InclusionVerifier)).field(&self.address()).finish() - } - } - impl InclusionVerifier { - /// Creates a new contract instance with the specified `ethers` client at - /// `address`. The contract derefs to a `ethers::Contract` object. - pub fn new>( - address: T, - client: ::std::sync::Arc, - ) -> Self { - Self( - ::ethers::contract::Contract::new( - address.into(), - INCLUSIONVERIFIER_ABI.clone(), - client, - ), - ) - } - /// Constructs the general purpose `Deployer` instance based on the provided constructor arguments and sends it. - /// Returns a new instance of a deployer that returns an instance of this contract after sending the transaction - /// - /// Notes: - /// - If there are no constructor arguments, you should pass `()` as the argument. - /// - The default poll duration is 7 seconds. - /// - The default number of confirmations is 1 block. - /// - /// - /// # Example - /// - /// Generate contract bindings with `abigen!` and deploy a new contract instance. - /// - /// *Note*: this requires a `bytecode` and `abi` object in the `greeter.json` artifact. - /// - /// ```ignore - /// # async fn deploy(client: ::std::sync::Arc) { - /// abigen!(Greeter, "../greeter.json"); - /// - /// let greeter_contract = Greeter::deploy(client, "Hello world!".to_string()).unwrap().send().await.unwrap(); - /// let msg = greeter_contract.greet().call().await.unwrap(); - /// # } - /// ``` - pub fn deploy( - client: ::std::sync::Arc, - constructor_args: T, - ) -> ::core::result::Result< - ::ethers::contract::builders::ContractDeployer, - ::ethers::contract::ContractError, - > { - let factory = ::ethers::contract::ContractFactory::new( - INCLUSIONVERIFIER_ABI.clone(), - INCLUSIONVERIFIER_BYTECODE.clone().into(), - client, - ); - let deployer = factory.deploy(constructor_args)?; - let deployer = ::ethers::contract::ContractDeployer::new(deployer); - Ok(deployer) - } - ///Calls the contract's `verifyProof` (0x47f6b5aa) function - pub fn verify_proof( - &self, - vk: ::ethers::core::types::Address, - proofs: ::ethers::core::types::Bytes, - challenges: ::std::vec::Vec<::ethers::core::types::U256>, - values: ::std::vec::Vec<::ethers::core::types::U256>, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([71, 246, 181, 170], (vk, proofs, challenges, values)) - .expect("method not found (this should never happen)") - } - } - impl From<::ethers::contract::Contract> - for InclusionVerifier { - fn from(contract: ::ethers::contract::Contract) -> Self { - Self::new(contract.address(), contract.client()) - } - } - ///Container type for all input parameters for the `verifyProof` function with signature `verifyProof(address,bytes,uint256[],uint256[])` and selector `0x47f6b5aa` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethcall( - name = "verifyProof", - abi = "verifyProof(address,bytes,uint256[],uint256[])" - )] - pub struct VerifyProofCall { - pub vk: ::ethers::core::types::Address, - pub proofs: ::ethers::core::types::Bytes, - pub challenges: ::std::vec::Vec<::ethers::core::types::U256>, - pub values: ::std::vec::Vec<::ethers::core::types::U256>, - } - ///Container type for all return fields from the `verifyProof` function with signature `verifyProof(address,bytes,uint256[],uint256[])` and selector `0x47f6b5aa` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - pub struct VerifyProofReturn(pub bool); -} diff --git a/backend/src/contracts/generated/mod.rs b/backend/src/contracts/generated/mod.rs deleted file mode 100644 index b1fbeba7..00000000 --- a/backend/src/contracts/generated/mod.rs +++ /dev/null @@ -1,5 +0,0 @@ -pub mod summa_contract; -pub mod verifying_key; -pub mod snark_verifier; -pub mod grandsum_verifier; -pub mod inclusion_verifier; \ No newline at end of file diff --git a/backend/src/contracts/generated/snark_verifier.rs b/backend/src/contracts/generated/snark_verifier.rs deleted file mode 100644 index 31a87475..00000000 --- a/backend/src/contracts/generated/snark_verifier.rs +++ /dev/null @@ -1,17355 +0,0 @@ -pub use verifier::*; -/// This module was auto-generated with ethers-rs Abigen. -/// More information at: -#[allow( - clippy::enum_variant_names, - clippy::too_many_arguments, - clippy::upper_case_acronyms, - clippy::type_complexity, - dead_code, - non_camel_case_types, -)] -pub mod verifier { - #[rustfmt::skip] - const __ABI: &str = "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"vk\",\"type\":\"address\",\"components\":[]},{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\",\"components\":[]},{\"internalType\":\"uint256[]\",\"name\":\"instances\",\"type\":\"uint256[]\",\"components\":[]}],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"verifyProof\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\",\"components\":[]}]}]"; - ///The parsed JSON ABI of the contract. - pub static VERIFIER_ABI: ::ethers::contract::Lazy<::ethers::core::abi::Abi> = ::ethers::contract::Lazy::new(|| - ::ethers::core::utils::__serde_json::from_str(__ABI).expect("ABI is always valid")); - #[rustfmt::skip] - const __BYTECODE: &[u8] = &[ - 96, - 128, - 96, - 64, - 82, - 52, - 128, - 21, - 97, - 0, - 16, - 87, - 96, - 0, - 128, - 253, - 91, - 80, - 97, - 33, - 136, - 128, - 97, - 0, - 32, - 96, - 0, - 57, - 96, - 0, - 243, - 254, - 96, - 128, - 96, - 64, - 82, - 52, - 128, - 21, - 97, - 0, - 16, - 87, - 96, - 0, - 128, - 253, - 91, - 80, - 96, - 4, - 54, - 16, - 97, - 0, - 43, - 87, - 96, - 0, - 53, - 96, - 224, - 28, - 128, - 99, - 175, - 131, - 161, - 141, - 20, - 97, - 0, - 48, - 87, - 91, - 96, - 0, - 128, - 253, - 91, - 97, - 0, - 67, - 97, - 0, - 62, - 54, - 96, - 4, - 97, - 32, - 149, - 86, - 91, - 97, - 0, - 87, - 86, - 91, - 96, - 64, - 81, - 144, - 21, - 21, - 129, - 82, - 96, - 32, - 1, - 96, - 64, - 81, - 128, - 145, - 3, - 144, - 243, - 91, - 96, - 0, - 97, - 2, - 99, - 86, - 91, - 96, - 0, - 128, - 96, - 0, - 132, - 53, - 96, - 32, - 134, - 1, - 53, - 136, - 130, - 16, - 134, - 22, - 148, - 80, - 136, - 129, - 16, - 133, - 22, - 148, - 80, - 136, - 96, - 3, - 138, - 139, - 133, - 134, - 9, - 133, - 9, - 8, - 137, - 130, - 131, - 9, - 146, - 137, - 82, - 96, - 32, - 137, - 1, - 145, - 144, - 145, - 82, - 20, - 146, - 144, - 146, - 22, - 150, - 96, - 64, - 148, - 133, - 1, - 150, - 80, - 147, - 144, - 148, - 1, - 147, - 80, - 80, - 80, - 86, - 91, - 96, - 1, - 96, - 32, - 83, - 96, - 33, - 96, - 0, - 144, - 129, - 32, - 146, - 131, - 6, - 130, - 82, - 145, - 144, - 145, - 82, - 96, - 32, - 1, - 144, - 86, - 91, - 96, - 0, - 131, - 131, - 81, - 96, - 32, - 133, - 1, - 91, - 96, - 32, - 135, - 3, - 129, - 16, - 21, - 97, - 0, - 240, - 87, - 135, - 129, - 81, - 131, - 9, - 128, - 132, - 82, - 96, - 32, - 147, - 132, - 1, - 147, - 144, - 146, - 80, - 1, - 97, - 0, - 206, - 86, - 91, - 135, - 129, - 81, - 131, - 9, - 145, - 80, - 96, - 32, - 131, - 82, - 96, - 32, - 128, - 132, - 1, - 82, - 96, - 32, - 96, - 64, - 132, - 1, - 82, - 129, - 96, - 96, - 132, - 1, - 82, - 96, - 2, - 136, - 3, - 96, - 128, - 132, - 1, - 82, - 135, - 96, - 160, - 132, - 1, - 82, - 96, - 32, - 131, - 96, - 192, - 133, - 96, - 5, - 90, - 250, - 133, - 22, - 147, - 80, - 130, - 81, - 145, - 80, - 133, - 96, - 32, - 129, - 1, - 96, - 32, - 133, - 3, - 148, - 80, - 91, - 130, - 129, - 16, - 21, - 97, - 1, - 99, - 87, - 137, - 133, - 81, - 133, - 9, - 138, - 132, - 81, - 134, - 9, - 144, - 132, - 82, - 96, - 31, - 25, - 149, - 134, - 1, - 149, - 144, - 148, - 80, - 144, - 146, - 1, - 145, - 97, - 1, - 59, - 86, - 91, - 137, - 129, - 81, - 133, - 9, - 148, - 80, - 137, - 130, - 81, - 133, - 9, - 148, - 144, - 145, - 82, - 146, - 144, - 146, - 82, - 80, - 144, - 149, - 148, - 80, - 80, - 80, - 80, - 80, - 86, - 91, - 129, - 96, - 64, - 82, - 130, - 96, - 96, - 82, - 96, - 0, - 96, - 64, - 96, - 0, - 96, - 128, - 96, - 0, - 96, - 6, - 90, - 250, - 144, - 145, - 22, - 147, - 146, - 80, - 80, - 80, - 86, - 91, - 129, - 96, - 64, - 82, - 96, - 0, - 96, - 64, - 96, - 0, - 96, - 96, - 96, - 0, - 96, - 7, - 90, - 250, - 144, - 145, - 22, - 146, - 145, - 80, - 80, - 86, - 91, - 129, - 96, - 192, - 82, - 130, - 96, - 224, - 82, - 96, - 0, - 96, - 64, - 96, - 128, - 128, - 96, - 128, - 96, - 6, - 90, - 250, - 144, - 145, - 22, - 147, - 146, - 80, - 80, - 80, - 86, - 91, - 129, - 96, - 192, - 82, - 96, - 0, - 96, - 64, - 96, - 128, - 96, - 96, - 96, - 128, - 96, - 7, - 90, - 250, - 144, - 145, - 22, - 146, - 145, - 80, - 80, - 86, - 91, - 129, - 96, - 0, - 82, - 130, - 96, - 32, - 82, - 97, - 11, - 64, - 81, - 96, - 64, - 82, - 97, - 11, - 96, - 81, - 96, - 96, - 82, - 97, - 11, - 128, - 81, - 96, - 128, - 82, - 97, - 11, - 160, - 81, - 96, - 160, - 82, - 131, - 96, - 192, - 82, - 132, - 96, - 224, - 82, - 97, - 11, - 192, - 81, - 97, - 1, - 0, - 82, - 97, - 11, - 224, - 81, - 97, - 1, - 32, - 82, - 97, - 12, - 0, - 81, - 97, - 1, - 64, - 82, - 97, - 12, - 32, - 81, - 97, - 1, - 96, - 82, - 96, - 0, - 96, - 32, - 96, - 0, - 97, - 1, - 128, - 96, - 0, - 96, - 8, - 90, - 250, - 96, - 0, - 81, - 146, - 22, - 144, - 145, - 22, - 149, - 148, - 80, - 80, - 80, - 80, - 80, - 86, - 91, - 127, - 48, - 100, - 78, - 114, - 225, - 49, - 160, - 41, - 184, - 80, - 69, - 182, - 129, - 129, - 88, - 93, - 151, - 129, - 106, - 145, - 104, - 113, - 202, - 141, - 60, - 32, - 140, - 22, - 216, - 124, - 253, - 71, - 127, - 48, - 100, - 78, - 114, - 225, - 49, - 160, - 41, - 184, - 80, - 69, - 182, - 129, - 129, - 88, - 93, - 40, - 51, - 232, - 72, - 121, - 185, - 112, - 145, - 67, - 225, - 245, - 147, - 240, - 0, - 0, - 1, - 96, - 1, - 97, - 5, - 96, - 96, - 0, - 97, - 9, - 160, - 139, - 60, - 96, - 100, - 53, - 97, - 21, - 0, - 20, - 129, - 22, - 144, - 80, - 97, - 10, - 96, - 81, - 97, - 21, - 132, - 53, - 129, - 20, - 130, - 22, - 145, - 80, - 97, - 9, - 160, - 81, - 96, - 0, - 82, - 96, - 32, - 97, - 21, - 164, - 130, - 96, - 32, - 2, - 129, - 1, - 91, - 128, - 130, - 16, - 21, - 97, - 3, - 0, - 87, - 129, - 53, - 128, - 132, - 82, - 134, - 17, - 148, - 144, - 148, - 22, - 147, - 96, - 32, - 146, - 131, - 1, - 146, - 144, - 145, - 1, - 144, - 97, - 2, - 221, - 86, - 91, - 80, - 96, - 132, - 146, - 80, - 97, - 15, - 0, - 144, - 80, - 97, - 3, - 68, - 91, - 128, - 132, - 16, - 21, - 97, - 3, - 45, - 87, - 97, - 3, - 34, - 135, - 132, - 134, - 136, - 97, - 0, - 94, - 86, - 91, - 148, - 80, - 148, - 80, - 148, - 80, - 97, - 3, - 14, - 86, - 91, - 80, - 96, - 0, - 145, - 130, - 32, - 133, - 129, - 6, - 130, - 82, - 144, - 145, - 82, - 96, - 32, - 144, - 129, - 1, - 97, - 4, - 0, - 131, - 1, - 91, - 128, - 132, - 16, - 21, - 97, - 3, - 101, - 87, - 97, - 3, - 90, - 135, - 132, - 134, - 136, - 97, - 0, - 94, - 86, - 91, - 148, - 80, - 148, - 80, - 148, - 80, - 97, - 3, - 70, - 86, - 91, - 80, - 96, - 0, - 145, - 130, - 32, - 133, - 129, - 6, - 130, - 82, - 144, - 145, - 82, - 96, - 32, - 144, - 129, - 1, - 97, - 3, - 130, - 133, - 130, - 97, - 0, - 169, - 86, - 91, - 144, - 80, - 97, - 3, - 128, - 131, - 1, - 91, - 128, - 132, - 16, - 21, - 97, - 3, - 169, - 87, - 97, - 3, - 158, - 135, - 132, - 134, - 136, - 97, - 0, - 94, - 86, - 91, - 148, - 80, - 148, - 80, - 148, - 80, - 97, - 3, - 138, - 86, - 91, - 80, - 96, - 0, - 145, - 130, - 32, - 133, - 129, - 6, - 130, - 82, - 144, - 145, - 82, - 96, - 32, - 144, - 129, - 1, - 96, - 192, - 131, - 1, - 91, - 128, - 132, - 16, - 21, - 97, - 3, - 224, - 87, - 97, - 3, - 213, - 135, - 132, - 134, - 136, - 97, - 0, - 94, - 86, - 91, - 148, - 80, - 148, - 80, - 148, - 80, - 97, - 3, - 193, - 86, - 91, - 80, - 96, - 0, - 145, - 130, - 32, - 133, - 129, - 6, - 130, - 82, - 144, - 145, - 82, - 96, - 32, - 144, - 129, - 1, - 97, - 9, - 128, - 131, - 1, - 91, - 128, - 132, - 16, - 21, - 97, - 4, - 28, - 87, - 131, - 53, - 128, - 132, - 82, - 134, - 17, - 148, - 144, - 148, - 22, - 147, - 96, - 32, - 147, - 132, - 1, - 147, - 144, - 146, - 1, - 145, - 97, - 3, - 249, - 86, - 91, - 80, - 96, - 0, - 145, - 130, - 32, - 133, - 129, - 6, - 130, - 82, - 144, - 145, - 82, - 96, - 32, - 144, - 129, - 1, - 97, - 4, - 57, - 133, - 130, - 97, - 0, - 169, - 86, - 91, - 144, - 80, - 97, - 4, - 71, - 134, - 131, - 133, - 135, - 97, - 0, - 94, - 86, - 91, - 96, - 0, - 144, - 129, - 32, - 136, - 129, - 6, - 144, - 148, - 82, - 146, - 144, - 146, - 82, - 147, - 80, - 145, - 80, - 96, - 32, - 144, - 80, - 97, - 4, - 106, - 133, - 130, - 132, - 134, - 97, - 0, - 94, - 86, - 91, - 146, - 80, - 146, - 80, - 146, - 80, - 80, - 80, - 97, - 10, - 128, - 81, - 21, - 97, - 5, - 55, - 87, - 97, - 10, - 192, - 81, - 97, - 10, - 224, - 81, - 96, - 32, - 97, - 10, - 160, - 81, - 2, - 97, - 21, - 164, - 1, - 96, - 32, - 131, - 2, - 96, - 2, - 129, - 2, - 96, - 3, - 130, - 2, - 131, - 53, - 131, - 133, - 1, - 53, - 131, - 134, - 1, - 53, - 131, - 135, - 1, - 53, - 137, - 96, - 32, - 2, - 136, - 1, - 137, - 91, - 129, - 138, - 16, - 21, - 97, - 4, - 238, - 87, - 96, - 32, - 138, - 1, - 153, - 80, - 137, - 53, - 129, - 27, - 134, - 1, - 149, - 80, - 136, - 138, - 1, - 53, - 129, - 27, - 133, - 1, - 148, - 80, - 135, - 138, - 1, - 53, - 129, - 27, - 132, - 1, - 147, - 80, - 134, - 138, - 1, - 53, - 129, - 27, - 131, - 1, - 146, - 80, - 138, - 129, - 1, - 144, - 80, - 97, - 4, - 176, - 86, - 91, - 80, - 80, - 140, - 96, - 3, - 142, - 143, - 135, - 136, - 9, - 135, - 9, - 8, - 141, - 132, - 133, - 9, - 20, - 139, - 22, - 154, - 80, - 140, - 96, - 3, - 142, - 143, - 133, - 134, - 9, - 133, - 9, - 8, - 141, - 130, - 131, - 9, - 20, - 139, - 22, - 154, - 80, - 131, - 97, - 16, - 0, - 82, - 130, - 97, - 16, - 32, - 82, - 129, - 97, - 16, - 64, - 82, - 128, - 97, - 16, - 96, - 82, - 80, - 80, - 80, - 80, - 80, - 80, - 80, - 80, - 80, - 80, - 91, - 128, - 97, - 5, - 65, - 87, - 96, - 0, - 128, - 253, - 91, - 97, - 9, - 192, - 81, - 146, - 80, - 97, - 15, - 128, - 81, - 128, - 96, - 0, - 91, - 133, - 129, - 16, - 21, - 97, - 5, - 101, - 87, - 132, - 130, - 131, - 9, - 145, - 80, - 96, - 1, - 1, - 97, - 5, - 79, - 86, - 91, - 80, - 97, - 10, - 0, - 81, - 148, - 80, - 97, - 16, - 128, - 96, - 6, - 97, - 10, - 96, - 81, - 1, - 96, - 32, - 2, - 129, - 1, - 97, - 10, - 96, - 81, - 97, - 5, - 135, - 87, - 96, - 32, - 1, - 91, - 97, - 10, - 64, - 81, - 91, - 129, - 131, - 16, - 21, - 97, - 5, - 173, - 87, - 134, - 129, - 136, - 3, - 134, - 8, - 131, - 82, - 134, - 136, - 130, - 9, - 144, - 80, - 96, - 32, - 131, - 1, - 146, - 80, - 97, - 5, - 140, - 86, - 91, - 80, - 133, - 96, - 1, - 135, - 3, - 132, - 8, - 147, - 80, - 131, - 129, - 82, - 97, - 5, - 203, - 134, - 96, - 32, - 131, - 1, - 97, - 16, - 128, - 136, - 97, - 0, - 196, - 86, - 91, - 148, - 80, - 97, - 16, - 128, - 145, - 80, - 133, - 97, - 9, - 224, - 81, - 133, - 9, - 147, - 80, - 97, - 10, - 64, - 81, - 91, - 129, - 131, - 16, - 21, - 97, - 6, - 3, - 87, - 134, - 135, - 130, - 133, - 81, - 9, - 134, - 9, - 131, - 82, - 134, - 136, - 130, - 9, - 144, - 80, - 96, - 32, - 131, - 1, - 146, - 80, - 97, - 5, - 224, - 86, - 91, - 80, - 97, - 16, - 160, - 81, - 150, - 80, - 97, - 16, - 192, - 147, - 80, - 97, - 17, - 64, - 145, - 80, - 91, - 129, - 132, - 16, - 21, - 97, - 6, - 47, - 87, - 133, - 132, - 81, - 136, - 8, - 150, - 80, - 96, - 32, - 132, - 1, - 147, - 80, - 97, - 6, - 21, - 86, - 91, - 96, - 0, - 145, - 80, - 97, - 21, - 164, - 97, - 10, - 96, - 81, - 96, - 32, - 2, - 129, - 1, - 91, - 128, - 130, - 16, - 21, - 97, - 6, - 100, - 87, - 135, - 136, - 131, - 53, - 136, - 81, - 9, - 133, - 8, - 147, - 80, - 96, - 32, - 130, - 1, - 145, - 80, - 96, - 32, - 134, - 1, - 149, - 80, - 97, - 6, - 64, - 86, - 91, - 80, - 80, - 81, - 97, - 16, - 128, - 128, - 81, - 97, - 17, - 64, - 81, - 148, - 144, - 145, - 82, - 97, - 16, - 160, - 145, - 144, - 145, - 82, - 97, - 16, - 192, - 82, - 97, - 16, - 224, - 149, - 144, - 149, - 82, - 97, - 17, - 0, - 129, - 144, - 82, - 97, - 17, - 32, - 148, - 144, - 148, - 82, - 80, - 97, - 15, - 96, - 81, - 96, - 0, - 147, - 127, - 9, - 34, - 107, - 110, - 34, - 198, - 240, - 202, - 100, - 236, - 38, - 170, - 212, - 200, - 110, - 113, - 91, - 95, - 137, - 142, - 94, - 150, - 63, - 37, - 135, - 14, - 86, - 187, - 229, - 51, - 233, - 162, - 145, - 144, - 132, - 128, - 97, - 14, - 68, - 53, - 131, - 9, - 134, - 3, - 130, - 8, - 149, - 80, - 80, - 97, - 15, - 196, - 53, - 132, - 128, - 130, - 129, - 3, - 129, - 132, - 128, - 9, - 8, - 97, - 16, - 192, - 81, - 9, - 144, - 80, - 132, - 129, - 134, - 132, - 137, - 9, - 8, - 149, - 80, - 80, - 131, - 132, - 97, - 14, - 132, - 53, - 134, - 3, - 97, - 14, - 164, - 53, - 8, - 97, - 17, - 0, - 81, - 9, - 132, - 129, - 134, - 132, - 137, - 9, - 8, - 149, - 80, - 80, - 131, - 132, - 97, - 14, - 228, - 53, - 134, - 3, - 97, - 15, - 4, - 53, - 8, - 97, - 17, - 0, - 81, - 9, - 132, - 129, - 134, - 132, - 137, - 9, - 8, - 149, - 80, - 80, - 131, - 132, - 97, - 15, - 68, - 53, - 134, - 3, - 97, - 15, - 100, - 53, - 8, - 97, - 17, - 0, - 81, - 9, - 132, - 129, - 134, - 132, - 137, - 9, - 8, - 149, - 80, - 80, - 131, - 132, - 97, - 15, - 164, - 53, - 134, - 3, - 97, - 15, - 196, - 53, - 8, - 97, - 17, - 0, - 81, - 9, - 132, - 129, - 134, - 132, - 137, - 9, - 8, - 149, - 80, - 80, - 97, - 15, - 64, - 81, - 97, - 15, - 32, - 81, - 97, - 14, - 100, - 53, - 97, - 14, - 68, - 53, - 135, - 136, - 133, - 138, - 139, - 97, - 13, - 4, - 53, - 136, - 9, - 97, - 12, - 196, - 53, - 8, - 8, - 131, - 9, - 145, - 80, - 135, - 136, - 133, - 138, - 139, - 97, - 13, - 36, - 53, - 136, - 9, - 97, - 17, - 32, - 81, - 8, - 8, - 131, - 9, - 145, - 80, - 135, - 97, - 15, - 128, - 81, - 132, - 9, - 96, - 0, - 82, - 135, - 136, - 133, - 138, - 96, - 0, - 81, - 97, - 12, - 196, - 53, - 8, - 8, - 130, - 9, - 144, - 80, - 135, - 134, - 96, - 0, - 81, - 9, - 96, - 0, - 82, - 135, - 136, - 133, - 138, - 96, - 0, - 81, - 97, - 17, - 32, - 81, - 8, - 8, - 130, - 9, - 144, - 80, - 135, - 134, - 96, - 0, - 81, - 9, - 96, - 0, - 82, - 135, - 129, - 137, - 3, - 131, - 8, - 147, - 80, - 80, - 80, - 80, - 132, - 133, - 134, - 97, - 16, - 224, - 81, - 97, - 16, - 192, - 81, - 8, - 131, - 9, - 134, - 3, - 130, - 8, - 144, - 80, - 132, - 129, - 134, - 132, - 137, - 9, - 8, - 149, - 80, - 80, - 97, - 15, - 64, - 81, - 97, - 15, - 32, - 81, - 97, - 14, - 196, - 53, - 97, - 14, - 164, - 53, - 135, - 136, - 133, - 138, - 139, - 97, - 13, - 68, - 53, - 136, - 9, - 97, - 11, - 132, - 53, - 8, - 8, - 131, - 9, - 145, - 80, - 135, - 136, - 133, - 138, - 139, - 97, - 13, - 100, - 53, - 136, - 9, - 97, - 11, - 164, - 53, - 8, - 8, - 131, - 9, - 145, - 80, - 135, - 136, - 133, - 138, - 96, - 0, - 81, - 97, - 11, - 132, - 53, - 8, - 8, - 130, - 9, - 144, - 80, - 135, - 134, - 96, - 0, - 81, - 9, - 96, - 0, - 82, - 135, - 136, - 133, - 138, - 96, - 0, - 81, - 97, - 11, - 164, - 53, - 8, - 8, - 130, - 9, - 144, - 80, - 135, - 134, - 96, - 0, - 81, - 9, - 96, - 0, - 82, - 135, - 129, - 137, - 3, - 131, - 8, - 147, - 80, - 80, - 80, - 80, - 132, - 133, - 134, - 97, - 16, - 224, - 81, - 97, - 16, - 192, - 81, - 8, - 131, - 9, - 134, - 3, - 130, - 8, - 144, - 80, - 132, - 129, - 134, - 132, - 137, - 9, - 8, - 149, - 80, - 80, - 97, - 15, - 64, - 81, - 97, - 15, - 32, - 81, - 97, - 15, - 36, - 53, - 97, - 15, - 4, - 53, - 135, - 136, - 133, - 138, - 139, - 97, - 13, - 132, - 53, - 136, - 9, - 97, - 11, - 196, - 53, - 8, - 8, - 131, - 9, - 145, - 80, - 135, - 136, - 133, - 138, - 139, - 97, - 13, - 164, - 53, - 136, - 9, - 97, - 11, - 228, - 53, - 8, - 8, - 131, - 9, - 145, - 80, - 135, - 136, - 133, - 138, - 96, - 0, - 81, - 97, - 11, - 196, - 53, - 8, - 8, - 130, - 9, - 144, - 80, - 135, - 134, - 96, - 0, - 81, - 9, - 96, - 0, - 82, - 135, - 136, - 133, - 138, - 96, - 0, - 81, - 97, - 11, - 228, - 53, - 8, - 8, - 130, - 9, - 144, - 80, - 135, - 134, - 96, - 0, - 81, - 9, - 96, - 0, - 82, - 135, - 129, - 137, - 3, - 131, - 8, - 147, - 80, - 80, - 80, - 80, - 132, - 133, - 134, - 97, - 16, - 224, - 81, - 97, - 16, - 192, - 81, - 8, - 131, - 9, - 134, - 3, - 130, - 8, - 144, - 80, - 132, - 129, - 134, - 132, - 137, - 9, - 8, - 149, - 80, - 80, - 97, - 15, - 64, - 81, - 97, - 15, - 32, - 81, - 97, - 15, - 132, - 53, - 97, - 15, - 100, - 53, - 135, - 136, - 133, - 138, - 139, - 97, - 13, - 196, - 53, - 136, - 9, - 97, - 12, - 36, - 53, - 8, - 8, - 131, - 9, - 145, - 80, - 135, - 136, - 133, - 138, - 139, - 97, - 13, - 228, - 53, - 136, - 9, - 97, - 12, - 68, - 53, - 8, - 8, - 131, - 9, - 145, - 80, - 135, - 136, - 133, - 138, - 96, - 0, - 81, - 97, - 12, - 36, - 53, - 8, - 8, - 130, - 9, - 144, - 80, - 135, - 134, - 96, - 0, - 81, - 9, - 96, - 0, - 82, - 135, - 136, - 133, - 138, - 96, - 0, - 81, - 97, - 12, - 68, - 53, - 8, - 8, - 130, - 9, - 144, - 80, - 135, - 134, - 96, - 0, - 81, - 9, - 96, - 0, - 82, - 135, - 129, - 137, - 3, - 131, - 8, - 147, - 80, - 80, - 80, - 80, - 132, - 133, - 134, - 97, - 16, - 224, - 81, - 97, - 16, - 192, - 81, - 8, - 131, - 9, - 134, - 3, - 130, - 8, - 144, - 80, - 132, - 129, - 134, - 132, - 137, - 9, - 8, - 149, - 80, - 80, - 97, - 15, - 64, - 81, - 97, - 15, - 32, - 81, - 97, - 15, - 228, - 53, - 97, - 15, - 196, - 53, - 135, - 136, - 133, - 138, - 139, - 97, - 14, - 4, - 53, - 136, - 9, - 97, - 12, - 100, - 53, - 8, - 8, - 131, - 9, - 145, - 80, - 135, - 136, - 133, - 138, - 139, - 97, - 14, - 36, - 53, - 136, - 9, - 97, - 12, - 132, - 53, - 8, - 8, - 131, - 9, - 145, - 80, - 135, - 136, - 133, - 138, - 96, - 0, - 81, - 97, - 12, - 100, - 53, - 8, - 8, - 130, - 9, - 144, - 80, - 135, - 134, - 96, - 0, - 81, - 9, - 96, - 0, - 82, - 135, - 136, - 133, - 138, - 96, - 0, - 81, - 97, - 12, - 132, - 53, - 8, - 8, - 130, - 9, - 144, - 80, - 135, - 129, - 137, - 3, - 131, - 8, - 147, - 80, - 80, - 80, - 80, - 132, - 133, - 134, - 97, - 16, - 224, - 81, - 97, - 16, - 192, - 81, - 8, - 131, - 9, - 134, - 3, - 130, - 8, - 144, - 80, - 132, - 129, - 134, - 132, - 137, - 9, - 8, - 149, - 80, - 80, - 97, - 17, - 0, - 81, - 132, - 133, - 97, - 16, - 4, - 53, - 135, - 3, - 131, - 9, - 130, - 8, - 144, - 80, - 132, - 129, - 134, - 132, - 137, - 9, - 8, - 149, - 80, - 80, - 97, - 16, - 192, - 81, - 132, - 133, - 97, - 16, - 4, - 53, - 135, - 3, - 135, - 97, - 16, - 4, - 53, - 97, - 16, - 4, - 53, - 9, - 8, - 130, - 9, - 144, - 80, - 132, - 129, - 134, - 132, - 137, - 9, - 8, - 149, - 80, - 96, - 0, - 144, - 80, - 97, - 12, - 4, - 53, - 97, - 11, - 132, - 53, - 98, - 1, - 0, - 0, - 135, - 129, - 131, - 9, - 136, - 3, - 145, - 80, - 135, - 144, - 80, - 129, - 131, - 8, - 97, - 15, - 32, - 81, - 97, - 15, - 64, - 81, - 145, - 148, - 80, - 97, - 12, - 196, - 53, - 147, - 80, - 145, - 80, - 135, - 128, - 128, - 131, - 97, - 16, - 132, - 53, - 8, - 138, - 133, - 97, - 16, - 68, - 53, - 8, - 9, - 97, - 16, - 36, - 53, - 9, - 136, - 137, - 138, - 132, - 135, - 8, - 139, - 134, - 137, - 8, - 9, - 97, - 16, - 4, - 53, - 9, - 148, - 80, - 136, - 137, - 134, - 139, - 3, - 131, - 8, - 138, - 139, - 97, - 16, - 192, - 81, - 97, - 16, - 224, - 81, - 8, - 140, - 3, - 96, - 1, - 8, - 9, - 148, - 80, - 80, - 80, - 80, - 80, - 132, - 129, - 134, - 132, - 137, - 9, - 8, - 149, - 80, - 80, - 131, - 132, - 97, - 16, - 132, - 53, - 134, - 3, - 97, - 16, - 68, - 53, - 8, - 97, - 17, - 0, - 81, - 9, - 132, - 129, - 134, - 132, - 137, - 9, - 8, - 149, - 80, - 80, - 131, - 132, - 133, - 97, - 16, - 100, - 53, - 135, - 3, - 97, - 16, - 68, - 53, - 8, - 134, - 97, - 16, - 132, - 53, - 136, - 3, - 97, - 16, - 68, - 53, - 8, - 9, - 133, - 134, - 97, - 16, - 192, - 81, - 97, - 16, - 224, - 81, - 8, - 135, - 3, - 96, - 1, - 8, - 9, - 132, - 129, - 134, - 132, - 137, - 9, - 8, - 149, - 80, - 80, - 97, - 17, - 0, - 81, - 132, - 133, - 97, - 16, - 164, - 53, - 135, - 3, - 131, - 9, - 130, - 8, - 144, - 80, - 132, - 129, - 134, - 132, - 137, - 9, - 8, - 149, - 80, - 80, - 97, - 16, - 192, - 81, - 132, - 133, - 97, - 16, - 164, - 53, - 135, - 3, - 135, - 97, - 16, - 164, - 53, - 97, - 16, - 164, - 53, - 9, - 8, - 130, - 9, - 144, - 80, - 132, - 129, - 134, - 132, - 137, - 9, - 8, - 149, - 80, - 96, - 0, - 144, - 80, - 97, - 11, - 132, - 53, - 97, - 11, - 164, - 53, - 98, - 1, - 0, - 0, - 135, - 129, - 131, - 9, - 136, - 3, - 145, - 80, - 135, - 144, - 80, - 129, - 131, - 8, - 97, - 15, - 32, - 81, - 97, - 15, - 64, - 81, - 145, - 148, - 80, - 97, - 12, - 196, - 53, - 147, - 80, - 145, - 80, - 135, - 128, - 128, - 131, - 97, - 17, - 36, - 53, - 8, - 138, - 133, - 97, - 16, - 228, - 53, - 8, - 9, - 97, - 16, - 196, - 53, - 9, - 136, - 137, - 138, - 132, - 135, - 8, - 139, - 134, - 137, - 8, - 9, - 97, - 16, - 164, - 53, - 9, - 148, - 80, - 136, - 137, - 134, - 139, - 3, - 131, - 8, - 138, - 139, - 97, - 16, - 192, - 81, - 97, - 16, - 224, - 81, - 8, - 140, - 3, - 96, - 1, - 8, - 9, - 148, - 80, - 80, - 80, - 80, - 80, - 132, - 129, - 134, - 132, - 137, - 9, - 8, - 149, - 80, - 80, - 131, - 132, - 97, - 17, - 36, - 53, - 134, - 3, - 97, - 16, - 228, - 53, - 8, - 97, - 17, - 0, - 81, - 9, - 132, - 129, - 134, - 132, - 137, - 9, - 8, - 149, - 80, - 80, - 131, - 132, - 133, - 97, - 17, - 4, - 53, - 135, - 3, - 97, - 16, - 228, - 53, - 8, - 134, - 97, - 17, - 36, - 53, - 136, - 3, - 97, - 16, - 228, - 53, - 8, - 9, - 133, - 134, - 97, - 16, - 192, - 81, - 97, - 16, - 224, - 81, - 8, - 135, - 3, - 96, - 1, - 8, - 9, - 132, - 129, - 134, - 132, - 137, - 9, - 8, - 149, - 80, - 80, - 97, - 17, - 0, - 81, - 132, - 133, - 97, - 17, - 68, - 53, - 135, - 3, - 131, - 9, - 130, - 8, - 144, - 80, - 132, - 129, - 134, - 132, - 137, - 9, - 8, - 149, - 80, - 80, - 97, - 16, - 192, - 81, - 132, - 133, - 97, - 17, - 68, - 53, - 135, - 3, - 135, - 97, - 17, - 68, - 53, - 97, - 17, - 68, - 53, - 9, - 8, - 130, - 9, - 144, - 80, - 132, - 129, - 134, - 132, - 137, - 9, - 8, - 149, - 80, - 96, - 0, - 144, - 80, - 97, - 11, - 164, - 53, - 97, - 11, - 196, - 53, - 98, - 1, - 0, - 0, - 135, - 129, - 131, - 9, - 136, - 3, - 145, - 80, - 135, - 144, - 80, - 129, - 131, - 8, - 97, - 15, - 32, - 81, - 97, - 15, - 64, - 81, - 145, - 148, - 80, - 97, - 12, - 196, - 53, - 147, - 80, - 145, - 80, - 135, - 128, - 128, - 131, - 97, - 17, - 196, - 53, - 8, - 138, - 133, - 97, - 17, - 132, - 53, - 8, - 9, - 97, - 17, - 100, - 53, - 9, - 136, - 137, - 138, - 132, - 135, - 8, - 139, - 134, - 137, - 8, - 9, - 97, - 17, - 68, - 53, - 9, - 148, - 80, - 136, - 137, - 134, - 139, - 3, - 131, - 8, - 138, - 139, - 97, - 16, - 192, - 81, - 97, - 16, - 224, - 81, - 8, - 140, - 3, - 96, - 1, - 8, - 9, - 148, - 80, - 80, - 80, - 80, - 80, - 132, - 129, - 134, - 132, - 137, - 9, - 8, - 149, - 80, - 80, - 131, - 132, - 97, - 17, - 196, - 53, - 134, - 3, - 97, - 17, - 132, - 53, - 8, - 97, - 17, - 0, - 81, - 9, - 132, - 129, - 134, - 132, - 137, - 9, - 8, - 149, - 80, - 80, - 131, - 132, - 133, - 97, - 17, - 164, - 53, - 135, - 3, - 97, - 17, - 132, - 53, - 8, - 134, - 97, - 17, - 196, - 53, - 136, - 3, - 97, - 17, - 132, - 53, - 8, - 9, - 133, - 134, - 97, - 16, - 192, - 81, - 97, - 16, - 224, - 81, - 8, - 135, - 3, - 96, - 1, - 8, - 9, - 132, - 129, - 134, - 132, - 137, - 9, - 8, - 149, - 80, - 80, - 97, - 17, - 0, - 81, - 132, - 133, - 97, - 17, - 228, - 53, - 135, - 3, - 131, - 9, - 130, - 8, - 144, - 80, - 132, - 129, - 134, - 132, - 137, - 9, - 8, - 149, - 80, - 80, - 97, - 16, - 192, - 81, - 132, - 133, - 97, - 17, - 228, - 53, - 135, - 3, - 135, - 97, - 17, - 228, - 53, - 97, - 17, - 228, - 53, - 9, - 8, - 130, - 9, - 144, - 80, - 132, - 129, - 134, - 132, - 137, - 9, - 8, - 149, - 80, - 96, - 0, - 144, - 80, - 97, - 11, - 196, - 53, - 97, - 11, - 228, - 53, - 98, - 1, - 0, - 0, - 135, - 129, - 131, - 9, - 136, - 3, - 145, - 80, - 135, - 144, - 80, - 129, - 131, - 8, - 97, - 15, - 32, - 81, - 97, - 15, - 64, - 81, - 145, - 148, - 80, - 97, - 12, - 196, - 53, - 147, - 80, - 145, - 80, - 135, - 128, - 128, - 131, - 97, - 18, - 100, - 53, - 8, - 138, - 133, - 97, - 18, - 36, - 53, - 8, - 9, - 97, - 18, - 4, - 53, - 9, - 136, - 137, - 138, - 132, - 135, - 8, - 139, - 134, - 137, - 8, - 9, - 97, - 17, - 228, - 53, - 9, - 148, - 80, - 136, - 137, - 134, - 139, - 3, - 131, - 8, - 138, - 139, - 97, - 16, - 192, - 81, - 97, - 16, - 224, - 81, - 8, - 140, - 3, - 96, - 1, - 8, - 9, - 148, - 80, - 80, - 80, - 80, - 80, - 132, - 129, - 134, - 132, - 137, - 9, - 8, - 149, - 80, - 80, - 131, - 132, - 97, - 18, - 100, - 53, - 134, - 3, - 97, - 18, - 36, - 53, - 8, - 97, - 17, - 0, - 81, - 9, - 132, - 129, - 134, - 132, - 137, - 9, - 8, - 149, - 80, - 80, - 131, - 132, - 133, - 97, - 18, - 68, - 53, - 135, - 3, - 97, - 18, - 36, - 53, - 8, - 134, - 97, - 18, - 100, - 53, - 136, - 3, - 97, - 18, - 36, - 53, - 8, - 9, - 133, - 134, - 97, - 16, - 192, - 81, - 97, - 16, - 224, - 81, - 8, - 135, - 3, - 96, - 1, - 8, - 9, - 132, - 129, - 134, - 132, - 137, - 9, - 8, - 149, - 80, - 80, - 97, - 17, - 0, - 81, - 132, - 133, - 97, - 18, - 132, - 53, - 135, - 3, - 131, - 9, - 130, - 8, - 144, - 80, - 132, - 129, - 134, - 132, - 137, - 9, - 8, - 149, - 80, - 80, - 97, - 16, - 192, - 81, - 132, - 133, - 97, - 18, - 132, - 53, - 135, - 3, - 135, - 97, - 18, - 132, - 53, - 97, - 18, - 132, - 53, - 9, - 8, - 130, - 9, - 144, - 80, - 132, - 129, - 134, - 132, - 137, - 9, - 8, - 149, - 80, - 96, - 0, - 144, - 80, - 97, - 12, - 164, - 53, - 97, - 12, - 36, - 53, - 98, - 1, - 0, - 0, - 135, - 129, - 131, - 9, - 136, - 3, - 145, - 80, - 135, - 144, - 80, - 129, - 131, - 8, - 97, - 15, - 32, - 81, - 97, - 15, - 64, - 81, - 145, - 148, - 80, - 97, - 12, - 196, - 53, - 147, - 80, - 145, - 80, - 135, - 128, - 128, - 131, - 97, - 19, - 4, - 53, - 8, - 138, - 133, - 97, - 18, - 196, - 53, - 8, - 9, - 97, - 18, - 164, - 53, - 9, - 136, - 137, - 138, - 132, - 135, - 8, - 139, - 134, - 137, - 8, - 9, - 97, - 18, - 132, - 53, - 9, - 148, - 80, - 136, - 137, - 134, - 139, - 3, - 131, - 8, - 138, - 139, - 97, - 16, - 192, - 81, - 97, - 16, - 224, - 81, - 8, - 140, - 3, - 96, - 1, - 8, - 9, - 148, - 80, - 80, - 80, - 80, - 80, - 132, - 129, - 134, - 132, - 137, - 9, - 8, - 149, - 80, - 80, - 131, - 132, - 97, - 19, - 4, - 53, - 134, - 3, - 97, - 18, - 196, - 53, - 8, - 97, - 17, - 0, - 81, - 9, - 132, - 129, - 134, - 132, - 137, - 9, - 8, - 149, - 80, - 80, - 131, - 132, - 133, - 97, - 18, - 228, - 53, - 135, - 3, - 97, - 18, - 196, - 53, - 8, - 134, - 97, - 19, - 4, - 53, - 136, - 3, - 97, - 18, - 196, - 53, - 8, - 9, - 133, - 134, - 97, - 16, - 192, - 81, - 97, - 16, - 224, - 81, - 8, - 135, - 3, - 96, - 1, - 8, - 9, - 132, - 129, - 134, - 132, - 137, - 9, - 8, - 149, - 80, - 80, - 97, - 17, - 0, - 81, - 132, - 133, - 97, - 19, - 36, - 53, - 135, - 3, - 131, - 9, - 130, - 8, - 144, - 80, - 132, - 129, - 134, - 132, - 137, - 9, - 8, - 149, - 80, - 80, - 97, - 16, - 192, - 81, - 132, - 133, - 97, - 19, - 36, - 53, - 135, - 3, - 135, - 97, - 19, - 36, - 53, - 97, - 19, - 36, - 53, - 9, - 8, - 130, - 9, - 144, - 80, - 132, - 129, - 134, - 132, - 137, - 9, - 8, - 149, - 80, - 96, - 0, - 144, - 80, - 97, - 12, - 36, - 53, - 97, - 12, - 68, - 53, - 98, - 1, - 0, - 0, - 135, - 129, - 131, - 9, - 136, - 3, - 145, - 80, - 135, - 144, - 80, - 129, - 131, - 8, - 97, - 15, - 32, - 81, - 97, - 15, - 64, - 81, - 145, - 148, - 80, - 97, - 12, - 196, - 53, - 147, - 80, - 145, - 80, - 135, - 128, - 128, - 131, - 97, - 19, - 164, - 53, - 8, - 138, - 133, - 97, - 19, - 100, - 53, - 8, - 9, - 97, - 19, - 68, - 53, - 9, - 136, - 137, - 138, - 132, - 135, - 8, - 139, - 134, - 137, - 8, - 9, - 97, - 19, - 36, - 53, - 9, - 148, - 80, - 136, - 137, - 134, - 139, - 3, - 131, - 8, - 138, - 139, - 97, - 16, - 192, - 81, - 97, - 16, - 224, - 81, - 8, - 140, - 3, - 96, - 1, - 8, - 9, - 148, - 80, - 80, - 80, - 80, - 80, - 132, - 129, - 134, - 132, - 137, - 9, - 8, - 149, - 80, - 80, - 131, - 132, - 97, - 19, - 164, - 53, - 134, - 3, - 97, - 19, - 100, - 53, - 8, - 97, - 17, - 0, - 81, - 9, - 132, - 129, - 134, - 132, - 137, - 9, - 8, - 149, - 80, - 80, - 131, - 132, - 133, - 97, - 19, - 132, - 53, - 135, - 3, - 97, - 19, - 100, - 53, - 8, - 134, - 97, - 19, - 164, - 53, - 136, - 3, - 97, - 19, - 100, - 53, - 8, - 9, - 133, - 134, - 97, - 16, - 192, - 81, - 97, - 16, - 224, - 81, - 8, - 135, - 3, - 96, - 1, - 8, - 9, - 132, - 129, - 134, - 132, - 137, - 9, - 8, - 149, - 80, - 80, - 97, - 17, - 0, - 81, - 132, - 133, - 97, - 19, - 196, - 53, - 135, - 3, - 131, - 9, - 130, - 8, - 144, - 80, - 132, - 129, - 134, - 132, - 137, - 9, - 8, - 149, - 80, - 80, - 97, - 16, - 192, - 81, - 132, - 133, - 97, - 19, - 196, - 53, - 135, - 3, - 135, - 97, - 19, - 196, - 53, - 97, - 19, - 196, - 53, - 9, - 8, - 130, - 9, - 144, - 80, - 132, - 129, - 134, - 132, - 137, - 9, - 8, - 149, - 80, - 96, - 0, - 144, - 80, - 97, - 12, - 68, - 53, - 97, - 12, - 100, - 53, - 98, - 1, - 0, - 0, - 135, - 129, - 131, - 9, - 136, - 3, - 145, - 80, - 135, - 144, - 80, - 129, - 131, - 8, - 97, - 15, - 32, - 81, - 97, - 15, - 64, - 81, - 145, - 148, - 80, - 97, - 12, - 196, - 53, - 147, - 80, - 145, - 80, - 135, - 128, - 128, - 131, - 97, - 20, - 68, - 53, - 8, - 138, - 133, - 97, - 20, - 4, - 53, - 8, - 9, - 97, - 19, - 228, - 53, - 9, - 136, - 137, - 138, - 132, - 135, - 8, - 139, - 134, - 137, - 8, - 9, - 97, - 19, - 196, - 53, - 9, - 148, - 80, - 136, - 137, - 134, - 139, - 3, - 131, - 8, - 138, - 139, - 97, - 16, - 192, - 81, - 97, - 16, - 224, - 81, - 8, - 140, - 3, - 96, - 1, - 8, - 9, - 148, - 80, - 80, - 80, - 80, - 80, - 132, - 129, - 134, - 132, - 137, - 9, - 8, - 149, - 80, - 80, - 131, - 132, - 97, - 20, - 68, - 53, - 134, - 3, - 97, - 20, - 4, - 53, - 8, - 97, - 17, - 0, - 81, - 9, - 132, - 129, - 134, - 132, - 137, - 9, - 8, - 149, - 80, - 80, - 131, - 132, - 133, - 97, - 20, - 36, - 53, - 135, - 3, - 97, - 20, - 4, - 53, - 8, - 134, - 97, - 20, - 68, - 53, - 136, - 3, - 97, - 20, - 4, - 53, - 8, - 9, - 133, - 134, - 97, - 16, - 192, - 81, - 97, - 16, - 224, - 81, - 8, - 135, - 3, - 96, - 1, - 8, - 9, - 132, - 129, - 134, - 132, - 137, - 9, - 8, - 149, - 80, - 80, - 97, - 17, - 0, - 81, - 132, - 133, - 97, - 20, - 100, - 53, - 135, - 3, - 131, - 9, - 130, - 8, - 144, - 80, - 132, - 129, - 134, - 132, - 137, - 9, - 8, - 149, - 80, - 80, - 97, - 16, - 192, - 81, - 132, - 133, - 97, - 20, - 100, - 53, - 135, - 3, - 135, - 97, - 20, - 100, - 53, - 97, - 20, - 100, - 53, - 9, - 8, - 130, - 9, - 144, - 80, - 132, - 129, - 134, - 132, - 137, - 9, - 8, - 149, - 80, - 96, - 0, - 144, - 80, - 97, - 12, - 100, - 53, - 97, - 12, - 132, - 53, - 98, - 1, - 0, - 0, - 135, - 129, - 131, - 9, - 136, - 3, - 145, - 80, - 135, - 144, - 80, - 129, - 131, - 8, - 97, - 15, - 32, - 81, - 97, - 15, - 64, - 81, - 145, - 148, - 80, - 97, - 12, - 196, - 53, - 147, - 80, - 145, - 80, - 135, - 128, - 128, - 131, - 97, - 20, - 228, - 53, - 8, - 138, - 133, - 97, - 20, - 164, - 53, - 8, - 9, - 97, - 20, - 132, - 53, - 9, - 136, - 137, - 138, - 132, - 135, - 8, - 139, - 134, - 137, - 8, - 9, - 97, - 20, - 100, - 53, - 9, - 148, - 80, - 136, - 137, - 134, - 139, - 3, - 131, - 8, - 138, - 139, - 97, - 16, - 192, - 81, - 97, - 16, - 224, - 81, - 8, - 140, - 3, - 96, - 1, - 8, - 9, - 148, - 80, - 80, - 80, - 80, - 80, - 132, - 129, - 134, - 132, - 137, - 9, - 8, - 149, - 80, - 80, - 131, - 132, - 97, - 20, - 228, - 53, - 134, - 3, - 97, - 20, - 164, - 53, - 8, - 97, - 17, - 0, - 81, - 9, - 132, - 129, - 134, - 132, - 137, - 9, - 8, - 149, - 80, - 80, - 131, - 132, - 133, - 97, - 20, - 196, - 53, - 135, - 3, - 97, - 20, - 164, - 53, - 8, - 134, - 97, - 20, - 228, - 53, - 136, - 3, - 97, - 20, - 164, - 53, - 8, - 9, - 133, - 134, - 97, - 16, - 192, - 81, - 97, - 16, - 224, - 81, - 8, - 135, - 3, - 96, - 1, - 8, - 9, - 132, - 129, - 134, - 132, - 137, - 9, - 8, - 149, - 80, - 80, - 80, - 80, - 129, - 97, - 16, - 160, - 81, - 132, - 9, - 97, - 17, - 64, - 82, - 97, - 11, - 68, - 53, - 96, - 0, - 82, - 97, - 11, - 100, - 53, - 96, - 32, - 82, - 97, - 16, - 128, - 81, - 146, - 80, - 97, - 11, - 4, - 97, - 10, - 132, - 91, - 129, - 129, - 16, - 21, - 97, - 19, - 65, - 87, - 97, - 19, - 34, - 133, - 132, - 97, - 1, - 162, - 86, - 91, - 146, - 80, - 97, - 19, - 52, - 96, - 32, - 131, - 1, - 53, - 131, - 53, - 133, - 97, - 1, - 130, - 86, - 91, - 146, - 80, - 96, - 64, - 130, - 3, - 145, - 80, - 97, - 19, - 16, - 86, - 91, - 80, - 80, - 96, - 0, - 81, - 97, - 17, - 96, - 82, - 96, - 32, - 81, - 97, - 17, - 128, - 82, - 97, - 15, - 128, - 81, - 146, - 80, - 97, - 10, - 0, - 81, - 97, - 10, - 32, - 81, - 131, - 130, - 134, - 9, - 145, - 80, - 129, - 97, - 3, - 96, - 82, - 132, - 97, - 3, - 64, - 82, - 131, - 129, - 134, - 9, - 145, - 80, - 129, - 97, - 3, - 32, - 82, - 131, - 129, - 131, - 9, - 145, - 80, - 131, - 129, - 131, - 9, - 145, - 80, - 131, - 129, - 131, - 9, - 145, - 80, - 131, - 129, - 131, - 9, - 145, - 80, - 131, - 129, - 131, - 9, - 145, - 80, - 80, - 128, - 97, - 3, - 0, - 82, - 80, - 97, - 15, - 224, - 81, - 146, - 80, - 97, - 3, - 128, - 97, - 4, - 0, - 97, - 3, - 0, - 91, - 129, - 131, - 16, - 21, - 97, - 19, - 204, - 87, - 132, - 129, - 81, - 134, - 3, - 135, - 8, - 131, - 82, - 96, - 32, - 146, - 131, - 1, - 146, - 1, - 97, - 19, - 175, - 86, - 91, - 80, - 80, - 97, - 3, - 192, - 81, - 97, - 4, - 0, - 82, - 80, - 97, - 3, - 128, - 81, - 97, - 3, - 160, - 81, - 144, - 147, - 80, - 130, - 144, - 132, - 9, - 146, - 80, - 129, - 97, - 3, - 224, - 81, - 132, - 9, - 97, - 4, - 32, - 129, - 144, - 82, - 96, - 0, - 82, - 97, - 3, - 160, - 81, - 97, - 4, - 64, - 129, - 144, - 82, - 97, - 3, - 128, - 81, - 147, - 80, - 130, - 144, - 132, - 9, - 97, - 4, - 96, - 82, - 97, - 3, - 128, - 81, - 97, - 3, - 224, - 81, - 144, - 147, - 80, - 130, - 144, - 132, - 9, - 97, - 4, - 128, - 82, - 97, - 3, - 192, - 81, - 96, - 1, - 147, - 80, - 130, - 144, - 132, - 9, - 96, - 32, - 82, - 97, - 3, - 0, - 81, - 97, - 3, - 64, - 81, - 97, - 3, - 96, - 81, - 145, - 148, - 80, - 144, - 96, - 0, - 132, - 131, - 129, - 3, - 135, - 8, - 144, - 80, - 132, - 133, - 131, - 135, - 3, - 136, - 8, - 130, - 9, - 144, - 80, - 132, - 97, - 3, - 128, - 81, - 130, - 9, - 144, - 80, - 128, - 96, - 64, - 82, - 132, - 134, - 134, - 3, - 132, - 8, - 144, - 80, - 132, - 133, - 131, - 135, - 3, - 133, - 8, - 130, - 9, - 144, - 80, - 132, - 97, - 3, - 192, - 81, - 130, - 9, - 144, - 80, - 128, - 96, - 96, - 82, - 132, - 134, - 134, - 3, - 131, - 8, - 144, - 80, - 132, - 133, - 132, - 135, - 3, - 132, - 8, - 130, - 9, - 144, - 80, - 132, - 97, - 3, - 224, - 81, - 130, - 9, - 96, - 128, - 82, - 80, - 80, - 97, - 3, - 64, - 81, - 97, - 3, - 96, - 81, - 144, - 148, - 80, - 144, - 80, - 96, - 0, - 131, - 130, - 129, - 3, - 134, - 8, - 144, - 80, - 131, - 97, - 3, - 192, - 81, - 130, - 9, - 144, - 80, - 128, - 96, - 160, - 82, - 131, - 133, - 133, - 3, - 131, - 8, - 144, - 80, - 131, - 97, - 3, - 224, - 81, - 130, - 9, - 96, - 192, - 82, - 80, - 80, - 97, - 3, - 32, - 81, - 97, - 3, - 64, - 81, - 144, - 147, - 80, - 96, - 0, - 131, - 130, - 129, - 3, - 134, - 8, - 144, - 80, - 131, - 97, - 3, - 160, - 81, - 130, - 9, - 144, - 80, - 128, - 96, - 224, - 82, - 131, - 133, - 133, - 3, - 131, - 8, - 144, - 80, - 131, - 97, - 3, - 192, - 81, - 130, - 9, - 97, - 1, - 0, - 82, - 80, - 97, - 21, - 34, - 144, - 80, - 130, - 97, - 1, - 32, - 96, - 0, - 132, - 97, - 0, - 196, - 86, - 91, - 144, - 80, - 96, - 0, - 81, - 146, - 80, - 130, - 97, - 4, - 32, - 82, - 97, - 4, - 64, - 97, - 4, - 160, - 91, - 128, - 130, - 16, - 21, - 97, - 21, - 79, - 87, - 131, - 133, - 131, - 81, - 9, - 130, - 82, - 96, - 32, - 130, - 1, - 145, - 80, - 97, - 21, - 53, - 86, - 91, - 80, - 80, - 96, - 32, - 81, - 146, - 80, - 97, - 15, - 160, - 81, - 96, - 0, - 131, - 132, - 97, - 12, - 228, - 53, - 135, - 9, - 130, - 8, - 144, - 80, - 131, - 130, - 130, - 9, - 144, - 80, - 131, - 132, - 97, - 17, - 64, - 81, - 135, - 9, - 130, - 8, - 144, - 80, - 97, - 14, - 36, - 97, - 12, - 228, - 91, - 129, - 129, - 16, - 21, - 97, - 21, - 161, - 87, - 133, - 134, - 131, - 53, - 137, - 9, - 135, - 134, - 134, - 9, - 8, - 146, - 80, - 96, - 32, - 130, - 3, - 145, - 80, - 97, - 21, - 129, - 86, - 91, - 80, - 80, - 131, - 130, - 130, - 9, - 144, - 80, - 131, - 132, - 97, - 12, - 196, - 53, - 135, - 9, - 130, - 8, - 144, - 80, - 131, - 130, - 130, - 9, - 144, - 80, - 131, - 132, - 97, - 20, - 228, - 53, - 135, - 9, - 130, - 8, - 144, - 80, - 131, - 130, - 130, - 9, - 144, - 80, - 131, - 132, - 97, - 20, - 68, - 53, - 135, - 9, - 130, - 8, - 144, - 80, - 131, - 130, - 130, - 9, - 144, - 80, - 131, - 132, - 97, - 19, - 164, - 53, - 135, - 9, - 130, - 8, - 144, - 80, - 131, - 130, - 130, - 9, - 144, - 80, - 131, - 132, - 97, - 19, - 4, - 53, - 135, - 9, - 130, - 8, - 144, - 80, - 131, - 130, - 130, - 9, - 144, - 80, - 131, - 132, - 97, - 18, - 100, - 53, - 135, - 9, - 130, - 8, - 144, - 80, - 131, - 130, - 130, - 9, - 144, - 80, - 131, - 132, - 97, - 17, - 196, - 53, - 135, - 9, - 130, - 8, - 144, - 80, - 131, - 130, - 130, - 9, - 144, - 80, - 131, - 132, - 97, - 17, - 36, - 53, - 135, - 9, - 130, - 8, - 144, - 80, - 131, - 130, - 130, - 9, - 144, - 80, - 131, - 132, - 97, - 16, - 132, - 53, - 135, - 9, - 130, - 8, - 144, - 80, - 97, - 12, - 164, - 97, - 11, - 100, - 91, - 129, - 129, - 16, - 21, - 97, - 22, - 108, - 87, - 133, - 134, - 131, - 53, - 137, - 9, - 135, - 134, - 134, - 9, - 8, - 146, - 80, - 96, - 32, - 130, - 3, - 145, - 80, - 97, - 22, - 76, - 86, - 91, - 80, - 80, - 128, - 97, - 4, - 160, - 82, - 80, - 80, - 97, - 15, - 160, - 81, - 146, - 80, - 96, - 0, - 130, - 131, - 97, - 15, - 164, - 53, - 96, - 64, - 81, - 9, - 130, - 8, - 144, - 80, - 130, - 131, - 97, - 15, - 100, - 53, - 96, - 96, - 81, - 9, - 130, - 8, - 144, - 80, - 130, - 131, - 97, - 15, - 132, - 53, - 96, - 128, - 81, - 9, - 130, - 8, - 144, - 80, - 130, - 132, - 130, - 9, - 144, - 80, - 130, - 131, - 97, - 15, - 68, - 53, - 96, - 64, - 81, - 9, - 130, - 8, - 144, - 80, - 130, - 131, - 97, - 15, - 4, - 53, - 96, - 96, - 81, - 9, - 130, - 8, - 144, - 80, - 130, - 131, - 97, - 15, - 36, - 53, - 96, - 128, - 81, - 9, - 130, - 8, - 144, - 80, - 130, - 132, - 130, - 9, - 144, - 80, - 130, - 131, - 97, - 14, - 228, - 53, - 96, - 64, - 81, - 9, - 130, - 8, - 144, - 80, - 130, - 131, - 97, - 14, - 164, - 53, - 96, - 96, - 81, - 9, - 130, - 8, - 144, - 80, - 130, - 131, - 97, - 14, - 196, - 53, - 96, - 128, - 81, - 9, - 130, - 8, - 144, - 80, - 130, - 132, - 130, - 9, - 144, - 80, - 130, - 131, - 97, - 14, - 132, - 53, - 96, - 64, - 81, - 9, - 130, - 8, - 144, - 80, - 130, - 131, - 97, - 14, - 68, - 53, - 96, - 96, - 81, - 9, - 130, - 8, - 144, - 80, - 130, - 131, - 97, - 14, - 100, - 53, - 96, - 128, - 81, - 9, - 130, - 8, - 144, - 80, - 130, - 97, - 4, - 64, - 81, - 130, - 9, - 144, - 80, - 128, - 97, - 4, - 192, - 82, - 80, - 97, - 15, - 160, - 81, - 146, - 80, - 96, - 0, - 130, - 131, - 97, - 20, - 100, - 53, - 96, - 160, - 81, - 9, - 130, - 8, - 144, - 80, - 130, - 131, - 97, - 20, - 132, - 53, - 96, - 192, - 81, - 9, - 130, - 8, - 144, - 80, - 130, - 132, - 130, - 9, - 144, - 80, - 130, - 131, - 97, - 19, - 196, - 53, - 96, - 160, - 81, - 9, - 130, - 8, - 144, - 80, - 130, - 131, - 97, - 19, - 228, - 53, - 96, - 192, - 81, - 9, - 130, - 8, - 144, - 80, - 130, - 132, - 130, - 9, - 144, - 80, - 130, - 131, - 97, - 19, - 36, - 53, - 96, - 160, - 81, - 9, - 130, - 8, - 144, - 80, - 130, - 131, - 97, - 19, - 68, - 53, - 96, - 192, - 81, - 9, - 130, - 8, - 144, - 80, - 130, - 132, - 130, - 9, - 144, - 80, - 130, - 131, - 97, - 18, - 132, - 53, - 96, - 160, - 81, - 9, - 130, - 8, - 144, - 80, - 130, - 131, - 97, - 18, - 164, - 53, - 96, - 192, - 81, - 9, - 130, - 8, - 144, - 80, - 130, - 132, - 130, - 9, - 144, - 80, - 130, - 131, - 97, - 17, - 228, - 53, - 96, - 160, - 81, - 9, - 130, - 8, - 144, - 80, - 130, - 131, - 97, - 18, - 4, - 53, - 96, - 192, - 81, - 9, - 130, - 8, - 144, - 80, - 130, - 132, - 130, - 9, - 144, - 80, - 130, - 131, - 97, - 17, - 68, - 53, - 96, - 160, - 81, - 9, - 130, - 8, - 144, - 80, - 130, - 131, - 97, - 17, - 100, - 53, - 96, - 192, - 81, - 9, - 130, - 8, - 144, - 80, - 130, - 132, - 130, - 9, - 144, - 80, - 130, - 131, - 97, - 16, - 164, - 53, - 96, - 160, - 81, - 9, - 130, - 8, - 144, - 80, - 130, - 131, - 97, - 16, - 196, - 53, - 96, - 192, - 81, - 9, - 130, - 8, - 144, - 80, - 130, - 132, - 130, - 9, - 144, - 80, - 130, - 131, - 97, - 16, - 4, - 53, - 96, - 160, - 81, - 9, - 130, - 8, - 144, - 80, - 130, - 131, - 97, - 16, - 36, - 53, - 96, - 192, - 81, - 9, - 130, - 8, - 144, - 80, - 130, - 132, - 130, - 9, - 144, - 80, - 130, - 131, - 97, - 15, - 196, - 53, - 96, - 160, - 81, - 9, - 130, - 8, - 144, - 80, - 130, - 131, - 97, - 15, - 228, - 53, - 96, - 192, - 81, - 9, - 130, - 8, - 144, - 80, - 130, - 97, - 4, - 96, - 81, - 130, - 9, - 144, - 80, - 128, - 97, - 4, - 224, - 82, - 80, - 97, - 15, - 160, - 81, - 146, - 80, - 96, - 0, - 130, - 131, - 97, - 20, - 196, - 53, - 96, - 224, - 81, - 9, - 130, - 8, - 144, - 80, - 130, - 131, - 97, - 20, - 164, - 53, - 97, - 1, - 0, - 81, - 9, - 130, - 8, - 144, - 80, - 130, - 132, - 130, - 9, - 144, - 80, - 130, - 131, - 97, - 20, - 36, - 53, - 96, - 224, - 81, - 9, - 130, - 8, - 144, - 80, - 130, - 131, - 97, - 20, - 4, - 53, - 97, - 1, - 0, - 81, - 9, - 130, - 8, - 144, - 80, - 130, - 132, - 130, - 9, - 144, - 80, - 130, - 131, - 97, - 19, - 132, - 53, - 96, - 224, - 81, - 9, - 130, - 8, - 144, - 80, - 130, - 131, - 97, - 19, - 100, - 53, - 97, - 1, - 0, - 81, - 9, - 130, - 8, - 144, - 80, - 130, - 132, - 130, - 9, - 144, - 80, - 130, - 131, - 97, - 18, - 228, - 53, - 96, - 224, - 81, - 9, - 130, - 8, - 144, - 80, - 130, - 131, - 97, - 18, - 196, - 53, - 97, - 1, - 0, - 81, - 9, - 130, - 8, - 144, - 80, - 130, - 132, - 130, - 9, - 144, - 80, - 130, - 131, - 97, - 18, - 68, - 53, - 96, - 224, - 81, - 9, - 130, - 8, - 144, - 80, - 130, - 131, - 97, - 18, - 36, - 53, - 97, - 1, - 0, - 81, - 9, - 130, - 8, - 144, - 80, - 130, - 132, - 130, - 9, - 144, - 80, - 130, - 131, - 97, - 17, - 164, - 53, - 96, - 224, - 81, - 9, - 130, - 8, - 144, - 80, - 130, - 131, - 97, - 17, - 132, - 53, - 97, - 1, - 0, - 81, - 9, - 130, - 8, - 144, - 80, - 130, - 132, - 130, - 9, - 144, - 80, - 130, - 131, - 97, - 17, - 4, - 53, - 96, - 224, - 81, - 9, - 130, - 8, - 144, - 80, - 130, - 131, - 97, - 16, - 228, - 53, - 97, - 1, - 0, - 81, - 9, - 130, - 8, - 144, - 80, - 130, - 132, - 130, - 9, - 144, - 80, - 130, - 131, - 97, - 16, - 100, - 53, - 96, - 224, - 81, - 9, - 130, - 8, - 144, - 80, - 130, - 131, - 97, - 16, - 68, - 53, - 97, - 1, - 0, - 81, - 9, - 130, - 8, - 144, - 80, - 130, - 97, - 4, - 128, - 81, - 130, - 9, - 97, - 5, - 0, - 82, - 80, - 96, - 32, - 81, - 97, - 5, - 32, - 82, - 96, - 64, - 81, - 96, - 96, - 81, - 144, - 147, - 80, - 130, - 144, - 132, - 8, - 146, - 80, - 129, - 96, - 128, - 81, - 132, - 8, - 97, - 5, - 64, - 82, - 96, - 160, - 81, - 96, - 192, - 81, - 144, - 147, - 80, - 130, - 144, - 132, - 8, - 97, - 5, - 96, - 82, - 96, - 224, - 81, - 97, - 1, - 0, - 81, - 144, - 147, - 80, - 130, - 144, - 132, - 8, - 97, - 5, - 128, - 82, - 96, - 0, - 146, - 80, - 96, - 128, - 97, - 5, - 32, - 91, - 129, - 133, - 16, - 21, - 97, - 26, - 20, - 87, - 128, - 81, - 133, - 82, - 96, - 32, - 148, - 133, - 1, - 148, - 1, - 97, - 25, - 252, - 86, - 91, - 80, - 80, - 97, - 26, - 36, - 130, - 96, - 128, - 96, - 0, - 132, - 97, - 0, - 196, - 86, - 91, - 144, - 80, - 129, - 97, - 5, - 0, - 81, - 96, - 96, - 81, - 9, - 146, - 80, - 96, - 64, - 96, - 128, - 97, - 4, - 224, - 91, - 129, - 131, - 16, - 21, - 97, - 26, - 98, - 87, - 132, - 97, - 15, - 192, - 81, - 135, - 9, - 149, - 80, - 132, - 133, - 130, - 81, - 133, - 81, - 9, - 135, - 8, - 149, - 80, - 96, - 31, - 25, - 146, - 131, - 1, - 146, - 1, - 97, - 26, - 57, - 86, - 91, - 80, - 80, - 80, - 130, - 97, - 17, - 160, - 82, - 97, - 15, - 192, - 81, - 146, - 80, - 97, - 10, - 132, - 53, - 96, - 0, - 82, - 97, - 10, - 164, - 53, - 96, - 32, - 82, - 97, - 26, - 139, - 97, - 15, - 160, - 81, - 130, - 97, - 1, - 162, - 86, - 91, - 144, - 80, - 97, - 26, - 158, - 97, - 17, - 128, - 81, - 97, - 17, - 96, - 81, - 131, - 97, - 1, - 130, - 86, - 91, - 144, - 80, - 97, - 14, - 192, - 97, - 12, - 0, - 91, - 129, - 129, - 16, - 21, - 97, - 26, - 219, - 87, - 97, - 26, - 188, - 97, - 15, - 160, - 81, - 132, - 97, - 1, - 162, - 86, - 91, - 146, - 80, - 97, - 26, - 206, - 96, - 32, - 131, - 1, - 81, - 131, - 81, - 133, - 97, - 1, - 130, - 86, - 91, - 146, - 80, - 96, - 64, - 130, - 3, - 145, - 80, - 97, - 26, - 167, - 86, - 91, - 80, - 80, - 97, - 26, - 234, - 97, - 15, - 160, - 81, - 130, - 97, - 1, - 162, - 86, - 91, - 144, - 80, - 97, - 26, - 253, - 97, - 7, - 36, - 53, - 97, - 7, - 4, - 53, - 131, - 97, - 1, - 130, - 86, - 91, - 144, - 80, - 97, - 27, - 12, - 97, - 15, - 160, - 81, - 130, - 97, - 1, - 162, - 86, - 91, - 144, - 80, - 97, - 27, - 31, - 97, - 6, - 164, - 53, - 97, - 6, - 132, - 53, - 131, - 97, - 1, - 130, - 86, - 91, - 144, - 80, - 97, - 27, - 46, - 97, - 15, - 160, - 81, - 130, - 97, - 1, - 162, - 86, - 91, - 144, - 80, - 97, - 27, - 65, - 97, - 6, - 36, - 53, - 97, - 6, - 4, - 53, - 131, - 97, - 1, - 130, - 86, - 91, - 144, - 80, - 97, - 27, - 80, - 97, - 15, - 160, - 81, - 130, - 97, - 1, - 162, - 86, - 91, - 144, - 80, - 97, - 27, - 99, - 97, - 5, - 164, - 53, - 97, - 5, - 132, - 53, - 131, - 97, - 1, - 130, - 86, - 91, - 144, - 80, - 97, - 27, - 114, - 97, - 15, - 160, - 81, - 130, - 97, - 1, - 162, - 86, - 91, - 144, - 80, - 97, - 27, - 133, - 97, - 5, - 36, - 53, - 97, - 5, - 4, - 53, - 131, - 97, - 1, - 130, - 86, - 91, - 144, - 80, - 97, - 27, - 148, - 97, - 15, - 160, - 81, - 130, - 97, - 1, - 162, - 86, - 91, - 144, - 80, - 97, - 27, - 167, - 97, - 4, - 164, - 53, - 97, - 4, - 132, - 53, - 131, - 97, - 1, - 130, - 86, - 91, - 144, - 80, - 97, - 27, - 182, - 97, - 15, - 160, - 81, - 130, - 97, - 1, - 162, - 86, - 91, - 144, - 80, - 97, - 27, - 201, - 97, - 4, - 36, - 53, - 97, - 4, - 4, - 53, - 131, - 97, - 1, - 130, - 86, - 91, - 144, - 80, - 97, - 27, - 216, - 97, - 15, - 160, - 81, - 130, - 97, - 1, - 162, - 86, - 91, - 144, - 80, - 97, - 27, - 235, - 97, - 3, - 164, - 53, - 97, - 3, - 132, - 53, - 131, - 97, - 1, - 130, - 86, - 91, - 144, - 80, - 97, - 27, - 250, - 97, - 15, - 160, - 81, - 130, - 97, - 1, - 162, - 86, - 91, - 144, - 80, - 97, - 28, - 13, - 97, - 1, - 36, - 53, - 97, - 1, - 4, - 53, - 131, - 97, - 1, - 130, - 86, - 91, - 144, - 80, - 97, - 3, - 4, - 97, - 2, - 4, - 91, - 129, - 129, - 16, - 21, - 97, - 28, - 74, - 87, - 97, - 28, - 43, - 97, - 15, - 160, - 81, - 132, - 97, - 1, - 162, - 86, - 91, - 146, - 80, - 97, - 28, - 61, - 96, - 32, - 131, - 1, - 53, - 131, - 53, - 133, - 97, - 1, - 130, - 86, - 91, - 146, - 80, - 96, - 64, - 130, - 3, - 145, - 80, - 97, - 28, - 22, - 86, - 91, - 80, - 80, - 97, - 28, - 89, - 97, - 15, - 160, - 81, - 130, - 97, - 1, - 162, - 86, - 91, - 144, - 80, - 97, - 28, - 106, - 96, - 228, - 53, - 96, - 196, - 53, - 131, - 97, - 1, - 130, - 86, - 91, - 144, - 80, - 97, - 2, - 4, - 97, - 1, - 4, - 91, - 129, - 129, - 16, - 21, - 97, - 28, - 167, - 87, - 97, - 28, - 136, - 97, - 15, - 160, - 81, - 132, - 97, - 1, - 162, - 86, - 91, - 146, - 80, - 97, - 28, - 154, - 96, - 32, - 131, - 1, - 53, - 131, - 53, - 133, - 97, - 1, - 130, - 86, - 91, - 146, - 80, - 96, - 64, - 130, - 3, - 145, - 80, - 97, - 28, - 115, - 86, - 91, - 80, - 80, - 97, - 8, - 4, - 53, - 96, - 128, - 82, - 97, - 8, - 36, - 53, - 96, - 160, - 82, - 97, - 7, - 196, - 97, - 7, - 4, - 91, - 129, - 129, - 16, - 21, - 97, - 28, - 242, - 87, - 97, - 28, - 211, - 97, - 15, - 160, - 81, - 132, - 97, - 1, - 220, - 86, - 91, - 146, - 80, - 97, - 28, - 229, - 96, - 32, - 131, - 1, - 53, - 131, - 53, - 133, - 97, - 1, - 189, - 86, - 91, - 146, - 80, - 96, - 64, - 130, - 3, - 145, - 80, - 97, - 28, - 190, - 86, - 91, - 80, - 80, - 97, - 29, - 4, - 130, - 97, - 4, - 64, - 81, - 133, - 9, - 130, - 97, - 1, - 220, - 86, - 91, - 144, - 80, - 97, - 29, - 21, - 96, - 160, - 81, - 96, - 128, - 81, - 131, - 97, - 1, - 130, - 86, - 91, - 144, - 80, - 129, - 97, - 15, - 192, - 81, - 132, - 9, - 146, - 80, - 97, - 10, - 68, - 53, - 96, - 128, - 82, - 97, - 10, - 100, - 53, - 96, - 160, - 82, - 97, - 10, - 4, - 97, - 8, - 4, - 91, - 129, - 129, - 16, - 21, - 97, - 29, - 105, - 87, - 97, - 29, - 74, - 97, - 15, - 160, - 81, - 132, - 97, - 1, - 220, - 86, - 91, - 146, - 80, - 97, - 29, - 92, - 96, - 32, - 131, - 1, - 53, - 131, - 53, - 133, - 97, - 1, - 189, - 86, - 91, - 146, - 80, - 96, - 64, - 130, - 3, - 145, - 80, - 97, - 29, - 53, - 86, - 91, - 80, - 80, - 97, - 29, - 123, - 130, - 97, - 4, - 96, - 81, - 133, - 9, - 130, - 97, - 1, - 220, - 86, - 91, - 144, - 80, - 97, - 29, - 140, - 96, - 160, - 81, - 96, - 128, - 81, - 131, - 97, - 1, - 130, - 86, - 91, - 144, - 80, - 129, - 97, - 15, - 192, - 81, - 132, - 9, - 146, - 80, - 97, - 6, - 196, - 53, - 96, - 128, - 82, - 97, - 6, - 228, - 53, - 96, - 160, - 82, - 97, - 29, - 178, - 97, - 15, - 160, - 81, - 130, - 97, - 1, - 220, - 86, - 91, - 144, - 80, - 97, - 29, - 197, - 97, - 6, - 100, - 53, - 97, - 6, - 68, - 53, - 131, - 97, - 1, - 189, - 86, - 91, - 144, - 80, - 97, - 29, - 212, - 97, - 15, - 160, - 81, - 130, - 97, - 1, - 220, - 86, - 91, - 144, - 80, - 97, - 29, - 231, - 97, - 5, - 228, - 53, - 97, - 5, - 196, - 53, - 131, - 97, - 1, - 189, - 86, - 91, - 144, - 80, - 97, - 29, - 246, - 97, - 15, - 160, - 81, - 130, - 97, - 1, - 220, - 86, - 91, - 144, - 80, - 97, - 30, - 9, - 97, - 5, - 100, - 53, - 97, - 5, - 68, - 53, - 131, - 97, - 1, - 189, - 86, - 91, - 144, - 80, - 97, - 30, - 24, - 97, - 15, - 160, - 81, - 130, - 97, - 1, - 220, - 86, - 91, - 144, - 80, - 97, - 30, - 43, - 97, - 4, - 228, - 53, - 97, - 4, - 196, - 53, - 131, - 97, - 1, - 189, - 86, - 91, - 144, - 80, - 97, - 30, - 58, - 97, - 15, - 160, - 81, - 130, - 97, - 1, - 220, - 86, - 91, - 144, - 80, - 97, - 30, - 77, - 97, - 4, - 100, - 53, - 97, - 4, - 68, - 53, - 131, - 97, - 1, - 189, - 86, - 91, - 144, - 80, - 97, - 30, - 92, - 97, - 15, - 160, - 81, - 130, - 97, - 1, - 220, - 86, - 91, - 144, - 80, - 97, - 30, - 111, - 97, - 3, - 228, - 53, - 97, - 3, - 196, - 53, - 131, - 97, - 1, - 189, - 86, - 91, - 144, - 80, - 97, - 30, - 126, - 97, - 15, - 160, - 81, - 130, - 97, - 1, - 220, - 86, - 91, - 144, - 80, - 97, - 30, - 145, - 97, - 3, - 100, - 53, - 97, - 3, - 68, - 53, - 131, - 97, - 1, - 189, - 86, - 91, - 144, - 80, - 97, - 30, - 163, - 130, - 97, - 4, - 128, - 81, - 133, - 9, - 130, - 97, - 1, - 220, - 86, - 91, - 144, - 80, - 97, - 30, - 180, - 96, - 160, - 81, - 96, - 128, - 81, - 131, - 97, - 1, - 130, - 86, - 91, - 144, - 80, - 97, - 11, - 0, - 81, - 96, - 128, - 82, - 97, - 11, - 32, - 81, - 96, - 160, - 82, - 97, - 30, - 211, - 97, - 17, - 160, - 81, - 131, - 3, - 130, - 97, - 1, - 220, - 86, - 91, - 144, - 80, - 97, - 30, - 228, - 96, - 160, - 81, - 96, - 128, - 81, - 131, - 97, - 1, - 130, - 86, - 91, - 144, - 80, - 97, - 21, - 4, - 53, - 96, - 128, - 82, - 97, - 21, - 36, - 53, - 96, - 160, - 82, - 97, - 31, - 3, - 97, - 4, - 0, - 81, - 131, - 3, - 130, - 97, - 1, - 220, - 86, - 91, - 144, - 80, - 97, - 31, - 20, - 96, - 160, - 81, - 96, - 128, - 81, - 131, - 97, - 1, - 130, - 86, - 91, - 144, - 80, - 97, - 21, - 68, - 53, - 96, - 128, - 82, - 97, - 21, - 100, - 53, - 96, - 160, - 82, - 97, - 31, - 49, - 97, - 15, - 224, - 81, - 130, - 97, - 1, - 220, - 86, - 91, - 144, - 80, - 97, - 31, - 66, - 96, - 160, - 81, - 96, - 128, - 81, - 131, - 97, - 1, - 130, - 86, - 91, - 144, - 80, - 96, - 0, - 81, - 97, - 17, - 192, - 82, - 96, - 32, - 81, - 97, - 17, - 224, - 82, - 97, - 21, - 68, - 53, - 97, - 18, - 0, - 82, - 97, - 21, - 100, - 53, - 97, - 18, - 32, - 82, - 97, - 10, - 128, - 81, - 21, - 97, - 32, - 22, - 87, - 97, - 16, - 0, - 81, - 96, - 0, - 82, - 97, - 16, - 32, - 81, - 96, - 32, - 82, - 97, - 16, - 64, - 81, - 96, - 64, - 82, - 97, - 16, - 96, - 81, - 96, - 96, - 82, - 97, - 17, - 192, - 81, - 96, - 128, - 82, - 97, - 17, - 224, - 81, - 96, - 160, - 82, - 97, - 18, - 0, - 81, - 96, - 192, - 82, - 97, - 18, - 32, - 81, - 96, - 224, - 82, - 129, - 97, - 1, - 0, - 96, - 0, - 32, - 6, - 146, - 80, - 97, - 31, - 183, - 131, - 130, - 97, - 1, - 162, - 86, - 91, - 144, - 80, - 97, - 31, - 202, - 97, - 17, - 224, - 81, - 97, - 17, - 192, - 81, - 131, - 97, - 1, - 130, - 86, - 91, - 144, - 80, - 96, - 0, - 81, - 97, - 17, - 192, - 82, - 96, - 32, - 81, - 97, - 17, - 224, - 82, - 97, - 16, - 64, - 81, - 96, - 0, - 82, - 97, - 16, - 96, - 81, - 96, - 32, - 82, - 97, - 31, - 242, - 131, - 130, - 97, - 1, - 162, - 86, - 91, - 144, - 80, - 97, - 32, - 5, - 97, - 18, - 32, - 81, - 97, - 18, - 0, - 81, - 131, - 97, - 1, - 130, - 86, - 91, - 144, - 80, - 96, - 0, - 81, - 97, - 18, - 0, - 82, - 96, - 32, - 81, - 97, - 18, - 32, - 82, - 91, - 97, - 32, - 47, - 97, - 18, - 32, - 81, - 97, - 18, - 0, - 81, - 97, - 17, - 224, - 81, - 97, - 17, - 192, - 81, - 133, - 97, - 1, - 247, - 86, - 91, - 144, - 80, - 128, - 97, - 32, - 59, - 87, - 96, - 0, - 128, - 253, - 91, - 80, - 80, - 80, - 96, - 1, - 96, - 0, - 82, - 96, - 32, - 96, - 0, - 243, - 91, - 96, - 0, - 128, - 131, - 96, - 31, - 132, - 1, - 18, - 97, - 32, - 91, - 87, - 96, - 0, - 128, - 253, - 91, - 80, - 129, - 53, - 103, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 129, - 17, - 21, - 97, - 32, - 115, - 87, - 96, - 0, - 128, - 253, - 91, - 96, - 32, - 131, - 1, - 145, - 80, - 131, - 96, - 32, - 130, - 96, - 5, - 27, - 133, - 1, - 1, - 17, - 21, - 97, - 32, - 142, - 87, - 96, - 0, - 128, - 253, - 91, - 146, - 80, - 146, - 144, - 80, - 86, - 91, - 96, - 0, - 128, - 96, - 0, - 128, - 96, - 0, - 96, - 96, - 134, - 136, - 3, - 18, - 21, - 97, - 32, - 173, - 87, - 96, - 0, - 128, - 253, - 91, - 133, - 53, - 96, - 1, - 96, - 1, - 96, - 160, - 27, - 3, - 129, - 22, - 129, - 20, - 97, - 32, - 196, - 87, - 96, - 0, - 128, - 253, - 91, - 148, - 80, - 96, - 32, - 134, - 1, - 53, - 103, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 128, - 130, - 17, - 21, - 97, - 32, - 225, - 87, - 96, - 0, - 128, - 253, - 91, - 129, - 136, - 1, - 145, - 80, - 136, - 96, - 31, - 131, - 1, - 18, - 97, - 32, - 245, - 87, - 96, - 0, - 128, - 253, - 91, - 129, - 53, - 129, - 129, - 17, - 21, - 97, - 33, - 4, - 87, - 96, - 0, - 128, - 253, - 91, - 137, - 96, - 32, - 130, - 133, - 1, - 1, - 17, - 21, - 97, - 33, - 22, - 87, - 96, - 0, - 128, - 253, - 91, - 96, - 32, - 131, - 1, - 150, - 80, - 128, - 149, - 80, - 80, - 96, - 64, - 136, - 1, - 53, - 145, - 80, - 128, - 130, - 17, - 21, - 97, - 33, - 52, - 87, - 96, - 0, - 128, - 253, - 91, - 80, - 97, - 33, - 65, - 136, - 130, - 137, - 1, - 97, - 32, - 73, - 86, - 91, - 150, - 153, - 149, - 152, - 80, - 147, - 150, - 80, - 146, - 148, - 147, - 146, - 80, - 80, - 80, - 86, - 254, - 162, - 100, - 105, - 112, - 102, - 115, - 88, - 34, - 18, - 32, - 105, - 128, - 67, - 95, - 149, - 145, - 57, - 3, - 120, - 226, - 85, - 244, - 2, - 110, - 235, - 66, - 197, - 104, - 20, - 17, - 79, - 158, - 75, - 15, - 168, - 250, - 111, - 156, - 91, - 173, - 236, - 91, - 100, - 115, - 111, - 108, - 99, - 67, - 0, - 8, - 18, - 0, - 51, - ]; - ///The bytecode of the contract. - pub static VERIFIER_BYTECODE: ::ethers::core::types::Bytes = ::ethers::core::types::Bytes::from_static( - __BYTECODE, - ); - #[rustfmt::skip] - const __DEPLOYED_BYTECODE: &[u8] = &[ - 96, - 128, - 96, - 64, - 82, - 52, - 128, - 21, - 97, - 0, - 16, - 87, - 96, - 0, - 128, - 253, - 91, - 80, - 96, - 4, - 54, - 16, - 97, - 0, - 43, - 87, - 96, - 0, - 53, - 96, - 224, - 28, - 128, - 99, - 175, - 131, - 161, - 141, - 20, - 97, - 0, - 48, - 87, - 91, - 96, - 0, - 128, - 253, - 91, - 97, - 0, - 67, - 97, - 0, - 62, - 54, - 96, - 4, - 97, - 32, - 149, - 86, - 91, - 97, - 0, - 87, - 86, - 91, - 96, - 64, - 81, - 144, - 21, - 21, - 129, - 82, - 96, - 32, - 1, - 96, - 64, - 81, - 128, - 145, - 3, - 144, - 243, - 91, - 96, - 0, - 97, - 2, - 99, - 86, - 91, - 96, - 0, - 128, - 96, - 0, - 132, - 53, - 96, - 32, - 134, - 1, - 53, - 136, - 130, - 16, - 134, - 22, - 148, - 80, - 136, - 129, - 16, - 133, - 22, - 148, - 80, - 136, - 96, - 3, - 138, - 139, - 133, - 134, - 9, - 133, - 9, - 8, - 137, - 130, - 131, - 9, - 146, - 137, - 82, - 96, - 32, - 137, - 1, - 145, - 144, - 145, - 82, - 20, - 146, - 144, - 146, - 22, - 150, - 96, - 64, - 148, - 133, - 1, - 150, - 80, - 147, - 144, - 148, - 1, - 147, - 80, - 80, - 80, - 86, - 91, - 96, - 1, - 96, - 32, - 83, - 96, - 33, - 96, - 0, - 144, - 129, - 32, - 146, - 131, - 6, - 130, - 82, - 145, - 144, - 145, - 82, - 96, - 32, - 1, - 144, - 86, - 91, - 96, - 0, - 131, - 131, - 81, - 96, - 32, - 133, - 1, - 91, - 96, - 32, - 135, - 3, - 129, - 16, - 21, - 97, - 0, - 240, - 87, - 135, - 129, - 81, - 131, - 9, - 128, - 132, - 82, - 96, - 32, - 147, - 132, - 1, - 147, - 144, - 146, - 80, - 1, - 97, - 0, - 206, - 86, - 91, - 135, - 129, - 81, - 131, - 9, - 145, - 80, - 96, - 32, - 131, - 82, - 96, - 32, - 128, - 132, - 1, - 82, - 96, - 32, - 96, - 64, - 132, - 1, - 82, - 129, - 96, - 96, - 132, - 1, - 82, - 96, - 2, - 136, - 3, - 96, - 128, - 132, - 1, - 82, - 135, - 96, - 160, - 132, - 1, - 82, - 96, - 32, - 131, - 96, - 192, - 133, - 96, - 5, - 90, - 250, - 133, - 22, - 147, - 80, - 130, - 81, - 145, - 80, - 133, - 96, - 32, - 129, - 1, - 96, - 32, - 133, - 3, - 148, - 80, - 91, - 130, - 129, - 16, - 21, - 97, - 1, - 99, - 87, - 137, - 133, - 81, - 133, - 9, - 138, - 132, - 81, - 134, - 9, - 144, - 132, - 82, - 96, - 31, - 25, - 149, - 134, - 1, - 149, - 144, - 148, - 80, - 144, - 146, - 1, - 145, - 97, - 1, - 59, - 86, - 91, - 137, - 129, - 81, - 133, - 9, - 148, - 80, - 137, - 130, - 81, - 133, - 9, - 148, - 144, - 145, - 82, - 146, - 144, - 146, - 82, - 80, - 144, - 149, - 148, - 80, - 80, - 80, - 80, - 80, - 86, - 91, - 129, - 96, - 64, - 82, - 130, - 96, - 96, - 82, - 96, - 0, - 96, - 64, - 96, - 0, - 96, - 128, - 96, - 0, - 96, - 6, - 90, - 250, - 144, - 145, - 22, - 147, - 146, - 80, - 80, - 80, - 86, - 91, - 129, - 96, - 64, - 82, - 96, - 0, - 96, - 64, - 96, - 0, - 96, - 96, - 96, - 0, - 96, - 7, - 90, - 250, - 144, - 145, - 22, - 146, - 145, - 80, - 80, - 86, - 91, - 129, - 96, - 192, - 82, - 130, - 96, - 224, - 82, - 96, - 0, - 96, - 64, - 96, - 128, - 128, - 96, - 128, - 96, - 6, - 90, - 250, - 144, - 145, - 22, - 147, - 146, - 80, - 80, - 80, - 86, - 91, - 129, - 96, - 192, - 82, - 96, - 0, - 96, - 64, - 96, - 128, - 96, - 96, - 96, - 128, - 96, - 7, - 90, - 250, - 144, - 145, - 22, - 146, - 145, - 80, - 80, - 86, - 91, - 129, - 96, - 0, - 82, - 130, - 96, - 32, - 82, - 97, - 11, - 64, - 81, - 96, - 64, - 82, - 97, - 11, - 96, - 81, - 96, - 96, - 82, - 97, - 11, - 128, - 81, - 96, - 128, - 82, - 97, - 11, - 160, - 81, - 96, - 160, - 82, - 131, - 96, - 192, - 82, - 132, - 96, - 224, - 82, - 97, - 11, - 192, - 81, - 97, - 1, - 0, - 82, - 97, - 11, - 224, - 81, - 97, - 1, - 32, - 82, - 97, - 12, - 0, - 81, - 97, - 1, - 64, - 82, - 97, - 12, - 32, - 81, - 97, - 1, - 96, - 82, - 96, - 0, - 96, - 32, - 96, - 0, - 97, - 1, - 128, - 96, - 0, - 96, - 8, - 90, - 250, - 96, - 0, - 81, - 146, - 22, - 144, - 145, - 22, - 149, - 148, - 80, - 80, - 80, - 80, - 80, - 86, - 91, - 127, - 48, - 100, - 78, - 114, - 225, - 49, - 160, - 41, - 184, - 80, - 69, - 182, - 129, - 129, - 88, - 93, - 151, - 129, - 106, - 145, - 104, - 113, - 202, - 141, - 60, - 32, - 140, - 22, - 216, - 124, - 253, - 71, - 127, - 48, - 100, - 78, - 114, - 225, - 49, - 160, - 41, - 184, - 80, - 69, - 182, - 129, - 129, - 88, - 93, - 40, - 51, - 232, - 72, - 121, - 185, - 112, - 145, - 67, - 225, - 245, - 147, - 240, - 0, - 0, - 1, - 96, - 1, - 97, - 5, - 96, - 96, - 0, - 97, - 9, - 160, - 139, - 60, - 96, - 100, - 53, - 97, - 21, - 0, - 20, - 129, - 22, - 144, - 80, - 97, - 10, - 96, - 81, - 97, - 21, - 132, - 53, - 129, - 20, - 130, - 22, - 145, - 80, - 97, - 9, - 160, - 81, - 96, - 0, - 82, - 96, - 32, - 97, - 21, - 164, - 130, - 96, - 32, - 2, - 129, - 1, - 91, - 128, - 130, - 16, - 21, - 97, - 3, - 0, - 87, - 129, - 53, - 128, - 132, - 82, - 134, - 17, - 148, - 144, - 148, - 22, - 147, - 96, - 32, - 146, - 131, - 1, - 146, - 144, - 145, - 1, - 144, - 97, - 2, - 221, - 86, - 91, - 80, - 96, - 132, - 146, - 80, - 97, - 15, - 0, - 144, - 80, - 97, - 3, - 68, - 91, - 128, - 132, - 16, - 21, - 97, - 3, - 45, - 87, - 97, - 3, - 34, - 135, - 132, - 134, - 136, - 97, - 0, - 94, - 86, - 91, - 148, - 80, - 148, - 80, - 148, - 80, - 97, - 3, - 14, - 86, - 91, - 80, - 96, - 0, - 145, - 130, - 32, - 133, - 129, - 6, - 130, - 82, - 144, - 145, - 82, - 96, - 32, - 144, - 129, - 1, - 97, - 4, - 0, - 131, - 1, - 91, - 128, - 132, - 16, - 21, - 97, - 3, - 101, - 87, - 97, - 3, - 90, - 135, - 132, - 134, - 136, - 97, - 0, - 94, - 86, - 91, - 148, - 80, - 148, - 80, - 148, - 80, - 97, - 3, - 70, - 86, - 91, - 80, - 96, - 0, - 145, - 130, - 32, - 133, - 129, - 6, - 130, - 82, - 144, - 145, - 82, - 96, - 32, - 144, - 129, - 1, - 97, - 3, - 130, - 133, - 130, - 97, - 0, - 169, - 86, - 91, - 144, - 80, - 97, - 3, - 128, - 131, - 1, - 91, - 128, - 132, - 16, - 21, - 97, - 3, - 169, - 87, - 97, - 3, - 158, - 135, - 132, - 134, - 136, - 97, - 0, - 94, - 86, - 91, - 148, - 80, - 148, - 80, - 148, - 80, - 97, - 3, - 138, - 86, - 91, - 80, - 96, - 0, - 145, - 130, - 32, - 133, - 129, - 6, - 130, - 82, - 144, - 145, - 82, - 96, - 32, - 144, - 129, - 1, - 96, - 192, - 131, - 1, - 91, - 128, - 132, - 16, - 21, - 97, - 3, - 224, - 87, - 97, - 3, - 213, - 135, - 132, - 134, - 136, - 97, - 0, - 94, - 86, - 91, - 148, - 80, - 148, - 80, - 148, - 80, - 97, - 3, - 193, - 86, - 91, - 80, - 96, - 0, - 145, - 130, - 32, - 133, - 129, - 6, - 130, - 82, - 144, - 145, - 82, - 96, - 32, - 144, - 129, - 1, - 97, - 9, - 128, - 131, - 1, - 91, - 128, - 132, - 16, - 21, - 97, - 4, - 28, - 87, - 131, - 53, - 128, - 132, - 82, - 134, - 17, - 148, - 144, - 148, - 22, - 147, - 96, - 32, - 147, - 132, - 1, - 147, - 144, - 146, - 1, - 145, - 97, - 3, - 249, - 86, - 91, - 80, - 96, - 0, - 145, - 130, - 32, - 133, - 129, - 6, - 130, - 82, - 144, - 145, - 82, - 96, - 32, - 144, - 129, - 1, - 97, - 4, - 57, - 133, - 130, - 97, - 0, - 169, - 86, - 91, - 144, - 80, - 97, - 4, - 71, - 134, - 131, - 133, - 135, - 97, - 0, - 94, - 86, - 91, - 96, - 0, - 144, - 129, - 32, - 136, - 129, - 6, - 144, - 148, - 82, - 146, - 144, - 146, - 82, - 147, - 80, - 145, - 80, - 96, - 32, - 144, - 80, - 97, - 4, - 106, - 133, - 130, - 132, - 134, - 97, - 0, - 94, - 86, - 91, - 146, - 80, - 146, - 80, - 146, - 80, - 80, - 80, - 97, - 10, - 128, - 81, - 21, - 97, - 5, - 55, - 87, - 97, - 10, - 192, - 81, - 97, - 10, - 224, - 81, - 96, - 32, - 97, - 10, - 160, - 81, - 2, - 97, - 21, - 164, - 1, - 96, - 32, - 131, - 2, - 96, - 2, - 129, - 2, - 96, - 3, - 130, - 2, - 131, - 53, - 131, - 133, - 1, - 53, - 131, - 134, - 1, - 53, - 131, - 135, - 1, - 53, - 137, - 96, - 32, - 2, - 136, - 1, - 137, - 91, - 129, - 138, - 16, - 21, - 97, - 4, - 238, - 87, - 96, - 32, - 138, - 1, - 153, - 80, - 137, - 53, - 129, - 27, - 134, - 1, - 149, - 80, - 136, - 138, - 1, - 53, - 129, - 27, - 133, - 1, - 148, - 80, - 135, - 138, - 1, - 53, - 129, - 27, - 132, - 1, - 147, - 80, - 134, - 138, - 1, - 53, - 129, - 27, - 131, - 1, - 146, - 80, - 138, - 129, - 1, - 144, - 80, - 97, - 4, - 176, - 86, - 91, - 80, - 80, - 140, - 96, - 3, - 142, - 143, - 135, - 136, - 9, - 135, - 9, - 8, - 141, - 132, - 133, - 9, - 20, - 139, - 22, - 154, - 80, - 140, - 96, - 3, - 142, - 143, - 133, - 134, - 9, - 133, - 9, - 8, - 141, - 130, - 131, - 9, - 20, - 139, - 22, - 154, - 80, - 131, - 97, - 16, - 0, - 82, - 130, - 97, - 16, - 32, - 82, - 129, - 97, - 16, - 64, - 82, - 128, - 97, - 16, - 96, - 82, - 80, - 80, - 80, - 80, - 80, - 80, - 80, - 80, - 80, - 80, - 91, - 128, - 97, - 5, - 65, - 87, - 96, - 0, - 128, - 253, - 91, - 97, - 9, - 192, - 81, - 146, - 80, - 97, - 15, - 128, - 81, - 128, - 96, - 0, - 91, - 133, - 129, - 16, - 21, - 97, - 5, - 101, - 87, - 132, - 130, - 131, - 9, - 145, - 80, - 96, - 1, - 1, - 97, - 5, - 79, - 86, - 91, - 80, - 97, - 10, - 0, - 81, - 148, - 80, - 97, - 16, - 128, - 96, - 6, - 97, - 10, - 96, - 81, - 1, - 96, - 32, - 2, - 129, - 1, - 97, - 10, - 96, - 81, - 97, - 5, - 135, - 87, - 96, - 32, - 1, - 91, - 97, - 10, - 64, - 81, - 91, - 129, - 131, - 16, - 21, - 97, - 5, - 173, - 87, - 134, - 129, - 136, - 3, - 134, - 8, - 131, - 82, - 134, - 136, - 130, - 9, - 144, - 80, - 96, - 32, - 131, - 1, - 146, - 80, - 97, - 5, - 140, - 86, - 91, - 80, - 133, - 96, - 1, - 135, - 3, - 132, - 8, - 147, - 80, - 131, - 129, - 82, - 97, - 5, - 203, - 134, - 96, - 32, - 131, - 1, - 97, - 16, - 128, - 136, - 97, - 0, - 196, - 86, - 91, - 148, - 80, - 97, - 16, - 128, - 145, - 80, - 133, - 97, - 9, - 224, - 81, - 133, - 9, - 147, - 80, - 97, - 10, - 64, - 81, - 91, - 129, - 131, - 16, - 21, - 97, - 6, - 3, - 87, - 134, - 135, - 130, - 133, - 81, - 9, - 134, - 9, - 131, - 82, - 134, - 136, - 130, - 9, - 144, - 80, - 96, - 32, - 131, - 1, - 146, - 80, - 97, - 5, - 224, - 86, - 91, - 80, - 97, - 16, - 160, - 81, - 150, - 80, - 97, - 16, - 192, - 147, - 80, - 97, - 17, - 64, - 145, - 80, - 91, - 129, - 132, - 16, - 21, - 97, - 6, - 47, - 87, - 133, - 132, - 81, - 136, - 8, - 150, - 80, - 96, - 32, - 132, - 1, - 147, - 80, - 97, - 6, - 21, - 86, - 91, - 96, - 0, - 145, - 80, - 97, - 21, - 164, - 97, - 10, - 96, - 81, - 96, - 32, - 2, - 129, - 1, - 91, - 128, - 130, - 16, - 21, - 97, - 6, - 100, - 87, - 135, - 136, - 131, - 53, - 136, - 81, - 9, - 133, - 8, - 147, - 80, - 96, - 32, - 130, - 1, - 145, - 80, - 96, - 32, - 134, - 1, - 149, - 80, - 97, - 6, - 64, - 86, - 91, - 80, - 80, - 81, - 97, - 16, - 128, - 128, - 81, - 97, - 17, - 64, - 81, - 148, - 144, - 145, - 82, - 97, - 16, - 160, - 145, - 144, - 145, - 82, - 97, - 16, - 192, - 82, - 97, - 16, - 224, - 149, - 144, - 149, - 82, - 97, - 17, - 0, - 129, - 144, - 82, - 97, - 17, - 32, - 148, - 144, - 148, - 82, - 80, - 97, - 15, - 96, - 81, - 96, - 0, - 147, - 127, - 9, - 34, - 107, - 110, - 34, - 198, - 240, - 202, - 100, - 236, - 38, - 170, - 212, - 200, - 110, - 113, - 91, - 95, - 137, - 142, - 94, - 150, - 63, - 37, - 135, - 14, - 86, - 187, - 229, - 51, - 233, - 162, - 145, - 144, - 132, - 128, - 97, - 14, - 68, - 53, - 131, - 9, - 134, - 3, - 130, - 8, - 149, - 80, - 80, - 97, - 15, - 196, - 53, - 132, - 128, - 130, - 129, - 3, - 129, - 132, - 128, - 9, - 8, - 97, - 16, - 192, - 81, - 9, - 144, - 80, - 132, - 129, - 134, - 132, - 137, - 9, - 8, - 149, - 80, - 80, - 131, - 132, - 97, - 14, - 132, - 53, - 134, - 3, - 97, - 14, - 164, - 53, - 8, - 97, - 17, - 0, - 81, - 9, - 132, - 129, - 134, - 132, - 137, - 9, - 8, - 149, - 80, - 80, - 131, - 132, - 97, - 14, - 228, - 53, - 134, - 3, - 97, - 15, - 4, - 53, - 8, - 97, - 17, - 0, - 81, - 9, - 132, - 129, - 134, - 132, - 137, - 9, - 8, - 149, - 80, - 80, - 131, - 132, - 97, - 15, - 68, - 53, - 134, - 3, - 97, - 15, - 100, - 53, - 8, - 97, - 17, - 0, - 81, - 9, - 132, - 129, - 134, - 132, - 137, - 9, - 8, - 149, - 80, - 80, - 131, - 132, - 97, - 15, - 164, - 53, - 134, - 3, - 97, - 15, - 196, - 53, - 8, - 97, - 17, - 0, - 81, - 9, - 132, - 129, - 134, - 132, - 137, - 9, - 8, - 149, - 80, - 80, - 97, - 15, - 64, - 81, - 97, - 15, - 32, - 81, - 97, - 14, - 100, - 53, - 97, - 14, - 68, - 53, - 135, - 136, - 133, - 138, - 139, - 97, - 13, - 4, - 53, - 136, - 9, - 97, - 12, - 196, - 53, - 8, - 8, - 131, - 9, - 145, - 80, - 135, - 136, - 133, - 138, - 139, - 97, - 13, - 36, - 53, - 136, - 9, - 97, - 17, - 32, - 81, - 8, - 8, - 131, - 9, - 145, - 80, - 135, - 97, - 15, - 128, - 81, - 132, - 9, - 96, - 0, - 82, - 135, - 136, - 133, - 138, - 96, - 0, - 81, - 97, - 12, - 196, - 53, - 8, - 8, - 130, - 9, - 144, - 80, - 135, - 134, - 96, - 0, - 81, - 9, - 96, - 0, - 82, - 135, - 136, - 133, - 138, - 96, - 0, - 81, - 97, - 17, - 32, - 81, - 8, - 8, - 130, - 9, - 144, - 80, - 135, - 134, - 96, - 0, - 81, - 9, - 96, - 0, - 82, - 135, - 129, - 137, - 3, - 131, - 8, - 147, - 80, - 80, - 80, - 80, - 132, - 133, - 134, - 97, - 16, - 224, - 81, - 97, - 16, - 192, - 81, - 8, - 131, - 9, - 134, - 3, - 130, - 8, - 144, - 80, - 132, - 129, - 134, - 132, - 137, - 9, - 8, - 149, - 80, - 80, - 97, - 15, - 64, - 81, - 97, - 15, - 32, - 81, - 97, - 14, - 196, - 53, - 97, - 14, - 164, - 53, - 135, - 136, - 133, - 138, - 139, - 97, - 13, - 68, - 53, - 136, - 9, - 97, - 11, - 132, - 53, - 8, - 8, - 131, - 9, - 145, - 80, - 135, - 136, - 133, - 138, - 139, - 97, - 13, - 100, - 53, - 136, - 9, - 97, - 11, - 164, - 53, - 8, - 8, - 131, - 9, - 145, - 80, - 135, - 136, - 133, - 138, - 96, - 0, - 81, - 97, - 11, - 132, - 53, - 8, - 8, - 130, - 9, - 144, - 80, - 135, - 134, - 96, - 0, - 81, - 9, - 96, - 0, - 82, - 135, - 136, - 133, - 138, - 96, - 0, - 81, - 97, - 11, - 164, - 53, - 8, - 8, - 130, - 9, - 144, - 80, - 135, - 134, - 96, - 0, - 81, - 9, - 96, - 0, - 82, - 135, - 129, - 137, - 3, - 131, - 8, - 147, - 80, - 80, - 80, - 80, - 132, - 133, - 134, - 97, - 16, - 224, - 81, - 97, - 16, - 192, - 81, - 8, - 131, - 9, - 134, - 3, - 130, - 8, - 144, - 80, - 132, - 129, - 134, - 132, - 137, - 9, - 8, - 149, - 80, - 80, - 97, - 15, - 64, - 81, - 97, - 15, - 32, - 81, - 97, - 15, - 36, - 53, - 97, - 15, - 4, - 53, - 135, - 136, - 133, - 138, - 139, - 97, - 13, - 132, - 53, - 136, - 9, - 97, - 11, - 196, - 53, - 8, - 8, - 131, - 9, - 145, - 80, - 135, - 136, - 133, - 138, - 139, - 97, - 13, - 164, - 53, - 136, - 9, - 97, - 11, - 228, - 53, - 8, - 8, - 131, - 9, - 145, - 80, - 135, - 136, - 133, - 138, - 96, - 0, - 81, - 97, - 11, - 196, - 53, - 8, - 8, - 130, - 9, - 144, - 80, - 135, - 134, - 96, - 0, - 81, - 9, - 96, - 0, - 82, - 135, - 136, - 133, - 138, - 96, - 0, - 81, - 97, - 11, - 228, - 53, - 8, - 8, - 130, - 9, - 144, - 80, - 135, - 134, - 96, - 0, - 81, - 9, - 96, - 0, - 82, - 135, - 129, - 137, - 3, - 131, - 8, - 147, - 80, - 80, - 80, - 80, - 132, - 133, - 134, - 97, - 16, - 224, - 81, - 97, - 16, - 192, - 81, - 8, - 131, - 9, - 134, - 3, - 130, - 8, - 144, - 80, - 132, - 129, - 134, - 132, - 137, - 9, - 8, - 149, - 80, - 80, - 97, - 15, - 64, - 81, - 97, - 15, - 32, - 81, - 97, - 15, - 132, - 53, - 97, - 15, - 100, - 53, - 135, - 136, - 133, - 138, - 139, - 97, - 13, - 196, - 53, - 136, - 9, - 97, - 12, - 36, - 53, - 8, - 8, - 131, - 9, - 145, - 80, - 135, - 136, - 133, - 138, - 139, - 97, - 13, - 228, - 53, - 136, - 9, - 97, - 12, - 68, - 53, - 8, - 8, - 131, - 9, - 145, - 80, - 135, - 136, - 133, - 138, - 96, - 0, - 81, - 97, - 12, - 36, - 53, - 8, - 8, - 130, - 9, - 144, - 80, - 135, - 134, - 96, - 0, - 81, - 9, - 96, - 0, - 82, - 135, - 136, - 133, - 138, - 96, - 0, - 81, - 97, - 12, - 68, - 53, - 8, - 8, - 130, - 9, - 144, - 80, - 135, - 134, - 96, - 0, - 81, - 9, - 96, - 0, - 82, - 135, - 129, - 137, - 3, - 131, - 8, - 147, - 80, - 80, - 80, - 80, - 132, - 133, - 134, - 97, - 16, - 224, - 81, - 97, - 16, - 192, - 81, - 8, - 131, - 9, - 134, - 3, - 130, - 8, - 144, - 80, - 132, - 129, - 134, - 132, - 137, - 9, - 8, - 149, - 80, - 80, - 97, - 15, - 64, - 81, - 97, - 15, - 32, - 81, - 97, - 15, - 228, - 53, - 97, - 15, - 196, - 53, - 135, - 136, - 133, - 138, - 139, - 97, - 14, - 4, - 53, - 136, - 9, - 97, - 12, - 100, - 53, - 8, - 8, - 131, - 9, - 145, - 80, - 135, - 136, - 133, - 138, - 139, - 97, - 14, - 36, - 53, - 136, - 9, - 97, - 12, - 132, - 53, - 8, - 8, - 131, - 9, - 145, - 80, - 135, - 136, - 133, - 138, - 96, - 0, - 81, - 97, - 12, - 100, - 53, - 8, - 8, - 130, - 9, - 144, - 80, - 135, - 134, - 96, - 0, - 81, - 9, - 96, - 0, - 82, - 135, - 136, - 133, - 138, - 96, - 0, - 81, - 97, - 12, - 132, - 53, - 8, - 8, - 130, - 9, - 144, - 80, - 135, - 129, - 137, - 3, - 131, - 8, - 147, - 80, - 80, - 80, - 80, - 132, - 133, - 134, - 97, - 16, - 224, - 81, - 97, - 16, - 192, - 81, - 8, - 131, - 9, - 134, - 3, - 130, - 8, - 144, - 80, - 132, - 129, - 134, - 132, - 137, - 9, - 8, - 149, - 80, - 80, - 97, - 17, - 0, - 81, - 132, - 133, - 97, - 16, - 4, - 53, - 135, - 3, - 131, - 9, - 130, - 8, - 144, - 80, - 132, - 129, - 134, - 132, - 137, - 9, - 8, - 149, - 80, - 80, - 97, - 16, - 192, - 81, - 132, - 133, - 97, - 16, - 4, - 53, - 135, - 3, - 135, - 97, - 16, - 4, - 53, - 97, - 16, - 4, - 53, - 9, - 8, - 130, - 9, - 144, - 80, - 132, - 129, - 134, - 132, - 137, - 9, - 8, - 149, - 80, - 96, - 0, - 144, - 80, - 97, - 12, - 4, - 53, - 97, - 11, - 132, - 53, - 98, - 1, - 0, - 0, - 135, - 129, - 131, - 9, - 136, - 3, - 145, - 80, - 135, - 144, - 80, - 129, - 131, - 8, - 97, - 15, - 32, - 81, - 97, - 15, - 64, - 81, - 145, - 148, - 80, - 97, - 12, - 196, - 53, - 147, - 80, - 145, - 80, - 135, - 128, - 128, - 131, - 97, - 16, - 132, - 53, - 8, - 138, - 133, - 97, - 16, - 68, - 53, - 8, - 9, - 97, - 16, - 36, - 53, - 9, - 136, - 137, - 138, - 132, - 135, - 8, - 139, - 134, - 137, - 8, - 9, - 97, - 16, - 4, - 53, - 9, - 148, - 80, - 136, - 137, - 134, - 139, - 3, - 131, - 8, - 138, - 139, - 97, - 16, - 192, - 81, - 97, - 16, - 224, - 81, - 8, - 140, - 3, - 96, - 1, - 8, - 9, - 148, - 80, - 80, - 80, - 80, - 80, - 132, - 129, - 134, - 132, - 137, - 9, - 8, - 149, - 80, - 80, - 131, - 132, - 97, - 16, - 132, - 53, - 134, - 3, - 97, - 16, - 68, - 53, - 8, - 97, - 17, - 0, - 81, - 9, - 132, - 129, - 134, - 132, - 137, - 9, - 8, - 149, - 80, - 80, - 131, - 132, - 133, - 97, - 16, - 100, - 53, - 135, - 3, - 97, - 16, - 68, - 53, - 8, - 134, - 97, - 16, - 132, - 53, - 136, - 3, - 97, - 16, - 68, - 53, - 8, - 9, - 133, - 134, - 97, - 16, - 192, - 81, - 97, - 16, - 224, - 81, - 8, - 135, - 3, - 96, - 1, - 8, - 9, - 132, - 129, - 134, - 132, - 137, - 9, - 8, - 149, - 80, - 80, - 97, - 17, - 0, - 81, - 132, - 133, - 97, - 16, - 164, - 53, - 135, - 3, - 131, - 9, - 130, - 8, - 144, - 80, - 132, - 129, - 134, - 132, - 137, - 9, - 8, - 149, - 80, - 80, - 97, - 16, - 192, - 81, - 132, - 133, - 97, - 16, - 164, - 53, - 135, - 3, - 135, - 97, - 16, - 164, - 53, - 97, - 16, - 164, - 53, - 9, - 8, - 130, - 9, - 144, - 80, - 132, - 129, - 134, - 132, - 137, - 9, - 8, - 149, - 80, - 96, - 0, - 144, - 80, - 97, - 11, - 132, - 53, - 97, - 11, - 164, - 53, - 98, - 1, - 0, - 0, - 135, - 129, - 131, - 9, - 136, - 3, - 145, - 80, - 135, - 144, - 80, - 129, - 131, - 8, - 97, - 15, - 32, - 81, - 97, - 15, - 64, - 81, - 145, - 148, - 80, - 97, - 12, - 196, - 53, - 147, - 80, - 145, - 80, - 135, - 128, - 128, - 131, - 97, - 17, - 36, - 53, - 8, - 138, - 133, - 97, - 16, - 228, - 53, - 8, - 9, - 97, - 16, - 196, - 53, - 9, - 136, - 137, - 138, - 132, - 135, - 8, - 139, - 134, - 137, - 8, - 9, - 97, - 16, - 164, - 53, - 9, - 148, - 80, - 136, - 137, - 134, - 139, - 3, - 131, - 8, - 138, - 139, - 97, - 16, - 192, - 81, - 97, - 16, - 224, - 81, - 8, - 140, - 3, - 96, - 1, - 8, - 9, - 148, - 80, - 80, - 80, - 80, - 80, - 132, - 129, - 134, - 132, - 137, - 9, - 8, - 149, - 80, - 80, - 131, - 132, - 97, - 17, - 36, - 53, - 134, - 3, - 97, - 16, - 228, - 53, - 8, - 97, - 17, - 0, - 81, - 9, - 132, - 129, - 134, - 132, - 137, - 9, - 8, - 149, - 80, - 80, - 131, - 132, - 133, - 97, - 17, - 4, - 53, - 135, - 3, - 97, - 16, - 228, - 53, - 8, - 134, - 97, - 17, - 36, - 53, - 136, - 3, - 97, - 16, - 228, - 53, - 8, - 9, - 133, - 134, - 97, - 16, - 192, - 81, - 97, - 16, - 224, - 81, - 8, - 135, - 3, - 96, - 1, - 8, - 9, - 132, - 129, - 134, - 132, - 137, - 9, - 8, - 149, - 80, - 80, - 97, - 17, - 0, - 81, - 132, - 133, - 97, - 17, - 68, - 53, - 135, - 3, - 131, - 9, - 130, - 8, - 144, - 80, - 132, - 129, - 134, - 132, - 137, - 9, - 8, - 149, - 80, - 80, - 97, - 16, - 192, - 81, - 132, - 133, - 97, - 17, - 68, - 53, - 135, - 3, - 135, - 97, - 17, - 68, - 53, - 97, - 17, - 68, - 53, - 9, - 8, - 130, - 9, - 144, - 80, - 132, - 129, - 134, - 132, - 137, - 9, - 8, - 149, - 80, - 96, - 0, - 144, - 80, - 97, - 11, - 164, - 53, - 97, - 11, - 196, - 53, - 98, - 1, - 0, - 0, - 135, - 129, - 131, - 9, - 136, - 3, - 145, - 80, - 135, - 144, - 80, - 129, - 131, - 8, - 97, - 15, - 32, - 81, - 97, - 15, - 64, - 81, - 145, - 148, - 80, - 97, - 12, - 196, - 53, - 147, - 80, - 145, - 80, - 135, - 128, - 128, - 131, - 97, - 17, - 196, - 53, - 8, - 138, - 133, - 97, - 17, - 132, - 53, - 8, - 9, - 97, - 17, - 100, - 53, - 9, - 136, - 137, - 138, - 132, - 135, - 8, - 139, - 134, - 137, - 8, - 9, - 97, - 17, - 68, - 53, - 9, - 148, - 80, - 136, - 137, - 134, - 139, - 3, - 131, - 8, - 138, - 139, - 97, - 16, - 192, - 81, - 97, - 16, - 224, - 81, - 8, - 140, - 3, - 96, - 1, - 8, - 9, - 148, - 80, - 80, - 80, - 80, - 80, - 132, - 129, - 134, - 132, - 137, - 9, - 8, - 149, - 80, - 80, - 131, - 132, - 97, - 17, - 196, - 53, - 134, - 3, - 97, - 17, - 132, - 53, - 8, - 97, - 17, - 0, - 81, - 9, - 132, - 129, - 134, - 132, - 137, - 9, - 8, - 149, - 80, - 80, - 131, - 132, - 133, - 97, - 17, - 164, - 53, - 135, - 3, - 97, - 17, - 132, - 53, - 8, - 134, - 97, - 17, - 196, - 53, - 136, - 3, - 97, - 17, - 132, - 53, - 8, - 9, - 133, - 134, - 97, - 16, - 192, - 81, - 97, - 16, - 224, - 81, - 8, - 135, - 3, - 96, - 1, - 8, - 9, - 132, - 129, - 134, - 132, - 137, - 9, - 8, - 149, - 80, - 80, - 97, - 17, - 0, - 81, - 132, - 133, - 97, - 17, - 228, - 53, - 135, - 3, - 131, - 9, - 130, - 8, - 144, - 80, - 132, - 129, - 134, - 132, - 137, - 9, - 8, - 149, - 80, - 80, - 97, - 16, - 192, - 81, - 132, - 133, - 97, - 17, - 228, - 53, - 135, - 3, - 135, - 97, - 17, - 228, - 53, - 97, - 17, - 228, - 53, - 9, - 8, - 130, - 9, - 144, - 80, - 132, - 129, - 134, - 132, - 137, - 9, - 8, - 149, - 80, - 96, - 0, - 144, - 80, - 97, - 11, - 196, - 53, - 97, - 11, - 228, - 53, - 98, - 1, - 0, - 0, - 135, - 129, - 131, - 9, - 136, - 3, - 145, - 80, - 135, - 144, - 80, - 129, - 131, - 8, - 97, - 15, - 32, - 81, - 97, - 15, - 64, - 81, - 145, - 148, - 80, - 97, - 12, - 196, - 53, - 147, - 80, - 145, - 80, - 135, - 128, - 128, - 131, - 97, - 18, - 100, - 53, - 8, - 138, - 133, - 97, - 18, - 36, - 53, - 8, - 9, - 97, - 18, - 4, - 53, - 9, - 136, - 137, - 138, - 132, - 135, - 8, - 139, - 134, - 137, - 8, - 9, - 97, - 17, - 228, - 53, - 9, - 148, - 80, - 136, - 137, - 134, - 139, - 3, - 131, - 8, - 138, - 139, - 97, - 16, - 192, - 81, - 97, - 16, - 224, - 81, - 8, - 140, - 3, - 96, - 1, - 8, - 9, - 148, - 80, - 80, - 80, - 80, - 80, - 132, - 129, - 134, - 132, - 137, - 9, - 8, - 149, - 80, - 80, - 131, - 132, - 97, - 18, - 100, - 53, - 134, - 3, - 97, - 18, - 36, - 53, - 8, - 97, - 17, - 0, - 81, - 9, - 132, - 129, - 134, - 132, - 137, - 9, - 8, - 149, - 80, - 80, - 131, - 132, - 133, - 97, - 18, - 68, - 53, - 135, - 3, - 97, - 18, - 36, - 53, - 8, - 134, - 97, - 18, - 100, - 53, - 136, - 3, - 97, - 18, - 36, - 53, - 8, - 9, - 133, - 134, - 97, - 16, - 192, - 81, - 97, - 16, - 224, - 81, - 8, - 135, - 3, - 96, - 1, - 8, - 9, - 132, - 129, - 134, - 132, - 137, - 9, - 8, - 149, - 80, - 80, - 97, - 17, - 0, - 81, - 132, - 133, - 97, - 18, - 132, - 53, - 135, - 3, - 131, - 9, - 130, - 8, - 144, - 80, - 132, - 129, - 134, - 132, - 137, - 9, - 8, - 149, - 80, - 80, - 97, - 16, - 192, - 81, - 132, - 133, - 97, - 18, - 132, - 53, - 135, - 3, - 135, - 97, - 18, - 132, - 53, - 97, - 18, - 132, - 53, - 9, - 8, - 130, - 9, - 144, - 80, - 132, - 129, - 134, - 132, - 137, - 9, - 8, - 149, - 80, - 96, - 0, - 144, - 80, - 97, - 12, - 164, - 53, - 97, - 12, - 36, - 53, - 98, - 1, - 0, - 0, - 135, - 129, - 131, - 9, - 136, - 3, - 145, - 80, - 135, - 144, - 80, - 129, - 131, - 8, - 97, - 15, - 32, - 81, - 97, - 15, - 64, - 81, - 145, - 148, - 80, - 97, - 12, - 196, - 53, - 147, - 80, - 145, - 80, - 135, - 128, - 128, - 131, - 97, - 19, - 4, - 53, - 8, - 138, - 133, - 97, - 18, - 196, - 53, - 8, - 9, - 97, - 18, - 164, - 53, - 9, - 136, - 137, - 138, - 132, - 135, - 8, - 139, - 134, - 137, - 8, - 9, - 97, - 18, - 132, - 53, - 9, - 148, - 80, - 136, - 137, - 134, - 139, - 3, - 131, - 8, - 138, - 139, - 97, - 16, - 192, - 81, - 97, - 16, - 224, - 81, - 8, - 140, - 3, - 96, - 1, - 8, - 9, - 148, - 80, - 80, - 80, - 80, - 80, - 132, - 129, - 134, - 132, - 137, - 9, - 8, - 149, - 80, - 80, - 131, - 132, - 97, - 19, - 4, - 53, - 134, - 3, - 97, - 18, - 196, - 53, - 8, - 97, - 17, - 0, - 81, - 9, - 132, - 129, - 134, - 132, - 137, - 9, - 8, - 149, - 80, - 80, - 131, - 132, - 133, - 97, - 18, - 228, - 53, - 135, - 3, - 97, - 18, - 196, - 53, - 8, - 134, - 97, - 19, - 4, - 53, - 136, - 3, - 97, - 18, - 196, - 53, - 8, - 9, - 133, - 134, - 97, - 16, - 192, - 81, - 97, - 16, - 224, - 81, - 8, - 135, - 3, - 96, - 1, - 8, - 9, - 132, - 129, - 134, - 132, - 137, - 9, - 8, - 149, - 80, - 80, - 97, - 17, - 0, - 81, - 132, - 133, - 97, - 19, - 36, - 53, - 135, - 3, - 131, - 9, - 130, - 8, - 144, - 80, - 132, - 129, - 134, - 132, - 137, - 9, - 8, - 149, - 80, - 80, - 97, - 16, - 192, - 81, - 132, - 133, - 97, - 19, - 36, - 53, - 135, - 3, - 135, - 97, - 19, - 36, - 53, - 97, - 19, - 36, - 53, - 9, - 8, - 130, - 9, - 144, - 80, - 132, - 129, - 134, - 132, - 137, - 9, - 8, - 149, - 80, - 96, - 0, - 144, - 80, - 97, - 12, - 36, - 53, - 97, - 12, - 68, - 53, - 98, - 1, - 0, - 0, - 135, - 129, - 131, - 9, - 136, - 3, - 145, - 80, - 135, - 144, - 80, - 129, - 131, - 8, - 97, - 15, - 32, - 81, - 97, - 15, - 64, - 81, - 145, - 148, - 80, - 97, - 12, - 196, - 53, - 147, - 80, - 145, - 80, - 135, - 128, - 128, - 131, - 97, - 19, - 164, - 53, - 8, - 138, - 133, - 97, - 19, - 100, - 53, - 8, - 9, - 97, - 19, - 68, - 53, - 9, - 136, - 137, - 138, - 132, - 135, - 8, - 139, - 134, - 137, - 8, - 9, - 97, - 19, - 36, - 53, - 9, - 148, - 80, - 136, - 137, - 134, - 139, - 3, - 131, - 8, - 138, - 139, - 97, - 16, - 192, - 81, - 97, - 16, - 224, - 81, - 8, - 140, - 3, - 96, - 1, - 8, - 9, - 148, - 80, - 80, - 80, - 80, - 80, - 132, - 129, - 134, - 132, - 137, - 9, - 8, - 149, - 80, - 80, - 131, - 132, - 97, - 19, - 164, - 53, - 134, - 3, - 97, - 19, - 100, - 53, - 8, - 97, - 17, - 0, - 81, - 9, - 132, - 129, - 134, - 132, - 137, - 9, - 8, - 149, - 80, - 80, - 131, - 132, - 133, - 97, - 19, - 132, - 53, - 135, - 3, - 97, - 19, - 100, - 53, - 8, - 134, - 97, - 19, - 164, - 53, - 136, - 3, - 97, - 19, - 100, - 53, - 8, - 9, - 133, - 134, - 97, - 16, - 192, - 81, - 97, - 16, - 224, - 81, - 8, - 135, - 3, - 96, - 1, - 8, - 9, - 132, - 129, - 134, - 132, - 137, - 9, - 8, - 149, - 80, - 80, - 97, - 17, - 0, - 81, - 132, - 133, - 97, - 19, - 196, - 53, - 135, - 3, - 131, - 9, - 130, - 8, - 144, - 80, - 132, - 129, - 134, - 132, - 137, - 9, - 8, - 149, - 80, - 80, - 97, - 16, - 192, - 81, - 132, - 133, - 97, - 19, - 196, - 53, - 135, - 3, - 135, - 97, - 19, - 196, - 53, - 97, - 19, - 196, - 53, - 9, - 8, - 130, - 9, - 144, - 80, - 132, - 129, - 134, - 132, - 137, - 9, - 8, - 149, - 80, - 96, - 0, - 144, - 80, - 97, - 12, - 68, - 53, - 97, - 12, - 100, - 53, - 98, - 1, - 0, - 0, - 135, - 129, - 131, - 9, - 136, - 3, - 145, - 80, - 135, - 144, - 80, - 129, - 131, - 8, - 97, - 15, - 32, - 81, - 97, - 15, - 64, - 81, - 145, - 148, - 80, - 97, - 12, - 196, - 53, - 147, - 80, - 145, - 80, - 135, - 128, - 128, - 131, - 97, - 20, - 68, - 53, - 8, - 138, - 133, - 97, - 20, - 4, - 53, - 8, - 9, - 97, - 19, - 228, - 53, - 9, - 136, - 137, - 138, - 132, - 135, - 8, - 139, - 134, - 137, - 8, - 9, - 97, - 19, - 196, - 53, - 9, - 148, - 80, - 136, - 137, - 134, - 139, - 3, - 131, - 8, - 138, - 139, - 97, - 16, - 192, - 81, - 97, - 16, - 224, - 81, - 8, - 140, - 3, - 96, - 1, - 8, - 9, - 148, - 80, - 80, - 80, - 80, - 80, - 132, - 129, - 134, - 132, - 137, - 9, - 8, - 149, - 80, - 80, - 131, - 132, - 97, - 20, - 68, - 53, - 134, - 3, - 97, - 20, - 4, - 53, - 8, - 97, - 17, - 0, - 81, - 9, - 132, - 129, - 134, - 132, - 137, - 9, - 8, - 149, - 80, - 80, - 131, - 132, - 133, - 97, - 20, - 36, - 53, - 135, - 3, - 97, - 20, - 4, - 53, - 8, - 134, - 97, - 20, - 68, - 53, - 136, - 3, - 97, - 20, - 4, - 53, - 8, - 9, - 133, - 134, - 97, - 16, - 192, - 81, - 97, - 16, - 224, - 81, - 8, - 135, - 3, - 96, - 1, - 8, - 9, - 132, - 129, - 134, - 132, - 137, - 9, - 8, - 149, - 80, - 80, - 97, - 17, - 0, - 81, - 132, - 133, - 97, - 20, - 100, - 53, - 135, - 3, - 131, - 9, - 130, - 8, - 144, - 80, - 132, - 129, - 134, - 132, - 137, - 9, - 8, - 149, - 80, - 80, - 97, - 16, - 192, - 81, - 132, - 133, - 97, - 20, - 100, - 53, - 135, - 3, - 135, - 97, - 20, - 100, - 53, - 97, - 20, - 100, - 53, - 9, - 8, - 130, - 9, - 144, - 80, - 132, - 129, - 134, - 132, - 137, - 9, - 8, - 149, - 80, - 96, - 0, - 144, - 80, - 97, - 12, - 100, - 53, - 97, - 12, - 132, - 53, - 98, - 1, - 0, - 0, - 135, - 129, - 131, - 9, - 136, - 3, - 145, - 80, - 135, - 144, - 80, - 129, - 131, - 8, - 97, - 15, - 32, - 81, - 97, - 15, - 64, - 81, - 145, - 148, - 80, - 97, - 12, - 196, - 53, - 147, - 80, - 145, - 80, - 135, - 128, - 128, - 131, - 97, - 20, - 228, - 53, - 8, - 138, - 133, - 97, - 20, - 164, - 53, - 8, - 9, - 97, - 20, - 132, - 53, - 9, - 136, - 137, - 138, - 132, - 135, - 8, - 139, - 134, - 137, - 8, - 9, - 97, - 20, - 100, - 53, - 9, - 148, - 80, - 136, - 137, - 134, - 139, - 3, - 131, - 8, - 138, - 139, - 97, - 16, - 192, - 81, - 97, - 16, - 224, - 81, - 8, - 140, - 3, - 96, - 1, - 8, - 9, - 148, - 80, - 80, - 80, - 80, - 80, - 132, - 129, - 134, - 132, - 137, - 9, - 8, - 149, - 80, - 80, - 131, - 132, - 97, - 20, - 228, - 53, - 134, - 3, - 97, - 20, - 164, - 53, - 8, - 97, - 17, - 0, - 81, - 9, - 132, - 129, - 134, - 132, - 137, - 9, - 8, - 149, - 80, - 80, - 131, - 132, - 133, - 97, - 20, - 196, - 53, - 135, - 3, - 97, - 20, - 164, - 53, - 8, - 134, - 97, - 20, - 228, - 53, - 136, - 3, - 97, - 20, - 164, - 53, - 8, - 9, - 133, - 134, - 97, - 16, - 192, - 81, - 97, - 16, - 224, - 81, - 8, - 135, - 3, - 96, - 1, - 8, - 9, - 132, - 129, - 134, - 132, - 137, - 9, - 8, - 149, - 80, - 80, - 80, - 80, - 129, - 97, - 16, - 160, - 81, - 132, - 9, - 97, - 17, - 64, - 82, - 97, - 11, - 68, - 53, - 96, - 0, - 82, - 97, - 11, - 100, - 53, - 96, - 32, - 82, - 97, - 16, - 128, - 81, - 146, - 80, - 97, - 11, - 4, - 97, - 10, - 132, - 91, - 129, - 129, - 16, - 21, - 97, - 19, - 65, - 87, - 97, - 19, - 34, - 133, - 132, - 97, - 1, - 162, - 86, - 91, - 146, - 80, - 97, - 19, - 52, - 96, - 32, - 131, - 1, - 53, - 131, - 53, - 133, - 97, - 1, - 130, - 86, - 91, - 146, - 80, - 96, - 64, - 130, - 3, - 145, - 80, - 97, - 19, - 16, - 86, - 91, - 80, - 80, - 96, - 0, - 81, - 97, - 17, - 96, - 82, - 96, - 32, - 81, - 97, - 17, - 128, - 82, - 97, - 15, - 128, - 81, - 146, - 80, - 97, - 10, - 0, - 81, - 97, - 10, - 32, - 81, - 131, - 130, - 134, - 9, - 145, - 80, - 129, - 97, - 3, - 96, - 82, - 132, - 97, - 3, - 64, - 82, - 131, - 129, - 134, - 9, - 145, - 80, - 129, - 97, - 3, - 32, - 82, - 131, - 129, - 131, - 9, - 145, - 80, - 131, - 129, - 131, - 9, - 145, - 80, - 131, - 129, - 131, - 9, - 145, - 80, - 131, - 129, - 131, - 9, - 145, - 80, - 131, - 129, - 131, - 9, - 145, - 80, - 80, - 128, - 97, - 3, - 0, - 82, - 80, - 97, - 15, - 224, - 81, - 146, - 80, - 97, - 3, - 128, - 97, - 4, - 0, - 97, - 3, - 0, - 91, - 129, - 131, - 16, - 21, - 97, - 19, - 204, - 87, - 132, - 129, - 81, - 134, - 3, - 135, - 8, - 131, - 82, - 96, - 32, - 146, - 131, - 1, - 146, - 1, - 97, - 19, - 175, - 86, - 91, - 80, - 80, - 97, - 3, - 192, - 81, - 97, - 4, - 0, - 82, - 80, - 97, - 3, - 128, - 81, - 97, - 3, - 160, - 81, - 144, - 147, - 80, - 130, - 144, - 132, - 9, - 146, - 80, - 129, - 97, - 3, - 224, - 81, - 132, - 9, - 97, - 4, - 32, - 129, - 144, - 82, - 96, - 0, - 82, - 97, - 3, - 160, - 81, - 97, - 4, - 64, - 129, - 144, - 82, - 97, - 3, - 128, - 81, - 147, - 80, - 130, - 144, - 132, - 9, - 97, - 4, - 96, - 82, - 97, - 3, - 128, - 81, - 97, - 3, - 224, - 81, - 144, - 147, - 80, - 130, - 144, - 132, - 9, - 97, - 4, - 128, - 82, - 97, - 3, - 192, - 81, - 96, - 1, - 147, - 80, - 130, - 144, - 132, - 9, - 96, - 32, - 82, - 97, - 3, - 0, - 81, - 97, - 3, - 64, - 81, - 97, - 3, - 96, - 81, - 145, - 148, - 80, - 144, - 96, - 0, - 132, - 131, - 129, - 3, - 135, - 8, - 144, - 80, - 132, - 133, - 131, - 135, - 3, - 136, - 8, - 130, - 9, - 144, - 80, - 132, - 97, - 3, - 128, - 81, - 130, - 9, - 144, - 80, - 128, - 96, - 64, - 82, - 132, - 134, - 134, - 3, - 132, - 8, - 144, - 80, - 132, - 133, - 131, - 135, - 3, - 133, - 8, - 130, - 9, - 144, - 80, - 132, - 97, - 3, - 192, - 81, - 130, - 9, - 144, - 80, - 128, - 96, - 96, - 82, - 132, - 134, - 134, - 3, - 131, - 8, - 144, - 80, - 132, - 133, - 132, - 135, - 3, - 132, - 8, - 130, - 9, - 144, - 80, - 132, - 97, - 3, - 224, - 81, - 130, - 9, - 96, - 128, - 82, - 80, - 80, - 97, - 3, - 64, - 81, - 97, - 3, - 96, - 81, - 144, - 148, - 80, - 144, - 80, - 96, - 0, - 131, - 130, - 129, - 3, - 134, - 8, - 144, - 80, - 131, - 97, - 3, - 192, - 81, - 130, - 9, - 144, - 80, - 128, - 96, - 160, - 82, - 131, - 133, - 133, - 3, - 131, - 8, - 144, - 80, - 131, - 97, - 3, - 224, - 81, - 130, - 9, - 96, - 192, - 82, - 80, - 80, - 97, - 3, - 32, - 81, - 97, - 3, - 64, - 81, - 144, - 147, - 80, - 96, - 0, - 131, - 130, - 129, - 3, - 134, - 8, - 144, - 80, - 131, - 97, - 3, - 160, - 81, - 130, - 9, - 144, - 80, - 128, - 96, - 224, - 82, - 131, - 133, - 133, - 3, - 131, - 8, - 144, - 80, - 131, - 97, - 3, - 192, - 81, - 130, - 9, - 97, - 1, - 0, - 82, - 80, - 97, - 21, - 34, - 144, - 80, - 130, - 97, - 1, - 32, - 96, - 0, - 132, - 97, - 0, - 196, - 86, - 91, - 144, - 80, - 96, - 0, - 81, - 146, - 80, - 130, - 97, - 4, - 32, - 82, - 97, - 4, - 64, - 97, - 4, - 160, - 91, - 128, - 130, - 16, - 21, - 97, - 21, - 79, - 87, - 131, - 133, - 131, - 81, - 9, - 130, - 82, - 96, - 32, - 130, - 1, - 145, - 80, - 97, - 21, - 53, - 86, - 91, - 80, - 80, - 96, - 32, - 81, - 146, - 80, - 97, - 15, - 160, - 81, - 96, - 0, - 131, - 132, - 97, - 12, - 228, - 53, - 135, - 9, - 130, - 8, - 144, - 80, - 131, - 130, - 130, - 9, - 144, - 80, - 131, - 132, - 97, - 17, - 64, - 81, - 135, - 9, - 130, - 8, - 144, - 80, - 97, - 14, - 36, - 97, - 12, - 228, - 91, - 129, - 129, - 16, - 21, - 97, - 21, - 161, - 87, - 133, - 134, - 131, - 53, - 137, - 9, - 135, - 134, - 134, - 9, - 8, - 146, - 80, - 96, - 32, - 130, - 3, - 145, - 80, - 97, - 21, - 129, - 86, - 91, - 80, - 80, - 131, - 130, - 130, - 9, - 144, - 80, - 131, - 132, - 97, - 12, - 196, - 53, - 135, - 9, - 130, - 8, - 144, - 80, - 131, - 130, - 130, - 9, - 144, - 80, - 131, - 132, - 97, - 20, - 228, - 53, - 135, - 9, - 130, - 8, - 144, - 80, - 131, - 130, - 130, - 9, - 144, - 80, - 131, - 132, - 97, - 20, - 68, - 53, - 135, - 9, - 130, - 8, - 144, - 80, - 131, - 130, - 130, - 9, - 144, - 80, - 131, - 132, - 97, - 19, - 164, - 53, - 135, - 9, - 130, - 8, - 144, - 80, - 131, - 130, - 130, - 9, - 144, - 80, - 131, - 132, - 97, - 19, - 4, - 53, - 135, - 9, - 130, - 8, - 144, - 80, - 131, - 130, - 130, - 9, - 144, - 80, - 131, - 132, - 97, - 18, - 100, - 53, - 135, - 9, - 130, - 8, - 144, - 80, - 131, - 130, - 130, - 9, - 144, - 80, - 131, - 132, - 97, - 17, - 196, - 53, - 135, - 9, - 130, - 8, - 144, - 80, - 131, - 130, - 130, - 9, - 144, - 80, - 131, - 132, - 97, - 17, - 36, - 53, - 135, - 9, - 130, - 8, - 144, - 80, - 131, - 130, - 130, - 9, - 144, - 80, - 131, - 132, - 97, - 16, - 132, - 53, - 135, - 9, - 130, - 8, - 144, - 80, - 97, - 12, - 164, - 97, - 11, - 100, - 91, - 129, - 129, - 16, - 21, - 97, - 22, - 108, - 87, - 133, - 134, - 131, - 53, - 137, - 9, - 135, - 134, - 134, - 9, - 8, - 146, - 80, - 96, - 32, - 130, - 3, - 145, - 80, - 97, - 22, - 76, - 86, - 91, - 80, - 80, - 128, - 97, - 4, - 160, - 82, - 80, - 80, - 97, - 15, - 160, - 81, - 146, - 80, - 96, - 0, - 130, - 131, - 97, - 15, - 164, - 53, - 96, - 64, - 81, - 9, - 130, - 8, - 144, - 80, - 130, - 131, - 97, - 15, - 100, - 53, - 96, - 96, - 81, - 9, - 130, - 8, - 144, - 80, - 130, - 131, - 97, - 15, - 132, - 53, - 96, - 128, - 81, - 9, - 130, - 8, - 144, - 80, - 130, - 132, - 130, - 9, - 144, - 80, - 130, - 131, - 97, - 15, - 68, - 53, - 96, - 64, - 81, - 9, - 130, - 8, - 144, - 80, - 130, - 131, - 97, - 15, - 4, - 53, - 96, - 96, - 81, - 9, - 130, - 8, - 144, - 80, - 130, - 131, - 97, - 15, - 36, - 53, - 96, - 128, - 81, - 9, - 130, - 8, - 144, - 80, - 130, - 132, - 130, - 9, - 144, - 80, - 130, - 131, - 97, - 14, - 228, - 53, - 96, - 64, - 81, - 9, - 130, - 8, - 144, - 80, - 130, - 131, - 97, - 14, - 164, - 53, - 96, - 96, - 81, - 9, - 130, - 8, - 144, - 80, - 130, - 131, - 97, - 14, - 196, - 53, - 96, - 128, - 81, - 9, - 130, - 8, - 144, - 80, - 130, - 132, - 130, - 9, - 144, - 80, - 130, - 131, - 97, - 14, - 132, - 53, - 96, - 64, - 81, - 9, - 130, - 8, - 144, - 80, - 130, - 131, - 97, - 14, - 68, - 53, - 96, - 96, - 81, - 9, - 130, - 8, - 144, - 80, - 130, - 131, - 97, - 14, - 100, - 53, - 96, - 128, - 81, - 9, - 130, - 8, - 144, - 80, - 130, - 97, - 4, - 64, - 81, - 130, - 9, - 144, - 80, - 128, - 97, - 4, - 192, - 82, - 80, - 97, - 15, - 160, - 81, - 146, - 80, - 96, - 0, - 130, - 131, - 97, - 20, - 100, - 53, - 96, - 160, - 81, - 9, - 130, - 8, - 144, - 80, - 130, - 131, - 97, - 20, - 132, - 53, - 96, - 192, - 81, - 9, - 130, - 8, - 144, - 80, - 130, - 132, - 130, - 9, - 144, - 80, - 130, - 131, - 97, - 19, - 196, - 53, - 96, - 160, - 81, - 9, - 130, - 8, - 144, - 80, - 130, - 131, - 97, - 19, - 228, - 53, - 96, - 192, - 81, - 9, - 130, - 8, - 144, - 80, - 130, - 132, - 130, - 9, - 144, - 80, - 130, - 131, - 97, - 19, - 36, - 53, - 96, - 160, - 81, - 9, - 130, - 8, - 144, - 80, - 130, - 131, - 97, - 19, - 68, - 53, - 96, - 192, - 81, - 9, - 130, - 8, - 144, - 80, - 130, - 132, - 130, - 9, - 144, - 80, - 130, - 131, - 97, - 18, - 132, - 53, - 96, - 160, - 81, - 9, - 130, - 8, - 144, - 80, - 130, - 131, - 97, - 18, - 164, - 53, - 96, - 192, - 81, - 9, - 130, - 8, - 144, - 80, - 130, - 132, - 130, - 9, - 144, - 80, - 130, - 131, - 97, - 17, - 228, - 53, - 96, - 160, - 81, - 9, - 130, - 8, - 144, - 80, - 130, - 131, - 97, - 18, - 4, - 53, - 96, - 192, - 81, - 9, - 130, - 8, - 144, - 80, - 130, - 132, - 130, - 9, - 144, - 80, - 130, - 131, - 97, - 17, - 68, - 53, - 96, - 160, - 81, - 9, - 130, - 8, - 144, - 80, - 130, - 131, - 97, - 17, - 100, - 53, - 96, - 192, - 81, - 9, - 130, - 8, - 144, - 80, - 130, - 132, - 130, - 9, - 144, - 80, - 130, - 131, - 97, - 16, - 164, - 53, - 96, - 160, - 81, - 9, - 130, - 8, - 144, - 80, - 130, - 131, - 97, - 16, - 196, - 53, - 96, - 192, - 81, - 9, - 130, - 8, - 144, - 80, - 130, - 132, - 130, - 9, - 144, - 80, - 130, - 131, - 97, - 16, - 4, - 53, - 96, - 160, - 81, - 9, - 130, - 8, - 144, - 80, - 130, - 131, - 97, - 16, - 36, - 53, - 96, - 192, - 81, - 9, - 130, - 8, - 144, - 80, - 130, - 132, - 130, - 9, - 144, - 80, - 130, - 131, - 97, - 15, - 196, - 53, - 96, - 160, - 81, - 9, - 130, - 8, - 144, - 80, - 130, - 131, - 97, - 15, - 228, - 53, - 96, - 192, - 81, - 9, - 130, - 8, - 144, - 80, - 130, - 97, - 4, - 96, - 81, - 130, - 9, - 144, - 80, - 128, - 97, - 4, - 224, - 82, - 80, - 97, - 15, - 160, - 81, - 146, - 80, - 96, - 0, - 130, - 131, - 97, - 20, - 196, - 53, - 96, - 224, - 81, - 9, - 130, - 8, - 144, - 80, - 130, - 131, - 97, - 20, - 164, - 53, - 97, - 1, - 0, - 81, - 9, - 130, - 8, - 144, - 80, - 130, - 132, - 130, - 9, - 144, - 80, - 130, - 131, - 97, - 20, - 36, - 53, - 96, - 224, - 81, - 9, - 130, - 8, - 144, - 80, - 130, - 131, - 97, - 20, - 4, - 53, - 97, - 1, - 0, - 81, - 9, - 130, - 8, - 144, - 80, - 130, - 132, - 130, - 9, - 144, - 80, - 130, - 131, - 97, - 19, - 132, - 53, - 96, - 224, - 81, - 9, - 130, - 8, - 144, - 80, - 130, - 131, - 97, - 19, - 100, - 53, - 97, - 1, - 0, - 81, - 9, - 130, - 8, - 144, - 80, - 130, - 132, - 130, - 9, - 144, - 80, - 130, - 131, - 97, - 18, - 228, - 53, - 96, - 224, - 81, - 9, - 130, - 8, - 144, - 80, - 130, - 131, - 97, - 18, - 196, - 53, - 97, - 1, - 0, - 81, - 9, - 130, - 8, - 144, - 80, - 130, - 132, - 130, - 9, - 144, - 80, - 130, - 131, - 97, - 18, - 68, - 53, - 96, - 224, - 81, - 9, - 130, - 8, - 144, - 80, - 130, - 131, - 97, - 18, - 36, - 53, - 97, - 1, - 0, - 81, - 9, - 130, - 8, - 144, - 80, - 130, - 132, - 130, - 9, - 144, - 80, - 130, - 131, - 97, - 17, - 164, - 53, - 96, - 224, - 81, - 9, - 130, - 8, - 144, - 80, - 130, - 131, - 97, - 17, - 132, - 53, - 97, - 1, - 0, - 81, - 9, - 130, - 8, - 144, - 80, - 130, - 132, - 130, - 9, - 144, - 80, - 130, - 131, - 97, - 17, - 4, - 53, - 96, - 224, - 81, - 9, - 130, - 8, - 144, - 80, - 130, - 131, - 97, - 16, - 228, - 53, - 97, - 1, - 0, - 81, - 9, - 130, - 8, - 144, - 80, - 130, - 132, - 130, - 9, - 144, - 80, - 130, - 131, - 97, - 16, - 100, - 53, - 96, - 224, - 81, - 9, - 130, - 8, - 144, - 80, - 130, - 131, - 97, - 16, - 68, - 53, - 97, - 1, - 0, - 81, - 9, - 130, - 8, - 144, - 80, - 130, - 97, - 4, - 128, - 81, - 130, - 9, - 97, - 5, - 0, - 82, - 80, - 96, - 32, - 81, - 97, - 5, - 32, - 82, - 96, - 64, - 81, - 96, - 96, - 81, - 144, - 147, - 80, - 130, - 144, - 132, - 8, - 146, - 80, - 129, - 96, - 128, - 81, - 132, - 8, - 97, - 5, - 64, - 82, - 96, - 160, - 81, - 96, - 192, - 81, - 144, - 147, - 80, - 130, - 144, - 132, - 8, - 97, - 5, - 96, - 82, - 96, - 224, - 81, - 97, - 1, - 0, - 81, - 144, - 147, - 80, - 130, - 144, - 132, - 8, - 97, - 5, - 128, - 82, - 96, - 0, - 146, - 80, - 96, - 128, - 97, - 5, - 32, - 91, - 129, - 133, - 16, - 21, - 97, - 26, - 20, - 87, - 128, - 81, - 133, - 82, - 96, - 32, - 148, - 133, - 1, - 148, - 1, - 97, - 25, - 252, - 86, - 91, - 80, - 80, - 97, - 26, - 36, - 130, - 96, - 128, - 96, - 0, - 132, - 97, - 0, - 196, - 86, - 91, - 144, - 80, - 129, - 97, - 5, - 0, - 81, - 96, - 96, - 81, - 9, - 146, - 80, - 96, - 64, - 96, - 128, - 97, - 4, - 224, - 91, - 129, - 131, - 16, - 21, - 97, - 26, - 98, - 87, - 132, - 97, - 15, - 192, - 81, - 135, - 9, - 149, - 80, - 132, - 133, - 130, - 81, - 133, - 81, - 9, - 135, - 8, - 149, - 80, - 96, - 31, - 25, - 146, - 131, - 1, - 146, - 1, - 97, - 26, - 57, - 86, - 91, - 80, - 80, - 80, - 130, - 97, - 17, - 160, - 82, - 97, - 15, - 192, - 81, - 146, - 80, - 97, - 10, - 132, - 53, - 96, - 0, - 82, - 97, - 10, - 164, - 53, - 96, - 32, - 82, - 97, - 26, - 139, - 97, - 15, - 160, - 81, - 130, - 97, - 1, - 162, - 86, - 91, - 144, - 80, - 97, - 26, - 158, - 97, - 17, - 128, - 81, - 97, - 17, - 96, - 81, - 131, - 97, - 1, - 130, - 86, - 91, - 144, - 80, - 97, - 14, - 192, - 97, - 12, - 0, - 91, - 129, - 129, - 16, - 21, - 97, - 26, - 219, - 87, - 97, - 26, - 188, - 97, - 15, - 160, - 81, - 132, - 97, - 1, - 162, - 86, - 91, - 146, - 80, - 97, - 26, - 206, - 96, - 32, - 131, - 1, - 81, - 131, - 81, - 133, - 97, - 1, - 130, - 86, - 91, - 146, - 80, - 96, - 64, - 130, - 3, - 145, - 80, - 97, - 26, - 167, - 86, - 91, - 80, - 80, - 97, - 26, - 234, - 97, - 15, - 160, - 81, - 130, - 97, - 1, - 162, - 86, - 91, - 144, - 80, - 97, - 26, - 253, - 97, - 7, - 36, - 53, - 97, - 7, - 4, - 53, - 131, - 97, - 1, - 130, - 86, - 91, - 144, - 80, - 97, - 27, - 12, - 97, - 15, - 160, - 81, - 130, - 97, - 1, - 162, - 86, - 91, - 144, - 80, - 97, - 27, - 31, - 97, - 6, - 164, - 53, - 97, - 6, - 132, - 53, - 131, - 97, - 1, - 130, - 86, - 91, - 144, - 80, - 97, - 27, - 46, - 97, - 15, - 160, - 81, - 130, - 97, - 1, - 162, - 86, - 91, - 144, - 80, - 97, - 27, - 65, - 97, - 6, - 36, - 53, - 97, - 6, - 4, - 53, - 131, - 97, - 1, - 130, - 86, - 91, - 144, - 80, - 97, - 27, - 80, - 97, - 15, - 160, - 81, - 130, - 97, - 1, - 162, - 86, - 91, - 144, - 80, - 97, - 27, - 99, - 97, - 5, - 164, - 53, - 97, - 5, - 132, - 53, - 131, - 97, - 1, - 130, - 86, - 91, - 144, - 80, - 97, - 27, - 114, - 97, - 15, - 160, - 81, - 130, - 97, - 1, - 162, - 86, - 91, - 144, - 80, - 97, - 27, - 133, - 97, - 5, - 36, - 53, - 97, - 5, - 4, - 53, - 131, - 97, - 1, - 130, - 86, - 91, - 144, - 80, - 97, - 27, - 148, - 97, - 15, - 160, - 81, - 130, - 97, - 1, - 162, - 86, - 91, - 144, - 80, - 97, - 27, - 167, - 97, - 4, - 164, - 53, - 97, - 4, - 132, - 53, - 131, - 97, - 1, - 130, - 86, - 91, - 144, - 80, - 97, - 27, - 182, - 97, - 15, - 160, - 81, - 130, - 97, - 1, - 162, - 86, - 91, - 144, - 80, - 97, - 27, - 201, - 97, - 4, - 36, - 53, - 97, - 4, - 4, - 53, - 131, - 97, - 1, - 130, - 86, - 91, - 144, - 80, - 97, - 27, - 216, - 97, - 15, - 160, - 81, - 130, - 97, - 1, - 162, - 86, - 91, - 144, - 80, - 97, - 27, - 235, - 97, - 3, - 164, - 53, - 97, - 3, - 132, - 53, - 131, - 97, - 1, - 130, - 86, - 91, - 144, - 80, - 97, - 27, - 250, - 97, - 15, - 160, - 81, - 130, - 97, - 1, - 162, - 86, - 91, - 144, - 80, - 97, - 28, - 13, - 97, - 1, - 36, - 53, - 97, - 1, - 4, - 53, - 131, - 97, - 1, - 130, - 86, - 91, - 144, - 80, - 97, - 3, - 4, - 97, - 2, - 4, - 91, - 129, - 129, - 16, - 21, - 97, - 28, - 74, - 87, - 97, - 28, - 43, - 97, - 15, - 160, - 81, - 132, - 97, - 1, - 162, - 86, - 91, - 146, - 80, - 97, - 28, - 61, - 96, - 32, - 131, - 1, - 53, - 131, - 53, - 133, - 97, - 1, - 130, - 86, - 91, - 146, - 80, - 96, - 64, - 130, - 3, - 145, - 80, - 97, - 28, - 22, - 86, - 91, - 80, - 80, - 97, - 28, - 89, - 97, - 15, - 160, - 81, - 130, - 97, - 1, - 162, - 86, - 91, - 144, - 80, - 97, - 28, - 106, - 96, - 228, - 53, - 96, - 196, - 53, - 131, - 97, - 1, - 130, - 86, - 91, - 144, - 80, - 97, - 2, - 4, - 97, - 1, - 4, - 91, - 129, - 129, - 16, - 21, - 97, - 28, - 167, - 87, - 97, - 28, - 136, - 97, - 15, - 160, - 81, - 132, - 97, - 1, - 162, - 86, - 91, - 146, - 80, - 97, - 28, - 154, - 96, - 32, - 131, - 1, - 53, - 131, - 53, - 133, - 97, - 1, - 130, - 86, - 91, - 146, - 80, - 96, - 64, - 130, - 3, - 145, - 80, - 97, - 28, - 115, - 86, - 91, - 80, - 80, - 97, - 8, - 4, - 53, - 96, - 128, - 82, - 97, - 8, - 36, - 53, - 96, - 160, - 82, - 97, - 7, - 196, - 97, - 7, - 4, - 91, - 129, - 129, - 16, - 21, - 97, - 28, - 242, - 87, - 97, - 28, - 211, - 97, - 15, - 160, - 81, - 132, - 97, - 1, - 220, - 86, - 91, - 146, - 80, - 97, - 28, - 229, - 96, - 32, - 131, - 1, - 53, - 131, - 53, - 133, - 97, - 1, - 189, - 86, - 91, - 146, - 80, - 96, - 64, - 130, - 3, - 145, - 80, - 97, - 28, - 190, - 86, - 91, - 80, - 80, - 97, - 29, - 4, - 130, - 97, - 4, - 64, - 81, - 133, - 9, - 130, - 97, - 1, - 220, - 86, - 91, - 144, - 80, - 97, - 29, - 21, - 96, - 160, - 81, - 96, - 128, - 81, - 131, - 97, - 1, - 130, - 86, - 91, - 144, - 80, - 129, - 97, - 15, - 192, - 81, - 132, - 9, - 146, - 80, - 97, - 10, - 68, - 53, - 96, - 128, - 82, - 97, - 10, - 100, - 53, - 96, - 160, - 82, - 97, - 10, - 4, - 97, - 8, - 4, - 91, - 129, - 129, - 16, - 21, - 97, - 29, - 105, - 87, - 97, - 29, - 74, - 97, - 15, - 160, - 81, - 132, - 97, - 1, - 220, - 86, - 91, - 146, - 80, - 97, - 29, - 92, - 96, - 32, - 131, - 1, - 53, - 131, - 53, - 133, - 97, - 1, - 189, - 86, - 91, - 146, - 80, - 96, - 64, - 130, - 3, - 145, - 80, - 97, - 29, - 53, - 86, - 91, - 80, - 80, - 97, - 29, - 123, - 130, - 97, - 4, - 96, - 81, - 133, - 9, - 130, - 97, - 1, - 220, - 86, - 91, - 144, - 80, - 97, - 29, - 140, - 96, - 160, - 81, - 96, - 128, - 81, - 131, - 97, - 1, - 130, - 86, - 91, - 144, - 80, - 129, - 97, - 15, - 192, - 81, - 132, - 9, - 146, - 80, - 97, - 6, - 196, - 53, - 96, - 128, - 82, - 97, - 6, - 228, - 53, - 96, - 160, - 82, - 97, - 29, - 178, - 97, - 15, - 160, - 81, - 130, - 97, - 1, - 220, - 86, - 91, - 144, - 80, - 97, - 29, - 197, - 97, - 6, - 100, - 53, - 97, - 6, - 68, - 53, - 131, - 97, - 1, - 189, - 86, - 91, - 144, - 80, - 97, - 29, - 212, - 97, - 15, - 160, - 81, - 130, - 97, - 1, - 220, - 86, - 91, - 144, - 80, - 97, - 29, - 231, - 97, - 5, - 228, - 53, - 97, - 5, - 196, - 53, - 131, - 97, - 1, - 189, - 86, - 91, - 144, - 80, - 97, - 29, - 246, - 97, - 15, - 160, - 81, - 130, - 97, - 1, - 220, - 86, - 91, - 144, - 80, - 97, - 30, - 9, - 97, - 5, - 100, - 53, - 97, - 5, - 68, - 53, - 131, - 97, - 1, - 189, - 86, - 91, - 144, - 80, - 97, - 30, - 24, - 97, - 15, - 160, - 81, - 130, - 97, - 1, - 220, - 86, - 91, - 144, - 80, - 97, - 30, - 43, - 97, - 4, - 228, - 53, - 97, - 4, - 196, - 53, - 131, - 97, - 1, - 189, - 86, - 91, - 144, - 80, - 97, - 30, - 58, - 97, - 15, - 160, - 81, - 130, - 97, - 1, - 220, - 86, - 91, - 144, - 80, - 97, - 30, - 77, - 97, - 4, - 100, - 53, - 97, - 4, - 68, - 53, - 131, - 97, - 1, - 189, - 86, - 91, - 144, - 80, - 97, - 30, - 92, - 97, - 15, - 160, - 81, - 130, - 97, - 1, - 220, - 86, - 91, - 144, - 80, - 97, - 30, - 111, - 97, - 3, - 228, - 53, - 97, - 3, - 196, - 53, - 131, - 97, - 1, - 189, - 86, - 91, - 144, - 80, - 97, - 30, - 126, - 97, - 15, - 160, - 81, - 130, - 97, - 1, - 220, - 86, - 91, - 144, - 80, - 97, - 30, - 145, - 97, - 3, - 100, - 53, - 97, - 3, - 68, - 53, - 131, - 97, - 1, - 189, - 86, - 91, - 144, - 80, - 97, - 30, - 163, - 130, - 97, - 4, - 128, - 81, - 133, - 9, - 130, - 97, - 1, - 220, - 86, - 91, - 144, - 80, - 97, - 30, - 180, - 96, - 160, - 81, - 96, - 128, - 81, - 131, - 97, - 1, - 130, - 86, - 91, - 144, - 80, - 97, - 11, - 0, - 81, - 96, - 128, - 82, - 97, - 11, - 32, - 81, - 96, - 160, - 82, - 97, - 30, - 211, - 97, - 17, - 160, - 81, - 131, - 3, - 130, - 97, - 1, - 220, - 86, - 91, - 144, - 80, - 97, - 30, - 228, - 96, - 160, - 81, - 96, - 128, - 81, - 131, - 97, - 1, - 130, - 86, - 91, - 144, - 80, - 97, - 21, - 4, - 53, - 96, - 128, - 82, - 97, - 21, - 36, - 53, - 96, - 160, - 82, - 97, - 31, - 3, - 97, - 4, - 0, - 81, - 131, - 3, - 130, - 97, - 1, - 220, - 86, - 91, - 144, - 80, - 97, - 31, - 20, - 96, - 160, - 81, - 96, - 128, - 81, - 131, - 97, - 1, - 130, - 86, - 91, - 144, - 80, - 97, - 21, - 68, - 53, - 96, - 128, - 82, - 97, - 21, - 100, - 53, - 96, - 160, - 82, - 97, - 31, - 49, - 97, - 15, - 224, - 81, - 130, - 97, - 1, - 220, - 86, - 91, - 144, - 80, - 97, - 31, - 66, - 96, - 160, - 81, - 96, - 128, - 81, - 131, - 97, - 1, - 130, - 86, - 91, - 144, - 80, - 96, - 0, - 81, - 97, - 17, - 192, - 82, - 96, - 32, - 81, - 97, - 17, - 224, - 82, - 97, - 21, - 68, - 53, - 97, - 18, - 0, - 82, - 97, - 21, - 100, - 53, - 97, - 18, - 32, - 82, - 97, - 10, - 128, - 81, - 21, - 97, - 32, - 22, - 87, - 97, - 16, - 0, - 81, - 96, - 0, - 82, - 97, - 16, - 32, - 81, - 96, - 32, - 82, - 97, - 16, - 64, - 81, - 96, - 64, - 82, - 97, - 16, - 96, - 81, - 96, - 96, - 82, - 97, - 17, - 192, - 81, - 96, - 128, - 82, - 97, - 17, - 224, - 81, - 96, - 160, - 82, - 97, - 18, - 0, - 81, - 96, - 192, - 82, - 97, - 18, - 32, - 81, - 96, - 224, - 82, - 129, - 97, - 1, - 0, - 96, - 0, - 32, - 6, - 146, - 80, - 97, - 31, - 183, - 131, - 130, - 97, - 1, - 162, - 86, - 91, - 144, - 80, - 97, - 31, - 202, - 97, - 17, - 224, - 81, - 97, - 17, - 192, - 81, - 131, - 97, - 1, - 130, - 86, - 91, - 144, - 80, - 96, - 0, - 81, - 97, - 17, - 192, - 82, - 96, - 32, - 81, - 97, - 17, - 224, - 82, - 97, - 16, - 64, - 81, - 96, - 0, - 82, - 97, - 16, - 96, - 81, - 96, - 32, - 82, - 97, - 31, - 242, - 131, - 130, - 97, - 1, - 162, - 86, - 91, - 144, - 80, - 97, - 32, - 5, - 97, - 18, - 32, - 81, - 97, - 18, - 0, - 81, - 131, - 97, - 1, - 130, - 86, - 91, - 144, - 80, - 96, - 0, - 81, - 97, - 18, - 0, - 82, - 96, - 32, - 81, - 97, - 18, - 32, - 82, - 91, - 97, - 32, - 47, - 97, - 18, - 32, - 81, - 97, - 18, - 0, - 81, - 97, - 17, - 224, - 81, - 97, - 17, - 192, - 81, - 133, - 97, - 1, - 247, - 86, - 91, - 144, - 80, - 128, - 97, - 32, - 59, - 87, - 96, - 0, - 128, - 253, - 91, - 80, - 80, - 80, - 96, - 1, - 96, - 0, - 82, - 96, - 32, - 96, - 0, - 243, - 91, - 96, - 0, - 128, - 131, - 96, - 31, - 132, - 1, - 18, - 97, - 32, - 91, - 87, - 96, - 0, - 128, - 253, - 91, - 80, - 129, - 53, - 103, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 129, - 17, - 21, - 97, - 32, - 115, - 87, - 96, - 0, - 128, - 253, - 91, - 96, - 32, - 131, - 1, - 145, - 80, - 131, - 96, - 32, - 130, - 96, - 5, - 27, - 133, - 1, - 1, - 17, - 21, - 97, - 32, - 142, - 87, - 96, - 0, - 128, - 253, - 91, - 146, - 80, - 146, - 144, - 80, - 86, - 91, - 96, - 0, - 128, - 96, - 0, - 128, - 96, - 0, - 96, - 96, - 134, - 136, - 3, - 18, - 21, - 97, - 32, - 173, - 87, - 96, - 0, - 128, - 253, - 91, - 133, - 53, - 96, - 1, - 96, - 1, - 96, - 160, - 27, - 3, - 129, - 22, - 129, - 20, - 97, - 32, - 196, - 87, - 96, - 0, - 128, - 253, - 91, - 148, - 80, - 96, - 32, - 134, - 1, - 53, - 103, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 128, - 130, - 17, - 21, - 97, - 32, - 225, - 87, - 96, - 0, - 128, - 253, - 91, - 129, - 136, - 1, - 145, - 80, - 136, - 96, - 31, - 131, - 1, - 18, - 97, - 32, - 245, - 87, - 96, - 0, - 128, - 253, - 91, - 129, - 53, - 129, - 129, - 17, - 21, - 97, - 33, - 4, - 87, - 96, - 0, - 128, - 253, - 91, - 137, - 96, - 32, - 130, - 133, - 1, - 1, - 17, - 21, - 97, - 33, - 22, - 87, - 96, - 0, - 128, - 253, - 91, - 96, - 32, - 131, - 1, - 150, - 80, - 128, - 149, - 80, - 80, - 96, - 64, - 136, - 1, - 53, - 145, - 80, - 128, - 130, - 17, - 21, - 97, - 33, - 52, - 87, - 96, - 0, - 128, - 253, - 91, - 80, - 97, - 33, - 65, - 136, - 130, - 137, - 1, - 97, - 32, - 73, - 86, - 91, - 150, - 153, - 149, - 152, - 80, - 147, - 150, - 80, - 146, - 148, - 147, - 146, - 80, - 80, - 80, - 86, - 254, - 162, - 100, - 105, - 112, - 102, - 115, - 88, - 34, - 18, - 32, - 105, - 128, - 67, - 95, - 149, - 145, - 57, - 3, - 120, - 226, - 85, - 244, - 2, - 110, - 235, - 66, - 197, - 104, - 20, - 17, - 79, - 158, - 75, - 15, - 168, - 250, - 111, - 156, - 91, - 173, - 236, - 91, - 100, - 115, - 111, - 108, - 99, - 67, - 0, - 8, - 18, - 0, - 51, - ]; - ///The deployed bytecode of the contract. - pub static VERIFIER_DEPLOYED_BYTECODE: ::ethers::core::types::Bytes = ::ethers::core::types::Bytes::from_static( - __DEPLOYED_BYTECODE, - ); - pub struct Verifier(::ethers::contract::Contract); - impl ::core::clone::Clone for Verifier { - fn clone(&self) -> Self { - Self(::core::clone::Clone::clone(&self.0)) - } - } - impl ::core::ops::Deref for Verifier { - type Target = ::ethers::contract::Contract; - fn deref(&self) -> &Self::Target { - &self.0 - } - } - impl ::core::ops::DerefMut for Verifier { - fn deref_mut(&mut self) -> &mut Self::Target { - &mut self.0 - } - } - impl ::core::fmt::Debug for Verifier { - fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { - f.debug_tuple(stringify!(Verifier)).field(&self.address()).finish() - } - } - impl Verifier { - /// Creates a new contract instance with the specified `ethers` client at - /// `address`. The contract derefs to a `ethers::Contract` object. - pub fn new>( - address: T, - client: ::std::sync::Arc, - ) -> Self { - Self( - ::ethers::contract::Contract::new( - address.into(), - VERIFIER_ABI.clone(), - client, - ), - ) - } - /// Constructs the general purpose `Deployer` instance based on the provided constructor arguments and sends it. - /// Returns a new instance of a deployer that returns an instance of this contract after sending the transaction - /// - /// Notes: - /// - If there are no constructor arguments, you should pass `()` as the argument. - /// - The default poll duration is 7 seconds. - /// - The default number of confirmations is 1 block. - /// - /// - /// # Example - /// - /// Generate contract bindings with `abigen!` and deploy a new contract instance. - /// - /// *Note*: this requires a `bytecode` and `abi` object in the `greeter.json` artifact. - /// - /// ```ignore - /// # async fn deploy(client: ::std::sync::Arc) { - /// abigen!(Greeter, "../greeter.json"); - /// - /// let greeter_contract = Greeter::deploy(client, "Hello world!".to_string()).unwrap().send().await.unwrap(); - /// let msg = greeter_contract.greet().call().await.unwrap(); - /// # } - /// ``` - pub fn deploy( - client: ::std::sync::Arc, - constructor_args: T, - ) -> ::core::result::Result< - ::ethers::contract::builders::ContractDeployer, - ::ethers::contract::ContractError, - > { - let factory = ::ethers::contract::ContractFactory::new( - VERIFIER_ABI.clone(), - VERIFIER_BYTECODE.clone().into(), - client, - ); - let deployer = factory.deploy(constructor_args)?; - let deployer = ::ethers::contract::ContractDeployer::new(deployer); - Ok(deployer) - } - ///Calls the contract's `verifyProof` (0xaf83a18d) function - pub fn verify_proof( - &self, - vk: ::ethers::core::types::Address, - proof: ::ethers::core::types::Bytes, - instances: ::std::vec::Vec<::ethers::core::types::U256>, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([175, 131, 161, 141], (vk, proof, instances)) - .expect("method not found (this should never happen)") - } - } - impl From<::ethers::contract::Contract> - for Verifier { - fn from(contract: ::ethers::contract::Contract) -> Self { - Self::new(contract.address(), contract.client()) - } - } - ///Container type for all input parameters for the `verifyProof` function with signature `verifyProof(address,bytes,uint256[])` and selector `0xaf83a18d` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethcall(name = "verifyProof", abi = "verifyProof(address,bytes,uint256[])")] - pub struct VerifyProofCall { - pub vk: ::ethers::core::types::Address, - pub proof: ::ethers::core::types::Bytes, - pub instances: ::std::vec::Vec<::ethers::core::types::U256>, - } - ///Container type for all return fields from the `verifyProof` function with signature `verifyProof(address,bytes,uint256[])` and selector `0xaf83a18d` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - pub struct VerifyProofReturn(pub bool); -} diff --git a/backend/src/contracts/generated/summa_contract.rs b/backend/src/contracts/generated/summa_contract.rs deleted file mode 100644 index 89f23fc9..00000000 --- a/backend/src/contracts/generated/summa_contract.rs +++ /dev/null @@ -1,19125 +0,0 @@ -pub use summa::*; -/// This module was auto-generated with ethers-rs Abigen. -/// More information at: -#[allow( - clippy::enum_variant_names, - clippy::too_many_arguments, - clippy::upper_case_acronyms, - clippy::type_complexity, - dead_code, - non_camel_case_types, -)] -pub mod summa { - #[rustfmt::skip] - const __ABI: &str = "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_verifyingKey\",\"type\":\"address\",\"components\":[]},{\"internalType\":\"contract IVerifier\",\"name\":\"_polynomialInterpolationVerifier\",\"type\":\"address\",\"components\":[]},{\"internalType\":\"contract IVerifier\",\"name\":\"_grandSumVerifier\",\"type\":\"address\",\"components\":[]},{\"internalType\":\"contract IInclusionVerifier\",\"name\":\"_inclusionVerifier\",\"type\":\"address\",\"components\":[]},{\"internalType\":\"string[]\",\"name\":\"cryptocurrencyNames\",\"type\":\"string[]\",\"components\":[]},{\"internalType\":\"string[]\",\"name\":\"cryptocurrencyChains\",\"type\":\"string[]\",\"components\":[]},{\"internalType\":\"uint8\",\"name\":\"balanceByteRange\",\"type\":\"uint8\",\"components\":[]}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\",\"outputs\":[]},{\"inputs\":[{\"internalType\":\"struct Summa.AddressOwnershipProof[]\",\"name\":\"addressOwnershipProofs\",\"type\":\"tuple[]\",\"components\":[{\"internalType\":\"string\",\"name\":\"cexAddress\",\"type\":\"string\",\"components\":[]},{\"internalType\":\"string\",\"name\":\"chain\",\"type\":\"string\",\"components\":[]},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\",\"components\":[]},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\",\"components\":[]}],\"indexed\":false}],\"type\":\"event\",\"name\":\"AddressOwnershipProofSubmitted\",\"outputs\":[],\"anonymous\":false},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\",\"components\":[],\"indexed\":true},{\"internalType\":\"uint256[]\",\"name\":\"totalBalances\",\"type\":\"uint256[]\",\"components\":[],\"indexed\":false},{\"internalType\":\"bytes\",\"name\":\"snarkProof\",\"type\":\"bytes\",\"components\":[],\"indexed\":false},{\"internalType\":\"bytes\",\"name\":\"grandSumProof\",\"type\":\"bytes\",\"components\":[],\"indexed\":false}],\"type\":\"event\",\"name\":\"LiabilitiesCommitmentSubmitted\",\"outputs\":[],\"anonymous\":false},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\",\"components\":[],\"indexed\":true},{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\",\"components\":[],\"indexed\":true}],\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"outputs\":[],\"anonymous\":false},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\",\"components\":[]}],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"addressOwnershipProofs\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"cexAddress\",\"type\":\"string\",\"components\":[]},{\"internalType\":\"string\",\"name\":\"chain\",\"type\":\"string\",\"components\":[]},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\",\"components\":[]},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\",\"components\":[]}]},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\",\"components\":[]}],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"commitments\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\",\"components\":[]}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"config\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"balanceByteRange\",\"type\":\"uint8\",\"components\":[]}]},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"addressHash\",\"type\":\"bytes32\",\"components\":[]}],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"getAddressOwnershipProof\",\"outputs\":[{\"internalType\":\"struct Summa.AddressOwnershipProof\",\"name\":\"\",\"type\":\"tuple\",\"components\":[{\"internalType\":\"string\",\"name\":\"cexAddress\",\"type\":\"string\",\"components\":[]},{\"internalType\":\"string\",\"name\":\"chain\",\"type\":\"string\",\"components\":[]},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\",\"components\":[]},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\",\"components\":[]}]}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\",\"components\":[]}]},{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\",\"name\":\"renounceOwnership\",\"outputs\":[]},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"snarkProof\",\"type\":\"bytes\",\"components\":[]},{\"internalType\":\"bytes\",\"name\":\"grandSumProof\",\"type\":\"bytes\",\"components\":[]},{\"internalType\":\"uint256[]\",\"name\":\"totalBalances\",\"type\":\"uint256[]\",\"components\":[]},{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\",\"components\":[]}],\"stateMutability\":\"nonpayable\",\"type\":\"function\",\"name\":\"submitCommitment\",\"outputs\":[]},{\"inputs\":[{\"internalType\":\"struct Summa.AddressOwnershipProof[]\",\"name\":\"_addressOwnershipProofs\",\"type\":\"tuple[]\",\"components\":[{\"internalType\":\"string\",\"name\":\"cexAddress\",\"type\":\"string\",\"components\":[]},{\"internalType\":\"string\",\"name\":\"chain\",\"type\":\"string\",\"components\":[]},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\",\"components\":[]},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\",\"components\":[]}]}],\"stateMutability\":\"nonpayable\",\"type\":\"function\",\"name\":\"submitProofOfAddressOwnership\",\"outputs\":[]},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\",\"components\":[]}],\"stateMutability\":\"nonpayable\",\"type\":\"function\",\"name\":\"transferOwnership\",\"outputs\":[]},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\",\"components\":[]},{\"internalType\":\"bytes\",\"name\":\"inclusionProof\",\"type\":\"bytes\",\"components\":[]},{\"internalType\":\"uint256[]\",\"name\":\"challenges\",\"type\":\"uint256[]\",\"components\":[]},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\",\"components\":[]}],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"verifyInclusionProof\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\",\"components\":[]}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"verifyingKey\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\",\"components\":[]}]}]"; - ///The parsed JSON ABI of the contract. - pub static SUMMA_ABI: ::ethers::contract::Lazy<::ethers::core::abi::Abi> = ::ethers::contract::Lazy::new(|| - ::ethers::core::utils::__serde_json::from_str(__ABI).expect("ABI is always valid")); - #[rustfmt::skip] - const __BYTECODE: &[u8] = &[ - 97, - 1, - 0, - 96, - 64, - 82, - 52, - 128, - 21, - 98, - 0, - 0, - 18, - 87, - 96, - 0, - 128, - 253, - 91, - 80, - 96, - 64, - 81, - 98, - 0, - 41, - 0, - 56, - 3, - 128, - 98, - 0, - 41, - 0, - 131, - 57, - 129, - 1, - 96, - 64, - 129, - 144, - 82, - 98, - 0, - 0, - 53, - 145, - 98, - 0, - 7, - 91, - 86, - 91, - 98, - 0, - 0, - 64, - 51, - 98, - 0, - 4, - 42, - 86, - 91, - 96, - 1, - 96, - 1, - 96, - 160, - 27, - 3, - 135, - 22, - 98, - 0, - 0, - 156, - 87, - 96, - 64, - 81, - 98, - 70, - 27, - 205, - 96, - 229, - 27, - 129, - 82, - 96, - 32, - 96, - 4, - 130, - 1, - 82, - 96, - 29, - 96, - 36, - 130, - 1, - 82, - 127, - 73, - 110, - 118, - 97, - 108, - 105, - 100, - 32, - 118, - 101, - 114, - 105, - 102, - 121, - 105, - 110, - 103, - 32, - 107, - 101, - 121, - 32, - 97, - 100, - 100, - 114, - 101, - 115, - 115, - 0, - 0, - 0, - 96, - 68, - 130, - 1, - 82, - 96, - 100, - 1, - 91, - 96, - 64, - 81, - 128, - 145, - 3, - 144, - 253, - 91, - 96, - 1, - 96, - 1, - 96, - 160, - 27, - 3, - 135, - 22, - 96, - 128, - 82, - 129, - 81, - 131, - 81, - 20, - 98, - 0, - 1, - 20, - 87, - 96, - 64, - 81, - 98, - 70, - 27, - 205, - 96, - 229, - 27, - 129, - 82, - 96, - 32, - 96, - 4, - 130, - 1, - 82, - 96, - 47, - 96, - 36, - 130, - 1, - 82, - 127, - 67, - 114, - 121, - 112, - 116, - 111, - 99, - 117, - 114, - 114, - 101, - 110, - 99, - 121, - 32, - 110, - 97, - 109, - 101, - 115, - 32, - 97, - 110, - 100, - 32, - 99, - 104, - 97, - 105, - 110, - 115, - 32, - 96, - 68, - 130, - 1, - 82, - 110, - 13, - 206, - 173, - 172, - 76, - 174, - 68, - 13, - 173, - 46, - 109, - 172, - 46, - 140, - 109, - 96, - 139, - 27, - 96, - 100, - 130, - 1, - 82, - 96, - 132, - 1, - 98, - 0, - 0, - 147, - 86, - 91, - 96, - 0, - 91, - 131, - 81, - 129, - 16, - 21, - 98, - 0, - 1, - 209, - 87, - 131, - 129, - 129, - 81, - 129, - 16, - 98, - 0, - 1, - 54, - 87, - 98, - 0, - 1, - 54, - 98, - 0, - 8, - 55, - 86, - 91, - 96, - 32, - 2, - 96, - 32, - 1, - 1, - 81, - 81, - 96, - 0, - 20, - 21, - 128, - 21, - 98, - 0, - 1, - 110, - 87, - 80, - 130, - 129, - 129, - 81, - 129, - 16, - 98, - 0, - 1, - 96, - 87, - 98, - 0, - 1, - 96, - 98, - 0, - 8, - 55, - 86, - 91, - 96, - 32, - 2, - 96, - 32, - 1, - 1, - 81, - 81, - 96, - 0, - 20, - 21, - 91, - 98, - 0, - 1, - 188, - 87, - 96, - 64, - 81, - 98, - 70, - 27, - 205, - 96, - 229, - 27, - 129, - 82, - 96, - 32, - 96, - 4, - 130, - 1, - 82, - 96, - 22, - 96, - 36, - 130, - 1, - 82, - 127, - 73, - 110, - 118, - 97, - 108, - 105, - 100, - 32, - 99, - 114, - 121, - 112, - 116, - 111, - 99, - 117, - 114, - 114, - 101, - 110, - 99, - 121, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 96, - 68, - 130, - 1, - 82, - 96, - 100, - 1, - 98, - 0, - 0, - 147, - 86, - 91, - 128, - 98, - 0, - 1, - 200, - 129, - 98, - 0, - 8, - 99, - 86, - 91, - 145, - 80, - 80, - 98, - 0, - 1, - 23, - 86, - 91, - 80, - 98, - 0, - 1, - 230, - 135, - 132, - 81, - 131, - 98, - 0, - 4, - 122, - 96, - 32, - 27, - 96, - 32, - 28, - 86, - 91, - 98, - 0, - 2, - 90, - 87, - 96, - 64, - 81, - 98, - 70, - 27, - 205, - 96, - 229, - 27, - 129, - 82, - 96, - 32, - 96, - 4, - 130, - 1, - 82, - 96, - 60, - 96, - 36, - 130, - 1, - 82, - 127, - 84, - 104, - 101, - 32, - 99, - 111, - 110, - 102, - 105, - 103, - 32, - 112, - 97, - 114, - 97, - 109, - 101, - 116, - 101, - 114, - 115, - 32, - 100, - 111, - 32, - 110, - 111, - 116, - 32, - 99, - 111, - 114, - 96, - 68, - 130, - 1, - 82, - 127, - 114, - 101, - 115, - 112, - 111, - 110, - 100, - 32, - 116, - 111, - 32, - 116, - 104, - 101, - 32, - 118, - 101, - 114, - 105, - 102, - 121, - 105, - 110, - 103, - 32, - 107, - 101, - 121, - 0, - 0, - 0, - 0, - 96, - 100, - 130, - 1, - 82, - 96, - 132, - 1, - 98, - 0, - 0, - 147, - 86, - 91, - 96, - 1, - 96, - 1, - 96, - 160, - 27, - 3, - 134, - 22, - 98, - 0, - 2, - 204, - 87, - 96, - 64, - 81, - 98, - 70, - 27, - 205, - 96, - 229, - 27, - 129, - 82, - 96, - 32, - 96, - 4, - 130, - 1, - 82, - 96, - 49, - 96, - 36, - 130, - 1, - 82, - 127, - 73, - 110, - 118, - 97, - 108, - 105, - 100, - 32, - 112, - 111, - 108, - 121, - 110, - 111, - 109, - 105, - 97, - 108, - 32, - 105, - 110, - 116, - 101, - 114, - 112, - 111, - 108, - 97, - 116, - 105, - 111, - 110, - 96, - 68, - 130, - 1, - 82, - 112, - 32, - 118, - 101, - 114, - 105, - 102, - 105, - 101, - 114, - 32, - 97, - 100, - 100, - 114, - 101, - 115, - 115, - 96, - 120, - 27, - 96, - 100, - 130, - 1, - 82, - 96, - 132, - 1, - 98, - 0, - 0, - 147, - 86, - 91, - 96, - 1, - 96, - 1, - 96, - 160, - 27, - 3, - 128, - 135, - 22, - 96, - 160, - 82, - 133, - 22, - 98, - 0, - 3, - 53, - 87, - 96, - 64, - 81, - 98, - 70, - 27, - 205, - 96, - 229, - 27, - 129, - 82, - 96, - 32, - 96, - 4, - 130, - 1, - 82, - 96, - 34, - 96, - 36, - 130, - 1, - 82, - 127, - 73, - 110, - 118, - 97, - 108, - 105, - 100, - 32, - 103, - 114, - 97, - 110, - 100, - 32, - 115, - 117, - 109, - 32, - 118, - 101, - 114, - 105, - 102, - 105, - 101, - 114, - 32, - 97, - 100, - 100, - 114, - 101, - 96, - 68, - 130, - 1, - 82, - 97, - 115, - 115, - 96, - 240, - 27, - 96, - 100, - 130, - 1, - 82, - 96, - 132, - 1, - 98, - 0, - 0, - 147, - 86, - 91, - 96, - 1, - 96, - 1, - 96, - 160, - 27, - 3, - 128, - 134, - 22, - 96, - 192, - 82, - 132, - 22, - 98, - 0, - 3, - 158, - 87, - 96, - 64, - 81, - 98, - 70, - 27, - 205, - 96, - 229, - 27, - 129, - 82, - 96, - 32, - 96, - 4, - 130, - 1, - 82, - 96, - 34, - 96, - 36, - 130, - 1, - 82, - 127, - 73, - 110, - 118, - 97, - 108, - 105, - 100, - 32, - 105, - 110, - 99, - 108, - 117, - 115, - 105, - 111, - 110, - 32, - 118, - 101, - 114, - 105, - 102, - 105, - 101, - 114, - 32, - 97, - 100, - 100, - 114, - 101, - 96, - 68, - 130, - 1, - 82, - 97, - 115, - 115, - 96, - 240, - 27, - 96, - 100, - 130, - 1, - 82, - 96, - 132, - 1, - 98, - 0, - 0, - 147, - 86, - 91, - 96, - 1, - 96, - 1, - 96, - 160, - 27, - 3, - 132, - 22, - 96, - 224, - 82, - 96, - 64, - 128, - 81, - 96, - 96, - 129, - 1, - 130, - 82, - 132, - 129, - 82, - 96, - 32, - 128, - 130, - 1, - 133, - 144, - 82, - 96, - 255, - 132, - 22, - 146, - 130, - 1, - 146, - 144, - 146, - 82, - 132, - 81, - 144, - 145, - 96, - 1, - 145, - 98, - 0, - 3, - 227, - 145, - 131, - 145, - 144, - 136, - 1, - 144, - 98, - 0, - 5, - 7, - 86, - 91, - 80, - 96, - 32, - 130, - 129, - 1, - 81, - 128, - 81, - 98, - 0, - 3, - 254, - 146, - 96, - 1, - 133, - 1, - 146, - 1, - 144, - 98, - 0, - 5, - 7, - 86, - 91, - 80, - 96, - 64, - 145, - 144, - 145, - 1, - 81, - 96, - 2, - 144, - 145, - 1, - 128, - 84, - 96, - 255, - 25, - 22, - 96, - 255, - 144, - 146, - 22, - 145, - 144, - 145, - 23, - 144, - 85, - 80, - 98, - 0, - 10, - 87, - 149, - 80, - 80, - 80, - 80, - 80, - 80, - 86, - 91, - 96, - 0, - 128, - 84, - 96, - 1, - 96, - 1, - 96, - 160, - 27, - 3, - 131, - 129, - 22, - 96, - 1, - 96, - 1, - 96, - 160, - 27, - 3, - 25, - 131, - 22, - 129, - 23, - 132, - 85, - 96, - 64, - 81, - 145, - 144, - 146, - 22, - 146, - 131, - 145, - 127, - 139, - 224, - 7, - 156, - 83, - 22, - 89, - 20, - 19, - 68, - 205, - 31, - 208, - 164, - 242, - 132, - 25, - 73, - 127, - 151, - 34, - 163, - 218, - 175, - 227, - 180, - 24, - 111, - 107, - 100, - 87, - 224, - 145, - 144, - 163, - 80, - 80, - 86, - 91, - 96, - 0, - 128, - 131, - 98, - 0, - 4, - 139, - 96, - 2, - 133, - 98, - 0, - 8, - 127, - 86, - 91, - 96, - 255, - 22, - 98, - 0, - 4, - 154, - 145, - 144, - 98, - 0, - 8, - 176, - 86, - 91, - 98, - 0, - 4, - 167, - 144, - 96, - 2, - 98, - 0, - 8, - 208, - 86, - 91, - 144, - 80, - 97, - 2, - 224, - 96, - 0, - 98, - 0, - 4, - 187, - 131, - 96, - 64, - 98, - 0, - 8, - 176, - 86, - 91, - 98, - 0, - 4, - 199, - 144, - 131, - 98, - 0, - 8, - 208, - 86, - 91, - 144, - 80, - 96, - 0, - 98, - 0, - 4, - 216, - 96, - 16, - 131, - 98, - 0, - 8, - 230, - 86, - 91, - 144, - 80, - 96, - 0, - 96, - 32, - 130, - 96, - 0, - 139, - 60, - 80, - 80, - 96, - 0, - 81, - 96, - 1, - 96, - 1, - 96, - 128, - 27, - 3, - 129, - 22, - 21, - 96, - 128, - 145, - 144, - 145, - 28, - 21, - 25, - 22, - 151, - 150, - 80, - 80, - 80, - 80, - 80, - 80, - 80, - 86, - 91, - 130, - 128, - 84, - 130, - 130, - 85, - 144, - 96, - 0, - 82, - 96, - 32, - 96, - 0, - 32, - 144, - 129, - 1, - 146, - 130, - 21, - 98, - 0, - 5, - 82, - 87, - 145, - 96, - 32, - 2, - 130, - 1, - 91, - 130, - 129, - 17, - 21, - 98, - 0, - 5, - 82, - 87, - 130, - 81, - 130, - 144, - 98, - 0, - 5, - 65, - 144, - 130, - 98, - 0, - 9, - 139, - 86, - 91, - 80, - 145, - 96, - 32, - 1, - 145, - 144, - 96, - 1, - 1, - 144, - 98, - 0, - 5, - 40, - 86, - 91, - 80, - 98, - 0, - 5, - 96, - 146, - 145, - 80, - 98, - 0, - 5, - 100, - 86, - 91, - 80, - 144, - 86, - 91, - 128, - 130, - 17, - 21, - 98, - 0, - 5, - 96, - 87, - 96, - 0, - 98, - 0, - 5, - 123, - 130, - 130, - 98, - 0, - 5, - 133, - 86, - 91, - 80, - 96, - 1, - 1, - 98, - 0, - 5, - 100, - 86, - 91, - 80, - 128, - 84, - 98, - 0, - 5, - 147, - 144, - 98, - 0, - 8, - 252, - 86, - 91, - 96, - 0, - 130, - 85, - 128, - 96, - 31, - 16, - 98, - 0, - 5, - 164, - 87, - 80, - 80, - 86, - 91, - 96, - 31, - 1, - 96, - 32, - 144, - 4, - 144, - 96, - 0, - 82, - 96, - 32, - 96, - 0, - 32, - 144, - 129, - 1, - 144, - 98, - 0, - 5, - 196, - 145, - 144, - 98, - 0, - 5, - 199, - 86, - 91, - 80, - 86, - 91, - 91, - 128, - 130, - 17, - 21, - 98, - 0, - 5, - 96, - 87, - 96, - 0, - 129, - 85, - 96, - 1, - 1, - 98, - 0, - 5, - 200, - 86, - 91, - 96, - 1, - 96, - 1, - 96, - 160, - 27, - 3, - 129, - 22, - 129, - 20, - 98, - 0, - 5, - 196, - 87, - 96, - 0, - 128, - 253, - 91, - 99, - 78, - 72, - 123, - 113, - 96, - 224, - 27, - 96, - 0, - 82, - 96, - 65, - 96, - 4, - 82, - 96, - 36, - 96, - 0, - 253, - 91, - 96, - 64, - 81, - 96, - 31, - 130, - 1, - 96, - 31, - 25, - 22, - 129, - 1, - 96, - 1, - 96, - 1, - 96, - 64, - 27, - 3, - 129, - 17, - 130, - 130, - 16, - 23, - 21, - 98, - 0, - 6, - 53, - 87, - 98, - 0, - 6, - 53, - 98, - 0, - 5, - 244, - 86, - 91, - 96, - 64, - 82, - 145, - 144, - 80, - 86, - 91, - 96, - 0, - 96, - 31, - 131, - 129, - 132, - 1, - 18, - 98, - 0, - 6, - 80, - 87, - 96, - 0, - 128, - 253, - 91, - 130, - 81, - 96, - 32, - 96, - 1, - 96, - 1, - 96, - 64, - 27, - 3, - 128, - 131, - 17, - 21, - 98, - 0, - 6, - 111, - 87, - 98, - 0, - 6, - 111, - 98, - 0, - 5, - 244, - 86, - 91, - 130, - 96, - 5, - 27, - 98, - 0, - 6, - 128, - 131, - 130, - 1, - 98, - 0, - 6, - 10, - 86, - 91, - 147, - 132, - 82, - 134, - 129, - 1, - 131, - 1, - 147, - 131, - 129, - 1, - 144, - 137, - 134, - 17, - 21, - 98, - 0, - 6, - 155, - 87, - 96, - 0, - 128, - 253, - 91, - 132, - 137, - 1, - 146, - 80, - 91, - 133, - 131, - 16, - 21, - 98, - 0, - 7, - 78, - 87, - 130, - 81, - 132, - 129, - 17, - 21, - 98, - 0, - 6, - 187, - 87, - 96, - 0, - 128, - 129, - 253, - 91, - 137, - 1, - 96, - 63, - 129, - 1, - 139, - 19, - 98, - 0, - 6, - 206, - 87, - 96, - 0, - 128, - 129, - 253, - 91, - 133, - 129, - 1, - 81, - 133, - 129, - 17, - 21, - 98, - 0, - 6, - 229, - 87, - 98, - 0, - 6, - 229, - 98, - 0, - 5, - 244, - 86, - 91, - 98, - 0, - 6, - 248, - 129, - 138, - 1, - 96, - 31, - 25, - 22, - 136, - 1, - 98, - 0, - 6, - 10, - 86, - 91, - 129, - 129, - 82, - 96, - 64, - 141, - 129, - 132, - 134, - 1, - 1, - 17, - 21, - 98, - 0, - 7, - 16, - 87, - 96, - 0, - 128, - 129, - 253, - 91, - 96, - 0, - 91, - 131, - 129, - 16, - 21, - 98, - 0, - 7, - 48, - 87, - 132, - 129, - 1, - 130, - 1, - 81, - 131, - 130, - 1, - 139, - 1, - 82, - 137, - 1, - 98, - 0, - 7, - 19, - 86, - 91, - 80, - 80, - 96, - 0, - 145, - 129, - 1, - 136, - 1, - 145, - 144, - 145, - 82, - 131, - 82, - 80, - 145, - 132, - 1, - 145, - 144, - 132, - 1, - 144, - 98, - 0, - 6, - 161, - 86, - 91, - 153, - 152, - 80, - 80, - 80, - 80, - 80, - 80, - 80, - 80, - 80, - 86, - 91, - 96, - 0, - 128, - 96, - 0, - 128, - 96, - 0, - 128, - 96, - 0, - 96, - 224, - 136, - 138, - 3, - 18, - 21, - 98, - 0, - 7, - 119, - 87, - 96, - 0, - 128, - 253, - 91, - 135, - 81, - 98, - 0, - 7, - 132, - 129, - 98, - 0, - 5, - 222, - 86, - 91, - 96, - 32, - 137, - 1, - 81, - 144, - 151, - 80, - 98, - 0, - 7, - 151, - 129, - 98, - 0, - 5, - 222, - 86, - 91, - 96, - 64, - 137, - 1, - 81, - 144, - 150, - 80, - 98, - 0, - 7, - 170, - 129, - 98, - 0, - 5, - 222, - 86, - 91, - 96, - 96, - 137, - 1, - 81, - 144, - 149, - 80, - 98, - 0, - 7, - 189, - 129, - 98, - 0, - 5, - 222, - 86, - 91, - 96, - 128, - 137, - 1, - 81, - 144, - 148, - 80, - 96, - 1, - 96, - 1, - 96, - 64, - 27, - 3, - 128, - 130, - 17, - 21, - 98, - 0, - 7, - 219, - 87, - 96, - 0, - 128, - 253, - 91, - 98, - 0, - 7, - 233, - 139, - 131, - 140, - 1, - 98, - 0, - 6, - 61, - 86, - 91, - 148, - 80, - 96, - 160, - 138, - 1, - 81, - 145, - 80, - 128, - 130, - 17, - 21, - 98, - 0, - 8, - 0, - 87, - 96, - 0, - 128, - 253, - 91, - 80, - 98, - 0, - 8, - 15, - 138, - 130, - 139, - 1, - 98, - 0, - 6, - 61, - 86, - 91, - 146, - 80, - 80, - 96, - 192, - 136, - 1, - 81, - 96, - 255, - 129, - 22, - 129, - 20, - 98, - 0, - 8, - 39, - 87, - 96, - 0, - 128, - 253, - 91, - 128, - 145, - 80, - 80, - 146, - 149, - 152, - 145, - 148, - 151, - 80, - 146, - 149, - 80, - 86, - 91, - 99, - 78, - 72, - 123, - 113, - 96, - 224, - 27, - 96, - 0, - 82, - 96, - 50, - 96, - 4, - 82, - 96, - 36, - 96, - 0, - 253, - 91, - 99, - 78, - 72, - 123, - 113, - 96, - 224, - 27, - 96, - 0, - 82, - 96, - 17, - 96, - 4, - 82, - 96, - 36, - 96, - 0, - 253, - 91, - 96, - 0, - 96, - 1, - 130, - 1, - 98, - 0, - 8, - 120, - 87, - 98, - 0, - 8, - 120, - 98, - 0, - 8, - 77, - 86, - 91, - 80, - 96, - 1, - 1, - 144, - 86, - 91, - 96, - 0, - 96, - 255, - 131, - 22, - 128, - 98, - 0, - 8, - 161, - 87, - 99, - 78, - 72, - 123, - 113, - 96, - 224, - 27, - 96, - 0, - 82, - 96, - 18, - 96, - 4, - 82, - 96, - 36, - 96, - 0, - 253, - 91, - 128, - 96, - 255, - 132, - 22, - 4, - 145, - 80, - 80, - 146, - 145, - 80, - 80, - 86, - 91, - 128, - 130, - 2, - 129, - 21, - 130, - 130, - 4, - 132, - 20, - 23, - 98, - 0, - 8, - 202, - 87, - 98, - 0, - 8, - 202, - 98, - 0, - 8, - 77, - 86, - 91, - 146, - 145, - 80, - 80, - 86, - 91, - 128, - 130, - 1, - 128, - 130, - 17, - 21, - 98, - 0, - 8, - 202, - 87, - 98, - 0, - 8, - 202, - 98, - 0, - 8, - 77, - 86, - 91, - 129, - 129, - 3, - 129, - 129, - 17, - 21, - 98, - 0, - 8, - 202, - 87, - 98, - 0, - 8, - 202, - 98, - 0, - 8, - 77, - 86, - 91, - 96, - 1, - 129, - 129, - 28, - 144, - 130, - 22, - 128, - 98, - 0, - 9, - 17, - 87, - 96, - 127, - 130, - 22, - 145, - 80, - 91, - 96, - 32, - 130, - 16, - 129, - 3, - 98, - 0, - 9, - 50, - 87, - 99, - 78, - 72, - 123, - 113, - 96, - 224, - 27, - 96, - 0, - 82, - 96, - 34, - 96, - 4, - 82, - 96, - 36, - 96, - 0, - 253, - 91, - 80, - 145, - 144, - 80, - 86, - 91, - 96, - 31, - 130, - 17, - 21, - 98, - 0, - 9, - 134, - 87, - 96, - 0, - 129, - 129, - 82, - 96, - 32, - 129, - 32, - 96, - 31, - 133, - 1, - 96, - 5, - 28, - 129, - 1, - 96, - 32, - 134, - 16, - 21, - 98, - 0, - 9, - 97, - 87, - 80, - 128, - 91, - 96, - 31, - 133, - 1, - 96, - 5, - 28, - 130, - 1, - 145, - 80, - 91, - 129, - 129, - 16, - 21, - 98, - 0, - 9, - 130, - 87, - 130, - 129, - 85, - 96, - 1, - 1, - 98, - 0, - 9, - 109, - 86, - 91, - 80, - 80, - 80, - 91, - 80, - 80, - 80, - 86, - 91, - 129, - 81, - 96, - 1, - 96, - 1, - 96, - 64, - 27, - 3, - 129, - 17, - 21, - 98, - 0, - 9, - 167, - 87, - 98, - 0, - 9, - 167, - 98, - 0, - 5, - 244, - 86, - 91, - 98, - 0, - 9, - 191, - 129, - 98, - 0, - 9, - 184, - 132, - 84, - 98, - 0, - 8, - 252, - 86, - 91, - 132, - 98, - 0, - 9, - 56, - 86, - 91, - 96, - 32, - 128, - 96, - 31, - 131, - 17, - 96, - 1, - 129, - 20, - 98, - 0, - 9, - 247, - 87, - 96, - 0, - 132, - 21, - 98, - 0, - 9, - 222, - 87, - 80, - 133, - 131, - 1, - 81, - 91, - 96, - 0, - 25, - 96, - 3, - 134, - 144, - 27, - 28, - 25, - 22, - 96, - 1, - 133, - 144, - 27, - 23, - 133, - 85, - 98, - 0, - 9, - 130, - 86, - 91, - 96, - 0, - 133, - 129, - 82, - 96, - 32, - 129, - 32, - 96, - 31, - 25, - 134, - 22, - 145, - 91, - 130, - 129, - 16, - 21, - 98, - 0, - 10, - 40, - 87, - 136, - 134, - 1, - 81, - 130, - 85, - 148, - 132, - 1, - 148, - 96, - 1, - 144, - 145, - 1, - 144, - 132, - 1, - 98, - 0, - 10, - 7, - 86, - 91, - 80, - 133, - 130, - 16, - 21, - 98, - 0, - 10, - 71, - 87, - 135, - 133, - 1, - 81, - 96, - 0, - 25, - 96, - 3, - 136, - 144, - 27, - 96, - 248, - 22, - 28, - 25, - 22, - 129, - 85, - 91, - 80, - 80, - 80, - 80, - 80, - 96, - 1, - 144, - 129, - 27, - 1, - 144, - 85, - 80, - 86, - 91, - 96, - 128, - 81, - 96, - 160, - 81, - 96, - 192, - 81, - 96, - 224, - 81, - 97, - 30, - 90, - 98, - 0, - 10, - 166, - 96, - 0, - 57, - 96, - 0, - 97, - 12, - 184, - 1, - 82, - 96, - 0, - 97, - 5, - 20, - 1, - 82, - 96, - 0, - 97, - 3, - 80, - 1, - 82, - 96, - 0, - 129, - 129, - 97, - 1, - 56, - 1, - 82, - 129, - 129, - 97, - 3, - 125, - 1, - 82, - 129, - 129, - 97, - 5, - 65, - 1, - 82, - 97, - 12, - 229, - 1, - 82, - 97, - 30, - 90, - 96, - 0, - 243, - 254, - 96, - 128, - 96, - 64, - 82, - 52, - 128, - 21, - 97, - 0, - 16, - 87, - 96, - 0, - 128, - 253, - 91, - 80, - 96, - 4, - 54, - 16, - 97, - 0, - 169, - 87, - 96, - 0, - 53, - 96, - 224, - 28, - 128, - 99, - 121, - 80, - 197, - 248, - 17, - 97, - 0, - 113, - 87, - 128, - 99, - 121, - 80, - 197, - 248, - 20, - 97, - 1, - 51, - 87, - 128, - 99, - 141, - 165, - 203, - 91, - 20, - 97, - 1, - 114, - 87, - 128, - 99, - 156, - 56, - 37, - 89, - 20, - 97, - 1, - 131, - 87, - 128, - 99, - 163, - 196, - 188, - 248, - 20, - 97, - 1, - 166, - 87, - 128, - 99, - 199, - 221, - 202, - 14, - 20, - 97, - 1, - 201, - 87, - 128, - 99, - 242, - 253, - 227, - 139, - 20, - 97, - 1, - 220, - 87, - 96, - 0, - 128, - 253, - 91, - 128, - 99, - 5, - 171, - 152, - 96, - 20, - 97, - 0, - 174, - 87, - 128, - 99, - 25, - 179, - 57, - 104, - 20, - 97, - 0, - 195, - 87, - 128, - 99, - 73, - 206, - 137, - 151, - 20, - 97, - 0, - 236, - 87, - 128, - 99, - 113, - 80, - 24, - 166, - 20, - 97, - 1, - 12, - 87, - 128, - 99, - 121, - 80, - 44, - 85, - 20, - 97, - 1, - 20, - 87, - 91, - 96, - 0, - 128, - 253, - 91, - 97, - 0, - 193, - 97, - 0, - 188, - 54, - 96, - 4, - 97, - 20, - 203, - 86, - 91, - 97, - 1, - 239, - 86, - 91, - 0, - 91, - 97, - 0, - 214, - 97, - 0, - 209, - 54, - 96, - 4, - 97, - 21, - 103, - 86, - 91, - 97, - 6, - 96, - 86, - 91, - 96, - 64, - 81, - 97, - 0, - 227, - 145, - 144, - 97, - 22, - 59, - 86, - 91, - 96, - 64, - 81, - 128, - 145, - 3, - 144, - 243, - 91, - 97, - 0, - 255, - 97, - 0, - 250, - 54, - 96, - 4, - 97, - 21, - 103, - 86, - 91, - 97, - 9, - 115, - 86, - 91, - 96, - 64, - 81, - 97, - 0, - 227, - 145, - 144, - 97, - 22, - 85, - 86, - 91, - 97, - 0, - 193, - 97, - 10, - 13, - 86, - 91, - 96, - 3, - 84, - 97, - 1, - 33, - 144, - 96, - 255, - 22, - 129, - 86, - 91, - 96, - 64, - 81, - 96, - 255, - 144, - 145, - 22, - 129, - 82, - 96, - 32, - 1, - 97, - 0, - 227, - 86, - 91, - 97, - 1, - 90, - 127, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 129, - 86, - 91, - 96, - 64, - 81, - 96, - 1, - 96, - 1, - 96, - 160, - 27, - 3, - 144, - 145, - 22, - 129, - 82, - 96, - 32, - 1, - 97, - 0, - 227, - 86, - 91, - 96, - 0, - 84, - 96, - 1, - 96, - 1, - 96, - 160, - 27, - 3, - 22, - 97, - 1, - 90, - 86, - 91, - 97, - 1, - 150, - 97, - 1, - 145, - 54, - 96, - 4, - 97, - 22, - 216, - 86, - 91, - 97, - 10, - 33, - 86, - 91, - 96, - 64, - 81, - 144, - 21, - 21, - 129, - 82, - 96, - 32, - 1, - 97, - 0, - 227, - 86, - 91, - 97, - 1, - 185, - 97, - 1, - 180, - 54, - 96, - 4, - 97, - 21, - 103, - 86, - 91, - 97, - 13, - 95, - 86, - 91, - 96, - 64, - 81, - 97, - 0, - 227, - 148, - 147, - 146, - 145, - 144, - 97, - 23, - 106, - 86, - 91, - 97, - 0, - 193, - 97, - 1, - 215, - 54, - 96, - 4, - 97, - 23, - 183, - 86, - 91, - 97, - 15, - 191, - 86, - 91, - 97, - 0, - 193, - 97, - 1, - 234, - 54, - 96, - 4, - 97, - 25, - 17, - 86, - 91, - 97, - 18, - 96, - 86, - 91, - 97, - 1, - 247, - 97, - 18, - 217, - 86, - 91, - 96, - 0, - 130, - 81, - 17, - 97, - 2, - 77, - 87, - 96, - 64, - 81, - 98, - 70, - 27, - 205, - 96, - 229, - 27, - 129, - 82, - 96, - 32, - 96, - 4, - 130, - 1, - 82, - 96, - 29, - 96, - 36, - 130, - 1, - 82, - 127, - 73, - 110, - 118, - 97, - 108, - 105, - 100, - 32, - 116, - 111, - 116, - 97, - 108, - 32, - 98, - 97, - 108, - 97, - 110, - 99, - 101, - 115, - 32, - 108, - 101, - 110, - 103, - 116, - 104, - 0, - 0, - 0, - 96, - 68, - 130, - 1, - 82, - 96, - 100, - 1, - 91, - 96, - 64, - 81, - 128, - 145, - 3, - 144, - 253, - 91, - 129, - 81, - 97, - 2, - 90, - 144, - 96, - 64, - 97, - 25, - 80, - 86, - 91, - 131, - 20, - 97, - 2, - 168, - 87, - 96, - 64, - 81, - 98, - 70, - 27, - 205, - 96, - 229, - 27, - 129, - 82, - 96, - 32, - 96, - 4, - 130, - 1, - 82, - 96, - 30, - 96, - 36, - 130, - 1, - 82, - 127, - 73, - 110, - 118, - 97, - 108, - 105, - 100, - 32, - 103, - 114, - 97, - 110, - 100, - 32, - 115, - 117, - 109, - 32, - 112, - 114, - 111, - 111, - 102, - 32, - 108, - 101, - 110, - 103, - 116, - 104, - 0, - 0, - 96, - 68, - 130, - 1, - 82, - 96, - 100, - 1, - 97, - 2, - 68, - 86, - 91, - 130, - 133, - 17, - 97, - 2, - 247, - 87, - 96, - 64, - 81, - 98, - 70, - 27, - 205, - 96, - 229, - 27, - 129, - 82, - 96, - 32, - 96, - 4, - 130, - 1, - 82, - 96, - 26, - 96, - 36, - 130, - 1, - 82, - 127, - 73, - 110, - 118, - 97, - 108, - 105, - 100, - 32, - 115, - 110, - 97, - 114, - 107, - 32, - 112, - 114, - 111, - 111, - 102, - 32, - 108, - 101, - 110, - 103, - 116, - 104, - 0, - 0, - 0, - 0, - 0, - 0, - 96, - 68, - 130, - 1, - 82, - 96, - 100, - 1, - 97, - 2, - 68, - 86, - 91, - 96, - 64, - 128, - 81, - 96, - 1, - 128, - 130, - 82, - 129, - 131, - 1, - 144, - 146, - 82, - 96, - 0, - 145, - 96, - 32, - 128, - 131, - 1, - 144, - 128, - 54, - 131, - 55, - 1, - 144, - 80, - 80, - 144, - 80, - 96, - 0, - 129, - 96, - 0, - 129, - 81, - 129, - 16, - 97, - 3, - 46, - 87, - 97, - 3, - 46, - 97, - 25, - 109, - 86, - 91, - 96, - 32, - 144, - 129, - 2, - 145, - 144, - 145, - 1, - 1, - 82, - 96, - 64, - 81, - 99, - 175, - 131, - 161, - 141, - 96, - 224, - 27, - 129, - 82, - 96, - 1, - 96, - 1, - 96, - 160, - 27, - 3, - 127, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 22, - 144, - 99, - 175, - 131, - 161, - 141, - 144, - 97, - 3, - 171, - 144, - 127, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 144, - 139, - 144, - 139, - 144, - 135, - 144, - 96, - 4, - 1, - 97, - 25, - 231, - 86, - 91, - 96, - 32, - 96, - 64, - 81, - 128, - 131, - 3, - 129, - 134, - 90, - 250, - 21, - 128, - 21, - 97, - 3, - 200, - 87, - 61, - 96, - 0, - 128, - 62, - 61, - 96, - 0, - 253, - 91, - 80, - 80, - 80, - 80, - 96, - 64, - 81, - 61, - 96, - 31, - 25, - 96, - 31, - 130, - 1, - 22, - 130, - 1, - 128, - 96, - 64, - 82, - 80, - 129, - 1, - 144, - 97, - 3, - 236, - 145, - 144, - 97, - 26, - 30, - 86, - 91, - 97, - 4, - 46, - 87, - 96, - 64, - 81, - 98, - 70, - 27, - 205, - 96, - 229, - 27, - 129, - 82, - 96, - 32, - 96, - 4, - 130, - 1, - 82, - 96, - 19, - 96, - 36, - 130, - 1, - 82, - 114, - 36, - 183, - 59, - 48, - 182, - 52, - 178, - 16, - 57, - 183, - 48, - 185, - 53, - 144, - 56, - 57, - 55, - 183, - 179, - 96, - 105, - 27, - 96, - 68, - 130, - 1, - 82, - 96, - 100, - 1, - 97, - 2, - 68, - 86, - 91, - 96, - 1, - 84, - 131, - 81, - 20, - 97, - 4, - 166, - 87, - 96, - 64, - 81, - 98, - 70, - 27, - 205, - 96, - 229, - 27, - 129, - 82, - 96, - 32, - 96, - 4, - 130, - 1, - 82, - 96, - 58, - 96, - 36, - 130, - 1, - 82, - 127, - 76, - 105, - 97, - 98, - 105, - 108, - 105, - 116, - 121, - 32, - 99, - 111, - 109, - 109, - 105, - 116, - 109, - 101, - 110, - 116, - 115, - 32, - 97, - 110, - 100, - 32, - 99, - 114, - 121, - 112, - 116, - 111, - 96, - 68, - 130, - 1, - 82, - 127, - 99, - 117, - 114, - 114, - 101, - 110, - 99, - 105, - 101, - 115, - 32, - 110, - 117, - 109, - 98, - 101, - 114, - 32, - 109, - 105, - 115, - 109, - 97, - 116, - 99, - 104, - 0, - 0, - 0, - 0, - 0, - 0, - 96, - 100, - 130, - 1, - 82, - 96, - 132, - 1, - 97, - 2, - 68, - 86, - 91, - 54, - 96, - 0, - 136, - 129, - 137, - 97, - 4, - 183, - 137, - 96, - 64, - 97, - 26, - 64, - 86, - 91, - 146, - 97, - 4, - 196, - 147, - 146, - 145, - 144, - 97, - 26, - 83, - 86, - 91, - 144, - 146, - 80, - 144, - 80, - 96, - 0, - 135, - 135, - 97, - 4, - 218, - 132, - 96, - 64, - 129, - 136, - 97, - 26, - 83, - 86, - 91, - 96, - 64, - 81, - 96, - 32, - 1, - 97, - 4, - 237, - 148, - 147, - 146, - 145, - 144, - 97, - 26, - 125, - 86, - 91, - 96, - 64, - 128, - 81, - 96, - 31, - 25, - 129, - 132, - 3, - 1, - 129, - 82, - 144, - 130, - 144, - 82, - 99, - 175, - 131, - 161, - 141, - 96, - 224, - 27, - 130, - 82, - 145, - 80, - 96, - 1, - 96, - 1, - 96, - 160, - 27, - 3, - 127, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 22, - 144, - 99, - 175, - 131, - 161, - 141, - 144, - 97, - 5, - 109, - 144, - 127, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 144, - 133, - 144, - 139, - 144, - 96, - 4, - 1, - 97, - 26, - 159, - 86, - 91, - 96, - 32, - 96, - 64, - 81, - 128, - 131, - 3, - 129, - 134, - 90, - 250, - 21, - 128, - 21, - 97, - 5, - 138, - 87, - 61, - 96, - 0, - 128, - 62, - 61, - 96, - 0, - 253, - 91, - 80, - 80, - 80, - 80, - 96, - 64, - 81, - 61, - 96, - 31, - 25, - 96, - 31, - 130, - 1, - 22, - 130, - 1, - 128, - 96, - 64, - 82, - 80, - 129, - 1, - 144, - 97, - 5, - 174, - 145, - 144, - 97, - 26, - 30, - 86, - 91, - 97, - 5, - 250, - 87, - 96, - 64, - 81, - 98, - 70, - 27, - 205, - 96, - 229, - 27, - 129, - 82, - 96, - 32, - 96, - 4, - 130, - 1, - 82, - 96, - 23, - 96, - 36, - 130, - 1, - 82, - 127, - 73, - 110, - 118, - 97, - 108, - 105, - 100, - 32, - 103, - 114, - 97, - 110, - 100, - 32, - 115, - 117, - 109, - 32, - 112, - 114, - 111, - 111, - 102, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 96, - 68, - 130, - 1, - 82, - 96, - 100, - 1, - 97, - 2, - 68, - 86, - 91, - 96, - 0, - 133, - 129, - 82, - 96, - 5, - 96, - 32, - 82, - 96, - 64, - 144, - 32, - 97, - 6, - 19, - 131, - 133, - 131, - 97, - 27, - 104, - 86, - 91, - 80, - 132, - 127, - 118, - 3, - 161, - 42, - 136, - 56, - 165, - 101, - 113, - 93, - 219, - 91, - 191, - 98, - 91, - 63, - 0, - 165, - 230, - 244, - 121, - 52, - 55, - 83, - 121, - 99, - 227, - 12, - 59, - 148, - 149, - 220, - 135, - 133, - 133, - 140, - 140, - 96, - 64, - 81, - 97, - 6, - 76, - 149, - 148, - 147, - 146, - 145, - 144, - 97, - 28, - 41, - 86, - 91, - 96, - 64, - 81, - 128, - 145, - 3, - 144, - 162, - 80, - 80, - 80, - 80, - 80, - 80, - 80, - 80, - 80, - 80, - 86, - 91, - 97, - 6, - 139, - 96, - 64, - 81, - 128, - 96, - 128, - 1, - 96, - 64, - 82, - 128, - 96, - 96, - 129, - 82, - 96, - 32, - 1, - 96, - 96, - 129, - 82, - 96, - 32, - 1, - 96, - 96, - 129, - 82, - 96, - 32, - 1, - 96, - 96, - 129, - 82, - 80, - 144, - 86, - 91, - 96, - 0, - 130, - 129, - 82, - 96, - 6, - 96, - 32, - 82, - 96, - 64, - 144, - 32, - 84, - 97, - 6, - 221, - 87, - 96, - 64, - 81, - 98, - 70, - 27, - 205, - 96, - 229, - 27, - 129, - 82, - 96, - 32, - 96, - 4, - 130, - 1, - 82, - 96, - 20, - 96, - 36, - 130, - 1, - 82, - 115, - 16, - 89, - 25, - 28, - 153, - 92, - 220, - 200, - 27, - 155, - 221, - 8, - 29, - 153, - 92, - 154, - 89, - 154, - 89, - 89, - 96, - 98, - 27, - 96, - 68, - 130, - 1, - 82, - 96, - 100, - 1, - 97, - 2, - 68, - 86, - 91, - 96, - 0, - 130, - 129, - 82, - 96, - 6, - 96, - 32, - 82, - 96, - 64, - 144, - 32, - 84, - 96, - 4, - 144, - 97, - 6, - 251, - 144, - 96, - 1, - 144, - 97, - 28, - 112, - 86, - 91, - 129, - 84, - 129, - 16, - 97, - 7, - 11, - 87, - 97, - 7, - 11, - 97, - 25, - 109, - 86, - 91, - 144, - 96, - 0, - 82, - 96, - 32, - 96, - 0, - 32, - 144, - 96, - 4, - 2, - 1, - 96, - 64, - 81, - 128, - 96, - 128, - 1, - 96, - 64, - 82, - 144, - 129, - 96, - 0, - 130, - 1, - 128, - 84, - 97, - 7, - 52, - 144, - 97, - 26, - 223, - 86, - 91, - 128, - 96, - 31, - 1, - 96, - 32, - 128, - 145, - 4, - 2, - 96, - 32, - 1, - 96, - 64, - 81, - 144, - 129, - 1, - 96, - 64, - 82, - 128, - 146, - 145, - 144, - 129, - 129, - 82, - 96, - 32, - 1, - 130, - 128, - 84, - 97, - 7, - 96, - 144, - 97, - 26, - 223, - 86, - 91, - 128, - 21, - 97, - 7, - 173, - 87, - 128, - 96, - 31, - 16, - 97, - 7, - 130, - 87, - 97, - 1, - 0, - 128, - 131, - 84, - 4, - 2, - 131, - 82, - 145, - 96, - 32, - 1, - 145, - 97, - 7, - 173, - 86, - 91, - 130, - 1, - 145, - 144, - 96, - 0, - 82, - 96, - 32, - 96, - 0, - 32, - 144, - 91, - 129, - 84, - 129, - 82, - 144, - 96, - 1, - 1, - 144, - 96, - 32, - 1, - 128, - 131, - 17, - 97, - 7, - 144, - 87, - 130, - 144, - 3, - 96, - 31, - 22, - 130, - 1, - 145, - 91, - 80, - 80, - 80, - 80, - 80, - 129, - 82, - 96, - 32, - 1, - 96, - 1, - 130, - 1, - 128, - 84, - 97, - 7, - 198, - 144, - 97, - 26, - 223, - 86, - 91, - 128, - 96, - 31, - 1, - 96, - 32, - 128, - 145, - 4, - 2, - 96, - 32, - 1, - 96, - 64, - 81, - 144, - 129, - 1, - 96, - 64, - 82, - 128, - 146, - 145, - 144, - 129, - 129, - 82, - 96, - 32, - 1, - 130, - 128, - 84, - 97, - 7, - 242, - 144, - 97, - 26, - 223, - 86, - 91, - 128, - 21, - 97, - 8, - 63, - 87, - 128, - 96, - 31, - 16, - 97, - 8, - 20, - 87, - 97, - 1, - 0, - 128, - 131, - 84, - 4, - 2, - 131, - 82, - 145, - 96, - 32, - 1, - 145, - 97, - 8, - 63, - 86, - 91, - 130, - 1, - 145, - 144, - 96, - 0, - 82, - 96, - 32, - 96, - 0, - 32, - 144, - 91, - 129, - 84, - 129, - 82, - 144, - 96, - 1, - 1, - 144, - 96, - 32, - 1, - 128, - 131, - 17, - 97, - 8, - 34, - 87, - 130, - 144, - 3, - 96, - 31, - 22, - 130, - 1, - 145, - 91, - 80, - 80, - 80, - 80, - 80, - 129, - 82, - 96, - 32, - 1, - 96, - 2, - 130, - 1, - 128, - 84, - 97, - 8, - 88, - 144, - 97, - 26, - 223, - 86, - 91, - 128, - 96, - 31, - 1, - 96, - 32, - 128, - 145, - 4, - 2, - 96, - 32, - 1, - 96, - 64, - 81, - 144, - 129, - 1, - 96, - 64, - 82, - 128, - 146, - 145, - 144, - 129, - 129, - 82, - 96, - 32, - 1, - 130, - 128, - 84, - 97, - 8, - 132, - 144, - 97, - 26, - 223, - 86, - 91, - 128, - 21, - 97, - 8, - 209, - 87, - 128, - 96, - 31, - 16, - 97, - 8, - 166, - 87, - 97, - 1, - 0, - 128, - 131, - 84, - 4, - 2, - 131, - 82, - 145, - 96, - 32, - 1, - 145, - 97, - 8, - 209, - 86, - 91, - 130, - 1, - 145, - 144, - 96, - 0, - 82, - 96, - 32, - 96, - 0, - 32, - 144, - 91, - 129, - 84, - 129, - 82, - 144, - 96, - 1, - 1, - 144, - 96, - 32, - 1, - 128, - 131, - 17, - 97, - 8, - 180, - 87, - 130, - 144, - 3, - 96, - 31, - 22, - 130, - 1, - 145, - 91, - 80, - 80, - 80, - 80, - 80, - 129, - 82, - 96, - 32, - 1, - 96, - 3, - 130, - 1, - 128, - 84, - 97, - 8, - 234, - 144, - 97, - 26, - 223, - 86, - 91, - 128, - 96, - 31, - 1, - 96, - 32, - 128, - 145, - 4, - 2, - 96, - 32, - 1, - 96, - 64, - 81, - 144, - 129, - 1, - 96, - 64, - 82, - 128, - 146, - 145, - 144, - 129, - 129, - 82, - 96, - 32, - 1, - 130, - 128, - 84, - 97, - 9, - 22, - 144, - 97, - 26, - 223, - 86, - 91, - 128, - 21, - 97, - 9, - 99, - 87, - 128, - 96, - 31, - 16, - 97, - 9, - 56, - 87, - 97, - 1, - 0, - 128, - 131, - 84, - 4, - 2, - 131, - 82, - 145, - 96, - 32, - 1, - 145, - 97, - 9, - 99, - 86, - 91, - 130, - 1, - 145, - 144, - 96, - 0, - 82, - 96, - 32, - 96, - 0, - 32, - 144, - 91, - 129, - 84, - 129, - 82, - 144, - 96, - 1, - 1, - 144, - 96, - 32, - 1, - 128, - 131, - 17, - 97, - 9, - 70, - 87, - 130, - 144, - 3, - 96, - 31, - 22, - 130, - 1, - 145, - 91, - 80, - 80, - 80, - 80, - 80, - 129, - 82, - 80, - 80, - 144, - 80, - 145, - 144, - 80, - 86, - 91, - 96, - 5, - 96, - 32, - 82, - 96, - 0, - 144, - 129, - 82, - 96, - 64, - 144, - 32, - 128, - 84, - 97, - 9, - 140, - 144, - 97, - 26, - 223, - 86, - 91, - 128, - 96, - 31, - 1, - 96, - 32, - 128, - 145, - 4, - 2, - 96, - 32, - 1, - 96, - 64, - 81, - 144, - 129, - 1, - 96, - 64, - 82, - 128, - 146, - 145, - 144, - 129, - 129, - 82, - 96, - 32, - 1, - 130, - 128, - 84, - 97, - 9, - 184, - 144, - 97, - 26, - 223, - 86, - 91, - 128, - 21, - 97, - 10, - 5, - 87, - 128, - 96, - 31, - 16, - 97, - 9, - 218, - 87, - 97, - 1, - 0, - 128, - 131, - 84, - 4, - 2, - 131, - 82, - 145, - 96, - 32, - 1, - 145, - 97, - 10, - 5, - 86, - 91, - 130, - 1, - 145, - 144, - 96, - 0, - 82, - 96, - 32, - 96, - 0, - 32, - 144, - 91, - 129, - 84, - 129, - 82, - 144, - 96, - 1, - 1, - 144, - 96, - 32, - 1, - 128, - 131, - 17, - 97, - 9, - 232, - 87, - 130, - 144, - 3, - 96, - 31, - 22, - 130, - 1, - 145, - 91, - 80, - 80, - 80, - 80, - 80, - 129, - 86, - 91, - 97, - 10, - 21, - 97, - 18, - 217, - 86, - 91, - 97, - 10, - 31, - 96, - 0, - 97, - 19, - 51, - 86, - 91, - 86, - 91, - 96, - 0, - 130, - 81, - 96, - 4, - 20, - 97, - 10, - 116, - 87, - 96, - 64, - 81, - 98, - 70, - 27, - 205, - 96, - 229, - 27, - 129, - 82, - 96, - 32, - 96, - 4, - 130, - 1, - 82, - 96, - 25, - 96, - 36, - 130, - 1, - 82, - 127, - 73, - 110, - 118, - 97, - 108, - 105, - 100, - 32, - 99, - 104, - 97, - 108, - 108, - 101, - 110, - 103, - 101, - 115, - 32, - 108, - 101, - 110, - 103, - 116, - 104, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 96, - 68, - 130, - 1, - 82, - 96, - 100, - 1, - 97, - 2, - 68, - 86, - 91, - 96, - 1, - 128, - 84, - 131, - 81, - 144, - 145, - 97, - 10, - 133, - 145, - 97, - 28, - 112, - 86, - 91, - 20, - 97, - 10, - 221, - 87, - 96, - 64, - 81, - 98, - 70, - 27, - 205, - 96, - 229, - 27, - 129, - 82, - 96, - 32, - 96, - 4, - 130, - 1, - 82, - 96, - 34, - 96, - 36, - 130, - 1, - 82, - 127, - 86, - 97, - 108, - 117, - 101, - 115, - 32, - 108, - 101, - 110, - 103, - 116, - 104, - 32, - 109, - 105, - 115, - 109, - 97, - 116, - 99, - 104, - 32, - 119, - 105, - 116, - 104, - 32, - 99, - 111, - 110, - 102, - 96, - 68, - 130, - 1, - 82, - 97, - 105, - 103, - 96, - 240, - 27, - 96, - 100, - 130, - 1, - 82, - 96, - 132, - 1, - 97, - 2, - 68, - 86, - 91, - 96, - 0, - 133, - 129, - 82, - 96, - 5, - 96, - 32, - 82, - 96, - 64, - 129, - 32, - 128, - 84, - 97, - 10, - 246, - 144, - 97, - 26, - 223, - 86, - 91, - 128, - 96, - 31, - 1, - 96, - 32, - 128, - 145, - 4, - 2, - 96, - 32, - 1, - 96, - 64, - 81, - 144, - 129, - 1, - 96, - 64, - 82, - 128, - 146, - 145, - 144, - 129, - 129, - 82, - 96, - 32, - 1, - 130, - 128, - 84, - 97, - 11, - 34, - 144, - 97, - 26, - 223, - 86, - 91, - 128, - 21, - 97, - 11, - 111, - 87, - 128, - 96, - 31, - 16, - 97, - 11, - 68, - 87, - 97, - 1, - 0, - 128, - 131, - 84, - 4, - 2, - 131, - 82, - 145, - 96, - 32, - 1, - 145, - 97, - 11, - 111, - 86, - 91, - 130, - 1, - 145, - 144, - 96, - 0, - 82, - 96, - 32, - 96, - 0, - 32, - 144, - 91, - 129, - 84, - 129, - 82, - 144, - 96, - 1, - 1, - 144, - 96, - 32, - 1, - 128, - 131, - 17, - 97, - 11, - 82, - 87, - 130, - 144, - 3, - 96, - 31, - 22, - 130, - 1, - 145, - 91, - 80, - 80, - 80, - 80, - 80, - 144, - 80, - 96, - 0, - 133, - 81, - 130, - 81, - 97, - 11, - 134, - 145, - 144, - 97, - 26, - 64, - 86, - 91, - 103, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 129, - 17, - 21, - 97, - 11, - 158, - 87, - 97, - 11, - 158, - 97, - 19, - 204, - 86, - 91, - 96, - 64, - 81, - 144, - 128, - 130, - 82, - 128, - 96, - 31, - 1, - 96, - 31, - 25, - 22, - 96, - 32, - 1, - 130, - 1, - 96, - 64, - 82, - 128, - 21, - 97, - 11, - 200, - 87, - 96, - 32, - 130, - 1, - 129, - 128, - 54, - 131, - 55, - 1, - 144, - 80, - 91, - 80, - 144, - 80, - 96, - 0, - 91, - 134, - 81, - 129, - 16, - 21, - 97, - 12, - 47, - 87, - 134, - 129, - 129, - 81, - 129, - 16, - 97, - 11, - 233, - 87, - 97, - 11, - 233, - 97, - 25, - 109, - 86, - 91, - 96, - 32, - 1, - 1, - 81, - 96, - 248, - 28, - 96, - 248, - 27, - 130, - 130, - 129, - 81, - 129, - 16, - 97, - 12, - 6, - 87, - 97, - 12, - 6, - 97, - 25, - 109, - 86, - 91, - 96, - 32, - 1, - 1, - 144, - 96, - 1, - 96, - 1, - 96, - 248, - 27, - 3, - 25, - 22, - 144, - 129, - 96, - 0, - 26, - 144, - 83, - 80, - 128, - 97, - 12, - 39, - 129, - 97, - 28, - 131, - 86, - 91, - 145, - 80, - 80, - 97, - 11, - 206, - 86, - 91, - 80, - 96, - 0, - 91, - 130, - 81, - 129, - 16, - 21, - 97, - 12, - 160, - 87, - 130, - 129, - 129, - 81, - 129, - 16, - 97, - 12, - 78, - 87, - 97, - 12, - 78, - 97, - 25, - 109, - 86, - 91, - 96, - 32, - 1, - 1, - 81, - 96, - 248, - 28, - 96, - 248, - 27, - 130, - 136, - 81, - 131, - 97, - 12, - 103, - 145, - 144, - 97, - 26, - 64, - 86, - 91, - 129, - 81, - 129, - 16, - 97, - 12, - 119, - 87, - 97, - 12, - 119, - 97, - 25, - 109, - 86, - 91, - 96, - 32, - 1, - 1, - 144, - 96, - 1, - 96, - 1, - 96, - 248, - 27, - 3, - 25, - 22, - 144, - 129, - 96, - 0, - 26, - 144, - 83, - 80, - 128, - 97, - 12, - 152, - 129, - 97, - 28, - 131, - 86, - 91, - 145, - 80, - 80, - 97, - 12, - 51, - 86, - 91, - 80, - 96, - 64, - 81, - 99, - 35, - 251, - 90, - 213, - 96, - 225, - 27, - 129, - 82, - 96, - 1, - 96, - 1, - 96, - 160, - 27, - 3, - 127, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 22, - 144, - 99, - 71, - 246, - 181, - 170, - 144, - 97, - 13, - 19, - 144, - 127, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 144, - 133, - 144, - 138, - 144, - 138, - 144, - 96, - 4, - 1, - 97, - 28, - 156, - 86, - 91, - 96, - 32, - 96, - 64, - 81, - 128, - 131, - 3, - 129, - 134, - 90, - 250, - 21, - 128, - 21, - 97, - 13, - 48, - 87, - 61, - 96, - 0, - 128, - 62, - 61, - 96, - 0, - 253, - 91, - 80, - 80, - 80, - 80, - 96, - 64, - 81, - 61, - 96, - 31, - 25, - 96, - 31, - 130, - 1, - 22, - 130, - 1, - 128, - 96, - 64, - 82, - 80, - 129, - 1, - 144, - 97, - 13, - 84, - 145, - 144, - 97, - 26, - 30, - 86, - 91, - 151, - 150, - 80, - 80, - 80, - 80, - 80, - 80, - 80, - 86, - 91, - 96, - 4, - 129, - 129, - 84, - 129, - 16, - 97, - 13, - 111, - 87, - 96, - 0, - 128, - 253, - 91, - 144, - 96, - 0, - 82, - 96, - 32, - 96, - 0, - 32, - 144, - 96, - 4, - 2, - 1, - 96, - 0, - 145, - 80, - 144, - 80, - 128, - 96, - 0, - 1, - 128, - 84, - 97, - 13, - 146, - 144, - 97, - 26, - 223, - 86, - 91, - 128, - 96, - 31, - 1, - 96, - 32, - 128, - 145, - 4, - 2, - 96, - 32, - 1, - 96, - 64, - 81, - 144, - 129, - 1, - 96, - 64, - 82, - 128, - 146, - 145, - 144, - 129, - 129, - 82, - 96, - 32, - 1, - 130, - 128, - 84, - 97, - 13, - 190, - 144, - 97, - 26, - 223, - 86, - 91, - 128, - 21, - 97, - 14, - 11, - 87, - 128, - 96, - 31, - 16, - 97, - 13, - 224, - 87, - 97, - 1, - 0, - 128, - 131, - 84, - 4, - 2, - 131, - 82, - 145, - 96, - 32, - 1, - 145, - 97, - 14, - 11, - 86, - 91, - 130, - 1, - 145, - 144, - 96, - 0, - 82, - 96, - 32, - 96, - 0, - 32, - 144, - 91, - 129, - 84, - 129, - 82, - 144, - 96, - 1, - 1, - 144, - 96, - 32, - 1, - 128, - 131, - 17, - 97, - 13, - 238, - 87, - 130, - 144, - 3, - 96, - 31, - 22, - 130, - 1, - 145, - 91, - 80, - 80, - 80, - 80, - 80, - 144, - 128, - 96, - 1, - 1, - 128, - 84, - 97, - 14, - 32, - 144, - 97, - 26, - 223, - 86, - 91, - 128, - 96, - 31, - 1, - 96, - 32, - 128, - 145, - 4, - 2, - 96, - 32, - 1, - 96, - 64, - 81, - 144, - 129, - 1, - 96, - 64, - 82, - 128, - 146, - 145, - 144, - 129, - 129, - 82, - 96, - 32, - 1, - 130, - 128, - 84, - 97, - 14, - 76, - 144, - 97, - 26, - 223, - 86, - 91, - 128, - 21, - 97, - 14, - 153, - 87, - 128, - 96, - 31, - 16, - 97, - 14, - 110, - 87, - 97, - 1, - 0, - 128, - 131, - 84, - 4, - 2, - 131, - 82, - 145, - 96, - 32, - 1, - 145, - 97, - 14, - 153, - 86, - 91, - 130, - 1, - 145, - 144, - 96, - 0, - 82, - 96, - 32, - 96, - 0, - 32, - 144, - 91, - 129, - 84, - 129, - 82, - 144, - 96, - 1, - 1, - 144, - 96, - 32, - 1, - 128, - 131, - 17, - 97, - 14, - 124, - 87, - 130, - 144, - 3, - 96, - 31, - 22, - 130, - 1, - 145, - 91, - 80, - 80, - 80, - 80, - 80, - 144, - 128, - 96, - 2, - 1, - 128, - 84, - 97, - 14, - 174, - 144, - 97, - 26, - 223, - 86, - 91, - 128, - 96, - 31, - 1, - 96, - 32, - 128, - 145, - 4, - 2, - 96, - 32, - 1, - 96, - 64, - 81, - 144, - 129, - 1, - 96, - 64, - 82, - 128, - 146, - 145, - 144, - 129, - 129, - 82, - 96, - 32, - 1, - 130, - 128, - 84, - 97, - 14, - 218, - 144, - 97, - 26, - 223, - 86, - 91, - 128, - 21, - 97, - 15, - 39, - 87, - 128, - 96, - 31, - 16, - 97, - 14, - 252, - 87, - 97, - 1, - 0, - 128, - 131, - 84, - 4, - 2, - 131, - 82, - 145, - 96, - 32, - 1, - 145, - 97, - 15, - 39, - 86, - 91, - 130, - 1, - 145, - 144, - 96, - 0, - 82, - 96, - 32, - 96, - 0, - 32, - 144, - 91, - 129, - 84, - 129, - 82, - 144, - 96, - 1, - 1, - 144, - 96, - 32, - 1, - 128, - 131, - 17, - 97, - 15, - 10, - 87, - 130, - 144, - 3, - 96, - 31, - 22, - 130, - 1, - 145, - 91, - 80, - 80, - 80, - 80, - 80, - 144, - 128, - 96, - 3, - 1, - 128, - 84, - 97, - 15, - 60, - 144, - 97, - 26, - 223, - 86, - 91, - 128, - 96, - 31, - 1, - 96, - 32, - 128, - 145, - 4, - 2, - 96, - 32, - 1, - 96, - 64, - 81, - 144, - 129, - 1, - 96, - 64, - 82, - 128, - 146, - 145, - 144, - 129, - 129, - 82, - 96, - 32, - 1, - 130, - 128, - 84, - 97, - 15, - 104, - 144, - 97, - 26, - 223, - 86, - 91, - 128, - 21, - 97, - 15, - 181, - 87, - 128, - 96, - 31, - 16, - 97, - 15, - 138, - 87, - 97, - 1, - 0, - 128, - 131, - 84, - 4, - 2, - 131, - 82, - 145, - 96, - 32, - 1, - 145, - 97, - 15, - 181, - 86, - 91, - 130, - 1, - 145, - 144, - 96, - 0, - 82, - 96, - 32, - 96, - 0, - 32, - 144, - 91, - 129, - 84, - 129, - 82, - 144, - 96, - 1, - 1, - 144, - 96, - 32, - 1, - 128, - 131, - 17, - 97, - 15, - 152, - 87, - 130, - 144, - 3, - 96, - 31, - 22, - 130, - 1, - 145, - 91, - 80, - 80, - 80, - 80, - 80, - 144, - 80, - 132, - 86, - 91, - 97, - 15, - 199, - 97, - 18, - 217, - 86, - 91, - 96, - 0, - 91, - 129, - 81, - 129, - 16, - 21, - 97, - 18, - 37, - 87, - 96, - 0, - 130, - 130, - 129, - 81, - 129, - 16, - 97, - 15, - 231, - 87, - 97, - 15, - 231, - 97, - 25, - 109, - 86, - 91, - 96, - 32, - 2, - 96, - 32, - 1, - 1, - 81, - 96, - 0, - 1, - 81, - 96, - 64, - 81, - 96, - 32, - 1, - 97, - 16, - 3, - 145, - 144, - 97, - 28, - 230, - 86, - 91, - 96, - 64, - 128, - 81, - 96, - 31, - 25, - 129, - 132, - 3, - 1, - 129, - 82, - 145, - 129, - 82, - 129, - 81, - 96, - 32, - 146, - 131, - 1, - 32, - 96, - 0, - 129, - 129, - 82, - 96, - 6, - 144, - 147, - 82, - 145, - 32, - 84, - 144, - 145, - 80, - 128, - 21, - 97, - 16, - 121, - 87, - 96, - 64, - 81, - 98, - 70, - 27, - 205, - 96, - 229, - 27, - 129, - 82, - 96, - 32, - 96, - 4, - 130, - 1, - 82, - 96, - 24, - 96, - 36, - 130, - 1, - 82, - 127, - 65, - 100, - 100, - 114, - 101, - 115, - 115, - 32, - 97, - 108, - 114, - 101, - 97, - 100, - 121, - 32, - 118, - 101, - 114, - 105, - 102, - 105, - 101, - 100, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 96, - 68, - 130, - 1, - 82, - 96, - 100, - 1, - 97, - 2, - 68, - 86, - 91, - 96, - 4, - 132, - 132, - 129, - 81, - 129, - 16, - 97, - 16, - 141, - 87, - 97, - 16, - 141, - 97, - 25, - 109, - 86, - 91, - 96, - 32, - 144, - 129, - 2, - 145, - 144, - 145, - 1, - 129, - 1, - 81, - 130, - 84, - 96, - 1, - 129, - 1, - 132, - 85, - 96, - 0, - 147, - 132, - 82, - 145, - 144, - 146, - 32, - 130, - 81, - 96, - 4, - 144, - 146, - 2, - 1, - 144, - 129, - 144, - 97, - 16, - 191, - 144, - 130, - 97, - 29, - 2, - 86, - 91, - 80, - 96, - 32, - 130, - 1, - 81, - 96, - 1, - 130, - 1, - 144, - 97, - 16, - 212, - 144, - 130, - 97, - 29, - 2, - 86, - 91, - 80, - 96, - 64, - 130, - 1, - 81, - 96, - 2, - 130, - 1, - 144, - 97, - 16, - 233, - 144, - 130, - 97, - 29, - 2, - 86, - 91, - 80, - 96, - 96, - 130, - 1, - 81, - 96, - 3, - 130, - 1, - 144, - 97, - 16, - 254, - 144, - 130, - 97, - 29, - 2, - 86, - 91, - 80, - 80, - 96, - 4, - 84, - 96, - 0, - 132, - 129, - 82, - 96, - 6, - 96, - 32, - 82, - 96, - 64, - 144, - 32, - 85, - 80, - 131, - 81, - 132, - 144, - 132, - 144, - 129, - 16, - 97, - 17, - 39, - 87, - 97, - 17, - 39, - 97, - 25, - 109, - 86, - 91, - 96, - 32, - 2, - 96, - 32, - 1, - 1, - 81, - 96, - 0, - 1, - 81, - 81, - 96, - 0, - 20, - 21, - 128, - 21, - 97, - 17, - 99, - 87, - 80, - 131, - 131, - 129, - 81, - 129, - 16, - 97, - 17, - 81, - 87, - 97, - 17, - 81, - 97, - 25, - 109, - 86, - 91, - 96, - 32, - 2, - 96, - 32, - 1, - 1, - 81, - 96, - 32, - 1, - 81, - 81, - 96, - 0, - 20, - 21, - 91, - 128, - 21, - 97, - 17, - 142, - 87, - 80, - 131, - 131, - 129, - 81, - 129, - 16, - 97, - 17, - 124, - 87, - 97, - 17, - 124, - 97, - 25, - 109, - 86, - 91, - 96, - 32, - 2, - 96, - 32, - 1, - 1, - 81, - 96, - 64, - 1, - 81, - 81, - 96, - 0, - 20, - 21, - 91, - 128, - 21, - 97, - 17, - 185, - 87, - 80, - 131, - 131, - 129, - 81, - 129, - 16, - 97, - 17, - 167, - 87, - 97, - 17, - 167, - 97, - 25, - 109, - 86, - 91, - 96, - 32, - 2, - 96, - 32, - 1, - 1, - 81, - 96, - 96, - 1, - 81, - 81, - 96, - 0, - 20, - 21, - 91, - 97, - 18, - 16, - 87, - 96, - 64, - 81, - 98, - 70, - 27, - 205, - 96, - 229, - 27, - 129, - 82, - 96, - 32, - 96, - 4, - 130, - 1, - 82, - 96, - 34, - 96, - 36, - 130, - 1, - 82, - 127, - 73, - 110, - 118, - 97, - 108, - 105, - 100, - 32, - 112, - 114, - 111, - 111, - 102, - 32, - 111, - 102, - 32, - 97, - 100, - 100, - 114, - 101, - 115, - 115, - 32, - 111, - 119, - 110, - 101, - 114, - 115, - 104, - 96, - 68, - 130, - 1, - 82, - 97, - 6, - 151, - 96, - 244, - 27, - 96, - 100, - 130, - 1, - 82, - 96, - 132, - 1, - 97, - 2, - 68, - 86, - 91, - 80, - 80, - 128, - 128, - 97, - 18, - 29, - 144, - 97, - 28, - 131, - 86, - 91, - 145, - 80, - 80, - 97, - 15, - 202, - 86, - 91, - 80, - 127, - 56, - 35, - 21, - 212, - 213, - 106, - 96, - 53, - 225, - 137, - 155, - 255, - 231, - 125, - 155, - 236, - 239, - 175, - 95, - 38, - 80, - 228, - 50, - 59, - 39, - 133, - 72, - 87, - 160, - 69, - 70, - 88, - 129, - 96, - 64, - 81, - 97, - 18, - 85, - 145, - 144, - 97, - 29, - 194, - 86, - 91, - 96, - 64, - 81, - 128, - 145, - 3, - 144, - 161, - 80, - 86, - 91, - 97, - 18, - 104, - 97, - 18, - 217, - 86, - 91, - 96, - 1, - 96, - 1, - 96, - 160, - 27, - 3, - 129, - 22, - 97, - 18, - 205, - 87, - 96, - 64, - 81, - 98, - 70, - 27, - 205, - 96, - 229, - 27, - 129, - 82, - 96, - 32, - 96, - 4, - 130, - 1, - 82, - 96, - 38, - 96, - 36, - 130, - 1, - 82, - 127, - 79, - 119, - 110, - 97, - 98, - 108, - 101, - 58, - 32, - 110, - 101, - 119, - 32, - 111, - 119, - 110, - 101, - 114, - 32, - 105, - 115, - 32, - 116, - 104, - 101, - 32, - 122, - 101, - 114, - 111, - 32, - 97, - 96, - 68, - 130, - 1, - 82, - 101, - 100, - 100, - 114, - 101, - 115, - 115, - 96, - 208, - 27, - 96, - 100, - 130, - 1, - 82, - 96, - 132, - 1, - 97, - 2, - 68, - 86, - 91, - 97, - 18, - 214, - 129, - 97, - 19, - 51, - 86, - 91, - 80, - 86, - 91, - 96, - 0, - 84, - 96, - 1, - 96, - 1, - 96, - 160, - 27, - 3, - 22, - 51, - 20, - 97, - 10, - 31, - 87, - 96, - 64, - 81, - 98, - 70, - 27, - 205, - 96, - 229, - 27, - 129, - 82, - 96, - 32, - 96, - 4, - 130, - 1, - 129, - 144, - 82, - 96, - 36, - 130, - 1, - 82, - 127, - 79, - 119, - 110, - 97, - 98, - 108, - 101, - 58, - 32, - 99, - 97, - 108, - 108, - 101, - 114, - 32, - 105, - 115, - 32, - 110, - 111, - 116, - 32, - 116, - 104, - 101, - 32, - 111, - 119, - 110, - 101, - 114, - 96, - 68, - 130, - 1, - 82, - 96, - 100, - 1, - 97, - 2, - 68, - 86, - 91, - 96, - 0, - 128, - 84, - 96, - 1, - 96, - 1, - 96, - 160, - 27, - 3, - 131, - 129, - 22, - 96, - 1, - 96, - 1, - 96, - 160, - 27, - 3, - 25, - 131, - 22, - 129, - 23, - 132, - 85, - 96, - 64, - 81, - 145, - 144, - 146, - 22, - 146, - 131, - 145, - 127, - 139, - 224, - 7, - 156, - 83, - 22, - 89, - 20, - 19, - 68, - 205, - 31, - 208, - 164, - 242, - 132, - 25, - 73, - 127, - 151, - 34, - 163, - 218, - 175, - 227, - 180, - 24, - 111, - 107, - 100, - 87, - 224, - 145, - 144, - 163, - 80, - 80, - 86, - 91, - 96, - 0, - 128, - 131, - 96, - 31, - 132, - 1, - 18, - 97, - 19, - 149, - 87, - 96, - 0, - 128, - 253, - 91, - 80, - 129, - 53, - 103, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 129, - 17, - 21, - 97, - 19, - 173, - 87, - 96, - 0, - 128, - 253, - 91, - 96, - 32, - 131, - 1, - 145, - 80, - 131, - 96, - 32, - 130, - 133, - 1, - 1, - 17, - 21, - 97, - 19, - 197, - 87, - 96, - 0, - 128, - 253, - 91, - 146, - 80, - 146, - 144, - 80, - 86, - 91, - 99, - 78, - 72, - 123, - 113, - 96, - 224, - 27, - 96, - 0, - 82, - 96, - 65, - 96, - 4, - 82, - 96, - 36, - 96, - 0, - 253, - 91, - 96, - 64, - 81, - 96, - 128, - 129, - 1, - 103, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 129, - 17, - 130, - 130, - 16, - 23, - 21, - 97, - 20, - 5, - 87, - 97, - 20, - 5, - 97, - 19, - 204, - 86, - 91, - 96, - 64, - 82, - 144, - 86, - 91, - 96, - 64, - 81, - 96, - 31, - 130, - 1, - 96, - 31, - 25, - 22, - 129, - 1, - 103, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 129, - 17, - 130, - 130, - 16, - 23, - 21, - 97, - 20, - 52, - 87, - 97, - 20, - 52, - 97, - 19, - 204, - 86, - 91, - 96, - 64, - 82, - 145, - 144, - 80, - 86, - 91, - 96, - 0, - 103, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 130, - 17, - 21, - 97, - 20, - 86, - 87, - 97, - 20, - 86, - 97, - 19, - 204, - 86, - 91, - 80, - 96, - 5, - 27, - 96, - 32, - 1, - 144, - 86, - 91, - 96, - 0, - 130, - 96, - 31, - 131, - 1, - 18, - 97, - 20, - 113, - 87, - 96, - 0, - 128, - 253, - 91, - 129, - 53, - 96, - 32, - 97, - 20, - 134, - 97, - 20, - 129, - 131, - 97, - 20, - 60, - 86, - 91, - 97, - 20, - 11, - 86, - 91, - 130, - 129, - 82, - 96, - 5, - 146, - 144, - 146, - 27, - 132, - 1, - 129, - 1, - 145, - 129, - 129, - 1, - 144, - 134, - 132, - 17, - 21, - 97, - 20, - 165, - 87, - 96, - 0, - 128, - 253, - 91, - 130, - 134, - 1, - 91, - 132, - 129, - 16, - 21, - 97, - 20, - 192, - 87, - 128, - 53, - 131, - 82, - 145, - 131, - 1, - 145, - 131, - 1, - 97, - 20, - 169, - 86, - 91, - 80, - 150, - 149, - 80, - 80, - 80, - 80, - 80, - 80, - 86, - 91, - 96, - 0, - 128, - 96, - 0, - 128, - 96, - 0, - 128, - 96, - 128, - 135, - 137, - 3, - 18, - 21, - 97, - 20, - 228, - 87, - 96, - 0, - 128, - 253, - 91, - 134, - 53, - 103, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 128, - 130, - 17, - 21, - 97, - 20, - 252, - 87, - 96, - 0, - 128, - 253, - 91, - 97, - 21, - 8, - 138, - 131, - 139, - 1, - 97, - 19, - 131, - 86, - 91, - 144, - 152, - 80, - 150, - 80, - 96, - 32, - 137, - 1, - 53, - 145, - 80, - 128, - 130, - 17, - 21, - 97, - 21, - 33, - 87, - 96, - 0, - 128, - 253, - 91, - 97, - 21, - 45, - 138, - 131, - 139, - 1, - 97, - 19, - 131, - 86, - 91, - 144, - 150, - 80, - 148, - 80, - 96, - 64, - 137, - 1, - 53, - 145, - 80, - 128, - 130, - 17, - 21, - 97, - 21, - 70, - 87, - 96, - 0, - 128, - 253, - 91, - 80, - 97, - 21, - 83, - 137, - 130, - 138, - 1, - 97, - 20, - 96, - 86, - 91, - 146, - 80, - 80, - 96, - 96, - 135, - 1, - 53, - 144, - 80, - 146, - 149, - 80, - 146, - 149, - 80, - 146, - 149, - 86, - 91, - 96, - 0, - 96, - 32, - 130, - 132, - 3, - 18, - 21, - 97, - 21, - 121, - 87, - 96, - 0, - 128, - 253, - 91, - 80, - 53, - 145, - 144, - 80, - 86, - 91, - 96, - 0, - 91, - 131, - 129, - 16, - 21, - 97, - 21, - 155, - 87, - 129, - 129, - 1, - 81, - 131, - 130, - 1, - 82, - 96, - 32, - 1, - 97, - 21, - 131, - 86, - 91, - 80, - 80, - 96, - 0, - 145, - 1, - 82, - 86, - 91, - 96, - 0, - 129, - 81, - 128, - 132, - 82, - 97, - 21, - 188, - 129, - 96, - 32, - 134, - 1, - 96, - 32, - 134, - 1, - 97, - 21, - 128, - 86, - 91, - 96, - 31, - 1, - 96, - 31, - 25, - 22, - 146, - 144, - 146, - 1, - 96, - 32, - 1, - 146, - 145, - 80, - 80, - 86, - 91, - 96, - 0, - 129, - 81, - 96, - 128, - 132, - 82, - 97, - 21, - 229, - 96, - 128, - 133, - 1, - 130, - 97, - 21, - 164, - 86, - 91, - 144, - 80, - 96, - 32, - 131, - 1, - 81, - 132, - 130, - 3, - 96, - 32, - 134, - 1, - 82, - 97, - 21, - 254, - 130, - 130, - 97, - 21, - 164, - 86, - 91, - 145, - 80, - 80, - 96, - 64, - 131, - 1, - 81, - 132, - 130, - 3, - 96, - 64, - 134, - 1, - 82, - 97, - 22, - 24, - 130, - 130, - 97, - 21, - 164, - 86, - 91, - 145, - 80, - 80, - 96, - 96, - 131, - 1, - 81, - 132, - 130, - 3, - 96, - 96, - 134, - 1, - 82, - 97, - 22, - 50, - 130, - 130, - 97, - 21, - 164, - 86, - 91, - 149, - 148, - 80, - 80, - 80, - 80, - 80, - 86, - 91, - 96, - 32, - 129, - 82, - 96, - 0, - 97, - 22, - 78, - 96, - 32, - 131, - 1, - 132, - 97, - 21, - 208, - 86, - 91, - 147, - 146, - 80, - 80, - 80, - 86, - 91, - 96, - 32, - 129, - 82, - 96, - 0, - 97, - 22, - 78, - 96, - 32, - 131, - 1, - 132, - 97, - 21, - 164, - 86, - 91, - 96, - 0, - 130, - 96, - 31, - 131, - 1, - 18, - 97, - 22, - 121, - 87, - 96, - 0, - 128, - 253, - 91, - 129, - 53, - 103, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 129, - 17, - 21, - 97, - 22, - 147, - 87, - 97, - 22, - 147, - 97, - 19, - 204, - 86, - 91, - 97, - 22, - 166, - 96, - 31, - 130, - 1, - 96, - 31, - 25, - 22, - 96, - 32, - 1, - 97, - 20, - 11, - 86, - 91, - 129, - 129, - 82, - 132, - 96, - 32, - 131, - 134, - 1, - 1, - 17, - 21, - 97, - 22, - 187, - 87, - 96, - 0, - 128, - 253, - 91, - 129, - 96, - 32, - 133, - 1, - 96, - 32, - 131, - 1, - 55, - 96, - 0, - 145, - 129, - 1, - 96, - 32, - 1, - 145, - 144, - 145, - 82, - 147, - 146, - 80, - 80, - 80, - 86, - 91, - 96, - 0, - 128, - 96, - 0, - 128, - 96, - 128, - 133, - 135, - 3, - 18, - 21, - 97, - 22, - 238, - 87, - 96, - 0, - 128, - 253, - 91, - 132, - 53, - 147, - 80, - 96, - 32, - 133, - 1, - 53, - 103, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 128, - 130, - 17, - 21, - 97, - 23, - 13, - 87, - 96, - 0, - 128, - 253, - 91, - 97, - 23, - 25, - 136, - 131, - 137, - 1, - 97, - 22, - 104, - 86, - 91, - 148, - 80, - 96, - 64, - 135, - 1, - 53, - 145, - 80, - 128, - 130, - 17, - 21, - 97, - 23, - 47, - 87, - 96, - 0, - 128, - 253, - 91, - 97, - 23, - 59, - 136, - 131, - 137, - 1, - 97, - 20, - 96, - 86, - 91, - 147, - 80, - 96, - 96, - 135, - 1, - 53, - 145, - 80, - 128, - 130, - 17, - 21, - 97, - 23, - 81, - 87, - 96, - 0, - 128, - 253, - 91, - 80, - 97, - 23, - 94, - 135, - 130, - 136, - 1, - 97, - 20, - 96, - 86, - 91, - 145, - 80, - 80, - 146, - 149, - 145, - 148, - 80, - 146, - 80, - 86, - 91, - 96, - 128, - 129, - 82, - 96, - 0, - 97, - 23, - 125, - 96, - 128, - 131, - 1, - 135, - 97, - 21, - 164, - 86, - 91, - 130, - 129, - 3, - 96, - 32, - 132, - 1, - 82, - 97, - 23, - 143, - 129, - 135, - 97, - 21, - 164, - 86, - 91, - 144, - 80, - 130, - 129, - 3, - 96, - 64, - 132, - 1, - 82, - 97, - 23, - 163, - 129, - 134, - 97, - 21, - 164, - 86, - 91, - 144, - 80, - 130, - 129, - 3, - 96, - 96, - 132, - 1, - 82, - 97, - 13, - 84, - 129, - 133, - 97, - 21, - 164, - 86, - 91, - 96, - 0, - 96, - 32, - 128, - 131, - 133, - 3, - 18, - 21, - 97, - 23, - 202, - 87, - 96, - 0, - 128, - 253, - 91, - 130, - 53, - 103, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 128, - 130, - 17, - 21, - 97, - 23, - 226, - 87, - 96, - 0, - 128, - 253, - 91, - 129, - 133, - 1, - 145, - 80, - 133, - 96, - 31, - 131, - 1, - 18, - 97, - 23, - 246, - 87, - 96, - 0, - 128, - 253, - 91, - 129, - 53, - 97, - 24, - 4, - 97, - 20, - 129, - 130, - 97, - 20, - 60, - 86, - 91, - 129, - 129, - 82, - 96, - 5, - 145, - 144, - 145, - 27, - 131, - 1, - 132, - 1, - 144, - 132, - 129, - 1, - 144, - 136, - 131, - 17, - 21, - 97, - 24, - 35, - 87, - 96, - 0, - 128, - 253, - 91, - 133, - 133, - 1, - 91, - 131, - 129, - 16, - 21, - 97, - 25, - 4, - 87, - 128, - 53, - 133, - 129, - 17, - 21, - 97, - 24, - 62, - 87, - 96, - 0, - 128, - 253, - 91, - 134, - 1, - 96, - 128, - 129, - 140, - 3, - 96, - 31, - 25, - 1, - 18, - 21, - 97, - 24, - 85, - 87, - 96, - 0, - 128, - 129, - 253, - 91, - 97, - 24, - 93, - 97, - 19, - 226, - 86, - 91, - 136, - 130, - 1, - 53, - 135, - 129, - 17, - 21, - 97, - 24, - 111, - 87, - 96, - 0, - 128, - 129, - 253, - 91, - 97, - 24, - 125, - 141, - 139, - 131, - 134, - 1, - 1, - 97, - 22, - 104, - 86, - 91, - 130, - 82, - 80, - 96, - 64, - 128, - 131, - 1, - 53, - 136, - 129, - 17, - 21, - 97, - 24, - 148, - 87, - 96, - 0, - 128, - 129, - 253, - 91, - 97, - 24, - 162, - 142, - 140, - 131, - 135, - 1, - 1, - 97, - 22, - 104, - 86, - 91, - 139, - 132, - 1, - 82, - 80, - 96, - 96, - 128, - 132, - 1, - 53, - 137, - 129, - 17, - 21, - 97, - 24, - 187, - 87, - 96, - 0, - 128, - 129, - 253, - 91, - 97, - 24, - 201, - 143, - 141, - 131, - 136, - 1, - 1, - 97, - 22, - 104, - 86, - 91, - 131, - 133, - 1, - 82, - 80, - 96, - 128, - 132, - 1, - 53, - 145, - 80, - 136, - 130, - 17, - 21, - 97, - 24, - 227, - 87, - 96, - 0, - 128, - 129, - 253, - 91, - 97, - 24, - 241, - 142, - 140, - 132, - 135, - 1, - 1, - 97, - 22, - 104, - 86, - 91, - 144, - 131, - 1, - 82, - 80, - 132, - 82, - 80, - 145, - 134, - 1, - 145, - 134, - 1, - 97, - 24, - 39, - 86, - 91, - 80, - 152, - 151, - 80, - 80, - 80, - 80, - 80, - 80, - 80, - 80, - 86, - 91, - 96, - 0, - 96, - 32, - 130, - 132, - 3, - 18, - 21, - 97, - 25, - 35, - 87, - 96, - 0, - 128, - 253, - 91, - 129, - 53, - 96, - 1, - 96, - 1, - 96, - 160, - 27, - 3, - 129, - 22, - 129, - 20, - 97, - 22, - 78, - 87, - 96, - 0, - 128, - 253, - 91, - 99, - 78, - 72, - 123, - 113, - 96, - 224, - 27, - 96, - 0, - 82, - 96, - 17, - 96, - 4, - 82, - 96, - 36, - 96, - 0, - 253, - 91, - 128, - 130, - 2, - 129, - 21, - 130, - 130, - 4, - 132, - 20, - 23, - 97, - 25, - 103, - 87, - 97, - 25, - 103, - 97, - 25, - 58, - 86, - 91, - 146, - 145, - 80, - 80, - 86, - 91, - 99, - 78, - 72, - 123, - 113, - 96, - 224, - 27, - 96, - 0, - 82, - 96, - 50, - 96, - 4, - 82, - 96, - 36, - 96, - 0, - 253, - 91, - 129, - 131, - 82, - 129, - 129, - 96, - 32, - 133, - 1, - 55, - 80, - 96, - 0, - 130, - 130, - 1, - 96, - 32, - 144, - 129, - 1, - 145, - 144, - 145, - 82, - 96, - 31, - 144, - 145, - 1, - 96, - 31, - 25, - 22, - 144, - 145, - 1, - 1, - 144, - 86, - 91, - 96, - 0, - 129, - 81, - 128, - 132, - 82, - 96, - 32, - 128, - 133, - 1, - 148, - 80, - 128, - 132, - 1, - 96, - 0, - 91, - 131, - 129, - 16, - 21, - 97, - 25, - 220, - 87, - 129, - 81, - 135, - 82, - 149, - 130, - 1, - 149, - 144, - 130, - 1, - 144, - 96, - 1, - 1, - 97, - 25, - 192, - 86, - 91, - 80, - 148, - 149, - 148, - 80, - 80, - 80, - 80, - 80, - 86, - 91, - 96, - 1, - 96, - 1, - 96, - 160, - 27, - 3, - 133, - 22, - 129, - 82, - 96, - 96, - 96, - 32, - 130, - 1, - 129, - 144, - 82, - 96, - 0, - 144, - 97, - 26, - 12, - 144, - 131, - 1, - 133, - 135, - 97, - 25, - 131, - 86, - 91, - 130, - 129, - 3, - 96, - 64, - 132, - 1, - 82, - 97, - 13, - 84, - 129, - 133, - 97, - 25, - 172, - 86, - 91, - 96, - 0, - 96, - 32, - 130, - 132, - 3, - 18, - 21, - 97, - 26, - 48, - 87, - 96, - 0, - 128, - 253, - 91, - 129, - 81, - 128, - 21, - 21, - 129, - 20, - 97, - 22, - 78, - 87, - 96, - 0, - 128, - 253, - 91, - 128, - 130, - 1, - 128, - 130, - 17, - 21, - 97, - 25, - 103, - 87, - 97, - 25, - 103, - 97, - 25, - 58, - 86, - 91, - 96, - 0, - 128, - 133, - 133, - 17, - 21, - 97, - 26, - 99, - 87, - 96, - 0, - 128, - 253, - 91, - 131, - 134, - 17, - 21, - 97, - 26, - 112, - 87, - 96, - 0, - 128, - 253, - 91, - 80, - 80, - 130, - 1, - 147, - 145, - 144, - 146, - 3, - 145, - 80, - 86, - 91, - 131, - 133, - 130, - 55, - 96, - 0, - 132, - 130, - 1, - 96, - 0, - 129, - 82, - 131, - 133, - 130, - 55, - 96, - 0, - 147, - 1, - 146, - 131, - 82, - 80, - 144, - 148, - 147, - 80, - 80, - 80, - 80, - 86, - 91, - 96, - 1, - 96, - 1, - 96, - 160, - 27, - 3, - 132, - 22, - 129, - 82, - 96, - 96, - 96, - 32, - 130, - 1, - 129, - 144, - 82, - 96, - 0, - 144, - 97, - 26, - 195, - 144, - 131, - 1, - 133, - 97, - 21, - 164, - 86, - 91, - 130, - 129, - 3, - 96, - 64, - 132, - 1, - 82, - 97, - 26, - 213, - 129, - 133, - 97, - 25, - 172, - 86, - 91, - 150, - 149, - 80, - 80, - 80, - 80, - 80, - 80, - 86, - 91, - 96, - 1, - 129, - 129, - 28, - 144, - 130, - 22, - 128, - 97, - 26, - 243, - 87, - 96, - 127, - 130, - 22, - 145, - 80, - 91, - 96, - 32, - 130, - 16, - 129, - 3, - 97, - 27, - 19, - 87, - 99, - 78, - 72, - 123, - 113, - 96, - 224, - 27, - 96, - 0, - 82, - 96, - 34, - 96, - 4, - 82, - 96, - 36, - 96, - 0, - 253, - 91, - 80, - 145, - 144, - 80, - 86, - 91, - 96, - 31, - 130, - 17, - 21, - 97, - 27, - 99, - 87, - 96, - 0, - 129, - 129, - 82, - 96, - 32, - 129, - 32, - 96, - 31, - 133, - 1, - 96, - 5, - 28, - 129, - 1, - 96, - 32, - 134, - 16, - 21, - 97, - 27, - 64, - 87, - 80, - 128, - 91, - 96, - 31, - 133, - 1, - 96, - 5, - 28, - 130, - 1, - 145, - 80, - 91, - 129, - 129, - 16, - 21, - 97, - 27, - 95, - 87, - 130, - 129, - 85, - 96, - 1, - 1, - 97, - 27, - 76, - 86, - 91, - 80, - 80, - 80, - 91, - 80, - 80, - 80, - 86, - 91, - 103, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 131, - 17, - 21, - 97, - 27, - 128, - 87, - 97, - 27, - 128, - 97, - 19, - 204, - 86, - 91, - 97, - 27, - 148, - 131, - 97, - 27, - 142, - 131, - 84, - 97, - 26, - 223, - 86, - 91, - 131, - 97, - 27, - 25, - 86, - 91, - 96, - 0, - 96, - 31, - 132, - 17, - 96, - 1, - 129, - 20, - 97, - 27, - 200, - 87, - 96, - 0, - 133, - 21, - 97, - 27, - 176, - 87, - 80, - 131, - 130, - 1, - 53, - 91, - 96, - 0, - 25, - 96, - 3, - 135, - 144, - 27, - 28, - 25, - 22, - 96, - 1, - 134, - 144, - 27, - 23, - 131, - 85, - 97, - 28, - 34, - 86, - 91, - 96, - 0, - 131, - 129, - 82, - 96, - 32, - 144, - 32, - 96, - 31, - 25, - 134, - 22, - 144, - 131, - 91, - 130, - 129, - 16, - 21, - 97, - 27, - 249, - 87, - 134, - 133, - 1, - 53, - 130, - 85, - 96, - 32, - 148, - 133, - 1, - 148, - 96, - 1, - 144, - 146, - 1, - 145, - 1, - 97, - 27, - 217, - 86, - 91, - 80, - 134, - 130, - 16, - 21, - 97, - 28, - 22, - 87, - 96, - 0, - 25, - 96, - 248, - 136, - 96, - 3, - 27, - 22, - 28, - 25, - 132, - 135, - 1, - 53, - 22, - 129, - 85, - 91, - 80, - 80, - 96, - 1, - 133, - 96, - 1, - 27, - 1, - 131, - 85, - 91, - 80, - 80, - 80, - 80, - 80, - 86, - 91, - 96, - 96, - 129, - 82, - 96, - 0, - 97, - 28, - 60, - 96, - 96, - 131, - 1, - 136, - 97, - 25, - 172, - 86, - 91, - 130, - 129, - 3, - 96, - 32, - 132, - 1, - 82, - 97, - 28, - 79, - 129, - 135, - 137, - 97, - 25, - 131, - 86, - 91, - 144, - 80, - 130, - 129, - 3, - 96, - 64, - 132, - 1, - 82, - 97, - 28, - 100, - 129, - 133, - 135, - 97, - 25, - 131, - 86, - 91, - 152, - 151, - 80, - 80, - 80, - 80, - 80, - 80, - 80, - 80, - 86, - 91, - 129, - 129, - 3, - 129, - 129, - 17, - 21, - 97, - 25, - 103, - 87, - 97, - 25, - 103, - 97, - 25, - 58, - 86, - 91, - 96, - 0, - 96, - 1, - 130, - 1, - 97, - 28, - 149, - 87, - 97, - 28, - 149, - 97, - 25, - 58, - 86, - 91, - 80, - 96, - 1, - 1, - 144, - 86, - 91, - 96, - 1, - 96, - 1, - 96, - 160, - 27, - 3, - 133, - 22, - 129, - 82, - 96, - 128, - 96, - 32, - 130, - 1, - 129, - 144, - 82, - 96, - 0, - 144, - 97, - 28, - 192, - 144, - 131, - 1, - 134, - 97, - 21, - 164, - 86, - 91, - 130, - 129, - 3, - 96, - 64, - 132, - 1, - 82, - 97, - 28, - 210, - 129, - 134, - 97, - 25, - 172, - 86, - 91, - 144, - 80, - 130, - 129, - 3, - 96, - 96, - 132, - 1, - 82, - 97, - 13, - 84, - 129, - 133, - 97, - 25, - 172, - 86, - 91, - 96, - 0, - 130, - 81, - 97, - 28, - 248, - 129, - 132, - 96, - 32, - 135, - 1, - 97, - 21, - 128, - 86, - 91, - 145, - 144, - 145, - 1, - 146, - 145, - 80, - 80, - 86, - 91, - 129, - 81, - 103, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 129, - 17, - 21, - 97, - 29, - 28, - 87, - 97, - 29, - 28, - 97, - 19, - 204, - 86, - 91, - 97, - 29, - 48, - 129, - 97, - 29, - 42, - 132, - 84, - 97, - 26, - 223, - 86, - 91, - 132, - 97, - 27, - 25, - 86, - 91, - 96, - 32, - 128, - 96, - 31, - 131, - 17, - 96, - 1, - 129, - 20, - 97, - 29, - 101, - 87, - 96, - 0, - 132, - 21, - 97, - 29, - 77, - 87, - 80, - 133, - 131, - 1, - 81, - 91, - 96, - 0, - 25, - 96, - 3, - 134, - 144, - 27, - 28, - 25, - 22, - 96, - 1, - 133, - 144, - 27, - 23, - 133, - 85, - 97, - 27, - 95, - 86, - 91, - 96, - 0, - 133, - 129, - 82, - 96, - 32, - 129, - 32, - 96, - 31, - 25, - 134, - 22, - 145, - 91, - 130, - 129, - 16, - 21, - 97, - 29, - 148, - 87, - 136, - 134, - 1, - 81, - 130, - 85, - 148, - 132, - 1, - 148, - 96, - 1, - 144, - 145, - 1, - 144, - 132, - 1, - 97, - 29, - 117, - 86, - 91, - 80, - 133, - 130, - 16, - 21, - 97, - 29, - 178, - 87, - 135, - 133, - 1, - 81, - 96, - 0, - 25, - 96, - 3, - 136, - 144, - 27, - 96, - 248, - 22, - 28, - 25, - 22, - 129, - 85, - 91, - 80, - 80, - 80, - 80, - 80, - 96, - 1, - 144, - 129, - 27, - 1, - 144, - 85, - 80, - 86, - 91, - 96, - 0, - 96, - 32, - 128, - 131, - 1, - 129, - 132, - 82, - 128, - 133, - 81, - 128, - 131, - 82, - 96, - 64, - 134, - 1, - 145, - 80, - 96, - 64, - 129, - 96, - 5, - 27, - 135, - 1, - 1, - 146, - 80, - 131, - 135, - 1, - 96, - 0, - 91, - 130, - 129, - 16, - 21, - 97, - 30, - 23, - 87, - 96, - 63, - 25, - 136, - 134, - 3, - 1, - 132, - 82, - 97, - 30, - 5, - 133, - 131, - 81, - 97, - 21, - 208, - 86, - 91, - 148, - 80, - 146, - 133, - 1, - 146, - 144, - 133, - 1, - 144, - 96, - 1, - 1, - 97, - 29, - 233, - 86, - 91, - 80, - 146, - 151, - 150, - 80, - 80, - 80, - 80, - 80, - 80, - 80, - 86, - 254, - 162, - 100, - 105, - 112, - 102, - 115, - 88, - 34, - 18, - 32, - 154, - 114, - 45, - 169, - 221, - 15, - 128, - 184, - 40, - 176, - 117, - 102, - 132, - 157, - 67, - 191, - 102, - 214, - 236, - 32, - 194, - 205, - 62, - 6, - 185, - 208, - 140, - 211, - 250, - 125, - 237, - 65, - 100, - 115, - 111, - 108, - 99, - 67, - 0, - 8, - 18, - 0, - 51, - ]; - ///The bytecode of the contract. - pub static SUMMA_BYTECODE: ::ethers::core::types::Bytes = ::ethers::core::types::Bytes::from_static( - __BYTECODE, - ); - #[rustfmt::skip] - const __DEPLOYED_BYTECODE: &[u8] = &[ - 96, - 128, - 96, - 64, - 82, - 52, - 128, - 21, - 97, - 0, - 16, - 87, - 96, - 0, - 128, - 253, - 91, - 80, - 96, - 4, - 54, - 16, - 97, - 0, - 169, - 87, - 96, - 0, - 53, - 96, - 224, - 28, - 128, - 99, - 121, - 80, - 197, - 248, - 17, - 97, - 0, - 113, - 87, - 128, - 99, - 121, - 80, - 197, - 248, - 20, - 97, - 1, - 51, - 87, - 128, - 99, - 141, - 165, - 203, - 91, - 20, - 97, - 1, - 114, - 87, - 128, - 99, - 156, - 56, - 37, - 89, - 20, - 97, - 1, - 131, - 87, - 128, - 99, - 163, - 196, - 188, - 248, - 20, - 97, - 1, - 166, - 87, - 128, - 99, - 199, - 221, - 202, - 14, - 20, - 97, - 1, - 201, - 87, - 128, - 99, - 242, - 253, - 227, - 139, - 20, - 97, - 1, - 220, - 87, - 96, - 0, - 128, - 253, - 91, - 128, - 99, - 5, - 171, - 152, - 96, - 20, - 97, - 0, - 174, - 87, - 128, - 99, - 25, - 179, - 57, - 104, - 20, - 97, - 0, - 195, - 87, - 128, - 99, - 73, - 206, - 137, - 151, - 20, - 97, - 0, - 236, - 87, - 128, - 99, - 113, - 80, - 24, - 166, - 20, - 97, - 1, - 12, - 87, - 128, - 99, - 121, - 80, - 44, - 85, - 20, - 97, - 1, - 20, - 87, - 91, - 96, - 0, - 128, - 253, - 91, - 97, - 0, - 193, - 97, - 0, - 188, - 54, - 96, - 4, - 97, - 20, - 203, - 86, - 91, - 97, - 1, - 239, - 86, - 91, - 0, - 91, - 97, - 0, - 214, - 97, - 0, - 209, - 54, - 96, - 4, - 97, - 21, - 103, - 86, - 91, - 97, - 6, - 96, - 86, - 91, - 96, - 64, - 81, - 97, - 0, - 227, - 145, - 144, - 97, - 22, - 59, - 86, - 91, - 96, - 64, - 81, - 128, - 145, - 3, - 144, - 243, - 91, - 97, - 0, - 255, - 97, - 0, - 250, - 54, - 96, - 4, - 97, - 21, - 103, - 86, - 91, - 97, - 9, - 115, - 86, - 91, - 96, - 64, - 81, - 97, - 0, - 227, - 145, - 144, - 97, - 22, - 85, - 86, - 91, - 97, - 0, - 193, - 97, - 10, - 13, - 86, - 91, - 96, - 3, - 84, - 97, - 1, - 33, - 144, - 96, - 255, - 22, - 129, - 86, - 91, - 96, - 64, - 81, - 96, - 255, - 144, - 145, - 22, - 129, - 82, - 96, - 32, - 1, - 97, - 0, - 227, - 86, - 91, - 97, - 1, - 90, - 127, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 129, - 86, - 91, - 96, - 64, - 81, - 96, - 1, - 96, - 1, - 96, - 160, - 27, - 3, - 144, - 145, - 22, - 129, - 82, - 96, - 32, - 1, - 97, - 0, - 227, - 86, - 91, - 96, - 0, - 84, - 96, - 1, - 96, - 1, - 96, - 160, - 27, - 3, - 22, - 97, - 1, - 90, - 86, - 91, - 97, - 1, - 150, - 97, - 1, - 145, - 54, - 96, - 4, - 97, - 22, - 216, - 86, - 91, - 97, - 10, - 33, - 86, - 91, - 96, - 64, - 81, - 144, - 21, - 21, - 129, - 82, - 96, - 32, - 1, - 97, - 0, - 227, - 86, - 91, - 97, - 1, - 185, - 97, - 1, - 180, - 54, - 96, - 4, - 97, - 21, - 103, - 86, - 91, - 97, - 13, - 95, - 86, - 91, - 96, - 64, - 81, - 97, - 0, - 227, - 148, - 147, - 146, - 145, - 144, - 97, - 23, - 106, - 86, - 91, - 97, - 0, - 193, - 97, - 1, - 215, - 54, - 96, - 4, - 97, - 23, - 183, - 86, - 91, - 97, - 15, - 191, - 86, - 91, - 97, - 0, - 193, - 97, - 1, - 234, - 54, - 96, - 4, - 97, - 25, - 17, - 86, - 91, - 97, - 18, - 96, - 86, - 91, - 97, - 1, - 247, - 97, - 18, - 217, - 86, - 91, - 96, - 0, - 130, - 81, - 17, - 97, - 2, - 77, - 87, - 96, - 64, - 81, - 98, - 70, - 27, - 205, - 96, - 229, - 27, - 129, - 82, - 96, - 32, - 96, - 4, - 130, - 1, - 82, - 96, - 29, - 96, - 36, - 130, - 1, - 82, - 127, - 73, - 110, - 118, - 97, - 108, - 105, - 100, - 32, - 116, - 111, - 116, - 97, - 108, - 32, - 98, - 97, - 108, - 97, - 110, - 99, - 101, - 115, - 32, - 108, - 101, - 110, - 103, - 116, - 104, - 0, - 0, - 0, - 96, - 68, - 130, - 1, - 82, - 96, - 100, - 1, - 91, - 96, - 64, - 81, - 128, - 145, - 3, - 144, - 253, - 91, - 129, - 81, - 97, - 2, - 90, - 144, - 96, - 64, - 97, - 25, - 80, - 86, - 91, - 131, - 20, - 97, - 2, - 168, - 87, - 96, - 64, - 81, - 98, - 70, - 27, - 205, - 96, - 229, - 27, - 129, - 82, - 96, - 32, - 96, - 4, - 130, - 1, - 82, - 96, - 30, - 96, - 36, - 130, - 1, - 82, - 127, - 73, - 110, - 118, - 97, - 108, - 105, - 100, - 32, - 103, - 114, - 97, - 110, - 100, - 32, - 115, - 117, - 109, - 32, - 112, - 114, - 111, - 111, - 102, - 32, - 108, - 101, - 110, - 103, - 116, - 104, - 0, - 0, - 96, - 68, - 130, - 1, - 82, - 96, - 100, - 1, - 97, - 2, - 68, - 86, - 91, - 130, - 133, - 17, - 97, - 2, - 247, - 87, - 96, - 64, - 81, - 98, - 70, - 27, - 205, - 96, - 229, - 27, - 129, - 82, - 96, - 32, - 96, - 4, - 130, - 1, - 82, - 96, - 26, - 96, - 36, - 130, - 1, - 82, - 127, - 73, - 110, - 118, - 97, - 108, - 105, - 100, - 32, - 115, - 110, - 97, - 114, - 107, - 32, - 112, - 114, - 111, - 111, - 102, - 32, - 108, - 101, - 110, - 103, - 116, - 104, - 0, - 0, - 0, - 0, - 0, - 0, - 96, - 68, - 130, - 1, - 82, - 96, - 100, - 1, - 97, - 2, - 68, - 86, - 91, - 96, - 64, - 128, - 81, - 96, - 1, - 128, - 130, - 82, - 129, - 131, - 1, - 144, - 146, - 82, - 96, - 0, - 145, - 96, - 32, - 128, - 131, - 1, - 144, - 128, - 54, - 131, - 55, - 1, - 144, - 80, - 80, - 144, - 80, - 96, - 0, - 129, - 96, - 0, - 129, - 81, - 129, - 16, - 97, - 3, - 46, - 87, - 97, - 3, - 46, - 97, - 25, - 109, - 86, - 91, - 96, - 32, - 144, - 129, - 2, - 145, - 144, - 145, - 1, - 1, - 82, - 96, - 64, - 81, - 99, - 175, - 131, - 161, - 141, - 96, - 224, - 27, - 129, - 82, - 96, - 1, - 96, - 1, - 96, - 160, - 27, - 3, - 127, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 22, - 144, - 99, - 175, - 131, - 161, - 141, - 144, - 97, - 3, - 171, - 144, - 127, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 144, - 139, - 144, - 139, - 144, - 135, - 144, - 96, - 4, - 1, - 97, - 25, - 231, - 86, - 91, - 96, - 32, - 96, - 64, - 81, - 128, - 131, - 3, - 129, - 134, - 90, - 250, - 21, - 128, - 21, - 97, - 3, - 200, - 87, - 61, - 96, - 0, - 128, - 62, - 61, - 96, - 0, - 253, - 91, - 80, - 80, - 80, - 80, - 96, - 64, - 81, - 61, - 96, - 31, - 25, - 96, - 31, - 130, - 1, - 22, - 130, - 1, - 128, - 96, - 64, - 82, - 80, - 129, - 1, - 144, - 97, - 3, - 236, - 145, - 144, - 97, - 26, - 30, - 86, - 91, - 97, - 4, - 46, - 87, - 96, - 64, - 81, - 98, - 70, - 27, - 205, - 96, - 229, - 27, - 129, - 82, - 96, - 32, - 96, - 4, - 130, - 1, - 82, - 96, - 19, - 96, - 36, - 130, - 1, - 82, - 114, - 36, - 183, - 59, - 48, - 182, - 52, - 178, - 16, - 57, - 183, - 48, - 185, - 53, - 144, - 56, - 57, - 55, - 183, - 179, - 96, - 105, - 27, - 96, - 68, - 130, - 1, - 82, - 96, - 100, - 1, - 97, - 2, - 68, - 86, - 91, - 96, - 1, - 84, - 131, - 81, - 20, - 97, - 4, - 166, - 87, - 96, - 64, - 81, - 98, - 70, - 27, - 205, - 96, - 229, - 27, - 129, - 82, - 96, - 32, - 96, - 4, - 130, - 1, - 82, - 96, - 58, - 96, - 36, - 130, - 1, - 82, - 127, - 76, - 105, - 97, - 98, - 105, - 108, - 105, - 116, - 121, - 32, - 99, - 111, - 109, - 109, - 105, - 116, - 109, - 101, - 110, - 116, - 115, - 32, - 97, - 110, - 100, - 32, - 99, - 114, - 121, - 112, - 116, - 111, - 96, - 68, - 130, - 1, - 82, - 127, - 99, - 117, - 114, - 114, - 101, - 110, - 99, - 105, - 101, - 115, - 32, - 110, - 117, - 109, - 98, - 101, - 114, - 32, - 109, - 105, - 115, - 109, - 97, - 116, - 99, - 104, - 0, - 0, - 0, - 0, - 0, - 0, - 96, - 100, - 130, - 1, - 82, - 96, - 132, - 1, - 97, - 2, - 68, - 86, - 91, - 54, - 96, - 0, - 136, - 129, - 137, - 97, - 4, - 183, - 137, - 96, - 64, - 97, - 26, - 64, - 86, - 91, - 146, - 97, - 4, - 196, - 147, - 146, - 145, - 144, - 97, - 26, - 83, - 86, - 91, - 144, - 146, - 80, - 144, - 80, - 96, - 0, - 135, - 135, - 97, - 4, - 218, - 132, - 96, - 64, - 129, - 136, - 97, - 26, - 83, - 86, - 91, - 96, - 64, - 81, - 96, - 32, - 1, - 97, - 4, - 237, - 148, - 147, - 146, - 145, - 144, - 97, - 26, - 125, - 86, - 91, - 96, - 64, - 128, - 81, - 96, - 31, - 25, - 129, - 132, - 3, - 1, - 129, - 82, - 144, - 130, - 144, - 82, - 99, - 175, - 131, - 161, - 141, - 96, - 224, - 27, - 130, - 82, - 145, - 80, - 96, - 1, - 96, - 1, - 96, - 160, - 27, - 3, - 127, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 22, - 144, - 99, - 175, - 131, - 161, - 141, - 144, - 97, - 5, - 109, - 144, - 127, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 144, - 133, - 144, - 139, - 144, - 96, - 4, - 1, - 97, - 26, - 159, - 86, - 91, - 96, - 32, - 96, - 64, - 81, - 128, - 131, - 3, - 129, - 134, - 90, - 250, - 21, - 128, - 21, - 97, - 5, - 138, - 87, - 61, - 96, - 0, - 128, - 62, - 61, - 96, - 0, - 253, - 91, - 80, - 80, - 80, - 80, - 96, - 64, - 81, - 61, - 96, - 31, - 25, - 96, - 31, - 130, - 1, - 22, - 130, - 1, - 128, - 96, - 64, - 82, - 80, - 129, - 1, - 144, - 97, - 5, - 174, - 145, - 144, - 97, - 26, - 30, - 86, - 91, - 97, - 5, - 250, - 87, - 96, - 64, - 81, - 98, - 70, - 27, - 205, - 96, - 229, - 27, - 129, - 82, - 96, - 32, - 96, - 4, - 130, - 1, - 82, - 96, - 23, - 96, - 36, - 130, - 1, - 82, - 127, - 73, - 110, - 118, - 97, - 108, - 105, - 100, - 32, - 103, - 114, - 97, - 110, - 100, - 32, - 115, - 117, - 109, - 32, - 112, - 114, - 111, - 111, - 102, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 96, - 68, - 130, - 1, - 82, - 96, - 100, - 1, - 97, - 2, - 68, - 86, - 91, - 96, - 0, - 133, - 129, - 82, - 96, - 5, - 96, - 32, - 82, - 96, - 64, - 144, - 32, - 97, - 6, - 19, - 131, - 133, - 131, - 97, - 27, - 104, - 86, - 91, - 80, - 132, - 127, - 118, - 3, - 161, - 42, - 136, - 56, - 165, - 101, - 113, - 93, - 219, - 91, - 191, - 98, - 91, - 63, - 0, - 165, - 230, - 244, - 121, - 52, - 55, - 83, - 121, - 99, - 227, - 12, - 59, - 148, - 149, - 220, - 135, - 133, - 133, - 140, - 140, - 96, - 64, - 81, - 97, - 6, - 76, - 149, - 148, - 147, - 146, - 145, - 144, - 97, - 28, - 41, - 86, - 91, - 96, - 64, - 81, - 128, - 145, - 3, - 144, - 162, - 80, - 80, - 80, - 80, - 80, - 80, - 80, - 80, - 80, - 80, - 86, - 91, - 97, - 6, - 139, - 96, - 64, - 81, - 128, - 96, - 128, - 1, - 96, - 64, - 82, - 128, - 96, - 96, - 129, - 82, - 96, - 32, - 1, - 96, - 96, - 129, - 82, - 96, - 32, - 1, - 96, - 96, - 129, - 82, - 96, - 32, - 1, - 96, - 96, - 129, - 82, - 80, - 144, - 86, - 91, - 96, - 0, - 130, - 129, - 82, - 96, - 6, - 96, - 32, - 82, - 96, - 64, - 144, - 32, - 84, - 97, - 6, - 221, - 87, - 96, - 64, - 81, - 98, - 70, - 27, - 205, - 96, - 229, - 27, - 129, - 82, - 96, - 32, - 96, - 4, - 130, - 1, - 82, - 96, - 20, - 96, - 36, - 130, - 1, - 82, - 115, - 16, - 89, - 25, - 28, - 153, - 92, - 220, - 200, - 27, - 155, - 221, - 8, - 29, - 153, - 92, - 154, - 89, - 154, - 89, - 89, - 96, - 98, - 27, - 96, - 68, - 130, - 1, - 82, - 96, - 100, - 1, - 97, - 2, - 68, - 86, - 91, - 96, - 0, - 130, - 129, - 82, - 96, - 6, - 96, - 32, - 82, - 96, - 64, - 144, - 32, - 84, - 96, - 4, - 144, - 97, - 6, - 251, - 144, - 96, - 1, - 144, - 97, - 28, - 112, - 86, - 91, - 129, - 84, - 129, - 16, - 97, - 7, - 11, - 87, - 97, - 7, - 11, - 97, - 25, - 109, - 86, - 91, - 144, - 96, - 0, - 82, - 96, - 32, - 96, - 0, - 32, - 144, - 96, - 4, - 2, - 1, - 96, - 64, - 81, - 128, - 96, - 128, - 1, - 96, - 64, - 82, - 144, - 129, - 96, - 0, - 130, - 1, - 128, - 84, - 97, - 7, - 52, - 144, - 97, - 26, - 223, - 86, - 91, - 128, - 96, - 31, - 1, - 96, - 32, - 128, - 145, - 4, - 2, - 96, - 32, - 1, - 96, - 64, - 81, - 144, - 129, - 1, - 96, - 64, - 82, - 128, - 146, - 145, - 144, - 129, - 129, - 82, - 96, - 32, - 1, - 130, - 128, - 84, - 97, - 7, - 96, - 144, - 97, - 26, - 223, - 86, - 91, - 128, - 21, - 97, - 7, - 173, - 87, - 128, - 96, - 31, - 16, - 97, - 7, - 130, - 87, - 97, - 1, - 0, - 128, - 131, - 84, - 4, - 2, - 131, - 82, - 145, - 96, - 32, - 1, - 145, - 97, - 7, - 173, - 86, - 91, - 130, - 1, - 145, - 144, - 96, - 0, - 82, - 96, - 32, - 96, - 0, - 32, - 144, - 91, - 129, - 84, - 129, - 82, - 144, - 96, - 1, - 1, - 144, - 96, - 32, - 1, - 128, - 131, - 17, - 97, - 7, - 144, - 87, - 130, - 144, - 3, - 96, - 31, - 22, - 130, - 1, - 145, - 91, - 80, - 80, - 80, - 80, - 80, - 129, - 82, - 96, - 32, - 1, - 96, - 1, - 130, - 1, - 128, - 84, - 97, - 7, - 198, - 144, - 97, - 26, - 223, - 86, - 91, - 128, - 96, - 31, - 1, - 96, - 32, - 128, - 145, - 4, - 2, - 96, - 32, - 1, - 96, - 64, - 81, - 144, - 129, - 1, - 96, - 64, - 82, - 128, - 146, - 145, - 144, - 129, - 129, - 82, - 96, - 32, - 1, - 130, - 128, - 84, - 97, - 7, - 242, - 144, - 97, - 26, - 223, - 86, - 91, - 128, - 21, - 97, - 8, - 63, - 87, - 128, - 96, - 31, - 16, - 97, - 8, - 20, - 87, - 97, - 1, - 0, - 128, - 131, - 84, - 4, - 2, - 131, - 82, - 145, - 96, - 32, - 1, - 145, - 97, - 8, - 63, - 86, - 91, - 130, - 1, - 145, - 144, - 96, - 0, - 82, - 96, - 32, - 96, - 0, - 32, - 144, - 91, - 129, - 84, - 129, - 82, - 144, - 96, - 1, - 1, - 144, - 96, - 32, - 1, - 128, - 131, - 17, - 97, - 8, - 34, - 87, - 130, - 144, - 3, - 96, - 31, - 22, - 130, - 1, - 145, - 91, - 80, - 80, - 80, - 80, - 80, - 129, - 82, - 96, - 32, - 1, - 96, - 2, - 130, - 1, - 128, - 84, - 97, - 8, - 88, - 144, - 97, - 26, - 223, - 86, - 91, - 128, - 96, - 31, - 1, - 96, - 32, - 128, - 145, - 4, - 2, - 96, - 32, - 1, - 96, - 64, - 81, - 144, - 129, - 1, - 96, - 64, - 82, - 128, - 146, - 145, - 144, - 129, - 129, - 82, - 96, - 32, - 1, - 130, - 128, - 84, - 97, - 8, - 132, - 144, - 97, - 26, - 223, - 86, - 91, - 128, - 21, - 97, - 8, - 209, - 87, - 128, - 96, - 31, - 16, - 97, - 8, - 166, - 87, - 97, - 1, - 0, - 128, - 131, - 84, - 4, - 2, - 131, - 82, - 145, - 96, - 32, - 1, - 145, - 97, - 8, - 209, - 86, - 91, - 130, - 1, - 145, - 144, - 96, - 0, - 82, - 96, - 32, - 96, - 0, - 32, - 144, - 91, - 129, - 84, - 129, - 82, - 144, - 96, - 1, - 1, - 144, - 96, - 32, - 1, - 128, - 131, - 17, - 97, - 8, - 180, - 87, - 130, - 144, - 3, - 96, - 31, - 22, - 130, - 1, - 145, - 91, - 80, - 80, - 80, - 80, - 80, - 129, - 82, - 96, - 32, - 1, - 96, - 3, - 130, - 1, - 128, - 84, - 97, - 8, - 234, - 144, - 97, - 26, - 223, - 86, - 91, - 128, - 96, - 31, - 1, - 96, - 32, - 128, - 145, - 4, - 2, - 96, - 32, - 1, - 96, - 64, - 81, - 144, - 129, - 1, - 96, - 64, - 82, - 128, - 146, - 145, - 144, - 129, - 129, - 82, - 96, - 32, - 1, - 130, - 128, - 84, - 97, - 9, - 22, - 144, - 97, - 26, - 223, - 86, - 91, - 128, - 21, - 97, - 9, - 99, - 87, - 128, - 96, - 31, - 16, - 97, - 9, - 56, - 87, - 97, - 1, - 0, - 128, - 131, - 84, - 4, - 2, - 131, - 82, - 145, - 96, - 32, - 1, - 145, - 97, - 9, - 99, - 86, - 91, - 130, - 1, - 145, - 144, - 96, - 0, - 82, - 96, - 32, - 96, - 0, - 32, - 144, - 91, - 129, - 84, - 129, - 82, - 144, - 96, - 1, - 1, - 144, - 96, - 32, - 1, - 128, - 131, - 17, - 97, - 9, - 70, - 87, - 130, - 144, - 3, - 96, - 31, - 22, - 130, - 1, - 145, - 91, - 80, - 80, - 80, - 80, - 80, - 129, - 82, - 80, - 80, - 144, - 80, - 145, - 144, - 80, - 86, - 91, - 96, - 5, - 96, - 32, - 82, - 96, - 0, - 144, - 129, - 82, - 96, - 64, - 144, - 32, - 128, - 84, - 97, - 9, - 140, - 144, - 97, - 26, - 223, - 86, - 91, - 128, - 96, - 31, - 1, - 96, - 32, - 128, - 145, - 4, - 2, - 96, - 32, - 1, - 96, - 64, - 81, - 144, - 129, - 1, - 96, - 64, - 82, - 128, - 146, - 145, - 144, - 129, - 129, - 82, - 96, - 32, - 1, - 130, - 128, - 84, - 97, - 9, - 184, - 144, - 97, - 26, - 223, - 86, - 91, - 128, - 21, - 97, - 10, - 5, - 87, - 128, - 96, - 31, - 16, - 97, - 9, - 218, - 87, - 97, - 1, - 0, - 128, - 131, - 84, - 4, - 2, - 131, - 82, - 145, - 96, - 32, - 1, - 145, - 97, - 10, - 5, - 86, - 91, - 130, - 1, - 145, - 144, - 96, - 0, - 82, - 96, - 32, - 96, - 0, - 32, - 144, - 91, - 129, - 84, - 129, - 82, - 144, - 96, - 1, - 1, - 144, - 96, - 32, - 1, - 128, - 131, - 17, - 97, - 9, - 232, - 87, - 130, - 144, - 3, - 96, - 31, - 22, - 130, - 1, - 145, - 91, - 80, - 80, - 80, - 80, - 80, - 129, - 86, - 91, - 97, - 10, - 21, - 97, - 18, - 217, - 86, - 91, - 97, - 10, - 31, - 96, - 0, - 97, - 19, - 51, - 86, - 91, - 86, - 91, - 96, - 0, - 130, - 81, - 96, - 4, - 20, - 97, - 10, - 116, - 87, - 96, - 64, - 81, - 98, - 70, - 27, - 205, - 96, - 229, - 27, - 129, - 82, - 96, - 32, - 96, - 4, - 130, - 1, - 82, - 96, - 25, - 96, - 36, - 130, - 1, - 82, - 127, - 73, - 110, - 118, - 97, - 108, - 105, - 100, - 32, - 99, - 104, - 97, - 108, - 108, - 101, - 110, - 103, - 101, - 115, - 32, - 108, - 101, - 110, - 103, - 116, - 104, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 96, - 68, - 130, - 1, - 82, - 96, - 100, - 1, - 97, - 2, - 68, - 86, - 91, - 96, - 1, - 128, - 84, - 131, - 81, - 144, - 145, - 97, - 10, - 133, - 145, - 97, - 28, - 112, - 86, - 91, - 20, - 97, - 10, - 221, - 87, - 96, - 64, - 81, - 98, - 70, - 27, - 205, - 96, - 229, - 27, - 129, - 82, - 96, - 32, - 96, - 4, - 130, - 1, - 82, - 96, - 34, - 96, - 36, - 130, - 1, - 82, - 127, - 86, - 97, - 108, - 117, - 101, - 115, - 32, - 108, - 101, - 110, - 103, - 116, - 104, - 32, - 109, - 105, - 115, - 109, - 97, - 116, - 99, - 104, - 32, - 119, - 105, - 116, - 104, - 32, - 99, - 111, - 110, - 102, - 96, - 68, - 130, - 1, - 82, - 97, - 105, - 103, - 96, - 240, - 27, - 96, - 100, - 130, - 1, - 82, - 96, - 132, - 1, - 97, - 2, - 68, - 86, - 91, - 96, - 0, - 133, - 129, - 82, - 96, - 5, - 96, - 32, - 82, - 96, - 64, - 129, - 32, - 128, - 84, - 97, - 10, - 246, - 144, - 97, - 26, - 223, - 86, - 91, - 128, - 96, - 31, - 1, - 96, - 32, - 128, - 145, - 4, - 2, - 96, - 32, - 1, - 96, - 64, - 81, - 144, - 129, - 1, - 96, - 64, - 82, - 128, - 146, - 145, - 144, - 129, - 129, - 82, - 96, - 32, - 1, - 130, - 128, - 84, - 97, - 11, - 34, - 144, - 97, - 26, - 223, - 86, - 91, - 128, - 21, - 97, - 11, - 111, - 87, - 128, - 96, - 31, - 16, - 97, - 11, - 68, - 87, - 97, - 1, - 0, - 128, - 131, - 84, - 4, - 2, - 131, - 82, - 145, - 96, - 32, - 1, - 145, - 97, - 11, - 111, - 86, - 91, - 130, - 1, - 145, - 144, - 96, - 0, - 82, - 96, - 32, - 96, - 0, - 32, - 144, - 91, - 129, - 84, - 129, - 82, - 144, - 96, - 1, - 1, - 144, - 96, - 32, - 1, - 128, - 131, - 17, - 97, - 11, - 82, - 87, - 130, - 144, - 3, - 96, - 31, - 22, - 130, - 1, - 145, - 91, - 80, - 80, - 80, - 80, - 80, - 144, - 80, - 96, - 0, - 133, - 81, - 130, - 81, - 97, - 11, - 134, - 145, - 144, - 97, - 26, - 64, - 86, - 91, - 103, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 129, - 17, - 21, - 97, - 11, - 158, - 87, - 97, - 11, - 158, - 97, - 19, - 204, - 86, - 91, - 96, - 64, - 81, - 144, - 128, - 130, - 82, - 128, - 96, - 31, - 1, - 96, - 31, - 25, - 22, - 96, - 32, - 1, - 130, - 1, - 96, - 64, - 82, - 128, - 21, - 97, - 11, - 200, - 87, - 96, - 32, - 130, - 1, - 129, - 128, - 54, - 131, - 55, - 1, - 144, - 80, - 91, - 80, - 144, - 80, - 96, - 0, - 91, - 134, - 81, - 129, - 16, - 21, - 97, - 12, - 47, - 87, - 134, - 129, - 129, - 81, - 129, - 16, - 97, - 11, - 233, - 87, - 97, - 11, - 233, - 97, - 25, - 109, - 86, - 91, - 96, - 32, - 1, - 1, - 81, - 96, - 248, - 28, - 96, - 248, - 27, - 130, - 130, - 129, - 81, - 129, - 16, - 97, - 12, - 6, - 87, - 97, - 12, - 6, - 97, - 25, - 109, - 86, - 91, - 96, - 32, - 1, - 1, - 144, - 96, - 1, - 96, - 1, - 96, - 248, - 27, - 3, - 25, - 22, - 144, - 129, - 96, - 0, - 26, - 144, - 83, - 80, - 128, - 97, - 12, - 39, - 129, - 97, - 28, - 131, - 86, - 91, - 145, - 80, - 80, - 97, - 11, - 206, - 86, - 91, - 80, - 96, - 0, - 91, - 130, - 81, - 129, - 16, - 21, - 97, - 12, - 160, - 87, - 130, - 129, - 129, - 81, - 129, - 16, - 97, - 12, - 78, - 87, - 97, - 12, - 78, - 97, - 25, - 109, - 86, - 91, - 96, - 32, - 1, - 1, - 81, - 96, - 248, - 28, - 96, - 248, - 27, - 130, - 136, - 81, - 131, - 97, - 12, - 103, - 145, - 144, - 97, - 26, - 64, - 86, - 91, - 129, - 81, - 129, - 16, - 97, - 12, - 119, - 87, - 97, - 12, - 119, - 97, - 25, - 109, - 86, - 91, - 96, - 32, - 1, - 1, - 144, - 96, - 1, - 96, - 1, - 96, - 248, - 27, - 3, - 25, - 22, - 144, - 129, - 96, - 0, - 26, - 144, - 83, - 80, - 128, - 97, - 12, - 152, - 129, - 97, - 28, - 131, - 86, - 91, - 145, - 80, - 80, - 97, - 12, - 51, - 86, - 91, - 80, - 96, - 64, - 81, - 99, - 35, - 251, - 90, - 213, - 96, - 225, - 27, - 129, - 82, - 96, - 1, - 96, - 1, - 96, - 160, - 27, - 3, - 127, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 22, - 144, - 99, - 71, - 246, - 181, - 170, - 144, - 97, - 13, - 19, - 144, - 127, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 144, - 133, - 144, - 138, - 144, - 138, - 144, - 96, - 4, - 1, - 97, - 28, - 156, - 86, - 91, - 96, - 32, - 96, - 64, - 81, - 128, - 131, - 3, - 129, - 134, - 90, - 250, - 21, - 128, - 21, - 97, - 13, - 48, - 87, - 61, - 96, - 0, - 128, - 62, - 61, - 96, - 0, - 253, - 91, - 80, - 80, - 80, - 80, - 96, - 64, - 81, - 61, - 96, - 31, - 25, - 96, - 31, - 130, - 1, - 22, - 130, - 1, - 128, - 96, - 64, - 82, - 80, - 129, - 1, - 144, - 97, - 13, - 84, - 145, - 144, - 97, - 26, - 30, - 86, - 91, - 151, - 150, - 80, - 80, - 80, - 80, - 80, - 80, - 80, - 86, - 91, - 96, - 4, - 129, - 129, - 84, - 129, - 16, - 97, - 13, - 111, - 87, - 96, - 0, - 128, - 253, - 91, - 144, - 96, - 0, - 82, - 96, - 32, - 96, - 0, - 32, - 144, - 96, - 4, - 2, - 1, - 96, - 0, - 145, - 80, - 144, - 80, - 128, - 96, - 0, - 1, - 128, - 84, - 97, - 13, - 146, - 144, - 97, - 26, - 223, - 86, - 91, - 128, - 96, - 31, - 1, - 96, - 32, - 128, - 145, - 4, - 2, - 96, - 32, - 1, - 96, - 64, - 81, - 144, - 129, - 1, - 96, - 64, - 82, - 128, - 146, - 145, - 144, - 129, - 129, - 82, - 96, - 32, - 1, - 130, - 128, - 84, - 97, - 13, - 190, - 144, - 97, - 26, - 223, - 86, - 91, - 128, - 21, - 97, - 14, - 11, - 87, - 128, - 96, - 31, - 16, - 97, - 13, - 224, - 87, - 97, - 1, - 0, - 128, - 131, - 84, - 4, - 2, - 131, - 82, - 145, - 96, - 32, - 1, - 145, - 97, - 14, - 11, - 86, - 91, - 130, - 1, - 145, - 144, - 96, - 0, - 82, - 96, - 32, - 96, - 0, - 32, - 144, - 91, - 129, - 84, - 129, - 82, - 144, - 96, - 1, - 1, - 144, - 96, - 32, - 1, - 128, - 131, - 17, - 97, - 13, - 238, - 87, - 130, - 144, - 3, - 96, - 31, - 22, - 130, - 1, - 145, - 91, - 80, - 80, - 80, - 80, - 80, - 144, - 128, - 96, - 1, - 1, - 128, - 84, - 97, - 14, - 32, - 144, - 97, - 26, - 223, - 86, - 91, - 128, - 96, - 31, - 1, - 96, - 32, - 128, - 145, - 4, - 2, - 96, - 32, - 1, - 96, - 64, - 81, - 144, - 129, - 1, - 96, - 64, - 82, - 128, - 146, - 145, - 144, - 129, - 129, - 82, - 96, - 32, - 1, - 130, - 128, - 84, - 97, - 14, - 76, - 144, - 97, - 26, - 223, - 86, - 91, - 128, - 21, - 97, - 14, - 153, - 87, - 128, - 96, - 31, - 16, - 97, - 14, - 110, - 87, - 97, - 1, - 0, - 128, - 131, - 84, - 4, - 2, - 131, - 82, - 145, - 96, - 32, - 1, - 145, - 97, - 14, - 153, - 86, - 91, - 130, - 1, - 145, - 144, - 96, - 0, - 82, - 96, - 32, - 96, - 0, - 32, - 144, - 91, - 129, - 84, - 129, - 82, - 144, - 96, - 1, - 1, - 144, - 96, - 32, - 1, - 128, - 131, - 17, - 97, - 14, - 124, - 87, - 130, - 144, - 3, - 96, - 31, - 22, - 130, - 1, - 145, - 91, - 80, - 80, - 80, - 80, - 80, - 144, - 128, - 96, - 2, - 1, - 128, - 84, - 97, - 14, - 174, - 144, - 97, - 26, - 223, - 86, - 91, - 128, - 96, - 31, - 1, - 96, - 32, - 128, - 145, - 4, - 2, - 96, - 32, - 1, - 96, - 64, - 81, - 144, - 129, - 1, - 96, - 64, - 82, - 128, - 146, - 145, - 144, - 129, - 129, - 82, - 96, - 32, - 1, - 130, - 128, - 84, - 97, - 14, - 218, - 144, - 97, - 26, - 223, - 86, - 91, - 128, - 21, - 97, - 15, - 39, - 87, - 128, - 96, - 31, - 16, - 97, - 14, - 252, - 87, - 97, - 1, - 0, - 128, - 131, - 84, - 4, - 2, - 131, - 82, - 145, - 96, - 32, - 1, - 145, - 97, - 15, - 39, - 86, - 91, - 130, - 1, - 145, - 144, - 96, - 0, - 82, - 96, - 32, - 96, - 0, - 32, - 144, - 91, - 129, - 84, - 129, - 82, - 144, - 96, - 1, - 1, - 144, - 96, - 32, - 1, - 128, - 131, - 17, - 97, - 15, - 10, - 87, - 130, - 144, - 3, - 96, - 31, - 22, - 130, - 1, - 145, - 91, - 80, - 80, - 80, - 80, - 80, - 144, - 128, - 96, - 3, - 1, - 128, - 84, - 97, - 15, - 60, - 144, - 97, - 26, - 223, - 86, - 91, - 128, - 96, - 31, - 1, - 96, - 32, - 128, - 145, - 4, - 2, - 96, - 32, - 1, - 96, - 64, - 81, - 144, - 129, - 1, - 96, - 64, - 82, - 128, - 146, - 145, - 144, - 129, - 129, - 82, - 96, - 32, - 1, - 130, - 128, - 84, - 97, - 15, - 104, - 144, - 97, - 26, - 223, - 86, - 91, - 128, - 21, - 97, - 15, - 181, - 87, - 128, - 96, - 31, - 16, - 97, - 15, - 138, - 87, - 97, - 1, - 0, - 128, - 131, - 84, - 4, - 2, - 131, - 82, - 145, - 96, - 32, - 1, - 145, - 97, - 15, - 181, - 86, - 91, - 130, - 1, - 145, - 144, - 96, - 0, - 82, - 96, - 32, - 96, - 0, - 32, - 144, - 91, - 129, - 84, - 129, - 82, - 144, - 96, - 1, - 1, - 144, - 96, - 32, - 1, - 128, - 131, - 17, - 97, - 15, - 152, - 87, - 130, - 144, - 3, - 96, - 31, - 22, - 130, - 1, - 145, - 91, - 80, - 80, - 80, - 80, - 80, - 144, - 80, - 132, - 86, - 91, - 97, - 15, - 199, - 97, - 18, - 217, - 86, - 91, - 96, - 0, - 91, - 129, - 81, - 129, - 16, - 21, - 97, - 18, - 37, - 87, - 96, - 0, - 130, - 130, - 129, - 81, - 129, - 16, - 97, - 15, - 231, - 87, - 97, - 15, - 231, - 97, - 25, - 109, - 86, - 91, - 96, - 32, - 2, - 96, - 32, - 1, - 1, - 81, - 96, - 0, - 1, - 81, - 96, - 64, - 81, - 96, - 32, - 1, - 97, - 16, - 3, - 145, - 144, - 97, - 28, - 230, - 86, - 91, - 96, - 64, - 128, - 81, - 96, - 31, - 25, - 129, - 132, - 3, - 1, - 129, - 82, - 145, - 129, - 82, - 129, - 81, - 96, - 32, - 146, - 131, - 1, - 32, - 96, - 0, - 129, - 129, - 82, - 96, - 6, - 144, - 147, - 82, - 145, - 32, - 84, - 144, - 145, - 80, - 128, - 21, - 97, - 16, - 121, - 87, - 96, - 64, - 81, - 98, - 70, - 27, - 205, - 96, - 229, - 27, - 129, - 82, - 96, - 32, - 96, - 4, - 130, - 1, - 82, - 96, - 24, - 96, - 36, - 130, - 1, - 82, - 127, - 65, - 100, - 100, - 114, - 101, - 115, - 115, - 32, - 97, - 108, - 114, - 101, - 97, - 100, - 121, - 32, - 118, - 101, - 114, - 105, - 102, - 105, - 101, - 100, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 96, - 68, - 130, - 1, - 82, - 96, - 100, - 1, - 97, - 2, - 68, - 86, - 91, - 96, - 4, - 132, - 132, - 129, - 81, - 129, - 16, - 97, - 16, - 141, - 87, - 97, - 16, - 141, - 97, - 25, - 109, - 86, - 91, - 96, - 32, - 144, - 129, - 2, - 145, - 144, - 145, - 1, - 129, - 1, - 81, - 130, - 84, - 96, - 1, - 129, - 1, - 132, - 85, - 96, - 0, - 147, - 132, - 82, - 145, - 144, - 146, - 32, - 130, - 81, - 96, - 4, - 144, - 146, - 2, - 1, - 144, - 129, - 144, - 97, - 16, - 191, - 144, - 130, - 97, - 29, - 2, - 86, - 91, - 80, - 96, - 32, - 130, - 1, - 81, - 96, - 1, - 130, - 1, - 144, - 97, - 16, - 212, - 144, - 130, - 97, - 29, - 2, - 86, - 91, - 80, - 96, - 64, - 130, - 1, - 81, - 96, - 2, - 130, - 1, - 144, - 97, - 16, - 233, - 144, - 130, - 97, - 29, - 2, - 86, - 91, - 80, - 96, - 96, - 130, - 1, - 81, - 96, - 3, - 130, - 1, - 144, - 97, - 16, - 254, - 144, - 130, - 97, - 29, - 2, - 86, - 91, - 80, - 80, - 96, - 4, - 84, - 96, - 0, - 132, - 129, - 82, - 96, - 6, - 96, - 32, - 82, - 96, - 64, - 144, - 32, - 85, - 80, - 131, - 81, - 132, - 144, - 132, - 144, - 129, - 16, - 97, - 17, - 39, - 87, - 97, - 17, - 39, - 97, - 25, - 109, - 86, - 91, - 96, - 32, - 2, - 96, - 32, - 1, - 1, - 81, - 96, - 0, - 1, - 81, - 81, - 96, - 0, - 20, - 21, - 128, - 21, - 97, - 17, - 99, - 87, - 80, - 131, - 131, - 129, - 81, - 129, - 16, - 97, - 17, - 81, - 87, - 97, - 17, - 81, - 97, - 25, - 109, - 86, - 91, - 96, - 32, - 2, - 96, - 32, - 1, - 1, - 81, - 96, - 32, - 1, - 81, - 81, - 96, - 0, - 20, - 21, - 91, - 128, - 21, - 97, - 17, - 142, - 87, - 80, - 131, - 131, - 129, - 81, - 129, - 16, - 97, - 17, - 124, - 87, - 97, - 17, - 124, - 97, - 25, - 109, - 86, - 91, - 96, - 32, - 2, - 96, - 32, - 1, - 1, - 81, - 96, - 64, - 1, - 81, - 81, - 96, - 0, - 20, - 21, - 91, - 128, - 21, - 97, - 17, - 185, - 87, - 80, - 131, - 131, - 129, - 81, - 129, - 16, - 97, - 17, - 167, - 87, - 97, - 17, - 167, - 97, - 25, - 109, - 86, - 91, - 96, - 32, - 2, - 96, - 32, - 1, - 1, - 81, - 96, - 96, - 1, - 81, - 81, - 96, - 0, - 20, - 21, - 91, - 97, - 18, - 16, - 87, - 96, - 64, - 81, - 98, - 70, - 27, - 205, - 96, - 229, - 27, - 129, - 82, - 96, - 32, - 96, - 4, - 130, - 1, - 82, - 96, - 34, - 96, - 36, - 130, - 1, - 82, - 127, - 73, - 110, - 118, - 97, - 108, - 105, - 100, - 32, - 112, - 114, - 111, - 111, - 102, - 32, - 111, - 102, - 32, - 97, - 100, - 100, - 114, - 101, - 115, - 115, - 32, - 111, - 119, - 110, - 101, - 114, - 115, - 104, - 96, - 68, - 130, - 1, - 82, - 97, - 6, - 151, - 96, - 244, - 27, - 96, - 100, - 130, - 1, - 82, - 96, - 132, - 1, - 97, - 2, - 68, - 86, - 91, - 80, - 80, - 128, - 128, - 97, - 18, - 29, - 144, - 97, - 28, - 131, - 86, - 91, - 145, - 80, - 80, - 97, - 15, - 202, - 86, - 91, - 80, - 127, - 56, - 35, - 21, - 212, - 213, - 106, - 96, - 53, - 225, - 137, - 155, - 255, - 231, - 125, - 155, - 236, - 239, - 175, - 95, - 38, - 80, - 228, - 50, - 59, - 39, - 133, - 72, - 87, - 160, - 69, - 70, - 88, - 129, - 96, - 64, - 81, - 97, - 18, - 85, - 145, - 144, - 97, - 29, - 194, - 86, - 91, - 96, - 64, - 81, - 128, - 145, - 3, - 144, - 161, - 80, - 86, - 91, - 97, - 18, - 104, - 97, - 18, - 217, - 86, - 91, - 96, - 1, - 96, - 1, - 96, - 160, - 27, - 3, - 129, - 22, - 97, - 18, - 205, - 87, - 96, - 64, - 81, - 98, - 70, - 27, - 205, - 96, - 229, - 27, - 129, - 82, - 96, - 32, - 96, - 4, - 130, - 1, - 82, - 96, - 38, - 96, - 36, - 130, - 1, - 82, - 127, - 79, - 119, - 110, - 97, - 98, - 108, - 101, - 58, - 32, - 110, - 101, - 119, - 32, - 111, - 119, - 110, - 101, - 114, - 32, - 105, - 115, - 32, - 116, - 104, - 101, - 32, - 122, - 101, - 114, - 111, - 32, - 97, - 96, - 68, - 130, - 1, - 82, - 101, - 100, - 100, - 114, - 101, - 115, - 115, - 96, - 208, - 27, - 96, - 100, - 130, - 1, - 82, - 96, - 132, - 1, - 97, - 2, - 68, - 86, - 91, - 97, - 18, - 214, - 129, - 97, - 19, - 51, - 86, - 91, - 80, - 86, - 91, - 96, - 0, - 84, - 96, - 1, - 96, - 1, - 96, - 160, - 27, - 3, - 22, - 51, - 20, - 97, - 10, - 31, - 87, - 96, - 64, - 81, - 98, - 70, - 27, - 205, - 96, - 229, - 27, - 129, - 82, - 96, - 32, - 96, - 4, - 130, - 1, - 129, - 144, - 82, - 96, - 36, - 130, - 1, - 82, - 127, - 79, - 119, - 110, - 97, - 98, - 108, - 101, - 58, - 32, - 99, - 97, - 108, - 108, - 101, - 114, - 32, - 105, - 115, - 32, - 110, - 111, - 116, - 32, - 116, - 104, - 101, - 32, - 111, - 119, - 110, - 101, - 114, - 96, - 68, - 130, - 1, - 82, - 96, - 100, - 1, - 97, - 2, - 68, - 86, - 91, - 96, - 0, - 128, - 84, - 96, - 1, - 96, - 1, - 96, - 160, - 27, - 3, - 131, - 129, - 22, - 96, - 1, - 96, - 1, - 96, - 160, - 27, - 3, - 25, - 131, - 22, - 129, - 23, - 132, - 85, - 96, - 64, - 81, - 145, - 144, - 146, - 22, - 146, - 131, - 145, - 127, - 139, - 224, - 7, - 156, - 83, - 22, - 89, - 20, - 19, - 68, - 205, - 31, - 208, - 164, - 242, - 132, - 25, - 73, - 127, - 151, - 34, - 163, - 218, - 175, - 227, - 180, - 24, - 111, - 107, - 100, - 87, - 224, - 145, - 144, - 163, - 80, - 80, - 86, - 91, - 96, - 0, - 128, - 131, - 96, - 31, - 132, - 1, - 18, - 97, - 19, - 149, - 87, - 96, - 0, - 128, - 253, - 91, - 80, - 129, - 53, - 103, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 129, - 17, - 21, - 97, - 19, - 173, - 87, - 96, - 0, - 128, - 253, - 91, - 96, - 32, - 131, - 1, - 145, - 80, - 131, - 96, - 32, - 130, - 133, - 1, - 1, - 17, - 21, - 97, - 19, - 197, - 87, - 96, - 0, - 128, - 253, - 91, - 146, - 80, - 146, - 144, - 80, - 86, - 91, - 99, - 78, - 72, - 123, - 113, - 96, - 224, - 27, - 96, - 0, - 82, - 96, - 65, - 96, - 4, - 82, - 96, - 36, - 96, - 0, - 253, - 91, - 96, - 64, - 81, - 96, - 128, - 129, - 1, - 103, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 129, - 17, - 130, - 130, - 16, - 23, - 21, - 97, - 20, - 5, - 87, - 97, - 20, - 5, - 97, - 19, - 204, - 86, - 91, - 96, - 64, - 82, - 144, - 86, - 91, - 96, - 64, - 81, - 96, - 31, - 130, - 1, - 96, - 31, - 25, - 22, - 129, - 1, - 103, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 129, - 17, - 130, - 130, - 16, - 23, - 21, - 97, - 20, - 52, - 87, - 97, - 20, - 52, - 97, - 19, - 204, - 86, - 91, - 96, - 64, - 82, - 145, - 144, - 80, - 86, - 91, - 96, - 0, - 103, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 130, - 17, - 21, - 97, - 20, - 86, - 87, - 97, - 20, - 86, - 97, - 19, - 204, - 86, - 91, - 80, - 96, - 5, - 27, - 96, - 32, - 1, - 144, - 86, - 91, - 96, - 0, - 130, - 96, - 31, - 131, - 1, - 18, - 97, - 20, - 113, - 87, - 96, - 0, - 128, - 253, - 91, - 129, - 53, - 96, - 32, - 97, - 20, - 134, - 97, - 20, - 129, - 131, - 97, - 20, - 60, - 86, - 91, - 97, - 20, - 11, - 86, - 91, - 130, - 129, - 82, - 96, - 5, - 146, - 144, - 146, - 27, - 132, - 1, - 129, - 1, - 145, - 129, - 129, - 1, - 144, - 134, - 132, - 17, - 21, - 97, - 20, - 165, - 87, - 96, - 0, - 128, - 253, - 91, - 130, - 134, - 1, - 91, - 132, - 129, - 16, - 21, - 97, - 20, - 192, - 87, - 128, - 53, - 131, - 82, - 145, - 131, - 1, - 145, - 131, - 1, - 97, - 20, - 169, - 86, - 91, - 80, - 150, - 149, - 80, - 80, - 80, - 80, - 80, - 80, - 86, - 91, - 96, - 0, - 128, - 96, - 0, - 128, - 96, - 0, - 128, - 96, - 128, - 135, - 137, - 3, - 18, - 21, - 97, - 20, - 228, - 87, - 96, - 0, - 128, - 253, - 91, - 134, - 53, - 103, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 128, - 130, - 17, - 21, - 97, - 20, - 252, - 87, - 96, - 0, - 128, - 253, - 91, - 97, - 21, - 8, - 138, - 131, - 139, - 1, - 97, - 19, - 131, - 86, - 91, - 144, - 152, - 80, - 150, - 80, - 96, - 32, - 137, - 1, - 53, - 145, - 80, - 128, - 130, - 17, - 21, - 97, - 21, - 33, - 87, - 96, - 0, - 128, - 253, - 91, - 97, - 21, - 45, - 138, - 131, - 139, - 1, - 97, - 19, - 131, - 86, - 91, - 144, - 150, - 80, - 148, - 80, - 96, - 64, - 137, - 1, - 53, - 145, - 80, - 128, - 130, - 17, - 21, - 97, - 21, - 70, - 87, - 96, - 0, - 128, - 253, - 91, - 80, - 97, - 21, - 83, - 137, - 130, - 138, - 1, - 97, - 20, - 96, - 86, - 91, - 146, - 80, - 80, - 96, - 96, - 135, - 1, - 53, - 144, - 80, - 146, - 149, - 80, - 146, - 149, - 80, - 146, - 149, - 86, - 91, - 96, - 0, - 96, - 32, - 130, - 132, - 3, - 18, - 21, - 97, - 21, - 121, - 87, - 96, - 0, - 128, - 253, - 91, - 80, - 53, - 145, - 144, - 80, - 86, - 91, - 96, - 0, - 91, - 131, - 129, - 16, - 21, - 97, - 21, - 155, - 87, - 129, - 129, - 1, - 81, - 131, - 130, - 1, - 82, - 96, - 32, - 1, - 97, - 21, - 131, - 86, - 91, - 80, - 80, - 96, - 0, - 145, - 1, - 82, - 86, - 91, - 96, - 0, - 129, - 81, - 128, - 132, - 82, - 97, - 21, - 188, - 129, - 96, - 32, - 134, - 1, - 96, - 32, - 134, - 1, - 97, - 21, - 128, - 86, - 91, - 96, - 31, - 1, - 96, - 31, - 25, - 22, - 146, - 144, - 146, - 1, - 96, - 32, - 1, - 146, - 145, - 80, - 80, - 86, - 91, - 96, - 0, - 129, - 81, - 96, - 128, - 132, - 82, - 97, - 21, - 229, - 96, - 128, - 133, - 1, - 130, - 97, - 21, - 164, - 86, - 91, - 144, - 80, - 96, - 32, - 131, - 1, - 81, - 132, - 130, - 3, - 96, - 32, - 134, - 1, - 82, - 97, - 21, - 254, - 130, - 130, - 97, - 21, - 164, - 86, - 91, - 145, - 80, - 80, - 96, - 64, - 131, - 1, - 81, - 132, - 130, - 3, - 96, - 64, - 134, - 1, - 82, - 97, - 22, - 24, - 130, - 130, - 97, - 21, - 164, - 86, - 91, - 145, - 80, - 80, - 96, - 96, - 131, - 1, - 81, - 132, - 130, - 3, - 96, - 96, - 134, - 1, - 82, - 97, - 22, - 50, - 130, - 130, - 97, - 21, - 164, - 86, - 91, - 149, - 148, - 80, - 80, - 80, - 80, - 80, - 86, - 91, - 96, - 32, - 129, - 82, - 96, - 0, - 97, - 22, - 78, - 96, - 32, - 131, - 1, - 132, - 97, - 21, - 208, - 86, - 91, - 147, - 146, - 80, - 80, - 80, - 86, - 91, - 96, - 32, - 129, - 82, - 96, - 0, - 97, - 22, - 78, - 96, - 32, - 131, - 1, - 132, - 97, - 21, - 164, - 86, - 91, - 96, - 0, - 130, - 96, - 31, - 131, - 1, - 18, - 97, - 22, - 121, - 87, - 96, - 0, - 128, - 253, - 91, - 129, - 53, - 103, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 129, - 17, - 21, - 97, - 22, - 147, - 87, - 97, - 22, - 147, - 97, - 19, - 204, - 86, - 91, - 97, - 22, - 166, - 96, - 31, - 130, - 1, - 96, - 31, - 25, - 22, - 96, - 32, - 1, - 97, - 20, - 11, - 86, - 91, - 129, - 129, - 82, - 132, - 96, - 32, - 131, - 134, - 1, - 1, - 17, - 21, - 97, - 22, - 187, - 87, - 96, - 0, - 128, - 253, - 91, - 129, - 96, - 32, - 133, - 1, - 96, - 32, - 131, - 1, - 55, - 96, - 0, - 145, - 129, - 1, - 96, - 32, - 1, - 145, - 144, - 145, - 82, - 147, - 146, - 80, - 80, - 80, - 86, - 91, - 96, - 0, - 128, - 96, - 0, - 128, - 96, - 128, - 133, - 135, - 3, - 18, - 21, - 97, - 22, - 238, - 87, - 96, - 0, - 128, - 253, - 91, - 132, - 53, - 147, - 80, - 96, - 32, - 133, - 1, - 53, - 103, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 128, - 130, - 17, - 21, - 97, - 23, - 13, - 87, - 96, - 0, - 128, - 253, - 91, - 97, - 23, - 25, - 136, - 131, - 137, - 1, - 97, - 22, - 104, - 86, - 91, - 148, - 80, - 96, - 64, - 135, - 1, - 53, - 145, - 80, - 128, - 130, - 17, - 21, - 97, - 23, - 47, - 87, - 96, - 0, - 128, - 253, - 91, - 97, - 23, - 59, - 136, - 131, - 137, - 1, - 97, - 20, - 96, - 86, - 91, - 147, - 80, - 96, - 96, - 135, - 1, - 53, - 145, - 80, - 128, - 130, - 17, - 21, - 97, - 23, - 81, - 87, - 96, - 0, - 128, - 253, - 91, - 80, - 97, - 23, - 94, - 135, - 130, - 136, - 1, - 97, - 20, - 96, - 86, - 91, - 145, - 80, - 80, - 146, - 149, - 145, - 148, - 80, - 146, - 80, - 86, - 91, - 96, - 128, - 129, - 82, - 96, - 0, - 97, - 23, - 125, - 96, - 128, - 131, - 1, - 135, - 97, - 21, - 164, - 86, - 91, - 130, - 129, - 3, - 96, - 32, - 132, - 1, - 82, - 97, - 23, - 143, - 129, - 135, - 97, - 21, - 164, - 86, - 91, - 144, - 80, - 130, - 129, - 3, - 96, - 64, - 132, - 1, - 82, - 97, - 23, - 163, - 129, - 134, - 97, - 21, - 164, - 86, - 91, - 144, - 80, - 130, - 129, - 3, - 96, - 96, - 132, - 1, - 82, - 97, - 13, - 84, - 129, - 133, - 97, - 21, - 164, - 86, - 91, - 96, - 0, - 96, - 32, - 128, - 131, - 133, - 3, - 18, - 21, - 97, - 23, - 202, - 87, - 96, - 0, - 128, - 253, - 91, - 130, - 53, - 103, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 128, - 130, - 17, - 21, - 97, - 23, - 226, - 87, - 96, - 0, - 128, - 253, - 91, - 129, - 133, - 1, - 145, - 80, - 133, - 96, - 31, - 131, - 1, - 18, - 97, - 23, - 246, - 87, - 96, - 0, - 128, - 253, - 91, - 129, - 53, - 97, - 24, - 4, - 97, - 20, - 129, - 130, - 97, - 20, - 60, - 86, - 91, - 129, - 129, - 82, - 96, - 5, - 145, - 144, - 145, - 27, - 131, - 1, - 132, - 1, - 144, - 132, - 129, - 1, - 144, - 136, - 131, - 17, - 21, - 97, - 24, - 35, - 87, - 96, - 0, - 128, - 253, - 91, - 133, - 133, - 1, - 91, - 131, - 129, - 16, - 21, - 97, - 25, - 4, - 87, - 128, - 53, - 133, - 129, - 17, - 21, - 97, - 24, - 62, - 87, - 96, - 0, - 128, - 253, - 91, - 134, - 1, - 96, - 128, - 129, - 140, - 3, - 96, - 31, - 25, - 1, - 18, - 21, - 97, - 24, - 85, - 87, - 96, - 0, - 128, - 129, - 253, - 91, - 97, - 24, - 93, - 97, - 19, - 226, - 86, - 91, - 136, - 130, - 1, - 53, - 135, - 129, - 17, - 21, - 97, - 24, - 111, - 87, - 96, - 0, - 128, - 129, - 253, - 91, - 97, - 24, - 125, - 141, - 139, - 131, - 134, - 1, - 1, - 97, - 22, - 104, - 86, - 91, - 130, - 82, - 80, - 96, - 64, - 128, - 131, - 1, - 53, - 136, - 129, - 17, - 21, - 97, - 24, - 148, - 87, - 96, - 0, - 128, - 129, - 253, - 91, - 97, - 24, - 162, - 142, - 140, - 131, - 135, - 1, - 1, - 97, - 22, - 104, - 86, - 91, - 139, - 132, - 1, - 82, - 80, - 96, - 96, - 128, - 132, - 1, - 53, - 137, - 129, - 17, - 21, - 97, - 24, - 187, - 87, - 96, - 0, - 128, - 129, - 253, - 91, - 97, - 24, - 201, - 143, - 141, - 131, - 136, - 1, - 1, - 97, - 22, - 104, - 86, - 91, - 131, - 133, - 1, - 82, - 80, - 96, - 128, - 132, - 1, - 53, - 145, - 80, - 136, - 130, - 17, - 21, - 97, - 24, - 227, - 87, - 96, - 0, - 128, - 129, - 253, - 91, - 97, - 24, - 241, - 142, - 140, - 132, - 135, - 1, - 1, - 97, - 22, - 104, - 86, - 91, - 144, - 131, - 1, - 82, - 80, - 132, - 82, - 80, - 145, - 134, - 1, - 145, - 134, - 1, - 97, - 24, - 39, - 86, - 91, - 80, - 152, - 151, - 80, - 80, - 80, - 80, - 80, - 80, - 80, - 80, - 86, - 91, - 96, - 0, - 96, - 32, - 130, - 132, - 3, - 18, - 21, - 97, - 25, - 35, - 87, - 96, - 0, - 128, - 253, - 91, - 129, - 53, - 96, - 1, - 96, - 1, - 96, - 160, - 27, - 3, - 129, - 22, - 129, - 20, - 97, - 22, - 78, - 87, - 96, - 0, - 128, - 253, - 91, - 99, - 78, - 72, - 123, - 113, - 96, - 224, - 27, - 96, - 0, - 82, - 96, - 17, - 96, - 4, - 82, - 96, - 36, - 96, - 0, - 253, - 91, - 128, - 130, - 2, - 129, - 21, - 130, - 130, - 4, - 132, - 20, - 23, - 97, - 25, - 103, - 87, - 97, - 25, - 103, - 97, - 25, - 58, - 86, - 91, - 146, - 145, - 80, - 80, - 86, - 91, - 99, - 78, - 72, - 123, - 113, - 96, - 224, - 27, - 96, - 0, - 82, - 96, - 50, - 96, - 4, - 82, - 96, - 36, - 96, - 0, - 253, - 91, - 129, - 131, - 82, - 129, - 129, - 96, - 32, - 133, - 1, - 55, - 80, - 96, - 0, - 130, - 130, - 1, - 96, - 32, - 144, - 129, - 1, - 145, - 144, - 145, - 82, - 96, - 31, - 144, - 145, - 1, - 96, - 31, - 25, - 22, - 144, - 145, - 1, - 1, - 144, - 86, - 91, - 96, - 0, - 129, - 81, - 128, - 132, - 82, - 96, - 32, - 128, - 133, - 1, - 148, - 80, - 128, - 132, - 1, - 96, - 0, - 91, - 131, - 129, - 16, - 21, - 97, - 25, - 220, - 87, - 129, - 81, - 135, - 82, - 149, - 130, - 1, - 149, - 144, - 130, - 1, - 144, - 96, - 1, - 1, - 97, - 25, - 192, - 86, - 91, - 80, - 148, - 149, - 148, - 80, - 80, - 80, - 80, - 80, - 86, - 91, - 96, - 1, - 96, - 1, - 96, - 160, - 27, - 3, - 133, - 22, - 129, - 82, - 96, - 96, - 96, - 32, - 130, - 1, - 129, - 144, - 82, - 96, - 0, - 144, - 97, - 26, - 12, - 144, - 131, - 1, - 133, - 135, - 97, - 25, - 131, - 86, - 91, - 130, - 129, - 3, - 96, - 64, - 132, - 1, - 82, - 97, - 13, - 84, - 129, - 133, - 97, - 25, - 172, - 86, - 91, - 96, - 0, - 96, - 32, - 130, - 132, - 3, - 18, - 21, - 97, - 26, - 48, - 87, - 96, - 0, - 128, - 253, - 91, - 129, - 81, - 128, - 21, - 21, - 129, - 20, - 97, - 22, - 78, - 87, - 96, - 0, - 128, - 253, - 91, - 128, - 130, - 1, - 128, - 130, - 17, - 21, - 97, - 25, - 103, - 87, - 97, - 25, - 103, - 97, - 25, - 58, - 86, - 91, - 96, - 0, - 128, - 133, - 133, - 17, - 21, - 97, - 26, - 99, - 87, - 96, - 0, - 128, - 253, - 91, - 131, - 134, - 17, - 21, - 97, - 26, - 112, - 87, - 96, - 0, - 128, - 253, - 91, - 80, - 80, - 130, - 1, - 147, - 145, - 144, - 146, - 3, - 145, - 80, - 86, - 91, - 131, - 133, - 130, - 55, - 96, - 0, - 132, - 130, - 1, - 96, - 0, - 129, - 82, - 131, - 133, - 130, - 55, - 96, - 0, - 147, - 1, - 146, - 131, - 82, - 80, - 144, - 148, - 147, - 80, - 80, - 80, - 80, - 86, - 91, - 96, - 1, - 96, - 1, - 96, - 160, - 27, - 3, - 132, - 22, - 129, - 82, - 96, - 96, - 96, - 32, - 130, - 1, - 129, - 144, - 82, - 96, - 0, - 144, - 97, - 26, - 195, - 144, - 131, - 1, - 133, - 97, - 21, - 164, - 86, - 91, - 130, - 129, - 3, - 96, - 64, - 132, - 1, - 82, - 97, - 26, - 213, - 129, - 133, - 97, - 25, - 172, - 86, - 91, - 150, - 149, - 80, - 80, - 80, - 80, - 80, - 80, - 86, - 91, - 96, - 1, - 129, - 129, - 28, - 144, - 130, - 22, - 128, - 97, - 26, - 243, - 87, - 96, - 127, - 130, - 22, - 145, - 80, - 91, - 96, - 32, - 130, - 16, - 129, - 3, - 97, - 27, - 19, - 87, - 99, - 78, - 72, - 123, - 113, - 96, - 224, - 27, - 96, - 0, - 82, - 96, - 34, - 96, - 4, - 82, - 96, - 36, - 96, - 0, - 253, - 91, - 80, - 145, - 144, - 80, - 86, - 91, - 96, - 31, - 130, - 17, - 21, - 97, - 27, - 99, - 87, - 96, - 0, - 129, - 129, - 82, - 96, - 32, - 129, - 32, - 96, - 31, - 133, - 1, - 96, - 5, - 28, - 129, - 1, - 96, - 32, - 134, - 16, - 21, - 97, - 27, - 64, - 87, - 80, - 128, - 91, - 96, - 31, - 133, - 1, - 96, - 5, - 28, - 130, - 1, - 145, - 80, - 91, - 129, - 129, - 16, - 21, - 97, - 27, - 95, - 87, - 130, - 129, - 85, - 96, - 1, - 1, - 97, - 27, - 76, - 86, - 91, - 80, - 80, - 80, - 91, - 80, - 80, - 80, - 86, - 91, - 103, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 131, - 17, - 21, - 97, - 27, - 128, - 87, - 97, - 27, - 128, - 97, - 19, - 204, - 86, - 91, - 97, - 27, - 148, - 131, - 97, - 27, - 142, - 131, - 84, - 97, - 26, - 223, - 86, - 91, - 131, - 97, - 27, - 25, - 86, - 91, - 96, - 0, - 96, - 31, - 132, - 17, - 96, - 1, - 129, - 20, - 97, - 27, - 200, - 87, - 96, - 0, - 133, - 21, - 97, - 27, - 176, - 87, - 80, - 131, - 130, - 1, - 53, - 91, - 96, - 0, - 25, - 96, - 3, - 135, - 144, - 27, - 28, - 25, - 22, - 96, - 1, - 134, - 144, - 27, - 23, - 131, - 85, - 97, - 28, - 34, - 86, - 91, - 96, - 0, - 131, - 129, - 82, - 96, - 32, - 144, - 32, - 96, - 31, - 25, - 134, - 22, - 144, - 131, - 91, - 130, - 129, - 16, - 21, - 97, - 27, - 249, - 87, - 134, - 133, - 1, - 53, - 130, - 85, - 96, - 32, - 148, - 133, - 1, - 148, - 96, - 1, - 144, - 146, - 1, - 145, - 1, - 97, - 27, - 217, - 86, - 91, - 80, - 134, - 130, - 16, - 21, - 97, - 28, - 22, - 87, - 96, - 0, - 25, - 96, - 248, - 136, - 96, - 3, - 27, - 22, - 28, - 25, - 132, - 135, - 1, - 53, - 22, - 129, - 85, - 91, - 80, - 80, - 96, - 1, - 133, - 96, - 1, - 27, - 1, - 131, - 85, - 91, - 80, - 80, - 80, - 80, - 80, - 86, - 91, - 96, - 96, - 129, - 82, - 96, - 0, - 97, - 28, - 60, - 96, - 96, - 131, - 1, - 136, - 97, - 25, - 172, - 86, - 91, - 130, - 129, - 3, - 96, - 32, - 132, - 1, - 82, - 97, - 28, - 79, - 129, - 135, - 137, - 97, - 25, - 131, - 86, - 91, - 144, - 80, - 130, - 129, - 3, - 96, - 64, - 132, - 1, - 82, - 97, - 28, - 100, - 129, - 133, - 135, - 97, - 25, - 131, - 86, - 91, - 152, - 151, - 80, - 80, - 80, - 80, - 80, - 80, - 80, - 80, - 86, - 91, - 129, - 129, - 3, - 129, - 129, - 17, - 21, - 97, - 25, - 103, - 87, - 97, - 25, - 103, - 97, - 25, - 58, - 86, - 91, - 96, - 0, - 96, - 1, - 130, - 1, - 97, - 28, - 149, - 87, - 97, - 28, - 149, - 97, - 25, - 58, - 86, - 91, - 80, - 96, - 1, - 1, - 144, - 86, - 91, - 96, - 1, - 96, - 1, - 96, - 160, - 27, - 3, - 133, - 22, - 129, - 82, - 96, - 128, - 96, - 32, - 130, - 1, - 129, - 144, - 82, - 96, - 0, - 144, - 97, - 28, - 192, - 144, - 131, - 1, - 134, - 97, - 21, - 164, - 86, - 91, - 130, - 129, - 3, - 96, - 64, - 132, - 1, - 82, - 97, - 28, - 210, - 129, - 134, - 97, - 25, - 172, - 86, - 91, - 144, - 80, - 130, - 129, - 3, - 96, - 96, - 132, - 1, - 82, - 97, - 13, - 84, - 129, - 133, - 97, - 25, - 172, - 86, - 91, - 96, - 0, - 130, - 81, - 97, - 28, - 248, - 129, - 132, - 96, - 32, - 135, - 1, - 97, - 21, - 128, - 86, - 91, - 145, - 144, - 145, - 1, - 146, - 145, - 80, - 80, - 86, - 91, - 129, - 81, - 103, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 129, - 17, - 21, - 97, - 29, - 28, - 87, - 97, - 29, - 28, - 97, - 19, - 204, - 86, - 91, - 97, - 29, - 48, - 129, - 97, - 29, - 42, - 132, - 84, - 97, - 26, - 223, - 86, - 91, - 132, - 97, - 27, - 25, - 86, - 91, - 96, - 32, - 128, - 96, - 31, - 131, - 17, - 96, - 1, - 129, - 20, - 97, - 29, - 101, - 87, - 96, - 0, - 132, - 21, - 97, - 29, - 77, - 87, - 80, - 133, - 131, - 1, - 81, - 91, - 96, - 0, - 25, - 96, - 3, - 134, - 144, - 27, - 28, - 25, - 22, - 96, - 1, - 133, - 144, - 27, - 23, - 133, - 85, - 97, - 27, - 95, - 86, - 91, - 96, - 0, - 133, - 129, - 82, - 96, - 32, - 129, - 32, - 96, - 31, - 25, - 134, - 22, - 145, - 91, - 130, - 129, - 16, - 21, - 97, - 29, - 148, - 87, - 136, - 134, - 1, - 81, - 130, - 85, - 148, - 132, - 1, - 148, - 96, - 1, - 144, - 145, - 1, - 144, - 132, - 1, - 97, - 29, - 117, - 86, - 91, - 80, - 133, - 130, - 16, - 21, - 97, - 29, - 178, - 87, - 135, - 133, - 1, - 81, - 96, - 0, - 25, - 96, - 3, - 136, - 144, - 27, - 96, - 248, - 22, - 28, - 25, - 22, - 129, - 85, - 91, - 80, - 80, - 80, - 80, - 80, - 96, - 1, - 144, - 129, - 27, - 1, - 144, - 85, - 80, - 86, - 91, - 96, - 0, - 96, - 32, - 128, - 131, - 1, - 129, - 132, - 82, - 128, - 133, - 81, - 128, - 131, - 82, - 96, - 64, - 134, - 1, - 145, - 80, - 96, - 64, - 129, - 96, - 5, - 27, - 135, - 1, - 1, - 146, - 80, - 131, - 135, - 1, - 96, - 0, - 91, - 130, - 129, - 16, - 21, - 97, - 30, - 23, - 87, - 96, - 63, - 25, - 136, - 134, - 3, - 1, - 132, - 82, - 97, - 30, - 5, - 133, - 131, - 81, - 97, - 21, - 208, - 86, - 91, - 148, - 80, - 146, - 133, - 1, - 146, - 144, - 133, - 1, - 144, - 96, - 1, - 1, - 97, - 29, - 233, - 86, - 91, - 80, - 146, - 151, - 150, - 80, - 80, - 80, - 80, - 80, - 80, - 80, - 86, - 254, - 162, - 100, - 105, - 112, - 102, - 115, - 88, - 34, - 18, - 32, - 154, - 114, - 45, - 169, - 221, - 15, - 128, - 184, - 40, - 176, - 117, - 102, - 132, - 157, - 67, - 191, - 102, - 214, - 236, - 32, - 194, - 205, - 62, - 6, - 185, - 208, - 140, - 211, - 250, - 125, - 237, - 65, - 100, - 115, - 111, - 108, - 99, - 67, - 0, - 8, - 18, - 0, - 51, - ]; - ///The deployed bytecode of the contract. - pub static SUMMA_DEPLOYED_BYTECODE: ::ethers::core::types::Bytes = ::ethers::core::types::Bytes::from_static( - __DEPLOYED_BYTECODE, - ); - pub struct Summa(::ethers::contract::Contract); - impl ::core::clone::Clone for Summa { - fn clone(&self) -> Self { - Self(::core::clone::Clone::clone(&self.0)) - } - } - impl ::core::ops::Deref for Summa { - type Target = ::ethers::contract::Contract; - fn deref(&self) -> &Self::Target { - &self.0 - } - } - impl ::core::ops::DerefMut for Summa { - fn deref_mut(&mut self) -> &mut Self::Target { - &mut self.0 - } - } - impl ::core::fmt::Debug for Summa { - fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { - f.debug_tuple(stringify!(Summa)).field(&self.address()).finish() - } - } - impl Summa { - /// Creates a new contract instance with the specified `ethers` client at - /// `address`. The contract derefs to a `ethers::Contract` object. - pub fn new>( - address: T, - client: ::std::sync::Arc, - ) -> Self { - Self( - ::ethers::contract::Contract::new( - address.into(), - SUMMA_ABI.clone(), - client, - ), - ) - } - /// Constructs the general purpose `Deployer` instance based on the provided constructor arguments and sends it. - /// Returns a new instance of a deployer that returns an instance of this contract after sending the transaction - /// - /// Notes: - /// - If there are no constructor arguments, you should pass `()` as the argument. - /// - The default poll duration is 7 seconds. - /// - The default number of confirmations is 1 block. - /// - /// - /// # Example - /// - /// Generate contract bindings with `abigen!` and deploy a new contract instance. - /// - /// *Note*: this requires a `bytecode` and `abi` object in the `greeter.json` artifact. - /// - /// ```ignore - /// # async fn deploy(client: ::std::sync::Arc) { - /// abigen!(Greeter, "../greeter.json"); - /// - /// let greeter_contract = Greeter::deploy(client, "Hello world!".to_string()).unwrap().send().await.unwrap(); - /// let msg = greeter_contract.greet().call().await.unwrap(); - /// # } - /// ``` - pub fn deploy( - client: ::std::sync::Arc, - constructor_args: T, - ) -> ::core::result::Result< - ::ethers::contract::builders::ContractDeployer, - ::ethers::contract::ContractError, - > { - let factory = ::ethers::contract::ContractFactory::new( - SUMMA_ABI.clone(), - SUMMA_BYTECODE.clone().into(), - client, - ); - let deployer = factory.deploy(constructor_args)?; - let deployer = ::ethers::contract::ContractDeployer::new(deployer); - Ok(deployer) - } - ///Calls the contract's `addressOwnershipProofs` (0xa3c4bcf8) function - pub fn address_ownership_proofs( - &self, - p0: ::ethers::core::types::U256, - ) -> ::ethers::contract::builders::ContractCall< - M, - ( - ::std::string::String, - ::std::string::String, - ::ethers::core::types::Bytes, - ::ethers::core::types::Bytes, - ), - > { - self.0 - .method_hash([163, 196, 188, 248], p0) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `commitments` (0x49ce8997) function - pub fn commitments( - &self, - p0: ::ethers::core::types::U256, - ) -> ::ethers::contract::builders::ContractCall< - M, - ::ethers::core::types::Bytes, - > { - self.0 - .method_hash([73, 206, 137, 151], p0) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `config` (0x79502c55) function - pub fn config(&self) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([121, 80, 44, 85], ()) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `getAddressOwnershipProof` (0x19b33968) function - pub fn get_address_ownership_proof( - &self, - address_hash: [u8; 32], - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([25, 179, 57, 104], address_hash) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `owner` (0x8da5cb5b) function - pub fn owner( - &self, - ) -> ::ethers::contract::builders::ContractCall< - M, - ::ethers::core::types::Address, - > { - self.0 - .method_hash([141, 165, 203, 91], ()) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `renounceOwnership` (0x715018a6) function - pub fn renounce_ownership( - &self, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([113, 80, 24, 166], ()) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `submitCommitment` (0x05ab9860) function - pub fn submit_commitment( - &self, - snark_proof: ::ethers::core::types::Bytes, - grand_sum_proof: ::ethers::core::types::Bytes, - total_balances: ::std::vec::Vec<::ethers::core::types::U256>, - timestamp: ::ethers::core::types::U256, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash( - [5, 171, 152, 96], - (snark_proof, grand_sum_proof, total_balances, timestamp), - ) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `submitProofOfAddressOwnership` (0xc7ddca0e) function - pub fn submit_proof_of_address_ownership( - &self, - address_ownership_proofs: ::std::vec::Vec, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([199, 221, 202, 14], address_ownership_proofs) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `transferOwnership` (0xf2fde38b) function - pub fn transfer_ownership( - &self, - new_owner: ::ethers::core::types::Address, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([242, 253, 227, 139], new_owner) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `verifyInclusionProof` (0x9c382559) function - pub fn verify_inclusion_proof( - &self, - timestamp: ::ethers::core::types::U256, - inclusion_proof: ::ethers::core::types::Bytes, - challenges: ::std::vec::Vec<::ethers::core::types::U256>, - values: ::std::vec::Vec<::ethers::core::types::U256>, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash( - [156, 56, 37, 89], - (timestamp, inclusion_proof, challenges, values), - ) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `verifyingKey` (0x7950c5f8) function - pub fn verifying_key( - &self, - ) -> ::ethers::contract::builders::ContractCall< - M, - ::ethers::core::types::Address, - > { - self.0 - .method_hash([121, 80, 197, 248], ()) - .expect("method not found (this should never happen)") - } - ///Gets the contract's `AddressOwnershipProofSubmitted` event - pub fn address_ownership_proof_submitted_filter( - &self, - ) -> ::ethers::contract::builders::Event< - ::std::sync::Arc, - M, - AddressOwnershipProofSubmittedFilter, - > { - self.0.event() - } - ///Gets the contract's `LiabilitiesCommitmentSubmitted` event - pub fn liabilities_commitment_submitted_filter( - &self, - ) -> ::ethers::contract::builders::Event< - ::std::sync::Arc, - M, - LiabilitiesCommitmentSubmittedFilter, - > { - self.0.event() - } - ///Gets the contract's `OwnershipTransferred` event - pub fn ownership_transferred_filter( - &self, - ) -> ::ethers::contract::builders::Event< - ::std::sync::Arc, - M, - OwnershipTransferredFilter, - > { - self.0.event() - } - /// Returns an `Event` builder for all the events of this contract. - pub fn events( - &self, - ) -> ::ethers::contract::builders::Event<::std::sync::Arc, M, SummaEvents> { - self.0.event_with_filter(::core::default::Default::default()) - } - } - impl From<::ethers::contract::Contract> - for Summa { - fn from(contract: ::ethers::contract::Contract) -> Self { - Self::new(contract.address(), contract.client()) - } - } - #[derive( - Clone, - ::ethers::contract::EthEvent, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethevent( - name = "AddressOwnershipProofSubmitted", - abi = "AddressOwnershipProofSubmitted((string,string,bytes,bytes)[])" - )] - pub struct AddressOwnershipProofSubmittedFilter { - pub address_ownership_proofs: ::std::vec::Vec, - } - #[derive( - Clone, - ::ethers::contract::EthEvent, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethevent( - name = "LiabilitiesCommitmentSubmitted", - abi = "LiabilitiesCommitmentSubmitted(uint256,uint256[],bytes,bytes)" - )] - pub struct LiabilitiesCommitmentSubmittedFilter { - #[ethevent(indexed)] - pub timestamp: ::ethers::core::types::U256, - pub total_balances: ::std::vec::Vec<::ethers::core::types::U256>, - pub snark_proof: ::ethers::core::types::Bytes, - pub grand_sum_proof: ::ethers::core::types::Bytes, - } - #[derive( - Clone, - ::ethers::contract::EthEvent, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethevent( - name = "OwnershipTransferred", - abi = "OwnershipTransferred(address,address)" - )] - pub struct OwnershipTransferredFilter { - #[ethevent(indexed)] - pub previous_owner: ::ethers::core::types::Address, - #[ethevent(indexed)] - pub new_owner: ::ethers::core::types::Address, - } - ///Container type for all of the contract's events - #[derive(Clone, ::ethers::contract::EthAbiType, Debug, PartialEq, Eq, Hash)] - pub enum SummaEvents { - AddressOwnershipProofSubmittedFilter(AddressOwnershipProofSubmittedFilter), - LiabilitiesCommitmentSubmittedFilter(LiabilitiesCommitmentSubmittedFilter), - OwnershipTransferredFilter(OwnershipTransferredFilter), - } - impl ::ethers::contract::EthLogDecode for SummaEvents { - fn decode_log( - log: &::ethers::core::abi::RawLog, - ) -> ::core::result::Result { - if let Ok(decoded) = AddressOwnershipProofSubmittedFilter::decode_log(log) { - return Ok(SummaEvents::AddressOwnershipProofSubmittedFilter(decoded)); - } - if let Ok(decoded) = LiabilitiesCommitmentSubmittedFilter::decode_log(log) { - return Ok(SummaEvents::LiabilitiesCommitmentSubmittedFilter(decoded)); - } - if let Ok(decoded) = OwnershipTransferredFilter::decode_log(log) { - return Ok(SummaEvents::OwnershipTransferredFilter(decoded)); - } - Err(::ethers::core::abi::Error::InvalidData) - } - } - impl ::core::fmt::Display for SummaEvents { - fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { - match self { - Self::AddressOwnershipProofSubmittedFilter(element) => { - ::core::fmt::Display::fmt(element, f) - } - Self::LiabilitiesCommitmentSubmittedFilter(element) => { - ::core::fmt::Display::fmt(element, f) - } - Self::OwnershipTransferredFilter(element) => { - ::core::fmt::Display::fmt(element, f) - } - } - } - } - impl ::core::convert::From for SummaEvents { - fn from(value: AddressOwnershipProofSubmittedFilter) -> Self { - Self::AddressOwnershipProofSubmittedFilter(value) - } - } - impl ::core::convert::From for SummaEvents { - fn from(value: LiabilitiesCommitmentSubmittedFilter) -> Self { - Self::LiabilitiesCommitmentSubmittedFilter(value) - } - } - impl ::core::convert::From for SummaEvents { - fn from(value: OwnershipTransferredFilter) -> Self { - Self::OwnershipTransferredFilter(value) - } - } - ///Container type for all input parameters for the `addressOwnershipProofs` function with signature `addressOwnershipProofs(uint256)` and selector `0xa3c4bcf8` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethcall(name = "addressOwnershipProofs", abi = "addressOwnershipProofs(uint256)")] - pub struct AddressOwnershipProofsCall(pub ::ethers::core::types::U256); - ///Container type for all input parameters for the `commitments` function with signature `commitments(uint256)` and selector `0x49ce8997` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethcall(name = "commitments", abi = "commitments(uint256)")] - pub struct CommitmentsCall(pub ::ethers::core::types::U256); - ///Container type for all input parameters for the `config` function with signature `config()` and selector `0x79502c55` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethcall(name = "config", abi = "config()")] - pub struct ConfigCall; - ///Container type for all input parameters for the `getAddressOwnershipProof` function with signature `getAddressOwnershipProof(bytes32)` and selector `0x19b33968` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethcall( - name = "getAddressOwnershipProof", - abi = "getAddressOwnershipProof(bytes32)" - )] - pub struct GetAddressOwnershipProofCall { - pub address_hash: [u8; 32], - } - ///Container type for all input parameters for the `owner` function with signature `owner()` and selector `0x8da5cb5b` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethcall(name = "owner", abi = "owner()")] - pub struct OwnerCall; - ///Container type for all input parameters for the `renounceOwnership` function with signature `renounceOwnership()` and selector `0x715018a6` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethcall(name = "renounceOwnership", abi = "renounceOwnership()")] - pub struct RenounceOwnershipCall; - ///Container type for all input parameters for the `submitCommitment` function with signature `submitCommitment(bytes,bytes,uint256[],uint256)` and selector `0x05ab9860` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethcall( - name = "submitCommitment", - abi = "submitCommitment(bytes,bytes,uint256[],uint256)" - )] - pub struct SubmitCommitmentCall { - pub snark_proof: ::ethers::core::types::Bytes, - pub grand_sum_proof: ::ethers::core::types::Bytes, - pub total_balances: ::std::vec::Vec<::ethers::core::types::U256>, - pub timestamp: ::ethers::core::types::U256, - } - ///Container type for all input parameters for the `submitProofOfAddressOwnership` function with signature `submitProofOfAddressOwnership((string,string,bytes,bytes)[])` and selector `0xc7ddca0e` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethcall( - name = "submitProofOfAddressOwnership", - abi = "submitProofOfAddressOwnership((string,string,bytes,bytes)[])" - )] - pub struct SubmitProofOfAddressOwnershipCall { - pub address_ownership_proofs: ::std::vec::Vec, - } - ///Container type for all input parameters for the `transferOwnership` function with signature `transferOwnership(address)` and selector `0xf2fde38b` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethcall(name = "transferOwnership", abi = "transferOwnership(address)")] - pub struct TransferOwnershipCall { - pub new_owner: ::ethers::core::types::Address, - } - ///Container type for all input parameters for the `verifyInclusionProof` function with signature `verifyInclusionProof(uint256,bytes,uint256[],uint256[])` and selector `0x9c382559` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethcall( - name = "verifyInclusionProof", - abi = "verifyInclusionProof(uint256,bytes,uint256[],uint256[])" - )] - pub struct VerifyInclusionProofCall { - pub timestamp: ::ethers::core::types::U256, - pub inclusion_proof: ::ethers::core::types::Bytes, - pub challenges: ::std::vec::Vec<::ethers::core::types::U256>, - pub values: ::std::vec::Vec<::ethers::core::types::U256>, - } - ///Container type for all input parameters for the `verifyingKey` function with signature `verifyingKey()` and selector `0x7950c5f8` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethcall(name = "verifyingKey", abi = "verifyingKey()")] - pub struct VerifyingKeyCall; - ///Container type for all of the contract's call - #[derive(Clone, ::ethers::contract::EthAbiType, Debug, PartialEq, Eq, Hash)] - pub enum SummaCalls { - AddressOwnershipProofs(AddressOwnershipProofsCall), - Commitments(CommitmentsCall), - Config(ConfigCall), - GetAddressOwnershipProof(GetAddressOwnershipProofCall), - Owner(OwnerCall), - RenounceOwnership(RenounceOwnershipCall), - SubmitCommitment(SubmitCommitmentCall), - SubmitProofOfAddressOwnership(SubmitProofOfAddressOwnershipCall), - TransferOwnership(TransferOwnershipCall), - VerifyInclusionProof(VerifyInclusionProofCall), - VerifyingKey(VerifyingKeyCall), - } - impl ::ethers::core::abi::AbiDecode for SummaCalls { - fn decode( - data: impl AsRef<[u8]>, - ) -> ::core::result::Result { - let data = data.as_ref(); - if let Ok(decoded) - = ::decode( - data, - ) { - return Ok(Self::AddressOwnershipProofs(decoded)); - } - if let Ok(decoded) - = ::decode(data) { - return Ok(Self::Commitments(decoded)); - } - if let Ok(decoded) - = ::decode(data) { - return Ok(Self::Config(decoded)); - } - if let Ok(decoded) - = ::decode( - data, - ) { - return Ok(Self::GetAddressOwnershipProof(decoded)); - } - if let Ok(decoded) - = ::decode(data) { - return Ok(Self::Owner(decoded)); - } - if let Ok(decoded) - = ::decode( - data, - ) { - return Ok(Self::RenounceOwnership(decoded)); - } - if let Ok(decoded) - = ::decode( - data, - ) { - return Ok(Self::SubmitCommitment(decoded)); - } - if let Ok(decoded) - = ::decode( - data, - ) { - return Ok(Self::SubmitProofOfAddressOwnership(decoded)); - } - if let Ok(decoded) - = ::decode( - data, - ) { - return Ok(Self::TransferOwnership(decoded)); - } - if let Ok(decoded) - = ::decode( - data, - ) { - return Ok(Self::VerifyInclusionProof(decoded)); - } - if let Ok(decoded) - = ::decode(data) { - return Ok(Self::VerifyingKey(decoded)); - } - Err(::ethers::core::abi::Error::InvalidData.into()) - } - } - impl ::ethers::core::abi::AbiEncode for SummaCalls { - fn encode(self) -> Vec { - match self { - Self::AddressOwnershipProofs(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::Commitments(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::Config(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::GetAddressOwnershipProof(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::Owner(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::RenounceOwnership(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::SubmitCommitment(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::SubmitProofOfAddressOwnership(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::TransferOwnership(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::VerifyInclusionProof(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::VerifyingKey(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - } - } - } - impl ::core::fmt::Display for SummaCalls { - fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { - match self { - Self::AddressOwnershipProofs(element) => { - ::core::fmt::Display::fmt(element, f) - } - Self::Commitments(element) => ::core::fmt::Display::fmt(element, f), - Self::Config(element) => ::core::fmt::Display::fmt(element, f), - Self::GetAddressOwnershipProof(element) => { - ::core::fmt::Display::fmt(element, f) - } - Self::Owner(element) => ::core::fmt::Display::fmt(element, f), - Self::RenounceOwnership(element) => ::core::fmt::Display::fmt(element, f), - Self::SubmitCommitment(element) => ::core::fmt::Display::fmt(element, f), - Self::SubmitProofOfAddressOwnership(element) => { - ::core::fmt::Display::fmt(element, f) - } - Self::TransferOwnership(element) => ::core::fmt::Display::fmt(element, f), - Self::VerifyInclusionProof(element) => { - ::core::fmt::Display::fmt(element, f) - } - Self::VerifyingKey(element) => ::core::fmt::Display::fmt(element, f), - } - } - } - impl ::core::convert::From for SummaCalls { - fn from(value: AddressOwnershipProofsCall) -> Self { - Self::AddressOwnershipProofs(value) - } - } - impl ::core::convert::From for SummaCalls { - fn from(value: CommitmentsCall) -> Self { - Self::Commitments(value) - } - } - impl ::core::convert::From for SummaCalls { - fn from(value: ConfigCall) -> Self { - Self::Config(value) - } - } - impl ::core::convert::From for SummaCalls { - fn from(value: GetAddressOwnershipProofCall) -> Self { - Self::GetAddressOwnershipProof(value) - } - } - impl ::core::convert::From for SummaCalls { - fn from(value: OwnerCall) -> Self { - Self::Owner(value) - } - } - impl ::core::convert::From for SummaCalls { - fn from(value: RenounceOwnershipCall) -> Self { - Self::RenounceOwnership(value) - } - } - impl ::core::convert::From for SummaCalls { - fn from(value: SubmitCommitmentCall) -> Self { - Self::SubmitCommitment(value) - } - } - impl ::core::convert::From for SummaCalls { - fn from(value: SubmitProofOfAddressOwnershipCall) -> Self { - Self::SubmitProofOfAddressOwnership(value) - } - } - impl ::core::convert::From for SummaCalls { - fn from(value: TransferOwnershipCall) -> Self { - Self::TransferOwnership(value) - } - } - impl ::core::convert::From for SummaCalls { - fn from(value: VerifyInclusionProofCall) -> Self { - Self::VerifyInclusionProof(value) - } - } - impl ::core::convert::From for SummaCalls { - fn from(value: VerifyingKeyCall) -> Self { - Self::VerifyingKey(value) - } - } - ///Container type for all return fields from the `addressOwnershipProofs` function with signature `addressOwnershipProofs(uint256)` and selector `0xa3c4bcf8` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - pub struct AddressOwnershipProofsReturn { - pub cex_address: ::std::string::String, - pub chain: ::std::string::String, - pub signature: ::ethers::core::types::Bytes, - pub message: ::ethers::core::types::Bytes, - } - ///Container type for all return fields from the `commitments` function with signature `commitments(uint256)` and selector `0x49ce8997` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - pub struct CommitmentsReturn(pub ::ethers::core::types::Bytes); - ///Container type for all return fields from the `config` function with signature `config()` and selector `0x79502c55` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - pub struct ConfigReturn { - pub balance_byte_range: u8, - } - ///Container type for all return fields from the `getAddressOwnershipProof` function with signature `getAddressOwnershipProof(bytes32)` and selector `0x19b33968` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - pub struct GetAddressOwnershipProofReturn(pub AddressOwnershipProof); - ///Container type for all return fields from the `owner` function with signature `owner()` and selector `0x8da5cb5b` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - pub struct OwnerReturn(pub ::ethers::core::types::Address); - ///Container type for all return fields from the `verifyInclusionProof` function with signature `verifyInclusionProof(uint256,bytes,uint256[],uint256[])` and selector `0x9c382559` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - pub struct VerifyInclusionProofReturn(pub bool); - ///Container type for all return fields from the `verifyingKey` function with signature `verifyingKey()` and selector `0x7950c5f8` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - pub struct VerifyingKeyReturn(pub ::ethers::core::types::Address); - ///`AddressOwnershipProof(string,string,bytes,bytes)` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - pub struct AddressOwnershipProof { - pub cex_address: ::std::string::String, - pub chain: ::std::string::String, - pub signature: ::ethers::core::types::Bytes, - pub message: ::ethers::core::types::Bytes, - } -} diff --git a/backend/src/contracts/generated/verifying_key.rs b/backend/src/contracts/generated/verifying_key.rs deleted file mode 100644 index a1bdd70d..00000000 --- a/backend/src/contracts/generated/verifying_key.rs +++ /dev/null @@ -1,1537 +0,0 @@ -pub use halo_2_verifying_key::*; -/// This module was auto-generated with ethers-rs Abigen. -/// More information at: -#[allow( - clippy::enum_variant_names, - clippy::too_many_arguments, - clippy::upper_case_acronyms, - clippy::type_complexity, - dead_code, - non_camel_case_types, -)] -pub mod halo_2_verifying_key { - #[rustfmt::skip] - const __ABI: &str = "[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\",\"outputs\":[]}]"; - ///The parsed JSON ABI of the contract. - pub static HALO2VERIFYINGKEY_ABI: ::ethers::contract::Lazy< - ::ethers::core::abi::Abi, - > = ::ethers::contract::Lazy::new(|| { - ::ethers::core::utils::__serde_json::from_str(__ABI) - .expect("ABI is always valid") - }); - #[rustfmt::skip] - const __BYTECODE: &[u8] = &[ - 96, - 128, - 96, - 64, - 82, - 52, - 128, - 21, - 97, - 0, - 16, - 87, - 96, - 0, - 128, - 253, - 91, - 80, - 96, - 0, - 126, - 153, - 110, - 214, - 65, - 19, - 213, - 216, - 111, - 66, - 202, - 171, - 15, - 61, - 37, - 70, - 107, - 8, - 86, - 1, - 84, - 114, - 222, - 75, - 184, - 9, - 241, - 104, - 170, - 188, - 37, - 103, - 129, - 82, - 96, - 17, - 96, - 32, - 82, - 127, - 48, - 100, - 54, - 64, - 185, - 248, - 47, - 144, - 232, - 59, - 105, - 142, - 94, - 166, - 23, - 156, - 124, - 5, - 84, - 46, - 133, - 149, - 51, - 180, - 139, - 153, - 83, - 162, - 245, - 54, - 8, - 1, - 96, - 64, - 82, - 127, - 48, - 76, - 209, - 231, - 156, - 250, - 91, - 15, - 5, - 78, - 152, - 26, - 39, - 237, - 119, - 6, - 231, - 234, - 107, - 6, - 167, - 242, - 102, - 239, - 141, - 184, - 25, - 193, - 121, - 194, - 195, - 234, - 96, - 96, - 82, - 127, - 25, - 53, - 134, - 218, - 135, - 44, - 222, - 255, - 2, - 61, - 106, - 178, - 38, - 58, - 19, - 27, - 71, - 128, - 219, - 136, - 120, - 190, - 60, - 59, - 127, - 143, - 1, - 156, - 6, - 252, - 176, - 251, - 96, - 128, - 82, - 127, - 41, - 145, - 16, - 230, - 131, - 95, - 215, - 55, - 49, - 251, - 60, - 230, - 222, - 135, - 21, - 25, - 136, - 218, - 64, - 60, - 38, - 84, - 103, - 169, - 107, - 156, - 218, - 13, - 125, - 170, - 114, - 228, - 96, - 160, - 82, - 96, - 1, - 96, - 192, - 82, - 128, - 96, - 224, - 82, - 128, - 97, - 1, - 0, - 82, - 128, - 97, - 1, - 32, - 82, - 128, - 97, - 1, - 64, - 82, - 96, - 1, - 97, - 1, - 96, - 82, - 96, - 2, - 97, - 1, - 128, - 82, - 127, - 25, - 142, - 147, - 147, - 146, - 13, - 72, - 58, - 114, - 96, - 191, - 183, - 49, - 251, - 93, - 37, - 241, - 170, - 73, - 51, - 53, - 169, - 231, - 18, - 151, - 228, - 133, - 183, - 174, - 243, - 18, - 194, - 97, - 1, - 160, - 82, - 127, - 24, - 0, - 222, - 239, - 18, - 31, - 30, - 118, - 66, - 106, - 0, - 102, - 94, - 92, - 68, - 121, - 103, - 67, - 34, - 212, - 247, - 94, - 218, - 221, - 70, - 222, - 189, - 92, - 217, - 146, - 246, - 237, - 97, - 1, - 192, - 82, - 127, - 9, - 6, - 137, - 208, - 88, - 95, - 240, - 117, - 236, - 158, - 153, - 173, - 105, - 12, - 51, - 149, - 188, - 75, - 49, - 51, - 112, - 179, - 142, - 243, - 85, - 172, - 218, - 220, - 209, - 34, - 151, - 91, - 97, - 1, - 224, - 82, - 127, - 18, - 200, - 94, - 165, - 219, - 140, - 109, - 235, - 74, - 171, - 113, - 128, - 141, - 203, - 64, - 143, - 227, - 209, - 231, - 105, - 12, - 67, - 211, - 123, - 76, - 230, - 204, - 1, - 102, - 250, - 125, - 170, - 97, - 2, - 0, - 82, - 127, - 38, - 24, - 106, - 45, - 101, - 238, - 77, - 47, - 156, - 154, - 91, - 145, - 248, - 101, - 151, - 211, - 95, - 25, - 44, - 209, - 32, - 202, - 247, - 233, - 53, - 216, - 68, - 61, - 25, - 56, - 226, - 61, - 97, - 2, - 32, - 82, - 127, - 48, - 68, - 31, - 209, - 181, - 211, - 55, - 4, - 130, - 196, - 33, - 82, - 168, - 137, - 144, - 39, - 113, - 105, - 137, - 166, - 153, - 108, - 37, - 53, - 188, - 159, - 127, - 238, - 138, - 174, - 247, - 158, - 97, - 2, - 64, - 82, - 127, - 22, - 243, - 99, - 241, - 3, - 200, - 13, - 123, - 188, - 138, - 211, - 198, - 134, - 126, - 8, - 34, - 187, - 198, - 0, - 11, - 233, - 26, - 70, - 137, - 117, - 92, - 125, - 244, - 2, - 33, - 193, - 69, - 97, - 2, - 96, - 82, - 127, - 43, - 28, - 187, - 62, - 82, - 30, - 223, - 90, - 98, - 45, - 130, - 118, - 42, - 68, - 165, - 230, - 63, - 30, - 80, - 179, - 50, - 215, - 17, - 84, - 164, - 167, - 149, - 141, - 96, - 17, - 222, - 255, - 97, - 2, - 128, - 82, - 127, - 20, - 4, - 162, - 209, - 124, - 208, - 44, - 143, - 159, - 215, - 157, - 116, - 172, - 115, - 198, - 125, - 24, - 129, - 230, - 44, - 106, - 243, - 84, - 250, - 116, - 210, - 53, - 197, - 227, - 125, - 172, - 254, - 97, - 2, - 160, - 82, - 127, - 44, - 30, - 48, - 120, - 31, - 115, - 94, - 121, - 119, - 130, - 13, - 76, - 169, - 20, - 80, - 16, - 226, - 141, - 204, - 128, - 142, - 224, - 241, - 233, - 118, - 71, - 114, - 137, - 5, - 123, - 122, - 236, - 97, - 2, - 192, - 82, - 127, - 45, - 211, - 253, - 89, - 9, - 138, - 91, - 75, - 74, - 97, - 101, - 104, - 187, - 107, - 161, - 161, - 228, - 196, - 14, - 75, - 13, - 249, - 174, - 148, - 227, - 121, - 68, - 213, - 90, - 182, - 81, - 207, - 97, - 2, - 224, - 82, - 127, - 37, - 104, - 12, - 53, - 37, - 186, - 4, - 67, - 90, - 144, - 52, - 214, - 230, - 156, - 150, - 222, - 81, - 51, - 237, - 254, - 55, - 194, - 38, - 211, - 227, - 27, - 96, - 239, - 246, - 179, - 78, - 240, - 97, - 3, - 0, - 82, - 127, - 26, - 34, - 78, - 106, - 235, - 155, - 183, - 222, - 18, - 199, - 97, - 253, - 31, - 73, - 167, - 51, - 255, - 65, - 12, - 63, - 119, - 42, - 173, - 106, - 46, - 195, - 196, - 222, - 202, - 212, - 51, - 7, - 97, - 3, - 32, - 82, - 127, - 48, - 10, - 102, - 179, - 118, - 175, - 17, - 135, - 105, - 78, - 37, - 219, - 206, - 163, - 170, - 198, - 49, - 20, - 113, - 106, - 248, - 34, - 253, - 70, - 97, - 81, - 154, - 219, - 249, - 198, - 73, - 233, - 97, - 3, - 64, - 82, - 127, - 39, - 167, - 166, - 96, - 135, - 168, - 193, - 123, - 0, - 255, - 183, - 254, - 155, - 118, - 186, - 33, - 153, - 202, - 48, - 139, - 203, - 10, - 209, - 0, - 250, - 24, - 24, - 134, - 214, - 201, - 185, - 54, - 97, - 3, - 96, - 82, - 127, - 35, - 188, - 149, - 26, - 60, - 67, - 7, - 56, - 75, - 222, - 197, - 214, - 27, - 225, - 34, - 161, - 156, - 147, - 61, - 179, - 38, - 109, - 99, - 39, - 164, - 114, - 229, - 32, - 58, - 159, - 120, - 90, - 97, - 3, - 128, - 82, - 127, - 7, - 67, - 234, - 64, - 241, - 64, - 132, - 219, - 38, - 115, - 33, - 114, - 131, - 170, - 5, - 63, - 152, - 104, - 150, - 238, - 124, - 24, - 31, - 82, - 17, - 132, - 66, - 233, - 156, - 69, - 41, - 116, - 97, - 3, - 160, - 82, - 127, - 2, - 3, - 227, - 73, - 58, - 37, - 148, - 236, - 229, - 125, - 34, - 204, - 117, - 221, - 8, - 26, - 198, - 130, - 113, - 236, - 124, - 117, - 129, - 83, - 207, - 210, - 21, - 43, - 251, - 92, - 25, - 227, - 97, - 3, - 192, - 82, - 127, - 15, - 133, - 147, - 108, - 68, - 112, - 132, - 9, - 227, - 233, - 251, - 94, - 42, - 126, - 166, - 96, - 75, - 6, - 153, - 127, - 10, - 199, - 253, - 72, - 142, - 63, - 20, - 126, - 5, - 168, - 141, - 190, - 97, - 3, - 224, - 82, - 127, - 4, - 151, - 251, - 183, - 196, - 67, - 109, - 207, - 54, - 237, - 230, - 163, - 10, - 214, - 46, - 1, - 110, - 5, - 154, - 17, - 166, - 84, - 142, - 182, - 152, - 14, - 222, - 178, - 241, - 5, - 33, - 51, - 97, - 4, - 0, - 82, - 127, - 13, - 203, - 172, - 243, - 104, - 192, - 31, - 97, - 55, - 92, - 36, - 46, - 53, - 237, - 171, - 18, - 162, - 33, - 71, - 233, - 212, - 107, - 246, - 133, - 251, - 117, - 69, - 77, - 96, - 245, - 237, - 188, - 97, - 4, - 32, - 82, - 127, - 23, - 114, - 12, - 149, - 19, - 154, - 163, - 245, - 222, - 197, - 182, - 189, - 86, - 8, - 47, - 141, - 237, - 237, - 46, - 74, - 20, - 37, - 208, - 169, - 30, - 39, - 67, - 221, - 41, - 79, - 220, - 156, - 97, - 4, - 64, - 82, - 127, - 40, - 74, - 192, - 83, - 217, - 106, - 51, - 252, - 166, - 158, - 202, - 0, - 225, - 110, - 234, - 117, - 173, - 27, - 240, - 8, - 210, - 167, - 66, - 252, - 132, - 106, - 199, - 61, - 23, - 212, - 109, - 115, - 97, - 4, - 96, - 82, - 127, - 20, - 244, - 86, - 102, - 162, - 107, - 141, - 71, - 33, - 134, - 219, - 247, - 142, - 96, - 106, - 130, - 137, - 30, - 15, - 18, - 42, - 84, - 38, - 68, - 24, - 207, - 226, - 97, - 80, - 3, - 223, - 185, - 97, - 4, - 128, - 82, - 127, - 28, - 81, - 124, - 51, - 90, - 214, - 52, - 66, - 46, - 242, - 235, - 95, - 97, - 89, - 38, - 232, - 117, - 175, - 169, - 233, - 197, - 137, - 171, - 245, - 40, - 211, - 21, - 168, - 165, - 134, - 178, - 45, - 97, - 4, - 160, - 82, - 127, - 18, - 32, - 177, - 177, - 60, - 145, - 232, - 17, - 81, - 6, - 20, - 75, - 196, - 23, - 212, - 211, - 230, - 169, - 222, - 63, - 183, - 4, - 6, - 230, - 139, - 74, - 95, - 216, - 169, - 47, - 67, - 39, - 97, - 4, - 192, - 82, - 127, - 12, - 186, - 234, - 214, - 102, - 225, - 114, - 177, - 128, - 27, - 122, - 209, - 124, - 52, - 80, - 234, - 44, - 231, - 213, - 60, - 30, - 57, - 44, - 237, - 240, - 80, - 35, - 229, - 158, - 83, - 201, - 90, - 97, - 4, - 224, - 82, - 127, - 12, - 226, - 0, - 171, - 81, - 94, - 252, - 57, - 12, - 69, - 158, - 11, - 73, - 44, - 21, - 165, - 0, - 36, - 197, - 127, - 167, - 7, - 104, - 193, - 131, - 137, - 146, - 78, - 30, - 114, - 152, - 43, - 97, - 5, - 0, - 82, - 127, - 29, - 72, - 72, - 232, - 219, - 116, - 37, - 31, - 208, - 30, - 1, - 143, - 237, - 183, - 28, - 168, - 224, - 76, - 65, - 116, - 100, - 116, - 173, - 75, - 74, - 57, - 218, - 19, - 47, - 134, - 243, - 11, - 97, - 5, - 32, - 82, - 127, - 20, - 138, - 34, - 82, - 183, - 182, - 160, - 126, - 33, - 170, - 27, - 197, - 177, - 204, - 72, - 38, - 172, - 127, - 74, - 122, - 62, - 41, - 251, - 115, - 153, - 221, - 112, - 41, - 212, - 189, - 175, - 39, - 97, - 5, - 64, - 82, - 97, - 5, - 96, - 129, - 243, - 254, - ]; - ///The bytecode of the contract. - pub static HALO2VERIFYINGKEY_BYTECODE: ::ethers::core::types::Bytes = ::ethers::core::types::Bytes::from_static( - __BYTECODE, - ); - #[rustfmt::skip] - const __DEPLOYED_BYTECODE: &[u8] = &[ - 96, - 128, - 96, - 64, - 82, - 96, - 0, - 128, - 253, - 254, - 162, - 100, - 105, - 112, - 102, - 115, - 88, - 34, - 18, - 32, - 124, - 128, - 97, - 125, - 7, - 26, - 78, - 148, - 245, - 74, - 104, - 9, - 127, - 211, - 94, - 36, - 68, - 64, - 45, - 173, - 191, - 1, - 119, - 46, - 99, - 82, - 233, - 222, - 246, - 190, - 55, - 218, - 100, - 115, - 111, - 108, - 99, - 67, - 0, - 8, - 18, - 0, - 51, - ]; - ///The deployed bytecode of the contract. - pub static HALO2VERIFYINGKEY_DEPLOYED_BYTECODE: ::ethers::core::types::Bytes = ::ethers::core::types::Bytes::from_static( - __DEPLOYED_BYTECODE, - ); - pub struct Halo2VerifyingKey(::ethers::contract::Contract); - impl ::core::clone::Clone for Halo2VerifyingKey { - fn clone(&self) -> Self { - Self(::core::clone::Clone::clone(&self.0)) - } - } - impl ::core::ops::Deref for Halo2VerifyingKey { - type Target = ::ethers::contract::Contract; - fn deref(&self) -> &Self::Target { - &self.0 - } - } - impl ::core::ops::DerefMut for Halo2VerifyingKey { - fn deref_mut(&mut self) -> &mut Self::Target { - &mut self.0 - } - } - impl ::core::fmt::Debug for Halo2VerifyingKey { - fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { - f.debug_tuple(stringify!(Halo2VerifyingKey)).field(&self.address()).finish() - } - } - impl Halo2VerifyingKey { - /// Creates a new contract instance with the specified `ethers` client at - /// `address`. The contract derefs to a `ethers::Contract` object. - pub fn new>( - address: T, - client: ::std::sync::Arc, - ) -> Self { - Self( - ::ethers::contract::Contract::new( - address.into(), - HALO2VERIFYINGKEY_ABI.clone(), - client, - ), - ) - } - /// Constructs the general purpose `Deployer` instance based on the provided constructor arguments and sends it. - /// Returns a new instance of a deployer that returns an instance of this contract after sending the transaction - /// - /// Notes: - /// - If there are no constructor arguments, you should pass `()` as the argument. - /// - The default poll duration is 7 seconds. - /// - The default number of confirmations is 1 block. - /// - /// - /// # Example - /// - /// Generate contract bindings with `abigen!` and deploy a new contract instance. - /// - /// *Note*: this requires a `bytecode` and `abi` object in the `greeter.json` artifact. - /// - /// ```ignore - /// # async fn deploy(client: ::std::sync::Arc) { - /// abigen!(Greeter, "../greeter.json"); - /// - /// let greeter_contract = Greeter::deploy(client, "Hello world!".to_string()).unwrap().send().await.unwrap(); - /// let msg = greeter_contract.greet().call().await.unwrap(); - /// # } - /// ``` - pub fn deploy( - client: ::std::sync::Arc, - constructor_args: T, - ) -> ::core::result::Result< - ::ethers::contract::builders::ContractDeployer, - ::ethers::contract::ContractError, - > { - let factory = ::ethers::contract::ContractFactory::new( - HALO2VERIFYINGKEY_ABI.clone(), - HALO2VERIFYINGKEY_BYTECODE.clone().into(), - client, - ); - let deployer = factory.deploy(constructor_args)?; - let deployer = ::ethers::contract::ContractDeployer::new(deployer); - Ok(deployer) - } - } - impl From<::ethers::contract::Contract> - for Halo2VerifyingKey { - fn from(contract: ::ethers::contract::Contract) -> Self { - Self::new(contract.address(), contract.client()) - } - } -} diff --git a/backend/src/contracts/mod.rs b/backend/src/contracts/mod.rs deleted file mode 100644 index 04d83f7e..00000000 --- a/backend/src/contracts/mod.rs +++ /dev/null @@ -1,2 +0,0 @@ -pub mod generated; -pub mod signer; diff --git a/backend/src/contracts/signer.rs b/backend/src/contracts/signer.rs deleted file mode 100644 index dfa065e6..00000000 --- a/backend/src/contracts/signer.rs +++ /dev/null @@ -1,133 +0,0 @@ -use ethers::{ - prelude::SignerMiddleware, - providers::{Http, Middleware, Provider}, - signers::{LocalWallet, Signer}, - types::{Address, Bytes, U256}, -}; -use serde_json::Value; -use std::{error::Error, fs::File, io::BufReader, path::Path, str::FromStr, sync::Arc}; -use tokio::sync::Mutex; - -use super::generated::summa_contract::AddressOwnershipProof; -use crate::contracts::generated::summa_contract::Summa; - -pub enum AddressInput { - Address(Address), - Path(String), -} - -#[derive(Debug)] -pub struct SummaSigner { - nonce_lock: Mutex<()>, // To prevent running `submit` methods concurrently - summa_contract: Summa>, LocalWallet>>, -} - -impl SummaSigner { - /// Creates a new SummaSigner instance - /// # Arguments - /// * `signer_key` - The private key of wallet that will interact with the chain on behalf of the exchange - /// * `url` - The endpoint for connecting to the node - /// * `address` - The address of the Summa contract - pub async fn new( - signer_key: &str, - url: &str, - address_input: AddressInput, - ) -> Result> { - let wallet: LocalWallet = LocalWallet::from_str(signer_key).unwrap(); - - let provider = Arc::new(Provider::try_from(url)?); - let chain_id = provider.get_chainid().await?.as_u64(); - let client = Arc::new(SignerMiddleware::new( - provider, - wallet.with_chain_id(chain_id), - )); - - let address = match address_input { - AddressInput::Address(address) => address, - AddressInput::Path(path) => { - let address = Self::get_deployment_address(path, chain_id).unwrap(); - address - } - }; - - Ok(Self { - nonce_lock: Mutex::new(()), - summa_contract: Summa::new(address, client), - }) - } - - pub fn get_summa_address(&self) -> Address { - self.summa_contract.address() - } - - fn get_deployment_address>( - path: P, - chain_id: u64, - ) -> Result> { - // Open file in RO mode with buffer - let file = File::open(path)?; - let reader = BufReader::new(file); - - // Read the JSON contents of the file - let payload: Value = serde_json::from_reader(reader)?; - - // Retrieve the contract address from the deployments.json file - let deployment_address: &Value = &payload.as_object().unwrap() - [chain_id.to_string().as_str()] - .as_object() - .unwrap()["address"]; - - let summa_address: &str = deployment_address.as_str().unwrap(); - - let address: Address = summa_address.parse().unwrap(); - - Ok(address) - } - - pub async fn submit_proof_of_address_ownership( - &self, - address_ownership_proofs: Vec, - ) -> Result<(), Box> { - let lock_guard = self.nonce_lock.lock().await; - - let submit_proof_of_address_ownership = &self - .summa_contract - .submit_proof_of_address_ownership(address_ownership_proofs); - - // To prevent nonce collision, we lock the nonce before sending the transaction - let tx = submit_proof_of_address_ownership.send().await?; - - // Wait for the pending transaction to be mined - tx.await?; - - drop(lock_guard); - Ok(()) - } - - pub async fn submit_commitment( - &self, - snark_proof: Bytes, - grand_sum_proof: Bytes, - total_balances: Vec, - timestamp: U256, - ) -> Result<(), Box> { - let lock_guard = self.nonce_lock.lock().await; - - let submit_liability_commitment = &self.summa_contract.submit_commitment( - snark_proof, - grand_sum_proof, - total_balances, - timestamp, - ); - - // To prevent nonce collision, we lock the nonce before sending the transaction - let tx = submit_liability_commitment.send().await?; - - // Wait for the pending transaction to be mined - tx.await?; - - drop(lock_guard); - - Ok(()) - } -} diff --git a/backend/src/lib.rs b/backend/src/lib.rs index 6c363179..44735d8d 100644 --- a/backend/src/lib.rs +++ b/backend/src/lib.rs @@ -1,4 +1,28 @@ #![feature(generic_const_exprs)] pub mod apis; -pub mod contracts; pub mod tests; + +use serde::{Deserialize, Serialize}; +use std::{ + error::Error, + fs::File, + io::{Read, Write}, + path::Path, +}; + +pub fn save_to_file, T: Serialize>(path: P, data: &T) -> Result<(), Box> { + let serialized_data = serde_json::to_string(data)?; + let mut file = std::fs::File::create(path)?; + file.write_all(serialized_data.as_bytes())?; + Ok(()) +} + +pub fn load_from_file, T: for<'de> Deserialize<'de>>( + path: P, +) -> Result> { + let mut file = File::open(path)?; + let mut data = String::new(); + file.read_to_string(&mut data)?; + let deserialized_data = serde_json::from_str(&data)?; + Ok(deserialized_data) +} diff --git a/backend/src/tests.rs b/backend/src/tests.rs index 7e61fe64..357e3b21 100644 --- a/backend/src/tests.rs +++ b/backend/src/tests.rs @@ -1,367 +1,96 @@ -use std::{sync::Arc, time::Duration}; - -use ethers::{ - abi::Token, - prelude::SignerMiddleware, - providers::{Http, Middleware, Provider}, - signers::{LocalWallet, Signer}, - types::{H160, U256}, - utils::{Anvil, AnvilInstance}, -}; -use tokio::time; - -use crate::contracts::generated::{ - grandsum_verifier::GrandSumVerifier, inclusion_verifier::InclusionVerifier, - snark_verifier::Verifier as SnarkVerifier, summa_contract::Summa, - verifying_key::Halo2VerifyingKey as VerifyingKey, -}; - -// Setup test environment on the Anvil instance. -pub async fn initialize_test_env( - block_time: Option, -) -> ( - AnvilInstance, - H160, - H160, - Arc, LocalWallet>>, - Summa, LocalWallet>>, -) { - // Initiate Anvil by assigning a block time or enabling instant mining. - let anvil = match block_time { - Some(interval) => Anvil::new() - .mnemonic("test test test test test test test test test test test junk") - .block_time(interval) - .spawn(), - None => Anvil::new() - .mnemonic("test test test test test test test test test test test junk") - .spawn(), - }; - - // Extracting two exchange addresses from the Anvil instance. - let cex_addr_1 = anvil.addresses()[1]; - let cex_addr_2 = anvil.addresses()[2]; - - // Setup wallet using the first key in the Anvil and an HTTP provider with a 10 ms interval from the Anvil endpoint. - let wallet: LocalWallet = anvil.keys()[0].clone().into(); - let provider = Provider::::try_from(anvil.endpoint()) - .unwrap() - .interval(Duration::from_millis(10u64)); - - // Create a client by wrapping the provider with a signing middleware and the Anvil chain ID. - let client = Arc::new(SignerMiddleware::new( - provider, - wallet.with_chain_id(anvil.chain_id()), - )); - - // Send RPC requests using the `anvil_setBalance`` method via the provider to set the ETH balance for `cex_addr_1`` and `cex_addr_2`. - for addr in [cex_addr_1, cex_addr_2].iter().copied() { - let _res = client - .provider() - .request::<(H160, U256), ()>("anvil_setBalance", (addr, U256::from(278432))) - .await; - } - - // Deploy a Verifying Key and Verifier contracts. - if block_time.is_some() { - time::sleep(Duration::from_secs(block_time.unwrap())).await; - }; - - let verifying_key_contract = VerifyingKey::deploy(Arc::clone(&client), ()) - .unwrap() - .send() - .await - .unwrap(); - - let snark_verifier_contract = SnarkVerifier::deploy(Arc::clone(&client), ()) - .unwrap() - .send() - .await - .unwrap(); - - let grand_sum_verifier = GrandSumVerifier::deploy(Arc::clone(&client), ()) - .unwrap() - .send() - .await - .unwrap(); - - let inclusion_verifier_contract = InclusionVerifier::deploy(Arc::clone(&client), ()) - .unwrap() - .send() - .await - .unwrap(); - - // The number of bytes used to represent the balance of a cryptocurrency in polynomials. - let balance_byte_range = 8; - - let args: &[Token] = &[ - Token::Address(verifying_key_contract.address()), - Token::Address(snark_verifier_contract.address()), - Token::Address(grand_sum_verifier.address()), - Token::Address(inclusion_verifier_contract.address()), - // TOCO: check cryptocurrency names - Token::Array([Token::String("ETH".into()), Token::String("USDT".into())].to_vec()), - Token::Array([Token::String("ETH".into()), Token::String("ETH".into())].to_vec()), - Token::Uint(balance_byte_range.into()), - ]; - - // Deploy Summa contract. - let summa_contract = Summa::deploy(Arc::clone(&client), args) - .unwrap() - .send() - .await - .unwrap(); - - time::sleep(Duration::from_secs(3)).await; - - (anvil, cex_addr_1, cex_addr_2, client, summa_contract) -} - #[cfg(test)] mod test { - use ethers::{ - abi::AbiEncode, - providers::{Http, Middleware, Provider}, - types::{U256, U64}, - utils::to_checksum, - }; - use halo2_proofs::halo2curves::bn256::Fr as Fp; use rand::{rngs::OsRng, Rng}; - use std::{convert::TryFrom, error::Error}; - use tokio::{ - join, - time::{sleep, Duration}, - }; - use crate::apis::{address_ownership::AddressOwnership, round::Round}; - use crate::contracts::{ - generated::summa_contract::{AddressOwnershipProof, AddressOwnershipProofSubmittedFilter}, - signer::{AddressInput, SummaSigner}, - }; - use crate::tests::initialize_test_env; - use summa_solvency::{ - circuits::{ - univariate_grand_sum::{UnivariateGrandSum, UnivariateGrandSumConfig}, - utils::{full_prover, full_verifier, generate_setup_artifacts}, + use plonkish_backend::{ + backend::{hyperplonk::HyperPlonk, PlonkishBackend, PlonkishCircuit}, + frontend::halo2::Halo2Circuit, + halo2_curves::bn256::{Bn256, Fr as Fp}, + pcs::{multilinear::MultilinearKzg, Evaluation, PolynomialCommitmentScheme}, + util::{ + test::seeded_std_rng, + transcript::{FieldTranscriptRead, InMemoryTranscript, Keccak256Transcript}, }, - cryptocurrency::Cryptocurrency, - entry::Entry, - utils::parse_csv_to_entries, + }; + + use crate::apis::round::Round; + use summa_hyperplonk::{ + circuits::summa_circuit::summa_hyperplonk::SummaHyperplonk, + utils::{big_uint_to_fp, generate_dummy_entries}, }; const K: u32 = 17; const N_CURRENCIES: usize = 2; const N_USERS: usize = 16; - const PARAMS_PATH: &str = "../backend/ptau/hermez-raw-17"; - - #[tokio::test] - async fn test_deployed_address() -> Result<(), Box> { - let (anvil, _, _, _, summa_contract) = initialize_test_env(None).await; - - // Hardhat development environment, usually updates the address of a deployed contract in the `artifacts` directory. - // However, in our custom deployment script, `contracts/scripts/deploy.ts`, the address is updated in `backend/src/contracts/deployments.json`. - let contract_address = summa_contract.address(); - - let signer = SummaSigner::new( - "0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80", - anvil.endpoint().as_str(), - AddressInput::Path("./src/contracts/deployments.json".into()), // This file contains the address of the deployed contract. - ) - .await?; - - assert_eq!(contract_address, signer.get_summa_address()); - - Ok(()) - } - - #[tokio::test] - async fn test_concurrent_sumbit_commitments() -> Result<(), Box> { - let (anvil, _, _, _, summa_contract) = initialize_test_env(Some(1)).await; - - // This test ensures that dispatching two commitments concurrently does not result in nonce collisions. - // It checks that both commitments are processed and mined, indicating there is no interference when they are submitted simultaneously. - let signer = SummaSigner::new( - "0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80", - anvil.endpoint().as_str(), - AddressInput::Address(summa_contract.address()), - ) - .await?; - - let entry_csv = "../csv/entry_16.csv"; - let mut entries: Vec> = vec![Entry::init_empty(); N_USERS]; - let mut cryptos = vec![Cryptocurrency::init_empty(); N_CURRENCIES]; - parse_csv_to_entries::<&str, N_CURRENCIES>(entry_csv, &mut entries, &mut cryptos).unwrap(); + const PARAMS_PATH: &str = "../backend/ptau/hyperplonk-srs-17"; - let univariate_grand_sum_circuit = UnivariateGrandSum::< - N_USERS, - N_CURRENCIES, - UnivariateGrandSumConfig, - >::init(entries.to_vec()); - - let (params, pk, vk) = - generate_setup_artifacts(K, Some(PARAMS_PATH), &univariate_grand_sum_circuit).unwrap(); - - // Create a proof - let instances = vec![Fp::zero(); 1]; // This instance is necessary to verify proof on solidity verifier. - let (zk_snark_proof, advice_polys, _omega) = full_prover( - ¶ms, - &pk, - univariate_grand_sum_circuit.clone(), - &[instances.clone()], - ); - - let mut round_one = Round::::new( - &signer, - zk_snark_proof.clone(), - advice_polys.clone(), - params.clone(), - vk.clone(), - 1, - ); - let mut round_two = Round::::new( - &signer, - zk_snark_proof, - advice_polys, - params, - vk, - 2, - ); - - // Check the block number before sending the transaction for liability commitment. - let outer_provider: Provider = Provider::try_from(anvil.endpoint().as_str())?; - let start_block_number = outer_provider.get_block_number().await?; - - // Send two commitments simultaneously. - let (round_one_result, round_two_result) = join!( - round_one.dispatch_commitment(), - round_two.dispatch_commitment() - ); - - // Check that two blocks have been mined. - for _ in 0..5 { - sleep(Duration::from_millis(500)).await; - let updated_block_number = outer_provider.get_block_number().await?; - if (updated_block_number - start_block_number) > U64::from(2) { - break; - } - } - - // Check that the results of both commitments are correctly submitted. - assert!(round_one_result.is_ok()); - assert!(round_two_result.is_ok()); - - Ok(()) - } - - #[tokio::test] - async fn test_round_features() -> Result<(), Box> { - let (anvil, cex_addr_1, cex_addr_2, _, summa_contract) = initialize_test_env(None).await; - - let signer = SummaSigner::new( - "0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80", - anvil.endpoint().as_str(), - AddressInput::Address(summa_contract.address()), - ) - .await?; - - let mut address_ownership_client = - AddressOwnership::new(&signer, "../csv/signatures.csv").unwrap(); - - // Dispatch proof of address ownership. - address_ownership_client - .dispatch_proof_of_address_ownership() - .await?; - - let ownership_proof_logs = summa_contract - .address_ownership_proof_submitted_filter() - .query() - .await?; - - assert_eq!(ownership_proof_logs.len(), 1); - assert_eq!( - ownership_proof_logs[0], - AddressOwnershipProofSubmittedFilter { - address_ownership_proofs: vec![AddressOwnershipProof { - chain: "ETH".to_string(), - cex_address: to_checksum(&cex_addr_1, None), - signature: - ("0x089b32327d332c295dc3b8873c205b72153211de6dc1c51235782b091cefb9d06d6df2661b86a7d441cd322f125b84901486b150e684221a7b7636eb8182af551b").parse().unwrap(), - message: "Summa proof of solvency for CryptoExchange".encode().into(), - },AddressOwnershipProof { - chain: "ETH".to_string(), - cex_address:to_checksum(&cex_addr_2, None), - signature: - ("0xb17a9e25265d3b88de7bfad81e7accad6e3d5612308ff83cc0fef76a34152b0444309e8fc3dea5139e49b6fc83a8553071a7af3d0cfd3fb8c1aea2a4c171729c1c").parse().unwrap(), - message: "Summa proof of solvency for CryptoExchange".encode().into(), - }, - ], - } - ); + #[test] + fn test_round_features() { + type ProvingBackend = HyperPlonk>; // Initialize Round. - let entry_csv = "../csv/entry_16.csv"; - let mut entries: Vec> = vec![Entry::init_empty(); N_USERS]; - let mut cryptos = vec![Cryptocurrency::init_empty(); N_CURRENCIES]; - parse_csv_to_entries::<&str, N_CURRENCIES>(entry_csv, &mut entries, &mut cryptos).unwrap(); + let entries = generate_dummy_entries::().unwrap(); + let circuit = SummaHyperplonk::::init(entries.to_vec()); + let num_vars = K; - let univariate_grand_sum_circuit = UnivariateGrandSum::< - N_USERS, - N_CURRENCIES, - UnivariateGrandSumConfig, - >::init(entries.to_vec()); + let circuit_fn = |num_vars| { + let circuit = Halo2Circuit::>::new::< + ProvingBackend, + >(num_vars, circuit.clone()); + (circuit.circuit_info().unwrap(), circuit) + }; - let (params, pk, vk) = - generate_setup_artifacts(K, Some(PARAMS_PATH), &univariate_grand_sum_circuit).unwrap(); + let (circuit_info, circuit) = circuit_fn(num_vars as usize); + let instances = circuit.instances(); // Create a SNARK proof - let instances = vec![Fp::zero(); 1]; // This instance is necessary to verify proof on solidity verifier. - let (zk_snark_proof, advice_polys, _omega) = full_prover( - ¶ms, - &pk, - univariate_grand_sum_circuit.clone(), - &[instances.clone()], - ); + let param = ProvingBackend::setup_custom(PARAMS_PATH).unwrap(); + + let (prover_params, verifier_params) = + ProvingBackend::preprocess(¶m, &circuit_info).unwrap(); - // Verify the SNARK proof to ensure its validity. - assert!(full_verifier( - ¶ms, - pk.get_vk(), - &zk_snark_proof, - &[instances] - )); + let (advice_polys, proof_transcript) = { + let mut proof_transcript = Keccak256Transcript::new(()); + + let advice_polys = ProvingBackend::prove( + &prover_params, + &circuit, + &mut proof_transcript, + seeded_std_rng(), + ) + .unwrap(); + (advice_polys, proof_transcript) + }; + + let zk_snark_proof = proof_transcript.into_proof(); + + let mut transcript; + let result: Result<(), plonkish_backend::Error> = { + transcript = Keccak256Transcript::from_proof((), zk_snark_proof.as_slice()); + ProvingBackend::verify( + &verifier_params, + instances, + &mut transcript, + seeded_std_rng(), + ) + }; + assert_eq!(result, Ok(())); let snapshot_time = 1u64; let mut round = Round::::new( - &signer, - zk_snark_proof, + zk_snark_proof.clone(), advice_polys, - params, - vk, + prover_params, + verifier_params.clone(), snapshot_time, ); - let mut liability_commitment_logs = summa_contract - .liabilities_commitment_submitted_filter() - .query() - .await?; - assert_eq!(liability_commitment_logs.len(), 0); - - // Dispatch the liability commitment transaction to Summa contract. - round.dispatch_commitment().await?; - - // Check for updated logs to confirm the liability commitment transaction. - liability_commitment_logs = summa_contract - .liabilities_commitment_submitted_filter() - .query() - .await?; - - assert_eq!(liability_commitment_logs.len(), 1); - assert_eq!(liability_commitment_logs[0].timestamp, U256::from(1)); - assert_eq!( - liability_commitment_logs[0].total_balances, - vec![U256::from(556862), U256::from(556862)] - ); - assert_eq!(liability_commitment_logs[0].grand_sum_proof.len(), 128); - assert_eq!(liability_commitment_logs[0].snark_proof.len(), 192); + let (commitment_proof, vp) = round.gen_commitment_and_vp().unwrap(); + // Checks return proof and verifier params are the same + assert_eq!(commitment_proof.get_proof(), &zk_snark_proof); + for i in 0..num_vars as usize { + assert_eq!(vp.pcs.ss(i), verifier_params.pcs.ss(i)); + } // Generate and verify an inclusion proof for a random user. let user_range: std::ops::Range = 0..N_USERS; @@ -370,23 +99,52 @@ mod test { // Check inclusion proof is not none assert!(inclusion_proof.get_proof().len() > 0); + assert_eq!(inclusion_proof.get_input_values().len(), N_CURRENCIES + 1); + + // Verifier side + let mut kzg_transcript = + Keccak256Transcript::from_proof((), inclusion_proof.get_proof().as_slice()); + + // The verifier knows the ZK-SNARK proof, can extract the polynomial commitments + let mut transcript = Keccak256Transcript::from_proof((), zk_snark_proof.as_slice()); + let user_entry_commitments = MultilinearKzg::::read_commitments( + &verifier_params.pcs, + N_CURRENCIES + 1, + &mut transcript, + ) + .unwrap(); - // Verify the inclusion proof with onchain function - let verified = summa_contract - .verify_inclusion_proof( - U256::from(snapshot_time), - inclusion_proof.get_proof().clone(), - inclusion_proof - .get_challenge() - .clone() - .expect("no challenge"), - inclusion_proof.get_input_values().clone(), - ) - .await?; - - assert!(verified); + let mut multivariate_challenge: Vec = Vec::new(); + for _ in 0..num_vars { + multivariate_challenge.push(kzg_transcript.read_field_element().unwrap()); + } - drop(anvil); - Ok(()) + // Assumed that the user already knows their evaluation, which is balances, at the challenge point + let evals: Vec> = (0..N_CURRENCIES + 1) + .map(|i| { + if i == 0 { + Evaluation::new( + i, + 0, + big_uint_to_fp::(entries[random_user_index].username_as_big_uint()), + ) + } else { + Evaluation::new( + i, + 0, + big_uint_to_fp::(&entries[random_user_index].balances()[i - 1]), + ) + } + }) + .collect(); + + MultilinearKzg::::batch_verify( + &verifier_params.pcs, + &user_entry_commitments, + &[multivariate_challenge.clone()], + &evals, + &mut kzg_transcript, + ) + .unwrap(); } } diff --git a/contracts/.gitignore b/contracts/.gitignore deleted file mode 100644 index 9b921b13..00000000 --- a/contracts/.gitignore +++ /dev/null @@ -1,12 +0,0 @@ -node_modules -.env -coverage -coverage.json -typechain -typechain-types -.DS_Store - -# Hardhat files -cache -artifacts - diff --git a/contracts/README.md b/contracts/README.md deleted file mode 100644 index 584e3ff8..00000000 --- a/contracts/README.md +++ /dev/null @@ -1,51 +0,0 @@ -# Summa Smart Contract - -The [Summa smart contract](src/Summa.sol) serves as a registrar for Custodians to affirm their liabilities by submitting a polynomial commitment of all liabilities owed to their users. Users can verify their inclusion in the liabilities commitment, allowing public comparison of the committed total sums with the assets owned by the Custodian onchain. - - -## Features - -- **Address Ownership Proofs**: Custodians should submit proof of address ownership for all addresses holding assets included in the commitment using the `submitProofOfAddressOwnership` function. These proofs are accepted optimistically and subject to off-chain verification. - -- **Liabilities Commitments**: Custodians can commit to their liabilities in the form of polynomial commitments and the corresponding total sums representing snapshots of the liabilities at a given timestamp through the `submitCommitment` function. - -- **Inclusion Verification**: Users can verify the polynomial commitment of their balances into the liabilities using the `verifyInclusionProof` function. This function calls the underlying smart contract [InclusionVerifier](src/InclusionVerifier.sol) module. refer to the module's [readme](./../prover/README.md) for details. - - -## Installation - -Ensure you have Node.js installed on your machine before proceeding. The smart contract is written in Solidity and uses the Hardhat environment for testing and deployment. - -To set up the project environment, install the necessary dependencies: - -```shell -npm install -``` - -## Testing - -```shell -npx hardhat node -REPORT_GAS=true npx hardhat test -``` - -### Test Coverage - -```shell -npx hardhat coverage -``` - -## Deploying - -```shell -npx hardhat run scripts/deploy.ts -``` - -The Summa contract deployment script is designed to streamline setup by automatically deploying three verifier contracts along with one verifying key contract. It then configures the deployment with specific parameters, which include: - -- The number of currencies; -- the number of bytes used to represent the balance of a cryptocurrency in the polynomials; - -The deployment script updates the latest deployment address for the chain in the [deployments](./../backend/src/contracts/deployments.json) file in the backend. This allows the backend module to connect to the deployed contract seamlessly. - -Additionally, the script transfers the contract ABIs from `./artifacts/src/` to the [backend](./../backend/src/contracts/abi/) module. Subsequently, the backend build script generates the updated contract interfaces (for more details, see the backend [readme](./../backend/README.md)). diff --git a/contracts/hardhat.config.ts b/contracts/hardhat.config.ts deleted file mode 100644 index cea08afb..00000000 --- a/contracts/hardhat.config.ts +++ /dev/null @@ -1,47 +0,0 @@ -import "@nomicfoundation/hardhat-toolbox"; -import "hardhat-gas-reporter"; -import "solidity-coverage"; -import * as dotenv from "dotenv"; - -dotenv.config(); -module.exports = { - defaultNetwork: "hardhat", - networks: { - localhost: { - chainId: 31337, - url: "http://127.0.0.1:8545", - }, - hardhat: {}, - // goerli: { - // chainId: 5, - // url: process.env.GOERLI_URL, - // accounts: [process.env.GOERLI_PRIVATE_KEY], - // }, - }, - gasReporter: { - currency: "USD", - gasPrice: 30, - }, - solidity: { - compilers: [ - { - version: "0.8.18", - settings: { - evmVersion: "istanbul", - optimizer: { - enabled: true, - runs: 200, - details: { yul: true }, // Necessary to run tests with coverage with inline assembly - }, - }, - }, - ], - }, - paths: { - sources: "src", - tests: "test", - cache: "cache", - artifacts: "artifacts", - out: "build/out", - }, -}; diff --git a/contracts/package-lock.json b/contracts/package-lock.json deleted file mode 100644 index abdf5e83..00000000 --- a/contracts/package-lock.json +++ /dev/null @@ -1,8608 +0,0 @@ -{ - "name": "hardhat-project", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "hardhat-project", - "dependencies": { - "@openzeppelin/contracts": "^4.9.2", - "dotenv": "^16.3.1", - "ethers": "^5.6.9" - }, - "devDependencies": { - "@nomicfoundation/hardhat-network-helpers": "^1.0.8", - "@nomicfoundation/hardhat-toolbox": "^2.0.2", - "hardhat": "^2.16.0", - "hardhat-gas-reporter": "^1.0.9", - "prettier": "^2.8.8", - "prettier-plugin-solidity": "^1.1.3", - "solidity-coverage": "^0.8.7" - } - }, - "node_modules/@chainsafe/as-sha256": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@chainsafe/as-sha256/-/as-sha256-0.3.1.tgz", - "integrity": "sha512-hldFFYuf49ed7DAakWVXSJODuq3pzJEguD8tQ7h+sGkM18vja+OFoJI9krnGmgzyuZC2ETX0NOIcCTy31v2Mtg==", - "dev": true - }, - "node_modules/@chainsafe/persistent-merkle-tree": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.4.2.tgz", - "integrity": "sha512-lLO3ihKPngXLTus/L7WHKaw9PnNJWizlOF1H9NNzHP6Xvh82vzg9F2bzkXhYIFshMZ2gTCEz8tq6STe7r5NDfQ==", - "dev": true, - "dependencies": { - "@chainsafe/as-sha256": "^0.3.1" - } - }, - "node_modules/@chainsafe/ssz": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/@chainsafe/ssz/-/ssz-0.9.4.tgz", - "integrity": "sha512-77Qtg2N1ayqs4Bg/wvnWfg5Bta7iy7IRh8XqXh7oNMeP2HBbBwx8m6yTpA8p0EHItWPEBkgZd5S5/LSlp3GXuQ==", - "dev": true, - "dependencies": { - "@chainsafe/as-sha256": "^0.3.1", - "@chainsafe/persistent-merkle-tree": "^0.4.2", - "case": "^1.6.3" - } - }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, - "peer": true, - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@ethersproject/abi": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz", - "integrity": "sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/address": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/hash": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/strings": "^5.7.0" - } - }, - "node_modules/@ethersproject/abstract-provider": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz", - "integrity": "sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/networks": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "@ethersproject/web": "^5.7.0" - } - }, - "node_modules/@ethersproject/abstract-signer": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz", - "integrity": "sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/abstract-provider": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0" - } - }, - "node_modules/@ethersproject/address": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", - "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/rlp": "^5.7.0" - } - }, - "node_modules/@ethersproject/base64": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.7.0.tgz", - "integrity": "sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.7.0" - } - }, - "node_modules/@ethersproject/basex": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.7.0.tgz", - "integrity": "sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/properties": "^5.7.0" - } - }, - "node_modules/@ethersproject/bignumber": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.7.0.tgz", - "integrity": "sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "bn.js": "^5.2.1" - } - }, - "node_modules/@ethersproject/bytes": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.7.0.tgz", - "integrity": "sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/logger": "^5.7.0" - } - }, - "node_modules/@ethersproject/constants": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.7.0.tgz", - "integrity": "sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bignumber": "^5.7.0" - } - }, - "node_modules/@ethersproject/contracts": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.7.0.tgz", - "integrity": "sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/abi": "^5.7.0", - "@ethersproject/abstract-provider": "^5.7.0", - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/address": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/transactions": "^5.7.0" - } - }, - "node_modules/@ethersproject/hash": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.7.0.tgz", - "integrity": "sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/address": "^5.7.0", - "@ethersproject/base64": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/strings": "^5.7.0" - } - }, - "node_modules/@ethersproject/hdnode": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.7.0.tgz", - "integrity": "sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/basex": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/pbkdf2": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/sha2": "^5.7.0", - "@ethersproject/signing-key": "^5.7.0", - "@ethersproject/strings": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "@ethersproject/wordlists": "^5.7.0" - } - }, - "node_modules/@ethersproject/json-wallets": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz", - "integrity": "sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/address": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/hdnode": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/pbkdf2": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/random": "^5.7.0", - "@ethersproject/strings": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "aes-js": "3.0.0", - "scrypt-js": "3.0.1" - } - }, - "node_modules/@ethersproject/keccak256": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.7.0.tgz", - "integrity": "sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "js-sha3": "0.8.0" - } - }, - "node_modules/@ethersproject/logger": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.7.0.tgz", - "integrity": "sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ] - }, - "node_modules/@ethersproject/networks": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.1.tgz", - "integrity": "sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/logger": "^5.7.0" - } - }, - "node_modules/@ethersproject/pbkdf2": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz", - "integrity": "sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/sha2": "^5.7.0" - } - }, - "node_modules/@ethersproject/properties": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.7.0.tgz", - "integrity": "sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/logger": "^5.7.0" - } - }, - "node_modules/@ethersproject/providers": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.7.2.tgz", - "integrity": "sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/abstract-provider": "^5.7.0", - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/address": "^5.7.0", - "@ethersproject/base64": "^5.7.0", - "@ethersproject/basex": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/hash": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/networks": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/random": "^5.7.0", - "@ethersproject/rlp": "^5.7.0", - "@ethersproject/sha2": "^5.7.0", - "@ethersproject/strings": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "@ethersproject/web": "^5.7.0", - "bech32": "1.1.4", - "ws": "7.4.6" - } - }, - "node_modules/@ethersproject/providers/node_modules/ws": { - "version": "7.4.6", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", - "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/@ethersproject/random": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/random/-/random-5.7.0.tgz", - "integrity": "sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0" - } - }, - "node_modules/@ethersproject/rlp": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.7.0.tgz", - "integrity": "sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0" - } - }, - "node_modules/@ethersproject/sha2": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.7.0.tgz", - "integrity": "sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "hash.js": "1.1.7" - } - }, - "node_modules/@ethersproject/signing-key": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.7.0.tgz", - "integrity": "sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "bn.js": "^5.2.1", - "elliptic": "6.5.4", - "hash.js": "1.1.7" - } - }, - "node_modules/@ethersproject/solidity": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.7.0.tgz", - "integrity": "sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/sha2": "^5.7.0", - "@ethersproject/strings": "^5.7.0" - } - }, - "node_modules/@ethersproject/strings": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.7.0.tgz", - "integrity": "sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/logger": "^5.7.0" - } - }, - "node_modules/@ethersproject/transactions": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.7.0.tgz", - "integrity": "sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/address": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/rlp": "^5.7.0", - "@ethersproject/signing-key": "^5.7.0" - } - }, - "node_modules/@ethersproject/units": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/units/-/units-5.7.0.tgz", - "integrity": "sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/logger": "^5.7.0" - } - }, - "node_modules/@ethersproject/wallet": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.7.0.tgz", - "integrity": "sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/abstract-provider": "^5.7.0", - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/address": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/hash": "^5.7.0", - "@ethersproject/hdnode": "^5.7.0", - "@ethersproject/json-wallets": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/random": "^5.7.0", - "@ethersproject/signing-key": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "@ethersproject/wordlists": "^5.7.0" - } - }, - "node_modules/@ethersproject/web": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.1.tgz", - "integrity": "sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/base64": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/strings": "^5.7.0" - } - }, - "node_modules/@ethersproject/wordlists": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.7.0.tgz", - "integrity": "sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/hash": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/strings": "^5.7.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true, - "peer": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, - "peer": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "node_modules/@metamask/eth-sig-util": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@metamask/eth-sig-util/-/eth-sig-util-4.0.1.tgz", - "integrity": "sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ==", - "dev": true, - "dependencies": { - "ethereumjs-abi": "^0.6.8", - "ethereumjs-util": "^6.2.1", - "ethjs-util": "^0.1.6", - "tweetnacl": "^1.0.3", - "tweetnacl-util": "^0.15.1" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/@noble/hashes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.2.0.tgz", - "integrity": "sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ] - }, - "node_modules/@noble/secp256k1": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.7.1.tgz", - "integrity": "sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ] - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nomicfoundation/ethereumjs-block": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-block/-/ethereumjs-block-5.0.1.tgz", - "integrity": "sha512-u1Yioemi6Ckj3xspygu/SfFvm8vZEO8/Yx5a1QLzi6nVU0jz3Pg2OmHKJ5w+D9Ogk1vhwRiqEBAqcb0GVhCyHw==", - "dev": true, - "dependencies": { - "@nomicfoundation/ethereumjs-common": "4.0.1", - "@nomicfoundation/ethereumjs-rlp": "5.0.1", - "@nomicfoundation/ethereumjs-trie": "6.0.1", - "@nomicfoundation/ethereumjs-tx": "5.0.1", - "@nomicfoundation/ethereumjs-util": "9.0.1", - "ethereum-cryptography": "0.1.3", - "ethers": "^5.7.1" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@nomicfoundation/ethereumjs-block/node_modules/ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "dev": true, - "dependencies": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" - } - }, - "node_modules/@nomicfoundation/ethereumjs-blockchain": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-blockchain/-/ethereumjs-blockchain-7.0.1.tgz", - "integrity": "sha512-NhzndlGg829XXbqJEYrF1VeZhAwSPgsK/OB7TVrdzft3y918hW5KNd7gIZ85sn6peDZOdjBsAXIpXZ38oBYE5A==", - "dev": true, - "dependencies": { - "@nomicfoundation/ethereumjs-block": "5.0.1", - "@nomicfoundation/ethereumjs-common": "4.0.1", - "@nomicfoundation/ethereumjs-ethash": "3.0.1", - "@nomicfoundation/ethereumjs-rlp": "5.0.1", - "@nomicfoundation/ethereumjs-trie": "6.0.1", - "@nomicfoundation/ethereumjs-tx": "5.0.1", - "@nomicfoundation/ethereumjs-util": "9.0.1", - "abstract-level": "^1.0.3", - "debug": "^4.3.3", - "ethereum-cryptography": "0.1.3", - "level": "^8.0.0", - "lru-cache": "^5.1.1", - "memory-level": "^1.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@nomicfoundation/ethereumjs-blockchain/node_modules/ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "dev": true, - "dependencies": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" - } - }, - "node_modules/@nomicfoundation/ethereumjs-common": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-4.0.1.tgz", - "integrity": "sha512-OBErlkfp54GpeiE06brBW/TTbtbuBJV5YI5Nz/aB2evTDo+KawyEzPjBlSr84z/8MFfj8wS2wxzQX1o32cev5g==", - "dev": true, - "dependencies": { - "@nomicfoundation/ethereumjs-util": "9.0.1", - "crc-32": "^1.2.0" - } - }, - "node_modules/@nomicfoundation/ethereumjs-ethash": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-ethash/-/ethereumjs-ethash-3.0.1.tgz", - "integrity": "sha512-KDjGIB5igzWOp8Ik5I6QiRH5DH+XgILlplsHR7TEuWANZA759G6krQ6o8bvj+tRUz08YygMQu/sGd9mJ1DYT8w==", - "dev": true, - "dependencies": { - "@nomicfoundation/ethereumjs-block": "5.0.1", - "@nomicfoundation/ethereumjs-rlp": "5.0.1", - "@nomicfoundation/ethereumjs-util": "9.0.1", - "abstract-level": "^1.0.3", - "bigint-crypto-utils": "^3.0.23", - "ethereum-cryptography": "0.1.3" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@nomicfoundation/ethereumjs-ethash/node_modules/ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "dev": true, - "dependencies": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" - } - }, - "node_modules/@nomicfoundation/ethereumjs-evm": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-evm/-/ethereumjs-evm-2.0.1.tgz", - "integrity": "sha512-oL8vJcnk0Bx/onl+TgQOQ1t/534GKFaEG17fZmwtPFeH8S5soiBYPCLUrvANOl4sCp9elYxIMzIiTtMtNNN8EQ==", - "dev": true, - "dependencies": { - "@ethersproject/providers": "^5.7.1", - "@nomicfoundation/ethereumjs-common": "4.0.1", - "@nomicfoundation/ethereumjs-tx": "5.0.1", - "@nomicfoundation/ethereumjs-util": "9.0.1", - "debug": "^4.3.3", - "ethereum-cryptography": "0.1.3", - "mcl-wasm": "^0.7.1", - "rustbn.js": "~0.2.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@nomicfoundation/ethereumjs-evm/node_modules/ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "dev": true, - "dependencies": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" - } - }, - "node_modules/@nomicfoundation/ethereumjs-rlp": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-5.0.1.tgz", - "integrity": "sha512-xtxrMGa8kP4zF5ApBQBtjlSbN5E2HI8m8FYgVSYAnO6ssUoY5pVPGy2H8+xdf/bmMa22Ce8nWMH3aEW8CcqMeQ==", - "dev": true, - "bin": { - "rlp": "bin/rlp" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@nomicfoundation/ethereumjs-statemanager": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-statemanager/-/ethereumjs-statemanager-2.0.1.tgz", - "integrity": "sha512-B5ApMOnlruVOR7gisBaYwFX+L/AP7i/2oAahatssjPIBVDF6wTX1K7Qpa39E/nzsH8iYuL3krkYeUFIdO3EMUQ==", - "dev": true, - "dependencies": { - "@nomicfoundation/ethereumjs-common": "4.0.1", - "@nomicfoundation/ethereumjs-rlp": "5.0.1", - "debug": "^4.3.3", - "ethereum-cryptography": "0.1.3", - "ethers": "^5.7.1", - "js-sdsl": "^4.1.4" - } - }, - "node_modules/@nomicfoundation/ethereumjs-statemanager/node_modules/ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "dev": true, - "dependencies": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" - } - }, - "node_modules/@nomicfoundation/ethereumjs-trie": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-trie/-/ethereumjs-trie-6.0.1.tgz", - "integrity": "sha512-A64It/IMpDVODzCgxDgAAla8jNjNtsoQZIzZUfIV5AY6Coi4nvn7+VReBn5itlxMiL2yaTlQr9TRWp3CSI6VoA==", - "dev": true, - "dependencies": { - "@nomicfoundation/ethereumjs-rlp": "5.0.1", - "@nomicfoundation/ethereumjs-util": "9.0.1", - "@types/readable-stream": "^2.3.13", - "ethereum-cryptography": "0.1.3", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@nomicfoundation/ethereumjs-trie/node_modules/ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "dev": true, - "dependencies": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" - } - }, - "node_modules/@nomicfoundation/ethereumjs-tx": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-5.0.1.tgz", - "integrity": "sha512-0HwxUF2u2hrsIM1fsasjXvlbDOq1ZHFV2dd1yGq8CA+MEYhaxZr8OTScpVkkxqMwBcc5y83FyPl0J9MZn3kY0w==", - "dev": true, - "dependencies": { - "@chainsafe/ssz": "^0.9.2", - "@ethersproject/providers": "^5.7.2", - "@nomicfoundation/ethereumjs-common": "4.0.1", - "@nomicfoundation/ethereumjs-rlp": "5.0.1", - "@nomicfoundation/ethereumjs-util": "9.0.1", - "ethereum-cryptography": "0.1.3" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@nomicfoundation/ethereumjs-tx/node_modules/ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "dev": true, - "dependencies": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" - } - }, - "node_modules/@nomicfoundation/ethereumjs-util": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-9.0.1.tgz", - "integrity": "sha512-TwbhOWQ8QoSCFhV/DDfSmyfFIHjPjFBj957219+V3jTZYZ2rf9PmDtNOeZWAE3p3vlp8xb02XGpd0v6nTUPbsA==", - "dev": true, - "dependencies": { - "@chainsafe/ssz": "^0.10.0", - "@nomicfoundation/ethereumjs-rlp": "5.0.1", - "ethereum-cryptography": "0.1.3" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@nomicfoundation/ethereumjs-util/node_modules/@chainsafe/persistent-merkle-tree": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.5.0.tgz", - "integrity": "sha512-l0V1b5clxA3iwQLXP40zYjyZYospQLZXzBVIhhr9kDg/1qHZfzzHw0jj4VPBijfYCArZDlPkRi1wZaV2POKeuw==", - "dev": true, - "dependencies": { - "@chainsafe/as-sha256": "^0.3.1" - } - }, - "node_modules/@nomicfoundation/ethereumjs-util/node_modules/@chainsafe/ssz": { - "version": "0.10.2", - "resolved": "https://registry.npmjs.org/@chainsafe/ssz/-/ssz-0.10.2.tgz", - "integrity": "sha512-/NL3Lh8K+0q7A3LsiFq09YXS9fPE+ead2rr7vM2QK8PLzrNsw3uqrif9bpRX5UxgeRjM+vYi+boCM3+GM4ovXg==", - "dev": true, - "dependencies": { - "@chainsafe/as-sha256": "^0.3.1", - "@chainsafe/persistent-merkle-tree": "^0.5.0" - } - }, - "node_modules/@nomicfoundation/ethereumjs-util/node_modules/ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "dev": true, - "dependencies": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" - } - }, - "node_modules/@nomicfoundation/ethereumjs-vm": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-7.0.1.tgz", - "integrity": "sha512-rArhyn0jPsS/D+ApFsz3yVJMQ29+pVzNZ0VJgkzAZ+7FqXSRtThl1C1prhmlVr3YNUlfpZ69Ak+RUT4g7VoOuQ==", - "dev": true, - "dependencies": { - "@nomicfoundation/ethereumjs-block": "5.0.1", - "@nomicfoundation/ethereumjs-blockchain": "7.0.1", - "@nomicfoundation/ethereumjs-common": "4.0.1", - "@nomicfoundation/ethereumjs-evm": "2.0.1", - "@nomicfoundation/ethereumjs-rlp": "5.0.1", - "@nomicfoundation/ethereumjs-statemanager": "2.0.1", - "@nomicfoundation/ethereumjs-trie": "6.0.1", - "@nomicfoundation/ethereumjs-tx": "5.0.1", - "@nomicfoundation/ethereumjs-util": "9.0.1", - "debug": "^4.3.3", - "ethereum-cryptography": "0.1.3", - "mcl-wasm": "^0.7.1", - "rustbn.js": "~0.2.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@nomicfoundation/ethereumjs-vm/node_modules/ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "dev": true, - "dependencies": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" - } - }, - "node_modules/@nomicfoundation/hardhat-chai-matchers": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-chai-matchers/-/hardhat-chai-matchers-1.0.6.tgz", - "integrity": "sha512-f5ZMNmabZeZegEfuxn/0kW+mm7+yV7VNDxLpMOMGXWFJ2l/Ct3QShujzDRF9cOkK9Ui/hbDeOWGZqyQALDXVCQ==", - "dev": true, - "peer": true, - "dependencies": { - "@ethersproject/abi": "^5.1.2", - "@types/chai-as-promised": "^7.1.3", - "chai-as-promised": "^7.1.1", - "deep-eql": "^4.0.1", - "ordinal": "^1.0.3" - }, - "peerDependencies": { - "@nomiclabs/hardhat-ethers": "^2.0.0", - "chai": "^4.2.0", - "ethers": "^5.0.0", - "hardhat": "^2.9.4" - } - }, - "node_modules/@nomicfoundation/hardhat-network-helpers": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-network-helpers/-/hardhat-network-helpers-1.0.8.tgz", - "integrity": "sha512-MNqQbzUJZnCMIYvlniC3U+kcavz/PhhQSsY90tbEtUyMj/IQqsLwIRZa4ctjABh3Bz0KCh9OXUZ7Yk/d9hr45Q==", - "dev": true, - "dependencies": { - "ethereumjs-util": "^7.1.4" - }, - "peerDependencies": { - "hardhat": "^2.9.5" - } - }, - "node_modules/@nomicfoundation/hardhat-network-helpers/node_modules/ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "dev": true, - "dependencies": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" - } - }, - "node_modules/@nomicfoundation/hardhat-network-helpers/node_modules/ethereumjs-util": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", - "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", - "dev": true, - "dependencies": { - "@types/bn.js": "^5.1.0", - "bn.js": "^5.1.2", - "create-hash": "^1.1.2", - "ethereum-cryptography": "^0.1.3", - "rlp": "^2.2.4" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@nomicfoundation/hardhat-toolbox": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-toolbox/-/hardhat-toolbox-2.0.2.tgz", - "integrity": "sha512-vnN1AzxbvpSx9pfdRHbUzTRIXpMLPXnUlkW855VaDk6N1pwRaQ2gNzEmFAABk4lWf11E00PKwFd/q27HuwYrYg==", - "dev": true, - "peerDependencies": { - "@ethersproject/abi": "^5.4.7", - "@ethersproject/providers": "^5.4.7", - "@nomicfoundation/hardhat-chai-matchers": "^1.0.0", - "@nomicfoundation/hardhat-network-helpers": "^1.0.0", - "@nomiclabs/hardhat-ethers": "^2.0.0", - "@nomiclabs/hardhat-etherscan": "^3.0.0", - "@typechain/ethers-v5": "^10.1.0", - "@typechain/hardhat": "^6.1.2", - "@types/chai": "^4.2.0", - "@types/mocha": ">=9.1.0", - "@types/node": ">=12.0.0", - "chai": "^4.2.0", - "ethers": "^5.4.7", - "hardhat": "^2.11.0", - "hardhat-gas-reporter": "^1.0.8", - "solidity-coverage": "^0.8.1", - "ts-node": ">=8.0.0", - "typechain": "^8.1.0", - "typescript": ">=4.5.0" - } - }, - "node_modules/@nomicfoundation/solidity-analyzer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.1.tgz", - "integrity": "sha512-1LMtXj1puAxyFusBgUIy5pZk3073cNXYnXUpuNKFghHbIit/xZgbk0AokpUADbNm3gyD6bFWl3LRFh3dhVdREg==", - "dev": true, - "engines": { - "node": ">= 12" - }, - "optionalDependencies": { - "@nomicfoundation/solidity-analyzer-darwin-arm64": "0.1.1", - "@nomicfoundation/solidity-analyzer-darwin-x64": "0.1.1", - "@nomicfoundation/solidity-analyzer-freebsd-x64": "0.1.1", - "@nomicfoundation/solidity-analyzer-linux-arm64-gnu": "0.1.1", - "@nomicfoundation/solidity-analyzer-linux-arm64-musl": "0.1.1", - "@nomicfoundation/solidity-analyzer-linux-x64-gnu": "0.1.1", - "@nomicfoundation/solidity-analyzer-linux-x64-musl": "0.1.1", - "@nomicfoundation/solidity-analyzer-win32-arm64-msvc": "0.1.1", - "@nomicfoundation/solidity-analyzer-win32-ia32-msvc": "0.1.1", - "@nomicfoundation/solidity-analyzer-win32-x64-msvc": "0.1.1" - } - }, - "node_modules/@nomicfoundation/solidity-analyzer-darwin-arm64": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.1.1.tgz", - "integrity": "sha512-KcTodaQw8ivDZyF+D76FokN/HdpgGpfjc/gFCImdLUyqB6eSWVaZPazMbeAjmfhx3R0zm/NYVzxwAokFKgrc0w==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nomicfoundation/solidity-analyzer-darwin-x64": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.1.1.tgz", - "integrity": "sha512-XhQG4BaJE6cIbjAVtzGOGbK3sn1BO9W29uhk9J8y8fZF1DYz0Doj8QDMfpMu+A6TjPDs61lbsmeYodIDnfveSA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nomicfoundation/solidity-analyzer-freebsd-x64": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-freebsd-x64/-/solidity-analyzer-freebsd-x64-0.1.1.tgz", - "integrity": "sha512-GHF1VKRdHW3G8CndkwdaeLkVBi5A9u2jwtlS7SLhBc8b5U/GcoL39Q+1CSO3hYqePNP+eV5YI7Zgm0ea6kMHoA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nomicfoundation/solidity-analyzer-linux-arm64-gnu": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.1.1.tgz", - "integrity": "sha512-g4Cv2fO37ZsUENQ2vwPnZc2zRenHyAxHcyBjKcjaSmmkKrFr64yvzeNO8S3GBFCo90rfochLs99wFVGT/0owpg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nomicfoundation/solidity-analyzer-linux-arm64-musl": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.1.1.tgz", - "integrity": "sha512-WJ3CE5Oek25OGE3WwzK7oaopY8xMw9Lhb0mlYuJl/maZVo+WtP36XoQTb7bW/i8aAdHW5Z+BqrHMux23pvxG3w==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nomicfoundation/solidity-analyzer-linux-x64-gnu": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.1.1.tgz", - "integrity": "sha512-5WN7leSr5fkUBBjE4f3wKENUy9HQStu7HmWqbtknfXkkil+eNWiBV275IOlpXku7v3uLsXTOKpnnGHJYI2qsdA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nomicfoundation/solidity-analyzer-linux-x64-musl": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.1.1.tgz", - "integrity": "sha512-KdYMkJOq0SYPQMmErv/63CwGwMm5XHenEna9X9aB8mQmhDBrYrlAOSsIPgFCUSL0hjxE3xHP65/EPXR/InD2+w==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nomicfoundation/solidity-analyzer-win32-arm64-msvc": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-arm64-msvc/-/solidity-analyzer-win32-arm64-msvc-0.1.1.tgz", - "integrity": "sha512-VFZASBfl4qiBYwW5xeY20exWhmv6ww9sWu/krWSesv3q5hA0o1JuzmPHR4LPN6SUZj5vcqci0O6JOL8BPw+APg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nomicfoundation/solidity-analyzer-win32-ia32-msvc": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-ia32-msvc/-/solidity-analyzer-win32-ia32-msvc-0.1.1.tgz", - "integrity": "sha512-JnFkYuyCSA70j6Si6cS1A9Gh1aHTEb8kOTBApp/c7NRTFGNMH8eaInKlyuuiIbvYFhlXW4LicqyYuWNNq9hkpQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nomicfoundation/solidity-analyzer-win32-x64-msvc": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.1.1.tgz", - "integrity": "sha512-HrVJr6+WjIXGnw3Q9u6KQcbZCtk0caVWhCdFADySvRyUxJ8PnzlaP+MhwNE8oyT8OZ6ejHBRrrgjSqDCFXGirw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nomiclabs/hardhat-ethers": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.2.3.tgz", - "integrity": "sha512-YhzPdzb612X591FOe68q+qXVXGG2ANZRvDo0RRUtimev85rCrAlv/TLMEZw5c+kq9AbzocLTVX/h2jVIFPL9Xg==", - "dev": true, - "peer": true, - "peerDependencies": { - "ethers": "^5.0.0", - "hardhat": "^2.0.0" - } - }, - "node_modules/@nomiclabs/hardhat-etherscan": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-etherscan/-/hardhat-etherscan-3.1.7.tgz", - "integrity": "sha512-tZ3TvSgpvsQ6B6OGmo1/Au6u8BrAkvs1mIC/eURA3xgIfznUZBhmpne8hv7BXUzw9xNL3fXdpOYgOQlVMTcoHQ==", - "dev": true, - "peer": true, - "dependencies": { - "@ethersproject/abi": "^5.1.2", - "@ethersproject/address": "^5.0.2", - "cbor": "^8.1.0", - "chalk": "^2.4.2", - "debug": "^4.1.1", - "fs-extra": "^7.0.1", - "lodash": "^4.17.11", - "semver": "^6.3.0", - "table": "^6.8.0", - "undici": "^5.14.0" - }, - "peerDependencies": { - "hardhat": "^2.0.4" - } - }, - "node_modules/@openzeppelin/contracts": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-4.9.2.tgz", - "integrity": "sha512-mO+y6JaqXjWeMh9glYVzVu8HYPGknAAnWyxTRhGeckOruyXQMNnlcW6w/Dx9ftLeIQk6N+ZJFuVmTwF7lEIFrg==" - }, - "node_modules/@scure/base": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.1.tgz", - "integrity": "sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ] - }, - "node_modules/@scure/bip32": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.1.5.tgz", - "integrity": "sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "dependencies": { - "@noble/hashes": "~1.2.0", - "@noble/secp256k1": "~1.7.0", - "@scure/base": "~1.1.0" - } - }, - "node_modules/@scure/bip39": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.1.1.tgz", - "integrity": "sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "dependencies": { - "@noble/hashes": "~1.2.0", - "@scure/base": "~1.1.0" - } - }, - "node_modules/@sentry/core": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-5.30.0.tgz", - "integrity": "sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==", - "dev": true, - "dependencies": { - "@sentry/hub": "5.30.0", - "@sentry/minimal": "5.30.0", - "@sentry/types": "5.30.0", - "@sentry/utils": "5.30.0", - "tslib": "^1.9.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@sentry/hub": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-5.30.0.tgz", - "integrity": "sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ==", - "dev": true, - "dependencies": { - "@sentry/types": "5.30.0", - "@sentry/utils": "5.30.0", - "tslib": "^1.9.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@sentry/minimal": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-5.30.0.tgz", - "integrity": "sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw==", - "dev": true, - "dependencies": { - "@sentry/hub": "5.30.0", - "@sentry/types": "5.30.0", - "tslib": "^1.9.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@sentry/node": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/node/-/node-5.30.0.tgz", - "integrity": "sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg==", - "dev": true, - "dependencies": { - "@sentry/core": "5.30.0", - "@sentry/hub": "5.30.0", - "@sentry/tracing": "5.30.0", - "@sentry/types": "5.30.0", - "@sentry/utils": "5.30.0", - "cookie": "^0.4.1", - "https-proxy-agent": "^5.0.0", - "lru_map": "^0.3.3", - "tslib": "^1.9.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@sentry/tracing": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/tracing/-/tracing-5.30.0.tgz", - "integrity": "sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw==", - "dev": true, - "dependencies": { - "@sentry/hub": "5.30.0", - "@sentry/minimal": "5.30.0", - "@sentry/types": "5.30.0", - "@sentry/utils": "5.30.0", - "tslib": "^1.9.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@sentry/types": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-5.30.0.tgz", - "integrity": "sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/@sentry/utils": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-5.30.0.tgz", - "integrity": "sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww==", - "dev": true, - "dependencies": { - "@sentry/types": "5.30.0", - "tslib": "^1.9.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@solidity-parser/parser": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.14.5.tgz", - "integrity": "sha512-6dKnHZn7fg/iQATVEzqyUOyEidbn05q7YA2mQ9hC0MMXhhV3/JrsxmFSYZAcr7j1yUP700LLhTruvJ3MiQmjJg==", - "dev": true, - "dependencies": { - "antlr4ts": "^0.5.0-alpha.4" - } - }, - "node_modules/@tsconfig/node10": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "dev": true, - "peer": true - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true, - "peer": true - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true, - "peer": true - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "dev": true, - "peer": true - }, - "node_modules/@typechain/ethers-v5": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/@typechain/ethers-v5/-/ethers-v5-10.2.1.tgz", - "integrity": "sha512-n3tQmCZjRE6IU4h6lqUGiQ1j866n5MTCBJreNEHHVWXa2u9GJTaeYyU1/k+1qLutkyw+sS6VAN+AbeiTqsxd/A==", - "dev": true, - "peer": true, - "dependencies": { - "lodash": "^4.17.15", - "ts-essentials": "^7.0.1" - }, - "peerDependencies": { - "@ethersproject/abi": "^5.0.0", - "@ethersproject/providers": "^5.0.0", - "ethers": "^5.1.3", - "typechain": "^8.1.1", - "typescript": ">=4.3.0" - } - }, - "node_modules/@typechain/hardhat": { - "version": "6.1.6", - "resolved": "https://registry.npmjs.org/@typechain/hardhat/-/hardhat-6.1.6.tgz", - "integrity": "sha512-BiVnegSs+ZHVymyidtK472syodx1sXYlYJJixZfRstHVGYTi8V1O7QG4nsjyb0PC/LORcq7sfBUcHto1y6UgJA==", - "dev": true, - "peer": true, - "dependencies": { - "fs-extra": "^9.1.0" - }, - "peerDependencies": { - "@ethersproject/abi": "^5.4.7", - "@ethersproject/providers": "^5.4.7", - "@typechain/ethers-v5": "^10.2.1", - "ethers": "^5.4.7", - "hardhat": "^2.9.9", - "typechain": "^8.1.1" - } - }, - "node_modules/@typechain/hardhat/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "peer": true, - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typechain/hardhat/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "peer": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/@typechain/hardhat/node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@types/bn.js": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.1.tgz", - "integrity": "sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/chai": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.5.tgz", - "integrity": "sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng==", - "dev": true, - "peer": true - }, - "node_modules/@types/chai-as-promised": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/@types/chai-as-promised/-/chai-as-promised-7.1.5.tgz", - "integrity": "sha512-jStwss93SITGBwt/niYrkf2C+/1KTeZCZl1LaeezTlqppAKeoQC7jxyqYuP72sxBGKCIbw7oHgbYssIRzT5FCQ==", - "dev": true, - "peer": true, - "dependencies": { - "@types/chai": "*" - } - }, - "node_modules/@types/concat-stream": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", - "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/form-data": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", - "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", - "dev": true, - "dependencies": { - "@types/minimatch": "*", - "@types/node": "*" - } - }, - "node_modules/@types/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@types/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==", - "dev": true - }, - "node_modules/@types/minimatch": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", - "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", - "dev": true - }, - "node_modules/@types/mocha": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.1.tgz", - "integrity": "sha512-/fvYntiO1GeICvqbQ3doGDIP97vWmvFt83GKguJ6prmQM2iXZfFcq6YE8KteFyRtX2/h5Hf91BYvPodJKFYv5Q==", - "dev": true, - "peer": true - }, - "node_modules/@types/node": { - "version": "20.3.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.3.1.tgz", - "integrity": "sha512-EhcH/wvidPy1WeML3TtYFGR83UzjxeWRen9V402T8aUGYsCHOmfoisV3ZSg03gAFIbLq8TnWOJ0f4cALtnSEUg==", - "dev": true - }, - "node_modules/@types/pbkdf2": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.0.tgz", - "integrity": "sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/prettier": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", - "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==", - "dev": true, - "peer": true - }, - "node_modules/@types/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", - "dev": true - }, - "node_modules/@types/readable-stream": { - "version": "2.3.15", - "resolved": "https://registry.npmjs.org/@types/readable-stream/-/readable-stream-2.3.15.tgz", - "integrity": "sha512-oM5JSKQCcICF1wvGgmecmHldZ48OZamtMxcGGVICOJA8o8cahXC1zEVAif8iwoc5j8etxFaRFnf095+CDsuoFQ==", - "dev": true, - "dependencies": { - "@types/node": "*", - "safe-buffer": "~5.1.1" - } - }, - "node_modules/@types/secp256k1": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.3.tgz", - "integrity": "sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/abbrev": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", - "integrity": "sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q==", - "dev": true - }, - "node_modules/abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "dev": true, - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" - } - }, - "node_modules/abstract-level": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/abstract-level/-/abstract-level-1.0.3.tgz", - "integrity": "sha512-t6jv+xHy+VYwc4xqZMn2Pa9DjcdzvzZmQGRjTFc8spIbRGHgBrEKbPq+rYXc7CCo0lxgYvSgKVg9qZAhpVQSjA==", - "dev": true, - "dependencies": { - "buffer": "^6.0.3", - "catering": "^2.1.0", - "is-buffer": "^2.0.5", - "level-supports": "^4.0.0", - "level-transcoder": "^1.0.1", - "module-error": "^1.0.1", - "queue-microtask": "^1.2.3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/acorn": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.9.0.tgz", - "integrity": "sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ==", - "dev": true, - "peer": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/adm-zip": { - "version": "0.4.16", - "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz", - "integrity": "sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==", - "dev": true, - "engines": { - "node": ">=0.3.0" - } - }, - "node_modules/aes-js": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", - "integrity": "sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==" - }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/amdefine": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.4.2" - } - }, - "node_modules/ansi-colors": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/antlr4ts": { - "version": "0.5.0-alpha.4", - "resolved": "https://registry.npmjs.org/antlr4ts/-/antlr4ts-0.5.0-alpha.4.tgz", - "integrity": "sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ==", - "dev": true - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true, - "peer": true - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/array-back": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", - "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", - "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "is-array-buffer": "^3.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array.prototype.reduce": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.5.tgz", - "integrity": "sha512-kDdugMl7id9COE8R7MHF5jWk7Dqt/fs4Pv+JXoICnYwqpjjjbUurz6w5fT5IG6brLdJhv6/VoHB0H7oyIBXd+Q==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-array-method-boxes-properly": "^1.0.0", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", - "dev": true - }, - "node_modules/asn1": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", - "dev": true, - "dependencies": { - "safer-buffer": "~2.1.0" - } - }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", - "dev": true, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "dev": true, - "peer": true, - "engines": { - "node": "*" - } - }, - "node_modules/astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==", - "dev": true - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true - }, - "node_modules/at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "dev": true, - "peer": true, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/aws4": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", - "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==", - "dev": true - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/base-x": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", - "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", - "dev": true, - "dependencies": { - "safe-buffer": "^5.0.1" - } - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", - "dev": true, - "dependencies": { - "tweetnacl": "^0.14.3" - } - }, - "node_modules/bcrypt-pbkdf/node_modules/tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", - "dev": true - }, - "node_modules/bech32": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", - "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==" - }, - "node_modules/bigint-crypto-utils": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/bigint-crypto-utils/-/bigint-crypto-utils-3.2.2.tgz", - "integrity": "sha512-U1RbE3aX9ayCUVcIPHuPDPKcK3SFOXf93J1UK/iHlJuQB7bhagPIX06/CLpLEsDThJ7KA4Dhrnzynl+d2weTiw==", - "dev": true, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/blakejs": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz", - "integrity": "sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==", - "dev": true - }, - "node_modules/bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==" - }, - "node_modules/browser-level": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browser-level/-/browser-level-1.0.1.tgz", - "integrity": "sha512-XECYKJ+Dbzw0lbydyQuJzwNXtOpbMSq737qxJN11sIRTErOMShvDpbzTlgju7orJKvx4epULolZAuJGLzCmWRQ==", - "dev": true, - "dependencies": { - "abstract-level": "^1.0.2", - "catering": "^2.1.1", - "module-error": "^1.0.2", - "run-parallel-limit": "^1.1.0" - } - }, - "node_modules/browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true - }, - "node_modules/browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "dev": true, - "dependencies": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/bs58": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", - "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", - "dev": true, - "dependencies": { - "base-x": "^3.0.2" - } - }, - "node_modules/bs58check": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", - "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", - "dev": true, - "dependencies": { - "bs58": "^4.0.0", - "create-hash": "^1.1.0", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "node_modules/buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==", - "dev": true - }, - "node_modules/busboy": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", - "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", - "dev": true, - "dependencies": { - "streamsearch": "^1.1.0" - }, - "engines": { - "node": ">=10.16.0" - } - }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/case": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/case/-/case-1.6.3.tgz", - "integrity": "sha512-mzDSXIPaFwVDvZAHqZ9VlbyF4yyXRuX6IvB06WvPYkqJVO24kX1PPhv9bfpKNFZyxYFmmgo03HUiD8iklmJYRQ==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", - "dev": true - }, - "node_modules/catering": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/catering/-/catering-2.1.1.tgz", - "integrity": "sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/cbor": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/cbor/-/cbor-8.1.0.tgz", - "integrity": "sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg==", - "dev": true, - "peer": true, - "dependencies": { - "nofilter": "^3.1.0" - }, - "engines": { - "node": ">=12.19" - } - }, - "node_modules/chai": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", - "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", - "dev": true, - "peer": true, - "dependencies": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.2", - "deep-eql": "^4.1.2", - "get-func-name": "^2.0.0", - "loupe": "^2.3.1", - "pathval": "^1.1.1", - "type-detect": "^4.0.5" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chai-as-promised": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz", - "integrity": "sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==", - "dev": true, - "peer": true, - "dependencies": { - "check-error": "^1.0.2" - }, - "peerDependencies": { - "chai": ">= 2.1.2 < 5" - } - }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/charenc": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", - "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", - "dev": true, - "peer": true, - "engines": { - "node": "*" - } - }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true - }, - "node_modules/cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "dev": true, - "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/classic-level": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/classic-level/-/classic-level-1.3.0.tgz", - "integrity": "sha512-iwFAJQYtqRTRM0F6L8h4JCt00ZSGdOyqh7yVrhhjrOpFhmBjNlRUey64MCiyo6UmQHMJ+No3c81nujPv+n9yrg==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "abstract-level": "^1.0.2", - "catering": "^2.1.0", - "module-error": "^1.0.1", - "napi-macros": "^2.2.2", - "node-gyp-build": "^4.3.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/cli-table3": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.5.1.tgz", - "integrity": "sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw==", - "dev": true, - "dependencies": { - "object-assign": "^4.1.0", - "string-width": "^2.1.1" - }, - "engines": { - "node": ">=6" - }, - "optionalDependencies": { - "colors": "^1.1.2" - } - }, - "node_modules/cli-table3/node_modules/ansi-regex": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", - "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/cli-table3/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/cli-table3/node_modules/string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "dependencies": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cli-table3/node_modules/strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", - "dev": true, - "dependencies": { - "ansi-regex": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", - "dev": true, - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/command-exists": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz", - "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==", - "dev": true - }, - "node_modules/command-line-args": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz", - "integrity": "sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==", - "dev": true, - "peer": true, - "dependencies": { - "array-back": "^3.1.0", - "find-replace": "^3.0.0", - "lodash.camelcase": "^4.3.0", - "typical": "^4.0.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/command-line-usage": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-6.1.3.tgz", - "integrity": "sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw==", - "dev": true, - "peer": true, - "dependencies": { - "array-back": "^4.0.2", - "chalk": "^2.4.2", - "table-layout": "^1.0.2", - "typical": "^5.2.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/command-line-usage/node_modules/array-back": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", - "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/command-line-usage/node_modules/typical": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", - "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/commander": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz", - "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==", - "dev": true - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "node_modules/concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "engines": [ - "node >= 0.8" - ], - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "node_modules/concat-stream/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/concat-stream/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/cookie": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", - "dev": true - }, - "node_modules/crc-32": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", - "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", - "dev": true, - "bin": { - "crc32": "bin/crc32.njs" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "dev": true, - "dependencies": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "node_modules/create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "dev": true, - "dependencies": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true, - "peer": true - }, - "node_modules/crypt": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", - "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", - "dev": true, - "dependencies": { - "assert-plus": "^1.0.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/death": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/death/-/death-1.1.0.tgz", - "integrity": "sha512-vsV6S4KVHvTGxbEcij7hkWRv0It+sGGWVOM67dQde/o5Xjnr+KmLjxWJii2uEObIrt1CcM9w0Yaovx+iOlIL+w==", - "dev": true - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decamelize": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/deep-eql": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", - "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", - "dev": true, - "peer": true, - "dependencies": { - "type-detect": "^4.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "node_modules/define-properties": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", - "dev": true, - "dependencies": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/diff": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", - "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/difflib": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/difflib/-/difflib-0.2.4.tgz", - "integrity": "sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w==", - "dev": true, - "dependencies": { - "heap": ">= 0.2.0" - }, - "engines": { - "node": "*" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dotenv": { - "version": "16.3.1", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", - "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/motdotla/dotenv?sponsor=1" - } - }, - "node_modules/ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", - "dev": true, - "dependencies": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "node_modules/elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", - "dependencies": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/elliptic/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "dev": true, - "dependencies": { - "ansi-colors": "^4.1.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/es-abstract": { - "version": "1.21.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.2.tgz", - "integrity": "sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "es-set-tostringtag": "^2.0.1", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.2.0", - "get-symbol-description": "^1.0.0", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", - "has": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.5", - "is-array-buffer": "^3.0.2", - "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.10", - "is-weakref": "^1.0.2", - "object-inspect": "^1.12.3", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", - "safe-regex-test": "^1.0.0", - "string.prototype.trim": "^1.2.7", - "string.prototype.trimend": "^1.0.6", - "string.prototype.trimstart": "^1.0.6", - "typed-array-length": "^1.0.4", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.9" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-abstract/node_modules/object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-array-method-boxes-properly": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", - "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", - "dev": true - }, - "node_modules/es-set-tostringtag": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", - "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.3", - "has": "^1.0.3", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/escodegen": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", - "integrity": "sha512-yhi5S+mNTOuRvyW4gWlg5W1byMaQGWWSYHXsuFZ7GBo7tpyOwi2EdzMP/QWxh9hwkD2m+wDVHJsxhRIj+v/b/A==", - "dev": true, - "dependencies": { - "esprima": "^2.7.1", - "estraverse": "^1.9.1", - "esutils": "^2.0.2", - "optionator": "^0.8.1" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=0.12.0" - }, - "optionalDependencies": { - "source-map": "~0.2.0" - } - }, - "node_modules/escodegen/node_modules/source-map": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", - "integrity": "sha512-CBdZ2oa/BHhS4xj5DlhjWNHcan57/5YuvfdLf17iVmIpd9KRm+DFLmC6nBNj+6Ua7Kt3TmOjDpQT1aTYOQtoUA==", - "dev": true, - "optional": true, - "dependencies": { - "amdefine": ">=0.0.4" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/esprima": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/estraverse": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", - "integrity": "sha512-25w1fMXQrGdoquWnScXZGckOv+Wes+JDnuN/+7ex3SauFRS72r2lFDec0EKPt2YD1wUJ/IrfEex+9yp4hfSOJA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eth-gas-reporter": { - "version": "0.2.25", - "resolved": "https://registry.npmjs.org/eth-gas-reporter/-/eth-gas-reporter-0.2.25.tgz", - "integrity": "sha512-1fRgyE4xUB8SoqLgN3eDfpDfwEfRxh2Sz1b7wzFbyQA+9TekMmvSjjoRu9SKcSVyK+vLkLIsVbJDsTWjw195OQ==", - "dev": true, - "dependencies": { - "@ethersproject/abi": "^5.0.0-beta.146", - "@solidity-parser/parser": "^0.14.0", - "cli-table3": "^0.5.0", - "colors": "1.4.0", - "ethereum-cryptography": "^1.0.3", - "ethers": "^4.0.40", - "fs-readdir-recursive": "^1.1.0", - "lodash": "^4.17.14", - "markdown-table": "^1.1.3", - "mocha": "^7.1.1", - "req-cwd": "^2.0.0", - "request": "^2.88.0", - "request-promise-native": "^1.0.5", - "sha1": "^1.1.1", - "sync-request": "^6.0.0" - }, - "peerDependencies": { - "@codechecks/client": "^0.1.0" - }, - "peerDependenciesMeta": { - "@codechecks/client": { - "optional": true - } - } - }, - "node_modules/eth-gas-reporter/node_modules/ansi-colors": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", - "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/eth-gas-reporter/node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/eth-gas-reporter/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/eth-gas-reporter/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, - "node_modules/eth-gas-reporter/node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/eth-gas-reporter/node_modules/chokidar": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz", - "integrity": "sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==", - "dev": true, - "dependencies": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.2.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.1.1" - } - }, - "node_modules/eth-gas-reporter/node_modules/cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "dependencies": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "node_modules/eth-gas-reporter/node_modules/debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eth-gas-reporter/node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eth-gas-reporter/node_modules/diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/eth-gas-reporter/node_modules/emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "node_modules/eth-gas-reporter/node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/eth-gas-reporter/node_modules/ethers": { - "version": "4.0.49", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-4.0.49.tgz", - "integrity": "sha512-kPltTvWiyu+OktYy1IStSO16i2e7cS9D9OxZ81q2UUaiNPVrm/RTcbxamCXF9VUSKzJIdJV68EAIhTEVBalRWg==", - "dev": true, - "dependencies": { - "aes-js": "3.0.0", - "bn.js": "^4.11.9", - "elliptic": "6.5.4", - "hash.js": "1.1.3", - "js-sha3": "0.5.7", - "scrypt-js": "2.0.4", - "setimmediate": "1.0.4", - "uuid": "2.0.1", - "xmlhttprequest": "1.8.0" - } - }, - "node_modules/eth-gas-reporter/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/eth-gas-reporter/node_modules/flat": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.1.tgz", - "integrity": "sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA==", - "dev": true, - "dependencies": { - "is-buffer": "~2.0.3" - }, - "bin": { - "flat": "cli.js" - } - }, - "node_modules/eth-gas-reporter/node_modules/fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", - "deprecated": "\"Please update to latest v2.3 or v2.2\"", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/eth-gas-reporter/node_modules/glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - } - }, - "node_modules/eth-gas-reporter/node_modules/hash.js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", - "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.0" - } - }, - "node_modules/eth-gas-reporter/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/eth-gas-reporter/node_modules/js-sha3": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", - "integrity": "sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==", - "dev": true - }, - "node_modules/eth-gas-reporter/node_modules/js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/eth-gas-reporter/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/eth-gas-reporter/node_modules/log-symbols": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", - "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", - "dev": true, - "dependencies": { - "chalk": "^2.4.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/eth-gas-reporter/node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/eth-gas-reporter/node_modules/mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/eth-gas-reporter/node_modules/mocha": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-7.2.0.tgz", - "integrity": "sha512-O9CIypScywTVpNaRrCAgoUnJgozpIofjKUYmJhiCIJMiuYnLI6otcb1/kpW9/n/tJODHGZ7i8aLQoDVsMtOKQQ==", - "dev": true, - "dependencies": { - "ansi-colors": "3.2.3", - "browser-stdout": "1.3.1", - "chokidar": "3.3.0", - "debug": "3.2.6", - "diff": "3.5.0", - "escape-string-regexp": "1.0.5", - "find-up": "3.0.0", - "glob": "7.1.3", - "growl": "1.10.5", - "he": "1.2.0", - "js-yaml": "3.13.1", - "log-symbols": "3.0.0", - "minimatch": "3.0.4", - "mkdirp": "0.5.5", - "ms": "2.1.1", - "node-environment-flags": "1.0.6", - "object.assign": "4.1.0", - "strip-json-comments": "2.0.1", - "supports-color": "6.0.0", - "which": "1.3.1", - "wide-align": "1.1.3", - "yargs": "13.3.2", - "yargs-parser": "13.1.2", - "yargs-unparser": "1.6.0" - }, - "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mochajs" - } - }, - "node_modules/eth-gas-reporter/node_modules/ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - }, - "node_modules/eth-gas-reporter/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eth-gas-reporter/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/eth-gas-reporter/node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/eth-gas-reporter/node_modules/readdirp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz", - "integrity": "sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==", - "dev": true, - "dependencies": { - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/eth-gas-reporter/node_modules/scrypt-js": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.4.tgz", - "integrity": "sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw==", - "dev": true - }, - "node_modules/eth-gas-reporter/node_modules/setimmediate": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.4.tgz", - "integrity": "sha512-/TjEmXQVEzdod/FFskf3o7oOAsGhHf2j1dZqRFbDzq4F3mvvxflIIi4Hd3bLQE9y/CpwqfSQam5JakI/mi3Pog==", - "dev": true - }, - "node_modules/eth-gas-reporter/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/eth-gas-reporter/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/eth-gas-reporter/node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eth-gas-reporter/node_modules/supports-color": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", - "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/eth-gas-reporter/node_modules/uuid": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz", - "integrity": "sha512-nWg9+Oa3qD2CQzHIP4qKUqwNfzKn8P0LtFhotaCTFchsV7ZfDhAybeip/HZVeMIpZi9JgY1E3nUlwaCmZT1sEg==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "dev": true - }, - "node_modules/eth-gas-reporter/node_modules/wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/eth-gas-reporter/node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, - "node_modules/eth-gas-reporter/node_modules/yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", - "dev": true, - "dependencies": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" - } - }, - "node_modules/eth-gas-reporter/node_modules/yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dev": true, - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - }, - "node_modules/eth-gas-reporter/node_modules/yargs-unparser": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz", - "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==", - "dev": true, - "dependencies": { - "flat": "^4.1.0", - "lodash": "^4.17.15", - "yargs": "^13.3.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/ethereum-bloom-filters": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.10.tgz", - "integrity": "sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA==", - "dev": true, - "dependencies": { - "js-sha3": "^0.8.0" - } - }, - "node_modules/ethereum-cryptography": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz", - "integrity": "sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==", - "dev": true, - "dependencies": { - "@noble/hashes": "1.2.0", - "@noble/secp256k1": "1.7.1", - "@scure/bip32": "1.1.5", - "@scure/bip39": "1.1.1" - } - }, - "node_modules/ethereumjs-abi": { - "version": "0.6.8", - "resolved": "https://registry.npmjs.org/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz", - "integrity": "sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA==", - "dev": true, - "dependencies": { - "bn.js": "^4.11.8", - "ethereumjs-util": "^6.0.0" - } - }, - "node_modules/ethereumjs-abi/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, - "node_modules/ethereumjs-util": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz", - "integrity": "sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==", - "dev": true, - "dependencies": { - "@types/bn.js": "^4.11.3", - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "0.1.6", - "rlp": "^2.2.3" - } - }, - "node_modules/ethereumjs-util/node_modules/@types/bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/ethereumjs-util/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, - "node_modules/ethereumjs-util/node_modules/ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "dev": true, - "dependencies": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" - } - }, - "node_modules/ethers": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", - "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/abi": "5.7.0", - "@ethersproject/abstract-provider": "5.7.0", - "@ethersproject/abstract-signer": "5.7.0", - "@ethersproject/address": "5.7.0", - "@ethersproject/base64": "5.7.0", - "@ethersproject/basex": "5.7.0", - "@ethersproject/bignumber": "5.7.0", - "@ethersproject/bytes": "5.7.0", - "@ethersproject/constants": "5.7.0", - "@ethersproject/contracts": "5.7.0", - "@ethersproject/hash": "5.7.0", - "@ethersproject/hdnode": "5.7.0", - "@ethersproject/json-wallets": "5.7.0", - "@ethersproject/keccak256": "5.7.0", - "@ethersproject/logger": "5.7.0", - "@ethersproject/networks": "5.7.1", - "@ethersproject/pbkdf2": "5.7.0", - "@ethersproject/properties": "5.7.0", - "@ethersproject/providers": "5.7.2", - "@ethersproject/random": "5.7.0", - "@ethersproject/rlp": "5.7.0", - "@ethersproject/sha2": "5.7.0", - "@ethersproject/signing-key": "5.7.0", - "@ethersproject/solidity": "5.7.0", - "@ethersproject/strings": "5.7.0", - "@ethersproject/transactions": "5.7.0", - "@ethersproject/units": "5.7.0", - "@ethersproject/wallet": "5.7.0", - "@ethersproject/web": "5.7.1", - "@ethersproject/wordlists": "5.7.0" - } - }, - "node_modules/ethjs-unit": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz", - "integrity": "sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw==", - "dev": true, - "dependencies": { - "bn.js": "4.11.6", - "number-to-bn": "1.7.0" - }, - "engines": { - "node": ">=6.5.0", - "npm": ">=3" - } - }, - "node_modules/ethjs-unit/node_modules/bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==", - "dev": true - }, - "node_modules/ethjs-util": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz", - "integrity": "sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==", - "dev": true, - "dependencies": { - "is-hex-prefixed": "1.0.0", - "strip-hex-prefix": "1.0.0" - }, - "engines": { - "node": ">=6.5.0", - "npm": ">=3" - } - }, - "node_modules/event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "dev": true, - "dependencies": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "node_modules/extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", - "dev": true, - "engines": [ - "node >=0.6.0" - ] - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "node_modules/fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "node_modules/fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-replace": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz", - "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==", - "dev": true, - "peer": true, - "dependencies": { - "array-back": "^3.0.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", - "dev": true, - "dependencies": { - "locate-path": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "dev": true, - "bin": { - "flat": "cli.js" - } - }, - "node_modules/follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.3" - } - }, - "node_modules/forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 0.12" - } - }, - "node_modules/fp-ts": { - "version": "1.19.3", - "resolved": "https://registry.npmjs.org/fp-ts/-/fp-ts-1.19.3.tgz", - "integrity": "sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==", - "dev": true - }, - "node_modules/fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/fs-readdir-recursive": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", - "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", - "dev": true - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "node_modules/function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", - "dev": true - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-func-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", - "dev": true, - "peer": true, - "engines": { - "node": "*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", - "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-port": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", - "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", - "dev": true, - "dependencies": { - "assert-plus": "^1.0.0" - } - }, - "node_modules/ghost-testrpc": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/ghost-testrpc/-/ghost-testrpc-0.0.2.tgz", - "integrity": "sha512-i08dAEgJ2g8z5buJIrCTduwPIhih3DP+hOCTyyryikfV8T0bNvHnGXO67i0DD1H4GBDETTclPy9njZbfluQYrQ==", - "dev": true, - "dependencies": { - "chalk": "^2.4.2", - "node-emoji": "^1.10.0" - }, - "bin": { - "testrpc-sc": "index.js" - } - }, - "node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/global-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", - "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", - "dev": true, - "dependencies": { - "global-prefix": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/global-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", - "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", - "dev": true, - "dependencies": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", - "dev": true, - "dependencies": { - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/globby": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz", - "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==", - "dev": true, - "dependencies": { - "@types/glob": "^7.1.1", - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.0.3", - "glob": "^7.1.3", - "ignore": "^5.1.1", - "merge2": "^1.2.3", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true - }, - "node_modules/growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", - "dev": true, - "engines": { - "node": ">=4.x" - } - }, - "node_modules/handlebars": { - "version": "4.7.7", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", - "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", - "dev": true, - "dependencies": { - "minimist": "^1.2.5", - "neo-async": "^2.6.0", - "source-map": "^0.6.1", - "wordwrap": "^1.0.0" - }, - "bin": { - "handlebars": "bin/handlebars" - }, - "engines": { - "node": ">=0.4.7" - }, - "optionalDependencies": { - "uglify-js": "^3.1.4" - } - }, - "node_modules/har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "deprecated": "this library is no longer supported", - "dev": true, - "dependencies": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/hardhat": { - "version": "2.16.0", - "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.16.0.tgz", - "integrity": "sha512-7VQEJPQRAZdtrYUZaU9GgCpP3MBNy/pTdscARNJQMWKj5C+R7V32G5uIZKIqZ4QiqXa6CBfxxe+G+ahxUbHZHA==", - "dev": true, - "dependencies": { - "@ethersproject/abi": "^5.1.2", - "@metamask/eth-sig-util": "^4.0.0", - "@nomicfoundation/ethereumjs-block": "5.0.1", - "@nomicfoundation/ethereumjs-blockchain": "7.0.1", - "@nomicfoundation/ethereumjs-common": "4.0.1", - "@nomicfoundation/ethereumjs-evm": "2.0.1", - "@nomicfoundation/ethereumjs-rlp": "5.0.1", - "@nomicfoundation/ethereumjs-statemanager": "2.0.1", - "@nomicfoundation/ethereumjs-trie": "6.0.1", - "@nomicfoundation/ethereumjs-tx": "5.0.1", - "@nomicfoundation/ethereumjs-util": "9.0.1", - "@nomicfoundation/ethereumjs-vm": "7.0.1", - "@nomicfoundation/solidity-analyzer": "^0.1.0", - "@sentry/node": "^5.18.1", - "@types/bn.js": "^5.1.0", - "@types/lru-cache": "^5.1.0", - "abort-controller": "^3.0.0", - "adm-zip": "^0.4.16", - "aggregate-error": "^3.0.0", - "ansi-escapes": "^4.3.0", - "chalk": "^2.4.2", - "chokidar": "^3.4.0", - "ci-info": "^2.0.0", - "debug": "^4.1.1", - "enquirer": "^2.3.0", - "env-paths": "^2.2.0", - "ethereum-cryptography": "^1.0.3", - "ethereumjs-abi": "^0.6.8", - "find-up": "^2.1.0", - "fp-ts": "1.19.3", - "fs-extra": "^7.0.1", - "glob": "7.2.0", - "immutable": "^4.0.0-rc.12", - "io-ts": "1.10.4", - "keccak": "^3.0.2", - "lodash": "^4.17.11", - "mnemonist": "^0.38.0", - "mocha": "^10.0.0", - "p-map": "^4.0.0", - "raw-body": "^2.4.1", - "resolve": "1.17.0", - "semver": "^6.3.0", - "solc": "0.7.3", - "source-map-support": "^0.5.13", - "stacktrace-parser": "^0.1.10", - "tsort": "0.0.1", - "undici": "^5.14.0", - "uuid": "^8.3.2", - "ws": "^7.4.6" - }, - "bin": { - "hardhat": "internal/cli/bootstrap.js" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "ts-node": "*", - "typescript": "*" - }, - "peerDependenciesMeta": { - "ts-node": { - "optional": true - }, - "typescript": { - "optional": true - } - } - }, - "node_modules/hardhat-gas-reporter": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/hardhat-gas-reporter/-/hardhat-gas-reporter-1.0.9.tgz", - "integrity": "sha512-INN26G3EW43adGKBNzYWOlI3+rlLnasXTwW79YNnUhXPDa+yHESgt639dJEs37gCjhkbNKcRRJnomXEuMFBXJg==", - "dev": true, - "dependencies": { - "array-uniq": "1.0.3", - "eth-gas-reporter": "^0.2.25", - "sha1": "^1.1.1" - }, - "peerDependencies": { - "hardhat": "^2.0.2" - } - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hash-base": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", - "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/hash-base/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true, - "bin": { - "he": "bin/he" - } - }, - "node_modules/heap": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/heap/-/heap-0.2.7.tgz", - "integrity": "sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==", - "dev": true - }, - "node_modules/hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", - "dependencies": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/http-basic": { - "version": "8.1.3", - "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", - "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", - "dev": true, - "dependencies": { - "caseless": "^0.12.0", - "concat-stream": "^1.6.2", - "http-response-object": "^3.0.1", - "parse-cache-control": "^1.0.1" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dev": true, - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/http-response-object": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", - "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", - "dev": true, - "dependencies": { - "@types/node": "^10.0.3" - } - }, - "node_modules/http-response-object/node_modules/@types/node": { - "version": "10.17.60", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", - "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==", - "dev": true - }, - "node_modules/http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", - "dev": true, - "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - }, - "engines": { - "node": ">=0.8", - "npm": ">=1.3.7" - } - }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dev": true, - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/immutable": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.0.tgz", - "integrity": "sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg==", - "dev": true - }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, - "node_modules/internal-slot": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", - "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/io-ts": { - "version": "1.10.4", - "resolved": "https://registry.npmjs.org/io-ts/-/io-ts-1.10.4.tgz", - "integrity": "sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g==", - "dev": true, - "dependencies": { - "fp-ts": "^1.0.0" - } - }, - "node_modules/is-array-buffer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "dependencies": { - "has-bigints": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-buffer": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "engines": { - "node": ">=4" - } - }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-hex-prefixed": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz", - "integrity": "sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==", - "dev": true, - "engines": { - "node": ">=6.5.0", - "npm": ">=3" - } - }, - "node_modules/is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", - "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "dev": true - }, - "node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", - "dev": true - }, - "node_modules/js-sdsl": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.4.1.tgz", - "integrity": "sha512-6Gsx8R0RucyePbWqPssR8DyfuXmLBooYN5cZFZKjHGnQuaf7pEzhtpceagJxVu4LqhYY5EYA7nko3FmeHZ1KbA==", - "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/js-sdsl" - } - }, - "node_modules/js-sha3": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", - "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==" - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", - "dev": true - }, - "node_modules/json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "dev": true - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "dev": true - }, - "node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "dev": true, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/jsonschema": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.4.1.tgz", - "integrity": "sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/jsprim": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", - "dev": true, - "dependencies": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/keccak": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.3.tgz", - "integrity": "sha512-JZrLIAJWuZxKbCilMpNz5Vj7Vtb4scDG3dMXLOsbzBmQGyjwE61BbW7bJkfKKCShXiQZt3T6sBgALRtmd+nZaQ==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/klaw": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", - "integrity": "sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw==", - "dev": true, - "optionalDependencies": { - "graceful-fs": "^4.1.9" - } - }, - "node_modules/level": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/level/-/level-8.0.0.tgz", - "integrity": "sha512-ypf0jjAk2BWI33yzEaaotpq7fkOPALKAgDBxggO6Q9HGX2MRXn0wbP1Jn/tJv1gtL867+YOjOB49WaUF3UoJNQ==", - "dev": true, - "dependencies": { - "browser-level": "^1.0.1", - "classic-level": "^1.2.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/level" - } - }, - "node_modules/level-supports": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-4.0.1.tgz", - "integrity": "sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/level-transcoder": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/level-transcoder/-/level-transcoder-1.0.1.tgz", - "integrity": "sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w==", - "dev": true, - "dependencies": { - "buffer": "^6.0.3", - "module-error": "^1.0.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", - "dev": true, - "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", - "dev": true, - "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "node_modules/lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", - "dev": true, - "peer": true - }, - "node_modules/lodash.truncate": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", - "dev": true, - "peer": true - }, - "node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-symbols/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/log-symbols/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/log-symbols/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/log-symbols/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/log-symbols/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/log-symbols/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/loupe": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", - "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", - "dev": true, - "peer": true, - "dependencies": { - "get-func-name": "^2.0.0" - } - }, - "node_modules/lru_map": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz", - "integrity": "sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==", - "dev": true - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true, - "peer": true - }, - "node_modules/markdown-table": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-1.1.3.tgz", - "integrity": "sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q==", - "dev": true - }, - "node_modules/mcl-wasm": { - "version": "0.7.9", - "resolved": "https://registry.npmjs.org/mcl-wasm/-/mcl-wasm-0.7.9.tgz", - "integrity": "sha512-iJIUcQWA88IJB/5L15GnJVnSQJmf/YaxxV6zRavv83HILHaJQb6y0iFyDMdDO0gN8X37tdxmAOrH/P8B6RB8sQ==", - "dev": true, - "engines": { - "node": ">=8.9.0" - } - }, - "node_modules/md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "dev": true, - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/memory-level": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/memory-level/-/memory-level-1.0.0.tgz", - "integrity": "sha512-UXzwewuWeHBz5krr7EvehKcmLFNoXxGcvuYhC41tRnkrTbJohtS7kVn9akmgirtRygg+f7Yjsfi8Uu5SGSQ4Og==", - "dev": true, - "dependencies": { - "abstract-level": "^1.0.0", - "functional-red-black-tree": "^1.0.1", - "module-error": "^1.0.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/memorystream": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", - "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", - "dev": true, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" - }, - "node_modules/minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==" - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/mnemonist": { - "version": "0.38.5", - "resolved": "https://registry.npmjs.org/mnemonist/-/mnemonist-0.38.5.tgz", - "integrity": "sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg==", - "dev": true, - "dependencies": { - "obliterator": "^2.0.0" - } - }, - "node_modules/mocha": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", - "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", - "dev": true, - "dependencies": { - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.5.3", - "debug": "4.3.4", - "diff": "5.0.0", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "7.2.0", - "he": "1.2.0", - "js-yaml": "4.1.0", - "log-symbols": "4.1.0", - "minimatch": "5.0.1", - "ms": "2.1.3", - "nanoid": "3.3.3", - "serialize-javascript": "6.0.0", - "strip-json-comments": "3.1.1", - "supports-color": "8.1.1", - "workerpool": "6.2.1", - "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" - }, - "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha.js" - }, - "engines": { - "node": ">= 14.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mochajs" - } - }, - "node_modules/mocha/node_modules/ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/mocha/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/mocha/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mocha/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mocha/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/mocha/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mocha/node_modules/minimatch": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", - "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/mocha/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "node_modules/mocha/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mocha/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mocha/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/mocha/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/module-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/module-error/-/module-error-1.0.2.tgz", - "integrity": "sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/nanoid": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", - "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", - "dev": true, - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/napi-macros": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.2.2.tgz", - "integrity": "sha512-hmEVtAGYzVQpCKdbQea4skABsdXW4RUh5t5mJ2zzqowJS2OyXZTU1KhDVFhx+NlWZ4ap9mqR9TcDO3LTTttd+g==", - "dev": true - }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true - }, - "node_modules/node-addon-api": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", - "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==", - "dev": true - }, - "node_modules/node-emoji": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", - "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", - "dev": true, - "dependencies": { - "lodash": "^4.17.21" - } - }, - "node_modules/node-environment-flags": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.6.tgz", - "integrity": "sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw==", - "dev": true, - "dependencies": { - "object.getownpropertydescriptors": "^2.0.3", - "semver": "^5.7.0" - } - }, - "node_modules/node-environment-flags/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/node-gyp-build": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.0.tgz", - "integrity": "sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==", - "dev": true, - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" - } - }, - "node_modules/nofilter": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-3.1.0.tgz", - "integrity": "sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==", - "dev": true, - "peer": true, - "engines": { - "node": ">=12.19" - } - }, - "node_modules/nopt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==", - "dev": true, - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/number-to-bn": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/number-to-bn/-/number-to-bn-1.7.0.tgz", - "integrity": "sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig==", - "dev": true, - "dependencies": { - "bn.js": "4.11.6", - "strip-hex-prefix": "1.0.0" - }, - "engines": { - "node": ">=6.5.0", - "npm": ">=3" - } - }, - "node_modules/number-to-bn/node_modules/bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==", - "dev": true - }, - "node_modules/oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", - "dev": true, - "dependencies": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.getownpropertydescriptors": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.6.tgz", - "integrity": "sha512-lq+61g26E/BgHv0ZTFgRvi7NMEPuAxLkFU7rukXjc/AlwH4Am5xXVnIXy3un1bg/JPbXHrixRkK1itUzzPiIjQ==", - "dev": true, - "dependencies": { - "array.prototype.reduce": "^1.0.5", - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.21.2", - "safe-array-concat": "^1.0.0" - }, - "engines": { - "node": ">= 0.8" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/obliterator": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/obliterator/-/obliterator-2.0.4.tgz", - "integrity": "sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==", - "dev": true - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "dependencies": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/ordinal": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/ordinal/-/ordinal-1.0.3.tgz", - "integrity": "sha512-cMddMgb2QElm8G7vdaa02jhUNbTSrhsgAGUz1OokD83uJTwSUn+nKoNoKVVaRa08yF6sgfO7Maou1+bgLd9rdQ==", - "dev": true, - "peer": true - }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "dependencies": { - "p-try": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", - "dev": true, - "dependencies": { - "p-limit": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dev": true, - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/parse-cache-control": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", - "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==", - "dev": true - }, - "node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", - "dev": true, - "peer": true, - "engines": { - "node": "*" - } - }, - "node_modules/pbkdf2": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", - "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", - "dev": true, - "dependencies": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", - "dev": true - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prettier": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", - "dev": true, - "bin": { - "prettier": "bin-prettier.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/prettier-plugin-solidity": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/prettier-plugin-solidity/-/prettier-plugin-solidity-1.1.3.tgz", - "integrity": "sha512-fQ9yucPi2sBbA2U2Xjh6m4isUTJ7S7QLc/XDDsktqqxYfTwdYKJ0EnnywXHwCGAaYbQNK+HIYPL1OemxuMsgeg==", - "dev": true, - "dependencies": { - "@solidity-parser/parser": "^0.16.0", - "semver": "^7.3.8", - "solidity-comments-extractor": "^0.0.7" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "prettier": ">=2.3.0 || >=3.0.0-alpha.0" - } - }, - "node_modules/prettier-plugin-solidity/node_modules/@solidity-parser/parser": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.16.0.tgz", - "integrity": "sha512-ESipEcHyRHg4Np4SqBCfcXwyxxna1DgFVz69bgpLV8vzl/NP1DtcKsJ4dJZXWQhY/Z4J2LeKBiOkOVZn9ct33Q==", - "dev": true, - "dependencies": { - "antlr4ts": "^0.5.0-alpha.4" - } - }, - "node_modules/prettier-plugin-solidity/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/prettier-plugin-solidity/node_modules/semver": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.2.tgz", - "integrity": "sha512-SoftuTROv/cRjCze/scjGyiDtcUyxw1rgYQSZY7XTmtR5hX+dm76iDbTH8TkLPHCQmlbQVSSbNZCPM2hb0knnQ==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/prettier-plugin-solidity/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "node_modules/promise": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", - "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", - "dev": true, - "dependencies": { - "asap": "~2.0.6" - } - }, - "node_modules/psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", - "dev": true - }, - "node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/qs": { - "version": "6.11.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", - "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", - "dev": true, - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", - "dev": true, - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", - "dev": true, - "dependencies": { - "resolve": "^1.1.6" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/recursive-readdir": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", - "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==", - "dev": true, - "dependencies": { - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/reduce-flatten": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz", - "integrity": "sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", - "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "functions-have-names": "^1.2.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/req-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/req-cwd/-/req-cwd-2.0.0.tgz", - "integrity": "sha512-ueoIoLo1OfB6b05COxAA9UpeoscNpYyM+BqYlA7H6LVF4hKGPXQQSSaD2YmvDVJMkk4UDpAHIeU1zG53IqjvlQ==", - "dev": true, - "dependencies": { - "req-from": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/req-from": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/req-from/-/req-from-2.0.0.tgz", - "integrity": "sha512-LzTfEVDVQHBRfjOUMgNBA+V6DWsSnoeKzf42J7l0xa/B4jyPOuuF5MlNSmomLNGemWTnV2TIdjSSLnEn95fOQA==", - "dev": true, - "dependencies": { - "resolve-from": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", - "dev": true, - "dependencies": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/request-promise-core": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", - "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", - "dev": true, - "dependencies": { - "lodash": "^4.17.19" - }, - "engines": { - "node": ">=0.10.0" - }, - "peerDependencies": { - "request": "^2.34" - } - }, - "node_modules/request-promise-native": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", - "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", - "deprecated": "request-promise-native has been deprecated because it extends the now deprecated request package, see https://github.com/request/request/issues/3142", - "dev": true, - "dependencies": { - "request-promise-core": "1.1.4", - "stealthy-require": "^1.1.1", - "tough-cookie": "^2.3.3" - }, - "engines": { - "node": ">=0.12.0" - }, - "peerDependencies": { - "request": "^2.34" - } - }, - "node_modules/request/node_modules/qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", - "dev": true, - "engines": { - "node": ">=0.6" - } - }, - "node_modules/request/node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "dev": true, - "bin": { - "uuid": "bin/uuid" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "node_modules/resolve": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", - "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", - "dev": true, - "dependencies": { - "path-parse": "^1.0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "dev": true, - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "node_modules/rlp": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.7.tgz", - "integrity": "sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==", - "dev": true, - "dependencies": { - "bn.js": "^5.2.0" - }, - "bin": { - "rlp": "bin/rlp" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/run-parallel-limit": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/run-parallel-limit/-/run-parallel-limit-1.1.0.tgz", - "integrity": "sha512-jJA7irRNM91jaKc3Hcl1npHsFLOXOoTkPCUL1JEa1R82O2miplXXRaGdjW/KM/98YQWDhJLiSs793CnXfblJUw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/rustbn.js": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/rustbn.js/-/rustbn.js-0.2.0.tgz", - "integrity": "sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA==", - "dev": true - }, - "node_modules/safe-array-concat": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.0.tgz", - "integrity": "sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "has-symbols": "^1.0.3", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">=0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-array-concat/node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - }, - "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/safe-regex-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "is-regex": "^1.1.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "node_modules/sc-istanbul": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/sc-istanbul/-/sc-istanbul-0.4.6.tgz", - "integrity": "sha512-qJFF/8tW/zJsbyfh/iT/ZM5QNHE3CXxtLJbZsL+CzdJLBsPD7SedJZoUA4d8iAcN2IoMp/Dx80shOOd2x96X/g==", - "dev": true, - "dependencies": { - "abbrev": "1.0.x", - "async": "1.x", - "escodegen": "1.8.x", - "esprima": "2.7.x", - "glob": "^5.0.15", - "handlebars": "^4.0.1", - "js-yaml": "3.x", - "mkdirp": "0.5.x", - "nopt": "3.x", - "once": "1.x", - "resolve": "1.1.x", - "supports-color": "^3.1.0", - "which": "^1.1.1", - "wordwrap": "^1.0.0" - }, - "bin": { - "istanbul": "lib/cli.js" - } - }, - "node_modules/sc-istanbul/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/sc-istanbul/node_modules/glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==", - "dev": true, - "dependencies": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - } - }, - "node_modules/sc-istanbul/node_modules/has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sc-istanbul/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/sc-istanbul/node_modules/js-yaml/node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/sc-istanbul/node_modules/resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==", - "dev": true - }, - "node_modules/sc-istanbul/node_modules/supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==", - "dev": true, - "dependencies": { - "has-flag": "^1.0.0" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/scrypt-js": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", - "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==" - }, - "node_modules/secp256k1": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.3.tgz", - "integrity": "sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "elliptic": "^6.5.4", - "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "dev": true, - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "dev": true - }, - "node_modules/setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", - "dev": true - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true - }, - "node_modules/sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "dev": true, - "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - }, - "bin": { - "sha.js": "bin.js" - } - }, - "node_modules/sha1": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/sha1/-/sha1-1.1.1.tgz", - "integrity": "sha512-dZBS6OrMjtgVkopB1Gmo4RQCDKiZsqcpAQpkV/aaj+FCrCg8r4I4qMkDPQjBgLIxlmu9k4nUbWq6ohXahOneYA==", - "dev": true, - "dependencies": { - "charenc": ">= 0.0.1", - "crypt": ">= 0.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/shelljs": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", - "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", - "dev": true, - "dependencies": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - }, - "bin": { - "shjs": "bin/shjs" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "peer": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/slice-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "peer": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/slice-ansi/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "peer": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/slice-ansi/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "peer": true - }, - "node_modules/solc": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/solc/-/solc-0.7.3.tgz", - "integrity": "sha512-GAsWNAjGzIDg7VxzP6mPjdurby3IkGCjQcM8GFYZT6RyaoUZKmMU6Y7YwG+tFGhv7dwZ8rmR4iwFDrrD99JwqA==", - "dev": true, - "dependencies": { - "command-exists": "^1.2.8", - "commander": "3.0.2", - "follow-redirects": "^1.12.1", - "fs-extra": "^0.30.0", - "js-sha3": "0.8.0", - "memorystream": "^0.3.1", - "require-from-string": "^2.0.0", - "semver": "^5.5.0", - "tmp": "0.0.33" - }, - "bin": { - "solcjs": "solcjs" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/solc/node_modules/fs-extra": { - "version": "0.30.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", - "integrity": "sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^2.1.0", - "klaw": "^1.0.0", - "path-is-absolute": "^1.0.0", - "rimraf": "^2.2.8" - } - }, - "node_modules/solc/node_modules/jsonfile": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==", - "dev": true, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/solc/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/solidity-comments-extractor": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/solidity-comments-extractor/-/solidity-comments-extractor-0.0.7.tgz", - "integrity": "sha512-wciNMLg/Irp8OKGrh3S2tfvZiZ0NEyILfcRCXCD4mp7SgK/i9gzLfhY2hY7VMCQJ3kH9UB9BzNdibIVMchzyYw==", - "dev": true - }, - "node_modules/solidity-coverage": { - "version": "0.8.7", - "resolved": "https://registry.npmjs.org/solidity-coverage/-/solidity-coverage-0.8.7.tgz", - "integrity": "sha512-RzcPuNsIqVGq5F8rjQZPdI2EVdsRU7w2f1Uk1UY567n9eNcg5LSEQ3Q1WFoy9bi/2AD5SYbYK9SS/Nwh2oYbNw==", - "dev": true, - "dependencies": { - "@ethersproject/abi": "^5.0.9", - "@solidity-parser/parser": "^0.18.0", - "chalk": "^2.4.2", - "death": "^1.1.0", - "difflib": "^0.2.4", - "fs-extra": "^8.1.0", - "ghost-testrpc": "^0.0.2", - "global-modules": "^2.0.0", - "globby": "^10.0.1", - "jsonschema": "^1.2.4", - "lodash": "^4.17.15", - "mocha": "^10.2.0", - "node-emoji": "^1.10.0", - "pify": "^4.0.1", - "recursive-readdir": "^2.2.2", - "sc-istanbul": "^0.4.5", - "semver": "^7.3.4", - "shelljs": "^0.8.3", - "web3-utils": "^1.3.6" - }, - "bin": { - "solidity-coverage": "plugins/bin.js" - }, - "peerDependencies": { - "hardhat": "^2.11.0" - } - }, - "node_modules/solidity-coverage/node_modules/@solidity-parser/parser": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.18.0.tgz", - "integrity": "sha512-yfORGUIPgLck41qyN7nbwJRAx17/jAIXCTanHOJZhB6PJ1iAk/84b/xlsVKFSyNyLXIj0dhppoE0+CRws7wlzA==", - "dev": true - }, - "node_modules/solidity-coverage/node_modules/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/solidity-coverage/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/solidity-coverage/node_modules/semver": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.2.tgz", - "integrity": "sha512-SoftuTROv/cRjCze/scjGyiDtcUyxw1rgYQSZY7XTmtR5hX+dm76iDbTH8TkLPHCQmlbQVSSbNZCPM2hb0knnQ==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/solidity-coverage/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true - }, - "node_modules/sshpk": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", - "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", - "dev": true, - "dependencies": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - }, - "bin": { - "sshpk-conv": "bin/sshpk-conv", - "sshpk-sign": "bin/sshpk-sign", - "sshpk-verify": "bin/sshpk-verify" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sshpk/node_modules/tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", - "dev": true - }, - "node_modules/stacktrace-parser": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz", - "integrity": "sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==", - "dev": true, - "dependencies": { - "type-fest": "^0.7.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/stacktrace-parser/node_modules/type-fest": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz", - "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/stealthy-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", - "integrity": "sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/streamsearch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", - "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", - "dev": true, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string_decoder/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/string-format": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/string-format/-/string-format-2.0.0.tgz", - "integrity": "sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA==", - "dev": true, - "peer": true - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string.prototype.trim": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", - "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", - "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", - "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-hex-prefix": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz", - "integrity": "sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==", - "dev": true, - "dependencies": { - "is-hex-prefixed": "1.0.0" - }, - "engines": { - "node": ">=6.5.0", - "npm": ">=3" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/sync-request": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", - "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", - "dev": true, - "dependencies": { - "http-response-object": "^3.0.1", - "sync-rpc": "^1.2.1", - "then-request": "^6.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/sync-rpc": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", - "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", - "dev": true, - "dependencies": { - "get-port": "^3.1.0" - } - }, - "node_modules/table": { - "version": "6.8.1", - "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", - "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", - "dev": true, - "peer": true, - "dependencies": { - "ajv": "^8.0.1", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/table-layout": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-1.0.2.tgz", - "integrity": "sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==", - "dev": true, - "peer": true, - "dependencies": { - "array-back": "^4.0.1", - "deep-extend": "~0.6.0", - "typical": "^5.2.0", - "wordwrapjs": "^4.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/table-layout/node_modules/array-back": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", - "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/table-layout/node_modules/typical": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", - "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/table/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dev": true, - "peer": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/table/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true, - "peer": true - }, - "node_modules/then-request": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", - "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", - "dev": true, - "dependencies": { - "@types/concat-stream": "^1.6.0", - "@types/form-data": "0.0.33", - "@types/node": "^8.0.0", - "@types/qs": "^6.2.31", - "caseless": "~0.12.0", - "concat-stream": "^1.6.0", - "form-data": "^2.2.0", - "http-basic": "^8.1.1", - "http-response-object": "^3.0.1", - "promise": "^8.0.0", - "qs": "^6.4.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/then-request/node_modules/@types/node": { - "version": "8.10.66", - "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", - "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==", - "dev": true - }, - "node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "dependencies": { - "os-tmpdir": "~1.0.2" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "dev": true, - "engines": { - "node": ">=0.6" - } - }, - "node_modules/tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dev": true, - "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/ts-command-line-args": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/ts-command-line-args/-/ts-command-line-args-2.5.1.tgz", - "integrity": "sha512-H69ZwTw3rFHb5WYpQya40YAX2/w7Ut75uUECbgBIsLmM+BNuYnxsltfyyLMxy6sEeKxgijLTnQtLd0nKd6+IYw==", - "dev": true, - "peer": true, - "dependencies": { - "chalk": "^4.1.0", - "command-line-args": "^5.1.1", - "command-line-usage": "^6.1.0", - "string-format": "^2.0.0" - }, - "bin": { - "write-markdown": "dist/write-markdown.js" - } - }, - "node_modules/ts-command-line-args/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "peer": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/ts-command-line-args/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "peer": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/ts-command-line-args/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "peer": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/ts-command-line-args/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "peer": true - }, - "node_modules/ts-command-line-args/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ts-command-line-args/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ts-essentials": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-7.0.3.tgz", - "integrity": "sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ==", - "dev": true, - "peer": true, - "peerDependencies": { - "typescript": ">=3.7.0" - } - }, - "node_modules/ts-node": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", - "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", - "dev": true, - "peer": true, - "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } - } - }, - "node_modules/ts-node/node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "node_modules/tsort": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/tsort/-/tsort-0.0.1.tgz", - "integrity": "sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw==", - "dev": true - }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "dev": true, - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/tweetnacl": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", - "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==", - "dev": true - }, - "node_modules/tweetnacl-util": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz", - "integrity": "sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==", - "dev": true - }, - "node_modules/type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", - "dev": true, - "dependencies": { - "prelude-ls": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typechain": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/typechain/-/typechain-8.2.0.tgz", - "integrity": "sha512-tZqhqjxJ9xAS/Lh32jccTjMkpx7sTdUVVHAy5Bf0TIer5QFNYXotiX74oCvoVYjyxUKDK3MXHtMFzMyD3kE+jg==", - "dev": true, - "peer": true, - "dependencies": { - "@types/prettier": "^2.1.1", - "debug": "^4.3.1", - "fs-extra": "^7.0.0", - "glob": "7.1.7", - "js-sha3": "^0.8.0", - "lodash": "^4.17.15", - "mkdirp": "^1.0.4", - "prettier": "^2.3.1", - "ts-command-line-args": "^2.2.0", - "ts-essentials": "^7.0.1" - }, - "bin": { - "typechain": "dist/cli/cli.js" - }, - "peerDependencies": { - "typescript": ">=4.3.0" - } - }, - "node_modules/typechain/node_modules/glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", - "dev": true, - "peer": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/typechain/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true, - "peer": true, - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/typed-array-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", - "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", - "dev": true - }, - "node_modules/typescript": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.3.tgz", - "integrity": "sha512-XH627E9vkeqhlZFQuL+UsyAXEnibT0kWR2FWONlr4sTjvxyJYnyefgrkyECLzM5NenmKzRAy2rR/OlYLA1HkZw==", - "dev": true, - "peer": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/typical": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz", - "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/uglify-js": { - "version": "3.17.4", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", - "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", - "dev": true, - "optional": true, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/undici": { - "version": "5.22.1", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.22.1.tgz", - "integrity": "sha512-Ji2IJhFXZY0x/0tVBXeQwgPlLWw13GVzpsWPQ3rV50IFMMof2I55PZZxtm4P6iNq+L5znYN9nSTAq0ZyE6lSJw==", - "dev": true, - "dependencies": { - "busboy": "^1.6.0" - }, - "engines": { - "node": ">=14.0" - } - }, - "node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/utf8": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/utf8/-/utf8-3.0.0.tgz", - "integrity": "sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==", - "dev": true - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true - }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true, - "peer": true - }, - "node_modules/verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", - "dev": true, - "engines": [ - "node >=0.6.0" - ], - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "node_modules/web3-utils": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.10.0.tgz", - "integrity": "sha512-kSaCM0uMcZTNUSmn5vMEhlo02RObGNRRCkdX0V9UTAU0+lrvn0HSaudyCo6CQzuXUsnuY2ERJGCGPfeWmv19Rg==", - "dev": true, - "dependencies": { - "bn.js": "^5.2.1", - "ethereum-bloom-filters": "^1.0.6", - "ethereumjs-util": "^7.1.0", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randombytes": "^2.1.0", - "utf8": "3.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3-utils/node_modules/ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "dev": true, - "dependencies": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" - } - }, - "node_modules/web3-utils/node_modules/ethereumjs-util": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", - "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", - "dev": true, - "dependencies": { - "@types/bn.js": "^5.1.0", - "bn.js": "^5.1.2", - "create-hash": "^1.1.2", - "ethereum-cryptography": "^0.1.3", - "rlp": "^2.2.4" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-module": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", - "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", - "dev": true - }, - "node_modules/which-typed-array": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", - "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.10" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "dev": true, - "dependencies": { - "string-width": "^1.0.2 || 2" - } - }, - "node_modules/wide-align/node_modules/ansi-regex": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", - "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/wide-align/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/wide-align/node_modules/string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "dependencies": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/wide-align/node_modules/strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", - "dev": true, - "dependencies": { - "ansi-regex": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", - "dev": true - }, - "node_modules/wordwrapjs": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-4.0.1.tgz", - "integrity": "sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==", - "dev": true, - "peer": true, - "dependencies": { - "reduce-flatten": "^2.0.0", - "typical": "^5.2.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/wordwrapjs/node_modules/typical": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", - "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/workerpool": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", - "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", - "dev": true - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/wrap-ansi/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "node_modules/ws": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", - "dev": true, - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/xmlhttprequest": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", - "integrity": "sha512-58Im/U0mlVBLM38NdZjHyhuMtCqa61469k2YP/AaPbvCoV9aQGUpbJBj1QRm2ytRiVQBD/fsw7L2bJGDVQswBA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, - "node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs-parser": { - "version": "20.2.4", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs-unparser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", - "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", - "dev": true, - "dependencies": { - "camelcase": "^6.0.0", - "decamelize": "^4.0.0", - "flat": "^5.0.2", - "is-plain-obj": "^2.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - } -} diff --git a/contracts/package.json b/contracts/package.json deleted file mode 100644 index 366698b5..00000000 --- a/contracts/package.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "name": "hardhat-project", - "dependencies": { - "@openzeppelin/contracts": "^4.9.2", - "dotenv": "^16.3.1", - "ethers": "^5.6.9" - }, - "devDependencies": { - "@nomicfoundation/hardhat-network-helpers": "^1.0.8", - "@nomicfoundation/hardhat-toolbox": "^2.0.2", - "hardhat": "^2.16.0", - "hardhat-gas-reporter": "^1.0.9", - "prettier": "^2.8.8", - "prettier-plugin-solidity": "^1.1.3", - "solidity-coverage": "^0.8.7" - } -} diff --git a/contracts/scripts/deploy.ts b/contracts/scripts/deploy.ts deleted file mode 100644 index a5d92dff..00000000 --- a/contracts/scripts/deploy.ts +++ /dev/null @@ -1,103 +0,0 @@ -import { ethers } from "hardhat"; -import hre from "hardhat"; - -type Deployment = { - address: string; -}; - -type Deployments = { - [network: number]: Deployment; -}; - -async function main() { - const verifyingKey = await ethers.deployContract( - "src/VerifyingKey.sol:Halo2VerifyingKey" - ); - await verifyingKey.deployed(); - - const snarkVerifier = await ethers.deployContract( - "src/SnarkVerifier.sol:Verifier" - ); - await snarkVerifier.deployed(); - - const grandSumVerifier = await ethers.deployContract( - "src/GrandSumVerifier.sol:GrandSumVerifier" - ); - await grandSumVerifier.deployed(); - - const inclusionVerifier = await ethers.deployContract( - "src/InclusionVerifier.sol:InclusionVerifier" - ); - await inclusionVerifier.deployed(); - - // The number of cryptocurrencies in the balance polynomials - const currenciesCount = 2; - // The number of bytes used to represent the balance of a cryptocurrency in the polynomials - const balanceByteRange = 8; - const summa = await ethers.deployContract("Summa", [ - verifyingKey.address, - snarkVerifier.address, - grandSumVerifier.address, - inclusionVerifier.address, - ["ETH", "USDT"], // cryptocurrency names - ["ETH", "ETH"], // cryptocurrency chain - balanceByteRange, - ]); - - await summa.deployed(); - - console.log(`Summa deployed to ${summa.address}`); - - let deploymentsJson: Deployments = {}; - const fs = require("fs"); - try { - const deploymentsRaw = fs.readFileSync( - "../backend/src/contracts/deployments.json", - "utf8" - ); - deploymentsJson = JSON.parse(deploymentsRaw); - // Removing the previous deployment from the JSON file - if (deploymentsJson[hre.network.config.chainId ?? 0]) - delete deploymentsJson[hre.network.config.chainId ?? 0]; - } catch (error) { - console.log("No previous deployments found"); - } - // Adding the new deployment to the previous deployments, indexed by network ID - const newDeployment = { - // Getting the contract address - address: summa.address, - }; - const deployments = { - ...deploymentsJson, - [hre.network.config.chainId ?? 0]: newDeployment, - }; - const deploymentsStringified = JSON.stringify(deployments); - //Save the contract address to a JSON file in backend src directory - fs.writeFileSync( - "../backend/src/contracts/deployments.json", - deploymentsStringified - ); - - //Copy the ABIs from `artifacts/src/*` to `backend/src/contracts/*` - copyAbi(fs, "Summa", "Summa"); - copyAbi(fs, "VerifyingKey", "Halo2VerifyingKey"); - copyAbi(fs, "SnarkVerifier", "Verifier"); - copyAbi(fs, "GrandSumVerifier", "GrandSumVerifier"); - copyAbi(fs, "InclusionVerifier", "InclusionVerifier"); -} - -// We recommend this pattern to be able to use async/await everywhere -// and properly handle errors. -main().catch((error) => { - console.error(error); - process.exitCode = 1; -}); - -function copyAbi(fs: any, filename: string, contractName: string) { - const abi = require(`../artifacts/src/${filename}.sol/${contractName}.json`); - const abiStringified = JSON.stringify(abi); - fs.writeFileSync( - `../backend/src/contracts/abi/${filename}.json`, - abiStringified - ); -} diff --git a/contracts/src/DummyVerifyingKey.sol b/contracts/src/DummyVerifyingKey.sol deleted file mode 100644 index d7db2109..00000000 --- a/contracts/src/DummyVerifyingKey.sol +++ /dev/null @@ -1,136 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -contract Halo2VerifyingKey { - constructor() { - assembly { - mstore( - 0x0000, - 0x0f4282e55a789d94ea57d4e200623dabb7ea67c998749f0370c890ab9ee6883f - ) // vk_digest - mstore( - 0x0020, - 0x0000000000000000000000000000000000000000000000000000000000000011 - ) // k - mstore( - 0x0040, - 0x30643640b9f82f90e83b698e5ea6179c7c05542e859533b48b9953a2f5360801 - ) // n_inv - mstore( - 0x0060, - 0x304cd1e79cfa5b0f054e981a27ed7706e7ea6b06a7f266ef8db819c179c2c3ea - ) // omega - mstore( - 0x0080, - 0x193586da872cdeff023d6ab2263a131b4780db8878be3c3b7f8f019c06fcb0fb - ) // omega_inv - mstore( - 0x00a0, - 0x299110e6835fd73731fb3ce6de87151988da403c265467a96b9cda0d7daa72e4 - ) // omega_inv_to_l - mstore( - 0x00c0, - 0x0000000000000000000000000000000000000000000000000000000000000001 - ) // num_instances - mstore( - 0x00e0, - 0x0000000000000000000000000000000000000000000000000000000000000000 - ) // has_accumulator - mstore( - 0x0100, - 0x0000000000000000000000000000000000000000000000000000000000000000 - ) // acc_offset - mstore( - 0x0120, - 0x0000000000000000000000000000000000000000000000000000000000000000 - ) // num_acc_limbs - mstore( - 0x0140, - 0x0000000000000000000000000000000000000000000000000000000000000000 - ) // num_acc_limb_bits - mstore( - 0x0160, - 0x0000000000000000000000000000000000000000000000000000000000000001 - ) // g1_x - mstore( - 0x0180, - 0x0000000000000000000000000000000000000000000000000000000000000002 - ) // g1_y - mstore( - 0x01a0, - 0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2 - ) // g2_x_1 - mstore( - 0x01c0, - 0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed - ) // g2_x_2 - mstore( - 0x01e0, - 0x090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b - ) // g2_y_1 - mstore( - 0x0200, - 0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa - ) // g2_y_2 - mstore( - 0x0220, - 0x26186a2d65ee4d2f9c9a5b91f86597d35f192cd120caf7e935d8443d1938e23d - ) // neg_s_g2_x_1 - mstore( - 0x0240, - 0x30441fd1b5d3370482c42152a8899027716989a6996c2535bc9f7fee8aaef79e - ) // neg_s_g2_x_2 - mstore( - 0x0260, - 0x16f363f103c80d7bbc8ad3c6867e0822bbc6000be91a4689755c7df40221c145 - ) // neg_s_g2_y_1 - mstore( - 0x0280, - 0x2b1cbb3e521edf5a622d82762a44a5e63f1e50b332d71154a4a7958d6011deff - ) // neg_s_g2_y_2 - mstore( - 0x02a0, - 0x1404a2d17cd02c8f9fd79d74ac73c67d1881e62c6af354fa74d235c5e37dacfe - ) // fixed_comms[0].x - mstore( - 0x02c0, - 0x2c1e30781f735e7977820d4ca9145010e28dcc808ee0f1e976477289057b7aec - ) // fixed_comms[0].y - mstore( - 0x02e0, - 0x1b20314062560deca1b1bada262dbe3352a521ea2ef8973476cb7ad6f588c59d - ) // permutation_comms[0].x - mstore( - 0x0300, - 0x244ac9f0848be84d5a85e3c4e62e2a371ac7be27d68202ef3fe79541021ab99d - ) // permutation_comms[0].y - mstore( - 0x0320, - 0x2b1f7e2148bfab601e68f2e8133b9d05c10a9526d686b356b761eaa3713a70ba - ) // permutation_comms[1].x - mstore( - 0x0340, - 0x013345ea09966b06e4ae7d7e2919ddbb6e3f7e645aea515375ed729bff644dc5 - ) // permutation_comms[1].y - mstore( - 0x0360, - 0x27a7a66087a8c17b00ffb7fe9b76ba2199ca308bcb0ad100fa181886d6c9b936 - ) // permutation_comms[2].x - mstore( - 0x0380, - 0x23bc951a3c4307384bdec5d61be122a19c933db3266d6327a472e5203a9f785a - ) // permutation_comms[2].y - mstore( - 0x03a0, - 0x0743ea40f14084db2673217283aa053f986896ee7c181f52118442e99c452974 - ) // permutation_comms[3].x - mstore( - 0x03c0, - 0x0203e3493a2594ece57d22cc75dd081ac68271ec7c758153cfd2152bfb5c19e3 - ) // permutation_comms[3].y - - return(0, 0x03e0) - } - } -} diff --git a/contracts/src/GrandSumVerifier.sol b/contracts/src/GrandSumVerifier.sol deleted file mode 100644 index cfd2f3df..00000000 --- a/contracts/src/GrandSumVerifier.sol +++ /dev/null @@ -1,163 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -contract GrandSumVerifier { - // Calldata positions for proofs - uint256 internal constant PROOF_LEN_CPTR = 0x64; - uint256 internal constant PROOF_CPTR = 0x84; - - // Memory positions for the verifying key. - // The memory location starts at 0x200 due to the maximum operation on the ec_pairing function being 0x180, marking the maximum memory location used - uint256 internal constant N_INV_MPTR = 0x220; - uint256 internal constant LHS_X_MPTR = 0x240; - uint256 internal constant LHS_Y_MPTR = 0x260; - uint256 internal constant G1_X_MPTR = 0x280; - uint256 internal constant G1_Y_MPTR = 0x2a0; - uint256 internal constant G2_X_1_MPTR = 0x2c0; - uint256 internal constant G2_X_2_MPTR = 0x2e0; - uint256 internal constant G2_Y_1_MPTR = 0x300; - uint256 internal constant G2_Y_2_MPTR = 0x320; - uint256 internal constant NEG_S_G2_X_1_MPTR = 0x340; - uint256 internal constant NEG_S_G2_X_2_MPTR = 0x360; - uint256 internal constant NEG_S_G2_Y_1_MPTR = 0x380; - uint256 internal constant NEG_S_G2_Y_2_MPTR = 0x3a0; - - - - function verifyProof( - address vk, - bytes calldata proof, - uint256[] calldata values - ) public returns (bool) { - assembly { - // Check if EC point (x, y) is on the curve. - // if the point is on the affine plane, it then returns updated (success). - function check_ec_point(success, proof_cptr, q) -> ret { - let x := calldataload(proof_cptr) - let y := calldataload(add(proof_cptr, 0x20)) - ret := and(success, lt(x, q)) - ret := and(ret, lt(y, q)) - ret := and(ret, eq(mulmod(y, y, q), addmod(mulmod(x, mulmod(x, x, q), q), 3, q))) - } - - // Add (x, y) into point at (0x80, 0xa0). - // Return updated (success). - function ec_add_tmp(success, x, y) -> ret { - mstore(0xc0, x) - mstore(0xe0, y) - ret := and(success, staticcall(gas(), 0x06, 0x80, 0x80, 0x80, 0x40)) - } - - // Scale point at (0x80, 0xa0) by scalar. - // Return updated (success). - function ec_mul_tmp(success, scalar) -> ret { - mstore(0xc0, scalar) - ret := and(success, staticcall(gas(), 0x07, 0x80, 0x60, 0x80, 0x40)) - } - - // Perform pairing check. - // Return updated (success). - function ec_pairing(success, lhs_x, lhs_y, rhs_x, rhs_y) -> ret { - mstore(0x00, lhs_x) - mstore(0x20, lhs_y) - mstore(0x40, mload(G2_X_1_MPTR)) - mstore(0x60, mload(G2_X_2_MPTR)) - mstore(0x80, mload(G2_Y_1_MPTR)) - mstore(0xa0, mload(G2_Y_2_MPTR)) - mstore(0xc0, rhs_x) - mstore(0xe0, rhs_y) - mstore(0x100, mload(NEG_S_G2_X_1_MPTR)) - mstore(0x120, mload(NEG_S_G2_X_2_MPTR)) - mstore(0x140, mload(NEG_S_G2_Y_1_MPTR)) - mstore(0x160, mload(NEG_S_G2_Y_2_MPTR)) - ret := and(success, staticcall(gas(), 0x08, 0x00, 0x180, 0x00, 0x20)) - ret := and(ret, mload(0x00)) - } - - // Modulus - let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // BN254 base field - let r := 21888242871839275222246405745257275088548364400416034343698204186575808495617 // BN254 scalar field - - // Initialize success as true - let success := true - - // Copy part of the verifying key contract into memory. - extcodecopy(vk, N_INV_MPTR, 0x40, 0x020) - // The address 0x02a0(= 0x160 + 0x140) indicates the memory location to which `neg_s_g2` points in the verifying key contract - extcodecopy(vk, G1_X_MPTR, 0x160, 0x140) - - // The proof length should be divisible by `0x80` bytes, equivalent to four words. - // - // The proof is structured as follows: - // 2W * n: Commitment points in the SNARK proof. - // 2W * n: Points in the opening proof. - // 1W : Length of evaluation values. - // 1W * n: Evaluation values. - // - // Where W is refers to a Word, which is 32 bytes. - // And 'n' denotes the number of commitments as well as the number of evaluation values. - let proof_length := calldataload(PROOF_LEN_CPTR) - - // Ensure the proof length is divisible by `0x80`, accommodating the structured data layout. - success := and(success, eq(0, mod(proof_length, 0x80))) - if iszero(success) { - mstore(0, "Invalid proof length") - revert(0, 0x20) - } - - // Load the length of evaluation values, positioned after the proof data. - let evaluation_values_length_pos := add(add(PROOF_LEN_CPTR, proof_length), 0x20) - let evaluation_values_length := calldataload(evaluation_values_length_pos) - - // The proof length should match 4 times the length of the evaluation values. - success := and(success, eq(4, div(proof_length, mul(evaluation_values_length, 0x20)))) - if iszero(success) { - mstore(0, "Number of evaluation mismatch") - revert(0, 0x20) - } - - for { let i := 0 } lt(i, evaluation_values_length) { i := add(i, 1) } { - let shift_pos := mul(i, 0x20) - let double_shift_pos := mul(shift_pos, 2) // for next point - let total_balance := calldataload(add(evaluation_values_length_pos, add(shift_pos, 0x20))) - - // The `z` is evaluated with 'total_balance' multiply by `N_INV` - // The `N_INV` is equivalent to `Fp::from(poly_length).invert().unwrap()` as input on the `open_grand_sums` function in Rust implementation. - let z := mulmod(total_balance, mload(N_INV_MPTR), r) - let minus_z := sub(r, z) - - // Assign values on memory for multiplication - mstore(0x80, mload(G1_X_MPTR)) - mstore(0xa0, mload(G1_Y_MPTR)) - success := and(success, ec_mul_tmp(success, minus_z)) - - // Performaing `c_g_to_minus_z := c + g_to_minus_z` - // `c` is equivalent to `commitment` as input on the `open_grand_sums` function. - // the values of 'g_to_minus_z` is already located at 0x80 and 0xa0 in the previous step - let commitment_proof_pos := add(add(PROOF_CPTR, div(proof_length, 2)), double_shift_pos) - success := check_ec_point(success, commitment_proof_pos, q) - - let lhs_x := calldataload(commitment_proof_pos) // C_X - let lhs_y := calldataload(add(commitment_proof_pos, 0x20)) // C_Y - success := ec_add_tmp(success, lhs_x, lhs_y) - - // Store LHS_X and LHS_Y to memory - mstore(LHS_X_MPTR, mload(0x80)) - mstore(LHS_Y_MPTR, mload(0xa0)) - - // Checking from calldata for grand sum proof - let proof_pos := add(PROOF_CPTR, double_shift_pos) - success := check_ec_point(success, proof_pos, q) - - let rhs_x := calldataload(proof_pos) // PI_X - let rhs_y := calldataload(add(proof_pos, 0x20)) // PI_Y - success := and(success, ec_pairing(success, mload(LHS_X_MPTR), mload(LHS_Y_MPTR), rhs_x, rhs_y)) - } - - // Return 1 as result if everything succeeds - mstore(0x00, success) - return(0x00, 0x20) - } - } -} diff --git a/contracts/src/InclusionVerifier.sol b/contracts/src/InclusionVerifier.sol deleted file mode 100644 index e84b41cc..00000000 --- a/contracts/src/InclusionVerifier.sol +++ /dev/null @@ -1,166 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -contract InclusionVerifier { - // Calldata positions for proofs - uint256 internal constant PROOF_LEN_CPTR = 0x84; - uint256 internal constant PROOF_CPTR = 0xa4; - - // Memory positions for the verifying key. - // The memory location starts at 0x200 due to the maximum operation on the ec_pairing function being 0x180. - uint256 internal constant LHS_X_MPTR = 0x200; - uint256 internal constant LHS_Y_MPTR = 0x220; - uint256 internal constant G1_X_MPTR = 0x240; - uint256 internal constant G1_Y_MPTR = 0x260; - uint256 internal constant G2_X_1_MPTR = 0x280; - uint256 internal constant G2_X_2_MPTR = 0x2a0; - uint256 internal constant G2_Y_1_MPTR = 0x2c0; - uint256 internal constant G2_Y_2_MPTR = 0x2e0; - uint256 internal constant NEG_S_G2_X_1_MPTR = 0x300; - uint256 internal constant NEG_S_G2_X_2_MPTR = 0x320; - uint256 internal constant NEG_S_G2_Y_1_MPTR = 0x340; - uint256 internal constant NEG_S_G2_Y_2_MPTR = 0x360; - - function verifyProof( - address vk, - bytes calldata proofs, - uint256[] calldata challenges, - uint256[] calldata values - ) public view returns (bool) { - assembly { - // Check EC point (x, y) is on the curve. - // the point is on affine plane, and then return success. - function check_ec_point(success, proof_cptr, q) -> ret { - let x := calldataload(proof_cptr) - let y := calldataload(add(proof_cptr, 0x20)) - ret := and(success, lt(x, q)) - ret := and(ret, lt(y, q)) - ret := and(ret, eq(mulmod(y, y, q), addmod(mulmod(x, mulmod(x, x, q), q), 3, q))) - } - - // Add (x, y) into point at (0x80, 0xa0). - // Return updated (success). - function ec_add_tmp(success, x, y) -> ret { - mstore(0xc0, x) - mstore(0xe0, y) - ret := and(success, staticcall(gas(), 0x06, 0x80, 0x80, 0x80, 0x40)) - } - - // Scale point at (0x80, 0xa0) by scalar. - // Return updated (success). - function ec_mul_tmp(success, scalar) -> ret { - mstore(0xc0, scalar) - ret := and(success, staticcall(gas(), 0x07, 0x80, 0x60, 0x80, 0x40)) - } - - // Perform pairing check. - function ec_pairing(success, lhs_x, lhs_y, rhs_x, rhs_y) -> ret { - mstore(0x00, lhs_x) - mstore(0x20, lhs_y) - mstore(0x40, mload(G2_X_1_MPTR)) - mstore(0x60, mload(G2_X_2_MPTR)) - mstore(0x80, mload(G2_Y_1_MPTR)) - mstore(0xa0, mload(G2_Y_2_MPTR)) - mstore(0xc0, rhs_x) - mstore(0xe0, rhs_y) - mstore(0x100, mload(NEG_S_G2_X_1_MPTR)) - mstore(0x120, mload(NEG_S_G2_X_2_MPTR)) - mstore(0x140, mload(NEG_S_G2_Y_1_MPTR)) - mstore(0x160, mload(NEG_S_G2_Y_2_MPTR)) - ret := and(success, staticcall(gas(), 0x08, 0x00, 0x180, 0x00, 0x20)) - ret := and(ret, mload(0x00)) - } - - // Modulus - let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // BN254 base field - let r := 21888242871839275222246405745257275088548364400416034343698204186575808495617 // BN254 scalar field - - // Initialize success as true - let success := true - - // Copy the six variables from the verifying key up to the memory address 0x200 (= 0x160 + 0xc0), where `g2_y_2` is located. - extcodecopy(vk, G1_X_MPTR, 0x160, 0xc0) - - // The proof length should be divisible by `0x80` bytes, equivalent to four words. - // The proof is structured as follows: - // 2W * n: Commitment points in the SNARK proof. - // 2W * n: Points in the opening proof. - // where W is referred to as a Word, which is 32 bytes. - // and `n` denotes the number of commitments as well as the number of evaluation values. - let proof_length := calldataload(PROOF_LEN_CPTR) - - // Ensure the proof length is divisible by `0x80`, accommodating the structured data layout. - success := and(success, eq(0, mod(proof_length, 0x80))) - if iszero(success) { - revert(0, 0) - } - - // Load the NEG_S_G2 point with the calculated point - let challenges_length_pos := add(add(PROOF_LEN_CPTR, proof_length), 0x20) - let challenges_length := calldataload(challenges_length_pos) - success := and(success, eq(challenges_length, 4)) - if iszero(success) { - revert(0, 0) - } - - mstore(NEG_S_G2_X_1_MPTR, calldataload(add(challenges_length_pos, 0x20))) - mstore(NEG_S_G2_X_2_MPTR, calldataload(add(challenges_length_pos, 0x40))) - mstore(NEG_S_G2_Y_1_MPTR, calldataload(add(challenges_length_pos, 0x60))) - mstore(NEG_S_G2_Y_2_MPTR, calldataload(add(challenges_length_pos, 0x80))) - - // Load the length of evaluation values, positioned after the proof data. - let evaluation_values_length_pos := add(add(challenges_length_pos, mul(challenges_length, 0x20)), 0x20) - let evaluation_values_length := calldataload(evaluation_values_length_pos) - - // The proof length should match 4 times the length of the evaluation values. - success := and(success, eq(4, div(proof_length, mul(evaluation_values_length, 0x20)))) - if iszero(success) { - revert(0, 0) - } - - for { let i := 0 } lt(i, evaluation_values_length) { i := add(i, 1) } { - let shift_pos := mul(i, 0x20) - let double_shift_pos := mul(i, 0x40) // for next point - - let value := calldataload(add(evaluation_values_length_pos, add(shift_pos, 0x20))) - let minus_z := sub(r, value) - - // Assign values on memory for multiplication - mstore(0x80, mload(G1_X_MPTR)) - mstore(0xa0, mload(G1_Y_MPTR)) - mstore(0xc0, minus_z) - success := and(success, ec_mul_tmp(success, minus_z)) - - // Performaing like `c_g_to_minus_z = c + g_to_minus_z` in `verify_kzg_proof` function that is located in `amortized_kzg.rs`. - // - // The `c` refers to `commitment` as input likes in the `open_grand_sums` function. - // The values of 'g_to_minus_z` is already located at 0x80 and 0xa0 in the previous step - let commitment_proof_pos := add(add(PROOF_CPTR, div(proof_length, 2)), double_shift_pos) - success := check_ec_point(success, commitment_proof_pos, q) - - let lhs_x := calldataload(commitment_proof_pos) // C_X - let lhs_y := calldataload(add(commitment_proof_pos, 0x20)) // C_Y - success := ec_add_tmp(success, lhs_x, lhs_y) - if iszero(success) { - revert(0, 0) - } - - mstore(LHS_X_MPTR, mload(0x80)) - mstore(LHS_Y_MPTR, mload(0xa0)) - - // Checking from calldata - let proof_pos := add(PROOF_CPTR, double_shift_pos) - success := check_ec_point(success, proof_pos, q) - - let rhs_x := calldataload(proof_pos) // PI_X - let rhs_y := calldataload(add(proof_pos, 0x20)) // PI_Y - success := and(success, ec_pairing(success, mload(LHS_X_MPTR), mload(LHS_Y_MPTR), rhs_x, rhs_y)) - } - - // Return 1 as result if everything succeeds - mstore(0x00, success) - return(0x00, 0x20) - } - } - -} diff --git a/contracts/src/SnarkVerifier.sol b/contracts/src/SnarkVerifier.sol deleted file mode 100644 index 55284311..00000000 --- a/contracts/src/SnarkVerifier.sol +++ /dev/null @@ -1,1384 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -contract Verifier { - uint256 internal constant PROOF_LEN_CPTR = 0x64; - uint256 internal constant PROOF_CPTR = 0x84; - uint256 internal constant NUM_INSTANCE_CPTR = 0x1584; - uint256 internal constant INSTANCE_CPTR = 0x15a4; - - uint256 internal constant FIRST_QUOTIENT_X_CPTR = 0x0ac4; - uint256 internal constant LAST_QUOTIENT_X_CPTR = 0x0b44; - - uint256 internal constant VK_MPTR = 0x09a0; - uint256 internal constant VK_DIGEST_MPTR = 0x09a0; - uint256 internal constant K_MPTR = 0x09c0; - uint256 internal constant N_INV_MPTR = 0x09e0; - uint256 internal constant OMEGA_MPTR = 0x0a00; - uint256 internal constant OMEGA_INV_MPTR = 0x0a20; - uint256 internal constant OMEGA_INV_TO_L_MPTR = 0x0a40; - uint256 internal constant NUM_INSTANCES_MPTR = 0x0a60; - uint256 internal constant HAS_ACCUMULATOR_MPTR = 0x0a80; - uint256 internal constant ACC_OFFSET_MPTR = 0x0aa0; - uint256 internal constant NUM_ACC_LIMBS_MPTR = 0x0ac0; - uint256 internal constant NUM_ACC_LIMB_BITS_MPTR = 0x0ae0; - uint256 internal constant G1_X_MPTR = 0x0b00; - uint256 internal constant G1_Y_MPTR = 0x0b20; - uint256 internal constant G2_X_1_MPTR = 0x0b40; - uint256 internal constant G2_X_2_MPTR = 0x0b60; - uint256 internal constant G2_Y_1_MPTR = 0x0b80; - uint256 internal constant G2_Y_2_MPTR = 0x0ba0; - uint256 internal constant NEG_S_G2_X_1_MPTR = 0x0bc0; - uint256 internal constant NEG_S_G2_X_2_MPTR = 0x0be0; - uint256 internal constant NEG_S_G2_Y_1_MPTR = 0x0c00; - uint256 internal constant NEG_S_G2_Y_2_MPTR = 0x0c20; - - uint256 internal constant CHALLENGE_MPTR = 0x0f00; - - uint256 internal constant THETA_MPTR = 0x0f00; - uint256 internal constant BETA_MPTR = 0x0f20; - uint256 internal constant GAMMA_MPTR = 0x0f40; - uint256 internal constant Y_MPTR = 0x0f60; - uint256 internal constant X_MPTR = 0x0f80; - uint256 internal constant ZETA_MPTR = 0x0fa0; - uint256 internal constant NU_MPTR = 0x0fc0; - uint256 internal constant MU_MPTR = 0x0fe0; - - uint256 internal constant ACC_LHS_X_MPTR = 0x1000; - uint256 internal constant ACC_LHS_Y_MPTR = 0x1020; - uint256 internal constant ACC_RHS_X_MPTR = 0x1040; - uint256 internal constant ACC_RHS_Y_MPTR = 0x1060; - uint256 internal constant X_N_MPTR = 0x1080; - uint256 internal constant X_N_MINUS_1_INV_MPTR = 0x10a0; - uint256 internal constant L_LAST_MPTR = 0x10c0; - uint256 internal constant L_BLIND_MPTR = 0x10e0; - uint256 internal constant L_0_MPTR = 0x1100; - uint256 internal constant INSTANCE_EVAL_MPTR = 0x1120; - uint256 internal constant QUOTIENT_EVAL_MPTR = 0x1140; - uint256 internal constant QUOTIENT_X_MPTR = 0x1160; - uint256 internal constant QUOTIENT_Y_MPTR = 0x1180; - uint256 internal constant R_EVAL_MPTR = 0x11a0; - uint256 internal constant PAIRING_LHS_X_MPTR = 0x11c0; - uint256 internal constant PAIRING_LHS_Y_MPTR = 0x11e0; - uint256 internal constant PAIRING_RHS_X_MPTR = 0x1200; - uint256 internal constant PAIRING_RHS_Y_MPTR = 0x1220; - - function verifyProof( - address vk, - bytes calldata proof, - uint256[] calldata instances - ) public view returns (bool) { - assembly { - // Read EC point (x, y) at (proof_cptr, proof_cptr + 0x20), - // and check if the point is on affine plane, - // and store them in (hash_mptr, hash_mptr + 0x20). - // Return updated (success, proof_cptr, hash_mptr). - function read_ec_point(success, proof_cptr, hash_mptr, q) -> ret0, ret1, ret2 { - let x := calldataload(proof_cptr) - let y := calldataload(add(proof_cptr, 0x20)) - ret0 := and(success, lt(x, q)) - ret0 := and(ret0, lt(y, q)) - ret0 := and(ret0, eq(mulmod(y, y, q), addmod(mulmod(x, mulmod(x, x, q), q), 3, q))) - mstore(hash_mptr, x) - mstore(add(hash_mptr, 0x20), y) - ret1 := add(proof_cptr, 0x40) - ret2 := add(hash_mptr, 0x40) - } - - // Squeeze challenge by keccak256(memory[0..hash_mptr]), - // and store hash mod r as challenge in challenge_mptr, - // and push back hash in 0x00 as the first input for next squeeze. - // Return updated (challenge_mptr, hash_mptr). - function squeeze_challenge(challenge_mptr, hash_mptr, r) -> ret0, ret1 { - let hash := keccak256(0x00, hash_mptr) - mstore(challenge_mptr, mod(hash, r)) - mstore(0x00, hash) - ret0 := add(challenge_mptr, 0x20) - ret1 := 0x20 - } - - // Squeeze challenge without absorbing new input from calldata, - // by putting an extra 0x01 in memory[0x20] and squeeze by keccak256(memory[0..21]), - // and store hash mod r as challenge in challenge_mptr, - // and push back hash in 0x00 as the first input for next squeeze. - // Return updated (challenge_mptr). - function squeeze_challenge_cont(challenge_mptr, r) -> ret { - mstore8(0x20, 0x01) - let hash := keccak256(0x00, 0x21) - mstore(challenge_mptr, mod(hash, r)) - mstore(0x00, hash) - ret := add(challenge_mptr, 0x20) - } - - // Batch invert values in memory[mptr_start..mptr_end] in place. - // Return updated (success). - function batch_invert(success, mptr_start, mptr_end, r) -> ret { - let gp_mptr := mptr_end - let gp := mload(mptr_start) - let mptr := add(mptr_start, 0x20) - for - {} - lt(mptr, sub(mptr_end, 0x20)) - {} - { - gp := mulmod(gp, mload(mptr), r) - mstore(gp_mptr, gp) - mptr := add(mptr, 0x20) - gp_mptr := add(gp_mptr, 0x20) - } - gp := mulmod(gp, mload(mptr), r) - - mstore(gp_mptr, 0x20) - mstore(add(gp_mptr, 0x20), 0x20) - mstore(add(gp_mptr, 0x40), 0x20) - mstore(add(gp_mptr, 0x60), gp) - mstore(add(gp_mptr, 0x80), sub(r, 2)) - mstore(add(gp_mptr, 0xa0), r) - ret := and(success, staticcall(gas(), 0x05, gp_mptr, 0xc0, gp_mptr, 0x20)) - let all_inv := mload(gp_mptr) - - let first_mptr := mptr_start - let second_mptr := add(first_mptr, 0x20) - gp_mptr := sub(gp_mptr, 0x20) - for - {} - lt(second_mptr, mptr) - {} - { - let inv := mulmod(all_inv, mload(gp_mptr), r) - all_inv := mulmod(all_inv, mload(mptr), r) - mstore(mptr, inv) - mptr := sub(mptr, 0x20) - gp_mptr := sub(gp_mptr, 0x20) - } - let inv_first := mulmod(all_inv, mload(second_mptr), r) - let inv_second := mulmod(all_inv, mload(first_mptr), r) - mstore(first_mptr, inv_first) - mstore(second_mptr, inv_second) - } - - // Add (x, y) into point at (0x00, 0x20). - // Return updated (success). - function ec_add_acc(success, x, y) -> ret { - mstore(0x40, x) - mstore(0x60, y) - ret := and(success, staticcall(gas(), 0x06, 0x00, 0x80, 0x00, 0x40)) - } - - // Scale point at (0x00, 0x20) by scalar. - function ec_mul_acc(success, scalar) -> ret { - mstore(0x40, scalar) - ret := and(success, staticcall(gas(), 0x07, 0x00, 0x60, 0x00, 0x40)) - } - - // Add (x, y) into point at (0x80, 0xa0). - // Return updated (success). - function ec_add_tmp(success, x, y) -> ret { - mstore(0xc0, x) - mstore(0xe0, y) - ret := and(success, staticcall(gas(), 0x06, 0x80, 0x80, 0x80, 0x40)) - } - - // Scale point at (0x80, 0xa0) by scalar. - // Return updated (success). - function ec_mul_tmp(success, scalar) -> ret { - mstore(0xc0, scalar) - ret := and(success, staticcall(gas(), 0x07, 0x80, 0x60, 0x80, 0x40)) - } - - // Perform pairing check. - // Return updated (success). - function ec_pairing(success, lhs_x, lhs_y, rhs_x, rhs_y) -> ret { - mstore(0x00, lhs_x) - mstore(0x20, lhs_y) - mstore(0x40, mload(G2_X_1_MPTR)) - mstore(0x60, mload(G2_X_2_MPTR)) - mstore(0x80, mload(G2_Y_1_MPTR)) - mstore(0xa0, mload(G2_Y_2_MPTR)) - mstore(0xc0, rhs_x) - mstore(0xe0, rhs_y) - mstore(0x100, mload(NEG_S_G2_X_1_MPTR)) - mstore(0x120, mload(NEG_S_G2_X_2_MPTR)) - mstore(0x140, mload(NEG_S_G2_Y_1_MPTR)) - mstore(0x160, mload(NEG_S_G2_Y_2_MPTR)) - ret := and(success, staticcall(gas(), 0x08, 0x00, 0x180, 0x00, 0x20)) - ret := and(ret, mload(0x00)) - } - - // Modulus - let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // BN254 base field - let r := 21888242871839275222246405745257275088548364400416034343698204186575808495617 // BN254 scalar field - - // Initialize success as true - let success := true - - { - // Copy vk into memory - extcodecopy(vk, VK_MPTR, 0x00, 0x0560) - - // Check valid length of proof - success := and(success, eq(0x1500, calldataload(PROOF_LEN_CPTR))) - - // Check valid length of instances - let num_instances := mload(NUM_INSTANCES_MPTR) - success := and(success, eq(num_instances, calldataload(NUM_INSTANCE_CPTR))) - - // Absorb vk diegst - mstore(0x00, mload(VK_DIGEST_MPTR)) - - // Read instances and witness commitments and generate challenges - let hash_mptr := 0x20 - let instance_cptr := INSTANCE_CPTR - for - { let instance_cptr_end := add(instance_cptr, mul(0x20, num_instances)) } - lt(instance_cptr, instance_cptr_end) - {} - { - let instance := calldataload(instance_cptr) - success := and(success, lt(instance, r)) - mstore(hash_mptr, instance) - instance_cptr := add(instance_cptr, 0x20) - hash_mptr := add(hash_mptr, 0x20) - } - - let proof_cptr := PROOF_CPTR - let challenge_mptr := CHALLENGE_MPTR - - // Phase 1 - for - { let proof_cptr_end := add(proof_cptr, 0x02c0) } - lt(proof_cptr, proof_cptr_end) - {} - { - success, proof_cptr, hash_mptr := read_ec_point(success, proof_cptr, hash_mptr, q) - } - - challenge_mptr, hash_mptr := squeeze_challenge(challenge_mptr, hash_mptr, r) - - // Phase 2 - for - { let proof_cptr_end := add(proof_cptr, 0x0400) } - lt(proof_cptr, proof_cptr_end) - {} - { - success, proof_cptr, hash_mptr := read_ec_point(success, proof_cptr, hash_mptr, q) - } - - challenge_mptr, hash_mptr := squeeze_challenge(challenge_mptr, hash_mptr, r) - challenge_mptr := squeeze_challenge_cont(challenge_mptr, r) - - // Phase 3 - for - { let proof_cptr_end := add(proof_cptr, 0x0380) } - lt(proof_cptr, proof_cptr_end) - {} - { - success, proof_cptr, hash_mptr := read_ec_point(success, proof_cptr, hash_mptr, q) - } - - challenge_mptr, hash_mptr := squeeze_challenge(challenge_mptr, hash_mptr, r) - - // Phase 4 - for - { let proof_cptr_end := add(proof_cptr, 0xc0) } - lt(proof_cptr, proof_cptr_end) - {} - { - success, proof_cptr, hash_mptr := read_ec_point(success, proof_cptr, hash_mptr, q) - } - - challenge_mptr, hash_mptr := squeeze_challenge(challenge_mptr, hash_mptr, r) - - // Read evaluations - for - { let proof_cptr_end := add(proof_cptr, 0x0980) } - lt(proof_cptr, proof_cptr_end) - {} - { - let eval := calldataload(proof_cptr) - success := and(success, lt(eval, r)) - mstore(hash_mptr, eval) - proof_cptr := add(proof_cptr, 0x20) - hash_mptr := add(hash_mptr, 0x20) - } - - // Read batch opening proof and generate challenges - challenge_mptr, hash_mptr := squeeze_challenge(challenge_mptr, hash_mptr, r) // zeta - challenge_mptr := squeeze_challenge_cont(challenge_mptr, r) // nu - - success, proof_cptr, hash_mptr := read_ec_point(success, proof_cptr, hash_mptr, q) // W - - challenge_mptr, hash_mptr := squeeze_challenge(challenge_mptr, hash_mptr, r) // mu - - success, proof_cptr, hash_mptr := read_ec_point(success, proof_cptr, hash_mptr, q) // W' - - // Read accumulator from instances - if mload(HAS_ACCUMULATOR_MPTR) { - let num_limbs := mload(NUM_ACC_LIMBS_MPTR) - let num_limb_bits := mload(NUM_ACC_LIMB_BITS_MPTR) - - let cptr := add(INSTANCE_CPTR, mul(mload(ACC_OFFSET_MPTR), 0x20)) - let lhs_y_off := mul(num_limbs, 0x20) - let rhs_x_off := mul(lhs_y_off, 2) - let rhs_y_off := mul(lhs_y_off, 3) - let lhs_x := calldataload(cptr) - let lhs_y := calldataload(add(cptr, lhs_y_off)) - let rhs_x := calldataload(add(cptr, rhs_x_off)) - let rhs_y := calldataload(add(cptr, rhs_y_off)) - for - { - let cptr_end := add(cptr, mul(0x20, num_limbs)) - let shift := num_limb_bits - } - lt(cptr, cptr_end) - {} - { - cptr := add(cptr, 0x20) - lhs_x := add(lhs_x, shl(shift, calldataload(cptr))) - lhs_y := add(lhs_y, shl(shift, calldataload(add(cptr, lhs_y_off)))) - rhs_x := add(rhs_x, shl(shift, calldataload(add(cptr, rhs_x_off)))) - rhs_y := add(rhs_y, shl(shift, calldataload(add(cptr, rhs_y_off)))) - shift := add(shift, num_limb_bits) - } - - success := and(success, eq(mulmod(lhs_y, lhs_y, q), addmod(mulmod(lhs_x, mulmod(lhs_x, lhs_x, q), q), 3, q))) - success := and(success, eq(mulmod(rhs_y, rhs_y, q), addmod(mulmod(rhs_x, mulmod(rhs_x, rhs_x, q), q), 3, q))) - - mstore(ACC_LHS_X_MPTR, lhs_x) - mstore(ACC_LHS_Y_MPTR, lhs_y) - mstore(ACC_RHS_X_MPTR, rhs_x) - mstore(ACC_RHS_Y_MPTR, rhs_y) - } - - pop(q) - } - - // Revert earlier if anything from calldata is invalid - if iszero(success) { - revert(0, 0) - } - - // Compute lagrange evaluations and instance evaluation - { - let k := mload(K_MPTR) - let x := mload(X_MPTR) - let x_n := x - for - { let idx := 0 } - lt(idx, k) - { idx := add(idx, 1) } - { - x_n := mulmod(x_n, x_n, r) - } - - let omega := mload(OMEGA_MPTR) - - let mptr := X_N_MPTR - let mptr_end := add(mptr, mul(0x20, add(mload(NUM_INSTANCES_MPTR), 6))) - if iszero(mload(NUM_INSTANCES_MPTR)) { - mptr_end := add(mptr_end, 0x20) - } - for - { let pow_of_omega := mload(OMEGA_INV_TO_L_MPTR) } - lt(mptr, mptr_end) - { mptr := add(mptr, 0x20) } - { - mstore(mptr, addmod(x, sub(r, pow_of_omega), r)) - pow_of_omega := mulmod(pow_of_omega, omega, r) - } - let x_n_minus_1 := addmod(x_n, sub(r, 1), r) - mstore(mptr_end, x_n_minus_1) - success := batch_invert(success, X_N_MPTR, add(mptr_end, 0x20), r) - - mptr := X_N_MPTR - let l_i_common := mulmod(x_n_minus_1, mload(N_INV_MPTR), r) - for - { let pow_of_omega := mload(OMEGA_INV_TO_L_MPTR) } - lt(mptr, mptr_end) - { mptr := add(mptr, 0x20) } - { - mstore(mptr, mulmod(l_i_common, mulmod(mload(mptr), pow_of_omega, r), r)) - pow_of_omega := mulmod(pow_of_omega, omega, r) - } - - let l_blind := mload(add(X_N_MPTR, 0x20)) - let l_i_cptr := add(X_N_MPTR, 0x40) - for - { let l_i_cptr_end := add(X_N_MPTR, 0xc0) } - lt(l_i_cptr, l_i_cptr_end) - { l_i_cptr := add(l_i_cptr, 0x20) } - { - l_blind := addmod(l_blind, mload(l_i_cptr), r) - } - - let instance_eval := 0 - for - { - let instance_cptr := INSTANCE_CPTR - let instance_cptr_end := add(instance_cptr, mul(0x20, mload(NUM_INSTANCES_MPTR))) - } - lt(instance_cptr, instance_cptr_end) - { - instance_cptr := add(instance_cptr, 0x20) - l_i_cptr := add(l_i_cptr, 0x20) - } - { - instance_eval := addmod(instance_eval, mulmod(mload(l_i_cptr), calldataload(instance_cptr), r), r) - } - - let x_n_minus_1_inv := mload(mptr_end) - let l_last := mload(X_N_MPTR) - let l_0 := mload(add(X_N_MPTR, 0xc0)) - - mstore(X_N_MPTR, x_n) - mstore(X_N_MINUS_1_INV_MPTR, x_n_minus_1_inv) - mstore(L_LAST_MPTR, l_last) - mstore(L_BLIND_MPTR, l_blind) - mstore(L_0_MPTR, l_0) - mstore(INSTANCE_EVAL_MPTR, instance_eval) - } - - // Compute quotient evavluation - { - let quotient_eval_numer - let delta := 4131629893567559867359510883348571134090853742863529169391034518566172092834 - let y := mload(Y_MPTR) - { - let l_0 := mload(L_0_MPTR) - let eval := addmod(l_0, sub(r, mulmod(l_0, calldataload(0x0e44), r)), r) - quotient_eval_numer := eval - } - { - let perm_z_last := calldataload(0x0fc4) - let eval := mulmod(mload(L_LAST_MPTR), addmod(mulmod(perm_z_last, perm_z_last, r), sub(r, perm_z_last), r), r) - quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r) - } - { - let eval := mulmod(mload(L_0_MPTR), addmod(calldataload(0x0ea4), sub(r, calldataload(0x0e84)), r), r) - quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r) - } - { - let eval := mulmod(mload(L_0_MPTR), addmod(calldataload(0x0f04), sub(r, calldataload(0x0ee4)), r), r) - quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r) - } - { - let eval := mulmod(mload(L_0_MPTR), addmod(calldataload(0x0f64), sub(r, calldataload(0x0f44)), r), r) - quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r) - } - { - let eval := mulmod(mload(L_0_MPTR), addmod(calldataload(0x0fc4), sub(r, calldataload(0x0fa4)), r), r) - quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r) - } - { - let gamma := mload(GAMMA_MPTR) - let beta := mload(BETA_MPTR) - let lhs := calldataload(0x0e64) - let rhs := calldataload(0x0e44) - lhs := mulmod(lhs, addmod(addmod(calldataload(0x0cc4), mulmod(beta, calldataload(0x0d04), r), r), gamma, r), r) - lhs := mulmod(lhs, addmod(addmod(mload(INSTANCE_EVAL_MPTR), mulmod(beta, calldataload(0x0d24), r), r), gamma, r), r) - mstore(0x00, mulmod(beta, mload(X_MPTR), r)) - rhs := mulmod(rhs, addmod(addmod(calldataload(0x0cc4), mload(0x00), r), gamma, r), r) - mstore(0x00, mulmod(mload(0x00), delta, r)) - rhs := mulmod(rhs, addmod(addmod(mload(INSTANCE_EVAL_MPTR), mload(0x00), r), gamma, r), r) - mstore(0x00, mulmod(mload(0x00), delta, r)) - let left_sub_right := addmod(lhs, sub(r, rhs), r) - let eval := addmod(left_sub_right, sub(r, mulmod(left_sub_right, addmod(mload(L_LAST_MPTR), mload(L_BLIND_MPTR), r), r)), r) - quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r) - } - { - let gamma := mload(GAMMA_MPTR) - let beta := mload(BETA_MPTR) - let lhs := calldataload(0x0ec4) - let rhs := calldataload(0x0ea4) - lhs := mulmod(lhs, addmod(addmod(calldataload(0x0b84), mulmod(beta, calldataload(0x0d44), r), r), gamma, r), r) - lhs := mulmod(lhs, addmod(addmod(calldataload(0x0ba4), mulmod(beta, calldataload(0x0d64), r), r), gamma, r), r) - rhs := mulmod(rhs, addmod(addmod(calldataload(0x0b84), mload(0x00), r), gamma, r), r) - mstore(0x00, mulmod(mload(0x00), delta, r)) - rhs := mulmod(rhs, addmod(addmod(calldataload(0x0ba4), mload(0x00), r), gamma, r), r) - mstore(0x00, mulmod(mload(0x00), delta, r)) - let left_sub_right := addmod(lhs, sub(r, rhs), r) - let eval := addmod(left_sub_right, sub(r, mulmod(left_sub_right, addmod(mload(L_LAST_MPTR), mload(L_BLIND_MPTR), r), r)), r) - quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r) - } - { - let gamma := mload(GAMMA_MPTR) - let beta := mload(BETA_MPTR) - let lhs := calldataload(0x0f24) - let rhs := calldataload(0x0f04) - lhs := mulmod(lhs, addmod(addmod(calldataload(0x0bc4), mulmod(beta, calldataload(0x0d84), r), r), gamma, r), r) - lhs := mulmod(lhs, addmod(addmod(calldataload(0x0be4), mulmod(beta, calldataload(0x0da4), r), r), gamma, r), r) - rhs := mulmod(rhs, addmod(addmod(calldataload(0x0bc4), mload(0x00), r), gamma, r), r) - mstore(0x00, mulmod(mload(0x00), delta, r)) - rhs := mulmod(rhs, addmod(addmod(calldataload(0x0be4), mload(0x00), r), gamma, r), r) - mstore(0x00, mulmod(mload(0x00), delta, r)) - let left_sub_right := addmod(lhs, sub(r, rhs), r) - let eval := addmod(left_sub_right, sub(r, mulmod(left_sub_right, addmod(mload(L_LAST_MPTR), mload(L_BLIND_MPTR), r), r)), r) - quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r) - } - { - let gamma := mload(GAMMA_MPTR) - let beta := mload(BETA_MPTR) - let lhs := calldataload(0x0f84) - let rhs := calldataload(0x0f64) - lhs := mulmod(lhs, addmod(addmod(calldataload(0x0c24), mulmod(beta, calldataload(0x0dc4), r), r), gamma, r), r) - lhs := mulmod(lhs, addmod(addmod(calldataload(0x0c44), mulmod(beta, calldataload(0x0de4), r), r), gamma, r), r) - rhs := mulmod(rhs, addmod(addmod(calldataload(0x0c24), mload(0x00), r), gamma, r), r) - mstore(0x00, mulmod(mload(0x00), delta, r)) - rhs := mulmod(rhs, addmod(addmod(calldataload(0x0c44), mload(0x00), r), gamma, r), r) - mstore(0x00, mulmod(mload(0x00), delta, r)) - let left_sub_right := addmod(lhs, sub(r, rhs), r) - let eval := addmod(left_sub_right, sub(r, mulmod(left_sub_right, addmod(mload(L_LAST_MPTR), mload(L_BLIND_MPTR), r), r)), r) - quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r) - } - { - let gamma := mload(GAMMA_MPTR) - let beta := mload(BETA_MPTR) - let lhs := calldataload(0x0fe4) - let rhs := calldataload(0x0fc4) - lhs := mulmod(lhs, addmod(addmod(calldataload(0x0c64), mulmod(beta, calldataload(0x0e04), r), r), gamma, r), r) - lhs := mulmod(lhs, addmod(addmod(calldataload(0x0c84), mulmod(beta, calldataload(0x0e24), r), r), gamma, r), r) - rhs := mulmod(rhs, addmod(addmod(calldataload(0x0c64), mload(0x00), r), gamma, r), r) - mstore(0x00, mulmod(mload(0x00), delta, r)) - rhs := mulmod(rhs, addmod(addmod(calldataload(0x0c84), mload(0x00), r), gamma, r), r) - let left_sub_right := addmod(lhs, sub(r, rhs), r) - let eval := addmod(left_sub_right, sub(r, mulmod(left_sub_right, addmod(mload(L_LAST_MPTR), mload(L_BLIND_MPTR), r), r)), r) - quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r) - } - { - let l_0 := mload(L_0_MPTR) - let eval := addmod(l_0, mulmod(l_0, sub(r, calldataload(0x1004)), r), r) - quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r) - } - { - let l_last := mload(L_LAST_MPTR) - let eval := mulmod(l_last, addmod(mulmod(calldataload(0x1004), calldataload(0x1004), r), sub(r, calldataload(0x1004)), r), r) - quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r) - } - { - let theta := mload(THETA_MPTR) - let input - { - let a_1 := calldataload(0x0c04) - let a_3 := calldataload(0x0b84) - let var0 := 0x10000 - let var1 := mulmod(a_3, var0, r) - let var2 := sub(r, var1) - let var3 := addmod(a_1, var2, r) - input := var3 - } - let table - { - let f_0 := calldataload(0x0cc4) - table := f_0 - } - let beta := mload(BETA_MPTR) - let gamma := mload(GAMMA_MPTR) - let lhs := mulmod(calldataload(0x1024), mulmod(addmod(calldataload(0x1044), beta, r), addmod(calldataload(0x1084), gamma, r), r), r) - let rhs := mulmod(calldataload(0x1004), mulmod(addmod(input, beta, r), addmod(table, gamma, r), r), r) - let eval := mulmod(addmod(1, sub(r, addmod(mload(L_BLIND_MPTR), mload(L_LAST_MPTR), r)), r), addmod(lhs, sub(r, rhs), r), r) - quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r) - } - { - let eval := mulmod(mload(L_0_MPTR), addmod(calldataload(0x1044), sub(r, calldataload(0x1084)), r), r) - quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r) - } - { - let eval := mulmod(addmod(1, sub(r, addmod(mload(L_BLIND_MPTR), mload(L_LAST_MPTR), r)), r), mulmod(addmod(calldataload(0x1044), sub(r, calldataload(0x1084)), r), addmod(calldataload(0x1044), sub(r, calldataload(0x1064)), r), r), r) - quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r) - } - { - let l_0 := mload(L_0_MPTR) - let eval := addmod(l_0, mulmod(l_0, sub(r, calldataload(0x10a4)), r), r) - quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r) - } - { - let l_last := mload(L_LAST_MPTR) - let eval := mulmod(l_last, addmod(mulmod(calldataload(0x10a4), calldataload(0x10a4), r), sub(r, calldataload(0x10a4)), r), r) - quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r) - } - { - let theta := mload(THETA_MPTR) - let input - { - let a_3 := calldataload(0x0b84) - let a_4 := calldataload(0x0ba4) - let var0 := 0x10000 - let var1 := mulmod(a_4, var0, r) - let var2 := sub(r, var1) - let var3 := addmod(a_3, var2, r) - input := var3 - } - let table - { - let f_0 := calldataload(0x0cc4) - table := f_0 - } - let beta := mload(BETA_MPTR) - let gamma := mload(GAMMA_MPTR) - let lhs := mulmod(calldataload(0x10c4), mulmod(addmod(calldataload(0x10e4), beta, r), addmod(calldataload(0x1124), gamma, r), r), r) - let rhs := mulmod(calldataload(0x10a4), mulmod(addmod(input, beta, r), addmod(table, gamma, r), r), r) - let eval := mulmod(addmod(1, sub(r, addmod(mload(L_BLIND_MPTR), mload(L_LAST_MPTR), r)), r), addmod(lhs, sub(r, rhs), r), r) - quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r) - } - { - let eval := mulmod(mload(L_0_MPTR), addmod(calldataload(0x10e4), sub(r, calldataload(0x1124)), r), r) - quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r) - } - { - let eval := mulmod(addmod(1, sub(r, addmod(mload(L_BLIND_MPTR), mload(L_LAST_MPTR), r)), r), mulmod(addmod(calldataload(0x10e4), sub(r, calldataload(0x1124)), r), addmod(calldataload(0x10e4), sub(r, calldataload(0x1104)), r), r), r) - quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r) - } - { - let l_0 := mload(L_0_MPTR) - let eval := addmod(l_0, mulmod(l_0, sub(r, calldataload(0x1144)), r), r) - quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r) - } - { - let l_last := mload(L_LAST_MPTR) - let eval := mulmod(l_last, addmod(mulmod(calldataload(0x1144), calldataload(0x1144), r), sub(r, calldataload(0x1144)), r), r) - quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r) - } - { - let theta := mload(THETA_MPTR) - let input - { - let a_4 := calldataload(0x0ba4) - let a_5 := calldataload(0x0bc4) - let var0 := 0x10000 - let var1 := mulmod(a_5, var0, r) - let var2 := sub(r, var1) - let var3 := addmod(a_4, var2, r) - input := var3 - } - let table - { - let f_0 := calldataload(0x0cc4) - table := f_0 - } - let beta := mload(BETA_MPTR) - let gamma := mload(GAMMA_MPTR) - let lhs := mulmod(calldataload(0x1164), mulmod(addmod(calldataload(0x1184), beta, r), addmod(calldataload(0x11c4), gamma, r), r), r) - let rhs := mulmod(calldataload(0x1144), mulmod(addmod(input, beta, r), addmod(table, gamma, r), r), r) - let eval := mulmod(addmod(1, sub(r, addmod(mload(L_BLIND_MPTR), mload(L_LAST_MPTR), r)), r), addmod(lhs, sub(r, rhs), r), r) - quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r) - } - { - let eval := mulmod(mload(L_0_MPTR), addmod(calldataload(0x1184), sub(r, calldataload(0x11c4)), r), r) - quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r) - } - { - let eval := mulmod(addmod(1, sub(r, addmod(mload(L_BLIND_MPTR), mload(L_LAST_MPTR), r)), r), mulmod(addmod(calldataload(0x1184), sub(r, calldataload(0x11c4)), r), addmod(calldataload(0x1184), sub(r, calldataload(0x11a4)), r), r), r) - quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r) - } - { - let l_0 := mload(L_0_MPTR) - let eval := addmod(l_0, mulmod(l_0, sub(r, calldataload(0x11e4)), r), r) - quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r) - } - { - let l_last := mload(L_LAST_MPTR) - let eval := mulmod(l_last, addmod(mulmod(calldataload(0x11e4), calldataload(0x11e4), r), sub(r, calldataload(0x11e4)), r), r) - quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r) - } - { - let theta := mload(THETA_MPTR) - let input - { - let a_5 := calldataload(0x0bc4) - let a_6 := calldataload(0x0be4) - let var0 := 0x10000 - let var1 := mulmod(a_6, var0, r) - let var2 := sub(r, var1) - let var3 := addmod(a_5, var2, r) - input := var3 - } - let table - { - let f_0 := calldataload(0x0cc4) - table := f_0 - } - let beta := mload(BETA_MPTR) - let gamma := mload(GAMMA_MPTR) - let lhs := mulmod(calldataload(0x1204), mulmod(addmod(calldataload(0x1224), beta, r), addmod(calldataload(0x1264), gamma, r), r), r) - let rhs := mulmod(calldataload(0x11e4), mulmod(addmod(input, beta, r), addmod(table, gamma, r), r), r) - let eval := mulmod(addmod(1, sub(r, addmod(mload(L_BLIND_MPTR), mload(L_LAST_MPTR), r)), r), addmod(lhs, sub(r, rhs), r), r) - quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r) - } - { - let eval := mulmod(mload(L_0_MPTR), addmod(calldataload(0x1224), sub(r, calldataload(0x1264)), r), r) - quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r) - } - { - let eval := mulmod(addmod(1, sub(r, addmod(mload(L_BLIND_MPTR), mload(L_LAST_MPTR), r)), r), mulmod(addmod(calldataload(0x1224), sub(r, calldataload(0x1264)), r), addmod(calldataload(0x1224), sub(r, calldataload(0x1244)), r), r), r) - quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r) - } - { - let l_0 := mload(L_0_MPTR) - let eval := addmod(l_0, mulmod(l_0, sub(r, calldataload(0x1284)), r), r) - quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r) - } - { - let l_last := mload(L_LAST_MPTR) - let eval := mulmod(l_last, addmod(mulmod(calldataload(0x1284), calldataload(0x1284), r), sub(r, calldataload(0x1284)), r), r) - quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r) - } - { - let theta := mload(THETA_MPTR) - let input - { - let a_2 := calldataload(0x0ca4) - let a_7 := calldataload(0x0c24) - let var0 := 0x10000 - let var1 := mulmod(a_7, var0, r) - let var2 := sub(r, var1) - let var3 := addmod(a_2, var2, r) - input := var3 - } - let table - { - let f_0 := calldataload(0x0cc4) - table := f_0 - } - let beta := mload(BETA_MPTR) - let gamma := mload(GAMMA_MPTR) - let lhs := mulmod(calldataload(0x12a4), mulmod(addmod(calldataload(0x12c4), beta, r), addmod(calldataload(0x1304), gamma, r), r), r) - let rhs := mulmod(calldataload(0x1284), mulmod(addmod(input, beta, r), addmod(table, gamma, r), r), r) - let eval := mulmod(addmod(1, sub(r, addmod(mload(L_BLIND_MPTR), mload(L_LAST_MPTR), r)), r), addmod(lhs, sub(r, rhs), r), r) - quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r) - } - { - let eval := mulmod(mload(L_0_MPTR), addmod(calldataload(0x12c4), sub(r, calldataload(0x1304)), r), r) - quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r) - } - { - let eval := mulmod(addmod(1, sub(r, addmod(mload(L_BLIND_MPTR), mload(L_LAST_MPTR), r)), r), mulmod(addmod(calldataload(0x12c4), sub(r, calldataload(0x1304)), r), addmod(calldataload(0x12c4), sub(r, calldataload(0x12e4)), r), r), r) - quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r) - } - { - let l_0 := mload(L_0_MPTR) - let eval := addmod(l_0, mulmod(l_0, sub(r, calldataload(0x1324)), r), r) - quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r) - } - { - let l_last := mload(L_LAST_MPTR) - let eval := mulmod(l_last, addmod(mulmod(calldataload(0x1324), calldataload(0x1324), r), sub(r, calldataload(0x1324)), r), r) - quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r) - } - { - let theta := mload(THETA_MPTR) - let input - { - let a_7 := calldataload(0x0c24) - let a_8 := calldataload(0x0c44) - let var0 := 0x10000 - let var1 := mulmod(a_8, var0, r) - let var2 := sub(r, var1) - let var3 := addmod(a_7, var2, r) - input := var3 - } - let table - { - let f_0 := calldataload(0x0cc4) - table := f_0 - } - let beta := mload(BETA_MPTR) - let gamma := mload(GAMMA_MPTR) - let lhs := mulmod(calldataload(0x1344), mulmod(addmod(calldataload(0x1364), beta, r), addmod(calldataload(0x13a4), gamma, r), r), r) - let rhs := mulmod(calldataload(0x1324), mulmod(addmod(input, beta, r), addmod(table, gamma, r), r), r) - let eval := mulmod(addmod(1, sub(r, addmod(mload(L_BLIND_MPTR), mload(L_LAST_MPTR), r)), r), addmod(lhs, sub(r, rhs), r), r) - quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r) - } - { - let eval := mulmod(mload(L_0_MPTR), addmod(calldataload(0x1364), sub(r, calldataload(0x13a4)), r), r) - quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r) - } - { - let eval := mulmod(addmod(1, sub(r, addmod(mload(L_BLIND_MPTR), mload(L_LAST_MPTR), r)), r), mulmod(addmod(calldataload(0x1364), sub(r, calldataload(0x13a4)), r), addmod(calldataload(0x1364), sub(r, calldataload(0x1384)), r), r), r) - quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r) - } - { - let l_0 := mload(L_0_MPTR) - let eval := addmod(l_0, mulmod(l_0, sub(r, calldataload(0x13c4)), r), r) - quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r) - } - { - let l_last := mload(L_LAST_MPTR) - let eval := mulmod(l_last, addmod(mulmod(calldataload(0x13c4), calldataload(0x13c4), r), sub(r, calldataload(0x13c4)), r), r) - quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r) - } - { - let theta := mload(THETA_MPTR) - let input - { - let a_8 := calldataload(0x0c44) - let a_9 := calldataload(0x0c64) - let var0 := 0x10000 - let var1 := mulmod(a_9, var0, r) - let var2 := sub(r, var1) - let var3 := addmod(a_8, var2, r) - input := var3 - } - let table - { - let f_0 := calldataload(0x0cc4) - table := f_0 - } - let beta := mload(BETA_MPTR) - let gamma := mload(GAMMA_MPTR) - let lhs := mulmod(calldataload(0x13e4), mulmod(addmod(calldataload(0x1404), beta, r), addmod(calldataload(0x1444), gamma, r), r), r) - let rhs := mulmod(calldataload(0x13c4), mulmod(addmod(input, beta, r), addmod(table, gamma, r), r), r) - let eval := mulmod(addmod(1, sub(r, addmod(mload(L_BLIND_MPTR), mload(L_LAST_MPTR), r)), r), addmod(lhs, sub(r, rhs), r), r) - quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r) - } - { - let eval := mulmod(mload(L_0_MPTR), addmod(calldataload(0x1404), sub(r, calldataload(0x1444)), r), r) - quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r) - } - { - let eval := mulmod(addmod(1, sub(r, addmod(mload(L_BLIND_MPTR), mload(L_LAST_MPTR), r)), r), mulmod(addmod(calldataload(0x1404), sub(r, calldataload(0x1444)), r), addmod(calldataload(0x1404), sub(r, calldataload(0x1424)), r), r), r) - quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r) - } - { - let l_0 := mload(L_0_MPTR) - let eval := addmod(l_0, mulmod(l_0, sub(r, calldataload(0x1464)), r), r) - quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r) - } - { - let l_last := mload(L_LAST_MPTR) - let eval := mulmod(l_last, addmod(mulmod(calldataload(0x1464), calldataload(0x1464), r), sub(r, calldataload(0x1464)), r), r) - quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r) - } - { - let theta := mload(THETA_MPTR) - let input - { - let a_9 := calldataload(0x0c64) - let a_10 := calldataload(0x0c84) - let var0 := 0x10000 - let var1 := mulmod(a_10, var0, r) - let var2 := sub(r, var1) - let var3 := addmod(a_9, var2, r) - input := var3 - } - let table - { - let f_0 := calldataload(0x0cc4) - table := f_0 - } - let beta := mload(BETA_MPTR) - let gamma := mload(GAMMA_MPTR) - let lhs := mulmod(calldataload(0x1484), mulmod(addmod(calldataload(0x14a4), beta, r), addmod(calldataload(0x14e4), gamma, r), r), r) - let rhs := mulmod(calldataload(0x1464), mulmod(addmod(input, beta, r), addmod(table, gamma, r), r), r) - let eval := mulmod(addmod(1, sub(r, addmod(mload(L_BLIND_MPTR), mload(L_LAST_MPTR), r)), r), addmod(lhs, sub(r, rhs), r), r) - quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r) - } - { - let eval := mulmod(mload(L_0_MPTR), addmod(calldataload(0x14a4), sub(r, calldataload(0x14e4)), r), r) - quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r) - } - { - let eval := mulmod(addmod(1, sub(r, addmod(mload(L_BLIND_MPTR), mload(L_LAST_MPTR), r)), r), mulmod(addmod(calldataload(0x14a4), sub(r, calldataload(0x14e4)), r), addmod(calldataload(0x14a4), sub(r, calldataload(0x14c4)), r), r), r) - quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r) - } - - pop(y) - pop(delta) - - let quotient_eval := mulmod(quotient_eval_numer, mload(X_N_MINUS_1_INV_MPTR), r) - mstore(QUOTIENT_EVAL_MPTR, quotient_eval) - } - - // Compute quotient commitment - { - mstore(0x00, calldataload(LAST_QUOTIENT_X_CPTR)) - mstore(0x20, calldataload(add(LAST_QUOTIENT_X_CPTR, 0x20))) - let x_n := mload(X_N_MPTR) - for - { - let cptr := sub(LAST_QUOTIENT_X_CPTR, 0x40) - let cptr_end := sub(FIRST_QUOTIENT_X_CPTR, 0x40) - } - lt(cptr_end, cptr) - {} - { - success := ec_mul_acc(success, x_n) - success := ec_add_acc(success, calldataload(cptr), calldataload(add(cptr, 0x20))) - cptr := sub(cptr, 0x40) - } - mstore(QUOTIENT_X_MPTR, mload(0x00)) - mstore(QUOTIENT_Y_MPTR, mload(0x20)) - } - - // Compute pairing lhs and rhs - { - { - let x := mload(X_MPTR) - let omega := mload(OMEGA_MPTR) - let omega_inv := mload(OMEGA_INV_MPTR) - let x_pow_of_omega := mulmod(x, omega, r) - mstore(0x0360, x_pow_of_omega) - mstore(0x0340, x) - x_pow_of_omega := mulmod(x, omega_inv, r) - mstore(0x0320, x_pow_of_omega) - x_pow_of_omega := mulmod(x_pow_of_omega, omega_inv, r) - x_pow_of_omega := mulmod(x_pow_of_omega, omega_inv, r) - x_pow_of_omega := mulmod(x_pow_of_omega, omega_inv, r) - x_pow_of_omega := mulmod(x_pow_of_omega, omega_inv, r) - x_pow_of_omega := mulmod(x_pow_of_omega, omega_inv, r) - mstore(0x0300, x_pow_of_omega) - } - { - let mu := mload(MU_MPTR) - for - { - let mptr := 0x0380 - let mptr_end := 0x0400 - let point_mptr := 0x0300 - } - lt(mptr, mptr_end) - { - mptr := add(mptr, 0x20) - point_mptr := add(point_mptr, 0x20) - } - { - mstore(mptr, addmod(mu, sub(r, mload(point_mptr)), r)) - } - let s - s := mload(0x03c0) - mstore(0x0400, s) - let diff - diff := mload(0x0380) - diff := mulmod(diff, mload(0x03a0), r) - diff := mulmod(diff, mload(0x03e0), r) - mstore(0x0420, diff) - mstore(0x00, diff) - diff := mload(0x03a0) - mstore(0x0440, diff) - diff := mload(0x0380) - diff := mulmod(diff, mload(0x03a0), r) - mstore(0x0460, diff) - diff := mload(0x0380) - diff := mulmod(diff, mload(0x03e0), r) - mstore(0x0480, diff) - } - { - let point_2 := mload(0x0340) - let coeff - coeff := 1 - coeff := mulmod(coeff, mload(0x03c0), r) - mstore(0x20, coeff) - } - { - let point_0 := mload(0x0300) - let point_2 := mload(0x0340) - let point_3 := mload(0x0360) - let coeff - coeff := addmod(point_0, sub(r, point_2), r) - coeff := mulmod(coeff, addmod(point_0, sub(r, point_3), r), r) - coeff := mulmod(coeff, mload(0x0380), r) - mstore(0x40, coeff) - coeff := addmod(point_2, sub(r, point_0), r) - coeff := mulmod(coeff, addmod(point_2, sub(r, point_3), r), r) - coeff := mulmod(coeff, mload(0x03c0), r) - mstore(0x60, coeff) - coeff := addmod(point_3, sub(r, point_0), r) - coeff := mulmod(coeff, addmod(point_3, sub(r, point_2), r), r) - coeff := mulmod(coeff, mload(0x03e0), r) - mstore(0x80, coeff) - } - { - let point_2 := mload(0x0340) - let point_3 := mload(0x0360) - let coeff - coeff := addmod(point_2, sub(r, point_3), r) - coeff := mulmod(coeff, mload(0x03c0), r) - mstore(0xa0, coeff) - coeff := addmod(point_3, sub(r, point_2), r) - coeff := mulmod(coeff, mload(0x03e0), r) - mstore(0xc0, coeff) - } - { - let point_1 := mload(0x0320) - let point_2 := mload(0x0340) - let coeff - coeff := addmod(point_1, sub(r, point_2), r) - coeff := mulmod(coeff, mload(0x03a0), r) - mstore(0xe0, coeff) - coeff := addmod(point_2, sub(r, point_1), r) - coeff := mulmod(coeff, mload(0x03c0), r) - mstore(0x0100, coeff) - } - { - success := batch_invert(success, 0, 0x0120, r) - let diff_0_inv := mload(0x00) - mstore(0x0420, diff_0_inv) - for - { - let mptr := 0x0440 - let mptr_end := 0x04a0 - } - lt(mptr, mptr_end) - { mptr := add(mptr, 0x20) } - { - mstore(mptr, mulmod(mload(mptr), diff_0_inv, r)) - } - } - { - let coeff := mload(0x20) - let zeta := mload(ZETA_MPTR) - let r_eval := 0 - r_eval := addmod(r_eval, mulmod(coeff, calldataload(0x0ce4), r), r) - r_eval := mulmod(r_eval, zeta, r) - r_eval := addmod(r_eval, mulmod(coeff, mload(QUOTIENT_EVAL_MPTR), r), r) - for - { - let mptr := 0x0e24 - let mptr_end := 0x0ce4 - } - lt(mptr_end, mptr) - { mptr := sub(mptr, 0x20) } - { - r_eval := addmod(mulmod(r_eval, zeta, r), mulmod(coeff, calldataload(mptr), r), r) - } - r_eval := mulmod(r_eval, zeta, r) - r_eval := addmod(r_eval, mulmod(coeff, calldataload(0x0cc4), r), r) - r_eval := mulmod(r_eval, zeta, r) - r_eval := addmod(r_eval, mulmod(coeff, calldataload(0x14e4), r), r) - r_eval := mulmod(r_eval, zeta, r) - r_eval := addmod(r_eval, mulmod(coeff, calldataload(0x1444), r), r) - r_eval := mulmod(r_eval, zeta, r) - r_eval := addmod(r_eval, mulmod(coeff, calldataload(0x13a4), r), r) - r_eval := mulmod(r_eval, zeta, r) - r_eval := addmod(r_eval, mulmod(coeff, calldataload(0x1304), r), r) - r_eval := mulmod(r_eval, zeta, r) - r_eval := addmod(r_eval, mulmod(coeff, calldataload(0x1264), r), r) - r_eval := mulmod(r_eval, zeta, r) - r_eval := addmod(r_eval, mulmod(coeff, calldataload(0x11c4), r), r) - r_eval := mulmod(r_eval, zeta, r) - r_eval := addmod(r_eval, mulmod(coeff, calldataload(0x1124), r), r) - r_eval := mulmod(r_eval, zeta, r) - r_eval := addmod(r_eval, mulmod(coeff, calldataload(0x1084), r), r) - for - { - let mptr := 0x0ca4 - let mptr_end := 0x0b64 - } - lt(mptr_end, mptr) - { mptr := sub(mptr, 0x20) } - { - r_eval := addmod(mulmod(r_eval, zeta, r), mulmod(coeff, calldataload(mptr), r), r) - } - mstore(0x04a0, r_eval) - } - { - let zeta := mload(ZETA_MPTR) - let r_eval := 0 - r_eval := addmod(r_eval, mulmod(mload(0x40), calldataload(0x0fa4), r), r) - r_eval := addmod(r_eval, mulmod(mload(0x60), calldataload(0x0f64), r), r) - r_eval := addmod(r_eval, mulmod(mload(0x80), calldataload(0x0f84), r), r) - r_eval := mulmod(r_eval, zeta, r) - r_eval := addmod(r_eval, mulmod(mload(0x40), calldataload(0x0f44), r), r) - r_eval := addmod(r_eval, mulmod(mload(0x60), calldataload(0x0f04), r), r) - r_eval := addmod(r_eval, mulmod(mload(0x80), calldataload(0x0f24), r), r) - r_eval := mulmod(r_eval, zeta, r) - r_eval := addmod(r_eval, mulmod(mload(0x40), calldataload(0x0ee4), r), r) - r_eval := addmod(r_eval, mulmod(mload(0x60), calldataload(0x0ea4), r), r) - r_eval := addmod(r_eval, mulmod(mload(0x80), calldataload(0x0ec4), r), r) - r_eval := mulmod(r_eval, zeta, r) - r_eval := addmod(r_eval, mulmod(mload(0x40), calldataload(0x0e84), r), r) - r_eval := addmod(r_eval, mulmod(mload(0x60), calldataload(0x0e44), r), r) - r_eval := addmod(r_eval, mulmod(mload(0x80), calldataload(0x0e64), r), r) - r_eval := mulmod(r_eval, mload(0x0440), r) - mstore(0x04c0, r_eval) - } - { - let zeta := mload(ZETA_MPTR) - let r_eval := 0 - r_eval := addmod(r_eval, mulmod(mload(0xa0), calldataload(0x1464), r), r) - r_eval := addmod(r_eval, mulmod(mload(0xc0), calldataload(0x1484), r), r) - r_eval := mulmod(r_eval, zeta, r) - r_eval := addmod(r_eval, mulmod(mload(0xa0), calldataload(0x13c4), r), r) - r_eval := addmod(r_eval, mulmod(mload(0xc0), calldataload(0x13e4), r), r) - r_eval := mulmod(r_eval, zeta, r) - r_eval := addmod(r_eval, mulmod(mload(0xa0), calldataload(0x1324), r), r) - r_eval := addmod(r_eval, mulmod(mload(0xc0), calldataload(0x1344), r), r) - r_eval := mulmod(r_eval, zeta, r) - r_eval := addmod(r_eval, mulmod(mload(0xa0), calldataload(0x1284), r), r) - r_eval := addmod(r_eval, mulmod(mload(0xc0), calldataload(0x12a4), r), r) - r_eval := mulmod(r_eval, zeta, r) - r_eval := addmod(r_eval, mulmod(mload(0xa0), calldataload(0x11e4), r), r) - r_eval := addmod(r_eval, mulmod(mload(0xc0), calldataload(0x1204), r), r) - r_eval := mulmod(r_eval, zeta, r) - r_eval := addmod(r_eval, mulmod(mload(0xa0), calldataload(0x1144), r), r) - r_eval := addmod(r_eval, mulmod(mload(0xc0), calldataload(0x1164), r), r) - r_eval := mulmod(r_eval, zeta, r) - r_eval := addmod(r_eval, mulmod(mload(0xa0), calldataload(0x10a4), r), r) - r_eval := addmod(r_eval, mulmod(mload(0xc0), calldataload(0x10c4), r), r) - r_eval := mulmod(r_eval, zeta, r) - r_eval := addmod(r_eval, mulmod(mload(0xa0), calldataload(0x1004), r), r) - r_eval := addmod(r_eval, mulmod(mload(0xc0), calldataload(0x1024), r), r) - r_eval := mulmod(r_eval, zeta, r) - r_eval := addmod(r_eval, mulmod(mload(0xa0), calldataload(0x0fc4), r), r) - r_eval := addmod(r_eval, mulmod(mload(0xc0), calldataload(0x0fe4), r), r) - r_eval := mulmod(r_eval, mload(0x0460), r) - mstore(0x04e0, r_eval) - } - { - let zeta := mload(ZETA_MPTR) - let r_eval := 0 - r_eval := addmod(r_eval, mulmod(mload(0xe0), calldataload(0x14c4), r), r) - r_eval := addmod(r_eval, mulmod(mload(0x0100), calldataload(0x14a4), r), r) - r_eval := mulmod(r_eval, zeta, r) - r_eval := addmod(r_eval, mulmod(mload(0xe0), calldataload(0x1424), r), r) - r_eval := addmod(r_eval, mulmod(mload(0x0100), calldataload(0x1404), r), r) - r_eval := mulmod(r_eval, zeta, r) - r_eval := addmod(r_eval, mulmod(mload(0xe0), calldataload(0x1384), r), r) - r_eval := addmod(r_eval, mulmod(mload(0x0100), calldataload(0x1364), r), r) - r_eval := mulmod(r_eval, zeta, r) - r_eval := addmod(r_eval, mulmod(mload(0xe0), calldataload(0x12e4), r), r) - r_eval := addmod(r_eval, mulmod(mload(0x0100), calldataload(0x12c4), r), r) - r_eval := mulmod(r_eval, zeta, r) - r_eval := addmod(r_eval, mulmod(mload(0xe0), calldataload(0x1244), r), r) - r_eval := addmod(r_eval, mulmod(mload(0x0100), calldataload(0x1224), r), r) - r_eval := mulmod(r_eval, zeta, r) - r_eval := addmod(r_eval, mulmod(mload(0xe0), calldataload(0x11a4), r), r) - r_eval := addmod(r_eval, mulmod(mload(0x0100), calldataload(0x1184), r), r) - r_eval := mulmod(r_eval, zeta, r) - r_eval := addmod(r_eval, mulmod(mload(0xe0), calldataload(0x1104), r), r) - r_eval := addmod(r_eval, mulmod(mload(0x0100), calldataload(0x10e4), r), r) - r_eval := mulmod(r_eval, zeta, r) - r_eval := addmod(r_eval, mulmod(mload(0xe0), calldataload(0x1064), r), r) - r_eval := addmod(r_eval, mulmod(mload(0x0100), calldataload(0x1044), r), r) - r_eval := mulmod(r_eval, mload(0x0480), r) - mstore(0x0500, r_eval) - } - { - let sum := mload(0x20) - mstore(0x0520, sum) - } - { - let sum := mload(0x40) - sum := addmod(sum, mload(0x60), r) - sum := addmod(sum, mload(0x80), r) - mstore(0x0540, sum) - } - { - let sum := mload(0xa0) - sum := addmod(sum, mload(0xc0), r) - mstore(0x0560, sum) - } - { - let sum := mload(0xe0) - sum := addmod(sum, mload(0x0100), r) - mstore(0x0580, sum) - } - { - for - { - let mptr := 0x00 - let mptr_end := 0x80 - let sum_mptr := 0x0520 - } - lt(mptr, mptr_end) - { - mptr := add(mptr, 0x20) - sum_mptr := add(sum_mptr, 0x20) - } - { - mstore(mptr, mload(sum_mptr)) - } - success := batch_invert(success, 0, 0x80, r) - let r_eval := mulmod(mload(0x60), mload(0x0500), r) - for - { - let sum_inv_mptr := 0x40 - let sum_inv_mptr_end := 0x80 - let r_eval_mptr := 0x04e0 - } - lt(sum_inv_mptr, sum_inv_mptr_end) - { - sum_inv_mptr := sub(sum_inv_mptr, 0x20) - r_eval_mptr := sub(r_eval_mptr, 0x20) - } - { - r_eval := mulmod(r_eval, mload(NU_MPTR), r) - r_eval := addmod(r_eval, mulmod(mload(sum_inv_mptr), mload(r_eval_mptr), r), r) - } - mstore(R_EVAL_MPTR, r_eval) - } - { - let nu := mload(NU_MPTR) - mstore(0x00, calldataload(0x0a84)) - mstore(0x20, calldataload(0x0aa4)) - success := ec_mul_acc(success, mload(ZETA_MPTR)) - success := ec_add_acc(success, mload(QUOTIENT_X_MPTR), mload(QUOTIENT_Y_MPTR)) - for - { - let mptr := 0x0ec0 - let mptr_end := 0x0c00 - } - lt(mptr_end, mptr) - { mptr := sub(mptr, 0x40) } - { - success := ec_mul_acc(success, mload(ZETA_MPTR)) - success := ec_add_acc(success, mload(mptr), mload(add(mptr, 0x20))) - } - success := ec_mul_acc(success, mload(ZETA_MPTR)) - success := ec_add_acc(success, calldataload(0x0704), calldataload(0x0724)) - success := ec_mul_acc(success, mload(ZETA_MPTR)) - success := ec_add_acc(success, calldataload(0x0684), calldataload(0x06a4)) - success := ec_mul_acc(success, mload(ZETA_MPTR)) - success := ec_add_acc(success, calldataload(0x0604), calldataload(0x0624)) - success := ec_mul_acc(success, mload(ZETA_MPTR)) - success := ec_add_acc(success, calldataload(0x0584), calldataload(0x05a4)) - success := ec_mul_acc(success, mload(ZETA_MPTR)) - success := ec_add_acc(success, calldataload(0x0504), calldataload(0x0524)) - success := ec_mul_acc(success, mload(ZETA_MPTR)) - success := ec_add_acc(success, calldataload(0x0484), calldataload(0x04a4)) - success := ec_mul_acc(success, mload(ZETA_MPTR)) - success := ec_add_acc(success, calldataload(0x0404), calldataload(0x0424)) - success := ec_mul_acc(success, mload(ZETA_MPTR)) - success := ec_add_acc(success, calldataload(0x0384), calldataload(0x03a4)) - success := ec_mul_acc(success, mload(ZETA_MPTR)) - success := ec_add_acc(success, calldataload(0x0104), calldataload(0x0124)) - for - { - let mptr := 0x0304 - let mptr_end := 0x0204 - } - lt(mptr_end, mptr) - { mptr := sub(mptr, 0x40) } - { - success := ec_mul_acc(success, mload(ZETA_MPTR)) - success := ec_add_acc(success, calldataload(mptr), calldataload(add(mptr, 0x20))) - } - success := ec_mul_acc(success, mload(ZETA_MPTR)) - success := ec_add_acc(success, calldataload(0xc4), calldataload(0xe4)) - for - { - let mptr := 0x0204 - let mptr_end := 0x0104 - } - lt(mptr_end, mptr) - { mptr := sub(mptr, 0x40) } - { - success := ec_mul_acc(success, mload(ZETA_MPTR)) - success := ec_add_acc(success, calldataload(mptr), calldataload(add(mptr, 0x20))) - } - mstore(0x80, calldataload(0x0804)) - mstore(0xa0, calldataload(0x0824)) - for - { - let mptr := 0x07c4 - let mptr_end := 0x0704 - } - lt(mptr_end, mptr) - { mptr := sub(mptr, 0x40) } - { - success := ec_mul_tmp(success, mload(ZETA_MPTR)) - success := ec_add_tmp(success, calldataload(mptr), calldataload(add(mptr, 0x20))) - } - success := ec_mul_tmp(success, mulmod(nu, mload(0x0440), r)) - success := ec_add_acc(success, mload(0x80), mload(0xa0)) - nu := mulmod(nu, mload(NU_MPTR), r) - mstore(0x80, calldataload(0x0a44)) - mstore(0xa0, calldataload(0x0a64)) - for - { - let mptr := 0x0a04 - let mptr_end := 0x0804 - } - lt(mptr_end, mptr) - { mptr := sub(mptr, 0x40) } - { - success := ec_mul_tmp(success, mload(ZETA_MPTR)) - success := ec_add_tmp(success, calldataload(mptr), calldataload(add(mptr, 0x20))) - } - success := ec_mul_tmp(success, mulmod(nu, mload(0x0460), r)) - success := ec_add_acc(success, mload(0x80), mload(0xa0)) - nu := mulmod(nu, mload(NU_MPTR), r) - mstore(0x80, calldataload(0x06c4)) - mstore(0xa0, calldataload(0x06e4)) - success := ec_mul_tmp(success, mload(ZETA_MPTR)) - success := ec_add_tmp(success, calldataload(0x0644), calldataload(0x0664)) - success := ec_mul_tmp(success, mload(ZETA_MPTR)) - success := ec_add_tmp(success, calldataload(0x05c4), calldataload(0x05e4)) - success := ec_mul_tmp(success, mload(ZETA_MPTR)) - success := ec_add_tmp(success, calldataload(0x0544), calldataload(0x0564)) - success := ec_mul_tmp(success, mload(ZETA_MPTR)) - success := ec_add_tmp(success, calldataload(0x04c4), calldataload(0x04e4)) - success := ec_mul_tmp(success, mload(ZETA_MPTR)) - success := ec_add_tmp(success, calldataload(0x0444), calldataload(0x0464)) - success := ec_mul_tmp(success, mload(ZETA_MPTR)) - success := ec_add_tmp(success, calldataload(0x03c4), calldataload(0x03e4)) - success := ec_mul_tmp(success, mload(ZETA_MPTR)) - success := ec_add_tmp(success, calldataload(0x0344), calldataload(0x0364)) - success := ec_mul_tmp(success, mulmod(nu, mload(0x0480), r)) - success := ec_add_acc(success, mload(0x80), mload(0xa0)) - mstore(0x80, mload(G1_X_MPTR)) - mstore(0xa0, mload(G1_Y_MPTR)) - success := ec_mul_tmp(success, sub(r, mload(R_EVAL_MPTR))) - success := ec_add_acc(success, mload(0x80), mload(0xa0)) - mstore(0x80, calldataload(0x1504)) - mstore(0xa0, calldataload(0x1524)) - success := ec_mul_tmp(success, sub(r, mload(0x0400))) - success := ec_add_acc(success, mload(0x80), mload(0xa0)) - mstore(0x80, calldataload(0x1544)) - mstore(0xa0, calldataload(0x1564)) - success := ec_mul_tmp(success, mload(MU_MPTR)) - success := ec_add_acc(success, mload(0x80), mload(0xa0)) - mstore(PAIRING_LHS_X_MPTR, mload(0x00)) - mstore(PAIRING_LHS_Y_MPTR, mload(0x20)) - mstore(PAIRING_RHS_X_MPTR, calldataload(0x1544)) - mstore(PAIRING_RHS_Y_MPTR, calldataload(0x1564)) - } - } - - // Random linear combine with accumulator - if mload(HAS_ACCUMULATOR_MPTR) { - mstore(0x00, mload(ACC_LHS_X_MPTR)) - mstore(0x20, mload(ACC_LHS_Y_MPTR)) - mstore(0x40, mload(ACC_RHS_X_MPTR)) - mstore(0x60, mload(ACC_RHS_Y_MPTR)) - mstore(0x80, mload(PAIRING_LHS_X_MPTR)) - mstore(0xa0, mload(PAIRING_LHS_Y_MPTR)) - mstore(0xc0, mload(PAIRING_RHS_X_MPTR)) - mstore(0xe0, mload(PAIRING_RHS_Y_MPTR)) - let challenge := mod(keccak256(0x00, 0x100), r) - - // [pairing_lhs] += challenge * [acc_lhs] - success := ec_mul_acc(success, challenge) - success := ec_add_acc(success, mload(PAIRING_LHS_X_MPTR), mload(PAIRING_LHS_Y_MPTR)) - mstore(PAIRING_LHS_X_MPTR, mload(0x00)) - mstore(PAIRING_LHS_Y_MPTR, mload(0x20)) - - // [pairing_rhs] += challenge * [acc_rhs] - mstore(0x00, mload(ACC_RHS_X_MPTR)) - mstore(0x20, mload(ACC_RHS_Y_MPTR)) - success := ec_mul_acc(success, challenge) - success := ec_add_acc(success, mload(PAIRING_RHS_X_MPTR), mload(PAIRING_RHS_Y_MPTR)) - mstore(PAIRING_RHS_X_MPTR, mload(0x00)) - mstore(PAIRING_RHS_Y_MPTR, mload(0x20)) - } - - // Perform pairing - success := ec_pairing( - success, - mload(PAIRING_LHS_X_MPTR), - mload(PAIRING_LHS_Y_MPTR), - mload(PAIRING_RHS_X_MPTR), - mload(PAIRING_RHS_Y_MPTR) - ) - - // Revert if anything fails - if iszero(success) { - revert(0x00, 0x00) - } - - // Return 1 as result if everything succeeds - mstore(0x00, 1) - return(0x00, 0x20) - } - } -} \ No newline at end of file diff --git a/contracts/src/Summa.sol b/contracts/src/Summa.sol deleted file mode 100644 index 66904f83..00000000 --- a/contracts/src/Summa.sol +++ /dev/null @@ -1,285 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 -pragma solidity ^0.8.18; - -// Uncomment this line to use console.log -//import "hardhat/console.sol"; - -import "@openzeppelin/contracts/access/Ownable.sol"; - -import "./interfaces/IVerifier.sol"; -import "./interfaces/IInclusionVerifier.sol"; - -contract Summa is Ownable { - /** - * @dev Struct representing the configuration of the Summa instance - * @param cryptocurrencyNames The names of the cryptocurrencies whose balances are interpolated in the polynomials - * @param cryptocurrencyChains The chains of the cryptocurrencies whose balances are interpolated in the polynomials - * @param balanceByteRange The number of bytes used to represent the balance of a cryptocurrency in the polynomials - */ - struct SummaConfig { - string[] cryptocurrencyNames; - string[] cryptocurrencyChains; - uint8 balanceByteRange; - } - /** - * @dev Struct representing an address ownership proof submitted by the CEX - * @param cexAddress The address owned by the CEX (submitted as a string, as it can be a non-EVM address) - * @param chain The name of the chain name where the address belongs (e.g., ETH, BTC) - * @param signature The signature of the message signed by the address public key - * @param message The message signed by the address public key - */ - struct AddressOwnershipProof { - string cexAddress; - string chain; - bytes signature; - bytes message; - } - - // Summa configuration - SummaConfig public config; - - // Verification key contract address - address public immutable verifyingKey; - - // List of all address ownership proofs submitted by the CEX - AddressOwnershipProof[] public addressOwnershipProofs; - - // Liabilities commitments by timestamp submitted by the CEX - mapping(uint256 => bytes) public commitments; - - // Convenience mapping to check if an address has already been verified - mapping(bytes32 => uint256) private _ownershipProofByAddress; - - // zkSNARK verifier of the valid polynomial interpolation - IVerifier private immutable polynomialInterpolationVerifier; - - // KZG verifier of the grand sum - IVerifier private immutable grandSumVerifier; - - // KZG verifier of the inclusion proof - IInclusionVerifier private immutable inclusionVerifier; - - event AddressOwnershipProofSubmitted( - AddressOwnershipProof[] addressOwnershipProofs - ); - event LiabilitiesCommitmentSubmitted( - uint256 indexed timestamp, - uint256[] totalBalances, - bytes snarkProof, - bytes grandSumProof - ); - - /** - * Summa contract - * @param _verifyingKey The address of the verification key contract - * @param _polynomialInterpolationVerifier the address of the polynomial interpolation zkSNARK verifier - * @param _grandSumVerifier the address of the grand sum KZG verifier - * @param _inclusionVerifier the address of the inclusion KZG verifier - * @param cryptocurrencyNames the names of the cryptocurrencies whose balances are interpolated in the polynomials - * @param cryptocurrencyChains the chain names of the cryptocurrencies whose balances are interpolated in the polynomials - * @param balanceByteRange maximum accepted byte range for the balance of a cryptocurrency - */ - constructor( - address _verifyingKey, - IVerifier _polynomialInterpolationVerifier, - IVerifier _grandSumVerifier, - IInclusionVerifier _inclusionVerifier, - string[] memory cryptocurrencyNames, - string[] memory cryptocurrencyChains, - uint8 balanceByteRange - ) { - require(_verifyingKey != address(0), "Invalid verifying key address"); - verifyingKey = _verifyingKey; - require( - cryptocurrencyNames.length == cryptocurrencyChains.length, - "Cryptocurrency names and chains number mismatch" - ); - for (uint i = 0; i < cryptocurrencyNames.length; i++) { - require( - bytes(cryptocurrencyNames[i]).length != 0 && - bytes(cryptocurrencyChains[i]).length != 0, - "Invalid cryptocurrency" - ); - } - require( - validateVKPermutationsLength( - _verifyingKey, - cryptocurrencyNames.length, - balanceByteRange - ), - "The config parameters do not correspond to the verifying key" - ); - require( - address(_polynomialInterpolationVerifier) != address(0), - "Invalid polynomial interpolation verifier address" - ); - polynomialInterpolationVerifier = _polynomialInterpolationVerifier; - require( - address(_grandSumVerifier) != address(0), - "Invalid grand sum verifier address" - ); - grandSumVerifier = _grandSumVerifier; - require( - address(_inclusionVerifier) != address(0), - "Invalid inclusion verifier address" - ); - inclusionVerifier = _inclusionVerifier; - config = SummaConfig( - cryptocurrencyNames, - cryptocurrencyChains, - balanceByteRange - ); - } - - /** - * @dev Validate the number of permutations in the verifying key - * @param vkContract The address of the verifying key contract - * @param numberOfCurrencies The number of cryptocurrencies whose polynomials are committed in the proof - * @return isValid True if the number of permutations in the verifying key corresponds to the number of cryptocurrencies - */ - function validateVKPermutationsLength( - address vkContract, - uint256 numberOfCurrencies, - uint8 balanceByteRange - ) internal view returns (bool isValid) { - // The number of permutations is 2 + (balanceByteRange/2) * numberOfCurrencies because of the circuit structure: - // 1 per instance column, 1 per constant column (range check) and balanceByteRange/2 per range check columns times the number of currencies - uint256 numPermutations = 2 + - (balanceByteRange / 2) * - numberOfCurrencies; - - uint256 startOffsetForPermutations = 0x2e0; // The value can be observed in the VerificationKey contract, the offset is pointing after all the parameters and the fixed column commitment - - // The offset after the last permutation is the start offset plus the number of permutations times 0x40 (the size of a permutation) - uint256 offsetAfterLastPermutation = startOffsetForPermutations + - numPermutations * - 0x40; - - // extcodecopy is a gas-expensive operation per byte, so we want to minimize the number of bytes we read. - // This hack is to read the 32 (0x20) bytes that overlap the last permutation and the empty memory location behind it. - // For example, a circuit with 2 currencies will have 10 permutations, so the location behind the last permutation will be at 0x2e0 + 10 * 0x40 = 0x0560 - // We read 0x20 bytes starting from 0x0550, which will include a piece of the last permutation and the empty memory location behind it. - uint256 readOffset = offsetAfterLastPermutation - 0x10; - bool valid; - // Extract the last permutation - assembly { - // Read the memory location into 0x00 - extcodecopy(vkContract, 0x00, readOffset, 0x20) - // Load the read bytes from 0x00 into a variable - let readBytes := mload(0x00) - - let leftHalf := shr(128, readBytes) // Shift right by 128 bits to get the left half - let rightHalf := and(readBytes, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF) // Mask the right half - - // We expect the left 16 bytes to be nonzero and the right 16 bytes to be zero - valid := and(not(iszero(leftHalf)), iszero(rightHalf)) - } - return valid; - } - - function getAddressOwnershipProof( - bytes32 addressHash - ) public view returns (AddressOwnershipProof memory) { - require( - _ownershipProofByAddress[addressHash] > 0, - "Address not verified" - ); - // -1 comes from the fact that 0 is reserved to distinguish the case when the proof has not yet been submitted - return - addressOwnershipProofs[_ownershipProofByAddress[addressHash] - 1]; - } - - /** - * @dev Submit an optimistic proof of multiple address ownership for a CEX. The proof is subject to an off-chain verification as it's not feasible to verify the signatures of non-EVM chains in an Ethereum smart contract. - * @param _addressOwnershipProofs The list of address ownership proofs - */ - function submitProofOfAddressOwnership( - AddressOwnershipProof[] memory _addressOwnershipProofs - ) public onlyOwner { - for (uint i = 0; i < _addressOwnershipProofs.length; i++) { - bytes32 addressHash = keccak256( - abi.encodePacked(_addressOwnershipProofs[i].cexAddress) - ); - uint256 proofIndex = _ownershipProofByAddress[addressHash]; - require(proofIndex == 0, "Address already verified"); - - addressOwnershipProofs.push(_addressOwnershipProofs[i]); - _ownershipProofByAddress[addressHash] = addressOwnershipProofs - .length; - require( - bytes(_addressOwnershipProofs[i].cexAddress).length != 0 && - bytes(_addressOwnershipProofs[i].chain).length != 0 && - _addressOwnershipProofs[i].signature.length != 0 && - _addressOwnershipProofs[i].message.length != 0, - "Invalid proof of address ownership" - ); - } - - emit AddressOwnershipProofSubmitted(_addressOwnershipProofs); - } - - /** - * @dev Submit commitment for a CEX - * @param snarkProof ZK proof of the valid polynomial interpolation - * @param grandSumProof kzg proof of the grand sum - * @param totalBalances The array of total balances in the grand sum - * @param timestamp The timestamp at which the CEX took the snapshot of its assets and liabilities - */ - function submitCommitment( - bytes calldata snarkProof, - bytes calldata grandSumProof, - uint256[] memory totalBalances, - uint256 timestamp - ) public onlyOwner { - // Check input length - require(totalBalances.length > 0, "Invalid total balances length"); - require(grandSumProof.length == (totalBalances.length * 0x40), "Invalid grand sum proof length"); - require(snarkProof.length > grandSumProof.length, "Invalid snark proof length"); - - uint[] memory args = new uint[](1); - - // This is the instance value for checking zero value inside circuit - args[0] = 0; - require( - polynomialInterpolationVerifier.verifyProof(verifyingKey, snarkProof, args), - "Invalid snark proof" - ); - require( - totalBalances.length == config.cryptocurrencyNames.length, - "Liability commitments and cryptocurrencies number mismatch" - ); - - bytes calldata slicedSnarkProof = snarkProof[0:64 + grandSumProof.length]; - bytes memory combinedProofs = abi.encodePacked(grandSumProof, slicedSnarkProof[64:]); - - require(grandSumVerifier.verifyProof(verifyingKey, combinedProofs, totalBalances), "Invalid grand sum proof"); - - commitments[timestamp] = slicedSnarkProof; - - emit LiabilitiesCommitmentSubmitted(timestamp, totalBalances, slicedSnarkProof, grandSumProof); - } - - function verifyInclusionProof( - uint256 timestamp, - bytes memory inclusionProof, - uint256[] memory challenges, - uint256[] memory values - ) public view returns (bool) { - require(challenges.length == 4, "Invalid challenges length"); - - // Excluding `usename` in the values - require((values.length - 1) == config.cryptocurrencyNames.length, "Values length mismatch with config"); - - bytes memory snarkProof = commitments[timestamp]; - - bytes memory combinedProofs = new bytes(snarkProof.length + inclusionProof.length); - for (uint256 i = 0; i < inclusionProof.length; i++) { - combinedProofs[i] = inclusionProof[i]; - } - for (uint256 i = 0; i < snarkProof.length; i++) { - combinedProofs[i + inclusionProof.length] = snarkProof[i]; - } - - return inclusionVerifier.verifyProof(verifyingKey, combinedProofs, challenges, values); - } -} diff --git a/contracts/src/VerifyingKey.sol b/contracts/src/VerifyingKey.sol deleted file mode 100644 index 94ab49aa..00000000 --- a/contracts/src/VerifyingKey.sol +++ /dev/null @@ -1,55 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -contract Halo2VerifyingKey { - constructor() { - assembly { - mstore(0x0000, 0x00996ed64113d5d86f42caab0f3d25466b0856015472de4bb809f168aabc2567) // vk_digest - mstore(0x0020, 0x0000000000000000000000000000000000000000000000000000000000000011) // k - mstore(0x0040, 0x30643640b9f82f90e83b698e5ea6179c7c05542e859533b48b9953a2f5360801) // n_inv - mstore(0x0060, 0x304cd1e79cfa5b0f054e981a27ed7706e7ea6b06a7f266ef8db819c179c2c3ea) // omega - mstore(0x0080, 0x193586da872cdeff023d6ab2263a131b4780db8878be3c3b7f8f019c06fcb0fb) // omega_inv - mstore(0x00a0, 0x299110e6835fd73731fb3ce6de87151988da403c265467a96b9cda0d7daa72e4) // omega_inv_to_l - mstore(0x00c0, 0x0000000000000000000000000000000000000000000000000000000000000001) // num_instances - mstore(0x00e0, 0x0000000000000000000000000000000000000000000000000000000000000000) // has_accumulator - mstore(0x0100, 0x0000000000000000000000000000000000000000000000000000000000000000) // acc_offset - mstore(0x0120, 0x0000000000000000000000000000000000000000000000000000000000000000) // num_acc_limbs - mstore(0x0140, 0x0000000000000000000000000000000000000000000000000000000000000000) // num_acc_limb_bits - mstore(0x0160, 0x0000000000000000000000000000000000000000000000000000000000000001) // g1_x - mstore(0x0180, 0x0000000000000000000000000000000000000000000000000000000000000002) // g1_y - mstore(0x01a0, 0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2) // g2_x_1 - mstore(0x01c0, 0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed) // g2_x_2 - mstore(0x01e0, 0x090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b) // g2_y_1 - mstore(0x0200, 0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa) // g2_y_2 - mstore(0x0220, 0x26186a2d65ee4d2f9c9a5b91f86597d35f192cd120caf7e935d8443d1938e23d) // neg_s_g2_x_1 - mstore(0x0240, 0x30441fd1b5d3370482c42152a8899027716989a6996c2535bc9f7fee8aaef79e) // neg_s_g2_x_2 - mstore(0x0260, 0x16f363f103c80d7bbc8ad3c6867e0822bbc6000be91a4689755c7df40221c145) // neg_s_g2_y_1 - mstore(0x0280, 0x2b1cbb3e521edf5a622d82762a44a5e63f1e50b332d71154a4a7958d6011deff) // neg_s_g2_y_2 - mstore(0x02a0, 0x1404a2d17cd02c8f9fd79d74ac73c67d1881e62c6af354fa74d235c5e37dacfe) // fixed_comms[0].x - mstore(0x02c0, 0x2c1e30781f735e7977820d4ca9145010e28dcc808ee0f1e976477289057b7aec) // fixed_comms[0].y - mstore(0x02e0, 0x2dd3fd59098a5b4b4a616568bb6ba1a1e4c40e4b0df9ae94e37944d55ab651cf) // permutation_comms[0].x - mstore(0x0300, 0x25680c3525ba04435a9034d6e69c96de5133edfe37c226d3e31b60eff6b34ef0) // permutation_comms[0].y - mstore(0x0320, 0x1a224e6aeb9bb7de12c761fd1f49a733ff410c3f772aad6a2ec3c4decad43307) // permutation_comms[1].x - mstore(0x0340, 0x300a66b376af1187694e25dbcea3aac63114716af822fd4661519adbf9c649e9) // permutation_comms[1].y - mstore(0x0360, 0x27a7a66087a8c17b00ffb7fe9b76ba2199ca308bcb0ad100fa181886d6c9b936) // permutation_comms[2].x - mstore(0x0380, 0x23bc951a3c4307384bdec5d61be122a19c933db3266d6327a472e5203a9f785a) // permutation_comms[2].y - mstore(0x03a0, 0x0743ea40f14084db2673217283aa053f986896ee7c181f52118442e99c452974) // permutation_comms[3].x - mstore(0x03c0, 0x0203e3493a2594ece57d22cc75dd081ac68271ec7c758153cfd2152bfb5c19e3) // permutation_comms[3].y - mstore(0x03e0, 0x0f85936c44708409e3e9fb5e2a7ea6604b06997f0ac7fd488e3f147e05a88dbe) // permutation_comms[4].x - mstore(0x0400, 0x0497fbb7c4436dcf36ede6a30ad62e016e059a11a6548eb6980edeb2f1052133) // permutation_comms[4].y - mstore(0x0420, 0x0dcbacf368c01f61375c242e35edab12a22147e9d46bf685fb75454d60f5edbc) // permutation_comms[5].x - mstore(0x0440, 0x17720c95139aa3f5dec5b6bd56082f8deded2e4a1425d0a91e2743dd294fdc9c) // permutation_comms[5].y - mstore(0x0460, 0x284ac053d96a33fca69eca00e16eea75ad1bf008d2a742fc846ac73d17d46d73) // permutation_comms[6].x - mstore(0x0480, 0x14f45666a26b8d472186dbf78e606a82891e0f122a54264418cfe2615003dfb9) // permutation_comms[6].y - mstore(0x04a0, 0x1c517c335ad634422ef2eb5f615926e875afa9e9c589abf528d315a8a586b22d) // permutation_comms[7].x - mstore(0x04c0, 0x1220b1b13c91e8115106144bc417d4d3e6a9de3fb70406e68b4a5fd8a92f4327) // permutation_comms[7].y - mstore(0x04e0, 0x0cbaead666e172b1801b7ad17c3450ea2ce7d53c1e392cedf05023e59e53c95a) // permutation_comms[8].x - mstore(0x0500, 0x0ce200ab515efc390c459e0b492c15a50024c57fa70768c18389924e1e72982b) // permutation_comms[8].y - mstore(0x0520, 0x1d4848e8db74251fd01e018fedb71ca8e04c41746474ad4b4a39da132f86f30b) // permutation_comms[9].x - mstore(0x0540, 0x148a2252b7b6a07e21aa1bc5b1cc4826ac7f4a7a3e29fb7399dd7029d4bdaf27) // permutation_comms[9].y - - return(0, 0x0560) - } - } -} \ No newline at end of file diff --git a/contracts/src/interfaces/IInclusionVerifier.sol b/contracts/src/interfaces/IInclusionVerifier.sol deleted file mode 100644 index c67952f0..00000000 --- a/contracts/src/interfaces/IInclusionVerifier.sol +++ /dev/null @@ -1,22 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 -pragma solidity ^0.8.18; - -/** - * @dev Inclusion proof verifier - */ -interface IInclusionVerifier { - /** - * @dev Verify a proof - * @param vk The verification key - * @param proof The proof - * @param challenges The pre-calculated g2 points with challenge - * @param values The user data that includes userId, balance of currency - * @return true if the proof is valid, false otherwise - */ - function verifyProof( - address vk, - bytes calldata proof, - uint256[] calldata challenges, - uint256[] calldata values - ) external view returns (bool); -} diff --git a/contracts/src/interfaces/IVerifier.sol b/contracts/src/interfaces/IVerifier.sol deleted file mode 100644 index 31e3d5c9..00000000 --- a/contracts/src/interfaces/IVerifier.sol +++ /dev/null @@ -1,20 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 -pragma solidity ^0.8.18; - -/** - * @dev Zk-SNARK and grand sum proof proof verifier - */ -interface IVerifier { - /** - * @dev Verify a proof - * @param vk The verification key - * @param proof The proof - * @param instances The public inputs to the proof - * @return true if the proof is valid, false otherwise - */ - function verifyProof( - address vk, - bytes calldata proof, - uint256[] calldata instances - ) external view returns (bool); -} diff --git a/contracts/test/Summa.ts b/contracts/test/Summa.ts deleted file mode 100644 index 5b014dfc..00000000 --- a/contracts/test/Summa.ts +++ /dev/null @@ -1,495 +0,0 @@ -import { expect } from "chai"; -import { loadFixture } from "@nomicfoundation/hardhat-network-helpers"; -import { ethers } from "hardhat"; -import { Summa, Halo2VerifyingKey, Verifier, GrandSumVerifier, InclusionVerifier } from "../typechain-types"; -import { BigNumber } from "ethers"; -import { SignerWithAddress } from "@nomiclabs/hardhat-ethers/signers"; -import * as fs from "fs"; -import * as path from "path"; - -describe("Summa Contract", () => { - async function deploySummaFixture() { - // Contracts are deployed using the first signer/account by default - const [owner, addr1, addr2, addr3]: SignerWithAddress[] = - await ethers.getSigners(); - - const verifyingKey = await ethers.deployContract( - "src/VerifyingKey.sol:Halo2VerifyingKey" - ); - await verifyingKey.deployed(); - - const snarkVerifier = await ethers.deployContract( - "src/SnarkVerifier.sol:Verifier" - ); - await snarkVerifier.deployed(); - - const grandSumVerifier = await ethers.deployContract( - "src/GrandSumVerifier.sol:GrandSumVerifier" - ) as GrandSumVerifier; - await grandSumVerifier.deployed(); - - const inclusionVerifier = await ethers.deployContract( - "src/InclusionVerifier.sol:InclusionVerifier" - ) as InclusionVerifier; - await inclusionVerifier.deployed(); - - const summa = await ethers.deployContract("Summa", [ - verifyingKey.address, - snarkVerifier.address, - grandSumVerifier.address, - inclusionVerifier.address, - ["ETH", "BTC"], - ["ETH", "BTC"], - 8, // The number of bytes used to represent the balance of a cryptocurrency in the polynomials - ]); - await summa.deployed(); - - return { - summa: summa as Summa, - owner, - addr1, - addr2, - addr3, - }; - } - - describe("deployment tests", () => { - let verifyingKey: Halo2VerifyingKey; - let snarkVerifier: Verifier; - let grandSumVerifier: GrandSumVerifier; - let inclusionVerifier: InclusionVerifier; - - beforeEach(async () => { - // Deploy the verifying key and verifiers - verifyingKey = await ethers.deployContract( - "src/VerifyingKey.sol:Halo2VerifyingKey" - ) as Halo2VerifyingKey; - await verifyingKey.deployed(); - - snarkVerifier = await ethers.deployContract( - "src/SnarkVerifier.sol:Verifier" - ) as Verifier; - await snarkVerifier.deployed(); - - grandSumVerifier = await ethers.deployContract( - "src/GrandSumVerifier.sol:GrandSumVerifier" - ) as GrandSumVerifier; - await grandSumVerifier.deployed(); - - inclusionVerifier = await ethers.deployContract( - "src/InclusionVerifier.sol:InclusionVerifier" - ) as InclusionVerifier; - await inclusionVerifier.deployed(); - }); - - it("should not deploy with invalid currencies", async () => { - await expect( - ethers.deployContract("Summa", [ - verifyingKey.address, - snarkVerifier.address, - grandSumVerifier.address, - inclusionVerifier.address, - ["", "BTC"], - ["ETH", "BTC"], - 8, - ]) - ).to.be.revertedWith("Invalid cryptocurrency"); - - await expect( - ethers.deployContract("Summa", [ - verifyingKey.address, - snarkVerifier.address, - grandSumVerifier.address, - inclusionVerifier.address, - ["ETH", "BTC"], - ["ETH", ""], - 8, - ]) - ).to.be.revertedWith("Invalid cryptocurrency"); - - await expect( - ethers.deployContract("Summa", [ - verifyingKey.address, - snarkVerifier.address, - grandSumVerifier.address, - inclusionVerifier.address, - [], - ["ETH", ""], - 8, - ]) - ).to.be.revertedWith("Cryptocurrency names and chains number mismatch"); - }); - - it("should not deploy with invalid byte range", async () => { - await expect( - ethers.deployContract("Summa", [ - verifyingKey.address, - snarkVerifier.address, - grandSumVerifier.address, - inclusionVerifier.address, - ["ETH", "BTC"], - ["ETH", "BTC"], - 0, // Invalid byte range - ]) - ).to.be.revertedWith( - "The config parameters do not correspond to the verifying key" - ); - }); - - it("should not deploy with invalid verification key", async () => { - await expect( - ethers.deployContract("Summa", [ - ethers.constants.AddressZero, - snarkVerifier.address, - grandSumVerifier.address, - inclusionVerifier.address, - ["ETH", "BTC"], - ["ETH", "BTC"], - 8, - ]) - ).to.be.revertedWith("Invalid verifying key address"); - }); - - it("should not deploy with invalid snark verifier", async () => { - const verifyingKey = await ethers.deployContract( - "src/VerifyingKey.sol:Halo2VerifyingKey" - ); - await verifyingKey.deployed(); - await expect( - ethers.deployContract("Summa", [ - verifyingKey.address, - ethers.constants.AddressZero, - grandSumVerifier.address, - inclusionVerifier.address, - ["ETH", "BTC"], - ["ETH", "BTC"], - 8, - ]) - ).to.be.revertedWith("Invalid polynomial interpolation verifier address"); - }); - - - it("should not deploy with invalid grand sum verifier", async () => { - const verifyingKey = await ethers.deployContract( - "src/VerifyingKey.sol:Halo2VerifyingKey" - ); - await verifyingKey.deployed(); - await expect( - ethers.deployContract("Summa", [ - verifyingKey.address, - snarkVerifier.address, - ethers.constants.AddressZero, - inclusionVerifier.address, - ["ETH", "BTC"], - ["ETH", "BTC"], - 8, - ]) - ).to.be.revertedWith("Invalid grand sum verifier address"); - }); - - it("should not deploy with invalid inclusion verifier", async () => { - await expect( - ethers.deployContract("Summa", [ - verifyingKey.address, - snarkVerifier.address, - grandSumVerifier.address, - ethers.constants.AddressZero, - ["ETH", "BTC"], - ["ETH", "BTC"], - 8, - ]) - ).to.be.revertedWith("Invalid inclusion verifier address"); - }); - - it("should not deploy if the number of cryptocurrencies is not matching the verification key ", async () => { - const dummyVerifyingKey = await ethers.deployContract( - "src/DummyVerifyingKey.sol:Halo2VerifyingKey" - ); - await dummyVerifyingKey.deployed(); - - await expect( - ethers.deployContract("Summa", [ - dummyVerifyingKey.address, - snarkVerifier.address, - grandSumVerifier.address, - ethers.constants.AddressZero, - ["ETH", "BTC"], - ["ETH", "BTC"], - 8, - ]) - ).to.be.revertedWith( - "The config parameters do not correspond to the verifying key" - ); - }); - }); - - describe("verify address ownership", () => { - let summa: Summa; - let account1: SignerWithAddress; - let account2: SignerWithAddress; - let account3: SignerWithAddress; - let ownedAddresses: Summa.AddressOwnershipProofStruct[]; - const message = ethers.utils.defaultAbiCoder.encode( - ["string"], - ["Summa proof of solvency for CryptoExchange"] - ); - - beforeEach(async () => { - const deploymentInfo = await loadFixture(deploySummaFixture); - summa = deploymentInfo.summa as Summa; - account1 = deploymentInfo.addr1; - account2 = deploymentInfo.addr2; - account3 = deploymentInfo.addr3; - - //Reference signing procedure for ETH: - // const message = ethers.utils.defaultAbiCoder.encode( - // ["string"], - // ["Summa proof of solvency for CryptoExchange"] - // ); - // const hashedMessage = ethers.utils.solidityKeccak256( - // ["bytes"], - // [message] - // ); - // const signature = await deploymentInfo.addr3.signMessage( - // ethers.utils.arrayify(hashedMessage) - // ); - // console.log("signature", signature); - - ownedAddresses = [ - { - chain: "ETH", - cexAddress: account1.address.toString(), - signature: - "0x089b32327d332c295dc3b8873c205b72153211de6dc1c51235782b091cefb9d06d6df2661b86a7d441cd322f125b84901486b150e684221a7b7636eb8182af551b", - message: message, - }, - { - chain: "ETH", - cexAddress: account2.address.toString(), - signature: - "0xb17a9e25265d3b88de7bfad81e7accad6e3d5612308ff83cc0fef76a34152b0444309e8fc3dea5139e49b6fc83a8553071a7af3d0cfd3fb8c1aea2a4c171729c1c", - message: message, - }, - ]; - }); - - it("should verify the address ownership and store the addresses", async () => { - await expect(summa.submitProofOfAddressOwnership(ownedAddresses)) - .to.emit(summa, "AddressOwnershipProofSubmitted") - .withArgs((ownedAddresses: any) => { - return ( - ownedAddresses[0].chain == "ETH" && - ownedAddresses[0].cexAddress == account1.address && - ownedAddresses[0].signature == - "0x089b32327d332c295dc3b8873c205b72153211de6dc1c51235782b091cefb9d06d6df2661b86a7d441cd322f125b84901486b150e684221a7b7636eb8182af551b" && - ownedAddresses[0].message == message && - ownedAddresses[1].chain == "ETH" && - ownedAddresses[1].cexAddress == account2.address && - ownedAddresses[1].signature == - "0xb17a9e25265d3b88de7bfad81e7accad6e3d5612308ff83cc0fef76a34152b0444309e8fc3dea5139e49b6fc83a8553071a7af3d0cfd3fb8c1aea2a4c171729c1c" && - ownedAddresses[1].message == message - ); - }); - - const addr1Hash = ethers.utils.solidityKeccak256( - ["string"], - [account1.address] - ); - let proofOfAddressOwnership1 = await summa.getAddressOwnershipProof( - addr1Hash - ); - expect(proofOfAddressOwnership1.chain).to.be.equal("ETH"); - expect(proofOfAddressOwnership1.cexAddress).to.be.equal(account1.address); - expect(proofOfAddressOwnership1.signature).to.be.equal( - "0x089b32327d332c295dc3b8873c205b72153211de6dc1c51235782b091cefb9d06d6df2661b86a7d441cd322f125b84901486b150e684221a7b7636eb8182af551b" - ); - expect(proofOfAddressOwnership1.message).to.be.equal(message); - const addr2Hash = ethers.utils.solidityKeccak256( - ["string"], - [account2.address] - ); - let proofOfAddressOwnership2 = await summa.getAddressOwnershipProof( - addr2Hash - ); - expect(proofOfAddressOwnership2.chain).to.be.equal("ETH"); - expect(proofOfAddressOwnership2.cexAddress).to.be.equal(account2.address); - expect(proofOfAddressOwnership2.signature).to.be.equal( - "0xb17a9e25265d3b88de7bfad81e7accad6e3d5612308ff83cc0fef76a34152b0444309e8fc3dea5139e49b6fc83a8553071a7af3d0cfd3fb8c1aea2a4c171729c1c" - ); - expect(proofOfAddressOwnership2.message).to.be.equal(message); - }); - - it("should revert if the caller is not the owner", async () => { - await expect( - summa.connect(account3).submitProofOfAddressOwnership(ownedAddresses) - ).to.be.revertedWith("Ownable: caller is not the owner"); - }); - - it("should revert if the address ownership has already been verified", async () => { - await summa.submitProofOfAddressOwnership(ownedAddresses); - await expect( - summa.submitProofOfAddressOwnership(ownedAddresses) - ).to.be.revertedWith("Address already verified"); - }); - - it("should revert if the proof of address ownership has invalid address", async () => { - ownedAddresses[0].cexAddress = ""; - await expect( - summa.submitProofOfAddressOwnership(ownedAddresses) - ).to.be.revertedWith("Invalid proof of address ownership"); - }); - - it("should revert if the proof of address ownership has invalid chain type", async () => { - ownedAddresses[0].chain = ""; - await expect( - summa.submitProofOfAddressOwnership(ownedAddresses) - ).to.be.revertedWith("Invalid proof of address ownership"); - }); - - it("should revert if the proof of address ownership has invalid signature", async () => { - ownedAddresses[0].signature = ethers.utils.toUtf8Bytes(""); - await expect( - summa.submitProofOfAddressOwnership(ownedAddresses) - ).to.be.revertedWith("Invalid proof of address ownership"); - }); - - it("should revert if the proof of address ownership has invalid message", async () => { - ownedAddresses[0].message = ethers.utils.toUtf8Bytes(""); - await expect( - summa.submitProofOfAddressOwnership(ownedAddresses) - ).to.be.revertedWith("Invalid proof of address ownership"); - }); - - it("should revert if requesting proof for unverified address", async () => { - const addr1Hash = ethers.utils.solidityKeccak256( - ["string"], - [account1.address] - ); - await expect( - summa.getAddressOwnershipProof(addr1Hash) - ).to.be.revertedWith("Address not verified"); - }); - }); - - describe("submit commitment", () => { - let rangeCheckSnarkProof: string; - let grandSumProof: string; - let totalBalances: BigNumber[]; - let summa: Summa; - - beforeEach(async () => { - const deploymentInfo = await loadFixture(deploySummaFixture); - summa = deploymentInfo.summa as Summa; - - const commitmentCalldataJson = fs.readFileSync( - path.resolve( - __dirname, - "../../prover/bin/commitment_solidity_calldata.json" - ), - "utf-8" - ); - const commitmentCalldata: any = JSON.parse(commitmentCalldataJson); - - rangeCheckSnarkProof = commitmentCalldata.range_check_snark_proof; - grandSumProof = commitmentCalldata.grand_sums_batch_proof; - totalBalances = commitmentCalldata.total_balances; - }); - - it("should submit a valid commitment", async () => { - let expect_commitment_on_contract = rangeCheckSnarkProof.slice(0, grandSumProof.length + 128); - expect(await summa.commitments(1)).to.be.equal("0x"); - await summa.submitCommitment(rangeCheckSnarkProof, grandSumProof, totalBalances, 1); - expect(await summa.commitments(1)).to.be.equal(expect_commitment_on_contract); - }); - - it("should revert when the grand sum proof length mismatches with the total balances", async () => { - - let wrong_total_balance = totalBalances.slice(0, totalBalances.length - 1); - await expect( - summa.submitCommitment(rangeCheckSnarkProof, grandSumProof, wrong_total_balance, 1) - ).to.be.revertedWith("Invalid grand sum proof length"); - - let wrong_grand_sum_proof = grandSumProof.slice(0, grandSumProof.length - 64); - await expect( - summa.submitCommitment(rangeCheckSnarkProof, wrong_grand_sum_proof, totalBalances, 1) - ).to.be.revertedWith("Invalid grand sum proof length"); - }); - - it("should revert a snark proof if its length is less than the grand sum proof", async () => { - let wrong_range_check_snark_proof = rangeCheckSnarkProof.slice(0, grandSumProof.length - 64); - await expect( - summa.submitCommitment(wrong_range_check_snark_proof, grandSumProof, totalBalances, 1) - ).to.be.revertedWith("Invalid snark proof length"); - }); - - it("should revert due to an invalid snark proof", async () => { - let wrong_range_check_snark_proof = rangeCheckSnarkProof.replace("1", "2"); - await expect( - summa.submitCommitment(wrong_range_check_snark_proof, grandSumProof, totalBalances, 1) - ).to.be.reverted; - }); - }); - - describe("verify inclusion proof", () => { - let rangeCheckSnarkProof: string; - let inclusionProof: string; - let challenges: BigNumber[]; - let values: BigNumber[]; - let summa: Summa; - - beforeEach(async () => { - const deploymentInfo = await loadFixture(deploySummaFixture); - summa = deploymentInfo.summa as Summa; - - const commitmentCalldataJson = fs.readFileSync( - path.resolve( - __dirname, - "../../prover/bin/commitment_solidity_calldata.json" - ), - "utf-8" - ); - const commitmentCalldata: any = JSON.parse(commitmentCalldataJson); - - rangeCheckSnarkProof = commitmentCalldata.range_check_snark_proof; - const grandSumProof = commitmentCalldata.grand_sums_batch_proof; - const totalBalances = commitmentCalldata.total_balances; - - const inclusionCalldataJson = fs.readFileSync( - path.resolve( - __dirname, - "../../prover/bin/inclusion_proof_solidity_calldata.json" - ), - "utf-8" - ); - const inclusionCalldata: any = JSON.parse(inclusionCalldataJson); - - await summa.submitCommitment(rangeCheckSnarkProof, grandSumProof, totalBalances, 1); - - inclusionProof = inclusionCalldata.proof; - challenges = inclusionCalldata.challenges; - values = inclusionCalldata.user_values; - }); - - // Testing verifyInclusionProof function - it("should verify inclusion proof with `verifyInclusionProof` function", async () => { - expect(await summa.verifyInclusionProof(1, inclusionProof, challenges, values)).to.be.true; - }); - - it("should not verify inclusion proof with wrong snark proof", async () => { - // No commitment is submitted at timestamp 2 - await expect(summa.verifyInclusionProof(2, inclusionProof, challenges, values)).to.be.reverted; - }); - - it("should not verify inclusion proof with wrong challenge points", async () => { - let wrongChallenges = challenges.slice(0, challenges.length - 1); - - await expect(summa.verifyInclusionProof(1, inclusionProof, wrongChallenges, values)).to.be.revertedWith("Invalid challenges length"); - }); - - it("should not verify inclusion proof with value length mismatches with config", async () => { - let wrongValues = values.slice(0, values.length - 1); - - await expect(summa.verifyInclusionProof(1, inclusionProof, challenges, wrongValues)).to.be.revertedWith("Values length mismatch with config"); - }); - }); -}); diff --git a/contracts/test/Verifiers.ts b/contracts/test/Verifiers.ts deleted file mode 100644 index 3b23c9ba..00000000 --- a/contracts/test/Verifiers.ts +++ /dev/null @@ -1,179 +0,0 @@ -import { expect } from "chai"; -import { loadFixture } from "@nomicfoundation/hardhat-network-helpers"; -import { ethers } from "hardhat"; -import { Verifier as SnarkVerifier, InclusionVerifier, GrandSumVerifier, Halo2VerifyingKey } from "../typechain-types"; -import { BigNumber } from "ethers"; -import { BytesLike } from "ethers/lib/utils"; -import * as fs from "fs"; -import * as path from "path"; - -describe("Verifier Contracts", () => { - async function deployVerifyingFixture() { - // Contracts are deployed using the first signer/account by default - const verifyingKey = await ethers.deployContract( - "src/VerifyingKey.sol:Halo2VerifyingKey", - ) as Halo2VerifyingKey; - - const commitmentJson = fs.readFileSync(path.resolve(__dirname, "../../prover/bin/commitment_solidity_calldata.json"), "utf-8"); - const commitmentCalldata = JSON.parse(commitmentJson); - - return { - verifyingKey, - commitmentCalldata, - }; - } - - - describe("Snark Proof Verifier", () => { - let snarkVerifier: SnarkVerifier; - let verifyingKey: Halo2VerifyingKey; - let commitmentCalldata: { - range_check_snark_proof: BytesLike; - grand_sums_batch_proof: BytesLike; - total_balances: BigNumber[]; - }; - beforeEach(async () => { - const deploymentInfo = await loadFixture(deployVerifyingFixture); - verifyingKey = deploymentInfo.verifyingKey; - commitmentCalldata = deploymentInfo.commitmentCalldata; - - // Deploy SnarkVerifier contract - snarkVerifier = await ethers.deployContract( - "src/SnarkVerifier.sol:Verifier" - ) as SnarkVerifier; - - await snarkVerifier.deployed(); - }); - - it("should verify snark proof", async () => { - // The verifier contract checks the number of instances in the VerifyingKey contract at 0x00c0 with the given 'instances' input - expect(await snarkVerifier.verifyProof(verifyingKey.address, commitmentCalldata.range_check_snark_proof, [0])).to.be.true; - }); - - it("should revert with invalid proof", async () => { - await expect(snarkVerifier.verifyProof(verifyingKey.address, commitmentCalldata.grand_sums_batch_proof, [1])).to.be.reverted; - }); - }); - - describe("GrandSum Proof Verifier", () => { - let grandSumVerifier: GrandSumVerifier; - let verifyingKey: Halo2VerifyingKey; - let commitmentCalldata: { - range_check_snark_proof: BytesLike; - grand_sums_batch_proof: BytesLike; - total_balances: BigNumber[]; - }; - - beforeEach(async () => { - const deploymentInfo = await loadFixture(deployVerifyingFixture); - verifyingKey = deploymentInfo.verifyingKey; - commitmentCalldata = deploymentInfo.commitmentCalldata; - - // Deploy GrandSumVerifier contract - grandSumVerifier = await ethers.deployContract( - "src/GrandSumVerifier.sol:GrandSumVerifier" - ) as GrandSumVerifier; - }); - - it("should verify grand sum proof", async () => { - // Concatenates the snark proof and the grand sum proof - let snarkProofArray = ethers.utils.arrayify(commitmentCalldata.range_check_snark_proof); - let grandSumProofArray = ethers.utils.arrayify(commitmentCalldata.grand_sums_batch_proof); - let totalBalances = commitmentCalldata.total_balances; - - // The first 64 bytes of the snark proof represent a commitment to the corresponding to the user identity - // Starting from the next 64 bytes, each set of 64 bytes represents commitments corresponding to the total sum of balances - let grandSumCommitments = snarkProofArray.slice(64, (64 + grandSumProofArray.length)); - - // The verifier iterates over points in the proofs while verifying them. - // The proofs look like: - // i = 0 1 N - // [grand_sum_proof_p1_x, grand_sum_proof_p1_y, grand_sum_proof_p2_x, grand_sum_proof_p2_y, ... grand_sum_proof_pN_x, grand_sum_proof_pN_y, ...] - // [ snark_proof_p1_x, snark_proof_p1_y, snark_proof_p2_x, snark_proof_p2_y, ... snark_proof_pN_x, snark_proof_pN_y, ...] - // Where `N` is the number of currencies - let proofs = ethers.utils.concat([grandSumProofArray, grandSumCommitments]); - - expect(await grandSumVerifier.verifyProof(verifyingKey.address, proofs, totalBalances)).to.be.not.reverted; - }); - }); - - - describe("Inclusion Proof Verifier", () => { - let inclusionVerifier: InclusionVerifier; - let verifyingKey: Halo2VerifyingKey; - let inclusionProof: BytesLike; - let commitmentCalldata: { - range_check_snark_proof: BytesLike; - grand_sums_batch_proof: BytesLike; - total_balances: BigNumber[]; - }; - let challenges: [BigNumber, BigNumber, BigNumber, BigNumber]; - let userIdBigUint: BigNumber; - let balance1: BigNumber; - let balance2: BigNumber; - - beforeEach(async () => { - const deploymentInfo = await loadFixture(deployVerifyingFixture); - verifyingKey = deploymentInfo.verifyingKey; - commitmentCalldata = deploymentInfo.commitmentCalldata; - - inclusionVerifier = await ethers.deployContract( - "src/InclusionVerifier.sol:InclusionVerifier" - ) as InclusionVerifier; - await inclusionVerifier.deployed(); - - verifyingKey = deploymentInfo.verifyingKey; - - const inclusionJson = fs.readFileSync( - path.resolve( - __dirname, - "../../prover/bin/inclusion_proof_solidity_calldata.json" - ), - "utf-8" - ); - const inclusionCalldata: any = JSON.parse(inclusionJson); - - inclusionProof = inclusionCalldata.proof; - challenges = inclusionCalldata.challenges; - userIdBigUint = inclusionCalldata.user_values[0]; - balance1 = inclusionCalldata.user_values[1]; - balance2 = inclusionCalldata.user_values[2]; - }); - - it("should verify inclusion proof", async () => { - // Generating proof with concatenated snark proof and inclusion proof - let snarkProof = commitmentCalldata.range_check_snark_proof; - - // Slice the snarkProof to match the length of inclusionProof - let proofArray = ethers.utils.arrayify(inclusionProof); - let snarkProofarray = ethers.utils.arrayify(snarkProof).slice(0, proofArray.length); - - let proofs = ethers.utils.concat([proofArray, snarkProofarray]); - - expect(await inclusionVerifier.verifyProof( - verifyingKey.address, - proofs, - [challenges[0], challenges[1], challenges[2], challenges[3]], - [userIdBigUint, balance1, balance2] - )).to.be.true; - }); - - it("should revert invalid inclusion proof", async () => { - // Generating proof with concatenated snark proof and inclusion proof - let snarkProof = commitmentCalldata.range_check_snark_proof; - - // Slice the snarkProof to match the length of inclusionProof - let proofArray = ethers.utils.arrayify(inclusionProof); - let snarkProofarray = ethers.utils.arrayify(snarkProof).slice(0, proofArray.length); - - let wrongProofs = ethers.utils.concat([snarkProofarray, snarkProofarray]); - - await expect(inclusionVerifier.verifyProof( - verifyingKey.address, - wrongProofs, - [challenges[0], challenges[1], challenges[2], challenges[3]], - [userIdBigUint, balance1, balance2] - )).to.be.reverted; - }); - }); -}); diff --git a/contracts/tsconfig.json b/contracts/tsconfig.json deleted file mode 100644 index 574e785c..00000000 --- a/contracts/tsconfig.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "compilerOptions": { - "target": "es2020", - "module": "commonjs", - "esModuleInterop": true, - "forceConsistentCasingInFileNames": true, - "strict": true, - "skipLibCheck": true, - "resolveJsonModule": true - } -} diff --git a/prover/Cargo.lock b/prover/Cargo.lock index 933aed32..e7d362d7 100644 --- a/prover/Cargo.lock +++ b/prover/Cargo.lock @@ -989,7 +989,7 @@ checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" [[package]] name = "plonkish_backend" version = "0.1.0" -source = "git+https://github.com/summa-dev/plonkish?branch=summa#fa852d0a4cd79621e5ee31ffcedd9ba348d17d5c" +source = "git+https://github.com/summa-dev/plonkish?branch=feat-read-params#64274584d00c1744bae042d3007f1f9df2bb2d30" dependencies = [ "bincode", "bitvec", @@ -1257,9 +1257,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.116" +version = "1.0.120" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e17db7126d17feb94eb3fad46bf1a96b034e8aacbc2e775fe81505f8b0b2813" +checksum = "4e0d21c9a8cae1235ad58a00c11cb40d4b1e5c784f1ef2c537876ed6ffd8b7c5" dependencies = [ "itoa", "ryu", diff --git a/prover/Cargo.toml b/prover/Cargo.toml index 5035ee31..b73cf0c9 100644 --- a/prover/Cargo.toml +++ b/prover/Cargo.toml @@ -13,7 +13,7 @@ parallel = ["dep:rayon"] frontend-halo2 = ["dep:halo2_proofs"] [dependencies] -plonkish_backend = { git = "https://github.com/summa-dev/plonkish", branch="summa", package = "plonkish_backend", features= ["frontend-halo2", "benchmark"] } +plonkish_backend = { git = "https://github.com/summa-dev/plonkish", branch="feat-read-params", package = "plonkish_backend", features= ["frontend-halo2", "benchmark"] } plotters = { version = "0.3.4", optional = true } rand = "0.8" csv = "1.1" diff --git a/prover/bin/commitment_solidity_calldata.json b/prover/bin/commitment_solidity_calldata.json deleted file mode 100644 index 1ae19c41..00000000 --- a/prover/bin/commitment_solidity_calldata.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "range_check_snark_proof": "0x1b200581ce1ccff3f92e35dddd962cbda546c1c03834ca56296e567de16461a4075d4eb1bcbb18879d8c84f3804c11e920660ae1c62e0acb20e476c903ae0a3a261b66db77d711fd90671890321022121affeaf8353d696bf4597a6d9fba617c1560b42a43ed84a13785aa23e8d95a604d7aed90b8a4dd41c15284ac81189b812d536e6e7be13957f2eb82d0ced26c44b76e3dee0b896af61f57575935a346871fb31cc9f50e9d5084bb0d2856c98aa13718b511415ecad0e00bbf66c8f6d90009b068aa48cacfb89f98f17d513735930d7a9ca7c72f5c47ca044d5f145a16721a3cd8678d4ff1328601f5246e8fdfa240975ca59d6553add481f1647dcef2a71f250fb136e25a6ac0884fc15417d2cc436a3b9fc7c57f1f4bd0353ea1249f411f7c76d365074a7c695d59edd2a7c5b9e1d9d2f1f851a3495ebbbcdf88a7e74d2cc291aad02f0ce6e69aac34cb88d35bb2f35f56f873060f47b840745d64ef950cde7ea63d577bbc926c6ebb9b10f3ba1082e6d0c17977c3dda4a9f4212f8a22000f603776df9e725b18eac4a405bd18a56cfe291e84c9b3ef90d7192d1d8b78027de76238369cc7e8759784685b5c0fb08a0a52058dcec38e4d67b64072636414b5494d7838057eb66259bb5c984e864a8b604d96d35790a7e079cc152679241cf6d45a7166853135d1ca333727e8b2353eb7e90ae8391783731d392a79063e28d451e54b553700b3a5d8f6b4fb2c069440b4e26d748d6a425b770433a47c6b03181db50c65bfcb472b070c9353228023f3766f536bc953b8c0b2ed54a879242874e7d166e7573897e65ffb943ee855df1a131f86c18da6126f551dc7e1ae192a693fae10d79f0d9d119b145871e6a6fc1143cd5b53f90a48f849727b79fab93048e2f14f00c297ade3227b32a5f2d19145d0c5c9f7ace1bef44481525a227e1f041a4fb26e18d77036ace80d4d29959a5654893185d6c6e9c1a66dcb0b874b007eeef5091b519b8e16e5877b0746d4bff497fa3022d30675d981ce513bed8628e0f67d71b6eea2c0047b1ef4b85a3ac0bf0462abc518a82ecc900f3f32ce6a21f30533df9e36688b94d1ff7c51f5530a36962556c9ec526fda390a6dec8f0502819520ddcc9722ef50731fdd0698e91d53764a0929bed7d7aab2246d287b612baf952b31fae1fd4270034332ed893d7d0ab181f7d9a68205570b60f99cfd19147ba2d8a835fae9f72a43c9db4c9a5dd3e0060fc69af8a1ec14da5c170eb12316c4f940985d6d3133f36b14e6da6ea88bacf4f26641cddf3a0a540bfe4198e2275b31cb08b7e45baadde23fb64b9bbc95e713fc1b55396a150e75b0038837c40d69af90e6144f5e7c0f2b12349f8a0acf52e21a8219aafe765d9d2f7724425a28e8c9e850b2b52a59a87ede18618b6aa8a10eac03a536e1b996767e0583839b11608307bfc8a7048e7069fe123e06ee9f72c2dcdb3c94d135f8a8f95bca6efb29a5ea36536bf72bb3039e04baddac9f49b8b46cabf9902f828b5a70416a4017005f6933903f821274efad4634fcc2ed4da97e43e6ca1eb07197920066f7d7bb115909765a3e1ea151a31f01c63e7930647424be324d3dc45458237194c38e1e1ffb93985978172ee13e425b627f9800c3eeb1a230540a67ad8d699d02227636029c959c26b504774a84ec7d2e64d7ad3f892f94c4fae8abb26935f2f2006b832af8d3a66febdcc3e5659fd28ff59ada6c7ae44f565e10e6f0a074d86402c6b4176c4853110edae31ee186904261ca3fb3794ac42f8a229422b0099486dc6e5f04314e7ec83fd1e051b33299b14c75ac2b2f5996b4ab0467c40d7978ea2c718d005dfc20f5a84b7b669ae47a3f8dc359417c62745a598ea53308377552579dea12f44b1f03372e42eb71af3e464148d4446b1c6768fc1eea18a20a7ac48d41b12cd41e17891dccaf592009218490a38c9a7b3596aa6ab9ecf4bfffce31eb125e2f339daf6e57f4093b6494784831c8846e0fe84536802805e273cbe14d8531dc12ef4ab51059fc94d959899a25ae31bcd868fca678ab710be698014ff31eee271a23055aa10c35cee8c5b9f6dc3e6277dc8742ab9db7049827e1dfa16be2d0f410e037716dd68a33493c79211c18755892db6d6a279405af7198af9e645d618724d3a287384bcd7bda940d5bfa11abde37d1e0adde6ab114aed31a05d9f2ef3924003f4918f100ddf49def61a1fc3362ddc863ef0c47edfa88444eb7e9912d9c01651316d0b3a50ae36c01955898e0533f18da2bca239959cf058a230c5ec8ad215a0df35d515b250ce2dcc58e738698d8f4ed6b4119fa04b5f224b581b2caa008a111bc65c68ad917ee74c11c57bd93414133c4f856d38d0196f26a686052b92bc59d15f547cab99b15904b5333d5d36a34bce08c8f1d0c88624d294a77d2b707e27dff709dcaa80aa6355b832e6fe4ea8492ca325551707b10f9e5bc5aab64092cd1c0fef6f4165a26c20f5c5d014432b3163fce63b2edfa62a260a40172182a928b6b21e05186bc2191cfb9862ebd6f1352ad66f1074c8f7daf06a4e3d777236e6efe6a555655996d7c1126607f9745d2c0d5466a2a5c83b7cee5ab324b0923e67df7d3799436d4435112ddd5c0abaf53d9fc2fc47734e0fd47b77e1f94ca29a14c3cc78915b9e0628c61b7d677faf49be039084d6db04afb75d5eea151cd2d21d59bc86e914bd9b3c98aff084c09fcac9b1290c5cca92f9771ca41ebbed40709fc41153455c8d86753e9752e34c29060148f8704607a6c3bd3dfddf6ceb72435f3ef8ca862b6eaae98b2fe29b51475cca9179ee06f542a044aa1e3e9d1ed1ff1f31fd1450f557ef56cb8dfe6620fe0aa7b9562e9faf479964d17c877834604ad3fe40204e4fe18ff27388a35200e07faaa9487b50d2b0afe02ffcf0ed6522f9d1d256ce6c89af49420fb379fd793c5e87a01c6541412ed0f348681c03c630b90a0e829e5c873ce97b70fe4f33aab122796c833a9e8aa15f81cc0f9d524e11ff88113a2e0325ab73455dd950276848d9f85aba0006a362c2f963cb473ba401af97c4e4d1bf6c9f70a194b41f27a145c8b69fc045953ae04296ec52bcd3b6e260d3a53f50d1f20c07f1200e2637fa545d1390ebd812771b9bebd6bb189e3990257ccaf91e84f211af01b415fb8d7d493a304cfb03824ff680b22f8ae609d621164ef9d70d88f64c9c48ef3265fdc81cd72940aa59a63c06fa63e79c74e5f2d00ce48d62a3536299dde64df718796e7425826cc487fdb1f179c61edeaf040280aa100f302519c2042d64cca4138eec8b33729f5dfc0a03e795d7cf570a8045e1eff836baf5f06c6c61cca266e976ea0eb122b5e6bd29f3c240645c5c2404e2513eb2b331f3802856bc83bbdc40a64ba6065d4a82663ac87dc08a6bc93e39e2f2767f750e2eab6e88032e0199cb35733e6ac0d17534cd413bab641f8a75534cf049faf9192f6b83cb439f5c5572aea5ce5d581371d4116f1c43ad60a1e3f163f2e15f81ab9597985951f0f063f86976b1077bbcefdf1e4d7fa477fdcc1e7d1390e260f969e8e2c7376b72fa5401ef62d30c409a2d7d579a8eb39c763c2fd84d121771983521ae3de3ad954507938271080cbf83231efb45e28c82d0cb47f1e88162e663c0d8a75e673f4b0e9d9aea6d2f82aa8c6204a695c7bf1b0f7a5bf46772faa8fb8a6e36ed22763eebf1427dd5a8c1da1bdd8fd14eca9d9e65601454ba4082a17f58d273c30f931af7885a25e8e4f2baa9f85dcc970f3cc97c946df591f09b78b7da9db60a8c54e6e1f6a030f1be20bef6e22d747c25e0d268ed3d9f93715b2a618cce6b02161dc00858ce2233068f3c83053eddb805596bd4c58466e96209f7299fdffeca7ff573e2fa41d5b8655626421145f467f05451ac19334b4260a0f443cd9704c549d8d4d96b2a1219ea4e66daec875bfd74f4bb0712e6ac5b22f6ff8564c9bb0907283b79e1dc87b48641d166c40c4e5448d4e8a84c20f120e1da1487aa706d72e4e205c36815c47675754b52b41e51fb237ae36274d12de2121ed49ec2a3cbc8ac40166687bf18acdf75e062b826b25050ebc62f402cbb21820b774f663dea6af4868efa2181eed9dc9321365a104dbe16d01ae67bcb80fe10428abe1a98b038c25a0e9fc54fec9c120a1eff63de904e6306bbfa99b6ee9ba18881a5354469eeb4feef89fa682dcdee62a33757a61d8efdde248a005442cc6247f38fe393a44f0812814b7be1f7d5ee0975060aa82a9e78602419eb5a8f6610723b52608263605d5dff29dbc80d514a99f3d0a9d4dacb07817995102047f1d29347b1317934162c2fd55c39831119eb40fa67e6f7e326fa1fa61122ceeca05144db4355935cb1d1762842b1f1e40423813cfd82113914c83966ad8486ddfcd1fe2390b2d01794e522a4c95d6483661bc24af467c5915ab1a5bf315cc7a2abb08627f170ee896b9015162a8a9d741847ed80e2848af9d632682dee79b61de361c0ba9d2513c8aa794495b3123989c10343db49ad6786f1716dde66d811974890806eea7d70f5154dba13a45816639d2c2dc2b17b6c0b3710c7deeded162de6e0c2f4b9f600209591d33208fd26e8d8c525b6f03931fc714c451b8c40d38f69d04694df2f4a14cbd76f97351c41d940c12dbc04ed654d8cf62f44afdf43dca752191c47a3cf7d2f3932c94a294538bbd2262dd65e25720de90e8f0db604192d1100da03880dbb08234529a77695c7fa3ca1b7cbbd1c347dbb0558dae5ef439ba1917cfa948c1c509f9a7e2ef3ba9d78503975d769c1934b78c741c74fc36c7a106c6942af654bbae1ddfeee473492411ea6d23f7094d280c83869a00ecda054c1992416c6808c8941b3407c22fceb6800eb8b1da9e78b4af5ed9b80af86e2351049341e779893782438dd60920e6ea219aa20cb9189855f6e410548ff582511c1a7e25ef38919457e8e23d8e90f594c68816968ffd8d4fb39aa99467fb149ed529bbe7879d39b284bf9f009b71720f426a566c81848f7bbcbcbf37061e06357c2ee53ecdab1453c7cce77e2c06972e04825d2e4336b95a5609cb08fb693638910269a4f72095076b7d46dc24743fe951485d751282d0418cabeb16ac50444d861a27552c4d6b349fe034be3fc2e35087013ef76f871845ede39ba92386b08a6a0bf6b447d95e05ad65ba15a0b1a636b1a41d6b94fddede61528842ada317b4711bcc372e891ed3cc68634ee0ddad9bbd5c2fcf0ff74cbea665414f482faaeeae09383bfb526a0c9c18a80e93f2a9440a0c398ca9548d39f1ed352d464f0809ca0dba2e2521de785c977c7979c43269fd71ec56b9afae58cf35cc465fc88e168b15e2460234bf5b91183032f4dd8c3aa15d582fa1d17bb55e446292e68565a10a024a7bb44dc8ab203969ff6f5d2b1e2a7e208de5106350fa21ec5246ac5d20e40df1f8439af5f86a6002199b9082f878e7286c1071c6588341de511fac571f5513f7c058dfc614b4f570de2a62614351ea3e664e8971a7e5d63004c9026dd400052a97f9b59d3de75552b7185b5912be32f9a49cbb5cb8f3b716c4137911bdb006bc52868e283baca4692ba389032bfe9d0a700e2f47c14a104a4ea731cabc9e23a3dff6c06ceac32421283e96970dae4f22dc3848d3834f675bbda5ba3a436618b97e5277db6e1cf10d7eb5a49f0540dcf50fc9e469957df24d69a9e790eed20f18d2e8f8d535a388019d6ea8197fe373f663819fb47255677e5585892fc4d20859f6834baf37ac4d9989960790fdf08e0989859b76196fffcff9ab80e3df3905fabb664473c9476f71bd5ef2621ed47f76d076a3ff0fe27777073243b68eeb2a14ab9c57dd4fcf758b03a35f49da50238a7c0a464dd73823abe97ea44a97bc2bbec4ca8ae8bed8200bb2da0e2fca94839b3a7cd06c3f8a7fe341e2b1194ddf23b92500bc858bcf7365a1b4ea53bec3beef3ee71f41c148cd4c382b5e48cd9c16fac06e418ec1af458c8f5b658cc117893d685826985759c1500b28137461c00fc713188ce3264701d7376f588240430bc2a3a441cd811d77218385336781e01958b3b3e68c741d9a15e5ec4d4f591d0341f6270b7ebc262e0e4507c33a73442f8279c5d8f1a3fa68b892e74931532df4d030c30e728d32e9d3e364f578c89710d858432377e59e820ccd54fcef1fe1558a09d96c6758d425b20d61020dbcdf12fb55d12da9804179e37b5eb23de9077b73f10a4de909183782a36b65ec92442930f98bd428540c05622b2a545465c000bbd9b4e70f6f9faaf5af85730e7dd203ab945c07893c6096a8b2f457d092153b54369f007997883cc4430775a70d1718241c395063816dce07ea10d4baba9884b568382b7c0efd47d95d21f8d815441a978863e211e1611841e43049ff989aa3595e64052b448f633be2b2f5c1614227d9a49cf7c6f1b53c0aad1ac041d5c734fc3f2ca2830bd6886250ccb3031747251504c8850d9b3845a76b7b77e0cedd57694098b25b30aa62d26be5f435c7ae2404c804e3805870acea4b76fc9e08a2805549b478b9e9cc3379225fb40e755d10acb7167d639d02fc954d7dfb940d8f23320026967a5eaee125318b5d53046b27d81d57642b283e33b631c8d3f8d36ba43daa3ed16a793d3f5d78afefa136d02d76c7efef3836f37ef3318b0ef2b03a6e76151ba5bf4ceef026d6fae19b369a0cb3cc3debd9e28c13999fb73d6e6913064ce706f066b3735eb9b33c7ff59752164f50f5a2274c3f2abf4e499ec60a0c365c8d00d28909b9b032deeae5fb4b0904cdd16690c9631a25828559ab5d2ff25de31fc6cd68c5f474dcf1f99a8c6c770b20baf5752cc4937046638161fafe364b8d3e2ff83024540a0c1794346e27221b4d0fb61d725325f48465ddc9250922e8784b6740fe9e3e594ff29d84a6e18b0f5c9f0895d79912e990bfbf032e29717962423ef29e5d301e7f6df98b302ef811fe513641dc7844134461fe40bd7122588ee3b5ed9bfe78ea04e4ea585eef2d248d9a64528b632f0a5e570c242dc3188c8b3cc536c7e6248fbf74e28be9baf810f6fec952208765498c1fad4de6bb42a2a60d4eb5f84c76357fb527777f320805a00fe719cad11599aa48c6ea066a8818cfe25ca6041ce3de19e319b48ef7bc30395f7ca65c24d6c6a898742cd1ed8858bf4a3f1e8d0ff948351b860768f8b52440e6f08ce61f0c72d813d09eafb2e702ee1b5a70acbd1c5dd6d06ea2d125af13e9c56d652434e16633d851b80969521d4e32e209a0caedc6b8422cf4f0c57f1a809e252787f9f6d88f9f60273268286b3d5e4ddfb534fae863dd381ef919152b9a220f12b3890b1e1a312919e9776a292c3b4bac2ff35b180d5d83232321b60d9dc75397d11aaa6d151a96028edd8060d23c3b3bd15d179e113a10b14eff8a1f27bfae91aa88a9fa6d7243244e1c1c77bbe9b28bdfd0ebcf0f0eb79b99771b0c02446010ee5bdff5d215283109f54fab077adf59a5961d48105b5c95402f3129d7b10968df0858e798858e96acacc3ba49e02dd8afaafbc45ebd0a89363365", - "grand_sums_batch_proof": "0x17e2032176f6575e95aa4d9d97293edf675fd8aad89e76d99883b4a830564e7d2ca14616b46c35c4573a4e5806a7fde693b0da39ca285023e93c2e3ee781b78b18c815403ccb3ac8188e4a1b761df4504068402c880e4a687311455818ed4ca32367d0768c54895acb9875b2b2f60d85102d455cc28f0d9d2af67ecaa4ac662f", - "total_balances": [ - "0x87f3e", - "0x87f3e" - ] -} \ No newline at end of file diff --git a/prover/bin/inclusion_proof_solidity_calldata.json b/prover/bin/inclusion_proof_solidity_calldata.json deleted file mode 100644 index 92130cc1..00000000 --- a/prover/bin/inclusion_proof_solidity_calldata.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "proof": "0x0faaa8aa92bf36e2601bdd9d5be92bb5c7aa6f982661cff0611d0bd8ccccb9bd171586516226f99958cdb181eecdfb1ce9bd48e5ae3c19aea353c163c7acf1db0938c672375247acf7a110224e1f3d0e118b289a02c8b4a0acd33a8d209dbebc01895e90be59da66f1de8e8a144047936e7393e312fbbcfe11960be9de661277150f79ec188c492fc71556342c001c2cdf89aca2df24b2f68514e1742185c2021f0479d9e8e1a3e1c14e2bac6af1c5ebd3d6c5b35c230c0cc92c554cc245a9d5", - "challenges": [ - "0xf79a0045992596e3278606b5317aaf4f6bb65071219b1c89d542509fe6dddd3", - "0x2299faaf0e21893e99005dc9165fba869b5aa88bcac5af4395071fd569686fde", - "0x2480ccf8a3834d03badc6b0c35773d758908019658fe9ea3bf85dc202257cfda", - "0x2bd763bd08804bb437e62575eff584497632e3d3034a20f2a868b1136e4adb6e" - ], - "user_id": "MBlfbBGI", - "user_values": [ - "0x4d426c6662424749", - "0x108ef", - "0x48db" - ] -} \ No newline at end of file diff --git a/prover/prints/range-check-layout.png b/prover/prints/range-check-layout.png index 579656ef..4bdffdb0 100644 Binary files a/prover/prints/range-check-layout.png and b/prover/prints/range-check-layout.png differ diff --git a/prover/prints/summa-hyperplonk-layout.png b/prover/prints/summa-hyperplonk-layout.png index 497b11f3..f16be9fe 100644 Binary files a/prover/prints/summa-hyperplonk-layout.png and b/prover/prints/summa-hyperplonk-layout.png differ diff --git a/prover/rust-toolchain b/prover/rust-toolchain new file mode 100644 index 00000000..4524b7cb --- /dev/null +++ b/prover/rust-toolchain @@ -0,0 +1 @@ +nightly-2023-07-11 \ No newline at end of file diff --git a/prover/src/circuits/summa_circuit.rs b/prover/src/circuits/summa_circuit.rs index ea6e8bdb..dbe0e0bd 100644 --- a/prover/src/circuits/summa_circuit.rs +++ b/prover/src/circuits/summa_circuit.rs @@ -112,6 +112,13 @@ pub mod summa_hyperplonk { grand_total, } } + + pub fn init_empty() -> Self { + Self { + entries: vec![Entry::init_empty(); N_USERS], + grand_total: vec![BigUint::from(0u64); N_CURRENCIES], + } + } } impl Circuit diff --git a/prover/src/circuits/tests.rs b/prover/src/circuits/tests.rs index 58c518e5..de5a3825 100644 --- a/prover/src/circuits/tests.rs +++ b/prover/src/circuits/tests.rs @@ -50,7 +50,7 @@ fn test_summa_hyperplonk() { let (circuit_info, circuit) = circuit_fn(num_vars as usize); let instances = circuit.instances(); - let param = ProvingBackend::setup(&circuit_info, seeded_std_rng()).unwrap(); + let param = ProvingBackend::setup_custom("../backend/ptau/hyperplonk-srs-17").unwrap(); let (prover_parameters, verifier_parameters) = ProvingBackend::preprocess(¶m, &circuit_info).unwrap(); @@ -102,7 +102,7 @@ fn test_summa_hyperplonk() { &verifier_parameters, &[invalid_grand_total_instances], &mut transcript, - seeded_std_rng(), + seeded_std_rng(), // This is not being used in the HyperPlonk implementation ) }; assert_eq!( @@ -169,7 +169,7 @@ fn test_summa_hyperplonk() { .unwrap(); let user_entry_polynomials = witness_polys.iter().take(num_points).collect::>(); - //Store the user index multi-variable in the transcript for the verifier + // Store the user index multi-variable in the transcript for the verifier for binary_var in multivariate_challenge.iter() { kzg_transcript.write_field_element(binary_var).unwrap(); } diff --git a/prover/src/utils/csv_parser.rs b/prover/src/utils/csv_parser.rs new file mode 100644 index 00000000..43b34895 --- /dev/null +++ b/prover/src/utils/csv_parser.rs @@ -0,0 +1,74 @@ +use num_bigint::BigUint; +use std::collections::HashMap; +use std::error::Error; +use std::fs::File; +use std::path::Path; + +use crate::cryptocurrency::Cryptocurrency; +use crate::entry::Entry; + +pub fn parse_csv_to_entries, const N_CURRENCIES: usize>( + path: P, + entries: &mut [Entry], + cryptocurrencies: &mut [Cryptocurrency], +) -> Result<(), Box> { + let file = File::open(path)?; + let mut rdr = csv::ReaderBuilder::new().from_reader(file); + + let headers = rdr.headers()?.clone(); + + // Extracting cryptocurrency names from column names + for (i, header) in headers.iter().skip(1).enumerate() { + if i >= cryptocurrencies.len() { + println!( + "Too many columns in the CSV file, expected {}, skipping the rest", + cryptocurrencies.len() + ); + break; + } + // Skipping 'username' column + let parts: Vec<&str> = header.split('_').collect(); + if parts.len() == 3 && parts[0] == "balance" { + cryptocurrencies[i] = Cryptocurrency { + name: parts[1].to_owned(), + chain: parts[2].to_owned(), + }; + } else { + // Throw an error if the header is malformed + return Err(format!("Invalid header: {}", header).into()); + } + } + + let mut balances_acc: Vec = vec![BigUint::from(0_usize); N_CURRENCIES]; + + for (i, result) in rdr.deserialize().enumerate() { + let record: HashMap = result?; + let username = record.get("username").ok_or("Username not found")?.clone(); + + let mut balances_big_int = Vec::new(); + for cryptocurrency in &mut *cryptocurrencies { + let balance_str = record + .get(format!("balance_{}_{}", cryptocurrency.name, cryptocurrency.chain).as_str()) + .ok_or(format!( + "Balance for {} on {} not found", + cryptocurrency.name, cryptocurrency.chain + ))?; + let balance = BigUint::parse_bytes(balance_str.as_bytes(), 10).ok_or(format!( + "Invalid balance for {} on {}", + cryptocurrency.name, cryptocurrency.chain + ))?; + balances_big_int.push(balance); + } + + balances_acc = balances_acc + .iter() + .zip(balances_big_int.iter()) + .map(|(x, y)| x + y) + .collect(); + + let entry = Entry::new(username, balances_big_int.try_into().unwrap())?; + entries[i] = entry; + } + + Ok(()) +} diff --git a/prover/src/utils/mod.rs b/prover/src/utils/mod.rs index 06099b77..9564b220 100644 --- a/prover/src/utils/mod.rs +++ b/prover/src/utils/mod.rs @@ -1,5 +1,7 @@ +mod csv_parser; mod dummy_entries; mod operation_helpers; +pub use csv_parser::parse_csv_to_entries; pub use dummy_entries::generate_dummy_entries; pub use operation_helpers::*; diff --git a/remappings.txt b/remappings.txt deleted file mode 100644 index 4047cd3c..00000000 --- a/remappings.txt +++ /dev/null @@ -1,2 +0,0 @@ -@openzeppelin/=contracts/node_modules/@openzeppelin -hardhat/=contracts/node_modules/hardhat \ No newline at end of file