diff --git a/.github/workflows/workflow_gnu.yml b/.github/workflows/workflow_gnu.yml new file mode 100644 index 0000000..1b5c159 --- /dev/null +++ b/.github/workflows/workflow_gnu.yml @@ -0,0 +1,111 @@ +# .github/workflows/workflow_gnu.yaml + +name: Rust CI - GNU + +on: + push: + branches: [ "listener-refined", "symbotic-bindings" ] + pull_request: + branches: [ "listener-refined", "symbotic-bindings" ] + +jobs: + check: + name: Check (GNU) + runs-on: ubuntu-latest + + steps: + - name: Checkout sources + uses: actions/checkout@v3 + + - name: Install stable toolchain + uses: actions-rs/toolchain@v1 + with: + profile: minimal + toolchain: stable + override: true + + - name: Cache Cargo registry + uses: actions/cache@v3 + with: + path: ~/.cargo/registry + key: ${{ runner.os }}-cargo-registry-${{ hashFiles('**/Cargo.lock') }} + restore-keys: | + ${{ runner.os }}-cargo-registry- + + - name: Cache Cargo git index + uses: actions/cache@v3 + with: + path: ~/.cargo/git + key: ${{ runner.os }}-cargo-git-${{ hashFiles('**/Cargo.lock') }} + restore-keys: | + ${{ runner.os }}-cargo-git- + + - name: Cache Cargo build + uses: actions/cache@v3 + with: + path: target + key: ${{ runner.os }}-cargo-build-gnu-${{ hashFiles('**/Cargo.lock') }}-v2 + restore-keys: | + ${{ runner.os }}-cargo-build-gnu- + ${{ runner.os }}-cargo-build- + + - name: Remove .cargo/config.toml if exists + run: rm -f .cargo/config.toml + + - name: Update dependencies + run: cargo update + + test: + name: Test Suite (GNU) + runs-on: ubuntu-latest + needs: check + + steps: + - name: Checkout sources + uses: actions/checkout@v3 + + - name: Install stable toolchain + uses: actions-rs/toolchain@v1 + with: + profile: minimal + toolchain: stable + override: true + + - name: Cache Cargo registry + uses: actions/cache@v3 + with: + path: ~/.cargo/registry + key: ${{ runner.os }}-cargo-registry-${{ hashFiles('**/Cargo.lock') }} + restore-keys: | + ${{ runner.os }}-cargo-registry- + + - name: Cache Cargo git index + uses: actions/cache@v3 + with: + path: ~/.cargo/git + key: ${{ runner.os }}-cargo-git-${{ hashFiles('**/Cargo.lock') }} + restore-keys: | + ${{ runner.os }}-cargo-git- + + - name: Cache Cargo build + uses: actions/cache@v3 + with: + path: target + key: ${{ runner.os }}-cargo-build-gnu-${{ hashFiles('**/Cargo.lock') }}-v2 + restore-keys: | + ${{ runner.os }}-cargo-build-gnu- + ${{ runner.os }}-cargo-build- + + - name: Remove .cargo/config.toml if exists + run: rm -f .cargo/config.toml + + - name: Update dependencies + run: cargo update + + - name: Verify Installed Targets + run: rustup target list --installed + + - name: Run cargo test + env: + RUST_BACKTRACE: 1 + run: cargo test --target x86_64-unknown-linux-gnu diff --git a/.github/workflows/workflow_macos.yml b/.github/workflows/workflow_macos.yml new file mode 100644 index 0000000..a1521df --- /dev/null +++ b/.github/workflows/workflow_macos.yml @@ -0,0 +1,117 @@ +# .github/workflows/workflow_macos.yaml + +name: Rust CI - macOS + +on: + push: + branches: [ "listener-refined", "symbotic-bindings" ] + pull_request: + branches: [ "listener-refined", "symbotic-bindings" ] + +jobs: + check: + name: Check (macOS) + runs-on: macos-latest + + steps: + - name: Checkout sources + uses: actions/checkout@v3 + + - name: Install stable toolchain + uses: actions-rs/toolchain@v1 + with: + profile: minimal + toolchain: stable + override: true + + - name: Install macOS target + run: rustup target add x86_64-apple-darwin + + - name: Cache Cargo registry + uses: actions/cache@v3 + with: + path: ~/.cargo/registry + key: ${{ runner.os }}-cargo-registry-${{ hashFiles('**/Cargo.lock') }} + restore-keys: | + ${{ runner.os }}-cargo-registry- + + - name: Cache Cargo git index + uses: actions/cache@v3 + with: + path: ~/.cargo/git + key: ${{ runner.os }}-cargo-git-${{ hashFiles('**/Cargo.lock') }} + restore-keys: | + ${{ runner.os }}-cargo-git- + + - name: Cache Cargo build + uses: actions/cache@v3 + with: + path: target + key: ${{ runner.os }}-cargo-build-macos-${{ hashFiles('**/Cargo.lock') }}-v2 + restore-keys: | + ${{ runner.os }}-cargo-build-macos- + ${{ runner.os }}-cargo-build- + + - name: Remove .cargo/config.toml if exists + run: rm -f .cargo/config.toml + + - name: Update dependencies + run: cargo update + + test: + name: Test Suite (macOS) + runs-on: macos-latest + needs: check + + steps: + - name: Checkout sources + uses: actions/checkout@v3 + + - name: Install stable toolchain + uses: actions-rs/toolchain@v1 + with: + profile: minimal + toolchain: stable + override: true + + - name: Install macOS target + run: rustup target add x86_64-apple-darwin + + - name: Cache Cargo registry + uses: actions/cache@v3 + with: + path: ~/.cargo/registry + key: ${{ runner.os }}-cargo-registry-${{ hashFiles('**/Cargo.lock') }} + restore-keys: | + ${{ runner.os }}-cargo-registry- + + - name: Cache Cargo git index + uses: actions/cache@v3 + with: + path: ~/.cargo/git + key: ${{ runner.os }}-cargo-git-${{ hashFiles('**/Cargo.lock') }} + restore-keys: | + ${{ runner.os }}-cargo-git- + + - name: Cache Cargo build + uses: actions/cache@v3 + with: + path: target + key: ${{ runner.os }}-cargo-build-macos-${{ hashFiles('**/Cargo.lock') }}-v2 + restore-keys: | + ${{ runner.os }}-cargo-build-macos- + ${{ runner.os }}-cargo-build- + + - name: Remove .cargo/config.toml if exists + run: rm -f .cargo/config.toml + + - name: Update dependencies + run: cargo update + + - name: Verify Installed Targets + run: rustup target list --installed + + - name: Run cargo test + env: + RUST_BACKTRACE: 1 + run: cargo test --target x86_64-apple-darwin diff --git a/.github/workflows/workflow_musl.yml b/.github/workflows/workflow_musl.yml new file mode 100644 index 0000000..6cff3b9 --- /dev/null +++ b/.github/workflows/workflow_musl.yml @@ -0,0 +1,123 @@ +# .github/workflows/workflow_musl.yaml + +name: Rust CI - MUSL + +on: + push: + branches: [ "listener-refined", "symbotic-bindings" ] + pull_request: + branches: [ "listener-refined", "symbotic-bindings" ] + +jobs: + check: + name: Check (MUSL) + runs-on: ubuntu-latest + + steps: + - name: Checkout sources + uses: actions/checkout@v3 + + - name: Install stable toolchain + uses: actions-rs/toolchain@v1 + with: + profile: minimal + toolchain: stable + override: true + + - name: Install musl target + run: rustup target add x86_64-unknown-linux-musl + + - name: Install musl-tools + run: sudo apt-get update && sudo apt-get install -y musl-tools + + - name: Cache Cargo registry + uses: actions/cache@v3 + with: + path: ~/.cargo/registry + key: ${{ runner.os }}-cargo-registry-${{ hashFiles('**/Cargo.lock') }} + restore-keys: | + ${{ runner.os }}-cargo-registry- + + - name: Cache Cargo git index + uses: actions/cache@v3 + with: + path: ~/.cargo/git + key: ${{ runner.os }}-cargo-git-${{ hashFiles('**/Cargo.lock') }} + restore-keys: | + ${{ runner.os }}-cargo-git- + + - name: Cache Cargo build + uses: actions/cache@v3 + with: + path: target + key: ${{ runner.os }}-cargo-build-musl-${{ hashFiles('**/Cargo.lock') }}-v2 + restore-keys: | + ${{ runner.os }}-cargo-build-musl- + ${{ runner.os }}-cargo-build- + + - name: Remove .cargo/config.toml if exists + run: rm -f .cargo/config.toml + + - name: Update dependencies + run: cargo update + + test: + name: Test Suite (MUSL) + runs-on: ubuntu-latest + needs: check + + steps: + - name: Checkout sources + uses: actions/checkout@v3 + + - name: Install stable toolchain + uses: actions-rs/toolchain@v1 + with: + profile: minimal + toolchain: stable + override: true + + - name: Install musl target + run: rustup target add x86_64-unknown-linux-musl + + - name: Install musl-tools + run: sudo apt-get update && sudo apt-get install -y musl-tools + + - name: Cache Cargo registry + uses: actions/cache@v3 + with: + path: ~/.cargo/registry + key: ${{ runner.os }}-cargo-registry-${{ hashFiles('**/Cargo.lock') }} + restore-keys: | + ${{ runner.os }}-cargo-registry- + + - name: Cache Cargo git index + uses: actions/cache@v3 + with: + path: ~/.cargo/git + key: ${{ runner.os }}-cargo-git-${{ hashFiles('**/Cargo.lock') }} + restore-keys: | + ${{ runner.os }}-cargo-git- + + - name: Cache Cargo build + uses: actions/cache@v3 + with: + path: target + key: ${{ runner.os }}-cargo-build-musl-${{ hashFiles('**/Cargo.lock') }}-v2 + restore-keys: | + ${{ runner.os }}-cargo-build-musl- + ${{ runner.os }}-cargo-build- + + - name: Remove .cargo/config.toml if exists + run: rm -f .cargo/config.toml + + - name: Update dependencies + run: cargo update + + - name: Verify Installed Targets + run: rustup target list --installed + + - name: Run cargo test + env: + RUST_BACKTRACE: 1 + run: cargo test --target x86_64-unknown-linux-musl diff --git a/.gitignore b/.gitignore index c842d3f..01d10fb 100644 --- a/.gitignore +++ b/.gitignore @@ -25,6 +25,7 @@ Cargo.lock generator_config*.json runtime_config*.json matching_engine_config*.json +matching_engine_config/ integration_checks/ivsCustomData integration_checks/ivsCustomData/* @@ -33,4 +34,7 @@ integration_checks/proverCustomData integration_checks/proverCustomData/* test.sh -test_*.sh \ No newline at end of file +test_*.sh + +/app +/app/* \ No newline at end of file diff --git a/Cargo.toml b/Cargo.toml index aebfe49..955330f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,13 +1,22 @@ [workspace] members = [ "bindings", - "matching_engine", "helper", - "matching_engine_client", - "ivs_client", - "generator_client", "listener", + "matching_engine", + "matching_engine_client", "ivs", + "ivs_client", "generator", - "integration_checks" + "generator_client", + "integration_checks", + "kalypso-cli", + "slasher", ] +resolver = "2" + +[profile.release] +strip = true +lto = true +panic = "abort" +codegen-units = 1 diff --git a/bindings/src/address.rs b/bindings/src/address.rs index d60a22c..9f8fcac 100644 --- a/bindings/src/address.rs +++ b/bindings/src/address.rs @@ -16,41 +16,19 @@ pub mod address { constructor: ::core::option::Option::None, functions: ::std::collections::BTreeMap::new(), events: ::std::collections::BTreeMap::new(), - errors: ::core::convert::From::from([ - ( - ::std::borrow::ToOwned::to_owned("AddressEmptyCode"), - ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("AddressEmptyCode"), - inputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("target"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - },], + errors: ::core::convert::From::from([( + ::std::borrow::ToOwned::to_owned("AddressEmptyCode"), + ::std::vec![::ethers::core::abi::ethabi::AbiError { + name: ::std::borrow::ToOwned::to_owned("AddressEmptyCode"), + inputs: ::std::vec![::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("target"), + kind: ::ethers::core::abi::ethabi::ParamType::Address, + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("address"), + ), },], - ), - ( - ::std::borrow::ToOwned::to_owned("AddressInsufficientBalance"), - ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("AddressInsufficientBalance",), - inputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("account"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - },], - },], - ), - ( - ::std::borrow::ToOwned::to_owned("FailedInnerCall"), - ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("FailedInnerCall"), - inputs: ::std::vec![], - },], - ), - ]), + },], + )]), receive: false, fallback: false, } @@ -59,12 +37,12 @@ pub mod address { pub static ADDRESS_ABI: ::ethers::contract::Lazy<::ethers::core::abi::Abi> = ::ethers::contract::Lazy::new(__abi); #[rustfmt::skip] - const __BYTECODE: &[u8] = b"`V`7`\x0B\x82\x82\x829\x80Q`\0\x1A`s\x14`*WcNH{q`\xE0\x1B`\0R`\0`\x04R`$`\0\xFD[0`\0R`s\x81S\x82\x81\xF3\xFEs\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x000\x14`\x80`@R`\0\x80\xFD\xFE\xA2dipfsX\"\x12 \xB3\xC4\x8D\xE8\xAA\xF7o\x9D\x1C\x8D1\x80>\x0E\x9D\xC0<\x0Ce\xB6\x06\xDDi\xAD\xC0:P\x13\xF8\xEC\xFE\xD8dsolcC\0\x08\x14\x003"; + const __BYTECODE: &[u8] = b"`V`7`\x0B\x82\x82\x829\x80Q`\0\x1A`s\x14`*WcNH{q`\xE0\x1B`\0R`\0`\x04R`$`\0\xFD[0`\0R`s\x81S\x82\x81\xF3\xFEs\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x000\x14`\x80`@R`\0\x80\xFD\xFE\xA2dipfsX\"\x12 \x06\x84J\xE0:' \xB1\x81\xA0A\xD6O,\xDD\xCB\xDE\xAFR$\xF6\x89\xC5 \x90$\x91$m\xF1r\xE1dsolcC\0\x08\x1C\x003"; /// The bytecode of the contract. pub static ADDRESS_BYTECODE: ::ethers::core::types::Bytes = ::ethers::core::types::Bytes::from_static(__BYTECODE); #[rustfmt::skip] - const __DEPLOYED_BYTECODE: &[u8] = b"s\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x000\x14`\x80`@R`\0\x80\xFD\xFE\xA2dipfsX\"\x12 \xB3\xC4\x8D\xE8\xAA\xF7o\x9D\x1C\x8D1\x80>\x0E\x9D\xC0<\x0Ce\xB6\x06\xDDi\xAD\xC0:P\x13\xF8\xEC\xFE\xD8dsolcC\0\x08\x14\x003"; + const __DEPLOYED_BYTECODE: &[u8] = b"s\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x000\x14`\x80`@R`\0\x80\xFD\xFE\xA2dipfsX\"\x12 \x06\x84J\xE0:' \xB1\x81\xA0A\xD6O,\xDD\xCB\xDE\xAFR$\xF6\x89\xC5 \x90$\x91$m\xF1r\xE1dsolcC\0\x08\x1C\x003"; /// The deployed bytecode of the contract. pub static ADDRESS_DEPLOYED_BYTECODE: ::ethers::core::types::Bytes = ::ethers::core::types::Bytes::from_static(__DEPLOYED_BYTECODE); @@ -167,144 +145,4 @@ pub mod address { pub struct AddressEmptyCode { pub target: ::ethers::core::types::Address, } - ///Custom Error type `AddressInsufficientBalance` with signature `AddressInsufficientBalance(address)` and selector `0xcd786059` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[etherror( - name = "AddressInsufficientBalance", - abi = "AddressInsufficientBalance(address)" - )] - pub struct AddressInsufficientBalance { - pub account: ::ethers::core::types::Address, - } - ///Custom Error type `FailedInnerCall` with signature `FailedInnerCall()` and selector `0x1425ea42` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[etherror(name = "FailedInnerCall", abi = "FailedInnerCall()")] - pub struct FailedInnerCall; - ///Container type for all of the contract's custom errors - #[derive( - Clone, - ::ethers::contract::EthAbiType, - serde::Serialize, - serde::Deserialize, - Debug, - PartialEq, - Eq, - Hash, - )] - pub enum AddressErrors { - AddressEmptyCode(AddressEmptyCode), - AddressInsufficientBalance(AddressInsufficientBalance), - FailedInnerCall(FailedInnerCall), - /// The standard solidity revert string, with selector - /// Error(string) -- 0x08c379a0 - RevertString(::std::string::String), - } - impl ::ethers::core::abi::AbiDecode for AddressErrors { - fn decode( - data: impl AsRef<[u8]>, - ) -> ::core::result::Result { - let data = data.as_ref(); - if let Ok(decoded) = - <::std::string::String as ::ethers::core::abi::AbiDecode>::decode(data) - { - return Ok(Self::RevertString(decoded)); - } - if let Ok(decoded) = ::decode(data) - { - return Ok(Self::AddressEmptyCode(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::AddressInsufficientBalance(decoded)); - } - if let Ok(decoded) = ::decode(data) { - return Ok(Self::FailedInnerCall(decoded)); - } - Err(::ethers::core::abi::Error::InvalidData.into()) - } - } - impl ::ethers::core::abi::AbiEncode for AddressErrors { - fn encode(self) -> ::std::vec::Vec { - match self { - Self::AddressEmptyCode(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::AddressInsufficientBalance(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::FailedInnerCall(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::RevertString(s) => ::ethers::core::abi::AbiEncode::encode(s), - } - } - } - impl ::ethers::contract::ContractRevert for AddressErrors { - fn valid_selector(selector: [u8; 4]) -> bool { - match selector { - [0x08, 0xc3, 0x79, 0xa0] => true, - _ if selector == ::selector() => { - true - } - _ if selector - == ::selector() => - { - true - } - _ if selector == ::selector() => { - true - } - _ => false, - } - } - } - impl ::core::fmt::Display for AddressErrors { - fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { - match self { - Self::AddressEmptyCode(element) => ::core::fmt::Display::fmt(element, f), - Self::AddressInsufficientBalance(element) => ::core::fmt::Display::fmt(element, f), - Self::FailedInnerCall(element) => ::core::fmt::Display::fmt(element, f), - Self::RevertString(s) => ::core::fmt::Display::fmt(s, f), - } - } - } - impl ::core::convert::From<::std::string::String> for AddressErrors { - fn from(value: String) -> Self { - Self::RevertString(value) - } - } - impl ::core::convert::From for AddressErrors { - fn from(value: AddressEmptyCode) -> Self { - Self::AddressEmptyCode(value) - } - } - impl ::core::convert::From for AddressErrors { - fn from(value: AddressInsufficientBalance) -> Self { - Self::AddressInsufficientBalance(value) - } - } - impl ::core::convert::From for AddressErrors { - fn from(value: FailedInnerCall) -> Self { - Self::FailedInnerCall(value) - } - } } diff --git a/bindings/src/attestation_auther_upgradeable.rs b/bindings/src/attestation_auther_upgradeable.rs index e4fd48e..8355487 100644 --- a/bindings/src/attestation_auther_upgradeable.rs +++ b/bindings/src/attestation_auther_upgradeable.rs @@ -411,12 +411,12 @@ pub mod attestation_auther_upgradeable { ::ethers::core::abi::Abi, > = ::ethers::contract::Lazy::new(__abi); #[rustfmt::skip] - const __BYTECODE: &[u8] = b"`\xC0`@R4\x80\x15a\0\x10W`\0\x80\xFD[P`@Qa\x0B\x828\x03\x80a\x0B\x82\x839\x81\x01`@\x81\x90Ra\0/\x91a\0EV[`\x01`\x01`\xA0\x1B\x03\x90\x91\x16`\x80R`\xA0Ra\0\x7FV[`\0\x80`@\x83\x85\x03\x12\x15a\0XW`\0\x80\xFD[\x82Q`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a\0oW`\0\x80\xFD[` \x93\x90\x93\x01Q\x92\x94\x92\x93PPPV[`\x80Q`\xA0Qa\n\xD0a\0\xB2`\09`\0\x81\x81a\x01\x1D\x01Ra\x04\x94\x01R`\0\x81\x81a\x01D\x01Ra\x05\0\x01Ra\n\xD0`\0\xF3\xFE`\x80`@R4\x80\x15a\0\x10W`\0\x80\xFD[P`\x046\x10a\0bW`\x005`\xE0\x1C\x80c\x01\xD5\x8F\xA3\x14a\0gW\x80c$\x10\xF6\xBA\x14a\0\xC2W\x80ck[!\xA6\x14a\0\xE2W\x80cu\x84{\x84\x14a\x01\x05W\x80c\x9A\xEC\x99\x0E\x14a\x01\x18W\x80c\xCDy\xF9\x06\x14a\x01?W[`\0\x80\xFD[a\0\xAFa\0u6`\x04a\x06?V[`\x01`\x01`\xA0\x1B\x03\x16`\0\x90\x81R\x7F\xC1{Kp\x8BoD%\\ \x91:\x9D\x97\xA0S\0\xB6p4,q\xFEZ\xE5\xB6\x17\xBDM\xB5P\x01` R`@\x90 T\x90V[`@Q\x90\x81R` \x01[`@Q\x80\x91\x03\x90\xF3[a\0\xD5a\0\xD06`\x04a\x06hV[a\x01~V[`@Qa\0\xB9\x91\x90a\x06\xD1V[a\0\xF5a\0\xF06`\x04a\x072V[a\x03\x9CV[`@Q\x90\x15\x15\x81R` \x01a\0\xB9V[a\0\xF5a\x01\x136`\x04a\x08 V[a\x03\xDFV[a\0\xAF\x7F\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\x81V[a\x01f\x7F\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\x81V[`@Q`\x01`\x01`\xA0\x1B\x03\x90\x91\x16\x81R` \x01a\0\xB9V[a\x01\xA2`@Q\x80``\x01`@R\x80``\x81R` \x01``\x81R` \x01``\x81RP\x90V[`\0\x82\x81R\x7F\xC1{Kp\x8BoD%\\ \x91:\x9D\x97\xA0S\0\xB6p4,q\xFEZ\xE5\xB6\x17\xBDM\xB5P\0` \x81\x90R`@\x91\x82\x90 \x82Q``\x81\x01\x90\x93R\x80T\x91\x92\x91\x82\x90\x82\x90a\x01\xEE\x90a\t*V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\x02\x1A\x90a\t*V[\x80\x15a\x02gW\x80`\x1F\x10a\x02\x90a\t*V[\x80\x15a\x03\x8BW\x80`\x1F\x10a\x03`Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\x03\x8BV[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\x03nW\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81RPP\x91PP\x91\x90PV[`\0\x81\x81R\x7F\xC1{Kp\x8BoD%\\ \x91:\x9D\x97\xA0S\0\xB6p4,q\xFEZ\xE5\xB6\x17\xBDM\xB5P\x02` \x90\x81R`@\x80\x83 \x85\x84R\x90\x91R\x90 T`\xFF\x16[\x92\x91PPV[`\0a\x03\xEB\x83\x83a\x03\xF2V[\x93\x92PPPV[`\0\x80\x7F\xC1{Kp\x8BoD%\\ \x91:\x9D\x97\xA0S\0\xB6p4,q\xFEZ\xE5\xB6\x17\xBDM\xB5P\0\x90P`\0\x83` \x01Q\x84`@\x01Q\x85``\x01Q`@Q` \x01a\x04;\x93\x92\x91\x90a\tdV[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x81R\x81Q` \x92\x83\x01 `\0\x81\x81R\x92\x85\x90R\x91 \x80T\x91\x92P\x90a\x04m\x90a\t*V[\x90P`\0\x03a\x04\x8FW`@Qc\x1CbV\x0B`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x04\xB9\x7F\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\0Ba\t\xA7V[a\x03\xE8\x85`\x80\x01Qa\x04\xCB\x91\x90a\t\xC8V[\x11a\x04\xE9W`@Qc\x0C\xB0/\x05`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`@Qc\xEA\xC7\x08\xA3`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x90c\xEA\xC7\x08\xA3\x90a\x057\x90\x88\x90\x88\x90`\x04\x01a\t\xEAV[`\0`@Q\x80\x83\x03\x81\x86\x80;\x15\x80\x15a\x05OW`\0\x80\xFD[PZ\xFA\x15\x80\x15a\x05cW=`\0\x80>=`\0\xFD[PPPP`\0a\x05v\x85`\0\x01Qa\x06\x0FV[`\x01`\x01`\xA0\x1B\x03\x81\x16`\0\x90\x81R`\x01\x85\x01` R`@\x90 T\x90\x91P\x15a\x05\xA5W`\0\x93PPPPa\x03\xD9V[`\x01`\x01`\xA0\x1B\x03\x81\x16`\0\x90\x81R`\x01\x84\x01` R`@\x90\x81\x90 \x83\x90U\x85Q\x90Q\x83\x91a\x05\xD3\x91a\n~V[`@Q\x90\x81\x90\x03\x81 \x90\x7F\xF4\x83\x7F\x1Af\xA1\xE5\xFB\xDE,@\xD0\xF6\xEF\xF7Q\x83\x13\x9Ey\xB0\xFC\x1E\xAA\xB2\x80\xA3\xA0\xBE8\xE7\xB1\x90`\0\x90\xA3P`\x01\x95\x94PPPPPV[`\0\x81Q`@\x14a\x063W`@Qc\xBD\x9C\x80\xC1`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[P\x80Q` \x90\x91\x01 \x90V[`\0` \x82\x84\x03\x12\x15a\x06QW`\0\x80\xFD[\x815`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a\x03\xEBW`\0\x80\xFD[`\0` \x82\x84\x03\x12\x15a\x06zW`\0\x80\xFD[P5\x91\x90PV[`\0[\x83\x81\x10\x15a\x06\x9CW\x81\x81\x01Q\x83\x82\x01R` \x01a\x06\x84V[PP`\0\x91\x01RV[`\0\x81Q\x80\x84Ra\x06\xBD\x81` \x86\x01` \x86\x01a\x06\x81V[`\x1F\x01`\x1F\x19\x16\x92\x90\x92\x01` \x01\x92\x91PPV[` \x81R`\0\x82Q``` \x84\x01Ra\x06\xED`\x80\x84\x01\x82a\x06\xA5V[\x90P` \x84\x01Q`\x1F\x19\x80\x85\x84\x03\x01`@\x86\x01Ra\x07\x0B\x83\x83a\x06\xA5V[\x92P`@\x86\x01Q\x91P\x80\x85\x84\x03\x01``\x86\x01RPa\x07)\x82\x82a\x06\xA5V[\x95\x94PPPPPV[`\0\x80`@\x83\x85\x03\x12\x15a\x07EW`\0\x80\xFD[PP\x805\x92` \x90\x91\x015\x91PV[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`@Q`\xA0\x81\x01g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x82\x82\x10\x17\x15a\x07\x8DWa\x07\x8Da\x07TV[`@R\x90V[`\0\x82`\x1F\x83\x01\x12a\x07\xA4W`\0\x80\xFD[\x815g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x11\x15a\x07\xBFWa\x07\xBFa\x07TV[`@Q`\x1F\x83\x01`\x1F\x19\x90\x81\x16`?\x01\x16\x81\x01\x90\x82\x82\x11\x81\x83\x10\x17\x15a\x07\xE7Wa\x07\xE7a\x07TV[\x81`@R\x83\x81R\x86` \x85\x88\x01\x01\x11\x15a\x08\0W`\0\x80\xFD[\x83` \x87\x01` \x83\x017`\0` \x85\x83\x01\x01R\x80\x94PPPPP\x92\x91PPV[`\0\x80`@\x83\x85\x03\x12\x15a\x083W`\0\x80\xFD[\x825g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x11\x15a\x08KW`\0\x80\xFD[a\x08W\x86\x83\x87\x01a\x07\x93V[\x93P` \x85\x015\x91P\x80\x82\x11\x15a\x08mW`\0\x80\xFD[\x90\x84\x01\x90`\xA0\x82\x87\x03\x12\x15a\x08\x81W`\0\x80\xFD[a\x08\x89a\x07jV[\x825\x82\x81\x11\x15a\x08\x98W`\0\x80\xFD[a\x08\xA4\x88\x82\x86\x01a\x07\x93V[\x82RP` \x83\x015\x82\x81\x11\x15a\x08\xB9W`\0\x80\xFD[a\x08\xC5\x88\x82\x86\x01a\x07\x93V[` \x83\x01RP`@\x83\x015\x82\x81\x11\x15a\x08\xDDW`\0\x80\xFD[a\x08\xE9\x88\x82\x86\x01a\x07\x93V[`@\x83\x01RP``\x83\x015\x82\x81\x11\x15a\t\x01W`\0\x80\xFD[a\t\r\x88\x82\x86\x01a\x07\x93V[``\x83\x01RP`\x80\x83\x015`\x80\x82\x01R\x80\x93PPPP\x92P\x92\x90PV[`\x01\x81\x81\x1C\x90\x82\x16\x80a\t>W`\x7F\x82\x16\x91P[` \x82\x10\x81\x03a\t^WcNH{q`\xE0\x1B`\0R`\"`\x04R`$`\0\xFD[P\x91\x90PV[`\0\x84Qa\tv\x81\x84` \x89\x01a\x06\x81V[\x84Q\x90\x83\x01\x90a\t\x8A\x81\x83` \x89\x01a\x06\x81V[\x84Q\x91\x01\x90a\t\x9D\x81\x83` \x88\x01a\x06\x81V[\x01\x95\x94PPPPPV[\x81\x81\x03\x81\x81\x11\x15a\x03\xD9WcNH{q`\xE0\x1B`\0R`\x11`\x04R`$`\0\xFD[`\0\x82a\t\xE5WcNH{q`\xE0\x1B`\0R`\x12`\x04R`$`\0\xFD[P\x04\x90V[`@\x81R`\0a\t\xFD`@\x83\x01\x85a\x06\xA5V[\x82\x81\x03` \x84\x01R\x83Q`\xA0\x82Ra\n\x18`\xA0\x83\x01\x82a\x06\xA5V[\x90P` \x85\x01Q\x82\x82\x03` \x84\x01Ra\n1\x82\x82a\x06\xA5V[\x91PP`@\x85\x01Q\x82\x82\x03`@\x84\x01Ra\nK\x82\x82a\x06\xA5V[\x91PP``\x85\x01Q\x82\x82\x03``\x84\x01Ra\ne\x82\x82a\x06\xA5V[\x91PP`\x80\x85\x01Q`\x80\x83\x01R\x80\x92PPP\x93\x92PPPV[`\0\x82Qa\n\x90\x81\x84` \x87\x01a\x06\x81V[\x91\x90\x91\x01\x92\x91PPV\xFE\xA2dipfsX\"\x12 R\x94\x98\xFA9\xD1Q\x0C\x1B\x1Ci\xD7\xE8s\x04\x87\xE4\x85P\xCDZZ\x1C\\\xD6\xBA\x7FZ\xDE3\xE3\x82dsolcC\0\x08\x14\x003"; + const __BYTECODE: &[u8] = b"`\xC0`@R4\x80\x15a\0\x10W`\0\x80\xFD[P`@Qa\x0B\xA88\x03\x80a\x0B\xA8\x839\x81\x01`@\x81\x90Ra\0/\x91a\0EV[`\x01`\x01`\xA0\x1B\x03\x90\x91\x16`\x80R`\xA0Ra\0\x7FV[`\0\x80`@\x83\x85\x03\x12\x15a\0XW`\0\x80\xFD[\x82Q`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a\0oW`\0\x80\xFD[` \x93\x90\x93\x01Q\x92\x94\x92\x93PPPV[`\x80Q`\xA0Qa\n\xF6a\0\xB2`\09`\0\x81\x81a\x01\x1D\x01Ra\x04\x94\x01R`\0\x81\x81a\x01D\x01Ra\x05\0\x01Ra\n\xF6`\0\xF3\xFE`\x80`@R4\x80\x15a\0\x10W`\0\x80\xFD[P`\x046\x10a\0bW`\x005`\xE0\x1C\x80c\x01\xD5\x8F\xA3\x14a\0gW\x80c$\x10\xF6\xBA\x14a\0\xC2W\x80ck[!\xA6\x14a\0\xE2W\x80cu\x84{\x84\x14a\x01\x05W\x80c\x9A\xEC\x99\x0E\x14a\x01\x18W\x80c\xCDy\xF9\x06\x14a\x01?W[`\0\x80\xFD[a\0\xAFa\0u6`\x04a\x06?V[`\x01`\x01`\xA0\x1B\x03\x16`\0\x90\x81R\x7F\xC1{Kp\x8BoD%\\ \x91:\x9D\x97\xA0S\0\xB6p4,q\xFEZ\xE5\xB6\x17\xBDM\xB5P\x01` R`@\x90 T\x90V[`@Q\x90\x81R` \x01[`@Q\x80\x91\x03\x90\xF3[a\0\xD5a\0\xD06`\x04a\x06hV[a\x01~V[`@Qa\0\xB9\x91\x90a\x06\xD1V[a\0\xF5a\0\xF06`\x04a\x071V[a\x03\x9CV[`@Q\x90\x15\x15\x81R` \x01a\0\xB9V[a\0\xF5a\x01\x136`\x04a\x08!V[a\x03\xDFV[a\0\xAF\x7F\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\x81V[a\x01f\x7F\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\x81V[`@Q`\x01`\x01`\xA0\x1B\x03\x90\x91\x16\x81R` \x01a\0\xB9V[a\x01\xA2`@Q\x80``\x01`@R\x80``\x81R` \x01``\x81R` \x01``\x81RP\x90V[`\0\x82\x81R\x7F\xC1{Kp\x8BoD%\\ \x91:\x9D\x97\xA0S\0\xB6p4,q\xFEZ\xE5\xB6\x17\xBDM\xB5P\0` \x81\x90R`@\x91\x82\x90 \x82Q``\x81\x01\x90\x93R\x80T\x91\x92\x91\x82\x90\x82\x90a\x01\xEE\x90a\tPV[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\x02\x1A\x90a\tPV[\x80\x15a\x02gW\x80`\x1F\x10a\x02\x90a\tPV[\x80\x15a\x03\x8BW\x80`\x1F\x10a\x03`Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\x03\x8BV[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\x03nW\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81RPP\x91PP\x91\x90PV[`\0\x81\x81R\x7F\xC1{Kp\x8BoD%\\ \x91:\x9D\x97\xA0S\0\xB6p4,q\xFEZ\xE5\xB6\x17\xBDM\xB5P\x02` \x90\x81R`@\x80\x83 \x85\x84R\x90\x91R\x90 T`\xFF\x16[\x92\x91PPV[`\0a\x03\xEB\x83\x83a\x03\xF2V[\x93\x92PPPV[`\0\x80\x7F\xC1{Kp\x8BoD%\\ \x91:\x9D\x97\xA0S\0\xB6p4,q\xFEZ\xE5\xB6\x17\xBDM\xB5P\0\x90P`\0\x83` \x01Q\x84`@\x01Q\x85``\x01Q`@Q` \x01a\x04;\x93\x92\x91\x90a\t\x8AV[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x81R\x81Q` \x92\x83\x01 `\0\x81\x81R\x92\x85\x90R\x91 \x80T\x91\x92P\x90a\x04m\x90a\tPV[\x90P`\0\x03a\x04\x8FW`@Qc\x1CbV\x0B`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x04\xB9\x7F\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\0Ba\t\xCDV[a\x03\xE8\x85`\x80\x01Qa\x04\xCB\x91\x90a\t\xEEV[\x11a\x04\xE9W`@Qc\x0C\xB0/\x05`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`@Qc\xEA\xC7\x08\xA3`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x90c\xEA\xC7\x08\xA3\x90a\x057\x90\x88\x90\x88\x90`\x04\x01a\n\x10V[`\0`@Q\x80\x83\x03\x81\x86\x80;\x15\x80\x15a\x05OW`\0\x80\xFD[PZ\xFA\x15\x80\x15a\x05cW=`\0\x80>=`\0\xFD[PPPP`\0a\x05v\x85`\0\x01Qa\x06\x0FV[`\x01`\x01`\xA0\x1B\x03\x81\x16`\0\x90\x81R`\x01\x85\x01` R`@\x90 T\x90\x91P\x15a\x05\xA5W`\0\x93PPPPa\x03\xD9V[`\x01`\x01`\xA0\x1B\x03\x81\x16`\0\x90\x81R`\x01\x84\x01` R`@\x90\x81\x90 \x83\x90U\x85Q\x90Q\x83\x91a\x05\xD3\x91a\n\xA4V[`@Q\x90\x81\x90\x03\x81 \x90\x7F\xF4\x83\x7F\x1Af\xA1\xE5\xFB\xDE,@\xD0\xF6\xEF\xF7Q\x83\x13\x9Ey\xB0\xFC\x1E\xAA\xB2\x80\xA3\xA0\xBE8\xE7\xB1\x90`\0\x90\xA3P`\x01\x95\x94PPPPPV[`\0\x81Q`@\x14a\x063W`@Qc\xBD\x9C\x80\xC1`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[P\x80Q` \x90\x91\x01 \x90V[`\0` \x82\x84\x03\x12\x15a\x06QW`\0\x80\xFD[\x815`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a\x03\xEBW`\0\x80\xFD[`\0` \x82\x84\x03\x12\x15a\x06zW`\0\x80\xFD[P5\x91\x90PV[`\0[\x83\x81\x10\x15a\x06\x9CW\x81\x81\x01Q\x83\x82\x01R` \x01a\x06\x84V[PP`\0\x91\x01RV[`\0\x81Q\x80\x84Ra\x06\xBD\x81` \x86\x01` \x86\x01a\x06\x81V[`\x1F\x01`\x1F\x19\x16\x92\x90\x92\x01` \x01\x92\x91PPV[` \x81R`\0\x82Q``` \x84\x01Ra\x06\xED`\x80\x84\x01\x82a\x06\xA5V[\x90P` \x84\x01Q`\x1F\x19\x84\x83\x03\x01`@\x85\x01Ra\x07\n\x82\x82a\x06\xA5V[\x91PP`@\x84\x01Q`\x1F\x19\x84\x83\x03\x01``\x85\x01Ra\x07(\x82\x82a\x06\xA5V[\x95\x94PPPPPV[`\0\x80`@\x83\x85\x03\x12\x15a\x07DW`\0\x80\xFD[PP\x805\x92` \x90\x91\x015\x91PV[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`@Q`\xA0\x81\x01g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x82\x82\x10\x17\x15a\x07\x8CWa\x07\x8Ca\x07SV[`@R\x90V[`\0\x82`\x1F\x83\x01\x12a\x07\xA3W`\0\x80\xFD[\x815g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x07\xBDWa\x07\xBDa\x07SV[`@Q`\x1F\x82\x01`\x1F\x19\x90\x81\x16`?\x01\x16\x81\x01g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x82\x82\x10\x17\x15a\x07\xECWa\x07\xECa\x07SV[`@R\x81\x81R\x83\x82\x01` \x01\x85\x10\x15a\x08\x04W`\0\x80\xFD[\x81` \x85\x01` \x83\x017`\0\x91\x81\x01` \x01\x91\x90\x91R\x93\x92PPPV[`\0\x80`@\x83\x85\x03\x12\x15a\x084W`\0\x80\xFD[\x825g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x08KW`\0\x80\xFD[a\x08W\x85\x82\x86\x01a\x07\x92V[\x92PP` \x83\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x08tW`\0\x80\xFD[\x83\x01`\xA0\x81\x86\x03\x12\x15a\x08\x86W`\0\x80\xFD[a\x08\x8Ea\x07iV[\x815g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x08\xA5W`\0\x80\xFD[a\x08\xB1\x87\x82\x85\x01a\x07\x92V[\x82RP` \x82\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x08\xCEW`\0\x80\xFD[a\x08\xDA\x87\x82\x85\x01a\x07\x92V[` \x83\x01RP`@\x82\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x08\xFAW`\0\x80\xFD[a\t\x06\x87\x82\x85\x01a\x07\x92V[`@\x83\x01RP``\x82\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\t&W`\0\x80\xFD[a\t2\x87\x82\x85\x01a\x07\x92V[``\x83\x01RP`\x80\x91\x82\x015\x91\x81\x01\x91\x90\x91R\x91\x94\x91\x93P\x90\x91PPV[`\x01\x81\x81\x1C\x90\x82\x16\x80a\tdW`\x7F\x82\x16\x91P[` \x82\x10\x81\x03a\t\x84WcNH{q`\xE0\x1B`\0R`\"`\x04R`$`\0\xFD[P\x91\x90PV[`\0\x84Qa\t\x9C\x81\x84` \x89\x01a\x06\x81V[\x84Q\x90\x83\x01\x90a\t\xB0\x81\x83` \x89\x01a\x06\x81V[\x84Q\x91\x01\x90a\t\xC3\x81\x83` \x88\x01a\x06\x81V[\x01\x95\x94PPPPPV[\x81\x81\x03\x81\x81\x11\x15a\x03\xD9WcNH{q`\xE0\x1B`\0R`\x11`\x04R`$`\0\xFD[`\0\x82a\n\x0BWcNH{q`\xE0\x1B`\0R`\x12`\x04R`$`\0\xFD[P\x04\x90V[`@\x81R`\0a\n#`@\x83\x01\x85a\x06\xA5V[\x82\x81\x03` \x84\x01R\x83Q`\xA0\x82Ra\n>`\xA0\x83\x01\x82a\x06\xA5V[\x90P` \x85\x01Q\x82\x82\x03` \x84\x01Ra\nW\x82\x82a\x06\xA5V[\x91PP`@\x85\x01Q\x82\x82\x03`@\x84\x01Ra\nq\x82\x82a\x06\xA5V[\x91PP``\x85\x01Q\x82\x82\x03``\x84\x01Ra\n\x8B\x82\x82a\x06\xA5V[\x91PP`\x80\x85\x01Q`\x80\x83\x01R\x80\x92PPP\x93\x92PPPV[`\0\x82Qa\n\xB6\x81\x84` \x87\x01a\x06\x81V[\x91\x90\x91\x01\x92\x91PPV\xFE\xA2dipfsX\"\x12 \xC7\x99s)\x9F\x9Ff\xFC`\xB0\x15\xDA\xB1\xDF\x1B\x0F*\xE5\xE1\xAB\x12\xA9F\xCA\xEF\xA0\xE82\x8C\xBB\xD3udsolcC\0\x08\x1C\x003"; /// The bytecode of the contract. pub static ATTESTATIONAUTHERUPGRADEABLE_BYTECODE: ::ethers::core::types::Bytes = ::ethers::core::types::Bytes::from_static(__BYTECODE); #[rustfmt::skip] - const __DEPLOYED_BYTECODE: &[u8] = b"`\x80`@R4\x80\x15a\0\x10W`\0\x80\xFD[P`\x046\x10a\0bW`\x005`\xE0\x1C\x80c\x01\xD5\x8F\xA3\x14a\0gW\x80c$\x10\xF6\xBA\x14a\0\xC2W\x80ck[!\xA6\x14a\0\xE2W\x80cu\x84{\x84\x14a\x01\x05W\x80c\x9A\xEC\x99\x0E\x14a\x01\x18W\x80c\xCDy\xF9\x06\x14a\x01?W[`\0\x80\xFD[a\0\xAFa\0u6`\x04a\x06?V[`\x01`\x01`\xA0\x1B\x03\x16`\0\x90\x81R\x7F\xC1{Kp\x8BoD%\\ \x91:\x9D\x97\xA0S\0\xB6p4,q\xFEZ\xE5\xB6\x17\xBDM\xB5P\x01` R`@\x90 T\x90V[`@Q\x90\x81R` \x01[`@Q\x80\x91\x03\x90\xF3[a\0\xD5a\0\xD06`\x04a\x06hV[a\x01~V[`@Qa\0\xB9\x91\x90a\x06\xD1V[a\0\xF5a\0\xF06`\x04a\x072V[a\x03\x9CV[`@Q\x90\x15\x15\x81R` \x01a\0\xB9V[a\0\xF5a\x01\x136`\x04a\x08 V[a\x03\xDFV[a\0\xAF\x7F\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\x81V[a\x01f\x7F\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\x81V[`@Q`\x01`\x01`\xA0\x1B\x03\x90\x91\x16\x81R` \x01a\0\xB9V[a\x01\xA2`@Q\x80``\x01`@R\x80``\x81R` \x01``\x81R` \x01``\x81RP\x90V[`\0\x82\x81R\x7F\xC1{Kp\x8BoD%\\ \x91:\x9D\x97\xA0S\0\xB6p4,q\xFEZ\xE5\xB6\x17\xBDM\xB5P\0` \x81\x90R`@\x91\x82\x90 \x82Q``\x81\x01\x90\x93R\x80T\x91\x92\x91\x82\x90\x82\x90a\x01\xEE\x90a\t*V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\x02\x1A\x90a\t*V[\x80\x15a\x02gW\x80`\x1F\x10a\x02\x90a\t*V[\x80\x15a\x03\x8BW\x80`\x1F\x10a\x03`Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\x03\x8BV[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\x03nW\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81RPP\x91PP\x91\x90PV[`\0\x81\x81R\x7F\xC1{Kp\x8BoD%\\ \x91:\x9D\x97\xA0S\0\xB6p4,q\xFEZ\xE5\xB6\x17\xBDM\xB5P\x02` \x90\x81R`@\x80\x83 \x85\x84R\x90\x91R\x90 T`\xFF\x16[\x92\x91PPV[`\0a\x03\xEB\x83\x83a\x03\xF2V[\x93\x92PPPV[`\0\x80\x7F\xC1{Kp\x8BoD%\\ \x91:\x9D\x97\xA0S\0\xB6p4,q\xFEZ\xE5\xB6\x17\xBDM\xB5P\0\x90P`\0\x83` \x01Q\x84`@\x01Q\x85``\x01Q`@Q` \x01a\x04;\x93\x92\x91\x90a\tdV[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x81R\x81Q` \x92\x83\x01 `\0\x81\x81R\x92\x85\x90R\x91 \x80T\x91\x92P\x90a\x04m\x90a\t*V[\x90P`\0\x03a\x04\x8FW`@Qc\x1CbV\x0B`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x04\xB9\x7F\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\0Ba\t\xA7V[a\x03\xE8\x85`\x80\x01Qa\x04\xCB\x91\x90a\t\xC8V[\x11a\x04\xE9W`@Qc\x0C\xB0/\x05`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`@Qc\xEA\xC7\x08\xA3`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x90c\xEA\xC7\x08\xA3\x90a\x057\x90\x88\x90\x88\x90`\x04\x01a\t\xEAV[`\0`@Q\x80\x83\x03\x81\x86\x80;\x15\x80\x15a\x05OW`\0\x80\xFD[PZ\xFA\x15\x80\x15a\x05cW=`\0\x80>=`\0\xFD[PPPP`\0a\x05v\x85`\0\x01Qa\x06\x0FV[`\x01`\x01`\xA0\x1B\x03\x81\x16`\0\x90\x81R`\x01\x85\x01` R`@\x90 T\x90\x91P\x15a\x05\xA5W`\0\x93PPPPa\x03\xD9V[`\x01`\x01`\xA0\x1B\x03\x81\x16`\0\x90\x81R`\x01\x84\x01` R`@\x90\x81\x90 \x83\x90U\x85Q\x90Q\x83\x91a\x05\xD3\x91a\n~V[`@Q\x90\x81\x90\x03\x81 \x90\x7F\xF4\x83\x7F\x1Af\xA1\xE5\xFB\xDE,@\xD0\xF6\xEF\xF7Q\x83\x13\x9Ey\xB0\xFC\x1E\xAA\xB2\x80\xA3\xA0\xBE8\xE7\xB1\x90`\0\x90\xA3P`\x01\x95\x94PPPPPV[`\0\x81Q`@\x14a\x063W`@Qc\xBD\x9C\x80\xC1`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[P\x80Q` \x90\x91\x01 \x90V[`\0` \x82\x84\x03\x12\x15a\x06QW`\0\x80\xFD[\x815`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a\x03\xEBW`\0\x80\xFD[`\0` \x82\x84\x03\x12\x15a\x06zW`\0\x80\xFD[P5\x91\x90PV[`\0[\x83\x81\x10\x15a\x06\x9CW\x81\x81\x01Q\x83\x82\x01R` \x01a\x06\x84V[PP`\0\x91\x01RV[`\0\x81Q\x80\x84Ra\x06\xBD\x81` \x86\x01` \x86\x01a\x06\x81V[`\x1F\x01`\x1F\x19\x16\x92\x90\x92\x01` \x01\x92\x91PPV[` \x81R`\0\x82Q``` \x84\x01Ra\x06\xED`\x80\x84\x01\x82a\x06\xA5V[\x90P` \x84\x01Q`\x1F\x19\x80\x85\x84\x03\x01`@\x86\x01Ra\x07\x0B\x83\x83a\x06\xA5V[\x92P`@\x86\x01Q\x91P\x80\x85\x84\x03\x01``\x86\x01RPa\x07)\x82\x82a\x06\xA5V[\x95\x94PPPPPV[`\0\x80`@\x83\x85\x03\x12\x15a\x07EW`\0\x80\xFD[PP\x805\x92` \x90\x91\x015\x91PV[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`@Q`\xA0\x81\x01g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x82\x82\x10\x17\x15a\x07\x8DWa\x07\x8Da\x07TV[`@R\x90V[`\0\x82`\x1F\x83\x01\x12a\x07\xA4W`\0\x80\xFD[\x815g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x11\x15a\x07\xBFWa\x07\xBFa\x07TV[`@Q`\x1F\x83\x01`\x1F\x19\x90\x81\x16`?\x01\x16\x81\x01\x90\x82\x82\x11\x81\x83\x10\x17\x15a\x07\xE7Wa\x07\xE7a\x07TV[\x81`@R\x83\x81R\x86` \x85\x88\x01\x01\x11\x15a\x08\0W`\0\x80\xFD[\x83` \x87\x01` \x83\x017`\0` \x85\x83\x01\x01R\x80\x94PPPPP\x92\x91PPV[`\0\x80`@\x83\x85\x03\x12\x15a\x083W`\0\x80\xFD[\x825g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x11\x15a\x08KW`\0\x80\xFD[a\x08W\x86\x83\x87\x01a\x07\x93V[\x93P` \x85\x015\x91P\x80\x82\x11\x15a\x08mW`\0\x80\xFD[\x90\x84\x01\x90`\xA0\x82\x87\x03\x12\x15a\x08\x81W`\0\x80\xFD[a\x08\x89a\x07jV[\x825\x82\x81\x11\x15a\x08\x98W`\0\x80\xFD[a\x08\xA4\x88\x82\x86\x01a\x07\x93V[\x82RP` \x83\x015\x82\x81\x11\x15a\x08\xB9W`\0\x80\xFD[a\x08\xC5\x88\x82\x86\x01a\x07\x93V[` \x83\x01RP`@\x83\x015\x82\x81\x11\x15a\x08\xDDW`\0\x80\xFD[a\x08\xE9\x88\x82\x86\x01a\x07\x93V[`@\x83\x01RP``\x83\x015\x82\x81\x11\x15a\t\x01W`\0\x80\xFD[a\t\r\x88\x82\x86\x01a\x07\x93V[``\x83\x01RP`\x80\x83\x015`\x80\x82\x01R\x80\x93PPPP\x92P\x92\x90PV[`\x01\x81\x81\x1C\x90\x82\x16\x80a\t>W`\x7F\x82\x16\x91P[` \x82\x10\x81\x03a\t^WcNH{q`\xE0\x1B`\0R`\"`\x04R`$`\0\xFD[P\x91\x90PV[`\0\x84Qa\tv\x81\x84` \x89\x01a\x06\x81V[\x84Q\x90\x83\x01\x90a\t\x8A\x81\x83` \x89\x01a\x06\x81V[\x84Q\x91\x01\x90a\t\x9D\x81\x83` \x88\x01a\x06\x81V[\x01\x95\x94PPPPPV[\x81\x81\x03\x81\x81\x11\x15a\x03\xD9WcNH{q`\xE0\x1B`\0R`\x11`\x04R`$`\0\xFD[`\0\x82a\t\xE5WcNH{q`\xE0\x1B`\0R`\x12`\x04R`$`\0\xFD[P\x04\x90V[`@\x81R`\0a\t\xFD`@\x83\x01\x85a\x06\xA5V[\x82\x81\x03` \x84\x01R\x83Q`\xA0\x82Ra\n\x18`\xA0\x83\x01\x82a\x06\xA5V[\x90P` \x85\x01Q\x82\x82\x03` \x84\x01Ra\n1\x82\x82a\x06\xA5V[\x91PP`@\x85\x01Q\x82\x82\x03`@\x84\x01Ra\nK\x82\x82a\x06\xA5V[\x91PP``\x85\x01Q\x82\x82\x03``\x84\x01Ra\ne\x82\x82a\x06\xA5V[\x91PP`\x80\x85\x01Q`\x80\x83\x01R\x80\x92PPP\x93\x92PPPV[`\0\x82Qa\n\x90\x81\x84` \x87\x01a\x06\x81V[\x91\x90\x91\x01\x92\x91PPV\xFE\xA2dipfsX\"\x12 R\x94\x98\xFA9\xD1Q\x0C\x1B\x1Ci\xD7\xE8s\x04\x87\xE4\x85P\xCDZZ\x1C\\\xD6\xBA\x7FZ\xDE3\xE3\x82dsolcC\0\x08\x14\x003"; + const __DEPLOYED_BYTECODE: &[u8] = b"`\x80`@R4\x80\x15a\0\x10W`\0\x80\xFD[P`\x046\x10a\0bW`\x005`\xE0\x1C\x80c\x01\xD5\x8F\xA3\x14a\0gW\x80c$\x10\xF6\xBA\x14a\0\xC2W\x80ck[!\xA6\x14a\0\xE2W\x80cu\x84{\x84\x14a\x01\x05W\x80c\x9A\xEC\x99\x0E\x14a\x01\x18W\x80c\xCDy\xF9\x06\x14a\x01?W[`\0\x80\xFD[a\0\xAFa\0u6`\x04a\x06?V[`\x01`\x01`\xA0\x1B\x03\x16`\0\x90\x81R\x7F\xC1{Kp\x8BoD%\\ \x91:\x9D\x97\xA0S\0\xB6p4,q\xFEZ\xE5\xB6\x17\xBDM\xB5P\x01` R`@\x90 T\x90V[`@Q\x90\x81R` \x01[`@Q\x80\x91\x03\x90\xF3[a\0\xD5a\0\xD06`\x04a\x06hV[a\x01~V[`@Qa\0\xB9\x91\x90a\x06\xD1V[a\0\xF5a\0\xF06`\x04a\x071V[a\x03\x9CV[`@Q\x90\x15\x15\x81R` \x01a\0\xB9V[a\0\xF5a\x01\x136`\x04a\x08!V[a\x03\xDFV[a\0\xAF\x7F\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\x81V[a\x01f\x7F\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\x81V[`@Q`\x01`\x01`\xA0\x1B\x03\x90\x91\x16\x81R` \x01a\0\xB9V[a\x01\xA2`@Q\x80``\x01`@R\x80``\x81R` \x01``\x81R` \x01``\x81RP\x90V[`\0\x82\x81R\x7F\xC1{Kp\x8BoD%\\ \x91:\x9D\x97\xA0S\0\xB6p4,q\xFEZ\xE5\xB6\x17\xBDM\xB5P\0` \x81\x90R`@\x91\x82\x90 \x82Q``\x81\x01\x90\x93R\x80T\x91\x92\x91\x82\x90\x82\x90a\x01\xEE\x90a\tPV[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\x02\x1A\x90a\tPV[\x80\x15a\x02gW\x80`\x1F\x10a\x02\x90a\tPV[\x80\x15a\x03\x8BW\x80`\x1F\x10a\x03`Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\x03\x8BV[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\x03nW\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81RPP\x91PP\x91\x90PV[`\0\x81\x81R\x7F\xC1{Kp\x8BoD%\\ \x91:\x9D\x97\xA0S\0\xB6p4,q\xFEZ\xE5\xB6\x17\xBDM\xB5P\x02` \x90\x81R`@\x80\x83 \x85\x84R\x90\x91R\x90 T`\xFF\x16[\x92\x91PPV[`\0a\x03\xEB\x83\x83a\x03\xF2V[\x93\x92PPPV[`\0\x80\x7F\xC1{Kp\x8BoD%\\ \x91:\x9D\x97\xA0S\0\xB6p4,q\xFEZ\xE5\xB6\x17\xBDM\xB5P\0\x90P`\0\x83` \x01Q\x84`@\x01Q\x85``\x01Q`@Q` \x01a\x04;\x93\x92\x91\x90a\t\x8AV[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x81R\x81Q` \x92\x83\x01 `\0\x81\x81R\x92\x85\x90R\x91 \x80T\x91\x92P\x90a\x04m\x90a\tPV[\x90P`\0\x03a\x04\x8FW`@Qc\x1CbV\x0B`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x04\xB9\x7F\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\0Ba\t\xCDV[a\x03\xE8\x85`\x80\x01Qa\x04\xCB\x91\x90a\t\xEEV[\x11a\x04\xE9W`@Qc\x0C\xB0/\x05`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`@Qc\xEA\xC7\x08\xA3`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x90c\xEA\xC7\x08\xA3\x90a\x057\x90\x88\x90\x88\x90`\x04\x01a\n\x10V[`\0`@Q\x80\x83\x03\x81\x86\x80;\x15\x80\x15a\x05OW`\0\x80\xFD[PZ\xFA\x15\x80\x15a\x05cW=`\0\x80>=`\0\xFD[PPPP`\0a\x05v\x85`\0\x01Qa\x06\x0FV[`\x01`\x01`\xA0\x1B\x03\x81\x16`\0\x90\x81R`\x01\x85\x01` R`@\x90 T\x90\x91P\x15a\x05\xA5W`\0\x93PPPPa\x03\xD9V[`\x01`\x01`\xA0\x1B\x03\x81\x16`\0\x90\x81R`\x01\x84\x01` R`@\x90\x81\x90 \x83\x90U\x85Q\x90Q\x83\x91a\x05\xD3\x91a\n\xA4V[`@Q\x90\x81\x90\x03\x81 \x90\x7F\xF4\x83\x7F\x1Af\xA1\xE5\xFB\xDE,@\xD0\xF6\xEF\xF7Q\x83\x13\x9Ey\xB0\xFC\x1E\xAA\xB2\x80\xA3\xA0\xBE8\xE7\xB1\x90`\0\x90\xA3P`\x01\x95\x94PPPPPV[`\0\x81Q`@\x14a\x063W`@Qc\xBD\x9C\x80\xC1`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[P\x80Q` \x90\x91\x01 \x90V[`\0` \x82\x84\x03\x12\x15a\x06QW`\0\x80\xFD[\x815`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a\x03\xEBW`\0\x80\xFD[`\0` \x82\x84\x03\x12\x15a\x06zW`\0\x80\xFD[P5\x91\x90PV[`\0[\x83\x81\x10\x15a\x06\x9CW\x81\x81\x01Q\x83\x82\x01R` \x01a\x06\x84V[PP`\0\x91\x01RV[`\0\x81Q\x80\x84Ra\x06\xBD\x81` \x86\x01` \x86\x01a\x06\x81V[`\x1F\x01`\x1F\x19\x16\x92\x90\x92\x01` \x01\x92\x91PPV[` \x81R`\0\x82Q``` \x84\x01Ra\x06\xED`\x80\x84\x01\x82a\x06\xA5V[\x90P` \x84\x01Q`\x1F\x19\x84\x83\x03\x01`@\x85\x01Ra\x07\n\x82\x82a\x06\xA5V[\x91PP`@\x84\x01Q`\x1F\x19\x84\x83\x03\x01``\x85\x01Ra\x07(\x82\x82a\x06\xA5V[\x95\x94PPPPPV[`\0\x80`@\x83\x85\x03\x12\x15a\x07DW`\0\x80\xFD[PP\x805\x92` \x90\x91\x015\x91PV[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`@Q`\xA0\x81\x01g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x82\x82\x10\x17\x15a\x07\x8CWa\x07\x8Ca\x07SV[`@R\x90V[`\0\x82`\x1F\x83\x01\x12a\x07\xA3W`\0\x80\xFD[\x815g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x07\xBDWa\x07\xBDa\x07SV[`@Q`\x1F\x82\x01`\x1F\x19\x90\x81\x16`?\x01\x16\x81\x01g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x82\x82\x10\x17\x15a\x07\xECWa\x07\xECa\x07SV[`@R\x81\x81R\x83\x82\x01` \x01\x85\x10\x15a\x08\x04W`\0\x80\xFD[\x81` \x85\x01` \x83\x017`\0\x91\x81\x01` \x01\x91\x90\x91R\x93\x92PPPV[`\0\x80`@\x83\x85\x03\x12\x15a\x084W`\0\x80\xFD[\x825g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x08KW`\0\x80\xFD[a\x08W\x85\x82\x86\x01a\x07\x92V[\x92PP` \x83\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x08tW`\0\x80\xFD[\x83\x01`\xA0\x81\x86\x03\x12\x15a\x08\x86W`\0\x80\xFD[a\x08\x8Ea\x07iV[\x815g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x08\xA5W`\0\x80\xFD[a\x08\xB1\x87\x82\x85\x01a\x07\x92V[\x82RP` \x82\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x08\xCEW`\0\x80\xFD[a\x08\xDA\x87\x82\x85\x01a\x07\x92V[` \x83\x01RP`@\x82\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x08\xFAW`\0\x80\xFD[a\t\x06\x87\x82\x85\x01a\x07\x92V[`@\x83\x01RP``\x82\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\t&W`\0\x80\xFD[a\t2\x87\x82\x85\x01a\x07\x92V[``\x83\x01RP`\x80\x91\x82\x015\x91\x81\x01\x91\x90\x91R\x91\x94\x91\x93P\x90\x91PPV[`\x01\x81\x81\x1C\x90\x82\x16\x80a\tdW`\x7F\x82\x16\x91P[` \x82\x10\x81\x03a\t\x84WcNH{q`\xE0\x1B`\0R`\"`\x04R`$`\0\xFD[P\x91\x90PV[`\0\x84Qa\t\x9C\x81\x84` \x89\x01a\x06\x81V[\x84Q\x90\x83\x01\x90a\t\xB0\x81\x83` \x89\x01a\x06\x81V[\x84Q\x91\x01\x90a\t\xC3\x81\x83` \x88\x01a\x06\x81V[\x01\x95\x94PPPPPV[\x81\x81\x03\x81\x81\x11\x15a\x03\xD9WcNH{q`\xE0\x1B`\0R`\x11`\x04R`$`\0\xFD[`\0\x82a\n\x0BWcNH{q`\xE0\x1B`\0R`\x12`\x04R`$`\0\xFD[P\x04\x90V[`@\x81R`\0a\n#`@\x83\x01\x85a\x06\xA5V[\x82\x81\x03` \x84\x01R\x83Q`\xA0\x82Ra\n>`\xA0\x83\x01\x82a\x06\xA5V[\x90P` \x85\x01Q\x82\x82\x03` \x84\x01Ra\nW\x82\x82a\x06\xA5V[\x91PP`@\x85\x01Q\x82\x82\x03`@\x84\x01Ra\nq\x82\x82a\x06\xA5V[\x91PP``\x85\x01Q\x82\x82\x03``\x84\x01Ra\n\x8B\x82\x82a\x06\xA5V[\x91PP`\x80\x85\x01Q`\x80\x83\x01R\x80\x92PPP\x93\x92PPPV[`\0\x82Qa\n\xB6\x81\x84` \x87\x01a\x06\x81V[\x91\x90\x91\x01\x92\x91PPV\xFE\xA2dipfsX\"\x12 \xC7\x99s)\x9F\x9Ff\xFC`\xB0\x15\xDA\xB1\xDF\x1B\x0F*\xE5\xE1\xAB\x12\xA9F\xCA\xEF\xA0\xE82\x8C\xBB\xD3udsolcC\0\x08\x1C\x003"; /// The deployed bytecode of the contract. pub static ATTESTATIONAUTHERUPGRADEABLE_DEPLOYED_BYTECODE: ::ethers::core::types::Bytes = ::ethers::core::types::Bytes::from_static(__DEPLOYED_BYTECODE); diff --git a/bindings/src/attestation_verifier.rs b/bindings/src/attestation_verifier.rs deleted file mode 100644 index ab80a49..0000000 --- a/bindings/src/attestation_verifier.rs +++ /dev/null @@ -1,3540 +0,0 @@ -pub use attestation_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 attestation_verifier { - pub use super::super::shared_types::*; - #[allow(deprecated)] - fn __abi() -> ::ethers::core::abi::Abi { - ::ethers::core::abi::ethabi::Contract { - constructor: ::core::option::Option::Some(::ethers::core::abi::ethabi::Constructor { - inputs: ::std::vec![], - }), - functions: ::core::convert::From::from([ - ( - ::std::borrow::ToOwned::to_owned("DEFAULT_ADMIN_ROLE"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("DEFAULT_ADMIN_ROLE"), - inputs: ::std::vec![], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::FixedBytes(32usize,), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes32"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("MAX_AGE"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("MAX_AGE"), - inputs: ::std::vec![], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("UPGRADE_INTERFACE_VERSION"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("UPGRADE_INTERFACE_VERSION",), - inputs: ::std::vec![], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::String, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("string"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("getRoleAdmin"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("getRoleAdmin"), - inputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("role"), - kind: ::ethers::core::abi::ethabi::ParamType::FixedBytes(32usize,), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes32"), - ), - },], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::FixedBytes(32usize,), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes32"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("grantRole"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("grantRole"), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("role"), - kind: ::ethers::core::abi::ethabi::ParamType::FixedBytes(32usize,), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes32"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("account"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - }, - ], - outputs: ::std::vec![], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("hasRole"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("hasRole"), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("role"), - kind: ::ethers::core::abi::ethabi::ParamType::FixedBytes(32usize,), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes32"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("account"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - }, - ], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Bool, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bool"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("initialize"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("initialize"), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("images"), - kind: ::ethers::core::abi::ethabi::ParamType::Array( - ::std::boxed::Box::new( - ::ethers::core::abi::ethabi::ParamType::Tuple(::std::vec![ - ::ethers::core::abi::ethabi::ParamType::Bytes, - ::ethers::core::abi::ethabi::ParamType::Bytes, - ::ethers::core::abi::ethabi::ParamType::Bytes, - ],), - ), - ), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned( - "struct AttestationVerifier.EnclaveImage[]", - ), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("enclaveKeys"), - kind: ::ethers::core::abi::ethabi::ParamType::Array( - ::std::boxed::Box::new( - ::ethers::core::abi::ethabi::ParamType::Bytes, - ), - ), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes[]"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("_admin"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - }, - ], - outputs: ::std::vec![], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("proxiableUUID"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("proxiableUUID"), - inputs: ::std::vec![], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::FixedBytes(32usize,), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes32"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("pubKeyToAddress"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("pubKeyToAddress"), - inputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("pubKey"), - kind: ::ethers::core::abi::ethabi::ParamType::Bytes, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes"), - ), - },], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::Pure, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("renounceRole"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("renounceRole"), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("role"), - kind: ::ethers::core::abi::ethabi::ParamType::FixedBytes(32usize,), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes32"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("callerConfirmation",), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - }, - ], - outputs: ::std::vec![], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("revokeEnclaveImage"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("revokeEnclaveImage"), - inputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("imageId"), - kind: ::ethers::core::abi::ethabi::ParamType::FixedBytes(32usize,), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes32"), - ), - },], - outputs: ::std::vec![], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("revokeEnclaveKey"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("revokeEnclaveKey"), - inputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("enclavePubKey"), - kind: ::ethers::core::abi::ethabi::ParamType::Bytes, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes"), - ), - },], - outputs: ::std::vec![], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("revokeRole"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("revokeRole"), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("role"), - kind: ::ethers::core::abi::ethabi::ParamType::FixedBytes(32usize,), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes32"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("account"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - }, - ], - outputs: ::std::vec![], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("supportsInterface"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("supportsInterface"), - inputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("interfaceId"), - kind: ::ethers::core::abi::ethabi::ParamType::FixedBytes(4usize,), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes4"), - ), - },], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Bool, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bool"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("upgradeToAndCall"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("upgradeToAndCall"), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("newImplementation"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("data"), - kind: ::ethers::core::abi::ethabi::ParamType::Bytes, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes"), - ), - }, - ], - outputs: ::std::vec![], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::Payable, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("verifiedKeys"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("verifiedKeys"), - inputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - },], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::FixedBytes(32usize,), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes32"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("verify"), - ::std::vec![ - ::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("verify"), - inputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("data"), - kind: ::ethers::core::abi::ethabi::ParamType::Bytes, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes"), - ), - },], - outputs: ::std::vec![], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - }, - ::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("verify"), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("signature"), - kind: ::ethers::core::abi::ethabi::ParamType::Bytes, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("attestation"), - kind: ::ethers::core::abi::ethabi::ParamType::Tuple( - ::std::vec![ - ::ethers::core::abi::ethabi::ParamType::Bytes, - ::ethers::core::abi::ethabi::ParamType::Bytes, - ::ethers::core::abi::ethabi::ParamType::Bytes, - ::ethers::core::abi::ethabi::ParamType::Bytes, - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ], - ), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned( - "struct IAttestationVerifier.Attestation", - ), - ), - }, - ], - outputs: ::std::vec![], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - }, - ], - ), - ( - ::std::borrow::ToOwned::to_owned("verifyEnclaveKey"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("verifyEnclaveKey"), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("signature"), - kind: ::ethers::core::abi::ethabi::ParamType::Bytes, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("attestation"), - kind: ::ethers::core::abi::ethabi::ParamType::Tuple(::std::vec![ - ::ethers::core::abi::ethabi::ParamType::Bytes, - ::ethers::core::abi::ethabi::ParamType::Bytes, - ::ethers::core::abi::ethabi::ParamType::Bytes, - ::ethers::core::abi::ethabi::ParamType::Bytes, - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ],), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned( - "struct IAttestationVerifier.Attestation", - ), - ), - }, - ], - outputs: ::std::vec![], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("whitelistEnclaveImage"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("whitelistEnclaveImage",), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("PCR0"), - kind: ::ethers::core::abi::ethabi::ParamType::Bytes, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("PCR1"), - kind: ::ethers::core::abi::ethabi::ParamType::Bytes, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("PCR2"), - kind: ::ethers::core::abi::ethabi::ParamType::Bytes, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes"), - ), - }, - ], - outputs: ::std::vec![], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("whitelistEnclaveKey"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("whitelistEnclaveKey",), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("enclavePubKey"), - kind: ::ethers::core::abi::ethabi::ParamType::Bytes, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("imageId"), - kind: ::ethers::core::abi::ethabi::ParamType::FixedBytes(32usize,), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes32"), - ), - }, - ], - outputs: ::std::vec![], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("whitelistedImages"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("whitelistedImages"), - inputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::FixedBytes(32usize,), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes32"), - ), - },], - outputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("PCR0"), - kind: ::ethers::core::abi::ethabi::ParamType::Bytes, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("PCR1"), - kind: ::ethers::core::abi::ethabi::ParamType::Bytes, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("PCR2"), - kind: ::ethers::core::abi::ethabi::ParamType::Bytes, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes"), - ), - }, - ], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - },], - ), - ]), - events: ::core::convert::From::from([ - ( - ::std::borrow::ToOwned::to_owned("EnclaveImageRevoked"), - ::std::vec![::ethers::core::abi::ethabi::Event { - name: ::std::borrow::ToOwned::to_owned("EnclaveImageRevoked",), - inputs: ::std::vec![::ethers::core::abi::ethabi::EventParam { - name: ::std::borrow::ToOwned::to_owned("imageId"), - kind: ::ethers::core::abi::ethabi::ParamType::FixedBytes(32usize,), - indexed: true, - },], - anonymous: false, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("EnclaveImageWhitelisted"), - ::std::vec![::ethers::core::abi::ethabi::Event { - name: ::std::borrow::ToOwned::to_owned("EnclaveImageWhitelisted",), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::EventParam { - name: ::std::borrow::ToOwned::to_owned("imageId"), - kind: ::ethers::core::abi::ethabi::ParamType::FixedBytes(32usize,), - indexed: true, - }, - ::ethers::core::abi::ethabi::EventParam { - name: ::std::borrow::ToOwned::to_owned("PCR0"), - kind: ::ethers::core::abi::ethabi::ParamType::Bytes, - indexed: false, - }, - ::ethers::core::abi::ethabi::EventParam { - name: ::std::borrow::ToOwned::to_owned("PCR1"), - kind: ::ethers::core::abi::ethabi::ParamType::Bytes, - indexed: false, - }, - ::ethers::core::abi::ethabi::EventParam { - name: ::std::borrow::ToOwned::to_owned("PCR2"), - kind: ::ethers::core::abi::ethabi::ParamType::Bytes, - indexed: false, - }, - ], - anonymous: false, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("EnclaveKeyRevoked"), - ::std::vec![::ethers::core::abi::ethabi::Event { - name: ::std::borrow::ToOwned::to_owned("EnclaveKeyRevoked"), - inputs: ::std::vec![::ethers::core::abi::ethabi::EventParam { - name: ::std::borrow::ToOwned::to_owned("enclavePubKey"), - kind: ::ethers::core::abi::ethabi::ParamType::Bytes, - indexed: true, - },], - anonymous: false, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("EnclaveKeyVerified"), - ::std::vec![::ethers::core::abi::ethabi::Event { - name: ::std::borrow::ToOwned::to_owned("EnclaveKeyVerified"), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::EventParam { - name: ::std::borrow::ToOwned::to_owned("enclavePubKey"), - kind: ::ethers::core::abi::ethabi::ParamType::Bytes, - indexed: true, - }, - ::ethers::core::abi::ethabi::EventParam { - name: ::std::borrow::ToOwned::to_owned("imageId"), - kind: ::ethers::core::abi::ethabi::ParamType::FixedBytes(32usize,), - indexed: true, - }, - ], - anonymous: false, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("EnclaveKeyWhitelisted"), - ::std::vec![::ethers::core::abi::ethabi::Event { - name: ::std::borrow::ToOwned::to_owned("EnclaveKeyWhitelisted",), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::EventParam { - name: ::std::borrow::ToOwned::to_owned("enclavePubKey"), - kind: ::ethers::core::abi::ethabi::ParamType::Bytes, - indexed: true, - }, - ::ethers::core::abi::ethabi::EventParam { - name: ::std::borrow::ToOwned::to_owned("imageId"), - kind: ::ethers::core::abi::ethabi::ParamType::FixedBytes(32usize,), - indexed: true, - }, - ], - anonymous: false, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("Initialized"), - ::std::vec![::ethers::core::abi::ethabi::Event { - name: ::std::borrow::ToOwned::to_owned("Initialized"), - inputs: ::std::vec![::ethers::core::abi::ethabi::EventParam { - name: ::std::borrow::ToOwned::to_owned("version"), - kind: ::ethers::core::abi::ethabi::ParamType::Uint(64usize), - indexed: false, - },], - anonymous: false, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("RoleAdminChanged"), - ::std::vec![::ethers::core::abi::ethabi::Event { - name: ::std::borrow::ToOwned::to_owned("RoleAdminChanged"), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::EventParam { - name: ::std::borrow::ToOwned::to_owned("role"), - kind: ::ethers::core::abi::ethabi::ParamType::FixedBytes(32usize,), - indexed: true, - }, - ::ethers::core::abi::ethabi::EventParam { - name: ::std::borrow::ToOwned::to_owned("previousAdminRole"), - kind: ::ethers::core::abi::ethabi::ParamType::FixedBytes(32usize,), - indexed: true, - }, - ::ethers::core::abi::ethabi::EventParam { - name: ::std::borrow::ToOwned::to_owned("newAdminRole"), - kind: ::ethers::core::abi::ethabi::ParamType::FixedBytes(32usize,), - indexed: true, - }, - ], - anonymous: false, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("RoleGranted"), - ::std::vec![::ethers::core::abi::ethabi::Event { - name: ::std::borrow::ToOwned::to_owned("RoleGranted"), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::EventParam { - name: ::std::borrow::ToOwned::to_owned("role"), - kind: ::ethers::core::abi::ethabi::ParamType::FixedBytes(32usize,), - indexed: true, - }, - ::ethers::core::abi::ethabi::EventParam { - name: ::std::borrow::ToOwned::to_owned("account"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - indexed: true, - }, - ::ethers::core::abi::ethabi::EventParam { - name: ::std::borrow::ToOwned::to_owned("sender"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - indexed: true, - }, - ], - anonymous: false, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("RoleRevoked"), - ::std::vec![::ethers::core::abi::ethabi::Event { - name: ::std::borrow::ToOwned::to_owned("RoleRevoked"), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::EventParam { - name: ::std::borrow::ToOwned::to_owned("role"), - kind: ::ethers::core::abi::ethabi::ParamType::FixedBytes(32usize,), - indexed: true, - }, - ::ethers::core::abi::ethabi::EventParam { - name: ::std::borrow::ToOwned::to_owned("account"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - indexed: true, - }, - ::ethers::core::abi::ethabi::EventParam { - name: ::std::borrow::ToOwned::to_owned("sender"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - indexed: true, - }, - ], - anonymous: false, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("Upgraded"), - ::std::vec![::ethers::core::abi::ethabi::Event { - name: ::std::borrow::ToOwned::to_owned("Upgraded"), - inputs: ::std::vec![::ethers::core::abi::ethabi::EventParam { - name: ::std::borrow::ToOwned::to_owned("implementation"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - indexed: true, - },], - anonymous: false, - },], - ), - ]), - errors: ::core::convert::From::from([ - ( - ::std::borrow::ToOwned::to_owned("AccessControlBadConfirmation"), - ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("AccessControlBadConfirmation",), - inputs: ::std::vec![], - },], - ), - ( - ::std::borrow::ToOwned::to_owned("AccessControlUnauthorizedAccount"), - ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("AccessControlUnauthorizedAccount",), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("account"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("neededRole"), - kind: ::ethers::core::abi::ethabi::ParamType::FixedBytes(32usize,), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes32"), - ), - }, - ], - },], - ), - ( - ::std::borrow::ToOwned::to_owned("AddressEmptyCode"), - ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("AddressEmptyCode"), - inputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("target"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - },], - },], - ), - ( - ::std::borrow::ToOwned::to_owned("AttestationVerifierAttestationTooOld"), - ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned( - "AttestationVerifierAttestationTooOld", - ), - inputs: ::std::vec![], - },], - ), - ( - ::std::borrow::ToOwned::to_owned("AttestationVerifierCannotRemoveAllAdmins"), - ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned( - "AttestationVerifierCannotRemoveAllAdmins", - ), - inputs: ::std::vec![], - },], - ), - ( - ::std::borrow::ToOwned::to_owned("AttestationVerifierImageAlreadyWhitelisted"), - ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned( - "AttestationVerifierImageAlreadyWhitelisted", - ), - inputs: ::std::vec![], - },], - ), - ( - ::std::borrow::ToOwned::to_owned("AttestationVerifierImageNotWhitelisted"), - ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned( - "AttestationVerifierImageNotWhitelisted", - ), - inputs: ::std::vec![], - },], - ), - ( - ::std::borrow::ToOwned::to_owned("AttestationVerifierInitLengthMismatch"), - ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned( - "AttestationVerifierInitLengthMismatch", - ), - inputs: ::std::vec![], - },], - ), - ( - ::std::borrow::ToOwned::to_owned("AttestationVerifierInvalidAdmin"), - ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("AttestationVerifierInvalidAdmin",), - inputs: ::std::vec![], - },], - ), - ( - ::std::borrow::ToOwned::to_owned("AttestationVerifierKeyAlreadyVerified"), - ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned( - "AttestationVerifierKeyAlreadyVerified", - ), - inputs: ::std::vec![], - },], - ), - ( - ::std::borrow::ToOwned::to_owned("AttestationVerifierKeyNotVerified"), - ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("AttestationVerifierKeyNotVerified",), - inputs: ::std::vec![], - },], - ), - ( - ::std::borrow::ToOwned::to_owned("AttestationVerifierNoImageProvided"), - ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned( - "AttestationVerifierNoImageProvided", - ), - inputs: ::std::vec![], - },], - ), - ( - ::std::borrow::ToOwned::to_owned("AttestationVerifierPCRsInvalid"), - ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("AttestationVerifierPCRsInvalid",), - inputs: ::std::vec![], - },], - ), - ( - ::std::borrow::ToOwned::to_owned("AttestationVerifierPubkeyLengthInvalid"), - ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned( - "AttestationVerifierPubkeyLengthInvalid", - ), - inputs: ::std::vec![], - },], - ), - ( - ::std::borrow::ToOwned::to_owned("ECDSAInvalidSignature"), - ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("ECDSAInvalidSignature",), - inputs: ::std::vec![], - },], - ), - ( - ::std::borrow::ToOwned::to_owned("ECDSAInvalidSignatureLength"), - ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("ECDSAInvalidSignatureLength",), - inputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("length"), - kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256"), - ), - },], - },], - ), - ( - ::std::borrow::ToOwned::to_owned("ECDSAInvalidSignatureS"), - ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("ECDSAInvalidSignatureS",), - inputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("s"), - kind: ::ethers::core::abi::ethabi::ParamType::FixedBytes(32usize,), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes32"), - ), - },], - },], - ), - ( - ::std::borrow::ToOwned::to_owned("ERC1967InvalidImplementation"), - ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("ERC1967InvalidImplementation",), - inputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("implementation"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - },], - },], - ), - ( - ::std::borrow::ToOwned::to_owned("ERC1967NonPayable"), - ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("ERC1967NonPayable"), - inputs: ::std::vec![], - },], - ), - ( - ::std::borrow::ToOwned::to_owned("FailedInnerCall"), - ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("FailedInnerCall"), - inputs: ::std::vec![], - },], - ), - ( - ::std::borrow::ToOwned::to_owned("InvalidInitialization"), - ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("InvalidInitialization",), - inputs: ::std::vec![], - },], - ), - ( - ::std::borrow::ToOwned::to_owned("NotInitializing"), - ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("NotInitializing"), - inputs: ::std::vec![], - },], - ), - ( - ::std::borrow::ToOwned::to_owned("UUPSUnauthorizedCallContext"), - ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("UUPSUnauthorizedCallContext",), - inputs: ::std::vec![], - },], - ), - ( - ::std::borrow::ToOwned::to_owned("UUPSUnsupportedProxiableUUID"), - ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("UUPSUnsupportedProxiableUUID",), - inputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("slot"), - kind: ::ethers::core::abi::ethabi::ParamType::FixedBytes(32usize,), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes32"), - ), - },], - },], - ), - ]), - receive: false, - fallback: false, - } - } - ///The parsed JSON ABI of the contract. - pub static ATTESTATIONVERIFIER_ABI: ::ethers::contract::Lazy<::ethers::core::abi::Abi> = - ::ethers::contract::Lazy::new(__abi); - #[rustfmt::skip] - const __BYTECODE: &[u8] = b"`\xA0`@R0`\x80R4\x80\x15a\0\x14W`\0\x80\xFD[Pa\0\x1Da\0\"V[a\0\xD4V[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x80Th\x01\0\0\0\0\0\0\0\0\x90\x04`\xFF\x16\x15a\0rW`@Qc\xF9.\xE8\xA9`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x80T`\x01`\x01`@\x1B\x03\x90\x81\x16\x14a\0\xD1W\x80T`\x01`\x01`@\x1B\x03\x19\x16`\x01`\x01`@\x1B\x03\x90\x81\x17\x82U`@Q\x90\x81R\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x90` \x01`@Q\x80\x91\x03\x90\xA1[PV[`\x80Qa#\xA6b\0\0\xFE`\09`\0\x81\x81a\x0BH\x01R\x81\x81a\x0Bq\x01Ra\x0C\xBC\x01Ra#\xA6`\0\xF3\xFE`\x80`@R`\x046\x10a\x015W`\x005`\xE0\x1C\x80c\x8Ev\n\xFE\x11a\0\xABW\x80c\xC6Z\x91j\x11a\0oW\x80c\xC6Z\x91j\x14a\x03wW\x80c\xD17\x14\xB4\x14a\x03\x97W\x80c\xD5Gt\x1F\x14a\x03\xB7W\x80c\xDA\x99L\xD8\x14a\x03\xD7W\x80c\xDE\xBFrk\x14a\x04\x05W\x80c\xEA\xC7\x08\xA3\x14a\x04%W`\0\x80\xFD[\x80c\x8Ev\n\xFE\x14a\x02\xC4W\x80c\x91\xD1HT\x14a\x02\xE4W\x80c\x95\xC6\x02\x94\x14a\x03\x04W\x80c\xA2\x17\xFD\xDF\x14a\x03$W\x80c\xAD<\xB1\xCC\x14a\x039W`\0\x80\xFD[\x80c6V\x8A\xBE\x11a\0\xFDW\x80c6V\x8A\xBE\x14a\x02\x04W\x80cO\x1E\xF2\x86\x14a\x02$W\x80cR\xD1\x90-\x14a\x027W\x80ci\x81^W\x14a\x02LW\x80cp\xAE\x99*\x14a\x02lW\x80cu\x84{\x84\x14a\x02\xA4W`\0\x80\xFD[\x80c\x01\xFF\xC9\xA7\x14a\x01:W\x80c\r\xCA\xEA\xF2\x14a\x01oW\x80c$\x8A\x9C\xA3\x14a\x01\x93W\x80c//\xF1]\x14a\x01\xB3W\x80c/\x9B\n\xD7\x14a\x01\xD5W[`\0\x80\xFD[4\x80\x15a\x01FW`\0\x80\xFD[Pa\x01Za\x01U6`\x04a\x18\xD7V[a\x04EV[`@Q\x90\x15\x15\x81R` \x01[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x01{W`\0\x80\xFD[Pa\x01\x85a\x01,\x81V[`@Q\x90\x81R` \x01a\x01fV[4\x80\x15a\x01\x9FW`\0\x80\xFD[Pa\x01\x85a\x01\xAE6`\x04a\x19\x01V[a\x04VV[4\x80\x15a\x01\xBFW`\0\x80\xFD[Pa\x01\xD3a\x01\xCE6`\x04a\x196V[a\x04xV[\0[4\x80\x15a\x01\xE1W`\0\x80\xFD[Pa\x01\xF5a\x01\xF06`\x04a\x19\x01V[a\x04\x9AV[`@Qa\x01f\x93\x92\x91\x90a\x19\xB2V[4\x80\x15a\x02\x10W`\0\x80\xFD[Pa\x01\xD3a\x02\x1F6`\x04a\x196V[a\x06UV[a\x01\xD3a\x0226`\x04a\x1B\x02V[a\x06\x8DV[4\x80\x15a\x02CW`\0\x80\xFD[Pa\x01\x85a\x06\xACV[4\x80\x15a\x02XW`\0\x80\xFD[Pa\x01\xD3a\x02g6`\x04a\x1BOV[a\x06\xC9V[4\x80\x15a\x02xW`\0\x80\xFD[Pa\x02\x8Ca\x02\x876`\x04a\x1B\xD6V[a\x06\xFEV[`@Q`\x01`\x01`\xA0\x1B\x03\x90\x91\x16\x81R` \x01a\x01fV[4\x80\x15a\x02\xB0W`\0\x80\xFD[Pa\x01\xD3a\x02\xBF6`\x04a\x1C\x12V[a\x07\tV[4\x80\x15a\x02\xD0W`\0\x80\xFD[Pa\x01\xD3a\x02\xDF6`\x04a\x1B\xD6V[a\x07\x13V[4\x80\x15a\x02\xF0W`\0\x80\xFD[Pa\x01Za\x02\xFF6`\x04a\x196V[a\x078V[4\x80\x15a\x03\x10W`\0\x80\xFD[Pa\x01\xD3a\x03\x1F6`\x04a\x19\x01V[a\x07pV[4\x80\x15a\x030W`\0\x80\xFD[Pa\x01\x85`\0\x81V[4\x80\x15a\x03EW`\0\x80\xFD[Pa\x03j`@Q\x80`@\x01`@R\x80`\x05\x81R` \x01d\x03R\xE3\x02\xE3`\xDC\x1B\x81RP\x81V[`@Qa\x01f\x91\x90a\x1D\x1BV[4\x80\x15a\x03\x83W`\0\x80\xFD[Pa\x01\xD3a\x03\x926`\x04a\x1D\xDBV[a\x07\x84V[4\x80\x15a\x03\xA3W`\0\x80\xFD[Pa\x01\xD3a\x03\xB26`\x04a\x1B\xD6V[a\t\x8BV[4\x80\x15a\x03\xC3W`\0\x80\xFD[Pa\x01\xD3a\x03\xD26`\x04a\x196V[a\t\x9FV[4\x80\x15a\x03\xE3W`\0\x80\xFD[Pa\x01\x85a\x03\xF26`\x04a\x1F#\xA9f.\xFC\x9C\"\x9Cj\0\x80T`\x01`@\x1B\x81\x04`\xFF\x16\x15\x90`\x01`\x01`@\x1B\x03\x16`\0\x81\x15\x80\x15a\x07\xC9WP\x82[\x90P`\0\x82`\x01`\x01`@\x1B\x03\x16`\x01\x14\x80\x15a\x07\xE5WP0;\x15[\x90P\x81\x15\x80\x15a\x07\xF3WP\x80\x15[\x15a\x08\x11W`@Qc\xF9.\xE8\xA9`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x84Tg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x19\x16`\x01\x17\x85U\x83\x15a\x08;W\x84T`\xFF`@\x1B\x19\x16`\x01`@\x1B\x17\x85U[\x87Q`\0\x03a\x08]W`@Qc\xB6\x0F\"\xAF`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x86Q\x88Q\x14a\x08\x7FW`@QcF\xD6\x0BW`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\x01`\xA0\x1B\x03\x86\x16a\x08\xA6W`@Qc\x1F`\xF3\x9F`\xE3\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x08\xAEa\x12\xA2V[a\x08\xB6a\x12\xA2V[a\x08\xBEa\x12\xA2V[a\x08\xC6a\x12\xA2V[a\x08\xD1`\0\x87a\n\x1CV[P`\0[\x87Q\x81\x10\x15a\t:W`\0a\t\x02\x8A\x83\x81Q\x81\x10a\x08\xF5Wa\x08\xF5a!#V[` \x02` \x01\x01Qa\x0C\xFAV[\x90Pa\t'\x89\x83\x81Q\x81\x10a\t\x19Wa\t\x19a!#V[` \x02` \x01\x01Q\x82a\x12\xAAV[P\x80a\t2\x81a!OV[\x91PPa\x08\xD5V[P\x83\x15a\t\x81W\x84T`\xFF`@\x1B\x19\x16\x85U`@Q`\x01\x81R\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x90` \x01`@Q\x80\x91\x03\x90\xA1[PPPPPPPPV[`\0a\t\x96\x81a\n\x0FV[a\x06\xA8\x82a\x13\x8DV[a\t\xA8\x82a\x04VV[a\t\xB1\x81a\n\x0FV[a\x04\x94\x83\x83a\n\xC1V[`\0a\t\xC6\x81a\n\x0FV[a\x06\x88\x83\x83a\x12\xAAV[a\x06\xA8\x82\x82a\x10\x0EV[`\0`\x01`\x01`\xE0\x1B\x03\x19\x82\x16cye\xDB\x0B`\xE0\x1B\x14\x80a\x04PWPc\x01\xFF\xC9\xA7`\xE0\x1B`\x01`\x01`\xE0\x1B\x03\x19\x83\x16\x14a\x04PV[a\n\x19\x813a\x140V[PV[`\0`\0\x80Q` a#Q\x839\x81Q\x91Ra\n7\x84\x84a\x078V[a\n\xB7W`\0\x84\x81R` \x82\x81R`@\x80\x83 `\x01`\x01`\xA0\x1B\x03\x87\x16\x84R\x90\x91R\x90 \x80T`\xFF\x19\x16`\x01\x17\x90Ua\nm3\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x83`\x01`\x01`\xA0\x1B\x03\x16\x85\x7F/\x87\x88\x11~~\xFF\x1D\x82\xE9&\xECyI\x01\xD1|x\x02JP'\t@0E@\xA73eo\r`@Q`@Q\x80\x91\x03\x90\xA4`\x01\x91PPa\x04PV[`\0\x91PPa\x04PV[`\0`\0\x80Q` a#Q\x839\x81Q\x91Ra\n\xDC\x84\x84a\x078V[\x15a\n\xB7W`\0\x84\x81R` \x82\x81R`@\x80\x83 `\x01`\x01`\xA0\x1B\x03\x87\x16\x80\x85R\x92R\x80\x83 \x80T`\xFF\x19\x16\x90UQ3\x92\x87\x91\x7F\xF69\x1F\\2\xD9\xC6\x9D*G\xEAg\x0BD)t\xB595\xD1\xED\xC7\xFDd\xEB!\xE0G\xA89\x17\x1B\x91\x90\xA4`\x01\x91PPa\x04PV[0`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x14\x80a\x0B\xC4WP\x7F\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`\x01`\x01`\xA0\x1B\x03\x16a\x0B\xB8`\0\x80Q` a#1\x839\x81Q\x91RT`\x01`\x01`\xA0\x1B\x03\x16\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x14\x15[\x15a\x0B\xE2W`@Qcp>F\xDD`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[`\0a\x06\xA8\x81a\n\x0FV[\x81`\x01`\x01`\xA0\x1B\x03\x16cR\xD1\x90-`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x92PPP\x80\x15a\x0CIWP`@\x80Q`\x1F=\x90\x81\x01`\x1F\x19\x16\x82\x01\x90\x92Ra\x0CF\x91\x81\x01\x90a!hV[`\x01[a\x0CvW`@QcL\x9C\x8C\xE3`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x83\x16`\x04\x82\x01R`$\x01[`@Q\x80\x91\x03\x90\xFD[`\0\x80Q` a#1\x839\x81Q\x91R\x81\x14a\x0C\xA7W`@Qc*\x87Ri`\xE2\x1B\x81R`\x04\x81\x01\x82\x90R`$\x01a\x0CmV[a\x06\x88\x83\x83a\x14iV[0`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x14a\x0B\xE2W`@Qcp>F\xDD`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x80QQ`\0\x90`0\x14\x80\x15a\r\x14WP\x81` \x01QQ`0\x14[\x80\x15a\r%WP\x81`@\x01QQ`0\x14[a\rBW`@Qc\x977P\xFF`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0\x82`\0\x01Q\x83` \x01Q\x84`@\x01Q`@Q` \x01a\re\x93\x92\x91\x90a!\x81V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x81R\x81Q` \x92\x83\x01 `\0\x81\x81Ra\x01\xF4\x90\x93R\x91 \x80T\x91\x92P\x90a\r\x99\x90a\x1F\x9BV[\x15\x90Pa\r\xB9W`@Qc\x1A3\x94i`\xE3\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`@\x80Q``\x81\x01\x82R\x84Q\x81R` \x80\x86\x01Q\x81\x83\x01R\x85\x83\x01Q\x82\x84\x01R`\0\x84\x81Ra\x01\xF4\x90\x91R\x91\x90\x91 \x81Q\x81\x90a\r\xF6\x90\x82a\"\nV[P` \x82\x01Q`\x01\x82\x01\x90a\x0E\x0B\x90\x82a\"\nV[P`@\x82\x01Q`\x02\x82\x01\x90a\x0E \x90\x82a\"\nV[P\x90PP\x80\x7FR\xB2\x9B\xBD\xD9z\xB9\x83A\x9FP\xFA\x15\x90\xE5\xABu\xE9\x94\"y\xE9^\x10\xA0\x86\x07\xB0l##\x8B\x84`\0\x01Q\x85` \x01Q\x86`@\x01Q`@Qa\x0Ed\x93\x92\x91\x90a\x19\xB2V[`@Q\x80\x91\x03\x90\xA2\x92\x91PPV[`\0\x81Q`@\x14a\x0E\x96W`@Qc\x123\xAD\xCD`\xE2\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[P\x80Q` \x90\x91\x01 \x90V[a\x0E\xAEa\x01,Ba\"\xC9V[a\x03\xE8\x82`\x80\x01Qa\x0E\xC0\x91\x90a\"\xDCV[\x11a\x0E\xDEW`@Qci\xBB\x1F\xDD`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0\x81` \x01Q\x82`@\x01Q\x83``\x01Q`@Q` \x01a\x0F\x01\x93\x92\x91\x90a!\x81V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x81R\x81Q` \x92\x83\x01 `\0\x81\x81Ra\x01\xF4\x90\x93R\x91 \x80T\x91\x92P\x90a\x0F5\x90a\x1F\x9BV[\x90P`\0\x03a\x0FWW`@Qcf\x08\x07\x11`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0a\x0Ff\x83`\0\x01Qa\x06\xFEV[`\x01`\x01`\xA0\x1B\x03\x81\x16`\0\x90\x81Ra\x01\xF5` R`@\x90 T\x90\x91P\x15a\x0F\xA1W`@Qc!u\x1C\xFB`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x0F\xAB\x84\x84a\x10\x0EV[`\x01`\x01`\xA0\x1B\x03\x81\x16`\0\x90\x81Ra\x01\xF5` R`@\x90\x81\x90 \x83\x90U\x83Q\x90Q\x83\x91a\x0F\xD8\x91a\"\xFEV[`@Q\x90\x81\x90\x03\x81 \x90\x7F\xF4\x83\x7F\x1Af\xA1\xE5\xFB\xDE,@\xD0\xF6\xEF\xF7Q\x83\x13\x9Ey\xB0\xFC\x1E\xAA\xB2\x80\xA3\xA0\xBE8\xE7\xB1\x90`\0\x90\xA3PPPPV[`\0\x7Fh\x89\xDFGl\xA3\x8F?KA|\x17\xEBIf\x82\xEB@\x1BOA\xA2%\x97A\xA7\x8A\xCCH\x1E\xA8\x05\x82`\0\x01Q\x80Q\x90` \x01 \x83` \x01Q\x80Q\x90` \x01 \x84`@\x01Q\x80Q\x90` \x01 \x85``\x01Q\x80Q\x90` \x01 \x86`\x80\x01Q`@Q` \x01a\x10\x9E\x96\x95\x94\x93\x92\x91\x90\x95\x86R` \x86\x01\x94\x90\x94R`@\x85\x01\x92\x90\x92R``\x84\x01R`\x80\x83\x01R`\xA0\x82\x01R`\xC0\x01\x90V[`@\x80Q\x80\x83\x03`\x1F\x19\x01\x81R\x82\x82R\x80Q` \x91\x82\x01 \x7F\xB09HDc4\xEB\x9B!\x96\xD5\xEB\x16oi\xB9\xD4\x94\x03\xEBJ\x12\xF3m\xE8\xD3\xF9\xF3\xCB\x8E\x15\xC3\x82\x85\x01R\x7F\xDD\xD5H\x1F\x81\x8A\xBBX\x93\xC8Re\x0Bu\xBD\x1F\x15T\x9C\xD1\xC0#1\xDB~\xD0\x10\xFCa\xE6Nr\x84\x84\x01R\x7F\xC8\x9E\xFD\xAAT\xC0\xF2\x0Cz\xDFa(\x82\xDF\tP\xF5\xA9Qc~\x03\x07\xCD\xCBLg/)\x8B\x8B\xC6``\x80\x86\x01\x91\x90\x91R\x83Q\x80\x86\x03\x90\x91\x01\x81R`\x80\x85\x01\x84R\x80Q\x90\x83\x01 a\x19\x01`\xF0\x1B`\xA0\x86\x01R`\xA2\x85\x01R`\xC2\x80\x85\x01\x82\x90R\x83Q\x80\x86\x03\x90\x91\x01\x81R`\xE2\x90\x94\x01\x90\x92R\x82Q\x92\x01\x91\x90\x91 \x90\x91P`\0a\x11\x81\x82\x86a\x14\xBFV[`\x01`\x01`\xA0\x1B\x03\x81\x16`\0\x90\x81Ra\x01\xF5` R`@\x90 T\x90\x91P\x80a\x11\xBCW`@Qc\x0B\xFD\x93G`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0\x81\x81Ra\x01\xF4` R`@\x90 \x80Ta\x11\xD6\x90a\x1F\x9BV[\x90P`\0\x03a\x11\xF8W`@Qcf\x08\x07\x11`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[PPPPPPV[`\0\x81\x81Ra\x01\xF4` R`@\x90 \x80Ta\x12\x1A\x90a\x1F\x9BV[\x90P`\0\x03a\x12#\xA9f.\xFC\x9C\"\x9Cj\0T`\x01`@\x1B\x90\x04`\xFF\x16a\x0B\xE2W`@Qc\x1A\xFC\xD7\x9F`\xE3\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x80`\x01`\x01`\xA0\x1B\x03\x16;`\0\x03a\x15hW`@QcL\x9C\x8C\xE3`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x82\x16`\x04\x82\x01R`$\x01a\x0CmV[`\0\x80Q` a#1\x839\x81Q\x91R\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16`\x01`\x01`\xA0\x1B\x03\x92\x90\x92\x16\x91\x90\x91\x17\x90UV[```\0\x80\x84`\x01`\x01`\xA0\x1B\x03\x16\x84`@Qa\x15\xB4\x91\x90a\"\xFEV[`\0`@Q\x80\x83\x03\x81\x85Z\xF4\x91PP=\x80`\0\x81\x14a\x15\xEFW`@Q\x91P`\x1F\x19`?=\x01\x16\x82\x01`@R=\x82R=`\0` \x84\x01>a\x15\xF4V[``\x91P[P\x91P\x91Pa\x16\x04\x85\x83\x83a\x172V[\x95\x94PPPPPV[4\x15a\x0B\xE2W`@Qc\xB3\x98\x97\x9F`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0\x80`\0\x83Q`A\x03a\x16fW` \x84\x01Q`@\x85\x01Q``\x86\x01Q`\0\x1Aa\x16X\x88\x82\x85\x85a\x17\x91V[\x95P\x95P\x95PPPPa\x16rV[PP\x81Q`\0\x91P`\x02\x90[\x92P\x92P\x92V[`\0\x82`\x03\x81\x11\x15a\x16\x8DWa\x16\x8Da#\x1AV[\x03a\x16\x96WPPV[`\x01\x82`\x03\x81\x11\x15a\x16\xAAWa\x16\xAAa#\x1AV[\x03a\x16\xC8W`@Qc\xF6E\xEE\xDF`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x02\x82`\x03\x81\x11\x15a\x16\xDCWa\x16\xDCa#\x1AV[\x03a\x16\xFDW`@Qc\xFC\xE6\x98\xF7`\xE0\x1B\x81R`\x04\x81\x01\x82\x90R`$\x01a\x0CmV[`\x03\x82`\x03\x81\x11\x15a\x17\x11Wa\x17\x11a#\x1AV[\x03a\x06\xA8W`@Qc5\xE2\xF3\x83`\xE2\x1B\x81R`\x04\x81\x01\x82\x90R`$\x01a\x0CmV[``\x82a\x17GWa\x17B\x82a\x18`V[a\x17\x8AV[\x81Q\x15\x80\x15a\x17^WP`\x01`\x01`\xA0\x1B\x03\x84\x16;\x15[\x15a\x17\x87W`@Qc\x99\x96\xB3\x15`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x85\x16`\x04\x82\x01R`$\x01a\x0CmV[P\x80[\x93\x92PPPV[`\0\x80\x80\x7F\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF]WnsW\xA4P\x1D\xDF\xE9/Fh\x1B \xA0\x84\x11\x15a\x17\xCCWP`\0\x91P`\x03\x90P\x82a\x18VV[`@\x80Q`\0\x80\x82R` \x82\x01\x80\x84R\x8A\x90R`\xFF\x89\x16\x92\x82\x01\x92\x90\x92R``\x81\x01\x87\x90R`\x80\x81\x01\x86\x90R`\x01\x90`\xA0\x01` `@Q` \x81\x03\x90\x80\x84\x03\x90\x85Z\xFA\x15\x80\x15a\x18 W=`\0\x80>=`\0\xFD[PP`@Q`\x1F\x19\x01Q\x91PP`\x01`\x01`\xA0\x1B\x03\x81\x16a\x18LWP`\0\x92P`\x01\x91P\x82\x90Pa\x18VV[\x92P`\0\x91P\x81\x90P[\x94P\x94P\x94\x91PPV[\x80Q\x15a\x18pW\x80Q\x80\x82` \x01\xFD[`@Qc\n\x12\xF5!`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[P\x80Ta\x18\x95\x90a\x1F\x9BV[`\0\x82U\x80`\x1F\x10a\x18\xA5WPPV[`\x1F\x01` \x90\x04\x90`\0R` `\0 \x90\x81\x01\x90a\n\x19\x91\x90[\x80\x82\x11\x15a\x18\xD3W`\0\x81U`\x01\x01a\x18\xBFV[P\x90V[`\0` \x82\x84\x03\x12\x15a\x18\xE9W`\0\x80\xFD[\x815`\x01`\x01`\xE0\x1B\x03\x19\x81\x16\x81\x14a\x17\x8AW`\0\x80\xFD[`\0` \x82\x84\x03\x12\x15a\x19\x13W`\0\x80\xFD[P5\x91\x90PV[\x805`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a\x191W`\0\x80\xFD[\x91\x90PV[`\0\x80`@\x83\x85\x03\x12\x15a\x19IW`\0\x80\xFD[\x825\x91Pa\x19Y` \x84\x01a\x19\x1AV[\x90P\x92P\x92\x90PV[`\0[\x83\x81\x10\x15a\x19}W\x81\x81\x01Q\x83\x82\x01R` \x01a\x19eV[PP`\0\x91\x01RV[`\0\x81Q\x80\x84Ra\x19\x9E\x81` \x86\x01` \x86\x01a\x19bV[`\x1F\x01`\x1F\x19\x16\x92\x90\x92\x01` \x01\x92\x91PPV[``\x81R`\0a\x19\xC5``\x83\x01\x86a\x19\x86V[\x82\x81\x03` \x84\x01Ra\x19\xD7\x81\x86a\x19\x86V[\x90P\x82\x81\x03`@\x84\x01Ra\x19\xEB\x81\x85a\x19\x86V[\x96\x95PPPPPPV[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`@Q`\xA0\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a\x1A-Wa\x1A-a\x19\xF5V[`@R\x90V[`@Q``\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a\x1A-Wa\x1A-a\x19\xF5V[`@Q`\x1F\x82\x01`\x1F\x19\x16\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a\x1A}Wa\x1A}a\x19\xF5V[`@R\x91\x90PV[`\0`\x01`\x01`@\x1B\x03\x82\x11\x15a\x1A\x9EWa\x1A\x9Ea\x19\xF5V[P`\x1F\x01`\x1F\x19\x16` \x01\x90V[`\0\x82`\x1F\x83\x01\x12a\x1A\xBDW`\0\x80\xFD[\x815a\x1A\xD0a\x1A\xCB\x82a\x1A\x85V[a\x1AUV[\x81\x81R\x84` \x83\x86\x01\x01\x11\x15a\x1A\xE5W`\0\x80\xFD[\x81` \x85\x01` \x83\x017`\0\x91\x81\x01` \x01\x91\x90\x91R\x93\x92PPPV[`\0\x80`@\x83\x85\x03\x12\x15a\x1B\x15W`\0\x80\xFD[a\x1B\x1E\x83a\x19\x1AV[\x91P` \x83\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a\x1B9W`\0\x80\xFD[a\x1BE\x85\x82\x86\x01a\x1A\xACV[\x91PP\x92P\x92\x90PV[`\0\x80`\0``\x84\x86\x03\x12\x15a\x1BdW`\0\x80\xFD[\x835`\x01`\x01`@\x1B\x03\x80\x82\x11\x15a\x1B{W`\0\x80\xFD[a\x1B\x87\x87\x83\x88\x01a\x1A\xACV[\x94P` \x86\x015\x91P\x80\x82\x11\x15a\x1B\x9DW`\0\x80\xFD[a\x1B\xA9\x87\x83\x88\x01a\x1A\xACV[\x93P`@\x86\x015\x91P\x80\x82\x11\x15a\x1B\xBFW`\0\x80\xFD[Pa\x1B\xCC\x86\x82\x87\x01a\x1A\xACV[\x91PP\x92P\x92P\x92V[`\0` \x82\x84\x03\x12\x15a\x1B\xE8W`\0\x80\xFD[\x815`\x01`\x01`@\x1B\x03\x81\x11\x15a\x1B\xFEW`\0\x80\xFD[a\x1C\n\x84\x82\x85\x01a\x1A\xACV[\x94\x93PPPPV[`\0\x80`@\x83\x85\x03\x12\x15a\x1C%W`\0\x80\xFD[\x825`\x01`\x01`@\x1B\x03\x80\x82\x11\x15a\x1C v\xCC75\xA9 \xA3\xCAP]8+\xBC\x02\xDD{\xC7\xDE\xC4\xDC\xEE\xDD\xA7u\xE5\x8D\xD5A\xE0\x8A\x11llS\x81\\\x0B\xD0(\x19/{bh\0\xA2dipfsX\"\x12 \x88\x0F\x82\xD0\x186O\xC5\xCAHMz\x8D\x8DUw`g8\xF9\x86Z-\xE4Q\t\xDA\xFE\\u\x06\x89dsolcC\0\x08\x14\x003"; - /// The bytecode of the contract. - pub static ATTESTATIONVERIFIER_BYTECODE: ::ethers::core::types::Bytes = - ::ethers::core::types::Bytes::from_static(__BYTECODE); - #[rustfmt::skip] - const __DEPLOYED_BYTECODE: &[u8] = b"`\x80`@R`\x046\x10a\x015W`\x005`\xE0\x1C\x80c\x8Ev\n\xFE\x11a\0\xABW\x80c\xC6Z\x91j\x11a\0oW\x80c\xC6Z\x91j\x14a\x03wW\x80c\xD17\x14\xB4\x14a\x03\x97W\x80c\xD5Gt\x1F\x14a\x03\xB7W\x80c\xDA\x99L\xD8\x14a\x03\xD7W\x80c\xDE\xBFrk\x14a\x04\x05W\x80c\xEA\xC7\x08\xA3\x14a\x04%W`\0\x80\xFD[\x80c\x8Ev\n\xFE\x14a\x02\xC4W\x80c\x91\xD1HT\x14a\x02\xE4W\x80c\x95\xC6\x02\x94\x14a\x03\x04W\x80c\xA2\x17\xFD\xDF\x14a\x03$W\x80c\xAD<\xB1\xCC\x14a\x039W`\0\x80\xFD[\x80c6V\x8A\xBE\x11a\0\xFDW\x80c6V\x8A\xBE\x14a\x02\x04W\x80cO\x1E\xF2\x86\x14a\x02$W\x80cR\xD1\x90-\x14a\x027W\x80ci\x81^W\x14a\x02LW\x80cp\xAE\x99*\x14a\x02lW\x80cu\x84{\x84\x14a\x02\xA4W`\0\x80\xFD[\x80c\x01\xFF\xC9\xA7\x14a\x01:W\x80c\r\xCA\xEA\xF2\x14a\x01oW\x80c$\x8A\x9C\xA3\x14a\x01\x93W\x80c//\xF1]\x14a\x01\xB3W\x80c/\x9B\n\xD7\x14a\x01\xD5W[`\0\x80\xFD[4\x80\x15a\x01FW`\0\x80\xFD[Pa\x01Za\x01U6`\x04a\x18\xD7V[a\x04EV[`@Q\x90\x15\x15\x81R` \x01[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x01{W`\0\x80\xFD[Pa\x01\x85a\x01,\x81V[`@Q\x90\x81R` \x01a\x01fV[4\x80\x15a\x01\x9FW`\0\x80\xFD[Pa\x01\x85a\x01\xAE6`\x04a\x19\x01V[a\x04VV[4\x80\x15a\x01\xBFW`\0\x80\xFD[Pa\x01\xD3a\x01\xCE6`\x04a\x196V[a\x04xV[\0[4\x80\x15a\x01\xE1W`\0\x80\xFD[Pa\x01\xF5a\x01\xF06`\x04a\x19\x01V[a\x04\x9AV[`@Qa\x01f\x93\x92\x91\x90a\x19\xB2V[4\x80\x15a\x02\x10W`\0\x80\xFD[Pa\x01\xD3a\x02\x1F6`\x04a\x196V[a\x06UV[a\x01\xD3a\x0226`\x04a\x1B\x02V[a\x06\x8DV[4\x80\x15a\x02CW`\0\x80\xFD[Pa\x01\x85a\x06\xACV[4\x80\x15a\x02XW`\0\x80\xFD[Pa\x01\xD3a\x02g6`\x04a\x1BOV[a\x06\xC9V[4\x80\x15a\x02xW`\0\x80\xFD[Pa\x02\x8Ca\x02\x876`\x04a\x1B\xD6V[a\x06\xFEV[`@Q`\x01`\x01`\xA0\x1B\x03\x90\x91\x16\x81R` \x01a\x01fV[4\x80\x15a\x02\xB0W`\0\x80\xFD[Pa\x01\xD3a\x02\xBF6`\x04a\x1C\x12V[a\x07\tV[4\x80\x15a\x02\xD0W`\0\x80\xFD[Pa\x01\xD3a\x02\xDF6`\x04a\x1B\xD6V[a\x07\x13V[4\x80\x15a\x02\xF0W`\0\x80\xFD[Pa\x01Za\x02\xFF6`\x04a\x196V[a\x078V[4\x80\x15a\x03\x10W`\0\x80\xFD[Pa\x01\xD3a\x03\x1F6`\x04a\x19\x01V[a\x07pV[4\x80\x15a\x030W`\0\x80\xFD[Pa\x01\x85`\0\x81V[4\x80\x15a\x03EW`\0\x80\xFD[Pa\x03j`@Q\x80`@\x01`@R\x80`\x05\x81R` \x01d\x03R\xE3\x02\xE3`\xDC\x1B\x81RP\x81V[`@Qa\x01f\x91\x90a\x1D\x1BV[4\x80\x15a\x03\x83W`\0\x80\xFD[Pa\x01\xD3a\x03\x926`\x04a\x1D\xDBV[a\x07\x84V[4\x80\x15a\x03\xA3W`\0\x80\xFD[Pa\x01\xD3a\x03\xB26`\x04a\x1B\xD6V[a\t\x8BV[4\x80\x15a\x03\xC3W`\0\x80\xFD[Pa\x01\xD3a\x03\xD26`\x04a\x196V[a\t\x9FV[4\x80\x15a\x03\xE3W`\0\x80\xFD[Pa\x01\x85a\x03\xF26`\x04a\x1F#\xA9f.\xFC\x9C\"\x9Cj\0\x80T`\x01`@\x1B\x81\x04`\xFF\x16\x15\x90`\x01`\x01`@\x1B\x03\x16`\0\x81\x15\x80\x15a\x07\xC9WP\x82[\x90P`\0\x82`\x01`\x01`@\x1B\x03\x16`\x01\x14\x80\x15a\x07\xE5WP0;\x15[\x90P\x81\x15\x80\x15a\x07\xF3WP\x80\x15[\x15a\x08\x11W`@Qc\xF9.\xE8\xA9`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x84Tg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x19\x16`\x01\x17\x85U\x83\x15a\x08;W\x84T`\xFF`@\x1B\x19\x16`\x01`@\x1B\x17\x85U[\x87Q`\0\x03a\x08]W`@Qc\xB6\x0F\"\xAF`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x86Q\x88Q\x14a\x08\x7FW`@QcF\xD6\x0BW`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\x01`\xA0\x1B\x03\x86\x16a\x08\xA6W`@Qc\x1F`\xF3\x9F`\xE3\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x08\xAEa\x12\xA2V[a\x08\xB6a\x12\xA2V[a\x08\xBEa\x12\xA2V[a\x08\xC6a\x12\xA2V[a\x08\xD1`\0\x87a\n\x1CV[P`\0[\x87Q\x81\x10\x15a\t:W`\0a\t\x02\x8A\x83\x81Q\x81\x10a\x08\xF5Wa\x08\xF5a!#V[` \x02` \x01\x01Qa\x0C\xFAV[\x90Pa\t'\x89\x83\x81Q\x81\x10a\t\x19Wa\t\x19a!#V[` \x02` \x01\x01Q\x82a\x12\xAAV[P\x80a\t2\x81a!OV[\x91PPa\x08\xD5V[P\x83\x15a\t\x81W\x84T`\xFF`@\x1B\x19\x16\x85U`@Q`\x01\x81R\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x90` \x01`@Q\x80\x91\x03\x90\xA1[PPPPPPPPV[`\0a\t\x96\x81a\n\x0FV[a\x06\xA8\x82a\x13\x8DV[a\t\xA8\x82a\x04VV[a\t\xB1\x81a\n\x0FV[a\x04\x94\x83\x83a\n\xC1V[`\0a\t\xC6\x81a\n\x0FV[a\x06\x88\x83\x83a\x12\xAAV[a\x06\xA8\x82\x82a\x10\x0EV[`\0`\x01`\x01`\xE0\x1B\x03\x19\x82\x16cye\xDB\x0B`\xE0\x1B\x14\x80a\x04PWPc\x01\xFF\xC9\xA7`\xE0\x1B`\x01`\x01`\xE0\x1B\x03\x19\x83\x16\x14a\x04PV[a\n\x19\x813a\x140V[PV[`\0`\0\x80Q` a#Q\x839\x81Q\x91Ra\n7\x84\x84a\x078V[a\n\xB7W`\0\x84\x81R` \x82\x81R`@\x80\x83 `\x01`\x01`\xA0\x1B\x03\x87\x16\x84R\x90\x91R\x90 \x80T`\xFF\x19\x16`\x01\x17\x90Ua\nm3\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x83`\x01`\x01`\xA0\x1B\x03\x16\x85\x7F/\x87\x88\x11~~\xFF\x1D\x82\xE9&\xECyI\x01\xD1|x\x02JP'\t@0E@\xA73eo\r`@Q`@Q\x80\x91\x03\x90\xA4`\x01\x91PPa\x04PV[`\0\x91PPa\x04PV[`\0`\0\x80Q` a#Q\x839\x81Q\x91Ra\n\xDC\x84\x84a\x078V[\x15a\n\xB7W`\0\x84\x81R` \x82\x81R`@\x80\x83 `\x01`\x01`\xA0\x1B\x03\x87\x16\x80\x85R\x92R\x80\x83 \x80T`\xFF\x19\x16\x90UQ3\x92\x87\x91\x7F\xF69\x1F\\2\xD9\xC6\x9D*G\xEAg\x0BD)t\xB595\xD1\xED\xC7\xFDd\xEB!\xE0G\xA89\x17\x1B\x91\x90\xA4`\x01\x91PPa\x04PV[0`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x14\x80a\x0B\xC4WP\x7F\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`\x01`\x01`\xA0\x1B\x03\x16a\x0B\xB8`\0\x80Q` a#1\x839\x81Q\x91RT`\x01`\x01`\xA0\x1B\x03\x16\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x14\x15[\x15a\x0B\xE2W`@Qcp>F\xDD`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[`\0a\x06\xA8\x81a\n\x0FV[\x81`\x01`\x01`\xA0\x1B\x03\x16cR\xD1\x90-`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x92PPP\x80\x15a\x0CIWP`@\x80Q`\x1F=\x90\x81\x01`\x1F\x19\x16\x82\x01\x90\x92Ra\x0CF\x91\x81\x01\x90a!hV[`\x01[a\x0CvW`@QcL\x9C\x8C\xE3`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x83\x16`\x04\x82\x01R`$\x01[`@Q\x80\x91\x03\x90\xFD[`\0\x80Q` a#1\x839\x81Q\x91R\x81\x14a\x0C\xA7W`@Qc*\x87Ri`\xE2\x1B\x81R`\x04\x81\x01\x82\x90R`$\x01a\x0CmV[a\x06\x88\x83\x83a\x14iV[0`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x14a\x0B\xE2W`@Qcp>F\xDD`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x80QQ`\0\x90`0\x14\x80\x15a\r\x14WP\x81` \x01QQ`0\x14[\x80\x15a\r%WP\x81`@\x01QQ`0\x14[a\rBW`@Qc\x977P\xFF`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0\x82`\0\x01Q\x83` \x01Q\x84`@\x01Q`@Q` \x01a\re\x93\x92\x91\x90a!\x81V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x81R\x81Q` \x92\x83\x01 `\0\x81\x81Ra\x01\xF4\x90\x93R\x91 \x80T\x91\x92P\x90a\r\x99\x90a\x1F\x9BV[\x15\x90Pa\r\xB9W`@Qc\x1A3\x94i`\xE3\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`@\x80Q``\x81\x01\x82R\x84Q\x81R` \x80\x86\x01Q\x81\x83\x01R\x85\x83\x01Q\x82\x84\x01R`\0\x84\x81Ra\x01\xF4\x90\x91R\x91\x90\x91 \x81Q\x81\x90a\r\xF6\x90\x82a\"\nV[P` \x82\x01Q`\x01\x82\x01\x90a\x0E\x0B\x90\x82a\"\nV[P`@\x82\x01Q`\x02\x82\x01\x90a\x0E \x90\x82a\"\nV[P\x90PP\x80\x7FR\xB2\x9B\xBD\xD9z\xB9\x83A\x9FP\xFA\x15\x90\xE5\xABu\xE9\x94\"y\xE9^\x10\xA0\x86\x07\xB0l##\x8B\x84`\0\x01Q\x85` \x01Q\x86`@\x01Q`@Qa\x0Ed\x93\x92\x91\x90a\x19\xB2V[`@Q\x80\x91\x03\x90\xA2\x92\x91PPV[`\0\x81Q`@\x14a\x0E\x96W`@Qc\x123\xAD\xCD`\xE2\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[P\x80Q` \x90\x91\x01 \x90V[a\x0E\xAEa\x01,Ba\"\xC9V[a\x03\xE8\x82`\x80\x01Qa\x0E\xC0\x91\x90a\"\xDCV[\x11a\x0E\xDEW`@Qci\xBB\x1F\xDD`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0\x81` \x01Q\x82`@\x01Q\x83``\x01Q`@Q` \x01a\x0F\x01\x93\x92\x91\x90a!\x81V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x81R\x81Q` \x92\x83\x01 `\0\x81\x81Ra\x01\xF4\x90\x93R\x91 \x80T\x91\x92P\x90a\x0F5\x90a\x1F\x9BV[\x90P`\0\x03a\x0FWW`@Qcf\x08\x07\x11`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0a\x0Ff\x83`\0\x01Qa\x06\xFEV[`\x01`\x01`\xA0\x1B\x03\x81\x16`\0\x90\x81Ra\x01\xF5` R`@\x90 T\x90\x91P\x15a\x0F\xA1W`@Qc!u\x1C\xFB`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x0F\xAB\x84\x84a\x10\x0EV[`\x01`\x01`\xA0\x1B\x03\x81\x16`\0\x90\x81Ra\x01\xF5` R`@\x90\x81\x90 \x83\x90U\x83Q\x90Q\x83\x91a\x0F\xD8\x91a\"\xFEV[`@Q\x90\x81\x90\x03\x81 \x90\x7F\xF4\x83\x7F\x1Af\xA1\xE5\xFB\xDE,@\xD0\xF6\xEF\xF7Q\x83\x13\x9Ey\xB0\xFC\x1E\xAA\xB2\x80\xA3\xA0\xBE8\xE7\xB1\x90`\0\x90\xA3PPPPV[`\0\x7Fh\x89\xDFGl\xA3\x8F?KA|\x17\xEBIf\x82\xEB@\x1BOA\xA2%\x97A\xA7\x8A\xCCH\x1E\xA8\x05\x82`\0\x01Q\x80Q\x90` \x01 \x83` \x01Q\x80Q\x90` \x01 \x84`@\x01Q\x80Q\x90` \x01 \x85``\x01Q\x80Q\x90` \x01 \x86`\x80\x01Q`@Q` \x01a\x10\x9E\x96\x95\x94\x93\x92\x91\x90\x95\x86R` \x86\x01\x94\x90\x94R`@\x85\x01\x92\x90\x92R``\x84\x01R`\x80\x83\x01R`\xA0\x82\x01R`\xC0\x01\x90V[`@\x80Q\x80\x83\x03`\x1F\x19\x01\x81R\x82\x82R\x80Q` \x91\x82\x01 \x7F\xB09HDc4\xEB\x9B!\x96\xD5\xEB\x16oi\xB9\xD4\x94\x03\xEBJ\x12\xF3m\xE8\xD3\xF9\xF3\xCB\x8E\x15\xC3\x82\x85\x01R\x7F\xDD\xD5H\x1F\x81\x8A\xBBX\x93\xC8Re\x0Bu\xBD\x1F\x15T\x9C\xD1\xC0#1\xDB~\xD0\x10\xFCa\xE6Nr\x84\x84\x01R\x7F\xC8\x9E\xFD\xAAT\xC0\xF2\x0Cz\xDFa(\x82\xDF\tP\xF5\xA9Qc~\x03\x07\xCD\xCBLg/)\x8B\x8B\xC6``\x80\x86\x01\x91\x90\x91R\x83Q\x80\x86\x03\x90\x91\x01\x81R`\x80\x85\x01\x84R\x80Q\x90\x83\x01 a\x19\x01`\xF0\x1B`\xA0\x86\x01R`\xA2\x85\x01R`\xC2\x80\x85\x01\x82\x90R\x83Q\x80\x86\x03\x90\x91\x01\x81R`\xE2\x90\x94\x01\x90\x92R\x82Q\x92\x01\x91\x90\x91 \x90\x91P`\0a\x11\x81\x82\x86a\x14\xBFV[`\x01`\x01`\xA0\x1B\x03\x81\x16`\0\x90\x81Ra\x01\xF5` R`@\x90 T\x90\x91P\x80a\x11\xBCW`@Qc\x0B\xFD\x93G`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0\x81\x81Ra\x01\xF4` R`@\x90 \x80Ta\x11\xD6\x90a\x1F\x9BV[\x90P`\0\x03a\x11\xF8W`@Qcf\x08\x07\x11`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[PPPPPPV[`\0\x81\x81Ra\x01\xF4` R`@\x90 \x80Ta\x12\x1A\x90a\x1F\x9BV[\x90P`\0\x03a\x12#\xA9f.\xFC\x9C\"\x9Cj\0T`\x01`@\x1B\x90\x04`\xFF\x16a\x0B\xE2W`@Qc\x1A\xFC\xD7\x9F`\xE3\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x80`\x01`\x01`\xA0\x1B\x03\x16;`\0\x03a\x15hW`@QcL\x9C\x8C\xE3`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x82\x16`\x04\x82\x01R`$\x01a\x0CmV[`\0\x80Q` a#1\x839\x81Q\x91R\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16`\x01`\x01`\xA0\x1B\x03\x92\x90\x92\x16\x91\x90\x91\x17\x90UV[```\0\x80\x84`\x01`\x01`\xA0\x1B\x03\x16\x84`@Qa\x15\xB4\x91\x90a\"\xFEV[`\0`@Q\x80\x83\x03\x81\x85Z\xF4\x91PP=\x80`\0\x81\x14a\x15\xEFW`@Q\x91P`\x1F\x19`?=\x01\x16\x82\x01`@R=\x82R=`\0` \x84\x01>a\x15\xF4V[``\x91P[P\x91P\x91Pa\x16\x04\x85\x83\x83a\x172V[\x95\x94PPPPPV[4\x15a\x0B\xE2W`@Qc\xB3\x98\x97\x9F`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0\x80`\0\x83Q`A\x03a\x16fW` \x84\x01Q`@\x85\x01Q``\x86\x01Q`\0\x1Aa\x16X\x88\x82\x85\x85a\x17\x91V[\x95P\x95P\x95PPPPa\x16rV[PP\x81Q`\0\x91P`\x02\x90[\x92P\x92P\x92V[`\0\x82`\x03\x81\x11\x15a\x16\x8DWa\x16\x8Da#\x1AV[\x03a\x16\x96WPPV[`\x01\x82`\x03\x81\x11\x15a\x16\xAAWa\x16\xAAa#\x1AV[\x03a\x16\xC8W`@Qc\xF6E\xEE\xDF`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x02\x82`\x03\x81\x11\x15a\x16\xDCWa\x16\xDCa#\x1AV[\x03a\x16\xFDW`@Qc\xFC\xE6\x98\xF7`\xE0\x1B\x81R`\x04\x81\x01\x82\x90R`$\x01a\x0CmV[`\x03\x82`\x03\x81\x11\x15a\x17\x11Wa\x17\x11a#\x1AV[\x03a\x06\xA8W`@Qc5\xE2\xF3\x83`\xE2\x1B\x81R`\x04\x81\x01\x82\x90R`$\x01a\x0CmV[``\x82a\x17GWa\x17B\x82a\x18`V[a\x17\x8AV[\x81Q\x15\x80\x15a\x17^WP`\x01`\x01`\xA0\x1B\x03\x84\x16;\x15[\x15a\x17\x87W`@Qc\x99\x96\xB3\x15`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x85\x16`\x04\x82\x01R`$\x01a\x0CmV[P\x80[\x93\x92PPPV[`\0\x80\x80\x7F\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF]WnsW\xA4P\x1D\xDF\xE9/Fh\x1B \xA0\x84\x11\x15a\x17\xCCWP`\0\x91P`\x03\x90P\x82a\x18VV[`@\x80Q`\0\x80\x82R` \x82\x01\x80\x84R\x8A\x90R`\xFF\x89\x16\x92\x82\x01\x92\x90\x92R``\x81\x01\x87\x90R`\x80\x81\x01\x86\x90R`\x01\x90`\xA0\x01` `@Q` \x81\x03\x90\x80\x84\x03\x90\x85Z\xFA\x15\x80\x15a\x18 W=`\0\x80>=`\0\xFD[PP`@Q`\x1F\x19\x01Q\x91PP`\x01`\x01`\xA0\x1B\x03\x81\x16a\x18LWP`\0\x92P`\x01\x91P\x82\x90Pa\x18VV[\x92P`\0\x91P\x81\x90P[\x94P\x94P\x94\x91PPV[\x80Q\x15a\x18pW\x80Q\x80\x82` \x01\xFD[`@Qc\n\x12\xF5!`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[P\x80Ta\x18\x95\x90a\x1F\x9BV[`\0\x82U\x80`\x1F\x10a\x18\xA5WPPV[`\x1F\x01` \x90\x04\x90`\0R` `\0 \x90\x81\x01\x90a\n\x19\x91\x90[\x80\x82\x11\x15a\x18\xD3W`\0\x81U`\x01\x01a\x18\xBFV[P\x90V[`\0` \x82\x84\x03\x12\x15a\x18\xE9W`\0\x80\xFD[\x815`\x01`\x01`\xE0\x1B\x03\x19\x81\x16\x81\x14a\x17\x8AW`\0\x80\xFD[`\0` \x82\x84\x03\x12\x15a\x19\x13W`\0\x80\xFD[P5\x91\x90PV[\x805`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a\x191W`\0\x80\xFD[\x91\x90PV[`\0\x80`@\x83\x85\x03\x12\x15a\x19IW`\0\x80\xFD[\x825\x91Pa\x19Y` \x84\x01a\x19\x1AV[\x90P\x92P\x92\x90PV[`\0[\x83\x81\x10\x15a\x19}W\x81\x81\x01Q\x83\x82\x01R` \x01a\x19eV[PP`\0\x91\x01RV[`\0\x81Q\x80\x84Ra\x19\x9E\x81` \x86\x01` \x86\x01a\x19bV[`\x1F\x01`\x1F\x19\x16\x92\x90\x92\x01` \x01\x92\x91PPV[``\x81R`\0a\x19\xC5``\x83\x01\x86a\x19\x86V[\x82\x81\x03` \x84\x01Ra\x19\xD7\x81\x86a\x19\x86V[\x90P\x82\x81\x03`@\x84\x01Ra\x19\xEB\x81\x85a\x19\x86V[\x96\x95PPPPPPV[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`@Q`\xA0\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a\x1A-Wa\x1A-a\x19\xF5V[`@R\x90V[`@Q``\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a\x1A-Wa\x1A-a\x19\xF5V[`@Q`\x1F\x82\x01`\x1F\x19\x16\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a\x1A}Wa\x1A}a\x19\xF5V[`@R\x91\x90PV[`\0`\x01`\x01`@\x1B\x03\x82\x11\x15a\x1A\x9EWa\x1A\x9Ea\x19\xF5V[P`\x1F\x01`\x1F\x19\x16` \x01\x90V[`\0\x82`\x1F\x83\x01\x12a\x1A\xBDW`\0\x80\xFD[\x815a\x1A\xD0a\x1A\xCB\x82a\x1A\x85V[a\x1AUV[\x81\x81R\x84` \x83\x86\x01\x01\x11\x15a\x1A\xE5W`\0\x80\xFD[\x81` \x85\x01` \x83\x017`\0\x91\x81\x01` \x01\x91\x90\x91R\x93\x92PPPV[`\0\x80`@\x83\x85\x03\x12\x15a\x1B\x15W`\0\x80\xFD[a\x1B\x1E\x83a\x19\x1AV[\x91P` \x83\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a\x1B9W`\0\x80\xFD[a\x1BE\x85\x82\x86\x01a\x1A\xACV[\x91PP\x92P\x92\x90PV[`\0\x80`\0``\x84\x86\x03\x12\x15a\x1BdW`\0\x80\xFD[\x835`\x01`\x01`@\x1B\x03\x80\x82\x11\x15a\x1B{W`\0\x80\xFD[a\x1B\x87\x87\x83\x88\x01a\x1A\xACV[\x94P` \x86\x015\x91P\x80\x82\x11\x15a\x1B\x9DW`\0\x80\xFD[a\x1B\xA9\x87\x83\x88\x01a\x1A\xACV[\x93P`@\x86\x015\x91P\x80\x82\x11\x15a\x1B\xBFW`\0\x80\xFD[Pa\x1B\xCC\x86\x82\x87\x01a\x1A\xACV[\x91PP\x92P\x92P\x92V[`\0` \x82\x84\x03\x12\x15a\x1B\xE8W`\0\x80\xFD[\x815`\x01`\x01`@\x1B\x03\x81\x11\x15a\x1B\xFEW`\0\x80\xFD[a\x1C\n\x84\x82\x85\x01a\x1A\xACV[\x94\x93PPPPV[`\0\x80`@\x83\x85\x03\x12\x15a\x1C%W`\0\x80\xFD[\x825`\x01`\x01`@\x1B\x03\x80\x82\x11\x15a\x1C v\xCC75\xA9 \xA3\xCAP]8+\xBC\x02\xDD{\xC7\xDE\xC4\xDC\xEE\xDD\xA7u\xE5\x8D\xD5A\xE0\x8A\x11llS\x81\\\x0B\xD0(\x19/{bh\0\xA2dipfsX\"\x12 \x88\x0F\x82\xD0\x186O\xC5\xCAHMz\x8D\x8DUw`g8\xF9\x86Z-\xE4Q\t\xDA\xFE\\u\x06\x89dsolcC\0\x08\x14\x003"; - /// The deployed bytecode of the contract. - pub static ATTESTATIONVERIFIER_DEPLOYED_BYTECODE: ::ethers::core::types::Bytes = - ::ethers::core::types::Bytes::from_static(__DEPLOYED_BYTECODE); - pub struct AttestationVerifier(::ethers::contract::Contract); - impl ::core::clone::Clone for AttestationVerifier { - fn clone(&self) -> Self { - Self(::core::clone::Clone::clone(&self.0)) - } - } - impl ::core::ops::Deref for AttestationVerifier { - type Target = ::ethers::contract::Contract; - fn deref(&self) -> &Self::Target { - &self.0 - } - } - impl ::core::ops::DerefMut for AttestationVerifier { - fn deref_mut(&mut self) -> &mut Self::Target { - &mut self.0 - } - } - impl ::core::fmt::Debug for AttestationVerifier { - fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { - f.debug_tuple(::core::stringify!(AttestationVerifier)) - .field(&self.address()) - .finish() - } - } - impl AttestationVerifier { - /// 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(), - ATTESTATIONVERIFIER_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( - ATTESTATIONVERIFIER_ABI.clone(), - ATTESTATIONVERIFIER_BYTECODE.clone().into(), - client, - ); - let deployer = factory.deploy(constructor_args)?; - let deployer = ::ethers::contract::ContractDeployer::new(deployer); - Ok(deployer) - } - ///Calls the contract's `DEFAULT_ADMIN_ROLE` (0xa217fddf) function - pub fn default_admin_role( - &self, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([162, 23, 253, 223], ()) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `MAX_AGE` (0x0dcaeaf2) function - pub fn max_age( - &self, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([13, 202, 234, 242], ()) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `UPGRADE_INTERFACE_VERSION` (0xad3cb1cc) function - pub fn upgrade_interface_version( - &self, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([173, 60, 177, 204], ()) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `getRoleAdmin` (0x248a9ca3) function - pub fn get_role_admin( - &self, - role: [u8; 32], - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([36, 138, 156, 163], role) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `grantRole` (0x2f2ff15d) function - pub fn grant_role( - &self, - role: [u8; 32], - account: ::ethers::core::types::Address, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([47, 47, 241, 93], (role, account)) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `hasRole` (0x91d14854) function - pub fn has_role( - &self, - role: [u8; 32], - account: ::ethers::core::types::Address, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([145, 209, 72, 84], (role, account)) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `initialize` (0xc65a916a) function - pub fn initialize( - &self, - images: ::std::vec::Vec, - enclave_keys: ::std::vec::Vec<::ethers::core::types::Bytes>, - admin: ::ethers::core::types::Address, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([198, 90, 145, 106], (images, enclave_keys, admin)) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `proxiableUUID` (0x52d1902d) function - pub fn proxiable_uuid(&self) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([82, 209, 144, 45], ()) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `pubKeyToAddress` (0x70ae992a) function - pub fn pub_key_to_address( - &self, - pub_key: ::ethers::core::types::Bytes, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([112, 174, 153, 42], pub_key) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `renounceRole` (0x36568abe) function - pub fn renounce_role( - &self, - role: [u8; 32], - caller_confirmation: ::ethers::core::types::Address, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([54, 86, 138, 190], (role, caller_confirmation)) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `revokeEnclaveImage` (0x95c60294) function - pub fn revoke_enclave_image( - &self, - image_id: [u8; 32], - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([149, 198, 2, 148], image_id) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `revokeEnclaveKey` (0xd13714b4) function - pub fn revoke_enclave_key( - &self, - enclave_pub_key: ::ethers::core::types::Bytes, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([209, 55, 20, 180], enclave_pub_key) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `revokeRole` (0xd547741f) function - pub fn revoke_role( - &self, - role: [u8; 32], - account: ::ethers::core::types::Address, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([213, 71, 116, 31], (role, account)) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `supportsInterface` (0x01ffc9a7) function - pub fn supports_interface( - &self, - interface_id: [u8; 4], - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([1, 255, 201, 167], interface_id) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `upgradeToAndCall` (0x4f1ef286) function - pub fn upgrade_to_and_call( - &self, - new_implementation: ::ethers::core::types::Address, - data: ::ethers::core::types::Bytes, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([79, 30, 242, 134], (new_implementation, data)) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `verifiedKeys` (0xda994cd8) function - pub fn verified_keys( - &self, - p0: ::ethers::core::types::Address, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([218, 153, 76, 216], p0) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `verify` (0x8e760afe) function - pub fn verify( - &self, - data: ::ethers::core::types::Bytes, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([142, 118, 10, 254], data) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `verify` (0xeac708a3) function - pub fn verify_with_signature( - &self, - signature: ::ethers::core::types::Bytes, - attestation: Attestation, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([234, 199, 8, 163], (signature, attestation)) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `verifyEnclaveKey` (0x75847b84) function - pub fn verify_enclave_key( - &self, - signature: ::ethers::core::types::Bytes, - attestation: Attestation, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([117, 132, 123, 132], (signature, attestation)) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `whitelistEnclaveImage` (0x69815e57) function - pub fn whitelist_enclave_image( - &self, - pcr0: ::ethers::core::types::Bytes, - pcr1: ::ethers::core::types::Bytes, - pcr2: ::ethers::core::types::Bytes, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([105, 129, 94, 87], (pcr0, pcr1, pcr2)) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `whitelistEnclaveKey` (0xdebf726b) function - pub fn whitelist_enclave_key( - &self, - enclave_pub_key: ::ethers::core::types::Bytes, - image_id: [u8; 32], - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([222, 191, 114, 107], (enclave_pub_key, image_id)) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `whitelistedImages` (0x2f9b0ad7) function - pub fn whitelisted_images( - &self, - p0: [u8; 32], - ) -> ::ethers::contract::builders::ContractCall< - M, - ( - ::ethers::core::types::Bytes, - ::ethers::core::types::Bytes, - ::ethers::core::types::Bytes, - ), - > { - self.0 - .method_hash([47, 155, 10, 215], p0) - .expect("method not found (this should never happen)") - } - ///Gets the contract's `EnclaveImageRevoked` event - pub fn enclave_image_revoked_filter( - &self, - ) -> ::ethers::contract::builders::Event<::std::sync::Arc, M, EnclaveImageRevokedFilter> - { - self.0.event() - } - ///Gets the contract's `EnclaveImageWhitelisted` event - pub fn enclave_image_whitelisted_filter( - &self, - ) -> ::ethers::contract::builders::Event< - ::std::sync::Arc, - M, - EnclaveImageWhitelistedFilter, - > { - self.0.event() - } - ///Gets the contract's `EnclaveKeyRevoked` event - pub fn enclave_key_revoked_filter( - &self, - ) -> ::ethers::contract::builders::Event<::std::sync::Arc, M, EnclaveKeyRevokedFilter> - { - self.0.event() - } - ///Gets the contract's `EnclaveKeyVerified` event - pub fn enclave_key_verified_filter( - &self, - ) -> ::ethers::contract::builders::Event<::std::sync::Arc, M, EnclaveKeyVerifiedFilter> - { - self.0.event() - } - ///Gets the contract's `EnclaveKeyWhitelisted` event - pub fn enclave_key_whitelisted_filter( - &self, - ) -> ::ethers::contract::builders::Event<::std::sync::Arc, M, EnclaveKeyWhitelistedFilter> - { - self.0.event() - } - ///Gets the contract's `Initialized` event - pub fn initialized_filter( - &self, - ) -> ::ethers::contract::builders::Event<::std::sync::Arc, M, InitializedFilter> - { - self.0.event() - } - ///Gets the contract's `RoleAdminChanged` event - pub fn role_admin_changed_filter( - &self, - ) -> ::ethers::contract::builders::Event<::std::sync::Arc, M, RoleAdminChangedFilter> - { - self.0.event() - } - ///Gets the contract's `RoleGranted` event - pub fn role_granted_filter( - &self, - ) -> ::ethers::contract::builders::Event<::std::sync::Arc, M, RoleGrantedFilter> - { - self.0.event() - } - ///Gets the contract's `RoleRevoked` event - pub fn role_revoked_filter( - &self, - ) -> ::ethers::contract::builders::Event<::std::sync::Arc, M, RoleRevokedFilter> - { - self.0.event() - } - ///Gets the contract's `Upgraded` event - pub fn upgraded_filter( - &self, - ) -> ::ethers::contract::builders::Event<::std::sync::Arc, M, UpgradedFilter> { - 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, AttestationVerifierEvents> - { - self.0 - .event_with_filter(::core::default::Default::default()) - } - } - impl From<::ethers::contract::Contract> - for AttestationVerifier - { - fn from(contract: ::ethers::contract::Contract) -> Self { - Self::new(contract.address(), contract.client()) - } - } - ///Custom Error type `AccessControlBadConfirmation` with signature `AccessControlBadConfirmation()` and selector `0x6697b232` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[etherror( - name = "AccessControlBadConfirmation", - abi = "AccessControlBadConfirmation()" - )] - pub struct AccessControlBadConfirmation; - ///Custom Error type `AccessControlUnauthorizedAccount` with signature `AccessControlUnauthorizedAccount(address,bytes32)` and selector `0xe2517d3f` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[etherror( - name = "AccessControlUnauthorizedAccount", - abi = "AccessControlUnauthorizedAccount(address,bytes32)" - )] - pub struct AccessControlUnauthorizedAccount { - pub account: ::ethers::core::types::Address, - pub needed_role: [u8; 32], - } - ///Custom Error type `AddressEmptyCode` with signature `AddressEmptyCode(address)` and selector `0x9996b315` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[etherror(name = "AddressEmptyCode", abi = "AddressEmptyCode(address)")] - pub struct AddressEmptyCode { - pub target: ::ethers::core::types::Address, - } - ///Custom Error type `AttestationVerifierAttestationTooOld` with signature `AttestationVerifierAttestationTooOld()` and selector `0x69bb1fdd` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[etherror( - name = "AttestationVerifierAttestationTooOld", - abi = "AttestationVerifierAttestationTooOld()" - )] - pub struct AttestationVerifierAttestationTooOld; - ///Custom Error type `AttestationVerifierCannotRemoveAllAdmins` with signature `AttestationVerifierCannotRemoveAllAdmins()` and selector `0x86421fd4` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[etherror( - name = "AttestationVerifierCannotRemoveAllAdmins", - abi = "AttestationVerifierCannotRemoveAllAdmins()" - )] - pub struct AttestationVerifierCannotRemoveAllAdmins; - ///Custom Error type `AttestationVerifierImageAlreadyWhitelisted` with signature `AttestationVerifierImageAlreadyWhitelisted()` and selector `0xd19ca348` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[etherror( - name = "AttestationVerifierImageAlreadyWhitelisted", - abi = "AttestationVerifierImageAlreadyWhitelisted()" - )] - pub struct AttestationVerifierImageAlreadyWhitelisted; - ///Custom Error type `AttestationVerifierImageNotWhitelisted` with signature `AttestationVerifierImageNotWhitelisted()` and selector `0x66080711` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[etherror( - name = "AttestationVerifierImageNotWhitelisted", - abi = "AttestationVerifierImageNotWhitelisted()" - )] - pub struct AttestationVerifierImageNotWhitelisted; - ///Custom Error type `AttestationVerifierInitLengthMismatch` with signature `AttestationVerifierInitLengthMismatch()` and selector `0x46d60b57` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[etherror( - name = "AttestationVerifierInitLengthMismatch", - abi = "AttestationVerifierInitLengthMismatch()" - )] - pub struct AttestationVerifierInitLengthMismatch; - ///Custom Error type `AttestationVerifierInvalidAdmin` with signature `AttestationVerifierInvalidAdmin()` and selector `0xfb079cf8` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[etherror( - name = "AttestationVerifierInvalidAdmin", - abi = "AttestationVerifierInvalidAdmin()" - )] - pub struct AttestationVerifierInvalidAdmin; - ///Custom Error type `AttestationVerifierKeyAlreadyVerified` with signature `AttestationVerifierKeyAlreadyVerified()` and selector `0x21751cfb` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[etherror( - name = "AttestationVerifierKeyAlreadyVerified", - abi = "AttestationVerifierKeyAlreadyVerified()" - )] - pub struct AttestationVerifierKeyAlreadyVerified; - ///Custom Error type `AttestationVerifierKeyNotVerified` with signature `AttestationVerifierKeyNotVerified()` and selector `0x17fb268e` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[etherror( - name = "AttestationVerifierKeyNotVerified", - abi = "AttestationVerifierKeyNotVerified()" - )] - pub struct AttestationVerifierKeyNotVerified; - ///Custom Error type `AttestationVerifierNoImageProvided` with signature `AttestationVerifierNoImageProvided()` and selector `0xb60f22af` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[etherror( - name = "AttestationVerifierNoImageProvided", - abi = "AttestationVerifierNoImageProvided()" - )] - pub struct AttestationVerifierNoImageProvided; - ///Custom Error type `AttestationVerifierPCRsInvalid` with signature `AttestationVerifierPCRsInvalid()` and selector `0x973750ff` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[etherror( - name = "AttestationVerifierPCRsInvalid", - abi = "AttestationVerifierPCRsInvalid()" - )] - pub struct AttestationVerifierPCRsInvalid; - ///Custom Error type `AttestationVerifierPubkeyLengthInvalid` with signature `AttestationVerifierPubkeyLengthInvalid()` and selector `0x48ceb734` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[etherror( - name = "AttestationVerifierPubkeyLengthInvalid", - abi = "AttestationVerifierPubkeyLengthInvalid()" - )] - pub struct AttestationVerifierPubkeyLengthInvalid; - ///Custom Error type `ECDSAInvalidSignature` with signature `ECDSAInvalidSignature()` and selector `0xf645eedf` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[etherror(name = "ECDSAInvalidSignature", abi = "ECDSAInvalidSignature()")] - pub struct ECDSAInvalidSignature; - ///Custom Error type `ECDSAInvalidSignatureLength` with signature `ECDSAInvalidSignatureLength(uint256)` and selector `0xfce698f7` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[etherror( - name = "ECDSAInvalidSignatureLength", - abi = "ECDSAInvalidSignatureLength(uint256)" - )] - pub struct ECDSAInvalidSignatureLength { - pub length: ::ethers::core::types::U256, - } - ///Custom Error type `ECDSAInvalidSignatureS` with signature `ECDSAInvalidSignatureS(bytes32)` and selector `0xd78bce0c` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[etherror( - name = "ECDSAInvalidSignatureS", - abi = "ECDSAInvalidSignatureS(bytes32)" - )] - pub struct ECDSAInvalidSignatureS { - pub s: [u8; 32], - } - ///Custom Error type `ERC1967InvalidImplementation` with signature `ERC1967InvalidImplementation(address)` and selector `0x4c9c8ce3` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[etherror( - name = "ERC1967InvalidImplementation", - abi = "ERC1967InvalidImplementation(address)" - )] - pub struct ERC1967InvalidImplementation { - pub implementation: ::ethers::core::types::Address, - } - ///Custom Error type `ERC1967NonPayable` with signature `ERC1967NonPayable()` and selector `0xb398979f` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[etherror(name = "ERC1967NonPayable", abi = "ERC1967NonPayable()")] - pub struct ERC1967NonPayable; - ///Custom Error type `FailedInnerCall` with signature `FailedInnerCall()` and selector `0x1425ea42` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[etherror(name = "FailedInnerCall", abi = "FailedInnerCall()")] - pub struct FailedInnerCall; - ///Custom Error type `InvalidInitialization` with signature `InvalidInitialization()` and selector `0xf92ee8a9` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[etherror(name = "InvalidInitialization", abi = "InvalidInitialization()")] - pub struct InvalidInitialization; - ///Custom Error type `NotInitializing` with signature `NotInitializing()` and selector `0xd7e6bcf8` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[etherror(name = "NotInitializing", abi = "NotInitializing()")] - pub struct NotInitializing; - ///Custom Error type `UUPSUnauthorizedCallContext` with signature `UUPSUnauthorizedCallContext()` and selector `0xe07c8dba` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[etherror( - name = "UUPSUnauthorizedCallContext", - abi = "UUPSUnauthorizedCallContext()" - )] - pub struct UUPSUnauthorizedCallContext; - ///Custom Error type `UUPSUnsupportedProxiableUUID` with signature `UUPSUnsupportedProxiableUUID(bytes32)` and selector `0xaa1d49a4` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[etherror( - name = "UUPSUnsupportedProxiableUUID", - abi = "UUPSUnsupportedProxiableUUID(bytes32)" - )] - pub struct UUPSUnsupportedProxiableUUID { - pub slot: [u8; 32], - } - ///Container type for all of the contract's custom errors - #[derive( - Clone, - ::ethers::contract::EthAbiType, - serde::Serialize, - serde::Deserialize, - Debug, - PartialEq, - Eq, - Hash, - )] - pub enum AttestationVerifierErrors { - AccessControlBadConfirmation(AccessControlBadConfirmation), - AccessControlUnauthorizedAccount(AccessControlUnauthorizedAccount), - AddressEmptyCode(AddressEmptyCode), - AttestationVerifierAttestationTooOld(AttestationVerifierAttestationTooOld), - AttestationVerifierCannotRemoveAllAdmins(AttestationVerifierCannotRemoveAllAdmins), - AttestationVerifierImageAlreadyWhitelisted(AttestationVerifierImageAlreadyWhitelisted), - AttestationVerifierImageNotWhitelisted(AttestationVerifierImageNotWhitelisted), - AttestationVerifierInitLengthMismatch(AttestationVerifierInitLengthMismatch), - AttestationVerifierInvalidAdmin(AttestationVerifierInvalidAdmin), - AttestationVerifierKeyAlreadyVerified(AttestationVerifierKeyAlreadyVerified), - AttestationVerifierKeyNotVerified(AttestationVerifierKeyNotVerified), - AttestationVerifierNoImageProvided(AttestationVerifierNoImageProvided), - AttestationVerifierPCRsInvalid(AttestationVerifierPCRsInvalid), - AttestationVerifierPubkeyLengthInvalid(AttestationVerifierPubkeyLengthInvalid), - ECDSAInvalidSignature(ECDSAInvalidSignature), - ECDSAInvalidSignatureLength(ECDSAInvalidSignatureLength), - ECDSAInvalidSignatureS(ECDSAInvalidSignatureS), - ERC1967InvalidImplementation(ERC1967InvalidImplementation), - ERC1967NonPayable(ERC1967NonPayable), - FailedInnerCall(FailedInnerCall), - InvalidInitialization(InvalidInitialization), - NotInitializing(NotInitializing), - UUPSUnauthorizedCallContext(UUPSUnauthorizedCallContext), - UUPSUnsupportedProxiableUUID(UUPSUnsupportedProxiableUUID), - /// The standard solidity revert string, with selector - /// Error(string) -- 0x08c379a0 - RevertString(::std::string::String), - } - impl ::ethers::core::abi::AbiDecode for AttestationVerifierErrors { - fn decode( - data: impl AsRef<[u8]>, - ) -> ::core::result::Result { - let data = data.as_ref(); - if let Ok(decoded) = - <::std::string::String as ::ethers::core::abi::AbiDecode>::decode(data) - { - return Ok(Self::RevertString(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::AccessControlBadConfirmation(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::AccessControlUnauthorizedAccount(decoded)); - } - if let Ok(decoded) = ::decode(data) - { - return Ok(Self::AddressEmptyCode(decoded)); - } - if let Ok(decoded) = - ::decode( - data, - ) - { - return Ok(Self::AttestationVerifierAttestationTooOld(decoded)); - } - if let Ok(decoded) = - ::decode( - data, - ) - { - return Ok(Self::AttestationVerifierCannotRemoveAllAdmins(decoded)); - } - if let Ok(decoded) = ::decode( - data, - ) { - return Ok(Self::AttestationVerifierImageAlreadyWhitelisted(decoded)); - } - if let Ok(decoded) = - ::decode( - data, - ) - { - return Ok(Self::AttestationVerifierImageNotWhitelisted(decoded)); - } - if let Ok(decoded) = - ::decode( - data, - ) - { - return Ok(Self::AttestationVerifierInitLengthMismatch(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::AttestationVerifierInvalidAdmin(decoded)); - } - if let Ok(decoded) = - ::decode( - data, - ) - { - return Ok(Self::AttestationVerifierKeyAlreadyVerified(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::AttestationVerifierKeyNotVerified(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::AttestationVerifierNoImageProvided(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::AttestationVerifierPCRsInvalid(decoded)); - } - if let Ok(decoded) = - ::decode( - data, - ) - { - return Ok(Self::AttestationVerifierPubkeyLengthInvalid(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::ECDSAInvalidSignature(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::ECDSAInvalidSignatureLength(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::ECDSAInvalidSignatureS(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::ERC1967InvalidImplementation(decoded)); - } - if let Ok(decoded) = ::decode(data) - { - return Ok(Self::ERC1967NonPayable(decoded)); - } - if let Ok(decoded) = ::decode(data) { - return Ok(Self::FailedInnerCall(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::InvalidInitialization(decoded)); - } - if let Ok(decoded) = ::decode(data) { - return Ok(Self::NotInitializing(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::UUPSUnauthorizedCallContext(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::UUPSUnsupportedProxiableUUID(decoded)); - } - Err(::ethers::core::abi::Error::InvalidData.into()) - } - } - impl ::ethers::core::abi::AbiEncode for AttestationVerifierErrors { - fn encode(self) -> ::std::vec::Vec { - match self { - Self::AccessControlBadConfirmation(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::AccessControlUnauthorizedAccount(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::AddressEmptyCode(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::AttestationVerifierAttestationTooOld(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::AttestationVerifierCannotRemoveAllAdmins(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::AttestationVerifierImageAlreadyWhitelisted(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::AttestationVerifierImageNotWhitelisted(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::AttestationVerifierInitLengthMismatch(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::AttestationVerifierInvalidAdmin(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::AttestationVerifierKeyAlreadyVerified(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::AttestationVerifierKeyNotVerified(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::AttestationVerifierNoImageProvided(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::AttestationVerifierPCRsInvalid(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::AttestationVerifierPubkeyLengthInvalid(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::ECDSAInvalidSignature(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::ECDSAInvalidSignatureLength(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::ECDSAInvalidSignatureS(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::ERC1967InvalidImplementation(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::ERC1967NonPayable(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::FailedInnerCall(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::InvalidInitialization(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::NotInitializing(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::UUPSUnauthorizedCallContext(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::UUPSUnsupportedProxiableUUID(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::RevertString(s) => ::ethers::core::abi::AbiEncode::encode(s), - } - } - } - impl ::ethers::contract::ContractRevert for AttestationVerifierErrors { - fn valid_selector(selector: [u8; 4]) -> bool { - match selector { - [0x08, 0xc3, 0x79, 0xa0] => true, - _ if selector - == ::selector() => { - true - } - _ if selector - == ::selector() => { - true - } - _ if selector - == ::selector() => { - true - } - _ if selector - == ::selector() => { - true - } - _ if selector - == ::selector() => { - true - } - _ if selector - == ::selector() => { - true - } - _ if selector - == ::selector() => { - true - } - _ if selector - == ::selector() => { - true - } - _ if selector - == ::selector() => { - true - } - _ if selector - == ::selector() => { - true - } - _ if selector - == ::selector() => { - true - } - _ if selector - == ::selector() => { - true - } - _ if selector - == ::selector() => { - true - } - _ if selector - == ::selector() => { - true - } - _ if selector - == ::selector() => { - true - } - _ if selector - == ::selector() => { - true - } - _ if selector - == ::selector() => { - true - } - _ if selector - == ::selector() => { - true - } - _ if selector - == ::selector() => { - true - } - _ if selector - == ::selector() => { - true - } - _ if selector - == ::selector() => { - true - } - _ if selector - == ::selector() => { - true - } - _ if selector - == ::selector() => { - true - } - _ if selector - == ::selector() => { - true - } - _ => false, - } - } - } - impl ::core::fmt::Display for AttestationVerifierErrors { - fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { - match self { - Self::AccessControlBadConfirmation(element) => { - ::core::fmt::Display::fmt(element, f) - } - Self::AccessControlUnauthorizedAccount(element) => { - ::core::fmt::Display::fmt(element, f) - } - Self::AddressEmptyCode(element) => ::core::fmt::Display::fmt(element, f), - Self::AttestationVerifierAttestationTooOld(element) => { - ::core::fmt::Display::fmt(element, f) - } - Self::AttestationVerifierCannotRemoveAllAdmins(element) => { - ::core::fmt::Display::fmt(element, f) - } - Self::AttestationVerifierImageAlreadyWhitelisted(element) => { - ::core::fmt::Display::fmt(element, f) - } - Self::AttestationVerifierImageNotWhitelisted(element) => { - ::core::fmt::Display::fmt(element, f) - } - Self::AttestationVerifierInitLengthMismatch(element) => { - ::core::fmt::Display::fmt(element, f) - } - Self::AttestationVerifierInvalidAdmin(element) => { - ::core::fmt::Display::fmt(element, f) - } - Self::AttestationVerifierKeyAlreadyVerified(element) => { - ::core::fmt::Display::fmt(element, f) - } - Self::AttestationVerifierKeyNotVerified(element) => { - ::core::fmt::Display::fmt(element, f) - } - Self::AttestationVerifierNoImageProvided(element) => { - ::core::fmt::Display::fmt(element, f) - } - Self::AttestationVerifierPCRsInvalid(element) => { - ::core::fmt::Display::fmt(element, f) - } - Self::AttestationVerifierPubkeyLengthInvalid(element) => { - ::core::fmt::Display::fmt(element, f) - } - Self::ECDSAInvalidSignature(element) => ::core::fmt::Display::fmt(element, f), - Self::ECDSAInvalidSignatureLength(element) => ::core::fmt::Display::fmt(element, f), - Self::ECDSAInvalidSignatureS(element) => ::core::fmt::Display::fmt(element, f), - Self::ERC1967InvalidImplementation(element) => { - ::core::fmt::Display::fmt(element, f) - } - Self::ERC1967NonPayable(element) => ::core::fmt::Display::fmt(element, f), - Self::FailedInnerCall(element) => ::core::fmt::Display::fmt(element, f), - Self::InvalidInitialization(element) => ::core::fmt::Display::fmt(element, f), - Self::NotInitializing(element) => ::core::fmt::Display::fmt(element, f), - Self::UUPSUnauthorizedCallContext(element) => ::core::fmt::Display::fmt(element, f), - Self::UUPSUnsupportedProxiableUUID(element) => { - ::core::fmt::Display::fmt(element, f) - } - Self::RevertString(s) => ::core::fmt::Display::fmt(s, f), - } - } - } - impl ::core::convert::From<::std::string::String> for AttestationVerifierErrors { - fn from(value: String) -> Self { - Self::RevertString(value) - } - } - impl ::core::convert::From for AttestationVerifierErrors { - fn from(value: AccessControlBadConfirmation) -> Self { - Self::AccessControlBadConfirmation(value) - } - } - impl ::core::convert::From for AttestationVerifierErrors { - fn from(value: AccessControlUnauthorizedAccount) -> Self { - Self::AccessControlUnauthorizedAccount(value) - } - } - impl ::core::convert::From for AttestationVerifierErrors { - fn from(value: AddressEmptyCode) -> Self { - Self::AddressEmptyCode(value) - } - } - impl ::core::convert::From for AttestationVerifierErrors { - fn from(value: AttestationVerifierAttestationTooOld) -> Self { - Self::AttestationVerifierAttestationTooOld(value) - } - } - impl ::core::convert::From for AttestationVerifierErrors { - fn from(value: AttestationVerifierCannotRemoveAllAdmins) -> Self { - Self::AttestationVerifierCannotRemoveAllAdmins(value) - } - } - impl ::core::convert::From - for AttestationVerifierErrors - { - fn from(value: AttestationVerifierImageAlreadyWhitelisted) -> Self { - Self::AttestationVerifierImageAlreadyWhitelisted(value) - } - } - impl ::core::convert::From for AttestationVerifierErrors { - fn from(value: AttestationVerifierImageNotWhitelisted) -> Self { - Self::AttestationVerifierImageNotWhitelisted(value) - } - } - impl ::core::convert::From for AttestationVerifierErrors { - fn from(value: AttestationVerifierInitLengthMismatch) -> Self { - Self::AttestationVerifierInitLengthMismatch(value) - } - } - impl ::core::convert::From for AttestationVerifierErrors { - fn from(value: AttestationVerifierInvalidAdmin) -> Self { - Self::AttestationVerifierInvalidAdmin(value) - } - } - impl ::core::convert::From for AttestationVerifierErrors { - fn from(value: AttestationVerifierKeyAlreadyVerified) -> Self { - Self::AttestationVerifierKeyAlreadyVerified(value) - } - } - impl ::core::convert::From for AttestationVerifierErrors { - fn from(value: AttestationVerifierKeyNotVerified) -> Self { - Self::AttestationVerifierKeyNotVerified(value) - } - } - impl ::core::convert::From for AttestationVerifierErrors { - fn from(value: AttestationVerifierNoImageProvided) -> Self { - Self::AttestationVerifierNoImageProvided(value) - } - } - impl ::core::convert::From for AttestationVerifierErrors { - fn from(value: AttestationVerifierPCRsInvalid) -> Self { - Self::AttestationVerifierPCRsInvalid(value) - } - } - impl ::core::convert::From for AttestationVerifierErrors { - fn from(value: AttestationVerifierPubkeyLengthInvalid) -> Self { - Self::AttestationVerifierPubkeyLengthInvalid(value) - } - } - impl ::core::convert::From for AttestationVerifierErrors { - fn from(value: ECDSAInvalidSignature) -> Self { - Self::ECDSAInvalidSignature(value) - } - } - impl ::core::convert::From for AttestationVerifierErrors { - fn from(value: ECDSAInvalidSignatureLength) -> Self { - Self::ECDSAInvalidSignatureLength(value) - } - } - impl ::core::convert::From for AttestationVerifierErrors { - fn from(value: ECDSAInvalidSignatureS) -> Self { - Self::ECDSAInvalidSignatureS(value) - } - } - impl ::core::convert::From for AttestationVerifierErrors { - fn from(value: ERC1967InvalidImplementation) -> Self { - Self::ERC1967InvalidImplementation(value) - } - } - impl ::core::convert::From for AttestationVerifierErrors { - fn from(value: ERC1967NonPayable) -> Self { - Self::ERC1967NonPayable(value) - } - } - impl ::core::convert::From for AttestationVerifierErrors { - fn from(value: FailedInnerCall) -> Self { - Self::FailedInnerCall(value) - } - } - impl ::core::convert::From for AttestationVerifierErrors { - fn from(value: InvalidInitialization) -> Self { - Self::InvalidInitialization(value) - } - } - impl ::core::convert::From for AttestationVerifierErrors { - fn from(value: NotInitializing) -> Self { - Self::NotInitializing(value) - } - } - impl ::core::convert::From for AttestationVerifierErrors { - fn from(value: UUPSUnauthorizedCallContext) -> Self { - Self::UUPSUnauthorizedCallContext(value) - } - } - impl ::core::convert::From for AttestationVerifierErrors { - fn from(value: UUPSUnsupportedProxiableUUID) -> Self { - Self::UUPSUnsupportedProxiableUUID(value) - } - } - #[derive( - Clone, - ::ethers::contract::EthEvent, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethevent(name = "EnclaveImageRevoked", abi = "EnclaveImageRevoked(bytes32)")] - pub struct EnclaveImageRevokedFilter { - #[ethevent(indexed)] - pub image_id: [u8; 32], - } - #[derive( - Clone, - ::ethers::contract::EthEvent, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethevent( - name = "EnclaveImageWhitelisted", - abi = "EnclaveImageWhitelisted(bytes32,bytes,bytes,bytes)" - )] - pub struct EnclaveImageWhitelistedFilter { - #[ethevent(indexed)] - pub image_id: [u8; 32], - pub pcr0: ::ethers::core::types::Bytes, - pub pcr1: ::ethers::core::types::Bytes, - pub pcr2: ::ethers::core::types::Bytes, - } - #[derive( - Clone, - ::ethers::contract::EthEvent, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethevent(name = "EnclaveKeyRevoked", abi = "EnclaveKeyRevoked(bytes)")] - pub struct EnclaveKeyRevokedFilter { - #[ethevent(indexed)] - pub enclave_pub_key: ::ethers::core::types::H256, - } - #[derive( - Clone, - ::ethers::contract::EthEvent, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethevent(name = "EnclaveKeyVerified", abi = "EnclaveKeyVerified(bytes,bytes32)")] - pub struct EnclaveKeyVerifiedFilter { - #[ethevent(indexed)] - pub enclave_pub_key: ::ethers::core::types::H256, - #[ethevent(indexed)] - pub image_id: [u8; 32], - } - #[derive( - Clone, - ::ethers::contract::EthEvent, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethevent( - name = "EnclaveKeyWhitelisted", - abi = "EnclaveKeyWhitelisted(bytes,bytes32)" - )] - pub struct EnclaveKeyWhitelistedFilter { - #[ethevent(indexed)] - pub enclave_pub_key: ::ethers::core::types::H256, - #[ethevent(indexed)] - pub image_id: [u8; 32], - } - #[derive( - Clone, - ::ethers::contract::EthEvent, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethevent(name = "Initialized", abi = "Initialized(uint64)")] - pub struct InitializedFilter { - pub version: u64, - } - #[derive( - Clone, - ::ethers::contract::EthEvent, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethevent( - name = "RoleAdminChanged", - abi = "RoleAdminChanged(bytes32,bytes32,bytes32)" - )] - pub struct RoleAdminChangedFilter { - #[ethevent(indexed)] - pub role: [u8; 32], - #[ethevent(indexed)] - pub previous_admin_role: [u8; 32], - #[ethevent(indexed)] - pub new_admin_role: [u8; 32], - } - #[derive( - Clone, - ::ethers::contract::EthEvent, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethevent(name = "RoleGranted", abi = "RoleGranted(bytes32,address,address)")] - pub struct RoleGrantedFilter { - #[ethevent(indexed)] - pub role: [u8; 32], - #[ethevent(indexed)] - pub account: ::ethers::core::types::Address, - #[ethevent(indexed)] - pub sender: ::ethers::core::types::Address, - } - #[derive( - Clone, - ::ethers::contract::EthEvent, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethevent(name = "RoleRevoked", abi = "RoleRevoked(bytes32,address,address)")] - pub struct RoleRevokedFilter { - #[ethevent(indexed)] - pub role: [u8; 32], - #[ethevent(indexed)] - pub account: ::ethers::core::types::Address, - #[ethevent(indexed)] - pub sender: ::ethers::core::types::Address, - } - #[derive( - Clone, - ::ethers::contract::EthEvent, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethevent(name = "Upgraded", abi = "Upgraded(address)")] - pub struct UpgradedFilter { - #[ethevent(indexed)] - pub implementation: ::ethers::core::types::Address, - } - ///Container type for all of the contract's events - #[derive( - Clone, - ::ethers::contract::EthAbiType, - serde::Serialize, - serde::Deserialize, - Debug, - PartialEq, - Eq, - Hash, - )] - pub enum AttestationVerifierEvents { - EnclaveImageRevokedFilter(EnclaveImageRevokedFilter), - EnclaveImageWhitelistedFilter(EnclaveImageWhitelistedFilter), - EnclaveKeyRevokedFilter(EnclaveKeyRevokedFilter), - EnclaveKeyVerifiedFilter(EnclaveKeyVerifiedFilter), - EnclaveKeyWhitelistedFilter(EnclaveKeyWhitelistedFilter), - InitializedFilter(InitializedFilter), - RoleAdminChangedFilter(RoleAdminChangedFilter), - RoleGrantedFilter(RoleGrantedFilter), - RoleRevokedFilter(RoleRevokedFilter), - UpgradedFilter(UpgradedFilter), - } - impl ::ethers::contract::EthLogDecode for AttestationVerifierEvents { - fn decode_log( - log: &::ethers::core::abi::RawLog, - ) -> ::core::result::Result { - if let Ok(decoded) = EnclaveImageRevokedFilter::decode_log(log) { - return Ok(AttestationVerifierEvents::EnclaveImageRevokedFilter( - decoded, - )); - } - if let Ok(decoded) = EnclaveImageWhitelistedFilter::decode_log(log) { - return Ok(AttestationVerifierEvents::EnclaveImageWhitelistedFilter( - decoded, - )); - } - if let Ok(decoded) = EnclaveKeyRevokedFilter::decode_log(log) { - return Ok(AttestationVerifierEvents::EnclaveKeyRevokedFilter(decoded)); - } - if let Ok(decoded) = EnclaveKeyVerifiedFilter::decode_log(log) { - return Ok(AttestationVerifierEvents::EnclaveKeyVerifiedFilter(decoded)); - } - if let Ok(decoded) = EnclaveKeyWhitelistedFilter::decode_log(log) { - return Ok(AttestationVerifierEvents::EnclaveKeyWhitelistedFilter( - decoded, - )); - } - if let Ok(decoded) = InitializedFilter::decode_log(log) { - return Ok(AttestationVerifierEvents::InitializedFilter(decoded)); - } - if let Ok(decoded) = RoleAdminChangedFilter::decode_log(log) { - return Ok(AttestationVerifierEvents::RoleAdminChangedFilter(decoded)); - } - if let Ok(decoded) = RoleGrantedFilter::decode_log(log) { - return Ok(AttestationVerifierEvents::RoleGrantedFilter(decoded)); - } - if let Ok(decoded) = RoleRevokedFilter::decode_log(log) { - return Ok(AttestationVerifierEvents::RoleRevokedFilter(decoded)); - } - if let Ok(decoded) = UpgradedFilter::decode_log(log) { - return Ok(AttestationVerifierEvents::UpgradedFilter(decoded)); - } - Err(::ethers::core::abi::Error::InvalidData) - } - } - impl ::core::fmt::Display for AttestationVerifierEvents { - fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { - match self { - Self::EnclaveImageRevokedFilter(element) => ::core::fmt::Display::fmt(element, f), - Self::EnclaveImageWhitelistedFilter(element) => { - ::core::fmt::Display::fmt(element, f) - } - Self::EnclaveKeyRevokedFilter(element) => ::core::fmt::Display::fmt(element, f), - Self::EnclaveKeyVerifiedFilter(element) => ::core::fmt::Display::fmt(element, f), - Self::EnclaveKeyWhitelistedFilter(element) => ::core::fmt::Display::fmt(element, f), - Self::InitializedFilter(element) => ::core::fmt::Display::fmt(element, f), - Self::RoleAdminChangedFilter(element) => ::core::fmt::Display::fmt(element, f), - Self::RoleGrantedFilter(element) => ::core::fmt::Display::fmt(element, f), - Self::RoleRevokedFilter(element) => ::core::fmt::Display::fmt(element, f), - Self::UpgradedFilter(element) => ::core::fmt::Display::fmt(element, f), - } - } - } - impl ::core::convert::From for AttestationVerifierEvents { - fn from(value: EnclaveImageRevokedFilter) -> Self { - Self::EnclaveImageRevokedFilter(value) - } - } - impl ::core::convert::From for AttestationVerifierEvents { - fn from(value: EnclaveImageWhitelistedFilter) -> Self { - Self::EnclaveImageWhitelistedFilter(value) - } - } - impl ::core::convert::From for AttestationVerifierEvents { - fn from(value: EnclaveKeyRevokedFilter) -> Self { - Self::EnclaveKeyRevokedFilter(value) - } - } - impl ::core::convert::From for AttestationVerifierEvents { - fn from(value: EnclaveKeyVerifiedFilter) -> Self { - Self::EnclaveKeyVerifiedFilter(value) - } - } - impl ::core::convert::From for AttestationVerifierEvents { - fn from(value: EnclaveKeyWhitelistedFilter) -> Self { - Self::EnclaveKeyWhitelistedFilter(value) - } - } - impl ::core::convert::From for AttestationVerifierEvents { - fn from(value: InitializedFilter) -> Self { - Self::InitializedFilter(value) - } - } - impl ::core::convert::From for AttestationVerifierEvents { - fn from(value: RoleAdminChangedFilter) -> Self { - Self::RoleAdminChangedFilter(value) - } - } - impl ::core::convert::From for AttestationVerifierEvents { - fn from(value: RoleGrantedFilter) -> Self { - Self::RoleGrantedFilter(value) - } - } - impl ::core::convert::From for AttestationVerifierEvents { - fn from(value: RoleRevokedFilter) -> Self { - Self::RoleRevokedFilter(value) - } - } - impl ::core::convert::From for AttestationVerifierEvents { - fn from(value: UpgradedFilter) -> Self { - Self::UpgradedFilter(value) - } - } - ///Container type for all input parameters for the `DEFAULT_ADMIN_ROLE` function with signature `DEFAULT_ADMIN_ROLE()` and selector `0xa217fddf` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "DEFAULT_ADMIN_ROLE", abi = "DEFAULT_ADMIN_ROLE()")] - pub struct DefaultAdminRoleCall; - ///Container type for all input parameters for the `MAX_AGE` function with signature `MAX_AGE()` and selector `0x0dcaeaf2` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "MAX_AGE", abi = "MAX_AGE()")] - pub struct MaxAgeCall; - ///Container type for all input parameters for the `UPGRADE_INTERFACE_VERSION` function with signature `UPGRADE_INTERFACE_VERSION()` and selector `0xad3cb1cc` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall( - name = "UPGRADE_INTERFACE_VERSION", - abi = "UPGRADE_INTERFACE_VERSION()" - )] - pub struct UpgradeInterfaceVersionCall; - ///Container type for all input parameters for the `getRoleAdmin` function with signature `getRoleAdmin(bytes32)` and selector `0x248a9ca3` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "getRoleAdmin", abi = "getRoleAdmin(bytes32)")] - pub struct GetRoleAdminCall { - pub role: [u8; 32], - } - ///Container type for all input parameters for the `grantRole` function with signature `grantRole(bytes32,address)` and selector `0x2f2ff15d` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "grantRole", abi = "grantRole(bytes32,address)")] - pub struct GrantRoleCall { - pub role: [u8; 32], - pub account: ::ethers::core::types::Address, - } - ///Container type for all input parameters for the `hasRole` function with signature `hasRole(bytes32,address)` and selector `0x91d14854` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "hasRole", abi = "hasRole(bytes32,address)")] - pub struct HasRoleCall { - pub role: [u8; 32], - pub account: ::ethers::core::types::Address, - } - ///Container type for all input parameters for the `initialize` function with signature `initialize((bytes,bytes,bytes)[],bytes[],address)` and selector `0xc65a916a` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall( - name = "initialize", - abi = "initialize((bytes,bytes,bytes)[],bytes[],address)" - )] - pub struct InitializeCall { - pub images: ::std::vec::Vec, - pub enclave_keys: ::std::vec::Vec<::ethers::core::types::Bytes>, - pub admin: ::ethers::core::types::Address, - } - ///Container type for all input parameters for the `proxiableUUID` function with signature `proxiableUUID()` and selector `0x52d1902d` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "proxiableUUID", abi = "proxiableUUID()")] - pub struct ProxiableUUIDCall; - ///Container type for all input parameters for the `pubKeyToAddress` function with signature `pubKeyToAddress(bytes)` and selector `0x70ae992a` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "pubKeyToAddress", abi = "pubKeyToAddress(bytes)")] - pub struct PubKeyToAddressCall { - pub pub_key: ::ethers::core::types::Bytes, - } - ///Container type for all input parameters for the `renounceRole` function with signature `renounceRole(bytes32,address)` and selector `0x36568abe` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "renounceRole", abi = "renounceRole(bytes32,address)")] - pub struct RenounceRoleCall { - pub role: [u8; 32], - pub caller_confirmation: ::ethers::core::types::Address, - } - ///Container type for all input parameters for the `revokeEnclaveImage` function with signature `revokeEnclaveImage(bytes32)` and selector `0x95c60294` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "revokeEnclaveImage", abi = "revokeEnclaveImage(bytes32)")] - pub struct RevokeEnclaveImageCall { - pub image_id: [u8; 32], - } - ///Container type for all input parameters for the `revokeEnclaveKey` function with signature `revokeEnclaveKey(bytes)` and selector `0xd13714b4` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "revokeEnclaveKey", abi = "revokeEnclaveKey(bytes)")] - pub struct RevokeEnclaveKeyCall { - pub enclave_pub_key: ::ethers::core::types::Bytes, - } - ///Container type for all input parameters for the `revokeRole` function with signature `revokeRole(bytes32,address)` and selector `0xd547741f` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "revokeRole", abi = "revokeRole(bytes32,address)")] - pub struct RevokeRoleCall { - pub role: [u8; 32], - pub account: ::ethers::core::types::Address, - } - ///Container type for all input parameters for the `supportsInterface` function with signature `supportsInterface(bytes4)` and selector `0x01ffc9a7` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "supportsInterface", abi = "supportsInterface(bytes4)")] - pub struct SupportsInterfaceCall { - pub interface_id: [u8; 4], - } - ///Container type for all input parameters for the `upgradeToAndCall` function with signature `upgradeToAndCall(address,bytes)` and selector `0x4f1ef286` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "upgradeToAndCall", abi = "upgradeToAndCall(address,bytes)")] - pub struct UpgradeToAndCallCall { - pub new_implementation: ::ethers::core::types::Address, - pub data: ::ethers::core::types::Bytes, - } - ///Container type for all input parameters for the `verifiedKeys` function with signature `verifiedKeys(address)` and selector `0xda994cd8` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "verifiedKeys", abi = "verifiedKeys(address)")] - pub struct VerifiedKeysCall(pub ::ethers::core::types::Address); - ///Container type for all input parameters for the `verify` function with signature `verify(bytes)` and selector `0x8e760afe` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "verify", abi = "verify(bytes)")] - pub struct VerifyCall { - pub data: ::ethers::core::types::Bytes, - } - ///Container type for all input parameters for the `verify` function with signature `verify(bytes,(bytes,bytes,bytes,bytes,uint256))` and selector `0xeac708a3` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall( - name = "verify", - abi = "verify(bytes,(bytes,bytes,bytes,bytes,uint256))" - )] - pub struct VerifyWithSignatureCall { - pub signature: ::ethers::core::types::Bytes, - pub attestation: Attestation, - } - ///Container type for all input parameters for the `verifyEnclaveKey` function with signature `verifyEnclaveKey(bytes,(bytes,bytes,bytes,bytes,uint256))` and selector `0x75847b84` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall( - name = "verifyEnclaveKey", - abi = "verifyEnclaveKey(bytes,(bytes,bytes,bytes,bytes,uint256))" - )] - pub struct VerifyEnclaveKeyCall { - pub signature: ::ethers::core::types::Bytes, - pub attestation: Attestation, - } - ///Container type for all input parameters for the `whitelistEnclaveImage` function with signature `whitelistEnclaveImage(bytes,bytes,bytes)` and selector `0x69815e57` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall( - name = "whitelistEnclaveImage", - abi = "whitelistEnclaveImage(bytes,bytes,bytes)" - )] - pub struct WhitelistEnclaveImageCall { - pub pcr0: ::ethers::core::types::Bytes, - pub pcr1: ::ethers::core::types::Bytes, - pub pcr2: ::ethers::core::types::Bytes, - } - ///Container type for all input parameters for the `whitelistEnclaveKey` function with signature `whitelistEnclaveKey(bytes,bytes32)` and selector `0xdebf726b` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall( - name = "whitelistEnclaveKey", - abi = "whitelistEnclaveKey(bytes,bytes32)" - )] - pub struct WhitelistEnclaveKeyCall { - pub enclave_pub_key: ::ethers::core::types::Bytes, - pub image_id: [u8; 32], - } - ///Container type for all input parameters for the `whitelistedImages` function with signature `whitelistedImages(bytes32)` and selector `0x2f9b0ad7` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "whitelistedImages", abi = "whitelistedImages(bytes32)")] - pub struct WhitelistedImagesCall(pub [u8; 32]); - ///Container type for all of the contract's call - #[derive( - Clone, - ::ethers::contract::EthAbiType, - serde::Serialize, - serde::Deserialize, - Debug, - PartialEq, - Eq, - Hash, - )] - pub enum AttestationVerifierCalls { - DefaultAdminRole(DefaultAdminRoleCall), - MaxAge(MaxAgeCall), - UpgradeInterfaceVersion(UpgradeInterfaceVersionCall), - GetRoleAdmin(GetRoleAdminCall), - GrantRole(GrantRoleCall), - HasRole(HasRoleCall), - Initialize(InitializeCall), - ProxiableUUID(ProxiableUUIDCall), - PubKeyToAddress(PubKeyToAddressCall), - RenounceRole(RenounceRoleCall), - RevokeEnclaveImage(RevokeEnclaveImageCall), - RevokeEnclaveKey(RevokeEnclaveKeyCall), - RevokeRole(RevokeRoleCall), - SupportsInterface(SupportsInterfaceCall), - UpgradeToAndCall(UpgradeToAndCallCall), - VerifiedKeys(VerifiedKeysCall), - Verify(VerifyCall), - VerifyWithSignature(VerifyWithSignatureCall), - VerifyEnclaveKey(VerifyEnclaveKeyCall), - WhitelistEnclaveImage(WhitelistEnclaveImageCall), - WhitelistEnclaveKey(WhitelistEnclaveKeyCall), - WhitelistedImages(WhitelistedImagesCall), - } - impl ::ethers::core::abi::AbiDecode for AttestationVerifierCalls { - fn decode( - data: impl AsRef<[u8]>, - ) -> ::core::result::Result { - let data = data.as_ref(); - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::DefaultAdminRole(decoded)); - } - if let Ok(decoded) = ::decode(data) { - return Ok(Self::MaxAge(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::UpgradeInterfaceVersion(decoded)); - } - if let Ok(decoded) = ::decode(data) - { - return Ok(Self::GetRoleAdmin(decoded)); - } - if let Ok(decoded) = ::decode(data) { - return Ok(Self::GrantRole(decoded)); - } - if let Ok(decoded) = ::decode(data) { - return Ok(Self::HasRole(decoded)); - } - if let Ok(decoded) = ::decode(data) { - return Ok(Self::Initialize(decoded)); - } - if let Ok(decoded) = ::decode(data) - { - return Ok(Self::ProxiableUUID(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::PubKeyToAddress(decoded)); - } - if let Ok(decoded) = ::decode(data) - { - return Ok(Self::RenounceRole(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::RevokeEnclaveImage(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::RevokeEnclaveKey(decoded)); - } - if let Ok(decoded) = ::decode(data) { - return Ok(Self::RevokeRole(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::SupportsInterface(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::UpgradeToAndCall(decoded)); - } - if let Ok(decoded) = ::decode(data) - { - return Ok(Self::VerifiedKeys(decoded)); - } - if let Ok(decoded) = ::decode(data) { - return Ok(Self::Verify(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::VerifyWithSignature(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::VerifyEnclaveKey(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::WhitelistEnclaveImage(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::WhitelistEnclaveKey(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::WhitelistedImages(decoded)); - } - Err(::ethers::core::abi::Error::InvalidData.into()) - } - } - impl ::ethers::core::abi::AbiEncode for AttestationVerifierCalls { - fn encode(self) -> Vec { - match self { - Self::DefaultAdminRole(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::MaxAge(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::UpgradeInterfaceVersion(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::GetRoleAdmin(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::GrantRole(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::HasRole(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::Initialize(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::ProxiableUUID(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::PubKeyToAddress(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::RenounceRole(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::RevokeEnclaveImage(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::RevokeEnclaveKey(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::RevokeRole(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::SupportsInterface(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::UpgradeToAndCall(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::VerifiedKeys(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::Verify(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::VerifyWithSignature(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::VerifyEnclaveKey(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::WhitelistEnclaveImage(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::WhitelistEnclaveKey(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::WhitelistedImages(element) => ::ethers::core::abi::AbiEncode::encode(element), - } - } - } - impl ::core::fmt::Display for AttestationVerifierCalls { - fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { - match self { - Self::DefaultAdminRole(element) => ::core::fmt::Display::fmt(element, f), - Self::MaxAge(element) => ::core::fmt::Display::fmt(element, f), - Self::UpgradeInterfaceVersion(element) => ::core::fmt::Display::fmt(element, f), - Self::GetRoleAdmin(element) => ::core::fmt::Display::fmt(element, f), - Self::GrantRole(element) => ::core::fmt::Display::fmt(element, f), - Self::HasRole(element) => ::core::fmt::Display::fmt(element, f), - Self::Initialize(element) => ::core::fmt::Display::fmt(element, f), - Self::ProxiableUUID(element) => ::core::fmt::Display::fmt(element, f), - Self::PubKeyToAddress(element) => ::core::fmt::Display::fmt(element, f), - Self::RenounceRole(element) => ::core::fmt::Display::fmt(element, f), - Self::RevokeEnclaveImage(element) => ::core::fmt::Display::fmt(element, f), - Self::RevokeEnclaveKey(element) => ::core::fmt::Display::fmt(element, f), - Self::RevokeRole(element) => ::core::fmt::Display::fmt(element, f), - Self::SupportsInterface(element) => ::core::fmt::Display::fmt(element, f), - Self::UpgradeToAndCall(element) => ::core::fmt::Display::fmt(element, f), - Self::VerifiedKeys(element) => ::core::fmt::Display::fmt(element, f), - Self::Verify(element) => ::core::fmt::Display::fmt(element, f), - Self::VerifyWithSignature(element) => ::core::fmt::Display::fmt(element, f), - Self::VerifyEnclaveKey(element) => ::core::fmt::Display::fmt(element, f), - Self::WhitelistEnclaveImage(element) => ::core::fmt::Display::fmt(element, f), - Self::WhitelistEnclaveKey(element) => ::core::fmt::Display::fmt(element, f), - Self::WhitelistedImages(element) => ::core::fmt::Display::fmt(element, f), - } - } - } - impl ::core::convert::From for AttestationVerifierCalls { - fn from(value: DefaultAdminRoleCall) -> Self { - Self::DefaultAdminRole(value) - } - } - impl ::core::convert::From for AttestationVerifierCalls { - fn from(value: MaxAgeCall) -> Self { - Self::MaxAge(value) - } - } - impl ::core::convert::From for AttestationVerifierCalls { - fn from(value: UpgradeInterfaceVersionCall) -> Self { - Self::UpgradeInterfaceVersion(value) - } - } - impl ::core::convert::From for AttestationVerifierCalls { - fn from(value: GetRoleAdminCall) -> Self { - Self::GetRoleAdmin(value) - } - } - impl ::core::convert::From for AttestationVerifierCalls { - fn from(value: GrantRoleCall) -> Self { - Self::GrantRole(value) - } - } - impl ::core::convert::From for AttestationVerifierCalls { - fn from(value: HasRoleCall) -> Self { - Self::HasRole(value) - } - } - impl ::core::convert::From for AttestationVerifierCalls { - fn from(value: InitializeCall) -> Self { - Self::Initialize(value) - } - } - impl ::core::convert::From for AttestationVerifierCalls { - fn from(value: ProxiableUUIDCall) -> Self { - Self::ProxiableUUID(value) - } - } - impl ::core::convert::From for AttestationVerifierCalls { - fn from(value: PubKeyToAddressCall) -> Self { - Self::PubKeyToAddress(value) - } - } - impl ::core::convert::From for AttestationVerifierCalls { - fn from(value: RenounceRoleCall) -> Self { - Self::RenounceRole(value) - } - } - impl ::core::convert::From for AttestationVerifierCalls { - fn from(value: RevokeEnclaveImageCall) -> Self { - Self::RevokeEnclaveImage(value) - } - } - impl ::core::convert::From for AttestationVerifierCalls { - fn from(value: RevokeEnclaveKeyCall) -> Self { - Self::RevokeEnclaveKey(value) - } - } - impl ::core::convert::From for AttestationVerifierCalls { - fn from(value: RevokeRoleCall) -> Self { - Self::RevokeRole(value) - } - } - impl ::core::convert::From for AttestationVerifierCalls { - fn from(value: SupportsInterfaceCall) -> Self { - Self::SupportsInterface(value) - } - } - impl ::core::convert::From for AttestationVerifierCalls { - fn from(value: UpgradeToAndCallCall) -> Self { - Self::UpgradeToAndCall(value) - } - } - impl ::core::convert::From for AttestationVerifierCalls { - fn from(value: VerifiedKeysCall) -> Self { - Self::VerifiedKeys(value) - } - } - impl ::core::convert::From for AttestationVerifierCalls { - fn from(value: VerifyCall) -> Self { - Self::Verify(value) - } - } - impl ::core::convert::From for AttestationVerifierCalls { - fn from(value: VerifyWithSignatureCall) -> Self { - Self::VerifyWithSignature(value) - } - } - impl ::core::convert::From for AttestationVerifierCalls { - fn from(value: VerifyEnclaveKeyCall) -> Self { - Self::VerifyEnclaveKey(value) - } - } - impl ::core::convert::From for AttestationVerifierCalls { - fn from(value: WhitelistEnclaveImageCall) -> Self { - Self::WhitelistEnclaveImage(value) - } - } - impl ::core::convert::From for AttestationVerifierCalls { - fn from(value: WhitelistEnclaveKeyCall) -> Self { - Self::WhitelistEnclaveKey(value) - } - } - impl ::core::convert::From for AttestationVerifierCalls { - fn from(value: WhitelistedImagesCall) -> Self { - Self::WhitelistedImages(value) - } - } - ///Container type for all return fields from the `DEFAULT_ADMIN_ROLE` function with signature `DEFAULT_ADMIN_ROLE()` and selector `0xa217fddf` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct DefaultAdminRoleReturn(pub [u8; 32]); - ///Container type for all return fields from the `MAX_AGE` function with signature `MAX_AGE()` and selector `0x0dcaeaf2` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct MaxAgeReturn(pub ::ethers::core::types::U256); - ///Container type for all return fields from the `UPGRADE_INTERFACE_VERSION` function with signature `UPGRADE_INTERFACE_VERSION()` and selector `0xad3cb1cc` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct UpgradeInterfaceVersionReturn(pub ::std::string::String); - ///Container type for all return fields from the `getRoleAdmin` function with signature `getRoleAdmin(bytes32)` and selector `0x248a9ca3` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct GetRoleAdminReturn(pub [u8; 32]); - ///Container type for all return fields from the `hasRole` function with signature `hasRole(bytes32,address)` and selector `0x91d14854` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct HasRoleReturn(pub bool); - ///Container type for all return fields from the `proxiableUUID` function with signature `proxiableUUID()` and selector `0x52d1902d` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct ProxiableUUIDReturn(pub [u8; 32]); - ///Container type for all return fields from the `pubKeyToAddress` function with signature `pubKeyToAddress(bytes)` and selector `0x70ae992a` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct PubKeyToAddressReturn(pub ::ethers::core::types::Address); - ///Container type for all return fields from the `supportsInterface` function with signature `supportsInterface(bytes4)` and selector `0x01ffc9a7` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct SupportsInterfaceReturn(pub bool); - ///Container type for all return fields from the `verifiedKeys` function with signature `verifiedKeys(address)` and selector `0xda994cd8` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct VerifiedKeysReturn(pub [u8; 32]); - ///Container type for all return fields from the `whitelistedImages` function with signature `whitelistedImages(bytes32)` and selector `0x2f9b0ad7` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct WhitelistedImagesReturn { - pub pcr0: ::ethers::core::types::Bytes, - pub pcr1: ::ethers::core::types::Bytes, - pub pcr2: ::ethers::core::types::Bytes, - } - ///`EnclaveImage(bytes,bytes,bytes)` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct EnclaveImage { - pub pcr0: ::ethers::core::types::Bytes, - pub pcr1: ::ethers::core::types::Bytes, - pub pcr2: ::ethers::core::types::Bytes, - } -} diff --git a/bindings/src/base_ultra_verifier.rs b/bindings/src/base_ultra_verifier.rs deleted file mode 100644 index db0be82..0000000 --- a/bindings/src/base_ultra_verifier.rs +++ /dev/null @@ -1,584 +0,0 @@ -pub use base_ultra_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 base_ultra_verifier { - #[allow(deprecated)] - fn __abi() -> ::ethers::core::abi::Abi { - ::ethers::core::abi::ethabi::Contract { - constructor: ::core::option::Option::None, - functions: ::core::convert::From::from([ - ( - ::std::borrow::ToOwned::to_owned("getVerificationKeyHash"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("getVerificationKeyHash",), - inputs: ::std::vec![], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::FixedBytes(32usize,), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes32"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::Pure, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("verify"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("verify"), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("_proof"), - kind: ::ethers::core::abi::ethabi::ParamType::Bytes, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("_publicInputs"), - kind: ::ethers::core::abi::ethabi::ParamType::Array( - ::std::boxed::Box::new( - ::ethers::core::abi::ethabi::ParamType::FixedBytes(32usize), - ), - ), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes32[]"), - ), - }, - ], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Bool, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bool"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - },], - ), - ]), - events: ::std::collections::BTreeMap::new(), - errors: ::core::convert::From::from([ - ( - ::std::borrow::ToOwned::to_owned("EC_SCALAR_MUL_FAILURE"), - ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("EC_SCALAR_MUL_FAILURE",), - inputs: ::std::vec![], - },], - ), - ( - ::std::borrow::ToOwned::to_owned("MOD_EXP_FAILURE"), - ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("MOD_EXP_FAILURE"), - inputs: ::std::vec![], - },], - ), - ( - ::std::borrow::ToOwned::to_owned("PROOF_FAILURE"), - ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("PROOF_FAILURE"), - inputs: ::std::vec![], - },], - ), - ( - ::std::borrow::ToOwned::to_owned("PUBLIC_INPUT_COUNT_INVALID"), - ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("PUBLIC_INPUT_COUNT_INVALID",), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("expected"), - kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("actual"), - kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256"), - ), - }, - ], - },], - ), - ( - ::std::borrow::ToOwned::to_owned("PUBLIC_INPUT_GE_P"), - ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("PUBLIC_INPUT_GE_P"), - inputs: ::std::vec![], - },], - ), - ( - ::std::borrow::ToOwned::to_owned("PUBLIC_INPUT_INVALID_BN128_G1_POINT"), - ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned( - "PUBLIC_INPUT_INVALID_BN128_G1_POINT", - ), - inputs: ::std::vec![], - },], - ), - ]), - receive: false, - fallback: false, - } - } - ///The parsed JSON ABI of the contract. - pub static BASEULTRAVERIFIER_ABI: ::ethers::contract::Lazy<::ethers::core::abi::Abi> = - ::ethers::contract::Lazy::new(__abi); - pub struct BaseUltraVerifier(::ethers::contract::Contract); - impl ::core::clone::Clone for BaseUltraVerifier { - fn clone(&self) -> Self { - Self(::core::clone::Clone::clone(&self.0)) - } - } - impl ::core::ops::Deref for BaseUltraVerifier { - type Target = ::ethers::contract::Contract; - fn deref(&self) -> &Self::Target { - &self.0 - } - } - impl ::core::ops::DerefMut for BaseUltraVerifier { - fn deref_mut(&mut self) -> &mut Self::Target { - &mut self.0 - } - } - impl ::core::fmt::Debug for BaseUltraVerifier { - fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { - f.debug_tuple(::core::stringify!(BaseUltraVerifier)) - .field(&self.address()) - .finish() - } - } - impl BaseUltraVerifier { - /// 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(), - BASEULTRAVERIFIER_ABI.clone(), - client, - )) - } - ///Calls the contract's `getVerificationKeyHash` (0x937f6a10) function - pub fn get_verification_key_hash( - &self, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([147, 127, 106, 16], ()) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `verify` (0xea50d0e4) function - pub fn verify( - &self, - proof: ::ethers::core::types::Bytes, - public_inputs: ::std::vec::Vec<[u8; 32]>, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([234, 80, 208, 228], (proof, public_inputs)) - .expect("method not found (this should never happen)") - } - } - impl From<::ethers::contract::Contract> - for BaseUltraVerifier - { - fn from(contract: ::ethers::contract::Contract) -> Self { - Self::new(contract.address(), contract.client()) - } - } - ///Custom Error type `EC_SCALAR_MUL_FAILURE` with signature `EC_SCALAR_MUL_FAILURE()` and selector `0xf755f369` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[etherror(name = "EC_SCALAR_MUL_FAILURE", abi = "EC_SCALAR_MUL_FAILURE()")] - pub struct EC_SCALAR_MUL_FAILURE; - ///Custom Error type `MOD_EXP_FAILURE` with signature `MOD_EXP_FAILURE()` and selector `0xf894a7bc` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[etherror(name = "MOD_EXP_FAILURE", abi = "MOD_EXP_FAILURE()")] - pub struct MOD_EXP_FAILURE; - ///Custom Error type `PROOF_FAILURE` with signature `PROOF_FAILURE()` and selector `0x0711fcec` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[etherror(name = "PROOF_FAILURE", abi = "PROOF_FAILURE()")] - pub struct PROOF_FAILURE; - ///Custom Error type `PUBLIC_INPUT_COUNT_INVALID` with signature `PUBLIC_INPUT_COUNT_INVALID(uint256,uint256)` and selector `0x7667dc9b` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[etherror( - name = "PUBLIC_INPUT_COUNT_INVALID", - abi = "PUBLIC_INPUT_COUNT_INVALID(uint256,uint256)" - )] - pub struct PUBLIC_INPUT_COUNT_INVALID { - pub expected: ::ethers::core::types::U256, - pub actual: ::ethers::core::types::U256, - } - ///Custom Error type `PUBLIC_INPUT_GE_P` with signature `PUBLIC_INPUT_GE_P()` and selector `0x374a972f` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[etherror(name = "PUBLIC_INPUT_GE_P", abi = "PUBLIC_INPUT_GE_P()")] - pub struct PUBLIC_INPUT_GE_P; - ///Custom Error type `PUBLIC_INPUT_INVALID_BN128_G1_POINT` with signature `PUBLIC_INPUT_INVALID_BN128_G1_POINT()` and selector `0xeba9f4a6` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[etherror( - name = "PUBLIC_INPUT_INVALID_BN128_G1_POINT", - abi = "PUBLIC_INPUT_INVALID_BN128_G1_POINT()" - )] - pub struct PUBLIC_INPUT_INVALID_BN128_G1_POINT; - ///Container type for all of the contract's custom errors - #[derive( - Clone, - ::ethers::contract::EthAbiType, - serde::Serialize, - serde::Deserialize, - Debug, - PartialEq, - Eq, - Hash, - )] - pub enum BaseUltraVerifierErrors { - EC_SCALAR_MUL_FAILURE(EC_SCALAR_MUL_FAILURE), - MOD_EXP_FAILURE(MOD_EXP_FAILURE), - PROOF_FAILURE(PROOF_FAILURE), - PUBLIC_INPUT_COUNT_INVALID(PUBLIC_INPUT_COUNT_INVALID), - PUBLIC_INPUT_GE_P(PUBLIC_INPUT_GE_P), - PUBLIC_INPUT_INVALID_BN128_G1_POINT(PUBLIC_INPUT_INVALID_BN128_G1_POINT), - /// The standard solidity revert string, with selector - /// Error(string) -- 0x08c379a0 - RevertString(::std::string::String), - } - impl ::ethers::core::abi::AbiDecode for BaseUltraVerifierErrors { - fn decode( - data: impl AsRef<[u8]>, - ) -> ::core::result::Result { - let data = data.as_ref(); - if let Ok(decoded) = - <::std::string::String as ::ethers::core::abi::AbiDecode>::decode(data) - { - return Ok(Self::RevertString(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::EC_SCALAR_MUL_FAILURE(decoded)); - } - if let Ok(decoded) = ::decode(data) { - return Ok(Self::MOD_EXP_FAILURE(decoded)); - } - if let Ok(decoded) = ::decode(data) { - return Ok(Self::PROOF_FAILURE(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::PUBLIC_INPUT_COUNT_INVALID(decoded)); - } - if let Ok(decoded) = ::decode(data) - { - return Ok(Self::PUBLIC_INPUT_GE_P(decoded)); - } - if let Ok(decoded) = - ::decode( - data, - ) - { - return Ok(Self::PUBLIC_INPUT_INVALID_BN128_G1_POINT(decoded)); - } - Err(::ethers::core::abi::Error::InvalidData.into()) - } - } - impl ::ethers::core::abi::AbiEncode for BaseUltraVerifierErrors { - fn encode(self) -> ::std::vec::Vec { - match self { - Self::EC_SCALAR_MUL_FAILURE(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::MOD_EXP_FAILURE(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::PROOF_FAILURE(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::PUBLIC_INPUT_COUNT_INVALID(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::PUBLIC_INPUT_GE_P(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::PUBLIC_INPUT_INVALID_BN128_G1_POINT(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::RevertString(s) => ::ethers::core::abi::AbiEncode::encode(s), - } - } - } - impl ::ethers::contract::ContractRevert for BaseUltraVerifierErrors { - fn valid_selector(selector: [u8; 4]) -> bool { - match selector { - [0x08, 0xc3, 0x79, 0xa0] => true, - _ if selector - == ::selector() => { - true - } - _ if selector - == ::selector() => { - true - } - _ if selector - == ::selector() => { - true - } - _ if selector - == ::selector() => { - true - } - _ if selector - == ::selector() => { - true - } - _ if selector - == ::selector() => { - true - } - _ => false, - } - } - } - impl ::core::fmt::Display for BaseUltraVerifierErrors { - fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { - match self { - Self::EC_SCALAR_MUL_FAILURE(element) => ::core::fmt::Display::fmt(element, f), - Self::MOD_EXP_FAILURE(element) => ::core::fmt::Display::fmt(element, f), - Self::PROOF_FAILURE(element) => ::core::fmt::Display::fmt(element, f), - Self::PUBLIC_INPUT_COUNT_INVALID(element) => ::core::fmt::Display::fmt(element, f), - Self::PUBLIC_INPUT_GE_P(element) => ::core::fmt::Display::fmt(element, f), - Self::PUBLIC_INPUT_INVALID_BN128_G1_POINT(element) => { - ::core::fmt::Display::fmt(element, f) - } - Self::RevertString(s) => ::core::fmt::Display::fmt(s, f), - } - } - } - impl ::core::convert::From<::std::string::String> for BaseUltraVerifierErrors { - fn from(value: String) -> Self { - Self::RevertString(value) - } - } - impl ::core::convert::From for BaseUltraVerifierErrors { - fn from(value: EC_SCALAR_MUL_FAILURE) -> Self { - Self::EC_SCALAR_MUL_FAILURE(value) - } - } - impl ::core::convert::From for BaseUltraVerifierErrors { - fn from(value: MOD_EXP_FAILURE) -> Self { - Self::MOD_EXP_FAILURE(value) - } - } - impl ::core::convert::From for BaseUltraVerifierErrors { - fn from(value: PROOF_FAILURE) -> Self { - Self::PROOF_FAILURE(value) - } - } - impl ::core::convert::From for BaseUltraVerifierErrors { - fn from(value: PUBLIC_INPUT_COUNT_INVALID) -> Self { - Self::PUBLIC_INPUT_COUNT_INVALID(value) - } - } - impl ::core::convert::From for BaseUltraVerifierErrors { - fn from(value: PUBLIC_INPUT_GE_P) -> Self { - Self::PUBLIC_INPUT_GE_P(value) - } - } - impl ::core::convert::From for BaseUltraVerifierErrors { - fn from(value: PUBLIC_INPUT_INVALID_BN128_G1_POINT) -> Self { - Self::PUBLIC_INPUT_INVALID_BN128_G1_POINT(value) - } - } - ///Container type for all input parameters for the `getVerificationKeyHash` function with signature `getVerificationKeyHash()` and selector `0x937f6a10` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "getVerificationKeyHash", abi = "getVerificationKeyHash()")] - pub struct GetVerificationKeyHashCall; - ///Container type for all input parameters for the `verify` function with signature `verify(bytes,bytes32[])` and selector `0xea50d0e4` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "verify", abi = "verify(bytes,bytes32[])")] - pub struct VerifyCall { - pub proof: ::ethers::core::types::Bytes, - pub public_inputs: ::std::vec::Vec<[u8; 32]>, - } - ///Container type for all of the contract's call - #[derive( - Clone, - ::ethers::contract::EthAbiType, - serde::Serialize, - serde::Deserialize, - Debug, - PartialEq, - Eq, - Hash, - )] - pub enum BaseUltraVerifierCalls { - GetVerificationKeyHash(GetVerificationKeyHashCall), - Verify(VerifyCall), - } - impl ::ethers::core::abi::AbiDecode for BaseUltraVerifierCalls { - fn decode( - data: impl AsRef<[u8]>, - ) -> ::core::result::Result { - let data = data.as_ref(); - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::GetVerificationKeyHash(decoded)); - } - if let Ok(decoded) = ::decode(data) { - return Ok(Self::Verify(decoded)); - } - Err(::ethers::core::abi::Error::InvalidData.into()) - } - } - impl ::ethers::core::abi::AbiEncode for BaseUltraVerifierCalls { - fn encode(self) -> Vec { - match self { - Self::GetVerificationKeyHash(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::Verify(element) => ::ethers::core::abi::AbiEncode::encode(element), - } - } - } - impl ::core::fmt::Display for BaseUltraVerifierCalls { - fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { - match self { - Self::GetVerificationKeyHash(element) => ::core::fmt::Display::fmt(element, f), - Self::Verify(element) => ::core::fmt::Display::fmt(element, f), - } - } - } - impl ::core::convert::From for BaseUltraVerifierCalls { - fn from(value: GetVerificationKeyHashCall) -> Self { - Self::GetVerificationKeyHash(value) - } - } - impl ::core::convert::From for BaseUltraVerifierCalls { - fn from(value: VerifyCall) -> Self { - Self::Verify(value) - } - } - ///Container type for all return fields from the `getVerificationKeyHash` function with signature `getVerificationKeyHash()` and selector `0x937f6a10` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct GetVerificationKeyHashReturn(pub [u8; 32]); - ///Container type for all return fields from the `verify` function with signature `verify(bytes,bytes32[])` and selector `0xea50d0e4` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct VerifyReturn(pub bool); -} diff --git a/bindings/src/pairing.rs b/bindings/src/bindgin_matching_engine.rs similarity index 73% rename from bindings/src/pairing.rs rename to bindings/src/bindgin_matching_engine.rs index 1583819..44a6228 100644 --- a/bindings/src/pairing.rs +++ b/bindings/src/bindgin_matching_engine.rs @@ -1,4 +1,4 @@ -pub use pairing::*; +pub use bindgin_matching_engine::*; /// This module was auto-generated with ethers-rs Abigen. /// More information at: #[allow( @@ -9,7 +9,7 @@ pub use pairing::*; dead_code, non_camel_case_types )] -pub mod pairing { +pub mod bindgin_matching_engine { #[allow(deprecated)] fn __abi() -> ::ethers::core::abi::Abi { ::ethers::core::abi::ethabi::Contract { @@ -22,43 +22,43 @@ pub mod pairing { } } ///The parsed JSON ABI of the contract. - pub static PAIRING_ABI: ::ethers::contract::Lazy<::ethers::core::abi::Abi> = + pub static BINDGINMATCHINGENGINE_ABI: ::ethers::contract::Lazy<::ethers::core::abi::Abi> = ::ethers::contract::Lazy::new(__abi); #[rustfmt::skip] - const __BYTECODE: &[u8] = b"`V`#`\x0B\x82\x82\x829\x80Q`\0\x1A`s\x14`\x16W\xFE[0`\0R`s\x81S\x82\x81\xF3\xFEs\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x000\x14`\x80`@R`\0\x80\xFD\xFE\xA2dipfsX\"\x12 O\xFA\x14\xC6\x8E\xCBj\xD1\xF4\x01B\xE2\xE8A;\xFCV\x18\x91\xCC+\x99f\xCE^\x99I\xF885\xF2\x1CdsolcC\0\x06\x0C\x003"; + const __BYTECODE: &[u8] = b"`\x80`@R4\x80\x15`\x0FW`\0\x80\xFD[P`?\x80`\x1D`\09`\0\xF3\xFE`\x80`@R`\0\x80\xFD\xFE\xA2dipfsX\"\x12 ~}jb\x9A\x16q\x837\x94\xC7\x90\x91\x9F-\x18\xDDW\xDF\xA4f\xCA\xA9ou\x99G\x17\xA4<@\x11dsolcC\0\x08\x1C\x003"; /// The bytecode of the contract. - pub static PAIRING_BYTECODE: ::ethers::core::types::Bytes = + pub static BINDGINMATCHINGENGINE_BYTECODE: ::ethers::core::types::Bytes = ::ethers::core::types::Bytes::from_static(__BYTECODE); #[rustfmt::skip] - const __DEPLOYED_BYTECODE: &[u8] = b"s\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x000\x14`\x80`@R`\0\x80\xFD\xFE\xA2dipfsX\"\x12 O\xFA\x14\xC6\x8E\xCBj\xD1\xF4\x01B\xE2\xE8A;\xFCV\x18\x91\xCC+\x99f\xCE^\x99I\xF885\xF2\x1CdsolcC\0\x06\x0C\x003"; + const __DEPLOYED_BYTECODE: &[u8] = b"`\x80`@R`\0\x80\xFD\xFE\xA2dipfsX\"\x12 ~}jb\x9A\x16q\x837\x94\xC7\x90\x91\x9F-\x18\xDDW\xDF\xA4f\xCA\xA9ou\x99G\x17\xA4<@\x11dsolcC\0\x08\x1C\x003"; /// The deployed bytecode of the contract. - pub static PAIRING_DEPLOYED_BYTECODE: ::ethers::core::types::Bytes = + pub static BINDGINMATCHINGENGINE_DEPLOYED_BYTECODE: ::ethers::core::types::Bytes = ::ethers::core::types::Bytes::from_static(__DEPLOYED_BYTECODE); - pub struct Pairing(::ethers::contract::Contract); - impl ::core::clone::Clone for Pairing { + pub struct BindginMatchingEngine(::ethers::contract::Contract); + impl ::core::clone::Clone for BindginMatchingEngine { fn clone(&self) -> Self { Self(::core::clone::Clone::clone(&self.0)) } } - impl ::core::ops::Deref for Pairing { + impl ::core::ops::Deref for BindginMatchingEngine { type Target = ::ethers::contract::Contract; fn deref(&self) -> &Self::Target { &self.0 } } - impl ::core::ops::DerefMut for Pairing { + impl ::core::ops::DerefMut for BindginMatchingEngine { fn deref_mut(&mut self) -> &mut Self::Target { &mut self.0 } } - impl ::core::fmt::Debug for Pairing { + impl ::core::fmt::Debug for BindginMatchingEngine { fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { - f.debug_tuple(::core::stringify!(Pairing)) + f.debug_tuple(::core::stringify!(BindginMatchingEngine)) .field(&self.address()) .finish() } } - impl Pairing { + impl BindginMatchingEngine { /// Creates a new contract instance with the specified `ethers` client at /// `address`. The contract derefs to a `ethers::Contract` object. pub fn new>( @@ -67,7 +67,7 @@ pub mod pairing { ) -> Self { Self(::ethers::contract::Contract::new( address.into(), - PAIRING_ABI.clone(), + BINDGINMATCHINGENGINE_ABI.clone(), client, )) } @@ -102,8 +102,8 @@ pub mod pairing { ::ethers::contract::ContractError, > { let factory = ::ethers::contract::ContractFactory::new( - PAIRING_ABI.clone(), - PAIRING_BYTECODE.clone().into(), + BINDGINMATCHINGENGINE_ABI.clone(), + BINDGINMATCHINGENGINE_BYTECODE.clone().into(), client, ); let deployer = factory.deploy(constructor_args)?; @@ -111,7 +111,9 @@ pub mod pairing { Ok(deployer) } } - impl From<::ethers::contract::Contract> for Pairing { + impl From<::ethers::contract::Contract> + for BindginMatchingEngine + { fn from(contract: ::ethers::contract::Contract) -> Self { Self::new(contract.address(), contract.client()) } diff --git a/bindings/src/context.rs b/bindings/src/context.rs deleted file mode 100644 index 51b7a77..0000000 --- a/bindings/src/context.rs +++ /dev/null @@ -1,70 +0,0 @@ -pub use context::*; -/// 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 context { - #[allow(deprecated)] - fn __abi() -> ::ethers::core::abi::Abi { - ::ethers::core::abi::ethabi::Contract { - constructor: ::core::option::Option::None, - functions: ::std::collections::BTreeMap::new(), - events: ::std::collections::BTreeMap::new(), - errors: ::std::collections::BTreeMap::new(), - receive: false, - fallback: false, - } - } - ///The parsed JSON ABI of the contract. - pub static CONTEXT_ABI: ::ethers::contract::Lazy<::ethers::core::abi::Abi> = - ::ethers::contract::Lazy::new(__abi); - pub struct Context(::ethers::contract::Contract); - impl ::core::clone::Clone for Context { - fn clone(&self) -> Self { - Self(::core::clone::Clone::clone(&self.0)) - } - } - impl ::core::ops::Deref for Context { - type Target = ::ethers::contract::Contract; - fn deref(&self) -> &Self::Target { - &self.0 - } - } - impl ::core::ops::DerefMut for Context { - fn deref_mut(&mut self) -> &mut Self::Target { - &mut self.0 - } - } - impl ::core::fmt::Debug for Context { - fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { - f.debug_tuple(::core::stringify!(Context)) - .field(&self.address()) - .finish() - } - } - impl Context { - /// 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(), - CONTEXT_ABI.clone(), - client, - )) - } - } - impl From<::ethers::contract::Contract> for Context { - fn from(contract: ::ethers::contract::Contract) -> Self { - Self::new(contract.address(), contract.client()) - } - } -} diff --git a/bindings/src/dispute.rs b/bindings/src/dispute.rs deleted file mode 100644 index 4c4b150..0000000 --- a/bindings/src/dispute.rs +++ /dev/null @@ -1,581 +0,0 @@ -pub use dispute::*; -/// 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 dispute { - #[allow(deprecated)] - fn __abi() -> ::ethers::core::abi::Abi { - ::ethers::core::abi::ethabi::Contract { - constructor: ::core::option::Option::Some(::ethers::core::abi::ethabi::Constructor { - inputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("_er"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some(::std::borrow::ToOwned::to_owned( - "contract EntityKeyRegistry", - ),), - },], - }), - functions: ::core::convert::From::from([ - ( - ::std::borrow::ToOwned::to_owned("ENTITY_KEY_REGISTRY"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("ENTITY_KEY_REGISTRY",), - inputs: ::std::vec![], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("contract EntityKeyRegistry",), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("checkDispute"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("checkDispute"), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("askId"), - kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("proverData"), - kind: ::ethers::core::abi::ethabi::ParamType::Bytes, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("invalidProofSignature",), - kind: ::ethers::core::abi::ethabi::ParamType::Bytes, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("expectedFamilyId"), - kind: ::ethers::core::abi::ethabi::ParamType::FixedBytes(32usize,), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes32"), - ), - }, - ], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Bool, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bool"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - },], - ), - ]), - events: ::std::collections::BTreeMap::new(), - errors: ::core::convert::From::from([ - ( - ::std::borrow::ToOwned::to_owned("CannotBeZero"), - ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("CannotBeZero"), - inputs: ::std::vec![], - },], - ), - ( - ::std::borrow::ToOwned::to_owned("ECDSAInvalidSignature"), - ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("ECDSAInvalidSignature",), - inputs: ::std::vec![], - },], - ), - ( - ::std::borrow::ToOwned::to_owned("ECDSAInvalidSignatureLength"), - ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("ECDSAInvalidSignatureLength",), - inputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("length"), - kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256"), - ), - },], - },], - ), - ( - ::std::borrow::ToOwned::to_owned("ECDSAInvalidSignatureS"), - ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("ECDSAInvalidSignatureS",), - inputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("s"), - kind: ::ethers::core::abi::ethabi::ParamType::FixedBytes(32usize,), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes32"), - ), - },], - },], - ), - ]), - receive: false, - fallback: false, - } - } - ///The parsed JSON ABI of the contract. - pub static DISPUTE_ABI: ::ethers::contract::Lazy<::ethers::core::abi::Abi> = - ::ethers::contract::Lazy::new(__abi); - #[rustfmt::skip] - const __BYTECODE: &[u8] = b"`\xA0`@R4\x80\x15a\0\x10W`\0\x80\xFD[P`@Qa\x06(8\x03\x80a\x06(\x839\x81\x01`@\x81\x90Ra\0/\x91a\0@V[`\x01`\x01`\xA0\x1B\x03\x16`\x80Ra\0pV[`\0` \x82\x84\x03\x12\x15a\0RW`\0\x80\xFD[\x81Q`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a\0iW`\0\x80\xFD[\x93\x92PPPV[`\x80Qa\x05\x97a\0\x91`\09`\0\x81\x81`@\x01Ra\x01\xD9\x01Ra\x05\x97`\0\xF3\xFE`\x80`@R4\x80\x15a\0\x10W`\0\x80\xFD[P`\x046\x10a\x006W`\x005`\xE0\x1C\x80cf\x1D\xE5\xAC\x14a\0;W\x80cs\x0F\xEC)\x14a\0\x7FW[`\0\x80\xFD[a\0b\x7F\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\x81V[`@Q`\x01`\x01`\xA0\x1B\x03\x90\x91\x16\x81R` \x01[`@Q\x80\x91\x03\x90\xF3[a\0\x92a\0\x8D6`\x04a\x04\x93V[a\0\xA2V[`@Q\x90\x15\x15\x81R` \x01a\0vV[`\0a\0\xE8\x87\x87\x87\x87\x87\x80\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x93\x92\x91\x90\x81\x81R` \x01\x83\x83\x80\x82\x847`\0\x92\x01\x91\x90\x91RP\x89\x92Pa\0\xF3\x91PPV[\x97\x96PPPPPPPV[`\0\x80\x86\x86\x86`@Q` \x01a\x01\x0B\x93\x92\x91\x90a\x05\x15V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 \x90P`\0a\x01|\x82`@Q\x7F\x19Ethereum Signed Message:\n32\0\0\0\0` \x82\x01R`<\x81\x01\x82\x90R`\0\x90`\\\x01`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 \x90P\x91\x90PV[\x90P`\0a\x01\x8A\x82\x87a\x02BV[\x90P`\x01`\x01`\xA0\x1B\x03\x81\x16a\x01\xB3W`@Qc\x1E\x1D\n\xB5`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`@Qcr\x10Z\xAF`\xE0\x1B\x81R`\x04\x81\x01\x86\x90R`\x01`\x01`\xA0\x1B\x03\x82\x81\x16`$\x83\x01R\x7F\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\x16\x90cr\x10Z\xAF\x90`D\x01`\0`@Q\x80\x83\x03\x81\x86\x80;\x15\x80\x15a\x02\x1BW`\0\x80\xFD[PZ\xFA\x15\x80\x15a\x02/W=`\0\x80>=`\0\xFD[P`\x01\x9C\x9BPPPPPPPPPPPPV[`\0\x80`\0\x80a\x02R\x86\x86a\x02lV[\x92P\x92P\x92Pa\x02b\x82\x82a\x02\xB9V[P\x90\x94\x93PPPPV[`\0\x80`\0\x83Q`A\x03a\x02\xA6W` \x84\x01Q`@\x85\x01Q``\x86\x01Q`\0\x1Aa\x02\x98\x88\x82\x85\x85a\x03{V[\x95P\x95P\x95PPPPa\x02\xB2V[PP\x81Q`\0\x91P`\x02\x90[\x92P\x92P\x92V[`\0\x82`\x03\x81\x11\x15a\x02\xCDWa\x02\xCDa\x05KV[\x03a\x02\xD6WPPV[`\x01\x82`\x03\x81\x11\x15a\x02\xEAWa\x02\xEAa\x05KV[\x03a\x03\x08W`@Qc\xF6E\xEE\xDF`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x02\x82`\x03\x81\x11\x15a\x03\x1CWa\x03\x1Ca\x05KV[\x03a\x03BW`@Qc\xFC\xE6\x98\xF7`\xE0\x1B\x81R`\x04\x81\x01\x82\x90R`$\x01[`@Q\x80\x91\x03\x90\xFD[`\x03\x82`\x03\x81\x11\x15a\x03VWa\x03Va\x05KV[\x03a\x03wW`@Qc5\xE2\xF3\x83`\xE2\x1B\x81R`\x04\x81\x01\x82\x90R`$\x01a\x039V[PPV[`\0\x80\x80\x7F\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF]WnsW\xA4P\x1D\xDF\xE9/Fh\x1B \xA0\x84\x11\x15a\x03\xB6WP`\0\x91P`\x03\x90P\x82a\x04@V[`@\x80Q`\0\x80\x82R` \x82\x01\x80\x84R\x8A\x90R`\xFF\x89\x16\x92\x82\x01\x92\x90\x92R``\x81\x01\x87\x90R`\x80\x81\x01\x86\x90R`\x01\x90`\xA0\x01` `@Q` \x81\x03\x90\x80\x84\x03\x90\x85Z\xFA\x15\x80\x15a\x04\nW=`\0\x80>=`\0\xFD[PP`@Q`\x1F\x19\x01Q\x91PP`\x01`\x01`\xA0\x1B\x03\x81\x16a\x046WP`\0\x92P`\x01\x91P\x82\x90Pa\x04@V[\x92P`\0\x91P\x81\x90P[\x94P\x94P\x94\x91PPV[`\0\x80\x83`\x1F\x84\x01\x12a\x04\\W`\0\x80\xFD[P\x815g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x04tW`\0\x80\xFD[` \x83\x01\x91P\x83` \x82\x85\x01\x01\x11\x15a\x04\x8CW`\0\x80\xFD[\x92P\x92\x90PV[`\0\x80`\0\x80`\0\x80`\x80\x87\x89\x03\x12\x15a\x04\xACW`\0\x80\xFD[\x865\x95P` \x87\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x11\x15a\x04\xCBW`\0\x80\xFD[a\x04\xD7\x8A\x83\x8B\x01a\x04JV[\x90\x97P\x95P`@\x89\x015\x91P\x80\x82\x11\x15a\x04\xF0W`\0\x80\xFD[Pa\x04\xFD\x89\x82\x8A\x01a\x04JV[\x97\x9A\x96\x99P\x94\x97\x94\x96\x95``\x90\x95\x015\x94\x93PPPPV[\x83\x81R`@` \x82\x01R\x81`@\x82\x01R\x81\x83``\x83\x017`\0\x81\x83\x01``\x90\x81\x01\x91\x90\x91R`\x1F\x90\x92\x01`\x1F\x19\x16\x01\x01\x92\x91PPV[cNH{q`\xE0\x1B`\0R`!`\x04R`$`\0\xFD\xFE\xA2dipfsX\"\x12 \xF6\xDF\xA4\x80\xB8\xDD^\x8B/\xD4T\x08m\x1C\x90\xF6\x93\x12\xC4\xB3\xBF'\xD4\xB2\xB9\xBEo\xBD|\x1B=rdsolcC\0\x08\x14\x003"; - /// The bytecode of the contract. - pub static DISPUTE_BYTECODE: ::ethers::core::types::Bytes = - ::ethers::core::types::Bytes::from_static(__BYTECODE); - #[rustfmt::skip] - const __DEPLOYED_BYTECODE: &[u8] = b"`\x80`@R4\x80\x15a\0\x10W`\0\x80\xFD[P`\x046\x10a\x006W`\x005`\xE0\x1C\x80cf\x1D\xE5\xAC\x14a\0;W\x80cs\x0F\xEC)\x14a\0\x7FW[`\0\x80\xFD[a\0b\x7F\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\x81V[`@Q`\x01`\x01`\xA0\x1B\x03\x90\x91\x16\x81R` \x01[`@Q\x80\x91\x03\x90\xF3[a\0\x92a\0\x8D6`\x04a\x04\x93V[a\0\xA2V[`@Q\x90\x15\x15\x81R` \x01a\0vV[`\0a\0\xE8\x87\x87\x87\x87\x87\x80\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x93\x92\x91\x90\x81\x81R` \x01\x83\x83\x80\x82\x847`\0\x92\x01\x91\x90\x91RP\x89\x92Pa\0\xF3\x91PPV[\x97\x96PPPPPPPV[`\0\x80\x86\x86\x86`@Q` \x01a\x01\x0B\x93\x92\x91\x90a\x05\x15V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 \x90P`\0a\x01|\x82`@Q\x7F\x19Ethereum Signed Message:\n32\0\0\0\0` \x82\x01R`<\x81\x01\x82\x90R`\0\x90`\\\x01`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 \x90P\x91\x90PV[\x90P`\0a\x01\x8A\x82\x87a\x02BV[\x90P`\x01`\x01`\xA0\x1B\x03\x81\x16a\x01\xB3W`@Qc\x1E\x1D\n\xB5`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`@Qcr\x10Z\xAF`\xE0\x1B\x81R`\x04\x81\x01\x86\x90R`\x01`\x01`\xA0\x1B\x03\x82\x81\x16`$\x83\x01R\x7F\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\x16\x90cr\x10Z\xAF\x90`D\x01`\0`@Q\x80\x83\x03\x81\x86\x80;\x15\x80\x15a\x02\x1BW`\0\x80\xFD[PZ\xFA\x15\x80\x15a\x02/W=`\0\x80>=`\0\xFD[P`\x01\x9C\x9BPPPPPPPPPPPPV[`\0\x80`\0\x80a\x02R\x86\x86a\x02lV[\x92P\x92P\x92Pa\x02b\x82\x82a\x02\xB9V[P\x90\x94\x93PPPPV[`\0\x80`\0\x83Q`A\x03a\x02\xA6W` \x84\x01Q`@\x85\x01Q``\x86\x01Q`\0\x1Aa\x02\x98\x88\x82\x85\x85a\x03{V[\x95P\x95P\x95PPPPa\x02\xB2V[PP\x81Q`\0\x91P`\x02\x90[\x92P\x92P\x92V[`\0\x82`\x03\x81\x11\x15a\x02\xCDWa\x02\xCDa\x05KV[\x03a\x02\xD6WPPV[`\x01\x82`\x03\x81\x11\x15a\x02\xEAWa\x02\xEAa\x05KV[\x03a\x03\x08W`@Qc\xF6E\xEE\xDF`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x02\x82`\x03\x81\x11\x15a\x03\x1CWa\x03\x1Ca\x05KV[\x03a\x03BW`@Qc\xFC\xE6\x98\xF7`\xE0\x1B\x81R`\x04\x81\x01\x82\x90R`$\x01[`@Q\x80\x91\x03\x90\xFD[`\x03\x82`\x03\x81\x11\x15a\x03VWa\x03Va\x05KV[\x03a\x03wW`@Qc5\xE2\xF3\x83`\xE2\x1B\x81R`\x04\x81\x01\x82\x90R`$\x01a\x039V[PPV[`\0\x80\x80\x7F\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF]WnsW\xA4P\x1D\xDF\xE9/Fh\x1B \xA0\x84\x11\x15a\x03\xB6WP`\0\x91P`\x03\x90P\x82a\x04@V[`@\x80Q`\0\x80\x82R` \x82\x01\x80\x84R\x8A\x90R`\xFF\x89\x16\x92\x82\x01\x92\x90\x92R``\x81\x01\x87\x90R`\x80\x81\x01\x86\x90R`\x01\x90`\xA0\x01` `@Q` \x81\x03\x90\x80\x84\x03\x90\x85Z\xFA\x15\x80\x15a\x04\nW=`\0\x80>=`\0\xFD[PP`@Q`\x1F\x19\x01Q\x91PP`\x01`\x01`\xA0\x1B\x03\x81\x16a\x046WP`\0\x92P`\x01\x91P\x82\x90Pa\x04@V[\x92P`\0\x91P\x81\x90P[\x94P\x94P\x94\x91PPV[`\0\x80\x83`\x1F\x84\x01\x12a\x04\\W`\0\x80\xFD[P\x815g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x04tW`\0\x80\xFD[` \x83\x01\x91P\x83` \x82\x85\x01\x01\x11\x15a\x04\x8CW`\0\x80\xFD[\x92P\x92\x90PV[`\0\x80`\0\x80`\0\x80`\x80\x87\x89\x03\x12\x15a\x04\xACW`\0\x80\xFD[\x865\x95P` \x87\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x11\x15a\x04\xCBW`\0\x80\xFD[a\x04\xD7\x8A\x83\x8B\x01a\x04JV[\x90\x97P\x95P`@\x89\x015\x91P\x80\x82\x11\x15a\x04\xF0W`\0\x80\xFD[Pa\x04\xFD\x89\x82\x8A\x01a\x04JV[\x97\x9A\x96\x99P\x94\x97\x94\x96\x95``\x90\x95\x015\x94\x93PPPPV[\x83\x81R`@` \x82\x01R\x81`@\x82\x01R\x81\x83``\x83\x017`\0\x81\x83\x01``\x90\x81\x01\x91\x90\x91R`\x1F\x90\x92\x01`\x1F\x19\x16\x01\x01\x92\x91PPV[cNH{q`\xE0\x1B`\0R`!`\x04R`$`\0\xFD\xFE\xA2dipfsX\"\x12 \xF6\xDF\xA4\x80\xB8\xDD^\x8B/\xD4T\x08m\x1C\x90\xF6\x93\x12\xC4\xB3\xBF'\xD4\xB2\xB9\xBEo\xBD|\x1B=rdsolcC\0\x08\x14\x003"; - /// The deployed bytecode of the contract. - pub static DISPUTE_DEPLOYED_BYTECODE: ::ethers::core::types::Bytes = - ::ethers::core::types::Bytes::from_static(__DEPLOYED_BYTECODE); - pub struct Dispute(::ethers::contract::Contract); - impl ::core::clone::Clone for Dispute { - fn clone(&self) -> Self { - Self(::core::clone::Clone::clone(&self.0)) - } - } - impl ::core::ops::Deref for Dispute { - type Target = ::ethers::contract::Contract; - fn deref(&self) -> &Self::Target { - &self.0 - } - } - impl ::core::ops::DerefMut for Dispute { - fn deref_mut(&mut self) -> &mut Self::Target { - &mut self.0 - } - } - impl ::core::fmt::Debug for Dispute { - fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { - f.debug_tuple(::core::stringify!(Dispute)) - .field(&self.address()) - .finish() - } - } - impl Dispute { - /// 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(), - DISPUTE_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( - DISPUTE_ABI.clone(), - DISPUTE_BYTECODE.clone().into(), - client, - ); - let deployer = factory.deploy(constructor_args)?; - let deployer = ::ethers::contract::ContractDeployer::new(deployer); - Ok(deployer) - } - ///Calls the contract's `ENTITY_KEY_REGISTRY` (0x661de5ac) function - pub fn entity_key_registry( - &self, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([102, 29, 229, 172], ()) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `checkDispute` (0x730fec29) function - pub fn check_dispute( - &self, - ask_id: ::ethers::core::types::U256, - prover_data: ::ethers::core::types::Bytes, - invalid_proof_signature: ::ethers::core::types::Bytes, - expected_family_id: [u8; 32], - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash( - [115, 15, 236, 41], - ( - ask_id, - prover_data, - invalid_proof_signature, - expected_family_id, - ), - ) - .expect("method not found (this should never happen)") - } - } - impl From<::ethers::contract::Contract> for Dispute { - fn from(contract: ::ethers::contract::Contract) -> Self { - Self::new(contract.address(), contract.client()) - } - } - ///Custom Error type `CannotBeZero` with signature `CannotBeZero()` and selector `0x1e1d0ab5` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[etherror(name = "CannotBeZero", abi = "CannotBeZero()")] - pub struct CannotBeZero; - ///Custom Error type `ECDSAInvalidSignature` with signature `ECDSAInvalidSignature()` and selector `0xf645eedf` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[etherror(name = "ECDSAInvalidSignature", abi = "ECDSAInvalidSignature()")] - pub struct ECDSAInvalidSignature; - ///Custom Error type `ECDSAInvalidSignatureLength` with signature `ECDSAInvalidSignatureLength(uint256)` and selector `0xfce698f7` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[etherror( - name = "ECDSAInvalidSignatureLength", - abi = "ECDSAInvalidSignatureLength(uint256)" - )] - pub struct ECDSAInvalidSignatureLength { - pub length: ::ethers::core::types::U256, - } - ///Custom Error type `ECDSAInvalidSignatureS` with signature `ECDSAInvalidSignatureS(bytes32)` and selector `0xd78bce0c` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[etherror( - name = "ECDSAInvalidSignatureS", - abi = "ECDSAInvalidSignatureS(bytes32)" - )] - pub struct ECDSAInvalidSignatureS { - pub s: [u8; 32], - } - ///Container type for all of the contract's custom errors - #[derive( - Clone, - ::ethers::contract::EthAbiType, - serde::Serialize, - serde::Deserialize, - Debug, - PartialEq, - Eq, - Hash, - )] - pub enum DisputeErrors { - CannotBeZero(CannotBeZero), - ECDSAInvalidSignature(ECDSAInvalidSignature), - ECDSAInvalidSignatureLength(ECDSAInvalidSignatureLength), - ECDSAInvalidSignatureS(ECDSAInvalidSignatureS), - /// The standard solidity revert string, with selector - /// Error(string) -- 0x08c379a0 - RevertString(::std::string::String), - } - impl ::ethers::core::abi::AbiDecode for DisputeErrors { - fn decode( - data: impl AsRef<[u8]>, - ) -> ::core::result::Result { - let data = data.as_ref(); - if let Ok(decoded) = - <::std::string::String as ::ethers::core::abi::AbiDecode>::decode(data) - { - return Ok(Self::RevertString(decoded)); - } - if let Ok(decoded) = ::decode(data) { - return Ok(Self::CannotBeZero(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::ECDSAInvalidSignature(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::ECDSAInvalidSignatureLength(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::ECDSAInvalidSignatureS(decoded)); - } - Err(::ethers::core::abi::Error::InvalidData.into()) - } - } - impl ::ethers::core::abi::AbiEncode for DisputeErrors { - fn encode(self) -> ::std::vec::Vec { - match self { - Self::CannotBeZero(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::ECDSAInvalidSignature(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::ECDSAInvalidSignatureLength(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::ECDSAInvalidSignatureS(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::RevertString(s) => ::ethers::core::abi::AbiEncode::encode(s), - } - } - } - impl ::ethers::contract::ContractRevert for DisputeErrors { - fn valid_selector(selector: [u8; 4]) -> bool { - match selector { - [0x08, 0xc3, 0x79, 0xa0] => true, - _ if selector == ::selector() => true, - _ if selector - == ::selector() => - { - true - } - _ if selector - == ::selector( - ) => - { - true - } - _ if selector - == ::selector() => - { - true - } - _ => false, - } - } - } - impl ::core::fmt::Display for DisputeErrors { - fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { - match self { - Self::CannotBeZero(element) => ::core::fmt::Display::fmt(element, f), - Self::ECDSAInvalidSignature(element) => ::core::fmt::Display::fmt(element, f), - Self::ECDSAInvalidSignatureLength(element) => ::core::fmt::Display::fmt(element, f), - Self::ECDSAInvalidSignatureS(element) => ::core::fmt::Display::fmt(element, f), - Self::RevertString(s) => ::core::fmt::Display::fmt(s, f), - } - } - } - impl ::core::convert::From<::std::string::String> for DisputeErrors { - fn from(value: String) -> Self { - Self::RevertString(value) - } - } - impl ::core::convert::From for DisputeErrors { - fn from(value: CannotBeZero) -> Self { - Self::CannotBeZero(value) - } - } - impl ::core::convert::From for DisputeErrors { - fn from(value: ECDSAInvalidSignature) -> Self { - Self::ECDSAInvalidSignature(value) - } - } - impl ::core::convert::From for DisputeErrors { - fn from(value: ECDSAInvalidSignatureLength) -> Self { - Self::ECDSAInvalidSignatureLength(value) - } - } - impl ::core::convert::From for DisputeErrors { - fn from(value: ECDSAInvalidSignatureS) -> Self { - Self::ECDSAInvalidSignatureS(value) - } - } - ///Container type for all input parameters for the `ENTITY_KEY_REGISTRY` function with signature `ENTITY_KEY_REGISTRY()` and selector `0x661de5ac` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "ENTITY_KEY_REGISTRY", abi = "ENTITY_KEY_REGISTRY()")] - pub struct EntityKeyRegistryCall; - ///Container type for all input parameters for the `checkDispute` function with signature `checkDispute(uint256,bytes,bytes,bytes32)` and selector `0x730fec29` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall( - name = "checkDispute", - abi = "checkDispute(uint256,bytes,bytes,bytes32)" - )] - pub struct CheckDisputeCall { - pub ask_id: ::ethers::core::types::U256, - pub prover_data: ::ethers::core::types::Bytes, - pub invalid_proof_signature: ::ethers::core::types::Bytes, - pub expected_family_id: [u8; 32], - } - ///Container type for all of the contract's call - #[derive( - Clone, - ::ethers::contract::EthAbiType, - serde::Serialize, - serde::Deserialize, - Debug, - PartialEq, - Eq, - Hash, - )] - pub enum DisputeCalls { - EntityKeyRegistry(EntityKeyRegistryCall), - CheckDispute(CheckDisputeCall), - } - impl ::ethers::core::abi::AbiDecode for DisputeCalls { - fn decode( - data: impl AsRef<[u8]>, - ) -> ::core::result::Result { - let data = data.as_ref(); - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::EntityKeyRegistry(decoded)); - } - if let Ok(decoded) = ::decode(data) - { - return Ok(Self::CheckDispute(decoded)); - } - Err(::ethers::core::abi::Error::InvalidData.into()) - } - } - impl ::ethers::core::abi::AbiEncode for DisputeCalls { - fn encode(self) -> Vec { - match self { - Self::EntityKeyRegistry(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::CheckDispute(element) => ::ethers::core::abi::AbiEncode::encode(element), - } - } - } - impl ::core::fmt::Display for DisputeCalls { - fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { - match self { - Self::EntityKeyRegistry(element) => ::core::fmt::Display::fmt(element, f), - Self::CheckDispute(element) => ::core::fmt::Display::fmt(element, f), - } - } - } - impl ::core::convert::From for DisputeCalls { - fn from(value: EntityKeyRegistryCall) -> Self { - Self::EntityKeyRegistry(value) - } - } - impl ::core::convert::From for DisputeCalls { - fn from(value: CheckDisputeCall) -> Self { - Self::CheckDispute(value) - } - } - ///Container type for all return fields from the `ENTITY_KEY_REGISTRY` function with signature `ENTITY_KEY_REGISTRY()` and selector `0x661de5ac` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct EntityKeyRegistryReturn(pub ::ethers::core::types::Address); - ///Container type for all return fields from the `checkDispute` function with signature `checkDispute(uint256,bytes,bytes,bytes32)` and selector `0x730fec29` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct CheckDisputeReturn(pub bool); -} diff --git a/bindings/src/ecdsa.rs b/bindings/src/ecdsa.rs index 5860ea5..e37caff 100644 --- a/bindings/src/ecdsa.rs +++ b/bindings/src/ecdsa.rs @@ -59,12 +59,12 @@ pub mod ecdsa { pub static ECDSA_ABI: ::ethers::contract::Lazy<::ethers::core::abi::Abi> = ::ethers::contract::Lazy::new(__abi); #[rustfmt::skip] - const __BYTECODE: &[u8] = b"`V`7`\x0B\x82\x82\x829\x80Q`\0\x1A`s\x14`*WcNH{q`\xE0\x1B`\0R`\0`\x04R`$`\0\xFD[0`\0R`s\x81S\x82\x81\xF3\xFEs\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x000\x14`\x80`@R`\0\x80\xFD\xFE\xA2dipfsX\"\x12 \xF7\xA7\xEB\x87\x8F=\xBD\xA4\x0F\xF7\xBF\xB3\x80\xAB\x94\xA5\xAAqy\x84\xDF\xFE>\x02\xF3D\xC7\xC7\xE3\xBCe\x16dsolcC\0\x08\x14\x003"; + const __BYTECODE: &[u8] = b"`V`7`\x0B\x82\x82\x829\x80Q`\0\x1A`s\x14`*WcNH{q`\xE0\x1B`\0R`\0`\x04R`$`\0\xFD[0`\0R`s\x81S\x82\x81\xF3\xFEs\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x000\x14`\x80`@R`\0\x80\xFD\xFE\xA2dipfsX\"\x12 y\xAFZ9\xEAG|\xE3\\\xFF\x05\n\xAC\xCA@2f\x95\x92M\xE3z\x16K\xAA\xCC\x14\xDEm_m\xC1dsolcC\0\x08\x1C\x003"; /// The bytecode of the contract. pub static ECDSA_BYTECODE: ::ethers::core::types::Bytes = ::ethers::core::types::Bytes::from_static(__BYTECODE); #[rustfmt::skip] - const __DEPLOYED_BYTECODE: &[u8] = b"s\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x000\x14`\x80`@R`\0\x80\xFD\xFE\xA2dipfsX\"\x12 \xF7\xA7\xEB\x87\x8F=\xBD\xA4\x0F\xF7\xBF\xB3\x80\xAB\x94\xA5\xAAqy\x84\xDF\xFE>\x02\xF3D\xC7\xC7\xE3\xBCe\x16dsolcC\0\x08\x14\x003"; + const __DEPLOYED_BYTECODE: &[u8] = b"s\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x000\x14`\x80`@R`\0\x80\xFD\xFE\xA2dipfsX\"\x12 y\xAFZ9\xEAG|\xE3\\\xFF\x05\n\xAC\xCA@2f\x95\x92M\xE3z\x16K\xAA\xCC\x14\xDEm_m\xC1dsolcC\0\x08\x1C\x003"; /// The deployed bytecode of the contract. pub static ECDSA_DEPLOYED_BYTECODE: ::ethers::core::types::Bytes = ::ethers::core::types::Bytes::from_static(__DEPLOYED_BYTECODE); diff --git a/bindings/src/entity_key_registry.rs b/bindings/src/entity_key_registry.rs index da6ffed..8617301 100644 --- a/bindings/src/entity_key_registry.rs +++ b/bindings/src/entity_key_registry.rs @@ -1131,9 +1131,16 @@ pub mod entity_key_registry { },], ), ( - ::std::borrow::ToOwned::to_owned("FailedInnerCall"), + ::std::borrow::ToOwned::to_owned("EnclaveKeyNotVerified"), ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("FailedInnerCall"), + name: ::std::borrow::ToOwned::to_owned("EnclaveKeyNotVerified",), + inputs: ::std::vec![], + },], + ), + ( + ::std::borrow::ToOwned::to_owned("FailedCall"), + ::std::vec![::ethers::core::abi::ethabi::AbiError { + name: ::std::borrow::ToOwned::to_owned("FailedCall"), inputs: ::std::vec![], },], ), @@ -1214,12 +1221,12 @@ pub mod entity_key_registry { pub static ENTITYKEYREGISTRY_ABI: ::ethers::contract::Lazy<::ethers::core::abi::Abi> = ::ethers::contract::Lazy::new(__abi); #[rustfmt::skip] - const __BYTECODE: &[u8] = b"`\xE0`@R0`\x80R4\x80\x15b\0\0\x15W`\0\x80\xFD[P`@Qb\0+_8\x03\x80b\0+_\x839\x81\x01`@\x81\x90Rb\0\08\x91b\0\x01cV[`\x01`\x01`\xA0\x1B\x03\x81\x16`\xA0Ra\xEA``\xC0R\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x80Th\x01\0\0\0\0\0\0\0\0\x81\x04`\xFF\x16\x15\x90`\x01`\x01`@\x1B\x03\x16`\0\x81\x15\x80\x15b\0\0\x96WP\x82[\x90P`\0\x82`\x01`\x01`@\x1B\x03\x16`\x01\x14\x80\x15b\0\0\xB3WP0;\x15[\x90P\x81\x15\x80\x15b\0\0\xC2WP\x80\x15[\x15b\0\0\xE1W`@Qc\xF9.\xE8\xA9`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x84T`\x01`\x01`@\x1B\x03\x19\x16`\x01\x17\x85U\x83\x15b\0\x01\x10W\x84T`\xFF`@\x1B\x19\x16h\x01\0\0\0\0\0\0\0\0\x17\x85U[\x83\x15b\0\x01WW\x84T`\xFF`@\x1B\x19\x16\x85U`@Q`\x01\x81R\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x90` \x01`@Q\x80\x91\x03\x90\xA1[PPPPPPb\0\x01\x95V[`\0` \x82\x84\x03\x12\x15b\0\x01vW`\0\x80\xFD[\x81Q`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14b\0\x01\x8EW`\0\x80\xFD[\x93\x92PPPV[`\x80Q`\xA0Q`\xC0Qa)~b\0\x01\xE1`\09`\0\x81\x81a\x04\xE6\x01Ra\x14\x93\x01R`\0\x81\x81a\x05\xAF\x01Ra\x14\xFF\x01R`\0\x81\x81a\x11{\x01R\x81\x81a\x11\xA4\x01Ra\x12\xE8\x01Ra)~`\0\xF3\xFE`\x80`@R`\x046\x10a\x01\xC2W`\x005`\xE0\x1C\x80cr\xB5a\xF9\x11a\0\xF7W\x80c\xAA\x0E\xD0\x9F\x11a\0\x95W\x80c\xD5Gt\x1F\x11a\0dW\x80c\xD5Gt\x1F\x14a\x05\xE9W\x80c\xE1\xA610\x14a\x06\tW\x80c\xED8\r\x03\x14a\x06)W\x80c\xFF\x11J\xE1\x14a\x06IW`\0\x80\xFD[\x80c\xAA\x0E\xD0\x9F\x14a\x05\x1DW\x80c\xAD<\xB1\xCC\x14a\x05=W\x80c\xB8\n\xAA\x89\x14a\x05{W\x80c\xCDy\xF9\x06\x14a\x05\x9DW`\0\x80\xFD[\x80c\x88R!\t\x11a\0\xD1W\x80c\x88R!\t\x14a\x04\x94W\x80c\x91\xD1HT\x14a\x04\xB4W\x80c\x9A\xEC\x99\x0E\x14a\x04\xD4W\x80c\xA2\x17\xFD\xDF\x14a\x05\x08W`\0\x80\xFD[\x80cr\xB5a\xF9\x14a\x04\x0FW\x80cu\x84{\x84\x14a\x04@W\x80cyvi\xC9\x14a\x04`W`\0\x80\xFD[\x80c//\xF1]\x11a\x01dW\x80cR\xD1\x90-\x11a\x01>W\x80cR\xD1\x90-\x14a\x03aW\x80ci\xFD\xBC\xCA\x14a\x03vW\x80ck[!\xA6\x14a\x03\x96W\x80cr\x10Z\xAF\x14a\x03\xEFW`\0\x80\xFD[\x80c//\xF1]\x14a\x03\x0EW\x80c6V\x8A\xBE\x14a\x03.W\x80cO\x1E\xF2\x86\x14a\x03NW`\0\x80\xFD[\x80c\x14\x13\xA9*\x11a\x01\xA0W\x80c\x14\x13\xA9*\x14a\x02\x81W\x80c$\x10\xF6\xBA\x14a\x02\xA1W\x80c$\x8A\x9C\xA3\x14a\x02\xCEW\x80c.\xB3\x9E\xE9\x14a\x02\xEEW`\0\x80\xFD[\x80c\x01\xD5\x8F\xA3\x14a\x01\xC7W\x80c\x01\xFF\xC9\xA7\x14a\x02/W\x80c\x07\x07Y\x1F\x14a\x02_W[`\0\x80\xFD[4\x80\x15a\x01\xD3W`\0\x80\xFD[Pa\x02\x1Ca\x01\xE26`\x04a\x1C\xFEV[`\x01`\x01`\xA0\x1B\x03\x16`\0\x90\x81R\x7F\xC1{Kp\x8BoD%\\ \x91:\x9D\x97\xA0S\0\xB6p4,q\xFEZ\xE5\xB6\x17\xBDM\xB5P\x01` R`@\x90 T\x90V[`@Q\x90\x81R` \x01[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x02;W`\0\x80\xFD[Pa\x02Oa\x02J6`\x04a\x1D\x19V[a\x06iV[`@Q\x90\x15\x15\x81R` \x01a\x02&V[4\x80\x15a\x02kW`\0\x80\xFD[Pa\x02\x7Fa\x02z6`\x04a\x1D\x8BV[a\x06zV[\0[4\x80\x15a\x02\x8DW`\0\x80\xFD[Pa\x02\x7Fa\x02\x9C6`\x04a\x1D\xCCV[a\x06\xA1V[4\x80\x15a\x02\xADW`\0\x80\xFD[Pa\x02\xC1a\x02\xBC6`\x04a\x1D\xEEV[a\x06\xC9V[`@Qa\x02&\x91\x90a\x1EWV[4\x80\x15a\x02\xDAW`\0\x80\xFD[Pa\x02\x1Ca\x02\xE96`\x04a\x1D\xEEV[a\x08\xD5V[4\x80\x15a\x02\xFAW`\0\x80\xFD[Pa\x02\x7Fa\x03\t6`\x04a\x1F\xAEV[a\x08\xF7V[4\x80\x15a\x03\x1AW`\0\x80\xFD[Pa\x02\x7Fa\x03)6`\x04a!\x05V[a\n]V[4\x80\x15a\x03:W`\0\x80\xFD[Pa\x02\x7Fa\x03I6`\x04a!\x05V[a\nyV[a\x02\x7Fa\x03\\6`\x04a!1V[a\n\xACV[4\x80\x15a\x03mW`\0\x80\xFD[Pa\x02\x1Ca\n\xCBV[4\x80\x15a\x03\x82W`\0\x80\xFD[Pa\x02\x7Fa\x03\x916`\x04a!~V[a\n\xE8V[4\x80\x15a\x03\xA2W`\0\x80\xFD[Pa\x02Oa\x03\xB16`\x04a\x1D\xCCV[`\0\x90\x81R\x7F\xC1{Kp\x8BoD%\\ \x91:\x9D\x97\xA0S\0\xB6p4,q\xFEZ\xE5\xB6\x17\xBDM\xB5P\x02` \x90\x81R`@\x80\x83 \x93\x83R\x92\x90R T`\xFF\x16\x90V[4\x80\x15a\x03\xFBW`\0\x80\xFD[Pa\x02\x7Fa\x04\n6`\x04a!\x05V[a\x0B\x9AV[4\x80\x15a\x04\x1BW`\0\x80\xFD[Pa\x02Oa\x04*6`\x04a\x1D\xEEV[a\x01\xF5` R`\0\x90\x81R`@\x90 T`\xFF\x16\x81V[4\x80\x15a\x04LW`\0\x80\xFD[Pa\x02Oa\x04[6`\x04a\"\x07V[a\x0B\xA4V[4\x80\x15a\x04lW`\0\x80\xFD[Pa\x02\x1C\x7Fq\xF3\xD5XV\xE4\x05\x8E\xD0n\xE0W\xD7\x9A\xDAa_e\xCD\xF5\xF9\xEE\x88\x18\x1B\x91B%\x08\x8F\x83O\x81V[4\x80\x15a\x04\xA0W`\0\x80\xFD[Pa\x02\x7Fa\x04\xAF6`\x04a\x1D\xEEV[a\x0B\xB7V[4\x80\x15a\x04\xC0W`\0\x80\xFD[Pa\x02Oa\x04\xCF6`\x04a!\x05V[a\x0CdV[4\x80\x15a\x04\xE0W`\0\x80\xFD[Pa\x02\x1C\x7F\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\x81V[4\x80\x15a\x05\x14W`\0\x80\xFD[Pa\x02\x1C`\0\x81V[4\x80\x15a\x05)W`\0\x80\xFD[Pa\x02\x7Fa\x0586`\x04a\x1C\xFEV[a\x0C\x9CV[4\x80\x15a\x05IW`\0\x80\xFD[Pa\x05n`@Q\x80`@\x01`@R\x80`\x05\x81R` \x01d\x03R\xE3\x02\xE3`\xDC\x1B\x81RP\x81V[`@Qa\x02&\x91\x90a#\x10V[4\x80\x15a\x05\x87W`\0\x80\xFD[Pa\x02\x1C`\0\x80Q` a)\t\x839\x81Q\x91R\x81V[4\x80\x15a\x05\xA9W`\0\x80\xFD[Pa\x05\xD1\x7F\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\x81V[`@Q`\x01`\x01`\xA0\x1B\x03\x90\x91\x16\x81R` \x01a\x02&V[4\x80\x15a\x05\xF5W`\0\x80\xFD[Pa\x02\x7Fa\x06\x046`\x04a!\x05V[a\x0C\xBFV[4\x80\x15a\x06\x15W`\0\x80\xFD[Pa\x05na\x06$6`\x04a##V[a\x0C\xDBV[4\x80\x15a\x065W`\0\x80\xFD[Pa\x02\x7Fa\x06D6`\x04a##V[a\r\x81V[4\x80\x15a\x06UW`\0\x80\xFD[Pa\x02\x7Fa\x06d6`\x04a#MV[a\x0E\x01V[`\0a\x06t\x82a\x0E;V[\x92\x91PPV[`\0\x80Q` a)\t\x839\x81Q\x91Ra\x06\x92\x81a\x0EpV[a\x06\x9C\x83\x83a\x0E}V[PPPV[`\0\x80Q` a)\t\x839\x81Q\x91Ra\x06\xB9\x81a\x0EpV[a\x06\xC3\x83\x83a\x0E\xD7V[PPPPV[a\x06\xED`@Q\x80``\x01`@R\x80``\x81R` \x01``\x81R` \x01``\x81RP\x90V[`\0\x82\x81R`\0\x80Q` a(\xC9\x839\x81Q\x91R` \x81\x90R`@\x91\x82\x90 \x82Q``\x81\x01\x90\x93R\x80T\x91\x92\x91\x82\x90\x82\x90a\x07'\x90a#\x98V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\x07S\x90a#\x98V[\x80\x15a\x07\xA0W\x80`\x1F\x10a\x07uWa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\x07\xA0V[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\x07\x83W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81R` \x01`\x01\x82\x01\x80Ta\x07\xB9\x90a#\x98V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\x07\xE5\x90a#\x98V[\x80\x15a\x082W\x80`\x1F\x10a\x08\x07Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\x082V[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\x08\x15W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81R` \x01`\x02\x82\x01\x80Ta\x08K\x90a#\x98V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\x08w\x90a#\x98V[\x80\x15a\x08\xC4W\x80`\x1F\x10a\x08\x99Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\x08\xC4V[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\x08\xA7W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81RPP\x91PP\x91\x90PV[`\0\x90\x81R`\0\x80Q` a))\x839\x81Q\x91R` R`@\x90 `\x01\x01T\x90V[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x80T`\x01`@\x1B\x81\x04`\xFF\x16\x15\x90`\x01`\x01`@\x1B\x03\x16`\0\x81\x15\x80\x15a\tF\xDD`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0a\n\xC7\x81a\x0EpV[\x81`\x01`\x01`\xA0\x1B\x03\x16cR\xD1\x90-`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x92PPP\x80\x15a\x12zWP`@\x80Q`\x1F=\x90\x81\x01`\x1F\x19\x16\x82\x01\x90\x92Ra\x12w\x91\x81\x01\x90a&\x85V[`\x01[a\x12\xA2W`@QcL\x9C\x8C\xE3`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x83\x16`\x04\x82\x01R`$\x01a\x0C\x11V[`\0\x80Q` a(\xE9\x839\x81Q\x91R\x81\x14a\x12\xD3W`@Qc*\x87Ri`\xE2\x1B\x81R`\x04\x81\x01\x82\x90R`$\x01a\x0C\x11V[a\x06\x9C\x83\x83a\x19pV[0`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x14a\x0F\x9FW`@Qcp>F\xDD`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\x01`\xA0\x1B\x03\x82\x16`\0\x90\x81R\x7F\xC1{Kp\x8BoD%\\ \x91:\x9D\x97\xA0S\0\xB6p4,q\xFEZ\xE5\xB6\x17\xBDM\xB5P\x01` R`@\x90 T`\0\x80Q` a(\xC9\x839\x81Q\x91R\x90\x80a\x13\x8CW`@Qc=\xD8\xCA\x95`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0\x81\x81R` \x83\x90R`@\x90 \x80Ta\x13\xA5\x90a#\x98V[\x90P`\0\x03a\x13\xC7W`@Qc\x1CbV\x0B`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0\x83\x81R`\x02\x83\x01` \x90\x81R`@\x80\x83 \x84\x84R\x90\x91R\x90 T`\xFF\x16a\x06\xC3W`@QcHf%\x81`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0\x80`\0\x80Q` a(\xC9\x839\x81Q\x91R\x90P`\0\x83` \x01Q\x84`@\x01Q\x85``\x01Q`@Q` \x01a\x14:\x93\x92\x91\x90a&\x9EV[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x81R\x81Q` \x92\x83\x01 `\0\x81\x81R\x92\x85\x90R\x91 \x80T\x91\x92P\x90a\x14l\x90a#\x98V[\x90P`\0\x03a\x14\x8EW`@Qc\x1CbV\x0B`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x14\xB8\x7F\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\0Ba&\xE1V[a\x03\xE8\x85`\x80\x01Qa\x14\xCA\x91\x90a&\xF4V[\x11a\x14\xE8W`@Qc\x0C\xB0/\x05`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`@Qc\xEA\xC7\x08\xA3`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x90c\xEA\xC7\x08\xA3\x90a\x156\x90\x88\x90\x88\x90`\x04\x01a'\x16V[`\0`@Q\x80\x83\x03\x81\x86\x80;\x15\x80\x15a\x15NW`\0\x80\xFD[PZ\xFA\x15\x80\x15a\x15bW=`\0\x80>=`\0\xFD[PPPP`\0a\x15u\x85`\0\x01Qa\x19\xC6V[`\x01`\x01`\xA0\x1B\x03\x81\x16`\0\x90\x81R`\x01\x85\x01` R`@\x90 T\x90\x91P\x15a\x15\xA4W`\0\x93PPPPa\x06tV[`\x01`\x01`\xA0\x1B\x03\x81\x16`\0\x90\x81R`\x01\x84\x01` R`@\x90\x81\x90 \x83\x90U\x85Q\x90Q\x83\x91a\x15\xD2\x91a'\xAAV[`@Q\x90\x81\x90\x03\x81 \x90\x7F\xF4\x83\x7F\x1Af\xA1\xE5\xFB\xDE,@\xD0\xF6\xEF\xF7Q\x83\x13\x9Ey\xB0\xFC\x1E\xAA\xB2\x80\xA3\xA0\xBE8\xE7\xB1\x90`\0\x90\xA3P`\x01\x95\x94PPPPPV[`\0\x81\x81R`\0\x80Q` a(\xC9\x839\x81Q\x91R` \x81\x90R`@\x82 \x80Ta\x166\x90a#\x98V[\x90P`\0\x03a\x16HWP`\0\x92\x91PPV[`\0\x83\x81R` \x82\x90R`@\x81 \x90a\x16a\x82\x82a\x1C\x94V[a\x16o`\x01\x83\x01`\0a\x1C\x94V[a\x16}`\x02\x83\x01`\0a\x1C\x94V[PP`@Q\x83\x90\x7FKq\xBE\xDD\xA4!yf\xEA\xC1\xAAI\xE3[\x15P\xE5\xAB\x87\x06J\xE1y\xD1\xB3k9;\xD0N\xB7C\x90`\0\x90\xA2P`\x01\x92\x91PPV[`\0a\x16\xC0\x84\x84\x84a\x19\xF6V[\x90Pa\x16\xCB\x81a\x1A/V[a\x16\xEBW`@Qc\x065l\xB3`\xE0\x1B\x81R`\x04\x81\x01\x82\x90R`$\x01a\x0C\x11V[`\0\x81\x81Ra\x01\xF5` R`@\x90 T`\xFF\x16\x15a\x17\x1FW`@Qc\"m\xD8\xA3`\xE2\x1B\x81R`\x04\x81\x01\x82\x90R`$\x01a\x0C\x11V[`\0a\x17D`@Q\x80``\x01`@R\x80\x87\x81R` \x01\x86\x81R` \x01\x85\x81RPa\x17\xF3V[P\x90P\x81\x81\x14a\x17gW`@Qc\x0CZ\x1A\xAB`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\nT\x82\x87a\x1AdV[a\x17{\x82\x82a\x0CdV[a\n\xC7W`@Qc\xE2Q}?`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x82\x16`\x04\x82\x01R`$\x81\x01\x83\x90R`D\x01a\x0C\x11V[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0T`\x01`@\x1B\x90\x04`\xFF\x16a\x0F\x9FW`@Qc\x1A\xFC\xD7\x9F`\xE3\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x80QQ`\0\x90\x81\x90`\0\x80Q` a(\xC9\x839\x81Q\x91R\x90`0\x14\x80\x15a\x18\x1FWP\x83` \x01QQ`0\x14[\x80\x15a\x180WP\x83`@\x01QQ`0\x14[a\x18MW`@QcBc\r\xDB`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0\x84`\0\x01Q\x85` \x01Q\x86`@\x01Q`@Q` \x01a\x18p\x93\x92\x91\x90a&\x9EV[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x81R\x81Q` \x92\x83\x01 `\0\x81\x81R\x92\x85\x90R\x91 \x80T\x91\x92P\x90a\x18\xA2\x90a#\x98V[\x15\x90Pa\x18\xB4W\x94`\0\x94P\x92PPPV[`@\x80Q``\x81\x01\x82R\x86Q\x81R` \x80\x88\x01Q\x81\x83\x01R\x87\x83\x01Q\x82\x84\x01R`\0\x84\x81R\x90\x85\x90R\x91\x90\x91 \x81Q\x81\x90a\x18\xEF\x90\x82a'\xC6V[P` \x82\x01Q`\x01\x82\x01\x90a\x19\x04\x90\x82a'\xC6V[P`@\x82\x01Q`\x02\x82\x01\x90a\x19\x19\x90\x82a'\xC6V[P\x90PP\x80\x7FR\xB2\x9B\xBD\xD9z\xB9\x83A\x9FP\xFA\x15\x90\xE5\xABu\xE9\x94\"y\xE9^\x10\xA0\x86\x07\xB0l##\x8B\x86`\0\x01Q\x87` \x01Q\x88`@\x01Q`@Qa\x19]\x93\x92\x91\x90a(\x85V[`@Q\x80\x91\x03\x90\xA2\x94`\x01\x94P\x92PPPV[a\x19y\x82a\x1B\x15V[`@Q`\x01`\x01`\xA0\x1B\x03\x83\x16\x90\x7F\xBC|\xD7Z \xEE'\xFD\x9A\xDE\xBA\xB3 A\xF7U!M\xBCk\xFF\xA9\x0C\xC0\"[9\xDA.\\-;\x90`\0\x90\xA2\x80Q\x15a\x19\xBEWa\x06\x9C\x82\x82a\x1BzV[a\n\xC7a\x1B\xF0V[`\0\x81Q`@\x14a\x19\xEAW`@Qc\xBD\x9C\x80\xC1`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[P\x80Q` \x90\x91\x01 \x90V[`\0\x80\x84\x84\x84`@Q` \x01a\x1A\x0E\x93\x92\x91\x90a&\x9EV[`@\x80Q\x80\x83\x03`\x1F\x19\x01\x81R\x91\x90R\x80Q` \x90\x91\x01 \x95\x94PPPPPV[`\0\x81\x15\x80a\x1A]WP\x7F\xCD.f\xBF\x0B\x91\xEE\xED\xC6\xC6H\xAE\x935\xA7\x8D|\x9AJ\xB0\xEF3a*\x82M\x91\xCD\xC6\x8AO!\x82\x14[\x15\x92\x91PPV[`\0\x81\x81R\x7F\xC1{Kp\x8BoD%\\ \x91:\x9D\x97\xA0S\0\xB6p4,q\xFEZ\xE5\xB6\x17\xBDM\xB5P\x02` \x90\x81R`@\x80\x83 \x85\x84R\x90\x91R\x81 T`\0\x80Q` a(\xC9\x839\x81Q\x91R\x90`\xFF\x16\x15a\x1A\xBFW`\0\x91PPa\x06tV[`\0\x83\x81R`\x02\x82\x01` \x90\x81R`@\x80\x83 \x87\x84R\x82R\x91\x82\x90 \x80T`\xFF\x19\x16`\x01\x17\x90U\x90Q\x84\x81R\x85\x91\x7F\xBF\xB1&\xE7B\xCE\x96\x18\xB5\xBFkT\x83\x99\x16\x92o\\9wR\xBE5@L\x83h\xDD\xCFh\xC1\n\x91\x01a\x0F\x85V[\x80`\x01`\x01`\xA0\x1B\x03\x16;`\0\x03a\x1BKW`@QcL\x9C\x8C\xE3`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x82\x16`\x04\x82\x01R`$\x01a\x0C\x11V[`\0\x80Q` a(\xE9\x839\x81Q\x91R\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16`\x01`\x01`\xA0\x1B\x03\x92\x90\x92\x16\x91\x90\x91\x17\x90UV[```\0\x80\x84`\x01`\x01`\xA0\x1B\x03\x16\x84`@Qa\x1B\x97\x91\x90a'\xAAV[`\0`@Q\x80\x83\x03\x81\x85Z\xF4\x91PP=\x80`\0\x81\x14a\x1B\xD2W`@Q\x91P`\x1F\x19`?=\x01\x16\x82\x01`@R=\x82R=`\0` \x84\x01>a\x1B\xD7V[``\x91P[P\x91P\x91Pa\x1B\xE7\x85\x83\x83a\x1C\x0FV[\x95\x94PPPPPV[4\x15a\x0F\x9FW`@Qc\xB3\x98\x97\x9F`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[``\x82a\x1C$Wa\x1C\x1F\x82a\x1CkV[a\x0B\xB0V[\x81Q\x15\x80\x15a\x1C;WP`\x01`\x01`\xA0\x1B\x03\x84\x16;\x15[\x15a\x1CdW`@Qc\x99\x96\xB3\x15`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x85\x16`\x04\x82\x01R`$\x01a\x0C\x11V[P\x80a\x0B\xB0V[\x80Q\x15a\x1C{W\x80Q\x80\x82` \x01\xFD[`@Qc\n\x12\xF5!`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[P\x80Ta\x1C\xA0\x90a#\x98V[`\0\x82U\x80`\x1F\x10a\x1C\xB0WPPV[`\x1F\x01` \x90\x04\x90`\0R` `\0 \x90\x81\x01\x90a\x0Ez\x91\x90[\x80\x82\x11\x15a\x1C\xDEW`\0\x81U`\x01\x01a\x1C\xCAV[P\x90V[\x805`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a\x1C\xF9W`\0\x80\xFD[\x91\x90PV[`\0` \x82\x84\x03\x12\x15a\x1D\x10W`\0\x80\xFD[a\x0B\xB0\x82a\x1C\xE2V[`\0` \x82\x84\x03\x12\x15a\x1D+W`\0\x80\xFD[\x815`\x01`\x01`\xE0\x1B\x03\x19\x81\x16\x81\x14a\x0B\xB0W`\0\x80\xFD[`\0\x80\x83`\x1F\x84\x01\x12a\x1DUW`\0\x80\xFD[P\x815`\x01`\x01`@\x1B\x03\x81\x11\x15a\x1DlW`\0\x80\xFD[` \x83\x01\x91P\x83` \x82\x85\x01\x01\x11\x15a\x1D\x84W`\0\x80\xFD[\x92P\x92\x90PV[`\0\x80` \x83\x85\x03\x12\x15a\x1D\x9EW`\0\x80\xFD[\x825`\x01`\x01`@\x1B\x03\x81\x11\x15a\x1D\xB4W`\0\x80\xFD[a\x1D\xC0\x85\x82\x86\x01a\x1DCV[\x90\x96\x90\x95P\x93PPPPV[`\0\x80`@\x83\x85\x03\x12\x15a\x1D\xDFW`\0\x80\xFD[PP\x805\x92` \x90\x91\x015\x91PV[`\0` \x82\x84\x03\x12\x15a\x1E\0W`\0\x80\xFD[P5\x91\x90PV[`\0[\x83\x81\x10\x15a\x1E\"W\x81\x81\x01Q\x83\x82\x01R` \x01a\x1E\nV[PP`\0\x91\x01RV[`\0\x81Q\x80\x84Ra\x1EC\x81` \x86\x01` \x86\x01a\x1E\x07V[`\x1F\x01`\x1F\x19\x16\x92\x90\x92\x01` \x01\x92\x91PPV[` \x81R`\0\x82Q``` \x84\x01Ra\x1Es`\x80\x84\x01\x82a\x1E+V[\x90P` \x84\x01Q`\x1F\x19\x80\x85\x84\x03\x01`@\x86\x01Ra\x1E\x91\x83\x83a\x1E+V[\x92P`@\x86\x01Q\x91P\x80\x85\x84\x03\x01``\x86\x01RPa\x1B\xE7\x82\x82a\x1E+V[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`@Q``\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a\x1E\xE7Wa\x1E\xE7a\x1E\xAFV[`@R\x90V[`@Q`\xA0\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a\x1E\xE7Wa\x1E\xE7a\x1E\xAFV[`@Q`\x1F\x82\x01`\x1F\x19\x16\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a\x1F7Wa\x1F7a\x1E\xAFV[`@R\x91\x90PV[`\0\x82`\x1F\x83\x01\x12a\x1FPW`\0\x80\xFD[\x815`\x01`\x01`@\x1B\x03\x81\x11\x15a\x1FiWa\x1Fia\x1E\xAFV[a\x1F|`\x1F\x82\x01`\x1F\x19\x16` \x01a\x1F\x0FV[\x81\x81R\x84` \x83\x86\x01\x01\x11\x15a\x1F\x91W`\0\x80\xFD[\x81` \x85\x01` \x83\x017`\0\x91\x81\x01` \x01\x91\x90\x91R\x93\x92PPPV[`\0\x80`@\x83\x85\x03\x12\x15a\x1F\xC1W`\0\x80\xFD[a\x1F\xCA\x83a\x1C\xE2V[\x91P` \x80\x84\x015`\x01`\x01`@\x1B\x03\x80\x82\x11\x15a\x1F\xE7W`\0\x80\xFD[\x81\x86\x01\x91P\x86`\x1F\x83\x01\x12a\x1F\xFBW`\0\x80\xFD[\x815\x81\x81\x11\x15a \rWa \ra\x1E\xAFV[\x80`\x05\x1Ba \x1C\x85\x82\x01a\x1F\x0FV[\x91\x82R\x83\x81\x01\x85\x01\x91\x85\x81\x01\x90\x8A\x84\x11\x15a 6W`\0\x80\xFD[\x86\x86\x01\x92P[\x83\x83\x10\x15a \xF4W\x825\x85\x81\x11\x15a TW`\0\x80\x81\xFD[\x86\x01``\x81\x8D\x03`\x1F\x19\x01\x81\x13\x15a lW`\0\x80\x81\xFD[a ta\x1E\xC5V[\x89\x83\x015\x88\x81\x11\x15a \x86W`\0\x80\x81\xFD[a \x94\x8F\x8C\x83\x87\x01\x01a\x1F?V[\x82RP`@\x83\x015\x88\x81\x11\x15a \xAAW`\0\x80\x81\xFD[a \xB8\x8F\x8C\x83\x87\x01\x01a\x1F?V[\x82\x8C\x01RP\x90\x82\x015\x90\x87\x82\x11\x15a \xD0W`\0\x80\x81\xFD[a \xDE\x8E\x8B\x84\x86\x01\x01a\x1F?V[`@\x82\x01R\x84RPP\x91\x86\x01\x91\x90\x86\x01\x90a v\xCC75\xA9 \xA3\xCAP]8+\xBC\xDCi|\xE6\xC0\xC3\xF8\x86\xFB\xBC\x8E\r#:\xBF\xACZ\xC56S\xAC\x08\xB3c[\xB0\xAE\xC7\x0C9\\B\x02\xDD{\xC7\xDE\xC4\xDC\xEE\xDD\xA7u\xE5\x8D\xD5A\xE0\x8A\x11llS\x81\\\x0B\xD0(\x19/{bh\0\xA2dipfsX\"\x12 \0\xBC\x02\"\xD5\xD5i\xFBY>\x18\xFC/\xB4\x18\xC5\ti\xFAmo\x05\xDB\x8E\xEAi\xCF\x0E\x1D\x18_\xB3dsolcC\0\x08\x14\x003"; + const __BYTECODE: &[u8] = b"`\xE0`@R0`\x80R4\x80\x15a\0\x14W`\0\x80\xFD[P`@Qa+\xAA8\x03\x80a+\xAA\x839\x81\x01`@\x81\x90Ra\x003\x91a\x01WV[`\x01`\x01`\xA0\x1B\x03\x81\x16`\xA0Ra\xEA``\xC0R\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x80Th\x01\0\0\0\0\0\0\0\0\x81\x04`\xFF\x16\x15\x90`\x01`\x01`@\x1B\x03\x16`\0\x81\x15\x80\x15a\0\x90WP\x82[\x90P`\0\x82`\x01`\x01`@\x1B\x03\x16`\x01\x14\x80\x15a\0\xACWP0;\x15[\x90P\x81\x15\x80\x15a\0\xBAWP\x80\x15[\x15a\0\xD8W`@Qc\xF9.\xE8\xA9`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x84T`\x01`\x01`@\x1B\x03\x19\x16`\x01\x17\x85U\x83\x15a\x01\x06W\x84T`\xFF`@\x1B\x19\x16h\x01\0\0\0\0\0\0\0\0\x17\x85U[\x83\x15a\x01LW\x84T`\xFF`@\x1B\x19\x16\x85U`@Q`\x01\x81R\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x90` \x01`@Q\x80\x91\x03\x90\xA1[PPPPPPa\x01\x87V[`\0` \x82\x84\x03\x12\x15a\x01iW`\0\x80\xFD[\x81Q`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a\x01\x80W`\0\x80\xFD[\x93\x92PPPV[`\x80Q`\xA0Q`\xC0Qa)\xD8a\x01\xD2`\09`\0\x81\x81a\x04\xE6\x01Ra\x14\xAA\x01R`\0\x81\x81a\x05\xAF\x01Ra\x15\x16\x01R`\0\x81\x81a\x11\x92\x01R\x81\x81a\x11\xBB\x01Ra\x12\xFF\x01Ra)\xD8`\0\xF3\xFE`\x80`@R`\x046\x10a\x01\xC2W`\x005`\xE0\x1C\x80cr\xB5a\xF9\x11a\0\xF7W\x80c\xAA\x0E\xD0\x9F\x11a\0\x95W\x80c\xD5Gt\x1F\x11a\0dW\x80c\xD5Gt\x1F\x14a\x05\xE9W\x80c\xE1\xA610\x14a\x06\tW\x80c\xED8\r\x03\x14a\x06)W\x80c\xFF\x11J\xE1\x14a\x06IW`\0\x80\xFD[\x80c\xAA\x0E\xD0\x9F\x14a\x05\x1DW\x80c\xAD<\xB1\xCC\x14a\x05=W\x80c\xB8\n\xAA\x89\x14a\x05{W\x80c\xCDy\xF9\x06\x14a\x05\x9DW`\0\x80\xFD[\x80c\x88R!\t\x11a\0\xD1W\x80c\x88R!\t\x14a\x04\x94W\x80c\x91\xD1HT\x14a\x04\xB4W\x80c\x9A\xEC\x99\x0E\x14a\x04\xD4W\x80c\xA2\x17\xFD\xDF\x14a\x05\x08W`\0\x80\xFD[\x80cr\xB5a\xF9\x14a\x04\x0FW\x80cu\x84{\x84\x14a\x04@W\x80cyvi\xC9\x14a\x04`W`\0\x80\xFD[\x80c//\xF1]\x11a\x01dW\x80cR\xD1\x90-\x11a\x01>W\x80cR\xD1\x90-\x14a\x03aW\x80ci\xFD\xBC\xCA\x14a\x03vW\x80ck[!\xA6\x14a\x03\x96W\x80cr\x10Z\xAF\x14a\x03\xEFW`\0\x80\xFD[\x80c//\xF1]\x14a\x03\x0EW\x80c6V\x8A\xBE\x14a\x03.W\x80cO\x1E\xF2\x86\x14a\x03NW`\0\x80\xFD[\x80c\x14\x13\xA9*\x11a\x01\xA0W\x80c\x14\x13\xA9*\x14a\x02\x81W\x80c$\x10\xF6\xBA\x14a\x02\xA1W\x80c$\x8A\x9C\xA3\x14a\x02\xCEW\x80c.\xB3\x9E\xE9\x14a\x02\xEEW`\0\x80\xFD[\x80c\x01\xD5\x8F\xA3\x14a\x01\xC7W\x80c\x01\xFF\xC9\xA7\x14a\x02/W\x80c\x07\x07Y\x1F\x14a\x02_W[`\0\x80\xFD[4\x80\x15a\x01\xD3W`\0\x80\xFD[Pa\x02\x1Ca\x01\xE26`\x04a\x1D\x15V[`\x01`\x01`\xA0\x1B\x03\x16`\0\x90\x81R\x7F\xC1{Kp\x8BoD%\\ \x91:\x9D\x97\xA0S\0\xB6p4,q\xFEZ\xE5\xB6\x17\xBDM\xB5P\x01` R`@\x90 T\x90V[`@Q\x90\x81R` \x01[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x02;W`\0\x80\xFD[Pa\x02Oa\x02J6`\x04a\x1D0V[a\x06iV[`@Q\x90\x15\x15\x81R` \x01a\x02&V[4\x80\x15a\x02kW`\0\x80\xFD[Pa\x02\x7Fa\x02z6`\x04a\x1D\xA2V[a\x06zV[\0[4\x80\x15a\x02\x8DW`\0\x80\xFD[Pa\x02\x7Fa\x02\x9C6`\x04a\x1D\xE3V[a\x06\xA1V[4\x80\x15a\x02\xADW`\0\x80\xFD[Pa\x02\xC1a\x02\xBC6`\x04a\x1E\x05V[a\x06\xC9V[`@Qa\x02&\x91\x90a\x1EnV[4\x80\x15a\x02\xDAW`\0\x80\xFD[Pa\x02\x1Ca\x02\xE96`\x04a\x1E\x05V[a\x08\xD5V[4\x80\x15a\x02\xFAW`\0\x80\xFD[Pa\x02\x7Fa\x03\t6`\x04a\x1F\xC4V[a\x08\xF7V[4\x80\x15a\x03\x1AW`\0\x80\xFD[Pa\x02\x7Fa\x03)6`\x04a!#\xA9f.\xFC\x9C\"\x9Cj\0\x80T`\x01`@\x1B\x81\x04`\xFF\x16\x15\x90`\x01`\x01`@\x1B\x03\x16`\0\x81\x15\x80\x15a\tF\xDD`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0a\n\xC7\x81a\x0EpV[\x81`\x01`\x01`\xA0\x1B\x03\x16cR\xD1\x90-`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x92PPP\x80\x15a\x12\x91WP`@\x80Q`\x1F=\x90\x81\x01`\x1F\x19\x16\x82\x01\x90\x92Ra\x12\x8E\x91\x81\x01\x90a&\xD2V[`\x01[a\x12\xB9W`@QcL\x9C\x8C\xE3`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x83\x16`\x04\x82\x01R`$\x01a\x0C\x11V[`\0\x80Q` a)C\x839\x81Q\x91R\x81\x14a\x12\xEAW`@Qc*\x87Ri`\xE2\x1B\x81R`\x04\x81\x01\x82\x90R`$\x01a\x0C\x11V[a\x06\x9C\x83\x83a\x19\x87V[0`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x14a\x0F\xC1W`@Qcp>F\xDD`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\x01`\xA0\x1B\x03\x82\x16`\0\x90\x81R\x7F\xC1{Kp\x8BoD%\\ \x91:\x9D\x97\xA0S\0\xB6p4,q\xFEZ\xE5\xB6\x17\xBDM\xB5P\x01` R`@\x90 T`\0\x80Q` a)#\x839\x81Q\x91R\x90\x80a\x13\xA3W`@Qc=\xD8\xCA\x95`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0\x81\x81R` \x83\x90R`@\x90 \x80Ta\x13\xBC\x90a#\xF3V[\x90P`\0\x03a\x13\xDEW`@Qc\x1CbV\x0B`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0\x83\x81R`\x02\x83\x01` \x90\x81R`@\x80\x83 \x84\x84R\x90\x91R\x90 T`\xFF\x16a\x06\xC3W`@QcHf%\x81`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0\x80`\0\x80Q` a)#\x839\x81Q\x91R\x90P`\0\x83` \x01Q\x84`@\x01Q\x85``\x01Q`@Q` \x01a\x14Q\x93\x92\x91\x90a&\xEBV[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x81R\x81Q` \x92\x83\x01 `\0\x81\x81R\x92\x85\x90R\x91 \x80T\x91\x92P\x90a\x14\x83\x90a#\xF3V[\x90P`\0\x03a\x14\xA5W`@Qc\x1CbV\x0B`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x14\xCF\x7F\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\0Ba'.V[a\x03\xE8\x85`\x80\x01Qa\x14\xE1\x91\x90a'OV[\x11a\x14\xFFW`@Qc\x0C\xB0/\x05`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`@Qc\xEA\xC7\x08\xA3`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x90c\xEA\xC7\x08\xA3\x90a\x15M\x90\x88\x90\x88\x90`\x04\x01a'qV[`\0`@Q\x80\x83\x03\x81\x86\x80;\x15\x80\x15a\x15eW`\0\x80\xFD[PZ\xFA\x15\x80\x15a\x15yW=`\0\x80>=`\0\xFD[PPPP`\0a\x15\x8C\x85`\0\x01Qa\x19\xDDV[`\x01`\x01`\xA0\x1B\x03\x81\x16`\0\x90\x81R`\x01\x85\x01` R`@\x90 T\x90\x91P\x15a\x15\xBBW`\0\x93PPPPa\x06tV[`\x01`\x01`\xA0\x1B\x03\x81\x16`\0\x90\x81R`\x01\x84\x01` R`@\x90\x81\x90 \x83\x90U\x85Q\x90Q\x83\x91a\x15\xE9\x91a(\x05V[`@Q\x90\x81\x90\x03\x81 \x90\x7F\xF4\x83\x7F\x1Af\xA1\xE5\xFB\xDE,@\xD0\xF6\xEF\xF7Q\x83\x13\x9Ey\xB0\xFC\x1E\xAA\xB2\x80\xA3\xA0\xBE8\xE7\xB1\x90`\0\x90\xA3P`\x01\x95\x94PPPPPV[`\0\x81\x81R`\0\x80Q` a)#\x839\x81Q\x91R` \x81\x90R`@\x82 \x80Ta\x16M\x90a#\xF3V[\x90P`\0\x03a\x16_WP`\0\x92\x91PPV[`\0\x83\x81R` \x82\x90R`@\x81 \x90a\x16x\x82\x82a\x1C\xABV[a\x16\x86`\x01\x83\x01`\0a\x1C\xABV[a\x16\x94`\x02\x83\x01`\0a\x1C\xABV[PP`@Q\x83\x90\x7FKq\xBE\xDD\xA4!yf\xEA\xC1\xAAI\xE3[\x15P\xE5\xAB\x87\x06J\xE1y\xD1\xB3k9;\xD0N\xB7C\x90`\0\x90\xA2P`\x01\x92\x91PPV[`\0a\x16\xD7\x84\x84\x84a\x1A\rV[\x90Pa\x16\xE2\x81a\x1AFV[a\x17\x02W`@Qc\x065l\xB3`\xE0\x1B\x81R`\x04\x81\x01\x82\x90R`$\x01a\x0C\x11V[`\0\x81\x81Ra\x01\xF5` R`@\x90 T`\xFF\x16\x15a\x176W`@Qc\"m\xD8\xA3`\xE2\x1B\x81R`\x04\x81\x01\x82\x90R`$\x01a\x0C\x11V[`\0a\x17[`@Q\x80``\x01`@R\x80\x87\x81R` \x01\x86\x81R` \x01\x85\x81RPa\x18\nV[P\x90P\x81\x81\x14a\x17~W`@Qc\x0CZ\x1A\xAB`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\nT\x82\x87a\x1A{V[a\x17\x92\x82\x82a\x0CdV[a\n\xC7W`@Qc\xE2Q}?`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x82\x16`\x04\x82\x01R`$\x81\x01\x83\x90R`D\x01a\x0C\x11V[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0T`\x01`@\x1B\x90\x04`\xFF\x16a\x0F\xC1W`@Qc\x1A\xFC\xD7\x9F`\xE3\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x80QQ`\0\x90\x81\x90`\0\x80Q` a)#\x839\x81Q\x91R\x90`0\x14\x80\x15a\x186WP\x83` \x01QQ`0\x14[\x80\x15a\x18GWP\x83`@\x01QQ`0\x14[a\x18dW`@QcBc\r\xDB`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0\x84`\0\x01Q\x85` \x01Q\x86`@\x01Q`@Q` \x01a\x18\x87\x93\x92\x91\x90a&\xEBV[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x81R\x81Q` \x92\x83\x01 `\0\x81\x81R\x92\x85\x90R\x91 \x80T\x91\x92P\x90a\x18\xB9\x90a#\xF3V[\x15\x90Pa\x18\xCBW\x94`\0\x94P\x92PPPV[`@\x80Q``\x81\x01\x82R\x86Q\x81R` \x80\x88\x01Q\x81\x83\x01R\x87\x83\x01Q\x82\x84\x01R`\0\x84\x81R\x90\x85\x90R\x91\x90\x91 \x81Q\x81\x90a\x19\x06\x90\x82a(!V[P` \x82\x01Q`\x01\x82\x01\x90a\x19\x1B\x90\x82a(!V[P`@\x82\x01Q`\x02\x82\x01\x90a\x190\x90\x82a(!V[P\x90PP\x80\x7FR\xB2\x9B\xBD\xD9z\xB9\x83A\x9FP\xFA\x15\x90\xE5\xABu\xE9\x94\"y\xE9^\x10\xA0\x86\x07\xB0l##\x8B\x86`\0\x01Q\x87` \x01Q\x88`@\x01Q`@Qa\x19t\x93\x92\x91\x90a(\xDFV[`@Q\x80\x91\x03\x90\xA2\x94`\x01\x94P\x92PPPV[a\x19\x90\x82a\x1B,V[`@Q`\x01`\x01`\xA0\x1B\x03\x83\x16\x90\x7F\xBC|\xD7Z \xEE'\xFD\x9A\xDE\xBA\xB3 A\xF7U!M\xBCk\xFF\xA9\x0C\xC0\"[9\xDA.\\-;\x90`\0\x90\xA2\x80Q\x15a\x19\xD5Wa\x06\x9C\x82\x82a\x1B\x91V[a\n\xC7a\x1C\x07V[`\0\x81Q`@\x14a\x1A\x01W`@Qc\xBD\x9C\x80\xC1`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[P\x80Q` \x90\x91\x01 \x90V[`\0\x80\x84\x84\x84`@Q` \x01a\x1A%\x93\x92\x91\x90a&\xEBV[`@\x80Q\x80\x83\x03`\x1F\x19\x01\x81R\x91\x90R\x80Q` \x90\x91\x01 \x95\x94PPPPPV[`\0\x81\x15\x80a\x1AtWP\x7F\xCD.f\xBF\x0B\x91\xEE\xED\xC6\xC6H\xAE\x935\xA7\x8D|\x9AJ\xB0\xEF3a*\x82M\x91\xCD\xC6\x8AO!\x82\x14[\x15\x92\x91PPV[`\0\x81\x81R\x7F\xC1{Kp\x8BoD%\\ \x91:\x9D\x97\xA0S\0\xB6p4,q\xFEZ\xE5\xB6\x17\xBDM\xB5P\x02` \x90\x81R`@\x80\x83 \x85\x84R\x90\x91R\x81 T`\0\x80Q` a)#\x839\x81Q\x91R\x90`\xFF\x16\x15a\x1A\xD6W`\0\x91PPa\x06tV[`\0\x83\x81R`\x02\x82\x01` \x90\x81R`@\x80\x83 \x87\x84R\x82R\x91\x82\x90 \x80T`\xFF\x19\x16`\x01\x17\x90U\x90Q\x84\x81R\x85\x91\x7F\xBF\xB1&\xE7B\xCE\x96\x18\xB5\xBFkT\x83\x99\x16\x92o\\9wR\xBE5@L\x83h\xDD\xCFh\xC1\n\x91\x01a\x0F\xA7V[\x80`\x01`\x01`\xA0\x1B\x03\x16;`\0\x03a\x1BbW`@QcL\x9C\x8C\xE3`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x82\x16`\x04\x82\x01R`$\x01a\x0C\x11V[`\0\x80Q` a)C\x839\x81Q\x91R\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16`\x01`\x01`\xA0\x1B\x03\x92\x90\x92\x16\x91\x90\x91\x17\x90UV[```\0\x80\x84`\x01`\x01`\xA0\x1B\x03\x16\x84`@Qa\x1B\xAE\x91\x90a(\x05V[`\0`@Q\x80\x83\x03\x81\x85Z\xF4\x91PP=\x80`\0\x81\x14a\x1B\xE9W`@Q\x91P`\x1F\x19`?=\x01\x16\x82\x01`@R=\x82R=`\0` \x84\x01>a\x1B\xEEV[``\x91P[P\x91P\x91Pa\x1B\xFE\x85\x83\x83a\x1C&V[\x95\x94PPPPPV[4\x15a\x0F\xC1W`@Qc\xB3\x98\x97\x9F`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[``\x82a\x1C;Wa\x1C6\x82a\x1C\x82V[a\x0B\xB0V[\x81Q\x15\x80\x15a\x1CRWP`\x01`\x01`\xA0\x1B\x03\x84\x16;\x15[\x15a\x1C{W`@Qc\x99\x96\xB3\x15`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x85\x16`\x04\x82\x01R`$\x01a\x0C\x11V[P\x80a\x0B\xB0V[\x80Q\x15a\x1C\x92W\x80Q\x80\x82` \x01\xFD[`@Qc\xD6\xBD\xA2u`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[P\x80Ta\x1C\xB7\x90a#\xF3V[`\0\x82U\x80`\x1F\x10a\x1C\xC7WPPV[`\x1F\x01` \x90\x04\x90`\0R` `\0 \x90\x81\x01\x90a\x0Ez\x91\x90[\x80\x82\x11\x15a\x1C\xF5W`\0\x81U`\x01\x01a\x1C\xE1V[P\x90V[\x805`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a\x1D\x10W`\0\x80\xFD[\x91\x90PV[`\0` \x82\x84\x03\x12\x15a\x1D'W`\0\x80\xFD[a\x0B\xB0\x82a\x1C\xF9V[`\0` \x82\x84\x03\x12\x15a\x1DBW`\0\x80\xFD[\x815`\x01`\x01`\xE0\x1B\x03\x19\x81\x16\x81\x14a\x0B\xB0W`\0\x80\xFD[`\0\x80\x83`\x1F\x84\x01\x12a\x1DlW`\0\x80\xFD[P\x815`\x01`\x01`@\x1B\x03\x81\x11\x15a\x1D\x83W`\0\x80\xFD[` \x83\x01\x91P\x83` \x82\x85\x01\x01\x11\x15a\x1D\x9BW`\0\x80\xFD[\x92P\x92\x90PV[`\0\x80` \x83\x85\x03\x12\x15a\x1D\xB5W`\0\x80\xFD[\x825`\x01`\x01`@\x1B\x03\x81\x11\x15a\x1D\xCBW`\0\x80\xFD[a\x1D\xD7\x85\x82\x86\x01a\x1DZV[\x90\x96\x90\x95P\x93PPPPV[`\0\x80`@\x83\x85\x03\x12\x15a\x1D\xF6W`\0\x80\xFD[PP\x805\x92` \x90\x91\x015\x91PV[`\0` \x82\x84\x03\x12\x15a\x1E\x17W`\0\x80\xFD[P5\x91\x90PV[`\0[\x83\x81\x10\x15a\x1E9W\x81\x81\x01Q\x83\x82\x01R` \x01a\x1E!V[PP`\0\x91\x01RV[`\0\x81Q\x80\x84Ra\x1EZ\x81` \x86\x01` \x86\x01a\x1E\x1EV[`\x1F\x01`\x1F\x19\x16\x92\x90\x92\x01` \x01\x92\x91PPV[` \x81R`\0\x82Q``` \x84\x01Ra\x1E\x8A`\x80\x84\x01\x82a\x1EBV[\x90P` \x84\x01Q`\x1F\x19\x84\x83\x03\x01`@\x85\x01Ra\x1E\xA7\x82\x82a\x1EBV[\x91PP`@\x84\x01Q`\x1F\x19\x84\x83\x03\x01``\x85\x01Ra\x1B\xFE\x82\x82a\x1EBV[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`@Q``\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a\x1E\xFDWa\x1E\xFDa\x1E\xC5V[`@R\x90V[`@Q`\xA0\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a\x1E\xFDWa\x1E\xFDa\x1E\xC5V[`@Q`\x1F\x82\x01`\x1F\x19\x16\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a\x1FMWa\x1FMa\x1E\xC5V[`@R\x91\x90PV[`\0\x82`\x1F\x83\x01\x12a\x1FfW`\0\x80\xFD[\x815`\x01`\x01`@\x1B\x03\x81\x11\x15a\x1F\x7FWa\x1F\x7Fa\x1E\xC5V[a\x1F\x92`\x1F\x82\x01`\x1F\x19\x16` \x01a\x1F%V[\x81\x81R\x84` \x83\x86\x01\x01\x11\x15a\x1F\xA7W`\0\x80\xFD[\x81` \x85\x01` \x83\x017`\0\x91\x81\x01` \x01\x91\x90\x91R\x93\x92PPPV[`\0\x80`@\x83\x85\x03\x12\x15a\x1F\xD7W`\0\x80\xFD[a\x1F\xE0\x83a\x1C\xF9V[\x91P` \x83\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a\x1F\xFBW`\0\x80\xFD[\x83\x01`\x1F\x81\x01\x85\x13a \x0CW`\0\x80\xFD[\x805`\x01`\x01`@\x1B\x03\x81\x11\x15a %Wa %a\x1E\xC5V[\x80`\x05\x1Ba 5` \x82\x01a\x1F%V[\x91\x82R` \x81\x84\x01\x81\x01\x92\x90\x81\x01\x90\x88\x84\x11\x15a QW`\0\x80\xFD[` \x85\x01\x92P[\x83\x83\x10\x15a!-W\x825`\x01`\x01`@\x1B\x03\x81\x11\x15a vW`\0\x80\xFD[\x85\x01``\x81\x8B\x03`\x1F\x19\x01\x12\x15a \x8CW`\0\x80\xFD[a \x94a\x1E\xDBV[` \x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a \xADW`\0\x80\xFD[a \xBC\x8C` \x83\x86\x01\x01a\x1FUV[\x82RP`@\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a \xD8W`\0\x80\xFD[a \xE7\x8C` \x83\x86\x01\x01a\x1FUV[` \x83\x01RP``\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a!\x06W`\0\x80\xFD[a!\x15\x8C` \x83\x86\x01\x01a\x1FUV[`@\x83\x01RP\x83RP` \x92\x83\x01\x92\x90\x91\x01\x90a XV[\x80\x95PPPPPP\x92P\x92\x90PV[`\0\x80`@\x83\x85\x03\x12\x15a!OW`\0\x80\xFD[\x825\x91Pa!_` \x84\x01a\x1C\xF9V[\x90P\x92P\x92\x90PV[`\0\x80`@\x83\x85\x03\x12\x15a!{W`\0\x80\xFD[a!\x84\x83a\x1C\xF9V[\x91P` \x83\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a!\x9FW`\0\x80\xFD[a!\xAB\x85\x82\x86\x01a\x1FUV[\x91PP\x92P\x92\x90PV[`\0\x80`\0\x80`\0\x80`\x80\x87\x89\x03\x12\x15a!\xCEW`\0\x80\xFD[a!\xD7\x87a\x1C\xF9V[\x95P` \x87\x015\x94P`@\x87\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a!\xF9W`\0\x80\xFD[a\"\x05\x89\x82\x8A\x01a\x1DZV[\x90\x95P\x93PP``\x87\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a\"$W`\0\x80\xFD[a\"0\x89\x82\x8A\x01a\x1DZV[\x97\x9A\x96\x99P\x94\x97P\x92\x95\x93\x94\x92PPPV[`\0\x80`@\x83\x85\x03\x12\x15a\"UW`\0\x80\xFD[\x825`\x01`\x01`@\x1B\x03\x81\x11\x15a\"kW`\0\x80\xFD[a\"w\x85\x82\x86\x01a\x1FUV[\x92PP` \x83\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a\"\x93W`\0\x80\xFD[\x83\x01`\xA0\x81\x86\x03\x12\x15a\"\xA5W`\0\x80\xFD[a\"\xADa\x1F\x03V[\x815`\x01`\x01`@\x1B\x03\x81\x11\x15a\"\xC3W`\0\x80\xFD[a\"\xCF\x87\x82\x85\x01a\x1FUV[\x82RP` \x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a\"\xEBW`\0\x80\xFD[a\"\xF7\x87\x82\x85\x01a\x1FUV[` \x83\x01RP`@\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a#\x16W`\0\x80\xFD[a#\"\x87\x82\x85\x01a\x1FUV[`@\x83\x01RP``\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a#AW`\0\x80\xFD[a#M\x87\x82\x85\x01a\x1FUV[``\x83\x01RP`\x80\x91\x82\x015\x91\x81\x01\x91\x90\x91R\x91\x94\x91\x93P\x90\x91PPV[` \x81R`\0a\x0B\xB0` \x83\x01\x84a\x1EBV[`\0\x80`@\x83\x85\x03\x12\x15a#\x91W`\0\x80\xFD[a#\x9A\x83a\x1C\xF9V[\x94` \x93\x90\x93\x015\x93PPPV[`\0\x80`\0`@\x84\x86\x03\x12\x15a#\xBDW`\0\x80\xFD[\x835\x92P` \x84\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a#\xDAW`\0\x80\xFD[a#\xE6\x86\x82\x87\x01a\x1DZV[\x94\x97\x90\x96P\x93\x94PPPPV[`\x01\x81\x81\x1C\x90\x82\x16\x80a$\x07W`\x7F\x82\x16\x91P[` \x82\x10\x81\x03a$'WcNH{q`\xE0\x1B`\0R`\"`\x04R`$`\0\xFD[P\x91\x90PV[`\x1F\x82\x11\x15a\x06\x9CW\x80`\0R` `\0 `\x1F\x84\x01`\x05\x1C\x81\x01` \x85\x10\x15a$TWP\x80[`\x1F\x84\x01`\x05\x1C\x82\x01\x91P[\x81\x81\x10\x15a$tW`\0\x81U`\x01\x01a$`V[PPPPPV[`\x01`\x01`@\x1B\x03\x83\x11\x15a$\x92Wa$\x92a\x1E\xC5V[a$\xA6\x83a$\xA0\x83Ta#\xF3V[\x83a$-V[`\0`\x1F\x84\x11`\x01\x81\x14a$\xDAW`\0\x85\x15a$\xC2WP\x83\x82\x015[`\0\x19`\x03\x87\x90\x1B\x1C\x19\x16`\x01\x86\x90\x1B\x17\x83Ua$tV[`\0\x83\x81R` \x90 `\x1F\x19\x86\x16\x90\x83[\x82\x81\x10\x15a%\x0BW\x86\x85\x015\x82U` \x94\x85\x01\x94`\x01\x90\x92\x01\x91\x01a$\xEBV[P\x86\x82\x10\x15a%(W`\0\x19`\xF8\x88`\x03\x1B\x16\x1C\x19\x84\x87\x015\x16\x81U[PP`\x01\x85`\x01\x1B\x01\x83UPPPPPV[`\0\x80`\0``\x84\x86\x03\x12\x15a%OW`\0\x80\xFD[\x835`\x01`\x01`@\x1B\x03\x81\x11\x15a%eW`\0\x80\xFD[a%q\x86\x82\x87\x01a\x1FUV[\x93PP` \x84\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a%\x8DW`\0\x80\xFD[a%\x99\x86\x82\x87\x01a\x1FUV[\x92PP`@\x84\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a%\xB5W`\0\x80\xFD[a%\xC1\x86\x82\x87\x01a\x1FUV[\x91PP\x92P\x92P\x92V[`\0\x80`\0\x80`\0\x80`\xC0\x87\x89\x03\x12\x15a%\xE4W`\0\x80\xFD[\x865`\x01`\x01`@\x1B\x03\x81\x11\x15a%\xFAW`\0\x80\xFD[a&\x06\x89\x82\x8A\x01a\x1FUV[\x96PP` \x87\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a&\"W`\0\x80\xFD[a&.\x89\x82\x8A\x01a\x1FUV[\x95PP`@\x87\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a&JW`\0\x80\xFD[a&V\x89\x82\x8A\x01a\x1FUV[\x94PP``\x87\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a&rW`\0\x80\xFD[a&~\x89\x82\x8A\x01a\x1FUV[\x93PP`\x80\x87\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a&\x9AW`\0\x80\xFD[a&\xA6\x89\x82\x8A\x01a\x1FUV[\x96\x99\x95\x98P\x93\x96\x92\x95\x94`\xA0\x90\x93\x015\x93PPPV[cNH{q`\xE0\x1B`\0R`2`\x04R`$`\0\xFD[`\0` \x82\x84\x03\x12\x15a&\xE4W`\0\x80\xFD[PQ\x91\x90PV[`\0\x84Qa&\xFD\x81\x84` \x89\x01a\x1E\x1EV[\x84Q\x90\x83\x01\x90a'\x11\x81\x83` \x89\x01a\x1E\x1EV[\x84Q\x91\x01\x90a'$\x81\x83` \x88\x01a\x1E\x1EV[\x01\x95\x94PPPPPV[\x81\x81\x03\x81\x81\x11\x15a\x06tWcNH{q`\xE0\x1B`\0R`\x11`\x04R`$`\0\xFD[`\0\x82a'lWcNH{q`\xE0\x1B`\0R`\x12`\x04R`$`\0\xFD[P\x04\x90V[`@\x81R`\0a'\x84`@\x83\x01\x85a\x1EBV[\x82\x81\x03` \x84\x01R\x83Q`\xA0\x82Ra'\x9F`\xA0\x83\x01\x82a\x1EBV[\x90P` \x85\x01Q\x82\x82\x03` \x84\x01Ra'\xB8\x82\x82a\x1EBV[\x91PP`@\x85\x01Q\x82\x82\x03`@\x84\x01Ra'\xD2\x82\x82a\x1EBV[\x91PP``\x85\x01Q\x82\x82\x03``\x84\x01Ra'\xEC\x82\x82a\x1EBV[\x91PP`\x80\x85\x01Q`\x80\x83\x01R\x80\x92PPP\x93\x92PPPV[`\0\x82Qa(\x17\x81\x84` \x87\x01a\x1E\x1EV[\x91\x90\x91\x01\x92\x91PPV[\x81Q`\x01`\x01`@\x1B\x03\x81\x11\x15a(:Wa(:a\x1E\xC5V[a(N\x81a(H\x84Ta#\xF3V[\x84a$-V[` `\x1F\x82\x11`\x01\x81\x14a(\x82W`\0\x83\x15a(jWP\x84\x82\x01Q[`\0\x19`\x03\x85\x90\x1B\x1C\x19\x16`\x01\x84\x90\x1B\x17\x84Ua$tV[`\0\x84\x81R` \x81 `\x1F\x19\x85\x16\x91[\x82\x81\x10\x15a(\xB2W\x87\x85\x01Q\x82U` \x94\x85\x01\x94`\x01\x90\x92\x01\x91\x01a(\x92V[P\x84\x82\x10\x15a(\xD0W\x86\x84\x01Q`\0\x19`\x03\x87\x90\x1B`\xF8\x16\x1C\x19\x16\x81U[PPPP`\x01\x90\x81\x1B\x01\x90UPV[``\x81R`\0a(\xF2``\x83\x01\x86a\x1EBV[\x82\x81\x03` \x84\x01Ra)\x04\x81\x86a\x1EBV[\x90P\x82\x81\x03`@\x84\x01Ra)\x18\x81\x85a\x1EBV[\x96\x95PPPPPPV\xFE\xC1{Kp\x8BoD%\\ \x91:\x9D\x97\xA0S\0\xB6p4,q\xFEZ\xE5\xB6\x17\xBDM\xB5P\x006\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC\xDCi|\xE6\xC0\xC3\xF8\x86\xFB\xBC\x8E\r#:\xBF\xACZ\xC56S\xAC\x08\xB3c[\xB0\xAE\xC7\x0C9\\B\x02\xDD{\xC7\xDE\xC4\xDC\xEE\xDD\xA7u\xE5\x8D\xD5A\xE0\x8A\x11llS\x81\\\x0B\xD0(\x19/{bh\0\xA2dipfsX\"\x12 tU\xD9c\xC2,\xBEav@-\x1DW\xE1\xC0\x17d\xD1\xBB_\xBF\xFC\x95\\\x8Cq\x9C\x9DJ\xFC\xDA\xBEdsolcC\0\x08\x1C\x003"; /// The bytecode of the contract. pub static ENTITYKEYREGISTRY_BYTECODE: ::ethers::core::types::Bytes = ::ethers::core::types::Bytes::from_static(__BYTECODE); #[rustfmt::skip] - const __DEPLOYED_BYTECODE: &[u8] = b"`\x80`@R`\x046\x10a\x01\xC2W`\x005`\xE0\x1C\x80cr\xB5a\xF9\x11a\0\xF7W\x80c\xAA\x0E\xD0\x9F\x11a\0\x95W\x80c\xD5Gt\x1F\x11a\0dW\x80c\xD5Gt\x1F\x14a\x05\xE9W\x80c\xE1\xA610\x14a\x06\tW\x80c\xED8\r\x03\x14a\x06)W\x80c\xFF\x11J\xE1\x14a\x06IW`\0\x80\xFD[\x80c\xAA\x0E\xD0\x9F\x14a\x05\x1DW\x80c\xAD<\xB1\xCC\x14a\x05=W\x80c\xB8\n\xAA\x89\x14a\x05{W\x80c\xCDy\xF9\x06\x14a\x05\x9DW`\0\x80\xFD[\x80c\x88R!\t\x11a\0\xD1W\x80c\x88R!\t\x14a\x04\x94W\x80c\x91\xD1HT\x14a\x04\xB4W\x80c\x9A\xEC\x99\x0E\x14a\x04\xD4W\x80c\xA2\x17\xFD\xDF\x14a\x05\x08W`\0\x80\xFD[\x80cr\xB5a\xF9\x14a\x04\x0FW\x80cu\x84{\x84\x14a\x04@W\x80cyvi\xC9\x14a\x04`W`\0\x80\xFD[\x80c//\xF1]\x11a\x01dW\x80cR\xD1\x90-\x11a\x01>W\x80cR\xD1\x90-\x14a\x03aW\x80ci\xFD\xBC\xCA\x14a\x03vW\x80ck[!\xA6\x14a\x03\x96W\x80cr\x10Z\xAF\x14a\x03\xEFW`\0\x80\xFD[\x80c//\xF1]\x14a\x03\x0EW\x80c6V\x8A\xBE\x14a\x03.W\x80cO\x1E\xF2\x86\x14a\x03NW`\0\x80\xFD[\x80c\x14\x13\xA9*\x11a\x01\xA0W\x80c\x14\x13\xA9*\x14a\x02\x81W\x80c$\x10\xF6\xBA\x14a\x02\xA1W\x80c$\x8A\x9C\xA3\x14a\x02\xCEW\x80c.\xB3\x9E\xE9\x14a\x02\xEEW`\0\x80\xFD[\x80c\x01\xD5\x8F\xA3\x14a\x01\xC7W\x80c\x01\xFF\xC9\xA7\x14a\x02/W\x80c\x07\x07Y\x1F\x14a\x02_W[`\0\x80\xFD[4\x80\x15a\x01\xD3W`\0\x80\xFD[Pa\x02\x1Ca\x01\xE26`\x04a\x1C\xFEV[`\x01`\x01`\xA0\x1B\x03\x16`\0\x90\x81R\x7F\xC1{Kp\x8BoD%\\ \x91:\x9D\x97\xA0S\0\xB6p4,q\xFEZ\xE5\xB6\x17\xBDM\xB5P\x01` R`@\x90 T\x90V[`@Q\x90\x81R` \x01[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x02;W`\0\x80\xFD[Pa\x02Oa\x02J6`\x04a\x1D\x19V[a\x06iV[`@Q\x90\x15\x15\x81R` \x01a\x02&V[4\x80\x15a\x02kW`\0\x80\xFD[Pa\x02\x7Fa\x02z6`\x04a\x1D\x8BV[a\x06zV[\0[4\x80\x15a\x02\x8DW`\0\x80\xFD[Pa\x02\x7Fa\x02\x9C6`\x04a\x1D\xCCV[a\x06\xA1V[4\x80\x15a\x02\xADW`\0\x80\xFD[Pa\x02\xC1a\x02\xBC6`\x04a\x1D\xEEV[a\x06\xC9V[`@Qa\x02&\x91\x90a\x1EWV[4\x80\x15a\x02\xDAW`\0\x80\xFD[Pa\x02\x1Ca\x02\xE96`\x04a\x1D\xEEV[a\x08\xD5V[4\x80\x15a\x02\xFAW`\0\x80\xFD[Pa\x02\x7Fa\x03\t6`\x04a\x1F\xAEV[a\x08\xF7V[4\x80\x15a\x03\x1AW`\0\x80\xFD[Pa\x02\x7Fa\x03)6`\x04a!\x05V[a\n]V[4\x80\x15a\x03:W`\0\x80\xFD[Pa\x02\x7Fa\x03I6`\x04a!\x05V[a\nyV[a\x02\x7Fa\x03\\6`\x04a!1V[a\n\xACV[4\x80\x15a\x03mW`\0\x80\xFD[Pa\x02\x1Ca\n\xCBV[4\x80\x15a\x03\x82W`\0\x80\xFD[Pa\x02\x7Fa\x03\x916`\x04a!~V[a\n\xE8V[4\x80\x15a\x03\xA2W`\0\x80\xFD[Pa\x02Oa\x03\xB16`\x04a\x1D\xCCV[`\0\x90\x81R\x7F\xC1{Kp\x8BoD%\\ \x91:\x9D\x97\xA0S\0\xB6p4,q\xFEZ\xE5\xB6\x17\xBDM\xB5P\x02` \x90\x81R`@\x80\x83 \x93\x83R\x92\x90R T`\xFF\x16\x90V[4\x80\x15a\x03\xFBW`\0\x80\xFD[Pa\x02\x7Fa\x04\n6`\x04a!\x05V[a\x0B\x9AV[4\x80\x15a\x04\x1BW`\0\x80\xFD[Pa\x02Oa\x04*6`\x04a\x1D\xEEV[a\x01\xF5` R`\0\x90\x81R`@\x90 T`\xFF\x16\x81V[4\x80\x15a\x04LW`\0\x80\xFD[Pa\x02Oa\x04[6`\x04a\"\x07V[a\x0B\xA4V[4\x80\x15a\x04lW`\0\x80\xFD[Pa\x02\x1C\x7Fq\xF3\xD5XV\xE4\x05\x8E\xD0n\xE0W\xD7\x9A\xDAa_e\xCD\xF5\xF9\xEE\x88\x18\x1B\x91B%\x08\x8F\x83O\x81V[4\x80\x15a\x04\xA0W`\0\x80\xFD[Pa\x02\x7Fa\x04\xAF6`\x04a\x1D\xEEV[a\x0B\xB7V[4\x80\x15a\x04\xC0W`\0\x80\xFD[Pa\x02Oa\x04\xCF6`\x04a!\x05V[a\x0CdV[4\x80\x15a\x04\xE0W`\0\x80\xFD[Pa\x02\x1C\x7F\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\x81V[4\x80\x15a\x05\x14W`\0\x80\xFD[Pa\x02\x1C`\0\x81V[4\x80\x15a\x05)W`\0\x80\xFD[Pa\x02\x7Fa\x0586`\x04a\x1C\xFEV[a\x0C\x9CV[4\x80\x15a\x05IW`\0\x80\xFD[Pa\x05n`@Q\x80`@\x01`@R\x80`\x05\x81R` \x01d\x03R\xE3\x02\xE3`\xDC\x1B\x81RP\x81V[`@Qa\x02&\x91\x90a#\x10V[4\x80\x15a\x05\x87W`\0\x80\xFD[Pa\x02\x1C`\0\x80Q` a)\t\x839\x81Q\x91R\x81V[4\x80\x15a\x05\xA9W`\0\x80\xFD[Pa\x05\xD1\x7F\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\x81V[`@Q`\x01`\x01`\xA0\x1B\x03\x90\x91\x16\x81R` \x01a\x02&V[4\x80\x15a\x05\xF5W`\0\x80\xFD[Pa\x02\x7Fa\x06\x046`\x04a!\x05V[a\x0C\xBFV[4\x80\x15a\x06\x15W`\0\x80\xFD[Pa\x05na\x06$6`\x04a##V[a\x0C\xDBV[4\x80\x15a\x065W`\0\x80\xFD[Pa\x02\x7Fa\x06D6`\x04a##V[a\r\x81V[4\x80\x15a\x06UW`\0\x80\xFD[Pa\x02\x7Fa\x06d6`\x04a#MV[a\x0E\x01V[`\0a\x06t\x82a\x0E;V[\x92\x91PPV[`\0\x80Q` a)\t\x839\x81Q\x91Ra\x06\x92\x81a\x0EpV[a\x06\x9C\x83\x83a\x0E}V[PPPV[`\0\x80Q` a)\t\x839\x81Q\x91Ra\x06\xB9\x81a\x0EpV[a\x06\xC3\x83\x83a\x0E\xD7V[PPPPV[a\x06\xED`@Q\x80``\x01`@R\x80``\x81R` \x01``\x81R` \x01``\x81RP\x90V[`\0\x82\x81R`\0\x80Q` a(\xC9\x839\x81Q\x91R` \x81\x90R`@\x91\x82\x90 \x82Q``\x81\x01\x90\x93R\x80T\x91\x92\x91\x82\x90\x82\x90a\x07'\x90a#\x98V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\x07S\x90a#\x98V[\x80\x15a\x07\xA0W\x80`\x1F\x10a\x07uWa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\x07\xA0V[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\x07\x83W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81R` \x01`\x01\x82\x01\x80Ta\x07\xB9\x90a#\x98V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\x07\xE5\x90a#\x98V[\x80\x15a\x082W\x80`\x1F\x10a\x08\x07Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\x082V[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\x08\x15W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81R` \x01`\x02\x82\x01\x80Ta\x08K\x90a#\x98V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\x08w\x90a#\x98V[\x80\x15a\x08\xC4W\x80`\x1F\x10a\x08\x99Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\x08\xC4V[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\x08\xA7W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81RPP\x91PP\x91\x90PV[`\0\x90\x81R`\0\x80Q` a))\x839\x81Q\x91R` R`@\x90 `\x01\x01T\x90V[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x80T`\x01`@\x1B\x81\x04`\xFF\x16\x15\x90`\x01`\x01`@\x1B\x03\x16`\0\x81\x15\x80\x15a\tF\xDD`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0a\n\xC7\x81a\x0EpV[\x81`\x01`\x01`\xA0\x1B\x03\x16cR\xD1\x90-`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x92PPP\x80\x15a\x12zWP`@\x80Q`\x1F=\x90\x81\x01`\x1F\x19\x16\x82\x01\x90\x92Ra\x12w\x91\x81\x01\x90a&\x85V[`\x01[a\x12\xA2W`@QcL\x9C\x8C\xE3`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x83\x16`\x04\x82\x01R`$\x01a\x0C\x11V[`\0\x80Q` a(\xE9\x839\x81Q\x91R\x81\x14a\x12\xD3W`@Qc*\x87Ri`\xE2\x1B\x81R`\x04\x81\x01\x82\x90R`$\x01a\x0C\x11V[a\x06\x9C\x83\x83a\x19pV[0`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x14a\x0F\x9FW`@Qcp>F\xDD`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\x01`\xA0\x1B\x03\x82\x16`\0\x90\x81R\x7F\xC1{Kp\x8BoD%\\ \x91:\x9D\x97\xA0S\0\xB6p4,q\xFEZ\xE5\xB6\x17\xBDM\xB5P\x01` R`@\x90 T`\0\x80Q` a(\xC9\x839\x81Q\x91R\x90\x80a\x13\x8CW`@Qc=\xD8\xCA\x95`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0\x81\x81R` \x83\x90R`@\x90 \x80Ta\x13\xA5\x90a#\x98V[\x90P`\0\x03a\x13\xC7W`@Qc\x1CbV\x0B`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0\x83\x81R`\x02\x83\x01` \x90\x81R`@\x80\x83 \x84\x84R\x90\x91R\x90 T`\xFF\x16a\x06\xC3W`@QcHf%\x81`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0\x80`\0\x80Q` a(\xC9\x839\x81Q\x91R\x90P`\0\x83` \x01Q\x84`@\x01Q\x85``\x01Q`@Q` \x01a\x14:\x93\x92\x91\x90a&\x9EV[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x81R\x81Q` \x92\x83\x01 `\0\x81\x81R\x92\x85\x90R\x91 \x80T\x91\x92P\x90a\x14l\x90a#\x98V[\x90P`\0\x03a\x14\x8EW`@Qc\x1CbV\x0B`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x14\xB8\x7F\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\0Ba&\xE1V[a\x03\xE8\x85`\x80\x01Qa\x14\xCA\x91\x90a&\xF4V[\x11a\x14\xE8W`@Qc\x0C\xB0/\x05`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`@Qc\xEA\xC7\x08\xA3`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x90c\xEA\xC7\x08\xA3\x90a\x156\x90\x88\x90\x88\x90`\x04\x01a'\x16V[`\0`@Q\x80\x83\x03\x81\x86\x80;\x15\x80\x15a\x15NW`\0\x80\xFD[PZ\xFA\x15\x80\x15a\x15bW=`\0\x80>=`\0\xFD[PPPP`\0a\x15u\x85`\0\x01Qa\x19\xC6V[`\x01`\x01`\xA0\x1B\x03\x81\x16`\0\x90\x81R`\x01\x85\x01` R`@\x90 T\x90\x91P\x15a\x15\xA4W`\0\x93PPPPa\x06tV[`\x01`\x01`\xA0\x1B\x03\x81\x16`\0\x90\x81R`\x01\x84\x01` R`@\x90\x81\x90 \x83\x90U\x85Q\x90Q\x83\x91a\x15\xD2\x91a'\xAAV[`@Q\x90\x81\x90\x03\x81 \x90\x7F\xF4\x83\x7F\x1Af\xA1\xE5\xFB\xDE,@\xD0\xF6\xEF\xF7Q\x83\x13\x9Ey\xB0\xFC\x1E\xAA\xB2\x80\xA3\xA0\xBE8\xE7\xB1\x90`\0\x90\xA3P`\x01\x95\x94PPPPPV[`\0\x81\x81R`\0\x80Q` a(\xC9\x839\x81Q\x91R` \x81\x90R`@\x82 \x80Ta\x166\x90a#\x98V[\x90P`\0\x03a\x16HWP`\0\x92\x91PPV[`\0\x83\x81R` \x82\x90R`@\x81 \x90a\x16a\x82\x82a\x1C\x94V[a\x16o`\x01\x83\x01`\0a\x1C\x94V[a\x16}`\x02\x83\x01`\0a\x1C\x94V[PP`@Q\x83\x90\x7FKq\xBE\xDD\xA4!yf\xEA\xC1\xAAI\xE3[\x15P\xE5\xAB\x87\x06J\xE1y\xD1\xB3k9;\xD0N\xB7C\x90`\0\x90\xA2P`\x01\x92\x91PPV[`\0a\x16\xC0\x84\x84\x84a\x19\xF6V[\x90Pa\x16\xCB\x81a\x1A/V[a\x16\xEBW`@Qc\x065l\xB3`\xE0\x1B\x81R`\x04\x81\x01\x82\x90R`$\x01a\x0C\x11V[`\0\x81\x81Ra\x01\xF5` R`@\x90 T`\xFF\x16\x15a\x17\x1FW`@Qc\"m\xD8\xA3`\xE2\x1B\x81R`\x04\x81\x01\x82\x90R`$\x01a\x0C\x11V[`\0a\x17D`@Q\x80``\x01`@R\x80\x87\x81R` \x01\x86\x81R` \x01\x85\x81RPa\x17\xF3V[P\x90P\x81\x81\x14a\x17gW`@Qc\x0CZ\x1A\xAB`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\nT\x82\x87a\x1AdV[a\x17{\x82\x82a\x0CdV[a\n\xC7W`@Qc\xE2Q}?`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x82\x16`\x04\x82\x01R`$\x81\x01\x83\x90R`D\x01a\x0C\x11V[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0T`\x01`@\x1B\x90\x04`\xFF\x16a\x0F\x9FW`@Qc\x1A\xFC\xD7\x9F`\xE3\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x80QQ`\0\x90\x81\x90`\0\x80Q` a(\xC9\x839\x81Q\x91R\x90`0\x14\x80\x15a\x18\x1FWP\x83` \x01QQ`0\x14[\x80\x15a\x180WP\x83`@\x01QQ`0\x14[a\x18MW`@QcBc\r\xDB`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0\x84`\0\x01Q\x85` \x01Q\x86`@\x01Q`@Q` \x01a\x18p\x93\x92\x91\x90a&\x9EV[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x81R\x81Q` \x92\x83\x01 `\0\x81\x81R\x92\x85\x90R\x91 \x80T\x91\x92P\x90a\x18\xA2\x90a#\x98V[\x15\x90Pa\x18\xB4W\x94`\0\x94P\x92PPPV[`@\x80Q``\x81\x01\x82R\x86Q\x81R` \x80\x88\x01Q\x81\x83\x01R\x87\x83\x01Q\x82\x84\x01R`\0\x84\x81R\x90\x85\x90R\x91\x90\x91 \x81Q\x81\x90a\x18\xEF\x90\x82a'\xC6V[P` \x82\x01Q`\x01\x82\x01\x90a\x19\x04\x90\x82a'\xC6V[P`@\x82\x01Q`\x02\x82\x01\x90a\x19\x19\x90\x82a'\xC6V[P\x90PP\x80\x7FR\xB2\x9B\xBD\xD9z\xB9\x83A\x9FP\xFA\x15\x90\xE5\xABu\xE9\x94\"y\xE9^\x10\xA0\x86\x07\xB0l##\x8B\x86`\0\x01Q\x87` \x01Q\x88`@\x01Q`@Qa\x19]\x93\x92\x91\x90a(\x85V[`@Q\x80\x91\x03\x90\xA2\x94`\x01\x94P\x92PPPV[a\x19y\x82a\x1B\x15V[`@Q`\x01`\x01`\xA0\x1B\x03\x83\x16\x90\x7F\xBC|\xD7Z \xEE'\xFD\x9A\xDE\xBA\xB3 A\xF7U!M\xBCk\xFF\xA9\x0C\xC0\"[9\xDA.\\-;\x90`\0\x90\xA2\x80Q\x15a\x19\xBEWa\x06\x9C\x82\x82a\x1BzV[a\n\xC7a\x1B\xF0V[`\0\x81Q`@\x14a\x19\xEAW`@Qc\xBD\x9C\x80\xC1`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[P\x80Q` \x90\x91\x01 \x90V[`\0\x80\x84\x84\x84`@Q` \x01a\x1A\x0E\x93\x92\x91\x90a&\x9EV[`@\x80Q\x80\x83\x03`\x1F\x19\x01\x81R\x91\x90R\x80Q` \x90\x91\x01 \x95\x94PPPPPV[`\0\x81\x15\x80a\x1A]WP\x7F\xCD.f\xBF\x0B\x91\xEE\xED\xC6\xC6H\xAE\x935\xA7\x8D|\x9AJ\xB0\xEF3a*\x82M\x91\xCD\xC6\x8AO!\x82\x14[\x15\x92\x91PPV[`\0\x81\x81R\x7F\xC1{Kp\x8BoD%\\ \x91:\x9D\x97\xA0S\0\xB6p4,q\xFEZ\xE5\xB6\x17\xBDM\xB5P\x02` \x90\x81R`@\x80\x83 \x85\x84R\x90\x91R\x81 T`\0\x80Q` a(\xC9\x839\x81Q\x91R\x90`\xFF\x16\x15a\x1A\xBFW`\0\x91PPa\x06tV[`\0\x83\x81R`\x02\x82\x01` \x90\x81R`@\x80\x83 \x87\x84R\x82R\x91\x82\x90 \x80T`\xFF\x19\x16`\x01\x17\x90U\x90Q\x84\x81R\x85\x91\x7F\xBF\xB1&\xE7B\xCE\x96\x18\xB5\xBFkT\x83\x99\x16\x92o\\9wR\xBE5@L\x83h\xDD\xCFh\xC1\n\x91\x01a\x0F\x85V[\x80`\x01`\x01`\xA0\x1B\x03\x16;`\0\x03a\x1BKW`@QcL\x9C\x8C\xE3`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x82\x16`\x04\x82\x01R`$\x01a\x0C\x11V[`\0\x80Q` a(\xE9\x839\x81Q\x91R\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16`\x01`\x01`\xA0\x1B\x03\x92\x90\x92\x16\x91\x90\x91\x17\x90UV[```\0\x80\x84`\x01`\x01`\xA0\x1B\x03\x16\x84`@Qa\x1B\x97\x91\x90a'\xAAV[`\0`@Q\x80\x83\x03\x81\x85Z\xF4\x91PP=\x80`\0\x81\x14a\x1B\xD2W`@Q\x91P`\x1F\x19`?=\x01\x16\x82\x01`@R=\x82R=`\0` \x84\x01>a\x1B\xD7V[``\x91P[P\x91P\x91Pa\x1B\xE7\x85\x83\x83a\x1C\x0FV[\x95\x94PPPPPV[4\x15a\x0F\x9FW`@Qc\xB3\x98\x97\x9F`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[``\x82a\x1C$Wa\x1C\x1F\x82a\x1CkV[a\x0B\xB0V[\x81Q\x15\x80\x15a\x1C;WP`\x01`\x01`\xA0\x1B\x03\x84\x16;\x15[\x15a\x1CdW`@Qc\x99\x96\xB3\x15`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x85\x16`\x04\x82\x01R`$\x01a\x0C\x11V[P\x80a\x0B\xB0V[\x80Q\x15a\x1C{W\x80Q\x80\x82` \x01\xFD[`@Qc\n\x12\xF5!`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[P\x80Ta\x1C\xA0\x90a#\x98V[`\0\x82U\x80`\x1F\x10a\x1C\xB0WPPV[`\x1F\x01` \x90\x04\x90`\0R` `\0 \x90\x81\x01\x90a\x0Ez\x91\x90[\x80\x82\x11\x15a\x1C\xDEW`\0\x81U`\x01\x01a\x1C\xCAV[P\x90V[\x805`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a\x1C\xF9W`\0\x80\xFD[\x91\x90PV[`\0` \x82\x84\x03\x12\x15a\x1D\x10W`\0\x80\xFD[a\x0B\xB0\x82a\x1C\xE2V[`\0` \x82\x84\x03\x12\x15a\x1D+W`\0\x80\xFD[\x815`\x01`\x01`\xE0\x1B\x03\x19\x81\x16\x81\x14a\x0B\xB0W`\0\x80\xFD[`\0\x80\x83`\x1F\x84\x01\x12a\x1DUW`\0\x80\xFD[P\x815`\x01`\x01`@\x1B\x03\x81\x11\x15a\x1DlW`\0\x80\xFD[` \x83\x01\x91P\x83` \x82\x85\x01\x01\x11\x15a\x1D\x84W`\0\x80\xFD[\x92P\x92\x90PV[`\0\x80` \x83\x85\x03\x12\x15a\x1D\x9EW`\0\x80\xFD[\x825`\x01`\x01`@\x1B\x03\x81\x11\x15a\x1D\xB4W`\0\x80\xFD[a\x1D\xC0\x85\x82\x86\x01a\x1DCV[\x90\x96\x90\x95P\x93PPPPV[`\0\x80`@\x83\x85\x03\x12\x15a\x1D\xDFW`\0\x80\xFD[PP\x805\x92` \x90\x91\x015\x91PV[`\0` \x82\x84\x03\x12\x15a\x1E\0W`\0\x80\xFD[P5\x91\x90PV[`\0[\x83\x81\x10\x15a\x1E\"W\x81\x81\x01Q\x83\x82\x01R` \x01a\x1E\nV[PP`\0\x91\x01RV[`\0\x81Q\x80\x84Ra\x1EC\x81` \x86\x01` \x86\x01a\x1E\x07V[`\x1F\x01`\x1F\x19\x16\x92\x90\x92\x01` \x01\x92\x91PPV[` \x81R`\0\x82Q``` \x84\x01Ra\x1Es`\x80\x84\x01\x82a\x1E+V[\x90P` \x84\x01Q`\x1F\x19\x80\x85\x84\x03\x01`@\x86\x01Ra\x1E\x91\x83\x83a\x1E+V[\x92P`@\x86\x01Q\x91P\x80\x85\x84\x03\x01``\x86\x01RPa\x1B\xE7\x82\x82a\x1E+V[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`@Q``\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a\x1E\xE7Wa\x1E\xE7a\x1E\xAFV[`@R\x90V[`@Q`\xA0\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a\x1E\xE7Wa\x1E\xE7a\x1E\xAFV[`@Q`\x1F\x82\x01`\x1F\x19\x16\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a\x1F7Wa\x1F7a\x1E\xAFV[`@R\x91\x90PV[`\0\x82`\x1F\x83\x01\x12a\x1FPW`\0\x80\xFD[\x815`\x01`\x01`@\x1B\x03\x81\x11\x15a\x1FiWa\x1Fia\x1E\xAFV[a\x1F|`\x1F\x82\x01`\x1F\x19\x16` \x01a\x1F\x0FV[\x81\x81R\x84` \x83\x86\x01\x01\x11\x15a\x1F\x91W`\0\x80\xFD[\x81` \x85\x01` \x83\x017`\0\x91\x81\x01` \x01\x91\x90\x91R\x93\x92PPPV[`\0\x80`@\x83\x85\x03\x12\x15a\x1F\xC1W`\0\x80\xFD[a\x1F\xCA\x83a\x1C\xE2V[\x91P` \x80\x84\x015`\x01`\x01`@\x1B\x03\x80\x82\x11\x15a\x1F\xE7W`\0\x80\xFD[\x81\x86\x01\x91P\x86`\x1F\x83\x01\x12a\x1F\xFBW`\0\x80\xFD[\x815\x81\x81\x11\x15a \rWa \ra\x1E\xAFV[\x80`\x05\x1Ba \x1C\x85\x82\x01a\x1F\x0FV[\x91\x82R\x83\x81\x01\x85\x01\x91\x85\x81\x01\x90\x8A\x84\x11\x15a 6W`\0\x80\xFD[\x86\x86\x01\x92P[\x83\x83\x10\x15a \xF4W\x825\x85\x81\x11\x15a TW`\0\x80\x81\xFD[\x86\x01``\x81\x8D\x03`\x1F\x19\x01\x81\x13\x15a lW`\0\x80\x81\xFD[a ta\x1E\xC5V[\x89\x83\x015\x88\x81\x11\x15a \x86W`\0\x80\x81\xFD[a \x94\x8F\x8C\x83\x87\x01\x01a\x1F?V[\x82RP`@\x83\x015\x88\x81\x11\x15a \xAAW`\0\x80\x81\xFD[a \xB8\x8F\x8C\x83\x87\x01\x01a\x1F?V[\x82\x8C\x01RP\x90\x82\x015\x90\x87\x82\x11\x15a \xD0W`\0\x80\x81\xFD[a \xDE\x8E\x8B\x84\x86\x01\x01a\x1F?V[`@\x82\x01R\x84RPP\x91\x86\x01\x91\x90\x86\x01\x90a v\xCC75\xA9 \xA3\xCAP]8+\xBC\xDCi|\xE6\xC0\xC3\xF8\x86\xFB\xBC\x8E\r#:\xBF\xACZ\xC56S\xAC\x08\xB3c[\xB0\xAE\xC7\x0C9\\B\x02\xDD{\xC7\xDE\xC4\xDC\xEE\xDD\xA7u\xE5\x8D\xD5A\xE0\x8A\x11llS\x81\\\x0B\xD0(\x19/{bh\0\xA2dipfsX\"\x12 \0\xBC\x02\"\xD5\xD5i\xFBY>\x18\xFC/\xB4\x18\xC5\ti\xFAmo\x05\xDB\x8E\xEAi\xCF\x0E\x1D\x18_\xB3dsolcC\0\x08\x14\x003"; + const __DEPLOYED_BYTECODE: &[u8] = b"`\x80`@R`\x046\x10a\x01\xC2W`\x005`\xE0\x1C\x80cr\xB5a\xF9\x11a\0\xF7W\x80c\xAA\x0E\xD0\x9F\x11a\0\x95W\x80c\xD5Gt\x1F\x11a\0dW\x80c\xD5Gt\x1F\x14a\x05\xE9W\x80c\xE1\xA610\x14a\x06\tW\x80c\xED8\r\x03\x14a\x06)W\x80c\xFF\x11J\xE1\x14a\x06IW`\0\x80\xFD[\x80c\xAA\x0E\xD0\x9F\x14a\x05\x1DW\x80c\xAD<\xB1\xCC\x14a\x05=W\x80c\xB8\n\xAA\x89\x14a\x05{W\x80c\xCDy\xF9\x06\x14a\x05\x9DW`\0\x80\xFD[\x80c\x88R!\t\x11a\0\xD1W\x80c\x88R!\t\x14a\x04\x94W\x80c\x91\xD1HT\x14a\x04\xB4W\x80c\x9A\xEC\x99\x0E\x14a\x04\xD4W\x80c\xA2\x17\xFD\xDF\x14a\x05\x08W`\0\x80\xFD[\x80cr\xB5a\xF9\x14a\x04\x0FW\x80cu\x84{\x84\x14a\x04@W\x80cyvi\xC9\x14a\x04`W`\0\x80\xFD[\x80c//\xF1]\x11a\x01dW\x80cR\xD1\x90-\x11a\x01>W\x80cR\xD1\x90-\x14a\x03aW\x80ci\xFD\xBC\xCA\x14a\x03vW\x80ck[!\xA6\x14a\x03\x96W\x80cr\x10Z\xAF\x14a\x03\xEFW`\0\x80\xFD[\x80c//\xF1]\x14a\x03\x0EW\x80c6V\x8A\xBE\x14a\x03.W\x80cO\x1E\xF2\x86\x14a\x03NW`\0\x80\xFD[\x80c\x14\x13\xA9*\x11a\x01\xA0W\x80c\x14\x13\xA9*\x14a\x02\x81W\x80c$\x10\xF6\xBA\x14a\x02\xA1W\x80c$\x8A\x9C\xA3\x14a\x02\xCEW\x80c.\xB3\x9E\xE9\x14a\x02\xEEW`\0\x80\xFD[\x80c\x01\xD5\x8F\xA3\x14a\x01\xC7W\x80c\x01\xFF\xC9\xA7\x14a\x02/W\x80c\x07\x07Y\x1F\x14a\x02_W[`\0\x80\xFD[4\x80\x15a\x01\xD3W`\0\x80\xFD[Pa\x02\x1Ca\x01\xE26`\x04a\x1D\x15V[`\x01`\x01`\xA0\x1B\x03\x16`\0\x90\x81R\x7F\xC1{Kp\x8BoD%\\ \x91:\x9D\x97\xA0S\0\xB6p4,q\xFEZ\xE5\xB6\x17\xBDM\xB5P\x01` R`@\x90 T\x90V[`@Q\x90\x81R` \x01[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x02;W`\0\x80\xFD[Pa\x02Oa\x02J6`\x04a\x1D0V[a\x06iV[`@Q\x90\x15\x15\x81R` \x01a\x02&V[4\x80\x15a\x02kW`\0\x80\xFD[Pa\x02\x7Fa\x02z6`\x04a\x1D\xA2V[a\x06zV[\0[4\x80\x15a\x02\x8DW`\0\x80\xFD[Pa\x02\x7Fa\x02\x9C6`\x04a\x1D\xE3V[a\x06\xA1V[4\x80\x15a\x02\xADW`\0\x80\xFD[Pa\x02\xC1a\x02\xBC6`\x04a\x1E\x05V[a\x06\xC9V[`@Qa\x02&\x91\x90a\x1EnV[4\x80\x15a\x02\xDAW`\0\x80\xFD[Pa\x02\x1Ca\x02\xE96`\x04a\x1E\x05V[a\x08\xD5V[4\x80\x15a\x02\xFAW`\0\x80\xFD[Pa\x02\x7Fa\x03\t6`\x04a\x1F\xC4V[a\x08\xF7V[4\x80\x15a\x03\x1AW`\0\x80\xFD[Pa\x02\x7Fa\x03)6`\x04a!#\xA9f.\xFC\x9C\"\x9Cj\0\x80T`\x01`@\x1B\x81\x04`\xFF\x16\x15\x90`\x01`\x01`@\x1B\x03\x16`\0\x81\x15\x80\x15a\tF\xDD`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0a\n\xC7\x81a\x0EpV[\x81`\x01`\x01`\xA0\x1B\x03\x16cR\xD1\x90-`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x92PPP\x80\x15a\x12\x91WP`@\x80Q`\x1F=\x90\x81\x01`\x1F\x19\x16\x82\x01\x90\x92Ra\x12\x8E\x91\x81\x01\x90a&\xD2V[`\x01[a\x12\xB9W`@QcL\x9C\x8C\xE3`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x83\x16`\x04\x82\x01R`$\x01a\x0C\x11V[`\0\x80Q` a)C\x839\x81Q\x91R\x81\x14a\x12\xEAW`@Qc*\x87Ri`\xE2\x1B\x81R`\x04\x81\x01\x82\x90R`$\x01a\x0C\x11V[a\x06\x9C\x83\x83a\x19\x87V[0`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x14a\x0F\xC1W`@Qcp>F\xDD`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\x01`\xA0\x1B\x03\x82\x16`\0\x90\x81R\x7F\xC1{Kp\x8BoD%\\ \x91:\x9D\x97\xA0S\0\xB6p4,q\xFEZ\xE5\xB6\x17\xBDM\xB5P\x01` R`@\x90 T`\0\x80Q` a)#\x839\x81Q\x91R\x90\x80a\x13\xA3W`@Qc=\xD8\xCA\x95`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0\x81\x81R` \x83\x90R`@\x90 \x80Ta\x13\xBC\x90a#\xF3V[\x90P`\0\x03a\x13\xDEW`@Qc\x1CbV\x0B`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0\x83\x81R`\x02\x83\x01` \x90\x81R`@\x80\x83 \x84\x84R\x90\x91R\x90 T`\xFF\x16a\x06\xC3W`@QcHf%\x81`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0\x80`\0\x80Q` a)#\x839\x81Q\x91R\x90P`\0\x83` \x01Q\x84`@\x01Q\x85``\x01Q`@Q` \x01a\x14Q\x93\x92\x91\x90a&\xEBV[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x81R\x81Q` \x92\x83\x01 `\0\x81\x81R\x92\x85\x90R\x91 \x80T\x91\x92P\x90a\x14\x83\x90a#\xF3V[\x90P`\0\x03a\x14\xA5W`@Qc\x1CbV\x0B`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x14\xCF\x7F\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\0Ba'.V[a\x03\xE8\x85`\x80\x01Qa\x14\xE1\x91\x90a'OV[\x11a\x14\xFFW`@Qc\x0C\xB0/\x05`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`@Qc\xEA\xC7\x08\xA3`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x90c\xEA\xC7\x08\xA3\x90a\x15M\x90\x88\x90\x88\x90`\x04\x01a'qV[`\0`@Q\x80\x83\x03\x81\x86\x80;\x15\x80\x15a\x15eW`\0\x80\xFD[PZ\xFA\x15\x80\x15a\x15yW=`\0\x80>=`\0\xFD[PPPP`\0a\x15\x8C\x85`\0\x01Qa\x19\xDDV[`\x01`\x01`\xA0\x1B\x03\x81\x16`\0\x90\x81R`\x01\x85\x01` R`@\x90 T\x90\x91P\x15a\x15\xBBW`\0\x93PPPPa\x06tV[`\x01`\x01`\xA0\x1B\x03\x81\x16`\0\x90\x81R`\x01\x84\x01` R`@\x90\x81\x90 \x83\x90U\x85Q\x90Q\x83\x91a\x15\xE9\x91a(\x05V[`@Q\x90\x81\x90\x03\x81 \x90\x7F\xF4\x83\x7F\x1Af\xA1\xE5\xFB\xDE,@\xD0\xF6\xEF\xF7Q\x83\x13\x9Ey\xB0\xFC\x1E\xAA\xB2\x80\xA3\xA0\xBE8\xE7\xB1\x90`\0\x90\xA3P`\x01\x95\x94PPPPPV[`\0\x81\x81R`\0\x80Q` a)#\x839\x81Q\x91R` \x81\x90R`@\x82 \x80Ta\x16M\x90a#\xF3V[\x90P`\0\x03a\x16_WP`\0\x92\x91PPV[`\0\x83\x81R` \x82\x90R`@\x81 \x90a\x16x\x82\x82a\x1C\xABV[a\x16\x86`\x01\x83\x01`\0a\x1C\xABV[a\x16\x94`\x02\x83\x01`\0a\x1C\xABV[PP`@Q\x83\x90\x7FKq\xBE\xDD\xA4!yf\xEA\xC1\xAAI\xE3[\x15P\xE5\xAB\x87\x06J\xE1y\xD1\xB3k9;\xD0N\xB7C\x90`\0\x90\xA2P`\x01\x92\x91PPV[`\0a\x16\xD7\x84\x84\x84a\x1A\rV[\x90Pa\x16\xE2\x81a\x1AFV[a\x17\x02W`@Qc\x065l\xB3`\xE0\x1B\x81R`\x04\x81\x01\x82\x90R`$\x01a\x0C\x11V[`\0\x81\x81Ra\x01\xF5` R`@\x90 T`\xFF\x16\x15a\x176W`@Qc\"m\xD8\xA3`\xE2\x1B\x81R`\x04\x81\x01\x82\x90R`$\x01a\x0C\x11V[`\0a\x17[`@Q\x80``\x01`@R\x80\x87\x81R` \x01\x86\x81R` \x01\x85\x81RPa\x18\nV[P\x90P\x81\x81\x14a\x17~W`@Qc\x0CZ\x1A\xAB`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\nT\x82\x87a\x1A{V[a\x17\x92\x82\x82a\x0CdV[a\n\xC7W`@Qc\xE2Q}?`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x82\x16`\x04\x82\x01R`$\x81\x01\x83\x90R`D\x01a\x0C\x11V[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0T`\x01`@\x1B\x90\x04`\xFF\x16a\x0F\xC1W`@Qc\x1A\xFC\xD7\x9F`\xE3\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x80QQ`\0\x90\x81\x90`\0\x80Q` a)#\x839\x81Q\x91R\x90`0\x14\x80\x15a\x186WP\x83` \x01QQ`0\x14[\x80\x15a\x18GWP\x83`@\x01QQ`0\x14[a\x18dW`@QcBc\r\xDB`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0\x84`\0\x01Q\x85` \x01Q\x86`@\x01Q`@Q` \x01a\x18\x87\x93\x92\x91\x90a&\xEBV[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x81R\x81Q` \x92\x83\x01 `\0\x81\x81R\x92\x85\x90R\x91 \x80T\x91\x92P\x90a\x18\xB9\x90a#\xF3V[\x15\x90Pa\x18\xCBW\x94`\0\x94P\x92PPPV[`@\x80Q``\x81\x01\x82R\x86Q\x81R` \x80\x88\x01Q\x81\x83\x01R\x87\x83\x01Q\x82\x84\x01R`\0\x84\x81R\x90\x85\x90R\x91\x90\x91 \x81Q\x81\x90a\x19\x06\x90\x82a(!V[P` \x82\x01Q`\x01\x82\x01\x90a\x19\x1B\x90\x82a(!V[P`@\x82\x01Q`\x02\x82\x01\x90a\x190\x90\x82a(!V[P\x90PP\x80\x7FR\xB2\x9B\xBD\xD9z\xB9\x83A\x9FP\xFA\x15\x90\xE5\xABu\xE9\x94\"y\xE9^\x10\xA0\x86\x07\xB0l##\x8B\x86`\0\x01Q\x87` \x01Q\x88`@\x01Q`@Qa\x19t\x93\x92\x91\x90a(\xDFV[`@Q\x80\x91\x03\x90\xA2\x94`\x01\x94P\x92PPPV[a\x19\x90\x82a\x1B,V[`@Q`\x01`\x01`\xA0\x1B\x03\x83\x16\x90\x7F\xBC|\xD7Z \xEE'\xFD\x9A\xDE\xBA\xB3 A\xF7U!M\xBCk\xFF\xA9\x0C\xC0\"[9\xDA.\\-;\x90`\0\x90\xA2\x80Q\x15a\x19\xD5Wa\x06\x9C\x82\x82a\x1B\x91V[a\n\xC7a\x1C\x07V[`\0\x81Q`@\x14a\x1A\x01W`@Qc\xBD\x9C\x80\xC1`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[P\x80Q` \x90\x91\x01 \x90V[`\0\x80\x84\x84\x84`@Q` \x01a\x1A%\x93\x92\x91\x90a&\xEBV[`@\x80Q\x80\x83\x03`\x1F\x19\x01\x81R\x91\x90R\x80Q` \x90\x91\x01 \x95\x94PPPPPV[`\0\x81\x15\x80a\x1AtWP\x7F\xCD.f\xBF\x0B\x91\xEE\xED\xC6\xC6H\xAE\x935\xA7\x8D|\x9AJ\xB0\xEF3a*\x82M\x91\xCD\xC6\x8AO!\x82\x14[\x15\x92\x91PPV[`\0\x81\x81R\x7F\xC1{Kp\x8BoD%\\ \x91:\x9D\x97\xA0S\0\xB6p4,q\xFEZ\xE5\xB6\x17\xBDM\xB5P\x02` \x90\x81R`@\x80\x83 \x85\x84R\x90\x91R\x81 T`\0\x80Q` a)#\x839\x81Q\x91R\x90`\xFF\x16\x15a\x1A\xD6W`\0\x91PPa\x06tV[`\0\x83\x81R`\x02\x82\x01` \x90\x81R`@\x80\x83 \x87\x84R\x82R\x91\x82\x90 \x80T`\xFF\x19\x16`\x01\x17\x90U\x90Q\x84\x81R\x85\x91\x7F\xBF\xB1&\xE7B\xCE\x96\x18\xB5\xBFkT\x83\x99\x16\x92o\\9wR\xBE5@L\x83h\xDD\xCFh\xC1\n\x91\x01a\x0F\xA7V[\x80`\x01`\x01`\xA0\x1B\x03\x16;`\0\x03a\x1BbW`@QcL\x9C\x8C\xE3`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x82\x16`\x04\x82\x01R`$\x01a\x0C\x11V[`\0\x80Q` a)C\x839\x81Q\x91R\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16`\x01`\x01`\xA0\x1B\x03\x92\x90\x92\x16\x91\x90\x91\x17\x90UV[```\0\x80\x84`\x01`\x01`\xA0\x1B\x03\x16\x84`@Qa\x1B\xAE\x91\x90a(\x05V[`\0`@Q\x80\x83\x03\x81\x85Z\xF4\x91PP=\x80`\0\x81\x14a\x1B\xE9W`@Q\x91P`\x1F\x19`?=\x01\x16\x82\x01`@R=\x82R=`\0` \x84\x01>a\x1B\xEEV[``\x91P[P\x91P\x91Pa\x1B\xFE\x85\x83\x83a\x1C&V[\x95\x94PPPPPV[4\x15a\x0F\xC1W`@Qc\xB3\x98\x97\x9F`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[``\x82a\x1C;Wa\x1C6\x82a\x1C\x82V[a\x0B\xB0V[\x81Q\x15\x80\x15a\x1CRWP`\x01`\x01`\xA0\x1B\x03\x84\x16;\x15[\x15a\x1C{W`@Qc\x99\x96\xB3\x15`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x85\x16`\x04\x82\x01R`$\x01a\x0C\x11V[P\x80a\x0B\xB0V[\x80Q\x15a\x1C\x92W\x80Q\x80\x82` \x01\xFD[`@Qc\xD6\xBD\xA2u`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[P\x80Ta\x1C\xB7\x90a#\xF3V[`\0\x82U\x80`\x1F\x10a\x1C\xC7WPPV[`\x1F\x01` \x90\x04\x90`\0R` `\0 \x90\x81\x01\x90a\x0Ez\x91\x90[\x80\x82\x11\x15a\x1C\xF5W`\0\x81U`\x01\x01a\x1C\xE1V[P\x90V[\x805`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a\x1D\x10W`\0\x80\xFD[\x91\x90PV[`\0` \x82\x84\x03\x12\x15a\x1D'W`\0\x80\xFD[a\x0B\xB0\x82a\x1C\xF9V[`\0` \x82\x84\x03\x12\x15a\x1DBW`\0\x80\xFD[\x815`\x01`\x01`\xE0\x1B\x03\x19\x81\x16\x81\x14a\x0B\xB0W`\0\x80\xFD[`\0\x80\x83`\x1F\x84\x01\x12a\x1DlW`\0\x80\xFD[P\x815`\x01`\x01`@\x1B\x03\x81\x11\x15a\x1D\x83W`\0\x80\xFD[` \x83\x01\x91P\x83` \x82\x85\x01\x01\x11\x15a\x1D\x9BW`\0\x80\xFD[\x92P\x92\x90PV[`\0\x80` \x83\x85\x03\x12\x15a\x1D\xB5W`\0\x80\xFD[\x825`\x01`\x01`@\x1B\x03\x81\x11\x15a\x1D\xCBW`\0\x80\xFD[a\x1D\xD7\x85\x82\x86\x01a\x1DZV[\x90\x96\x90\x95P\x93PPPPV[`\0\x80`@\x83\x85\x03\x12\x15a\x1D\xF6W`\0\x80\xFD[PP\x805\x92` \x90\x91\x015\x91PV[`\0` \x82\x84\x03\x12\x15a\x1E\x17W`\0\x80\xFD[P5\x91\x90PV[`\0[\x83\x81\x10\x15a\x1E9W\x81\x81\x01Q\x83\x82\x01R` \x01a\x1E!V[PP`\0\x91\x01RV[`\0\x81Q\x80\x84Ra\x1EZ\x81` \x86\x01` \x86\x01a\x1E\x1EV[`\x1F\x01`\x1F\x19\x16\x92\x90\x92\x01` \x01\x92\x91PPV[` \x81R`\0\x82Q``` \x84\x01Ra\x1E\x8A`\x80\x84\x01\x82a\x1EBV[\x90P` \x84\x01Q`\x1F\x19\x84\x83\x03\x01`@\x85\x01Ra\x1E\xA7\x82\x82a\x1EBV[\x91PP`@\x84\x01Q`\x1F\x19\x84\x83\x03\x01``\x85\x01Ra\x1B\xFE\x82\x82a\x1EBV[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`@Q``\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a\x1E\xFDWa\x1E\xFDa\x1E\xC5V[`@R\x90V[`@Q`\xA0\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a\x1E\xFDWa\x1E\xFDa\x1E\xC5V[`@Q`\x1F\x82\x01`\x1F\x19\x16\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a\x1FMWa\x1FMa\x1E\xC5V[`@R\x91\x90PV[`\0\x82`\x1F\x83\x01\x12a\x1FfW`\0\x80\xFD[\x815`\x01`\x01`@\x1B\x03\x81\x11\x15a\x1F\x7FWa\x1F\x7Fa\x1E\xC5V[a\x1F\x92`\x1F\x82\x01`\x1F\x19\x16` \x01a\x1F%V[\x81\x81R\x84` \x83\x86\x01\x01\x11\x15a\x1F\xA7W`\0\x80\xFD[\x81` \x85\x01` \x83\x017`\0\x91\x81\x01` \x01\x91\x90\x91R\x93\x92PPPV[`\0\x80`@\x83\x85\x03\x12\x15a\x1F\xD7W`\0\x80\xFD[a\x1F\xE0\x83a\x1C\xF9V[\x91P` \x83\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a\x1F\xFBW`\0\x80\xFD[\x83\x01`\x1F\x81\x01\x85\x13a \x0CW`\0\x80\xFD[\x805`\x01`\x01`@\x1B\x03\x81\x11\x15a %Wa %a\x1E\xC5V[\x80`\x05\x1Ba 5` \x82\x01a\x1F%V[\x91\x82R` \x81\x84\x01\x81\x01\x92\x90\x81\x01\x90\x88\x84\x11\x15a QW`\0\x80\xFD[` \x85\x01\x92P[\x83\x83\x10\x15a!-W\x825`\x01`\x01`@\x1B\x03\x81\x11\x15a vW`\0\x80\xFD[\x85\x01``\x81\x8B\x03`\x1F\x19\x01\x12\x15a \x8CW`\0\x80\xFD[a \x94a\x1E\xDBV[` \x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a \xADW`\0\x80\xFD[a \xBC\x8C` \x83\x86\x01\x01a\x1FUV[\x82RP`@\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a \xD8W`\0\x80\xFD[a \xE7\x8C` \x83\x86\x01\x01a\x1FUV[` \x83\x01RP``\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a!\x06W`\0\x80\xFD[a!\x15\x8C` \x83\x86\x01\x01a\x1FUV[`@\x83\x01RP\x83RP` \x92\x83\x01\x92\x90\x91\x01\x90a XV[\x80\x95PPPPPP\x92P\x92\x90PV[`\0\x80`@\x83\x85\x03\x12\x15a!OW`\0\x80\xFD[\x825\x91Pa!_` \x84\x01a\x1C\xF9V[\x90P\x92P\x92\x90PV[`\0\x80`@\x83\x85\x03\x12\x15a!{W`\0\x80\xFD[a!\x84\x83a\x1C\xF9V[\x91P` \x83\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a!\x9FW`\0\x80\xFD[a!\xAB\x85\x82\x86\x01a\x1FUV[\x91PP\x92P\x92\x90PV[`\0\x80`\0\x80`\0\x80`\x80\x87\x89\x03\x12\x15a!\xCEW`\0\x80\xFD[a!\xD7\x87a\x1C\xF9V[\x95P` \x87\x015\x94P`@\x87\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a!\xF9W`\0\x80\xFD[a\"\x05\x89\x82\x8A\x01a\x1DZV[\x90\x95P\x93PP``\x87\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a\"$W`\0\x80\xFD[a\"0\x89\x82\x8A\x01a\x1DZV[\x97\x9A\x96\x99P\x94\x97P\x92\x95\x93\x94\x92PPPV[`\0\x80`@\x83\x85\x03\x12\x15a\"UW`\0\x80\xFD[\x825`\x01`\x01`@\x1B\x03\x81\x11\x15a\"kW`\0\x80\xFD[a\"w\x85\x82\x86\x01a\x1FUV[\x92PP` \x83\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a\"\x93W`\0\x80\xFD[\x83\x01`\xA0\x81\x86\x03\x12\x15a\"\xA5W`\0\x80\xFD[a\"\xADa\x1F\x03V[\x815`\x01`\x01`@\x1B\x03\x81\x11\x15a\"\xC3W`\0\x80\xFD[a\"\xCF\x87\x82\x85\x01a\x1FUV[\x82RP` \x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a\"\xEBW`\0\x80\xFD[a\"\xF7\x87\x82\x85\x01a\x1FUV[` \x83\x01RP`@\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a#\x16W`\0\x80\xFD[a#\"\x87\x82\x85\x01a\x1FUV[`@\x83\x01RP``\x82\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a#AW`\0\x80\xFD[a#M\x87\x82\x85\x01a\x1FUV[``\x83\x01RP`\x80\x91\x82\x015\x91\x81\x01\x91\x90\x91R\x91\x94\x91\x93P\x90\x91PPV[` \x81R`\0a\x0B\xB0` \x83\x01\x84a\x1EBV[`\0\x80`@\x83\x85\x03\x12\x15a#\x91W`\0\x80\xFD[a#\x9A\x83a\x1C\xF9V[\x94` \x93\x90\x93\x015\x93PPPV[`\0\x80`\0`@\x84\x86\x03\x12\x15a#\xBDW`\0\x80\xFD[\x835\x92P` \x84\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a#\xDAW`\0\x80\xFD[a#\xE6\x86\x82\x87\x01a\x1DZV[\x94\x97\x90\x96P\x93\x94PPPPV[`\x01\x81\x81\x1C\x90\x82\x16\x80a$\x07W`\x7F\x82\x16\x91P[` \x82\x10\x81\x03a$'WcNH{q`\xE0\x1B`\0R`\"`\x04R`$`\0\xFD[P\x91\x90PV[`\x1F\x82\x11\x15a\x06\x9CW\x80`\0R` `\0 `\x1F\x84\x01`\x05\x1C\x81\x01` \x85\x10\x15a$TWP\x80[`\x1F\x84\x01`\x05\x1C\x82\x01\x91P[\x81\x81\x10\x15a$tW`\0\x81U`\x01\x01a$`V[PPPPPV[`\x01`\x01`@\x1B\x03\x83\x11\x15a$\x92Wa$\x92a\x1E\xC5V[a$\xA6\x83a$\xA0\x83Ta#\xF3V[\x83a$-V[`\0`\x1F\x84\x11`\x01\x81\x14a$\xDAW`\0\x85\x15a$\xC2WP\x83\x82\x015[`\0\x19`\x03\x87\x90\x1B\x1C\x19\x16`\x01\x86\x90\x1B\x17\x83Ua$tV[`\0\x83\x81R` \x90 `\x1F\x19\x86\x16\x90\x83[\x82\x81\x10\x15a%\x0BW\x86\x85\x015\x82U` \x94\x85\x01\x94`\x01\x90\x92\x01\x91\x01a$\xEBV[P\x86\x82\x10\x15a%(W`\0\x19`\xF8\x88`\x03\x1B\x16\x1C\x19\x84\x87\x015\x16\x81U[PP`\x01\x85`\x01\x1B\x01\x83UPPPPPV[`\0\x80`\0``\x84\x86\x03\x12\x15a%OW`\0\x80\xFD[\x835`\x01`\x01`@\x1B\x03\x81\x11\x15a%eW`\0\x80\xFD[a%q\x86\x82\x87\x01a\x1FUV[\x93PP` \x84\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a%\x8DW`\0\x80\xFD[a%\x99\x86\x82\x87\x01a\x1FUV[\x92PP`@\x84\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a%\xB5W`\0\x80\xFD[a%\xC1\x86\x82\x87\x01a\x1FUV[\x91PP\x92P\x92P\x92V[`\0\x80`\0\x80`\0\x80`\xC0\x87\x89\x03\x12\x15a%\xE4W`\0\x80\xFD[\x865`\x01`\x01`@\x1B\x03\x81\x11\x15a%\xFAW`\0\x80\xFD[a&\x06\x89\x82\x8A\x01a\x1FUV[\x96PP` \x87\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a&\"W`\0\x80\xFD[a&.\x89\x82\x8A\x01a\x1FUV[\x95PP`@\x87\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a&JW`\0\x80\xFD[a&V\x89\x82\x8A\x01a\x1FUV[\x94PP``\x87\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a&rW`\0\x80\xFD[a&~\x89\x82\x8A\x01a\x1FUV[\x93PP`\x80\x87\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a&\x9AW`\0\x80\xFD[a&\xA6\x89\x82\x8A\x01a\x1FUV[\x96\x99\x95\x98P\x93\x96\x92\x95\x94`\xA0\x90\x93\x015\x93PPPV[cNH{q`\xE0\x1B`\0R`2`\x04R`$`\0\xFD[`\0` \x82\x84\x03\x12\x15a&\xE4W`\0\x80\xFD[PQ\x91\x90PV[`\0\x84Qa&\xFD\x81\x84` \x89\x01a\x1E\x1EV[\x84Q\x90\x83\x01\x90a'\x11\x81\x83` \x89\x01a\x1E\x1EV[\x84Q\x91\x01\x90a'$\x81\x83` \x88\x01a\x1E\x1EV[\x01\x95\x94PPPPPV[\x81\x81\x03\x81\x81\x11\x15a\x06tWcNH{q`\xE0\x1B`\0R`\x11`\x04R`$`\0\xFD[`\0\x82a'lWcNH{q`\xE0\x1B`\0R`\x12`\x04R`$`\0\xFD[P\x04\x90V[`@\x81R`\0a'\x84`@\x83\x01\x85a\x1EBV[\x82\x81\x03` \x84\x01R\x83Q`\xA0\x82Ra'\x9F`\xA0\x83\x01\x82a\x1EBV[\x90P` \x85\x01Q\x82\x82\x03` \x84\x01Ra'\xB8\x82\x82a\x1EBV[\x91PP`@\x85\x01Q\x82\x82\x03`@\x84\x01Ra'\xD2\x82\x82a\x1EBV[\x91PP``\x85\x01Q\x82\x82\x03``\x84\x01Ra'\xEC\x82\x82a\x1EBV[\x91PP`\x80\x85\x01Q`\x80\x83\x01R\x80\x92PPP\x93\x92PPPV[`\0\x82Qa(\x17\x81\x84` \x87\x01a\x1E\x1EV[\x91\x90\x91\x01\x92\x91PPV[\x81Q`\x01`\x01`@\x1B\x03\x81\x11\x15a(:Wa(:a\x1E\xC5V[a(N\x81a(H\x84Ta#\xF3V[\x84a$-V[` `\x1F\x82\x11`\x01\x81\x14a(\x82W`\0\x83\x15a(jWP\x84\x82\x01Q[`\0\x19`\x03\x85\x90\x1B\x1C\x19\x16`\x01\x84\x90\x1B\x17\x84Ua$tV[`\0\x84\x81R` \x81 `\x1F\x19\x85\x16\x91[\x82\x81\x10\x15a(\xB2W\x87\x85\x01Q\x82U` \x94\x85\x01\x94`\x01\x90\x92\x01\x91\x01a(\x92V[P\x84\x82\x10\x15a(\xD0W\x86\x84\x01Q`\0\x19`\x03\x87\x90\x1B`\xF8\x16\x1C\x19\x16\x81U[PPPP`\x01\x90\x81\x1B\x01\x90UPV[``\x81R`\0a(\xF2``\x83\x01\x86a\x1EBV[\x82\x81\x03` \x84\x01Ra)\x04\x81\x86a\x1EBV[\x90P\x82\x81\x03`@\x84\x01Ra)\x18\x81\x85a\x1EBV[\x96\x95PPPPPPV\xFE\xC1{Kp\x8BoD%\\ \x91:\x9D\x97\xA0S\0\xB6p4,q\xFEZ\xE5\xB6\x17\xBDM\xB5P\x006\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC\xDCi|\xE6\xC0\xC3\xF8\x86\xFB\xBC\x8E\r#:\xBF\xACZ\xC56S\xAC\x08\xB3c[\xB0\xAE\xC7\x0C9\\B\x02\xDD{\xC7\xDE\xC4\xDC\xEE\xDD\xA7u\xE5\x8D\xD5A\xE0\x8A\x11llS\x81\\\x0B\xD0(\x19/{bh\0\xA2dipfsX\"\x12 tU\xD9c\xC2,\xBEav@-\x1DW\xE1\xC0\x17d\xD1\xBB_\xBF\xFC\x95\\\x8Cq\x9C\x9DJ\xFC\xDA\xBEdsolcC\0\x08\x1C\x003"; /// The deployed bytecode of the contract. pub static ENTITYKEYREGISTRY_DEPLOYED_BYTECODE: ::ethers::core::types::Bytes = ::ethers::core::types::Bytes::from_static(__DEPLOYED_BYTECODE); @@ -1947,7 +1954,7 @@ pub mod entity_key_registry { )] #[etherror(name = "ERC1967NonPayable", abi = "ERC1967NonPayable()")] pub struct ERC1967NonPayable; - ///Custom Error type `FailedInnerCall` with signature `FailedInnerCall()` and selector `0x1425ea42` + ///Custom Error type `EnclaveKeyNotVerified` with signature `EnclaveKeyNotVerified()` and selector `0xa135a55d` #[derive( Clone, ::ethers::contract::EthError, @@ -1960,8 +1967,23 @@ pub mod entity_key_registry { Eq, Hash, )] - #[etherror(name = "FailedInnerCall", abi = "FailedInnerCall()")] - pub struct FailedInnerCall; + #[etherror(name = "EnclaveKeyNotVerified", abi = "EnclaveKeyNotVerified()")] + pub struct EnclaveKeyNotVerified; + ///Custom Error type `FailedCall` with signature `FailedCall()` and selector `0xd6bda275` + #[derive( + Clone, + ::ethers::contract::EthError, + ::ethers::contract::EthDisplay, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + #[etherror(name = "FailedCall", abi = "FailedCall()")] + pub struct FailedCall; ///Custom Error type `InferredImageIdIsDifferent` with signature `InferredImageIdIsDifferent()` and selector `0x18b43556` #[derive( Clone, @@ -2124,7 +2146,8 @@ pub mod entity_key_registry { BlacklistedImage(BlacklistedImage), ERC1967InvalidImplementation(ERC1967InvalidImplementation), ERC1967NonPayable(ERC1967NonPayable), - FailedInnerCall(FailedInnerCall), + EnclaveKeyNotVerified(EnclaveKeyNotVerified), + FailedCall(FailedCall), InferredImageIdIsDifferent(InferredImageIdIsDifferent), InvalidEnclaveKey(InvalidEnclaveKey), InvalidInitialization(InvalidInitialization), @@ -2218,8 +2241,13 @@ pub mod entity_key_registry { { return Ok(Self::ERC1967NonPayable(decoded)); } - if let Ok(decoded) = ::decode(data) { - return Ok(Self::FailedInnerCall(decoded)); + if let Ok(decoded) = + ::decode(data) + { + return Ok(Self::EnclaveKeyNotVerified(decoded)); + } + if let Ok(decoded) = ::decode(data) { + return Ok(Self::FailedCall(decoded)); } if let Ok(decoded) = ::decode(data) @@ -2298,7 +2326,10 @@ pub mod entity_key_registry { ::ethers::core::abi::AbiEncode::encode(element) } Self::ERC1967NonPayable(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::FailedInnerCall(element) => ::ethers::core::abi::AbiEncode::encode(element), + Self::EnclaveKeyNotVerified(element) => { + ::ethers::core::abi::AbiEncode::encode(element) + } + Self::FailedCall(element) => ::ethers::core::abi::AbiEncode::encode(element), Self::InferredImageIdIsDifferent(element) => { ::ethers::core::abi::AbiEncode::encode(element) } @@ -2382,9 +2413,11 @@ pub mod entity_key_registry { true } _ if selector - == ::selector() => { + == ::selector() => { true } + _ if selector + == ::selector() => true, _ if selector == ::selector() => { true @@ -2458,7 +2491,8 @@ pub mod entity_key_registry { ::core::fmt::Display::fmt(element, f) } Self::ERC1967NonPayable(element) => ::core::fmt::Display::fmt(element, f), - Self::FailedInnerCall(element) => ::core::fmt::Display::fmt(element, f), + Self::EnclaveKeyNotVerified(element) => ::core::fmt::Display::fmt(element, f), + Self::FailedCall(element) => ::core::fmt::Display::fmt(element, f), Self::InferredImageIdIsDifferent(element) => ::core::fmt::Display::fmt(element, f), Self::InvalidEnclaveKey(element) => ::core::fmt::Display::fmt(element, f), Self::InvalidInitialization(element) => ::core::fmt::Display::fmt(element, f), @@ -2550,9 +2584,14 @@ pub mod entity_key_registry { Self::ERC1967NonPayable(value) } } - impl ::core::convert::From for EntityKeyRegistryErrors { - fn from(value: FailedInnerCall) -> Self { - Self::FailedInnerCall(value) + impl ::core::convert::From for EntityKeyRegistryErrors { + fn from(value: EnclaveKeyNotVerified) -> Self { + Self::EnclaveKeyNotVerified(value) + } + } + impl ::core::convert::From for EntityKeyRegistryErrors { + fn from(value: FailedCall) -> Self { + Self::FailedCall(value) } } impl ::core::convert::From for EntityKeyRegistryErrors { diff --git a/bindings/src/erc1967_utils.rs b/bindings/src/erc1967_utils.rs index 87a46b4..192be79 100644 --- a/bindings/src/erc1967_utils.rs +++ b/bindings/src/erc1967_utils.rs @@ -15,51 +15,7 @@ pub mod erc1967_utils { ::ethers::core::abi::ethabi::Contract { constructor: ::core::option::Option::None, functions: ::std::collections::BTreeMap::new(), - events: ::core::convert::From::from([ - ( - ::std::borrow::ToOwned::to_owned("AdminChanged"), - ::std::vec![::ethers::core::abi::ethabi::Event { - name: ::std::borrow::ToOwned::to_owned("AdminChanged"), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::EventParam { - name: ::std::borrow::ToOwned::to_owned("previousAdmin"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - indexed: false, - }, - ::ethers::core::abi::ethabi::EventParam { - name: ::std::borrow::ToOwned::to_owned("newAdmin"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - indexed: false, - }, - ], - anonymous: false, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("BeaconUpgraded"), - ::std::vec![::ethers::core::abi::ethabi::Event { - name: ::std::borrow::ToOwned::to_owned("BeaconUpgraded"), - inputs: ::std::vec![::ethers::core::abi::ethabi::EventParam { - name: ::std::borrow::ToOwned::to_owned("beacon"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - indexed: true, - },], - anonymous: false, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("Upgraded"), - ::std::vec![::ethers::core::abi::ethabi::Event { - name: ::std::borrow::ToOwned::to_owned("Upgraded"), - inputs: ::std::vec![::ethers::core::abi::ethabi::EventParam { - name: ::std::borrow::ToOwned::to_owned("implementation"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - indexed: true, - },], - anonymous: false, - },], - ), - ]), + events: ::std::collections::BTreeMap::new(), errors: ::core::convert::From::from([ ( ::std::borrow::ToOwned::to_owned("ERC1967InvalidAdmin"), @@ -116,12 +72,12 @@ pub mod erc1967_utils { pub static ERC1967UTILS_ABI: ::ethers::contract::Lazy<::ethers::core::abi::Abi> = ::ethers::contract::Lazy::new(__abi); #[rustfmt::skip] - const __BYTECODE: &[u8] = b"`V`7`\x0B\x82\x82\x829\x80Q`\0\x1A`s\x14`*WcNH{q`\xE0\x1B`\0R`\0`\x04R`$`\0\xFD[0`\0R`s\x81S\x82\x81\xF3\xFEs\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x000\x14`\x80`@R`\0\x80\xFD\xFE\xA2dipfsX\"\x12 D\x9A\xC6\x98\xB3\x0C\xEF\0Z\x14W)\xBCs\xD7\x9A8\xB0\x19\x04\xE4\xA2(\xCDN\xA3~\xBF\x87\xF9}\xDDdsolcC\0\x08\x14\x003"; + const __BYTECODE: &[u8] = b"`V`7`\x0B\x82\x82\x829\x80Q`\0\x1A`s\x14`*WcNH{q`\xE0\x1B`\0R`\0`\x04R`$`\0\xFD[0`\0R`s\x81S\x82\x81\xF3\xFEs\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x000\x14`\x80`@R`\0\x80\xFD\xFE\xA2dipfsX\"\x12 \xD8\x83r\x0E\xCA\xF3\xBA\x88%S\x845\xFBg8\x80\xFEv\xA7\xB7\xCA\x03a*r~\n1\xCF\x19LJdsolcC\0\x08\x1C\x003"; /// The bytecode of the contract. pub static ERC1967UTILS_BYTECODE: ::ethers::core::types::Bytes = ::ethers::core::types::Bytes::from_static(__BYTECODE); #[rustfmt::skip] - const __DEPLOYED_BYTECODE: &[u8] = b"s\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x000\x14`\x80`@R`\0\x80\xFD\xFE\xA2dipfsX\"\x12 D\x9A\xC6\x98\xB3\x0C\xEF\0Z\x14W)\xBCs\xD7\x9A8\xB0\x19\x04\xE4\xA2(\xCDN\xA3~\xBF\x87\xF9}\xDDdsolcC\0\x08\x14\x003"; + const __DEPLOYED_BYTECODE: &[u8] = b"s\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x000\x14`\x80`@R`\0\x80\xFD\xFE\xA2dipfsX\"\x12 \xD8\x83r\x0E\xCA\xF3\xBA\x88%S\x845\xFBg8\x80\xFEv\xA7\xB7\xCA\x03a*r~\n1\xCF\x19LJdsolcC\0\x08\x1C\x003"; /// The deployed bytecode of the contract. pub static ERC1967UTILS_DEPLOYED_BYTECODE: ::ethers::core::types::Bytes = ::ethers::core::types::Bytes::from_static(__DEPLOYED_BYTECODE); @@ -201,34 +157,6 @@ pub mod erc1967_utils { let deployer = ::ethers::contract::ContractDeployer::new(deployer); Ok(deployer) } - ///Gets the contract's `AdminChanged` event - pub fn admin_changed_filter( - &self, - ) -> ::ethers::contract::builders::Event<::std::sync::Arc, M, AdminChangedFilter> - { - self.0.event() - } - ///Gets the contract's `BeaconUpgraded` event - pub fn beacon_upgraded_filter( - &self, - ) -> ::ethers::contract::builders::Event<::std::sync::Arc, M, BeaconUpgradedFilter> - { - self.0.event() - } - ///Gets the contract's `Upgraded` event - pub fn upgraded_filter( - &self, - ) -> ::ethers::contract::builders::Event<::std::sync::Arc, M, UpgradedFilter> { - 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, ERC1967UtilsEvents> - { - self.0 - .event_with_filter(::core::default::Default::default()) - } } impl From<::ethers::contract::Contract> for ERC1967Utils { fn from(contract: ::ethers::contract::Contract) -> Self { @@ -440,111 +368,4 @@ pub mod erc1967_utils { Self::ERC1967NonPayable(value) } } - #[derive( - Clone, - ::ethers::contract::EthEvent, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethevent(name = "AdminChanged", abi = "AdminChanged(address,address)")] - pub struct AdminChangedFilter { - pub previous_admin: ::ethers::core::types::Address, - pub new_admin: ::ethers::core::types::Address, - } - #[derive( - Clone, - ::ethers::contract::EthEvent, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethevent(name = "BeaconUpgraded", abi = "BeaconUpgraded(address)")] - pub struct BeaconUpgradedFilter { - #[ethevent(indexed)] - pub beacon: ::ethers::core::types::Address, - } - #[derive( - Clone, - ::ethers::contract::EthEvent, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethevent(name = "Upgraded", abi = "Upgraded(address)")] - pub struct UpgradedFilter { - #[ethevent(indexed)] - pub implementation: ::ethers::core::types::Address, - } - ///Container type for all of the contract's events - #[derive( - Clone, - ::ethers::contract::EthAbiType, - serde::Serialize, - serde::Deserialize, - Debug, - PartialEq, - Eq, - Hash, - )] - pub enum ERC1967UtilsEvents { - AdminChangedFilter(AdminChangedFilter), - BeaconUpgradedFilter(BeaconUpgradedFilter), - UpgradedFilter(UpgradedFilter), - } - impl ::ethers::contract::EthLogDecode for ERC1967UtilsEvents { - fn decode_log( - log: &::ethers::core::abi::RawLog, - ) -> ::core::result::Result { - if let Ok(decoded) = AdminChangedFilter::decode_log(log) { - return Ok(ERC1967UtilsEvents::AdminChangedFilter(decoded)); - } - if let Ok(decoded) = BeaconUpgradedFilter::decode_log(log) { - return Ok(ERC1967UtilsEvents::BeaconUpgradedFilter(decoded)); - } - if let Ok(decoded) = UpgradedFilter::decode_log(log) { - return Ok(ERC1967UtilsEvents::UpgradedFilter(decoded)); - } - Err(::ethers::core::abi::Error::InvalidData) - } - } - impl ::core::fmt::Display for ERC1967UtilsEvents { - fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { - match self { - Self::AdminChangedFilter(element) => ::core::fmt::Display::fmt(element, f), - Self::BeaconUpgradedFilter(element) => ::core::fmt::Display::fmt(element, f), - Self::UpgradedFilter(element) => ::core::fmt::Display::fmt(element, f), - } - } - } - impl ::core::convert::From for ERC1967UtilsEvents { - fn from(value: AdminChangedFilter) -> Self { - Self::AdminChangedFilter(value) - } - } - impl ::core::convert::From for ERC1967UtilsEvents { - fn from(value: BeaconUpgradedFilter) -> Self { - Self::BeaconUpgradedFilter(value) - } - } - impl ::core::convert::From for ERC1967UtilsEvents { - fn from(value: UpgradedFilter) -> Self { - Self::UpgradedFilter(value) - } - } } diff --git a/bindings/src/error.rs b/bindings/src/error.rs index 422f49e..17cb97c 100644 --- a/bindings/src/error.rs +++ b/bindings/src/error.rs @@ -231,6 +231,28 @@ pub mod error { inputs: ::std::vec![], },], ), + ( + ::std::borrow::ToOwned::to_owned("ImageAlreadyInFamily"), + ::std::vec![::ethers::core::abi::ethabi::AbiError { + name: ::std::borrow::ToOwned::to_owned("ImageAlreadyInFamily",), + inputs: ::std::vec![ + ::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("imageId"), + kind: ::ethers::core::abi::ethabi::ParamType::FixedBytes(32usize,), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("bytes32"), + ), + }, + ::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("familyId"), + kind: ::ethers::core::abi::ethabi::ParamType::FixedBytes(32usize,), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("bytes32"), + ), + }, + ], + },], + ), ( ::std::borrow::ToOwned::to_owned("InactiveMarket"), ::std::vec![::ethers::core::abi::ethabi::AbiError { @@ -546,6 +568,35 @@ pub mod error { },], },], ), + ( + ::std::borrow::ToOwned::to_owned("TeeVerifierEnclaveKeyNotVerified"), + ::std::vec![::ethers::core::abi::ethabi::AbiError { + name: ::std::borrow::ToOwned::to_owned("TeeVerifierEnclaveKeyNotVerified",), + inputs: ::std::vec![ + ::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("PCR0"), + kind: ::ethers::core::abi::ethabi::ParamType::Bytes, + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("bytes"), + ), + }, + ::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("PCR1"), + kind: ::ethers::core::abi::ethabi::ParamType::Bytes, + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("bytes"), + ), + }, + ::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("PCR2"), + kind: ::ethers::core::abi::ethabi::ParamType::Bytes, + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("bytes"), + ), + }, + ], + },], + ), ( ::std::borrow::ToOwned::to_owned("UnstakeRequestNotInPlace"), ::std::vec![::ethers::core::abi::ethabi::AbiError { @@ -562,12 +613,12 @@ pub mod error { pub static ERROR_ABI: ::ethers::contract::Lazy<::ethers::core::abi::Abi> = ::ethers::contract::Lazy::new(__abi); #[rustfmt::skip] - const __BYTECODE: &[u8] = b"`V`7`\x0B\x82\x82\x829\x80Q`\0\x1A`s\x14`*WcNH{q`\xE0\x1B`\0R`\0`\x04R`$`\0\xFD[0`\0R`s\x81S\x82\x81\xF3\xFEs\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x000\x14`\x80`@R`\0\x80\xFD\xFE\xA2dipfsX\"\x12 ^\x93\xC1q1d`\x1D^Bo\xD8\xC3\xF0\xC7\x19\xCA\x93\x82\x0C\xDC\xC2\xC4\x8A\x03\x11\xB1\x80\xB9\x9Cm\x14dsolcC\0\x08\x14\x003"; + const __BYTECODE: &[u8] = b"`V`7`\x0B\x82\x82\x829\x80Q`\0\x1A`s\x14`*WcNH{q`\xE0\x1B`\0R`\0`\x04R`$`\0\xFD[0`\0R`s\x81S\x82\x81\xF3\xFEs\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x000\x14`\x80`@R`\0\x80\xFD\xFE\xA2dipfsX\"\x12 \xAAYoT \xF8\xB5\x13\xB3\x8Eh\\\xD8\xF7\xE0\xD5#\x1B\x0B@\xE9.\x0F\xFA\xFAy\x9D\x8E&\x9CW\xFBdsolcC\0\x08\x1C\x003"; /// The bytecode of the contract. pub static ERROR_BYTECODE: ::ethers::core::types::Bytes = ::ethers::core::types::Bytes::from_static(__BYTECODE); #[rustfmt::skip] - const __DEPLOYED_BYTECODE: &[u8] = b"s\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x000\x14`\x80`@R`\0\x80\xFD\xFE\xA2dipfsX\"\x12 ^\x93\xC1q1d`\x1D^Bo\xD8\xC3\xF0\xC7\x19\xCA\x93\x82\x0C\xDC\xC2\xC4\x8A\x03\x11\xB1\x80\xB9\x9Cm\x14dsolcC\0\x08\x14\x003"; + const __DEPLOYED_BYTECODE: &[u8] = b"s\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x000\x14`\x80`@R`\0\x80\xFD\xFE\xA2dipfsX\"\x12 \xAAYoT \xF8\xB5\x13\xB3\x8Eh\\\xD8\xF7\xE0\xD5#\x1B\x0B@\xE9.\x0F\xFA\xFAy\x9D\x8E&\x9CW\xFBdsolcC\0\x08\x1C\x003"; /// The deployed bytecode of the contract. pub static ERROR_DEPLOYED_BYTECODE: ::ethers::core::types::Bytes = ::ethers::core::types::Bytes::from_static(__DEPLOYED_BYTECODE); @@ -1030,6 +1081,27 @@ pub mod error { )] #[etherror(name = "GeneratorAlreadyExists", abi = "GeneratorAlreadyExists()")] pub struct GeneratorAlreadyExists; + ///Custom Error type `ImageAlreadyInFamily` with signature `ImageAlreadyInFamily(bytes32,bytes32)` and selector `0xc644d047` + #[derive( + Clone, + ::ethers::contract::EthError, + ::ethers::contract::EthDisplay, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + #[etherror( + name = "ImageAlreadyInFamily", + abi = "ImageAlreadyInFamily(bytes32,bytes32)" + )] + pub struct ImageAlreadyInFamily { + pub image_id: [u8; 32], + pub family_id: [u8; 32], + } ///Custom Error type `InactiveMarket` with signature `InactiveMarket()` and selector `0xbd2da74c` #[derive( Clone, @@ -1616,6 +1688,28 @@ pub mod error { pub struct ShouldBeInCrossedDeadlineState { pub ask_id: ::ethers::core::types::U256, } + ///Custom Error type `TeeVerifierEnclaveKeyNotVerified` with signature `TeeVerifierEnclaveKeyNotVerified(bytes,bytes,bytes)` and selector `0xda7977ba` + #[derive( + Clone, + ::ethers::contract::EthError, + ::ethers::contract::EthDisplay, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + #[etherror( + name = "TeeVerifierEnclaveKeyNotVerified", + abi = "TeeVerifierEnclaveKeyNotVerified(bytes,bytes,bytes)" + )] + pub struct TeeVerifierEnclaveKeyNotVerified { + pub pcr0: ::ethers::core::types::Bytes, + pub pcr1: ::ethers::core::types::Bytes, + pub pcr2: ::ethers::core::types::Bytes, + } ///Custom Error type `UnstakeRequestNotInPlace` with signature `UnstakeRequestNotInPlace()` and selector `0xb28c1c0e` #[derive( Clone, @@ -1665,6 +1759,7 @@ pub mod error { FailedAddingToFamily(FailedAddingToFamily), FailedWhitelistingImages(FailedWhitelistingImages), GeneratorAlreadyExists(GeneratorAlreadyExists), + ImageAlreadyInFamily(ImageAlreadyInFamily), InactiveMarket(InactiveMarket), IncorrectImageId(IncorrectImageId), InferredImageIdIsDifferent(InferredImageIdIsDifferent), @@ -1700,6 +1795,7 @@ pub mod error { ShouldBeInAssignedState(ShouldBeInAssignedState), ShouldBeInCreateState(ShouldBeInCreateState), ShouldBeInCrossedDeadlineState(ShouldBeInCrossedDeadlineState), + TeeVerifierEnclaveKeyNotVerified(TeeVerifierEnclaveKeyNotVerified), UnstakeRequestNotInPlace(UnstakeRequestNotInPlace), /// The standard solidity revert string, with selector /// Error(string) -- 0x08c379a0 @@ -1817,6 +1913,11 @@ pub mod error { { return Ok(Self::GeneratorAlreadyExists(decoded)); } + if let Ok(decoded) = + ::decode(data) + { + return Ok(Self::ImageAlreadyInFamily(decoded)); + } if let Ok(decoded) = ::decode(data) { return Ok(Self::InactiveMarket(decoded)); } @@ -1977,6 +2078,11 @@ pub mod error { { return Ok(Self::ShouldBeInCrossedDeadlineState(decoded)); } + if let Ok(decoded) = + ::decode(data) + { + return Ok(Self::TeeVerifierEnclaveKeyNotVerified(decoded)); + } if let Ok(decoded) = ::decode(data) { @@ -2044,6 +2150,9 @@ pub mod error { Self::GeneratorAlreadyExists(element) => { ::ethers::core::abi::AbiEncode::encode(element) } + Self::ImageAlreadyInFamily(element) => { + ::ethers::core::abi::AbiEncode::encode(element) + } Self::InactiveMarket(element) => ::ethers::core::abi::AbiEncode::encode(element), Self::IncorrectImageId(element) => ::ethers::core::abi::AbiEncode::encode(element), Self::InferredImageIdIsDifferent(element) => { @@ -2123,6 +2232,9 @@ pub mod error { Self::ShouldBeInCrossedDeadlineState(element) => { ::ethers::core::abi::AbiEncode::encode(element) } + Self::TeeVerifierEnclaveKeyNotVerified(element) => { + ::ethers::core::abi::AbiEncode::encode(element) + } Self::UnstakeRequestNotInPlace(element) => { ::ethers::core::abi::AbiEncode::encode(element) } @@ -2220,6 +2332,10 @@ pub mod error { == ::selector() => { true } + _ if selector + == ::selector() => { + true + } _ if selector == ::selector() => { true @@ -2358,6 +2474,10 @@ pub mod error { == ::selector() => { true } + _ if selector + == ::selector() => { + true + } _ if selector == ::selector() => { true @@ -2399,6 +2519,7 @@ pub mod error { Self::FailedAddingToFamily(element) => ::core::fmt::Display::fmt(element, f), Self::FailedWhitelistingImages(element) => ::core::fmt::Display::fmt(element, f), Self::GeneratorAlreadyExists(element) => ::core::fmt::Display::fmt(element, f), + Self::ImageAlreadyInFamily(element) => ::core::fmt::Display::fmt(element, f), Self::InactiveMarket(element) => ::core::fmt::Display::fmt(element, f), Self::IncorrectImageId(element) => ::core::fmt::Display::fmt(element, f), Self::InferredImageIdIsDifferent(element) => ::core::fmt::Display::fmt(element, f), @@ -2450,6 +2571,9 @@ pub mod error { Self::ShouldBeInCrossedDeadlineState(element) => { ::core::fmt::Display::fmt(element, f) } + Self::TeeVerifierEnclaveKeyNotVerified(element) => { + ::core::fmt::Display::fmt(element, f) + } Self::UnstakeRequestNotInPlace(element) => ::core::fmt::Display::fmt(element, f), Self::RevertString(s) => ::core::fmt::Display::fmt(s, f), } @@ -2570,6 +2694,11 @@ pub mod error { Self::GeneratorAlreadyExists(value) } } + impl ::core::convert::From for ErrorErrors { + fn from(value: ImageAlreadyInFamily) -> Self { + Self::ImageAlreadyInFamily(value) + } + } impl ::core::convert::From for ErrorErrors { fn from(value: InactiveMarket) -> Self { Self::InactiveMarket(value) @@ -2745,6 +2874,11 @@ pub mod error { Self::ShouldBeInCrossedDeadlineState(value) } } + impl ::core::convert::From for ErrorErrors { + fn from(value: TeeVerifierEnclaveKeyNotVerified) -> Self { + Self::TeeVerifierEnclaveKeyNotVerified(value) + } + } impl ::core::convert::From for ErrorErrors { fn from(value: UnstakeRequestNotInPlace) -> Self { Self::UnstakeRequestNotInPlace(value) diff --git a/bindings/src/errors.rs b/bindings/src/errors.rs new file mode 100644 index 0000000..2c2394f --- /dev/null +++ b/bindings/src/errors.rs @@ -0,0 +1,355 @@ +pub use errors::*; +/// 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 errors { + #[allow(deprecated)] + fn __abi() -> ::ethers::core::abi::Abi { + ::ethers::core::abi::ethabi::Contract { + constructor: ::core::option::Option::None, + functions: ::std::collections::BTreeMap::new(), + events: ::std::collections::BTreeMap::new(), + errors: ::core::convert::From::from([ + ( + ::std::borrow::ToOwned::to_owned("FailedCall"), + ::std::vec![::ethers::core::abi::ethabi::AbiError { + name: ::std::borrow::ToOwned::to_owned("FailedCall"), + inputs: ::std::vec![], + },], + ), + ( + ::std::borrow::ToOwned::to_owned("FailedDeployment"), + ::std::vec![::ethers::core::abi::ethabi::AbiError { + name: ::std::borrow::ToOwned::to_owned("FailedDeployment"), + inputs: ::std::vec![], + },], + ), + ( + ::std::borrow::ToOwned::to_owned("InsufficientBalance"), + ::std::vec![::ethers::core::abi::ethabi::AbiError { + name: ::std::borrow::ToOwned::to_owned("InsufficientBalance",), + inputs: ::std::vec![ + ::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("balance"), + kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("uint256"), + ), + }, + ::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("needed"), + kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("uint256"), + ), + }, + ], + },], + ), + ( + ::std::borrow::ToOwned::to_owned("MissingPrecompile"), + ::std::vec![::ethers::core::abi::ethabi::AbiError { + name: ::std::borrow::ToOwned::to_owned("MissingPrecompile"), + inputs: ::std::vec![::ethers::core::abi::ethabi::Param { + name: ::std::string::String::new(), + kind: ::ethers::core::abi::ethabi::ParamType::Address, + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("address"), + ), + },], + },], + ), + ]), + receive: false, + fallback: false, + } + } + ///The parsed JSON ABI of the contract. + pub static ERRORS_ABI: ::ethers::contract::Lazy<::ethers::core::abi::Abi> = + ::ethers::contract::Lazy::new(__abi); + #[rustfmt::skip] + const __BYTECODE: &[u8] = b"`V`7`\x0B\x82\x82\x829\x80Q`\0\x1A`s\x14`*WcNH{q`\xE0\x1B`\0R`\0`\x04R`$`\0\xFD[0`\0R`s\x81S\x82\x81\xF3\xFEs\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x000\x14`\x80`@R`\0\x80\xFD\xFE\xA2dipfsX\"\x12 L\xE3;\x12o\x10d\x84\x7F\xCEcl(::ethers::contract::Contract); + impl ::core::clone::Clone for Errors { + fn clone(&self) -> Self { + Self(::core::clone::Clone::clone(&self.0)) + } + } + impl ::core::ops::Deref for Errors { + type Target = ::ethers::contract::Contract; + fn deref(&self) -> &Self::Target { + &self.0 + } + } + impl ::core::ops::DerefMut for Errors { + fn deref_mut(&mut self) -> &mut Self::Target { + &mut self.0 + } + } + impl ::core::fmt::Debug for Errors { + fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { + f.debug_tuple(::core::stringify!(Errors)) + .field(&self.address()) + .finish() + } + } + impl Errors { + /// 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(), + ERRORS_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( + ERRORS_ABI.clone(), + ERRORS_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 Errors { + fn from(contract: ::ethers::contract::Contract) -> Self { + Self::new(contract.address(), contract.client()) + } + } + ///Custom Error type `FailedCall` with signature `FailedCall()` and selector `0xd6bda275` + #[derive( + Clone, + ::ethers::contract::EthError, + ::ethers::contract::EthDisplay, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + #[etherror(name = "FailedCall", abi = "FailedCall()")] + pub struct FailedCall; + ///Custom Error type `FailedDeployment` with signature `FailedDeployment()` and selector `0xb06ebf3d` + #[derive( + Clone, + ::ethers::contract::EthError, + ::ethers::contract::EthDisplay, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + #[etherror(name = "FailedDeployment", abi = "FailedDeployment()")] + pub struct FailedDeployment; + ///Custom Error type `InsufficientBalance` with signature `InsufficientBalance(uint256,uint256)` and selector `0xcf479181` + #[derive( + Clone, + ::ethers::contract::EthError, + ::ethers::contract::EthDisplay, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + #[etherror( + name = "InsufficientBalance", + abi = "InsufficientBalance(uint256,uint256)" + )] + pub struct InsufficientBalance { + pub balance: ::ethers::core::types::U256, + pub needed: ::ethers::core::types::U256, + } + ///Custom Error type `MissingPrecompile` with signature `MissingPrecompile(address)` and selector `0x42b01bce` + #[derive( + Clone, + ::ethers::contract::EthError, + ::ethers::contract::EthDisplay, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + #[etherror(name = "MissingPrecompile", abi = "MissingPrecompile(address)")] + pub struct MissingPrecompile(pub ::ethers::core::types::Address); + ///Container type for all of the contract's custom errors + #[derive( + Clone, + ::ethers::contract::EthAbiType, + serde::Serialize, + serde::Deserialize, + Debug, + PartialEq, + Eq, + Hash, + )] + pub enum ErrorsErrors { + FailedCall(FailedCall), + FailedDeployment(FailedDeployment), + InsufficientBalance(InsufficientBalance), + MissingPrecompile(MissingPrecompile), + /// The standard solidity revert string, with selector + /// Error(string) -- 0x08c379a0 + RevertString(::std::string::String), + } + impl ::ethers::core::abi::AbiDecode for ErrorsErrors { + fn decode( + data: impl AsRef<[u8]>, + ) -> ::core::result::Result { + let data = data.as_ref(); + if let Ok(decoded) = + <::std::string::String as ::ethers::core::abi::AbiDecode>::decode(data) + { + return Ok(Self::RevertString(decoded)); + } + if let Ok(decoded) = ::decode(data) { + return Ok(Self::FailedCall(decoded)); + } + if let Ok(decoded) = ::decode(data) + { + return Ok(Self::FailedDeployment(decoded)); + } + if let Ok(decoded) = + ::decode(data) + { + return Ok(Self::InsufficientBalance(decoded)); + } + if let Ok(decoded) = ::decode(data) + { + return Ok(Self::MissingPrecompile(decoded)); + } + Err(::ethers::core::abi::Error::InvalidData.into()) + } + } + impl ::ethers::core::abi::AbiEncode for ErrorsErrors { + fn encode(self) -> ::std::vec::Vec { + match self { + Self::FailedCall(element) => ::ethers::core::abi::AbiEncode::encode(element), + Self::FailedDeployment(element) => ::ethers::core::abi::AbiEncode::encode(element), + Self::InsufficientBalance(element) => { + ::ethers::core::abi::AbiEncode::encode(element) + } + Self::MissingPrecompile(element) => ::ethers::core::abi::AbiEncode::encode(element), + Self::RevertString(s) => ::ethers::core::abi::AbiEncode::encode(s), + } + } + } + impl ::ethers::contract::ContractRevert for ErrorsErrors { + fn valid_selector(selector: [u8; 4]) -> bool { + match selector { + [0x08, 0xc3, 0x79, 0xa0] => true, + _ if selector == ::selector() => true, + _ if selector == ::selector() => { + true + } + _ if selector + == ::selector() => + { + true + } + _ if selector + == ::selector() => + { + true + } + _ => false, + } + } + } + impl ::core::fmt::Display for ErrorsErrors { + fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { + match self { + Self::FailedCall(element) => ::core::fmt::Display::fmt(element, f), + Self::FailedDeployment(element) => ::core::fmt::Display::fmt(element, f), + Self::InsufficientBalance(element) => ::core::fmt::Display::fmt(element, f), + Self::MissingPrecompile(element) => ::core::fmt::Display::fmt(element, f), + Self::RevertString(s) => ::core::fmt::Display::fmt(s, f), + } + } + } + impl ::core::convert::From<::std::string::String> for ErrorsErrors { + fn from(value: String) -> Self { + Self::RevertString(value) + } + } + impl ::core::convert::From for ErrorsErrors { + fn from(value: FailedCall) -> Self { + Self::FailedCall(value) + } + } + impl ::core::convert::From for ErrorsErrors { + fn from(value: FailedDeployment) -> Self { + Self::FailedDeployment(value) + } + } + impl ::core::convert::From for ErrorsErrors { + fn from(value: InsufficientBalance) -> Self { + Self::InsufficientBalance(value) + } + } + impl ::core::convert::From for ErrorsErrors { + fn from(value: MissingPrecompile) -> Self { + Self::MissingPrecompile(value) + } + } +} diff --git a/bindings/src/generator_registry.rs b/bindings/src/generator_registry.rs index 8d25b3d..73ddece 100644 --- a/bindings/src/generator_registry.rs +++ b/bindings/src/generator_registry.rs @@ -680,7 +680,7 @@ pub mod generator_registry { ::std::vec![::ethers::core::abi::ethabi::Function { name: ::std::borrow::ToOwned::to_owned("intendToReduceCompute",), inputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("newUtilization"), + name: ::std::borrow::ToOwned::to_owned("computeToReduce"), kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), internal_type: ::core::option::Option::Some( ::std::borrow::ToOwned::to_owned("uint256"), @@ -696,7 +696,7 @@ pub mod generator_registry { ::std::vec![::ethers::core::abi::ethabi::Function { name: ::std::borrow::ToOwned::to_owned("intendToReduceStake",), inputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("newUtilization"), + name: ::std::borrow::ToOwned::to_owned("stakeToReduce"), kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), internal_type: ::core::option::Option::Some( ::std::borrow::ToOwned::to_owned("uint256"), @@ -1217,7 +1217,7 @@ pub mod generator_registry { indexed: true, }, ::ethers::core::abi::ethabi::EventParam { - name: ::std::borrow::ToOwned::to_owned("stake"), + name: ::std::borrow::ToOwned::to_owned("compute"), kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), indexed: false, }, @@ -1236,7 +1236,7 @@ pub mod generator_registry { indexed: true, }, ::ethers::core::abi::ethabi::EventParam { - name: ::std::borrow::ToOwned::to_owned("stake"), + name: ::std::borrow::ToOwned::to_owned("compute"), kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), indexed: false, }, @@ -1559,6 +1559,25 @@ pub mod generator_registry { anonymous: false, },], ), + ( + ::std::borrow::ToOwned::to_owned("StakeSlashed"), + ::std::vec![::ethers::core::abi::ethabi::Event { + name: ::std::borrow::ToOwned::to_owned("StakeSlashed"), + inputs: ::std::vec![ + ::ethers::core::abi::ethabi::EventParam { + name: ::std::borrow::ToOwned::to_owned("generator"), + kind: ::ethers::core::abi::ethabi::ParamType::Address, + indexed: true, + }, + ::ethers::core::abi::ethabi::EventParam { + name: ::std::borrow::ToOwned::to_owned("stake"), + kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), + indexed: false, + }, + ], + anonymous: false, + },], + ), ( ::std::borrow::ToOwned::to_owned("Upgraded"), ::std::vec![::ethers::core::abi::ethabi::Event { @@ -1615,19 +1634,6 @@ pub mod generator_registry { },], },], ), - ( - ::std::borrow::ToOwned::to_owned("AddressInsufficientBalance"), - ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("AddressInsufficientBalance",), - inputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("account"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - },], - },], - ), ( ::std::borrow::ToOwned::to_owned("AlreadyJoinedMarket"), ::std::vec![::ethers::core::abi::ethabi::AbiError { @@ -1740,9 +1746,9 @@ pub mod generator_registry { },], ), ( - ::std::borrow::ToOwned::to_owned("FailedInnerCall"), + ::std::borrow::ToOwned::to_owned("FailedCall"), ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("FailedInnerCall"), + name: ::std::borrow::ToOwned::to_owned("FailedCall"), inputs: ::std::vec![], },], ), @@ -1938,12 +1944,12 @@ pub mod generator_registry { pub static GENERATORREGISTRY_ABI: ::ethers::contract::Lazy<::ethers::core::abi::Abi> = ::ethers::contract::Lazy::new(__abi); #[rustfmt::skip] - const __BYTECODE: &[u8] = b"`\xE0`@R0`\x80R4\x80\x15b\0\0\x15W`\0\x80\xFD[P`@Qb\0M\xBC8\x03\x80b\0M\xBC\x839\x81\x01`@\x81\x90Rb\0\08\x91b\0\x01}V[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x80Th\x01\0\0\0\0\0\0\0\0\x81\x04`\xFF\x16\x15\x90`\x01`\x01`@\x1B\x03\x16`\0\x81\x15\x80\x15b\0\0\x83WP\x82[\x90P`\0\x82`\x01`\x01`@\x1B\x03\x16`\x01\x14\x80\x15b\0\0\xA0WP0;\x15[\x90P\x81\x15\x80\x15b\0\0\xAFWP\x80\x15[\x15b\0\0\xCEW`@Qc\xF9.\xE8\xA9`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x84T`\x01`\x01`@\x1B\x03\x19\x16`\x01\x17\x85U\x83\x15b\0\0\xFDW\x84T`\xFF`@\x1B\x19\x16h\x01\0\0\0\0\0\0\0\0\x17\x85U[`\x01`\x01`\xA0\x1B\x03\x80\x88\x16`\xA0R\x86\x16`\xC0R\x83\x15b\0\x01WW\x84T`\xFF`@\x1B\x19\x16\x85U`@Q`\x01\x81R\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x90` \x01`@Q\x80\x91\x03\x90\xA1[PPPPPPPb\0\x01\xBCV[`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14b\0\x01zW`\0\x80\xFD[PV[`\0\x80`@\x83\x85\x03\x12\x15b\0\x01\x91W`\0\x80\xFD[\x82Qb\0\x01\x9E\x81b\0\x01dV[` \x84\x01Q\x90\x92Pb\0\x01\xB1\x81b\0\x01dV[\x80\x91PP\x92P\x92\x90PV[`\x80Q`\xA0Q`\xC0QaK|b\0\x02@`\09`\0\x81\x81a\x05/\x01R\x81\x81a\x0C\xA5\x01R\x81\x81a\r\x89\x01R\x81\x81a\x14\xB5\x01R\x81\x81a4\xE4\x01Ra5\xD5\x01R`\0\x81\x81a\x02\x9D\x01R\x81\x81a\x0Bv\x01R\x81\x81a\x1A\x01\x01R\x81\x81a\x1F\xB1\x01R\x81\x81a'\xF4\x01Ra)#\x01R`\0\x81\x81a0\x14\x01R\x81\x81a0=\x01Ra1\x81\x01RaK|`\0\xF3\xFE`\x80`@R`\x046\x10a\x02QW`\x005`\xE0\x1C\x80cz\x14\xC4c\x11a\x019W\x80c\xA2\x17\xFD\xDF\x11a\0\xB6W\x80c\xD5Gt\x1F\x11a\0zW\x80c\xD5Gt\x1F\x14a\x07\xA6W\x80c\xE2\xFA3\xCE\x14a\x07\xC6W\x80c\xE7\xBC\x96\0\x14a\x07\xE6W\x80c\xE9\xE94\xA0\x14a\x08\x06W\x80c\xEA\xAC\xAE\x94\x14a\x08&W\x80c\xF2\x88\x8D\xBB\x14a\x08FW`\0\x80\xFD[\x80c\xA2\x17\xFD\xDF\x14a\x06\xF3W\x80c\xAD<\xB1\xCC\x14a\x07\x08W\x80c\xAD\xC9w.\x14a\x07FW\x80c\xC4\x92\xEE9\x14a\x07fW\x80c\xD0n\x1F{\x14a\x07\x86W`\0\x80\xFD[\x80c\x92\xEB\x91\xE2\x11a\0\xFDW\x80c\x92\xEB\x91\xE2\x14a\x06\x08W\x80c\x96\xDE\x0E\xEF\x14a\x06(W\x80c\x98*A]\x14a\x06HW\x80c\x9A\x7F\xCA\x8E\x14a\x06hW\x80c\x9F]\xB9\x86\x14a\x06\xD3W`\0\x80\xFD[\x80cz\x14\xC4c\x14a\x04RW\x80c\x81\xC4\\p\x14a\x05qW\x80c\x84\xAC3\xEC\x14a\x05\x92W\x80c\x8C\xFCV\xD8\x14a\x05\xB2W\x80c\x91\xD1HT\x14a\x05\xE8W`\0\x80\xFD[\x80c/\x8FJ;\x11a\x01\xD2W\x80cO\x1E\xF2\x86\x11a\x01\x96W\x80cO\x1E\xF2\x86\x14a\x04\xA7W\x80cR\xD1\x90-\x14a\x04\xBAW\x80cT\x1A\x8C\x18\x14a\x04\xCFW\x80cdmQ\xB4\x14a\x04\xEFW\x80cf\x1D\xE5\xAC\x14a\x05\x1DW\x80cm@Xw\x14a\x05QW`\0\x80\xFD[\x80c/\x8FJ;\x14a\x04\x1DW\x80c6V\x8A\xBE\x14a\x042W\x80c<^\xB5|\x14a\x04RW\x80cH\\\xC9U\x14a\x04gW\x80cM*\xAB\x9A\x14a\x04\x87W`\0\x80\xFD[\x80c!\x80\xDE]\x11a\x02\x19W\x80c!\x80\xDE]\x14a\x03NW\x80c$\x8A\x9C\xA3\x14a\x03nW\x80c+a\x0C-\x14a\x03\x9CW\x80c,\x1F\xBD\x03\x14a\x03\xDBW\x80c//\xF1]\x14a\x03\xFDW`\0\x80\xFD[\x80c\x01\xFF\xC9\xA7\x14a\x02VW\x80c\x04y\xD6D\x14a\x02\x8BW\x80c\x08\xBEk\xAD\x14a\x02\xD7W\x80c\x13m\xFB\xF5\x14a\x02\xF9W\x80c\x1C~\xAEe\x14a\x03\x19W[`\0\x80\xFD[4\x80\x15a\x02bW`\0\x80\xFD[Pa\x02va\x02q6`\x04a?\xF2V[a\x08fV[`@Q\x90\x15\x15\x81R` \x01[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x02\x97W`\0\x80\xFD[Pa\x02\xBF\x7F\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\x81V[`@Q`\x01`\x01`\xA0\x1B\x03\x90\x91\x16\x81R` \x01a\x02\x82V[4\x80\x15a\x02\xE3W`\0\x80\xFD[Pa\x02\xF7a\x02\xF26`\x04a@\x1CV[a\x08wV[\0[4\x80\x15a\x03\x05W`\0\x80\xFD[Pa\x02\xF7a\x03\x146`\x04aAhV[a\x08\xBBV[4\x80\x15a\x03%W`\0\x80\xFD[Pa\x039a\x0346`\x04aA\xCAV[a\x0C\x01V[`@\x80Q\x92\x83R` \x83\x01\x91\x90\x91R\x01a\x02\x82V[4\x80\x15a\x03ZW`\0\x80\xFD[Pa\x02\xF7a\x03i6`\x04aB7V[a\x0C\xA3V[4\x80\x15a\x03zW`\0\x80\xFD[Pa\x03\x8Ea\x03\x896`\x04aB\xA6V[a\x0E5V[`@Q\x90\x81R` \x01a\x02\x82V[4\x80\x15a\x03\xA8W`\0\x80\xFD[Pa\x03\xBCa\x03\xB76`\x04aA\xCAV[a\x0EWV[`@\x80Q`\x01`\x01`\xA0\x1B\x03\x90\x93\x16\x83R` \x83\x01\x91\x90\x91R\x01a\x02\x82V[4\x80\x15a\x03\xE7W`\0\x80\xFD[Pa\x03\x8E`\0\x80Q` aJ\xC7\x839\x81Q\x91R\x81V[4\x80\x15a\x04\tW`\0\x80\xFD[Pa\x02\xF7a\x04\x186`\x04aB\xBFV[a\x10>V[4\x80\x15a\x04)W`\0\x80\xFD[Pa\x02\xF7a\x10ZV[4\x80\x15a\x04>W`\0\x80\xFD[Pa\x02\xF7a\x04M6`\x04aB\xBFV[a\x121V[4\x80\x15a\x04^W`\0\x80\xFD[Pa\x03\x8E`d\x81V[4\x80\x15a\x04sW`\0\x80\xFD[Pa\x02\xF7a\x04\x826`\x04aB\xEFV[a\x12dV[4\x80\x15a\x04\x93W`\0\x80\xFD[Pa\x02\xF7a\x04\xA26`\x04aC\x1DV[a\x13\xCBV[a\x02\xF7a\x04\xB56`\x04aC:V[a\x14oV[4\x80\x15a\x04\xC6W`\0\x80\xFD[Pa\x03\x8Ea\x14\x8EV[4\x80\x15a\x04\xDBW`\0\x80\xFD[Pa\x02\xF7a\x04\xEA6`\x04aB\xA6V[a\x14\xABV[4\x80\x15a\x04\xFBW`\0\x80\xFD[Pa\x05\x0Fa\x05\n6`\x04aA\xCAV[a\x15>V[`@Qa\x02\x82\x92\x91\x90aC\xC1V[4\x80\x15a\x05)W`\0\x80\xFD[Pa\x02\xBF\x7F\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\x81V[4\x80\x15a\x05]W`\0\x80\xFD[Pa\x02\xF7a\x05l6`\x04aB\xA6V[a\x18\x02V[4\x80\x15a\x05}W`\0\x80\xFD[Pa\x01\xF8Ta\x02\xBF\x90`\x01`\x01`\xA0\x1B\x03\x16\x81V[4\x80\x15a\x05\x9EW`\0\x80\xFD[Pa\x02\xF7a\x05\xAD6`\x04aC\x1DV[a\x18\xA9V[4\x80\x15a\x05\xBEW`\0\x80\xFD[Pa\x05\xD2a\x05\xCD6`\x04aC\x1DV[a\x1A\xE8V[`@Qa\x02\x82\x9A\x99\x98\x97\x96\x95\x94\x93\x92\x91\x90aD,V[4\x80\x15a\x05\xF4W`\0\x80\xFD[Pa\x02va\x06\x036`\x04aB\xBFV[a\x1B\xD0V[4\x80\x15a\x06\x14W`\0\x80\xFD[Pa\x02\xF7a\x06#6`\x04aB7V[a\x1C\x08V[4\x80\x15a\x064W`\0\x80\xFD[Pa\x02\xF7a\x06C6`\x04aB\xA6V[a\x1C\x15V[4\x80\x15a\x06TW`\0\x80\xFD[Pa\x02\xF7a\x06c6`\x04aD\x91V[a\x1D\x99V[4\x80\x15a\x06tW`\0\x80\xFD[Pa\x06\xC2a\x06\x836`\x04aA\xCAV[a\x01\xF5` \x90\x81R`\0\x92\x83R`@\x80\x84 \x90\x91R\x90\x82R\x90 \x80T`\x01\x82\x01T`\x02\x83\x01T`\x03\x84\x01T`\x04\x90\x94\x01T`\xFF\x90\x93\x16\x93\x91\x92\x90\x91\x90\x85V[`@Qa\x02\x82\x95\x94\x93\x92\x91\x90aD\xC6V[4\x80\x15a\x06\xDFW`\0\x80\xFD[Pa\x02\xF7a\x06\xEE6`\x04aB\xA6V[a\x1F\x1BV[4\x80\x15a\x06\xFFW`\0\x80\xFD[Pa\x03\x8E`\0\x81V[4\x80\x15a\x07\x14W`\0\x80\xFD[Pa\x079`@Q\x80`@\x01`@R\x80`\x05\x81R` \x01d\x03R\xE3\x02\xE3`\xDC\x1B\x81RP\x81V[`@Qa\x02\x82\x91\x90aD\xF6V[4\x80\x15a\x07RW`\0\x80\xFD[Pa\x03\x8Ea\x07a6`\x04aA\xCAV[a\x1F%V[4\x80\x15a\x07rW`\0\x80\xFD[Pa\x02\xF7a\x07\x816`\x04aD\x91V[a UV[4\x80\x15a\x07\x92W`\0\x80\xFD[Pa\x02\xF7a\x07\xA16`\x04a@\x1CV[a\"nV[4\x80\x15a\x07\xB2W`\0\x80\xFD[Pa\x02\xF7a\x07\xC16`\x04aB\xBFV[a\"\xADV[4\x80\x15a\x07\xD2W`\0\x80\xFD[Pa\x02\xF7a\x07\xE16`\x04aE\x17V[a\"\xC9V[4\x80\x15a\x07\xF2W`\0\x80\xFD[Pa\x02\xF7a\x08\x016`\x04aB\xA6V[a%mV[4\x80\x15a\x08\x12W`\0\x80\xFD[Pa\x02\xF7a\x08!6`\x04aB\xA6V[a%wV[4\x80\x15a\x082W`\0\x80\xFD[Pa\x03\x8Ea\x08A6`\x04aE\xB9V[a&\xD8V[4\x80\x15a\x08RW`\0\x80\xFD[Pa\x02\xF7a\x08a6`\x04aC\x1DV[a(+V[`\0a\x08q\x82a*.V[\x92\x91PPV[`\0[\x81\x81\x10\x15a\x08\xB6Wa\x08\xA43\x84\x84\x84\x81\x81\x10a\x08\x98Wa\x08\x98aF\x03V[\x90P` \x02\x015a*cV[\x80a\x08\xAE\x81aF/V[\x91PPa\x08zV[PPPV[a\x08\xC3a,\xBCV[3`\0\x81\x81Ra\x01\xF4` \x90\x81R`@\x80\x83 \x81Qa\x01@\x81\x01\x83R\x81T`\x01`\x01`\xA0\x1B\x03\x16\x81R`\x01\x82\x01T\x93\x81\x01\x93\x90\x93R`\x02\x81\x01T\x91\x83\x01\x91\x90\x91R`\x03\x81\x01T``\x83\x01R`\x04\x81\x01T`\x80\x83\x01R`\x05\x81\x01T`\xA0\x83\x01R`\x06\x81\x01T`\xC0\x83\x01R`\x07\x81\x01T`\xE0\x83\x01R`\x08\x81\x01Ta\x01\0\x83\x01R`\t\x81\x01\x80Ta\x01 \x84\x01\x91\x90a\tW\x90aFHV[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\t\x83\x90aFHV[\x80\x15a\t\xD0W\x80`\x1F\x10a\t\xA5Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\t\xD0V[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\t\xB3W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81RPP\x90P\x82Q`\0\x14\x80a\t\xF2WP`\x01`\x01`\xA0\x1B\x03\x86\x16\x15[\x80a\t\xFBWP\x84\x15[\x15a\n\x19W`@Qc\x1E\x1D\n\xB5`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x80Q`\x01`\x01`\xA0\x1B\x03\x16\x15a\nBW`@QcXt\xF9{`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`@Q\x80a\x01@\x01`@R\x80\x87`\x01`\x01`\xA0\x1B\x03\x16\x81R` \x01\x85\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01\x86\x81R` \x01g\r\xE0\xB6\xB3\xA7d\0\0\x81R` \x01g\r\xE0\xB6\xB3\xA7d\0\0\x81R` \x01\x84\x81RPa\x01\xF4`\0\x84`\x01`\x01`\xA0\x1B\x03\x16`\x01`\x01`\xA0\x1B\x03\x16\x81R` \x01\x90\x81R` \x01`\0 `\0\x82\x01Q\x81`\0\x01`\0a\x01\0\n\x81T\x81`\x01`\x01`\xA0\x1B\x03\x02\x19\x16\x90\x83`\x01`\x01`\xA0\x1B\x03\x16\x02\x17\x90UP` \x82\x01Q\x81`\x01\x01U`@\x82\x01Q\x81`\x02\x01U``\x82\x01Q\x81`\x03\x01U`\x80\x82\x01Q\x81`\x04\x01U`\xA0\x82\x01Q\x81`\x05\x01U`\xC0\x82\x01Q\x81`\x06\x01U`\xE0\x82\x01Q\x81`\x07\x01Ua\x01\0\x82\x01Q\x81`\x08\x01Ua\x01 \x82\x01Q\x81`\t\x01\x90\x81a\x0B_\x91\x90aF\xD0V[PP\x84\x15\x90Pa\x0B\x9EWa\x0B\x9E`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x830\x87a,\xF4V[`@\x80Q\x86\x81R` \x81\x01\x86\x90R`\x01`\x01`\xA0\x1B\x03\x84\x16\x91\x7FI\x1B\x0FF\x1D\x05\xB7\x9B\xFCi\x04\xA9\xBA\x9D\xF5#\xD7fP?\x11\x04k+^n\xDD\xAA\xE3\xA7#\x1C\x91\x01`@Q\x80\x91\x03\x90\xA2PPa\x0B\xFB`\x01`\0\x80Q` aK'\x839\x81Q\x91RUV[PPPPV[`\x01`\x01`\xA0\x1B\x03\x82\x16`\0\x90\x81Ra\x01\xF5` \x90\x81R`@\x80\x83 \x84\x84R\x90\x91R\x80\x82 \x81Q`\xA0\x81\x01\x90\x92R\x80T\x83\x92\x83\x92\x90\x91\x82\x90`\xFF\x16`\x04\x81\x11\x15a\x0CMWa\x0CMaC\x89V[`\x04\x81\x11\x15a\x0C^Wa\x0C^aC\x89V[\x81R` \x01`\x01\x82\x01T\x81R` \x01`\x02\x82\x01T\x81R` \x01`\x03\x82\x01T\x81R` \x01`\x04\x82\x01T\x81RPP\x90P\x80`@\x01Q\x81``\x01Q\x92P\x92PP[\x92P\x92\x90PV[\x7F\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`\x01`\x01`\xA0\x1B\x03\x16ck[!\xA6a\x0C\xDB\x85a-[V[a\x0C\xE4\x87a-\x94V[`@Q`\x01`\x01`\xE0\x1B\x03\x19`\xE0\x85\x90\x1B\x16\x81R`\x04\x81\x01\x92\x90\x92R`$\x82\x01R`D\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\r%W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\rI\x91\x90aG\x8FV[a\rfW`@Qc\xC4e\xE6\x9D`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\rr\x83\x83\x833a-\xDCV[`@Qc\x07\x07Y\x1F`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x90c\x07\x07Y\x1F\x90a\r\xBE\x90\x86\x90`\x04\x01aD\xF6V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\r\xD8W`\0\x80\xFD[PZ\xF1\x15\x80\x15a\r\xECW=`\0\x80>=`\0\xFD[PPPPa\r\xF9\x83a.\xA4V[`\x01`\x01`\xA0\x1B\x03\x16\x84\x7F\xC3\xFB\xBD\xB6\xAA\x8D\x99\xF6\xEF\xE2J:\"\xE9\xA9\x9F\xFE\xF2J/9\x9C\x0B\x1ET\x99F\xF9\x1B\xF06\xE4`@Q`@Q\x80\x91\x03\x90\xA3PPPPV[`\0\x90\x81R`\0\x80Q` aK\x07\x839\x81Q\x91R` R`@\x90 `\x01\x01T\x90V[`\x01`\x01`\xA0\x1B\x03\x82\x16`\0\x90\x81Ra\x01\xF5` \x90\x81R`@\x80\x83 \x84\x84R\x90\x91R\x80\x82 \x81Q`\xA0\x81\x01\x90\x92R\x80T\x83\x92\x83\x92\x90\x91\x82\x90`\xFF\x16`\x04\x81\x11\x15a\x0E\xA3Wa\x0E\xA3aC\x89V[`\x04\x81\x11\x15a\x0E\xB4Wa\x0E\xB4aC\x89V[\x81R` \x01`\x01\x82\x01T\x81R` \x01`\x02\x82\x01T\x81R` \x01`\x03\x82\x01T\x81R` \x01`\x04\x82\x01T\x81RPP\x90P`\0a\x01\xF4`\0\x87`\x01`\x01`\xA0\x1B\x03\x16`\x01`\x01`\xA0\x1B\x03\x16\x81R` \x01\x90\x81R` \x01`\0 `@Q\x80a\x01@\x01`@R\x90\x81`\0\x82\x01`\0\x90T\x90a\x01\0\n\x90\x04`\x01`\x01`\xA0\x1B\x03\x16`\x01`\x01`\xA0\x1B\x03\x16`\x01`\x01`\xA0\x1B\x03\x16\x81R` \x01`\x01\x82\x01T\x81R` \x01`\x02\x82\x01T\x81R` \x01`\x03\x82\x01T\x81R` \x01`\x04\x82\x01T\x81R` \x01`\x05\x82\x01T\x81R` \x01`\x06\x82\x01T\x81R` \x01`\x07\x82\x01T\x81R` \x01`\x08\x82\x01T\x81R` \x01`\t\x82\x01\x80Ta\x0F\xA5\x90aFHV[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\x0F\xD1\x90aFHV[\x80\x15a\x10\x1EW\x80`\x1F\x10a\x0F\xF3Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\x10\x1EV[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\x10\x01W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPP\x91\x90\x92RPP\x90Q`@\x90\x93\x01Q\x92\x94P\x91\x92PPP\x92P\x92\x90PV[a\x10G\x82a\x0E5V[a\x10P\x81a.\xD4V[a\x0B\xFB\x83\x83a.\xDEV[3`\0\x81\x81Ra\x01\xF4` R`@\x90 `\t\x81\x01\x80Ta\x10y\x90aFHV[\x15\x90P\x80a\x10\x8FWP\x80T`\x01`\x01`\xA0\x1B\x03\x16\x15[\x15a\x10\xADW`@QcdF\xF9\x17`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[g\r\xE0\xB6\xB3\xA7d\0\0\x81`\x08\x01T\x03a\x10\xD9W`@Qc\x89\x83`\x9D`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0g\r\xE0\xB6\xB3\xA7d\0\0\x82`\x06\x01T\x83`\x08\x01Ta\x10\xF8\x91\x90aG\xACV[a\x11\x02\x91\x90aG\xC3V[\x90P`\0\x81\x83`\x06\x01Ta\x11\x16\x91\x90aG\xE5V[\x90P\x82`\x03\x01T\x82\x10\x15a\x11=W`@Qc\x01\x19\"\xB7`\xE3\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x82`\x02\x01T\x82\x10\x15a\x11bW`@Qc\x01\x19\"\xB7`\xE3\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x06\x83\x01\x82\x90Ug\r\xE0\xB6\xB3\xA7d\0\0`\x08\x84\x01U`\x01`\x01`\xA0\x1B\x03\x84\x16`\0\x90\x81Ra\x01\xF7` R`@\x90 TC\x10\x80\x15\x90a\x11\xB8WP`\x01`\x01`\xA0\x1B\x03\x84\x16`\0\x90\x81Ra\x01\xF7` R`@\x90 T\x15\x15[a\x11\xD5W`@Qc8l\xF4\x07`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\x01`\xA0\x1B\x03\x84\x16`\0\x81\x81Ra\x01\xF7` R`@\x80\x82 \x91\x90\x91UQ\x7F\x11\xDE\xAE(\x9Epx\xFC\xE2\x88\xF4\xE9sN\x9C=\xF6{U\xEA\xC4\xFFA\xB8\x90\xB6\xD68\x1A\xCE\xE7b\x90a\x12#\x90\x84\x81R` \x01\x90V[`@Q\x80\x91\x03\x90\xA2PPPPV[`\x01`\x01`\xA0\x1B\x03\x81\x163\x14a\x12ZW`@Qc3K\xD9\x19`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x08\xB6\x82\x82a/\x83V[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x80T`\x01`@\x1B\x81\x04`\xFF\x16\x15\x90`\x01`\x01`@\x1B\x03\x16`\0\x81\x15\x80\x15a\x12\xA9WP\x82[\x90P`\0\x82`\x01`\x01`@\x1B\x03\x16`\x01\x14\x80\x15a\x12\xC5WP0;\x15[\x90P\x81\x15\x80\x15a\x12\xD3WP\x80\x15[\x15a\x12\xF1W`@Qc\xF9.\xE8\xA9`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x84Tg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x19\x16`\x01\x17\x85U\x83\x15a\x13\x1BW\x84T`\xFF`@\x1B\x19\x16`\x01`@\x1B\x17\x85U[a\x13#a/\xFFV[a\x13+a/\xFFV[a\x133a/\xFFV[a\x13;a/\xFFV[a\x13F`\0\x88a.\xDEV[Pa\x13_`\0\x80Q` aJ\xC7\x839\x81Q\x91R\x87a.\xDEV[Pa\x01\xF8\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16`\x01`\x01`\xA0\x1B\x03\x88\x16\x17\x90U\x83\x15a\x13\xC2W\x84T`\xFF`@\x1B\x19\x16\x85U`@Q`\x01\x81R\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x90` \x01`@Q\x80\x91\x03\x90\xA1[PPPPPPPV[3`\0\x81\x81Ra\x01\xF4` R`@\x90 `\x01`\x01`\xA0\x1B\x03\x83\x16\x15\x80a\x13\xF9WP\x80T`\x01`\x01`\xA0\x1B\x03\x16\x15[\x15a\x14\x17W`@Qc\x1E\x1D\n\xB5`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16`\x01`\x01`\xA0\x1B\x03\x84\x81\x16\x91\x82\x17\x83U`@Q\x91\x82R\x83\x16\x90\x7F\xB1\x95\xA9K\xEC\xD3\x88\xC9\xA0\x7F\xE8\x18qh3\xBD\xF9\x8Bu\\x\xC9\xB48\xF4\xC8\xF0o5O\xA3h\x90` \x01[`@Q\x80\x91\x03\x90\xA2PPPV[a\x14wa0\tV[a\x14\x80\x82a0\xAEV[a\x14\x8A\x82\x82a0\xB9V[PPV[`\0a\x14\x98a1vV[P`\0\x80Q` aJ\xE7\x839\x81Q\x91R\x90V[`\x01`\x01`\xA0\x1B\x03\x7F\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\x16c\xED8\r\x033`@Q`\x01`\x01`\xE0\x1B\x03\x19`\xE0\x84\x90\x1B\x16\x81R`\x01`\x01`\xA0\x1B\x03\x90\x91\x16`\x04\x82\x01R`$\x81\x01\x84\x90R`D\x01`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x15#W`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x157W=`\0\x80>=`\0\xFD[PPPPPV[`\x01`\x01`\xA0\x1B\x03\x82\x16`\0\x90\x81Ra\x01\xF5` \x90\x81R`@\x80\x83 \x84\x84R\x90\x91R\x80\x82 \x81Q`\xA0\x81\x01\x90\x92R\x80T\x83\x92\x83\x92\x90\x91\x82\x90`\xFF\x16`\x04\x81\x11\x15a\x15\x8AWa\x15\x8AaC\x89V[`\x04\x81\x11\x15a\x15\x9BWa\x15\x9BaC\x89V[\x81R` \x01`\x01\x82\x01T\x81R` \x01`\x02\x82\x01T\x81R` \x01`\x03\x82\x01T\x81R` \x01`\x04\x82\x01T\x81RPP\x90P`\0a\x01\xF4`\0\x87`\x01`\x01`\xA0\x1B\x03\x16`\x01`\x01`\xA0\x1B\x03\x16\x81R` \x01\x90\x81R` \x01`\0 `@Q\x80a\x01@\x01`@R\x90\x81`\0\x82\x01`\0\x90T\x90a\x01\0\n\x90\x04`\x01`\x01`\xA0\x1B\x03\x16`\x01`\x01`\xA0\x1B\x03\x16`\x01`\x01`\xA0\x1B\x03\x16\x81R` \x01`\x01\x82\x01T\x81R` \x01`\x02\x82\x01T\x81R` \x01`\x03\x82\x01T\x81R` \x01`\x04\x82\x01T\x81R` \x01`\x05\x82\x01T\x81R` \x01`\x06\x82\x01T\x81R` \x01`\x07\x82\x01T\x81R` \x01`\x08\x82\x01T\x81R` \x01`\t\x82\x01\x80Ta\x16\x8C\x90aFHV[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\x16\xB8\x90aFHV[\x80\x15a\x17\x05W\x80`\x1F\x10a\x16\xDAWa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\x17\x05V[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\x16\xE8W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81RPP\x90P`\0`\x04\x81\x11\x15a\x17#Wa\x17#aC\x89V[\x82Q`\x04\x81\x11\x15a\x176Wa\x176aC\x89V[\x03a\x17IW`\0\x80\x93P\x93PPPa\x0C\x9CV[`\x04\x82Q`\x04\x81\x11\x15a\x17^Wa\x17^aC\x89V[\x03a\x17rW`\x04`\0\x93P\x93PPPa\x0C\x9CV[`\0a\x17}\x87a1\xBFV[\x90P`\0\x83Q`\x04\x81\x11\x15a\x17\x94Wa\x17\x94aC\x89V[\x14\x15\x80\x15a\x17\xA0WP\x80\x15[\x15a\x17\xB5W`\x02`\0\x94P\x94PPPPa\x0C\x9CV[\x81`\xC0\x01Q\x81\x03a\x17\xCEW`\x01\x94P\x92Pa\x0C\x9C\x91PPV[\x80\x15\x80\x15\x90a\x17\xE0WP\x81`\xC0\x01Q\x81\x10[\x15a\x17\xF3W`\x03\x94P\x92Pa\x0C\x9C\x91PPV[P`\0\x96\x87\x96P\x94PPPPPV[3`\0\x81\x81Ra\x01\xF4` R`@\x90 \x80T`\x01`\x01`\xA0\x1B\x03\x16\x15\x80a\x187WP\x80`\t\x01\x80Ta\x183\x90aFHV[\x15\x90P[\x15a\x18UW`@Qc\x1E\x1D\n\xB5`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x82\x81`\x06\x01`\0\x82\x82Ta\x18i\x91\x90aG\xF8V[\x90\x91UPP`@Q\x83\x81R`\x01`\x01`\xA0\x1B\x03\x83\x16\x90\x7F \x98X\xCE\xC2\x8CQ\x8A\xEAD\xAA?\xA7\n\x93\"S\xF8\xBD\xF7j\x1C\x9A\x0B\x08\"j\x13\xE6\x975\xA3\x90` \x01a\x14bV[a\x18\xB1a,\xBCV[3`\0\x81\x81Ra\x01\xF4` \x90\x81R`@\x80\x83 \x81Qa\x01@\x81\x01\x83R\x81T`\x01`\x01`\xA0\x1B\x03\x16\x81R`\x01\x82\x01T\x93\x81\x01\x93\x90\x93R`\x02\x81\x01T\x91\x83\x01\x91\x90\x91R`\x03\x81\x01T``\x83\x01R`\x04\x81\x01T`\x80\x83\x01R`\x05\x81\x01T`\xA0\x83\x01R`\x06\x81\x01T`\xC0\x83\x01R`\x07\x81\x01T`\xE0\x83\x01R`\x08\x81\x01Ta\x01\0\x83\x01R`\t\x81\x01\x80Ta\x01 \x84\x01\x91\x90a\x19E\x90aFHV[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\x19q\x90aFHV[\x80\x15a\x19\xBEW\x80`\x1F\x10a\x19\x93Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\x19\xBEV[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\x19\xA1W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81RPP\x90P\x80`@\x01Q`\0\x14a\x19\xEEW`@Qc\xF8\xC20S`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[` \x81\x01Qa\x1A)\x90`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x90\x85\x90a37V[`\x01`\x01`\xA0\x1B\x03\x82\x16`\0\x90\x81Ra\x01\xF4` R`@\x81 \x80T`\x01`\x01`\xA0\x1B\x03\x19\x16\x81U`\x01\x81\x01\x82\x90U`\x02\x81\x01\x82\x90U`\x03\x81\x01\x82\x90U`\x04\x81\x01\x82\x90U`\x05\x81\x01\x82\x90U`\x06\x81\x01\x82\x90U`\x07\x81\x01\x82\x90U`\x08\x81\x01\x82\x90U\x90a\x1A\x96`\t\x83\x01\x82a?\xA4V[PP`@Q`\x01`\x01`\xA0\x1B\x03\x83\x16\x90\x7F\x9F70\xAD\xE9K\xE5\xCE?\xAD\x97;\x88\x8At\x86j:\x91]\0\x8E\x8C\xBD\xE2\x13\x82\xB91\xB6|c\x90`\0\x90\xA2PPa\x1A\xE5`\x01`\0\x80Q` aK'\x839\x81Q\x91RUV[PV[a\x01\xF4` R`\0\x90\x81R`@\x90 \x80T`\x01\x82\x01T`\x02\x83\x01T`\x03\x84\x01T`\x04\x85\x01T`\x05\x86\x01T`\x06\x87\x01T`\x07\x88\x01T`\x08\x89\x01T`\t\x8A\x01\x80T`\x01`\x01`\xA0\x1B\x03\x90\x9A\x16\x9A\x98\x99\x97\x98\x96\x97\x95\x96\x94\x95\x93\x94\x92\x93\x91\x92\x91a\x1BM\x90aFHV[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\x1By\x90aFHV[\x80\x15a\x1B\xC6W\x80`\x1F\x10a\x1B\x9BWa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\x1B\xC6V[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\x1B\xA9W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x90P\x8AV[`\0\x91\x82R`\0\x80Q` aK\x07\x839\x81Q\x91R` \x90\x81R`@\x80\x84 `\x01`\x01`\xA0\x1B\x03\x93\x90\x93\x16\x84R\x91\x90R\x90 T`\xFF\x16\x90V[a\x0B\xFB3\x85\x85\x85\x85a3hV[3`\0\x81\x81Ra\x01\xF4` R`@\x90 \x80T`\x01`\x01`\xA0\x1B\x03\x16\x15\x80a\x1CJWP\x80`\t\x01\x80Ta\x1CF\x90aFHV[\x15\x90P[\x15a\x1ChW`@Qc\x1E\x1D\n\xB5`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[g\r\xE0\xB6\xB3\xA7d\0\0\x81`\x08\x01T\x14a\x1C\x94W`@Qc\x07\xECv9`\xE4\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[g\r\xE0\xB6\xB3\xA7d\0\0\x83\x10a\x1C\xBCW`@Qc\xCA^b/`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0g\r\xE0\xB6\xB3\xA7d\0\0\x82`\x06\x01T\x85a\x1C\xD7\x91\x90aG\xACV[a\x1C\xE1\x91\x90aG\xC3V[\x90P\x81`\x02\x01T\x81\x11a\x1D\x07W`@Qc\xCA^b/`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x80\x82`\x06\x01Ta\x1D\x17\x91\x90aG\xE5V[`\0\x03a\x1D7W`@Qc\x1E\x1D\n\xB5`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x08\x82\x01\x84\x90Ua\x1DI`\x01CaG\xF8V[`\x01`\x01`\xA0\x1B\x03\x84\x16`\0\x81\x81Ra\x01\xF7` R`@\x90\x81\x90 \x92\x90\x92U\x90Q\x7Fv\x12,\xFD_V[P\x90P`\0\x81`\x04\x81\x11\x15a\x1D\xD4Wa\x1D\xD4aC\x89V[\x14\x80a\x1D\xF1WP`\x01\x81`\x04\x81\x11\x15a\x1D\xEFWa\x1D\xEFaC\x89V[\x14[\x15a\x1E\x0FW`@Qc\x1C\x0E\xC29`\xE2\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\x01`\xA0\x1B\x03\x85\x16`\0\x90\x81Ra\x01\xF4` \x90\x81R`@\x80\x83 a\x01\xF5\x83R\x81\x84 \x88\x85R\x90\x92R\x82 `\x01\x81\x01T`\x04\x83\x01\x80T\x93\x94\x92\x93\x91\x92\x88\x92a\x1EY\x90\x84\x90aG\xE5V[\x92PP\x81\x90UP\x80\x83`\x03\x01`\0\x82\x82Ta\x1Et\x91\x90aG\xE5V[\x90\x91UPP`@Q\x86\x81R`\x01`\x01`\xA0\x1B\x03\x89\x16\x90\x7F8_\xDC$)T\x16\xE3W\x12\x7F\xE2qs\x80XA\x1F`\xF8\x84|\x15\xC5X\xAC\xBC\x067&\xA6i\x90` \x01`@Q\x80\x91\x03\x90\xA2\x87`\x01`\x01`\xA0\x1B\x03\x16\x7F\x0Bi \xA1i\xFB\x88\x9C\x15T\x91\x06\xAE\xE0p\xDA\x98\x18kz\xB4\x06\xDD\x93\x84\xA0\xD3\x18\x99\xFD\xF0\x8A\x82`@Qa\x1E\xF2\x91\x81R` \x01\x90V[`@Q\x80\x91\x03\x90\xA2`\x04\x82\x01\x80T\x90`\0a\x1F\x0C\x83aH\x0BV[\x91\x90PUPPPPPPPPPV[a\x1A\xE53\x82a*cV[`\0a\x1F/a,\xBCV[`\x01`\x01`\xA0\x1B\x03\x83\x16`\0\x90\x81Ra\x01\xF4` R`@\x90 `\t\x81\x01\x80Ta\x1FW\x90aFHV[\x15\x90P\x80a\x1FmWP\x80T`\x01`\x01`\xA0\x1B\x03\x16\x15[\x15a\x1F\x8BW`@QcdF\xF9\x17`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x82`\0\x03a\x1F\xACW`@Qc\x1E\x1D\n\xB5`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x1F\xE1\x7F\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`\x01`\x01`\xA0\x1B\x03\x1630\x86a,\xF4V[\x82\x81`\x01\x01`\0\x82\x82Ta\x1F\xF5\x91\x90aG\xF8V[\x90\x91UPP`@Q\x83\x81R`\x01`\x01`\xA0\x1B\x03\x85\x16\x90\x7F\xB6\xBE#\x16\x85\x06\xA1\xCEb\xCCo\x933\x9Fg\x10\xE0\x98De\x17\n\xB5-\xF8\xEC\xF7\xDA8\xB3E\x84\x90` \x01`@Q\x80\x91\x03\x90\xA2`\x01\x01T\x90Pa\x08q`\x01`\0\x80Q` aK'\x839\x81Q\x91RUV[a ]a,\xBCV[`\0\x80Q` aJ\xC7\x839\x81Q\x91Ra u\x81a.\xD4V[`\0\x80a \x82\x86\x86a\x15>V[\x90\x92P\x90P`\x01\x82`\x04\x81\x11\x15a \x9BWa \x9BaC\x89V[\x14\x80a \xB8WP`\x03\x82`\x04\x81\x11\x15a \xB6Wa \xB6aC\x89V[\x14[a \xD5W`@QcC\x9FL\xA7`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\x01`\xA0\x1B\x03\x86\x16`\0\x90\x81Ra\x01\xF4` \x90\x81R`@\x80\x83 a\x01\xF5\x83R\x81\x84 \x89\x85R\x90\x92R\x90\x91 `\x01\x81\x01T\x83\x10\x15a!'W`@Qc\x01\x19\"\xB7`\xE3\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`d\x81`\x04\x01T\x11\x15a!MW`@Qc\xCA\xBDP\xD7`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0a!X\x89a6LV[\x90P\x86\x81\x10\x15a!{W`@Qcp1\x8A1`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0\x82`\x01\x01T\x90P\x87\x84`\x04\x01`\0\x82\x82Ta!\x98\x91\x90aG\xF8V[\x92PP\x81\x90UP\x80\x84`\x03\x01`\0\x82\x82Ta!\xB3\x91\x90aG\xF8V[\x90\x91UPP`@Q\x88\x81R`\x01`\x01`\xA0\x1B\x03\x8B\x16\x90\x7F\xED.\xDCnq\xBE\xB93\xF1\xE0\xC8\xCC\xFD\xF8E%\x8F7\x10\xD6l6t\xACP\xF3\x90\x08$c\xF7\xF0\x90` \x01`@Q\x80\x91\x03\x90\xA2\x89`\x01`\x01`\xA0\x1B\x03\x16\x7F\xD2\x9B\x9A\xDE\xE3+\xAF\x11\xBE\x04\0\x0Bsc\x99c\xD2\xC7n\x89\x9Fh0\xD3\xB5\xC1q]\xF1}\x82\xBD\x82`@Qa\"1\x91\x81R` \x01\x90V[`@Q\x80\x91\x03\x90\xA2`\x04\x83\x01\x80T\x90`\0a\"K\x83aF/V[\x91\x90PUPPPPPPPPa\x08\xB6`\x01`\0\x80Q` aK'\x839\x81Q\x91RUV[`\0[\x81\x81\x10\x15a\x08\xB6Wa\"\x9B3\x84\x84\x84\x81\x81\x10a\"\x8FWa\"\x8FaF\x03V[\x90P` \x02\x015a7\xBBV[\x80a\"\xA5\x81aF/V[\x91PPa\"qV[a\"\xB6\x82a\x0E5V[a\"\xBF\x81a.\xD4V[a\x0B\xFB\x83\x83a/\x83V[3`\0\x81\x81Ra\x01\xF4` \x90\x81R`@\x80\x83 a\x01\xF5\x83R\x81\x84 \x8D\x85R\x90\x92R\x80\x83 \x81Q`\xA0\x81\x01\x90\x92R\x80T\x92\x93\x92\x82\x90`\xFF\x16`\x04\x81\x11\x15a#\x11Wa#\x11aC\x89V[`\x04\x81\x11\x15a#\"Wa#\"aC\x89V[\x81R`\x01\x82\x01T` \x82\x01R`\x02\x82\x01T`@\x82\x01R`\x03\x82\x01T``\x82\x01R`\x04\x90\x91\x01T`\x80\x90\x91\x01R\x82T\x90\x91P`\x01`\x01`\xA0\x1B\x03\x16\x15\x80a#fWP\x87\x15[\x80a#oWP\x89\x15[\x15a#\x8DW`@Qc\x1E\x1D\n\xB5`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0a#\x98\x8Ca8\x8DV[P\x90P`\x01`\x01`\xA0\x1B\x03\x81\x16a#\xC2W`@Qc\x9D\xB8\xD5\xB1`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0\x82Q`\x04\x81\x11\x15a#\xD7Wa#\xD7aC\x89V[\x14a#\xF5W`@Qc+[X\x0F`\xE2\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x8A\x83`\x02\x01`\0\x82\x82Ta$\t\x91\x90aG\xF8V[\x90\x91UPP`\x06\x83\x01T`\x02\x84\x01T\x11\x15a$7W`@Qc\x07\xD9\x93\x89`\xE4\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x05\x83\x01\x80T\x90`\0a$I\x83aF/V[\x90\x91UPP`@\x80Q`\xA0\x81\x01\x90\x91R\x80`\x01\x81R` \x01\x8C\x81R` \x01\x8B\x81R` \x01\x8A\x81R` \x01`\0\x81RPa\x01\xF5`\0\x86`\x01`\x01`\xA0\x1B\x03\x16`\x01`\x01`\xA0\x1B\x03\x16\x81R` \x01\x90\x81R` \x01`\0 `\0\x8E\x81R` \x01\x90\x81R` \x01`\0 `\0\x82\x01Q\x81`\0\x01`\0a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83`\x04\x81\x11\x15a$\xD9Wa$\xD9aC\x89V[\x02\x17\x90UP` \x82\x01Q`\x01\x82\x01U`@\x82\x01Q`\x02\x82\x01U``\x82\x01Q`\x03\x82\x01U`\x80\x90\x91\x01Q`\x04\x90\x91\x01U\x87\x15a%\x1BWa%\x1B\x84\x8D\x89\x89\x89a3hV[\x8B\x84`\x01`\x01`\xA0\x1B\x03\x16\x7F\x04Y\xABWU\x08\xB4\xA5\x89O{\x13\x87\xBF6-\x03!;;\xF81\xDAE&!\x8C3\xE4\xA9\x06\xD8\x8D`@Qa%W\x91\x81R` \x01\x90V[`@Q\x80\x91\x03\x90\xA3PPPPPPPPPPPPV[a\x1A\xE53\x82a7\xBBV[3`\0\x81\x81Ra\x01\xF4` R`@\x90 \x80T`\x01`\x01`\xA0\x1B\x03\x16\x15\x80a%\xACWP\x80`\t\x01\x80Ta%\xA8\x90aFHV[\x15\x90P[\x15a%\xCAW`@Qc\x1E\x1D\n\xB5`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[g\r\xE0\xB6\xB3\xA7d\0\0\x81`\x08\x01T\x14a%\xF6W`@Qc\x07\xECv9`\xE4\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[g\r\xE0\xB6\xB3\xA7d\0\0\x83\x10a&\x1EW`@Qc\xCA^b/`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x07\x81\x01\x83\x90U`\x01\x81\x01T`\0\x90g\r\xE0\xB6\xB3\xA7d\0\0\x90a&A\x90\x86aG\xACV[a&K\x91\x90aG\xC3V[\x90P\x80\x82`\x01\x01Ta&]\x91\x90aG\xE5V[`\0\x03a&}W`@Qc\x1E\x1D\n\xB5`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a&\x88`\x01CaG\xF8V[`\x01`\x01`\xA0\x1B\x03\x84\x16`\0\x81\x81Ra\x01\xF6` R`@\x90\x81\x90 \x92\x90\x92U\x90Q\x7F\x13\x9A\xD7\xA0\xC3\xF6\xC0\xAD\x0F\x0F\xC5+vx`jq\xFF\x08\x1B\x99&\xA5do\xE5:\x8Eg\xC6\x8Ar\x90a\x12#\x90\x87\x81R` \x01\x90V[`\0`\0\x80Q` aJ\xC7\x839\x81Q\x91Ra&\xF2\x81a.\xD4V[`\0a&\xFE\x87\x87a\x15>V[P\x90P`\0\x81`\x04\x81\x11\x15a'\x15Wa'\x15aC\x89V[\x14\x80a'2WP`\x01\x81`\x04\x81\x11\x15a'0Wa'0aC\x89V[\x14[\x15a'OW`@Qb\xED=\xF3`\xE8\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\x01`\xA0\x1B\x03\x87\x16`\0\x90\x81Ra\x01\xF4` \x90\x81R`@\x80\x83 a\x01\xF5\x83R\x81\x84 \x8A\x85R\x90\x92R\x82 `\x04\x81\x01\x80T\x92\x93\x91\x92\x91a'\x8F\x83aH\x0BV[\x91\x90PUP\x86\x82`\x01\x01`\0\x82\x82Ta'\xA8\x91\x90aG\xE5V[\x92PP\x81\x90UP\x86\x82`\x04\x01`\0\x82\x82Ta'\xC3\x91\x90aG\xE5V[\x90\x91UPP`\x01\x81\x01T`\x03\x83\x01\x80T`\0\x90a'\xE1\x90\x84\x90aG\xE5V[\x90\x91UPa(\x1B\x90P`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x87\x89a37V[P`\x01\x01T\x97\x96PPPPPPPV[a(3a,\xBCV[3`\0\x81\x81Ra\x01\xF4` R`@\x90 `\t\x81\x01\x80Ta(R\x90aFHV[\x15\x90P\x80a(hWP\x80T`\x01`\x01`\xA0\x1B\x03\x16\x15[\x15a(\x86W`@QcdF\xF9\x17`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[g\r\xE0\xB6\xB3\xA7d\0\0\x81`\x07\x01T\x03a(\xB2W`@QcYF\x0E\x07`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0g\r\xE0\xB6\xB3\xA7d\0\0\x82`\x01\x01T\x83`\x07\x01Ta(\xD1\x91\x90aG\xACV[a(\xDB\x91\x90aG\xC3V[\x90P`\0\x81\x83`\x01\x01Ta(\xEF\x91\x90aG\xE5V[\x90P\x82`\x04\x01T\x82\x10\x15a)\x16W`@Qcp1\x8A1`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a)J`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x86\x83a37V[`\x01\x83\x01\x82\x90Ug\r\xE0\xB6\xB3\xA7d\0\0`\x07\x84\x01U`\x01`\x01`\xA0\x1B\x03\x84\x16`\0\x90\x81Ra\x01\xF6` R`@\x90 TC\x10\x80\x15\x90a)\xA0WP`\x01`\x01`\xA0\x1B\x03\x84\x16`\0\x90\x81Ra\x01\xF6` R`@\x90 T\x15\x15[a)\xBDW`@Qc8l\xF4\x07`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\x01`\xA0\x1B\x03\x84\x16`\0\x81\x81Ra\x01\xF6` R`@\x80\x82 \x91\x90\x91UQ\x7F\xE5+=`\0\xFD[PPPP`@Q=`\0\x82>`\x1F=\x90\x81\x01`\x1F\x19\x16\x82\x01`@Ra*\xD6\x91\x90\x81\x01\x90aHgV[P\x94\x95PP`\x01`\x01`\xA0\x1B\x03\x85\x16\x93Pa+\x08\x92PPPW`@Qc\x9D\xB8\xD5\xB1`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\x01`\xA0\x1B\x03\x83\x16`\0\x90\x81Ra\x01\xF5` \x90\x81R`@\x80\x83 \x85\x84R\x90\x91R\x80\x82 \x81Q`\xA0\x81\x01\x90\x92R\x80T\x82\x90`\xFF\x16`\x04\x81\x11\x15a+NWa+NaC\x89V[`\x04\x81\x11\x15a+_Wa+_aC\x89V[\x81R`\x01\x82\x01T` \x82\x01R`\x02\x82\x01T`@\x82\x01R`\x03\x82\x01T``\x82\x01R`\x04\x90\x91\x01T`\x80\x90\x91\x01R\x90P`\0\x81Q`\x04\x81\x11\x15a+\xA2Wa+\xA2aC\x89V[\x03a+\xC0W`@Qc\x04\xC9\xDE\x83`\xE3\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x80\x81\x01Q\x15a+\xE3W`@Qc\x02\xE0}\x87`\xE6\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0a\x01\xF4`\0\x86`\x01`\x01`\xA0\x1B\x03\x16`\x01`\x01`\xA0\x1B\x03\x16\x81R` \x01\x90\x81R` \x01`\0 \x90P\x81` \x01Q\x81`\x02\x01`\0\x82\x82Ta,%\x91\x90aG\xE5V[\x92PP\x81\x90UP`\x01\x81`\x05\x01`\0\x82\x82Ta,A\x91\x90aG\xE5V[\x90\x91UPP`\x01`\x01`\xA0\x1B\x03\x85\x16`\0\x81\x81Ra\x01\xF5` \x90\x81R`@\x80\x83 \x88\x84R\x90\x91R\x80\x82 \x80T`\xFF\x19\x16\x81U`\x01\x81\x01\x83\x90U`\x02\x81\x01\x83\x90U`\x03\x81\x01\x83\x90U`\x04\x01\x82\x90UQ\x86\x92\x91\x7F\x83\x1C\xD5\xB7S\x83\x80\xB0\xA2\xA3\x14\x14\xD64\xECBq\x16\x07V\x84\xA2v\x82\x8A\xB4\xD2ut\xA2\xDF\xDF\x91\xA3PPPPPV[`\0\x80Q` aK'\x839\x81Q\x91R\x80T`\x01\x19\x01a,\xEEW`@Qc>\xE5\xAE\xB5`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x02\x90UV[`@Q`\x01`\x01`\xA0\x1B\x03\x84\x81\x16`$\x83\x01R\x83\x81\x16`D\x83\x01R`d\x82\x01\x83\x90Ra\x0B\xFB\x91\x86\x91\x82\x16\x90c#\xB8r\xDD\x90`\x84\x01[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x91P`\xE0\x1B` \x82\x01\x80Q`\x01`\x01`\xE0\x1B\x03\x83\x81\x83\x16\x17\x83RPPPPa9\x1AV[`\0\x80`\0\x80\x84\x80` \x01\x90Q\x81\x01\x90a-u\x91\x90aH\xF2V[PPP\x94P\x94P\x94PPPa-\x8B\x83\x83\x83a9}V[\x95\x94PPPPPV[`@\x80Q` \x81\x01\x82\x90R`\x03``\x82\x01Rbivs`\xE8\x1B`\x80\x82\x01R\x90\x81\x01\x82\x90R`\0\x90`\xA0\x01[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 \x90P\x91\x90PV[`\0\x84\x82`@Q` \x01a-\xF1\x92\x91\x90aI\xE0V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 \x90P`\0a.\x14\x82a9\xB6V[\x90P`\0a.X\x82\x87\x87\x80\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x93\x92\x91\x90\x81\x81R` \x01\x83\x83\x80\x82\x847`\0\x92\x01\x91\x90\x91RPa9\xF1\x92PPPV[\x90Pa.c\x87a.\xA4V[`\x01`\x01`\xA0\x1B\x03\x16\x81`\x01`\x01`\xA0\x1B\x03\x16\x14a\x13\xC2W`@Qc(\x80\xCB\x7F`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x82\x16`\x04\x82\x01R`$\x01[`@Q\x80\x91\x03\x90\xFD[`\0\x80\x82\x80` \x01\x90Q\x81\x01\x90a.\xBB\x91\x90aH\xF2V[PPPPPP\x91PPa.\xCD\x81a:\x1BV[\x93\x92PPPV[a\x1A\xE5\x813a:KV[`\0`\0\x80Q` aK\x07\x839\x81Q\x91Ra.\xF9\x84\x84a\x1B\xD0V[a/yW`\0\x84\x81R` \x82\x81R`@\x80\x83 `\x01`\x01`\xA0\x1B\x03\x87\x16\x84R\x90\x91R\x90 \x80T`\xFF\x19\x16`\x01\x17\x90Ua//3\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x83`\x01`\x01`\xA0\x1B\x03\x16\x85\x7F/\x87\x88\x11~~\xFF\x1D\x82\xE9&\xECyI\x01\xD1|x\x02JP'\t@0E@\xA73eo\r`@Q`@Q\x80\x91\x03\x90\xA4`\x01\x91PPa\x08qV[`\0\x91PPa\x08qV[`\0`\0\x80Q` aK\x07\x839\x81Q\x91Ra/\x9E\x84\x84a\x1B\xD0V[\x15a/yW`\0\x84\x81R` \x82\x81R`@\x80\x83 `\x01`\x01`\xA0\x1B\x03\x87\x16\x80\x85R\x92R\x80\x83 \x80T`\xFF\x19\x16\x90UQ3\x92\x87\x91\x7F\xF69\x1F\\2\xD9\xC6\x9D*G\xEAg\x0BD)t\xB595\xD1\xED\xC7\xFDd\xEB!\xE0G\xA89\x17\x1B\x91\x90\xA4`\x01\x91PPa\x08qV[a0\x07a:\x84V[V[0`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x14\x80a0\x90WP\x7F\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`\x01`\x01`\xA0\x1B\x03\x16a0\x84`\0\x80Q` aJ\xE7\x839\x81Q\x91RT`\x01`\x01`\xA0\x1B\x03\x16\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x14\x15[\x15a0\x07W`@Qcp>F\xDD`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0a\x14\x8A\x81a.\xD4V[\x81`\x01`\x01`\xA0\x1B\x03\x16cR\xD1\x90-`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x92PPP\x80\x15a1\x13WP`@\x80Q`\x1F=\x90\x81\x01`\x1F\x19\x16\x82\x01\x90\x92Ra1\x10\x91\x81\x01\x90aJ\nV[`\x01[a1;W`@QcL\x9C\x8C\xE3`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x83\x16`\x04\x82\x01R`$\x01a.\x9BV[`\0\x80Q` aJ\xE7\x839\x81Q\x91R\x81\x14a1lW`@Qc*\x87Ri`\xE2\x1B\x81R`\x04\x81\x01\x82\x90R`$\x01a.\x9BV[a\x08\xB6\x83\x83a:\xCDV[0`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x14a0\x07W`@Qcp>F\xDD`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\x01`\xA0\x1B\x03\x80\x82\x16`\0\x90\x81Ra\x01\xF4` \x90\x81R`@\x80\x83 \x81Qa\x01@\x81\x01\x83R\x81T\x90\x95\x16\x85R`\x01\x81\x01T\x92\x85\x01\x92\x90\x92R`\x02\x82\x01T\x90\x84\x01R`\x03\x81\x01T``\x84\x01R`\x04\x81\x01T`\x80\x84\x01R`\x05\x81\x01T`\xA0\x84\x01R`\x06\x81\x01T`\xC0\x84\x01R`\x07\x81\x01T`\xE0\x84\x01R`\x08\x81\x01Ta\x01\0\x84\x01R`\t\x81\x01\x80T\x92\x93\x84\x93\x90\x92\x91a\x01 \x84\x01\x91a2Z\x90aFHV[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta2\x86\x90aFHV[\x80\x15a2\xD3W\x80`\x1F\x10a2\xA8Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a2\xD3V[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a2\xB6W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81RPP\x90P`\0g\r\xE0\xB6\xB3\xA7d\0\0\x82a\x01\0\x01Q\x83`\xC0\x01Qa2\xFE\x91\x90aG\xACV[a3\x08\x91\x90aG\xC3V[\x90P\x81``\x01Q\x81\x10\x15a3 WP`\0\x93\x92PPPV[``\x82\x01Qa3/\x90\x82aG\xE5V[\x94\x93PPPPV[`@Q`\x01`\x01`\xA0\x1B\x03\x83\x81\x16`$\x83\x01R`D\x82\x01\x83\x90Ra\x08\xB6\x91\x85\x91\x82\x16\x90c\xA9\x05\x9C\xBB\x90`d\x01a-)V[`\x01`\x01`\xA0\x1B\x03\x80\x86\x16`\0\x90\x81Ra\x01\xF4` \x90\x81R`@\x80\x83 \x81Qa\x01@\x81\x01\x83R\x81T\x90\x95\x16\x85R`\x01\x81\x01T\x92\x85\x01\x92\x90\x92R`\x02\x82\x01T\x90\x84\x01R`\x03\x81\x01T``\x84\x01R`\x04\x81\x01T`\x80\x84\x01R`\x05\x81\x01T`\xA0\x84\x01R`\x06\x81\x01T`\xC0\x84\x01R`\x07\x81\x01T`\xE0\x84\x01R`\x08\x81\x01Ta\x01\0\x84\x01R`\t\x81\x01\x80T\x92\x93\x92a\x01 \x84\x01\x91\x90a4\0\x90aFHV[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta4,\x90aFHV[\x80\x15a4yW\x80`\x1F\x10a4NWa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a4yV[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a4\\W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPP\x91\x90\x92RPP\x81Q\x91\x92PP`\x01`\x01`\xA0\x1B\x03\x16a4\xAEW`@Qc\x1E\x1D\n\xB5`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0a4\xB9\x86a8\x8DV[\x91PPa4\xC5\x81a;#V[a4\xE2W`@Qc!\xA4\x8B\x8B`\xE2\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x7F\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`\x01`\x01`\xA0\x1B\x03\x16ck[!\xA6a5\x1A\x87a-[V[a5#\x89a;XV[`@Q`\x01`\x01`\xE0\x1B\x03\x19`\xE0\x85\x90\x1B\x16\x81R`\x04\x81\x01\x92\x90\x92R`$\x82\x01R`D\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a5dW=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a5\x88\x91\x90aG\x8FV[a5\xA5W`@Qc\xC4e\xE6\x9D`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0a5\xB0\x86a;\x87V[\x90Pa5\xBE\x86\x86\x86\x8Ba-\xDCV[`@Qc4\xFE\xDEe`\xE1\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x90ci\xFD\xBC\xCA\x90a6\x10\x90\x8B\x90\x8B\x90\x86\x90\x8C\x90`\x04\x01aJ#V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a6*W`\0\x80\xFD[PZ\xF1\x15\x80\x15a6>W=`\0\x80>=`\0\xFD[PPPPPPPPPPPPV[`\x01`\x01`\xA0\x1B\x03\x80\x82\x16`\0\x90\x81Ra\x01\xF4` \x90\x81R`@\x80\x83 \x81Qa\x01@\x81\x01\x83R\x81T\x90\x95\x16\x85R`\x01\x81\x01T\x92\x85\x01\x92\x90\x92R`\x02\x82\x01T\x90\x84\x01R`\x03\x81\x01T``\x84\x01R`\x04\x81\x01T`\x80\x84\x01R`\x05\x81\x01T`\xA0\x84\x01R`\x06\x81\x01T`\xC0\x84\x01R`\x07\x81\x01T`\xE0\x84\x01R`\x08\x81\x01Ta\x01\0\x84\x01R`\t\x81\x01\x80T\x92\x93\x84\x93\x90\x92\x91a\x01 \x84\x01\x91a6\xE7\x90aFHV[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta7\x13\x90aFHV[\x80\x15a7`W\x80`\x1F\x10a75Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a7`V[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a7CW\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81RPP\x90P`\0g\r\xE0\xB6\xB3\xA7d\0\0\x82`\xE0\x01Q\x83` \x01Qa7\x8A\x91\x90aG\xACV[a7\x94\x91\x90aG\xC3V[\x90P\x81`\x80\x01Q\x81\x10\x15a7\xACWP`\0\x93\x92PPPV[`\x80\x82\x01Qa3/\x90\x82aG\xE5V[`\0a7\xC7\x83\x83a\x15>V[P\x90P`\0\x81`\x04\x81\x11\x15a7\xDEWa7\xDEaC\x89V[\x14\x15\x80\x15a7\xFEWP`\x04\x81`\x04\x81\x11\x15a7\xFBWa7\xFBaC\x89V[\x14\x15[a8\x1BW`@Qc0\x04\x82\x87`\xE2\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\x01`\xA0\x1B\x03\x83\x16`\0\x81\x81Ra\x01\xF5` \x90\x81R`@\x80\x83 \x86\x84R\x90\x91R\x80\x82 \x80T`\xFF\x19\x16`\x04\x17\x81U\x90Q\x90\x92\x85\x92\x90\x91\x7F\xF9\xE1yp\xDFW\xA6\xA8E}\xCB\xB5\xC2\x91gkF1\xD37\xCFv\xB0\xC8\x01\xF6\xB8\xADj|_\x92\x91\x90\xA3\x80`\x04\x01T`\0\x03a\x0B\xFBWa\x0B\xFB\x84\x84a*cV[a\x01\xF8T`@Qc\xF8\xA9H/`\xE0\x1B\x81R`\x04\x81\x01\x83\x90R`\0\x91\x82\x91\x82\x91\x82\x91`\x01`\x01`\xA0\x1B\x03\x90\x91\x16\x90c\xF8\xA9H/\x90`$\x01`\0`@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a8\xE0W=`\0\x80>=`\0\xFD[PPPP`@Q=`\0\x82>`\x1F=\x90\x81\x01`\x1F\x19\x16\x82\x01`@Ra9\x08\x91\x90\x81\x01\x90aHgV[P\x94\x9A\x93\x99P\x92\x97PPPPPPPPV[`\0a9/`\x01`\x01`\xA0\x1B\x03\x84\x16\x83a;\xAEV[\x90P\x80Q`\0\x14\x15\x80\x15a9TWP\x80\x80` \x01\x90Q\x81\x01\x90a9R\x91\x90aG\x8FV[\x15[\x15a\x08\xB6W`@QcRt\xAF\xE7`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x84\x16`\x04\x82\x01R`$\x01a.\x9BV[`\0\x80\x84\x84\x84`@Q` \x01a9\x95\x93\x92\x91\x90aJgV[`@\x80Q\x80\x83\x03`\x1F\x19\x01\x81R\x91\x90R\x80Q` \x90\x91\x01 \x95\x94PPPPPV[`@Q\x7F\x19Ethereum Signed Message:\n32\0\0\0\0` \x82\x01R`<\x81\x01\x82\x90R`\0\x90`\\\x01a-\xBFV[`\0\x80`\0\x80a:\x01\x86\x86a;\xBCV[\x92P\x92P\x92Pa:\x11\x82\x82a<\tV[P\x90\x94\x93PPPPV[`\0\x81Q`@\x14a:?W`@Qc\xD2\x833]`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[P\x80Q` \x90\x91\x01 \x90V[a:U\x82\x82a\x1B\xD0V[a\x14\x8AW`@Qc\xE2Q}?`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x82\x16`\x04\x82\x01R`$\x81\x01\x83\x90R`D\x01a.\x9BV[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0T`\x01`@\x1B\x90\x04`\xFF\x16a0\x07W`@Qc\x1A\xFC\xD7\x9F`\xE3\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a:\xD6\x82a<\xC2V[`@Q`\x01`\x01`\xA0\x1B\x03\x83\x16\x90\x7F\xBC|\xD7Z \xEE'\xFD\x9A\xDE\xBA\xB3 A\xF7U!M\xBCk\xFF\xA9\x0C\xC0\"[9\xDA.\\-;\x90`\0\x90\xA2\x80Q\x15a;\x1BWa\x08\xB6\x82\x82a='V[a\x14\x8Aa=\x94V[`\0\x81\x15\x80a;QWP\x7F\xCD.f\xBF\x0B\x91\xEE\xED\xC6\xC6H\xAE\x935\xA7\x8D|\x9AJ\xB0\xEF3a*\x82M\x91\xCD\xC6\x8AO!\x82\x14[\x15\x92\x91PPV[`@\x80Q` \x81\x01\x82\x90R`\x03``\x82\x01Rb3\xB2\xB7`\xE9\x1B`\x80\x82\x01R\x90\x81\x01\x82\x90R`\0\x90`\xA0\x01a-\xBFV[```\0\x82\x80` \x01\x90Q\x81\x01\x90a;\x9F\x91\x90aH\xF2V[P\x94\x99\x98PPPPPPPPPV[``a.\xCD\x83\x83`\0a=\xB3V[`\0\x80`\0\x83Q`A\x03a;\xF6W` \x84\x01Q`@\x85\x01Q``\x86\x01Q`\0\x1Aa;\xE8\x88\x82\x85\x85a>PV[\x95P\x95P\x95PPPPa<\x02V[PP\x81Q`\0\x91P`\x02\x90[\x92P\x92P\x92V[`\0\x82`\x03\x81\x11\x15a<\x1DWa<\x1DaC\x89V[\x03a<&WPPV[`\x01\x82`\x03\x81\x11\x15a<:Wa<:aC\x89V[\x03aa=\x84V[``\x91P[P\x91P\x91Pa-\x8B\x85\x83\x83a?\x1FV[4\x15a0\x07W`@Qc\xB3\x98\x97\x9F`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[``\x81G\x10\x15a=\xD8W`@Qc\xCDx`Y`\xE0\x1B\x81R0`\x04\x82\x01R`$\x01a.\x9BV[`\0\x80\x85`\x01`\x01`\xA0\x1B\x03\x16\x84\x86`@Qa=\xF4\x91\x90aJ\xAAV[`\0`@Q\x80\x83\x03\x81\x85\x87Z\xF1\x92PPP=\x80`\0\x81\x14a>1W`@Q\x91P`\x1F\x19`?=\x01\x16\x82\x01`@R=\x82R=`\0` \x84\x01>a>6V[``\x91P[P\x91P\x91Pa>F\x86\x83\x83a?\x1FV[\x96\x95PPPPPPV[`\0\x80\x80\x7F\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF]WnsW\xA4P\x1D\xDF\xE9/Fh\x1B \xA0\x84\x11\x15a>\x8BWP`\0\x91P`\x03\x90P\x82a?\x15V[`@\x80Q`\0\x80\x82R` \x82\x01\x80\x84R\x8A\x90R`\xFF\x89\x16\x92\x82\x01\x92\x90\x92R``\x81\x01\x87\x90R`\x80\x81\x01\x86\x90R`\x01\x90`\xA0\x01` `@Q` \x81\x03\x90\x80\x84\x03\x90\x85Z\xFA\x15\x80\x15a>\xDFW=`\0\x80>=`\0\xFD[PP`@Q`\x1F\x19\x01Q\x91PP`\x01`\x01`\xA0\x1B\x03\x81\x16a?\x0BWP`\0\x92P`\x01\x91P\x82\x90Pa?\x15V[\x92P`\0\x91P\x81\x90P[\x94P\x94P\x94\x91PPV[``\x82a?4Wa?/\x82a?{V[a.\xCDV[\x81Q\x15\x80\x15a?KWP`\x01`\x01`\xA0\x1B\x03\x84\x16;\x15[\x15a?tW`@Qc\x99\x96\xB3\x15`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x85\x16`\x04\x82\x01R`$\x01a.\x9BV[P\x80a.\xCDV[\x80Q\x15a?\x8BW\x80Q\x80\x82` \x01\xFD[`@Qc\n\x12\xF5!`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[P\x80Ta?\xB0\x90aFHV[`\0\x82U\x80`\x1F\x10a?\xC0WPPV[`\x1F\x01` \x90\x04\x90`\0R` `\0 \x90\x81\x01\x90a\x1A\xE5\x91\x90[\x80\x82\x11\x15a?\xEEW`\0\x81U`\x01\x01a?\xDAV[P\x90V[`\0` \x82\x84\x03\x12\x15a@\x04W`\0\x80\xFD[\x815`\x01`\x01`\xE0\x1B\x03\x19\x81\x16\x81\x14a.\xCDW`\0\x80\xFD[`\0\x80` \x83\x85\x03\x12\x15a@/W`\0\x80\xFD[\x825`\x01`\x01`@\x1B\x03\x80\x82\x11\x15a@FW`\0\x80\xFD[\x81\x85\x01\x91P\x85`\x1F\x83\x01\x12a@ZW`\0\x80\xFD[\x815\x81\x81\x11\x15a@iW`\0\x80\xFD[\x86` \x82`\x05\x1B\x85\x01\x01\x11\x15a@~W`\0\x80\xFD[` \x92\x90\x92\x01\x96\x91\x95P\x90\x93PPPPV[`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a\x1A\xE5W`\0\x80\xFD[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`@Q`\x1F\x82\x01`\x1F\x19\x16\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a@\xE3Wa@\xE3a@\xA5V[`@R\x91\x90PV[`\0`\x01`\x01`@\x1B\x03\x82\x11\x15aA\x04WaA\x04a@\xA5V[P`\x1F\x01`\x1F\x19\x16` \x01\x90V[`\0\x82`\x1F\x83\x01\x12aA#W`\0\x80\xFD[\x815aA6aA1\x82a@\xEBV[a@\xBBV[\x81\x81R\x84` \x83\x86\x01\x01\x11\x15aAKW`\0\x80\xFD[\x81` \x85\x01` \x83\x017`\0\x91\x81\x01` \x01\x91\x90\x91R\x93\x92PPPV[`\0\x80`\0\x80`\x80\x85\x87\x03\x12\x15aA~W`\0\x80\xFD[\x845aA\x89\x81a@\x90V[\x93P` \x85\x015\x92P`@\x85\x015\x91P``\x85\x015`\x01`\x01`@\x1B\x03\x81\x11\x15aA\xB2W`\0\x80\xFD[aA\xBE\x87\x82\x88\x01aA\x12V[\x91PP\x92\x95\x91\x94P\x92PV[`\0\x80`@\x83\x85\x03\x12\x15aA\xDDW`\0\x80\xFD[\x825aA\xE8\x81a@\x90V[\x94` \x93\x90\x93\x015\x93PPPV[`\0\x80\x83`\x1F\x84\x01\x12aB\x08W`\0\x80\xFD[P\x815`\x01`\x01`@\x1B\x03\x81\x11\x15aB\x1FW`\0\x80\xFD[` \x83\x01\x91P\x83` \x82\x85\x01\x01\x11\x15a\x0C\x9CW`\0\x80\xFD[`\0\x80`\0\x80``\x85\x87\x03\x12\x15aBMW`\0\x80\xFD[\x845\x93P` \x85\x015`\x01`\x01`@\x1B\x03\x80\x82\x11\x15aBkW`\0\x80\xFD[aBw\x88\x83\x89\x01aA\x12V[\x94P`@\x87\x015\x91P\x80\x82\x11\x15aB\x8DW`\0\x80\xFD[PaB\x9A\x87\x82\x88\x01aA\xF6V[\x95\x98\x94\x97P\x95PPPPV[`\0` \x82\x84\x03\x12\x15aB\xB8W`\0\x80\xFD[P5\x91\x90PV[`\0\x80`@\x83\x85\x03\x12\x15aB\xD2W`\0\x80\xFD[\x825\x91P` \x83\x015aB\xE4\x81a@\x90V[\x80\x91PP\x92P\x92\x90PV[`\0\x80`@\x83\x85\x03\x12\x15aC\x02W`\0\x80\xFD[\x825aC\r\x81a@\x90V[\x91P` \x83\x015aB\xE4\x81a@\x90V[`\0` \x82\x84\x03\x12\x15aC/W`\0\x80\xFD[\x815a.\xCD\x81a@\x90V[`\0\x80`@\x83\x85\x03\x12\x15aCMW`\0\x80\xFD[\x825aCX\x81a@\x90V[\x91P` \x83\x015`\x01`\x01`@\x1B\x03\x81\x11\x15aCsW`\0\x80\xFD[aC\x7F\x85\x82\x86\x01aA\x12V[\x91PP\x92P\x92\x90PV[cNH{q`\xE0\x1B`\0R`!`\x04R`$`\0\xFD[`\x05\x81\x10aC\xBDWcNH{q`\xE0\x1B`\0R`!`\x04R`$`\0\xFD[\x90RV[`@\x81\x01aC\xCF\x82\x85aC\x9FV[\x82` \x83\x01R\x93\x92PPPV[`\0[\x83\x81\x10\x15aC\xF7W\x81\x81\x01Q\x83\x82\x01R` \x01aC\xDFV[PP`\0\x91\x01RV[`\0\x81Q\x80\x84RaD\x18\x81` \x86\x01` \x86\x01aC\xDCV[`\x1F\x01`\x1F\x19\x16\x92\x90\x92\x01` \x01\x92\x91PPV[`\0a\x01@`\x01\x80`\xA0\x1B\x03\x8D\x16\x83R\x8B` \x84\x01R\x8A`@\x84\x01R\x89``\x84\x01R\x88`\x80\x84\x01R\x87`\xA0\x84\x01R\x86`\xC0\x84\x01R\x85`\xE0\x84\x01R\x84a\x01\0\x84\x01R\x80a\x01 \x84\x01RaD\x80\x81\x84\x01\x85aD\0V[\x9D\x9CPPPPPPPPPPPPPV[`\0\x80`\0``\x84\x86\x03\x12\x15aD\xA6W`\0\x80\xFD[\x835aD\xB1\x81a@\x90V[\x95` \x85\x015\x95P`@\x90\x94\x015\x93\x92PPPV[`\xA0\x81\x01aD\xD4\x82\x88aC\x9FV[\x85` \x83\x01R\x84`@\x83\x01R\x83``\x83\x01R\x82`\x80\x83\x01R\x96\x95PPPPPPV[` \x81R`\0a.\xCD` \x83\x01\x84aD\0V[\x80\x15\x15\x81\x14a\x1A\xE5W`\0\x80\xFD[`\0\x80`\0\x80`\0\x80`\0\x80`\xE0\x89\x8B\x03\x12\x15aE3W`\0\x80\xFD[\x885\x97P` \x89\x015\x96P`@\x89\x015\x95P``\x89\x015\x94P`\x80\x89\x015aEZ\x81aE\tV[\x93P`\xA0\x89\x015`\x01`\x01`@\x1B\x03\x80\x82\x11\x15aEvW`\0\x80\xFD[aE\x82\x8C\x83\x8D\x01aA\x12V[\x94P`\xC0\x8B\x015\x91P\x80\x82\x11\x15aE\x98W`\0\x80\xFD[PaE\xA5\x8B\x82\x8C\x01aA\xF6V[\x99\x9C\x98\x9BP\x96\x99P\x94\x97\x93\x96\x92\x95\x94PPPV[`\0\x80`\0\x80`\x80\x85\x87\x03\x12\x15aE\xCFW`\0\x80\xFD[\x845aE\xDA\x81a@\x90V[\x93P` \x85\x015\x92P`@\x85\x015\x91P``\x85\x015aE\xF8\x81a@\x90V[\x93\x96\x92\x95P\x90\x93PPV[cNH{q`\xE0\x1B`\0R`2`\x04R`$`\0\xFD[cNH{q`\xE0\x1B`\0R`\x11`\x04R`$`\0\xFD[`\0`\x01\x82\x01aFAWaFAaF\x19V[P`\x01\x01\x90V[`\x01\x81\x81\x1C\x90\x82\x16\x80aF\\W`\x7F\x82\x16\x91P[` \x82\x10\x81\x03aF|WcNH{q`\xE0\x1B`\0R`\"`\x04R`$`\0\xFD[P\x91\x90PV[`\x1F\x82\x11\x15a\x08\xB6W`\0\x81\x81R` \x81 `\x1F\x85\x01`\x05\x1C\x81\x01` \x86\x10\x15aF\xA9WP\x80[`\x1F\x85\x01`\x05\x1C\x82\x01\x91P[\x81\x81\x10\x15aF\xC8W\x82\x81U`\x01\x01aF\xB5V[PPPPPPV[\x81Q`\x01`\x01`@\x1B\x03\x81\x11\x15aF\xE9WaF\xE9a@\xA5V[aF\xFD\x81aF\xF7\x84TaFHV[\x84aF\x82V[` \x80`\x1F\x83\x11`\x01\x81\x14aG2W`\0\x84\x15aG\x1AWP\x85\x83\x01Q[`\0\x19`\x03\x86\x90\x1B\x1C\x19\x16`\x01\x85\x90\x1B\x17\x85UaF\xC8V[`\0\x85\x81R` \x81 `\x1F\x19\x86\x16\x91[\x82\x81\x10\x15aGaW\x88\x86\x01Q\x82U\x94\x84\x01\x94`\x01\x90\x91\x01\x90\x84\x01aGBV[P\x85\x82\x10\x15aG\x7FW\x87\x85\x01Q`\0\x19`\x03\x88\x90\x1B`\xF8\x16\x1C\x19\x16\x81U[PPPPP`\x01\x90\x81\x1B\x01\x90UPV[`\0` \x82\x84\x03\x12\x15aG\xA1W`\0\x80\xFD[\x81Qa.\xCD\x81aE\tV[\x80\x82\x02\x81\x15\x82\x82\x04\x84\x14\x17a\x08qWa\x08qaF\x19V[`\0\x82aG\xE0WcNH{q`\xE0\x1B`\0R`\x12`\x04R`$`\0\xFD[P\x04\x90V[\x81\x81\x03\x81\x81\x11\x15a\x08qWa\x08qaF\x19V[\x80\x82\x01\x80\x82\x11\x15a\x08qWa\x08qaF\x19V[`\0\x81aH\x1AWaH\x1AaF\x19V[P`\0\x19\x01\x90V[`\0\x82`\x1F\x83\x01\x12aH3W`\0\x80\xFD[\x81QaHAaA1\x82a@\xEBV[\x81\x81R\x84` \x83\x86\x01\x01\x11\x15aHVW`\0\x80\xFD[a3/\x82` \x83\x01` \x87\x01aC\xDCV[`\0\x80`\0\x80`\0\x80`\0`\xE0\x88\x8A\x03\x12\x15aH\x82W`\0\x80\xFD[\x87QaH\x8D\x81a@\x90V[\x80\x97PP` \x88\x01Q\x95P`@\x88\x01Q\x94P``\x88\x01Q\x93P`\x80\x88\x01Q\x92P`\xA0\x88\x01QaH\xBB\x81a@\x90V[`\xC0\x89\x01Q\x90\x92P`\x01`\x01`@\x1B\x03\x81\x11\x15aH\xD7W`\0\x80\xFD[aH\xE3\x8A\x82\x8B\x01aH\"V[\x91PP\x92\x95\x98\x91\x94\x97P\x92\x95PV[`\0\x80`\0\x80`\0\x80`\0\x80a\x01\0\x89\x8B\x03\x12\x15aI\x0FW`\0\x80\xFD[\x88Q`\x01`\x01`@\x1B\x03\x80\x82\x11\x15aI&W`\0\x80\xFD[aI2\x8C\x83\x8D\x01aH\"V[\x99P` \x8B\x01Q\x91P\x80\x82\x11\x15aIHW`\0\x80\xFD[aIT\x8C\x83\x8D\x01aH\"V[\x98P`@\x8B\x01Q\x91P\x80\x82\x11\x15aIjW`\0\x80\xFD[aIv\x8C\x83\x8D\x01aH\"V[\x97P``\x8B\x01Q\x91P\x80\x82\x11\x15aI\x8CW`\0\x80\xFD[aI\x98\x8C\x83\x8D\x01aH\"V[\x96P`\x80\x8B\x01Q\x91P\x80\x82\x11\x15aI\xAEW`\0\x80\xFD[PaI\xBB\x8B\x82\x8C\x01aH\"V[\x94PP`\xA0\x89\x01Q\x92P`\xC0\x89\x01Q\x91P`\xE0\x89\x01Q\x90P\x92\x95\x98P\x92\x95\x98\x90\x93\x96PV[`@\x81R`\0aI\xF3`@\x83\x01\x85aD\0V[\x90P`\x01\x80`\xA0\x1B\x03\x83\x16` \x83\x01R\x93\x92PPPV[`\0` \x82\x84\x03\x12\x15aJ\x1CW`\0\x80\xFD[PQ\x91\x90PV[`\x01\x80`\xA0\x1B\x03\x85\x16\x81R\x83` \x82\x01R`\x80`@\x82\x01R`\0aJJ`\x80\x83\x01\x85aD\0V[\x82\x81\x03``\x84\x01RaJ\\\x81\x85aD\0V[\x97\x96PPPPPPPV[`\0\x84QaJy\x81\x84` \x89\x01aC\xDCV[\x84Q\x90\x83\x01\x90aJ\x8D\x81\x83` \x89\x01aC\xDCV[\x84Q\x91\x01\x90aJ\xA0\x81\x83` \x88\x01aC\xDCV[\x01\x95\x94PPPPPV[`\0\x82QaJ\xBC\x81\x84` \x87\x01aC\xDCV[\x91\x90\x91\x01\x92\x91PPV\xFE\xC7\x9BP*\x85%\xF5\x83\xD1)\xC1Ep\xE1|\xE9\xBC\xA2a\x10\xA5\xC4\x1A\xB7\xE2Uo\x95\xE0\x81\xFE\xC56\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC\x02\xDD{\xC7\xDE\xC4\xDC\xEE\xDD\xA7u\xE5\x8D\xD5A\xE0\x8A\x11llS\x81\\\x0B\xD0(\x19/{bh\0\x9Bw\x9B\x17B-\r\xF9\"#\x01\x8B2\xB4\xD1\xFAF\xE0qr=h\x17\xE2Hm\0;\xEC\xC5_\0\xA2dipfsX\"\x12 }\x87\xE1Y\x1A\xB2\xC2a\x19\x05:M\xF3\xE7\xEC\x98\x1CY\xD9H\x8A\xDC_\xED\xEF\x82\xB5\xAC\x83\x10\x98\xC5dsolcC\0\x08\x14\x003"; + const __BYTECODE: &[u8] = b"`\xE0`@R0`\x80R4\x80\x15a\0\x14W`\0\x80\xFD[P`@QaMS8\x03\x80aMS\x839\x81\x01`@\x81\x90Ra\x003\x91a\x01pV[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x80Th\x01\0\0\0\0\0\0\0\0\x81\x04`\xFF\x16\x15\x90`\x01`\x01`@\x1B\x03\x16`\0\x81\x15\x80\x15a\0}WP\x82[\x90P`\0\x82`\x01`\x01`@\x1B\x03\x16`\x01\x14\x80\x15a\0\x99WP0;\x15[\x90P\x81\x15\x80\x15a\0\xA7WP\x80\x15[\x15a\0\xC5W`@Qc\xF9.\xE8\xA9`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x84T`\x01`\x01`@\x1B\x03\x19\x16`\x01\x17\x85U\x83\x15a\0\xF3W\x84T`\xFF`@\x1B\x19\x16h\x01\0\0\0\0\0\0\0\0\x17\x85U[`\x01`\x01`\xA0\x1B\x03\x80\x88\x16`\xA0R\x86\x16`\xC0R\x83\x15a\x01LW\x84T`\xFF`@\x1B\x19\x16\x85U`@Q`\x01\x81R\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x90` \x01`@Q\x80\x91\x03\x90\xA1[PPPPPPPa\x01\xAAV[`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a\x01mW`\0\x80\xFD[PV[`\0\x80`@\x83\x85\x03\x12\x15a\x01\x83W`\0\x80\xFD[\x82Qa\x01\x8E\x81a\x01XV[` \x84\x01Q\x90\x92Pa\x01\x9F\x81a\x01XV[\x80\x91PP\x92P\x92\x90PV[`\x80Q`\xA0Q`\xC0QaK&a\x02-`\09`\0\x81\x81a\x05/\x01R\x81\x81a\x0C\x9B\x01R\x81\x81a\r\x7F\x01R\x81\x81a\x14\xAB\x01R\x81\x81a5\x13\x01Ra6\x04\x01R`\0\x81\x81a\x02\x9D\x01R\x81\x81a\x0Bl\x01R\x81\x81a\x19\xF7\x01R\x81\x81a\x1F\xA2\x01R\x81\x81a(\"\x01Ra)R\x01R`\0\x81\x81a0C\x01R\x81\x81a0l\x01Ra1\xB0\x01RaK&`\0\xF3\xFE`\x80`@R`\x046\x10a\x02QW`\x005`\xE0\x1C\x80cz\x14\xC4c\x11a\x019W\x80c\xA2\x17\xFD\xDF\x11a\0\xB6W\x80c\xD5Gt\x1F\x11a\0zW\x80c\xD5Gt\x1F\x14a\x07\xA6W\x80c\xE2\xFA3\xCE\x14a\x07\xC6W\x80c\xE7\xBC\x96\0\x14a\x07\xE6W\x80c\xE9\xE94\xA0\x14a\x08\x06W\x80c\xEA\xAC\xAE\x94\x14a\x08&W\x80c\xF2\x88\x8D\xBB\x14a\x08FW`\0\x80\xFD[\x80c\xA2\x17\xFD\xDF\x14a\x06\xF3W\x80c\xAD<\xB1\xCC\x14a\x07\x08W\x80c\xAD\xC9w.\x14a\x07FW\x80c\xC4\x92\xEE9\x14a\x07fW\x80c\xD0n\x1F{\x14a\x07\x86W`\0\x80\xFD[\x80c\x92\xEB\x91\xE2\x11a\0\xFDW\x80c\x92\xEB\x91\xE2\x14a\x06\x08W\x80c\x96\xDE\x0E\xEF\x14a\x06(W\x80c\x98*A]\x14a\x06HW\x80c\x9A\x7F\xCA\x8E\x14a\x06hW\x80c\x9F]\xB9\x86\x14a\x06\xD3W`\0\x80\xFD[\x80cz\x14\xC4c\x14a\x04RW\x80c\x81\xC4\\p\x14a\x05qW\x80c\x84\xAC3\xEC\x14a\x05\x92W\x80c\x8C\xFCV\xD8\x14a\x05\xB2W\x80c\x91\xD1HT\x14a\x05\xE8W`\0\x80\xFD[\x80c/\x8FJ;\x11a\x01\xD2W\x80cO\x1E\xF2\x86\x11a\x01\x96W\x80cO\x1E\xF2\x86\x14a\x04\xA7W\x80cR\xD1\x90-\x14a\x04\xBAW\x80cT\x1A\x8C\x18\x14a\x04\xCFW\x80cdmQ\xB4\x14a\x04\xEFW\x80cf\x1D\xE5\xAC\x14a\x05\x1DW\x80cm@Xw\x14a\x05QW`\0\x80\xFD[\x80c/\x8FJ;\x14a\x04\x1DW\x80c6V\x8A\xBE\x14a\x042W\x80c<^\xB5|\x14a\x04RW\x80cH\\\xC9U\x14a\x04gW\x80cM*\xAB\x9A\x14a\x04\x87W`\0\x80\xFD[\x80c!\x80\xDE]\x11a\x02\x19W\x80c!\x80\xDE]\x14a\x03NW\x80c$\x8A\x9C\xA3\x14a\x03nW\x80c+a\x0C-\x14a\x03\x9CW\x80c,\x1F\xBD\x03\x14a\x03\xDBW\x80c//\xF1]\x14a\x03\xFDW`\0\x80\xFD[\x80c\x01\xFF\xC9\xA7\x14a\x02VW\x80c\x04y\xD6D\x14a\x02\x8BW\x80c\x08\xBEk\xAD\x14a\x02\xD7W\x80c\x13m\xFB\xF5\x14a\x02\xF9W\x80c\x1C~\xAEe\x14a\x03\x19W[`\0\x80\xFD[4\x80\x15a\x02bW`\0\x80\xFD[Pa\x02va\x02q6`\x04a?\x84V[a\x08fV[`@Q\x90\x15\x15\x81R` \x01[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x02\x97W`\0\x80\xFD[Pa\x02\xBF\x7F\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\x81V[`@Q`\x01`\x01`\xA0\x1B\x03\x90\x91\x16\x81R` \x01a\x02\x82V[4\x80\x15a\x02\xE3W`\0\x80\xFD[Pa\x02\xF7a\x02\xF26`\x04a?\xAEV[a\x08wV[\0[4\x80\x15a\x03\x05W`\0\x80\xFD[Pa\x02\xF7a\x03\x146`\x04a@\xFBV[a\x08\xB1V[4\x80\x15a\x03%W`\0\x80\xFD[Pa\x039a\x0346`\x04aA]V[a\x0B\xF7V[`@\x80Q\x92\x83R` \x83\x01\x91\x90\x91R\x01a\x02\x82V[4\x80\x15a\x03ZW`\0\x80\xFD[Pa\x02\xF7a\x03i6`\x04aA\xCAV[a\x0C\x99V[4\x80\x15a\x03zW`\0\x80\xFD[Pa\x03\x8Ea\x03\x896`\x04aB=V[a\x0E+V[`@Q\x90\x81R` \x01a\x02\x82V[4\x80\x15a\x03\xA8W`\0\x80\xFD[Pa\x03\xBCa\x03\xB76`\x04aA]V[a\x0EMV[`@\x80Q`\x01`\x01`\xA0\x1B\x03\x90\x93\x16\x83R` \x83\x01\x91\x90\x91R\x01a\x02\x82V[4\x80\x15a\x03\xE7W`\0\x80\xFD[Pa\x03\x8E`\0\x80Q` aJq\x839\x81Q\x91R\x81V[4\x80\x15a\x04\tW`\0\x80\xFD[Pa\x02\xF7a\x04\x186`\x04aBVV[a\x104V[4\x80\x15a\x04)W`\0\x80\xFD[Pa\x02\xF7a\x10PV[4\x80\x15a\x04>W`\0\x80\xFD[Pa\x02\xF7a\x04M6`\x04aBVV[a\x12'V[4\x80\x15a\x04^W`\0\x80\xFD[Pa\x03\x8E`d\x81V[4\x80\x15a\x04sW`\0\x80\xFD[Pa\x02\xF7a\x04\x826`\x04aB\x86V[a\x12ZV[4\x80\x15a\x04\x93W`\0\x80\xFD[Pa\x02\xF7a\x04\xA26`\x04aB\xB4V[a\x13\xC1V[a\x02\xF7a\x04\xB56`\x04aB\xD1V[a\x14eV[4\x80\x15a\x04\xC6W`\0\x80\xFD[Pa\x03\x8Ea\x14\x84V[4\x80\x15a\x04\xDBW`\0\x80\xFD[Pa\x02\xF7a\x04\xEA6`\x04aB=V[a\x14\xA1V[4\x80\x15a\x04\xFBW`\0\x80\xFD[Pa\x05\x0Fa\x05\n6`\x04aA]V[a\x154V[`@Qa\x02\x82\x92\x91\x90aCXV[4\x80\x15a\x05)W`\0\x80\xFD[Pa\x02\xBF\x7F\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\x81V[4\x80\x15a\x05]W`\0\x80\xFD[Pa\x02\xF7a\x05l6`\x04aB=V[a\x17\xF8V[4\x80\x15a\x05}W`\0\x80\xFD[Pa\x01\xF8Ta\x02\xBF\x90`\x01`\x01`\xA0\x1B\x03\x16\x81V[4\x80\x15a\x05\x9EW`\0\x80\xFD[Pa\x02\xF7a\x05\xAD6`\x04aB\xB4V[a\x18\x9FV[4\x80\x15a\x05\xBEW`\0\x80\xFD[Pa\x05\xD2a\x05\xCD6`\x04aB\xB4V[a\x1A\xDEV[`@Qa\x02\x82\x9A\x99\x98\x97\x96\x95\x94\x93\x92\x91\x90aC\xC3V[4\x80\x15a\x05\xF4W`\0\x80\xFD[Pa\x02va\x06\x036`\x04aBVV[a\x1B\xC6V[4\x80\x15a\x06\x14W`\0\x80\xFD[Pa\x02\xF7a\x06#6`\x04aA\xCAV[a\x1B\xFEV[4\x80\x15a\x064W`\0\x80\xFD[Pa\x02\xF7a\x06C6`\x04aB=V[a\x1C\x0BV[4\x80\x15a\x06TW`\0\x80\xFD[Pa\x02\xF7a\x06c6`\x04aD(V[a\x1D\x8AV[4\x80\x15a\x06tW`\0\x80\xFD[Pa\x06\xC2a\x06\x836`\x04aA]V[a\x01\xF5` \x90\x81R`\0\x92\x83R`@\x80\x84 \x90\x91R\x90\x82R\x90 \x80T`\x01\x82\x01T`\x02\x83\x01T`\x03\x84\x01T`\x04\x90\x94\x01T`\xFF\x90\x93\x16\x93\x91\x92\x90\x91\x90\x85V[`@Qa\x02\x82\x95\x94\x93\x92\x91\x90aD]V[4\x80\x15a\x06\xDFW`\0\x80\xFD[Pa\x02\xF7a\x06\xEE6`\x04aB=V[a\x1F\x0CV[4\x80\x15a\x06\xFFW`\0\x80\xFD[Pa\x03\x8E`\0\x81V[4\x80\x15a\x07\x14W`\0\x80\xFD[Pa\x079`@Q\x80`@\x01`@R\x80`\x05\x81R` \x01d\x03R\xE3\x02\xE3`\xDC\x1B\x81RP\x81V[`@Qa\x02\x82\x91\x90aD\x8DV[4\x80\x15a\x07RW`\0\x80\xFD[Pa\x03\x8Ea\x07a6`\x04aA]V[a\x1F\x16V[4\x80\x15a\x07rW`\0\x80\xFD[Pa\x02\xF7a\x07\x816`\x04aD(V[a FV[4\x80\x15a\x07\x92W`\0\x80\xFD[Pa\x02\xF7a\x07\xA16`\x04a?\xAEV[a\"_V[4\x80\x15a\x07\xB2W`\0\x80\xFD[Pa\x02\xF7a\x07\xC16`\x04aBVV[a\"\x94V[4\x80\x15a\x07\xD2W`\0\x80\xFD[Pa\x02\xF7a\x07\xE16`\x04aD\xAEV[a\"\xB0V[4\x80\x15a\x07\xF2W`\0\x80\xFD[Pa\x02\xF7a\x08\x016`\x04aB=V[a%TV[4\x80\x15a\x08\x12W`\0\x80\xFD[Pa\x02\xF7a\x08!6`\x04aB=V[a%^V[4\x80\x15a\x082W`\0\x80\xFD[Pa\x03\x8Ea\x08A6`\x04aETV[a&\x83V[4\x80\x15a\x08RW`\0\x80\xFD[Pa\x02\xF7a\x08a6`\x04aB\xB4V[a(ZV[`\0a\x08q\x82a*]V[\x92\x91PPV[`\0[\x81\x81\x10\x15a\x08\xACWa\x08\xA43\x84\x84\x84\x81\x81\x10a\x08\x98Wa\x08\x98aE\x9EV[\x90P` \x02\x015a*\x92V[`\x01\x01a\x08zV[PPPV[a\x08\xB9a,\xEBV[3`\0\x81\x81Ra\x01\xF4` \x90\x81R`@\x80\x83 \x81Qa\x01@\x81\x01\x83R\x81T`\x01`\x01`\xA0\x1B\x03\x16\x81R`\x01\x82\x01T\x93\x81\x01\x93\x90\x93R`\x02\x81\x01T\x91\x83\x01\x91\x90\x91R`\x03\x81\x01T``\x83\x01R`\x04\x81\x01T`\x80\x83\x01R`\x05\x81\x01T`\xA0\x83\x01R`\x06\x81\x01T`\xC0\x83\x01R`\x07\x81\x01T`\xE0\x83\x01R`\x08\x81\x01Ta\x01\0\x83\x01R`\t\x81\x01\x80Ta\x01 \x84\x01\x91\x90a\tM\x90aE\xB4V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\ty\x90aE\xB4V[\x80\x15a\t\xC6W\x80`\x1F\x10a\t\x9BWa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\t\xC6V[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\t\xA9W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81RPP\x90P\x82Q`\0\x14\x80a\t\xE8WP`\x01`\x01`\xA0\x1B\x03\x86\x16\x15[\x80a\t\xF1WP\x84\x15[\x15a\n\x0FW`@Qc\x1E\x1D\n\xB5`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x80Q`\x01`\x01`\xA0\x1B\x03\x16\x15a\n8W`@QcXt\xF9{`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`@Q\x80a\x01@\x01`@R\x80\x87`\x01`\x01`\xA0\x1B\x03\x16\x81R` \x01\x85\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01\x86\x81R` \x01g\r\xE0\xB6\xB3\xA7d\0\0\x81R` \x01g\r\xE0\xB6\xB3\xA7d\0\0\x81R` \x01\x84\x81RPa\x01\xF4`\0\x84`\x01`\x01`\xA0\x1B\x03\x16`\x01`\x01`\xA0\x1B\x03\x16\x81R` \x01\x90\x81R` \x01`\0 `\0\x82\x01Q\x81`\0\x01`\0a\x01\0\n\x81T\x81`\x01`\x01`\xA0\x1B\x03\x02\x19\x16\x90\x83`\x01`\x01`\xA0\x1B\x03\x16\x02\x17\x90UP` \x82\x01Q\x81`\x01\x01U`@\x82\x01Q\x81`\x02\x01U``\x82\x01Q\x81`\x03\x01U`\x80\x82\x01Q\x81`\x04\x01U`\xA0\x82\x01Q\x81`\x05\x01U`\xC0\x82\x01Q\x81`\x06\x01U`\xE0\x82\x01Q\x81`\x07\x01Ua\x01\0\x82\x01Q\x81`\x08\x01Ua\x01 \x82\x01Q\x81`\t\x01\x90\x81a\x0BU\x91\x90aF5V[PP\x84\x15\x90Pa\x0B\x94Wa\x0B\x94`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x830\x87a-#V[`@\x80Q\x86\x81R` \x81\x01\x86\x90R`\x01`\x01`\xA0\x1B\x03\x84\x16\x91\x7FI\x1B\x0FF\x1D\x05\xB7\x9B\xFCi\x04\xA9\xBA\x9D\xF5#\xD7fP?\x11\x04k+^n\xDD\xAA\xE3\xA7#\x1C\x91\x01`@Q\x80\x91\x03\x90\xA2PPa\x0B\xF1`\x01`\0\x80Q` aJ\xD1\x839\x81Q\x91RUV[PPPPV[`\x01`\x01`\xA0\x1B\x03\x82\x16`\0\x90\x81Ra\x01\xF5` \x90\x81R`@\x80\x83 \x84\x84R\x90\x91R\x80\x82 \x81Q`\xA0\x81\x01\x90\x92R\x80T\x83\x92\x83\x92\x90\x91\x82\x90`\xFF\x16`\x04\x81\x11\x15a\x0CCWa\x0CCaC V[`\x04\x81\x11\x15a\x0CTWa\x0CTaC V[\x81R` \x01`\x01\x82\x01T\x81R` \x01`\x02\x82\x01T\x81R` \x01`\x03\x82\x01T\x81R` \x01`\x04\x82\x01T\x81RPP\x90P\x80`@\x01Q\x81``\x01Q\x92P\x92PP[\x92P\x92\x90PV[\x7F\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`\x01`\x01`\xA0\x1B\x03\x16ck[!\xA6a\x0C\xD1\x85a-\x8AV[a\x0C\xDA\x87a-\xC3V[`@Q`\x01`\x01`\xE0\x1B\x03\x19`\xE0\x85\x90\x1B\x16\x81R`\x04\x81\x01\x92\x90\x92R`$\x82\x01R`D\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\r\x1BW=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\r?\x91\x90aF\xF3V[a\r\\W`@Qc\xC4e\xE6\x9D`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\rh\x83\x83\x833a.\x0BV[`@Qc\x07\x07Y\x1F`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x90c\x07\x07Y\x1F\x90a\r\xB4\x90\x86\x90`\x04\x01aD\x8DV[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\r\xCEW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\r\xE2W=`\0\x80>=`\0\xFD[PPPPa\r\xEF\x83a.\xD3V[`\x01`\x01`\xA0\x1B\x03\x16\x84\x7F\xC3\xFB\xBD\xB6\xAA\x8D\x99\xF6\xEF\xE2J:\"\xE9\xA9\x9F\xFE\xF2J/9\x9C\x0B\x1ET\x99F\xF9\x1B\xF06\xE4`@Q`@Q\x80\x91\x03\x90\xA3PPPPV[`\0\x90\x81R`\0\x80Q` aJ\xB1\x839\x81Q\x91R` R`@\x90 `\x01\x01T\x90V[`\x01`\x01`\xA0\x1B\x03\x82\x16`\0\x90\x81Ra\x01\xF5` \x90\x81R`@\x80\x83 \x84\x84R\x90\x91R\x80\x82 \x81Q`\xA0\x81\x01\x90\x92R\x80T\x83\x92\x83\x92\x90\x91\x82\x90`\xFF\x16`\x04\x81\x11\x15a\x0E\x99Wa\x0E\x99aC V[`\x04\x81\x11\x15a\x0E\xAAWa\x0E\xAAaC V[\x81R` \x01`\x01\x82\x01T\x81R` \x01`\x02\x82\x01T\x81R` \x01`\x03\x82\x01T\x81R` \x01`\x04\x82\x01T\x81RPP\x90P`\0a\x01\xF4`\0\x87`\x01`\x01`\xA0\x1B\x03\x16`\x01`\x01`\xA0\x1B\x03\x16\x81R` \x01\x90\x81R` \x01`\0 `@Q\x80a\x01@\x01`@R\x90\x81`\0\x82\x01`\0\x90T\x90a\x01\0\n\x90\x04`\x01`\x01`\xA0\x1B\x03\x16`\x01`\x01`\xA0\x1B\x03\x16`\x01`\x01`\xA0\x1B\x03\x16\x81R` \x01`\x01\x82\x01T\x81R` \x01`\x02\x82\x01T\x81R` \x01`\x03\x82\x01T\x81R` \x01`\x04\x82\x01T\x81R` \x01`\x05\x82\x01T\x81R` \x01`\x06\x82\x01T\x81R` \x01`\x07\x82\x01T\x81R` \x01`\x08\x82\x01T\x81R` \x01`\t\x82\x01\x80Ta\x0F\x9B\x90aE\xB4V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\x0F\xC7\x90aE\xB4V[\x80\x15a\x10\x14W\x80`\x1F\x10a\x0F\xE9Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\x10\x14V[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\x0F\xF7W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPP\x91\x90\x92RPP\x90Q`@\x90\x93\x01Q\x92\x94P\x91\x92PPP\x92P\x92\x90PV[a\x10=\x82a\x0E+V[a\x10F\x81a/\x03V[a\x0B\xF1\x83\x83a/\rV[3`\0\x81\x81Ra\x01\xF4` R`@\x90 `\t\x81\x01\x80Ta\x10o\x90aE\xB4V[\x15\x90P\x80a\x10\x85WP\x80T`\x01`\x01`\xA0\x1B\x03\x16\x15[\x15a\x10\xA3W`@QcdF\xF9\x17`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[g\r\xE0\xB6\xB3\xA7d\0\0\x81`\x08\x01T\x03a\x10\xCFW`@Qc\x89\x83`\x9D`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0g\r\xE0\xB6\xB3\xA7d\0\0\x82`\x06\x01T\x83`\x08\x01Ta\x10\xEE\x91\x90aG&V[a\x10\xF8\x91\x90aG=V[\x90P`\0\x81\x83`\x06\x01Ta\x11\x0C\x91\x90aG_V[\x90P\x82`\x03\x01T\x82\x10\x15a\x113W`@Qc\x01\x19\"\xB7`\xE3\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x82`\x02\x01T\x82\x10\x15a\x11XW`@Qc\x01\x19\"\xB7`\xE3\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x06\x83\x01\x82\x90Ug\r\xE0\xB6\xB3\xA7d\0\0`\x08\x84\x01U`\x01`\x01`\xA0\x1B\x03\x84\x16`\0\x90\x81Ra\x01\xF7` R`@\x90 TC\x10\x80\x15\x90a\x11\xAEWP`\x01`\x01`\xA0\x1B\x03\x84\x16`\0\x90\x81Ra\x01\xF7` R`@\x90 T\x15\x15[a\x11\xCBW`@Qc8l\xF4\x07`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\x01`\xA0\x1B\x03\x84\x16`\0\x81\x81Ra\x01\xF7` R`@\x80\x82 \x91\x90\x91UQ\x7F\x11\xDE\xAE(\x9Epx\xFC\xE2\x88\xF4\xE9sN\x9C=\xF6{U\xEA\xC4\xFFA\xB8\x90\xB6\xD68\x1A\xCE\xE7b\x90a\x12\x19\x90\x84\x81R` \x01\x90V[`@Q\x80\x91\x03\x90\xA2PPPPV[`\x01`\x01`\xA0\x1B\x03\x81\x163\x14a\x12PW`@Qc3K\xD9\x19`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x08\xAC\x82\x82a/\xB2V[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x80T`\x01`@\x1B\x81\x04`\xFF\x16\x15\x90`\x01`\x01`@\x1B\x03\x16`\0\x81\x15\x80\x15a\x12\x9FWP\x82[\x90P`\0\x82`\x01`\x01`@\x1B\x03\x16`\x01\x14\x80\x15a\x12\xBBWP0;\x15[\x90P\x81\x15\x80\x15a\x12\xC9WP\x80\x15[\x15a\x12\xE7W`@Qc\xF9.\xE8\xA9`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x84Tg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x19\x16`\x01\x17\x85U\x83\x15a\x13\x11W\x84T`\xFF`@\x1B\x19\x16`\x01`@\x1B\x17\x85U[a\x13\x19a0.V[a\x13!a0.V[a\x13)a0.V[a\x131a0.V[a\x13<`\0\x88a/\rV[Pa\x13U`\0\x80Q` aJq\x839\x81Q\x91R\x87a/\rV[Pa\x01\xF8\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16`\x01`\x01`\xA0\x1B\x03\x88\x16\x17\x90U\x83\x15a\x13\xB8W\x84T`\xFF`@\x1B\x19\x16\x85U`@Q`\x01\x81R\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x90` \x01`@Q\x80\x91\x03\x90\xA1[PPPPPPPV[3`\0\x81\x81Ra\x01\xF4` R`@\x90 `\x01`\x01`\xA0\x1B\x03\x83\x16\x15\x80a\x13\xEFWP\x80T`\x01`\x01`\xA0\x1B\x03\x16\x15[\x15a\x14\rW`@Qc\x1E\x1D\n\xB5`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16`\x01`\x01`\xA0\x1B\x03\x84\x81\x16\x91\x82\x17\x83U`@Q\x91\x82R\x83\x16\x90\x7F\xB1\x95\xA9K\xEC\xD3\x88\xC9\xA0\x7F\xE8\x18qh3\xBD\xF9\x8Bu\\x\xC9\xB48\xF4\xC8\xF0o5O\xA3h\x90` \x01[`@Q\x80\x91\x03\x90\xA2PPPV[a\x14ma08V[a\x14v\x82a0\xDDV[a\x14\x80\x82\x82a0\xE8V[PPV[`\0a\x14\x8Ea1\xA5V[P`\0\x80Q` aJ\x91\x839\x81Q\x91R\x90V[`\x01`\x01`\xA0\x1B\x03\x7F\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\x16c\xED8\r\x033`@Q`\x01`\x01`\xE0\x1B\x03\x19`\xE0\x84\x90\x1B\x16\x81R`\x01`\x01`\xA0\x1B\x03\x90\x91\x16`\x04\x82\x01R`$\x81\x01\x84\x90R`D\x01`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x15\x19W`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x15-W=`\0\x80>=`\0\xFD[PPPPPV[`\x01`\x01`\xA0\x1B\x03\x82\x16`\0\x90\x81Ra\x01\xF5` \x90\x81R`@\x80\x83 \x84\x84R\x90\x91R\x80\x82 \x81Q`\xA0\x81\x01\x90\x92R\x80T\x83\x92\x83\x92\x90\x91\x82\x90`\xFF\x16`\x04\x81\x11\x15a\x15\x80Wa\x15\x80aC V[`\x04\x81\x11\x15a\x15\x91Wa\x15\x91aC V[\x81R` \x01`\x01\x82\x01T\x81R` \x01`\x02\x82\x01T\x81R` \x01`\x03\x82\x01T\x81R` \x01`\x04\x82\x01T\x81RPP\x90P`\0a\x01\xF4`\0\x87`\x01`\x01`\xA0\x1B\x03\x16`\x01`\x01`\xA0\x1B\x03\x16\x81R` \x01\x90\x81R` \x01`\0 `@Q\x80a\x01@\x01`@R\x90\x81`\0\x82\x01`\0\x90T\x90a\x01\0\n\x90\x04`\x01`\x01`\xA0\x1B\x03\x16`\x01`\x01`\xA0\x1B\x03\x16`\x01`\x01`\xA0\x1B\x03\x16\x81R` \x01`\x01\x82\x01T\x81R` \x01`\x02\x82\x01T\x81R` \x01`\x03\x82\x01T\x81R` \x01`\x04\x82\x01T\x81R` \x01`\x05\x82\x01T\x81R` \x01`\x06\x82\x01T\x81R` \x01`\x07\x82\x01T\x81R` \x01`\x08\x82\x01T\x81R` \x01`\t\x82\x01\x80Ta\x16\x82\x90aE\xB4V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\x16\xAE\x90aE\xB4V[\x80\x15a\x16\xFBW\x80`\x1F\x10a\x16\xD0Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\x16\xFBV[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\x16\xDEW\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81RPP\x90P`\0`\x04\x81\x11\x15a\x17\x19Wa\x17\x19aC V[\x82Q`\x04\x81\x11\x15a\x17,Wa\x17,aC V[\x03a\x17?W`\0\x80\x93P\x93PPPa\x0C\x92V[`\x04\x82Q`\x04\x81\x11\x15a\x17TWa\x17TaC V[\x03a\x17hW`\x04`\0\x93P\x93PPPa\x0C\x92V[`\0a\x17s\x87a1\xEEV[\x90P`\0\x83Q`\x04\x81\x11\x15a\x17\x8AWa\x17\x8AaC V[\x14\x15\x80\x15a\x17\x96WP\x80\x15[\x15a\x17\xABW`\x02`\0\x94P\x94PPPPa\x0C\x92V[\x81`\xC0\x01Q\x81\x03a\x17\xC4W`\x01\x94P\x92Pa\x0C\x92\x91PPV[\x80\x15\x80\x15\x90a\x17\xD6WP\x81`\xC0\x01Q\x81\x10[\x15a\x17\xE9W`\x03\x94P\x92Pa\x0C\x92\x91PPV[P`\0\x96\x87\x96P\x94PPPPPV[3`\0\x81\x81Ra\x01\xF4` R`@\x90 \x80T`\x01`\x01`\xA0\x1B\x03\x16\x15\x80a\x18-WP\x80`\t\x01\x80Ta\x18)\x90aE\xB4V[\x15\x90P[\x15a\x18KW`@Qc\x1E\x1D\n\xB5`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x82\x81`\x06\x01`\0\x82\x82Ta\x18_\x91\x90aGrV[\x90\x91UPP`@Q\x83\x81R`\x01`\x01`\xA0\x1B\x03\x83\x16\x90\x7F \x98X\xCE\xC2\x8CQ\x8A\xEAD\xAA?\xA7\n\x93\"S\xF8\xBD\xF7j\x1C\x9A\x0B\x08\"j\x13\xE6\x975\xA3\x90` \x01a\x14XV[a\x18\xA7a,\xEBV[3`\0\x81\x81Ra\x01\xF4` \x90\x81R`@\x80\x83 \x81Qa\x01@\x81\x01\x83R\x81T`\x01`\x01`\xA0\x1B\x03\x16\x81R`\x01\x82\x01T\x93\x81\x01\x93\x90\x93R`\x02\x81\x01T\x91\x83\x01\x91\x90\x91R`\x03\x81\x01T``\x83\x01R`\x04\x81\x01T`\x80\x83\x01R`\x05\x81\x01T`\xA0\x83\x01R`\x06\x81\x01T`\xC0\x83\x01R`\x07\x81\x01T`\xE0\x83\x01R`\x08\x81\x01Ta\x01\0\x83\x01R`\t\x81\x01\x80Ta\x01 \x84\x01\x91\x90a\x19;\x90aE\xB4V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\x19g\x90aE\xB4V[\x80\x15a\x19\xB4W\x80`\x1F\x10a\x19\x89Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\x19\xB4V[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\x19\x97W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81RPP\x90P\x80`@\x01Q`\0\x14a\x19\xE4W`@Qc\xF8\xC20S`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[` \x81\x01Qa\x1A\x1F\x90`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x90\x85\x90a3fV[`\x01`\x01`\xA0\x1B\x03\x82\x16`\0\x90\x81Ra\x01\xF4` R`@\x81 \x80T`\x01`\x01`\xA0\x1B\x03\x19\x16\x81U`\x01\x81\x01\x82\x90U`\x02\x81\x01\x82\x90U`\x03\x81\x01\x82\x90U`\x04\x81\x01\x82\x90U`\x05\x81\x01\x82\x90U`\x06\x81\x01\x82\x90U`\x07\x81\x01\x82\x90U`\x08\x81\x01\x82\x90U\x90a\x1A\x8C`\t\x83\x01\x82a?6V[PP`@Q`\x01`\x01`\xA0\x1B\x03\x83\x16\x90\x7F\x9F70\xAD\xE9K\xE5\xCE?\xAD\x97;\x88\x8At\x86j:\x91]\0\x8E\x8C\xBD\xE2\x13\x82\xB91\xB6|c\x90`\0\x90\xA2PPa\x1A\xDB`\x01`\0\x80Q` aJ\xD1\x839\x81Q\x91RUV[PV[a\x01\xF4` R`\0\x90\x81R`@\x90 \x80T`\x01\x82\x01T`\x02\x83\x01T`\x03\x84\x01T`\x04\x85\x01T`\x05\x86\x01T`\x06\x87\x01T`\x07\x88\x01T`\x08\x89\x01T`\t\x8A\x01\x80T`\x01`\x01`\xA0\x1B\x03\x90\x9A\x16\x9A\x98\x99\x97\x98\x96\x97\x95\x96\x94\x95\x93\x94\x92\x93\x91\x92\x91a\x1BC\x90aE\xB4V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\x1Bo\x90aE\xB4V[\x80\x15a\x1B\xBCW\x80`\x1F\x10a\x1B\x91Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\x1B\xBCV[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\x1B\x9FW\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x90P\x8AV[`\0\x91\x82R`\0\x80Q` aJ\xB1\x839\x81Q\x91R` \x90\x81R`@\x80\x84 `\x01`\x01`\xA0\x1B\x03\x93\x90\x93\x16\x84R\x91\x90R\x90 T`\xFF\x16\x90V[a\x0B\xF13\x85\x85\x85\x85a3\x97V[3`\0\x81\x81Ra\x01\xF4` R`@\x90 \x80T`\x01`\x01`\xA0\x1B\x03\x16\x15\x80a\x1C@WP\x80`\t\x01\x80Ta\x1C<\x90aE\xB4V[\x15\x90P[\x80a\x1CIWP\x82\x15[\x15a\x1CgW`@Qc\x1E\x1D\n\xB5`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[g\r\xE0\xB6\xB3\xA7d\0\0\x81`\x08\x01T\x14a\x1C\x93W`@Qc\x07\xECv9`\xE4\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0\x83\x82`\x06\x01Ta\x1C\xA5\x91\x90aG_V[\x90P\x81`\x02\x01T\x81\x11a\x1C\xCBW`@Qc\xCA^b/`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x06\x82\x01T`\0\x90a\x1C\xE5g\r\xE0\xB6\xB3\xA7d\0\0\x84aG&V[a\x1C\xEF\x91\x90aG=V[\x90Pg\r\xE0\xB6\xB3\xA7d\0\0\x81\x10a\x1D\x19W`@Qc\xCA^b/`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x08\x83\x01\x81\x90Ua\x1D+`\x01CaGrV[`\x01`\x01`\xA0\x1B\x03\x85\x16`\0\x81\x81Ra\x01\xF7` R`@\x90\x81\x90 \x92\x90\x92U\x90Q\x7Fv\x12,\xFD_W`@Qc\xCA\xBDP\xD7`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0a!I\x89a6{V[\x90P\x86\x81\x10\x15a!lW`@Qcp1\x8A1`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0\x82`\x01\x01T\x90P\x87\x84`\x04\x01`\0\x82\x82Ta!\x89\x91\x90aGrV[\x92PP\x81\x90UP\x80\x84`\x03\x01`\0\x82\x82Ta!\xA4\x91\x90aGrV[\x90\x91UPP`@Q\x88\x81R`\x01`\x01`\xA0\x1B\x03\x8B\x16\x90\x7F\xED.\xDCnq\xBE\xB93\xF1\xE0\xC8\xCC\xFD\xF8E%\x8F7\x10\xD6l6t\xACP\xF3\x90\x08$c\xF7\xF0\x90` \x01`@Q\x80\x91\x03\x90\xA2\x89`\x01`\x01`\xA0\x1B\x03\x16\x7F\xD2\x9B\x9A\xDE\xE3+\xAF\x11\xBE\x04\0\x0Bsc\x99c\xD2\xC7n\x89\x9Fh0\xD3\xB5\xC1q]\xF1}\x82\xBD\x82`@Qa\"\"\x91\x81R` \x01\x90V[`@Q\x80\x91\x03\x90\xA2`\x04\x83\x01\x80T\x90`\0a\"<\x83aG\x9CV[\x91\x90PUPPPPPPPPa\x08\xAC`\x01`\0\x80Q` aJ\xD1\x839\x81Q\x91RUV[`\0[\x81\x81\x10\x15a\x08\xACWa\"\x8C3\x84\x84\x84\x81\x81\x10a\"\x80Wa\"\x80aE\x9EV[\x90P` \x02\x015a7\xEAV[`\x01\x01a\"bV[a\"\x9D\x82a\x0E+V[a\"\xA6\x81a/\x03V[a\x0B\xF1\x83\x83a/\xB2V[3`\0\x81\x81Ra\x01\xF4` \x90\x81R`@\x80\x83 a\x01\xF5\x83R\x81\x84 \x8D\x85R\x90\x92R\x80\x83 \x81Q`\xA0\x81\x01\x90\x92R\x80T\x92\x93\x92\x82\x90`\xFF\x16`\x04\x81\x11\x15a\"\xF8Wa\"\xF8aC V[`\x04\x81\x11\x15a#\tWa#\taC V[\x81R`\x01\x82\x01T` \x82\x01R`\x02\x82\x01T`@\x82\x01R`\x03\x82\x01T``\x82\x01R`\x04\x90\x91\x01T`\x80\x90\x91\x01R\x82T\x90\x91P`\x01`\x01`\xA0\x1B\x03\x16\x15\x80a#MWP\x87\x15[\x80a#VWP\x89\x15[\x15a#tW`@Qc\x1E\x1D\n\xB5`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0a#\x7F\x8Ca8\xBCV[P\x90P`\x01`\x01`\xA0\x1B\x03\x81\x16a#\xA9W`@Qc\x9D\xB8\xD5\xB1`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0\x82Q`\x04\x81\x11\x15a#\xBEWa#\xBEaC V[\x14a#\xDCW`@Qc+[X\x0F`\xE2\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x8A\x83`\x02\x01`\0\x82\x82Ta#\xF0\x91\x90aGrV[\x90\x91UPP`\x06\x83\x01T`\x02\x84\x01T\x11\x15a$\x1EW`@Qc\x07\xD9\x93\x89`\xE4\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x05\x83\x01\x80T\x90`\0a$0\x83aG\x9CV[\x90\x91UPP`@\x80Q`\xA0\x81\x01\x90\x91R\x80`\x01\x81R` \x01\x8C\x81R` \x01\x8B\x81R` \x01\x8A\x81R` \x01`\0\x81RPa\x01\xF5`\0\x86`\x01`\x01`\xA0\x1B\x03\x16`\x01`\x01`\xA0\x1B\x03\x16\x81R` \x01\x90\x81R` \x01`\0 `\0\x8E\x81R` \x01\x90\x81R` \x01`\0 `\0\x82\x01Q\x81`\0\x01`\0a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83`\x04\x81\x11\x15a$\xC0Wa$\xC0aC V[\x02\x17\x90UP` \x82\x01Q`\x01\x82\x01U`@\x82\x01Q`\x02\x82\x01U``\x82\x01Q`\x03\x82\x01U`\x80\x90\x91\x01Q`\x04\x90\x91\x01U\x87\x15a%\x02Wa%\x02\x84\x8D\x89\x89\x89a3\x97V[\x8B\x84`\x01`\x01`\xA0\x1B\x03\x16\x7F\x04Y\xABWU\x08\xB4\xA5\x89O{\x13\x87\xBF6-\x03!;;\xF81\xDAE&!\x8C3\xE4\xA9\x06\xD8\x8D`@Qa%>\x91\x81R` \x01\x90V[`@Q\x80\x91\x03\x90\xA3PPPPPPPPPPPPV[a\x1A\xDB3\x82a7\xEAV[3`\0\x81\x81Ra\x01\xF4` R`@\x90 \x80T`\x01`\x01`\xA0\x1B\x03\x16\x15\x80a%\x93WP\x80`\t\x01\x80Ta%\x8F\x90aE\xB4V[\x15\x90P[\x80a%\x9CWP\x82\x15[\x15a%\xBAW`@Qc\x1E\x1D\n\xB5`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[g\r\xE0\xB6\xB3\xA7d\0\0\x81`\x08\x01T\x14a%\xE6W`@Qc\x07\xECv9`\xE4\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0\x83\x82`\x01\x01Ta%\xF8\x91\x90aG_V[\x90P`\0\x82`\x01\x01Tg\r\xE0\xB6\xB3\xA7d\0\0\x83a&\x15\x91\x90aG&V[a&\x1F\x91\x90aG=V[`\x07\x84\x01\x81\x90U\x90Pa&3`\x01CaGrV[`\x01`\x01`\xA0\x1B\x03\x85\x16`\0\x81\x81Ra\x01\xF6` R`@\x90\x81\x90 \x92\x90\x92U\x90Q\x7F\x13\x9A\xD7\xA0\xC3\xF6\xC0\xAD\x0F\x0F\xC5+vx`jq\xFF\x08\x1B\x99&\xA5do\xE5:\x8Eg\xC6\x8Ar\x90a\x1D{\x90\x84\x81R` \x01\x90V[`\0`\0\x80Q` aJq\x839\x81Q\x91Ra&\x9D\x81a/\x03V[`\0a&\xA9\x87\x87a\x154V[P\x90P`\0\x81`\x04\x81\x11\x15a&\xC0Wa&\xC0aC V[\x14\x80a&\xDDWP`\x01\x81`\x04\x81\x11\x15a&\xDBWa&\xDBaC V[\x14[\x15a&\xFAW`@Qb\xED=\xF3`\xE8\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\x01`\xA0\x1B\x03\x87\x16`\0\x90\x81Ra\x01\xF4` \x90\x81R`@\x80\x83 a\x01\xF5\x83R\x81\x84 \x8A\x85R\x90\x92R\x82 `\x04\x81\x01\x80T\x92\x93\x91\x92\x91a':\x83aG\x85V[\x91\x90PUP\x86\x82`\x01\x01`\0\x82\x82Ta'S\x91\x90aG_V[\x92PP\x81\x90UP\x86\x82`\x04\x01`\0\x82\x82Ta'n\x91\x90aG_V[\x90\x91UPP`\x01\x81\x01T`\x03\x83\x01\x80T\x82\x91\x90`\0\x90a'\x8F\x90\x84\x90aG_V[\x90\x91UPP`@Q\x88\x81R`\x01`\x01`\xA0\x1B\x03\x8B\x16\x90\x7F\x83\xF5\xEA\x8B\xEAv'\xD9Rt\xE9M\xD7\xE9\xE3\xD7\xE8,\xB5_\xEA\xB5\x13\xEDI\xE3%#-\xCCa\xE0\x90` \x01`@Q\x80\x91\x03\x90\xA2\x89`\x01`\x01`\xA0\x1B\x03\x16\x7F\x0Bi \xA1i\xFB\x88\x9C\x15T\x91\x06\xAE\xE0p\xDA\x98\x18kz\xB4\x06\xDD\x93\x84\xA0\xD3\x18\x99\xFD\xF0\x8A\x82`@Qa(\r\x91\x81R` \x01\x90V[`@Q\x80\x91\x03\x90\xA2a(I`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x88\x8Aa3fV[PP`\x01\x01T\x97\x96PPPPPPPV[a(ba,\xEBV[3`\0\x81\x81Ra\x01\xF4` R`@\x90 `\t\x81\x01\x80Ta(\x81\x90aE\xB4V[\x15\x90P\x80a(\x97WP\x80T`\x01`\x01`\xA0\x1B\x03\x16\x15[\x15a(\xB5W`@QcdF\xF9\x17`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[g\r\xE0\xB6\xB3\xA7d\0\0\x81`\x07\x01T\x03a(\xE1W`@QcYF\x0E\x07`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0g\r\xE0\xB6\xB3\xA7d\0\0\x82`\x01\x01T\x83`\x07\x01Ta)\0\x91\x90aG&V[a)\n\x91\x90aG=V[\x90P`\0\x81\x83`\x01\x01Ta)\x1E\x91\x90aG_V[\x90P\x82`\x04\x01T\x82\x10\x15a)EW`@Qcp1\x8A1`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a)y`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x86\x83a3fV[`\x01\x83\x01\x82\x90Ug\r\xE0\xB6\xB3\xA7d\0\0`\x07\x84\x01U`\x01`\x01`\xA0\x1B\x03\x84\x16`\0\x90\x81Ra\x01\xF6` R`@\x90 TC\x10\x80\x15\x90a)\xCFWP`\x01`\x01`\xA0\x1B\x03\x84\x16`\0\x90\x81Ra\x01\xF6` R`@\x90 T\x15\x15[a)\xECW`@Qc8l\xF4\x07`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\x01`\xA0\x1B\x03\x84\x16`\0\x81\x81Ra\x01\xF6` R`@\x80\x82 \x91\x90\x91UQ\x7F\xE5+=`\0\xFD[PPPP`@Q=`\0\x82>`\x1F=\x90\x81\x01`\x1F\x19\x16\x82\x01`@Ra+\x05\x91\x90\x81\x01\x90aG\xFAV[P\x94\x95PP`\x01`\x01`\xA0\x1B\x03\x85\x16\x93Pa+7\x92PPPW`@Qc\x9D\xB8\xD5\xB1`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\x01`\xA0\x1B\x03\x83\x16`\0\x90\x81Ra\x01\xF5` \x90\x81R`@\x80\x83 \x85\x84R\x90\x91R\x80\x82 \x81Q`\xA0\x81\x01\x90\x92R\x80T\x82\x90`\xFF\x16`\x04\x81\x11\x15a+}Wa+}aC V[`\x04\x81\x11\x15a+\x8EWa+\x8EaC V[\x81R`\x01\x82\x01T` \x82\x01R`\x02\x82\x01T`@\x82\x01R`\x03\x82\x01T``\x82\x01R`\x04\x90\x91\x01T`\x80\x90\x91\x01R\x90P`\0\x81Q`\x04\x81\x11\x15a+\xD1Wa+\xD1aC V[\x03a+\xEFW`@Qc\x04\xC9\xDE\x83`\xE3\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x80\x81\x01Q\x15a,\x12W`@Qc\x02\xE0}\x87`\xE6\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0a\x01\xF4`\0\x86`\x01`\x01`\xA0\x1B\x03\x16`\x01`\x01`\xA0\x1B\x03\x16\x81R` \x01\x90\x81R` \x01`\0 \x90P\x81` \x01Q\x81`\x02\x01`\0\x82\x82Ta,T\x91\x90aG_V[\x92PP\x81\x90UP`\x01\x81`\x05\x01`\0\x82\x82Ta,p\x91\x90aG_V[\x90\x91UPP`\x01`\x01`\xA0\x1B\x03\x85\x16`\0\x81\x81Ra\x01\xF5` \x90\x81R`@\x80\x83 \x88\x84R\x90\x91R\x80\x82 \x80T`\xFF\x19\x16\x81U`\x01\x81\x01\x83\x90U`\x02\x81\x01\x83\x90U`\x03\x81\x01\x83\x90U`\x04\x01\x82\x90UQ\x86\x92\x91\x7F\x83\x1C\xD5\xB7S\x83\x80\xB0\xA2\xA3\x14\x14\xD64\xECBq\x16\x07V\x84\xA2v\x82\x8A\xB4\xD2ut\xA2\xDF\xDF\x91\xA3PPPPPV[`\0\x80Q` aJ\xD1\x839\x81Q\x91R\x80T`\x01\x19\x01a-\x1DW`@Qc>\xE5\xAE\xB5`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x02\x90UV[`@Q`\x01`\x01`\xA0\x1B\x03\x84\x81\x16`$\x83\x01R\x83\x81\x16`D\x83\x01R`d\x82\x01\x83\x90Ra\x0B\xF1\x91\x86\x91\x82\x16\x90c#\xB8r\xDD\x90`\x84\x01[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x91P`\xE0\x1B` \x82\x01\x80Q`\x01`\x01`\xE0\x1B\x03\x83\x81\x83\x16\x17\x83RPPPPa9IV[`\0\x80`\0\x80\x84\x80` \x01\x90Q\x81\x01\x90a-\xA4\x91\x90aH\x86V[PPP\x94P\x94P\x94PPPa-\xBA\x83\x83\x83a9\xBAV[\x95\x94PPPPPV[`@\x80Q` \x81\x01\x82\x90R`\x03``\x82\x01Rbivs`\xE8\x1B`\x80\x82\x01R\x90\x81\x01\x82\x90R`\0\x90`\xA0\x01[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 \x90P\x91\x90PV[`\0\x84\x82`@Q` \x01a. \x92\x91\x90aI\x8AV[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 \x90P`\0a.C\x82a9\xF3V[\x90P`\0a.\x87\x82\x87\x87\x80\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x93\x92\x91\x90\x81\x81R` \x01\x83\x83\x80\x82\x847`\0\x92\x01\x91\x90\x91RPa:.\x92PPPV[\x90Pa.\x92\x87a.\xD3V[`\x01`\x01`\xA0\x1B\x03\x16\x81`\x01`\x01`\xA0\x1B\x03\x16\x14a\x13\xB8W`@Qc(\x80\xCB\x7F`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x82\x16`\x04\x82\x01R`$\x01[`@Q\x80\x91\x03\x90\xFD[`\0\x80\x82\x80` \x01\x90Q\x81\x01\x90a.\xEA\x91\x90aH\x86V[PPPPPP\x91PPa.\xFC\x81a:XV[\x93\x92PPPV[a\x1A\xDB\x813a:\x88V[`\0`\0\x80Q` aJ\xB1\x839\x81Q\x91Ra/(\x84\x84a\x1B\xC6V[a/\xA8W`\0\x84\x81R` \x82\x81R`@\x80\x83 `\x01`\x01`\xA0\x1B\x03\x87\x16\x84R\x90\x91R\x90 \x80T`\xFF\x19\x16`\x01\x17\x90Ua/^3\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x83`\x01`\x01`\xA0\x1B\x03\x16\x85\x7F/\x87\x88\x11~~\xFF\x1D\x82\xE9&\xECyI\x01\xD1|x\x02JP'\t@0E@\xA73eo\r`@Q`@Q\x80\x91\x03\x90\xA4`\x01\x91PPa\x08qV[`\0\x91PPa\x08qV[`\0`\0\x80Q` aJ\xB1\x839\x81Q\x91Ra/\xCD\x84\x84a\x1B\xC6V[\x15a/\xA8W`\0\x84\x81R` \x82\x81R`@\x80\x83 `\x01`\x01`\xA0\x1B\x03\x87\x16\x80\x85R\x92R\x80\x83 \x80T`\xFF\x19\x16\x90UQ3\x92\x87\x91\x7F\xF69\x1F\\2\xD9\xC6\x9D*G\xEAg\x0BD)t\xB595\xD1\xED\xC7\xFDd\xEB!\xE0G\xA89\x17\x1B\x91\x90\xA4`\x01\x91PPa\x08qV[a06a:\xC1V[V[0`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x14\x80a0\xBFWP\x7F\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`\x01`\x01`\xA0\x1B\x03\x16a0\xB3`\0\x80Q` aJ\x91\x839\x81Q\x91RT`\x01`\x01`\xA0\x1B\x03\x16\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x14\x15[\x15a06W`@Qcp>F\xDD`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0a\x14\x80\x81a/\x03V[\x81`\x01`\x01`\xA0\x1B\x03\x16cR\xD1\x90-`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x92PPP\x80\x15a1BWP`@\x80Q`\x1F=\x90\x81\x01`\x1F\x19\x16\x82\x01\x90\x92Ra1?\x91\x81\x01\x90aI\xB4V[`\x01[a1jW`@QcL\x9C\x8C\xE3`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x83\x16`\x04\x82\x01R`$\x01a.\xCAV[`\0\x80Q` aJ\x91\x839\x81Q\x91R\x81\x14a1\x9BW`@Qc*\x87Ri`\xE2\x1B\x81R`\x04\x81\x01\x82\x90R`$\x01a.\xCAV[a\x08\xAC\x83\x83a;\nV[0`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x14a06W`@Qcp>F\xDD`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\x01`\xA0\x1B\x03\x80\x82\x16`\0\x90\x81Ra\x01\xF4` \x90\x81R`@\x80\x83 \x81Qa\x01@\x81\x01\x83R\x81T\x90\x95\x16\x85R`\x01\x81\x01T\x92\x85\x01\x92\x90\x92R`\x02\x82\x01T\x90\x84\x01R`\x03\x81\x01T``\x84\x01R`\x04\x81\x01T`\x80\x84\x01R`\x05\x81\x01T`\xA0\x84\x01R`\x06\x81\x01T`\xC0\x84\x01R`\x07\x81\x01T`\xE0\x84\x01R`\x08\x81\x01Ta\x01\0\x84\x01R`\t\x81\x01\x80T\x92\x93\x84\x93\x90\x92\x91a\x01 \x84\x01\x91a2\x89\x90aE\xB4V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta2\xB5\x90aE\xB4V[\x80\x15a3\x02W\x80`\x1F\x10a2\xD7Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a3\x02V[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a2\xE5W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81RPP\x90P`\0g\r\xE0\xB6\xB3\xA7d\0\0\x82a\x01\0\x01Q\x83`\xC0\x01Qa3-\x91\x90aG&V[a37\x91\x90aG=V[\x90P\x81``\x01Q\x81\x10\x15a3OWP`\0\x93\x92PPPV[``\x82\x01Qa3^\x90\x82aG_V[\x94\x93PPPPV[`@Q`\x01`\x01`\xA0\x1B\x03\x83\x81\x16`$\x83\x01R`D\x82\x01\x83\x90Ra\x08\xAC\x91\x85\x91\x82\x16\x90c\xA9\x05\x9C\xBB\x90`d\x01a-XV[`\x01`\x01`\xA0\x1B\x03\x80\x86\x16`\0\x90\x81Ra\x01\xF4` \x90\x81R`@\x80\x83 \x81Qa\x01@\x81\x01\x83R\x81T\x90\x95\x16\x85R`\x01\x81\x01T\x92\x85\x01\x92\x90\x92R`\x02\x82\x01T\x90\x84\x01R`\x03\x81\x01T``\x84\x01R`\x04\x81\x01T`\x80\x84\x01R`\x05\x81\x01T`\xA0\x84\x01R`\x06\x81\x01T`\xC0\x84\x01R`\x07\x81\x01T`\xE0\x84\x01R`\x08\x81\x01Ta\x01\0\x84\x01R`\t\x81\x01\x80T\x92\x93\x92a\x01 \x84\x01\x91\x90a4/\x90aE\xB4V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta4[\x90aE\xB4V[\x80\x15a4\xA8W\x80`\x1F\x10a4}Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a4\xA8V[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a4\x8BW\x82\x90\x03`\x1F\x16\x82\x01\x91[PPP\x91\x90\x92RPP\x81Q\x91\x92PP`\x01`\x01`\xA0\x1B\x03\x16a4\xDDW`@Qc\x1E\x1D\n\xB5`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0a4\xE8\x86a8\xBCV[\x91PPa4\xF4\x81a;`V[a5\x11W`@Qc!\xA4\x8B\x8B`\xE2\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x7F\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`\x01`\x01`\xA0\x1B\x03\x16ck[!\xA6a5I\x87a-\x8AV[a5R\x89a;\x95V[`@Q`\x01`\x01`\xE0\x1B\x03\x19`\xE0\x85\x90\x1B\x16\x81R`\x04\x81\x01\x92\x90\x92R`$\x82\x01R`D\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a5\x93W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a5\xB7\x91\x90aF\xF3V[a5\xD4W`@Qc\xC4e\xE6\x9D`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0a5\xDF\x86a;\xC4V[\x90Pa5\xED\x86\x86\x86\x8Ba.\x0BV[`@Qc4\xFE\xDEe`\xE1\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x90ci\xFD\xBC\xCA\x90a6?\x90\x8B\x90\x8B\x90\x86\x90\x8C\x90`\x04\x01aI\xCDV[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a6YW`\0\x80\xFD[PZ\xF1\x15\x80\x15a6mW=`\0\x80>=`\0\xFD[PPPPPPPPPPPPV[`\x01`\x01`\xA0\x1B\x03\x80\x82\x16`\0\x90\x81Ra\x01\xF4` \x90\x81R`@\x80\x83 \x81Qa\x01@\x81\x01\x83R\x81T\x90\x95\x16\x85R`\x01\x81\x01T\x92\x85\x01\x92\x90\x92R`\x02\x82\x01T\x90\x84\x01R`\x03\x81\x01T``\x84\x01R`\x04\x81\x01T`\x80\x84\x01R`\x05\x81\x01T`\xA0\x84\x01R`\x06\x81\x01T`\xC0\x84\x01R`\x07\x81\x01T`\xE0\x84\x01R`\x08\x81\x01Ta\x01\0\x84\x01R`\t\x81\x01\x80T\x92\x93\x84\x93\x90\x92\x91a\x01 \x84\x01\x91a7\x16\x90aE\xB4V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta7B\x90aE\xB4V[\x80\x15a7\x8FW\x80`\x1F\x10a7dWa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a7\x8FV[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a7rW\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81RPP\x90P`\0g\r\xE0\xB6\xB3\xA7d\0\0\x82`\xE0\x01Q\x83` \x01Qa7\xB9\x91\x90aG&V[a7\xC3\x91\x90aG=V[\x90P\x81`\x80\x01Q\x81\x10\x15a7\xDBWP`\0\x93\x92PPPV[`\x80\x82\x01Qa3^\x90\x82aG_V[`\0a7\xF6\x83\x83a\x154V[P\x90P`\0\x81`\x04\x81\x11\x15a8\rWa8\raC V[\x14\x15\x80\x15a8-WP`\x04\x81`\x04\x81\x11\x15a8*Wa8*aC V[\x14\x15[a8JW`@Qc0\x04\x82\x87`\xE2\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\x01`\xA0\x1B\x03\x83\x16`\0\x81\x81Ra\x01\xF5` \x90\x81R`@\x80\x83 \x86\x84R\x90\x91R\x80\x82 \x80T`\xFF\x19\x16`\x04\x17\x81U\x90Q\x90\x92\x85\x92\x90\x91\x7F\xF9\xE1yp\xDFW\xA6\xA8E}\xCB\xB5\xC2\x91gkF1\xD37\xCFv\xB0\xC8\x01\xF6\xB8\xADj|_\x92\x91\x90\xA3\x80`\x04\x01T`\0\x03a\x0B\xF1Wa\x0B\xF1\x84\x84a*\x92V[a\x01\xF8T`@Qc\xF8\xA9H/`\xE0\x1B\x81R`\x04\x81\x01\x83\x90R`\0\x91\x82\x91\x82\x91\x82\x91`\x01`\x01`\xA0\x1B\x03\x90\x91\x16\x90c\xF8\xA9H/\x90`$\x01`\0`@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a9\x0FW=`\0\x80>=`\0\xFD[PPPP`@Q=`\0\x82>`\x1F=\x90\x81\x01`\x1F\x19\x16\x82\x01`@Ra97\x91\x90\x81\x01\x90aG\xFAV[P\x94\x9A\x93\x99P\x92\x97PPPPPPPPV[`\0\x80` `\0\x84Q` \x86\x01`\0\x88Z\xF1\x80a9lW`@Q=`\0\x82>=\x81\xFD[PP`\0Q=\x91P\x81\x15a9\x84W\x80`\x01\x14\x15a9\x91V[`\x01`\x01`\xA0\x1B\x03\x84\x16;\x15[\x15a\x0B\xF1W`@QcRt\xAF\xE7`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x85\x16`\x04\x82\x01R`$\x01a.\xCAV[`\0\x80\x84\x84\x84`@Q` \x01a9\xD2\x93\x92\x91\x90aJ\x11V[`@\x80Q\x80\x83\x03`\x1F\x19\x01\x81R\x91\x90R\x80Q` \x90\x91\x01 \x95\x94PPPPPV[`@Q\x7F\x19Ethereum Signed Message:\n32\0\0\0\0` \x82\x01R`<\x81\x01\x82\x90R`\0\x90`\\\x01a-\xEEV[`\0\x80`\0\x80a:>\x86\x86a;\xEBV[\x92P\x92P\x92Pa:N\x82\x82a<8V[P\x90\x94\x93PPPPV[`\0\x81Q`@\x14a:|W`@Qc\xD2\x833]`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[P\x80Q` \x90\x91\x01 \x90V[a:\x92\x82\x82a\x1B\xC6V[a\x14\x80W`@Qc\xE2Q}?`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x82\x16`\x04\x82\x01R`$\x81\x01\x83\x90R`D\x01a.\xCAV[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0T`\x01`@\x1B\x90\x04`\xFF\x16a06W`@Qc\x1A\xFC\xD7\x9F`\xE3\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a;\x13\x82a<\xF1V[`@Q`\x01`\x01`\xA0\x1B\x03\x83\x16\x90\x7F\xBC|\xD7Z \xEE'\xFD\x9A\xDE\xBA\xB3 A\xF7U!M\xBCk\xFF\xA9\x0C\xC0\"[9\xDA.\\-;\x90`\0\x90\xA2\x80Q\x15a;XWa\x08\xAC\x82\x82a=VV[a\x14\x80a=\xC3V[`\0\x81\x15\x80a;\x8EWP\x7F\xCD.f\xBF\x0B\x91\xEE\xED\xC6\xC6H\xAE\x935\xA7\x8D|\x9AJ\xB0\xEF3a*\x82M\x91\xCD\xC6\x8AO!\x82\x14[\x15\x92\x91PPV[`@\x80Q` \x81\x01\x82\x90R`\x03``\x82\x01Rb3\xB2\xB7`\xE9\x1B`\x80\x82\x01R\x90\x81\x01\x82\x90R`\0\x90`\xA0\x01a-\xEEV[```\0\x82\x80` \x01\x90Q\x81\x01\x90a;\xDC\x91\x90aH\x86V[P\x94\x99\x98PPPPPPPPPV[`\0\x80`\0\x83Q`A\x03a<%W` \x84\x01Q`@\x85\x01Q``\x86\x01Q`\0\x1Aa<\x17\x88\x82\x85\x85a=\xE2V[\x95P\x95P\x95PPPPa<1V[PP\x81Q`\0\x91P`\x02\x90[\x92P\x92P\x92V[`\0\x82`\x03\x81\x11\x15a=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\rI\x91\x90aG\x8FV[a\rfW`@Qc\xC4e\xE6\x9D`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\rr\x83\x83\x833a-\xDCV[`@Qc\x07\x07Y\x1F`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x90c\x07\x07Y\x1F\x90a\r\xBE\x90\x86\x90`\x04\x01aD\xF6V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\r\xD8W`\0\x80\xFD[PZ\xF1\x15\x80\x15a\r\xECW=`\0\x80>=`\0\xFD[PPPPa\r\xF9\x83a.\xA4V[`\x01`\x01`\xA0\x1B\x03\x16\x84\x7F\xC3\xFB\xBD\xB6\xAA\x8D\x99\xF6\xEF\xE2J:\"\xE9\xA9\x9F\xFE\xF2J/9\x9C\x0B\x1ET\x99F\xF9\x1B\xF06\xE4`@Q`@Q\x80\x91\x03\x90\xA3PPPPV[`\0\x90\x81R`\0\x80Q` aK\x07\x839\x81Q\x91R` R`@\x90 `\x01\x01T\x90V[`\x01`\x01`\xA0\x1B\x03\x82\x16`\0\x90\x81Ra\x01\xF5` \x90\x81R`@\x80\x83 \x84\x84R\x90\x91R\x80\x82 \x81Q`\xA0\x81\x01\x90\x92R\x80T\x83\x92\x83\x92\x90\x91\x82\x90`\xFF\x16`\x04\x81\x11\x15a\x0E\xA3Wa\x0E\xA3aC\x89V[`\x04\x81\x11\x15a\x0E\xB4Wa\x0E\xB4aC\x89V[\x81R` \x01`\x01\x82\x01T\x81R` \x01`\x02\x82\x01T\x81R` \x01`\x03\x82\x01T\x81R` \x01`\x04\x82\x01T\x81RPP\x90P`\0a\x01\xF4`\0\x87`\x01`\x01`\xA0\x1B\x03\x16`\x01`\x01`\xA0\x1B\x03\x16\x81R` \x01\x90\x81R` \x01`\0 `@Q\x80a\x01@\x01`@R\x90\x81`\0\x82\x01`\0\x90T\x90a\x01\0\n\x90\x04`\x01`\x01`\xA0\x1B\x03\x16`\x01`\x01`\xA0\x1B\x03\x16`\x01`\x01`\xA0\x1B\x03\x16\x81R` \x01`\x01\x82\x01T\x81R` \x01`\x02\x82\x01T\x81R` \x01`\x03\x82\x01T\x81R` \x01`\x04\x82\x01T\x81R` \x01`\x05\x82\x01T\x81R` \x01`\x06\x82\x01T\x81R` \x01`\x07\x82\x01T\x81R` \x01`\x08\x82\x01T\x81R` \x01`\t\x82\x01\x80Ta\x0F\xA5\x90aFHV[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\x0F\xD1\x90aFHV[\x80\x15a\x10\x1EW\x80`\x1F\x10a\x0F\xF3Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\x10\x1EV[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\x10\x01W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPP\x91\x90\x92RPP\x90Q`@\x90\x93\x01Q\x92\x94P\x91\x92PPP\x92P\x92\x90PV[a\x10G\x82a\x0E5V[a\x10P\x81a.\xD4V[a\x0B\xFB\x83\x83a.\xDEV[3`\0\x81\x81Ra\x01\xF4` R`@\x90 `\t\x81\x01\x80Ta\x10y\x90aFHV[\x15\x90P\x80a\x10\x8FWP\x80T`\x01`\x01`\xA0\x1B\x03\x16\x15[\x15a\x10\xADW`@QcdF\xF9\x17`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[g\r\xE0\xB6\xB3\xA7d\0\0\x81`\x08\x01T\x03a\x10\xD9W`@Qc\x89\x83`\x9D`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0g\r\xE0\xB6\xB3\xA7d\0\0\x82`\x06\x01T\x83`\x08\x01Ta\x10\xF8\x91\x90aG\xACV[a\x11\x02\x91\x90aG\xC3V[\x90P`\0\x81\x83`\x06\x01Ta\x11\x16\x91\x90aG\xE5V[\x90P\x82`\x03\x01T\x82\x10\x15a\x11=W`@Qc\x01\x19\"\xB7`\xE3\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x82`\x02\x01T\x82\x10\x15a\x11bW`@Qc\x01\x19\"\xB7`\xE3\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x06\x83\x01\x82\x90Ug\r\xE0\xB6\xB3\xA7d\0\0`\x08\x84\x01U`\x01`\x01`\xA0\x1B\x03\x84\x16`\0\x90\x81Ra\x01\xF7` R`@\x90 TC\x10\x80\x15\x90a\x11\xB8WP`\x01`\x01`\xA0\x1B\x03\x84\x16`\0\x90\x81Ra\x01\xF7` R`@\x90 T\x15\x15[a\x11\xD5W`@Qc8l\xF4\x07`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\x01`\xA0\x1B\x03\x84\x16`\0\x81\x81Ra\x01\xF7` R`@\x80\x82 \x91\x90\x91UQ\x7F\x11\xDE\xAE(\x9Epx\xFC\xE2\x88\xF4\xE9sN\x9C=\xF6{U\xEA\xC4\xFFA\xB8\x90\xB6\xD68\x1A\xCE\xE7b\x90a\x12#\x90\x84\x81R` \x01\x90V[`@Q\x80\x91\x03\x90\xA2PPPPV[`\x01`\x01`\xA0\x1B\x03\x81\x163\x14a\x12ZW`@Qc3K\xD9\x19`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x08\xB6\x82\x82a/\x83V[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x80T`\x01`@\x1B\x81\x04`\xFF\x16\x15\x90`\x01`\x01`@\x1B\x03\x16`\0\x81\x15\x80\x15a\x12\xA9WP\x82[\x90P`\0\x82`\x01`\x01`@\x1B\x03\x16`\x01\x14\x80\x15a\x12\xC5WP0;\x15[\x90P\x81\x15\x80\x15a\x12\xD3WP\x80\x15[\x15a\x12\xF1W`@Qc\xF9.\xE8\xA9`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x84Tg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x19\x16`\x01\x17\x85U\x83\x15a\x13\x1BW\x84T`\xFF`@\x1B\x19\x16`\x01`@\x1B\x17\x85U[a\x13#a/\xFFV[a\x13+a/\xFFV[a\x133a/\xFFV[a\x13;a/\xFFV[a\x13F`\0\x88a.\xDEV[Pa\x13_`\0\x80Q` aJ\xC7\x839\x81Q\x91R\x87a.\xDEV[Pa\x01\xF8\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16`\x01`\x01`\xA0\x1B\x03\x88\x16\x17\x90U\x83\x15a\x13\xC2W\x84T`\xFF`@\x1B\x19\x16\x85U`@Q`\x01\x81R\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x90` \x01`@Q\x80\x91\x03\x90\xA1[PPPPPPPV[3`\0\x81\x81Ra\x01\xF4` R`@\x90 `\x01`\x01`\xA0\x1B\x03\x83\x16\x15\x80a\x13\xF9WP\x80T`\x01`\x01`\xA0\x1B\x03\x16\x15[\x15a\x14\x17W`@Qc\x1E\x1D\n\xB5`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16`\x01`\x01`\xA0\x1B\x03\x84\x81\x16\x91\x82\x17\x83U`@Q\x91\x82R\x83\x16\x90\x7F\xB1\x95\xA9K\xEC\xD3\x88\xC9\xA0\x7F\xE8\x18qh3\xBD\xF9\x8Bu\\x\xC9\xB48\xF4\xC8\xF0o5O\xA3h\x90` \x01[`@Q\x80\x91\x03\x90\xA2PPPV[a\x14wa0\tV[a\x14\x80\x82a0\xAEV[a\x14\x8A\x82\x82a0\xB9V[PPV[`\0a\x14\x98a1vV[P`\0\x80Q` aJ\xE7\x839\x81Q\x91R\x90V[`\x01`\x01`\xA0\x1B\x03\x7F\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\x16c\xED8\r\x033`@Q`\x01`\x01`\xE0\x1B\x03\x19`\xE0\x84\x90\x1B\x16\x81R`\x01`\x01`\xA0\x1B\x03\x90\x91\x16`\x04\x82\x01R`$\x81\x01\x84\x90R`D\x01`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x15#W`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x157W=`\0\x80>=`\0\xFD[PPPPPV[`\x01`\x01`\xA0\x1B\x03\x82\x16`\0\x90\x81Ra\x01\xF5` \x90\x81R`@\x80\x83 \x84\x84R\x90\x91R\x80\x82 \x81Q`\xA0\x81\x01\x90\x92R\x80T\x83\x92\x83\x92\x90\x91\x82\x90`\xFF\x16`\x04\x81\x11\x15a\x15\x8AWa\x15\x8AaC\x89V[`\x04\x81\x11\x15a\x15\x9BWa\x15\x9BaC\x89V[\x81R` \x01`\x01\x82\x01T\x81R` \x01`\x02\x82\x01T\x81R` \x01`\x03\x82\x01T\x81R` \x01`\x04\x82\x01T\x81RPP\x90P`\0a\x01\xF4`\0\x87`\x01`\x01`\xA0\x1B\x03\x16`\x01`\x01`\xA0\x1B\x03\x16\x81R` \x01\x90\x81R` \x01`\0 `@Q\x80a\x01@\x01`@R\x90\x81`\0\x82\x01`\0\x90T\x90a\x01\0\n\x90\x04`\x01`\x01`\xA0\x1B\x03\x16`\x01`\x01`\xA0\x1B\x03\x16`\x01`\x01`\xA0\x1B\x03\x16\x81R` \x01`\x01\x82\x01T\x81R` \x01`\x02\x82\x01T\x81R` \x01`\x03\x82\x01T\x81R` \x01`\x04\x82\x01T\x81R` \x01`\x05\x82\x01T\x81R` \x01`\x06\x82\x01T\x81R` \x01`\x07\x82\x01T\x81R` \x01`\x08\x82\x01T\x81R` \x01`\t\x82\x01\x80Ta\x16\x8C\x90aFHV[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\x16\xB8\x90aFHV[\x80\x15a\x17\x05W\x80`\x1F\x10a\x16\xDAWa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\x17\x05V[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\x16\xE8W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81RPP\x90P`\0`\x04\x81\x11\x15a\x17#Wa\x17#aC\x89V[\x82Q`\x04\x81\x11\x15a\x176Wa\x176aC\x89V[\x03a\x17IW`\0\x80\x93P\x93PPPa\x0C\x9CV[`\x04\x82Q`\x04\x81\x11\x15a\x17^Wa\x17^aC\x89V[\x03a\x17rW`\x04`\0\x93P\x93PPPa\x0C\x9CV[`\0a\x17}\x87a1\xBFV[\x90P`\0\x83Q`\x04\x81\x11\x15a\x17\x94Wa\x17\x94aC\x89V[\x14\x15\x80\x15a\x17\xA0WP\x80\x15[\x15a\x17\xB5W`\x02`\0\x94P\x94PPPPa\x0C\x9CV[\x81`\xC0\x01Q\x81\x03a\x17\xCEW`\x01\x94P\x92Pa\x0C\x9C\x91PPV[\x80\x15\x80\x15\x90a\x17\xE0WP\x81`\xC0\x01Q\x81\x10[\x15a\x17\xF3W`\x03\x94P\x92Pa\x0C\x9C\x91PPV[P`\0\x96\x87\x96P\x94PPPPPV[3`\0\x81\x81Ra\x01\xF4` R`@\x90 \x80T`\x01`\x01`\xA0\x1B\x03\x16\x15\x80a\x187WP\x80`\t\x01\x80Ta\x183\x90aFHV[\x15\x90P[\x15a\x18UW`@Qc\x1E\x1D\n\xB5`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x82\x81`\x06\x01`\0\x82\x82Ta\x18i\x91\x90aG\xF8V[\x90\x91UPP`@Q\x83\x81R`\x01`\x01`\xA0\x1B\x03\x83\x16\x90\x7F \x98X\xCE\xC2\x8CQ\x8A\xEAD\xAA?\xA7\n\x93\"S\xF8\xBD\xF7j\x1C\x9A\x0B\x08\"j\x13\xE6\x975\xA3\x90` \x01a\x14bV[a\x18\xB1a,\xBCV[3`\0\x81\x81Ra\x01\xF4` \x90\x81R`@\x80\x83 \x81Qa\x01@\x81\x01\x83R\x81T`\x01`\x01`\xA0\x1B\x03\x16\x81R`\x01\x82\x01T\x93\x81\x01\x93\x90\x93R`\x02\x81\x01T\x91\x83\x01\x91\x90\x91R`\x03\x81\x01T``\x83\x01R`\x04\x81\x01T`\x80\x83\x01R`\x05\x81\x01T`\xA0\x83\x01R`\x06\x81\x01T`\xC0\x83\x01R`\x07\x81\x01T`\xE0\x83\x01R`\x08\x81\x01Ta\x01\0\x83\x01R`\t\x81\x01\x80Ta\x01 \x84\x01\x91\x90a\x19E\x90aFHV[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\x19q\x90aFHV[\x80\x15a\x19\xBEW\x80`\x1F\x10a\x19\x93Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\x19\xBEV[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\x19\xA1W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81RPP\x90P\x80`@\x01Q`\0\x14a\x19\xEEW`@Qc\xF8\xC20S`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[` \x81\x01Qa\x1A)\x90`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x90\x85\x90a37V[`\x01`\x01`\xA0\x1B\x03\x82\x16`\0\x90\x81Ra\x01\xF4` R`@\x81 \x80T`\x01`\x01`\xA0\x1B\x03\x19\x16\x81U`\x01\x81\x01\x82\x90U`\x02\x81\x01\x82\x90U`\x03\x81\x01\x82\x90U`\x04\x81\x01\x82\x90U`\x05\x81\x01\x82\x90U`\x06\x81\x01\x82\x90U`\x07\x81\x01\x82\x90U`\x08\x81\x01\x82\x90U\x90a\x1A\x96`\t\x83\x01\x82a?\xA4V[PP`@Q`\x01`\x01`\xA0\x1B\x03\x83\x16\x90\x7F\x9F70\xAD\xE9K\xE5\xCE?\xAD\x97;\x88\x8At\x86j:\x91]\0\x8E\x8C\xBD\xE2\x13\x82\xB91\xB6|c\x90`\0\x90\xA2PPa\x1A\xE5`\x01`\0\x80Q` aK'\x839\x81Q\x91RUV[PV[a\x01\xF4` R`\0\x90\x81R`@\x90 \x80T`\x01\x82\x01T`\x02\x83\x01T`\x03\x84\x01T`\x04\x85\x01T`\x05\x86\x01T`\x06\x87\x01T`\x07\x88\x01T`\x08\x89\x01T`\t\x8A\x01\x80T`\x01`\x01`\xA0\x1B\x03\x90\x9A\x16\x9A\x98\x99\x97\x98\x96\x97\x95\x96\x94\x95\x93\x94\x92\x93\x91\x92\x91a\x1BM\x90aFHV[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\x1By\x90aFHV[\x80\x15a\x1B\xC6W\x80`\x1F\x10a\x1B\x9BWa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\x1B\xC6V[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\x1B\xA9W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x90P\x8AV[`\0\x91\x82R`\0\x80Q` aK\x07\x839\x81Q\x91R` \x90\x81R`@\x80\x84 `\x01`\x01`\xA0\x1B\x03\x93\x90\x93\x16\x84R\x91\x90R\x90 T`\xFF\x16\x90V[a\x0B\xFB3\x85\x85\x85\x85a3hV[3`\0\x81\x81Ra\x01\xF4` R`@\x90 \x80T`\x01`\x01`\xA0\x1B\x03\x16\x15\x80a\x1CJWP\x80`\t\x01\x80Ta\x1CF\x90aFHV[\x15\x90P[\x15a\x1ChW`@Qc\x1E\x1D\n\xB5`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[g\r\xE0\xB6\xB3\xA7d\0\0\x81`\x08\x01T\x14a\x1C\x94W`@Qc\x07\xECv9`\xE4\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[g\r\xE0\xB6\xB3\xA7d\0\0\x83\x10a\x1C\xBCW`@Qc\xCA^b/`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0g\r\xE0\xB6\xB3\xA7d\0\0\x82`\x06\x01T\x85a\x1C\xD7\x91\x90aG\xACV[a\x1C\xE1\x91\x90aG\xC3V[\x90P\x81`\x02\x01T\x81\x11a\x1D\x07W`@Qc\xCA^b/`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x80\x82`\x06\x01Ta\x1D\x17\x91\x90aG\xE5V[`\0\x03a\x1D7W`@Qc\x1E\x1D\n\xB5`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x08\x82\x01\x84\x90Ua\x1DI`\x01CaG\xF8V[`\x01`\x01`\xA0\x1B\x03\x84\x16`\0\x81\x81Ra\x01\xF7` R`@\x90\x81\x90 \x92\x90\x92U\x90Q\x7Fv\x12,\xFD_V[P\x90P`\0\x81`\x04\x81\x11\x15a\x1D\xD4Wa\x1D\xD4aC\x89V[\x14\x80a\x1D\xF1WP`\x01\x81`\x04\x81\x11\x15a\x1D\xEFWa\x1D\xEFaC\x89V[\x14[\x15a\x1E\x0FW`@Qc\x1C\x0E\xC29`\xE2\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\x01`\xA0\x1B\x03\x85\x16`\0\x90\x81Ra\x01\xF4` \x90\x81R`@\x80\x83 a\x01\xF5\x83R\x81\x84 \x88\x85R\x90\x92R\x82 `\x01\x81\x01T`\x04\x83\x01\x80T\x93\x94\x92\x93\x91\x92\x88\x92a\x1EY\x90\x84\x90aG\xE5V[\x92PP\x81\x90UP\x80\x83`\x03\x01`\0\x82\x82Ta\x1Et\x91\x90aG\xE5V[\x90\x91UPP`@Q\x86\x81R`\x01`\x01`\xA0\x1B\x03\x89\x16\x90\x7F8_\xDC$)T\x16\xE3W\x12\x7F\xE2qs\x80XA\x1F`\xF8\x84|\x15\xC5X\xAC\xBC\x067&\xA6i\x90` \x01`@Q\x80\x91\x03\x90\xA2\x87`\x01`\x01`\xA0\x1B\x03\x16\x7F\x0Bi \xA1i\xFB\x88\x9C\x15T\x91\x06\xAE\xE0p\xDA\x98\x18kz\xB4\x06\xDD\x93\x84\xA0\xD3\x18\x99\xFD\xF0\x8A\x82`@Qa\x1E\xF2\x91\x81R` \x01\x90V[`@Q\x80\x91\x03\x90\xA2`\x04\x82\x01\x80T\x90`\0a\x1F\x0C\x83aH\x0BV[\x91\x90PUPPPPPPPPPV[a\x1A\xE53\x82a*cV[`\0a\x1F/a,\xBCV[`\x01`\x01`\xA0\x1B\x03\x83\x16`\0\x90\x81Ra\x01\xF4` R`@\x90 `\t\x81\x01\x80Ta\x1FW\x90aFHV[\x15\x90P\x80a\x1FmWP\x80T`\x01`\x01`\xA0\x1B\x03\x16\x15[\x15a\x1F\x8BW`@QcdF\xF9\x17`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x82`\0\x03a\x1F\xACW`@Qc\x1E\x1D\n\xB5`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x1F\xE1\x7F\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`\x01`\x01`\xA0\x1B\x03\x1630\x86a,\xF4V[\x82\x81`\x01\x01`\0\x82\x82Ta\x1F\xF5\x91\x90aG\xF8V[\x90\x91UPP`@Q\x83\x81R`\x01`\x01`\xA0\x1B\x03\x85\x16\x90\x7F\xB6\xBE#\x16\x85\x06\xA1\xCEb\xCCo\x933\x9Fg\x10\xE0\x98De\x17\n\xB5-\xF8\xEC\xF7\xDA8\xB3E\x84\x90` \x01`@Q\x80\x91\x03\x90\xA2`\x01\x01T\x90Pa\x08q`\x01`\0\x80Q` aK'\x839\x81Q\x91RUV[a ]a,\xBCV[`\0\x80Q` aJ\xC7\x839\x81Q\x91Ra u\x81a.\xD4V[`\0\x80a \x82\x86\x86a\x15>V[\x90\x92P\x90P`\x01\x82`\x04\x81\x11\x15a \x9BWa \x9BaC\x89V[\x14\x80a \xB8WP`\x03\x82`\x04\x81\x11\x15a \xB6Wa \xB6aC\x89V[\x14[a \xD5W`@QcC\x9FL\xA7`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\x01`\xA0\x1B\x03\x86\x16`\0\x90\x81Ra\x01\xF4` \x90\x81R`@\x80\x83 a\x01\xF5\x83R\x81\x84 \x89\x85R\x90\x92R\x90\x91 `\x01\x81\x01T\x83\x10\x15a!'W`@Qc\x01\x19\"\xB7`\xE3\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`d\x81`\x04\x01T\x11\x15a!MW`@Qc\xCA\xBDP\xD7`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0a!X\x89a6LV[\x90P\x86\x81\x10\x15a!{W`@Qcp1\x8A1`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0\x82`\x01\x01T\x90P\x87\x84`\x04\x01`\0\x82\x82Ta!\x98\x91\x90aG\xF8V[\x92PP\x81\x90UP\x80\x84`\x03\x01`\0\x82\x82Ta!\xB3\x91\x90aG\xF8V[\x90\x91UPP`@Q\x88\x81R`\x01`\x01`\xA0\x1B\x03\x8B\x16\x90\x7F\xED.\xDCnq\xBE\xB93\xF1\xE0\xC8\xCC\xFD\xF8E%\x8F7\x10\xD6l6t\xACP\xF3\x90\x08$c\xF7\xF0\x90` \x01`@Q\x80\x91\x03\x90\xA2\x89`\x01`\x01`\xA0\x1B\x03\x16\x7F\xD2\x9B\x9A\xDE\xE3+\xAF\x11\xBE\x04\0\x0Bsc\x99c\xD2\xC7n\x89\x9Fh0\xD3\xB5\xC1q]\xF1}\x82\xBD\x82`@Qa\"1\x91\x81R` \x01\x90V[`@Q\x80\x91\x03\x90\xA2`\x04\x83\x01\x80T\x90`\0a\"K\x83aF/V[\x91\x90PUPPPPPPPPa\x08\xB6`\x01`\0\x80Q` aK'\x839\x81Q\x91RUV[`\0[\x81\x81\x10\x15a\x08\xB6Wa\"\x9B3\x84\x84\x84\x81\x81\x10a\"\x8FWa\"\x8FaF\x03V[\x90P` \x02\x015a7\xBBV[\x80a\"\xA5\x81aF/V[\x91PPa\"qV[a\"\xB6\x82a\x0E5V[a\"\xBF\x81a.\xD4V[a\x0B\xFB\x83\x83a/\x83V[3`\0\x81\x81Ra\x01\xF4` \x90\x81R`@\x80\x83 a\x01\xF5\x83R\x81\x84 \x8D\x85R\x90\x92R\x80\x83 \x81Q`\xA0\x81\x01\x90\x92R\x80T\x92\x93\x92\x82\x90`\xFF\x16`\x04\x81\x11\x15a#\x11Wa#\x11aC\x89V[`\x04\x81\x11\x15a#\"Wa#\"aC\x89V[\x81R`\x01\x82\x01T` \x82\x01R`\x02\x82\x01T`@\x82\x01R`\x03\x82\x01T``\x82\x01R`\x04\x90\x91\x01T`\x80\x90\x91\x01R\x82T\x90\x91P`\x01`\x01`\xA0\x1B\x03\x16\x15\x80a#fWP\x87\x15[\x80a#oWP\x89\x15[\x15a#\x8DW`@Qc\x1E\x1D\n\xB5`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0a#\x98\x8Ca8\x8DV[P\x90P`\x01`\x01`\xA0\x1B\x03\x81\x16a#\xC2W`@Qc\x9D\xB8\xD5\xB1`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0\x82Q`\x04\x81\x11\x15a#\xD7Wa#\xD7aC\x89V[\x14a#\xF5W`@Qc+[X\x0F`\xE2\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x8A\x83`\x02\x01`\0\x82\x82Ta$\t\x91\x90aG\xF8V[\x90\x91UPP`\x06\x83\x01T`\x02\x84\x01T\x11\x15a$7W`@Qc\x07\xD9\x93\x89`\xE4\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x05\x83\x01\x80T\x90`\0a$I\x83aF/V[\x90\x91UPP`@\x80Q`\xA0\x81\x01\x90\x91R\x80`\x01\x81R` \x01\x8C\x81R` \x01\x8B\x81R` \x01\x8A\x81R` \x01`\0\x81RPa\x01\xF5`\0\x86`\x01`\x01`\xA0\x1B\x03\x16`\x01`\x01`\xA0\x1B\x03\x16\x81R` \x01\x90\x81R` \x01`\0 `\0\x8E\x81R` \x01\x90\x81R` \x01`\0 `\0\x82\x01Q\x81`\0\x01`\0a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83`\x04\x81\x11\x15a$\xD9Wa$\xD9aC\x89V[\x02\x17\x90UP` \x82\x01Q`\x01\x82\x01U`@\x82\x01Q`\x02\x82\x01U``\x82\x01Q`\x03\x82\x01U`\x80\x90\x91\x01Q`\x04\x90\x91\x01U\x87\x15a%\x1BWa%\x1B\x84\x8D\x89\x89\x89a3hV[\x8B\x84`\x01`\x01`\xA0\x1B\x03\x16\x7F\x04Y\xABWU\x08\xB4\xA5\x89O{\x13\x87\xBF6-\x03!;;\xF81\xDAE&!\x8C3\xE4\xA9\x06\xD8\x8D`@Qa%W\x91\x81R` \x01\x90V[`@Q\x80\x91\x03\x90\xA3PPPPPPPPPPPPV[a\x1A\xE53\x82a7\xBBV[3`\0\x81\x81Ra\x01\xF4` R`@\x90 \x80T`\x01`\x01`\xA0\x1B\x03\x16\x15\x80a%\xACWP\x80`\t\x01\x80Ta%\xA8\x90aFHV[\x15\x90P[\x15a%\xCAW`@Qc\x1E\x1D\n\xB5`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[g\r\xE0\xB6\xB3\xA7d\0\0\x81`\x08\x01T\x14a%\xF6W`@Qc\x07\xECv9`\xE4\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[g\r\xE0\xB6\xB3\xA7d\0\0\x83\x10a&\x1EW`@Qc\xCA^b/`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x07\x81\x01\x83\x90U`\x01\x81\x01T`\0\x90g\r\xE0\xB6\xB3\xA7d\0\0\x90a&A\x90\x86aG\xACV[a&K\x91\x90aG\xC3V[\x90P\x80\x82`\x01\x01Ta&]\x91\x90aG\xE5V[`\0\x03a&}W`@Qc\x1E\x1D\n\xB5`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a&\x88`\x01CaG\xF8V[`\x01`\x01`\xA0\x1B\x03\x84\x16`\0\x81\x81Ra\x01\xF6` R`@\x90\x81\x90 \x92\x90\x92U\x90Q\x7F\x13\x9A\xD7\xA0\xC3\xF6\xC0\xAD\x0F\x0F\xC5+vx`jq\xFF\x08\x1B\x99&\xA5do\xE5:\x8Eg\xC6\x8Ar\x90a\x12#\x90\x87\x81R` \x01\x90V[`\0`\0\x80Q` aJ\xC7\x839\x81Q\x91Ra&\xF2\x81a.\xD4V[`\0a&\xFE\x87\x87a\x15>V[P\x90P`\0\x81`\x04\x81\x11\x15a'\x15Wa'\x15aC\x89V[\x14\x80a'2WP`\x01\x81`\x04\x81\x11\x15a'0Wa'0aC\x89V[\x14[\x15a'OW`@Qb\xED=\xF3`\xE8\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\x01`\xA0\x1B\x03\x87\x16`\0\x90\x81Ra\x01\xF4` \x90\x81R`@\x80\x83 a\x01\xF5\x83R\x81\x84 \x8A\x85R\x90\x92R\x82 `\x04\x81\x01\x80T\x92\x93\x91\x92\x91a'\x8F\x83aH\x0BV[\x91\x90PUP\x86\x82`\x01\x01`\0\x82\x82Ta'\xA8\x91\x90aG\xE5V[\x92PP\x81\x90UP\x86\x82`\x04\x01`\0\x82\x82Ta'\xC3\x91\x90aG\xE5V[\x90\x91UPP`\x01\x81\x01T`\x03\x83\x01\x80T`\0\x90a'\xE1\x90\x84\x90aG\xE5V[\x90\x91UPa(\x1B\x90P`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x87\x89a37V[P`\x01\x01T\x97\x96PPPPPPPV[a(3a,\xBCV[3`\0\x81\x81Ra\x01\xF4` R`@\x90 `\t\x81\x01\x80Ta(R\x90aFHV[\x15\x90P\x80a(hWP\x80T`\x01`\x01`\xA0\x1B\x03\x16\x15[\x15a(\x86W`@QcdF\xF9\x17`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[g\r\xE0\xB6\xB3\xA7d\0\0\x81`\x07\x01T\x03a(\xB2W`@QcYF\x0E\x07`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0g\r\xE0\xB6\xB3\xA7d\0\0\x82`\x01\x01T\x83`\x07\x01Ta(\xD1\x91\x90aG\xACV[a(\xDB\x91\x90aG\xC3V[\x90P`\0\x81\x83`\x01\x01Ta(\xEF\x91\x90aG\xE5V[\x90P\x82`\x04\x01T\x82\x10\x15a)\x16W`@Qcp1\x8A1`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a)J`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x86\x83a37V[`\x01\x83\x01\x82\x90Ug\r\xE0\xB6\xB3\xA7d\0\0`\x07\x84\x01U`\x01`\x01`\xA0\x1B\x03\x84\x16`\0\x90\x81Ra\x01\xF6` R`@\x90 TC\x10\x80\x15\x90a)\xA0WP`\x01`\x01`\xA0\x1B\x03\x84\x16`\0\x90\x81Ra\x01\xF6` R`@\x90 T\x15\x15[a)\xBDW`@Qc8l\xF4\x07`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\x01`\xA0\x1B\x03\x84\x16`\0\x81\x81Ra\x01\xF6` R`@\x80\x82 \x91\x90\x91UQ\x7F\xE5+=`\0\xFD[PPPP`@Q=`\0\x82>`\x1F=\x90\x81\x01`\x1F\x19\x16\x82\x01`@Ra*\xD6\x91\x90\x81\x01\x90aHgV[P\x94\x95PP`\x01`\x01`\xA0\x1B\x03\x85\x16\x93Pa+\x08\x92PPPW`@Qc\x9D\xB8\xD5\xB1`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\x01`\xA0\x1B\x03\x83\x16`\0\x90\x81Ra\x01\xF5` \x90\x81R`@\x80\x83 \x85\x84R\x90\x91R\x80\x82 \x81Q`\xA0\x81\x01\x90\x92R\x80T\x82\x90`\xFF\x16`\x04\x81\x11\x15a+NWa+NaC\x89V[`\x04\x81\x11\x15a+_Wa+_aC\x89V[\x81R`\x01\x82\x01T` \x82\x01R`\x02\x82\x01T`@\x82\x01R`\x03\x82\x01T``\x82\x01R`\x04\x90\x91\x01T`\x80\x90\x91\x01R\x90P`\0\x81Q`\x04\x81\x11\x15a+\xA2Wa+\xA2aC\x89V[\x03a+\xC0W`@Qc\x04\xC9\xDE\x83`\xE3\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x80\x81\x01Q\x15a+\xE3W`@Qc\x02\xE0}\x87`\xE6\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0a\x01\xF4`\0\x86`\x01`\x01`\xA0\x1B\x03\x16`\x01`\x01`\xA0\x1B\x03\x16\x81R` \x01\x90\x81R` \x01`\0 \x90P\x81` \x01Q\x81`\x02\x01`\0\x82\x82Ta,%\x91\x90aG\xE5V[\x92PP\x81\x90UP`\x01\x81`\x05\x01`\0\x82\x82Ta,A\x91\x90aG\xE5V[\x90\x91UPP`\x01`\x01`\xA0\x1B\x03\x85\x16`\0\x81\x81Ra\x01\xF5` \x90\x81R`@\x80\x83 \x88\x84R\x90\x91R\x80\x82 \x80T`\xFF\x19\x16\x81U`\x01\x81\x01\x83\x90U`\x02\x81\x01\x83\x90U`\x03\x81\x01\x83\x90U`\x04\x01\x82\x90UQ\x86\x92\x91\x7F\x83\x1C\xD5\xB7S\x83\x80\xB0\xA2\xA3\x14\x14\xD64\xECBq\x16\x07V\x84\xA2v\x82\x8A\xB4\xD2ut\xA2\xDF\xDF\x91\xA3PPPPPV[`\0\x80Q` aK'\x839\x81Q\x91R\x80T`\x01\x19\x01a,\xEEW`@Qc>\xE5\xAE\xB5`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x02\x90UV[`@Q`\x01`\x01`\xA0\x1B\x03\x84\x81\x16`$\x83\x01R\x83\x81\x16`D\x83\x01R`d\x82\x01\x83\x90Ra\x0B\xFB\x91\x86\x91\x82\x16\x90c#\xB8r\xDD\x90`\x84\x01[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x91P`\xE0\x1B` \x82\x01\x80Q`\x01`\x01`\xE0\x1B\x03\x83\x81\x83\x16\x17\x83RPPPPa9\x1AV[`\0\x80`\0\x80\x84\x80` \x01\x90Q\x81\x01\x90a-u\x91\x90aH\xF2V[PPP\x94P\x94P\x94PPPa-\x8B\x83\x83\x83a9}V[\x95\x94PPPPPV[`@\x80Q` \x81\x01\x82\x90R`\x03``\x82\x01Rbivs`\xE8\x1B`\x80\x82\x01R\x90\x81\x01\x82\x90R`\0\x90`\xA0\x01[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 \x90P\x91\x90PV[`\0\x84\x82`@Q` \x01a-\xF1\x92\x91\x90aI\xE0V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 \x90P`\0a.\x14\x82a9\xB6V[\x90P`\0a.X\x82\x87\x87\x80\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x93\x92\x91\x90\x81\x81R` \x01\x83\x83\x80\x82\x847`\0\x92\x01\x91\x90\x91RPa9\xF1\x92PPPV[\x90Pa.c\x87a.\xA4V[`\x01`\x01`\xA0\x1B\x03\x16\x81`\x01`\x01`\xA0\x1B\x03\x16\x14a\x13\xC2W`@Qc(\x80\xCB\x7F`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x82\x16`\x04\x82\x01R`$\x01[`@Q\x80\x91\x03\x90\xFD[`\0\x80\x82\x80` \x01\x90Q\x81\x01\x90a.\xBB\x91\x90aH\xF2V[PPPPPP\x91PPa.\xCD\x81a:\x1BV[\x93\x92PPPV[a\x1A\xE5\x813a:KV[`\0`\0\x80Q` aK\x07\x839\x81Q\x91Ra.\xF9\x84\x84a\x1B\xD0V[a/yW`\0\x84\x81R` \x82\x81R`@\x80\x83 `\x01`\x01`\xA0\x1B\x03\x87\x16\x84R\x90\x91R\x90 \x80T`\xFF\x19\x16`\x01\x17\x90Ua//3\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x83`\x01`\x01`\xA0\x1B\x03\x16\x85\x7F/\x87\x88\x11~~\xFF\x1D\x82\xE9&\xECyI\x01\xD1|x\x02JP'\t@0E@\xA73eo\r`@Q`@Q\x80\x91\x03\x90\xA4`\x01\x91PPa\x08qV[`\0\x91PPa\x08qV[`\0`\0\x80Q` aK\x07\x839\x81Q\x91Ra/\x9E\x84\x84a\x1B\xD0V[\x15a/yW`\0\x84\x81R` \x82\x81R`@\x80\x83 `\x01`\x01`\xA0\x1B\x03\x87\x16\x80\x85R\x92R\x80\x83 \x80T`\xFF\x19\x16\x90UQ3\x92\x87\x91\x7F\xF69\x1F\\2\xD9\xC6\x9D*G\xEAg\x0BD)t\xB595\xD1\xED\xC7\xFDd\xEB!\xE0G\xA89\x17\x1B\x91\x90\xA4`\x01\x91PPa\x08qV[a0\x07a:\x84V[V[0`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x14\x80a0\x90WP\x7F\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`\x01`\x01`\xA0\x1B\x03\x16a0\x84`\0\x80Q` aJ\xE7\x839\x81Q\x91RT`\x01`\x01`\xA0\x1B\x03\x16\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x14\x15[\x15a0\x07W`@Qcp>F\xDD`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0a\x14\x8A\x81a.\xD4V[\x81`\x01`\x01`\xA0\x1B\x03\x16cR\xD1\x90-`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x92PPP\x80\x15a1\x13WP`@\x80Q`\x1F=\x90\x81\x01`\x1F\x19\x16\x82\x01\x90\x92Ra1\x10\x91\x81\x01\x90aJ\nV[`\x01[a1;W`@QcL\x9C\x8C\xE3`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x83\x16`\x04\x82\x01R`$\x01a.\x9BV[`\0\x80Q` aJ\xE7\x839\x81Q\x91R\x81\x14a1lW`@Qc*\x87Ri`\xE2\x1B\x81R`\x04\x81\x01\x82\x90R`$\x01a.\x9BV[a\x08\xB6\x83\x83a:\xCDV[0`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x14a0\x07W`@Qcp>F\xDD`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\x01`\xA0\x1B\x03\x80\x82\x16`\0\x90\x81Ra\x01\xF4` \x90\x81R`@\x80\x83 \x81Qa\x01@\x81\x01\x83R\x81T\x90\x95\x16\x85R`\x01\x81\x01T\x92\x85\x01\x92\x90\x92R`\x02\x82\x01T\x90\x84\x01R`\x03\x81\x01T``\x84\x01R`\x04\x81\x01T`\x80\x84\x01R`\x05\x81\x01T`\xA0\x84\x01R`\x06\x81\x01T`\xC0\x84\x01R`\x07\x81\x01T`\xE0\x84\x01R`\x08\x81\x01Ta\x01\0\x84\x01R`\t\x81\x01\x80T\x92\x93\x84\x93\x90\x92\x91a\x01 \x84\x01\x91a2Z\x90aFHV[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta2\x86\x90aFHV[\x80\x15a2\xD3W\x80`\x1F\x10a2\xA8Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a2\xD3V[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a2\xB6W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81RPP\x90P`\0g\r\xE0\xB6\xB3\xA7d\0\0\x82a\x01\0\x01Q\x83`\xC0\x01Qa2\xFE\x91\x90aG\xACV[a3\x08\x91\x90aG\xC3V[\x90P\x81``\x01Q\x81\x10\x15a3 WP`\0\x93\x92PPPV[``\x82\x01Qa3/\x90\x82aG\xE5V[\x94\x93PPPPV[`@Q`\x01`\x01`\xA0\x1B\x03\x83\x81\x16`$\x83\x01R`D\x82\x01\x83\x90Ra\x08\xB6\x91\x85\x91\x82\x16\x90c\xA9\x05\x9C\xBB\x90`d\x01a-)V[`\x01`\x01`\xA0\x1B\x03\x80\x86\x16`\0\x90\x81Ra\x01\xF4` \x90\x81R`@\x80\x83 \x81Qa\x01@\x81\x01\x83R\x81T\x90\x95\x16\x85R`\x01\x81\x01T\x92\x85\x01\x92\x90\x92R`\x02\x82\x01T\x90\x84\x01R`\x03\x81\x01T``\x84\x01R`\x04\x81\x01T`\x80\x84\x01R`\x05\x81\x01T`\xA0\x84\x01R`\x06\x81\x01T`\xC0\x84\x01R`\x07\x81\x01T`\xE0\x84\x01R`\x08\x81\x01Ta\x01\0\x84\x01R`\t\x81\x01\x80T\x92\x93\x92a\x01 \x84\x01\x91\x90a4\0\x90aFHV[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta4,\x90aFHV[\x80\x15a4yW\x80`\x1F\x10a4NWa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a4yV[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a4\\W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPP\x91\x90\x92RPP\x81Q\x91\x92PP`\x01`\x01`\xA0\x1B\x03\x16a4\xAEW`@Qc\x1E\x1D\n\xB5`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0a4\xB9\x86a8\x8DV[\x91PPa4\xC5\x81a;#V[a4\xE2W`@Qc!\xA4\x8B\x8B`\xE2\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x7F\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`\x01`\x01`\xA0\x1B\x03\x16ck[!\xA6a5\x1A\x87a-[V[a5#\x89a;XV[`@Q`\x01`\x01`\xE0\x1B\x03\x19`\xE0\x85\x90\x1B\x16\x81R`\x04\x81\x01\x92\x90\x92R`$\x82\x01R`D\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a5dW=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a5\x88\x91\x90aG\x8FV[a5\xA5W`@Qc\xC4e\xE6\x9D`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0a5\xB0\x86a;\x87V[\x90Pa5\xBE\x86\x86\x86\x8Ba-\xDCV[`@Qc4\xFE\xDEe`\xE1\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x90ci\xFD\xBC\xCA\x90a6\x10\x90\x8B\x90\x8B\x90\x86\x90\x8C\x90`\x04\x01aJ#V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a6*W`\0\x80\xFD[PZ\xF1\x15\x80\x15a6>W=`\0\x80>=`\0\xFD[PPPPPPPPPPPPV[`\x01`\x01`\xA0\x1B\x03\x80\x82\x16`\0\x90\x81Ra\x01\xF4` \x90\x81R`@\x80\x83 \x81Qa\x01@\x81\x01\x83R\x81T\x90\x95\x16\x85R`\x01\x81\x01T\x92\x85\x01\x92\x90\x92R`\x02\x82\x01T\x90\x84\x01R`\x03\x81\x01T``\x84\x01R`\x04\x81\x01T`\x80\x84\x01R`\x05\x81\x01T`\xA0\x84\x01R`\x06\x81\x01T`\xC0\x84\x01R`\x07\x81\x01T`\xE0\x84\x01R`\x08\x81\x01Ta\x01\0\x84\x01R`\t\x81\x01\x80T\x92\x93\x84\x93\x90\x92\x91a\x01 \x84\x01\x91a6\xE7\x90aFHV[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta7\x13\x90aFHV[\x80\x15a7`W\x80`\x1F\x10a75Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a7`V[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a7CW\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81RPP\x90P`\0g\r\xE0\xB6\xB3\xA7d\0\0\x82`\xE0\x01Q\x83` \x01Qa7\x8A\x91\x90aG\xACV[a7\x94\x91\x90aG\xC3V[\x90P\x81`\x80\x01Q\x81\x10\x15a7\xACWP`\0\x93\x92PPPV[`\x80\x82\x01Qa3/\x90\x82aG\xE5V[`\0a7\xC7\x83\x83a\x15>V[P\x90P`\0\x81`\x04\x81\x11\x15a7\xDEWa7\xDEaC\x89V[\x14\x15\x80\x15a7\xFEWP`\x04\x81`\x04\x81\x11\x15a7\xFBWa7\xFBaC\x89V[\x14\x15[a8\x1BW`@Qc0\x04\x82\x87`\xE2\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\x01`\xA0\x1B\x03\x83\x16`\0\x81\x81Ra\x01\xF5` \x90\x81R`@\x80\x83 \x86\x84R\x90\x91R\x80\x82 \x80T`\xFF\x19\x16`\x04\x17\x81U\x90Q\x90\x92\x85\x92\x90\x91\x7F\xF9\xE1yp\xDFW\xA6\xA8E}\xCB\xB5\xC2\x91gkF1\xD37\xCFv\xB0\xC8\x01\xF6\xB8\xADj|_\x92\x91\x90\xA3\x80`\x04\x01T`\0\x03a\x0B\xFBWa\x0B\xFB\x84\x84a*cV[a\x01\xF8T`@Qc\xF8\xA9H/`\xE0\x1B\x81R`\x04\x81\x01\x83\x90R`\0\x91\x82\x91\x82\x91\x82\x91`\x01`\x01`\xA0\x1B\x03\x90\x91\x16\x90c\xF8\xA9H/\x90`$\x01`\0`@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a8\xE0W=`\0\x80>=`\0\xFD[PPPP`@Q=`\0\x82>`\x1F=\x90\x81\x01`\x1F\x19\x16\x82\x01`@Ra9\x08\x91\x90\x81\x01\x90aHgV[P\x94\x9A\x93\x99P\x92\x97PPPPPPPPV[`\0a9/`\x01`\x01`\xA0\x1B\x03\x84\x16\x83a;\xAEV[\x90P\x80Q`\0\x14\x15\x80\x15a9TWP\x80\x80` \x01\x90Q\x81\x01\x90a9R\x91\x90aG\x8FV[\x15[\x15a\x08\xB6W`@QcRt\xAF\xE7`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x84\x16`\x04\x82\x01R`$\x01a.\x9BV[`\0\x80\x84\x84\x84`@Q` \x01a9\x95\x93\x92\x91\x90aJgV[`@\x80Q\x80\x83\x03`\x1F\x19\x01\x81R\x91\x90R\x80Q` \x90\x91\x01 \x95\x94PPPPPV[`@Q\x7F\x19Ethereum Signed Message:\n32\0\0\0\0` \x82\x01R`<\x81\x01\x82\x90R`\0\x90`\\\x01a-\xBFV[`\0\x80`\0\x80a:\x01\x86\x86a;\xBCV[\x92P\x92P\x92Pa:\x11\x82\x82a<\tV[P\x90\x94\x93PPPPV[`\0\x81Q`@\x14a:?W`@Qc\xD2\x833]`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[P\x80Q` \x90\x91\x01 \x90V[a:U\x82\x82a\x1B\xD0V[a\x14\x8AW`@Qc\xE2Q}?`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x82\x16`\x04\x82\x01R`$\x81\x01\x83\x90R`D\x01a.\x9BV[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0T`\x01`@\x1B\x90\x04`\xFF\x16a0\x07W`@Qc\x1A\xFC\xD7\x9F`\xE3\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a:\xD6\x82a<\xC2V[`@Q`\x01`\x01`\xA0\x1B\x03\x83\x16\x90\x7F\xBC|\xD7Z \xEE'\xFD\x9A\xDE\xBA\xB3 A\xF7U!M\xBCk\xFF\xA9\x0C\xC0\"[9\xDA.\\-;\x90`\0\x90\xA2\x80Q\x15a;\x1BWa\x08\xB6\x82\x82a='V[a\x14\x8Aa=\x94V[`\0\x81\x15\x80a;QWP\x7F\xCD.f\xBF\x0B\x91\xEE\xED\xC6\xC6H\xAE\x935\xA7\x8D|\x9AJ\xB0\xEF3a*\x82M\x91\xCD\xC6\x8AO!\x82\x14[\x15\x92\x91PPV[`@\x80Q` \x81\x01\x82\x90R`\x03``\x82\x01Rb3\xB2\xB7`\xE9\x1B`\x80\x82\x01R\x90\x81\x01\x82\x90R`\0\x90`\xA0\x01a-\xBFV[```\0\x82\x80` \x01\x90Q\x81\x01\x90a;\x9F\x91\x90aH\xF2V[P\x94\x99\x98PPPPPPPPPV[``a.\xCD\x83\x83`\0a=\xB3V[`\0\x80`\0\x83Q`A\x03a;\xF6W` \x84\x01Q`@\x85\x01Q``\x86\x01Q`\0\x1Aa;\xE8\x88\x82\x85\x85a>PV[\x95P\x95P\x95PPPPa<\x02V[PP\x81Q`\0\x91P`\x02\x90[\x92P\x92P\x92V[`\0\x82`\x03\x81\x11\x15a<\x1DWa<\x1DaC\x89V[\x03a<&WPPV[`\x01\x82`\x03\x81\x11\x15a<:Wa<:aC\x89V[\x03aa=\x84V[``\x91P[P\x91P\x91Pa-\x8B\x85\x83\x83a?\x1FV[4\x15a0\x07W`@Qc\xB3\x98\x97\x9F`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[``\x81G\x10\x15a=\xD8W`@Qc\xCDx`Y`\xE0\x1B\x81R0`\x04\x82\x01R`$\x01a.\x9BV[`\0\x80\x85`\x01`\x01`\xA0\x1B\x03\x16\x84\x86`@Qa=\xF4\x91\x90aJ\xAAV[`\0`@Q\x80\x83\x03\x81\x85\x87Z\xF1\x92PPP=\x80`\0\x81\x14a>1W`@Q\x91P`\x1F\x19`?=\x01\x16\x82\x01`@R=\x82R=`\0` \x84\x01>a>6V[``\x91P[P\x91P\x91Pa>F\x86\x83\x83a?\x1FV[\x96\x95PPPPPPV[`\0\x80\x80\x7F\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF]WnsW\xA4P\x1D\xDF\xE9/Fh\x1B \xA0\x84\x11\x15a>\x8BWP`\0\x91P`\x03\x90P\x82a?\x15V[`@\x80Q`\0\x80\x82R` \x82\x01\x80\x84R\x8A\x90R`\xFF\x89\x16\x92\x82\x01\x92\x90\x92R``\x81\x01\x87\x90R`\x80\x81\x01\x86\x90R`\x01\x90`\xA0\x01` `@Q` \x81\x03\x90\x80\x84\x03\x90\x85Z\xFA\x15\x80\x15a>\xDFW=`\0\x80>=`\0\xFD[PP`@Q`\x1F\x19\x01Q\x91PP`\x01`\x01`\xA0\x1B\x03\x81\x16a?\x0BWP`\0\x92P`\x01\x91P\x82\x90Pa?\x15V[\x92P`\0\x91P\x81\x90P[\x94P\x94P\x94\x91PPV[``\x82a?4Wa?/\x82a?{V[a.\xCDV[\x81Q\x15\x80\x15a?KWP`\x01`\x01`\xA0\x1B\x03\x84\x16;\x15[\x15a?tW`@Qc\x99\x96\xB3\x15`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x85\x16`\x04\x82\x01R`$\x01a.\x9BV[P\x80a.\xCDV[\x80Q\x15a?\x8BW\x80Q\x80\x82` \x01\xFD[`@Qc\n\x12\xF5!`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[P\x80Ta?\xB0\x90aFHV[`\0\x82U\x80`\x1F\x10a?\xC0WPPV[`\x1F\x01` \x90\x04\x90`\0R` `\0 \x90\x81\x01\x90a\x1A\xE5\x91\x90[\x80\x82\x11\x15a?\xEEW`\0\x81U`\x01\x01a?\xDAV[P\x90V[`\0` \x82\x84\x03\x12\x15a@\x04W`\0\x80\xFD[\x815`\x01`\x01`\xE0\x1B\x03\x19\x81\x16\x81\x14a.\xCDW`\0\x80\xFD[`\0\x80` \x83\x85\x03\x12\x15a@/W`\0\x80\xFD[\x825`\x01`\x01`@\x1B\x03\x80\x82\x11\x15a@FW`\0\x80\xFD[\x81\x85\x01\x91P\x85`\x1F\x83\x01\x12a@ZW`\0\x80\xFD[\x815\x81\x81\x11\x15a@iW`\0\x80\xFD[\x86` \x82`\x05\x1B\x85\x01\x01\x11\x15a@~W`\0\x80\xFD[` \x92\x90\x92\x01\x96\x91\x95P\x90\x93PPPPV[`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a\x1A\xE5W`\0\x80\xFD[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`@Q`\x1F\x82\x01`\x1F\x19\x16\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a@\xE3Wa@\xE3a@\xA5V[`@R\x91\x90PV[`\0`\x01`\x01`@\x1B\x03\x82\x11\x15aA\x04WaA\x04a@\xA5V[P`\x1F\x01`\x1F\x19\x16` \x01\x90V[`\0\x82`\x1F\x83\x01\x12aA#W`\0\x80\xFD[\x815aA6aA1\x82a@\xEBV[a@\xBBV[\x81\x81R\x84` \x83\x86\x01\x01\x11\x15aAKW`\0\x80\xFD[\x81` \x85\x01` \x83\x017`\0\x91\x81\x01` \x01\x91\x90\x91R\x93\x92PPPV[`\0\x80`\0\x80`\x80\x85\x87\x03\x12\x15aA~W`\0\x80\xFD[\x845aA\x89\x81a@\x90V[\x93P` \x85\x015\x92P`@\x85\x015\x91P``\x85\x015`\x01`\x01`@\x1B\x03\x81\x11\x15aA\xB2W`\0\x80\xFD[aA\xBE\x87\x82\x88\x01aA\x12V[\x91PP\x92\x95\x91\x94P\x92PV[`\0\x80`@\x83\x85\x03\x12\x15aA\xDDW`\0\x80\xFD[\x825aA\xE8\x81a@\x90V[\x94` \x93\x90\x93\x015\x93PPPV[`\0\x80\x83`\x1F\x84\x01\x12aB\x08W`\0\x80\xFD[P\x815`\x01`\x01`@\x1B\x03\x81\x11\x15aB\x1FW`\0\x80\xFD[` \x83\x01\x91P\x83` \x82\x85\x01\x01\x11\x15a\x0C\x9CW`\0\x80\xFD[`\0\x80`\0\x80``\x85\x87\x03\x12\x15aBMW`\0\x80\xFD[\x845\x93P` \x85\x015`\x01`\x01`@\x1B\x03\x80\x82\x11\x15aBkW`\0\x80\xFD[aBw\x88\x83\x89\x01aA\x12V[\x94P`@\x87\x015\x91P\x80\x82\x11\x15aB\x8DW`\0\x80\xFD[PaB\x9A\x87\x82\x88\x01aA\xF6V[\x95\x98\x94\x97P\x95PPPPV[`\0` \x82\x84\x03\x12\x15aB\xB8W`\0\x80\xFD[P5\x91\x90PV[`\0\x80`@\x83\x85\x03\x12\x15aB\xD2W`\0\x80\xFD[\x825\x91P` \x83\x015aB\xE4\x81a@\x90V[\x80\x91PP\x92P\x92\x90PV[`\0\x80`@\x83\x85\x03\x12\x15aC\x02W`\0\x80\xFD[\x825aC\r\x81a@\x90V[\x91P` \x83\x015aB\xE4\x81a@\x90V[`\0` \x82\x84\x03\x12\x15aC/W`\0\x80\xFD[\x815a.\xCD\x81a@\x90V[`\0\x80`@\x83\x85\x03\x12\x15aCMW`\0\x80\xFD[\x825aCX\x81a@\x90V[\x91P` \x83\x015`\x01`\x01`@\x1B\x03\x81\x11\x15aCsW`\0\x80\xFD[aC\x7F\x85\x82\x86\x01aA\x12V[\x91PP\x92P\x92\x90PV[cNH{q`\xE0\x1B`\0R`!`\x04R`$`\0\xFD[`\x05\x81\x10aC\xBDWcNH{q`\xE0\x1B`\0R`!`\x04R`$`\0\xFD[\x90RV[`@\x81\x01aC\xCF\x82\x85aC\x9FV[\x82` \x83\x01R\x93\x92PPPV[`\0[\x83\x81\x10\x15aC\xF7W\x81\x81\x01Q\x83\x82\x01R` \x01aC\xDFV[PP`\0\x91\x01RV[`\0\x81Q\x80\x84RaD\x18\x81` \x86\x01` \x86\x01aC\xDCV[`\x1F\x01`\x1F\x19\x16\x92\x90\x92\x01` \x01\x92\x91PPV[`\0a\x01@`\x01\x80`\xA0\x1B\x03\x8D\x16\x83R\x8B` \x84\x01R\x8A`@\x84\x01R\x89``\x84\x01R\x88`\x80\x84\x01R\x87`\xA0\x84\x01R\x86`\xC0\x84\x01R\x85`\xE0\x84\x01R\x84a\x01\0\x84\x01R\x80a\x01 \x84\x01RaD\x80\x81\x84\x01\x85aD\0V[\x9D\x9CPPPPPPPPPPPPPV[`\0\x80`\0``\x84\x86\x03\x12\x15aD\xA6W`\0\x80\xFD[\x835aD\xB1\x81a@\x90V[\x95` \x85\x015\x95P`@\x90\x94\x015\x93\x92PPPV[`\xA0\x81\x01aD\xD4\x82\x88aC\x9FV[\x85` \x83\x01R\x84`@\x83\x01R\x83``\x83\x01R\x82`\x80\x83\x01R\x96\x95PPPPPPV[` \x81R`\0a.\xCD` \x83\x01\x84aD\0V[\x80\x15\x15\x81\x14a\x1A\xE5W`\0\x80\xFD[`\0\x80`\0\x80`\0\x80`\0\x80`\xE0\x89\x8B\x03\x12\x15aE3W`\0\x80\xFD[\x885\x97P` \x89\x015\x96P`@\x89\x015\x95P``\x89\x015\x94P`\x80\x89\x015aEZ\x81aE\tV[\x93P`\xA0\x89\x015`\x01`\x01`@\x1B\x03\x80\x82\x11\x15aEvW`\0\x80\xFD[aE\x82\x8C\x83\x8D\x01aA\x12V[\x94P`\xC0\x8B\x015\x91P\x80\x82\x11\x15aE\x98W`\0\x80\xFD[PaE\xA5\x8B\x82\x8C\x01aA\xF6V[\x99\x9C\x98\x9BP\x96\x99P\x94\x97\x93\x96\x92\x95\x94PPPV[`\0\x80`\0\x80`\x80\x85\x87\x03\x12\x15aE\xCFW`\0\x80\xFD[\x845aE\xDA\x81a@\x90V[\x93P` \x85\x015\x92P`@\x85\x015\x91P``\x85\x015aE\xF8\x81a@\x90V[\x93\x96\x92\x95P\x90\x93PPV[cNH{q`\xE0\x1B`\0R`2`\x04R`$`\0\xFD[cNH{q`\xE0\x1B`\0R`\x11`\x04R`$`\0\xFD[`\0`\x01\x82\x01aFAWaFAaF\x19V[P`\x01\x01\x90V[`\x01\x81\x81\x1C\x90\x82\x16\x80aF\\W`\x7F\x82\x16\x91P[` \x82\x10\x81\x03aF|WcNH{q`\xE0\x1B`\0R`\"`\x04R`$`\0\xFD[P\x91\x90PV[`\x1F\x82\x11\x15a\x08\xB6W`\0\x81\x81R` \x81 `\x1F\x85\x01`\x05\x1C\x81\x01` \x86\x10\x15aF\xA9WP\x80[`\x1F\x85\x01`\x05\x1C\x82\x01\x91P[\x81\x81\x10\x15aF\xC8W\x82\x81U`\x01\x01aF\xB5V[PPPPPPV[\x81Q`\x01`\x01`@\x1B\x03\x81\x11\x15aF\xE9WaF\xE9a@\xA5V[aF\xFD\x81aF\xF7\x84TaFHV[\x84aF\x82V[` \x80`\x1F\x83\x11`\x01\x81\x14aG2W`\0\x84\x15aG\x1AWP\x85\x83\x01Q[`\0\x19`\x03\x86\x90\x1B\x1C\x19\x16`\x01\x85\x90\x1B\x17\x85UaF\xC8V[`\0\x85\x81R` \x81 `\x1F\x19\x86\x16\x91[\x82\x81\x10\x15aGaW\x88\x86\x01Q\x82U\x94\x84\x01\x94`\x01\x90\x91\x01\x90\x84\x01aGBV[P\x85\x82\x10\x15aG\x7FW\x87\x85\x01Q`\0\x19`\x03\x88\x90\x1B`\xF8\x16\x1C\x19\x16\x81U[PPPPP`\x01\x90\x81\x1B\x01\x90UPV[`\0` \x82\x84\x03\x12\x15aG\xA1W`\0\x80\xFD[\x81Qa.\xCD\x81aE\tV[\x80\x82\x02\x81\x15\x82\x82\x04\x84\x14\x17a\x08qWa\x08qaF\x19V[`\0\x82aG\xE0WcNH{q`\xE0\x1B`\0R`\x12`\x04R`$`\0\xFD[P\x04\x90V[\x81\x81\x03\x81\x81\x11\x15a\x08qWa\x08qaF\x19V[\x80\x82\x01\x80\x82\x11\x15a\x08qWa\x08qaF\x19V[`\0\x81aH\x1AWaH\x1AaF\x19V[P`\0\x19\x01\x90V[`\0\x82`\x1F\x83\x01\x12aH3W`\0\x80\xFD[\x81QaHAaA1\x82a@\xEBV[\x81\x81R\x84` \x83\x86\x01\x01\x11\x15aHVW`\0\x80\xFD[a3/\x82` \x83\x01` \x87\x01aC\xDCV[`\0\x80`\0\x80`\0\x80`\0`\xE0\x88\x8A\x03\x12\x15aH\x82W`\0\x80\xFD[\x87QaH\x8D\x81a@\x90V[\x80\x97PP` \x88\x01Q\x95P`@\x88\x01Q\x94P``\x88\x01Q\x93P`\x80\x88\x01Q\x92P`\xA0\x88\x01QaH\xBB\x81a@\x90V[`\xC0\x89\x01Q\x90\x92P`\x01`\x01`@\x1B\x03\x81\x11\x15aH\xD7W`\0\x80\xFD[aH\xE3\x8A\x82\x8B\x01aH\"V[\x91PP\x92\x95\x98\x91\x94\x97P\x92\x95PV[`\0\x80`\0\x80`\0\x80`\0\x80a\x01\0\x89\x8B\x03\x12\x15aI\x0FW`\0\x80\xFD[\x88Q`\x01`\x01`@\x1B\x03\x80\x82\x11\x15aI&W`\0\x80\xFD[aI2\x8C\x83\x8D\x01aH\"V[\x99P` \x8B\x01Q\x91P\x80\x82\x11\x15aIHW`\0\x80\xFD[aIT\x8C\x83\x8D\x01aH\"V[\x98P`@\x8B\x01Q\x91P\x80\x82\x11\x15aIjW`\0\x80\xFD[aIv\x8C\x83\x8D\x01aH\"V[\x97P``\x8B\x01Q\x91P\x80\x82\x11\x15aI\x8CW`\0\x80\xFD[aI\x98\x8C\x83\x8D\x01aH\"V[\x96P`\x80\x8B\x01Q\x91P\x80\x82\x11\x15aI\xAEW`\0\x80\xFD[PaI\xBB\x8B\x82\x8C\x01aH\"V[\x94PP`\xA0\x89\x01Q\x92P`\xC0\x89\x01Q\x91P`\xE0\x89\x01Q\x90P\x92\x95\x98P\x92\x95\x98\x90\x93\x96PV[`@\x81R`\0aI\xF3`@\x83\x01\x85aD\0V[\x90P`\x01\x80`\xA0\x1B\x03\x83\x16` \x83\x01R\x93\x92PPPV[`\0` \x82\x84\x03\x12\x15aJ\x1CW`\0\x80\xFD[PQ\x91\x90PV[`\x01\x80`\xA0\x1B\x03\x85\x16\x81R\x83` \x82\x01R`\x80`@\x82\x01R`\0aJJ`\x80\x83\x01\x85aD\0V[\x82\x81\x03``\x84\x01RaJ\\\x81\x85aD\0V[\x97\x96PPPPPPPV[`\0\x84QaJy\x81\x84` \x89\x01aC\xDCV[\x84Q\x90\x83\x01\x90aJ\x8D\x81\x83` \x89\x01aC\xDCV[\x84Q\x91\x01\x90aJ\xA0\x81\x83` \x88\x01aC\xDCV[\x01\x95\x94PPPPPV[`\0\x82QaJ\xBC\x81\x84` \x87\x01aC\xDCV[\x91\x90\x91\x01\x92\x91PPV\xFE\xC7\x9BP*\x85%\xF5\x83\xD1)\xC1Ep\xE1|\xE9\xBC\xA2a\x10\xA5\xC4\x1A\xB7\xE2Uo\x95\xE0\x81\xFE\xC56\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC\x02\xDD{\xC7\xDE\xC4\xDC\xEE\xDD\xA7u\xE5\x8D\xD5A\xE0\x8A\x11llS\x81\\\x0B\xD0(\x19/{bh\0\x9Bw\x9B\x17B-\r\xF9\"#\x01\x8B2\xB4\xD1\xFAF\xE0qr=h\x17\xE2Hm\0;\xEC\xC5_\0\xA2dipfsX\"\x12 }\x87\xE1Y\x1A\xB2\xC2a\x19\x05:M\xF3\xE7\xEC\x98\x1CY\xD9H\x8A\xDC_\xED\xEF\x82\xB5\xAC\x83\x10\x98\xC5dsolcC\0\x08\x14\x003"; + const __DEPLOYED_BYTECODE: &[u8] = b"`\x80`@R`\x046\x10a\x02QW`\x005`\xE0\x1C\x80cz\x14\xC4c\x11a\x019W\x80c\xA2\x17\xFD\xDF\x11a\0\xB6W\x80c\xD5Gt\x1F\x11a\0zW\x80c\xD5Gt\x1F\x14a\x07\xA6W\x80c\xE2\xFA3\xCE\x14a\x07\xC6W\x80c\xE7\xBC\x96\0\x14a\x07\xE6W\x80c\xE9\xE94\xA0\x14a\x08\x06W\x80c\xEA\xAC\xAE\x94\x14a\x08&W\x80c\xF2\x88\x8D\xBB\x14a\x08FW`\0\x80\xFD[\x80c\xA2\x17\xFD\xDF\x14a\x06\xF3W\x80c\xAD<\xB1\xCC\x14a\x07\x08W\x80c\xAD\xC9w.\x14a\x07FW\x80c\xC4\x92\xEE9\x14a\x07fW\x80c\xD0n\x1F{\x14a\x07\x86W`\0\x80\xFD[\x80c\x92\xEB\x91\xE2\x11a\0\xFDW\x80c\x92\xEB\x91\xE2\x14a\x06\x08W\x80c\x96\xDE\x0E\xEF\x14a\x06(W\x80c\x98*A]\x14a\x06HW\x80c\x9A\x7F\xCA\x8E\x14a\x06hW\x80c\x9F]\xB9\x86\x14a\x06\xD3W`\0\x80\xFD[\x80cz\x14\xC4c\x14a\x04RW\x80c\x81\xC4\\p\x14a\x05qW\x80c\x84\xAC3\xEC\x14a\x05\x92W\x80c\x8C\xFCV\xD8\x14a\x05\xB2W\x80c\x91\xD1HT\x14a\x05\xE8W`\0\x80\xFD[\x80c/\x8FJ;\x11a\x01\xD2W\x80cO\x1E\xF2\x86\x11a\x01\x96W\x80cO\x1E\xF2\x86\x14a\x04\xA7W\x80cR\xD1\x90-\x14a\x04\xBAW\x80cT\x1A\x8C\x18\x14a\x04\xCFW\x80cdmQ\xB4\x14a\x04\xEFW\x80cf\x1D\xE5\xAC\x14a\x05\x1DW\x80cm@Xw\x14a\x05QW`\0\x80\xFD[\x80c/\x8FJ;\x14a\x04\x1DW\x80c6V\x8A\xBE\x14a\x042W\x80c<^\xB5|\x14a\x04RW\x80cH\\\xC9U\x14a\x04gW\x80cM*\xAB\x9A\x14a\x04\x87W`\0\x80\xFD[\x80c!\x80\xDE]\x11a\x02\x19W\x80c!\x80\xDE]\x14a\x03NW\x80c$\x8A\x9C\xA3\x14a\x03nW\x80c+a\x0C-\x14a\x03\x9CW\x80c,\x1F\xBD\x03\x14a\x03\xDBW\x80c//\xF1]\x14a\x03\xFDW`\0\x80\xFD[\x80c\x01\xFF\xC9\xA7\x14a\x02VW\x80c\x04y\xD6D\x14a\x02\x8BW\x80c\x08\xBEk\xAD\x14a\x02\xD7W\x80c\x13m\xFB\xF5\x14a\x02\xF9W\x80c\x1C~\xAEe\x14a\x03\x19W[`\0\x80\xFD[4\x80\x15a\x02bW`\0\x80\xFD[Pa\x02va\x02q6`\x04a?\x84V[a\x08fV[`@Q\x90\x15\x15\x81R` \x01[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x02\x97W`\0\x80\xFD[Pa\x02\xBF\x7F\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\x81V[`@Q`\x01`\x01`\xA0\x1B\x03\x90\x91\x16\x81R` \x01a\x02\x82V[4\x80\x15a\x02\xE3W`\0\x80\xFD[Pa\x02\xF7a\x02\xF26`\x04a?\xAEV[a\x08wV[\0[4\x80\x15a\x03\x05W`\0\x80\xFD[Pa\x02\xF7a\x03\x146`\x04a@\xFBV[a\x08\xB1V[4\x80\x15a\x03%W`\0\x80\xFD[Pa\x039a\x0346`\x04aA]V[a\x0B\xF7V[`@\x80Q\x92\x83R` \x83\x01\x91\x90\x91R\x01a\x02\x82V[4\x80\x15a\x03ZW`\0\x80\xFD[Pa\x02\xF7a\x03i6`\x04aA\xCAV[a\x0C\x99V[4\x80\x15a\x03zW`\0\x80\xFD[Pa\x03\x8Ea\x03\x896`\x04aB=V[a\x0E+V[`@Q\x90\x81R` \x01a\x02\x82V[4\x80\x15a\x03\xA8W`\0\x80\xFD[Pa\x03\xBCa\x03\xB76`\x04aA]V[a\x0EMV[`@\x80Q`\x01`\x01`\xA0\x1B\x03\x90\x93\x16\x83R` \x83\x01\x91\x90\x91R\x01a\x02\x82V[4\x80\x15a\x03\xE7W`\0\x80\xFD[Pa\x03\x8E`\0\x80Q` aJq\x839\x81Q\x91R\x81V[4\x80\x15a\x04\tW`\0\x80\xFD[Pa\x02\xF7a\x04\x186`\x04aBVV[a\x104V[4\x80\x15a\x04)W`\0\x80\xFD[Pa\x02\xF7a\x10PV[4\x80\x15a\x04>W`\0\x80\xFD[Pa\x02\xF7a\x04M6`\x04aBVV[a\x12'V[4\x80\x15a\x04^W`\0\x80\xFD[Pa\x03\x8E`d\x81V[4\x80\x15a\x04sW`\0\x80\xFD[Pa\x02\xF7a\x04\x826`\x04aB\x86V[a\x12ZV[4\x80\x15a\x04\x93W`\0\x80\xFD[Pa\x02\xF7a\x04\xA26`\x04aB\xB4V[a\x13\xC1V[a\x02\xF7a\x04\xB56`\x04aB\xD1V[a\x14eV[4\x80\x15a\x04\xC6W`\0\x80\xFD[Pa\x03\x8Ea\x14\x84V[4\x80\x15a\x04\xDBW`\0\x80\xFD[Pa\x02\xF7a\x04\xEA6`\x04aB=V[a\x14\xA1V[4\x80\x15a\x04\xFBW`\0\x80\xFD[Pa\x05\x0Fa\x05\n6`\x04aA]V[a\x154V[`@Qa\x02\x82\x92\x91\x90aCXV[4\x80\x15a\x05)W`\0\x80\xFD[Pa\x02\xBF\x7F\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\x81V[4\x80\x15a\x05]W`\0\x80\xFD[Pa\x02\xF7a\x05l6`\x04aB=V[a\x17\xF8V[4\x80\x15a\x05}W`\0\x80\xFD[Pa\x01\xF8Ta\x02\xBF\x90`\x01`\x01`\xA0\x1B\x03\x16\x81V[4\x80\x15a\x05\x9EW`\0\x80\xFD[Pa\x02\xF7a\x05\xAD6`\x04aB\xB4V[a\x18\x9FV[4\x80\x15a\x05\xBEW`\0\x80\xFD[Pa\x05\xD2a\x05\xCD6`\x04aB\xB4V[a\x1A\xDEV[`@Qa\x02\x82\x9A\x99\x98\x97\x96\x95\x94\x93\x92\x91\x90aC\xC3V[4\x80\x15a\x05\xF4W`\0\x80\xFD[Pa\x02va\x06\x036`\x04aBVV[a\x1B\xC6V[4\x80\x15a\x06\x14W`\0\x80\xFD[Pa\x02\xF7a\x06#6`\x04aA\xCAV[a\x1B\xFEV[4\x80\x15a\x064W`\0\x80\xFD[Pa\x02\xF7a\x06C6`\x04aB=V[a\x1C\x0BV[4\x80\x15a\x06TW`\0\x80\xFD[Pa\x02\xF7a\x06c6`\x04aD(V[a\x1D\x8AV[4\x80\x15a\x06tW`\0\x80\xFD[Pa\x06\xC2a\x06\x836`\x04aA]V[a\x01\xF5` \x90\x81R`\0\x92\x83R`@\x80\x84 \x90\x91R\x90\x82R\x90 \x80T`\x01\x82\x01T`\x02\x83\x01T`\x03\x84\x01T`\x04\x90\x94\x01T`\xFF\x90\x93\x16\x93\x91\x92\x90\x91\x90\x85V[`@Qa\x02\x82\x95\x94\x93\x92\x91\x90aD]V[4\x80\x15a\x06\xDFW`\0\x80\xFD[Pa\x02\xF7a\x06\xEE6`\x04aB=V[a\x1F\x0CV[4\x80\x15a\x06\xFFW`\0\x80\xFD[Pa\x03\x8E`\0\x81V[4\x80\x15a\x07\x14W`\0\x80\xFD[Pa\x079`@Q\x80`@\x01`@R\x80`\x05\x81R` \x01d\x03R\xE3\x02\xE3`\xDC\x1B\x81RP\x81V[`@Qa\x02\x82\x91\x90aD\x8DV[4\x80\x15a\x07RW`\0\x80\xFD[Pa\x03\x8Ea\x07a6`\x04aA]V[a\x1F\x16V[4\x80\x15a\x07rW`\0\x80\xFD[Pa\x02\xF7a\x07\x816`\x04aD(V[a FV[4\x80\x15a\x07\x92W`\0\x80\xFD[Pa\x02\xF7a\x07\xA16`\x04a?\xAEV[a\"_V[4\x80\x15a\x07\xB2W`\0\x80\xFD[Pa\x02\xF7a\x07\xC16`\x04aBVV[a\"\x94V[4\x80\x15a\x07\xD2W`\0\x80\xFD[Pa\x02\xF7a\x07\xE16`\x04aD\xAEV[a\"\xB0V[4\x80\x15a\x07\xF2W`\0\x80\xFD[Pa\x02\xF7a\x08\x016`\x04aB=V[a%TV[4\x80\x15a\x08\x12W`\0\x80\xFD[Pa\x02\xF7a\x08!6`\x04aB=V[a%^V[4\x80\x15a\x082W`\0\x80\xFD[Pa\x03\x8Ea\x08A6`\x04aETV[a&\x83V[4\x80\x15a\x08RW`\0\x80\xFD[Pa\x02\xF7a\x08a6`\x04aB\xB4V[a(ZV[`\0a\x08q\x82a*]V[\x92\x91PPV[`\0[\x81\x81\x10\x15a\x08\xACWa\x08\xA43\x84\x84\x84\x81\x81\x10a\x08\x98Wa\x08\x98aE\x9EV[\x90P` \x02\x015a*\x92V[`\x01\x01a\x08zV[PPPV[a\x08\xB9a,\xEBV[3`\0\x81\x81Ra\x01\xF4` \x90\x81R`@\x80\x83 \x81Qa\x01@\x81\x01\x83R\x81T`\x01`\x01`\xA0\x1B\x03\x16\x81R`\x01\x82\x01T\x93\x81\x01\x93\x90\x93R`\x02\x81\x01T\x91\x83\x01\x91\x90\x91R`\x03\x81\x01T``\x83\x01R`\x04\x81\x01T`\x80\x83\x01R`\x05\x81\x01T`\xA0\x83\x01R`\x06\x81\x01T`\xC0\x83\x01R`\x07\x81\x01T`\xE0\x83\x01R`\x08\x81\x01Ta\x01\0\x83\x01R`\t\x81\x01\x80Ta\x01 \x84\x01\x91\x90a\tM\x90aE\xB4V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\ty\x90aE\xB4V[\x80\x15a\t\xC6W\x80`\x1F\x10a\t\x9BWa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\t\xC6V[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\t\xA9W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81RPP\x90P\x82Q`\0\x14\x80a\t\xE8WP`\x01`\x01`\xA0\x1B\x03\x86\x16\x15[\x80a\t\xF1WP\x84\x15[\x15a\n\x0FW`@Qc\x1E\x1D\n\xB5`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x80Q`\x01`\x01`\xA0\x1B\x03\x16\x15a\n8W`@QcXt\xF9{`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`@Q\x80a\x01@\x01`@R\x80\x87`\x01`\x01`\xA0\x1B\x03\x16\x81R` \x01\x85\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01\x86\x81R` \x01g\r\xE0\xB6\xB3\xA7d\0\0\x81R` \x01g\r\xE0\xB6\xB3\xA7d\0\0\x81R` \x01\x84\x81RPa\x01\xF4`\0\x84`\x01`\x01`\xA0\x1B\x03\x16`\x01`\x01`\xA0\x1B\x03\x16\x81R` \x01\x90\x81R` \x01`\0 `\0\x82\x01Q\x81`\0\x01`\0a\x01\0\n\x81T\x81`\x01`\x01`\xA0\x1B\x03\x02\x19\x16\x90\x83`\x01`\x01`\xA0\x1B\x03\x16\x02\x17\x90UP` \x82\x01Q\x81`\x01\x01U`@\x82\x01Q\x81`\x02\x01U``\x82\x01Q\x81`\x03\x01U`\x80\x82\x01Q\x81`\x04\x01U`\xA0\x82\x01Q\x81`\x05\x01U`\xC0\x82\x01Q\x81`\x06\x01U`\xE0\x82\x01Q\x81`\x07\x01Ua\x01\0\x82\x01Q\x81`\x08\x01Ua\x01 \x82\x01Q\x81`\t\x01\x90\x81a\x0BU\x91\x90aF5V[PP\x84\x15\x90Pa\x0B\x94Wa\x0B\x94`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x830\x87a-#V[`@\x80Q\x86\x81R` \x81\x01\x86\x90R`\x01`\x01`\xA0\x1B\x03\x84\x16\x91\x7FI\x1B\x0FF\x1D\x05\xB7\x9B\xFCi\x04\xA9\xBA\x9D\xF5#\xD7fP?\x11\x04k+^n\xDD\xAA\xE3\xA7#\x1C\x91\x01`@Q\x80\x91\x03\x90\xA2PPa\x0B\xF1`\x01`\0\x80Q` aJ\xD1\x839\x81Q\x91RUV[PPPPV[`\x01`\x01`\xA0\x1B\x03\x82\x16`\0\x90\x81Ra\x01\xF5` \x90\x81R`@\x80\x83 \x84\x84R\x90\x91R\x80\x82 \x81Q`\xA0\x81\x01\x90\x92R\x80T\x83\x92\x83\x92\x90\x91\x82\x90`\xFF\x16`\x04\x81\x11\x15a\x0CCWa\x0CCaC V[`\x04\x81\x11\x15a\x0CTWa\x0CTaC V[\x81R` \x01`\x01\x82\x01T\x81R` \x01`\x02\x82\x01T\x81R` \x01`\x03\x82\x01T\x81R` \x01`\x04\x82\x01T\x81RPP\x90P\x80`@\x01Q\x81``\x01Q\x92P\x92PP[\x92P\x92\x90PV[\x7F\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`\x01`\x01`\xA0\x1B\x03\x16ck[!\xA6a\x0C\xD1\x85a-\x8AV[a\x0C\xDA\x87a-\xC3V[`@Q`\x01`\x01`\xE0\x1B\x03\x19`\xE0\x85\x90\x1B\x16\x81R`\x04\x81\x01\x92\x90\x92R`$\x82\x01R`D\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\r\x1BW=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\r?\x91\x90aF\xF3V[a\r\\W`@Qc\xC4e\xE6\x9D`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\rh\x83\x83\x833a.\x0BV[`@Qc\x07\x07Y\x1F`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x90c\x07\x07Y\x1F\x90a\r\xB4\x90\x86\x90`\x04\x01aD\x8DV[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\r\xCEW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\r\xE2W=`\0\x80>=`\0\xFD[PPPPa\r\xEF\x83a.\xD3V[`\x01`\x01`\xA0\x1B\x03\x16\x84\x7F\xC3\xFB\xBD\xB6\xAA\x8D\x99\xF6\xEF\xE2J:\"\xE9\xA9\x9F\xFE\xF2J/9\x9C\x0B\x1ET\x99F\xF9\x1B\xF06\xE4`@Q`@Q\x80\x91\x03\x90\xA3PPPPV[`\0\x90\x81R`\0\x80Q` aJ\xB1\x839\x81Q\x91R` R`@\x90 `\x01\x01T\x90V[`\x01`\x01`\xA0\x1B\x03\x82\x16`\0\x90\x81Ra\x01\xF5` \x90\x81R`@\x80\x83 \x84\x84R\x90\x91R\x80\x82 \x81Q`\xA0\x81\x01\x90\x92R\x80T\x83\x92\x83\x92\x90\x91\x82\x90`\xFF\x16`\x04\x81\x11\x15a\x0E\x99Wa\x0E\x99aC V[`\x04\x81\x11\x15a\x0E\xAAWa\x0E\xAAaC V[\x81R` \x01`\x01\x82\x01T\x81R` \x01`\x02\x82\x01T\x81R` \x01`\x03\x82\x01T\x81R` \x01`\x04\x82\x01T\x81RPP\x90P`\0a\x01\xF4`\0\x87`\x01`\x01`\xA0\x1B\x03\x16`\x01`\x01`\xA0\x1B\x03\x16\x81R` \x01\x90\x81R` \x01`\0 `@Q\x80a\x01@\x01`@R\x90\x81`\0\x82\x01`\0\x90T\x90a\x01\0\n\x90\x04`\x01`\x01`\xA0\x1B\x03\x16`\x01`\x01`\xA0\x1B\x03\x16`\x01`\x01`\xA0\x1B\x03\x16\x81R` \x01`\x01\x82\x01T\x81R` \x01`\x02\x82\x01T\x81R` \x01`\x03\x82\x01T\x81R` \x01`\x04\x82\x01T\x81R` \x01`\x05\x82\x01T\x81R` \x01`\x06\x82\x01T\x81R` \x01`\x07\x82\x01T\x81R` \x01`\x08\x82\x01T\x81R` \x01`\t\x82\x01\x80Ta\x0F\x9B\x90aE\xB4V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\x0F\xC7\x90aE\xB4V[\x80\x15a\x10\x14W\x80`\x1F\x10a\x0F\xE9Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\x10\x14V[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\x0F\xF7W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPP\x91\x90\x92RPP\x90Q`@\x90\x93\x01Q\x92\x94P\x91\x92PPP\x92P\x92\x90PV[a\x10=\x82a\x0E+V[a\x10F\x81a/\x03V[a\x0B\xF1\x83\x83a/\rV[3`\0\x81\x81Ra\x01\xF4` R`@\x90 `\t\x81\x01\x80Ta\x10o\x90aE\xB4V[\x15\x90P\x80a\x10\x85WP\x80T`\x01`\x01`\xA0\x1B\x03\x16\x15[\x15a\x10\xA3W`@QcdF\xF9\x17`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[g\r\xE0\xB6\xB3\xA7d\0\0\x81`\x08\x01T\x03a\x10\xCFW`@Qc\x89\x83`\x9D`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0g\r\xE0\xB6\xB3\xA7d\0\0\x82`\x06\x01T\x83`\x08\x01Ta\x10\xEE\x91\x90aG&V[a\x10\xF8\x91\x90aG=V[\x90P`\0\x81\x83`\x06\x01Ta\x11\x0C\x91\x90aG_V[\x90P\x82`\x03\x01T\x82\x10\x15a\x113W`@Qc\x01\x19\"\xB7`\xE3\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x82`\x02\x01T\x82\x10\x15a\x11XW`@Qc\x01\x19\"\xB7`\xE3\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x06\x83\x01\x82\x90Ug\r\xE0\xB6\xB3\xA7d\0\0`\x08\x84\x01U`\x01`\x01`\xA0\x1B\x03\x84\x16`\0\x90\x81Ra\x01\xF7` R`@\x90 TC\x10\x80\x15\x90a\x11\xAEWP`\x01`\x01`\xA0\x1B\x03\x84\x16`\0\x90\x81Ra\x01\xF7` R`@\x90 T\x15\x15[a\x11\xCBW`@Qc8l\xF4\x07`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\x01`\xA0\x1B\x03\x84\x16`\0\x81\x81Ra\x01\xF7` R`@\x80\x82 \x91\x90\x91UQ\x7F\x11\xDE\xAE(\x9Epx\xFC\xE2\x88\xF4\xE9sN\x9C=\xF6{U\xEA\xC4\xFFA\xB8\x90\xB6\xD68\x1A\xCE\xE7b\x90a\x12\x19\x90\x84\x81R` \x01\x90V[`@Q\x80\x91\x03\x90\xA2PPPPV[`\x01`\x01`\xA0\x1B\x03\x81\x163\x14a\x12PW`@Qc3K\xD9\x19`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x08\xAC\x82\x82a/\xB2V[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x80T`\x01`@\x1B\x81\x04`\xFF\x16\x15\x90`\x01`\x01`@\x1B\x03\x16`\0\x81\x15\x80\x15a\x12\x9FWP\x82[\x90P`\0\x82`\x01`\x01`@\x1B\x03\x16`\x01\x14\x80\x15a\x12\xBBWP0;\x15[\x90P\x81\x15\x80\x15a\x12\xC9WP\x80\x15[\x15a\x12\xE7W`@Qc\xF9.\xE8\xA9`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x84Tg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x19\x16`\x01\x17\x85U\x83\x15a\x13\x11W\x84T`\xFF`@\x1B\x19\x16`\x01`@\x1B\x17\x85U[a\x13\x19a0.V[a\x13!a0.V[a\x13)a0.V[a\x131a0.V[a\x13<`\0\x88a/\rV[Pa\x13U`\0\x80Q` aJq\x839\x81Q\x91R\x87a/\rV[Pa\x01\xF8\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16`\x01`\x01`\xA0\x1B\x03\x88\x16\x17\x90U\x83\x15a\x13\xB8W\x84T`\xFF`@\x1B\x19\x16\x85U`@Q`\x01\x81R\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x90` \x01`@Q\x80\x91\x03\x90\xA1[PPPPPPPV[3`\0\x81\x81Ra\x01\xF4` R`@\x90 `\x01`\x01`\xA0\x1B\x03\x83\x16\x15\x80a\x13\xEFWP\x80T`\x01`\x01`\xA0\x1B\x03\x16\x15[\x15a\x14\rW`@Qc\x1E\x1D\n\xB5`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16`\x01`\x01`\xA0\x1B\x03\x84\x81\x16\x91\x82\x17\x83U`@Q\x91\x82R\x83\x16\x90\x7F\xB1\x95\xA9K\xEC\xD3\x88\xC9\xA0\x7F\xE8\x18qh3\xBD\xF9\x8Bu\\x\xC9\xB48\xF4\xC8\xF0o5O\xA3h\x90` \x01[`@Q\x80\x91\x03\x90\xA2PPPV[a\x14ma08V[a\x14v\x82a0\xDDV[a\x14\x80\x82\x82a0\xE8V[PPV[`\0a\x14\x8Ea1\xA5V[P`\0\x80Q` aJ\x91\x839\x81Q\x91R\x90V[`\x01`\x01`\xA0\x1B\x03\x7F\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\x16c\xED8\r\x033`@Q`\x01`\x01`\xE0\x1B\x03\x19`\xE0\x84\x90\x1B\x16\x81R`\x01`\x01`\xA0\x1B\x03\x90\x91\x16`\x04\x82\x01R`$\x81\x01\x84\x90R`D\x01`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x15\x19W`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x15-W=`\0\x80>=`\0\xFD[PPPPPV[`\x01`\x01`\xA0\x1B\x03\x82\x16`\0\x90\x81Ra\x01\xF5` \x90\x81R`@\x80\x83 \x84\x84R\x90\x91R\x80\x82 \x81Q`\xA0\x81\x01\x90\x92R\x80T\x83\x92\x83\x92\x90\x91\x82\x90`\xFF\x16`\x04\x81\x11\x15a\x15\x80Wa\x15\x80aC V[`\x04\x81\x11\x15a\x15\x91Wa\x15\x91aC V[\x81R` \x01`\x01\x82\x01T\x81R` \x01`\x02\x82\x01T\x81R` \x01`\x03\x82\x01T\x81R` \x01`\x04\x82\x01T\x81RPP\x90P`\0a\x01\xF4`\0\x87`\x01`\x01`\xA0\x1B\x03\x16`\x01`\x01`\xA0\x1B\x03\x16\x81R` \x01\x90\x81R` \x01`\0 `@Q\x80a\x01@\x01`@R\x90\x81`\0\x82\x01`\0\x90T\x90a\x01\0\n\x90\x04`\x01`\x01`\xA0\x1B\x03\x16`\x01`\x01`\xA0\x1B\x03\x16`\x01`\x01`\xA0\x1B\x03\x16\x81R` \x01`\x01\x82\x01T\x81R` \x01`\x02\x82\x01T\x81R` \x01`\x03\x82\x01T\x81R` \x01`\x04\x82\x01T\x81R` \x01`\x05\x82\x01T\x81R` \x01`\x06\x82\x01T\x81R` \x01`\x07\x82\x01T\x81R` \x01`\x08\x82\x01T\x81R` \x01`\t\x82\x01\x80Ta\x16\x82\x90aE\xB4V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\x16\xAE\x90aE\xB4V[\x80\x15a\x16\xFBW\x80`\x1F\x10a\x16\xD0Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\x16\xFBV[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\x16\xDEW\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81RPP\x90P`\0`\x04\x81\x11\x15a\x17\x19Wa\x17\x19aC V[\x82Q`\x04\x81\x11\x15a\x17,Wa\x17,aC V[\x03a\x17?W`\0\x80\x93P\x93PPPa\x0C\x92V[`\x04\x82Q`\x04\x81\x11\x15a\x17TWa\x17TaC V[\x03a\x17hW`\x04`\0\x93P\x93PPPa\x0C\x92V[`\0a\x17s\x87a1\xEEV[\x90P`\0\x83Q`\x04\x81\x11\x15a\x17\x8AWa\x17\x8AaC V[\x14\x15\x80\x15a\x17\x96WP\x80\x15[\x15a\x17\xABW`\x02`\0\x94P\x94PPPPa\x0C\x92V[\x81`\xC0\x01Q\x81\x03a\x17\xC4W`\x01\x94P\x92Pa\x0C\x92\x91PPV[\x80\x15\x80\x15\x90a\x17\xD6WP\x81`\xC0\x01Q\x81\x10[\x15a\x17\xE9W`\x03\x94P\x92Pa\x0C\x92\x91PPV[P`\0\x96\x87\x96P\x94PPPPPV[3`\0\x81\x81Ra\x01\xF4` R`@\x90 \x80T`\x01`\x01`\xA0\x1B\x03\x16\x15\x80a\x18-WP\x80`\t\x01\x80Ta\x18)\x90aE\xB4V[\x15\x90P[\x15a\x18KW`@Qc\x1E\x1D\n\xB5`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x82\x81`\x06\x01`\0\x82\x82Ta\x18_\x91\x90aGrV[\x90\x91UPP`@Q\x83\x81R`\x01`\x01`\xA0\x1B\x03\x83\x16\x90\x7F \x98X\xCE\xC2\x8CQ\x8A\xEAD\xAA?\xA7\n\x93\"S\xF8\xBD\xF7j\x1C\x9A\x0B\x08\"j\x13\xE6\x975\xA3\x90` \x01a\x14XV[a\x18\xA7a,\xEBV[3`\0\x81\x81Ra\x01\xF4` \x90\x81R`@\x80\x83 \x81Qa\x01@\x81\x01\x83R\x81T`\x01`\x01`\xA0\x1B\x03\x16\x81R`\x01\x82\x01T\x93\x81\x01\x93\x90\x93R`\x02\x81\x01T\x91\x83\x01\x91\x90\x91R`\x03\x81\x01T``\x83\x01R`\x04\x81\x01T`\x80\x83\x01R`\x05\x81\x01T`\xA0\x83\x01R`\x06\x81\x01T`\xC0\x83\x01R`\x07\x81\x01T`\xE0\x83\x01R`\x08\x81\x01Ta\x01\0\x83\x01R`\t\x81\x01\x80Ta\x01 \x84\x01\x91\x90a\x19;\x90aE\xB4V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\x19g\x90aE\xB4V[\x80\x15a\x19\xB4W\x80`\x1F\x10a\x19\x89Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\x19\xB4V[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\x19\x97W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81RPP\x90P\x80`@\x01Q`\0\x14a\x19\xE4W`@Qc\xF8\xC20S`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[` \x81\x01Qa\x1A\x1F\x90`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x90\x85\x90a3fV[`\x01`\x01`\xA0\x1B\x03\x82\x16`\0\x90\x81Ra\x01\xF4` R`@\x81 \x80T`\x01`\x01`\xA0\x1B\x03\x19\x16\x81U`\x01\x81\x01\x82\x90U`\x02\x81\x01\x82\x90U`\x03\x81\x01\x82\x90U`\x04\x81\x01\x82\x90U`\x05\x81\x01\x82\x90U`\x06\x81\x01\x82\x90U`\x07\x81\x01\x82\x90U`\x08\x81\x01\x82\x90U\x90a\x1A\x8C`\t\x83\x01\x82a?6V[PP`@Q`\x01`\x01`\xA0\x1B\x03\x83\x16\x90\x7F\x9F70\xAD\xE9K\xE5\xCE?\xAD\x97;\x88\x8At\x86j:\x91]\0\x8E\x8C\xBD\xE2\x13\x82\xB91\xB6|c\x90`\0\x90\xA2PPa\x1A\xDB`\x01`\0\x80Q` aJ\xD1\x839\x81Q\x91RUV[PV[a\x01\xF4` R`\0\x90\x81R`@\x90 \x80T`\x01\x82\x01T`\x02\x83\x01T`\x03\x84\x01T`\x04\x85\x01T`\x05\x86\x01T`\x06\x87\x01T`\x07\x88\x01T`\x08\x89\x01T`\t\x8A\x01\x80T`\x01`\x01`\xA0\x1B\x03\x90\x9A\x16\x9A\x98\x99\x97\x98\x96\x97\x95\x96\x94\x95\x93\x94\x92\x93\x91\x92\x91a\x1BC\x90aE\xB4V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\x1Bo\x90aE\xB4V[\x80\x15a\x1B\xBCW\x80`\x1F\x10a\x1B\x91Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\x1B\xBCV[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\x1B\x9FW\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x90P\x8AV[`\0\x91\x82R`\0\x80Q` aJ\xB1\x839\x81Q\x91R` \x90\x81R`@\x80\x84 `\x01`\x01`\xA0\x1B\x03\x93\x90\x93\x16\x84R\x91\x90R\x90 T`\xFF\x16\x90V[a\x0B\xF13\x85\x85\x85\x85a3\x97V[3`\0\x81\x81Ra\x01\xF4` R`@\x90 \x80T`\x01`\x01`\xA0\x1B\x03\x16\x15\x80a\x1C@WP\x80`\t\x01\x80Ta\x1C<\x90aE\xB4V[\x15\x90P[\x80a\x1CIWP\x82\x15[\x15a\x1CgW`@Qc\x1E\x1D\n\xB5`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[g\r\xE0\xB6\xB3\xA7d\0\0\x81`\x08\x01T\x14a\x1C\x93W`@Qc\x07\xECv9`\xE4\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0\x83\x82`\x06\x01Ta\x1C\xA5\x91\x90aG_V[\x90P\x81`\x02\x01T\x81\x11a\x1C\xCBW`@Qc\xCA^b/`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x06\x82\x01T`\0\x90a\x1C\xE5g\r\xE0\xB6\xB3\xA7d\0\0\x84aG&V[a\x1C\xEF\x91\x90aG=V[\x90Pg\r\xE0\xB6\xB3\xA7d\0\0\x81\x10a\x1D\x19W`@Qc\xCA^b/`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x08\x83\x01\x81\x90Ua\x1D+`\x01CaGrV[`\x01`\x01`\xA0\x1B\x03\x85\x16`\0\x81\x81Ra\x01\xF7` R`@\x90\x81\x90 \x92\x90\x92U\x90Q\x7Fv\x12,\xFD_W`@Qc\xCA\xBDP\xD7`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0a!I\x89a6{V[\x90P\x86\x81\x10\x15a!lW`@Qcp1\x8A1`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0\x82`\x01\x01T\x90P\x87\x84`\x04\x01`\0\x82\x82Ta!\x89\x91\x90aGrV[\x92PP\x81\x90UP\x80\x84`\x03\x01`\0\x82\x82Ta!\xA4\x91\x90aGrV[\x90\x91UPP`@Q\x88\x81R`\x01`\x01`\xA0\x1B\x03\x8B\x16\x90\x7F\xED.\xDCnq\xBE\xB93\xF1\xE0\xC8\xCC\xFD\xF8E%\x8F7\x10\xD6l6t\xACP\xF3\x90\x08$c\xF7\xF0\x90` \x01`@Q\x80\x91\x03\x90\xA2\x89`\x01`\x01`\xA0\x1B\x03\x16\x7F\xD2\x9B\x9A\xDE\xE3+\xAF\x11\xBE\x04\0\x0Bsc\x99c\xD2\xC7n\x89\x9Fh0\xD3\xB5\xC1q]\xF1}\x82\xBD\x82`@Qa\"\"\x91\x81R` \x01\x90V[`@Q\x80\x91\x03\x90\xA2`\x04\x83\x01\x80T\x90`\0a\"<\x83aG\x9CV[\x91\x90PUPPPPPPPPa\x08\xAC`\x01`\0\x80Q` aJ\xD1\x839\x81Q\x91RUV[`\0[\x81\x81\x10\x15a\x08\xACWa\"\x8C3\x84\x84\x84\x81\x81\x10a\"\x80Wa\"\x80aE\x9EV[\x90P` \x02\x015a7\xEAV[`\x01\x01a\"bV[a\"\x9D\x82a\x0E+V[a\"\xA6\x81a/\x03V[a\x0B\xF1\x83\x83a/\xB2V[3`\0\x81\x81Ra\x01\xF4` \x90\x81R`@\x80\x83 a\x01\xF5\x83R\x81\x84 \x8D\x85R\x90\x92R\x80\x83 \x81Q`\xA0\x81\x01\x90\x92R\x80T\x92\x93\x92\x82\x90`\xFF\x16`\x04\x81\x11\x15a\"\xF8Wa\"\xF8aC V[`\x04\x81\x11\x15a#\tWa#\taC V[\x81R`\x01\x82\x01T` \x82\x01R`\x02\x82\x01T`@\x82\x01R`\x03\x82\x01T``\x82\x01R`\x04\x90\x91\x01T`\x80\x90\x91\x01R\x82T\x90\x91P`\x01`\x01`\xA0\x1B\x03\x16\x15\x80a#MWP\x87\x15[\x80a#VWP\x89\x15[\x15a#tW`@Qc\x1E\x1D\n\xB5`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0a#\x7F\x8Ca8\xBCV[P\x90P`\x01`\x01`\xA0\x1B\x03\x81\x16a#\xA9W`@Qc\x9D\xB8\xD5\xB1`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0\x82Q`\x04\x81\x11\x15a#\xBEWa#\xBEaC V[\x14a#\xDCW`@Qc+[X\x0F`\xE2\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x8A\x83`\x02\x01`\0\x82\x82Ta#\xF0\x91\x90aGrV[\x90\x91UPP`\x06\x83\x01T`\x02\x84\x01T\x11\x15a$\x1EW`@Qc\x07\xD9\x93\x89`\xE4\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x05\x83\x01\x80T\x90`\0a$0\x83aG\x9CV[\x90\x91UPP`@\x80Q`\xA0\x81\x01\x90\x91R\x80`\x01\x81R` \x01\x8C\x81R` \x01\x8B\x81R` \x01\x8A\x81R` \x01`\0\x81RPa\x01\xF5`\0\x86`\x01`\x01`\xA0\x1B\x03\x16`\x01`\x01`\xA0\x1B\x03\x16\x81R` \x01\x90\x81R` \x01`\0 `\0\x8E\x81R` \x01\x90\x81R` \x01`\0 `\0\x82\x01Q\x81`\0\x01`\0a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83`\x04\x81\x11\x15a$\xC0Wa$\xC0aC V[\x02\x17\x90UP` \x82\x01Q`\x01\x82\x01U`@\x82\x01Q`\x02\x82\x01U``\x82\x01Q`\x03\x82\x01U`\x80\x90\x91\x01Q`\x04\x90\x91\x01U\x87\x15a%\x02Wa%\x02\x84\x8D\x89\x89\x89a3\x97V[\x8B\x84`\x01`\x01`\xA0\x1B\x03\x16\x7F\x04Y\xABWU\x08\xB4\xA5\x89O{\x13\x87\xBF6-\x03!;;\xF81\xDAE&!\x8C3\xE4\xA9\x06\xD8\x8D`@Qa%>\x91\x81R` \x01\x90V[`@Q\x80\x91\x03\x90\xA3PPPPPPPPPPPPV[a\x1A\xDB3\x82a7\xEAV[3`\0\x81\x81Ra\x01\xF4` R`@\x90 \x80T`\x01`\x01`\xA0\x1B\x03\x16\x15\x80a%\x93WP\x80`\t\x01\x80Ta%\x8F\x90aE\xB4V[\x15\x90P[\x80a%\x9CWP\x82\x15[\x15a%\xBAW`@Qc\x1E\x1D\n\xB5`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[g\r\xE0\xB6\xB3\xA7d\0\0\x81`\x08\x01T\x14a%\xE6W`@Qc\x07\xECv9`\xE4\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0\x83\x82`\x01\x01Ta%\xF8\x91\x90aG_V[\x90P`\0\x82`\x01\x01Tg\r\xE0\xB6\xB3\xA7d\0\0\x83a&\x15\x91\x90aG&V[a&\x1F\x91\x90aG=V[`\x07\x84\x01\x81\x90U\x90Pa&3`\x01CaGrV[`\x01`\x01`\xA0\x1B\x03\x85\x16`\0\x81\x81Ra\x01\xF6` R`@\x90\x81\x90 \x92\x90\x92U\x90Q\x7F\x13\x9A\xD7\xA0\xC3\xF6\xC0\xAD\x0F\x0F\xC5+vx`jq\xFF\x08\x1B\x99&\xA5do\xE5:\x8Eg\xC6\x8Ar\x90a\x1D{\x90\x84\x81R` \x01\x90V[`\0`\0\x80Q` aJq\x839\x81Q\x91Ra&\x9D\x81a/\x03V[`\0a&\xA9\x87\x87a\x154V[P\x90P`\0\x81`\x04\x81\x11\x15a&\xC0Wa&\xC0aC V[\x14\x80a&\xDDWP`\x01\x81`\x04\x81\x11\x15a&\xDBWa&\xDBaC V[\x14[\x15a&\xFAW`@Qb\xED=\xF3`\xE8\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\x01`\xA0\x1B\x03\x87\x16`\0\x90\x81Ra\x01\xF4` \x90\x81R`@\x80\x83 a\x01\xF5\x83R\x81\x84 \x8A\x85R\x90\x92R\x82 `\x04\x81\x01\x80T\x92\x93\x91\x92\x91a':\x83aG\x85V[\x91\x90PUP\x86\x82`\x01\x01`\0\x82\x82Ta'S\x91\x90aG_V[\x92PP\x81\x90UP\x86\x82`\x04\x01`\0\x82\x82Ta'n\x91\x90aG_V[\x90\x91UPP`\x01\x81\x01T`\x03\x83\x01\x80T\x82\x91\x90`\0\x90a'\x8F\x90\x84\x90aG_V[\x90\x91UPP`@Q\x88\x81R`\x01`\x01`\xA0\x1B\x03\x8B\x16\x90\x7F\x83\xF5\xEA\x8B\xEAv'\xD9Rt\xE9M\xD7\xE9\xE3\xD7\xE8,\xB5_\xEA\xB5\x13\xEDI\xE3%#-\xCCa\xE0\x90` \x01`@Q\x80\x91\x03\x90\xA2\x89`\x01`\x01`\xA0\x1B\x03\x16\x7F\x0Bi \xA1i\xFB\x88\x9C\x15T\x91\x06\xAE\xE0p\xDA\x98\x18kz\xB4\x06\xDD\x93\x84\xA0\xD3\x18\x99\xFD\xF0\x8A\x82`@Qa(\r\x91\x81R` \x01\x90V[`@Q\x80\x91\x03\x90\xA2a(I`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x88\x8Aa3fV[PP`\x01\x01T\x97\x96PPPPPPPV[a(ba,\xEBV[3`\0\x81\x81Ra\x01\xF4` R`@\x90 `\t\x81\x01\x80Ta(\x81\x90aE\xB4V[\x15\x90P\x80a(\x97WP\x80T`\x01`\x01`\xA0\x1B\x03\x16\x15[\x15a(\xB5W`@QcdF\xF9\x17`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[g\r\xE0\xB6\xB3\xA7d\0\0\x81`\x07\x01T\x03a(\xE1W`@QcYF\x0E\x07`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0g\r\xE0\xB6\xB3\xA7d\0\0\x82`\x01\x01T\x83`\x07\x01Ta)\0\x91\x90aG&V[a)\n\x91\x90aG=V[\x90P`\0\x81\x83`\x01\x01Ta)\x1E\x91\x90aG_V[\x90P\x82`\x04\x01T\x82\x10\x15a)EW`@Qcp1\x8A1`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a)y`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x86\x83a3fV[`\x01\x83\x01\x82\x90Ug\r\xE0\xB6\xB3\xA7d\0\0`\x07\x84\x01U`\x01`\x01`\xA0\x1B\x03\x84\x16`\0\x90\x81Ra\x01\xF6` R`@\x90 TC\x10\x80\x15\x90a)\xCFWP`\x01`\x01`\xA0\x1B\x03\x84\x16`\0\x90\x81Ra\x01\xF6` R`@\x90 T\x15\x15[a)\xECW`@Qc8l\xF4\x07`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\x01`\xA0\x1B\x03\x84\x16`\0\x81\x81Ra\x01\xF6` R`@\x80\x82 \x91\x90\x91UQ\x7F\xE5+=`\0\xFD[PPPP`@Q=`\0\x82>`\x1F=\x90\x81\x01`\x1F\x19\x16\x82\x01`@Ra+\x05\x91\x90\x81\x01\x90aG\xFAV[P\x94\x95PP`\x01`\x01`\xA0\x1B\x03\x85\x16\x93Pa+7\x92PPPW`@Qc\x9D\xB8\xD5\xB1`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\x01`\xA0\x1B\x03\x83\x16`\0\x90\x81Ra\x01\xF5` \x90\x81R`@\x80\x83 \x85\x84R\x90\x91R\x80\x82 \x81Q`\xA0\x81\x01\x90\x92R\x80T\x82\x90`\xFF\x16`\x04\x81\x11\x15a+}Wa+}aC V[`\x04\x81\x11\x15a+\x8EWa+\x8EaC V[\x81R`\x01\x82\x01T` \x82\x01R`\x02\x82\x01T`@\x82\x01R`\x03\x82\x01T``\x82\x01R`\x04\x90\x91\x01T`\x80\x90\x91\x01R\x90P`\0\x81Q`\x04\x81\x11\x15a+\xD1Wa+\xD1aC V[\x03a+\xEFW`@Qc\x04\xC9\xDE\x83`\xE3\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x80\x81\x01Q\x15a,\x12W`@Qc\x02\xE0}\x87`\xE6\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0a\x01\xF4`\0\x86`\x01`\x01`\xA0\x1B\x03\x16`\x01`\x01`\xA0\x1B\x03\x16\x81R` \x01\x90\x81R` \x01`\0 \x90P\x81` \x01Q\x81`\x02\x01`\0\x82\x82Ta,T\x91\x90aG_V[\x92PP\x81\x90UP`\x01\x81`\x05\x01`\0\x82\x82Ta,p\x91\x90aG_V[\x90\x91UPP`\x01`\x01`\xA0\x1B\x03\x85\x16`\0\x81\x81Ra\x01\xF5` \x90\x81R`@\x80\x83 \x88\x84R\x90\x91R\x80\x82 \x80T`\xFF\x19\x16\x81U`\x01\x81\x01\x83\x90U`\x02\x81\x01\x83\x90U`\x03\x81\x01\x83\x90U`\x04\x01\x82\x90UQ\x86\x92\x91\x7F\x83\x1C\xD5\xB7S\x83\x80\xB0\xA2\xA3\x14\x14\xD64\xECBq\x16\x07V\x84\xA2v\x82\x8A\xB4\xD2ut\xA2\xDF\xDF\x91\xA3PPPPPV[`\0\x80Q` aJ\xD1\x839\x81Q\x91R\x80T`\x01\x19\x01a-\x1DW`@Qc>\xE5\xAE\xB5`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x02\x90UV[`@Q`\x01`\x01`\xA0\x1B\x03\x84\x81\x16`$\x83\x01R\x83\x81\x16`D\x83\x01R`d\x82\x01\x83\x90Ra\x0B\xF1\x91\x86\x91\x82\x16\x90c#\xB8r\xDD\x90`\x84\x01[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x91P`\xE0\x1B` \x82\x01\x80Q`\x01`\x01`\xE0\x1B\x03\x83\x81\x83\x16\x17\x83RPPPPa9IV[`\0\x80`\0\x80\x84\x80` \x01\x90Q\x81\x01\x90a-\xA4\x91\x90aH\x86V[PPP\x94P\x94P\x94PPPa-\xBA\x83\x83\x83a9\xBAV[\x95\x94PPPPPV[`@\x80Q` \x81\x01\x82\x90R`\x03``\x82\x01Rbivs`\xE8\x1B`\x80\x82\x01R\x90\x81\x01\x82\x90R`\0\x90`\xA0\x01[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 \x90P\x91\x90PV[`\0\x84\x82`@Q` \x01a. \x92\x91\x90aI\x8AV[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 \x90P`\0a.C\x82a9\xF3V[\x90P`\0a.\x87\x82\x87\x87\x80\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x93\x92\x91\x90\x81\x81R` \x01\x83\x83\x80\x82\x847`\0\x92\x01\x91\x90\x91RPa:.\x92PPPV[\x90Pa.\x92\x87a.\xD3V[`\x01`\x01`\xA0\x1B\x03\x16\x81`\x01`\x01`\xA0\x1B\x03\x16\x14a\x13\xB8W`@Qc(\x80\xCB\x7F`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x82\x16`\x04\x82\x01R`$\x01[`@Q\x80\x91\x03\x90\xFD[`\0\x80\x82\x80` \x01\x90Q\x81\x01\x90a.\xEA\x91\x90aH\x86V[PPPPPP\x91PPa.\xFC\x81a:XV[\x93\x92PPPV[a\x1A\xDB\x813a:\x88V[`\0`\0\x80Q` aJ\xB1\x839\x81Q\x91Ra/(\x84\x84a\x1B\xC6V[a/\xA8W`\0\x84\x81R` \x82\x81R`@\x80\x83 `\x01`\x01`\xA0\x1B\x03\x87\x16\x84R\x90\x91R\x90 \x80T`\xFF\x19\x16`\x01\x17\x90Ua/^3\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x83`\x01`\x01`\xA0\x1B\x03\x16\x85\x7F/\x87\x88\x11~~\xFF\x1D\x82\xE9&\xECyI\x01\xD1|x\x02JP'\t@0E@\xA73eo\r`@Q`@Q\x80\x91\x03\x90\xA4`\x01\x91PPa\x08qV[`\0\x91PPa\x08qV[`\0`\0\x80Q` aJ\xB1\x839\x81Q\x91Ra/\xCD\x84\x84a\x1B\xC6V[\x15a/\xA8W`\0\x84\x81R` \x82\x81R`@\x80\x83 `\x01`\x01`\xA0\x1B\x03\x87\x16\x80\x85R\x92R\x80\x83 \x80T`\xFF\x19\x16\x90UQ3\x92\x87\x91\x7F\xF69\x1F\\2\xD9\xC6\x9D*G\xEAg\x0BD)t\xB595\xD1\xED\xC7\xFDd\xEB!\xE0G\xA89\x17\x1B\x91\x90\xA4`\x01\x91PPa\x08qV[a06a:\xC1V[V[0`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x14\x80a0\xBFWP\x7F\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`\x01`\x01`\xA0\x1B\x03\x16a0\xB3`\0\x80Q` aJ\x91\x839\x81Q\x91RT`\x01`\x01`\xA0\x1B\x03\x16\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x14\x15[\x15a06W`@Qcp>F\xDD`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0a\x14\x80\x81a/\x03V[\x81`\x01`\x01`\xA0\x1B\x03\x16cR\xD1\x90-`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x92PPP\x80\x15a1BWP`@\x80Q`\x1F=\x90\x81\x01`\x1F\x19\x16\x82\x01\x90\x92Ra1?\x91\x81\x01\x90aI\xB4V[`\x01[a1jW`@QcL\x9C\x8C\xE3`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x83\x16`\x04\x82\x01R`$\x01a.\xCAV[`\0\x80Q` aJ\x91\x839\x81Q\x91R\x81\x14a1\x9BW`@Qc*\x87Ri`\xE2\x1B\x81R`\x04\x81\x01\x82\x90R`$\x01a.\xCAV[a\x08\xAC\x83\x83a;\nV[0`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x14a06W`@Qcp>F\xDD`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\x01`\xA0\x1B\x03\x80\x82\x16`\0\x90\x81Ra\x01\xF4` \x90\x81R`@\x80\x83 \x81Qa\x01@\x81\x01\x83R\x81T\x90\x95\x16\x85R`\x01\x81\x01T\x92\x85\x01\x92\x90\x92R`\x02\x82\x01T\x90\x84\x01R`\x03\x81\x01T``\x84\x01R`\x04\x81\x01T`\x80\x84\x01R`\x05\x81\x01T`\xA0\x84\x01R`\x06\x81\x01T`\xC0\x84\x01R`\x07\x81\x01T`\xE0\x84\x01R`\x08\x81\x01Ta\x01\0\x84\x01R`\t\x81\x01\x80T\x92\x93\x84\x93\x90\x92\x91a\x01 \x84\x01\x91a2\x89\x90aE\xB4V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta2\xB5\x90aE\xB4V[\x80\x15a3\x02W\x80`\x1F\x10a2\xD7Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a3\x02V[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a2\xE5W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81RPP\x90P`\0g\r\xE0\xB6\xB3\xA7d\0\0\x82a\x01\0\x01Q\x83`\xC0\x01Qa3-\x91\x90aG&V[a37\x91\x90aG=V[\x90P\x81``\x01Q\x81\x10\x15a3OWP`\0\x93\x92PPPV[``\x82\x01Qa3^\x90\x82aG_V[\x94\x93PPPPV[`@Q`\x01`\x01`\xA0\x1B\x03\x83\x81\x16`$\x83\x01R`D\x82\x01\x83\x90Ra\x08\xAC\x91\x85\x91\x82\x16\x90c\xA9\x05\x9C\xBB\x90`d\x01a-XV[`\x01`\x01`\xA0\x1B\x03\x80\x86\x16`\0\x90\x81Ra\x01\xF4` \x90\x81R`@\x80\x83 \x81Qa\x01@\x81\x01\x83R\x81T\x90\x95\x16\x85R`\x01\x81\x01T\x92\x85\x01\x92\x90\x92R`\x02\x82\x01T\x90\x84\x01R`\x03\x81\x01T``\x84\x01R`\x04\x81\x01T`\x80\x84\x01R`\x05\x81\x01T`\xA0\x84\x01R`\x06\x81\x01T`\xC0\x84\x01R`\x07\x81\x01T`\xE0\x84\x01R`\x08\x81\x01Ta\x01\0\x84\x01R`\t\x81\x01\x80T\x92\x93\x92a\x01 \x84\x01\x91\x90a4/\x90aE\xB4V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta4[\x90aE\xB4V[\x80\x15a4\xA8W\x80`\x1F\x10a4}Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a4\xA8V[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a4\x8BW\x82\x90\x03`\x1F\x16\x82\x01\x91[PPP\x91\x90\x92RPP\x81Q\x91\x92PP`\x01`\x01`\xA0\x1B\x03\x16a4\xDDW`@Qc\x1E\x1D\n\xB5`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0a4\xE8\x86a8\xBCV[\x91PPa4\xF4\x81a;`V[a5\x11W`@Qc!\xA4\x8B\x8B`\xE2\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x7F\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`\x01`\x01`\xA0\x1B\x03\x16ck[!\xA6a5I\x87a-\x8AV[a5R\x89a;\x95V[`@Q`\x01`\x01`\xE0\x1B\x03\x19`\xE0\x85\x90\x1B\x16\x81R`\x04\x81\x01\x92\x90\x92R`$\x82\x01R`D\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a5\x93W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a5\xB7\x91\x90aF\xF3V[a5\xD4W`@Qc\xC4e\xE6\x9D`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0a5\xDF\x86a;\xC4V[\x90Pa5\xED\x86\x86\x86\x8Ba.\x0BV[`@Qc4\xFE\xDEe`\xE1\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x90ci\xFD\xBC\xCA\x90a6?\x90\x8B\x90\x8B\x90\x86\x90\x8C\x90`\x04\x01aI\xCDV[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a6YW`\0\x80\xFD[PZ\xF1\x15\x80\x15a6mW=`\0\x80>=`\0\xFD[PPPPPPPPPPPPV[`\x01`\x01`\xA0\x1B\x03\x80\x82\x16`\0\x90\x81Ra\x01\xF4` \x90\x81R`@\x80\x83 \x81Qa\x01@\x81\x01\x83R\x81T\x90\x95\x16\x85R`\x01\x81\x01T\x92\x85\x01\x92\x90\x92R`\x02\x82\x01T\x90\x84\x01R`\x03\x81\x01T``\x84\x01R`\x04\x81\x01T`\x80\x84\x01R`\x05\x81\x01T`\xA0\x84\x01R`\x06\x81\x01T`\xC0\x84\x01R`\x07\x81\x01T`\xE0\x84\x01R`\x08\x81\x01Ta\x01\0\x84\x01R`\t\x81\x01\x80T\x92\x93\x84\x93\x90\x92\x91a\x01 \x84\x01\x91a7\x16\x90aE\xB4V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta7B\x90aE\xB4V[\x80\x15a7\x8FW\x80`\x1F\x10a7dWa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a7\x8FV[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a7rW\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81RPP\x90P`\0g\r\xE0\xB6\xB3\xA7d\0\0\x82`\xE0\x01Q\x83` \x01Qa7\xB9\x91\x90aG&V[a7\xC3\x91\x90aG=V[\x90P\x81`\x80\x01Q\x81\x10\x15a7\xDBWP`\0\x93\x92PPPV[`\x80\x82\x01Qa3^\x90\x82aG_V[`\0a7\xF6\x83\x83a\x154V[P\x90P`\0\x81`\x04\x81\x11\x15a8\rWa8\raC V[\x14\x15\x80\x15a8-WP`\x04\x81`\x04\x81\x11\x15a8*Wa8*aC V[\x14\x15[a8JW`@Qc0\x04\x82\x87`\xE2\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\x01`\xA0\x1B\x03\x83\x16`\0\x81\x81Ra\x01\xF5` \x90\x81R`@\x80\x83 \x86\x84R\x90\x91R\x80\x82 \x80T`\xFF\x19\x16`\x04\x17\x81U\x90Q\x90\x92\x85\x92\x90\x91\x7F\xF9\xE1yp\xDFW\xA6\xA8E}\xCB\xB5\xC2\x91gkF1\xD37\xCFv\xB0\xC8\x01\xF6\xB8\xADj|_\x92\x91\x90\xA3\x80`\x04\x01T`\0\x03a\x0B\xF1Wa\x0B\xF1\x84\x84a*\x92V[a\x01\xF8T`@Qc\xF8\xA9H/`\xE0\x1B\x81R`\x04\x81\x01\x83\x90R`\0\x91\x82\x91\x82\x91\x82\x91`\x01`\x01`\xA0\x1B\x03\x90\x91\x16\x90c\xF8\xA9H/\x90`$\x01`\0`@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a9\x0FW=`\0\x80>=`\0\xFD[PPPP`@Q=`\0\x82>`\x1F=\x90\x81\x01`\x1F\x19\x16\x82\x01`@Ra97\x91\x90\x81\x01\x90aG\xFAV[P\x94\x9A\x93\x99P\x92\x97PPPPPPPPV[`\0\x80` `\0\x84Q` \x86\x01`\0\x88Z\xF1\x80a9lW`@Q=`\0\x82>=\x81\xFD[PP`\0Q=\x91P\x81\x15a9\x84W\x80`\x01\x14\x15a9\x91V[`\x01`\x01`\xA0\x1B\x03\x84\x16;\x15[\x15a\x0B\xF1W`@QcRt\xAF\xE7`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x85\x16`\x04\x82\x01R`$\x01a.\xCAV[`\0\x80\x84\x84\x84`@Q` \x01a9\xD2\x93\x92\x91\x90aJ\x11V[`@\x80Q\x80\x83\x03`\x1F\x19\x01\x81R\x91\x90R\x80Q` \x90\x91\x01 \x95\x94PPPPPV[`@Q\x7F\x19Ethereum Signed Message:\n32\0\0\0\0` \x82\x01R`<\x81\x01\x82\x90R`\0\x90`\\\x01a-\xEEV[`\0\x80`\0\x80a:>\x86\x86a;\xEBV[\x92P\x92P\x92Pa:N\x82\x82a<8V[P\x90\x94\x93PPPPV[`\0\x81Q`@\x14a:|W`@Qc\xD2\x833]`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[P\x80Q` \x90\x91\x01 \x90V[a:\x92\x82\x82a\x1B\xC6V[a\x14\x80W`@Qc\xE2Q}?`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x82\x16`\x04\x82\x01R`$\x81\x01\x83\x90R`D\x01a.\xCAV[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0T`\x01`@\x1B\x90\x04`\xFF\x16a06W`@Qc\x1A\xFC\xD7\x9F`\xE3\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a;\x13\x82a<\xF1V[`@Q`\x01`\x01`\xA0\x1B\x03\x83\x16\x90\x7F\xBC|\xD7Z \xEE'\xFD\x9A\xDE\xBA\xB3 A\xF7U!M\xBCk\xFF\xA9\x0C\xC0\"[9\xDA.\\-;\x90`\0\x90\xA2\x80Q\x15a;XWa\x08\xAC\x82\x82a=VV[a\x14\x80a=\xC3V[`\0\x81\x15\x80a;\x8EWP\x7F\xCD.f\xBF\x0B\x91\xEE\xED\xC6\xC6H\xAE\x935\xA7\x8D|\x9AJ\xB0\xEF3a*\x82M\x91\xCD\xC6\x8AO!\x82\x14[\x15\x92\x91PPV[`@\x80Q` \x81\x01\x82\x90R`\x03``\x82\x01Rb3\xB2\xB7`\xE9\x1B`\x80\x82\x01R\x90\x81\x01\x82\x90R`\0\x90`\xA0\x01a-\xEEV[```\0\x82\x80` \x01\x90Q\x81\x01\x90a;\xDC\x91\x90aH\x86V[P\x94\x99\x98PPPPPPPPPV[`\0\x80`\0\x83Q`A\x03a<%W` \x84\x01Q`@\x85\x01Q``\x86\x01Q`\0\x1Aa<\x17\x88\x82\x85\x85a=\xE2V[\x95P\x95P\x95PPPPa<1V[PP\x81Q`\0\x91P`\x02\x90[\x92P\x92P\x92V[`\0\x82`\x03\x81\x11\x15a ::ethers::contract::builders::ContractCall { self.0 - .method_hash([150, 222, 14, 239], new_utilization) + .method_hash([150, 222, 14, 239], compute_to_reduce) .expect("method not found (this should never happen)") } ///Calls the contract's `intendToReduceStake` (0xe9e934a0) function pub fn intend_to_reduce_stake( &self, - new_utilization: ::ethers::core::types::U256, + stake_to_reduce: ::ethers::core::types::U256, ) -> ::ethers::contract::builders::ContractCall { self.0 - .method_hash([233, 233, 52, 160], new_utilization) + .method_hash([233, 233, 52, 160], stake_to_reduce) .expect("method not found (this should never happen)") } ///Calls the contract's `joinMarketplace` (0xe2fa33ce) function @@ -2637,6 +2643,13 @@ pub mod generator_registry { { self.0.event() } + ///Gets the contract's `StakeSlashed` event + pub fn stake_slashed_filter( + &self, + ) -> ::ethers::contract::builders::Event<::std::sync::Arc, M, StakeSlashedFilter> + { + self.0.event() + } ///Gets the contract's `Upgraded` event pub fn upgraded_filter( &self, @@ -2715,26 +2728,6 @@ pub mod generator_registry { pub struct AddressEmptyCode { pub target: ::ethers::core::types::Address, } - ///Custom Error type `AddressInsufficientBalance` with signature `AddressInsufficientBalance(address)` and selector `0xcd786059` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[etherror( - name = "AddressInsufficientBalance", - abi = "AddressInsufficientBalance(address)" - )] - pub struct AddressInsufficientBalance { - pub account: ::ethers::core::types::Address, - } ///Custom Error type `AlreadyJoinedMarket` with signature `AlreadyJoinedMarket()` and selector `0xad6d603c` #[derive( Clone, @@ -2957,7 +2950,7 @@ pub mod generator_registry { )] #[etherror(name = "ExceedsAcceptableRange", abi = "ExceedsAcceptableRange()")] pub struct ExceedsAcceptableRange; - ///Custom Error type `FailedInnerCall` with signature `FailedInnerCall()` and selector `0x1425ea42` + ///Custom Error type `FailedCall` with signature `FailedCall()` and selector `0xd6bda275` #[derive( Clone, ::ethers::contract::EthError, @@ -2970,8 +2963,8 @@ pub mod generator_registry { Eq, Hash, )] - #[etherror(name = "FailedInnerCall", abi = "FailedInnerCall()")] - pub struct FailedInnerCall; + #[etherror(name = "FailedCall", abi = "FailedCall()")] + pub struct FailedCall; ///Custom Error type `GeneratorAlreadyExists` with signature `GeneratorAlreadyExists()` and selector `0x5874f97b` #[derive( Clone, @@ -3368,7 +3361,6 @@ pub mod generator_registry { AccessControlBadConfirmation(AccessControlBadConfirmation), AccessControlUnauthorizedAccount(AccessControlUnauthorizedAccount), AddressEmptyCode(AddressEmptyCode), - AddressInsufficientBalance(AddressInsufficientBalance), AlreadyJoinedMarket(AlreadyJoinedMarket), AssignOnlyToIdleGenerators(AssignOnlyToIdleGenerators), CannotBeMoreThanDeclaredCompute(CannotBeMoreThanDeclaredCompute), @@ -3382,7 +3374,7 @@ pub mod generator_registry { ERC1967InvalidImplementation(ERC1967InvalidImplementation), ERC1967NonPayable(ERC1967NonPayable), ExceedsAcceptableRange(ExceedsAcceptableRange), - FailedInnerCall(FailedInnerCall), + FailedCall(FailedCall), GeneratorAlreadyExists(GeneratorAlreadyExists), IncorrectImageId(IncorrectImageId), InsufficientGeneratorComputeAvailable(InsufficientGeneratorComputeAvailable), @@ -3434,11 +3426,6 @@ pub mod generator_registry { { return Ok(Self::AddressEmptyCode(decoded)); } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::AddressInsufficientBalance(decoded)); - } if let Ok(decoded) = ::decode(data) { @@ -3499,8 +3486,8 @@ pub mod generator_registry { { return Ok(Self::ExceedsAcceptableRange(decoded)); } - if let Ok(decoded) = ::decode(data) { - return Ok(Self::FailedInnerCall(decoded)); + if let Ok(decoded) = ::decode(data) { + return Ok(Self::FailedCall(decoded)); } if let Ok(decoded) = ::decode(data) @@ -3627,9 +3614,6 @@ pub mod generator_registry { ::ethers::core::abi::AbiEncode::encode(element) } Self::AddressEmptyCode(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::AddressInsufficientBalance(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } Self::AlreadyJoinedMarket(element) => { ::ethers::core::abi::AbiEncode::encode(element) } @@ -3663,7 +3647,7 @@ pub mod generator_registry { Self::ExceedsAcceptableRange(element) => { ::ethers::core::abi::AbiEncode::encode(element) } - Self::FailedInnerCall(element) => ::ethers::core::abi::AbiEncode::encode(element), + Self::FailedCall(element) => ::ethers::core::abi::AbiEncode::encode(element), Self::GeneratorAlreadyExists(element) => { ::ethers::core::abi::AbiEncode::encode(element) } @@ -3743,10 +3727,6 @@ pub mod generator_registry { == ::selector() => { true } - _ if selector - == ::selector() => { - true - } _ if selector == ::selector() => { true @@ -3798,9 +3778,7 @@ pub mod generator_registry { true } _ if selector - == ::selector() => { - true - } + == ::selector() => true, _ if selector == ::selector() => { true @@ -3907,7 +3885,6 @@ pub mod generator_registry { ::core::fmt::Display::fmt(element, f) } Self::AddressEmptyCode(element) => ::core::fmt::Display::fmt(element, f), - Self::AddressInsufficientBalance(element) => ::core::fmt::Display::fmt(element, f), Self::AlreadyJoinedMarket(element) => ::core::fmt::Display::fmt(element, f), Self::AssignOnlyToIdleGenerators(element) => ::core::fmt::Display::fmt(element, f), Self::CannotBeMoreThanDeclaredCompute(element) => { @@ -3927,7 +3904,7 @@ pub mod generator_registry { } Self::ERC1967NonPayable(element) => ::core::fmt::Display::fmt(element, f), Self::ExceedsAcceptableRange(element) => ::core::fmt::Display::fmt(element, f), - Self::FailedInnerCall(element) => ::core::fmt::Display::fmt(element, f), + Self::FailedCall(element) => ::core::fmt::Display::fmt(element, f), Self::GeneratorAlreadyExists(element) => ::core::fmt::Display::fmt(element, f), Self::IncorrectImageId(element) => ::core::fmt::Display::fmt(element, f), Self::InsufficientGeneratorComputeAvailable(element) => { @@ -3989,11 +3966,6 @@ pub mod generator_registry { Self::AddressEmptyCode(value) } } - impl ::core::convert::From for GeneratorRegistryErrors { - fn from(value: AddressInsufficientBalance) -> Self { - Self::AddressInsufficientBalance(value) - } - } impl ::core::convert::From for GeneratorRegistryErrors { fn from(value: AlreadyJoinedMarket) -> Self { Self::AlreadyJoinedMarket(value) @@ -4059,9 +4031,9 @@ pub mod generator_registry { Self::ExceedsAcceptableRange(value) } } - impl ::core::convert::From for GeneratorRegistryErrors { - fn from(value: FailedInnerCall) -> Self { - Self::FailedInnerCall(value) + impl ::core::convert::From for GeneratorRegistryErrors { + fn from(value: FailedCall) -> Self { + Self::FailedCall(value) } } impl ::core::convert::From for GeneratorRegistryErrors { @@ -4256,7 +4228,7 @@ pub mod generator_registry { pub struct ComputeLockImposedFilter { #[ethevent(indexed)] pub generator: ::ethers::core::types::Address, - pub stake: ::ethers::core::types::U256, + pub compute: ::ethers::core::types::U256, } #[derive( Clone, @@ -4277,7 +4249,7 @@ pub mod generator_registry { pub struct ComputeLockReleasedFilter { #[ethevent(indexed)] pub generator: ::ethers::core::types::Address, - pub stake: ::ethers::core::types::U256, + pub compute: ::ethers::core::types::U256, } #[derive( Clone, @@ -4608,6 +4580,24 @@ pub mod generator_registry { Eq, Hash, )] + #[ethevent(name = "StakeSlashed", abi = "StakeSlashed(address,uint256)")] + pub struct StakeSlashedFilter { + #[ethevent(indexed)] + pub generator: ::ethers::core::types::Address, + pub stake: ::ethers::core::types::U256, + } + #[derive( + Clone, + ::ethers::contract::EthEvent, + ::ethers::contract::EthDisplay, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] #[ethevent(name = "Upgraded", abi = "Upgraded(address)")] pub struct UpgradedFilter { #[ethevent(indexed)] @@ -4646,6 +4636,7 @@ pub mod generator_registry { RoleRevokedFilter(RoleRevokedFilter), StakeLockImposedFilter(StakeLockImposedFilter), StakeLockReleasedFilter(StakeLockReleasedFilter), + StakeSlashedFilter(StakeSlashedFilter), UpgradedFilter(UpgradedFilter), } impl ::ethers::contract::EthLogDecode for GeneratorRegistryEvents { @@ -4721,6 +4712,9 @@ pub mod generator_registry { if let Ok(decoded) = StakeLockReleasedFilter::decode_log(log) { return Ok(GeneratorRegistryEvents::StakeLockReleasedFilter(decoded)); } + if let Ok(decoded) = StakeSlashedFilter::decode_log(log) { + return Ok(GeneratorRegistryEvents::StakeSlashedFilter(decoded)); + } if let Ok(decoded) = UpgradedFilter::decode_log(log) { return Ok(GeneratorRegistryEvents::UpgradedFilter(decoded)); } @@ -4757,6 +4751,7 @@ pub mod generator_registry { Self::RoleRevokedFilter(element) => ::core::fmt::Display::fmt(element, f), Self::StakeLockImposedFilter(element) => ::core::fmt::Display::fmt(element, f), Self::StakeLockReleasedFilter(element) => ::core::fmt::Display::fmt(element, f), + Self::StakeSlashedFilter(element) => ::core::fmt::Display::fmt(element, f), Self::UpgradedFilter(element) => ::core::fmt::Display::fmt(element, f), } } @@ -4866,6 +4861,11 @@ pub mod generator_registry { Self::StakeLockReleasedFilter(value) } } + impl ::core::convert::From for GeneratorRegistryEvents { + fn from(value: StakeSlashedFilter) -> Self { + Self::StakeSlashedFilter(value) + } + } impl ::core::convert::From for GeneratorRegistryEvents { fn from(value: UpgradedFilter) -> Self { Self::UpgradedFilter(value) @@ -5296,7 +5296,7 @@ pub mod generator_registry { )] #[ethcall(name = "intendToReduceCompute", abi = "intendToReduceCompute(uint256)")] pub struct IntendToReduceComputeCall { - pub new_utilization: ::ethers::core::types::U256, + pub compute_to_reduce: ::ethers::core::types::U256, } ///Container type for all input parameters for the `intendToReduceStake` function with signature `intendToReduceStake(uint256)` and selector `0xe9e934a0` #[derive( @@ -5313,7 +5313,7 @@ pub mod generator_registry { )] #[ethcall(name = "intendToReduceStake", abi = "intendToReduceStake(uint256)")] pub struct IntendToReduceStakeCall { - pub new_utilization: ::ethers::core::types::U256, + pub stake_to_reduce: ::ethers::core::types::U256, } ///Container type for all input parameters for the `joinMarketplace` function with signature `joinMarketplace(uint256,uint256,uint256,uint256,bool,bytes,bytes)` and selector `0xe2fa33ce` #[derive( diff --git a/bindings/src/helper.rs b/bindings/src/helper.rs index c6e02b1..d8010e5 100644 --- a/bindings/src/helper.rs +++ b/bindings/src/helper.rs @@ -25,12 +25,12 @@ pub mod helper { pub static HELPER_ABI: ::ethers::contract::Lazy<::ethers::core::abi::Abi> = ::ethers::contract::Lazy::new(__abi); #[rustfmt::skip] - const __BYTECODE: &[u8] = b"`V`7`\x0B\x82\x82\x829\x80Q`\0\x1A`s\x14`*WcNH{q`\xE0\x1B`\0R`\0`\x04R`$`\0\xFD[0`\0R`s\x81S\x82\x81\xF3\xFEs\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x000\x14`\x80`@R`\0\x80\xFD\xFE\xA2dipfsX\"\x12 j\x95\xB6if*\x9E\xDA\xB0g0-=\xDFT3\x81\x0B\x03\x03\x06\x10/b\xDD#\xE9\xC2n\xAB]SdsolcC\0\x08\x14\x003"; + const __BYTECODE: &[u8] = b"`V`7`\x0B\x82\x82\x829\x80Q`\0\x1A`s\x14`*WcNH{q`\xE0\x1B`\0R`\0`\x04R`$`\0\xFD[0`\0R`s\x81S\x82\x81\xF3\xFEs\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x000\x14`\x80`@R`\0\x80\xFD\xFE\xA2dipfsX\"\x12 \x8A\xB0\x04\xDF\xDB\xF7\xAC\xED\x06\xA2\xF9\x82s\xD9\xF9\xA7\x15\xEE'\x1CH'\x84\xC4$0V\x18\xF4,\x98,dsolcC\0\x08\x1C\x003"; /// The bytecode of the contract. pub static HELPER_BYTECODE: ::ethers::core::types::Bytes = ::ethers::core::types::Bytes::from_static(__BYTECODE); #[rustfmt::skip] - const __DEPLOYED_BYTECODE: &[u8] = b"s\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x000\x14`\x80`@R`\0\x80\xFD\xFE\xA2dipfsX\"\x12 j\x95\xB6if*\x9E\xDA\xB0g0-=\xDFT3\x81\x0B\x03\x03\x06\x10/b\xDD#\xE9\xC2n\xAB]SdsolcC\0\x08\x14\x003"; + const __DEPLOYED_BYTECODE: &[u8] = b"s\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x000\x14`\x80`@R`\0\x80\xFD\xFE\xA2dipfsX\"\x12 \x8A\xB0\x04\xDF\xDB\xF7\xAC\xED\x06\xA2\xF9\x82s\xD9\xF9\xA7\x15\xEE'\x1CH'\x84\xC4$0V\x18\xF4,\x98,dsolcC\0\x08\x1C\x003"; /// The deployed bytecode of the contract. pub static HELPER_DEPLOYED_BYTECODE: ::ethers::core::types::Bytes = ::ethers::core::types::Bytes::from_static(__DEPLOYED_BYTECODE); diff --git a/bindings/src/i_plonk_vk.rs b/bindings/src/i_plonk_vk.rs deleted file mode 100644 index dc1f940..0000000 --- a/bindings/src/i_plonk_vk.rs +++ /dev/null @@ -1,146 +0,0 @@ -pub use i_plonk_vk::*; -/// 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 i_plonk_vk { - #[allow(deprecated)] - fn __abi() -> ::ethers::core::abi::Abi { - ::ethers::core::abi::ethabi::Contract { - constructor: ::core::option::Option::None, - functions: ::core::convert::From::from([( - ::std::borrow::ToOwned::to_owned("verify"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("verify"), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("_proof"), - kind: ::ethers::core::abi::ethabi::ParamType::Bytes, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("_publicInputs"), - kind: ::ethers::core::abi::ethabi::ParamType::Array( - ::std::boxed::Box::new( - ::ethers::core::abi::ethabi::ParamType::FixedBytes(32usize), - ), - ), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes32[]"), - ), - }, - ], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Bool, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bool"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - },], - )]), - events: ::std::collections::BTreeMap::new(), - errors: ::std::collections::BTreeMap::new(), - receive: false, - fallback: false, - } - } - ///The parsed JSON ABI of the contract. - pub static I_PLONK_VK_ABI: ::ethers::contract::Lazy<::ethers::core::abi::Abi> = - ::ethers::contract::Lazy::new(__abi); - pub struct i_plonk_vk(::ethers::contract::Contract); - impl ::core::clone::Clone for i_plonk_vk { - fn clone(&self) -> Self { - Self(::core::clone::Clone::clone(&self.0)) - } - } - impl ::core::ops::Deref for i_plonk_vk { - type Target = ::ethers::contract::Contract; - fn deref(&self) -> &Self::Target { - &self.0 - } - } - impl ::core::ops::DerefMut for i_plonk_vk { - fn deref_mut(&mut self) -> &mut Self::Target { - &mut self.0 - } - } - impl ::core::fmt::Debug for i_plonk_vk { - fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { - f.debug_tuple(::core::stringify!(i_plonk_vk)) - .field(&self.address()) - .finish() - } - } - impl i_plonk_vk { - /// 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(), - I_PLONK_VK_ABI.clone(), - client, - )) - } - ///Calls the contract's `verify` (0xea50d0e4) function - pub fn verify( - &self, - proof: ::ethers::core::types::Bytes, - public_inputs: ::std::vec::Vec<[u8; 32]>, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([234, 80, 208, 228], (proof, public_inputs)) - .expect("method not found (this should never happen)") - } - } - impl From<::ethers::contract::Contract> for i_plonk_vk { - fn from(contract: ::ethers::contract::Contract) -> Self { - Self::new(contract.address(), contract.client()) - } - } - ///Container type for all input parameters for the `verify` function with signature `verify(bytes,bytes32[])` and selector `0xea50d0e4` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "verify", abi = "verify(bytes,bytes32[])")] - pub struct VerifyCall { - pub proof: ::ethers::core::types::Bytes, - pub public_inputs: ::std::vec::Vec<[u8; 32]>, - } - ///Container type for all return fields from the `verify` function with signature `verify(bytes,bytes32[])` and selector `0xea50d0e4` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct VerifyReturn(pub bool); -} diff --git a/bindings/src/i_transfer_verifier.rs b/bindings/src/i_transfer_verifier.rs deleted file mode 100644 index 0faffe9..0000000 --- a/bindings/src/i_transfer_verifier.rs +++ /dev/null @@ -1,154 +0,0 @@ -pub use i_transfer_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 i_transfer_verifier { - #[allow(deprecated)] - fn __abi() -> ::ethers::core::abi::Abi { - ::ethers::core::abi::ethabi::Contract { - constructor: ::core::option::Option::None, - functions: ::core::convert::From::from([( - ::std::borrow::ToOwned::to_owned("verifyProof"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("verifyProof"), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("input"), - kind: ::ethers::core::abi::ethabi::ParamType::FixedArray( - ::std::boxed::Box::new( - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ), - 5usize, - ), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256[5]"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("p"), - kind: ::ethers::core::abi::ethabi::ParamType::FixedArray( - ::std::boxed::Box::new( - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ), - 8usize, - ), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256[8]"), - ), - }, - ], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Bool, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bool"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - },], - )]), - events: ::std::collections::BTreeMap::new(), - errors: ::std::collections::BTreeMap::new(), - receive: false, - fallback: false, - } - } - ///The parsed JSON ABI of the contract. - pub static I_TRANSFER_VERIFIER_ABI: ::ethers::contract::Lazy<::ethers::core::abi::Abi> = - ::ethers::contract::Lazy::new(__abi); - pub struct i_transfer_verifier(::ethers::contract::Contract); - impl ::core::clone::Clone for i_transfer_verifier { - fn clone(&self) -> Self { - Self(::core::clone::Clone::clone(&self.0)) - } - } - impl ::core::ops::Deref for i_transfer_verifier { - type Target = ::ethers::contract::Contract; - fn deref(&self) -> &Self::Target { - &self.0 - } - } - impl ::core::ops::DerefMut for i_transfer_verifier { - fn deref_mut(&mut self) -> &mut Self::Target { - &mut self.0 - } - } - impl ::core::fmt::Debug for i_transfer_verifier { - fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { - f.debug_tuple(::core::stringify!(i_transfer_verifier)) - .field(&self.address()) - .finish() - } - } - impl i_transfer_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(), - I_TRANSFER_VERIFIER_ABI.clone(), - client, - )) - } - ///Calls the contract's `verifyProof` (0x68444dc7) function - pub fn verify_proof( - &self, - input: [::ethers::core::types::U256; 5], - p: [::ethers::core::types::U256; 8], - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([104, 68, 77, 199], (input, p)) - .expect("method not found (this should never happen)") - } - } - impl From<::ethers::contract::Contract> - for i_transfer_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(uint256[5],uint256[8])` and selector `0x68444dc7` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "verifyProof", abi = "verifyProof(uint256[5],uint256[8])")] - pub struct VerifyProofCall { - pub input: [::ethers::core::types::U256; 5], - pub p: [::ethers::core::types::U256; 8], - } - ///Container type for all return fields from the `verifyProof` function with signature `verifyProof(uint256[5],uint256[8])` and selector `0x68444dc7` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct VerifyProofReturn(pub bool); -} diff --git a/bindings/src/i_verifier.rs b/bindings/src/i_verifier.rs index 69f436b..3e2f612 100644 --- a/bindings/src/i_verifier.rs +++ b/bindings/src/i_verifier.rs @@ -31,22 +31,6 @@ pub mod i_verifier { state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, },], ), - ( - ::std::borrow::ToOwned::to_owned("proofMarketplace"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("proofMarketplace"), - inputs: ::std::vec![], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("contract ProofMarketplace",), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - },], - ), ( ::std::borrow::ToOwned::to_owned("sampleInput"), ::std::vec![::ethers::core::abi::ethabi::Function { @@ -79,22 +63,6 @@ pub mod i_verifier { state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, },], ), - ( - ::std::borrow::ToOwned::to_owned("setProofMarketplaceContract"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("setProofMarketplaceContract",), - inputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("_proofMarketplace"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("contract ProofMarketplace",), - ), - },], - outputs: ::std::vec![], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable, - },], - ), ( ::std::borrow::ToOwned::to_owned("verify"), ::std::vec![::ethers::core::abi::ethabi::Function { @@ -216,14 +184,6 @@ pub mod i_verifier { .method_hash([16, 165, 66, 121], ()) .expect("method not found (this should never happen)") } - ///Calls the contract's `proofMarketplace` (0x81c45c70) function - pub fn proof_marketplace( - &self, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([129, 196, 92, 112], ()) - .expect("method not found (this should never happen)") - } ///Calls the contract's `sampleInput` (0x7d8ad42b) function pub fn sample_input( &self, @@ -240,15 +200,6 @@ pub mod i_verifier { .method_hash([167, 108, 5, 81], ()) .expect("method not found (this should never happen)") } - ///Calls the contract's `setProofMarketplaceContract` (0x056de704) function - pub fn set_proof_marketplace_contract( - &self, - proof_marketplace: ::ethers::core::types::Address, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([5, 109, 231, 4], proof_marketplace) - .expect("method not found (this should never happen)") - } ///Calls the contract's `verify` (0x8e760afe) function pub fn verify( &self, @@ -300,21 +251,6 @@ pub mod i_verifier { abi = "checkSampleInputsAndProof()" )] pub struct CheckSampleInputsAndProofCall; - ///Container type for all input parameters for the `proofMarketplace` function with signature `proofMarketplace()` and selector `0x81c45c70` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "proofMarketplace", abi = "proofMarketplace()")] - pub struct ProofMarketplaceCall; ///Container type for all input parameters for the `sampleInput` function with signature `sampleInput()` and selector `0x7d8ad42b` #[derive( Clone, @@ -345,26 +281,6 @@ pub mod i_verifier { )] #[ethcall(name = "sampleProof", abi = "sampleProof()")] pub struct SampleProofCall; - ///Container type for all input parameters for the `setProofMarketplaceContract` function with signature `setProofMarketplaceContract(address)` and selector `0x056de704` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall( - name = "setProofMarketplaceContract", - abi = "setProofMarketplaceContract(address)" - )] - pub struct SetProofMarketplaceContractCall { - pub proof_marketplace: ::ethers::core::types::Address, - } ///Container type for all input parameters for the `verify` function with signature `verify(bytes)` and selector `0x8e760afe` #[derive( Clone, @@ -432,10 +348,8 @@ pub mod i_verifier { )] pub enum IVerifierCalls { CheckSampleInputsAndProof(CheckSampleInputsAndProofCall), - ProofMarketplace(ProofMarketplaceCall), SampleInput(SampleInputCall), SampleProof(SampleProofCall), - SetProofMarketplaceContract(SetProofMarketplaceContractCall), Verify(VerifyCall), VerifyAgainstSampleInputs(VerifyAgainstSampleInputsCall), VerifyInputs(VerifyInputsCall), @@ -450,22 +364,12 @@ pub mod i_verifier { { return Ok(Self::CheckSampleInputsAndProof(decoded)); } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::ProofMarketplace(decoded)); - } if let Ok(decoded) = ::decode(data) { return Ok(Self::SampleInput(decoded)); } if let Ok(decoded) = ::decode(data) { return Ok(Self::SampleProof(decoded)); } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::SetProofMarketplaceContract(decoded)); - } if let Ok(decoded) = ::decode(data) { return Ok(Self::Verify(decoded)); } @@ -487,12 +391,8 @@ pub mod i_verifier { Self::CheckSampleInputsAndProof(element) => { ::ethers::core::abi::AbiEncode::encode(element) } - Self::ProofMarketplace(element) => ::ethers::core::abi::AbiEncode::encode(element), Self::SampleInput(element) => ::ethers::core::abi::AbiEncode::encode(element), Self::SampleProof(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::SetProofMarketplaceContract(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } Self::Verify(element) => ::ethers::core::abi::AbiEncode::encode(element), Self::VerifyAgainstSampleInputs(element) => { ::ethers::core::abi::AbiEncode::encode(element) @@ -505,10 +405,8 @@ pub mod i_verifier { fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { match self { Self::CheckSampleInputsAndProof(element) => ::core::fmt::Display::fmt(element, f), - Self::ProofMarketplace(element) => ::core::fmt::Display::fmt(element, f), Self::SampleInput(element) => ::core::fmt::Display::fmt(element, f), Self::SampleProof(element) => ::core::fmt::Display::fmt(element, f), - Self::SetProofMarketplaceContract(element) => ::core::fmt::Display::fmt(element, f), Self::Verify(element) => ::core::fmt::Display::fmt(element, f), Self::VerifyAgainstSampleInputs(element) => ::core::fmt::Display::fmt(element, f), Self::VerifyInputs(element) => ::core::fmt::Display::fmt(element, f), @@ -520,11 +418,6 @@ pub mod i_verifier { Self::CheckSampleInputsAndProof(value) } } - impl ::core::convert::From for IVerifierCalls { - fn from(value: ProofMarketplaceCall) -> Self { - Self::ProofMarketplace(value) - } - } impl ::core::convert::From for IVerifierCalls { fn from(value: SampleInputCall) -> Self { Self::SampleInput(value) @@ -535,11 +428,6 @@ pub mod i_verifier { Self::SampleProof(value) } } - impl ::core::convert::From for IVerifierCalls { - fn from(value: SetProofMarketplaceContractCall) -> Self { - Self::SetProofMarketplaceContract(value) - } - } impl ::core::convert::From for IVerifierCalls { fn from(value: VerifyCall) -> Self { Self::Verify(value) @@ -569,20 +457,6 @@ pub mod i_verifier { Hash, )] pub struct CheckSampleInputsAndProofReturn(pub bool); - ///Container type for all return fields from the `proofMarketplace` function with signature `proofMarketplace()` and selector `0x81c45c70` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct ProofMarketplaceReturn(pub ::ethers::core::types::Address); ///Container type for all return fields from the `sampleInput` function with signature `sampleInput()` and selector `0x7d8ad42b` #[derive( Clone, diff --git a/bindings/src/i_xor_2_verifier.rs b/bindings/src/i_xor_2_verifier.rs deleted file mode 100644 index f975245..0000000 --- a/bindings/src/i_xor_2_verifier.rs +++ /dev/null @@ -1,190 +0,0 @@ -pub use i_xor_2_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 i_xor_2_verifier { - #[allow(deprecated)] - fn __abi() -> ::ethers::core::abi::Abi { - ::ethers::core::abi::ethabi::Contract { - constructor: ::core::option::Option::None, - functions: ::core::convert::From::from([( - ::std::borrow::ToOwned::to_owned("verifyProof"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("verifyProof"), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("a"), - kind: ::ethers::core::abi::ethabi::ParamType::FixedArray( - ::std::boxed::Box::new( - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ), - 2usize, - ), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256[2]"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("b"), - kind: ::ethers::core::abi::ethabi::ParamType::FixedArray( - ::std::boxed::Box::new( - ::ethers::core::abi::ethabi::ParamType::FixedArray( - ::std::boxed::Box::new( - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ), - 2usize, - ), - ), - 2usize, - ), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256[2][2]"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("c"), - kind: ::ethers::core::abi::ethabi::ParamType::FixedArray( - ::std::boxed::Box::new( - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ), - 2usize, - ), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256[2]"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("input"), - kind: ::ethers::core::abi::ethabi::ParamType::FixedArray( - ::std::boxed::Box::new( - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ), - 1usize, - ), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256[1]"), - ), - }, - ], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Bool, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bool"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - },], - )]), - events: ::std::collections::BTreeMap::new(), - errors: ::std::collections::BTreeMap::new(), - receive: false, - fallback: false, - } - } - ///The parsed JSON ABI of the contract. - pub static I_XOR2_VERIFIER_ABI: ::ethers::contract::Lazy<::ethers::core::abi::Abi> = - ::ethers::contract::Lazy::new(__abi); - pub struct i_xor2_verifier(::ethers::contract::Contract); - impl ::core::clone::Clone for i_xor2_verifier { - fn clone(&self) -> Self { - Self(::core::clone::Clone::clone(&self.0)) - } - } - impl ::core::ops::Deref for i_xor2_verifier { - type Target = ::ethers::contract::Contract; - fn deref(&self) -> &Self::Target { - &self.0 - } - } - impl ::core::ops::DerefMut for i_xor2_verifier { - fn deref_mut(&mut self) -> &mut Self::Target { - &mut self.0 - } - } - impl ::core::fmt::Debug for i_xor2_verifier { - fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { - f.debug_tuple(::core::stringify!(i_xor2_verifier)) - .field(&self.address()) - .finish() - } - } - impl i_xor2_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(), - I_XOR2_VERIFIER_ABI.clone(), - client, - )) - } - ///Calls the contract's `verifyProof` (0x43753b4d) function - pub fn verify_proof( - &self, - a: [::ethers::core::types::U256; 2], - b: [[::ethers::core::types::U256; 2]; 2], - c: [::ethers::core::types::U256; 2], - input: [::ethers::core::types::U256; 1], - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([67, 117, 59, 77], (a, b, c, input)) - .expect("method not found (this should never happen)") - } - } - impl From<::ethers::contract::Contract> - for i_xor2_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(uint256[2],uint256[2][2],uint256[2],uint256[1])` and selector `0x43753b4d` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall( - name = "verifyProof", - abi = "verifyProof(uint256[2],uint256[2][2],uint256[2],uint256[1])" - )] - pub struct VerifyProofCall { - pub a: [::ethers::core::types::U256; 2], - pub b: [[::ethers::core::types::U256; 2]; 2], - pub c: [::ethers::core::types::U256; 2], - pub input: [::ethers::core::types::U256; 1], - } - ///Container type for all return fields from the `verifyProof` function with signature `verifyProof(uint256[2],uint256[2][2],uint256[2],uint256[1])` and selector `0x43753b4d` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct VerifyProofReturn(pub bool); -} diff --git a/bindings/src/ierc1155_errors.rs b/bindings/src/ierc1155_errors.rs deleted file mode 100644 index 2a89af9..0000000 --- a/bindings/src/ierc1155_errors.rs +++ /dev/null @@ -1,546 +0,0 @@ -pub use ierc1155_errors::*; -/// 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 ierc1155_errors { - #[allow(deprecated)] - fn __abi() -> ::ethers::core::abi::Abi { - ::ethers::core::abi::ethabi::Contract { - constructor: ::core::option::Option::None, - functions: ::std::collections::BTreeMap::new(), - events: ::std::collections::BTreeMap::new(), - errors: ::core::convert::From::from([ - ( - ::std::borrow::ToOwned::to_owned("ERC1155InsufficientBalance"), - ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("ERC1155InsufficientBalance",), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("sender"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("balance"), - kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("needed"), - kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("tokenId"), - kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256"), - ), - }, - ], - },], - ), - ( - ::std::borrow::ToOwned::to_owned("ERC1155InvalidApprover"), - ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("ERC1155InvalidApprover",), - inputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("approver"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - },], - },], - ), - ( - ::std::borrow::ToOwned::to_owned("ERC1155InvalidArrayLength"), - ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("ERC1155InvalidArrayLength",), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("idsLength"), - kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("valuesLength"), - kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256"), - ), - }, - ], - },], - ), - ( - ::std::borrow::ToOwned::to_owned("ERC1155InvalidOperator"), - ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("ERC1155InvalidOperator",), - inputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("operator"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - },], - },], - ), - ( - ::std::borrow::ToOwned::to_owned("ERC1155InvalidReceiver"), - ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("ERC1155InvalidReceiver",), - inputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("receiver"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - },], - },], - ), - ( - ::std::borrow::ToOwned::to_owned("ERC1155InvalidSender"), - ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("ERC1155InvalidSender",), - inputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("sender"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - },], - },], - ), - ( - ::std::borrow::ToOwned::to_owned("ERC1155MissingApprovalForAll"), - ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("ERC1155MissingApprovalForAll",), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("operator"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("owner"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - }, - ], - },], - ), - ]), - receive: false, - fallback: false, - } - } - ///The parsed JSON ABI of the contract. - pub static IERC1155ERRORS_ABI: ::ethers::contract::Lazy<::ethers::core::abi::Abi> = - ::ethers::contract::Lazy::new(__abi); - pub struct IERC1155Errors(::ethers::contract::Contract); - impl ::core::clone::Clone for IERC1155Errors { - fn clone(&self) -> Self { - Self(::core::clone::Clone::clone(&self.0)) - } - } - impl ::core::ops::Deref for IERC1155Errors { - type Target = ::ethers::contract::Contract; - fn deref(&self) -> &Self::Target { - &self.0 - } - } - impl ::core::ops::DerefMut for IERC1155Errors { - fn deref_mut(&mut self) -> &mut Self::Target { - &mut self.0 - } - } - impl ::core::fmt::Debug for IERC1155Errors { - fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { - f.debug_tuple(::core::stringify!(IERC1155Errors)) - .field(&self.address()) - .finish() - } - } - impl IERC1155Errors { - /// 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(), - IERC1155ERRORS_ABI.clone(), - client, - )) - } - } - impl From<::ethers::contract::Contract> - for IERC1155Errors - { - fn from(contract: ::ethers::contract::Contract) -> Self { - Self::new(contract.address(), contract.client()) - } - } - ///Custom Error type `ERC1155InsufficientBalance` with signature `ERC1155InsufficientBalance(address,uint256,uint256,uint256)` and selector `0x03dee4c5` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[etherror( - name = "ERC1155InsufficientBalance", - abi = "ERC1155InsufficientBalance(address,uint256,uint256,uint256)" - )] - pub struct ERC1155InsufficientBalance { - pub sender: ::ethers::core::types::Address, - pub balance: ::ethers::core::types::U256, - pub needed: ::ethers::core::types::U256, - pub token_id: ::ethers::core::types::U256, - } - ///Custom Error type `ERC1155InvalidApprover` with signature `ERC1155InvalidApprover(address)` and selector `0x3e31884e` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[etherror( - name = "ERC1155InvalidApprover", - abi = "ERC1155InvalidApprover(address)" - )] - pub struct ERC1155InvalidApprover { - pub approver: ::ethers::core::types::Address, - } - ///Custom Error type `ERC1155InvalidArrayLength` with signature `ERC1155InvalidArrayLength(uint256,uint256)` and selector `0x5b059991` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[etherror( - name = "ERC1155InvalidArrayLength", - abi = "ERC1155InvalidArrayLength(uint256,uint256)" - )] - pub struct ERC1155InvalidArrayLength { - pub ids_length: ::ethers::core::types::U256, - pub values_length: ::ethers::core::types::U256, - } - ///Custom Error type `ERC1155InvalidOperator` with signature `ERC1155InvalidOperator(address)` and selector `0xced3e100` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[etherror( - name = "ERC1155InvalidOperator", - abi = "ERC1155InvalidOperator(address)" - )] - pub struct ERC1155InvalidOperator { - pub operator: ::ethers::core::types::Address, - } - ///Custom Error type `ERC1155InvalidReceiver` with signature `ERC1155InvalidReceiver(address)` and selector `0x57f447ce` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[etherror( - name = "ERC1155InvalidReceiver", - abi = "ERC1155InvalidReceiver(address)" - )] - pub struct ERC1155InvalidReceiver { - pub receiver: ::ethers::core::types::Address, - } - ///Custom Error type `ERC1155InvalidSender` with signature `ERC1155InvalidSender(address)` and selector `0x01a83514` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[etherror(name = "ERC1155InvalidSender", abi = "ERC1155InvalidSender(address)")] - pub struct ERC1155InvalidSender { - pub sender: ::ethers::core::types::Address, - } - ///Custom Error type `ERC1155MissingApprovalForAll` with signature `ERC1155MissingApprovalForAll(address,address)` and selector `0xe237d922` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[etherror( - name = "ERC1155MissingApprovalForAll", - abi = "ERC1155MissingApprovalForAll(address,address)" - )] - pub struct ERC1155MissingApprovalForAll { - pub operator: ::ethers::core::types::Address, - pub owner: ::ethers::core::types::Address, - } - ///Container type for all of the contract's custom errors - #[derive( - Clone, - ::ethers::contract::EthAbiType, - serde::Serialize, - serde::Deserialize, - Debug, - PartialEq, - Eq, - Hash, - )] - pub enum IERC1155ErrorsErrors { - ERC1155InsufficientBalance(ERC1155InsufficientBalance), - ERC1155InvalidApprover(ERC1155InvalidApprover), - ERC1155InvalidArrayLength(ERC1155InvalidArrayLength), - ERC1155InvalidOperator(ERC1155InvalidOperator), - ERC1155InvalidReceiver(ERC1155InvalidReceiver), - ERC1155InvalidSender(ERC1155InvalidSender), - ERC1155MissingApprovalForAll(ERC1155MissingApprovalForAll), - /// The standard solidity revert string, with selector - /// Error(string) -- 0x08c379a0 - RevertString(::std::string::String), - } - impl ::ethers::core::abi::AbiDecode for IERC1155ErrorsErrors { - fn decode( - data: impl AsRef<[u8]>, - ) -> ::core::result::Result { - let data = data.as_ref(); - if let Ok(decoded) = - <::std::string::String as ::ethers::core::abi::AbiDecode>::decode(data) - { - return Ok(Self::RevertString(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::ERC1155InsufficientBalance(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::ERC1155InvalidApprover(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::ERC1155InvalidArrayLength(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::ERC1155InvalidOperator(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::ERC1155InvalidReceiver(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::ERC1155InvalidSender(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::ERC1155MissingApprovalForAll(decoded)); - } - Err(::ethers::core::abi::Error::InvalidData.into()) - } - } - impl ::ethers::core::abi::AbiEncode for IERC1155ErrorsErrors { - fn encode(self) -> ::std::vec::Vec { - match self { - Self::ERC1155InsufficientBalance(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::ERC1155InvalidApprover(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::ERC1155InvalidArrayLength(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::ERC1155InvalidOperator(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::ERC1155InvalidReceiver(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::ERC1155InvalidSender(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::ERC1155MissingApprovalForAll(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::RevertString(s) => ::ethers::core::abi::AbiEncode::encode(s), - } - } - } - impl ::ethers::contract::ContractRevert for IERC1155ErrorsErrors { - fn valid_selector(selector: [u8; 4]) -> bool { - match selector { - [0x08, 0xc3, 0x79, 0xa0] => true, - _ if selector - == ::selector() => - { - true - } - _ if selector - == ::selector() => - { - true - } - _ if selector - == ::selector() => - { - true - } - _ if selector - == ::selector() => - { - true - } - _ if selector - == ::selector() => - { - true - } - _ if selector - == ::selector() => - { - true - } - _ if selector - == ::selector( - ) => - { - true - } - _ => false, - } - } - } - impl ::core::fmt::Display for IERC1155ErrorsErrors { - fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { - match self { - Self::ERC1155InsufficientBalance(element) => ::core::fmt::Display::fmt(element, f), - Self::ERC1155InvalidApprover(element) => ::core::fmt::Display::fmt(element, f), - Self::ERC1155InvalidArrayLength(element) => ::core::fmt::Display::fmt(element, f), - Self::ERC1155InvalidOperator(element) => ::core::fmt::Display::fmt(element, f), - Self::ERC1155InvalidReceiver(element) => ::core::fmt::Display::fmt(element, f), - Self::ERC1155InvalidSender(element) => ::core::fmt::Display::fmt(element, f), - Self::ERC1155MissingApprovalForAll(element) => { - ::core::fmt::Display::fmt(element, f) - } - Self::RevertString(s) => ::core::fmt::Display::fmt(s, f), - } - } - } - impl ::core::convert::From<::std::string::String> for IERC1155ErrorsErrors { - fn from(value: String) -> Self { - Self::RevertString(value) - } - } - impl ::core::convert::From for IERC1155ErrorsErrors { - fn from(value: ERC1155InsufficientBalance) -> Self { - Self::ERC1155InsufficientBalance(value) - } - } - impl ::core::convert::From for IERC1155ErrorsErrors { - fn from(value: ERC1155InvalidApprover) -> Self { - Self::ERC1155InvalidApprover(value) - } - } - impl ::core::convert::From for IERC1155ErrorsErrors { - fn from(value: ERC1155InvalidArrayLength) -> Self { - Self::ERC1155InvalidArrayLength(value) - } - } - impl ::core::convert::From for IERC1155ErrorsErrors { - fn from(value: ERC1155InvalidOperator) -> Self { - Self::ERC1155InvalidOperator(value) - } - } - impl ::core::convert::From for IERC1155ErrorsErrors { - fn from(value: ERC1155InvalidReceiver) -> Self { - Self::ERC1155InvalidReceiver(value) - } - } - impl ::core::convert::From for IERC1155ErrorsErrors { - fn from(value: ERC1155InvalidSender) -> Self { - Self::ERC1155InvalidSender(value) - } - } - impl ::core::convert::From for IERC1155ErrorsErrors { - fn from(value: ERC1155MissingApprovalForAll) -> Self { - Self::ERC1155MissingApprovalForAll(value) - } - } -} diff --git a/bindings/src/erc20.rs b/bindings/src/ierc1363.rs similarity index 58% rename from bindings/src/erc20.rs rename to bindings/src/ierc1363.rs index a94aefb..948b38e 100644 --- a/bindings/src/erc20.rs +++ b/bindings/src/ierc1363.rs @@ -1,4 +1,4 @@ -pub use erc20::*; +pub use ierc1363::*; /// This module was auto-generated with ethers-rs Abigen. /// More information at: #[allow( @@ -9,7 +9,7 @@ pub use erc20::*; dead_code, non_camel_case_types )] -pub mod erc20 { +pub mod ierc1363 { #[allow(deprecated)] fn __abi() -> ::ethers::core::abi::Abi { ::ethers::core::abi::ethabi::Contract { @@ -77,6 +77,76 @@ pub mod erc20 { state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable, },], ), + ( + ::std::borrow::ToOwned::to_owned("approveAndCall"), + ::std::vec![ + ::ethers::core::abi::ethabi::Function { + name: ::std::borrow::ToOwned::to_owned("approveAndCall"), + inputs: ::std::vec![ + ::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("spender"), + kind: ::ethers::core::abi::ethabi::ParamType::Address, + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("address"), + ), + }, + ::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("value"), + kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("uint256"), + ), + }, + ], + outputs: ::std::vec![::ethers::core::abi::ethabi::Param { + name: ::std::string::String::new(), + kind: ::ethers::core::abi::ethabi::ParamType::Bool, + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("bool"), + ), + },], + constant: ::core::option::Option::None, + state_mutability: + ::ethers::core::abi::ethabi::StateMutability::NonPayable, + }, + ::ethers::core::abi::ethabi::Function { + name: ::std::borrow::ToOwned::to_owned("approveAndCall"), + inputs: ::std::vec![ + ::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("spender"), + kind: ::ethers::core::abi::ethabi::ParamType::Address, + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("address"), + ), + }, + ::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("value"), + kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("uint256"), + ), + }, + ::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("data"), + kind: ::ethers::core::abi::ethabi::ParamType::Bytes, + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("bytes"), + ), + }, + ], + outputs: ::std::vec![::ethers::core::abi::ethabi::Param { + name: ::std::string::String::new(), + kind: ::ethers::core::abi::ethabi::ParamType::Bool, + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("bool"), + ), + },], + constant: ::core::option::Option::None, + state_mutability: + ::ethers::core::abi::ethabi::StateMutability::NonPayable, + }, + ], + ), ( ::std::borrow::ToOwned::to_owned("balanceOf"), ::std::vec![::ethers::core::abi::ethabi::Function { @@ -100,47 +170,21 @@ pub mod erc20 { },], ), ( - ::std::borrow::ToOwned::to_owned("decimals"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("decimals"), - inputs: ::std::vec![], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Uint(8usize), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint8"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("name"), + ::std::borrow::ToOwned::to_owned("supportsInterface"), ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("name"), - inputs: ::std::vec![], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::String, + name: ::std::borrow::ToOwned::to_owned("supportsInterface"), + inputs: ::std::vec![::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("interfaceId"), + kind: ::ethers::core::abi::ethabi::ParamType::FixedBytes(4usize,), internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("string"), + ::std::borrow::ToOwned::to_owned("bytes4"), ), },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("symbol"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("symbol"), - inputs: ::std::vec![], outputs: ::std::vec![::ethers::core::abi::ethabi::Param { name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::String, + kind: ::ethers::core::abi::ethabi::ParamType::Bool, internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("string"), + ::std::borrow::ToOwned::to_owned("bool"), ), },], constant: ::core::option::Option::None, @@ -194,6 +238,76 @@ pub mod erc20 { state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable, },], ), + ( + ::std::borrow::ToOwned::to_owned("transferAndCall"), + ::std::vec![ + ::ethers::core::abi::ethabi::Function { + name: ::std::borrow::ToOwned::to_owned("transferAndCall"), + inputs: ::std::vec![ + ::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("to"), + kind: ::ethers::core::abi::ethabi::ParamType::Address, + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("address"), + ), + }, + ::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("value"), + kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("uint256"), + ), + }, + ], + outputs: ::std::vec![::ethers::core::abi::ethabi::Param { + name: ::std::string::String::new(), + kind: ::ethers::core::abi::ethabi::ParamType::Bool, + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("bool"), + ), + },], + constant: ::core::option::Option::None, + state_mutability: + ::ethers::core::abi::ethabi::StateMutability::NonPayable, + }, + ::ethers::core::abi::ethabi::Function { + name: ::std::borrow::ToOwned::to_owned("transferAndCall"), + inputs: ::std::vec![ + ::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("to"), + kind: ::ethers::core::abi::ethabi::ParamType::Address, + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("address"), + ), + }, + ::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("value"), + kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("uint256"), + ), + }, + ::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("data"), + kind: ::ethers::core::abi::ethabi::ParamType::Bytes, + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("bytes"), + ), + }, + ], + outputs: ::std::vec![::ethers::core::abi::ethabi::Param { + name: ::std::string::String::new(), + kind: ::ethers::core::abi::ethabi::ParamType::Bool, + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("bool"), + ), + },], + constant: ::core::option::Option::None, + state_mutability: + ::ethers::core::abi::ethabi::StateMutability::NonPayable, + }, + ], + ), ( ::std::borrow::ToOwned::to_owned("transferFrom"), ::std::vec![::ethers::core::abi::ethabi::Function { @@ -232,6 +346,90 @@ pub mod erc20 { state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable, },], ), + ( + ::std::borrow::ToOwned::to_owned("transferFromAndCall"), + ::std::vec![ + ::ethers::core::abi::ethabi::Function { + name: ::std::borrow::ToOwned::to_owned("transferFromAndCall",), + inputs: ::std::vec![ + ::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("from"), + kind: ::ethers::core::abi::ethabi::ParamType::Address, + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("address"), + ), + }, + ::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("to"), + kind: ::ethers::core::abi::ethabi::ParamType::Address, + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("address"), + ), + }, + ::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("value"), + kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("uint256"), + ), + }, + ::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("data"), + kind: ::ethers::core::abi::ethabi::ParamType::Bytes, + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("bytes"), + ), + }, + ], + outputs: ::std::vec![::ethers::core::abi::ethabi::Param { + name: ::std::string::String::new(), + kind: ::ethers::core::abi::ethabi::ParamType::Bool, + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("bool"), + ), + },], + constant: ::core::option::Option::None, + state_mutability: + ::ethers::core::abi::ethabi::StateMutability::NonPayable, + }, + ::ethers::core::abi::ethabi::Function { + name: ::std::borrow::ToOwned::to_owned("transferFromAndCall",), + inputs: ::std::vec![ + ::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("from"), + kind: ::ethers::core::abi::ethabi::ParamType::Address, + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("address"), + ), + }, + ::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("to"), + kind: ::ethers::core::abi::ethabi::ParamType::Address, + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("address"), + ), + }, + ::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("value"), + kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("uint256"), + ), + }, + ], + outputs: ::std::vec![::ethers::core::abi::ethabi::Param { + name: ::std::string::String::new(), + kind: ::ethers::core::abi::ethabi::ParamType::Bool, + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("bool"), + ), + },], + constant: ::core::option::Option::None, + state_mutability: + ::ethers::core::abi::ethabi::StateMutability::NonPayable, + }, + ], + ), ]), events: ::core::convert::From::from([ ( @@ -283,150 +481,39 @@ pub mod erc20 { },], ), ]), - errors: ::core::convert::From::from([ - ( - ::std::borrow::ToOwned::to_owned("ERC20InsufficientAllowance"), - ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("ERC20InsufficientAllowance",), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("spender"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("allowance"), - kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("needed"), - kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256"), - ), - }, - ], - },], - ), - ( - ::std::borrow::ToOwned::to_owned("ERC20InsufficientBalance"), - ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("ERC20InsufficientBalance",), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("sender"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("balance"), - kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("needed"), - kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256"), - ), - }, - ], - },], - ), - ( - ::std::borrow::ToOwned::to_owned("ERC20InvalidApprover"), - ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("ERC20InvalidApprover",), - inputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("approver"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - },], - },], - ), - ( - ::std::borrow::ToOwned::to_owned("ERC20InvalidReceiver"), - ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("ERC20InvalidReceiver",), - inputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("receiver"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - },], - },], - ), - ( - ::std::borrow::ToOwned::to_owned("ERC20InvalidSender"), - ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("ERC20InvalidSender"), - inputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("sender"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - },], - },], - ), - ( - ::std::borrow::ToOwned::to_owned("ERC20InvalidSpender"), - ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("ERC20InvalidSpender",), - inputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("spender"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - },], - },], - ), - ]), + errors: ::std::collections::BTreeMap::new(), receive: false, fallback: false, } } ///The parsed JSON ABI of the contract. - pub static ERC20_ABI: ::ethers::contract::Lazy<::ethers::core::abi::Abi> = + pub static IERC1363_ABI: ::ethers::contract::Lazy<::ethers::core::abi::Abi> = ::ethers::contract::Lazy::new(__abi); - pub struct ERC20(::ethers::contract::Contract); - impl ::core::clone::Clone for ERC20 { + pub struct IERC1363(::ethers::contract::Contract); + impl ::core::clone::Clone for IERC1363 { fn clone(&self) -> Self { Self(::core::clone::Clone::clone(&self.0)) } } - impl ::core::ops::Deref for ERC20 { + impl ::core::ops::Deref for IERC1363 { type Target = ::ethers::contract::Contract; fn deref(&self) -> &Self::Target { &self.0 } } - impl ::core::ops::DerefMut for ERC20 { + impl ::core::ops::DerefMut for IERC1363 { fn deref_mut(&mut self) -> &mut Self::Target { &mut self.0 } } - impl ::core::fmt::Debug for ERC20 { + impl ::core::fmt::Debug for IERC1363 { fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { - f.debug_tuple(::core::stringify!(ERC20)) + f.debug_tuple(::core::stringify!(IERC1363)) .field(&self.address()) .finish() } } - impl ERC20 { + impl IERC1363 { /// Creates a new contract instance with the specified `ethers` client at /// `address`. The contract derefs to a `ethers::Contract` object. pub fn new>( @@ -435,7 +522,7 @@ pub mod erc20 { ) -> Self { Self(::ethers::contract::Contract::new( address.into(), - ERC20_ABI.clone(), + IERC1363_ABI.clone(), client, )) } @@ -459,33 +546,43 @@ pub mod erc20 { .method_hash([9, 94, 167, 179], (spender, value)) .expect("method not found (this should never happen)") } - ///Calls the contract's `balanceOf` (0x70a08231) function - pub fn balance_of( + ///Calls the contract's `approveAndCall` (0x3177029f) function + pub fn approve_and_call( &self, - account: ::ethers::core::types::Address, - ) -> ::ethers::contract::builders::ContractCall { + spender: ::ethers::core::types::Address, + value: ::ethers::core::types::U256, + ) -> ::ethers::contract::builders::ContractCall { self.0 - .method_hash([112, 160, 130, 49], account) + .method_hash([49, 119, 2, 159], (spender, value)) .expect("method not found (this should never happen)") } - ///Calls the contract's `decimals` (0x313ce567) function - pub fn decimals(&self) -> ::ethers::contract::builders::ContractCall { + ///Calls the contract's `approveAndCall` (0xcae9ca51) function + pub fn approve_and_call_with_spender_and_value( + &self, + spender: ::ethers::core::types::Address, + value: ::ethers::core::types::U256, + data: ::ethers::core::types::Bytes, + ) -> ::ethers::contract::builders::ContractCall { self.0 - .method_hash([49, 60, 229, 103], ()) + .method_hash([202, 233, 202, 81], (spender, value, data)) .expect("method not found (this should never happen)") } - ///Calls the contract's `name` (0x06fdde03) function - pub fn name(&self) -> ::ethers::contract::builders::ContractCall { + ///Calls the contract's `balanceOf` (0x70a08231) function + pub fn balance_of( + &self, + account: ::ethers::core::types::Address, + ) -> ::ethers::contract::builders::ContractCall { self.0 - .method_hash([6, 253, 222, 3], ()) + .method_hash([112, 160, 130, 49], account) .expect("method not found (this should never happen)") } - ///Calls the contract's `symbol` (0x95d89b41) function - pub fn symbol( + ///Calls the contract's `supportsInterface` (0x01ffc9a7) function + pub fn supports_interface( &self, - ) -> ::ethers::contract::builders::ContractCall { + interface_id: [u8; 4], + ) -> ::ethers::contract::builders::ContractCall { self.0 - .method_hash([149, 216, 155, 65], ()) + .method_hash([1, 255, 201, 167], interface_id) .expect("method not found (this should never happen)") } ///Calls the contract's `totalSupply` (0x18160ddd) function @@ -506,6 +603,27 @@ pub mod erc20 { .method_hash([169, 5, 156, 187], (to, value)) .expect("method not found (this should never happen)") } + ///Calls the contract's `transferAndCall` (0x1296ee62) function + pub fn transfer_and_call( + &self, + to: ::ethers::core::types::Address, + value: ::ethers::core::types::U256, + ) -> ::ethers::contract::builders::ContractCall { + self.0 + .method_hash([18, 150, 238, 98], (to, value)) + .expect("method not found (this should never happen)") + } + ///Calls the contract's `transferAndCall` (0x4000aea0) function + pub fn transfer_and_call_with_to_and_value( + &self, + to: ::ethers::core::types::Address, + value: ::ethers::core::types::U256, + data: ::ethers::core::types::Bytes, + ) -> ::ethers::contract::builders::ContractCall { + self.0 + .method_hash([64, 0, 174, 160], (to, value, data)) + .expect("method not found (this should never happen)") + } ///Calls the contract's `transferFrom` (0x23b872dd) function pub fn transfer_from( &self, @@ -517,6 +635,29 @@ pub mod erc20 { .method_hash([35, 184, 114, 221], (from, to, value)) .expect("method not found (this should never happen)") } + ///Calls the contract's `transferFromAndCall` (0xc1d34b89) function + pub fn transfer_from_and_call_with_from_and_to_and_data( + &self, + from: ::ethers::core::types::Address, + to: ::ethers::core::types::Address, + value: ::ethers::core::types::U256, + data: ::ethers::core::types::Bytes, + ) -> ::ethers::contract::builders::ContractCall { + self.0 + .method_hash([193, 211, 75, 137], (from, to, value, data)) + .expect("method not found (this should never happen)") + } + ///Calls the contract's `transferFromAndCall` (0xd8fbe994) function + pub fn transfer_from_and_call( + &self, + from: ::ethers::core::types::Address, + to: ::ethers::core::types::Address, + value: ::ethers::core::types::U256, + ) -> ::ethers::contract::builders::ContractCall { + self.0 + .method_hash([216, 251, 233, 148], (from, to, value)) + .expect("method not found (this should never happen)") + } ///Gets the contract's `Approval` event pub fn approval_filter( &self, @@ -532,304 +673,16 @@ pub mod erc20 { /// Returns an `Event` builder for all the events of this contract. pub fn events( &self, - ) -> ::ethers::contract::builders::Event<::std::sync::Arc, M, ERC20Events> { + ) -> ::ethers::contract::builders::Event<::std::sync::Arc, M, IERC1363Events> { self.0 .event_with_filter(::core::default::Default::default()) } } - impl From<::ethers::contract::Contract> for ERC20 { + impl From<::ethers::contract::Contract> for IERC1363 { fn from(contract: ::ethers::contract::Contract) -> Self { Self::new(contract.address(), contract.client()) } } - ///Custom Error type `ERC20InsufficientAllowance` with signature `ERC20InsufficientAllowance(address,uint256,uint256)` and selector `0xfb8f41b2` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[etherror( - name = "ERC20InsufficientAllowance", - abi = "ERC20InsufficientAllowance(address,uint256,uint256)" - )] - pub struct ERC20InsufficientAllowance { - pub spender: ::ethers::core::types::Address, - pub allowance: ::ethers::core::types::U256, - pub needed: ::ethers::core::types::U256, - } - ///Custom Error type `ERC20InsufficientBalance` with signature `ERC20InsufficientBalance(address,uint256,uint256)` and selector `0xe450d38c` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[etherror( - name = "ERC20InsufficientBalance", - abi = "ERC20InsufficientBalance(address,uint256,uint256)" - )] - pub struct ERC20InsufficientBalance { - pub sender: ::ethers::core::types::Address, - pub balance: ::ethers::core::types::U256, - pub needed: ::ethers::core::types::U256, - } - ///Custom Error type `ERC20InvalidApprover` with signature `ERC20InvalidApprover(address)` and selector `0xe602df05` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[etherror(name = "ERC20InvalidApprover", abi = "ERC20InvalidApprover(address)")] - pub struct ERC20InvalidApprover { - pub approver: ::ethers::core::types::Address, - } - ///Custom Error type `ERC20InvalidReceiver` with signature `ERC20InvalidReceiver(address)` and selector `0xec442f05` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[etherror(name = "ERC20InvalidReceiver", abi = "ERC20InvalidReceiver(address)")] - pub struct ERC20InvalidReceiver { - pub receiver: ::ethers::core::types::Address, - } - ///Custom Error type `ERC20InvalidSender` with signature `ERC20InvalidSender(address)` and selector `0x96c6fd1e` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[etherror(name = "ERC20InvalidSender", abi = "ERC20InvalidSender(address)")] - pub struct ERC20InvalidSender { - pub sender: ::ethers::core::types::Address, - } - ///Custom Error type `ERC20InvalidSpender` with signature `ERC20InvalidSpender(address)` and selector `0x94280d62` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[etherror(name = "ERC20InvalidSpender", abi = "ERC20InvalidSpender(address)")] - pub struct ERC20InvalidSpender { - pub spender: ::ethers::core::types::Address, - } - ///Container type for all of the contract's custom errors - #[derive( - Clone, - ::ethers::contract::EthAbiType, - serde::Serialize, - serde::Deserialize, - Debug, - PartialEq, - Eq, - Hash, - )] - pub enum ERC20Errors { - ERC20InsufficientAllowance(ERC20InsufficientAllowance), - ERC20InsufficientBalance(ERC20InsufficientBalance), - ERC20InvalidApprover(ERC20InvalidApprover), - ERC20InvalidReceiver(ERC20InvalidReceiver), - ERC20InvalidSender(ERC20InvalidSender), - ERC20InvalidSpender(ERC20InvalidSpender), - /// The standard solidity revert string, with selector - /// Error(string) -- 0x08c379a0 - RevertString(::std::string::String), - } - impl ::ethers::core::abi::AbiDecode for ERC20Errors { - fn decode( - data: impl AsRef<[u8]>, - ) -> ::core::result::Result { - let data = data.as_ref(); - if let Ok(decoded) = - <::std::string::String as ::ethers::core::abi::AbiDecode>::decode(data) - { - return Ok(Self::RevertString(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::ERC20InsufficientAllowance(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::ERC20InsufficientBalance(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::ERC20InvalidApprover(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::ERC20InvalidReceiver(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::ERC20InvalidSender(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::ERC20InvalidSpender(decoded)); - } - Err(::ethers::core::abi::Error::InvalidData.into()) - } - } - impl ::ethers::core::abi::AbiEncode for ERC20Errors { - fn encode(self) -> ::std::vec::Vec { - match self { - Self::ERC20InsufficientAllowance(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::ERC20InsufficientBalance(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::ERC20InvalidApprover(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::ERC20InvalidReceiver(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::ERC20InvalidSender(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::ERC20InvalidSpender(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::RevertString(s) => ::ethers::core::abi::AbiEncode::encode(s), - } - } - } - impl ::ethers::contract::ContractRevert for ERC20Errors { - fn valid_selector(selector: [u8; 4]) -> bool { - match selector { - [0x08, 0xc3, 0x79, 0xa0] => true, - _ if selector - == ::selector() => - { - true - } - _ if selector - == ::selector() => - { - true - } - _ if selector - == ::selector() => - { - true - } - _ if selector - == ::selector() => - { - true - } - _ if selector - == ::selector() => - { - true - } - _ if selector - == ::selector() => - { - true - } - _ => false, - } - } - } - impl ::core::fmt::Display for ERC20Errors { - fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { - match self { - Self::ERC20InsufficientAllowance(element) => ::core::fmt::Display::fmt(element, f), - Self::ERC20InsufficientBalance(element) => ::core::fmt::Display::fmt(element, f), - Self::ERC20InvalidApprover(element) => ::core::fmt::Display::fmt(element, f), - Self::ERC20InvalidReceiver(element) => ::core::fmt::Display::fmt(element, f), - Self::ERC20InvalidSender(element) => ::core::fmt::Display::fmt(element, f), - Self::ERC20InvalidSpender(element) => ::core::fmt::Display::fmt(element, f), - Self::RevertString(s) => ::core::fmt::Display::fmt(s, f), - } - } - } - impl ::core::convert::From<::std::string::String> for ERC20Errors { - fn from(value: String) -> Self { - Self::RevertString(value) - } - } - impl ::core::convert::From for ERC20Errors { - fn from(value: ERC20InsufficientAllowance) -> Self { - Self::ERC20InsufficientAllowance(value) - } - } - impl ::core::convert::From for ERC20Errors { - fn from(value: ERC20InsufficientBalance) -> Self { - Self::ERC20InsufficientBalance(value) - } - } - impl ::core::convert::From for ERC20Errors { - fn from(value: ERC20InvalidApprover) -> Self { - Self::ERC20InvalidApprover(value) - } - } - impl ::core::convert::From for ERC20Errors { - fn from(value: ERC20InvalidReceiver) -> Self { - Self::ERC20InvalidReceiver(value) - } - } - impl ::core::convert::From for ERC20Errors { - fn from(value: ERC20InvalidSender) -> Self { - Self::ERC20InvalidSender(value) - } - } - impl ::core::convert::From for ERC20Errors { - fn from(value: ERC20InvalidSpender) -> Self { - Self::ERC20InvalidSpender(value) - } - } #[derive( Clone, ::ethers::contract::EthEvent, @@ -881,24 +734,24 @@ pub mod erc20 { Eq, Hash, )] - pub enum ERC20Events { + pub enum IERC1363Events { ApprovalFilter(ApprovalFilter), TransferFilter(TransferFilter), } - impl ::ethers::contract::EthLogDecode for ERC20Events { + impl ::ethers::contract::EthLogDecode for IERC1363Events { fn decode_log( log: &::ethers::core::abi::RawLog, ) -> ::core::result::Result { if let Ok(decoded) = ApprovalFilter::decode_log(log) { - return Ok(ERC20Events::ApprovalFilter(decoded)); + return Ok(IERC1363Events::ApprovalFilter(decoded)); } if let Ok(decoded) = TransferFilter::decode_log(log) { - return Ok(ERC20Events::TransferFilter(decoded)); + return Ok(IERC1363Events::TransferFilter(decoded)); } Err(::ethers::core::abi::Error::InvalidData) } } - impl ::core::fmt::Display for ERC20Events { + impl ::core::fmt::Display for IERC1363Events { fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { match self { Self::ApprovalFilter(element) => ::core::fmt::Display::fmt(element, f), @@ -906,12 +759,12 @@ pub mod erc20 { } } } - impl ::core::convert::From for ERC20Events { + impl ::core::convert::From for IERC1363Events { fn from(value: ApprovalFilter) -> Self { Self::ApprovalFilter(value) } } - impl ::core::convert::From for ERC20Events { + impl ::core::convert::From for IERC1363Events { fn from(value: TransferFilter) -> Self { Self::TransferFilter(value) } @@ -952,7 +805,7 @@ pub mod erc20 { pub spender: ::ethers::core::types::Address, pub value: ::ethers::core::types::U256, } - ///Container type for all input parameters for the `balanceOf` function with signature `balanceOf(address)` and selector `0x70a08231` + ///Container type for all input parameters for the `approveAndCall` function with signature `approveAndCall(address,uint256)` and selector `0x3177029f` #[derive( Clone, ::ethers::contract::EthCall, @@ -965,11 +818,12 @@ pub mod erc20 { Eq, Hash, )] - #[ethcall(name = "balanceOf", abi = "balanceOf(address)")] - pub struct BalanceOfCall { - pub account: ::ethers::core::types::Address, + #[ethcall(name = "approveAndCall", abi = "approveAndCall(address,uint256)")] + pub struct ApproveAndCallCall { + pub spender: ::ethers::core::types::Address, + pub value: ::ethers::core::types::U256, } - ///Container type for all input parameters for the `decimals` function with signature `decimals()` and selector `0x313ce567` + ///Container type for all input parameters for the `approveAndCall` function with signature `approveAndCall(address,uint256,bytes)` and selector `0xcae9ca51` #[derive( Clone, ::ethers::contract::EthCall, @@ -982,9 +836,13 @@ pub mod erc20 { Eq, Hash, )] - #[ethcall(name = "decimals", abi = "decimals()")] - pub struct DecimalsCall; - ///Container type for all input parameters for the `name` function with signature `name()` and selector `0x06fdde03` + #[ethcall(name = "approveAndCall", abi = "approveAndCall(address,uint256,bytes)")] + pub struct ApproveAndCallWithSpenderAndValueCall { + pub spender: ::ethers::core::types::Address, + pub value: ::ethers::core::types::U256, + pub data: ::ethers::core::types::Bytes, + } + ///Container type for all input parameters for the `balanceOf` function with signature `balanceOf(address)` and selector `0x70a08231` #[derive( Clone, ::ethers::contract::EthCall, @@ -997,9 +855,11 @@ pub mod erc20 { Eq, Hash, )] - #[ethcall(name = "name", abi = "name()")] - pub struct NameCall; - ///Container type for all input parameters for the `symbol` function with signature `symbol()` and selector `0x95d89b41` + #[ethcall(name = "balanceOf", abi = "balanceOf(address)")] + pub struct BalanceOfCall { + pub account: ::ethers::core::types::Address, + } + ///Container type for all input parameters for the `supportsInterface` function with signature `supportsInterface(bytes4)` and selector `0x01ffc9a7` #[derive( Clone, ::ethers::contract::EthCall, @@ -1012,8 +872,10 @@ pub mod erc20 { Eq, Hash, )] - #[ethcall(name = "symbol", abi = "symbol()")] - pub struct SymbolCall; + #[ethcall(name = "supportsInterface", abi = "supportsInterface(bytes4)")] + pub struct SupportsInterfaceCall { + pub interface_id: [u8; 4], + } ///Container type for all input parameters for the `totalSupply` function with signature `totalSupply()` and selector `0x18160ddd` #[derive( Clone, @@ -1047,6 +909,46 @@ pub mod erc20 { pub to: ::ethers::core::types::Address, pub value: ::ethers::core::types::U256, } + ///Container type for all input parameters for the `transferAndCall` function with signature `transferAndCall(address,uint256)` and selector `0x1296ee62` + #[derive( + Clone, + ::ethers::contract::EthCall, + ::ethers::contract::EthDisplay, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + #[ethcall(name = "transferAndCall", abi = "transferAndCall(address,uint256)")] + pub struct TransferAndCallCall { + pub to: ::ethers::core::types::Address, + pub value: ::ethers::core::types::U256, + } + ///Container type for all input parameters for the `transferAndCall` function with signature `transferAndCall(address,uint256,bytes)` and selector `0x4000aea0` + #[derive( + Clone, + ::ethers::contract::EthCall, + ::ethers::contract::EthDisplay, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + #[ethcall( + name = "transferAndCall", + abi = "transferAndCall(address,uint256,bytes)" + )] + pub struct TransferAndCallWithToAndValueCall { + pub to: ::ethers::core::types::Address, + pub value: ::ethers::core::types::U256, + pub data: ::ethers::core::types::Bytes, + } ///Container type for all input parameters for the `transferFrom` function with signature `transferFrom(address,address,uint256)` and selector `0x23b872dd` #[derive( Clone, @@ -1066,6 +968,51 @@ pub mod erc20 { pub to: ::ethers::core::types::Address, pub value: ::ethers::core::types::U256, } + ///Container type for all input parameters for the `transferFromAndCall` function with signature `transferFromAndCall(address,address,uint256,bytes)` and selector `0xc1d34b89` + #[derive( + Clone, + ::ethers::contract::EthCall, + ::ethers::contract::EthDisplay, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + #[ethcall( + name = "transferFromAndCall", + abi = "transferFromAndCall(address,address,uint256,bytes)" + )] + pub struct TransferFromAndCallWithFromAndToAndDataCall { + pub from: ::ethers::core::types::Address, + pub to: ::ethers::core::types::Address, + pub value: ::ethers::core::types::U256, + pub data: ::ethers::core::types::Bytes, + } + ///Container type for all input parameters for the `transferFromAndCall` function with signature `transferFromAndCall(address,address,uint256)` and selector `0xd8fbe994` + #[derive( + Clone, + ::ethers::contract::EthCall, + ::ethers::contract::EthDisplay, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + #[ethcall( + name = "transferFromAndCall", + abi = "transferFromAndCall(address,address,uint256)" + )] + pub struct TransferFromAndCallCall { + pub from: ::ethers::core::types::Address, + pub to: ::ethers::core::types::Address, + pub value: ::ethers::core::types::U256, + } ///Container type for all of the contract's call #[derive( Clone, @@ -1077,18 +1024,22 @@ pub mod erc20 { Eq, Hash, )] - pub enum ERC20Calls { + pub enum IERC1363Calls { Allowance(AllowanceCall), Approve(ApproveCall), + ApproveAndCall(ApproveAndCallCall), + ApproveAndCallWithSpenderAndValue(ApproveAndCallWithSpenderAndValueCall), BalanceOf(BalanceOfCall), - Decimals(DecimalsCall), - Name(NameCall), - Symbol(SymbolCall), + SupportsInterface(SupportsInterfaceCall), TotalSupply(TotalSupplyCall), Transfer(TransferCall), + TransferAndCall(TransferAndCallCall), + TransferAndCallWithToAndValue(TransferAndCallWithToAndValueCall), TransferFrom(TransferFromCall), + TransferFromAndCallWithFromAndToAndData(TransferFromAndCallWithFromAndToAndDataCall), + TransferFromAndCall(TransferFromAndCallCall), } - impl ::ethers::core::abi::AbiDecode for ERC20Calls { + impl ::ethers::core::abi::AbiDecode for IERC1363Calls { fn decode( data: impl AsRef<[u8]>, ) -> ::core::result::Result { @@ -1099,17 +1050,25 @@ pub mod erc20 { if let Ok(decoded) = ::decode(data) { return Ok(Self::Approve(decoded)); } - if let Ok(decoded) = ::decode(data) { - return Ok(Self::BalanceOf(decoded)); + if let Ok(decoded) = + ::decode(data) + { + return Ok(Self::ApproveAndCall(decoded)); } - if let Ok(decoded) = ::decode(data) { - return Ok(Self::Decimals(decoded)); + if let Ok(decoded) = + ::decode( + data, + ) + { + return Ok(Self::ApproveAndCallWithSpenderAndValue(decoded)); } - if let Ok(decoded) = ::decode(data) { - return Ok(Self::Name(decoded)); + if let Ok(decoded) = ::decode(data) { + return Ok(Self::BalanceOf(decoded)); } - if let Ok(decoded) = ::decode(data) { - return Ok(Self::Symbol(decoded)); + if let Ok(decoded) = + ::decode(data) + { + return Ok(Self::SupportsInterface(decoded)); } if let Ok(decoded) = ::decode(data) { return Ok(Self::TotalSupply(decoded)); @@ -1117,88 +1076,150 @@ pub mod erc20 { if let Ok(decoded) = ::decode(data) { return Ok(Self::Transfer(decoded)); } + if let Ok(decoded) = + ::decode(data) + { + return Ok(Self::TransferAndCall(decoded)); + } + if let Ok(decoded) = + ::decode(data) + { + return Ok(Self::TransferAndCallWithToAndValue(decoded)); + } if let Ok(decoded) = ::decode(data) { return Ok(Self::TransferFrom(decoded)); } + if let Ok(decoded) = ::decode( + data, + ) { + return Ok(Self::TransferFromAndCallWithFromAndToAndData(decoded)); + } + if let Ok(decoded) = + ::decode(data) + { + return Ok(Self::TransferFromAndCall(decoded)); + } Err(::ethers::core::abi::Error::InvalidData.into()) } } - impl ::ethers::core::abi::AbiEncode for ERC20Calls { + impl ::ethers::core::abi::AbiEncode for IERC1363Calls { fn encode(self) -> Vec { match self { Self::Allowance(element) => ::ethers::core::abi::AbiEncode::encode(element), Self::Approve(element) => ::ethers::core::abi::AbiEncode::encode(element), + Self::ApproveAndCall(element) => ::ethers::core::abi::AbiEncode::encode(element), + Self::ApproveAndCallWithSpenderAndValue(element) => { + ::ethers::core::abi::AbiEncode::encode(element) + } Self::BalanceOf(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::Decimals(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::Name(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::Symbol(element) => ::ethers::core::abi::AbiEncode::encode(element), + Self::SupportsInterface(element) => ::ethers::core::abi::AbiEncode::encode(element), Self::TotalSupply(element) => ::ethers::core::abi::AbiEncode::encode(element), Self::Transfer(element) => ::ethers::core::abi::AbiEncode::encode(element), + Self::TransferAndCall(element) => ::ethers::core::abi::AbiEncode::encode(element), + Self::TransferAndCallWithToAndValue(element) => { + ::ethers::core::abi::AbiEncode::encode(element) + } Self::TransferFrom(element) => ::ethers::core::abi::AbiEncode::encode(element), + Self::TransferFromAndCallWithFromAndToAndData(element) => { + ::ethers::core::abi::AbiEncode::encode(element) + } + Self::TransferFromAndCall(element) => { + ::ethers::core::abi::AbiEncode::encode(element) + } } } } - impl ::core::fmt::Display for ERC20Calls { + impl ::core::fmt::Display for IERC1363Calls { fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { match self { Self::Allowance(element) => ::core::fmt::Display::fmt(element, f), Self::Approve(element) => ::core::fmt::Display::fmt(element, f), + Self::ApproveAndCall(element) => ::core::fmt::Display::fmt(element, f), + Self::ApproveAndCallWithSpenderAndValue(element) => { + ::core::fmt::Display::fmt(element, f) + } Self::BalanceOf(element) => ::core::fmt::Display::fmt(element, f), - Self::Decimals(element) => ::core::fmt::Display::fmt(element, f), - Self::Name(element) => ::core::fmt::Display::fmt(element, f), - Self::Symbol(element) => ::core::fmt::Display::fmt(element, f), + Self::SupportsInterface(element) => ::core::fmt::Display::fmt(element, f), Self::TotalSupply(element) => ::core::fmt::Display::fmt(element, f), Self::Transfer(element) => ::core::fmt::Display::fmt(element, f), + Self::TransferAndCall(element) => ::core::fmt::Display::fmt(element, f), + Self::TransferAndCallWithToAndValue(element) => { + ::core::fmt::Display::fmt(element, f) + } Self::TransferFrom(element) => ::core::fmt::Display::fmt(element, f), + Self::TransferFromAndCallWithFromAndToAndData(element) => { + ::core::fmt::Display::fmt(element, f) + } + Self::TransferFromAndCall(element) => ::core::fmt::Display::fmt(element, f), } } } - impl ::core::convert::From for ERC20Calls { + impl ::core::convert::From for IERC1363Calls { fn from(value: AllowanceCall) -> Self { Self::Allowance(value) } } - impl ::core::convert::From for ERC20Calls { + impl ::core::convert::From for IERC1363Calls { fn from(value: ApproveCall) -> Self { Self::Approve(value) } } - impl ::core::convert::From for ERC20Calls { - fn from(value: BalanceOfCall) -> Self { - Self::BalanceOf(value) + impl ::core::convert::From for IERC1363Calls { + fn from(value: ApproveAndCallCall) -> Self { + Self::ApproveAndCall(value) } } - impl ::core::convert::From for ERC20Calls { - fn from(value: DecimalsCall) -> Self { - Self::Decimals(value) + impl ::core::convert::From for IERC1363Calls { + fn from(value: ApproveAndCallWithSpenderAndValueCall) -> Self { + Self::ApproveAndCallWithSpenderAndValue(value) } } - impl ::core::convert::From for ERC20Calls { - fn from(value: NameCall) -> Self { - Self::Name(value) + impl ::core::convert::From for IERC1363Calls { + fn from(value: BalanceOfCall) -> Self { + Self::BalanceOf(value) } } - impl ::core::convert::From for ERC20Calls { - fn from(value: SymbolCall) -> Self { - Self::Symbol(value) + impl ::core::convert::From for IERC1363Calls { + fn from(value: SupportsInterfaceCall) -> Self { + Self::SupportsInterface(value) } } - impl ::core::convert::From for ERC20Calls { + impl ::core::convert::From for IERC1363Calls { fn from(value: TotalSupplyCall) -> Self { Self::TotalSupply(value) } } - impl ::core::convert::From for ERC20Calls { + impl ::core::convert::From for IERC1363Calls { fn from(value: TransferCall) -> Self { Self::Transfer(value) } } - impl ::core::convert::From for ERC20Calls { + impl ::core::convert::From for IERC1363Calls { + fn from(value: TransferAndCallCall) -> Self { + Self::TransferAndCall(value) + } + } + impl ::core::convert::From for IERC1363Calls { + fn from(value: TransferAndCallWithToAndValueCall) -> Self { + Self::TransferAndCallWithToAndValue(value) + } + } + impl ::core::convert::From for IERC1363Calls { fn from(value: TransferFromCall) -> Self { Self::TransferFrom(value) } } + impl ::core::convert::From for IERC1363Calls { + fn from(value: TransferFromAndCallWithFromAndToAndDataCall) -> Self { + Self::TransferFromAndCallWithFromAndToAndData(value) + } + } + impl ::core::convert::From for IERC1363Calls { + fn from(value: TransferFromAndCallCall) -> Self { + Self::TransferFromAndCall(value) + } + } ///Container type for all return fields from the `allowance` function with signature `allowance(address,address)` and selector `0xdd62ed3e` #[derive( Clone, @@ -1227,7 +1248,7 @@ pub mod erc20 { Hash, )] pub struct ApproveReturn(pub bool); - ///Container type for all return fields from the `balanceOf` function with signature `balanceOf(address)` and selector `0x70a08231` + ///Container type for all return fields from the `approveAndCall` function with signature `approveAndCall(address,uint256)` and selector `0x3177029f` #[derive( Clone, ::ethers::contract::EthAbiType, @@ -1240,8 +1261,8 @@ pub mod erc20 { Eq, Hash, )] - pub struct BalanceOfReturn(pub ::ethers::core::types::U256); - ///Container type for all return fields from the `decimals` function with signature `decimals()` and selector `0x313ce567` + pub struct ApproveAndCallReturn(pub bool); + ///Container type for all return fields from the `approveAndCall` function with signature `approveAndCall(address,uint256,bytes)` and selector `0xcae9ca51` #[derive( Clone, ::ethers::contract::EthAbiType, @@ -1254,8 +1275,8 @@ pub mod erc20 { Eq, Hash, )] - pub struct DecimalsReturn(pub u8); - ///Container type for all return fields from the `name` function with signature `name()` and selector `0x06fdde03` + pub struct ApproveAndCallWithSpenderAndValueReturn(pub bool); + ///Container type for all return fields from the `balanceOf` function with signature `balanceOf(address)` and selector `0x70a08231` #[derive( Clone, ::ethers::contract::EthAbiType, @@ -1268,8 +1289,8 @@ pub mod erc20 { Eq, Hash, )] - pub struct NameReturn(pub ::std::string::String); - ///Container type for all return fields from the `symbol` function with signature `symbol()` and selector `0x95d89b41` + pub struct BalanceOfReturn(pub ::ethers::core::types::U256); + ///Container type for all return fields from the `supportsInterface` function with signature `supportsInterface(bytes4)` and selector `0x01ffc9a7` #[derive( Clone, ::ethers::contract::EthAbiType, @@ -1282,7 +1303,7 @@ pub mod erc20 { Eq, Hash, )] - pub struct SymbolReturn(pub ::std::string::String); + pub struct SupportsInterfaceReturn(pub bool); ///Container type for all return fields from the `totalSupply` function with signature `totalSupply()` and selector `0x18160ddd` #[derive( Clone, @@ -1311,6 +1332,34 @@ pub mod erc20 { Hash, )] pub struct TransferReturn(pub bool); + ///Container type for all return fields from the `transferAndCall` function with signature `transferAndCall(address,uint256)` and selector `0x1296ee62` + #[derive( + Clone, + ::ethers::contract::EthAbiType, + ::ethers::contract::EthAbiCodec, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + pub struct TransferAndCallReturn(pub bool); + ///Container type for all return fields from the `transferAndCall` function with signature `transferAndCall(address,uint256,bytes)` and selector `0x4000aea0` + #[derive( + Clone, + ::ethers::contract::EthAbiType, + ::ethers::contract::EthAbiCodec, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + pub struct TransferAndCallWithToAndValueReturn(pub bool); ///Container type for all return fields from the `transferFrom` function with signature `transferFrom(address,address,uint256)` and selector `0x23b872dd` #[derive( Clone, @@ -1325,4 +1374,32 @@ pub mod erc20 { Hash, )] pub struct TransferFromReturn(pub bool); + ///Container type for all return fields from the `transferFromAndCall` function with signature `transferFromAndCall(address,address,uint256,bytes)` and selector `0xc1d34b89` + #[derive( + Clone, + ::ethers::contract::EthAbiType, + ::ethers::contract::EthAbiCodec, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + pub struct TransferFromAndCallWithFromAndToAndDataReturn(pub bool); + ///Container type for all return fields from the `transferFromAndCall` function with signature `transferFromAndCall(address,address,uint256)` and selector `0xd8fbe994` + #[derive( + Clone, + ::ethers::contract::EthAbiType, + ::ethers::contract::EthAbiCodec, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + pub struct TransferFromAndCallReturn(pub bool); } diff --git a/bindings/src/ierc1967.rs b/bindings/src/ierc1967.rs new file mode 100644 index 0000000..267fc89 --- /dev/null +++ b/bindings/src/ierc1967.rs @@ -0,0 +1,248 @@ +pub use ierc1967::*; +/// 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 ierc1967 { + #[allow(deprecated)] + fn __abi() -> ::ethers::core::abi::Abi { + ::ethers::core::abi::ethabi::Contract { + constructor: ::core::option::Option::None, + functions: ::std::collections::BTreeMap::new(), + events: ::core::convert::From::from([ + ( + ::std::borrow::ToOwned::to_owned("AdminChanged"), + ::std::vec![::ethers::core::abi::ethabi::Event { + name: ::std::borrow::ToOwned::to_owned("AdminChanged"), + inputs: ::std::vec![ + ::ethers::core::abi::ethabi::EventParam { + name: ::std::borrow::ToOwned::to_owned("previousAdmin"), + kind: ::ethers::core::abi::ethabi::ParamType::Address, + indexed: false, + }, + ::ethers::core::abi::ethabi::EventParam { + name: ::std::borrow::ToOwned::to_owned("newAdmin"), + kind: ::ethers::core::abi::ethabi::ParamType::Address, + indexed: false, + }, + ], + anonymous: false, + },], + ), + ( + ::std::borrow::ToOwned::to_owned("BeaconUpgraded"), + ::std::vec![::ethers::core::abi::ethabi::Event { + name: ::std::borrow::ToOwned::to_owned("BeaconUpgraded"), + inputs: ::std::vec![::ethers::core::abi::ethabi::EventParam { + name: ::std::borrow::ToOwned::to_owned("beacon"), + kind: ::ethers::core::abi::ethabi::ParamType::Address, + indexed: true, + },], + anonymous: false, + },], + ), + ( + ::std::borrow::ToOwned::to_owned("Upgraded"), + ::std::vec![::ethers::core::abi::ethabi::Event { + name: ::std::borrow::ToOwned::to_owned("Upgraded"), + inputs: ::std::vec![::ethers::core::abi::ethabi::EventParam { + name: ::std::borrow::ToOwned::to_owned("implementation"), + kind: ::ethers::core::abi::ethabi::ParamType::Address, + indexed: true, + },], + anonymous: false, + },], + ), + ]), + errors: ::std::collections::BTreeMap::new(), + receive: false, + fallback: false, + } + } + ///The parsed JSON ABI of the contract. + pub static IERC1967_ABI: ::ethers::contract::Lazy<::ethers::core::abi::Abi> = + ::ethers::contract::Lazy::new(__abi); + pub struct IERC1967(::ethers::contract::Contract); + impl ::core::clone::Clone for IERC1967 { + fn clone(&self) -> Self { + Self(::core::clone::Clone::clone(&self.0)) + } + } + impl ::core::ops::Deref for IERC1967 { + type Target = ::ethers::contract::Contract; + fn deref(&self) -> &Self::Target { + &self.0 + } + } + impl ::core::ops::DerefMut for IERC1967 { + fn deref_mut(&mut self) -> &mut Self::Target { + &mut self.0 + } + } + impl ::core::fmt::Debug for IERC1967 { + fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { + f.debug_tuple(::core::stringify!(IERC1967)) + .field(&self.address()) + .finish() + } + } + impl IERC1967 { + /// 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(), + IERC1967_ABI.clone(), + client, + )) + } + ///Gets the contract's `AdminChanged` event + pub fn admin_changed_filter( + &self, + ) -> ::ethers::contract::builders::Event<::std::sync::Arc, M, AdminChangedFilter> + { + self.0.event() + } + ///Gets the contract's `BeaconUpgraded` event + pub fn beacon_upgraded_filter( + &self, + ) -> ::ethers::contract::builders::Event<::std::sync::Arc, M, BeaconUpgradedFilter> + { + self.0.event() + } + ///Gets the contract's `Upgraded` event + pub fn upgraded_filter( + &self, + ) -> ::ethers::contract::builders::Event<::std::sync::Arc, M, UpgradedFilter> { + 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, IERC1967Events> { + self.0 + .event_with_filter(::core::default::Default::default()) + } + } + impl From<::ethers::contract::Contract> for IERC1967 { + fn from(contract: ::ethers::contract::Contract) -> Self { + Self::new(contract.address(), contract.client()) + } + } + #[derive( + Clone, + ::ethers::contract::EthEvent, + ::ethers::contract::EthDisplay, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + #[ethevent(name = "AdminChanged", abi = "AdminChanged(address,address)")] + pub struct AdminChangedFilter { + pub previous_admin: ::ethers::core::types::Address, + pub new_admin: ::ethers::core::types::Address, + } + #[derive( + Clone, + ::ethers::contract::EthEvent, + ::ethers::contract::EthDisplay, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + #[ethevent(name = "BeaconUpgraded", abi = "BeaconUpgraded(address)")] + pub struct BeaconUpgradedFilter { + #[ethevent(indexed)] + pub beacon: ::ethers::core::types::Address, + } + #[derive( + Clone, + ::ethers::contract::EthEvent, + ::ethers::contract::EthDisplay, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + #[ethevent(name = "Upgraded", abi = "Upgraded(address)")] + pub struct UpgradedFilter { + #[ethevent(indexed)] + pub implementation: ::ethers::core::types::Address, + } + ///Container type for all of the contract's events + #[derive( + Clone, + ::ethers::contract::EthAbiType, + serde::Serialize, + serde::Deserialize, + Debug, + PartialEq, + Eq, + Hash, + )] + pub enum IERC1967Events { + AdminChangedFilter(AdminChangedFilter), + BeaconUpgradedFilter(BeaconUpgradedFilter), + UpgradedFilter(UpgradedFilter), + } + impl ::ethers::contract::EthLogDecode for IERC1967Events { + fn decode_log( + log: &::ethers::core::abi::RawLog, + ) -> ::core::result::Result { + if let Ok(decoded) = AdminChangedFilter::decode_log(log) { + return Ok(IERC1967Events::AdminChangedFilter(decoded)); + } + if let Ok(decoded) = BeaconUpgradedFilter::decode_log(log) { + return Ok(IERC1967Events::BeaconUpgradedFilter(decoded)); + } + if let Ok(decoded) = UpgradedFilter::decode_log(log) { + return Ok(IERC1967Events::UpgradedFilter(decoded)); + } + Err(::ethers::core::abi::Error::InvalidData) + } + } + impl ::core::fmt::Display for IERC1967Events { + fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { + match self { + Self::AdminChangedFilter(element) => ::core::fmt::Display::fmt(element, f), + Self::BeaconUpgradedFilter(element) => ::core::fmt::Display::fmt(element, f), + Self::UpgradedFilter(element) => ::core::fmt::Display::fmt(element, f), + } + } + } + impl ::core::convert::From for IERC1967Events { + fn from(value: AdminChangedFilter) -> Self { + Self::AdminChangedFilter(value) + } + } + impl ::core::convert::From for IERC1967Events { + fn from(value: BeaconUpgradedFilter) -> Self { + Self::BeaconUpgradedFilter(value) + } + } + impl ::core::convert::From for IERC1967Events { + fn from(value: UpgradedFilter) -> Self { + Self::UpgradedFilter(value) + } + } +} diff --git a/bindings/src/ierc20_errors.rs b/bindings/src/ierc20_errors.rs deleted file mode 100644 index 9817d2d..0000000 --- a/bindings/src/ierc20_errors.rs +++ /dev/null @@ -1,469 +0,0 @@ -pub use ierc20_errors::*; -/// 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 ierc20_errors { - #[allow(deprecated)] - fn __abi() -> ::ethers::core::abi::Abi { - ::ethers::core::abi::ethabi::Contract { - constructor: ::core::option::Option::None, - functions: ::std::collections::BTreeMap::new(), - events: ::std::collections::BTreeMap::new(), - errors: ::core::convert::From::from([ - ( - ::std::borrow::ToOwned::to_owned("ERC20InsufficientAllowance"), - ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("ERC20InsufficientAllowance",), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("spender"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("allowance"), - kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("needed"), - kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256"), - ), - }, - ], - },], - ), - ( - ::std::borrow::ToOwned::to_owned("ERC20InsufficientBalance"), - ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("ERC20InsufficientBalance",), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("sender"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("balance"), - kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("needed"), - kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256"), - ), - }, - ], - },], - ), - ( - ::std::borrow::ToOwned::to_owned("ERC20InvalidApprover"), - ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("ERC20InvalidApprover",), - inputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("approver"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - },], - },], - ), - ( - ::std::borrow::ToOwned::to_owned("ERC20InvalidReceiver"), - ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("ERC20InvalidReceiver",), - inputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("receiver"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - },], - },], - ), - ( - ::std::borrow::ToOwned::to_owned("ERC20InvalidSender"), - ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("ERC20InvalidSender"), - inputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("sender"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - },], - },], - ), - ( - ::std::borrow::ToOwned::to_owned("ERC20InvalidSpender"), - ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("ERC20InvalidSpender",), - inputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("spender"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - },], - },], - ), - ]), - receive: false, - fallback: false, - } - } - ///The parsed JSON ABI of the contract. - pub static IERC20ERRORS_ABI: ::ethers::contract::Lazy<::ethers::core::abi::Abi> = - ::ethers::contract::Lazy::new(__abi); - pub struct IERC20Errors(::ethers::contract::Contract); - impl ::core::clone::Clone for IERC20Errors { - fn clone(&self) -> Self { - Self(::core::clone::Clone::clone(&self.0)) - } - } - impl ::core::ops::Deref for IERC20Errors { - type Target = ::ethers::contract::Contract; - fn deref(&self) -> &Self::Target { - &self.0 - } - } - impl ::core::ops::DerefMut for IERC20Errors { - fn deref_mut(&mut self) -> &mut Self::Target { - &mut self.0 - } - } - impl ::core::fmt::Debug for IERC20Errors { - fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { - f.debug_tuple(::core::stringify!(IERC20Errors)) - .field(&self.address()) - .finish() - } - } - impl IERC20Errors { - /// 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(), - IERC20ERRORS_ABI.clone(), - client, - )) - } - } - impl From<::ethers::contract::Contract> for IERC20Errors { - fn from(contract: ::ethers::contract::Contract) -> Self { - Self::new(contract.address(), contract.client()) - } - } - ///Custom Error type `ERC20InsufficientAllowance` with signature `ERC20InsufficientAllowance(address,uint256,uint256)` and selector `0xfb8f41b2` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[etherror( - name = "ERC20InsufficientAllowance", - abi = "ERC20InsufficientAllowance(address,uint256,uint256)" - )] - pub struct ERC20InsufficientAllowance { - pub spender: ::ethers::core::types::Address, - pub allowance: ::ethers::core::types::U256, - pub needed: ::ethers::core::types::U256, - } - ///Custom Error type `ERC20InsufficientBalance` with signature `ERC20InsufficientBalance(address,uint256,uint256)` and selector `0xe450d38c` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[etherror( - name = "ERC20InsufficientBalance", - abi = "ERC20InsufficientBalance(address,uint256,uint256)" - )] - pub struct ERC20InsufficientBalance { - pub sender: ::ethers::core::types::Address, - pub balance: ::ethers::core::types::U256, - pub needed: ::ethers::core::types::U256, - } - ///Custom Error type `ERC20InvalidApprover` with signature `ERC20InvalidApprover(address)` and selector `0xe602df05` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[etherror(name = "ERC20InvalidApprover", abi = "ERC20InvalidApprover(address)")] - pub struct ERC20InvalidApprover { - pub approver: ::ethers::core::types::Address, - } - ///Custom Error type `ERC20InvalidReceiver` with signature `ERC20InvalidReceiver(address)` and selector `0xec442f05` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[etherror(name = "ERC20InvalidReceiver", abi = "ERC20InvalidReceiver(address)")] - pub struct ERC20InvalidReceiver { - pub receiver: ::ethers::core::types::Address, - } - ///Custom Error type `ERC20InvalidSender` with signature `ERC20InvalidSender(address)` and selector `0x96c6fd1e` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[etherror(name = "ERC20InvalidSender", abi = "ERC20InvalidSender(address)")] - pub struct ERC20InvalidSender { - pub sender: ::ethers::core::types::Address, - } - ///Custom Error type `ERC20InvalidSpender` with signature `ERC20InvalidSpender(address)` and selector `0x94280d62` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[etherror(name = "ERC20InvalidSpender", abi = "ERC20InvalidSpender(address)")] - pub struct ERC20InvalidSpender { - pub spender: ::ethers::core::types::Address, - } - ///Container type for all of the contract's custom errors - #[derive( - Clone, - ::ethers::contract::EthAbiType, - serde::Serialize, - serde::Deserialize, - Debug, - PartialEq, - Eq, - Hash, - )] - pub enum IERC20ErrorsErrors { - ERC20InsufficientAllowance(ERC20InsufficientAllowance), - ERC20InsufficientBalance(ERC20InsufficientBalance), - ERC20InvalidApprover(ERC20InvalidApprover), - ERC20InvalidReceiver(ERC20InvalidReceiver), - ERC20InvalidSender(ERC20InvalidSender), - ERC20InvalidSpender(ERC20InvalidSpender), - /// The standard solidity revert string, with selector - /// Error(string) -- 0x08c379a0 - RevertString(::std::string::String), - } - impl ::ethers::core::abi::AbiDecode for IERC20ErrorsErrors { - fn decode( - data: impl AsRef<[u8]>, - ) -> ::core::result::Result { - let data = data.as_ref(); - if let Ok(decoded) = - <::std::string::String as ::ethers::core::abi::AbiDecode>::decode(data) - { - return Ok(Self::RevertString(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::ERC20InsufficientAllowance(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::ERC20InsufficientBalance(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::ERC20InvalidApprover(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::ERC20InvalidReceiver(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::ERC20InvalidSender(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::ERC20InvalidSpender(decoded)); - } - Err(::ethers::core::abi::Error::InvalidData.into()) - } - } - impl ::ethers::core::abi::AbiEncode for IERC20ErrorsErrors { - fn encode(self) -> ::std::vec::Vec { - match self { - Self::ERC20InsufficientAllowance(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::ERC20InsufficientBalance(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::ERC20InvalidApprover(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::ERC20InvalidReceiver(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::ERC20InvalidSender(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::ERC20InvalidSpender(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::RevertString(s) => ::ethers::core::abi::AbiEncode::encode(s), - } - } - } - impl ::ethers::contract::ContractRevert for IERC20ErrorsErrors { - fn valid_selector(selector: [u8; 4]) -> bool { - match selector { - [0x08, 0xc3, 0x79, 0xa0] => true, - _ if selector - == ::selector() => - { - true - } - _ if selector - == ::selector() => - { - true - } - _ if selector - == ::selector() => - { - true - } - _ if selector - == ::selector() => - { - true - } - _ if selector - == ::selector() => - { - true - } - _ if selector - == ::selector() => - { - true - } - _ => false, - } - } - } - impl ::core::fmt::Display for IERC20ErrorsErrors { - fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { - match self { - Self::ERC20InsufficientAllowance(element) => ::core::fmt::Display::fmt(element, f), - Self::ERC20InsufficientBalance(element) => ::core::fmt::Display::fmt(element, f), - Self::ERC20InvalidApprover(element) => ::core::fmt::Display::fmt(element, f), - Self::ERC20InvalidReceiver(element) => ::core::fmt::Display::fmt(element, f), - Self::ERC20InvalidSender(element) => ::core::fmt::Display::fmt(element, f), - Self::ERC20InvalidSpender(element) => ::core::fmt::Display::fmt(element, f), - Self::RevertString(s) => ::core::fmt::Display::fmt(s, f), - } - } - } - impl ::core::convert::From<::std::string::String> for IERC20ErrorsErrors { - fn from(value: String) -> Self { - Self::RevertString(value) - } - } - impl ::core::convert::From for IERC20ErrorsErrors { - fn from(value: ERC20InsufficientAllowance) -> Self { - Self::ERC20InsufficientAllowance(value) - } - } - impl ::core::convert::From for IERC20ErrorsErrors { - fn from(value: ERC20InsufficientBalance) -> Self { - Self::ERC20InsufficientBalance(value) - } - } - impl ::core::convert::From for IERC20ErrorsErrors { - fn from(value: ERC20InvalidApprover) -> Self { - Self::ERC20InvalidApprover(value) - } - } - impl ::core::convert::From for IERC20ErrorsErrors { - fn from(value: ERC20InvalidReceiver) -> Self { - Self::ERC20InvalidReceiver(value) - } - } - impl ::core::convert::From for IERC20ErrorsErrors { - fn from(value: ERC20InvalidSender) -> Self { - Self::ERC20InvalidSender(value) - } - } - impl ::core::convert::From for IERC20ErrorsErrors { - fn from(value: ERC20InvalidSpender) -> Self { - Self::ERC20InvalidSpender(value) - } - } -} diff --git a/bindings/src/ierc20_metadata.rs b/bindings/src/ierc20_metadata.rs deleted file mode 100644 index 52e3914..0000000 --- a/bindings/src/ierc20_metadata.rs +++ /dev/null @@ -1,932 +0,0 @@ -pub use ierc20_metadata::*; -/// 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 ierc20_metadata { - #[allow(deprecated)] - fn __abi() -> ::ethers::core::abi::Abi { - ::ethers::core::abi::ethabi::Contract { - constructor: ::core::option::Option::None, - functions: ::core::convert::From::from([ - ( - ::std::borrow::ToOwned::to_owned("allowance"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("allowance"), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("owner"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("spender"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - }, - ], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("approve"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("approve"), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("spender"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("value"), - kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256"), - ), - }, - ], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Bool, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bool"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("balanceOf"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("balanceOf"), - inputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("account"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - },], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("decimals"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("decimals"), - inputs: ::std::vec![], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Uint(8usize), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint8"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("name"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("name"), - inputs: ::std::vec![], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::String, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("string"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("symbol"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("symbol"), - inputs: ::std::vec![], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::String, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("string"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("totalSupply"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("totalSupply"), - inputs: ::std::vec![], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("transfer"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("transfer"), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("to"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("value"), - kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256"), - ), - }, - ], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Bool, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bool"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("transferFrom"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("transferFrom"), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("from"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("to"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("value"), - kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256"), - ), - }, - ], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Bool, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bool"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable, - },], - ), - ]), - events: ::core::convert::From::from([ - ( - ::std::borrow::ToOwned::to_owned("Approval"), - ::std::vec![::ethers::core::abi::ethabi::Event { - name: ::std::borrow::ToOwned::to_owned("Approval"), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::EventParam { - name: ::std::borrow::ToOwned::to_owned("owner"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - indexed: true, - }, - ::ethers::core::abi::ethabi::EventParam { - name: ::std::borrow::ToOwned::to_owned("spender"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - indexed: true, - }, - ::ethers::core::abi::ethabi::EventParam { - name: ::std::borrow::ToOwned::to_owned("value"), - kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), - indexed: false, - }, - ], - anonymous: false, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("Transfer"), - ::std::vec![::ethers::core::abi::ethabi::Event { - name: ::std::borrow::ToOwned::to_owned("Transfer"), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::EventParam { - name: ::std::borrow::ToOwned::to_owned("from"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - indexed: true, - }, - ::ethers::core::abi::ethabi::EventParam { - name: ::std::borrow::ToOwned::to_owned("to"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - indexed: true, - }, - ::ethers::core::abi::ethabi::EventParam { - name: ::std::borrow::ToOwned::to_owned("value"), - kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), - indexed: false, - }, - ], - anonymous: false, - },], - ), - ]), - errors: ::std::collections::BTreeMap::new(), - receive: false, - fallback: false, - } - } - ///The parsed JSON ABI of the contract. - pub static IERC20METADATA_ABI: ::ethers::contract::Lazy<::ethers::core::abi::Abi> = - ::ethers::contract::Lazy::new(__abi); - pub struct IERC20Metadata(::ethers::contract::Contract); - impl ::core::clone::Clone for IERC20Metadata { - fn clone(&self) -> Self { - Self(::core::clone::Clone::clone(&self.0)) - } - } - impl ::core::ops::Deref for IERC20Metadata { - type Target = ::ethers::contract::Contract; - fn deref(&self) -> &Self::Target { - &self.0 - } - } - impl ::core::ops::DerefMut for IERC20Metadata { - fn deref_mut(&mut self) -> &mut Self::Target { - &mut self.0 - } - } - impl ::core::fmt::Debug for IERC20Metadata { - fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { - f.debug_tuple(::core::stringify!(IERC20Metadata)) - .field(&self.address()) - .finish() - } - } - impl IERC20Metadata { - /// 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(), - IERC20METADATA_ABI.clone(), - client, - )) - } - ///Calls the contract's `allowance` (0xdd62ed3e) function - pub fn allowance( - &self, - owner: ::ethers::core::types::Address, - spender: ::ethers::core::types::Address, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([221, 98, 237, 62], (owner, spender)) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `approve` (0x095ea7b3) function - pub fn approve( - &self, - spender: ::ethers::core::types::Address, - value: ::ethers::core::types::U256, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([9, 94, 167, 179], (spender, value)) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `balanceOf` (0x70a08231) function - pub fn balance_of( - &self, - account: ::ethers::core::types::Address, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([112, 160, 130, 49], account) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `decimals` (0x313ce567) function - pub fn decimals(&self) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([49, 60, 229, 103], ()) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `name` (0x06fdde03) function - pub fn name(&self) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([6, 253, 222, 3], ()) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `symbol` (0x95d89b41) function - pub fn symbol( - &self, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([149, 216, 155, 65], ()) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `totalSupply` (0x18160ddd) function - pub fn total_supply( - &self, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([24, 22, 13, 221], ()) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `transfer` (0xa9059cbb) function - pub fn transfer( - &self, - to: ::ethers::core::types::Address, - value: ::ethers::core::types::U256, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([169, 5, 156, 187], (to, value)) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `transferFrom` (0x23b872dd) function - pub fn transfer_from( - &self, - from: ::ethers::core::types::Address, - to: ::ethers::core::types::Address, - value: ::ethers::core::types::U256, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([35, 184, 114, 221], (from, to, value)) - .expect("method not found (this should never happen)") - } - ///Gets the contract's `Approval` event - pub fn approval_filter( - &self, - ) -> ::ethers::contract::builders::Event<::std::sync::Arc, M, ApprovalFilter> { - self.0.event() - } - ///Gets the contract's `Transfer` event - pub fn transfer_filter( - &self, - ) -> ::ethers::contract::builders::Event<::std::sync::Arc, M, TransferFilter> { - 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, IERC20MetadataEvents> - { - self.0 - .event_with_filter(::core::default::Default::default()) - } - } - impl From<::ethers::contract::Contract> - for IERC20Metadata - { - fn from(contract: ::ethers::contract::Contract) -> Self { - Self::new(contract.address(), contract.client()) - } - } - #[derive( - Clone, - ::ethers::contract::EthEvent, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethevent(name = "Approval", abi = "Approval(address,address,uint256)")] - pub struct ApprovalFilter { - #[ethevent(indexed)] - pub owner: ::ethers::core::types::Address, - #[ethevent(indexed)] - pub spender: ::ethers::core::types::Address, - pub value: ::ethers::core::types::U256, - } - #[derive( - Clone, - ::ethers::contract::EthEvent, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethevent(name = "Transfer", abi = "Transfer(address,address,uint256)")] - pub struct TransferFilter { - #[ethevent(indexed)] - pub from: ::ethers::core::types::Address, - #[ethevent(indexed)] - pub to: ::ethers::core::types::Address, - pub value: ::ethers::core::types::U256, - } - ///Container type for all of the contract's events - #[derive( - Clone, - ::ethers::contract::EthAbiType, - serde::Serialize, - serde::Deserialize, - Debug, - PartialEq, - Eq, - Hash, - )] - pub enum IERC20MetadataEvents { - ApprovalFilter(ApprovalFilter), - TransferFilter(TransferFilter), - } - impl ::ethers::contract::EthLogDecode for IERC20MetadataEvents { - fn decode_log( - log: &::ethers::core::abi::RawLog, - ) -> ::core::result::Result { - if let Ok(decoded) = ApprovalFilter::decode_log(log) { - return Ok(IERC20MetadataEvents::ApprovalFilter(decoded)); - } - if let Ok(decoded) = TransferFilter::decode_log(log) { - return Ok(IERC20MetadataEvents::TransferFilter(decoded)); - } - Err(::ethers::core::abi::Error::InvalidData) - } - } - impl ::core::fmt::Display for IERC20MetadataEvents { - fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { - match self { - Self::ApprovalFilter(element) => ::core::fmt::Display::fmt(element, f), - Self::TransferFilter(element) => ::core::fmt::Display::fmt(element, f), - } - } - } - impl ::core::convert::From for IERC20MetadataEvents { - fn from(value: ApprovalFilter) -> Self { - Self::ApprovalFilter(value) - } - } - impl ::core::convert::From for IERC20MetadataEvents { - fn from(value: TransferFilter) -> Self { - Self::TransferFilter(value) - } - } - ///Container type for all input parameters for the `allowance` function with signature `allowance(address,address)` and selector `0xdd62ed3e` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "allowance", abi = "allowance(address,address)")] - pub struct AllowanceCall { - pub owner: ::ethers::core::types::Address, - pub spender: ::ethers::core::types::Address, - } - ///Container type for all input parameters for the `approve` function with signature `approve(address,uint256)` and selector `0x095ea7b3` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "approve", abi = "approve(address,uint256)")] - pub struct ApproveCall { - pub spender: ::ethers::core::types::Address, - pub value: ::ethers::core::types::U256, - } - ///Container type for all input parameters for the `balanceOf` function with signature `balanceOf(address)` and selector `0x70a08231` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "balanceOf", abi = "balanceOf(address)")] - pub struct BalanceOfCall { - pub account: ::ethers::core::types::Address, - } - ///Container type for all input parameters for the `decimals` function with signature `decimals()` and selector `0x313ce567` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "decimals", abi = "decimals()")] - pub struct DecimalsCall; - ///Container type for all input parameters for the `name` function with signature `name()` and selector `0x06fdde03` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "name", abi = "name()")] - pub struct NameCall; - ///Container type for all input parameters for the `symbol` function with signature `symbol()` and selector `0x95d89b41` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "symbol", abi = "symbol()")] - pub struct SymbolCall; - ///Container type for all input parameters for the `totalSupply` function with signature `totalSupply()` and selector `0x18160ddd` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "totalSupply", abi = "totalSupply()")] - pub struct TotalSupplyCall; - ///Container type for all input parameters for the `transfer` function with signature `transfer(address,uint256)` and selector `0xa9059cbb` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "transfer", abi = "transfer(address,uint256)")] - pub struct TransferCall { - pub to: ::ethers::core::types::Address, - pub value: ::ethers::core::types::U256, - } - ///Container type for all input parameters for the `transferFrom` function with signature `transferFrom(address,address,uint256)` and selector `0x23b872dd` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "transferFrom", abi = "transferFrom(address,address,uint256)")] - pub struct TransferFromCall { - pub from: ::ethers::core::types::Address, - pub to: ::ethers::core::types::Address, - pub value: ::ethers::core::types::U256, - } - ///Container type for all of the contract's call - #[derive( - Clone, - ::ethers::contract::EthAbiType, - serde::Serialize, - serde::Deserialize, - Debug, - PartialEq, - Eq, - Hash, - )] - pub enum IERC20MetadataCalls { - Allowance(AllowanceCall), - Approve(ApproveCall), - BalanceOf(BalanceOfCall), - Decimals(DecimalsCall), - Name(NameCall), - Symbol(SymbolCall), - TotalSupply(TotalSupplyCall), - Transfer(TransferCall), - TransferFrom(TransferFromCall), - } - impl ::ethers::core::abi::AbiDecode for IERC20MetadataCalls { - fn decode( - data: impl AsRef<[u8]>, - ) -> ::core::result::Result { - let data = data.as_ref(); - if let Ok(decoded) = ::decode(data) { - return Ok(Self::Allowance(decoded)); - } - if let Ok(decoded) = ::decode(data) { - return Ok(Self::Approve(decoded)); - } - if let Ok(decoded) = ::decode(data) { - return Ok(Self::BalanceOf(decoded)); - } - if let Ok(decoded) = ::decode(data) { - return Ok(Self::Decimals(decoded)); - } - if let Ok(decoded) = ::decode(data) { - return Ok(Self::Name(decoded)); - } - if let Ok(decoded) = ::decode(data) { - return Ok(Self::Symbol(decoded)); - } - if let Ok(decoded) = ::decode(data) { - return Ok(Self::TotalSupply(decoded)); - } - if let Ok(decoded) = ::decode(data) { - return Ok(Self::Transfer(decoded)); - } - if let Ok(decoded) = ::decode(data) - { - return Ok(Self::TransferFrom(decoded)); - } - Err(::ethers::core::abi::Error::InvalidData.into()) - } - } - impl ::ethers::core::abi::AbiEncode for IERC20MetadataCalls { - fn encode(self) -> Vec { - match self { - Self::Allowance(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::Approve(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::BalanceOf(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::Decimals(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::Name(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::Symbol(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::TotalSupply(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::Transfer(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::TransferFrom(element) => ::ethers::core::abi::AbiEncode::encode(element), - } - } - } - impl ::core::fmt::Display for IERC20MetadataCalls { - fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { - match self { - Self::Allowance(element) => ::core::fmt::Display::fmt(element, f), - Self::Approve(element) => ::core::fmt::Display::fmt(element, f), - Self::BalanceOf(element) => ::core::fmt::Display::fmt(element, f), - Self::Decimals(element) => ::core::fmt::Display::fmt(element, f), - Self::Name(element) => ::core::fmt::Display::fmt(element, f), - Self::Symbol(element) => ::core::fmt::Display::fmt(element, f), - Self::TotalSupply(element) => ::core::fmt::Display::fmt(element, f), - Self::Transfer(element) => ::core::fmt::Display::fmt(element, f), - Self::TransferFrom(element) => ::core::fmt::Display::fmt(element, f), - } - } - } - impl ::core::convert::From for IERC20MetadataCalls { - fn from(value: AllowanceCall) -> Self { - Self::Allowance(value) - } - } - impl ::core::convert::From for IERC20MetadataCalls { - fn from(value: ApproveCall) -> Self { - Self::Approve(value) - } - } - impl ::core::convert::From for IERC20MetadataCalls { - fn from(value: BalanceOfCall) -> Self { - Self::BalanceOf(value) - } - } - impl ::core::convert::From for IERC20MetadataCalls { - fn from(value: DecimalsCall) -> Self { - Self::Decimals(value) - } - } - impl ::core::convert::From for IERC20MetadataCalls { - fn from(value: NameCall) -> Self { - Self::Name(value) - } - } - impl ::core::convert::From for IERC20MetadataCalls { - fn from(value: SymbolCall) -> Self { - Self::Symbol(value) - } - } - impl ::core::convert::From for IERC20MetadataCalls { - fn from(value: TotalSupplyCall) -> Self { - Self::TotalSupply(value) - } - } - impl ::core::convert::From for IERC20MetadataCalls { - fn from(value: TransferCall) -> Self { - Self::Transfer(value) - } - } - impl ::core::convert::From for IERC20MetadataCalls { - fn from(value: TransferFromCall) -> Self { - Self::TransferFrom(value) - } - } - ///Container type for all return fields from the `allowance` function with signature `allowance(address,address)` and selector `0xdd62ed3e` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct AllowanceReturn(pub ::ethers::core::types::U256); - ///Container type for all return fields from the `approve` function with signature `approve(address,uint256)` and selector `0x095ea7b3` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct ApproveReturn(pub bool); - ///Container type for all return fields from the `balanceOf` function with signature `balanceOf(address)` and selector `0x70a08231` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct BalanceOfReturn(pub ::ethers::core::types::U256); - ///Container type for all return fields from the `decimals` function with signature `decimals()` and selector `0x313ce567` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct DecimalsReturn(pub u8); - ///Container type for all return fields from the `name` function with signature `name()` and selector `0x06fdde03` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct NameReturn(pub ::std::string::String); - ///Container type for all return fields from the `symbol` function with signature `symbol()` and selector `0x95d89b41` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct SymbolReturn(pub ::std::string::String); - ///Container type for all return fields from the `totalSupply` function with signature `totalSupply()` and selector `0x18160ddd` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct TotalSupplyReturn(pub ::ethers::core::types::U256); - ///Container type for all return fields from the `transfer` function with signature `transfer(address,uint256)` and selector `0xa9059cbb` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct TransferReturn(pub bool); - ///Container type for all return fields from the `transferFrom` function with signature `transferFrom(address,address,uint256)` and selector `0x23b872dd` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct TransferFromReturn(pub bool); -} diff --git a/bindings/src/ierc20_permit.rs b/bindings/src/ierc20_permit.rs deleted file mode 100644 index d10ab84..0000000 --- a/bindings/src/ierc20_permit.rs +++ /dev/null @@ -1,356 +0,0 @@ -pub use ierc20_permit::*; -/// 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 ierc20_permit { - #[allow(deprecated)] - fn __abi() -> ::ethers::core::abi::Abi { - ::ethers::core::abi::ethabi::Contract { - constructor: ::core::option::Option::None, - functions: ::core::convert::From::from([ - ( - ::std::borrow::ToOwned::to_owned("DOMAIN_SEPARATOR"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("DOMAIN_SEPARATOR"), - inputs: ::std::vec![], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::FixedBytes(32usize,), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes32"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("nonces"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("nonces"), - inputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("owner"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - },], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("permit"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("permit"), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("owner"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("spender"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("value"), - kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("deadline"), - kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("v"), - kind: ::ethers::core::abi::ethabi::ParamType::Uint(8usize), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint8"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("r"), - kind: ::ethers::core::abi::ethabi::ParamType::FixedBytes(32usize,), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes32"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("s"), - kind: ::ethers::core::abi::ethabi::ParamType::FixedBytes(32usize,), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes32"), - ), - }, - ], - outputs: ::std::vec![], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable, - },], - ), - ]), - events: ::std::collections::BTreeMap::new(), - errors: ::std::collections::BTreeMap::new(), - receive: false, - fallback: false, - } - } - ///The parsed JSON ABI of the contract. - pub static IERC20PERMIT_ABI: ::ethers::contract::Lazy<::ethers::core::abi::Abi> = - ::ethers::contract::Lazy::new(__abi); - pub struct IERC20Permit(::ethers::contract::Contract); - impl ::core::clone::Clone for IERC20Permit { - fn clone(&self) -> Self { - Self(::core::clone::Clone::clone(&self.0)) - } - } - impl ::core::ops::Deref for IERC20Permit { - type Target = ::ethers::contract::Contract; - fn deref(&self) -> &Self::Target { - &self.0 - } - } - impl ::core::ops::DerefMut for IERC20Permit { - fn deref_mut(&mut self) -> &mut Self::Target { - &mut self.0 - } - } - impl ::core::fmt::Debug for IERC20Permit { - fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { - f.debug_tuple(::core::stringify!(IERC20Permit)) - .field(&self.address()) - .finish() - } - } - impl IERC20Permit { - /// 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(), - IERC20PERMIT_ABI.clone(), - client, - )) - } - ///Calls the contract's `DOMAIN_SEPARATOR` (0x3644e515) function - pub fn domain_separator(&self) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([54, 68, 229, 21], ()) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `nonces` (0x7ecebe00) function - pub fn nonces( - &self, - owner: ::ethers::core::types::Address, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([126, 206, 190, 0], owner) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `permit` (0xd505accf) function - pub fn permit( - &self, - owner: ::ethers::core::types::Address, - spender: ::ethers::core::types::Address, - value: ::ethers::core::types::U256, - deadline: ::ethers::core::types::U256, - v: u8, - r: [u8; 32], - s: [u8; 32], - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash( - [213, 5, 172, 207], - (owner, spender, value, deadline, v, r, s), - ) - .expect("method not found (this should never happen)") - } - } - impl From<::ethers::contract::Contract> for IERC20Permit { - fn from(contract: ::ethers::contract::Contract) -> Self { - Self::new(contract.address(), contract.client()) - } - } - ///Container type for all input parameters for the `DOMAIN_SEPARATOR` function with signature `DOMAIN_SEPARATOR()` and selector `0x3644e515` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "DOMAIN_SEPARATOR", abi = "DOMAIN_SEPARATOR()")] - pub struct DomainSeparatorCall; - ///Container type for all input parameters for the `nonces` function with signature `nonces(address)` and selector `0x7ecebe00` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "nonces", abi = "nonces(address)")] - pub struct NoncesCall { - pub owner: ::ethers::core::types::Address, - } - ///Container type for all input parameters for the `permit` function with signature `permit(address,address,uint256,uint256,uint8,bytes32,bytes32)` and selector `0xd505accf` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall( - name = "permit", - abi = "permit(address,address,uint256,uint256,uint8,bytes32,bytes32)" - )] - pub struct PermitCall { - pub owner: ::ethers::core::types::Address, - pub spender: ::ethers::core::types::Address, - pub value: ::ethers::core::types::U256, - pub deadline: ::ethers::core::types::U256, - pub v: u8, - pub r: [u8; 32], - pub s: [u8; 32], - } - ///Container type for all of the contract's call - #[derive( - Clone, - ::ethers::contract::EthAbiType, - serde::Serialize, - serde::Deserialize, - Debug, - PartialEq, - Eq, - Hash, - )] - pub enum IERC20PermitCalls { - DomainSeparator(DomainSeparatorCall), - Nonces(NoncesCall), - Permit(PermitCall), - } - impl ::ethers::core::abi::AbiDecode for IERC20PermitCalls { - fn decode( - data: impl AsRef<[u8]>, - ) -> ::core::result::Result { - let data = data.as_ref(); - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::DomainSeparator(decoded)); - } - if let Ok(decoded) = ::decode(data) { - return Ok(Self::Nonces(decoded)); - } - if let Ok(decoded) = ::decode(data) { - return Ok(Self::Permit(decoded)); - } - Err(::ethers::core::abi::Error::InvalidData.into()) - } - } - impl ::ethers::core::abi::AbiEncode for IERC20PermitCalls { - fn encode(self) -> Vec { - match self { - Self::DomainSeparator(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::Nonces(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::Permit(element) => ::ethers::core::abi::AbiEncode::encode(element), - } - } - } - impl ::core::fmt::Display for IERC20PermitCalls { - fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { - match self { - Self::DomainSeparator(element) => ::core::fmt::Display::fmt(element, f), - Self::Nonces(element) => ::core::fmt::Display::fmt(element, f), - Self::Permit(element) => ::core::fmt::Display::fmt(element, f), - } - } - } - impl ::core::convert::From for IERC20PermitCalls { - fn from(value: DomainSeparatorCall) -> Self { - Self::DomainSeparator(value) - } - } - impl ::core::convert::From for IERC20PermitCalls { - fn from(value: NoncesCall) -> Self { - Self::Nonces(value) - } - } - impl ::core::convert::From for IERC20PermitCalls { - fn from(value: PermitCall) -> Self { - Self::Permit(value) - } - } - ///Container type for all return fields from the `DOMAIN_SEPARATOR` function with signature `DOMAIN_SEPARATOR()` and selector `0x3644e515` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct DomainSeparatorReturn(pub [u8; 32]); - ///Container type for all return fields from the `nonces` function with signature `nonces(address)` and selector `0x7ecebe00` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct NoncesReturn(pub ::ethers::core::types::U256); -} diff --git a/bindings/src/ierc721_errors.rs b/bindings/src/ierc721_errors.rs deleted file mode 100644 index c6916d3..0000000 --- a/bindings/src/ierc721_errors.rs +++ /dev/null @@ -1,566 +0,0 @@ -pub use ierc721_errors::*; -/// 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 ierc721_errors { - #[allow(deprecated)] - fn __abi() -> ::ethers::core::abi::Abi { - ::ethers::core::abi::ethabi::Contract { - constructor: ::core::option::Option::None, - functions: ::std::collections::BTreeMap::new(), - events: ::std::collections::BTreeMap::new(), - errors: ::core::convert::From::from([ - ( - ::std::borrow::ToOwned::to_owned("ERC721IncorrectOwner"), - ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("ERC721IncorrectOwner",), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("sender"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("tokenId"), - kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("owner"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - }, - ], - },], - ), - ( - ::std::borrow::ToOwned::to_owned("ERC721InsufficientApproval"), - ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("ERC721InsufficientApproval",), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("operator"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("tokenId"), - kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256"), - ), - }, - ], - },], - ), - ( - ::std::borrow::ToOwned::to_owned("ERC721InvalidApprover"), - ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("ERC721InvalidApprover",), - inputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("approver"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - },], - },], - ), - ( - ::std::borrow::ToOwned::to_owned("ERC721InvalidOperator"), - ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("ERC721InvalidOperator",), - inputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("operator"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - },], - },], - ), - ( - ::std::borrow::ToOwned::to_owned("ERC721InvalidOwner"), - ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("ERC721InvalidOwner"), - inputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("owner"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - },], - },], - ), - ( - ::std::borrow::ToOwned::to_owned("ERC721InvalidReceiver"), - ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("ERC721InvalidReceiver",), - inputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("receiver"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - },], - },], - ), - ( - ::std::borrow::ToOwned::to_owned("ERC721InvalidSender"), - ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("ERC721InvalidSender",), - inputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("sender"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - },], - },], - ), - ( - ::std::borrow::ToOwned::to_owned("ERC721NonexistentToken"), - ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("ERC721NonexistentToken",), - inputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("tokenId"), - kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256"), - ), - },], - },], - ), - ]), - receive: false, - fallback: false, - } - } - ///The parsed JSON ABI of the contract. - pub static IERC721ERRORS_ABI: ::ethers::contract::Lazy<::ethers::core::abi::Abi> = - ::ethers::contract::Lazy::new(__abi); - pub struct IERC721Errors(::ethers::contract::Contract); - impl ::core::clone::Clone for IERC721Errors { - fn clone(&self) -> Self { - Self(::core::clone::Clone::clone(&self.0)) - } - } - impl ::core::ops::Deref for IERC721Errors { - type Target = ::ethers::contract::Contract; - fn deref(&self) -> &Self::Target { - &self.0 - } - } - impl ::core::ops::DerefMut for IERC721Errors { - fn deref_mut(&mut self) -> &mut Self::Target { - &mut self.0 - } - } - impl ::core::fmt::Debug for IERC721Errors { - fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { - f.debug_tuple(::core::stringify!(IERC721Errors)) - .field(&self.address()) - .finish() - } - } - impl IERC721Errors { - /// 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(), - IERC721ERRORS_ABI.clone(), - client, - )) - } - } - impl From<::ethers::contract::Contract> - for IERC721Errors - { - fn from(contract: ::ethers::contract::Contract) -> Self { - Self::new(contract.address(), contract.client()) - } - } - ///Custom Error type `ERC721IncorrectOwner` with signature `ERC721IncorrectOwner(address,uint256,address)` and selector `0x64283d7b` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[etherror( - name = "ERC721IncorrectOwner", - abi = "ERC721IncorrectOwner(address,uint256,address)" - )] - pub struct ERC721IncorrectOwner { - pub sender: ::ethers::core::types::Address, - pub token_id: ::ethers::core::types::U256, - pub owner: ::ethers::core::types::Address, - } - ///Custom Error type `ERC721InsufficientApproval` with signature `ERC721InsufficientApproval(address,uint256)` and selector `0x177e802f` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[etherror( - name = "ERC721InsufficientApproval", - abi = "ERC721InsufficientApproval(address,uint256)" - )] - pub struct ERC721InsufficientApproval { - pub operator: ::ethers::core::types::Address, - pub token_id: ::ethers::core::types::U256, - } - ///Custom Error type `ERC721InvalidApprover` with signature `ERC721InvalidApprover(address)` and selector `0xa9fbf51f` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[etherror(name = "ERC721InvalidApprover", abi = "ERC721InvalidApprover(address)")] - pub struct ERC721InvalidApprover { - pub approver: ::ethers::core::types::Address, - } - ///Custom Error type `ERC721InvalidOperator` with signature `ERC721InvalidOperator(address)` and selector `0x5b08ba18` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[etherror(name = "ERC721InvalidOperator", abi = "ERC721InvalidOperator(address)")] - pub struct ERC721InvalidOperator { - pub operator: ::ethers::core::types::Address, - } - ///Custom Error type `ERC721InvalidOwner` with signature `ERC721InvalidOwner(address)` and selector `0x89c62b64` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[etherror(name = "ERC721InvalidOwner", abi = "ERC721InvalidOwner(address)")] - pub struct ERC721InvalidOwner { - pub owner: ::ethers::core::types::Address, - } - ///Custom Error type `ERC721InvalidReceiver` with signature `ERC721InvalidReceiver(address)` and selector `0x64a0ae92` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[etherror(name = "ERC721InvalidReceiver", abi = "ERC721InvalidReceiver(address)")] - pub struct ERC721InvalidReceiver { - pub receiver: ::ethers::core::types::Address, - } - ///Custom Error type `ERC721InvalidSender` with signature `ERC721InvalidSender(address)` and selector `0x73c6ac6e` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[etherror(name = "ERC721InvalidSender", abi = "ERC721InvalidSender(address)")] - pub struct ERC721InvalidSender { - pub sender: ::ethers::core::types::Address, - } - ///Custom Error type `ERC721NonexistentToken` with signature `ERC721NonexistentToken(uint256)` and selector `0x7e273289` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[etherror( - name = "ERC721NonexistentToken", - abi = "ERC721NonexistentToken(uint256)" - )] - pub struct ERC721NonexistentToken { - pub token_id: ::ethers::core::types::U256, - } - ///Container type for all of the contract's custom errors - #[derive( - Clone, - ::ethers::contract::EthAbiType, - serde::Serialize, - serde::Deserialize, - Debug, - PartialEq, - Eq, - Hash, - )] - pub enum IERC721ErrorsErrors { - ERC721IncorrectOwner(ERC721IncorrectOwner), - ERC721InsufficientApproval(ERC721InsufficientApproval), - ERC721InvalidApprover(ERC721InvalidApprover), - ERC721InvalidOperator(ERC721InvalidOperator), - ERC721InvalidOwner(ERC721InvalidOwner), - ERC721InvalidReceiver(ERC721InvalidReceiver), - ERC721InvalidSender(ERC721InvalidSender), - ERC721NonexistentToken(ERC721NonexistentToken), - /// The standard solidity revert string, with selector - /// Error(string) -- 0x08c379a0 - RevertString(::std::string::String), - } - impl ::ethers::core::abi::AbiDecode for IERC721ErrorsErrors { - fn decode( - data: impl AsRef<[u8]>, - ) -> ::core::result::Result { - let data = data.as_ref(); - if let Ok(decoded) = - <::std::string::String as ::ethers::core::abi::AbiDecode>::decode(data) - { - return Ok(Self::RevertString(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::ERC721IncorrectOwner(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::ERC721InsufficientApproval(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::ERC721InvalidApprover(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::ERC721InvalidOperator(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::ERC721InvalidOwner(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::ERC721InvalidReceiver(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::ERC721InvalidSender(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::ERC721NonexistentToken(decoded)); - } - Err(::ethers::core::abi::Error::InvalidData.into()) - } - } - impl ::ethers::core::abi::AbiEncode for IERC721ErrorsErrors { - fn encode(self) -> ::std::vec::Vec { - match self { - Self::ERC721IncorrectOwner(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::ERC721InsufficientApproval(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::ERC721InvalidApprover(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::ERC721InvalidOperator(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::ERC721InvalidOwner(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::ERC721InvalidReceiver(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::ERC721InvalidSender(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::ERC721NonexistentToken(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::RevertString(s) => ::ethers::core::abi::AbiEncode::encode(s), - } - } - } - impl ::ethers::contract::ContractRevert for IERC721ErrorsErrors { - fn valid_selector(selector: [u8; 4]) -> bool { - match selector { - [0x08, 0xc3, 0x79, 0xa0] => true, - _ if selector - == ::selector() => - { - true - } - _ if selector - == ::selector() => - { - true - } - _ if selector - == ::selector() => - { - true - } - _ if selector - == ::selector() => - { - true - } - _ if selector - == ::selector() => - { - true - } - _ if selector - == ::selector() => - { - true - } - _ if selector - == ::selector() => - { - true - } - _ if selector - == ::selector() => - { - true - } - _ => false, - } - } - } - impl ::core::fmt::Display for IERC721ErrorsErrors { - fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { - match self { - Self::ERC721IncorrectOwner(element) => ::core::fmt::Display::fmt(element, f), - Self::ERC721InsufficientApproval(element) => ::core::fmt::Display::fmt(element, f), - Self::ERC721InvalidApprover(element) => ::core::fmt::Display::fmt(element, f), - Self::ERC721InvalidOperator(element) => ::core::fmt::Display::fmt(element, f), - Self::ERC721InvalidOwner(element) => ::core::fmt::Display::fmt(element, f), - Self::ERC721InvalidReceiver(element) => ::core::fmt::Display::fmt(element, f), - Self::ERC721InvalidSender(element) => ::core::fmt::Display::fmt(element, f), - Self::ERC721NonexistentToken(element) => ::core::fmt::Display::fmt(element, f), - Self::RevertString(s) => ::core::fmt::Display::fmt(s, f), - } - } - } - impl ::core::convert::From<::std::string::String> for IERC721ErrorsErrors { - fn from(value: String) -> Self { - Self::RevertString(value) - } - } - impl ::core::convert::From for IERC721ErrorsErrors { - fn from(value: ERC721IncorrectOwner) -> Self { - Self::ERC721IncorrectOwner(value) - } - } - impl ::core::convert::From for IERC721ErrorsErrors { - fn from(value: ERC721InsufficientApproval) -> Self { - Self::ERC721InsufficientApproval(value) - } - } - impl ::core::convert::From for IERC721ErrorsErrors { - fn from(value: ERC721InvalidApprover) -> Self { - Self::ERC721InvalidApprover(value) - } - } - impl ::core::convert::From for IERC721ErrorsErrors { - fn from(value: ERC721InvalidOperator) -> Self { - Self::ERC721InvalidOperator(value) - } - } - impl ::core::convert::From for IERC721ErrorsErrors { - fn from(value: ERC721InvalidOwner) -> Self { - Self::ERC721InvalidOwner(value) - } - } - impl ::core::convert::From for IERC721ErrorsErrors { - fn from(value: ERC721InvalidReceiver) -> Self { - Self::ERC721InvalidReceiver(value) - } - } - impl ::core::convert::From for IERC721ErrorsErrors { - fn from(value: ERC721InvalidSender) -> Self { - Self::ERC721InvalidSender(value) - } - } - impl ::core::convert::From for IERC721ErrorsErrors { - fn from(value: ERC721NonexistentToken) -> Self { - Self::ERC721NonexistentToken(value) - } - } -} diff --git a/bindings/src/il2_staking.rs b/bindings/src/il2_staking.rs new file mode 100644 index 0000000..70a9661 --- /dev/null +++ b/bindings/src/il2_staking.rs @@ -0,0 +1,298 @@ +pub use il2_staking::*; +/// 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 il2_staking { + #[allow(deprecated)] + fn __abi() -> ::ethers::core::abi::Abi { + ::ethers::core::abi::ethabi::Contract { + constructor: ::core::option::Option::None, + functions: ::core::convert::From::from([ + ( + ::std::borrow::ToOwned::to_owned("intendToReduceStake"), + ::std::vec![::ethers::core::abi::ethabi::Function { + name: ::std::borrow::ToOwned::to_owned("intendToReduceStake",), + inputs: ::std::vec![::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("stakeToReduce"), + kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("uint256"), + ), + },], + outputs: ::std::vec![], + constant: ::core::option::Option::None, + state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable, + },], + ), + ( + ::std::borrow::ToOwned::to_owned("stake"), + ::std::vec![::ethers::core::abi::ethabi::Function { + name: ::std::borrow::ToOwned::to_owned("stake"), + inputs: ::std::vec![ + ::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("generatorAddress"), + kind: ::ethers::core::abi::ethabi::ParamType::Address, + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("address"), + ), + }, + ::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("amount"), + kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("uint256"), + ), + }, + ], + outputs: ::std::vec![::ethers::core::abi::ethabi::Param { + name: ::std::string::String::new(), + kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("uint256"), + ), + },], + constant: ::core::option::Option::None, + state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable, + },], + ), + ( + ::std::borrow::ToOwned::to_owned("unstake"), + ::std::vec![::ethers::core::abi::ethabi::Function { + name: ::std::borrow::ToOwned::to_owned("unstake"), + inputs: ::std::vec![::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("receiver"), + kind: ::ethers::core::abi::ethabi::ParamType::Address, + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("address"), + ), + },], + outputs: ::std::vec![], + constant: ::core::option::Option::None, + state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable, + },], + ), + ]), + events: ::std::collections::BTreeMap::new(), + errors: ::std::collections::BTreeMap::new(), + receive: false, + fallback: false, + } + } + ///The parsed JSON ABI of the contract. + pub static IL2STAKING_ABI: ::ethers::contract::Lazy<::ethers::core::abi::Abi> = + ::ethers::contract::Lazy::new(__abi); + pub struct IL2Staking(::ethers::contract::Contract); + impl ::core::clone::Clone for IL2Staking { + fn clone(&self) -> Self { + Self(::core::clone::Clone::clone(&self.0)) + } + } + impl ::core::ops::Deref for IL2Staking { + type Target = ::ethers::contract::Contract; + fn deref(&self) -> &Self::Target { + &self.0 + } + } + impl ::core::ops::DerefMut for IL2Staking { + fn deref_mut(&mut self) -> &mut Self::Target { + &mut self.0 + } + } + impl ::core::fmt::Debug for IL2Staking { + fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { + f.debug_tuple(::core::stringify!(IL2Staking)) + .field(&self.address()) + .finish() + } + } + impl IL2Staking { + /// 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(), + IL2STAKING_ABI.clone(), + client, + )) + } + ///Calls the contract's `intendToReduceStake` (0xe9e934a0) function + pub fn intend_to_reduce_stake( + &self, + stake_to_reduce: ::ethers::core::types::U256, + ) -> ::ethers::contract::builders::ContractCall { + self.0 + .method_hash([233, 233, 52, 160], stake_to_reduce) + .expect("method not found (this should never happen)") + } + ///Calls the contract's `stake` (0xadc9772e) function + pub fn stake( + &self, + generator_address: ::ethers::core::types::Address, + amount: ::ethers::core::types::U256, + ) -> ::ethers::contract::builders::ContractCall { + self.0 + .method_hash([173, 201, 119, 46], (generator_address, amount)) + .expect("method not found (this should never happen)") + } + ///Calls the contract's `unstake` (0xf2888dbb) function + pub fn unstake( + &self, + receiver: ::ethers::core::types::Address, + ) -> ::ethers::contract::builders::ContractCall { + self.0 + .method_hash([242, 136, 141, 187], receiver) + .expect("method not found (this should never happen)") + } + } + impl From<::ethers::contract::Contract> for IL2Staking { + fn from(contract: ::ethers::contract::Contract) -> Self { + Self::new(contract.address(), contract.client()) + } + } + ///Container type for all input parameters for the `intendToReduceStake` function with signature `intendToReduceStake(uint256)` and selector `0xe9e934a0` + #[derive( + Clone, + ::ethers::contract::EthCall, + ::ethers::contract::EthDisplay, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + #[ethcall(name = "intendToReduceStake", abi = "intendToReduceStake(uint256)")] + pub struct IntendToReduceStakeCall { + pub stake_to_reduce: ::ethers::core::types::U256, + } + ///Container type for all input parameters for the `stake` function with signature `stake(address,uint256)` and selector `0xadc9772e` + #[derive( + Clone, + ::ethers::contract::EthCall, + ::ethers::contract::EthDisplay, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + #[ethcall(name = "stake", abi = "stake(address,uint256)")] + pub struct StakeCall { + pub generator_address: ::ethers::core::types::Address, + pub amount: ::ethers::core::types::U256, + } + ///Container type for all input parameters for the `unstake` function with signature `unstake(address)` and selector `0xf2888dbb` + #[derive( + Clone, + ::ethers::contract::EthCall, + ::ethers::contract::EthDisplay, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + #[ethcall(name = "unstake", abi = "unstake(address)")] + pub struct UnstakeCall { + pub receiver: ::ethers::core::types::Address, + } + ///Container type for all of the contract's call + #[derive( + Clone, + ::ethers::contract::EthAbiType, + serde::Serialize, + serde::Deserialize, + Debug, + PartialEq, + Eq, + Hash, + )] + pub enum IL2StakingCalls { + IntendToReduceStake(IntendToReduceStakeCall), + Stake(StakeCall), + Unstake(UnstakeCall), + } + impl ::ethers::core::abi::AbiDecode for IL2StakingCalls { + fn decode( + data: impl AsRef<[u8]>, + ) -> ::core::result::Result { + let data = data.as_ref(); + if let Ok(decoded) = + ::decode(data) + { + return Ok(Self::IntendToReduceStake(decoded)); + } + if let Ok(decoded) = ::decode(data) { + return Ok(Self::Stake(decoded)); + } + if let Ok(decoded) = ::decode(data) { + return Ok(Self::Unstake(decoded)); + } + Err(::ethers::core::abi::Error::InvalidData.into()) + } + } + impl ::ethers::core::abi::AbiEncode for IL2StakingCalls { + fn encode(self) -> Vec { + match self { + Self::IntendToReduceStake(element) => { + ::ethers::core::abi::AbiEncode::encode(element) + } + Self::Stake(element) => ::ethers::core::abi::AbiEncode::encode(element), + Self::Unstake(element) => ::ethers::core::abi::AbiEncode::encode(element), + } + } + } + impl ::core::fmt::Display for IL2StakingCalls { + fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { + match self { + Self::IntendToReduceStake(element) => ::core::fmt::Display::fmt(element, f), + Self::Stake(element) => ::core::fmt::Display::fmt(element, f), + Self::Unstake(element) => ::core::fmt::Display::fmt(element, f), + } + } + } + impl ::core::convert::From for IL2StakingCalls { + fn from(value: IntendToReduceStakeCall) -> Self { + Self::IntendToReduceStake(value) + } + } + impl ::core::convert::From for IL2StakingCalls { + fn from(value: StakeCall) -> Self { + Self::Stake(value) + } + } + impl ::core::convert::From for IL2StakingCalls { + fn from(value: UnstakeCall) -> Self { + Self::Unstake(value) + } + } + ///Container type for all return fields from the `stake` function with signature `stake(address,uint256)` and selector `0xadc9772e` + #[derive( + Clone, + ::ethers::contract::EthAbiType, + ::ethers::contract::EthAbiCodec, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + pub struct StakeReturn(pub ::ethers::core::types::U256); +} diff --git a/bindings/src/input_and_proof_format_registry.rs b/bindings/src/input_and_proof_format_registry.rs deleted file mode 100644 index 041f58f..0000000 --- a/bindings/src/input_and_proof_format_registry.rs +++ /dev/null @@ -1,681 +0,0 @@ -pub use input_and_proof_format_registry::*; -/// 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 input_and_proof_format_registry { - #[allow(deprecated)] - fn __abi() -> ::ethers::core::abi::Abi { - ::ethers::core::abi::ethabi::Contract { - constructor: ::core::option::Option::Some(::ethers::core::abi::ethabi::Constructor { - inputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("_admin"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some(::std::borrow::ToOwned::to_owned( - "address" - ),), - },], - }), - functions: ::core::convert::From::from([ - ( - ::std::borrow::ToOwned::to_owned("admin"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("admin"), - inputs: ::std::vec![], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("inputArrayLength"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("inputArrayLength"), - inputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256"), - ), - },], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("inputs"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("inputs"), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256"), - ), - }, - ], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::String, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("string"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("proofArrayLength"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("proofArrayLength"), - inputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256"), - ), - },], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("proofs"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("proofs"), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256"), - ), - }, - ], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::String, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("string"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("setInputFormat"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("setInputFormat"), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("marketId"), - kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("inputsFormat"), - kind: ::ethers::core::abi::ethabi::ParamType::Array( - ::std::boxed::Box::new( - ::ethers::core::abi::ethabi::ParamType::String, - ), - ), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("string[]"), - ), - }, - ], - outputs: ::std::vec![], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("setProofFormat"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("setProofFormat"), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("marketId"), - kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("proofFormat"), - kind: ::ethers::core::abi::ethabi::ParamType::Array( - ::std::boxed::Box::new( - ::ethers::core::abi::ethabi::ParamType::String, - ), - ), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("string[]"), - ), - }, - ], - outputs: ::std::vec![], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable, - },], - ), - ]), - events: ::std::collections::BTreeMap::new(), - errors: ::std::collections::BTreeMap::new(), - receive: false, - fallback: false, - } - } - ///The parsed JSON ABI of the contract. - pub static INPUTANDPROOFFORMATREGISTRY_ABI: ::ethers::contract::Lazy<::ethers::core::abi::Abi> = - ::ethers::contract::Lazy::new(__abi); - #[rustfmt::skip] - const __BYTECODE: &[u8] = b"`\xA0`@R4\x80\x15a\0\x10W`\0\x80\xFD[P`@Qa\x08P8\x03\x80a\x08P\x839\x81\x01`@\x81\x90Ra\0/\x91a\0@V[`\x01`\x01`\xA0\x1B\x03\x16`\x80Ra\0pV[`\0` \x82\x84\x03\x12\x15a\0RW`\0\x80\xFD[\x81Q`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a\0iW`\0\x80\xFD[\x93\x92PPPV[`\x80Qa\x07\xB7a\0\x99`\09`\0\x81\x81a\x015\x01R\x81\x81a\x023\x01Ra\x02\xF0\x01Ra\x07\xB7`\0\xF3\xFE`\x80`@R4\x80\x15a\0\x10W`\0\x80\xFD[P`\x046\x10a\0}W`\x005`\xE0\x1C\x80c\xC0\xA5\x94q\x11a\0[W\x80c\xC0\xA5\x94q\x14a\0\xF5W\x80c\xCC\xC1^I\x14a\x01\nW\x80c\xE8j\xA1\x90\x14a\x01\x1DW\x80c\xF8Q\xA4@\x14a\x010W`\0\x80\xFD[\x80c\x0C\xE4\x91L\x14a\0\x82W\x80c^\xF7yI\x14a\0\xB5W\x80c\xBE\xD7\x8C\xA3\x14a\0\xD5W[`\0\x80\xFD[a\0\xA2a\0\x906`\x04a\x04DV[`\x02` R`\0\x90\x81R`@\x90 T\x81V[`@Q\x90\x81R` \x01[`@Q\x80\x91\x03\x90\xF3[a\0\xC8a\0\xC36`\x04a\x04]V[a\x01oV[`@Qa\0\xAC\x91\x90a\x04\x7FV[a\0\xA2a\0\xE36`\x04a\x04DV[`\x03` R`\0\x90\x81R`@\x90 T\x81V[a\x01\x08a\x01\x036`\x04a\x05\x14V[a\x02(V[\0[a\0\xC8a\x01\x186`\x04a\x04]V[a\x02\xC9V[a\x01\x08a\x01+6`\x04a\x05\x14V[a\x02\xE5V[a\x01W\x7F\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\x81V[`@Q`\x01`\x01`\xA0\x1B\x03\x90\x91\x16\x81R` \x01a\0\xACV[`\x01` R\x81`\0R`@`\0 \x81\x81T\x81\x10a\x01\x8BW`\0\x80\xFD[\x90`\0R` `\0 \x01`\0\x91P\x91PP\x80Ta\x01\xA7\x90a\x068V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\x01\xD3\x90a\x068V[\x80\x15a\x02 W\x80`\x1F\x10a\x01\xF5Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\x02 V[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\x02\x03W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81V[3`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x14a\x02\x96W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x0E`$\x82\x01Rm7\xB76<\x900\xB26\xB4\xB7\x101\xB0\xB7`\x91\x1B`D\x82\x01R`d\x01[`@Q\x80\x91\x03\x90\xFD[`\0\x82\x81R`\x01` \x90\x81R`@\x90\x91 \x82Qa\x02\xB5\x92\x84\x01\x90a\x03\x7FV[PQ`\0\x91\x82R`\x03` R`@\x90\x91 UV[`\0` R\x81`\0R`@`\0 \x81\x81T\x81\x10a\x01\x8BW`\0\x80\xFD[3`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x14a\x03NW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x0E`$\x82\x01Rm7\xB76<\x900\xB26\xB4\xB7\x101\xB0\xB7`\x91\x1B`D\x82\x01R`d\x01a\x02\x8DV[`\0\x82\x81R` \x81\x81R`@\x90\x91 \x82Qa\x03k\x92\x84\x01\x90a\x03\x7FV[PQ`\0\x91\x82R`\x02` R`@\x90\x91 UV[\x82\x80T\x82\x82U\x90`\0R` `\0 \x90\x81\x01\x92\x82\x15a\x03\xC5W\x91` \x02\x82\x01[\x82\x81\x11\x15a\x03\xC5W\x82Q\x82\x90a\x03\xB5\x90\x82a\x06\xC1V[P\x91` \x01\x91\x90`\x01\x01\x90a\x03\x9FV[Pa\x03\xD1\x92\x91Pa\x03\xD5V[P\x90V[\x80\x82\x11\x15a\x03\xD1W`\0a\x03\xE9\x82\x82a\x03\xF2V[P`\x01\x01a\x03\xD5V[P\x80Ta\x03\xFE\x90a\x068V[`\0\x82U\x80`\x1F\x10a\x04\x0EWPPV[`\x1F\x01` \x90\x04\x90`\0R` `\0 \x90\x81\x01\x90a\x04,\x91\x90a\x04/V[PV[[\x80\x82\x11\x15a\x03\xD1W`\0\x81U`\x01\x01a\x040V[`\0` \x82\x84\x03\x12\x15a\x04VW`\0\x80\xFD[P5\x91\x90PV[`\0\x80`@\x83\x85\x03\x12\x15a\x04pW`\0\x80\xFD[PP\x805\x92` \x90\x91\x015\x91PV[`\0` \x80\x83R\x83Q\x80\x82\x85\x01R`\0[\x81\x81\x10\x15a\x04\xACW\x85\x81\x01\x83\x01Q\x85\x82\x01`@\x01R\x82\x01a\x04\x90V[P`\0`@\x82\x86\x01\x01R`@`\x1F\x19`\x1F\x83\x01\x16\x85\x01\x01\x92PPP\x92\x91PPV[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`@Q`\x1F\x82\x01`\x1F\x19\x16\x81\x01g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x82\x82\x10\x17\x15a\x05\x0CWa\x05\x0Ca\x04\xCDV[`@R\x91\x90PV[`\0\x80`@\x80\x84\x86\x03\x12\x15a\x05(W`\0\x80\xFD[\x835\x92P` \x80\x85\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x11\x15a\x05HW`\0\x80\xFD[\x81\x87\x01\x91P`\x1F\x88\x81\x84\x01\x12a\x05]W`\0\x80\xFD[\x825\x82\x81\x11\x15a\x05oWa\x05oa\x04\xCDV[\x80`\x05\x1Ba\x05~\x86\x82\x01a\x04\xE3V[\x91\x82R\x84\x81\x01\x86\x01\x91\x86\x81\x01\x90\x8C\x84\x11\x15a\x05\x98W`\0\x80\xFD[\x87\x87\x01\x92P[\x83\x83\x10\x15a\x06%W\x825\x86\x81\x11\x15a\x05\xB6W`\0\x80\x81\xFD[\x87\x01`?\x81\x01\x8E\x13a\x05\xC8W`\0\x80\x81\xFD[\x88\x81\x015\x87\x81\x11\x15a\x05\xDCWa\x05\xDCa\x04\xCDV[a\x05\xED\x81\x88\x01`\x1F\x19\x16\x8B\x01a\x04\xE3V[\x81\x81R\x8F\x8C\x83\x85\x01\x01\x11\x15a\x06\x02W`\0\x80\x81\xFD[\x81\x8C\x84\x01\x8C\x83\x017`\0\x91\x81\x01\x8B\x01\x91\x90\x91R\x83RP\x91\x87\x01\x91\x90\x87\x01\x90a\x05\x9EV[\x80\x99PPPPPPPPPP\x92P\x92\x90PV[`\x01\x81\x81\x1C\x90\x82\x16\x80a\x06LW`\x7F\x82\x16\x91P[` \x82\x10\x81\x03a\x06lWcNH{q`\xE0\x1B`\0R`\"`\x04R`$`\0\xFD[P\x91\x90PV[`\x1F\x82\x11\x15a\x06\xBCW`\0\x81\x81R` \x81 `\x1F\x85\x01`\x05\x1C\x81\x01` \x86\x10\x15a\x06\x99WP\x80[`\x1F\x85\x01`\x05\x1C\x82\x01\x91P[\x81\x81\x10\x15a\x06\xB8W\x82\x81U`\x01\x01a\x06\xA5V[PPP[PPPV[\x81Qg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x06\xDBWa\x06\xDBa\x04\xCDV[a\x06\xEF\x81a\x06\xE9\x84Ta\x068V[\x84a\x06rV[` \x80`\x1F\x83\x11`\x01\x81\x14a\x07$W`\0\x84\x15a\x07\x0CWP\x85\x83\x01Q[`\0\x19`\x03\x86\x90\x1B\x1C\x19\x16`\x01\x85\x90\x1B\x17\x85Ua\x06\xB8V[`\0\x85\x81R` \x81 `\x1F\x19\x86\x16\x91[\x82\x81\x10\x15a\x07SW\x88\x86\x01Q\x82U\x94\x84\x01\x94`\x01\x90\x91\x01\x90\x84\x01a\x074V[P\x85\x82\x10\x15a\x07qW\x87\x85\x01Q`\0\x19`\x03\x88\x90\x1B`\xF8\x16\x1C\x19\x16\x81U[PPPPP`\x01\x90\x81\x1B\x01\x90UPV\xFE\xA2dipfsX\"\x12 \x01O\x89\xD1\x19\x80\xE9\x9B\xB0\x90J7\0\xAB@\xD5\x0F\xCDo\xF2f\\\x1Co\xED2v\x99B\x9A\x9C\x0FdsolcC\0\x08\x14\x003"; - /// The bytecode of the contract. - pub static INPUTANDPROOFFORMATREGISTRY_BYTECODE: ::ethers::core::types::Bytes = - ::ethers::core::types::Bytes::from_static(__BYTECODE); - #[rustfmt::skip] - const __DEPLOYED_BYTECODE: &[u8] = b"`\x80`@R4\x80\x15a\0\x10W`\0\x80\xFD[P`\x046\x10a\0}W`\x005`\xE0\x1C\x80c\xC0\xA5\x94q\x11a\0[W\x80c\xC0\xA5\x94q\x14a\0\xF5W\x80c\xCC\xC1^I\x14a\x01\nW\x80c\xE8j\xA1\x90\x14a\x01\x1DW\x80c\xF8Q\xA4@\x14a\x010W`\0\x80\xFD[\x80c\x0C\xE4\x91L\x14a\0\x82W\x80c^\xF7yI\x14a\0\xB5W\x80c\xBE\xD7\x8C\xA3\x14a\0\xD5W[`\0\x80\xFD[a\0\xA2a\0\x906`\x04a\x04DV[`\x02` R`\0\x90\x81R`@\x90 T\x81V[`@Q\x90\x81R` \x01[`@Q\x80\x91\x03\x90\xF3[a\0\xC8a\0\xC36`\x04a\x04]V[a\x01oV[`@Qa\0\xAC\x91\x90a\x04\x7FV[a\0\xA2a\0\xE36`\x04a\x04DV[`\x03` R`\0\x90\x81R`@\x90 T\x81V[a\x01\x08a\x01\x036`\x04a\x05\x14V[a\x02(V[\0[a\0\xC8a\x01\x186`\x04a\x04]V[a\x02\xC9V[a\x01\x08a\x01+6`\x04a\x05\x14V[a\x02\xE5V[a\x01W\x7F\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\x81V[`@Q`\x01`\x01`\xA0\x1B\x03\x90\x91\x16\x81R` \x01a\0\xACV[`\x01` R\x81`\0R`@`\0 \x81\x81T\x81\x10a\x01\x8BW`\0\x80\xFD[\x90`\0R` `\0 \x01`\0\x91P\x91PP\x80Ta\x01\xA7\x90a\x068V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\x01\xD3\x90a\x068V[\x80\x15a\x02 W\x80`\x1F\x10a\x01\xF5Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\x02 V[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\x02\x03W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81V[3`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x14a\x02\x96W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x0E`$\x82\x01Rm7\xB76<\x900\xB26\xB4\xB7\x101\xB0\xB7`\x91\x1B`D\x82\x01R`d\x01[`@Q\x80\x91\x03\x90\xFD[`\0\x82\x81R`\x01` \x90\x81R`@\x90\x91 \x82Qa\x02\xB5\x92\x84\x01\x90a\x03\x7FV[PQ`\0\x91\x82R`\x03` R`@\x90\x91 UV[`\0` R\x81`\0R`@`\0 \x81\x81T\x81\x10a\x01\x8BW`\0\x80\xFD[3`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x14a\x03NW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x0E`$\x82\x01Rm7\xB76<\x900\xB26\xB4\xB7\x101\xB0\xB7`\x91\x1B`D\x82\x01R`d\x01a\x02\x8DV[`\0\x82\x81R` \x81\x81R`@\x90\x91 \x82Qa\x03k\x92\x84\x01\x90a\x03\x7FV[PQ`\0\x91\x82R`\x02` R`@\x90\x91 UV[\x82\x80T\x82\x82U\x90`\0R` `\0 \x90\x81\x01\x92\x82\x15a\x03\xC5W\x91` \x02\x82\x01[\x82\x81\x11\x15a\x03\xC5W\x82Q\x82\x90a\x03\xB5\x90\x82a\x06\xC1V[P\x91` \x01\x91\x90`\x01\x01\x90a\x03\x9FV[Pa\x03\xD1\x92\x91Pa\x03\xD5V[P\x90V[\x80\x82\x11\x15a\x03\xD1W`\0a\x03\xE9\x82\x82a\x03\xF2V[P`\x01\x01a\x03\xD5V[P\x80Ta\x03\xFE\x90a\x068V[`\0\x82U\x80`\x1F\x10a\x04\x0EWPPV[`\x1F\x01` \x90\x04\x90`\0R` `\0 \x90\x81\x01\x90a\x04,\x91\x90a\x04/V[PV[[\x80\x82\x11\x15a\x03\xD1W`\0\x81U`\x01\x01a\x040V[`\0` \x82\x84\x03\x12\x15a\x04VW`\0\x80\xFD[P5\x91\x90PV[`\0\x80`@\x83\x85\x03\x12\x15a\x04pW`\0\x80\xFD[PP\x805\x92` \x90\x91\x015\x91PV[`\0` \x80\x83R\x83Q\x80\x82\x85\x01R`\0[\x81\x81\x10\x15a\x04\xACW\x85\x81\x01\x83\x01Q\x85\x82\x01`@\x01R\x82\x01a\x04\x90V[P`\0`@\x82\x86\x01\x01R`@`\x1F\x19`\x1F\x83\x01\x16\x85\x01\x01\x92PPP\x92\x91PPV[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`@Q`\x1F\x82\x01`\x1F\x19\x16\x81\x01g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x82\x82\x10\x17\x15a\x05\x0CWa\x05\x0Ca\x04\xCDV[`@R\x91\x90PV[`\0\x80`@\x80\x84\x86\x03\x12\x15a\x05(W`\0\x80\xFD[\x835\x92P` \x80\x85\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x11\x15a\x05HW`\0\x80\xFD[\x81\x87\x01\x91P`\x1F\x88\x81\x84\x01\x12a\x05]W`\0\x80\xFD[\x825\x82\x81\x11\x15a\x05oWa\x05oa\x04\xCDV[\x80`\x05\x1Ba\x05~\x86\x82\x01a\x04\xE3V[\x91\x82R\x84\x81\x01\x86\x01\x91\x86\x81\x01\x90\x8C\x84\x11\x15a\x05\x98W`\0\x80\xFD[\x87\x87\x01\x92P[\x83\x83\x10\x15a\x06%W\x825\x86\x81\x11\x15a\x05\xB6W`\0\x80\x81\xFD[\x87\x01`?\x81\x01\x8E\x13a\x05\xC8W`\0\x80\x81\xFD[\x88\x81\x015\x87\x81\x11\x15a\x05\xDCWa\x05\xDCa\x04\xCDV[a\x05\xED\x81\x88\x01`\x1F\x19\x16\x8B\x01a\x04\xE3V[\x81\x81R\x8F\x8C\x83\x85\x01\x01\x11\x15a\x06\x02W`\0\x80\x81\xFD[\x81\x8C\x84\x01\x8C\x83\x017`\0\x91\x81\x01\x8B\x01\x91\x90\x91R\x83RP\x91\x87\x01\x91\x90\x87\x01\x90a\x05\x9EV[\x80\x99PPPPPPPPPP\x92P\x92\x90PV[`\x01\x81\x81\x1C\x90\x82\x16\x80a\x06LW`\x7F\x82\x16\x91P[` \x82\x10\x81\x03a\x06lWcNH{q`\xE0\x1B`\0R`\"`\x04R`$`\0\xFD[P\x91\x90PV[`\x1F\x82\x11\x15a\x06\xBCW`\0\x81\x81R` \x81 `\x1F\x85\x01`\x05\x1C\x81\x01` \x86\x10\x15a\x06\x99WP\x80[`\x1F\x85\x01`\x05\x1C\x82\x01\x91P[\x81\x81\x10\x15a\x06\xB8W\x82\x81U`\x01\x01a\x06\xA5V[PPP[PPPV[\x81Qg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x06\xDBWa\x06\xDBa\x04\xCDV[a\x06\xEF\x81a\x06\xE9\x84Ta\x068V[\x84a\x06rV[` \x80`\x1F\x83\x11`\x01\x81\x14a\x07$W`\0\x84\x15a\x07\x0CWP\x85\x83\x01Q[`\0\x19`\x03\x86\x90\x1B\x1C\x19\x16`\x01\x85\x90\x1B\x17\x85Ua\x06\xB8V[`\0\x85\x81R` \x81 `\x1F\x19\x86\x16\x91[\x82\x81\x10\x15a\x07SW\x88\x86\x01Q\x82U\x94\x84\x01\x94`\x01\x90\x91\x01\x90\x84\x01a\x074V[P\x85\x82\x10\x15a\x07qW\x87\x85\x01Q`\0\x19`\x03\x88\x90\x1B`\xF8\x16\x1C\x19\x16\x81U[PPPPP`\x01\x90\x81\x1B\x01\x90UPV\xFE\xA2dipfsX\"\x12 \x01O\x89\xD1\x19\x80\xE9\x9B\xB0\x90J7\0\xAB@\xD5\x0F\xCDo\xF2f\\\x1Co\xED2v\x99B\x9A\x9C\x0FdsolcC\0\x08\x14\x003"; - /// The deployed bytecode of the contract. - pub static INPUTANDPROOFFORMATREGISTRY_DEPLOYED_BYTECODE: ::ethers::core::types::Bytes = - ::ethers::core::types::Bytes::from_static(__DEPLOYED_BYTECODE); - pub struct InputAndProofFormatRegistry(::ethers::contract::Contract); - impl ::core::clone::Clone for InputAndProofFormatRegistry { - fn clone(&self) -> Self { - Self(::core::clone::Clone::clone(&self.0)) - } - } - impl ::core::ops::Deref for InputAndProofFormatRegistry { - type Target = ::ethers::contract::Contract; - fn deref(&self) -> &Self::Target { - &self.0 - } - } - impl ::core::ops::DerefMut for InputAndProofFormatRegistry { - fn deref_mut(&mut self) -> &mut Self::Target { - &mut self.0 - } - } - impl ::core::fmt::Debug for InputAndProofFormatRegistry { - fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { - f.debug_tuple(::core::stringify!(InputAndProofFormatRegistry)) - .field(&self.address()) - .finish() - } - } - impl InputAndProofFormatRegistry { - /// 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(), - INPUTANDPROOFFORMATREGISTRY_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( - INPUTANDPROOFFORMATREGISTRY_ABI.clone(), - INPUTANDPROOFFORMATREGISTRY_BYTECODE.clone().into(), - client, - ); - let deployer = factory.deploy(constructor_args)?; - let deployer = ::ethers::contract::ContractDeployer::new(deployer); - Ok(deployer) - } - ///Calls the contract's `admin` (0xf851a440) function - pub fn admin( - &self, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([248, 81, 164, 64], ()) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `inputArrayLength` (0x0ce4914c) function - pub fn input_array_length( - &self, - p0: ::ethers::core::types::U256, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([12, 228, 145, 76], p0) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `inputs` (0xccc15e49) function - pub fn inputs( - &self, - p0: ::ethers::core::types::U256, - p1: ::ethers::core::types::U256, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([204, 193, 94, 73], (p0, p1)) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `proofArrayLength` (0xbed78ca3) function - pub fn proof_array_length( - &self, - p0: ::ethers::core::types::U256, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([190, 215, 140, 163], p0) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `proofs` (0x5ef77949) function - pub fn proofs( - &self, - p0: ::ethers::core::types::U256, - p1: ::ethers::core::types::U256, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([94, 247, 121, 73], (p0, p1)) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `setInputFormat` (0xe86aa190) function - pub fn set_input_format( - &self, - market_id: ::ethers::core::types::U256, - inputs_format: ::std::vec::Vec<::std::string::String>, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([232, 106, 161, 144], (market_id, inputs_format)) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `setProofFormat` (0xc0a59471) function - pub fn set_proof_format( - &self, - market_id: ::ethers::core::types::U256, - proof_format: ::std::vec::Vec<::std::string::String>, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([192, 165, 148, 113], (market_id, proof_format)) - .expect("method not found (this should never happen)") - } - } - impl From<::ethers::contract::Contract> - for InputAndProofFormatRegistry - { - fn from(contract: ::ethers::contract::Contract) -> Self { - Self::new(contract.address(), contract.client()) - } - } - ///Container type for all input parameters for the `admin` function with signature `admin()` and selector `0xf851a440` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "admin", abi = "admin()")] - pub struct AdminCall; - ///Container type for all input parameters for the `inputArrayLength` function with signature `inputArrayLength(uint256)` and selector `0x0ce4914c` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "inputArrayLength", abi = "inputArrayLength(uint256)")] - pub struct InputArrayLengthCall(pub ::ethers::core::types::U256); - ///Container type for all input parameters for the `inputs` function with signature `inputs(uint256,uint256)` and selector `0xccc15e49` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "inputs", abi = "inputs(uint256,uint256)")] - pub struct InputsCall( - pub ::ethers::core::types::U256, - pub ::ethers::core::types::U256, - ); - ///Container type for all input parameters for the `proofArrayLength` function with signature `proofArrayLength(uint256)` and selector `0xbed78ca3` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "proofArrayLength", abi = "proofArrayLength(uint256)")] - pub struct ProofArrayLengthCall(pub ::ethers::core::types::U256); - ///Container type for all input parameters for the `proofs` function with signature `proofs(uint256,uint256)` and selector `0x5ef77949` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "proofs", abi = "proofs(uint256,uint256)")] - pub struct ProofsCall( - pub ::ethers::core::types::U256, - pub ::ethers::core::types::U256, - ); - ///Container type for all input parameters for the `setInputFormat` function with signature `setInputFormat(uint256,string[])` and selector `0xe86aa190` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "setInputFormat", abi = "setInputFormat(uint256,string[])")] - pub struct SetInputFormatCall { - pub market_id: ::ethers::core::types::U256, - pub inputs_format: ::std::vec::Vec<::std::string::String>, - } - ///Container type for all input parameters for the `setProofFormat` function with signature `setProofFormat(uint256,string[])` and selector `0xc0a59471` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "setProofFormat", abi = "setProofFormat(uint256,string[])")] - pub struct SetProofFormatCall { - pub market_id: ::ethers::core::types::U256, - pub proof_format: ::std::vec::Vec<::std::string::String>, - } - ///Container type for all of the contract's call - #[derive( - Clone, - ::ethers::contract::EthAbiType, - serde::Serialize, - serde::Deserialize, - Debug, - PartialEq, - Eq, - Hash, - )] - pub enum InputAndProofFormatRegistryCalls { - Admin(AdminCall), - InputArrayLength(InputArrayLengthCall), - Inputs(InputsCall), - ProofArrayLength(ProofArrayLengthCall), - Proofs(ProofsCall), - SetInputFormat(SetInputFormatCall), - SetProofFormat(SetProofFormatCall), - } - impl ::ethers::core::abi::AbiDecode for InputAndProofFormatRegistryCalls { - fn decode( - data: impl AsRef<[u8]>, - ) -> ::core::result::Result { - let data = data.as_ref(); - if let Ok(decoded) = ::decode(data) { - return Ok(Self::Admin(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::InputArrayLength(decoded)); - } - if let Ok(decoded) = ::decode(data) { - return Ok(Self::Inputs(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::ProofArrayLength(decoded)); - } - if let Ok(decoded) = ::decode(data) { - return Ok(Self::Proofs(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::SetInputFormat(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::SetProofFormat(decoded)); - } - Err(::ethers::core::abi::Error::InvalidData.into()) - } - } - impl ::ethers::core::abi::AbiEncode for InputAndProofFormatRegistryCalls { - fn encode(self) -> Vec { - match self { - Self::Admin(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::InputArrayLength(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::Inputs(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::ProofArrayLength(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::Proofs(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::SetInputFormat(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::SetProofFormat(element) => ::ethers::core::abi::AbiEncode::encode(element), - } - } - } - impl ::core::fmt::Display for InputAndProofFormatRegistryCalls { - fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { - match self { - Self::Admin(element) => ::core::fmt::Display::fmt(element, f), - Self::InputArrayLength(element) => ::core::fmt::Display::fmt(element, f), - Self::Inputs(element) => ::core::fmt::Display::fmt(element, f), - Self::ProofArrayLength(element) => ::core::fmt::Display::fmt(element, f), - Self::Proofs(element) => ::core::fmt::Display::fmt(element, f), - Self::SetInputFormat(element) => ::core::fmt::Display::fmt(element, f), - Self::SetProofFormat(element) => ::core::fmt::Display::fmt(element, f), - } - } - } - impl ::core::convert::From for InputAndProofFormatRegistryCalls { - fn from(value: AdminCall) -> Self { - Self::Admin(value) - } - } - impl ::core::convert::From for InputAndProofFormatRegistryCalls { - fn from(value: InputArrayLengthCall) -> Self { - Self::InputArrayLength(value) - } - } - impl ::core::convert::From for InputAndProofFormatRegistryCalls { - fn from(value: InputsCall) -> Self { - Self::Inputs(value) - } - } - impl ::core::convert::From for InputAndProofFormatRegistryCalls { - fn from(value: ProofArrayLengthCall) -> Self { - Self::ProofArrayLength(value) - } - } - impl ::core::convert::From for InputAndProofFormatRegistryCalls { - fn from(value: ProofsCall) -> Self { - Self::Proofs(value) - } - } - impl ::core::convert::From for InputAndProofFormatRegistryCalls { - fn from(value: SetInputFormatCall) -> Self { - Self::SetInputFormat(value) - } - } - impl ::core::convert::From for InputAndProofFormatRegistryCalls { - fn from(value: SetProofFormatCall) -> Self { - Self::SetProofFormat(value) - } - } - ///Container type for all return fields from the `admin` function with signature `admin()` and selector `0xf851a440` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct AdminReturn(pub ::ethers::core::types::Address); - ///Container type for all return fields from the `inputArrayLength` function with signature `inputArrayLength(uint256)` and selector `0x0ce4914c` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct InputArrayLengthReturn(pub ::ethers::core::types::U256); - ///Container type for all return fields from the `inputs` function with signature `inputs(uint256,uint256)` and selector `0xccc15e49` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct InputsReturn(pub ::std::string::String); - ///Container type for all return fields from the `proofArrayLength` function with signature `proofArrayLength(uint256)` and selector `0xbed78ca3` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct ProofArrayLengthReturn(pub ::ethers::core::types::U256); - ///Container type for all return fields from the `proofs` function with signature `proofs(uint256,uint256)` and selector `0x5ef77949` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct ProofsReturn(pub ::std::string::String); -} diff --git a/bindings/src/lib.rs b/bindings/src/lib.rs index 0184338..d191494 100644 --- a/bindings/src/lib.rs +++ b/bindings/src/lib.rs @@ -6,56 +6,31 @@ pub mod access_control_upgradeable; pub mod address; pub mod attestation_auther_upgradeable; -pub mod attestation_verifier; -pub mod base_ultra_verifier; -pub mod context; +pub mod bindgin_matching_engine; pub mod context_upgradeable; -pub mod dispute; pub mod ecdsa; pub mod entity_key_registry; pub mod erc165_upgradeable; pub mod erc1967_utils; -pub mod erc20; pub mod error; +pub mod errors; pub mod generator_registry; pub mod helper; pub mod i_access_control; pub mod i_attestation_verifier; pub mod i_beacon; -pub mod i_plonk_vk; -pub mod i_transfer_verifier; pub mod i_verifier; -pub mod i_xor_2_verifier; -pub mod ierc1155_errors; +pub mod ierc1363; pub mod ierc165; pub mod ierc1822_proxiable; +pub mod ierc1967; pub mod ierc20; -pub mod ierc20_errors; -pub mod ierc20_metadata; -pub mod ierc20_permit; -pub mod ierc721_errors; +pub mod il2_staking; pub mod initializable; -pub mod input_and_proof_format_registry; -pub mod mock_attestation_verifier; -pub mod mock_token; -pub mod mock_verifier; -pub mod pairing; pub mod pausable_upgradeable; -pub mod plonk_verifier_wrapper; -pub mod priority_log; pub mod proof_marketplace; pub mod reentrancy_guard_upgradeable; pub mod safe_erc20; pub mod shared_types; pub mod storage_slot; -pub mod transfer_verifier; -pub mod transfer_verifier_wrapper; -pub mod uc; -pub mod uc_rekt; -pub mod uc_with_rg; -pub mod ultra_verification_key; -pub mod ultra_verifier; pub mod uups_upgradeable; -pub mod xor_2_verifier_wrapper; -pub mod xor_verifier; -pub mod zkb_verifier; diff --git a/bindings/src/mock_attestation_verifier.rs b/bindings/src/mock_attestation_verifier.rs deleted file mode 100644 index 5adfa29..0000000 --- a/bindings/src/mock_attestation_verifier.rs +++ /dev/null @@ -1,387 +0,0 @@ -pub use mock_attestation_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 mock_attestation_verifier { - pub use super::super::shared_types::*; - #[allow(deprecated)] - fn __abi() -> ::ethers::core::abi::Abi { - ::ethers::core::abi::ethabi::Contract { - constructor: ::core::option::Option::None, - functions: ::core::convert::From::from([( - ::std::borrow::ToOwned::to_owned("verify"), - ::std::vec![ - ::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("verify"), - inputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Bytes, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes"), - ), - },], - outputs: ::std::vec![], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::Pure, - }, - ::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("verify"), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("attestation"), - kind: ::ethers::core::abi::ethabi::ParamType::Bytes, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("enclaveKey"), - kind: ::ethers::core::abi::ethabi::ParamType::Bytes, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("PCR0"), - kind: ::ethers::core::abi::ethabi::ParamType::Bytes, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("PCR1"), - kind: ::ethers::core::abi::ethabi::ParamType::Bytes, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("PCR2"), - kind: ::ethers::core::abi::ethabi::ParamType::Bytes, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("timestamp"), - kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256"), - ), - }, - ], - outputs: ::std::vec![], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::Pure, - }, - ::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("verify"), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("signature"), - kind: ::ethers::core::abi::ethabi::ParamType::Bytes, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("attestation"), - kind: ::ethers::core::abi::ethabi::ParamType::Tuple(::std::vec![ - ::ethers::core::abi::ethabi::ParamType::Bytes, - ::ethers::core::abi::ethabi::ParamType::Bytes, - ::ethers::core::abi::ethabi::ParamType::Bytes, - ::ethers::core::abi::ethabi::ParamType::Bytes, - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ],), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned( - "struct IAttestationVerifier.Attestation", - ), - ), - }, - ], - outputs: ::std::vec![], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::Pure, - }, - ], - )]), - events: ::std::collections::BTreeMap::new(), - errors: ::std::collections::BTreeMap::new(), - receive: false, - fallback: false, - } - } - ///The parsed JSON ABI of the contract. - pub static MOCKATTESTATIONVERIFIER_ABI: ::ethers::contract::Lazy<::ethers::core::abi::Abi> = - ::ethers::contract::Lazy::new(__abi); - #[rustfmt::skip] - const __BYTECODE: &[u8] = b"`\x80`@R4\x80\x15a\0\x10W`\0\x80\xFD[Pa\x03\xA4\x80a\0 `\09`\0\xF3\xFE`\x80`@R4\x80\x15a\0\x10W`\0\x80\xFD[P`\x046\x10a\0AW`\x005`\xE0\x1C\x80c\x8Ev\n\xFE\x14a\0FW\x80c\xADHq9\x14a\0YW\x80c\xEA\xC7\x08\xA3\x14a\0oW[`\0\x80\xFD[a\0Wa\0T6`\x04a\x01MV[PV[\0[a\0Wa\0g6`\x04a\x01\x8AV[PPPPPPV[a\0Wa\0}6`\x04a\x02dV[PPV[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`@Q`\xA0\x81\x01g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x82\x82\x10\x17\x15a\0\xBAWa\0\xBAa\0\x81V[`@R\x90V[`\0\x82`\x1F\x83\x01\x12a\0\xD1W`\0\x80\xFD[\x815g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x11\x15a\0\xECWa\0\xECa\0\x81V[`@Q`\x1F\x83\x01`\x1F\x19\x90\x81\x16`?\x01\x16\x81\x01\x90\x82\x82\x11\x81\x83\x10\x17\x15a\x01\x14Wa\x01\x14a\0\x81V[\x81`@R\x83\x81R\x86` \x85\x88\x01\x01\x11\x15a\x01-W`\0\x80\xFD[\x83` \x87\x01` \x83\x017`\0` \x85\x83\x01\x01R\x80\x94PPPPP\x92\x91PPV[`\0` \x82\x84\x03\x12\x15a\x01_W`\0\x80\xFD[\x815g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x01vW`\0\x80\xFD[a\x01\x82\x84\x82\x85\x01a\0\xC0V[\x94\x93PPPPV[`\0\x80`\0\x80`\0\x80`\xC0\x87\x89\x03\x12\x15a\x01\xA3W`\0\x80\xFD[\x865g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x11\x15a\x01\xBBW`\0\x80\xFD[a\x01\xC7\x8A\x83\x8B\x01a\0\xC0V[\x97P` \x89\x015\x91P\x80\x82\x11\x15a\x01\xDDW`\0\x80\xFD[a\x01\xE9\x8A\x83\x8B\x01a\0\xC0V[\x96P`@\x89\x015\x91P\x80\x82\x11\x15a\x01\xFFW`\0\x80\xFD[a\x02\x0B\x8A\x83\x8B\x01a\0\xC0V[\x95P``\x89\x015\x91P\x80\x82\x11\x15a\x02!W`\0\x80\xFD[a\x02-\x8A\x83\x8B\x01a\0\xC0V[\x94P`\x80\x89\x015\x91P\x80\x82\x11\x15a\x02CW`\0\x80\xFD[Pa\x02P\x89\x82\x8A\x01a\0\xC0V[\x92PP`\xA0\x87\x015\x90P\x92\x95P\x92\x95P\x92\x95V[`\0\x80`@\x83\x85\x03\x12\x15a\x02wW`\0\x80\xFD[\x825g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x11\x15a\x02\x8FW`\0\x80\xFD[a\x02\x9B\x86\x83\x87\x01a\0\xC0V[\x93P` \x85\x015\x91P\x80\x82\x11\x15a\x02\xB1W`\0\x80\xFD[\x90\x84\x01\x90`\xA0\x82\x87\x03\x12\x15a\x02\xC5W`\0\x80\xFD[a\x02\xCDa\0\x97V[\x825\x82\x81\x11\x15a\x02\xDCW`\0\x80\xFD[a\x02\xE8\x88\x82\x86\x01a\0\xC0V[\x82RP` \x83\x015\x82\x81\x11\x15a\x02\xFDW`\0\x80\xFD[a\x03\t\x88\x82\x86\x01a\0\xC0V[` \x83\x01RP`@\x83\x015\x82\x81\x11\x15a\x03!W`\0\x80\xFD[a\x03-\x88\x82\x86\x01a\0\xC0V[`@\x83\x01RP``\x83\x015\x82\x81\x11\x15a\x03EW`\0\x80\xFD[a\x03Q\x88\x82\x86\x01a\0\xC0V[``\x83\x01RP`\x80\x83\x015`\x80\x82\x01R\x80\x93PPPP\x92P\x92\x90PV\xFE\xA2dipfsX\"\x12 pDu\xB9\x8A2\xAD\x0Bu\x98\xF8$9v\xEETz\x9B]\xD4+\x007\xBDa\xDC3\x05\xDF\xFD\xD7\x03dsolcC\0\x08\x14\x003"; - /// The bytecode of the contract. - pub static MOCKATTESTATIONVERIFIER_BYTECODE: ::ethers::core::types::Bytes = - ::ethers::core::types::Bytes::from_static(__BYTECODE); - #[rustfmt::skip] - const __DEPLOYED_BYTECODE: &[u8] = b"`\x80`@R4\x80\x15a\0\x10W`\0\x80\xFD[P`\x046\x10a\0AW`\x005`\xE0\x1C\x80c\x8Ev\n\xFE\x14a\0FW\x80c\xADHq9\x14a\0YW\x80c\xEA\xC7\x08\xA3\x14a\0oW[`\0\x80\xFD[a\0Wa\0T6`\x04a\x01MV[PV[\0[a\0Wa\0g6`\x04a\x01\x8AV[PPPPPPV[a\0Wa\0}6`\x04a\x02dV[PPV[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`@Q`\xA0\x81\x01g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x82\x82\x10\x17\x15a\0\xBAWa\0\xBAa\0\x81V[`@R\x90V[`\0\x82`\x1F\x83\x01\x12a\0\xD1W`\0\x80\xFD[\x815g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x11\x15a\0\xECWa\0\xECa\0\x81V[`@Q`\x1F\x83\x01`\x1F\x19\x90\x81\x16`?\x01\x16\x81\x01\x90\x82\x82\x11\x81\x83\x10\x17\x15a\x01\x14Wa\x01\x14a\0\x81V[\x81`@R\x83\x81R\x86` \x85\x88\x01\x01\x11\x15a\x01-W`\0\x80\xFD[\x83` \x87\x01` \x83\x017`\0` \x85\x83\x01\x01R\x80\x94PPPPP\x92\x91PPV[`\0` \x82\x84\x03\x12\x15a\x01_W`\0\x80\xFD[\x815g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x01vW`\0\x80\xFD[a\x01\x82\x84\x82\x85\x01a\0\xC0V[\x94\x93PPPPV[`\0\x80`\0\x80`\0\x80`\xC0\x87\x89\x03\x12\x15a\x01\xA3W`\0\x80\xFD[\x865g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x11\x15a\x01\xBBW`\0\x80\xFD[a\x01\xC7\x8A\x83\x8B\x01a\0\xC0V[\x97P` \x89\x015\x91P\x80\x82\x11\x15a\x01\xDDW`\0\x80\xFD[a\x01\xE9\x8A\x83\x8B\x01a\0\xC0V[\x96P`@\x89\x015\x91P\x80\x82\x11\x15a\x01\xFFW`\0\x80\xFD[a\x02\x0B\x8A\x83\x8B\x01a\0\xC0V[\x95P``\x89\x015\x91P\x80\x82\x11\x15a\x02!W`\0\x80\xFD[a\x02-\x8A\x83\x8B\x01a\0\xC0V[\x94P`\x80\x89\x015\x91P\x80\x82\x11\x15a\x02CW`\0\x80\xFD[Pa\x02P\x89\x82\x8A\x01a\0\xC0V[\x92PP`\xA0\x87\x015\x90P\x92\x95P\x92\x95P\x92\x95V[`\0\x80`@\x83\x85\x03\x12\x15a\x02wW`\0\x80\xFD[\x825g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x11\x15a\x02\x8FW`\0\x80\xFD[a\x02\x9B\x86\x83\x87\x01a\0\xC0V[\x93P` \x85\x015\x91P\x80\x82\x11\x15a\x02\xB1W`\0\x80\xFD[\x90\x84\x01\x90`\xA0\x82\x87\x03\x12\x15a\x02\xC5W`\0\x80\xFD[a\x02\xCDa\0\x97V[\x825\x82\x81\x11\x15a\x02\xDCW`\0\x80\xFD[a\x02\xE8\x88\x82\x86\x01a\0\xC0V[\x82RP` \x83\x015\x82\x81\x11\x15a\x02\xFDW`\0\x80\xFD[a\x03\t\x88\x82\x86\x01a\0\xC0V[` \x83\x01RP`@\x83\x015\x82\x81\x11\x15a\x03!W`\0\x80\xFD[a\x03-\x88\x82\x86\x01a\0\xC0V[`@\x83\x01RP``\x83\x015\x82\x81\x11\x15a\x03EW`\0\x80\xFD[a\x03Q\x88\x82\x86\x01a\0\xC0V[``\x83\x01RP`\x80\x83\x015`\x80\x82\x01R\x80\x93PPPP\x92P\x92\x90PV\xFE\xA2dipfsX\"\x12 pDu\xB9\x8A2\xAD\x0Bu\x98\xF8$9v\xEETz\x9B]\xD4+\x007\xBDa\xDC3\x05\xDF\xFD\xD7\x03dsolcC\0\x08\x14\x003"; - /// The deployed bytecode of the contract. - pub static MOCKATTESTATIONVERIFIER_DEPLOYED_BYTECODE: ::ethers::core::types::Bytes = - ::ethers::core::types::Bytes::from_static(__DEPLOYED_BYTECODE); - pub struct MockAttestationVerifier(::ethers::contract::Contract); - impl ::core::clone::Clone for MockAttestationVerifier { - fn clone(&self) -> Self { - Self(::core::clone::Clone::clone(&self.0)) - } - } - impl ::core::ops::Deref for MockAttestationVerifier { - type Target = ::ethers::contract::Contract; - fn deref(&self) -> &Self::Target { - &self.0 - } - } - impl ::core::ops::DerefMut for MockAttestationVerifier { - fn deref_mut(&mut self) -> &mut Self::Target { - &mut self.0 - } - } - impl ::core::fmt::Debug for MockAttestationVerifier { - fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { - f.debug_tuple(::core::stringify!(MockAttestationVerifier)) - .field(&self.address()) - .finish() - } - } - impl MockAttestationVerifier { - /// 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(), - MOCKATTESTATIONVERIFIER_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( - MOCKATTESTATIONVERIFIER_ABI.clone(), - MOCKATTESTATIONVERIFIER_BYTECODE.clone().into(), - client, - ); - let deployer = factory.deploy(constructor_args)?; - let deployer = ::ethers::contract::ContractDeployer::new(deployer); - Ok(deployer) - } - ///Calls the contract's `verify` (0x8e760afe) function - pub fn verify( - &self, - p0: ::ethers::core::types::Bytes, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([142, 118, 10, 254], p0) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `verify` (0xad487139) function - pub fn verify_with_attestation( - &self, - attestation: ::ethers::core::types::Bytes, - enclave_key: ::ethers::core::types::Bytes, - pcr0: ::ethers::core::types::Bytes, - pcr1: ::ethers::core::types::Bytes, - pcr2: ::ethers::core::types::Bytes, - timestamp: ::ethers::core::types::U256, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash( - [173, 72, 113, 57], - (attestation, enclave_key, pcr0, pcr1, pcr2, timestamp), - ) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `verify` (0xeac708a3) function - pub fn verify_with_signature( - &self, - signature: ::ethers::core::types::Bytes, - attestation: Attestation, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([234, 199, 8, 163], (signature, attestation)) - .expect("method not found (this should never happen)") - } - } - impl From<::ethers::contract::Contract> - for MockAttestationVerifier - { - fn from(contract: ::ethers::contract::Contract) -> Self { - Self::new(contract.address(), contract.client()) - } - } - ///Container type for all input parameters for the `verify` function with signature `verify(bytes)` and selector `0x8e760afe` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "verify", abi = "verify(bytes)")] - pub struct VerifyCall(pub ::ethers::core::types::Bytes); - ///Container type for all input parameters for the `verify` function with signature `verify(bytes,bytes,bytes,bytes,bytes,uint256)` and selector `0xad487139` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "verify", abi = "verify(bytes,bytes,bytes,bytes,bytes,uint256)")] - pub struct VerifyWithAttestationCall { - pub attestation: ::ethers::core::types::Bytes, - pub enclave_key: ::ethers::core::types::Bytes, - pub pcr0: ::ethers::core::types::Bytes, - pub pcr1: ::ethers::core::types::Bytes, - pub pcr2: ::ethers::core::types::Bytes, - pub timestamp: ::ethers::core::types::U256, - } - ///Container type for all input parameters for the `verify` function with signature `verify(bytes,(bytes,bytes,bytes,bytes,uint256))` and selector `0xeac708a3` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall( - name = "verify", - abi = "verify(bytes,(bytes,bytes,bytes,bytes,uint256))" - )] - pub struct VerifyWithSignatureCall { - pub signature: ::ethers::core::types::Bytes, - pub attestation: Attestation, - } - ///Container type for all of the contract's call - #[derive( - Clone, - ::ethers::contract::EthAbiType, - serde::Serialize, - serde::Deserialize, - Debug, - PartialEq, - Eq, - Hash, - )] - pub enum MockAttestationVerifierCalls { - Verify(VerifyCall), - VerifyWithAttestation(VerifyWithAttestationCall), - VerifyWithSignature(VerifyWithSignatureCall), - } - impl ::ethers::core::abi::AbiDecode for MockAttestationVerifierCalls { - fn decode( - data: impl AsRef<[u8]>, - ) -> ::core::result::Result { - let data = data.as_ref(); - if let Ok(decoded) = ::decode(data) { - return Ok(Self::Verify(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::VerifyWithAttestation(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::VerifyWithSignature(decoded)); - } - Err(::ethers::core::abi::Error::InvalidData.into()) - } - } - impl ::ethers::core::abi::AbiEncode for MockAttestationVerifierCalls { - fn encode(self) -> Vec { - match self { - Self::Verify(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::VerifyWithAttestation(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::VerifyWithSignature(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - } - } - } - impl ::core::fmt::Display for MockAttestationVerifierCalls { - fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { - match self { - Self::Verify(element) => ::core::fmt::Display::fmt(element, f), - Self::VerifyWithAttestation(element) => ::core::fmt::Display::fmt(element, f), - Self::VerifyWithSignature(element) => ::core::fmt::Display::fmt(element, f), - } - } - } - impl ::core::convert::From for MockAttestationVerifierCalls { - fn from(value: VerifyCall) -> Self { - Self::Verify(value) - } - } - impl ::core::convert::From for MockAttestationVerifierCalls { - fn from(value: VerifyWithAttestationCall) -> Self { - Self::VerifyWithAttestation(value) - } - } - impl ::core::convert::From for MockAttestationVerifierCalls { - fn from(value: VerifyWithSignatureCall) -> Self { - Self::VerifyWithSignature(value) - } - } -} diff --git a/bindings/src/mock_token.rs b/bindings/src/mock_token.rs deleted file mode 100644 index c6a7d4c..0000000 --- a/bindings/src/mock_token.rs +++ /dev/null @@ -1,1408 +0,0 @@ -pub use mock_token::*; -/// 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 mock_token { - #[allow(deprecated)] - fn __abi() -> ::ethers::core::abi::Abi { - ::ethers::core::abi::ethabi::Contract { - constructor: ::core::option::Option::Some(::ethers::core::abi::ethabi::Constructor { - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("_admin"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("_totalSupply"), - kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("_tokenName"), - kind: ::ethers::core::abi::ethabi::ParamType::String, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("string"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("_tokenSymbol"), - kind: ::ethers::core::abi::ethabi::ParamType::String, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("string"), - ), - }, - ], - }), - functions: ::core::convert::From::from([ - ( - ::std::borrow::ToOwned::to_owned("allowance"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("allowance"), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("owner"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("spender"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - }, - ], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("approve"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("approve"), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("spender"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("value"), - kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256"), - ), - }, - ], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Bool, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bool"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("balanceOf"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("balanceOf"), - inputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("account"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - },], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("decimals"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("decimals"), - inputs: ::std::vec![], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Uint(8usize), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint8"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("name"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("name"), - inputs: ::std::vec![], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::String, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("string"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("symbol"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("symbol"), - inputs: ::std::vec![], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::String, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("string"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("totalSupply"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("totalSupply"), - inputs: ::std::vec![], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("transfer"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("transfer"), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("to"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("value"), - kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256"), - ), - }, - ], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Bool, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bool"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("transferFrom"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("transferFrom"), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("from"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("to"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("value"), - kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256"), - ), - }, - ], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Bool, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bool"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable, - },], - ), - ]), - events: ::core::convert::From::from([ - ( - ::std::borrow::ToOwned::to_owned("Approval"), - ::std::vec![::ethers::core::abi::ethabi::Event { - name: ::std::borrow::ToOwned::to_owned("Approval"), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::EventParam { - name: ::std::borrow::ToOwned::to_owned("owner"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - indexed: true, - }, - ::ethers::core::abi::ethabi::EventParam { - name: ::std::borrow::ToOwned::to_owned("spender"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - indexed: true, - }, - ::ethers::core::abi::ethabi::EventParam { - name: ::std::borrow::ToOwned::to_owned("value"), - kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), - indexed: false, - }, - ], - anonymous: false, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("Transfer"), - ::std::vec![::ethers::core::abi::ethabi::Event { - name: ::std::borrow::ToOwned::to_owned("Transfer"), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::EventParam { - name: ::std::borrow::ToOwned::to_owned("from"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - indexed: true, - }, - ::ethers::core::abi::ethabi::EventParam { - name: ::std::borrow::ToOwned::to_owned("to"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - indexed: true, - }, - ::ethers::core::abi::ethabi::EventParam { - name: ::std::borrow::ToOwned::to_owned("value"), - kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), - indexed: false, - }, - ], - anonymous: false, - },], - ), - ]), - errors: ::core::convert::From::from([ - ( - ::std::borrow::ToOwned::to_owned("ERC20InsufficientAllowance"), - ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("ERC20InsufficientAllowance",), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("spender"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("allowance"), - kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("needed"), - kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256"), - ), - }, - ], - },], - ), - ( - ::std::borrow::ToOwned::to_owned("ERC20InsufficientBalance"), - ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("ERC20InsufficientBalance",), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("sender"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("balance"), - kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("needed"), - kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256"), - ), - }, - ], - },], - ), - ( - ::std::borrow::ToOwned::to_owned("ERC20InvalidApprover"), - ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("ERC20InvalidApprover",), - inputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("approver"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - },], - },], - ), - ( - ::std::borrow::ToOwned::to_owned("ERC20InvalidReceiver"), - ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("ERC20InvalidReceiver",), - inputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("receiver"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - },], - },], - ), - ( - ::std::borrow::ToOwned::to_owned("ERC20InvalidSender"), - ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("ERC20InvalidSender"), - inputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("sender"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - },], - },], - ), - ( - ::std::borrow::ToOwned::to_owned("ERC20InvalidSpender"), - ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("ERC20InvalidSpender",), - inputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("spender"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - },], - },], - ), - ]), - receive: false, - fallback: false, - } - } - ///The parsed JSON ABI of the contract. - pub static MOCKTOKEN_ABI: ::ethers::contract::Lazy<::ethers::core::abi::Abi> = - ::ethers::contract::Lazy::new(__abi); - #[rustfmt::skip] - const __BYTECODE: &[u8] = b"`\x80`@R4\x80\x15b\0\0\x11W`\0\x80\xFD[P`@Qb\0\x0B\xF38\x03\x80b\0\x0B\xF3\x839\x81\x01`@\x81\x90Rb\0\x004\x91b\0\x02\xACV[\x81\x81`\x03b\0\0D\x83\x82b\0\x03\xCFV[P`\x04b\0\0S\x82\x82b\0\x03\xCFV[PPPb\0\0h\x84\x84b\0\0r` \x1B` \x1CV[PPPPb\0\x04\xC3V[`\x01`\x01`\xA0\x1B\x03\x82\x16b\0\0\xA2W`@Qc\xECD/\x05`\xE0\x1B\x81R`\0`\x04\x82\x01R`$\x01[`@Q\x80\x91\x03\x90\xFD[b\0\0\xB0`\0\x83\x83b\0\0\xB4V[PPV[`\x01`\x01`\xA0\x1B\x03\x83\x16b\0\0\xE3W\x80`\x02`\0\x82\x82Tb\0\0\xD7\x91\x90b\0\x04\x9BV[\x90\x91UPb\0\x01W\x90PV[`\x01`\x01`\xA0\x1B\x03\x83\x16`\0\x90\x81R` \x81\x90R`@\x90 T\x81\x81\x10\x15b\0\x018W`@Qc9\x144\xE3`\xE2\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x85\x16`\x04\x82\x01R`$\x81\x01\x82\x90R`D\x81\x01\x83\x90R`d\x01b\0\0\x99V[`\x01`\x01`\xA0\x1B\x03\x84\x16`\0\x90\x81R` \x81\x90R`@\x90 \x90\x82\x90\x03\x90U[`\x01`\x01`\xA0\x1B\x03\x82\x16b\0\x01uW`\x02\x80T\x82\x90\x03\x90Ub\0\x01\x94V[`\x01`\x01`\xA0\x1B\x03\x82\x16`\0\x90\x81R` \x81\x90R`@\x90 \x80T\x82\x01\x90U[\x81`\x01`\x01`\xA0\x1B\x03\x16\x83`\x01`\x01`\xA0\x1B\x03\x16\x7F\xDD\xF2R\xAD\x1B\xE2\xC8\x9Bi\xC2\xB0h\xFC7\x8D\xAA\x95+\xA7\xF1c\xC4\xA1\x16(\xF5ZM\xF5#\xB3\xEF\x83`@Qb\0\x01\xDA\x91\x81R` \x01\x90V[`@Q\x80\x91\x03\x90\xA3PPPV[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`\0\x82`\x1F\x83\x01\x12b\0\x02\x0FW`\0\x80\xFD[\x81Q`\x01`\x01`@\x1B\x03\x80\x82\x11\x15b\0\x02,Wb\0\x02,b\0\x01\xE7V[`@Q`\x1F\x83\x01`\x1F\x19\x90\x81\x16`?\x01\x16\x81\x01\x90\x82\x82\x11\x81\x83\x10\x17\x15b\0\x02WWb\0\x02Wb\0\x01\xE7V[\x81`@R\x83\x81R` \x92P\x86\x83\x85\x88\x01\x01\x11\x15b\0\x02tW`\0\x80\xFD[`\0\x91P[\x83\x82\x10\x15b\0\x02\x98W\x85\x82\x01\x83\x01Q\x81\x83\x01\x84\x01R\x90\x82\x01\x90b\0\x02yV[`\0\x93\x81\x01\x90\x92\x01\x92\x90\x92R\x94\x93PPPPV[`\0\x80`\0\x80`\x80\x85\x87\x03\x12\x15b\0\x02\xC3W`\0\x80\xFD[\x84Q`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14b\0\x02\xDBW`\0\x80\xFD[` \x86\x01Q`@\x87\x01Q\x91\x95P\x93P`\x01`\x01`@\x1B\x03\x80\x82\x11\x15b\0\x03\0W`\0\x80\xFD[b\0\x03\x0E\x88\x83\x89\x01b\0\x01\xFDV[\x93P``\x87\x01Q\x91P\x80\x82\x11\x15b\0\x03%W`\0\x80\xFD[Pb\0\x034\x87\x82\x88\x01b\0\x01\xFDV[\x91PP\x92\x95\x91\x94P\x92PV[`\x01\x81\x81\x1C\x90\x82\x16\x80b\0\x03UW`\x7F\x82\x16\x91P[` \x82\x10\x81\x03b\0\x03vWcNH{q`\xE0\x1B`\0R`\"`\x04R`$`\0\xFD[P\x91\x90PV[`\x1F\x82\x11\x15b\0\x03\xCAW`\0\x81\x81R` \x81 `\x1F\x85\x01`\x05\x1C\x81\x01` \x86\x10\x15b\0\x03\xA5WP\x80[`\x1F\x85\x01`\x05\x1C\x82\x01\x91P[\x81\x81\x10\x15b\0\x03\xC6W\x82\x81U`\x01\x01b\0\x03\xB1V[PPP[PPPV[\x81Q`\x01`\x01`@\x1B\x03\x81\x11\x15b\0\x03\xEBWb\0\x03\xEBb\0\x01\xE7V[b\0\x04\x03\x81b\0\x03\xFC\x84Tb\0\x03@V[\x84b\0\x03|V[` \x80`\x1F\x83\x11`\x01\x81\x14b\0\x04;W`\0\x84\x15b\0\x04\"WP\x85\x83\x01Q[`\0\x19`\x03\x86\x90\x1B\x1C\x19\x16`\x01\x85\x90\x1B\x17\x85Ub\0\x03\xC6V[`\0\x85\x81R` \x81 `\x1F\x19\x86\x16\x91[\x82\x81\x10\x15b\0\x04lW\x88\x86\x01Q\x82U\x94\x84\x01\x94`\x01\x90\x91\x01\x90\x84\x01b\0\x04KV[P\x85\x82\x10\x15b\0\x04\x8BW\x87\x85\x01Q`\0\x19`\x03\x88\x90\x1B`\xF8\x16\x1C\x19\x16\x81U[PPPPP`\x01\x90\x81\x1B\x01\x90UPV[\x80\x82\x01\x80\x82\x11\x15b\0\x04\xBDWcNH{q`\xE0\x1B`\0R`\x11`\x04R`$`\0\xFD[\x92\x91PPV[a\x07 \x80b\0\x04\xD3`\09`\0\xF3\xFE`\x80`@R4\x80\x15a\0\x10W`\0\x80\xFD[P`\x046\x10a\0\x93W`\x005`\xE0\x1C\x80c1<\xE5g\x11a\0fW\x80c1<\xE5g\x14a\0\xFEW\x80cp\xA0\x821\x14a\x01\rW\x80c\x95\xD8\x9BA\x14a\x016W\x80c\xA9\x05\x9C\xBB\x14a\x01>W\x80c\xDDb\xED>\x14a\x01QW`\0\x80\xFD[\x80c\x06\xFD\xDE\x03\x14a\0\x98W\x80c\t^\xA7\xB3\x14a\0\xB6W\x80c\x18\x16\r\xDD\x14a\0\xD9W\x80c#\xB8r\xDD\x14a\0\xEBW[`\0\x80\xFD[a\0\xA0a\x01\x8AV[`@Qa\0\xAD\x91\x90a\x05jV[`@Q\x80\x91\x03\x90\xF3[a\0\xC9a\0\xC46`\x04a\x05\xD4V[a\x02\x1CV[`@Q\x90\x15\x15\x81R` \x01a\0\xADV[`\x02T[`@Q\x90\x81R` \x01a\0\xADV[a\0\xC9a\0\xF96`\x04a\x05\xFEV[a\x026V[`@Q`\x12\x81R` \x01a\0\xADV[a\0\xDDa\x01\x1B6`\x04a\x06:V[`\x01`\x01`\xA0\x1B\x03\x16`\0\x90\x81R` \x81\x90R`@\x90 T\x90V[a\0\xA0a\x02ZV[a\0\xC9a\x01L6`\x04a\x05\xD4V[a\x02iV[a\0\xDDa\x01_6`\x04a\x06\\V[`\x01`\x01`\xA0\x1B\x03\x91\x82\x16`\0\x90\x81R`\x01` \x90\x81R`@\x80\x83 \x93\x90\x94\x16\x82R\x91\x90\x91R T\x90V[```\x03\x80Ta\x01\x99\x90a\x06\x8FV[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\x01\xC5\x90a\x06\x8FV[\x80\x15a\x02\x12W\x80`\x1F\x10a\x01\xE7Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\x02\x12V[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\x01\xF5W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x90P\x90V[`\x003a\x02*\x81\x85\x85a\x02wV[`\x01\x91PP[\x92\x91PPV[`\x003a\x02D\x85\x82\x85a\x02\x89V[a\x02O\x85\x85\x85a\x03\x0CV[P`\x01\x94\x93PPPPV[```\x04\x80Ta\x01\x99\x90a\x06\x8FV[`\x003a\x02*\x81\x85\x85a\x03\x0CV[a\x02\x84\x83\x83\x83`\x01a\x03kV[PPPV[`\x01`\x01`\xA0\x1B\x03\x83\x81\x16`\0\x90\x81R`\x01` \x90\x81R`@\x80\x83 \x93\x86\x16\x83R\x92\x90R T`\0\x19\x81\x14a\x03\x06W\x81\x81\x10\x15a\x02\xF7W`@Qc}\xC7\xA0\xD9`\xE1\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x84\x16`\x04\x82\x01R`$\x81\x01\x82\x90R`D\x81\x01\x83\x90R`d\x01[`@Q\x80\x91\x03\x90\xFD[a\x03\x06\x84\x84\x84\x84\x03`\0a\x03kV[PPPPV[`\x01`\x01`\xA0\x1B\x03\x83\x16a\x036W`@QcKc~\x8F`\xE1\x1B\x81R`\0`\x04\x82\x01R`$\x01a\x02\xEEV[`\x01`\x01`\xA0\x1B\x03\x82\x16a\x03`W`@Qc\xECD/\x05`\xE0\x1B\x81R`\0`\x04\x82\x01R`$\x01a\x02\xEEV[a\x02\x84\x83\x83\x83a\x04@V[`\x01`\x01`\xA0\x1B\x03\x84\x16a\x03\x95W`@Qc\xE6\x02\xDF\x05`\xE0\x1B\x81R`\0`\x04\x82\x01R`$\x01a\x02\xEEV[`\x01`\x01`\xA0\x1B\x03\x83\x16a\x03\xBFW`@QcJ\x14\x06\xB1`\xE1\x1B\x81R`\0`\x04\x82\x01R`$\x01a\x02\xEEV[`\x01`\x01`\xA0\x1B\x03\x80\x85\x16`\0\x90\x81R`\x01` \x90\x81R`@\x80\x83 \x93\x87\x16\x83R\x92\x90R \x82\x90U\x80\x15a\x03\x06W\x82`\x01`\x01`\xA0\x1B\x03\x16\x84`\x01`\x01`\xA0\x1B\x03\x16\x7F\x8C[\xE1\xE5\xEB\xEC}[\xD1OqB}\x1E\x84\xF3\xDD\x03\x14\xC0\xF7\xB2)\x1E[ \n\xC8\xC7\xC3\xB9%\x84`@Qa\x042\x91\x81R` \x01\x90V[`@Q\x80\x91\x03\x90\xA3PPPPV[`\x01`\x01`\xA0\x1B\x03\x83\x16a\x04kW\x80`\x02`\0\x82\x82Ta\x04`\x91\x90a\x06\xC9V[\x90\x91UPa\x04\xDD\x90PV[`\x01`\x01`\xA0\x1B\x03\x83\x16`\0\x90\x81R` \x81\x90R`@\x90 T\x81\x81\x10\x15a\x04\xBEW`@Qc9\x144\xE3`\xE2\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x85\x16`\x04\x82\x01R`$\x81\x01\x82\x90R`D\x81\x01\x83\x90R`d\x01a\x02\xEEV[`\x01`\x01`\xA0\x1B\x03\x84\x16`\0\x90\x81R` \x81\x90R`@\x90 \x90\x82\x90\x03\x90U[`\x01`\x01`\xA0\x1B\x03\x82\x16a\x04\xF9W`\x02\x80T\x82\x90\x03\x90Ua\x05\x18V[`\x01`\x01`\xA0\x1B\x03\x82\x16`\0\x90\x81R` \x81\x90R`@\x90 \x80T\x82\x01\x90U[\x81`\x01`\x01`\xA0\x1B\x03\x16\x83`\x01`\x01`\xA0\x1B\x03\x16\x7F\xDD\xF2R\xAD\x1B\xE2\xC8\x9Bi\xC2\xB0h\xFC7\x8D\xAA\x95+\xA7\xF1c\xC4\xA1\x16(\xF5ZM\xF5#\xB3\xEF\x83`@Qa\x05]\x91\x81R` \x01\x90V[`@Q\x80\x91\x03\x90\xA3PPPV[`\0` \x80\x83R\x83Q\x80\x82\x85\x01R`\0[\x81\x81\x10\x15a\x05\x97W\x85\x81\x01\x83\x01Q\x85\x82\x01`@\x01R\x82\x01a\x05{V[P`\0`@\x82\x86\x01\x01R`@`\x1F\x19`\x1F\x83\x01\x16\x85\x01\x01\x92PPP\x92\x91PPV[\x805`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a\x05\xCFW`\0\x80\xFD[\x91\x90PV[`\0\x80`@\x83\x85\x03\x12\x15a\x05\xE7W`\0\x80\xFD[a\x05\xF0\x83a\x05\xB8V[\x94` \x93\x90\x93\x015\x93PPPV[`\0\x80`\0``\x84\x86\x03\x12\x15a\x06\x13W`\0\x80\xFD[a\x06\x1C\x84a\x05\xB8V[\x92Pa\x06*` \x85\x01a\x05\xB8V[\x91P`@\x84\x015\x90P\x92P\x92P\x92V[`\0` \x82\x84\x03\x12\x15a\x06LW`\0\x80\xFD[a\x06U\x82a\x05\xB8V[\x93\x92PPPV[`\0\x80`@\x83\x85\x03\x12\x15a\x06oW`\0\x80\xFD[a\x06x\x83a\x05\xB8V[\x91Pa\x06\x86` \x84\x01a\x05\xB8V[\x90P\x92P\x92\x90PV[`\x01\x81\x81\x1C\x90\x82\x16\x80a\x06\xA3W`\x7F\x82\x16\x91P[` \x82\x10\x81\x03a\x06\xC3WcNH{q`\xE0\x1B`\0R`\"`\x04R`$`\0\xFD[P\x91\x90PV[\x80\x82\x01\x80\x82\x11\x15a\x020WcNH{q`\xE0\x1B`\0R`\x11`\x04R`$`\0\xFD\xFE\xA2dipfsX\"\x12 \x870.B\xA6c\xFD`y\xCA\xF7o\xF4\xBF\xA3\x1E\xB5\xD9L=\r\x9F`Y:\xF4)h\x07\xC1\\\x1AdsolcC\0\x08\x14\x003"; - /// The bytecode of the contract. - pub static MOCKTOKEN_BYTECODE: ::ethers::core::types::Bytes = - ::ethers::core::types::Bytes::from_static(__BYTECODE); - #[rustfmt::skip] - const __DEPLOYED_BYTECODE: &[u8] = b"`\x80`@R4\x80\x15a\0\x10W`\0\x80\xFD[P`\x046\x10a\0\x93W`\x005`\xE0\x1C\x80c1<\xE5g\x11a\0fW\x80c1<\xE5g\x14a\0\xFEW\x80cp\xA0\x821\x14a\x01\rW\x80c\x95\xD8\x9BA\x14a\x016W\x80c\xA9\x05\x9C\xBB\x14a\x01>W\x80c\xDDb\xED>\x14a\x01QW`\0\x80\xFD[\x80c\x06\xFD\xDE\x03\x14a\0\x98W\x80c\t^\xA7\xB3\x14a\0\xB6W\x80c\x18\x16\r\xDD\x14a\0\xD9W\x80c#\xB8r\xDD\x14a\0\xEBW[`\0\x80\xFD[a\0\xA0a\x01\x8AV[`@Qa\0\xAD\x91\x90a\x05jV[`@Q\x80\x91\x03\x90\xF3[a\0\xC9a\0\xC46`\x04a\x05\xD4V[a\x02\x1CV[`@Q\x90\x15\x15\x81R` \x01a\0\xADV[`\x02T[`@Q\x90\x81R` \x01a\0\xADV[a\0\xC9a\0\xF96`\x04a\x05\xFEV[a\x026V[`@Q`\x12\x81R` \x01a\0\xADV[a\0\xDDa\x01\x1B6`\x04a\x06:V[`\x01`\x01`\xA0\x1B\x03\x16`\0\x90\x81R` \x81\x90R`@\x90 T\x90V[a\0\xA0a\x02ZV[a\0\xC9a\x01L6`\x04a\x05\xD4V[a\x02iV[a\0\xDDa\x01_6`\x04a\x06\\V[`\x01`\x01`\xA0\x1B\x03\x91\x82\x16`\0\x90\x81R`\x01` \x90\x81R`@\x80\x83 \x93\x90\x94\x16\x82R\x91\x90\x91R T\x90V[```\x03\x80Ta\x01\x99\x90a\x06\x8FV[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\x01\xC5\x90a\x06\x8FV[\x80\x15a\x02\x12W\x80`\x1F\x10a\x01\xE7Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\x02\x12V[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\x01\xF5W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x90P\x90V[`\x003a\x02*\x81\x85\x85a\x02wV[`\x01\x91PP[\x92\x91PPV[`\x003a\x02D\x85\x82\x85a\x02\x89V[a\x02O\x85\x85\x85a\x03\x0CV[P`\x01\x94\x93PPPPV[```\x04\x80Ta\x01\x99\x90a\x06\x8FV[`\x003a\x02*\x81\x85\x85a\x03\x0CV[a\x02\x84\x83\x83\x83`\x01a\x03kV[PPPV[`\x01`\x01`\xA0\x1B\x03\x83\x81\x16`\0\x90\x81R`\x01` \x90\x81R`@\x80\x83 \x93\x86\x16\x83R\x92\x90R T`\0\x19\x81\x14a\x03\x06W\x81\x81\x10\x15a\x02\xF7W`@Qc}\xC7\xA0\xD9`\xE1\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x84\x16`\x04\x82\x01R`$\x81\x01\x82\x90R`D\x81\x01\x83\x90R`d\x01[`@Q\x80\x91\x03\x90\xFD[a\x03\x06\x84\x84\x84\x84\x03`\0a\x03kV[PPPPV[`\x01`\x01`\xA0\x1B\x03\x83\x16a\x036W`@QcKc~\x8F`\xE1\x1B\x81R`\0`\x04\x82\x01R`$\x01a\x02\xEEV[`\x01`\x01`\xA0\x1B\x03\x82\x16a\x03`W`@Qc\xECD/\x05`\xE0\x1B\x81R`\0`\x04\x82\x01R`$\x01a\x02\xEEV[a\x02\x84\x83\x83\x83a\x04@V[`\x01`\x01`\xA0\x1B\x03\x84\x16a\x03\x95W`@Qc\xE6\x02\xDF\x05`\xE0\x1B\x81R`\0`\x04\x82\x01R`$\x01a\x02\xEEV[`\x01`\x01`\xA0\x1B\x03\x83\x16a\x03\xBFW`@QcJ\x14\x06\xB1`\xE1\x1B\x81R`\0`\x04\x82\x01R`$\x01a\x02\xEEV[`\x01`\x01`\xA0\x1B\x03\x80\x85\x16`\0\x90\x81R`\x01` \x90\x81R`@\x80\x83 \x93\x87\x16\x83R\x92\x90R \x82\x90U\x80\x15a\x03\x06W\x82`\x01`\x01`\xA0\x1B\x03\x16\x84`\x01`\x01`\xA0\x1B\x03\x16\x7F\x8C[\xE1\xE5\xEB\xEC}[\xD1OqB}\x1E\x84\xF3\xDD\x03\x14\xC0\xF7\xB2)\x1E[ \n\xC8\xC7\xC3\xB9%\x84`@Qa\x042\x91\x81R` \x01\x90V[`@Q\x80\x91\x03\x90\xA3PPPPV[`\x01`\x01`\xA0\x1B\x03\x83\x16a\x04kW\x80`\x02`\0\x82\x82Ta\x04`\x91\x90a\x06\xC9V[\x90\x91UPa\x04\xDD\x90PV[`\x01`\x01`\xA0\x1B\x03\x83\x16`\0\x90\x81R` \x81\x90R`@\x90 T\x81\x81\x10\x15a\x04\xBEW`@Qc9\x144\xE3`\xE2\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x85\x16`\x04\x82\x01R`$\x81\x01\x82\x90R`D\x81\x01\x83\x90R`d\x01a\x02\xEEV[`\x01`\x01`\xA0\x1B\x03\x84\x16`\0\x90\x81R` \x81\x90R`@\x90 \x90\x82\x90\x03\x90U[`\x01`\x01`\xA0\x1B\x03\x82\x16a\x04\xF9W`\x02\x80T\x82\x90\x03\x90Ua\x05\x18V[`\x01`\x01`\xA0\x1B\x03\x82\x16`\0\x90\x81R` \x81\x90R`@\x90 \x80T\x82\x01\x90U[\x81`\x01`\x01`\xA0\x1B\x03\x16\x83`\x01`\x01`\xA0\x1B\x03\x16\x7F\xDD\xF2R\xAD\x1B\xE2\xC8\x9Bi\xC2\xB0h\xFC7\x8D\xAA\x95+\xA7\xF1c\xC4\xA1\x16(\xF5ZM\xF5#\xB3\xEF\x83`@Qa\x05]\x91\x81R` \x01\x90V[`@Q\x80\x91\x03\x90\xA3PPPV[`\0` \x80\x83R\x83Q\x80\x82\x85\x01R`\0[\x81\x81\x10\x15a\x05\x97W\x85\x81\x01\x83\x01Q\x85\x82\x01`@\x01R\x82\x01a\x05{V[P`\0`@\x82\x86\x01\x01R`@`\x1F\x19`\x1F\x83\x01\x16\x85\x01\x01\x92PPP\x92\x91PPV[\x805`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a\x05\xCFW`\0\x80\xFD[\x91\x90PV[`\0\x80`@\x83\x85\x03\x12\x15a\x05\xE7W`\0\x80\xFD[a\x05\xF0\x83a\x05\xB8V[\x94` \x93\x90\x93\x015\x93PPPV[`\0\x80`\0``\x84\x86\x03\x12\x15a\x06\x13W`\0\x80\xFD[a\x06\x1C\x84a\x05\xB8V[\x92Pa\x06*` \x85\x01a\x05\xB8V[\x91P`@\x84\x015\x90P\x92P\x92P\x92V[`\0` \x82\x84\x03\x12\x15a\x06LW`\0\x80\xFD[a\x06U\x82a\x05\xB8V[\x93\x92PPPV[`\0\x80`@\x83\x85\x03\x12\x15a\x06oW`\0\x80\xFD[a\x06x\x83a\x05\xB8V[\x91Pa\x06\x86` \x84\x01a\x05\xB8V[\x90P\x92P\x92\x90PV[`\x01\x81\x81\x1C\x90\x82\x16\x80a\x06\xA3W`\x7F\x82\x16\x91P[` \x82\x10\x81\x03a\x06\xC3WcNH{q`\xE0\x1B`\0R`\"`\x04R`$`\0\xFD[P\x91\x90PV[\x80\x82\x01\x80\x82\x11\x15a\x020WcNH{q`\xE0\x1B`\0R`\x11`\x04R`$`\0\xFD\xFE\xA2dipfsX\"\x12 \x870.B\xA6c\xFD`y\xCA\xF7o\xF4\xBF\xA3\x1E\xB5\xD9L=\r\x9F`Y:\xF4)h\x07\xC1\\\x1AdsolcC\0\x08\x14\x003"; - /// The deployed bytecode of the contract. - pub static MOCKTOKEN_DEPLOYED_BYTECODE: ::ethers::core::types::Bytes = - ::ethers::core::types::Bytes::from_static(__DEPLOYED_BYTECODE); - pub struct MockToken(::ethers::contract::Contract); - impl ::core::clone::Clone for MockToken { - fn clone(&self) -> Self { - Self(::core::clone::Clone::clone(&self.0)) - } - } - impl ::core::ops::Deref for MockToken { - type Target = ::ethers::contract::Contract; - fn deref(&self) -> &Self::Target { - &self.0 - } - } - impl ::core::ops::DerefMut for MockToken { - fn deref_mut(&mut self) -> &mut Self::Target { - &mut self.0 - } - } - impl ::core::fmt::Debug for MockToken { - fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { - f.debug_tuple(::core::stringify!(MockToken)) - .field(&self.address()) - .finish() - } - } - impl MockToken { - /// 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(), - MOCKTOKEN_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( - MOCKTOKEN_ABI.clone(), - MOCKTOKEN_BYTECODE.clone().into(), - client, - ); - let deployer = factory.deploy(constructor_args)?; - let deployer = ::ethers::contract::ContractDeployer::new(deployer); - Ok(deployer) - } - ///Calls the contract's `allowance` (0xdd62ed3e) function - pub fn allowance( - &self, - owner: ::ethers::core::types::Address, - spender: ::ethers::core::types::Address, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([221, 98, 237, 62], (owner, spender)) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `approve` (0x095ea7b3) function - pub fn approve( - &self, - spender: ::ethers::core::types::Address, - value: ::ethers::core::types::U256, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([9, 94, 167, 179], (spender, value)) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `balanceOf` (0x70a08231) function - pub fn balance_of( - &self, - account: ::ethers::core::types::Address, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([112, 160, 130, 49], account) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `decimals` (0x313ce567) function - pub fn decimals(&self) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([49, 60, 229, 103], ()) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `name` (0x06fdde03) function - pub fn name(&self) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([6, 253, 222, 3], ()) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `symbol` (0x95d89b41) function - pub fn symbol( - &self, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([149, 216, 155, 65], ()) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `totalSupply` (0x18160ddd) function - pub fn total_supply( - &self, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([24, 22, 13, 221], ()) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `transfer` (0xa9059cbb) function - pub fn transfer( - &self, - to: ::ethers::core::types::Address, - value: ::ethers::core::types::U256, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([169, 5, 156, 187], (to, value)) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `transferFrom` (0x23b872dd) function - pub fn transfer_from( - &self, - from: ::ethers::core::types::Address, - to: ::ethers::core::types::Address, - value: ::ethers::core::types::U256, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([35, 184, 114, 221], (from, to, value)) - .expect("method not found (this should never happen)") - } - ///Gets the contract's `Approval` event - pub fn approval_filter( - &self, - ) -> ::ethers::contract::builders::Event<::std::sync::Arc, M, ApprovalFilter> { - self.0.event() - } - ///Gets the contract's `Transfer` event - pub fn transfer_filter( - &self, - ) -> ::ethers::contract::builders::Event<::std::sync::Arc, M, TransferFilter> { - 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, MockTokenEvents> { - self.0 - .event_with_filter(::core::default::Default::default()) - } - } - impl From<::ethers::contract::Contract> for MockToken { - fn from(contract: ::ethers::contract::Contract) -> Self { - Self::new(contract.address(), contract.client()) - } - } - ///Custom Error type `ERC20InsufficientAllowance` with signature `ERC20InsufficientAllowance(address,uint256,uint256)` and selector `0xfb8f41b2` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[etherror( - name = "ERC20InsufficientAllowance", - abi = "ERC20InsufficientAllowance(address,uint256,uint256)" - )] - pub struct ERC20InsufficientAllowance { - pub spender: ::ethers::core::types::Address, - pub allowance: ::ethers::core::types::U256, - pub needed: ::ethers::core::types::U256, - } - ///Custom Error type `ERC20InsufficientBalance` with signature `ERC20InsufficientBalance(address,uint256,uint256)` and selector `0xe450d38c` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[etherror( - name = "ERC20InsufficientBalance", - abi = "ERC20InsufficientBalance(address,uint256,uint256)" - )] - pub struct ERC20InsufficientBalance { - pub sender: ::ethers::core::types::Address, - pub balance: ::ethers::core::types::U256, - pub needed: ::ethers::core::types::U256, - } - ///Custom Error type `ERC20InvalidApprover` with signature `ERC20InvalidApprover(address)` and selector `0xe602df05` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[etherror(name = "ERC20InvalidApprover", abi = "ERC20InvalidApprover(address)")] - pub struct ERC20InvalidApprover { - pub approver: ::ethers::core::types::Address, - } - ///Custom Error type `ERC20InvalidReceiver` with signature `ERC20InvalidReceiver(address)` and selector `0xec442f05` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[etherror(name = "ERC20InvalidReceiver", abi = "ERC20InvalidReceiver(address)")] - pub struct ERC20InvalidReceiver { - pub receiver: ::ethers::core::types::Address, - } - ///Custom Error type `ERC20InvalidSender` with signature `ERC20InvalidSender(address)` and selector `0x96c6fd1e` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[etherror(name = "ERC20InvalidSender", abi = "ERC20InvalidSender(address)")] - pub struct ERC20InvalidSender { - pub sender: ::ethers::core::types::Address, - } - ///Custom Error type `ERC20InvalidSpender` with signature `ERC20InvalidSpender(address)` and selector `0x94280d62` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[etherror(name = "ERC20InvalidSpender", abi = "ERC20InvalidSpender(address)")] - pub struct ERC20InvalidSpender { - pub spender: ::ethers::core::types::Address, - } - ///Container type for all of the contract's custom errors - #[derive( - Clone, - ::ethers::contract::EthAbiType, - serde::Serialize, - serde::Deserialize, - Debug, - PartialEq, - Eq, - Hash, - )] - pub enum MockTokenErrors { - ERC20InsufficientAllowance(ERC20InsufficientAllowance), - ERC20InsufficientBalance(ERC20InsufficientBalance), - ERC20InvalidApprover(ERC20InvalidApprover), - ERC20InvalidReceiver(ERC20InvalidReceiver), - ERC20InvalidSender(ERC20InvalidSender), - ERC20InvalidSpender(ERC20InvalidSpender), - /// The standard solidity revert string, with selector - /// Error(string) -- 0x08c379a0 - RevertString(::std::string::String), - } - impl ::ethers::core::abi::AbiDecode for MockTokenErrors { - fn decode( - data: impl AsRef<[u8]>, - ) -> ::core::result::Result { - let data = data.as_ref(); - if let Ok(decoded) = - <::std::string::String as ::ethers::core::abi::AbiDecode>::decode(data) - { - return Ok(Self::RevertString(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::ERC20InsufficientAllowance(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::ERC20InsufficientBalance(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::ERC20InvalidApprover(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::ERC20InvalidReceiver(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::ERC20InvalidSender(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::ERC20InvalidSpender(decoded)); - } - Err(::ethers::core::abi::Error::InvalidData.into()) - } - } - impl ::ethers::core::abi::AbiEncode for MockTokenErrors { - fn encode(self) -> ::std::vec::Vec { - match self { - Self::ERC20InsufficientAllowance(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::ERC20InsufficientBalance(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::ERC20InvalidApprover(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::ERC20InvalidReceiver(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::ERC20InvalidSender(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::ERC20InvalidSpender(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::RevertString(s) => ::ethers::core::abi::AbiEncode::encode(s), - } - } - } - impl ::ethers::contract::ContractRevert for MockTokenErrors { - fn valid_selector(selector: [u8; 4]) -> bool { - match selector { - [0x08, 0xc3, 0x79, 0xa0] => true, - _ if selector - == ::selector() => - { - true - } - _ if selector - == ::selector() => - { - true - } - _ if selector - == ::selector() => - { - true - } - _ if selector - == ::selector() => - { - true - } - _ if selector - == ::selector() => - { - true - } - _ if selector - == ::selector() => - { - true - } - _ => false, - } - } - } - impl ::core::fmt::Display for MockTokenErrors { - fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { - match self { - Self::ERC20InsufficientAllowance(element) => ::core::fmt::Display::fmt(element, f), - Self::ERC20InsufficientBalance(element) => ::core::fmt::Display::fmt(element, f), - Self::ERC20InvalidApprover(element) => ::core::fmt::Display::fmt(element, f), - Self::ERC20InvalidReceiver(element) => ::core::fmt::Display::fmt(element, f), - Self::ERC20InvalidSender(element) => ::core::fmt::Display::fmt(element, f), - Self::ERC20InvalidSpender(element) => ::core::fmt::Display::fmt(element, f), - Self::RevertString(s) => ::core::fmt::Display::fmt(s, f), - } - } - } - impl ::core::convert::From<::std::string::String> for MockTokenErrors { - fn from(value: String) -> Self { - Self::RevertString(value) - } - } - impl ::core::convert::From for MockTokenErrors { - fn from(value: ERC20InsufficientAllowance) -> Self { - Self::ERC20InsufficientAllowance(value) - } - } - impl ::core::convert::From for MockTokenErrors { - fn from(value: ERC20InsufficientBalance) -> Self { - Self::ERC20InsufficientBalance(value) - } - } - impl ::core::convert::From for MockTokenErrors { - fn from(value: ERC20InvalidApprover) -> Self { - Self::ERC20InvalidApprover(value) - } - } - impl ::core::convert::From for MockTokenErrors { - fn from(value: ERC20InvalidReceiver) -> Self { - Self::ERC20InvalidReceiver(value) - } - } - impl ::core::convert::From for MockTokenErrors { - fn from(value: ERC20InvalidSender) -> Self { - Self::ERC20InvalidSender(value) - } - } - impl ::core::convert::From for MockTokenErrors { - fn from(value: ERC20InvalidSpender) -> Self { - Self::ERC20InvalidSpender(value) - } - } - #[derive( - Clone, - ::ethers::contract::EthEvent, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethevent(name = "Approval", abi = "Approval(address,address,uint256)")] - pub struct ApprovalFilter { - #[ethevent(indexed)] - pub owner: ::ethers::core::types::Address, - #[ethevent(indexed)] - pub spender: ::ethers::core::types::Address, - pub value: ::ethers::core::types::U256, - } - #[derive( - Clone, - ::ethers::contract::EthEvent, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethevent(name = "Transfer", abi = "Transfer(address,address,uint256)")] - pub struct TransferFilter { - #[ethevent(indexed)] - pub from: ::ethers::core::types::Address, - #[ethevent(indexed)] - pub to: ::ethers::core::types::Address, - pub value: ::ethers::core::types::U256, - } - ///Container type for all of the contract's events - #[derive( - Clone, - ::ethers::contract::EthAbiType, - serde::Serialize, - serde::Deserialize, - Debug, - PartialEq, - Eq, - Hash, - )] - pub enum MockTokenEvents { - ApprovalFilter(ApprovalFilter), - TransferFilter(TransferFilter), - } - impl ::ethers::contract::EthLogDecode for MockTokenEvents { - fn decode_log( - log: &::ethers::core::abi::RawLog, - ) -> ::core::result::Result { - if let Ok(decoded) = ApprovalFilter::decode_log(log) { - return Ok(MockTokenEvents::ApprovalFilter(decoded)); - } - if let Ok(decoded) = TransferFilter::decode_log(log) { - return Ok(MockTokenEvents::TransferFilter(decoded)); - } - Err(::ethers::core::abi::Error::InvalidData) - } - } - impl ::core::fmt::Display for MockTokenEvents { - fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { - match self { - Self::ApprovalFilter(element) => ::core::fmt::Display::fmt(element, f), - Self::TransferFilter(element) => ::core::fmt::Display::fmt(element, f), - } - } - } - impl ::core::convert::From for MockTokenEvents { - fn from(value: ApprovalFilter) -> Self { - Self::ApprovalFilter(value) - } - } - impl ::core::convert::From for MockTokenEvents { - fn from(value: TransferFilter) -> Self { - Self::TransferFilter(value) - } - } - ///Container type for all input parameters for the `allowance` function with signature `allowance(address,address)` and selector `0xdd62ed3e` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "allowance", abi = "allowance(address,address)")] - pub struct AllowanceCall { - pub owner: ::ethers::core::types::Address, - pub spender: ::ethers::core::types::Address, - } - ///Container type for all input parameters for the `approve` function with signature `approve(address,uint256)` and selector `0x095ea7b3` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "approve", abi = "approve(address,uint256)")] - pub struct ApproveCall { - pub spender: ::ethers::core::types::Address, - pub value: ::ethers::core::types::U256, - } - ///Container type for all input parameters for the `balanceOf` function with signature `balanceOf(address)` and selector `0x70a08231` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "balanceOf", abi = "balanceOf(address)")] - pub struct BalanceOfCall { - pub account: ::ethers::core::types::Address, - } - ///Container type for all input parameters for the `decimals` function with signature `decimals()` and selector `0x313ce567` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "decimals", abi = "decimals()")] - pub struct DecimalsCall; - ///Container type for all input parameters for the `name` function with signature `name()` and selector `0x06fdde03` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "name", abi = "name()")] - pub struct NameCall; - ///Container type for all input parameters for the `symbol` function with signature `symbol()` and selector `0x95d89b41` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "symbol", abi = "symbol()")] - pub struct SymbolCall; - ///Container type for all input parameters for the `totalSupply` function with signature `totalSupply()` and selector `0x18160ddd` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "totalSupply", abi = "totalSupply()")] - pub struct TotalSupplyCall; - ///Container type for all input parameters for the `transfer` function with signature `transfer(address,uint256)` and selector `0xa9059cbb` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "transfer", abi = "transfer(address,uint256)")] - pub struct TransferCall { - pub to: ::ethers::core::types::Address, - pub value: ::ethers::core::types::U256, - } - ///Container type for all input parameters for the `transferFrom` function with signature `transferFrom(address,address,uint256)` and selector `0x23b872dd` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "transferFrom", abi = "transferFrom(address,address,uint256)")] - pub struct TransferFromCall { - pub from: ::ethers::core::types::Address, - pub to: ::ethers::core::types::Address, - pub value: ::ethers::core::types::U256, - } - ///Container type for all of the contract's call - #[derive( - Clone, - ::ethers::contract::EthAbiType, - serde::Serialize, - serde::Deserialize, - Debug, - PartialEq, - Eq, - Hash, - )] - pub enum MockTokenCalls { - Allowance(AllowanceCall), - Approve(ApproveCall), - BalanceOf(BalanceOfCall), - Decimals(DecimalsCall), - Name(NameCall), - Symbol(SymbolCall), - TotalSupply(TotalSupplyCall), - Transfer(TransferCall), - TransferFrom(TransferFromCall), - } - impl ::ethers::core::abi::AbiDecode for MockTokenCalls { - fn decode( - data: impl AsRef<[u8]>, - ) -> ::core::result::Result { - let data = data.as_ref(); - if let Ok(decoded) = ::decode(data) { - return Ok(Self::Allowance(decoded)); - } - if let Ok(decoded) = ::decode(data) { - return Ok(Self::Approve(decoded)); - } - if let Ok(decoded) = ::decode(data) { - return Ok(Self::BalanceOf(decoded)); - } - if let Ok(decoded) = ::decode(data) { - return Ok(Self::Decimals(decoded)); - } - if let Ok(decoded) = ::decode(data) { - return Ok(Self::Name(decoded)); - } - if let Ok(decoded) = ::decode(data) { - return Ok(Self::Symbol(decoded)); - } - if let Ok(decoded) = ::decode(data) { - return Ok(Self::TotalSupply(decoded)); - } - if let Ok(decoded) = ::decode(data) { - return Ok(Self::Transfer(decoded)); - } - if let Ok(decoded) = ::decode(data) - { - return Ok(Self::TransferFrom(decoded)); - } - Err(::ethers::core::abi::Error::InvalidData.into()) - } - } - impl ::ethers::core::abi::AbiEncode for MockTokenCalls { - fn encode(self) -> Vec { - match self { - Self::Allowance(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::Approve(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::BalanceOf(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::Decimals(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::Name(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::Symbol(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::TotalSupply(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::Transfer(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::TransferFrom(element) => ::ethers::core::abi::AbiEncode::encode(element), - } - } - } - impl ::core::fmt::Display for MockTokenCalls { - fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { - match self { - Self::Allowance(element) => ::core::fmt::Display::fmt(element, f), - Self::Approve(element) => ::core::fmt::Display::fmt(element, f), - Self::BalanceOf(element) => ::core::fmt::Display::fmt(element, f), - Self::Decimals(element) => ::core::fmt::Display::fmt(element, f), - Self::Name(element) => ::core::fmt::Display::fmt(element, f), - Self::Symbol(element) => ::core::fmt::Display::fmt(element, f), - Self::TotalSupply(element) => ::core::fmt::Display::fmt(element, f), - Self::Transfer(element) => ::core::fmt::Display::fmt(element, f), - Self::TransferFrom(element) => ::core::fmt::Display::fmt(element, f), - } - } - } - impl ::core::convert::From for MockTokenCalls { - fn from(value: AllowanceCall) -> Self { - Self::Allowance(value) - } - } - impl ::core::convert::From for MockTokenCalls { - fn from(value: ApproveCall) -> Self { - Self::Approve(value) - } - } - impl ::core::convert::From for MockTokenCalls { - fn from(value: BalanceOfCall) -> Self { - Self::BalanceOf(value) - } - } - impl ::core::convert::From for MockTokenCalls { - fn from(value: DecimalsCall) -> Self { - Self::Decimals(value) - } - } - impl ::core::convert::From for MockTokenCalls { - fn from(value: NameCall) -> Self { - Self::Name(value) - } - } - impl ::core::convert::From for MockTokenCalls { - fn from(value: SymbolCall) -> Self { - Self::Symbol(value) - } - } - impl ::core::convert::From for MockTokenCalls { - fn from(value: TotalSupplyCall) -> Self { - Self::TotalSupply(value) - } - } - impl ::core::convert::From for MockTokenCalls { - fn from(value: TransferCall) -> Self { - Self::Transfer(value) - } - } - impl ::core::convert::From for MockTokenCalls { - fn from(value: TransferFromCall) -> Self { - Self::TransferFrom(value) - } - } - ///Container type for all return fields from the `allowance` function with signature `allowance(address,address)` and selector `0xdd62ed3e` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct AllowanceReturn(pub ::ethers::core::types::U256); - ///Container type for all return fields from the `approve` function with signature `approve(address,uint256)` and selector `0x095ea7b3` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct ApproveReturn(pub bool); - ///Container type for all return fields from the `balanceOf` function with signature `balanceOf(address)` and selector `0x70a08231` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct BalanceOfReturn(pub ::ethers::core::types::U256); - ///Container type for all return fields from the `decimals` function with signature `decimals()` and selector `0x313ce567` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct DecimalsReturn(pub u8); - ///Container type for all return fields from the `name` function with signature `name()` and selector `0x06fdde03` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct NameReturn(pub ::std::string::String); - ///Container type for all return fields from the `symbol` function with signature `symbol()` and selector `0x95d89b41` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct SymbolReturn(pub ::std::string::String); - ///Container type for all return fields from the `totalSupply` function with signature `totalSupply()` and selector `0x18160ddd` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct TotalSupplyReturn(pub ::ethers::core::types::U256); - ///Container type for all return fields from the `transfer` function with signature `transfer(address,uint256)` and selector `0xa9059cbb` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct TransferReturn(pub bool); - ///Container type for all return fields from the `transferFrom` function with signature `transferFrom(address,address,uint256)` and selector `0x23b872dd` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct TransferFromReturn(pub bool); -} diff --git a/bindings/src/mock_verifier.rs b/bindings/src/mock_verifier.rs deleted file mode 100644 index fdc35a5..0000000 --- a/bindings/src/mock_verifier.rs +++ /dev/null @@ -1,699 +0,0 @@ -pub use mock_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 mock_verifier { - #[allow(deprecated)] - fn __abi() -> ::ethers::core::abi::Abi { - ::ethers::core::abi::ethabi::Contract { - constructor: ::core::option::Option::None, - functions: ::core::convert::From::from([ - ( - ::std::borrow::ToOwned::to_owned("checkSampleInputsAndProof"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("checkSampleInputsAndProof",), - inputs: ::std::vec![], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Bool, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bool"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::Pure, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("proofMarketplace"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("proofMarketplace"), - inputs: ::std::vec![], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("contract ProofMarketplace",), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("sampleInput"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("sampleInput"), - inputs: ::std::vec![], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Bytes, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("sampleProof"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("sampleProof"), - inputs: ::std::vec![], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Bytes, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("setProofMarketplaceContract"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("setProofMarketplaceContract",), - inputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("_proofMarketplace"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("contract ProofMarketplace",), - ), - },], - outputs: ::std::vec![], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("verify"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("verify"), - inputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Bytes, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes"), - ), - },], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Bool, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bool"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::Pure, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("verifyAgainstSampleInputs"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("verifyAgainstSampleInputs",), - inputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Bytes, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes"), - ), - },], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Bool, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bool"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::Pure, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("verifyInputs"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("verifyInputs"), - inputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Bytes, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes"), - ), - },], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Bool, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bool"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::Pure, - },], - ), - ]), - events: ::std::collections::BTreeMap::new(), - errors: ::std::collections::BTreeMap::new(), - receive: false, - fallback: false, - } - } - ///The parsed JSON ABI of the contract. - pub static MOCKVERIFIER_ABI: ::ethers::contract::Lazy<::ethers::core::abi::Abi> = - ::ethers::contract::Lazy::new(__abi); - #[rustfmt::skip] - const __BYTECODE: &[u8] = b"`\x80`@R4\x80\x15a\0\x10W`\0\x80\xFD[Pa\x04_\x80a\0 `\09`\0\xF3\xFE`\x80`@R4\x80\x15a\0\x10W`\0\x80\xFD[P`\x046\x10a\0\x88W`\x005`\xE0\x1C\x80c\x81\xC4\\p\x11a\0[W\x80c\x81\xC4\\p\x14a\0\xE7W\x80c\x8Ev\n\xFE\x14a\x01\x12W\x80c\xA6\xDF\xBC\x7F\x14a\x01\x12W\x80c\xA7l\x05Q\x14a\x01(W`\0\x80\xFD[\x80c\x02\xF7}\x19\x14a\0\x8DW\x80c\x05m\xE7\x04\x14a\0\xB6W\x80c\x10\xA5By\x14a\0\xCBW\x80c}\x8A\xD4+\x14a\0\xD2W[`\0\x80\xFD[a\0\xA1a\0\x9B6`\x04a\x02NV[P`\x01\x90V[`@Q\x90\x15\x15\x81R` \x01[`@Q\x80\x91\x03\x90\xF3[a\0\xC9a\0\xC46`\x04a\x02\xFFV[a\x010V[\0[`\x01a\0\xA1V[a\0\xDAa\x01\x9DV[`@Qa\0\xAD\x91\x90a\x03/V[`\0Ta\0\xFA\x90`\x01`\x01`\xA0\x1B\x03\x16\x81V[`@Q`\x01`\x01`\xA0\x1B\x03\x90\x91\x16\x81R` \x01a\0\xADV[a\0\xA1a\x01 6`\x04a\x03}V[`\x01\x92\x91PPV[a\0\xDAa\x02+V[`\0T`\x01`\x01`\xA0\x1B\x03\x16\x15a\x01{W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x0B`$\x82\x01Rj\x10[\x1C\x99XY\x1EH\x14\xD9]`\xAA\x1B`D\x82\x01R`d\x01`@Q\x80\x91\x03\x90\xFD[`\0\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16`\x01`\x01`\xA0\x1B\x03\x92\x90\x92\x16\x91\x90\x91\x17\x90UV[`\x01\x80Ta\x01\xAA\x90a\x03\xEFV[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\x01\xD6\x90a\x03\xEFV[\x80\x15a\x02#W\x80`\x1F\x10a\x01\xF8Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\x02#V[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\x02\x06W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81V[`\x02\x80Ta\x01\xAA\x90a\x03\xEFV[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`\0` \x82\x84\x03\x12\x15a\x02`W`\0\x80\xFD[\x815g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x11\x15a\x02xW`\0\x80\xFD[\x81\x84\x01\x91P\x84`\x1F\x83\x01\x12a\x02\x8CW`\0\x80\xFD[\x815\x81\x81\x11\x15a\x02\x9EWa\x02\x9Ea\x028V[`@Q`\x1F\x82\x01`\x1F\x19\x90\x81\x16`?\x01\x16\x81\x01\x90\x83\x82\x11\x81\x83\x10\x17\x15a\x02\xC6Wa\x02\xC6a\x028V[\x81`@R\x82\x81R\x87` \x84\x87\x01\x01\x11\x15a\x02\xDFW`\0\x80\xFD[\x82` \x86\x01` \x83\x017`\0\x92\x81\x01` \x01\x92\x90\x92RP\x95\x94PPPPPV[`\0` \x82\x84\x03\x12\x15a\x03\x11W`\0\x80\xFD[\x815`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a\x03(W`\0\x80\xFD[\x93\x92PPPV[`\0` \x80\x83R\x83Q\x80\x82\x85\x01R`\0[\x81\x81\x10\x15a\x03\\W\x85\x81\x01\x83\x01Q\x85\x82\x01`@\x01R\x82\x01a\x03@V[P`\0`@\x82\x86\x01\x01R`@`\x1F\x19`\x1F\x83\x01\x16\x85\x01\x01\x92PPP\x92\x91PPV[`\0\x80` \x83\x85\x03\x12\x15a\x03\x90W`\0\x80\xFD[\x825g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x11\x15a\x03\xA8W`\0\x80\xFD[\x81\x85\x01\x91P\x85`\x1F\x83\x01\x12a\x03\xBCW`\0\x80\xFD[\x815\x81\x81\x11\x15a\x03\xCBW`\0\x80\xFD[\x86` \x82\x85\x01\x01\x11\x15a\x03\xDDW`\0\x80\xFD[` \x92\x90\x92\x01\x96\x91\x95P\x90\x93PPPPV[`\x01\x81\x81\x1C\x90\x82\x16\x80a\x04\x03W`\x7F\x82\x16\x91P[` \x82\x10\x81\x03a\x04#WcNH{q`\xE0\x1B`\0R`\"`\x04R`$`\0\xFD[P\x91\x90PV\xFE\xA2dipfsX\"\x12 \xC7b\xDE,\x89\xB4y\xF5\xAC\xE6\xB6\x8A\xFF2\xAE\xA4\x03\x99\x1B\xA2{\xE4\x9C\x8E\x98\xD6\x7F\x93\xD2*\x1B\x14dsolcC\0\x08\x14\x003"; - /// The bytecode of the contract. - pub static MOCKVERIFIER_BYTECODE: ::ethers::core::types::Bytes = - ::ethers::core::types::Bytes::from_static(__BYTECODE); - #[rustfmt::skip] - const __DEPLOYED_BYTECODE: &[u8] = b"`\x80`@R4\x80\x15a\0\x10W`\0\x80\xFD[P`\x046\x10a\0\x88W`\x005`\xE0\x1C\x80c\x81\xC4\\p\x11a\0[W\x80c\x81\xC4\\p\x14a\0\xE7W\x80c\x8Ev\n\xFE\x14a\x01\x12W\x80c\xA6\xDF\xBC\x7F\x14a\x01\x12W\x80c\xA7l\x05Q\x14a\x01(W`\0\x80\xFD[\x80c\x02\xF7}\x19\x14a\0\x8DW\x80c\x05m\xE7\x04\x14a\0\xB6W\x80c\x10\xA5By\x14a\0\xCBW\x80c}\x8A\xD4+\x14a\0\xD2W[`\0\x80\xFD[a\0\xA1a\0\x9B6`\x04a\x02NV[P`\x01\x90V[`@Q\x90\x15\x15\x81R` \x01[`@Q\x80\x91\x03\x90\xF3[a\0\xC9a\0\xC46`\x04a\x02\xFFV[a\x010V[\0[`\x01a\0\xA1V[a\0\xDAa\x01\x9DV[`@Qa\0\xAD\x91\x90a\x03/V[`\0Ta\0\xFA\x90`\x01`\x01`\xA0\x1B\x03\x16\x81V[`@Q`\x01`\x01`\xA0\x1B\x03\x90\x91\x16\x81R` \x01a\0\xADV[a\0\xA1a\x01 6`\x04a\x03}V[`\x01\x92\x91PPV[a\0\xDAa\x02+V[`\0T`\x01`\x01`\xA0\x1B\x03\x16\x15a\x01{W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x0B`$\x82\x01Rj\x10[\x1C\x99XY\x1EH\x14\xD9]`\xAA\x1B`D\x82\x01R`d\x01`@Q\x80\x91\x03\x90\xFD[`\0\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16`\x01`\x01`\xA0\x1B\x03\x92\x90\x92\x16\x91\x90\x91\x17\x90UV[`\x01\x80Ta\x01\xAA\x90a\x03\xEFV[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\x01\xD6\x90a\x03\xEFV[\x80\x15a\x02#W\x80`\x1F\x10a\x01\xF8Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\x02#V[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\x02\x06W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81V[`\x02\x80Ta\x01\xAA\x90a\x03\xEFV[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`\0` \x82\x84\x03\x12\x15a\x02`W`\0\x80\xFD[\x815g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x11\x15a\x02xW`\0\x80\xFD[\x81\x84\x01\x91P\x84`\x1F\x83\x01\x12a\x02\x8CW`\0\x80\xFD[\x815\x81\x81\x11\x15a\x02\x9EWa\x02\x9Ea\x028V[`@Q`\x1F\x82\x01`\x1F\x19\x90\x81\x16`?\x01\x16\x81\x01\x90\x83\x82\x11\x81\x83\x10\x17\x15a\x02\xC6Wa\x02\xC6a\x028V[\x81`@R\x82\x81R\x87` \x84\x87\x01\x01\x11\x15a\x02\xDFW`\0\x80\xFD[\x82` \x86\x01` \x83\x017`\0\x92\x81\x01` \x01\x92\x90\x92RP\x95\x94PPPPPV[`\0` \x82\x84\x03\x12\x15a\x03\x11W`\0\x80\xFD[\x815`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a\x03(W`\0\x80\xFD[\x93\x92PPPV[`\0` \x80\x83R\x83Q\x80\x82\x85\x01R`\0[\x81\x81\x10\x15a\x03\\W\x85\x81\x01\x83\x01Q\x85\x82\x01`@\x01R\x82\x01a\x03@V[P`\0`@\x82\x86\x01\x01R`@`\x1F\x19`\x1F\x83\x01\x16\x85\x01\x01\x92PPP\x92\x91PPV[`\0\x80` \x83\x85\x03\x12\x15a\x03\x90W`\0\x80\xFD[\x825g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x11\x15a\x03\xA8W`\0\x80\xFD[\x81\x85\x01\x91P\x85`\x1F\x83\x01\x12a\x03\xBCW`\0\x80\xFD[\x815\x81\x81\x11\x15a\x03\xCBW`\0\x80\xFD[\x86` \x82\x85\x01\x01\x11\x15a\x03\xDDW`\0\x80\xFD[` \x92\x90\x92\x01\x96\x91\x95P\x90\x93PPPPV[`\x01\x81\x81\x1C\x90\x82\x16\x80a\x04\x03W`\x7F\x82\x16\x91P[` \x82\x10\x81\x03a\x04#WcNH{q`\xE0\x1B`\0R`\"`\x04R`$`\0\xFD[P\x91\x90PV\xFE\xA2dipfsX\"\x12 \xC7b\xDE,\x89\xB4y\xF5\xAC\xE6\xB6\x8A\xFF2\xAE\xA4\x03\x99\x1B\xA2{\xE4\x9C\x8E\x98\xD6\x7F\x93\xD2*\x1B\x14dsolcC\0\x08\x14\x003"; - /// The deployed bytecode of the contract. - pub static MOCKVERIFIER_DEPLOYED_BYTECODE: ::ethers::core::types::Bytes = - ::ethers::core::types::Bytes::from_static(__DEPLOYED_BYTECODE); - pub struct MockVerifier(::ethers::contract::Contract); - impl ::core::clone::Clone for MockVerifier { - fn clone(&self) -> Self { - Self(::core::clone::Clone::clone(&self.0)) - } - } - impl ::core::ops::Deref for MockVerifier { - type Target = ::ethers::contract::Contract; - fn deref(&self) -> &Self::Target { - &self.0 - } - } - impl ::core::ops::DerefMut for MockVerifier { - fn deref_mut(&mut self) -> &mut Self::Target { - &mut self.0 - } - } - impl ::core::fmt::Debug for MockVerifier { - fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { - f.debug_tuple(::core::stringify!(MockVerifier)) - .field(&self.address()) - .finish() - } - } - impl MockVerifier { - /// 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(), - MOCKVERIFIER_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( - MOCKVERIFIER_ABI.clone(), - MOCKVERIFIER_BYTECODE.clone().into(), - client, - ); - let deployer = factory.deploy(constructor_args)?; - let deployer = ::ethers::contract::ContractDeployer::new(deployer); - Ok(deployer) - } - ///Calls the contract's `checkSampleInputsAndProof` (0x10a54279) function - pub fn check_sample_inputs_and_proof( - &self, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([16, 165, 66, 121], ()) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `proofMarketplace` (0x81c45c70) function - pub fn proof_marketplace( - &self, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([129, 196, 92, 112], ()) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `sampleInput` (0x7d8ad42b) function - pub fn sample_input( - &self, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([125, 138, 212, 43], ()) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `sampleProof` (0xa76c0551) function - pub fn sample_proof( - &self, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([167, 108, 5, 81], ()) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `setProofMarketplaceContract` (0x056de704) function - pub fn set_proof_marketplace_contract( - &self, - proof_marketplace: ::ethers::core::types::Address, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([5, 109, 231, 4], proof_marketplace) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `verify` (0x8e760afe) function - pub fn verify( - &self, - p0: ::ethers::core::types::Bytes, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([142, 118, 10, 254], p0) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `verifyAgainstSampleInputs` (0x02f77d19) function - pub fn verify_against_sample_inputs( - &self, - p0: ::ethers::core::types::Bytes, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([2, 247, 125, 25], p0) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `verifyInputs` (0xa6dfbc7f) function - pub fn verify_inputs( - &self, - p0: ::ethers::core::types::Bytes, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([166, 223, 188, 127], p0) - .expect("method not found (this should never happen)") - } - } - impl From<::ethers::contract::Contract> for MockVerifier { - fn from(contract: ::ethers::contract::Contract) -> Self { - Self::new(contract.address(), contract.client()) - } - } - ///Container type for all input parameters for the `checkSampleInputsAndProof` function with signature `checkSampleInputsAndProof()` and selector `0x10a54279` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall( - name = "checkSampleInputsAndProof", - abi = "checkSampleInputsAndProof()" - )] - pub struct CheckSampleInputsAndProofCall; - ///Container type for all input parameters for the `proofMarketplace` function with signature `proofMarketplace()` and selector `0x81c45c70` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "proofMarketplace", abi = "proofMarketplace()")] - pub struct ProofMarketplaceCall; - ///Container type for all input parameters for the `sampleInput` function with signature `sampleInput()` and selector `0x7d8ad42b` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "sampleInput", abi = "sampleInput()")] - pub struct SampleInputCall; - ///Container type for all input parameters for the `sampleProof` function with signature `sampleProof()` and selector `0xa76c0551` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "sampleProof", abi = "sampleProof()")] - pub struct SampleProofCall; - ///Container type for all input parameters for the `setProofMarketplaceContract` function with signature `setProofMarketplaceContract(address)` and selector `0x056de704` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall( - name = "setProofMarketplaceContract", - abi = "setProofMarketplaceContract(address)" - )] - pub struct SetProofMarketplaceContractCall { - pub proof_marketplace: ::ethers::core::types::Address, - } - ///Container type for all input parameters for the `verify` function with signature `verify(bytes)` and selector `0x8e760afe` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "verify", abi = "verify(bytes)")] - pub struct VerifyCall(pub ::ethers::core::types::Bytes); - ///Container type for all input parameters for the `verifyAgainstSampleInputs` function with signature `verifyAgainstSampleInputs(bytes)` and selector `0x02f77d19` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall( - name = "verifyAgainstSampleInputs", - abi = "verifyAgainstSampleInputs(bytes)" - )] - pub struct VerifyAgainstSampleInputsCall(pub ::ethers::core::types::Bytes); - ///Container type for all input parameters for the `verifyInputs` function with signature `verifyInputs(bytes)` and selector `0xa6dfbc7f` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "verifyInputs", abi = "verifyInputs(bytes)")] - pub struct VerifyInputsCall(pub ::ethers::core::types::Bytes); - ///Container type for all of the contract's call - #[derive( - Clone, - ::ethers::contract::EthAbiType, - serde::Serialize, - serde::Deserialize, - Debug, - PartialEq, - Eq, - Hash, - )] - pub enum MockVerifierCalls { - CheckSampleInputsAndProof(CheckSampleInputsAndProofCall), - ProofMarketplace(ProofMarketplaceCall), - SampleInput(SampleInputCall), - SampleProof(SampleProofCall), - SetProofMarketplaceContract(SetProofMarketplaceContractCall), - Verify(VerifyCall), - VerifyAgainstSampleInputs(VerifyAgainstSampleInputsCall), - VerifyInputs(VerifyInputsCall), - } - impl ::ethers::core::abi::AbiDecode for MockVerifierCalls { - fn decode( - data: impl AsRef<[u8]>, - ) -> ::core::result::Result { - let data = data.as_ref(); - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::CheckSampleInputsAndProof(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::ProofMarketplace(decoded)); - } - if let Ok(decoded) = ::decode(data) { - return Ok(Self::SampleInput(decoded)); - } - if let Ok(decoded) = ::decode(data) { - return Ok(Self::SampleProof(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::SetProofMarketplaceContract(decoded)); - } - if let Ok(decoded) = ::decode(data) { - return Ok(Self::Verify(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::VerifyAgainstSampleInputs(decoded)); - } - if let Ok(decoded) = ::decode(data) - { - return Ok(Self::VerifyInputs(decoded)); - } - Err(::ethers::core::abi::Error::InvalidData.into()) - } - } - impl ::ethers::core::abi::AbiEncode for MockVerifierCalls { - fn encode(self) -> Vec { - match self { - Self::CheckSampleInputsAndProof(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::ProofMarketplace(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::SampleInput(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::SampleProof(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::SetProofMarketplaceContract(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::Verify(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::VerifyAgainstSampleInputs(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::VerifyInputs(element) => ::ethers::core::abi::AbiEncode::encode(element), - } - } - } - impl ::core::fmt::Display for MockVerifierCalls { - fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { - match self { - Self::CheckSampleInputsAndProof(element) => ::core::fmt::Display::fmt(element, f), - Self::ProofMarketplace(element) => ::core::fmt::Display::fmt(element, f), - Self::SampleInput(element) => ::core::fmt::Display::fmt(element, f), - Self::SampleProof(element) => ::core::fmt::Display::fmt(element, f), - Self::SetProofMarketplaceContract(element) => ::core::fmt::Display::fmt(element, f), - Self::Verify(element) => ::core::fmt::Display::fmt(element, f), - Self::VerifyAgainstSampleInputs(element) => ::core::fmt::Display::fmt(element, f), - Self::VerifyInputs(element) => ::core::fmt::Display::fmt(element, f), - } - } - } - impl ::core::convert::From for MockVerifierCalls { - fn from(value: CheckSampleInputsAndProofCall) -> Self { - Self::CheckSampleInputsAndProof(value) - } - } - impl ::core::convert::From for MockVerifierCalls { - fn from(value: ProofMarketplaceCall) -> Self { - Self::ProofMarketplace(value) - } - } - impl ::core::convert::From for MockVerifierCalls { - fn from(value: SampleInputCall) -> Self { - Self::SampleInput(value) - } - } - impl ::core::convert::From for MockVerifierCalls { - fn from(value: SampleProofCall) -> Self { - Self::SampleProof(value) - } - } - impl ::core::convert::From for MockVerifierCalls { - fn from(value: SetProofMarketplaceContractCall) -> Self { - Self::SetProofMarketplaceContract(value) - } - } - impl ::core::convert::From for MockVerifierCalls { - fn from(value: VerifyCall) -> Self { - Self::Verify(value) - } - } - impl ::core::convert::From for MockVerifierCalls { - fn from(value: VerifyAgainstSampleInputsCall) -> Self { - Self::VerifyAgainstSampleInputs(value) - } - } - impl ::core::convert::From for MockVerifierCalls { - fn from(value: VerifyInputsCall) -> Self { - Self::VerifyInputs(value) - } - } - ///Container type for all return fields from the `checkSampleInputsAndProof` function with signature `checkSampleInputsAndProof()` and selector `0x10a54279` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct CheckSampleInputsAndProofReturn(pub bool); - ///Container type for all return fields from the `proofMarketplace` function with signature `proofMarketplace()` and selector `0x81c45c70` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct ProofMarketplaceReturn(pub ::ethers::core::types::Address); - ///Container type for all return fields from the `sampleInput` function with signature `sampleInput()` and selector `0x7d8ad42b` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct SampleInputReturn(pub ::ethers::core::types::Bytes); - ///Container type for all return fields from the `sampleProof` function with signature `sampleProof()` and selector `0xa76c0551` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct SampleProofReturn(pub ::ethers::core::types::Bytes); - ///Container type for all return fields from the `verify` function with signature `verify(bytes)` and selector `0x8e760afe` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct VerifyReturn(pub bool); - ///Container type for all return fields from the `verifyAgainstSampleInputs` function with signature `verifyAgainstSampleInputs(bytes)` and selector `0x02f77d19` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct VerifyAgainstSampleInputsReturn(pub bool); - ///Container type for all return fields from the `verifyInputs` function with signature `verifyInputs(bytes)` and selector `0xa6dfbc7f` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct VerifyInputsReturn(pub bool); -} diff --git a/bindings/src/plonk_verifier_wrapper.rs b/bindings/src/plonk_verifier_wrapper.rs deleted file mode 100644 index 019a41e..0000000 --- a/bindings/src/plonk_verifier_wrapper.rs +++ /dev/null @@ -1,1144 +0,0 @@ -pub use plonk_verifier_wrapper::*; -/// 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 plonk_verifier_wrapper { - pub use super::super::shared_types::*; - #[allow(deprecated)] - fn __abi() -> ::ethers::core::abi::Abi { - ::ethers::core::abi::ethabi::Contract { - constructor: ::core::option::Option::Some(::ethers::core::abi::ethabi::Constructor { - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("_iverifier"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("contract i_plonk_vk"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("_sampleInput"), - kind: ::ethers::core::abi::ethabi::ParamType::Bytes, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("_sampleProof"), - kind: ::ethers::core::abi::ethabi::ParamType::Bytes, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes"), - ), - }, - ], - }), - functions: ::core::convert::From::from([ - ( - ::std::borrow::ToOwned::to_owned("checkSampleInputsAndProof"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("checkSampleInputsAndProof",), - inputs: ::std::vec![], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Bool, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bool"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("createRequest"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("createRequest"), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("ask"), - kind: ::ethers::core::abi::ethabi::ParamType::Tuple(::std::vec![ - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ::ethers::core::abi::ethabi::ParamType::Address, - ::ethers::core::abi::ethabi::ParamType::Bytes, - ],), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("struct ProofMarketplace.Ask",), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("secretType"), - kind: ::ethers::core::abi::ethabi::ParamType::Uint(8usize), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned( - "enum ProofMarketplace.SecretType", - ), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("secret_inputs"), - kind: ::ethers::core::abi::ethabi::ParamType::Bytes, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("acl"), - kind: ::ethers::core::abi::ethabi::ParamType::Bytes, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes"), - ), - }, - ], - outputs: ::std::vec![], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("encodeInputAndProofForVerification"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned( - "encodeInputAndProofForVerification", - ), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("inputs"), - kind: ::ethers::core::abi::ethabi::ParamType::Array( - ::std::boxed::Box::new( - ::ethers::core::abi::ethabi::ParamType::FixedBytes(32usize), - ), - ), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes32[]"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("proof"), - kind: ::ethers::core::abi::ethabi::ParamType::Bytes, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes"), - ), - }, - ], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Bytes, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::Pure, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("encodeInputs"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("encodeInputs"), - inputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("inputs"), - kind: ::ethers::core::abi::ethabi::ParamType::Array( - ::std::boxed::Box::new( - ::ethers::core::abi::ethabi::ParamType::FixedBytes(32usize), - ), - ), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes32[]"), - ), - },], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Bytes, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::Pure, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("encodeProof"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("encodeProof"), - inputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("proof"), - kind: ::ethers::core::abi::ethabi::ParamType::Bytes, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes"), - ), - },], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Bytes, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::Pure, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("iverifier"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("iverifier"), - inputs: ::std::vec![], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("contract i_plonk_vk"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("proofMarketplace"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("proofMarketplace"), - inputs: ::std::vec![], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("contract ProofMarketplace",), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("sampleInput"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("sampleInput"), - inputs: ::std::vec![], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Bytes, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("sampleProof"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("sampleProof"), - inputs: ::std::vec![], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Bytes, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("setProofMarketplaceContract"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("setProofMarketplaceContract",), - inputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("_proofMarketplace"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("contract ProofMarketplace",), - ), - },], - outputs: ::std::vec![], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("verify"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("verify"), - inputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("encodedData"), - kind: ::ethers::core::abi::ethabi::ParamType::Bytes, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes"), - ), - },], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Bool, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bool"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("verifyAgainstSampleInputs"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("verifyAgainstSampleInputs",), - inputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("encodedProof"), - kind: ::ethers::core::abi::ethabi::ParamType::Bytes, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes"), - ), - },], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Bool, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bool"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("verifyInputs"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("verifyInputs"), - inputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("inputs"), - kind: ::ethers::core::abi::ethabi::ParamType::Bytes, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes"), - ), - },], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Bool, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bool"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::Pure, - },], - ), - ]), - events: ::std::collections::BTreeMap::new(), - errors: ::std::collections::BTreeMap::new(), - receive: false, - fallback: false, - } - } - ///The parsed JSON ABI of the contract. - pub static PLONK_VERIFIER_WRAPPER_ABI: ::ethers::contract::Lazy<::ethers::core::abi::Abi> = - ::ethers::contract::Lazy::new(__abi); - #[rustfmt::skip] - const __BYTECODE: &[u8] = b"`\xA0`@R4\x80\x15b\0\0\x11W`\0\x80\xFD[P`@Qb\0\x12b8\x03\x80b\0\x12b\x839\x81\x01`@\x81\x90Rb\0\x004\x91b\0\x01-V[`\x01`\x01`\xA0\x1B\x03\x83\x16`\x80R`\x01b\0\0O\x83\x82b\0\x02FV[P`\x02b\0\0^\x82\x82b\0\x02FV[PPPPb\0\x03\x12V[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`\0\x82`\x1F\x83\x01\x12b\0\0\x90W`\0\x80\xFD[\x81Q`\x01`\x01`@\x1B\x03\x80\x82\x11\x15b\0\0\xADWb\0\0\xADb\0\0hV[`@Q`\x1F\x83\x01`\x1F\x19\x90\x81\x16`?\x01\x16\x81\x01\x90\x82\x82\x11\x81\x83\x10\x17\x15b\0\0\xD8Wb\0\0\xD8b\0\0hV[\x81`@R\x83\x81R` \x92P\x86\x83\x85\x88\x01\x01\x11\x15b\0\0\xF5W`\0\x80\xFD[`\0\x91P[\x83\x82\x10\x15b\0\x01\x19W\x85\x82\x01\x83\x01Q\x81\x83\x01\x84\x01R\x90\x82\x01\x90b\0\0\xFAV[`\0\x93\x81\x01\x90\x92\x01\x92\x90\x92R\x94\x93PPPPV[`\0\x80`\0``\x84\x86\x03\x12\x15b\0\x01CW`\0\x80\xFD[\x83Q`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14b\0\x01[W`\0\x80\xFD[` \x85\x01Q\x90\x93P`\x01`\x01`@\x1B\x03\x80\x82\x11\x15b\0\x01yW`\0\x80\xFD[b\0\x01\x87\x87\x83\x88\x01b\0\0~V[\x93P`@\x86\x01Q\x91P\x80\x82\x11\x15b\0\x01\x9EW`\0\x80\xFD[Pb\0\x01\xAD\x86\x82\x87\x01b\0\0~V[\x91PP\x92P\x92P\x92V[`\x01\x81\x81\x1C\x90\x82\x16\x80b\0\x01\xCCW`\x7F\x82\x16\x91P[` \x82\x10\x81\x03b\0\x01\xEDWcNH{q`\xE0\x1B`\0R`\"`\x04R`$`\0\xFD[P\x91\x90PV[`\x1F\x82\x11\x15b\0\x02AW`\0\x81\x81R` \x81 `\x1F\x85\x01`\x05\x1C\x81\x01` \x86\x10\x15b\0\x02\x1CWP\x80[`\x1F\x85\x01`\x05\x1C\x82\x01\x91P[\x81\x81\x10\x15b\0\x02=W\x82\x81U`\x01\x01b\0\x02(V[PPP[PPPV[\x81Q`\x01`\x01`@\x1B\x03\x81\x11\x15b\0\x02bWb\0\x02bb\0\0hV[b\0\x02z\x81b\0\x02s\x84Tb\0\x01\xB7V[\x84b\0\x01\xF3V[` \x80`\x1F\x83\x11`\x01\x81\x14b\0\x02\xB2W`\0\x84\x15b\0\x02\x99WP\x85\x83\x01Q[`\0\x19`\x03\x86\x90\x1B\x1C\x19\x16`\x01\x85\x90\x1B\x17\x85Ub\0\x02=V[`\0\x85\x81R` \x81 `\x1F\x19\x86\x16\x91[\x82\x81\x10\x15b\0\x02\xE3W\x88\x86\x01Q\x82U\x94\x84\x01\x94`\x01\x90\x91\x01\x90\x84\x01b\0\x02\xC2V[P\x85\x82\x10\x15b\0\x03\x02W\x87\x85\x01Q`\0\x19`\x03\x88\x90\x1B`\xF8\x16\x1C\x19\x16\x81U[PPPPP`\x01\x90\x81\x1B\x01\x90UPV[`\x80Qa\x0F-b\0\x035`\09`\0\x81\x81a\x01\xD8\x01Ra\x04\xA4\x01Ra\x0F-`\0\xF3\xFE`\x80`@R4\x80\x15a\0\x10W`\0\x80\xFD[P`\x046\x10a\0\xCFW`\x005`\xE0\x1C\x80c}\x8A\xD4+\x11a\0\x8CW\x80c\xA6\xDF\xBC\x7F\x11a\0fW\x80c\xA6\xDF\xBC\x7F\x14a\x01\xA5W\x80c\xA7l\x05Q\x14a\x01\xB8W\x80c\xD2#^\xAC\x14a\x01\xC0W\x80c\xE7\xF5\xB8\x1D\x14a\x01\xD3W`\0\x80\xFD[\x80c}\x8A\xD4+\x14a\x01_W\x80c\x81\xC4\\p\x14a\x01gW\x80c\x8Ev\n\xFE\x14a\x01\x92W`\0\x80\xFD[\x80c\x02\xF7}\x19\x14a\0\xD4W\x80c\x05m\xE7\x04\x14a\0\xFCW\x80c\x10\xA5By\x14a\x01\x11W\x80c?\xA0\xCF\xBF\x14a\x01\x19W\x80cL\xFF\x91%\x14a\x019W\x80cp\xF9\xDF\xCA\x14a\x01LW[`\0\x80\xFD[a\0\xE7a\0\xE26`\x04a\x07wV[a\x01\xFAV[`@Q\x90\x15\x15\x81R` \x01[`@Q\x80\x91\x03\x90\xF3[a\x01\x0Fa\x01\n6`\x04a\x07\xCBV[a\x022V[\0[a\0\xE7a\x02\xA0V[a\x01,a\x01'6`\x04a\x08qV[a\x03:V[`@Qa\0\xF3\x91\x90a\x08\xF5V[a\x01,a\x01G6`\x04a\x07wV[a\x03cV[a\x01,a\x01Z6`\x04a\t\x08V[a\x03vV[a\x01,a\x03\xB2V[`\0Ta\x01z\x90`\x01`\x01`\xA0\x1B\x03\x16\x81V[`@Q`\x01`\x01`\xA0\x1B\x03\x90\x91\x16\x81R` \x01a\0\xF3V[a\0\xE7a\x01\xA06`\x04a\x07wV[a\x04@V[a\0\xE7a\x01\xB36`\x04a\t\xB3V[a\x05&V[a\x01,a\x05>V[a\x01\x0Fa\x01\xCE6`\x04a\t\xF4V[a\x05KV[a\x01z\x7F\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\x81V[`\0\x80`\x01\x83`@Q` \x01a\x02\x11\x92\x91\x90a\n\xE2V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x90Pa\x02+\x81a\x04@V[\x93\x92PPPV[`\0T`\x01`\x01`\xA0\x1B\x03\x16\x15a\x02~W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x0B`$\x82\x01Rj\x10[\x1C\x99XY\x1EH\x14\xD9]`\xAA\x1B`D\x82\x01R`d\x01[`@Q\x80\x91\x03\x90\xFD[`\0\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16`\x01`\x01`\xA0\x1B\x03\x92\x90\x92\x16\x91\x90\x91\x17\x90UV[`\0a\x035`\x02\x80Ta\x02\xB2\x90a\n\xA8V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\x02\xDE\x90a\n\xA8V[\x80\x15a\x03+W\x80`\x1F\x10a\x03\0Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\x03+V[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\x03\x0EW\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPPa\x01\xFAV[\x90P\x90V[``\x81`@Q` \x01a\x03M\x91\x90a\x0B\xDDV[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x90P\x91\x90PV[``\x81`@Q` \x01a\x03M\x91\x90a\x08\xF5V[``a\x03\x81\x83a\x03:V[a\x03\x8A\x83a\x03cV[`@Q` \x01a\x03\x9B\x92\x91\x90a\x0B\xF0V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x90P\x92\x91PPV[`\x01\x80Ta\x03\xBF\x90a\n\xA8V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\x03\xEB\x90a\n\xA8V[\x80\x15a\x048W\x80`\x1F\x10a\x04\rWa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\x048V[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\x04\x1BW\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81V[`\0``\x80`\0\x80\x85\x80` \x01\x90Q\x81\x01\x90a\x04\\\x91\x90a\x0CZV[\x91P\x91P\x81\x80` \x01\x90Q\x81\x01\x90a\x04t\x91\x90a\x0C\xB3V[\x93P\x80\x80` \x01\x90Q\x81\x01\x90a\x04\x8A\x91\x90a\rCV[`@Qc:\x9449`\xE2\x1B\x81R\x90\x93P`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x90c\xEAP\xD0\xE4\x90a\x04\xDB\x90\x86\x90\x88\x90`\x04\x01a\rwV[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x04\xF8W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x05\x1C\x91\x90a\r\x9CV[\x96\x95PPPPPPV[`\0a\x054\x82\x84\x01\x84a\x08qV[P`\x01\x93\x92PPPV[`\x02\x80Ta\x03\xBF\x90a\n\xA8V[`\0`@Q\x80`\xE0\x01`@R\x80\x88`\0\x015\x81R` \x01\x88` \x015\x81R` \x01\x88`@\x015\x81R` \x01\x88``\x015\x81R` \x01\x88`\x80\x015\x81R` \x01\x88`\xA0\x01` \x81\x01\x90a\x05\x9D\x91\x90a\x07\xCBV[`\x01`\x01`\xA0\x1B\x03\x16\x81R` \x01a\x05\xC3a\x01'a\x05\xBE`\xC0\x8C\x01\x8Ca\r\xBEV[a\x06;V[\x90R`\0T`@Qc8)\xC7\xE5`\xE1\x1B\x81R\x91\x92P`\x01`\x01`\xA0\x1B\x03\x16\x90cpS\x8F\xCA\x90a\x06\0\x90\x84\x90\x8A\x90\x8A\x90\x8A\x90\x8A\x90\x8A\x90`\x04\x01a\x0EOV[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x06\x1AW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x06.W=`\0\x80>=`\0\xFD[PPPPPPPPPPPV[``a\x06G\x83\x83a\x05&V[a\x06\xA8W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`,`$\x82\x01R\x7FPlonk Verifier Wrapper: Invalid `D\x82\x01Rk\x1A[\x9C\x1D]\x08\x19\x9B\xDC\x9BX]`\xA2\x1B`d\x82\x01R`\x84\x01a\x02uV[a\x02+\x82\x84\x01\x84a\x08qV[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`@Q`\x1F\x82\x01`\x1F\x19\x16\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a\x06\xF2Wa\x06\xF2a\x06\xB4V[`@R\x91\x90PV[`\0`\x01`\x01`@\x1B\x03\x82\x11\x15a\x07\x13Wa\x07\x13a\x06\xB4V[P`\x1F\x01`\x1F\x19\x16` \x01\x90V[`\0\x82`\x1F\x83\x01\x12a\x072W`\0\x80\xFD[\x815a\x07Ea\x07@\x82a\x06\xFAV[a\x06\xCAV[\x81\x81R\x84` \x83\x86\x01\x01\x11\x15a\x07ZW`\0\x80\xFD[\x81` \x85\x01` \x83\x017`\0\x91\x81\x01` \x01\x91\x90\x91R\x93\x92PPPV[`\0` \x82\x84\x03\x12\x15a\x07\x89W`\0\x80\xFD[\x815`\x01`\x01`@\x1B\x03\x81\x11\x15a\x07\x9FW`\0\x80\xFD[a\x07\xAB\x84\x82\x85\x01a\x07!V[\x94\x93PPPPV[`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a\x07\xC8W`\0\x80\xFD[PV[`\0` \x82\x84\x03\x12\x15a\x07\xDDW`\0\x80\xFD[\x815a\x02+\x81a\x07\xB3V[`\0`\x01`\x01`@\x1B\x03\x82\x11\x15a\x08\x01Wa\x08\x01a\x06\xB4V[P`\x05\x1B` \x01\x90V[`\0\x82`\x1F\x83\x01\x12a\x08\x1CW`\0\x80\xFD[\x815` a\x08,a\x07@\x83a\x07\xE8V[\x82\x81R`\x05\x92\x90\x92\x1B\x84\x01\x81\x01\x91\x81\x81\x01\x90\x86\x84\x11\x15a\x08KW`\0\x80\xFD[\x82\x86\x01[\x84\x81\x10\x15a\x08fW\x805\x83R\x91\x83\x01\x91\x83\x01a\x08OV[P\x96\x95PPPPPPV[`\0` \x82\x84\x03\x12\x15a\x08\x83W`\0\x80\xFD[\x815`\x01`\x01`@\x1B\x03\x81\x11\x15a\x08\x99W`\0\x80\xFD[a\x07\xAB\x84\x82\x85\x01a\x08\x0BV[`\0[\x83\x81\x10\x15a\x08\xC0W\x81\x81\x01Q\x83\x82\x01R` \x01a\x08\xA8V[PP`\0\x91\x01RV[`\0\x81Q\x80\x84Ra\x08\xE1\x81` \x86\x01` \x86\x01a\x08\xA5V[`\x1F\x01`\x1F\x19\x16\x92\x90\x92\x01` \x01\x92\x91PPV[` \x81R`\0a\x02+` \x83\x01\x84a\x08\xC9V[`\0\x80`@\x83\x85\x03\x12\x15a\t\x1BW`\0\x80\xFD[\x825`\x01`\x01`@\x1B\x03\x80\x82\x11\x15a\t2W`\0\x80\xFD[a\t>\x86\x83\x87\x01a\x08\x0BV[\x93P` \x85\x015\x91P\x80\x82\x11\x15a\tTW`\0\x80\xFD[Pa\ta\x85\x82\x86\x01a\x07!V[\x91PP\x92P\x92\x90PV[`\0\x80\x83`\x1F\x84\x01\x12a\t}W`\0\x80\xFD[P\x815`\x01`\x01`@\x1B\x03\x81\x11\x15a\t\x94W`\0\x80\xFD[` \x83\x01\x91P\x83` \x82\x85\x01\x01\x11\x15a\t\xACW`\0\x80\xFD[\x92P\x92\x90PV[`\0\x80` \x83\x85\x03\x12\x15a\t\xC6W`\0\x80\xFD[\x825`\x01`\x01`@\x1B\x03\x81\x11\x15a\t\xDCW`\0\x80\xFD[a\t\xE8\x85\x82\x86\x01a\tkV[\x90\x96\x90\x95P\x93PPPPV[`\0\x80`\0\x80`\0\x80`\x80\x87\x89\x03\x12\x15a\n\rW`\0\x80\xFD[\x865`\x01`\x01`@\x1B\x03\x80\x82\x11\x15a\n$W`\0\x80\xFD[\x90\x88\x01\x90`\xE0\x82\x8B\x03\x12\x15a\n8W`\0\x80\xFD[\x90\x96P` \x88\x015\x90`\x03\x82\x10a\nNW`\0\x80\xFD[\x90\x95P`@\x88\x015\x90\x80\x82\x11\x15a\ndW`\0\x80\xFD[a\np\x8A\x83\x8B\x01a\tkV[\x90\x96P\x94P``\x89\x015\x91P\x80\x82\x11\x15a\n\x89W`\0\x80\xFD[Pa\n\x96\x89\x82\x8A\x01a\tkV[\x97\x9A\x96\x99P\x94\x97P\x92\x95\x93\x94\x92PPPV[`\x01\x81\x81\x1C\x90\x82\x16\x80a\n\xBCW`\x7F\x82\x16\x91P[` \x82\x10\x81\x03a\n\xDCWcNH{q`\xE0\x1B`\0R`\"`\x04R`$`\0\xFD[P\x91\x90PV[`@\x81R`\0\x80\x84T\x81`\x01\x82\x81\x1C\x91P\x80\x83\x16\x80a\x0B\x02W`\x7F\x83\x16\x92P[` \x80\x84\x10\x82\x03a\x0B!WcNH{q`\xE0\x1B\x86R`\"`\x04R`$\x86\xFD[`@\x88\x01\x84\x90R``\x88\x01\x82\x80\x15a\x0B@W`\x01\x81\x14a\x0BVWa\x0B\x81V[`\xFF\x19\x87\x16\x82R\x85\x15\x15`\x05\x1B\x82\x01\x97Pa\x0B\x81V[`\0\x8C\x81R` \x90 `\0[\x87\x81\x10\x15a\x0B{W\x81T\x84\x82\x01R\x90\x86\x01\x90\x84\x01a\x0BbV[\x83\x01\x98PP[PP\x87\x86\x03\x81\x89\x01RPPPPPa\x0B\x99\x81\x85a\x08\xC9V[\x95\x94PPPPPV[`\0\x81Q\x80\x84R` \x80\x85\x01\x94P\x80\x84\x01`\0[\x83\x81\x10\x15a\x0B\xD2W\x81Q\x87R\x95\x82\x01\x95\x90\x82\x01\x90`\x01\x01a\x0B\xB6V[P\x94\x95\x94PPPPPV[` \x81R`\0a\x02+` \x83\x01\x84a\x0B\xA2V[`@\x81R`\0a\x0C\x03`@\x83\x01\x85a\x08\xC9V[\x82\x81\x03` \x84\x01Ra\x0B\x99\x81\x85a\x08\xC9V[`\0\x82`\x1F\x83\x01\x12a\x0C&W`\0\x80\xFD[\x81Qa\x0C4a\x07@\x82a\x06\xFAV[\x81\x81R\x84` \x83\x86\x01\x01\x11\x15a\x0CIW`\0\x80\xFD[a\x07\xAB\x82` \x83\x01` \x87\x01a\x08\xA5V[`\0\x80`@\x83\x85\x03\x12\x15a\x0CmW`\0\x80\xFD[\x82Q`\x01`\x01`@\x1B\x03\x80\x82\x11\x15a\x0C\x84W`\0\x80\xFD[a\x0C\x90\x86\x83\x87\x01a\x0C\x15V[\x93P` \x85\x01Q\x91P\x80\x82\x11\x15a\x0C\xA6W`\0\x80\xFD[Pa\ta\x85\x82\x86\x01a\x0C\x15V[`\0` \x80\x83\x85\x03\x12\x15a\x0C\xC6W`\0\x80\xFD[\x82Q`\x01`\x01`@\x1B\x03\x81\x11\x15a\x0C\xDCW`\0\x80\xFD[\x83\x01`\x1F\x81\x01\x85\x13a\x0C\xEDW`\0\x80\xFD[\x80Qa\x0C\xFBa\x07@\x82a\x07\xE8V[\x81\x81R`\x05\x91\x90\x91\x1B\x82\x01\x83\x01\x90\x83\x81\x01\x90\x87\x83\x11\x15a\r\x1AW`\0\x80\xFD[\x92\x84\x01\x92[\x82\x84\x10\x15a\r8W\x83Q\x82R\x92\x84\x01\x92\x90\x84\x01\x90a\r\x1FV[\x97\x96PPPPPPPV[`\0` \x82\x84\x03\x12\x15a\rUW`\0\x80\xFD[\x81Q`\x01`\x01`@\x1B\x03\x81\x11\x15a\rkW`\0\x80\xFD[a\x07\xAB\x84\x82\x85\x01a\x0C\x15V[`@\x81R`\0a\r\x8A`@\x83\x01\x85a\x08\xC9V[\x82\x81\x03` \x84\x01Ra\x0B\x99\x81\x85a\x0B\xA2V[`\0` \x82\x84\x03\x12\x15a\r\xAEW`\0\x80\xFD[\x81Q\x80\x15\x15\x81\x14a\x02+W`\0\x80\xFD[`\0\x80\x835`\x1E\x19\x846\x03\x01\x81\x12a\r\xD5W`\0\x80\xFD[\x83\x01\x805\x91P`\x01`\x01`@\x1B\x03\x82\x11\x15a\r\xEFW`\0\x80\xFD[` \x01\x91P6\x81\x90\x03\x82\x13\x15a\t\xACW`\0\x80\xFD[`\x03\x81\x10a\x0E\"WcNH{q`\xE0\x1B`\0R`!`\x04R`$`\0\xFD[\x90RV[\x81\x83R\x81\x81` \x85\x017P`\0\x82\x82\x01` \x90\x81\x01\x91\x90\x91R`\x1F\x90\x91\x01`\x1F\x19\x16\x90\x91\x01\x01\x90V[`\x80\x81R\x86Q`\x80\x82\x01R` \x87\x01Q`\xA0\x82\x01R`@\x87\x01Q`\xC0\x82\x01R``\x87\x01Q`\xE0\x82\x01R`\x80\x87\x01Qa\x01\0\x82\x01R`\x01\x80`\xA0\x1B\x03`\xA0\x88\x01Q\x16a\x01 \x82\x01R`\0`\xC0\x88\x01Q`\xE0a\x01@\x84\x01Ra\x0E\xB3a\x01`\x84\x01\x82a\x08\xC9V[\x90Pa\x0E\xC2` \x84\x01\x89a\x0E\x04V[\x82\x81\x03`@\x84\x01Ra\x0E\xD5\x81\x87\x89a\x0E&V[\x90P\x82\x81\x03``\x84\x01Ra\x0E\xEA\x81\x85\x87a\x0E&V[\x99\x98PPPPPPPPPV\xFE\xA2dipfsX\"\x12 \xB9\x08e]\xD6\xD6\x9E7\xA5\x1E \x19\x0F\x9C{\x16\xB5J\xCFV\x15\x8By\xF2o\xD4\xFA\xFE\x9F\xC3\x1A\xDBdsolcC\0\x08\x14\x003"; - /// The bytecode of the contract. - pub static PLONK_VERIFIER_WRAPPER_BYTECODE: ::ethers::core::types::Bytes = - ::ethers::core::types::Bytes::from_static(__BYTECODE); - #[rustfmt::skip] - const __DEPLOYED_BYTECODE: &[u8] = b"`\x80`@R4\x80\x15a\0\x10W`\0\x80\xFD[P`\x046\x10a\0\xCFW`\x005`\xE0\x1C\x80c}\x8A\xD4+\x11a\0\x8CW\x80c\xA6\xDF\xBC\x7F\x11a\0fW\x80c\xA6\xDF\xBC\x7F\x14a\x01\xA5W\x80c\xA7l\x05Q\x14a\x01\xB8W\x80c\xD2#^\xAC\x14a\x01\xC0W\x80c\xE7\xF5\xB8\x1D\x14a\x01\xD3W`\0\x80\xFD[\x80c}\x8A\xD4+\x14a\x01_W\x80c\x81\xC4\\p\x14a\x01gW\x80c\x8Ev\n\xFE\x14a\x01\x92W`\0\x80\xFD[\x80c\x02\xF7}\x19\x14a\0\xD4W\x80c\x05m\xE7\x04\x14a\0\xFCW\x80c\x10\xA5By\x14a\x01\x11W\x80c?\xA0\xCF\xBF\x14a\x01\x19W\x80cL\xFF\x91%\x14a\x019W\x80cp\xF9\xDF\xCA\x14a\x01LW[`\0\x80\xFD[a\0\xE7a\0\xE26`\x04a\x07wV[a\x01\xFAV[`@Q\x90\x15\x15\x81R` \x01[`@Q\x80\x91\x03\x90\xF3[a\x01\x0Fa\x01\n6`\x04a\x07\xCBV[a\x022V[\0[a\0\xE7a\x02\xA0V[a\x01,a\x01'6`\x04a\x08qV[a\x03:V[`@Qa\0\xF3\x91\x90a\x08\xF5V[a\x01,a\x01G6`\x04a\x07wV[a\x03cV[a\x01,a\x01Z6`\x04a\t\x08V[a\x03vV[a\x01,a\x03\xB2V[`\0Ta\x01z\x90`\x01`\x01`\xA0\x1B\x03\x16\x81V[`@Q`\x01`\x01`\xA0\x1B\x03\x90\x91\x16\x81R` \x01a\0\xF3V[a\0\xE7a\x01\xA06`\x04a\x07wV[a\x04@V[a\0\xE7a\x01\xB36`\x04a\t\xB3V[a\x05&V[a\x01,a\x05>V[a\x01\x0Fa\x01\xCE6`\x04a\t\xF4V[a\x05KV[a\x01z\x7F\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\x81V[`\0\x80`\x01\x83`@Q` \x01a\x02\x11\x92\x91\x90a\n\xE2V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x90Pa\x02+\x81a\x04@V[\x93\x92PPPV[`\0T`\x01`\x01`\xA0\x1B\x03\x16\x15a\x02~W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x0B`$\x82\x01Rj\x10[\x1C\x99XY\x1EH\x14\xD9]`\xAA\x1B`D\x82\x01R`d\x01[`@Q\x80\x91\x03\x90\xFD[`\0\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16`\x01`\x01`\xA0\x1B\x03\x92\x90\x92\x16\x91\x90\x91\x17\x90UV[`\0a\x035`\x02\x80Ta\x02\xB2\x90a\n\xA8V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\x02\xDE\x90a\n\xA8V[\x80\x15a\x03+W\x80`\x1F\x10a\x03\0Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\x03+V[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\x03\x0EW\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPPa\x01\xFAV[\x90P\x90V[``\x81`@Q` \x01a\x03M\x91\x90a\x0B\xDDV[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x90P\x91\x90PV[``\x81`@Q` \x01a\x03M\x91\x90a\x08\xF5V[``a\x03\x81\x83a\x03:V[a\x03\x8A\x83a\x03cV[`@Q` \x01a\x03\x9B\x92\x91\x90a\x0B\xF0V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x90P\x92\x91PPV[`\x01\x80Ta\x03\xBF\x90a\n\xA8V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\x03\xEB\x90a\n\xA8V[\x80\x15a\x048W\x80`\x1F\x10a\x04\rWa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\x048V[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\x04\x1BW\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81V[`\0``\x80`\0\x80\x85\x80` \x01\x90Q\x81\x01\x90a\x04\\\x91\x90a\x0CZV[\x91P\x91P\x81\x80` \x01\x90Q\x81\x01\x90a\x04t\x91\x90a\x0C\xB3V[\x93P\x80\x80` \x01\x90Q\x81\x01\x90a\x04\x8A\x91\x90a\rCV[`@Qc:\x9449`\xE2\x1B\x81R\x90\x93P`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x90c\xEAP\xD0\xE4\x90a\x04\xDB\x90\x86\x90\x88\x90`\x04\x01a\rwV[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x04\xF8W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x05\x1C\x91\x90a\r\x9CV[\x96\x95PPPPPPV[`\0a\x054\x82\x84\x01\x84a\x08qV[P`\x01\x93\x92PPPV[`\x02\x80Ta\x03\xBF\x90a\n\xA8V[`\0`@Q\x80`\xE0\x01`@R\x80\x88`\0\x015\x81R` \x01\x88` \x015\x81R` \x01\x88`@\x015\x81R` \x01\x88``\x015\x81R` \x01\x88`\x80\x015\x81R` \x01\x88`\xA0\x01` \x81\x01\x90a\x05\x9D\x91\x90a\x07\xCBV[`\x01`\x01`\xA0\x1B\x03\x16\x81R` \x01a\x05\xC3a\x01'a\x05\xBE`\xC0\x8C\x01\x8Ca\r\xBEV[a\x06;V[\x90R`\0T`@Qc8)\xC7\xE5`\xE1\x1B\x81R\x91\x92P`\x01`\x01`\xA0\x1B\x03\x16\x90cpS\x8F\xCA\x90a\x06\0\x90\x84\x90\x8A\x90\x8A\x90\x8A\x90\x8A\x90\x8A\x90`\x04\x01a\x0EOV[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x06\x1AW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x06.W=`\0\x80>=`\0\xFD[PPPPPPPPPPPV[``a\x06G\x83\x83a\x05&V[a\x06\xA8W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`,`$\x82\x01R\x7FPlonk Verifier Wrapper: Invalid `D\x82\x01Rk\x1A[\x9C\x1D]\x08\x19\x9B\xDC\x9BX]`\xA2\x1B`d\x82\x01R`\x84\x01a\x02uV[a\x02+\x82\x84\x01\x84a\x08qV[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`@Q`\x1F\x82\x01`\x1F\x19\x16\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a\x06\xF2Wa\x06\xF2a\x06\xB4V[`@R\x91\x90PV[`\0`\x01`\x01`@\x1B\x03\x82\x11\x15a\x07\x13Wa\x07\x13a\x06\xB4V[P`\x1F\x01`\x1F\x19\x16` \x01\x90V[`\0\x82`\x1F\x83\x01\x12a\x072W`\0\x80\xFD[\x815a\x07Ea\x07@\x82a\x06\xFAV[a\x06\xCAV[\x81\x81R\x84` \x83\x86\x01\x01\x11\x15a\x07ZW`\0\x80\xFD[\x81` \x85\x01` \x83\x017`\0\x91\x81\x01` \x01\x91\x90\x91R\x93\x92PPPV[`\0` \x82\x84\x03\x12\x15a\x07\x89W`\0\x80\xFD[\x815`\x01`\x01`@\x1B\x03\x81\x11\x15a\x07\x9FW`\0\x80\xFD[a\x07\xAB\x84\x82\x85\x01a\x07!V[\x94\x93PPPPV[`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a\x07\xC8W`\0\x80\xFD[PV[`\0` \x82\x84\x03\x12\x15a\x07\xDDW`\0\x80\xFD[\x815a\x02+\x81a\x07\xB3V[`\0`\x01`\x01`@\x1B\x03\x82\x11\x15a\x08\x01Wa\x08\x01a\x06\xB4V[P`\x05\x1B` \x01\x90V[`\0\x82`\x1F\x83\x01\x12a\x08\x1CW`\0\x80\xFD[\x815` a\x08,a\x07@\x83a\x07\xE8V[\x82\x81R`\x05\x92\x90\x92\x1B\x84\x01\x81\x01\x91\x81\x81\x01\x90\x86\x84\x11\x15a\x08KW`\0\x80\xFD[\x82\x86\x01[\x84\x81\x10\x15a\x08fW\x805\x83R\x91\x83\x01\x91\x83\x01a\x08OV[P\x96\x95PPPPPPV[`\0` \x82\x84\x03\x12\x15a\x08\x83W`\0\x80\xFD[\x815`\x01`\x01`@\x1B\x03\x81\x11\x15a\x08\x99W`\0\x80\xFD[a\x07\xAB\x84\x82\x85\x01a\x08\x0BV[`\0[\x83\x81\x10\x15a\x08\xC0W\x81\x81\x01Q\x83\x82\x01R` \x01a\x08\xA8V[PP`\0\x91\x01RV[`\0\x81Q\x80\x84Ra\x08\xE1\x81` \x86\x01` \x86\x01a\x08\xA5V[`\x1F\x01`\x1F\x19\x16\x92\x90\x92\x01` \x01\x92\x91PPV[` \x81R`\0a\x02+` \x83\x01\x84a\x08\xC9V[`\0\x80`@\x83\x85\x03\x12\x15a\t\x1BW`\0\x80\xFD[\x825`\x01`\x01`@\x1B\x03\x80\x82\x11\x15a\t2W`\0\x80\xFD[a\t>\x86\x83\x87\x01a\x08\x0BV[\x93P` \x85\x015\x91P\x80\x82\x11\x15a\tTW`\0\x80\xFD[Pa\ta\x85\x82\x86\x01a\x07!V[\x91PP\x92P\x92\x90PV[`\0\x80\x83`\x1F\x84\x01\x12a\t}W`\0\x80\xFD[P\x815`\x01`\x01`@\x1B\x03\x81\x11\x15a\t\x94W`\0\x80\xFD[` \x83\x01\x91P\x83` \x82\x85\x01\x01\x11\x15a\t\xACW`\0\x80\xFD[\x92P\x92\x90PV[`\0\x80` \x83\x85\x03\x12\x15a\t\xC6W`\0\x80\xFD[\x825`\x01`\x01`@\x1B\x03\x81\x11\x15a\t\xDCW`\0\x80\xFD[a\t\xE8\x85\x82\x86\x01a\tkV[\x90\x96\x90\x95P\x93PPPPV[`\0\x80`\0\x80`\0\x80`\x80\x87\x89\x03\x12\x15a\n\rW`\0\x80\xFD[\x865`\x01`\x01`@\x1B\x03\x80\x82\x11\x15a\n$W`\0\x80\xFD[\x90\x88\x01\x90`\xE0\x82\x8B\x03\x12\x15a\n8W`\0\x80\xFD[\x90\x96P` \x88\x015\x90`\x03\x82\x10a\nNW`\0\x80\xFD[\x90\x95P`@\x88\x015\x90\x80\x82\x11\x15a\ndW`\0\x80\xFD[a\np\x8A\x83\x8B\x01a\tkV[\x90\x96P\x94P``\x89\x015\x91P\x80\x82\x11\x15a\n\x89W`\0\x80\xFD[Pa\n\x96\x89\x82\x8A\x01a\tkV[\x97\x9A\x96\x99P\x94\x97P\x92\x95\x93\x94\x92PPPV[`\x01\x81\x81\x1C\x90\x82\x16\x80a\n\xBCW`\x7F\x82\x16\x91P[` \x82\x10\x81\x03a\n\xDCWcNH{q`\xE0\x1B`\0R`\"`\x04R`$`\0\xFD[P\x91\x90PV[`@\x81R`\0\x80\x84T\x81`\x01\x82\x81\x1C\x91P\x80\x83\x16\x80a\x0B\x02W`\x7F\x83\x16\x92P[` \x80\x84\x10\x82\x03a\x0B!WcNH{q`\xE0\x1B\x86R`\"`\x04R`$\x86\xFD[`@\x88\x01\x84\x90R``\x88\x01\x82\x80\x15a\x0B@W`\x01\x81\x14a\x0BVWa\x0B\x81V[`\xFF\x19\x87\x16\x82R\x85\x15\x15`\x05\x1B\x82\x01\x97Pa\x0B\x81V[`\0\x8C\x81R` \x90 `\0[\x87\x81\x10\x15a\x0B{W\x81T\x84\x82\x01R\x90\x86\x01\x90\x84\x01a\x0BbV[\x83\x01\x98PP[PP\x87\x86\x03\x81\x89\x01RPPPPPa\x0B\x99\x81\x85a\x08\xC9V[\x95\x94PPPPPV[`\0\x81Q\x80\x84R` \x80\x85\x01\x94P\x80\x84\x01`\0[\x83\x81\x10\x15a\x0B\xD2W\x81Q\x87R\x95\x82\x01\x95\x90\x82\x01\x90`\x01\x01a\x0B\xB6V[P\x94\x95\x94PPPPPV[` \x81R`\0a\x02+` \x83\x01\x84a\x0B\xA2V[`@\x81R`\0a\x0C\x03`@\x83\x01\x85a\x08\xC9V[\x82\x81\x03` \x84\x01Ra\x0B\x99\x81\x85a\x08\xC9V[`\0\x82`\x1F\x83\x01\x12a\x0C&W`\0\x80\xFD[\x81Qa\x0C4a\x07@\x82a\x06\xFAV[\x81\x81R\x84` \x83\x86\x01\x01\x11\x15a\x0CIW`\0\x80\xFD[a\x07\xAB\x82` \x83\x01` \x87\x01a\x08\xA5V[`\0\x80`@\x83\x85\x03\x12\x15a\x0CmW`\0\x80\xFD[\x82Q`\x01`\x01`@\x1B\x03\x80\x82\x11\x15a\x0C\x84W`\0\x80\xFD[a\x0C\x90\x86\x83\x87\x01a\x0C\x15V[\x93P` \x85\x01Q\x91P\x80\x82\x11\x15a\x0C\xA6W`\0\x80\xFD[Pa\ta\x85\x82\x86\x01a\x0C\x15V[`\0` \x80\x83\x85\x03\x12\x15a\x0C\xC6W`\0\x80\xFD[\x82Q`\x01`\x01`@\x1B\x03\x81\x11\x15a\x0C\xDCW`\0\x80\xFD[\x83\x01`\x1F\x81\x01\x85\x13a\x0C\xEDW`\0\x80\xFD[\x80Qa\x0C\xFBa\x07@\x82a\x07\xE8V[\x81\x81R`\x05\x91\x90\x91\x1B\x82\x01\x83\x01\x90\x83\x81\x01\x90\x87\x83\x11\x15a\r\x1AW`\0\x80\xFD[\x92\x84\x01\x92[\x82\x84\x10\x15a\r8W\x83Q\x82R\x92\x84\x01\x92\x90\x84\x01\x90a\r\x1FV[\x97\x96PPPPPPPV[`\0` \x82\x84\x03\x12\x15a\rUW`\0\x80\xFD[\x81Q`\x01`\x01`@\x1B\x03\x81\x11\x15a\rkW`\0\x80\xFD[a\x07\xAB\x84\x82\x85\x01a\x0C\x15V[`@\x81R`\0a\r\x8A`@\x83\x01\x85a\x08\xC9V[\x82\x81\x03` \x84\x01Ra\x0B\x99\x81\x85a\x0B\xA2V[`\0` \x82\x84\x03\x12\x15a\r\xAEW`\0\x80\xFD[\x81Q\x80\x15\x15\x81\x14a\x02+W`\0\x80\xFD[`\0\x80\x835`\x1E\x19\x846\x03\x01\x81\x12a\r\xD5W`\0\x80\xFD[\x83\x01\x805\x91P`\x01`\x01`@\x1B\x03\x82\x11\x15a\r\xEFW`\0\x80\xFD[` \x01\x91P6\x81\x90\x03\x82\x13\x15a\t\xACW`\0\x80\xFD[`\x03\x81\x10a\x0E\"WcNH{q`\xE0\x1B`\0R`!`\x04R`$`\0\xFD[\x90RV[\x81\x83R\x81\x81` \x85\x017P`\0\x82\x82\x01` \x90\x81\x01\x91\x90\x91R`\x1F\x90\x91\x01`\x1F\x19\x16\x90\x91\x01\x01\x90V[`\x80\x81R\x86Q`\x80\x82\x01R` \x87\x01Q`\xA0\x82\x01R`@\x87\x01Q`\xC0\x82\x01R``\x87\x01Q`\xE0\x82\x01R`\x80\x87\x01Qa\x01\0\x82\x01R`\x01\x80`\xA0\x1B\x03`\xA0\x88\x01Q\x16a\x01 \x82\x01R`\0`\xC0\x88\x01Q`\xE0a\x01@\x84\x01Ra\x0E\xB3a\x01`\x84\x01\x82a\x08\xC9V[\x90Pa\x0E\xC2` \x84\x01\x89a\x0E\x04V[\x82\x81\x03`@\x84\x01Ra\x0E\xD5\x81\x87\x89a\x0E&V[\x90P\x82\x81\x03``\x84\x01Ra\x0E\xEA\x81\x85\x87a\x0E&V[\x99\x98PPPPPPPPPV\xFE\xA2dipfsX\"\x12 \xB9\x08e]\xD6\xD6\x9E7\xA5\x1E \x19\x0F\x9C{\x16\xB5J\xCFV\x15\x8By\xF2o\xD4\xFA\xFE\x9F\xC3\x1A\xDBdsolcC\0\x08\x14\x003"; - /// The deployed bytecode of the contract. - pub static PLONK_VERIFIER_WRAPPER_DEPLOYED_BYTECODE: ::ethers::core::types::Bytes = - ::ethers::core::types::Bytes::from_static(__DEPLOYED_BYTECODE); - pub struct plonk_verifier_wrapper(::ethers::contract::Contract); - impl ::core::clone::Clone for plonk_verifier_wrapper { - fn clone(&self) -> Self { - Self(::core::clone::Clone::clone(&self.0)) - } - } - impl ::core::ops::Deref for plonk_verifier_wrapper { - type Target = ::ethers::contract::Contract; - fn deref(&self) -> &Self::Target { - &self.0 - } - } - impl ::core::ops::DerefMut for plonk_verifier_wrapper { - fn deref_mut(&mut self) -> &mut Self::Target { - &mut self.0 - } - } - impl ::core::fmt::Debug for plonk_verifier_wrapper { - fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { - f.debug_tuple(::core::stringify!(plonk_verifier_wrapper)) - .field(&self.address()) - .finish() - } - } - impl plonk_verifier_wrapper { - /// 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(), - PLONK_VERIFIER_WRAPPER_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( - PLONK_VERIFIER_WRAPPER_ABI.clone(), - PLONK_VERIFIER_WRAPPER_BYTECODE.clone().into(), - client, - ); - let deployer = factory.deploy(constructor_args)?; - let deployer = ::ethers::contract::ContractDeployer::new(deployer); - Ok(deployer) - } - ///Calls the contract's `checkSampleInputsAndProof` (0x10a54279) function - pub fn check_sample_inputs_and_proof( - &self, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([16, 165, 66, 121], ()) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `createRequest` (0xd2235eac) function - pub fn create_request( - &self, - ask: Ask, - secret_type: u8, - secret_inputs: ::ethers::core::types::Bytes, - acl: ::ethers::core::types::Bytes, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([210, 35, 94, 172], (ask, secret_type, secret_inputs, acl)) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `encodeInputAndProofForVerification` (0x70f9dfca) function - pub fn encode_input_and_proof_for_verification( - &self, - inputs: ::std::vec::Vec<[u8; 32]>, - proof: ::ethers::core::types::Bytes, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([112, 249, 223, 202], (inputs, proof)) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `encodeInputs` (0x3fa0cfbf) function - pub fn encode_inputs( - &self, - inputs: ::std::vec::Vec<[u8; 32]>, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([63, 160, 207, 191], inputs) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `encodeProof` (0x4cff9125) function - pub fn encode_proof( - &self, - proof: ::ethers::core::types::Bytes, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([76, 255, 145, 37], proof) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `iverifier` (0xe7f5b81d) function - pub fn iverifier( - &self, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([231, 245, 184, 29], ()) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `proofMarketplace` (0x81c45c70) function - pub fn proof_marketplace( - &self, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([129, 196, 92, 112], ()) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `sampleInput` (0x7d8ad42b) function - pub fn sample_input( - &self, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([125, 138, 212, 43], ()) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `sampleProof` (0xa76c0551) function - pub fn sample_proof( - &self, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([167, 108, 5, 81], ()) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `setProofMarketplaceContract` (0x056de704) function - pub fn set_proof_marketplace_contract( - &self, - proof_marketplace: ::ethers::core::types::Address, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([5, 109, 231, 4], proof_marketplace) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `verify` (0x8e760afe) function - pub fn verify( - &self, - encoded_data: ::ethers::core::types::Bytes, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([142, 118, 10, 254], encoded_data) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `verifyAgainstSampleInputs` (0x02f77d19) function - pub fn verify_against_sample_inputs( - &self, - encoded_proof: ::ethers::core::types::Bytes, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([2, 247, 125, 25], encoded_proof) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `verifyInputs` (0xa6dfbc7f) function - pub fn verify_inputs( - &self, - inputs: ::ethers::core::types::Bytes, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([166, 223, 188, 127], inputs) - .expect("method not found (this should never happen)") - } - } - impl From<::ethers::contract::Contract> - for plonk_verifier_wrapper - { - fn from(contract: ::ethers::contract::Contract) -> Self { - Self::new(contract.address(), contract.client()) - } - } - ///Container type for all input parameters for the `checkSampleInputsAndProof` function with signature `checkSampleInputsAndProof()` and selector `0x10a54279` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall( - name = "checkSampleInputsAndProof", - abi = "checkSampleInputsAndProof()" - )] - pub struct CheckSampleInputsAndProofCall; - ///Container type for all input parameters for the `createRequest` function with signature `createRequest((uint256,uint256,uint256,uint256,uint256,address,bytes),uint8,bytes,bytes)` and selector `0xd2235eac` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall( - name = "createRequest", - abi = "createRequest((uint256,uint256,uint256,uint256,uint256,address,bytes),uint8,bytes,bytes)" - )] - pub struct CreateRequestCall { - pub ask: Ask, - pub secret_type: u8, - pub secret_inputs: ::ethers::core::types::Bytes, - pub acl: ::ethers::core::types::Bytes, - } - ///Container type for all input parameters for the `encodeInputAndProofForVerification` function with signature `encodeInputAndProofForVerification(bytes32[],bytes)` and selector `0x70f9dfca` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall( - name = "encodeInputAndProofForVerification", - abi = "encodeInputAndProofForVerification(bytes32[],bytes)" - )] - pub struct EncodeInputAndProofForVerificationCall { - pub inputs: ::std::vec::Vec<[u8; 32]>, - pub proof: ::ethers::core::types::Bytes, - } - ///Container type for all input parameters for the `encodeInputs` function with signature `encodeInputs(bytes32[])` and selector `0x3fa0cfbf` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "encodeInputs", abi = "encodeInputs(bytes32[])")] - pub struct EncodeInputsCall { - pub inputs: ::std::vec::Vec<[u8; 32]>, - } - ///Container type for all input parameters for the `encodeProof` function with signature `encodeProof(bytes)` and selector `0x4cff9125` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "encodeProof", abi = "encodeProof(bytes)")] - pub struct EncodeProofCall { - pub proof: ::ethers::core::types::Bytes, - } - ///Container type for all input parameters for the `iverifier` function with signature `iverifier()` and selector `0xe7f5b81d` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "iverifier", abi = "iverifier()")] - pub struct IverifierCall; - ///Container type for all input parameters for the `proofMarketplace` function with signature `proofMarketplace()` and selector `0x81c45c70` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "proofMarketplace", abi = "proofMarketplace()")] - pub struct ProofMarketplaceCall; - ///Container type for all input parameters for the `sampleInput` function with signature `sampleInput()` and selector `0x7d8ad42b` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "sampleInput", abi = "sampleInput()")] - pub struct SampleInputCall; - ///Container type for all input parameters for the `sampleProof` function with signature `sampleProof()` and selector `0xa76c0551` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "sampleProof", abi = "sampleProof()")] - pub struct SampleProofCall; - ///Container type for all input parameters for the `setProofMarketplaceContract` function with signature `setProofMarketplaceContract(address)` and selector `0x056de704` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall( - name = "setProofMarketplaceContract", - abi = "setProofMarketplaceContract(address)" - )] - pub struct SetProofMarketplaceContractCall { - pub proof_marketplace: ::ethers::core::types::Address, - } - ///Container type for all input parameters for the `verify` function with signature `verify(bytes)` and selector `0x8e760afe` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "verify", abi = "verify(bytes)")] - pub struct VerifyCall { - pub encoded_data: ::ethers::core::types::Bytes, - } - ///Container type for all input parameters for the `verifyAgainstSampleInputs` function with signature `verifyAgainstSampleInputs(bytes)` and selector `0x02f77d19` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall( - name = "verifyAgainstSampleInputs", - abi = "verifyAgainstSampleInputs(bytes)" - )] - pub struct VerifyAgainstSampleInputsCall { - pub encoded_proof: ::ethers::core::types::Bytes, - } - ///Container type for all input parameters for the `verifyInputs` function with signature `verifyInputs(bytes)` and selector `0xa6dfbc7f` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "verifyInputs", abi = "verifyInputs(bytes)")] - pub struct VerifyInputsCall { - pub inputs: ::ethers::core::types::Bytes, - } - ///Container type for all of the contract's call - #[derive( - Clone, - ::ethers::contract::EthAbiType, - serde::Serialize, - serde::Deserialize, - Debug, - PartialEq, - Eq, - Hash, - )] - pub enum plonk_verifier_wrapperCalls { - CheckSampleInputsAndProof(CheckSampleInputsAndProofCall), - CreateRequest(CreateRequestCall), - EncodeInputAndProofForVerification(EncodeInputAndProofForVerificationCall), - EncodeInputs(EncodeInputsCall), - EncodeProof(EncodeProofCall), - Iverifier(IverifierCall), - ProofMarketplace(ProofMarketplaceCall), - SampleInput(SampleInputCall), - SampleProof(SampleProofCall), - SetProofMarketplaceContract(SetProofMarketplaceContractCall), - Verify(VerifyCall), - VerifyAgainstSampleInputs(VerifyAgainstSampleInputsCall), - VerifyInputs(VerifyInputsCall), - } - impl ::ethers::core::abi::AbiDecode for plonk_verifier_wrapperCalls { - fn decode( - data: impl AsRef<[u8]>, - ) -> ::core::result::Result { - let data = data.as_ref(); - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::CheckSampleInputsAndProof(decoded)); - } - if let Ok(decoded) = ::decode(data) - { - return Ok(Self::CreateRequest(decoded)); - } - if let Ok(decoded) = - ::decode( - data, - ) - { - return Ok(Self::EncodeInputAndProofForVerification(decoded)); - } - if let Ok(decoded) = ::decode(data) - { - return Ok(Self::EncodeInputs(decoded)); - } - if let Ok(decoded) = ::decode(data) { - return Ok(Self::EncodeProof(decoded)); - } - if let Ok(decoded) = ::decode(data) { - return Ok(Self::Iverifier(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::ProofMarketplace(decoded)); - } - if let Ok(decoded) = ::decode(data) { - return Ok(Self::SampleInput(decoded)); - } - if let Ok(decoded) = ::decode(data) { - return Ok(Self::SampleProof(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::SetProofMarketplaceContract(decoded)); - } - if let Ok(decoded) = ::decode(data) { - return Ok(Self::Verify(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::VerifyAgainstSampleInputs(decoded)); - } - if let Ok(decoded) = ::decode(data) - { - return Ok(Self::VerifyInputs(decoded)); - } - Err(::ethers::core::abi::Error::InvalidData.into()) - } - } - impl ::ethers::core::abi::AbiEncode for plonk_verifier_wrapperCalls { - fn encode(self) -> Vec { - match self { - Self::CheckSampleInputsAndProof(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::CreateRequest(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::EncodeInputAndProofForVerification(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::EncodeInputs(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::EncodeProof(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::Iverifier(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::ProofMarketplace(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::SampleInput(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::SampleProof(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::SetProofMarketplaceContract(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::Verify(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::VerifyAgainstSampleInputs(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::VerifyInputs(element) => ::ethers::core::abi::AbiEncode::encode(element), - } - } - } - impl ::core::fmt::Display for plonk_verifier_wrapperCalls { - fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { - match self { - Self::CheckSampleInputsAndProof(element) => ::core::fmt::Display::fmt(element, f), - Self::CreateRequest(element) => ::core::fmt::Display::fmt(element, f), - Self::EncodeInputAndProofForVerification(element) => { - ::core::fmt::Display::fmt(element, f) - } - Self::EncodeInputs(element) => ::core::fmt::Display::fmt(element, f), - Self::EncodeProof(element) => ::core::fmt::Display::fmt(element, f), - Self::Iverifier(element) => ::core::fmt::Display::fmt(element, f), - Self::ProofMarketplace(element) => ::core::fmt::Display::fmt(element, f), - Self::SampleInput(element) => ::core::fmt::Display::fmt(element, f), - Self::SampleProof(element) => ::core::fmt::Display::fmt(element, f), - Self::SetProofMarketplaceContract(element) => ::core::fmt::Display::fmt(element, f), - Self::Verify(element) => ::core::fmt::Display::fmt(element, f), - Self::VerifyAgainstSampleInputs(element) => ::core::fmt::Display::fmt(element, f), - Self::VerifyInputs(element) => ::core::fmt::Display::fmt(element, f), - } - } - } - impl ::core::convert::From for plonk_verifier_wrapperCalls { - fn from(value: CheckSampleInputsAndProofCall) -> Self { - Self::CheckSampleInputsAndProof(value) - } - } - impl ::core::convert::From for plonk_verifier_wrapperCalls { - fn from(value: CreateRequestCall) -> Self { - Self::CreateRequest(value) - } - } - impl ::core::convert::From for plonk_verifier_wrapperCalls { - fn from(value: EncodeInputAndProofForVerificationCall) -> Self { - Self::EncodeInputAndProofForVerification(value) - } - } - impl ::core::convert::From for plonk_verifier_wrapperCalls { - fn from(value: EncodeInputsCall) -> Self { - Self::EncodeInputs(value) - } - } - impl ::core::convert::From for plonk_verifier_wrapperCalls { - fn from(value: EncodeProofCall) -> Self { - Self::EncodeProof(value) - } - } - impl ::core::convert::From for plonk_verifier_wrapperCalls { - fn from(value: IverifierCall) -> Self { - Self::Iverifier(value) - } - } - impl ::core::convert::From for plonk_verifier_wrapperCalls { - fn from(value: ProofMarketplaceCall) -> Self { - Self::ProofMarketplace(value) - } - } - impl ::core::convert::From for plonk_verifier_wrapperCalls { - fn from(value: SampleInputCall) -> Self { - Self::SampleInput(value) - } - } - impl ::core::convert::From for plonk_verifier_wrapperCalls { - fn from(value: SampleProofCall) -> Self { - Self::SampleProof(value) - } - } - impl ::core::convert::From for plonk_verifier_wrapperCalls { - fn from(value: SetProofMarketplaceContractCall) -> Self { - Self::SetProofMarketplaceContract(value) - } - } - impl ::core::convert::From for plonk_verifier_wrapperCalls { - fn from(value: VerifyCall) -> Self { - Self::Verify(value) - } - } - impl ::core::convert::From for plonk_verifier_wrapperCalls { - fn from(value: VerifyAgainstSampleInputsCall) -> Self { - Self::VerifyAgainstSampleInputs(value) - } - } - impl ::core::convert::From for plonk_verifier_wrapperCalls { - fn from(value: VerifyInputsCall) -> Self { - Self::VerifyInputs(value) - } - } - ///Container type for all return fields from the `checkSampleInputsAndProof` function with signature `checkSampleInputsAndProof()` and selector `0x10a54279` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct CheckSampleInputsAndProofReturn(pub bool); - ///Container type for all return fields from the `encodeInputAndProofForVerification` function with signature `encodeInputAndProofForVerification(bytes32[],bytes)` and selector `0x70f9dfca` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct EncodeInputAndProofForVerificationReturn(pub ::ethers::core::types::Bytes); - ///Container type for all return fields from the `encodeInputs` function with signature `encodeInputs(bytes32[])` and selector `0x3fa0cfbf` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct EncodeInputsReturn(pub ::ethers::core::types::Bytes); - ///Container type for all return fields from the `encodeProof` function with signature `encodeProof(bytes)` and selector `0x4cff9125` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct EncodeProofReturn(pub ::ethers::core::types::Bytes); - ///Container type for all return fields from the `iverifier` function with signature `iverifier()` and selector `0xe7f5b81d` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct IverifierReturn(pub ::ethers::core::types::Address); - ///Container type for all return fields from the `proofMarketplace` function with signature `proofMarketplace()` and selector `0x81c45c70` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct ProofMarketplaceReturn(pub ::ethers::core::types::Address); - ///Container type for all return fields from the `sampleInput` function with signature `sampleInput()` and selector `0x7d8ad42b` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct SampleInputReturn(pub ::ethers::core::types::Bytes); - ///Container type for all return fields from the `sampleProof` function with signature `sampleProof()` and selector `0xa76c0551` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct SampleProofReturn(pub ::ethers::core::types::Bytes); - ///Container type for all return fields from the `verify` function with signature `verify(bytes)` and selector `0x8e760afe` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct VerifyReturn(pub bool); - ///Container type for all return fields from the `verifyAgainstSampleInputs` function with signature `verifyAgainstSampleInputs(bytes)` and selector `0x02f77d19` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct VerifyAgainstSampleInputsReturn(pub bool); - ///Container type for all return fields from the `verifyInputs` function with signature `verifyInputs(bytes)` and selector `0xa6dfbc7f` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct VerifyInputsReturn(pub bool); -} diff --git a/bindings/src/priority_log.rs b/bindings/src/priority_log.rs deleted file mode 100644 index 9abe2a5..0000000 --- a/bindings/src/priority_log.rs +++ /dev/null @@ -1,278 +0,0 @@ -pub use priority_log::*; -/// 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 priority_log { - #[allow(deprecated)] - fn __abi() -> ::ethers::core::abi::Abi { - ::ethers::core::abi::ethabi::Contract { - constructor: ::core::option::Option::None, - functions: ::core::convert::From::from([ - ( - ::std::borrow::ToOwned::to_owned("priorityStore"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("priorityStore"), - inputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - },], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Uint(8usize), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("enum PriorityLog.Priority",), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("setPriority"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("setPriority"), - inputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("priority"), - kind: ::ethers::core::abi::ethabi::ParamType::Uint(8usize), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("enum PriorityLog.Priority",), - ), - },], - outputs: ::std::vec![], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable, - },], - ), - ]), - events: ::std::collections::BTreeMap::new(), - errors: ::std::collections::BTreeMap::new(), - receive: false, - fallback: false, - } - } - ///The parsed JSON ABI of the contract. - pub static PRIORITYLOG_ABI: ::ethers::contract::Lazy<::ethers::core::abi::Abi> = - ::ethers::contract::Lazy::new(__abi); - #[rustfmt::skip] - const __BYTECODE: &[u8] = b"`\x80`@R4\x80\x15a\0\x10W`\0\x80\xFD[Pa\x01\x83\x80a\0 `\09`\0\xF3\xFE`\x80`@R4\x80\x15a\0\x10W`\0\x80\xFD[P`\x046\x10a\x006W`\x005`\xE0\x1C\x80c\x99\x1A4\xE7\x14a\0;W\x80c\xDB&6\xF6\x14a\0tW[`\0\x80\xFD[a\0^a\0I6`\x04a\0\xBEV[`\0` \x81\x90R\x90\x81R`@\x90 T`\xFF\x16\x81V[`@Qa\0k\x91\x90a\x01\x04V[`@Q\x80\x91\x03\x90\xF3[a\0\x87a\0\x826`\x04a\x01,V[a\0\x89V[\0[3`\0\x81\x81R` \x81\x90R`@\x90 \x80T\x83\x91\x90`\xFF\x19\x16`\x01\x83`\x03\x81\x11\x15a\0\xB5Wa\0\xB5a\0\xEEV[\x02\x17\x90UPPPV[`\0` \x82\x84\x03\x12\x15a\0\xD0W`\0\x80\xFD[\x815`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a\0\xE7W`\0\x80\xFD[\x93\x92PPPV[cNH{q`\xE0\x1B`\0R`!`\x04R`$`\0\xFD[` \x81\x01`\x04\x83\x10a\x01&WcNH{q`\xE0\x1B`\0R`!`\x04R`$`\0\xFD[\x91\x90R\x90V[`\0` \x82\x84\x03\x12\x15a\x01>W`\0\x80\xFD[\x815`\x04\x81\x10a\0\xE7W`\0\x80\xFD\xFE\xA2dipfsX\"\x12 \xF4\xAA\xF9\xC6\xE9r<\x7F\xF7?\xDE\xBC\xFD\xC4\xE3\x9F\xB9\x9D\xFCH\xD1k\xCA2\xD7\x93\xBB\x04\x1F\xE7\x1F\xFCdsolcC\0\x08\x14\x003"; - /// The bytecode of the contract. - pub static PRIORITYLOG_BYTECODE: ::ethers::core::types::Bytes = - ::ethers::core::types::Bytes::from_static(__BYTECODE); - #[rustfmt::skip] - const __DEPLOYED_BYTECODE: &[u8] = b"`\x80`@R4\x80\x15a\0\x10W`\0\x80\xFD[P`\x046\x10a\x006W`\x005`\xE0\x1C\x80c\x99\x1A4\xE7\x14a\0;W\x80c\xDB&6\xF6\x14a\0tW[`\0\x80\xFD[a\0^a\0I6`\x04a\0\xBEV[`\0` \x81\x90R\x90\x81R`@\x90 T`\xFF\x16\x81V[`@Qa\0k\x91\x90a\x01\x04V[`@Q\x80\x91\x03\x90\xF3[a\0\x87a\0\x826`\x04a\x01,V[a\0\x89V[\0[3`\0\x81\x81R` \x81\x90R`@\x90 \x80T\x83\x91\x90`\xFF\x19\x16`\x01\x83`\x03\x81\x11\x15a\0\xB5Wa\0\xB5a\0\xEEV[\x02\x17\x90UPPPV[`\0` \x82\x84\x03\x12\x15a\0\xD0W`\0\x80\xFD[\x815`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a\0\xE7W`\0\x80\xFD[\x93\x92PPPV[cNH{q`\xE0\x1B`\0R`!`\x04R`$`\0\xFD[` \x81\x01`\x04\x83\x10a\x01&WcNH{q`\xE0\x1B`\0R`!`\x04R`$`\0\xFD[\x91\x90R\x90V[`\0` \x82\x84\x03\x12\x15a\x01>W`\0\x80\xFD[\x815`\x04\x81\x10a\0\xE7W`\0\x80\xFD\xFE\xA2dipfsX\"\x12 \xF4\xAA\xF9\xC6\xE9r<\x7F\xF7?\xDE\xBC\xFD\xC4\xE3\x9F\xB9\x9D\xFCH\xD1k\xCA2\xD7\x93\xBB\x04\x1F\xE7\x1F\xFCdsolcC\0\x08\x14\x003"; - /// The deployed bytecode of the contract. - pub static PRIORITYLOG_DEPLOYED_BYTECODE: ::ethers::core::types::Bytes = - ::ethers::core::types::Bytes::from_static(__DEPLOYED_BYTECODE); - pub struct PriorityLog(::ethers::contract::Contract); - impl ::core::clone::Clone for PriorityLog { - fn clone(&self) -> Self { - Self(::core::clone::Clone::clone(&self.0)) - } - } - impl ::core::ops::Deref for PriorityLog { - type Target = ::ethers::contract::Contract; - fn deref(&self) -> &Self::Target { - &self.0 - } - } - impl ::core::ops::DerefMut for PriorityLog { - fn deref_mut(&mut self) -> &mut Self::Target { - &mut self.0 - } - } - impl ::core::fmt::Debug for PriorityLog { - fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { - f.debug_tuple(::core::stringify!(PriorityLog)) - .field(&self.address()) - .finish() - } - } - impl PriorityLog { - /// 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(), - PRIORITYLOG_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( - PRIORITYLOG_ABI.clone(), - PRIORITYLOG_BYTECODE.clone().into(), - client, - ); - let deployer = factory.deploy(constructor_args)?; - let deployer = ::ethers::contract::ContractDeployer::new(deployer); - Ok(deployer) - } - ///Calls the contract's `priorityStore` (0x991a34e7) function - pub fn priority_store( - &self, - p0: ::ethers::core::types::Address, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([153, 26, 52, 231], p0) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `setPriority` (0xdb2636f6) function - pub fn set_priority( - &self, - priority: u8, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([219, 38, 54, 246], priority) - .expect("method not found (this should never happen)") - } - } - impl From<::ethers::contract::Contract> for PriorityLog { - fn from(contract: ::ethers::contract::Contract) -> Self { - Self::new(contract.address(), contract.client()) - } - } - ///Container type for all input parameters for the `priorityStore` function with signature `priorityStore(address)` and selector `0x991a34e7` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "priorityStore", abi = "priorityStore(address)")] - pub struct PriorityStoreCall(pub ::ethers::core::types::Address); - ///Container type for all input parameters for the `setPriority` function with signature `setPriority(uint8)` and selector `0xdb2636f6` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "setPriority", abi = "setPriority(uint8)")] - pub struct SetPriorityCall { - pub priority: u8, - } - ///Container type for all of the contract's call - #[derive( - Clone, - ::ethers::contract::EthAbiType, - serde::Serialize, - serde::Deserialize, - Debug, - PartialEq, - Eq, - Hash, - )] - pub enum PriorityLogCalls { - PriorityStore(PriorityStoreCall), - SetPriority(SetPriorityCall), - } - impl ::ethers::core::abi::AbiDecode for PriorityLogCalls { - fn decode( - data: impl AsRef<[u8]>, - ) -> ::core::result::Result { - let data = data.as_ref(); - if let Ok(decoded) = ::decode(data) - { - return Ok(Self::PriorityStore(decoded)); - } - if let Ok(decoded) = ::decode(data) { - return Ok(Self::SetPriority(decoded)); - } - Err(::ethers::core::abi::Error::InvalidData.into()) - } - } - impl ::ethers::core::abi::AbiEncode for PriorityLogCalls { - fn encode(self) -> Vec { - match self { - Self::PriorityStore(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::SetPriority(element) => ::ethers::core::abi::AbiEncode::encode(element), - } - } - } - impl ::core::fmt::Display for PriorityLogCalls { - fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { - match self { - Self::PriorityStore(element) => ::core::fmt::Display::fmt(element, f), - Self::SetPriority(element) => ::core::fmt::Display::fmt(element, f), - } - } - } - impl ::core::convert::From for PriorityLogCalls { - fn from(value: PriorityStoreCall) -> Self { - Self::PriorityStore(value) - } - } - impl ::core::convert::From for PriorityLogCalls { - fn from(value: SetPriorityCall) -> Self { - Self::SetPriority(value) - } - } - ///Container type for all return fields from the `priorityStore` function with signature `priorityStore(address)` and selector `0x991a34e7` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct PriorityStoreReturn(pub u8); -} diff --git a/bindings/src/proof_marketplace.rs b/bindings/src/proof_marketplace.rs index 0206625..c70f714 100644 --- a/bindings/src/proof_marketplace.rs +++ b/bindings/src/proof_marketplace.rs @@ -10,7 +10,6 @@ pub use proof_marketplace::*; non_camel_case_types )] pub mod proof_marketplace { - pub use super::super::shared_types::*; #[allow(deprecated)] fn __abi() -> ::ethers::core::abi::Abi { ::ethers::core::abi::ethabi::Contract { @@ -805,6 +804,30 @@ pub mod proof_marketplace { state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, },], ), + ( + ::std::borrow::ToOwned::to_owned("minProvingTime"), + ::std::vec![::ethers::core::abi::ethabi::Function { + name: ::std::borrow::ToOwned::to_owned("minProvingTime"), + inputs: ::std::vec![::ethers::core::abi::ethabi::Param { + name: ::std::string::String::new(), + kind: ::ethers::core::abi::ethabi::ParamType::Uint(8usize), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned( + "enum ProofMarketplace.SecretType", + ), + ), + },], + outputs: ::std::vec![::ethers::core::abi::ethabi::Param { + name: ::std::string::String::new(), + kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("uint256"), + ), + },], + constant: ::core::option::Option::None, + state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, + },], + ), ( ::std::borrow::ToOwned::to_owned("pause"), ::std::vec![::ethers::core::abi::ethabi::Function { @@ -1177,6 +1200,33 @@ pub mod proof_marketplace { state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable, },], ), + ( + ::std::borrow::ToOwned::to_owned("updateMinProvingTime"), + ::std::vec![::ethers::core::abi::ethabi::Function { + name: ::std::borrow::ToOwned::to_owned("updateMinProvingTime",), + inputs: ::std::vec![ + ::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("secretType"), + kind: ::ethers::core::abi::ethabi::ParamType::Uint(8usize), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned( + "enum ProofMarketplace.SecretType", + ), + ), + }, + ::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("newProvingTime"), + kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("uint256"), + ), + }, + ], + outputs: ::std::vec![], + constant: ::core::option::Option::None, + state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable, + },], + ), ( ::std::borrow::ToOwned::to_owned("upgradeToAndCall"), ::std::vec![::ethers::core::abi::ethabi::Function { @@ -1229,6 +1279,44 @@ pub mod proof_marketplace { ), ]), events: ::core::convert::From::from([ + ( + ::std::borrow::ToOwned::to_owned("AddExtraIVSImage"), + ::std::vec![::ethers::core::abi::ethabi::Event { + name: ::std::borrow::ToOwned::to_owned("AddExtraIVSImage"), + inputs: ::std::vec![ + ::ethers::core::abi::ethabi::EventParam { + name: ::std::borrow::ToOwned::to_owned("marketId"), + kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), + indexed: true, + }, + ::ethers::core::abi::ethabi::EventParam { + name: ::std::borrow::ToOwned::to_owned("imageId"), + kind: ::ethers::core::abi::ethabi::ParamType::FixedBytes(32usize,), + indexed: true, + }, + ], + anonymous: false, + },], + ), + ( + ::std::borrow::ToOwned::to_owned("AddExtraProverImage"), + ::std::vec![::ethers::core::abi::ethabi::Event { + name: ::std::borrow::ToOwned::to_owned("AddExtraProverImage",), + inputs: ::std::vec![ + ::ethers::core::abi::ethabi::EventParam { + name: ::std::borrow::ToOwned::to_owned("marketId"), + kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), + indexed: true, + }, + ::ethers::core::abi::ethabi::EventParam { + name: ::std::borrow::ToOwned::to_owned("imageId"), + kind: ::ethers::core::abi::ethabi::ParamType::FixedBytes(32usize,), + indexed: true, + }, + ], + anonymous: false, + },], + ), ( ::std::borrow::ToOwned::to_owned("AskCancelled"), ::std::vec![::ethers::core::abi::ethabi::Event { @@ -1349,6 +1437,44 @@ pub mod proof_marketplace { anonymous: false, },], ), + ( + ::std::borrow::ToOwned::to_owned("RemoveExtraIVSImage"), + ::std::vec![::ethers::core::abi::ethabi::Event { + name: ::std::borrow::ToOwned::to_owned("RemoveExtraIVSImage",), + inputs: ::std::vec![ + ::ethers::core::abi::ethabi::EventParam { + name: ::std::borrow::ToOwned::to_owned("marketId"), + kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), + indexed: true, + }, + ::ethers::core::abi::ethabi::EventParam { + name: ::std::borrow::ToOwned::to_owned("imageId"), + kind: ::ethers::core::abi::ethabi::ParamType::FixedBytes(32usize,), + indexed: true, + }, + ], + anonymous: false, + },], + ), + ( + ::std::borrow::ToOwned::to_owned("RemoveExtraProverImage"), + ::std::vec![::ethers::core::abi::ethabi::Event { + name: ::std::borrow::ToOwned::to_owned("RemoveExtraProverImage",), + inputs: ::std::vec![ + ::ethers::core::abi::ethabi::EventParam { + name: ::std::borrow::ToOwned::to_owned("marketId"), + kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), + indexed: true, + }, + ::ethers::core::abi::ethabi::EventParam { + name: ::std::borrow::ToOwned::to_owned("imageId"), + kind: ::ethers::core::abi::ethabi::ParamType::FixedBytes(32usize,), + indexed: true, + }, + ], + anonymous: false, + },], + ), ( ::std::borrow::ToOwned::to_owned("RoleAdminChanged"), ::std::vec![::ethers::core::abi::ethabi::Event { @@ -1476,6 +1602,25 @@ pub mod proof_marketplace { anonymous: false, },], ), + ( + ::std::borrow::ToOwned::to_owned("UpdateMinProvingTime"), + ::std::vec![::ethers::core::abi::ethabi::Event { + name: ::std::borrow::ToOwned::to_owned("UpdateMinProvingTime",), + inputs: ::std::vec![ + ::ethers::core::abi::ethabi::EventParam { + name: ::std::borrow::ToOwned::to_owned("secretType"), + kind: ::ethers::core::abi::ethabi::ParamType::Uint(8usize), + indexed: true, + }, + ::ethers::core::abi::ethabi::EventParam { + name: ::std::borrow::ToOwned::to_owned("newProvingTime"), + kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), + indexed: false, + }, + ], + anonymous: false, + },], + ), ( ::std::borrow::ToOwned::to_owned("Upgraded"), ::std::vec![::ethers::core::abi::ethabi::Event { @@ -1532,19 +1677,6 @@ pub mod proof_marketplace { },], },], ), - ( - ::std::borrow::ToOwned::to_owned("AddressInsufficientBalance"), - ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("AddressInsufficientBalance",), - inputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("account"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - },], - },], - ), ( ::std::borrow::ToOwned::to_owned("ArityMismatch"), ::std::vec![::ethers::core::abi::ethabi::AbiError { @@ -1680,12 +1812,34 @@ pub mod proof_marketplace { },], ), ( - ::std::borrow::ToOwned::to_owned("FailedInnerCall"), + ::std::borrow::ToOwned::to_owned("FailedCall"), ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("FailedInnerCall"), + name: ::std::borrow::ToOwned::to_owned("FailedCall"), inputs: ::std::vec![], },], ), + ( + ::std::borrow::ToOwned::to_owned("ImageAlreadyInFamily"), + ::std::vec![::ethers::core::abi::ethabi::AbiError { + name: ::std::borrow::ToOwned::to_owned("ImageAlreadyInFamily",), + inputs: ::std::vec![ + ::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("imageId"), + kind: ::ethers::core::abi::ethabi::ParamType::FixedBytes(32usize,), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("bytes32"), + ), + }, + ::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("familyId"), + kind: ::ethers::core::abi::ethabi::ParamType::FixedBytes(32usize,), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("bytes32"), + ), + }, + ], + },], + ), ( ::std::borrow::ToOwned::to_owned("InactiveMarket"), ::std::vec![::ethers::core::abi::ethabi::AbiError { @@ -1915,12 +2069,12 @@ pub mod proof_marketplace { pub static PROOFMARKETPLACE_ABI: ::ethers::contract::Lazy<::ethers::core::abi::Abi> = ::ethers::contract::Lazy::new(__abi); #[rustfmt::skip] - const __BYTECODE: &[u8] = b"a\x01@`@R0`\x80R4\x80\x15b\0\0\x16W`\0\x80\xFD[P`@Qb\0^y8\x03\x80b\0^y\x839\x81\x01`@\x81\x90Rb\0\09\x91b\0\x01\x94V[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x80Th\x01\0\0\0\0\0\0\0\0\x81\x04`\xFF\x16\x15\x90`\x01`\x01`@\x1B\x03\x16`\0\x81\x15\x80\x15b\0\0\x84WP\x82[\x90P`\0\x82`\x01`\x01`@\x1B\x03\x16`\x01\x14\x80\x15b\0\0\xA1WP0;\x15[\x90P\x81\x15\x80\x15b\0\0\xB0WP\x80\x15[\x15b\0\0\xCFW`@Qc\xF9.\xE8\xA9`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x84T`\x01`\x01`@\x1B\x03\x19\x16`\x01\x17\x85U\x83\x15b\0\0\xFEW\x84T`\xFF`@\x1B\x19\x16h\x01\0\0\0\0\0\0\0\0\x17\x85U[`\x01`\x01`\xA0\x1B\x03\x80\x8B\x16`\xA0R`\xC0\x8A\x90R\x88\x81\x16`\xE0R\x87\x81\x16a\x01\0R\x86\x16a\x01 R\x83\x15b\0\x01kW\x84T`\xFF`@\x1B\x19\x16\x85U`@Q`\x01\x81R\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x90` \x01`@Q\x80\x91\x03\x90\xA1[PPPPPPPPPPb\0\x02\x08V[`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14b\0\x01\x91W`\0\x80\xFD[PV[`\0\x80`\0\x80`\0`\xA0\x86\x88\x03\x12\x15b\0\x01\xADW`\0\x80\xFD[\x85Qb\0\x01\xBA\x81b\0\x01{V[` \x87\x01Q`@\x88\x01Q\x91\x96P\x94Pb\0\x01\xD4\x81b\0\x01{V[``\x87\x01Q\x90\x93Pb\0\x01\xE7\x81b\0\x01{V[`\x80\x87\x01Q\x90\x92Pb\0\x01\xFA\x81b\0\x01{V[\x80\x91PP\x92\x95P\x92\x95\x90\x93PV[`\x80Q`\xA0Q`\xC0Q`\xE0Qa\x01\0Qa\x01 Qa[db\0\x03\x15`\09`\0\x81\x81a\x05\xBA\x01R\x81\x81a\x0B\x0E\x01R\x81\x81a\x0C\x05\x01R\x81\x81a\x0E\x04\x01R\x81\x81a\x0E\x8F\x01R\x81\x81a\x16M\x01R\x81\x81a\x17\x19\x01R\x81\x81a\x19\xF8\x01R\x81\x81a\x1B\xBD\x01R\x81\x81a\"\xAA\x01R\x81\x81a$\x14\x01RaAn\x01R`\0\x81\x81a\x07m\x01R\x81\x81a,F\x01R\x81\x81a0\x8D\x01R\x81\x81a1\xEF\x01R\x81\x81a4~\x01R\x81\x81a6\xEB\x01R\x81\x81a?\xEC\x01RaB\xD7\x01R`\0\x81\x81a\r\xA2\x01R\x81\x81a\x13\xCD\x01R\x81\x81a:\xC5\x01RaB\x80\x01R`\0\x81\x81a\x05\x86\x01Ra\r\xC3\x01R`\0\x81\x81a\x06\xCB\x01R\x81\x81a\r\x7F\x01R\x81\x81a\x1F\xE5\x01Ra:\x98\x01R`\0\x81\x81a.\x97\x01R\x81\x81a.\xC0\x01Ra2\xA1\x01Ra[d`\0\xF3\xFE`\x80`@R`\x046\x10a\x02}W`\x005`\xE0\x1C\x80ceY9{\x11a\x01OW\x80c\x91\xD1HT\x11a\0\xC1W\x80c\xD4\xC2B6\x11a\0zW\x80c\xD4\xC2B6\x14a\x08\"W\x80c\xD5Gt\x1F\x14a\x08BW\x80c\xE6\xAF\xC3\xD9\x14a\x08bW\x80c\xF0`,\xAB\x14a\x08\x82W\x80c\xF8\xA9H/\x14a\x08\xA2W\x80c\xFB\xEF\x98m\x14a\x08\xD5W`\0\x80\xFD[\x80c\x91\xD1HT\x14a\x07;W\x80c\x97Q\xBB\xD3\x14a\x07[W\x80c\xA2\x17\xFD\xDF\x14a\x07\x8FW\x80c\xAD<\xB1\xCC\x14a\x07\xA4W\x80c\xC2D\xA7\xB9\x14a\x07\xE2W\x80c\xC4\xD6m\xE8\x14a\x08\x02W`\0\x80\xFD[\x80cx\x7F\xB0K\x11a\x01\x13W\x80cx\x7F\xB0K\x14a\x06dW\x80cy\xC7n\x1A\x14a\x06\x84W\x80c\x84V\xCBY\x14a\x06\xA4W\x80c\x87|\x86\xFB\x14a\x06\xB9W\x80c\x89\x88PI\x14a\x06\xEDW\x80c\x8E\xCC\xBD\xAF\x14a\x07\x1BW`\0\x80\xFD[\x80ceY9{\x14a\x05tW\x80cf\x1D\xE5\xAC\x14a\x05\xA8W\x80cl\x8D\xF5\x18\x14a\x05\xF4W\x80cm\xA6w\x9B\x14a\x06$W\x80cpS\x8F\xCA\x14a\x06DW`\0\x80\xFD[\x80c6V\x8A\xBE\x11a\x01\xF3W\x80cO\x1E\xF2\x86\x11a\x01\xACW\x80cO\x1E\xF2\x86\x14a\x04\xC7W\x80cRy\x86\xD0\x14a\x04\xDAW\x80cR\xD1\x90-\x14a\x04\xFAW\x80cS{[\x7F\x14a\x05\x0FW\x80c\\\x97Z\xBB\x14a\x05/W\x80cd\x17\xFBa\x14a\x05TW`\0\x80\xFD[\x80c6V\x8A\xBE\x14a\x03\xF5W\x80c?K\xA8:\x14a\x04\x15W\x80cE\x07R\xB4\x14a\x04*W\x80cG\xE63\x80\x14a\x04JW\x80cIm\xF3\xB1\x14a\x04lW\x80cMFq-\x14a\x04\x9AW`\0\x80\xFD[\x80c }f)\x11a\x02EW\x80c }f)\x14a\x03GW\x80c$v\x08\x07\x14a\x03gW\x80c$\x8A\x9C\xA3\x14a\x03}W\x80c(D8\xA1\x14a\x03\x9DW\x80c//\xF1]\x14a\x03\xBFW\x80c1u\x93\xD2\x14a\x03\xDFW`\0\x80\xFD[\x80c\x01\xFF\xC9\xA7\x14a\x02\x82W\x80c\x04K\xC8\xED\x14a\x02\xB7W\x80c\x15\xC9\x8Az\x14a\x02\xD9W\x80c\x16\x0F\xCF\xBA\x14a\x02\xF9W\x80c\x16(\xE0\xF5\x14a\x03'W[`\0\x80\xFD[4\x80\x15a\x02\x8EW`\0\x80\xFD[Pa\x02\xA2a\x02\x9D6`\x04aI\x7FV[a\x08\xEAV[`@Q\x90\x15\x15\x81R` \x01[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x02\xC3W`\0\x80\xFD[Pa\x02\xD7a\x02\xD26`\x04aI\xEDV[a\x08\xFBV[\0[4\x80\x15a\x02\xE5W`\0\x80\xFD[Pa\x02\xD7a\x02\xF46`\x04aJ\xBCV[a\x0C\xAFV[4\x80\x15a\x03\x05W`\0\x80\xFD[Pa\x03\x19a\x03\x146`\x04aK\x9AV[a\x10|V[`@Q\x90\x81R` \x01a\x02\xAEV[4\x80\x15a\x033W`\0\x80\xFD[Pa\x02\xD7a\x03B6`\x04aL>V[a\x11\x07V[4\x80\x15a\x03SW`\0\x80\xFD[Pa\x03\x19a\x03b6`\x04aL>V[a\x11\xDBV[4\x80\x15a\x03sW`\0\x80\xFD[Pa\x01\xF4Ta\x03\x19V[4\x80\x15a\x03\x89W`\0\x80\xFD[Pa\x03\x19a\x03\x986`\x04aL>V[a\x14\x01V[4\x80\x15a\x03\xA9W`\0\x80\xFD[Pa\x03\x19`\0\x80Q` a[\x0F\x839\x81Q\x91R\x81V[4\x80\x15a\x03\xCBW`\0\x80\xFD[Pa\x02\xD7a\x03\xDA6`\x04aLbV[a\x14#V[4\x80\x15a\x03\xEBW`\0\x80\xFD[Pa\x01\xF5Ta\x03\x19V[4\x80\x15a\x04\x01W`\0\x80\xFD[Pa\x02\xD7a\x04\x106`\x04aLbV[a\x14EV[4\x80\x15a\x04!W`\0\x80\xFD[Pa\x02\xD7a\x14}V[4\x80\x15a\x046W`\0\x80\xFD[Pa\x02\xD7a\x04E6`\x04aI\xEDV[a\x14\x9DV[4\x80\x15a\x04VW`\0\x80\xFD[Pa\x03\x19`\0\x80Q` aZ\xAF\x839\x81Q\x91R\x81V[4\x80\x15a\x04xW`\0\x80\xFD[Pa\x03\x19a\x04\x876`\x04aL\x92V[a\x01\xF6` R`\0\x90\x81R`@\x90 T\x81V[4\x80\x15a\x04\xA6W`\0\x80\xFD[Pa\x04\xBAa\x04\xB56`\x04aL>V[a\x17\xD6V[`@Qa\x02\xAE\x91\x90aL\xE5V[a\x02\xD7a\x04\xD56`\x04aM\xDEV[a\x19\xCFV[4\x80\x15a\x04\xE6W`\0\x80\xFD[Pa\x02\xD7a\x04\xF56`\x04aN-V[a\x19\xEEV[4\x80\x15a\x05\x06W`\0\x80\xFD[Pa\x03\x19a\x1A\xE3V[4\x80\x15a\x05\x1BW`\0\x80\xFD[Pa\x02\xD7a\x05*6`\x04aO\x11V[a\x1B\0V[4\x80\x15a\x05;W`\0\x80\xFD[P`\0\x80Q` aZ\xEF\x839\x81Q\x91RT`\xFF\x16a\x02\xA2V[4\x80\x15a\x05`W`\0\x80\xFD[Pa\x02\xD7a\x05o6`\x04aOyV[a\x1B\x96V[4\x80\x15a\x05\x80W`\0\x80\xFD[Pa\x03\x19\x7F\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\x81V[4\x80\x15a\x05\xB4W`\0\x80\xFD[Pa\x05\xDC\x7F\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\x81V[`@Q`\x01`\x01`\xA0\x1B\x03\x90\x91\x16\x81R` \x01a\x02\xAEV[4\x80\x15a\x06\0W`\0\x80\xFD[Pa\x06\x14a\x06\x0F6`\x04aL>V[a\x1COV[`@Qa\x02\xAE\x94\x93\x92\x91\x90aP$V[4\x80\x15a\x060W`\0\x80\xFD[Pa\x03\x19a\x06?6`\x04aLbV[a\x1D\x82V[4\x80\x15a\x06PW`\0\x80\xFD[Pa\x02\xD7a\x06_6`\x04aP\xBFV[a\x1D\xDDV[4\x80\x15a\x06pW`\0\x80\xFD[Pa\x02\xD7a\x06\x7F6`\x04aL>V[a\x1E\x0CV[4\x80\x15a\x06\x90W`\0\x80\xFD[Pa\x02\xD7a\x06\x9F6`\x04aQ\tV[a\x1F\xB8V[4\x80\x15a\x06\xB0W`\0\x80\xFD[Pa\x02\xD7a (V[4\x80\x15a\x06\xC5W`\0\x80\xFD[Pa\x05\xDC\x7F\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\x81V[4\x80\x15a\x06\xF9W`\0\x80\xFD[Pa\x03\x19a\x07\x086`\x04aQ\tV[a\x01\xF7` R`\0\x90\x81R`@\x90 T\x81V[4\x80\x15a\x07'W`\0\x80\xFD[Pa\x02\xD7a\x0766`\x04aQ&V[a HV[4\x80\x15a\x07GW`\0\x80\xFD[Pa\x02\xA2a\x07V6`\x04aLbV[a \xE4V[4\x80\x15a\x07gW`\0\x80\xFD[Pa\x05\xDC\x7F\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\x81V[4\x80\x15a\x07\x9BW`\0\x80\xFD[Pa\x03\x19`\0\x81V[4\x80\x15a\x07\xB0W`\0\x80\xFD[Pa\x07\xD5`@Q\x80`@\x01`@R\x80`\x05\x81R` \x01d\x03R\xE3\x02\xE3`\xDC\x1B\x81RP\x81V[`@Qa\x02\xAE\x91\x90aQPV[4\x80\x15a\x07\xEEW`\0\x80\xFD[Pa\x02\xD7a\x07\xFD6`\x04aQcV[a!\x1CV[4\x80\x15a\x08\x0EW`\0\x80\xFD[Pa\x02\xD7a\x08\x1D6`\x04aQ\tV[a!7V[4\x80\x15a\x08.W`\0\x80\xFD[Pa\x02\xD7a\x08=6`\x04aQ\xA1V[a\"\x90V[4\x80\x15a\x08NW`\0\x80\xFD[Pa\x02\xD7a\x08]6`\x04aLbV[a#V[a(\xB6V[`@Qa\x02\xAE\x97\x96\x95\x94\x93\x92\x91\x90aR\xBFV[4\x80\x15a\x08\xE1W`\0\x80\xFD[Pa\x03\x19`d\x81V[`\0a\x08\xF5\x82a)\x9FV[\x92\x91PPV[`\0a\x01\xF4\x86\x81T\x81\x10a\t\x11Wa\t\x11aS\x0FV[`\0\x91\x82R` \x91\x82\x90 `@\x80Q`\xE0\x81\x01\x82R`\x07\x90\x93\x02\x90\x91\x01\x80T`\x01`\x01`\xA0\x1B\x03\x90\x81\x16\x84R`\x01\x82\x01T\x94\x84\x01\x94\x90\x94R`\x02\x81\x01T\x91\x83\x01\x91\x90\x91R`\x03\x81\x01T``\x83\x01R`\x04\x81\x01T`\x80\x83\x01R`\x05\x81\x01T\x90\x92\x16`\xA0\x82\x01R`\x06\x82\x01\x80T\x91\x92\x91`\xC0\x84\x01\x91\x90a\t\x8E\x90aS%V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\t\xBA\x90aS%V[\x80\x15a\n\x07W\x80`\x1F\x10a\t\xDCWa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\n\x07V[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\t\xEAW\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81RPP\x90P\x80`\xC0\x01QQ`\0\x03a\n8W`@Qc\x9D\xB8\xD5\xB1`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\xA0\x81\x01Q`\x01`\x01`\xA0\x1B\x03\x163`\x01`\x01`\xA0\x1B\x03\x16\x14a\nnW`@Qc8\x99:I`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x83\x15a\x0B\xB1Wa\n\x81\x81` \x01Qa)\xD4V[a\n\x9EW`@Qcz\xFC\xEF\x7F`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0[\x84\x81\x10\x15a\x0B\xAFW`\0a\n\xD7\x87\x87\x84\x81\x81\x10a\n\xC0Wa\n\xC0aS\x0FV[\x90P` \x02\x81\x01\x90a\n\xD2\x91\x90aSYV[a*\tV[\x90P\x82` \x01Q\x81\x03a\x0B\x0CW`@QcZ\xB2\xFB\xC9`\xE1\x1B\x81R`\x04\x81\x01\x89\x90R`$\x81\x01\x82\x90R`D\x01[`@Q\x80\x91\x03\x90\xFD[\x7F\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`\x01`\x01`\xA0\x1B\x03\x16c\x14\x13\xA9*\x82a\x0BE\x8Ba*+V[`@Q`\x01`\x01`\xE0\x1B\x03\x19`\xE0\x85\x90\x1B\x16\x81R`\x04\x81\x01\x92\x90\x92R`$\x82\x01R`D\x01`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x0B\x83W`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x0B\x97W=`\0\x80>=`\0\xFD[PPPPP\x80\x80a\x0B\xA7\x90aS\xB5V[\x91PPa\n\xA1V[P[`\0[\x82\x81\x10\x15a\x0C\xA6W`\0a\x0B\xD3\x85\x85\x84\x81\x81\x10a\n\xC0Wa\n\xC0aS\x0FV[\x90P\x82`\x80\x01Q\x81\x03a\x0C\x03W`@QcZ\xB2\xFB\xC9`\xE1\x1B\x81R`\x04\x81\x01\x89\x90R`$\x81\x01\x82\x90R`D\x01a\x0B\x03V[\x7F\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`\x01`\x01`\xA0\x1B\x03\x16c\x14\x13\xA9*\x82a\x0C<\x8Ba*sV[`@Q`\x01`\x01`\xE0\x1B\x03\x19`\xE0\x85\x90\x1B\x16\x81R`\x04\x81\x01\x92\x90\x92R`$\x82\x01R`D\x01`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x0CzW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x0C\x8EW=`\0\x80>=`\0\xFD[PPPPP\x80\x80a\x0C\x9E\x90aS\xB5V[\x91PPa\x0B\xB4V[PPPPPPPV[a\x0C\xB7a*\xA2V[3\x85\x15\x80a\x0C\xC3WP\x87\x15[\x80a\x0C\xD5WP`\x01`\x01`\xA0\x1B\x03\x87\x16\x15[\x15a\x0C\xF3W`@Qc\x1E\x1D\n\xB5`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x86`\x01`\x01`\xA0\x1B\x03\x16c\x10\xA5By`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\r1W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\rU\x91\x90aS\xCEV[a\rrW`@Qcy\xA6}[`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\r\xE7`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x82\x7F\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\x7F\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\0a*\xECV[a\x01\xF4Ta\r\xFDa\r\xF8\x87\x87a*\tV[a)\xD4V[\x15a\x0E\x8DW\x7F\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`\x01`\x01`\xA0\x1B\x03\x16c\xFF\x11J\xE1a\x0E:\x83a*+V[\x88\x88`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x0EZ\x93\x92\x91\x90aT\x19V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x0EtW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x0E\x88W=`\0\x80>=`\0\xFD[PPPP[\x7F\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`\x01`\x01`\xA0\x1B\x03\x16c\xFF\x11J\xE1a\x0E\xC5\x83a*sV[\x86\x86`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x0E\xE5\x93\x92\x91\x90aT\x19V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x0E\xFFW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x0F\x13W=`\0\x80>=`\0\xFD[PPPPa\x01\xF4`@Q\x80`\xE0\x01`@R\x80\x8A`\x01`\x01`\xA0\x1B\x03\x16\x81R` \x01a\x0F>\x89\x89a*\tV[\x81R` \x81\x01\x8A\x90R`@\x01a\x0FU`dCaT3V[\x81R` \x01a\x0Fd\x87\x87a*\tV[\x81R` \x01\x84`\x01`\x01`\xA0\x1B\x03\x16\x81R` \x01\x8C\x8C\x80\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x93\x92\x91\x90\x81\x81R` \x01\x83\x83\x80\x82\x847`\0\x92\x01\x82\x90RP\x93\x90\x94RPP\x83T`\x01\x80\x82\x01\x86U\x94\x82R` \x91\x82\x90 \x84Q`\x07\x90\x92\x02\x01\x80T`\x01`\x01`\xA0\x1B\x03\x19\x90\x81\x16`\x01`\x01`\xA0\x1B\x03\x93\x84\x16\x17\x82U\x92\x85\x01Q\x95\x81\x01\x95\x90\x95U`@\x84\x01Q`\x02\x86\x01U``\x84\x01Q`\x03\x86\x01U`\x80\x84\x01Q`\x04\x86\x01U`\xA0\x84\x01Q`\x05\x86\x01\x80T\x90\x93\x16\x91\x16\x17\x90UP`\xC0\x81\x01Q\x90\x91\x90`\x06\x82\x01\x90a\x10:\x90\x82aT\x8CV[PP`@Q\x82\x91P\x7F\xB8Z>yOG^\xD5\xE4\x03}\xC5\xF2\xD5\xC3(\xC8\xD5N\x0C\x1AL\xA5Sc\x82\x90\x15\xE6\xC7\x0C\x89\x90`\0\x90\xA2PPa\x10ra+SV[PPPPPPPPV[`\0\x80a\x01\xF6`\0\x89`\x02\x81\x11\x15a\x10\x96Wa\x10\x96aL\xADV[`\x02\x81\x11\x15a\x10\xA7Wa\x10\xA7aL\xADV[\x81R` \x01\x90\x81R` \x01`\0 T\x90P\x80`\0\x14a\x10\xF7W\x80\x83\x86a\x10\xD0`\xC0\x8B\x01\x8BaSYV[a\x10\xDB\x92\x91PaT3V[a\x10\xE5\x91\x90aT3V[a\x10\xEF\x91\x90aUKV[\x91PPa\x10\xFDV[`\0\x91PP[\x96\x95PPPPPPV[a\x11\x0Fa*\xA2V[`\x02a\x11\x1A\x82a\x17\xD6V[`\x05\x81\x11\x15a\x11+Wa\x11+aL\xADV[\x14a\x11LW`@QcSi\x1DU`\xE1\x1B\x81R`\x04\x81\x01\x82\x90R`$\x01a\x0B\x03V[`\0a\x01\xF5\x82\x81T\x81\x10a\x11bWa\x11baS\x0FV[`\0\x91\x82R` \x90\x91 `\x07`\t\x90\x92\x02\x01\x90\x81\x01\x80T`\xFF\x19\x16`\x04\x17\x90U`\x05\x81\x01T`\x01\x82\x01T\x91\x92Pa\x11\xA4\x91`\x01`\x01`\xA0\x1B\x03\x90\x91\x16\x90a+yV[`@Q\x82\x90\x7FZ\xB6\xD2\x180;\xD8\xDC\x01\xC2\xC5\xE8\x12\xDC\xBB\xAD\xCF\xC2\xEB[\x1F\xB9\x11\x11\xE0\xB0\xAE\x87\x88\x8A\xC5h\x90`\0\x90\xA2Pa\x11\xD8a+SV[PV[`\0a\x11\xE5a*\xA2V[`\0a\x01\xF5\x83\x81T\x81\x10a\x11\xFBWa\x11\xFBaS\x0FV[`\0\x91\x82R` \x90\x91 `@\x80Qa\x01`\x81\x01\x90\x91R`\t\x90\x92\x02\x01\x80T`\x80\x83\x01\x90\x81R`\x01\x82\x01T`\xA0\x84\x01R`\x02\x82\x01T`\xC0\x84\x01R`\x03\x82\x01T`\xE0\x84\x01R`\x04\x82\x01Ta\x01\0\x84\x01R`\x05\x82\x01T`\x01`\x01`\xA0\x1B\x03\x16a\x01 \x84\x01R`\x06\x82\x01\x80T\x84\x92\x91\x84\x91a\x01@\x85\x01\x91\x90a\x12x\x90aS%V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\x12\xA4\x90aS%V[\x80\x15a\x12\xF1W\x80`\x1F\x10a\x12\xC6Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\x12\xF1V[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\x12\xD4W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPP\x91\x90\x92RPPP\x81R`\x07\x82\x01T` \x90\x91\x01\x90`\xFF\x16`\x05\x81\x11\x15a\x13\x1CWa\x13\x1CaL\xADV[`\x05\x81\x11\x15a\x13-Wa\x13-aL\xADV[\x81R`\x07\x82\x01T`\x01`\x01`\xA0\x1B\x03a\x01\0\x90\x91\x04\x81\x16` \x83\x01R`\x08\x90\x92\x01T\x90\x91\x16`@\x90\x91\x01R\x90P`\x03a\x13e\x84a\x17\xD6V[`\x05\x81\x11\x15a\x13vWa\x13vaL\xADV[\x14a\x13\x97W`@Qc\r\x94\x85\xF1`\xE0\x1B\x81R`\x04\x81\x01\x84\x90R`$\x01a\x0B\x03V[``\x81\x01Q`\x01`\x01`\xA0\x1B\x03\x163\x14a\x13\xC7W`@Qc\x10\xDA\x1D\xD3`\xE3\x1B\x81R`\x04\x81\x01\x84\x90R`$\x01a\x0B\x03V[a\x13\xF1\x83\x7F\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\0a+\xB1V[\x91PPa\x13\xFCa+SV[\x91\x90PV[`\0\x90\x81R`\0\x80Q` aZ\xCF\x839\x81Q\x91R` R`@\x90 `\x01\x01T\x90V[a\x14,\x82a\x14\x01V[a\x145\x81a-\x01V[a\x14?\x83\x83a-\x0BV[PPPPV[`\x01`\x01`\xA0\x1B\x03\x81\x163\x14a\x14nW`@Qc3K\xD9\x19`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x14x\x82\x82a-\xB0V[PPPV[`\0\x80Q` aZ\xAF\x839\x81Q\x91Ra\x14\x95\x81a-\x01V[a\x11\xD8a.,V[`\0a\x01\xF4\x86\x81T\x81\x10a\x14\xB3Wa\x14\xB3aS\x0FV[`\0\x91\x82R` \x91\x82\x90 `@\x80Q`\xE0\x81\x01\x82R`\x07\x90\x93\x02\x90\x91\x01\x80T`\x01`\x01`\xA0\x1B\x03\x90\x81\x16\x84R`\x01\x82\x01T\x94\x84\x01\x94\x90\x94R`\x02\x81\x01T\x91\x83\x01\x91\x90\x91R`\x03\x81\x01T``\x83\x01R`\x04\x81\x01T`\x80\x83\x01R`\x05\x81\x01T\x90\x92\x16`\xA0\x82\x01R`\x06\x82\x01\x80T\x91\x92\x91`\xC0\x84\x01\x91\x90a\x150\x90aS%V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\x15\\\x90aS%V[\x80\x15a\x15\xA9W\x80`\x1F\x10a\x15~Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\x15\xA9V[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\x15\x8CW\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81RPP\x90P\x80`\xC0\x01QQ`\0\x03a\x15\xDAW`@Qc\x9D\xB8\xD5\xB1`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\xA0\x81\x01Q`\x01`\x01`\xA0\x1B\x03\x163`\x01`\x01`\xA0\x1B\x03\x16\x14a\x16\x10W`@Qc8\x99:I`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x83\x15a\x17\x0CWa\x16#\x81` \x01Qa)\xD4V[a\x16@W`@Qcz\xFC\xEF\x7F`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0[\x84\x81\x10\x15a\x17\nW\x7F\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`\x01`\x01`\xA0\x1B\x03\x16c\xFF\x11J\xE1a\x16\x83\x89a*+V[\x88\x88\x85\x81\x81\x10a\x16\x95Wa\x16\x95aS\x0FV[\x90P` \x02\x81\x01\x90a\x16\xA7\x91\x90aSYV[`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x16\xC5\x93\x92\x91\x90aT\x19V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x16\xDFW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x16\xF3W=`\0\x80>=`\0\xFD[PPPP\x80\x80a\x17\x02\x90aS\xB5V[\x91PPa\x16CV[P[`\0[\x82\x81\x10\x15a\x0C\xA6W\x7F\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`\x01`\x01`\xA0\x1B\x03\x16c\xFF\x11J\xE1a\x17O\x89a*sV[\x86\x86\x85\x81\x81\x10a\x17aWa\x17aaS\x0FV[\x90P` \x02\x81\x01\x90a\x17s\x91\x90aSYV[`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x17\x91\x93\x92\x91\x90aT\x19V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x17\xABW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x17\xBFW=`\0\x80>=`\0\xFD[PPPP\x80\x80a\x17\xCE\x90aS\xB5V[\x91PPa\x17\x0FV[`\0\x80a\x01\xF5\x83\x81T\x81\x10a\x17\xEDWa\x17\xEDaS\x0FV[`\0\x91\x82R` \x90\x91 `@\x80Qa\x01`\x81\x01\x90\x91R`\t\x90\x92\x02\x01\x80T`\x80\x83\x01\x90\x81R`\x01\x82\x01T`\xA0\x84\x01R`\x02\x82\x01T`\xC0\x84\x01R`\x03\x82\x01T`\xE0\x84\x01R`\x04\x82\x01Ta\x01\0\x84\x01R`\x05\x82\x01T`\x01`\x01`\xA0\x1B\x03\x16a\x01 \x84\x01R`\x06\x82\x01\x80T\x84\x92\x91\x84\x91a\x01@\x85\x01\x91\x90a\x18j\x90aS%V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\x18\x96\x90aS%V[\x80\x15a\x18\xE3W\x80`\x1F\x10a\x18\xB8Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\x18\xE3V[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\x18\xC6W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPP\x91\x90\x92RPPP\x81R`\x07\x82\x01T` \x90\x91\x01\x90`\xFF\x16`\x05\x81\x11\x15a\x19\x0EWa\x19\x0EaL\xADV[`\x05\x81\x11\x15a\x19\x1FWa\x19\x1FaL\xADV[\x81R`\x07\x82\x01T`\x01`\x01`\xA0\x1B\x03a\x01\0\x90\x91\x04\x81\x16` \x83\x01R`\x08\x90\x92\x01T\x90\x91\x16`@\x90\x91\x01R\x90P`\x01\x81` \x01Q`\x05\x81\x11\x15a\x19dWa\x19daL\xADV[\x03a\x19\x89W\x80Q`@\x01QC\x10\x15a\x19\x80W` \x01Q\x92\x91PPV[P`\x02\x92\x91PPV[`\x03\x81` \x01Q`\x05\x81\x11\x15a\x19\xA1Wa\x19\xA1aL\xADV[\x03a\x19\xC5W\x80Q`\x80\x01QC\x11\x15a\x19\xBCWP`\x05\x92\x91PPV[P`\x03\x92\x91PPV[` \x01Q\x92\x91PPV[a\x19\xD7a.\x8CV[a\x19\xE0\x82a/3V[a\x19\xEA\x82\x82a/>V[PPV[a\x19\xF6a*\xA2V[\x7F\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`\x01`\x01`\xA0\x1B\x03\x16cr\x10Z\xAFa\x1A<`\0\x80Q` a[\x0F\x839\x81Q\x91Ra/\xFBV[3`@Q`\x01`\x01`\xE0\x1B\x03\x19`\xE0\x85\x90\x1B\x16\x81R`\x04\x81\x01\x92\x90\x92R`\x01`\x01`\xA0\x1B\x03\x16`$\x82\x01R`D\x01`\0`@Q\x80\x83\x03\x81\x86\x80;\x15\x80\x15a\x1A\x82W`\0\x80\xFD[PZ\xFA\x15\x80\x15a\x1A\x96W=`\0\x80>=`\0\xFD[PPPPa\x1A\xDB\x84\x84\x84\x84\x80\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x93\x92\x91\x90\x81\x81R` \x01\x83\x83\x80\x82\x847`\0\x92\x01\x91\x90\x91RPa0\x10\x92PPPV[a\x14?a+SV[`\0a\x1A\xEDa2\x96V[P`\0\x80Q` aZ\x8F\x839\x81Q\x91R\x90V[a\x1B\x08a*\xA2V[\x82Q\x81\x14a\x1B)W`@Qc\xC2\x1F\xE6\xBF`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0[\x83Q\x81\x10\x15a\x1B\x8DWa\x1B{\x84\x82\x81Q\x81\x10a\x1BJWa\x1BJaS\x0FV[` \x02` \x01\x01Q\x84\x84\x84\x81\x81\x10a\x1BdWa\x1BdaS\x0FV[\x90P` \x02\x81\x01\x90a\x1Bv\x91\x90aSYV[a2\xDFV[\x80a\x1B\x85\x81aS\xB5V[\x91PPa\x1B,V[Pa\x14xa+SV[`\0\x80Q` aZ\xAF\x839\x81Q\x91Ra\x1B\xAE\x81a-\x01V[0a\x1B\xBB\x85\x85\x85\x84a7\x8DV[\x7F\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`\x01`\x01`\xA0\x1B\x03\x16ci\xFD\xBC\xCA\x82`\0a\x1B\xF6\x89a8PV[\x89`@Q\x85c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x1C\x16\x94\x93\x92\x91\x90aUbV[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x1C0W`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x1CDW=`\0\x80>=`\0\xFD[PPPPPPPPPV[a\x01\xF5\x81\x81T\x81\x10a\x1C`W`\0\x80\xFD[`\0\x91\x82R` \x91\x82\x90 `@\x80Q`\xE0\x81\x01\x82R`\t\x90\x93\x02\x90\x91\x01\x80T\x83R`\x01\x81\x01T\x93\x83\x01\x93\x90\x93R`\x02\x83\x01T\x90\x82\x01R`\x03\x82\x01T``\x82\x01R`\x04\x82\x01T`\x80\x82\x01R`\x05\x82\x01T`\x01`\x01`\xA0\x1B\x03\x16`\xA0\x82\x01R`\x06\x82\x01\x80T\x92\x93P\x90\x91\x83\x91`\xC0\x84\x01\x91a\x1C\xD8\x90aS%V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\x1D\x04\x90aS%V[\x80\x15a\x1DQW\x80`\x1F\x10a\x1D&Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\x1DQV[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\x1D4W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPP\x91\x90\x92RPPP`\x07\x82\x01T`\x08\x90\x92\x01T\x90\x91`\xFF\x81\x16\x91`\x01`\x01`\xA0\x1B\x03a\x01\0\x90\x92\x04\x82\x16\x91\x16\x84V[`\0a\x1D\x8Ca*\xA2V[`\x05a\x1D\x97\x84a\x17\xD6V[`\x05\x81\x11\x15a\x1D\xA8Wa\x1D\xA8aL\xADV[\x14a\x1D\xC9W`@Qc\x16Y\xBE\xD5`\xE3\x1B\x81R`\x04\x81\x01\x84\x90R`$\x01a\x0B\x03V[a\x1D\xD3\x83\x83a+\xB1V[\x90Pa\x08\xF5a+SV[a\x1D\xE5a8wV[a\x1D\xEDa*\xA2V[a\x1D\xFC\x863\x87\x87\x87\x87\x87a8\xA8V[a\x1E\x04a+SV[PPPPPPV[`\0a\x01\xF4\x82\x81T\x81\x10a\x1E\"Wa\x1E\"aS\x0FV[`\0\x91\x82R` \x91\x82\x90 `@\x80Q`\xE0\x81\x01\x82R`\x07\x90\x93\x02\x90\x91\x01\x80T`\x01`\x01`\xA0\x1B\x03\x90\x81\x16\x84R`\x01\x82\x01T\x94\x84\x01\x94\x90\x94R`\x02\x81\x01T\x91\x83\x01\x91\x90\x91R`\x03\x81\x01T``\x83\x01R`\x04\x81\x01T`\x80\x83\x01R`\x05\x81\x01T\x90\x92\x16`\xA0\x82\x01R`\x06\x82\x01\x80T\x91\x92\x91`\xC0\x84\x01\x91\x90a\x1E\x9F\x90aS%V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\x1E\xCB\x90aS%V[\x80\x15a\x1F\x18W\x80`\x1F\x10a\x1E\xEDWa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\x1F\x18V[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\x1E\xFBW\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81RPP\x90P\x80`\xC0\x01QQ`\0\x03a\x1FIW`@Qc\x9D\xB8\xD5\xB1`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\xA0\x81\x01Q`\x01`\x01`\xA0\x1B\x03\x163`\x01`\x01`\xA0\x1B\x03\x16\x14a\x1F\x7FW`@Qc8\x99:I`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x01\xF4\x82\x81T\x81\x10a\x1F\x93Wa\x1F\x93aS\x0FV[`\0\x91\x82R` \x90\x91 `\x05`\x07\x90\x92\x02\x01\x01\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16\x90UPPV[`\x01`\x01`\xA0\x1B\x03\x81\x16`\0\x90\x81Ra\x01\xF7` R`@\x90 T\x80\x15a\x19\xEAWa \x0C`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x83\x83a>bV[P`\x01`\x01`\xA0\x1B\x03\x16`\0\x90\x81Ra\x01\xF7` R`@\x81 UV[`\0\x80Q` aZ\xAF\x839\x81Q\x91Ra @\x81a-\x01V[a\x11\xD8a>\x93V[`\0\x80Q` aZ\xAF\x839\x81Q\x91Ra `\x81a-\x01V[\x81a\x01\xF6`\0\x85`\x02\x81\x11\x15a xWa xaL\xADV[`\x02\x81\x11\x15a \x89Wa \x89aL\xADV[\x81R` \x81\x01\x91\x90\x91R`@\x01`\0 U\x82`\x02\x81\x11\x15a \xACWa \xACaL\xADV[`@Q\x83\x81R\x7F\xC0\xCAkm\xF9\xB5\xA3U\x0E\xD6\xFD\xEF6\xBA\xE8\xA5A`\xC2\xCC\xDA=\xE6\xAA\xC3\xDF\x98Lf\xD3(p\x90` \x01`@Q\x80\x91\x03\x90\xA2PPPV[`\0\x91\x82R`\0\x80Q` aZ\xCF\x839\x81Q\x91R` \x90\x81R`@\x80\x84 `\x01`\x01`\xA0\x1B\x03\x93\x90\x93\x16\x84R\x91\x90R\x90 T`\xFF\x16\x90V[a!$a*\xA2V[a!/\x83\x83\x83a2\xDFV[a\x14xa+SV[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x80T`\x01`@\x1B\x81\x04`\xFF\x16\x15\x90`\x01`\x01`@\x1B\x03\x16`\0\x81\x15\x80\x15a!|WP\x82[\x90P`\0\x82`\x01`\x01`@\x1B\x03\x16`\x01\x14\x80\x15a!\x98WP0;\x15[\x90P\x81\x15\x80\x15a!\xA6WP\x80\x15[\x15a!\xC4W`@Qc\xF9.\xE8\xA9`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x84Tg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x19\x16`\x01\x17\x85U\x83\x15a!\xEEW\x84T`\xFF`@\x1B\x19\x16`\x01`@\x1B\x17\x85U[a!\xF6a>\xDCV[a!\xFEa>\xDCV[a\"\x06a>\xDCV[a\"\x0Ea>\xDCV[a\"\x16a>\xE4V[a\"\x1Ea>\xE4V[a\")`\0\x87a-\x0BV[Pa\"C`\0\x80Q` aZ\xAF\x839\x81Q\x91R`\0a>\xECV[\x83\x15a\x1E\x04W\x84T`\xFF`@\x1B\x19\x16\x85U`@Q`\x01\x81R\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x90` \x01`@Q\x80\x91\x03\x90\xA1PPPPPPV[`\0\x80Q` aZ\xAF\x839\x81Q\x91Ra\"\xA8\x81a-\x01V[\x7F\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`\x01`\x01`\xA0\x1B\x03\x16c\xFF\x11J\xE1a\"\xEE`\0\x80Q` a[\x0F\x839\x81Q\x91Ra/\xFBV[\x85\x85`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a#\x0E\x93\x92\x91\x90aT\x19V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a#(W`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x0C\xA6W=`\0\x80>=`\0\xFD[a#E\x82a\x14\x01V[a#N\x81a-\x01V[a\x14?\x83\x83a-\xB0V[a#`a*\xA2V[\x84Q\x86Q\x14\x15\x80a#rWP\x84Q\x83\x14\x15[\x15a#\x90W`@Qc\xC2\x1F\xE6\xBF`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0\x86\x86\x86\x86`@Q` \x01a#\xA9\x94\x93\x92\x91\x90aV7V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 \x90P`\0a#\xCC\x82a?OV[\x90P`\0a$\x10\x82\x86\x86\x80\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x93\x92\x91\x90\x81\x81R` \x01\x83\x83\x80\x82\x847`\0\x92\x01\x91\x90\x91RPa?\x8A\x92PPPV[\x90P\x7F\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`\x01`\x01`\xA0\x1B\x03\x16cr\x10Z\xAFa$X`\0\x80Q` a[\x0F\x839\x81Q\x91Ra/\xFBV[`@Q`\x01`\x01`\xE0\x1B\x03\x19`\xE0\x84\x90\x1B\x16\x81R`\x04\x81\x01\x91\x90\x91R`\x01`\x01`\xA0\x1B\x03\x84\x16`$\x82\x01R`D\x01`\0`@Q\x80\x83\x03\x81\x86\x80;\x15\x80\x15a$\x9EW`\0\x80\xFD[PZ\xFA\x15\x80\x15a$\xB2W=`\0\x80>=`\0\xFD[PPPP`\0[\x89Q\x81\x10\x15a%iWa%W\x8A\x82\x81Q\x81\x10a$\xD7Wa$\xD7aS\x0FV[` \x02` \x01\x01Q\x8A\x83\x81Q\x81\x10a$\xF1Wa$\xF1aS\x0FV[` \x02` \x01\x01Q\x8A\x8A\x85\x81\x81\x10a%\x0BWa%\x0BaS\x0FV[\x90P` \x02\x81\x01\x90a%\x1D\x91\x90aSYV[\x80\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x93\x92\x91\x90\x81\x81R` \x01\x83\x83\x80\x82\x847`\0\x92\x01\x91\x90\x91RPa0\x10\x92PPPV[\x80a%a\x81aS\xB5V[\x91PPa$\xB9V[PPPPa\x1E\x04a+SV[a%}a*\xA2V[`\0a\x01\xF5\x84\x81T\x81\x10a%\x93Wa%\x93aS\x0FV[`\0\x91\x82R` \x90\x91 `@\x80Qa\x01`\x81\x01\x90\x91R`\t\x90\x92\x02\x01\x80T`\x80\x83\x01\x90\x81R`\x01\x82\x01T`\xA0\x84\x01R`\x02\x82\x01T`\xC0\x84\x01R`\x03\x82\x01T`\xE0\x84\x01R`\x04\x82\x01Ta\x01\0\x84\x01R`\x05\x82\x01T`\x01`\x01`\xA0\x1B\x03\x16a\x01 \x84\x01R`\x06\x82\x01\x80T\x84\x92\x91\x84\x91a\x01@\x85\x01\x91\x90a&\x10\x90aS%V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta&<\x90aS%V[\x80\x15a&\x89W\x80`\x1F\x10a&^Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a&\x89V[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a&lW\x82\x90\x03`\x1F\x16\x82\x01\x91[PPP\x91\x90\x92RPPP\x81R`\x07\x82\x01T` \x90\x91\x01\x90`\xFF\x16`\x05\x81\x11\x15a&\xB4Wa&\xB4aL\xADV[`\x05\x81\x11\x15a&\xC5Wa&\xC5aL\xADV[\x81R`\x07\x82\x01T`\x01`\x01`\xA0\x1B\x03a\x01\0\x90\x91\x04\x81\x16` \x83\x01R`\x08\x90\x92\x01T\x90\x91\x16`@\x90\x91\x01R\x80QQa\x01\xF4\x80T\x92\x93P\x90\x91`\0\x91\x90\x83\x90\x81\x10a'\x11Wa'\x11aS\x0FV[`\0\x91\x82R` \x91\x82\x90 `@\x80Q`\xE0\x81\x01\x82R`\x07\x90\x93\x02\x90\x91\x01\x80T`\x01`\x01`\xA0\x1B\x03\x90\x81\x16\x84R`\x01\x82\x01T\x94\x84\x01\x94\x90\x94R`\x02\x81\x01T\x91\x83\x01\x91\x90\x91R`\x03\x81\x01T``\x83\x01R`\x04\x81\x01T`\x80\x83\x01R`\x05\x81\x01T\x90\x92\x16`\xA0\x82\x01R`\x06\x82\x01\x80T\x91\x92\x91`\xC0\x84\x01\x91\x90a'\x8E\x90aS%V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta'\xBA\x90aS%V[\x80\x15a(\x07W\x80`\x1F\x10a'\xDCWa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a(\x07V[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a'\xEAW\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81RPP\x90P`\0\x80a(\x1F\x88\x86a?\xB4V[\x91P\x91Pa(w\x88\x86`\0\x01Q`\xC0\x01Q\x89\x89\x80\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x93\x92\x91\x90\x81\x81R` \x01\x83\x83\x80\x82\x847`\0\x92\x01\x91\x90\x91RPa(r\x92P\x8A\x91Pa*s\x90PV[a@\xCDV[a(\x97W`@Qc@i\xAF=`\xE1\x1B\x81R`\x04\x81\x01\x89\x90R`$\x01a\x0B\x03V[a(\xA9\x88\x86\x84\x84\x88\x88`@\x01QaA\xD6V[PPPPPa\x14xa+SV[a\x01\xF4\x81\x81T\x81\x10a(\xC7W`\0\x80\xFD[`\0\x91\x82R` \x90\x91 `\x07\x90\x91\x02\x01\x80T`\x01\x82\x01T`\x02\x83\x01T`\x03\x84\x01T`\x04\x85\x01T`\x05\x86\x01T`\x06\x87\x01\x80T`\x01`\x01`\xA0\x1B\x03\x97\x88\x16\x99P\x95\x97\x94\x96\x93\x95\x92\x94\x93\x90\x91\x16\x92\x91a)\x1C\x90aS%V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta)H\x90aS%V[\x80\x15a)\x95W\x80`\x1F\x10a)jWa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a)\x95V[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a)xW\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x90P\x87V[`\0`\x01`\x01`\xE0\x1B\x03\x19\x82\x16cye\xDB\x0B`\xE0\x1B\x14\x80a\x08\xF5WPc\x01\xFF\xC9\xA7`\xE0\x1B`\x01`\x01`\xE0\x1B\x03\x19\x83\x16\x14a\x08\xF5V[`\0\x81\x15\x80a*\x02WP\x7F\xCD.f\xBF\x0B\x91\xEE\xED\xC6\xC6H\xAE\x935\xA7\x8D|\x9AJ\xB0\xEF3a*\x82M\x91\xCD\xC6\x8AO!\x82\x14[\x15\x92\x91PPV[`\0\x80\x80\x80a*\x1A\x85\x87\x01\x87aV\xC3V[\x92P\x92P\x92Pa\x10\xFD\x83\x83\x83aCiV[`@\x80Q` \x81\x01\x82\x90R`\x03``\x82\x01Rb3\xB2\xB7`\xE9\x1B`\x80\x82\x01R\x90\x81\x01\x82\x90R`\0\x90`\xA0\x01[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 \x90P\x91\x90PV[`@\x80Q` \x81\x01\x82\x90R`\x03``\x82\x01Rbivs`\xE8\x1B`\x80\x82\x01R\x90\x81\x01\x82\x90R`\0\x90`\xA0\x01a*VV[\x7F\x9Bw\x9B\x17B-\r\xF9\"#\x01\x8B2\xB4\xD1\xFAF\xE0qr=h\x17\xE2Hm\0;\xEC\xC5_\0\x80T`\x01\x19\x01a*\xE6W`@Qc>\xE5\xAE\xB5`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x02\x90UV[`@Q`\x01`\x01`\xA0\x1B\x03\x84\x81\x16`$\x83\x01R\x83\x81\x16`D\x83\x01R`d\x82\x01\x83\x90Ra\x14?\x91\x86\x91\x82\x16\x90c#\xB8r\xDD\x90`\x84\x01[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x91P`\xE0\x1B` \x82\x01\x80Q`\x01`\x01`\xE0\x1B\x03\x83\x81\x83\x16\x17\x83RPPPPaC\xA4V[`\x01\x7F\x9Bw\x9B\x17B-\r\xF9\"#\x01\x8B2\xB4\xD1\xFAF\xE0qr=h\x17\xE2Hm\0;\xEC\xC5_\0UV[\x80\x15a\x19\xEAW`\x01`\x01`\xA0\x1B\x03\x82\x16`\0\x90\x81Ra\x01\xF7` R`@\x81 \x80T\x83\x92\x90a+\xA8\x90\x84\x90aT3V[\x90\x91UPPPPV[`\0\x80a\x01\xF5\x84\x81T\x81\x10a+\xC8Wa+\xC8aS\x0FV[`\0\x91\x82R` \x90\x91 `\x07`\t\x90\x92\x02\x01\x90\x81\x01\x80T`\xFF\x19\x16`\x04\x17\x90U\x80T`\x05\x82\x01T`\x01\x83\x01T\x92\x93P\x90\x91a,\x0C\x91`\x01`\x01`\xA0\x1B\x03\x16\x90a+yV[`@Q\x85\x90\x7F\xD6\xD7\xF87\xB6\x8A\xE9j\xF4v\xF0D{\xBEK\xE0`\xB2\x06B\xEB\xDFG\x08T\xF7\x01\xCA]\x8F^\xFB\x90`\0\x90\xA2`\x08\x82\x01T`\x01`\x01`\xA0\x1B\x03\x7F\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\x81\x16\x91c\xEA\xAC\xAE\x94\x91\x16\x83a,y\x81aD\x07V[`@Q`\x01`\x01`\xE0\x1B\x03\x19`\xE0\x86\x90\x1B\x16\x81R`\x01`\x01`\xA0\x1B\x03\x93\x84\x16`\x04\x82\x01R`$\x81\x01\x92\x90\x92R`D\x82\x01R\x90\x87\x16`d\x82\x01R`\x84\x01` `@Q\x80\x83\x03\x81`\0\x87Z\xF1\x15\x80\x15a,\xD4W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a,\xF8\x91\x90aWJV[\x95\x94PPPPPV[a\x11\xD8\x813aD6V[`\0`\0\x80Q` aZ\xCF\x839\x81Q\x91Ra-&\x84\x84a \xE4V[a-\xA6W`\0\x84\x81R` \x82\x81R`@\x80\x83 `\x01`\x01`\xA0\x1B\x03\x87\x16\x84R\x90\x91R\x90 \x80T`\xFF\x19\x16`\x01\x17\x90Ua-\\3\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x83`\x01`\x01`\xA0\x1B\x03\x16\x85\x7F/\x87\x88\x11~~\xFF\x1D\x82\xE9&\xECyI\x01\xD1|x\x02JP'\t@0E@\xA73eo\r`@Q`@Q\x80\x91\x03\x90\xA4`\x01\x91PPa\x08\xF5V[`\0\x91PPa\x08\xF5V[`\0`\0\x80Q` aZ\xCF\x839\x81Q\x91Ra-\xCB\x84\x84a \xE4V[\x15a-\xA6W`\0\x84\x81R` \x82\x81R`@\x80\x83 `\x01`\x01`\xA0\x1B\x03\x87\x16\x80\x85R\x92R\x80\x83 \x80T`\xFF\x19\x16\x90UQ3\x92\x87\x91\x7F\xF69\x1F\\2\xD9\xC6\x9D*G\xEAg\x0BD)t\xB595\xD1\xED\xC7\xFDd\xEB!\xE0G\xA89\x17\x1B\x91\x90\xA4`\x01\x91PPa\x08\xF5V[a.4aDoV[`\0\x80Q` aZ\xEF\x839\x81Q\x91R\x80T`\xFF\x19\x16\x81U\x7F]\xB9\xEE\nI[\xF2\xE6\xFF\x9C\x91\xA7\x83L\x1B\xA4\xFD\xD2D\xA5\xE8\xAANS{\xD3\x8A\xEA\xE4\xB0s\xAA3[`@Q`\x01`\x01`\xA0\x1B\x03\x90\x91\x16\x81R` \x01`@Q\x80\x91\x03\x90\xA1PV[0`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x14\x80a/\x13WP\x7F\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`\x01`\x01`\xA0\x1B\x03\x16a/\x07`\0\x80Q` aZ\x8F\x839\x81Q\x91RT`\x01`\x01`\xA0\x1B\x03\x16\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x14\x15[\x15a/1W`@Qcp>F\xDD`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[`\0a\x19\xEA\x81a-\x01V[\x81`\x01`\x01`\xA0\x1B\x03\x16cR\xD1\x90-`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x92PPP\x80\x15a/\x98WP`@\x80Q`\x1F=\x90\x81\x01`\x1F\x19\x16\x82\x01\x90\x92Ra/\x95\x91\x81\x01\x90aWJV[`\x01[a/\xC0W`@QcL\x9C\x8C\xE3`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x83\x16`\x04\x82\x01R`$\x01a\x0B\x03V[`\0\x80Q` aZ\x8F\x839\x81Q\x91R\x81\x14a/\xF1W`@Qc*\x87Ri`\xE2\x1B\x81R`\x04\x81\x01\x82\x90R`$\x01a\x0B\x03V[a\x14x\x83\x83aD\x9FV[`\0\x81`@Q` \x01a*V\x91\x81R` \x01\x90V[`\x01a0\x1B\x84a\x17\xD6V[`\x05\x81\x11\x15a0,Wa0,aL\xADV[\x14a0JW`@Qc>[N\x85`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0a\x01\xF5\x84\x81T\x81\x10a0`Wa0`aS\x0FV[`\0\x91\x82R` \x82 `\t\x90\x91\x02\x01\x80T`@Qc\x1C~\xAEe`\xE0\x1B\x81R\x91\x93P\x82\x91`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x91c\x1C~\xAEe\x91a0\xD6\x91\x89\x91`\x04\x01`\x01`\x01`\xA0\x1B\x03\x92\x90\x92\x16\x82R` \x82\x01R`@\x01\x90V[`@\x80Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a0\xF2W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a1\x16\x91\x90aWcV[\x91P\x91P\x81\x83`\0\x01`\x01\x01T\x10\x15a1EW`@Qcb]\xAA\x9D`\xE1\x1B\x81R`\x04\x81\x01\x87\x90R`$\x01a\x0B\x03V[`\x03\x83\x01T\x81\x11\x15a1mW`@Qc\xF8O\xAAI`\xE0\x1B\x81R`\x04\x81\x01\x87\x90R`$\x01a\x0B\x03V[`\x07\x83\x01\x80T`\xFF\x19\x16`\x03\x90\x81\x17\x90\x91U\x83\x01Ta1\x8C\x90CaT3V[`\x04\x84\x01U`\x08\x83\x01\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16`\x01`\x01`\xA0\x1B\x03\x87\x16\x17\x90U\x82T`\0\x90a1\xBC\x90aD\x07V[\x84T`@Qc\xC4\x92\xEE9`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x89\x81\x16`\x04\x83\x01R`$\x82\x01\x92\x90\x92R`D\x81\x01\x83\x90R\x91\x92P\x7F\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\x16\x90c\xC4\x92\xEE9\x90`d\x01`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a23W`\0\x80\xFD[PZ\xF1\x15\x80\x15a2GW=`\0\x80>=`\0\xFD[PPPP\x85`\x01`\x01`\xA0\x1B\x03\x16\x87\x7Fz|\xD4\x1C\xAD_<\xCC\xFD\xCEH\xDFr\x08E\xB6\xFE\x81g\x85;'\xBA\x03\x1D\x99\x98\xE2\x05\xEB\x1D\xD9\x87`@Qa2\x85\x91\x90aQPV[`@Q\x80\x91\x03\x90\xA3PPPPPPPV[0`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x14a/1W`@Qcp>F\xDD`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0a\x01\xF5\x84\x81T\x81\x10a2\xF5Wa2\xF5aS\x0FV[`\0\x91\x82R` \x90\x91 `@\x80Qa\x01`\x81\x01\x90\x91R`\t\x90\x92\x02\x01\x80T`\x80\x83\x01\x90\x81R`\x01\x82\x01T`\xA0\x84\x01R`\x02\x82\x01T`\xC0\x84\x01R`\x03\x82\x01T`\xE0\x84\x01R`\x04\x82\x01Ta\x01\0\x84\x01R`\x05\x82\x01T`\x01`\x01`\xA0\x1B\x03\x16a\x01 \x84\x01R`\x06\x82\x01\x80T\x84\x92\x91\x84\x91a\x01@\x85\x01\x91\x90a3r\x90aS%V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta3\x9E\x90aS%V[\x80\x15a3\xEBW\x80`\x1F\x10a3\xC0Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a3\xEBV[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a3\xCEW\x82\x90\x03`\x1F\x16\x82\x01\x91[PPP\x91\x90\x92RPPP\x81R`\x07\x82\x01T` \x90\x91\x01\x90`\xFF\x16`\x05\x81\x11\x15a4\x16Wa4\x16aL\xADV[`\x05\x81\x11\x15a4'Wa4'aL\xADV[\x81R`\x07\x82\x01Ta\x01\0\x90\x04`\x01`\x01`\xA0\x1B\x03\x90\x81\x16` \x83\x01R`\x08\x90\x92\x01T\x82\x16`@\x91\x82\x01R\x82QQ``\x84\x01Q\x91Qc+a\x0C-`\xE0\x1B\x81R\x91\x83\x16`\x04\x83\x01R`$\x82\x01\x81\x90R\x92\x93P`\0\x91\x82\x91\x7F\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\x90\x91\x16\x90c+a\x0C-\x90`D\x01`@\x80Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a4\xC6W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a4\xEA\x91\x90aW\x87V[\x90\x92P\x90P`\x01`\x01`\xA0\x1B\x03\x82\x16a5\x16W`@Qc\x1E\x1D\n\xB5`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x03a5!\x88a\x17\xD6V[`\x05\x81\x11\x15a52Wa52aL\xADV[\x14a5SW`@Qc\x16\xF2\xD8?`\xE0\x1B\x81R`\x04\x81\x01\x88\x90R`$\x01a\x0B\x03V[\x83Q`\xC0\x01Q`@Q`\0\x91a5o\x91\x89\x90\x89\x90` \x01aW\xB5V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x90Pa\x01\xF4\x84\x81T\x81\x10a5\x94Wa5\x94aS\x0FV[`\0\x91\x82R` \x90\x91 `\x07\x90\x91\x02\x01T`@QcG;\x05\x7F`\xE1\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x90\x91\x16\x90c\x8Ev\n\xFE\x90a5\xD2\x90\x84\x90`\x04\x01aQPV[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a5\xEFW=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a6\x13\x91\x90aS\xCEV[a63W`@Qc^?\xA0Q`\xE0\x1B\x81R`\x04\x81\x01\x89\x90R`$\x01a\x0B\x03V[`\x04a\x01\xF5\x89\x81T\x81\x10a6IWa6IaS\x0FV[`\0\x91\x82R` \x90\x91 `\x07`\t\x90\x92\x02\x01\x01\x80T`\xFF\x19\x16`\x01\x83`\x05\x81\x11\x15a6vWa6vaL\xADV[\x02\x17\x90UP\x84Q` \x01Q`\0\x90a6\x8F\x90\x84\x90aW\xDBV[\x90Pa6\x9B\x84\x84a+yV[\x85Q`\xA0\x01Qa6\xAB\x90\x82a+yV[`\0a6\xB6\x86aD\x07V[``\x88\x01Q`@Qc\x98*A]`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x91\x82\x16`\x04\x82\x01R`$\x81\x01\x89\x90R`D\x81\x01\x83\x90R\x91\x92P\x7F\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\x16\x90c\x98*A]\x90`d\x01`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a7/W`\0\x80\xFD[PZ\xF1\x15\x80\x15a7CW=`\0\x80>=`\0\xFD[PPPP\x89\x7F\x8F\xDDxa\x98\x04'\x96\x0FCy\x10\xD2\x0Bx\xBE7P6\xB3\x1F\x97\xEF\"\xA8\x04\x0F \xE4]+\xA2\x8A\x8A`@Qa7y\x92\x91\x90aW\xEEV[`@Q\x80\x91\x03\x90\xA2PPPPPPPPPPV[`\0\x84\x82`@Q` \x01a7\xA2\x92\x91\x90aX\nV[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 \x90P`\0a7\xC5\x82a?OV[\x90P`\0a8\t\x82\x87\x87\x80\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x93\x92\x91\x90\x81\x81R` \x01\x83\x83\x80\x82\x847`\0\x92\x01\x91\x90\x91RPa?\x8A\x92PPPV[\x90Pa8\x14\x87aD\xF5V[`\x01`\x01`\xA0\x1B\x03\x16\x81`\x01`\x01`\xA0\x1B\x03\x16\x14a\x0C\xA6W`@Qc(\x80\xCB\x7F`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x82\x16`\x04\x82\x01R`$\x01a\x0B\x03V[```\0\x82\x80` \x01\x90Q\x81\x01\x90a8h\x91\x90aXyV[P\x94\x99\x98PPPPPPPPPV[`\0\x80Q` aZ\xEF\x839\x81Q\x91RT`\xFF\x16\x15a/1W`@Qc\xD9<\x06e`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[` \x87\x015\x15\x80a8\xC5WPa8\xC1`\xC0\x88\x01\x88aSYV[\x15\x90P[\x15a8\xE3W`@Qc\x1E\x1D\n\xB5`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[C\x87`@\x015\x11a9\x07W`@Qct\x19HM`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x82\x81\x11\x15a9)W`@Qc\x06q\n\xFD`\xE3\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0a\x01\xF4\x88`\0\x015\x81T\x81\x10a9CWa9CaS\x0FV[`\0\x91\x82R` \x91\x82\x90 `@\x80Q`\xE0\x81\x01\x82R`\x07\x90\x93\x02\x90\x91\x01\x80T`\x01`\x01`\xA0\x1B\x03\x90\x81\x16\x84R`\x01\x82\x01T\x94\x84\x01\x94\x90\x94R`\x02\x81\x01T\x91\x83\x01\x91\x90\x91R`\x03\x81\x01T``\x83\x01R`\x04\x81\x01T`\x80\x83\x01R`\x05\x81\x01T\x90\x92\x16`\xA0\x82\x01R`\x06\x82\x01\x80T\x91\x92\x91`\xC0\x84\x01\x91\x90a9\xC0\x90aS%V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta9\xEC\x90aS%V[\x80\x15a:9W\x80`\x1F\x10a:\x0EWa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a:9V[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a:\x1CW\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81RPP\x90P\x80``\x01QC\x10\x15a:iW`@Qc/Ki\xD3`\xE2\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0a:y\x87\x8A\x88\x88\x88\x88a\x10|V[\x90Pa:\xC0\x880a:\x8E\x84` \x8E\x015aT3V[`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x92\x91\x90a*\xECV[a:\xEA\x7F\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\x82a+yV[\x81`\xC0\x01QQ`\0\x03a;\x10W`@Qc\x9D\xB8\xD5\xB1`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x01\xF5T`@\x80Q`\x80\x81\x01\x90\x91R`\0\x90\x80a;,\x8DaYgV[\x81R` \x01`\x01\x81R3` \x80\x83\x01\x91\x90\x91R`\0`@\x92\x83\x01\x81\x90Ra\x01\xF5\x80T`\x01\x81\x01\x82U\x91R\x83Q\x80Q\x7FsL\xCD\xFE\xCF\x0C\x98\xF1\xF6\x10\xE1>\x82\x1E\xEA\xAB\x95\xDC\x92\x18K\xA0\x90\x03*\xB8\xCFTJ(\xF1g`\t\x90\x93\x02\x92\x83\x01\x90\x81U\x92\x81\x01Q\x7FsL\xCD\xFE\xCF\x0C\x98\xF1\xF6\x10\xE1>\x82\x1E\xEA\xAB\x95\xDC\x92\x18K\xA0\x90\x03*\xB8\xCFTJ(\xF1h\x83\x01U\x92\x83\x01Q\x7FsL\xCD\xFE\xCF\x0C\x98\xF1\xF6\x10\xE1>\x82\x1E\xEA\xAB\x95\xDC\x92\x18K\xA0\x90\x03*\xB8\xCFTJ(\xF1i\x82\x01U``\x83\x01Q\x7FsL\xCD\xFE\xCF\x0C\x98\xF1\xF6\x10\xE1>\x82\x1E\xEA\xAB\x95\xDC\x92\x18K\xA0\x90\x03*\xB8\xCFTJ(\xF1j\x82\x01U`\x80\x83\x01Q\x7FsL\xCD\xFE\xCF\x0C\x98\xF1\xF6\x10\xE1>\x82\x1E\xEA\xAB\x95\xDC\x92\x18K\xA0\x90\x03*\xB8\xCFTJ(\xF1k\x82\x01U`\xA0\x83\x01Q\x7FsL\xCD\xFE\xCF\x0C\x98\xF1\xF6\x10\xE1>\x82\x1E\xEA\xAB\x95\xDC\x92\x18K\xA0\x90\x03*\xB8\xCFTJ(\xF1l\x82\x01\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16`\x01`\x01`\xA0\x1B\x03\x90\x92\x16\x91\x90\x91\x17\x90U`\xC0\x83\x01Q\x93\x94P\x84\x93\x91\x92\x91\x83\x91\x7FsL\xCD\xFE\xCF\x0C\x98\xF1\xF6\x10\xE1>\x82\x1E\xEA\xAB\x95\xDC\x92\x18K\xA0\x90\x03*\xB8\xCFTJ(\xF1m\x01\x90a<\xA9\x90\x82aT\x8CV[PPP` \x82\x01Q`\x07\x82\x01\x80T`\xFF\x19\x16`\x01\x83`\x05\x81\x11\x15a<\xCFWa<\xCFaL\xADV[\x02\x17\x90UP`@\x82\x01Q`\x07\x82\x01\x80Ta\x01\0`\x01`\xA8\x1B\x03\x19\x16a\x01\0`\x01`\x01`\xA0\x1B\x03\x93\x84\x16\x02\x17\x90U``\x90\x92\x01Q`\x08\x90\x91\x01\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16\x91\x83\x16\x91\x90\x91\x17\x90U\x84Q\x90\x81\x16c\xA6\xDF\xBC\x7Fa=3`\xC0\x8F\x01\x8FaSYV[`@Q\x83c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a=P\x92\x91\x90aW\xEEV[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a=mW=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a=\x91\x91\x90aS\xCEV[a=\xAEW`@Qcy\xA6}[`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a=\xBB\x85` \x01Qa)\xD4V[\x15a>\x07W`\x01\x15\x15\x83\x7F{\xBF\xCEe5\x8CD\xB5\x98\xA1\xEE\x0E\xEF\x06<\xE1M\xE0%\x168W\x94\xF6\xB6\x0E\xEAU#\xA96\xE4\x8B\x8B\x8B\x8B`@Qa=\xFA\x94\x93\x92\x91\x90aY\xEFV[`@Q\x80\x91\x03\x90\xA3a>TV[`@\x80Q\x81\x81R`\0\x91\x81\x01\x82\x90R``` \x82\x01\x81\x90R\x81\x01\x82\x90R\x84\x90\x7F{\xBF\xCEe5\x8CD\xB5\x98\xA1\xEE\x0E\xEF\x06<\xE1M\xE0%\x168W\x94\xF6\xB6\x0E\xEAU#\xA96\xE4\x90`\x80\x01`@Q\x80\x91\x03\x90\xA3[PPPPPPPPPPPPV[`@Q`\x01`\x01`\xA0\x1B\x03\x83\x81\x16`$\x83\x01R`D\x82\x01\x83\x90Ra\x14x\x91\x85\x91\x82\x16\x90c\xA9\x05\x9C\xBB\x90`d\x01a+!V[a>\x9Ba8wV[`\0\x80Q` aZ\xEF\x839\x81Q\x91R\x80T`\xFF\x19\x16`\x01\x17\x81U\x7Fb\xE7\x8C\xEA\x01\xBE\xE3 \xCDNB\x02p\xB5\xEAt\0\r\x11\xB0\xC9\xF7GT\xEB\xDB\xFCTK\x05\xA2X3a.nV[a/1aE\x1EV[a+SaE\x1EV[`\0\x80Q` aZ\xCF\x839\x81Q\x91R`\0a?\x06\x84a\x14\x01V[`\0\x85\x81R` \x84\x90R`@\x80\x82 `\x01\x01\x86\x90UQ\x91\x92P\x84\x91\x83\x91\x87\x91\x7F\xBDy\xB8o\xFE\n\xB8\xE8waQQB\x17\xCD|\xAC\xD5,\x90\x9FfG\\:\xF4N\x12\x9F\x0B\0\xFF\x91\x90\xA4PPPPV[`@Q\x7F\x19Ethereum Signed Message:\n32\0\0\0\0` \x82\x01R`<\x81\x01\x82\x90R`\0\x90`\\\x01a*VV[`\0\x80`\0\x80a?\x9A\x86\x86aEgV[\x92P\x92P\x92Pa?\xAA\x82\x82aE\xB4V[P\x90\x94\x93PPPPV[``\x81\x01Q\x81QQ`@Qc+a\x0C-`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x92\x83\x16`\x04\x82\x01R`$\x81\x01\x91\x90\x91R`\0\x91\x82\x91\x82\x91\x82\x91\x7F\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\x90\x91\x16\x90c+a\x0C-\x90`D\x01`@\x80Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a@4W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a@X\x91\x90aW\x87V[\x90\x92P\x90P`\x01`\x01`\xA0\x1B\x03\x82\x16a@\x84W`@Qc\x1E\x1D\n\xB5`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x03a@\x8F\x87a\x17\xD6V[`\x05\x81\x11\x15a@\xA0Wa@\xA0aL\xADV[\x14a@\xC1W`@Qc\x16\xF2\xD8?`\xE0\x1B\x81R`\x04\x81\x01\x87\x90R`$\x01a\x0B\x03V[\x92P\x90P[\x92P\x92\x90PV[`\0\x80\x85\x85`@Q` \x01a@\xE3\x92\x91\x90aZ\x16V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 \x90P`\0aA\x06\x82a?OV[\x90P`\0aA\x14\x82\x87a?\x8AV[\x90P`\x01`\x01`\xA0\x1B\x03\x81\x16aAHW`@Qc(\x80\xCB\x7F`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x82\x16`\x04\x82\x01R`$\x01a\x0B\x03V[`@Qcr\x10Z\xAF`\xE0\x1B\x81R`\x04\x81\x01\x86\x90R`\x01`\x01`\xA0\x1B\x03\x82\x81\x16`$\x83\x01R\x7F\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\x16\x90cr\x10Z\xAF\x90`D\x01`\0`@Q\x80\x83\x03\x81\x86\x80;\x15\x80\x15aA\xB0W`\0\x80\xFD[PZ\xFA\x15\x80\x15aA\xC4W=`\0\x80>=`\0\xFD[P`\x01\x9B\x9APPPPPPPPPPPV[`\x03aA\xE1\x87a\x17\xD6V[`\x05\x81\x11\x15aA\xF2WaA\xF2aL\xADV[\x14aB\x13W`@Qc\x16\xF2\xD8?`\xE0\x1B\x81R`\x04\x81\x01\x87\x90R`$\x01a\x0B\x03V[`\x04a\x01\xF5\x87\x81T\x81\x10aB)WaB)aS\x0FV[`\0\x91\x82R` \x90\x91 `\x07`\t\x90\x92\x02\x01\x01\x80T`\xFF\x19\x16`\x01\x83`\x05\x81\x11\x15aBVWaBVaL\xADV[\x02\x17\x90UP\x84Q` \x01Q`\0\x90aBo\x90\x86\x90aW\xDBV[\x90PaB{\x84\x86a+yV[aB\xA5\x7F\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\x82a+yV[``\x86\x01Q`@Qc\x98*A]`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x91\x82\x16`\x04\x82\x01R`$\x81\x01\x85\x90R`D\x81\x01\x84\x90R\x7F\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\x90\x91\x16\x90c\x98*A]\x90`d\x01`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15aC\x1DW`\0\x80\xFD[PZ\xF1\x15\x80\x15aC1W=`\0\x80>=`\0\xFD[PP`@Q\x89\x92P\x7F\x07\xC3=KV\x06\xE2\xFD \xFB\x9A\xDBp\x06\xCD\xC7\xD4\xAB\x0F0\x80\x90\xDA\xBC\xFDd\xD4\x97\x9C\xD7~*\x91P`\0\x90\xA2PPPPPPPV[`\0\x80\x84\x84\x84`@Q` \x01aC\x81\x93\x92\x91\x90aZ/V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x80Q` \x90\x91\x01 \x91PP[\x93\x92PPPV[`\0aC\xB9`\x01`\x01`\xA0\x1B\x03\x84\x16\x83aFmV[\x90P\x80Q`\0\x14\x15\x80\x15aC\xDEWP\x80\x80` \x01\x90Q\x81\x01\x90aC\xDC\x91\x90aS\xCEV[\x15[\x15a\x14xW`@QcRt\xAF\xE7`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x84\x16`\x04\x82\x01R`$\x01a\x0B\x03V[`\0a\x01\xF4\x82\x81T\x81\x10aD\x1DWaD\x1DaS\x0FV[\x90`\0R` `\0 \x90`\x07\x02\x01`\x02\x01T\x90P\x91\x90PV[aD@\x82\x82a \xE4V[a\x19\xEAW`@Qc\xE2Q}?`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x82\x16`\x04\x82\x01R`$\x81\x01\x83\x90R`D\x01a\x0B\x03V[`\0\x80Q` aZ\xEF\x839\x81Q\x91RT`\xFF\x16a/1W`@Qc\x8D\xFC +`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[aD\xA8\x82aF{V[`@Q`\x01`\x01`\xA0\x1B\x03\x83\x16\x90\x7F\xBC|\xD7Z \xEE'\xFD\x9A\xDE\xBA\xB3 A\xF7U!M\xBCk\xFF\xA9\x0C\xC0\"[9\xDA.\\-;\x90`\0\x90\xA2\x80Q\x15aD\xEDWa\x14x\x82\x82aF\xE0V[a\x19\xEAaGMV[`\0\x80\x82\x80` \x01\x90Q\x81\x01\x90aE\x0C\x91\x90aXyV[PPPPPP\x91PPaC\x9D\x81aGlV[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0T`\x01`@\x1B\x90\x04`\xFF\x16a/1W`@Qc\x1A\xFC\xD7\x9F`\xE3\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0\x80`\0\x83Q`A\x03aE\xA1W` \x84\x01Q`@\x85\x01Q``\x86\x01Q`\0\x1AaE\x93\x88\x82\x85\x85aG\x9CV[\x95P\x95P\x95PPPPaE\xADV[PP\x81Q`\0\x91P`\x02\x90[\x92P\x92P\x92V[`\0\x82`\x03\x81\x11\x15aE\xC8WaE\xC8aL\xADV[\x03aE\xD1WPPV[`\x01\x82`\x03\x81\x11\x15aE\xE5WaE\xE5aL\xADV[\x03aF\x03W`@Qc\xF6E\xEE\xDF`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x02\x82`\x03\x81\x11\x15aF\x17WaF\x17aL\xADV[\x03aF8W`@Qc\xFC\xE6\x98\xF7`\xE0\x1B\x81R`\x04\x81\x01\x82\x90R`$\x01a\x0B\x03V[`\x03\x82`\x03\x81\x11\x15aFLWaFLaL\xADV[\x03a\x19\xEAW`@Qc5\xE2\xF3\x83`\xE2\x1B\x81R`\x04\x81\x01\x82\x90R`$\x01a\x0B\x03V[``aC\x9D\x83\x83`\0aHkV[\x80`\x01`\x01`\xA0\x1B\x03\x16;`\0\x03aF\xB1W`@QcL\x9C\x8C\xE3`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x82\x16`\x04\x82\x01R`$\x01a\x0B\x03V[`\0\x80Q` aZ\x8F\x839\x81Q\x91R\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16`\x01`\x01`\xA0\x1B\x03\x92\x90\x92\x16\x91\x90\x91\x17\x90UV[```\0\x80\x84`\x01`\x01`\xA0\x1B\x03\x16\x84`@QaF\xFD\x91\x90aZrV[`\0`@Q\x80\x83\x03\x81\x85Z\xF4\x91PP=\x80`\0\x81\x14aG8W`@Q\x91P`\x1F\x19`?=\x01\x16\x82\x01`@R=\x82R=`\0` \x84\x01>aG=V[``\x91P[P\x91P\x91Pa,\xF8\x85\x83\x83aH\xFAV[4\x15a/1W`@Qc\xB3\x98\x97\x9F`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0\x81Q`@\x14aG\x90W`@Qc\xD2\x833]`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[P\x80Q` \x90\x91\x01 \x90V[`\0\x80\x80\x7F\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF]WnsW\xA4P\x1D\xDF\xE9/Fh\x1B \xA0\x84\x11\x15aG\xD7WP`\0\x91P`\x03\x90P\x82aHaV[`@\x80Q`\0\x80\x82R` \x82\x01\x80\x84R\x8A\x90R`\xFF\x89\x16\x92\x82\x01\x92\x90\x92R``\x81\x01\x87\x90R`\x80\x81\x01\x86\x90R`\x01\x90`\xA0\x01` `@Q` \x81\x03\x90\x80\x84\x03\x90\x85Z\xFA\x15\x80\x15aH+W=`\0\x80>=`\0\xFD[PP`@Q`\x1F\x19\x01Q\x91PP`\x01`\x01`\xA0\x1B\x03\x81\x16aHWWP`\0\x92P`\x01\x91P\x82\x90PaHaV[\x92P`\0\x91P\x81\x90P[\x94P\x94P\x94\x91PPV[``\x81G\x10\x15aH\x90W`@Qc\xCDx`Y`\xE0\x1B\x81R0`\x04\x82\x01R`$\x01a\x0B\x03V[`\0\x80\x85`\x01`\x01`\xA0\x1B\x03\x16\x84\x86`@QaH\xAC\x91\x90aZrV[`\0`@Q\x80\x83\x03\x81\x85\x87Z\xF1\x92PPP=\x80`\0\x81\x14aH\xE9W`@Q\x91P`\x1F\x19`?=\x01\x16\x82\x01`@R=\x82R=`\0` \x84\x01>aH\xEEV[``\x91P[P\x91P\x91Pa\x10\xFD\x86\x83\x83[``\x82aI\x0FWaI\n\x82aIVV[aC\x9DV[\x81Q\x15\x80\x15aI&WP`\x01`\x01`\xA0\x1B\x03\x84\x16;\x15[\x15aIOW`@Qc\x99\x96\xB3\x15`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x85\x16`\x04\x82\x01R`$\x01a\x0B\x03V[P\x80aC\x9DV[\x80Q\x15aIfW\x80Q\x80\x82` \x01\xFD[`@Qc\n\x12\xF5!`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0` \x82\x84\x03\x12\x15aI\x91W`\0\x80\xFD[\x815`\x01`\x01`\xE0\x1B\x03\x19\x81\x16\x81\x14aC\x9DW`\0\x80\xFD[`\0\x80\x83`\x1F\x84\x01\x12aI\xBBW`\0\x80\xFD[P\x815`\x01`\x01`@\x1B\x03\x81\x11\x15aI\xD2W`\0\x80\xFD[` \x83\x01\x91P\x83` \x82`\x05\x1B\x85\x01\x01\x11\x15a@\xC6W`\0\x80\xFD[`\0\x80`\0\x80`\0``\x86\x88\x03\x12\x15aJ\x05W`\0\x80\xFD[\x855\x94P` \x86\x015`\x01`\x01`@\x1B\x03\x80\x82\x11\x15aJ#W`\0\x80\xFD[aJ/\x89\x83\x8A\x01aI\xA9V[\x90\x96P\x94P`@\x88\x015\x91P\x80\x82\x11\x15aJHW`\0\x80\xFD[PaJU\x88\x82\x89\x01aI\xA9V[\x96\x99\x95\x98P\x93\x96P\x92\x94\x93\x92PPPV[`\0\x80\x83`\x1F\x84\x01\x12aJxW`\0\x80\xFD[P\x815`\x01`\x01`@\x1B\x03\x81\x11\x15aJ\x8FW`\0\x80\xFD[` \x83\x01\x91P\x83` \x82\x85\x01\x01\x11\x15a@\xC6W`\0\x80\xFD[`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a\x11\xD8W`\0\x80\xFD[`\0\x80`\0\x80`\0\x80`\0\x80`\xA0\x89\x8B\x03\x12\x15aJ\xD8W`\0\x80\xFD[\x885`\x01`\x01`@\x1B\x03\x80\x82\x11\x15aJ\xEFW`\0\x80\xFD[aJ\xFB\x8C\x83\x8D\x01aJfV[\x90\x9AP\x98P` \x8B\x015\x91PaK\x10\x82aJ\xA7V[\x90\x96P`@\x8A\x015\x95P``\x8A\x015\x90\x80\x82\x11\x15aK-W`\0\x80\xFD[aK9\x8C\x83\x8D\x01aJfV[\x90\x96P\x94P`\x80\x8B\x015\x91P\x80\x82\x11\x15aKRW`\0\x80\xFD[PaK_\x8B\x82\x8C\x01aJfV[\x99\x9C\x98\x9BP\x96\x99P\x94\x97\x93\x96\x92\x95\x94PPPV[\x805`\x03\x81\x10a\x13\xFCW`\0\x80\xFD[`\0`\xE0\x82\x84\x03\x12\x15aK\x94W`\0\x80\xFD[P\x91\x90PV[`\0\x80`\0\x80`\0\x80`\x80\x87\x89\x03\x12\x15aK\xB3W`\0\x80\xFD[aK\xBC\x87aKsV[\x95P` \x87\x015`\x01`\x01`@\x1B\x03\x80\x82\x11\x15aK\xD8W`\0\x80\xFD[aK\xE4\x8A\x83\x8B\x01aK\x82V[\x96P`@\x89\x015\x91P\x80\x82\x11\x15aK\xFAW`\0\x80\xFD[aL\x06\x8A\x83\x8B\x01aJfV[\x90\x96P\x94P``\x89\x015\x91P\x80\x82\x11\x15aL\x1FW`\0\x80\xFD[PaL,\x89\x82\x8A\x01aJfV[\x97\x9A\x96\x99P\x94\x97P\x92\x95\x93\x94\x92PPPV[`\0` \x82\x84\x03\x12\x15aLPW`\0\x80\xFD[P5\x91\x90PV[\x805a\x13\xFC\x81aJ\xA7V[`\0\x80`@\x83\x85\x03\x12\x15aLuW`\0\x80\xFD[\x825\x91P` \x83\x015aL\x87\x81aJ\xA7V[\x80\x91PP\x92P\x92\x90PV[`\0` \x82\x84\x03\x12\x15aL\xA4W`\0\x80\xFD[aC\x9D\x82aKsV[cNH{q`\xE0\x1B`\0R`!`\x04R`$`\0\xFD[`\x06\x81\x10aL\xE1WcNH{q`\xE0\x1B`\0R`!`\x04R`$`\0\xFD[\x90RV[` \x81\x01a\x08\xF5\x82\x84aL\xC3V[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`@Q`\xE0\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15aM+WaM+aL\xF3V[`@R\x90V[`@Q`\x1F\x82\x01`\x1F\x19\x16\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15aMYWaMYaL\xF3V[`@R\x91\x90PV[`\0`\x01`\x01`@\x1B\x03\x82\x11\x15aMzWaMzaL\xF3V[P`\x1F\x01`\x1F\x19\x16` \x01\x90V[`\0\x82`\x1F\x83\x01\x12aM\x99W`\0\x80\xFD[\x815aM\xACaM\xA7\x82aMaV[aM1V[\x81\x81R\x84` \x83\x86\x01\x01\x11\x15aM\xC1W`\0\x80\xFD[\x81` \x85\x01` \x83\x017`\0\x91\x81\x01` \x01\x91\x90\x91R\x93\x92PPPV[`\0\x80`@\x83\x85\x03\x12\x15aM\xF1W`\0\x80\xFD[\x825aM\xFC\x81aJ\xA7V[\x91P` \x83\x015`\x01`\x01`@\x1B\x03\x81\x11\x15aN\x17W`\0\x80\xFD[aN#\x85\x82\x86\x01aM\x88V[\x91PP\x92P\x92\x90PV[`\0\x80`\0\x80``\x85\x87\x03\x12\x15aNCW`\0\x80\xFD[\x845\x93P` \x85\x015aNU\x81aJ\xA7V[\x92P`@\x85\x015`\x01`\x01`@\x1B\x03\x81\x11\x15aNpW`\0\x80\xFD[aN|\x87\x82\x88\x01aJfV[\x95\x98\x94\x97P\x95PPPPV[`\0`\x01`\x01`@\x1B\x03\x82\x11\x15aN\xA1WaN\xA1aL\xF3V[P`\x05\x1B` \x01\x90V[`\0\x82`\x1F\x83\x01\x12aN\xBCW`\0\x80\xFD[\x815` aN\xCCaM\xA7\x83aN\x88V[\x82\x81R`\x05\x92\x90\x92\x1B\x84\x01\x81\x01\x91\x81\x81\x01\x90\x86\x84\x11\x15aN\xEBW`\0\x80\xFD[\x82\x86\x01[\x84\x81\x10\x15aO\x06W\x805\x83R\x91\x83\x01\x91\x83\x01aN\xEFV[P\x96\x95PPPPPPV[`\0\x80`\0`@\x84\x86\x03\x12\x15aO&W`\0\x80\xFD[\x835`\x01`\x01`@\x1B\x03\x80\x82\x11\x15aO=W`\0\x80\xFD[aOI\x87\x83\x88\x01aN\xABV[\x94P` \x86\x015\x91P\x80\x82\x11\x15aO_W`\0\x80\xFD[PaOl\x86\x82\x87\x01aI\xA9V[\x94\x97\x90\x96P\x93\x94PPPPV[`\0\x80`\0`@\x84\x86\x03\x12\x15aO\x8EW`\0\x80\xFD[\x835`\x01`\x01`@\x1B\x03\x80\x82\x11\x15aO\xA5W`\0\x80\xFD[aO\xB1\x87\x83\x88\x01aM\x88V[\x94P` \x86\x015\x91P\x80\x82\x11\x15aO\xC7W`\0\x80\xFD[PaOl\x86\x82\x87\x01aJfV[`\0[\x83\x81\x10\x15aO\xEFW\x81\x81\x01Q\x83\x82\x01R` \x01aO\xD7V[PP`\0\x91\x01RV[`\0\x81Q\x80\x84RaP\x10\x81` \x86\x01` \x86\x01aO\xD4V[`\x1F\x01`\x1F\x19\x16\x92\x90\x92\x01` \x01\x92\x91PPV[`\x80\x81R\x84Q`\x80\x82\x01R` \x85\x01Q`\xA0\x82\x01R`@\x85\x01Q`\xC0\x82\x01R``\x85\x01Q`\xE0\x82\x01R`\x80\x85\x01Qa\x01\0\x82\x01R`\x01\x80`\xA0\x1B\x03`\xA0\x86\x01Q\x16a\x01 \x82\x01R`\0`\xC0\x86\x01Q`\xE0a\x01@\x84\x01RaP\x88a\x01`\x84\x01\x82aO\xF8V[\x91PPaP\x98` \x83\x01\x86aL\xC3V[`\x01`\x01`\xA0\x1B\x03\x84\x16`@\x83\x01R`\x01`\x01`\xA0\x1B\x03\x83\x16``\x83\x01R\x95\x94PPPPPV[`\0\x80`\0\x80`\0\x80`\x80\x87\x89\x03\x12\x15aP\xD8W`\0\x80\xFD[\x865`\x01`\x01`@\x1B\x03\x80\x82\x11\x15aP\xEFW`\0\x80\xFD[aP\xFB\x8A\x83\x8B\x01aK\x82V[\x97PaK\xE4` \x8A\x01aKsV[`\0` \x82\x84\x03\x12\x15aQ\x1BW`\0\x80\xFD[\x815aC\x9D\x81aJ\xA7V[`\0\x80`@\x83\x85\x03\x12\x15aQ9W`\0\x80\xFD[aQB\x83aKsV[\x94` \x93\x90\x93\x015\x93PPPV[` \x81R`\0aC\x9D` \x83\x01\x84aO\xF8V[`\0\x80`\0`@\x84\x86\x03\x12\x15aQxW`\0\x80\xFD[\x835\x92P` \x84\x015`\x01`\x01`@\x1B\x03\x81\x11\x15aQ\x95W`\0\x80\xFD[aOl\x86\x82\x87\x01aJfV[`\0\x80` \x83\x85\x03\x12\x15aQ\xB4W`\0\x80\xFD[\x825`\x01`\x01`@\x1B\x03\x81\x11\x15aQ\xCAW`\0\x80\xFD[aQ\xD6\x85\x82\x86\x01aJfV[\x90\x96\x90\x95P\x93PPPPV[`\0\x80`\0\x80`\0\x80`\x80\x87\x89\x03\x12\x15aQ\xFBW`\0\x80\xFD[\x865`\x01`\x01`@\x1B\x03\x80\x82\x11\x15aR\x12W`\0\x80\xFD[aR\x1E\x8A\x83\x8B\x01aN\xABV[\x97P` \x91P\x81\x89\x015\x81\x81\x11\x15aR5W`\0\x80\xFD[\x89\x01`\x1F\x81\x01\x8B\x13aRFW`\0\x80\xFD[\x805aRTaM\xA7\x82aN\x88V[\x81\x81R`\x05\x91\x90\x91\x1B\x82\x01\x84\x01\x90\x84\x81\x01\x90\x8D\x83\x11\x15aRsW`\0\x80\xFD[\x92\x85\x01\x92[\x82\x84\x10\x15aR\x9AW\x835aR\x8B\x81aJ\xA7V[\x82R\x92\x85\x01\x92\x90\x85\x01\x90aRxV[\x99PPPP`@\x89\x015\x91P\x80\x82\x11\x15aR\xB3W`\0\x80\xFD[aL\x06\x8A\x83\x8B\x01aI\xA9V[`\0`\x01\x80`\xA0\x1B\x03\x80\x8A\x16\x83R\x88` \x84\x01R\x87`@\x84\x01R\x86``\x84\x01R\x85`\x80\x84\x01R\x80\x85\x16`\xA0\x84\x01RP`\xE0`\xC0\x83\x01RaS\x02`\xE0\x83\x01\x84aO\xF8V[\x99\x98PPPPPPPPPV[cNH{q`\xE0\x1B`\0R`2`\x04R`$`\0\xFD[`\x01\x81\x81\x1C\x90\x82\x16\x80aS9W`\x7F\x82\x16\x91P[` \x82\x10\x81\x03aK\x94WcNH{q`\xE0\x1B`\0R`\"`\x04R`$`\0\xFD[`\0\x80\x835`\x1E\x19\x846\x03\x01\x81\x12aSpW`\0\x80\xFD[\x83\x01\x805\x91P`\x01`\x01`@\x1B\x03\x82\x11\x15aS\x8AW`\0\x80\xFD[` \x01\x91P6\x81\x90\x03\x82\x13\x15a@\xC6W`\0\x80\xFD[cNH{q`\xE0\x1B`\0R`\x11`\x04R`$`\0\xFD[`\0`\x01\x82\x01aS\xC7WaS\xC7aS\x9FV[P`\x01\x01\x90V[`\0` \x82\x84\x03\x12\x15aS\xE0W`\0\x80\xFD[\x81Q\x80\x15\x15\x81\x14aC\x9DW`\0\x80\xFD[\x81\x83R\x81\x81` \x85\x017P`\0\x82\x82\x01` \x90\x81\x01\x91\x90\x91R`\x1F\x90\x91\x01`\x1F\x19\x16\x90\x91\x01\x01\x90V[\x83\x81R`@` \x82\x01R`\0a,\xF8`@\x83\x01\x84\x86aS\xF0V[\x80\x82\x01\x80\x82\x11\x15a\x08\xF5Wa\x08\xF5aS\x9FV[`\x1F\x82\x11\x15a\x14xW`\0\x81\x81R` \x81 `\x1F\x85\x01`\x05\x1C\x81\x01` \x86\x10\x15aTmWP\x80[`\x1F\x85\x01`\x05\x1C\x82\x01\x91P[\x81\x81\x10\x15a\x1E\x04W\x82\x81U`\x01\x01aTyV[\x81Q`\x01`\x01`@\x1B\x03\x81\x11\x15aT\xA5WaT\xA5aL\xF3V[aT\xB9\x81aT\xB3\x84TaS%V[\x84aTFV[` \x80`\x1F\x83\x11`\x01\x81\x14aT\xEEW`\0\x84\x15aT\xD6WP\x85\x83\x01Q[`\0\x19`\x03\x86\x90\x1B\x1C\x19\x16`\x01\x85\x90\x1B\x17\x85Ua\x1E\x04V[`\0\x85\x81R` \x81 `\x1F\x19\x86\x16\x91[\x82\x81\x10\x15aU\x1DW\x88\x86\x01Q\x82U\x94\x84\x01\x94`\x01\x90\x91\x01\x90\x84\x01aT\xFEV[P\x85\x82\x10\x15aU;W\x87\x85\x01Q`\0\x19`\x03\x88\x90\x1B`\xF8\x16\x1C\x19\x16\x81U[PPPPP`\x01\x90\x81\x1B\x01\x90UPV[\x80\x82\x02\x81\x15\x82\x82\x04\x84\x14\x17a\x08\xF5Wa\x08\xF5aS\x9FV[`\x01\x80`\xA0\x1B\x03\x85\x16\x81R\x83` \x82\x01R`\x80`@\x82\x01R`\0aU\x89`\x80\x83\x01\x85aO\xF8V[\x82\x81\x03``\x84\x01RaU\x9B\x81\x85aO\xF8V[\x97\x96PPPPPPPV[\x81\x83R`\0` \x80\x85\x01\x80\x81\x96P\x85`\x05\x1B\x81\x01\x91P\x84`\0[\x87\x81\x10\x15aV*W\x82\x84\x03\x89R\x815`\x1E\x19\x886\x03\x01\x81\x12aU\xE1W`\0\x80\xFD[\x87\x01\x85\x81\x01\x905`\x01`\x01`@\x1B\x03\x81\x11\x15aU\xFCW`\0\x80\xFD[\x806\x03\x82\x13\x15aV\x0BW`\0\x80\xFD[aV\x16\x86\x82\x84aS\xF0V[\x9A\x87\x01\x9A\x95PPP\x90\x84\x01\x90`\x01\x01aU\xC0V[P\x91\x97\x96PPPPPPPV[``\x80\x82R\x85Q\x90\x82\x01\x81\x90R`\0\x90` \x90`\x80\x84\x01\x90\x82\x89\x01\x84[\x82\x81\x10\x15aVpW\x81Q\x84R\x92\x84\x01\x92\x90\x84\x01\x90`\x01\x01aVTV[PPP\x83\x81\x03\x82\x85\x01R\x86Q\x80\x82R\x87\x83\x01\x91\x83\x01\x90`\0[\x81\x81\x10\x15aV\xAEW\x83Q`\x01`\x01`\xA0\x1B\x03\x16\x83R\x92\x84\x01\x92\x91\x84\x01\x91`\x01\x01aV\x89V[PP\x84\x81\x03`@\x86\x01RaS\x02\x81\x87\x89aU\xA6V[`\0\x80`\0``\x84\x86\x03\x12\x15aV\xD8W`\0\x80\xFD[\x835`\x01`\x01`@\x1B\x03\x80\x82\x11\x15aV\xEFW`\0\x80\xFD[aV\xFB\x87\x83\x88\x01aM\x88V[\x94P` \x86\x015\x91P\x80\x82\x11\x15aW\x11W`\0\x80\xFD[aW\x1D\x87\x83\x88\x01aM\x88V[\x93P`@\x86\x015\x91P\x80\x82\x11\x15aW3W`\0\x80\xFD[PaW@\x86\x82\x87\x01aM\x88V[\x91PP\x92P\x92P\x92V[`\0` \x82\x84\x03\x12\x15aW\\W`\0\x80\xFD[PQ\x91\x90PV[`\0\x80`@\x83\x85\x03\x12\x15aWvW`\0\x80\xFD[PP\x80Q` \x90\x91\x01Q\x90\x92\x90\x91PV[`\0\x80`@\x83\x85\x03\x12\x15aW\x9AW`\0\x80\xFD[\x82QaW\xA5\x81aJ\xA7V[` \x93\x90\x93\x01Q\x92\x94\x92\x93PPPV[`@\x81R`\0aW\xC8`@\x83\x01\x86aO\xF8V[\x82\x81\x03` \x84\x01Ra\x10\xFD\x81\x85\x87aS\xF0V[\x81\x81\x03\x81\x81\x11\x15a\x08\xF5Wa\x08\xF5aS\x9FV[` \x81R`\0aX\x02` \x83\x01\x84\x86aS\xF0V[\x94\x93PPPPV[`@\x81R`\0aX\x1D`@\x83\x01\x85aO\xF8V[\x90P`\x01\x80`\xA0\x1B\x03\x83\x16` \x83\x01R\x93\x92PPPV[`\0\x82`\x1F\x83\x01\x12aXEW`\0\x80\xFD[\x81QaXSaM\xA7\x82aMaV[\x81\x81R\x84` \x83\x86\x01\x01\x11\x15aXhW`\0\x80\xFD[aX\x02\x82` \x83\x01` \x87\x01aO\xD4V[`\0\x80`\0\x80`\0\x80`\0\x80a\x01\0\x89\x8B\x03\x12\x15aX\x96W`\0\x80\xFD[\x88Q`\x01`\x01`@\x1B\x03\x80\x82\x11\x15aX\xADW`\0\x80\xFD[aX\xB9\x8C\x83\x8D\x01aX4V[\x99P` \x8B\x01Q\x91P\x80\x82\x11\x15aX\xCFW`\0\x80\xFD[aX\xDB\x8C\x83\x8D\x01aX4V[\x98P`@\x8B\x01Q\x91P\x80\x82\x11\x15aX\xF1W`\0\x80\xFD[aX\xFD\x8C\x83\x8D\x01aX4V[\x97P``\x8B\x01Q\x91P\x80\x82\x11\x15aY\x13W`\0\x80\xFD[aY\x1F\x8C\x83\x8D\x01aX4V[\x96P`\x80\x8B\x01Q\x91P\x80\x82\x11\x15aY5W`\0\x80\xFD[PaYB\x8B\x82\x8C\x01aX4V[\x94PP`\xA0\x89\x01Q\x92P`\xC0\x89\x01Q\x91P`\xE0\x89\x01Q\x90P\x92\x95\x98P\x92\x95\x98\x90\x93\x96PV[`\0`\xE0\x826\x03\x12\x15aYyW`\0\x80\xFD[aY\x81aM\tV[\x825\x81R` \x83\x015` \x82\x01R`@\x83\x015`@\x82\x01R``\x83\x015``\x82\x01R`\x80\x83\x015`\x80\x82\x01RaY\xB9`\xA0\x84\x01aLWV[`\xA0\x82\x01R`\xC0\x83\x015`\x01`\x01`@\x1B\x03\x81\x11\x15aY\xD7W`\0\x80\xFD[aY\xE36\x82\x86\x01aM\x88V[`\xC0\x83\x01RP\x92\x91PPV[`@\x81R`\0aZ\x03`@\x83\x01\x86\x88aS\xF0V[\x82\x81\x03` \x84\x01RaU\x9B\x81\x85\x87aS\xF0V[\x82\x81R`@` \x82\x01R`\0aX\x02`@\x83\x01\x84aO\xF8V[`\0\x84QaZA\x81\x84` \x89\x01aO\xD4V[\x84Q\x90\x83\x01\x90aZU\x81\x83` \x89\x01aO\xD4V[\x84Q\x91\x01\x90aZh\x81\x83` \x88\x01aO\xD4V[\x01\x95\x94PPPPPV[`\0\x82QaZ\x84\x81\x84` \x87\x01aO\xD4V[\x91\x90\x91\x01\x92\x91PPV\xFE6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBCs\xE5s\xF9VmaA\x8A4\xD5\xDE?\xF4\x93`\xF9\xC5\x1F\xEC7\xF7HeQg\x02\x90\xF6(]\xAB\x02\xDD{\xC7\xDE\xC4\xDC\xEE\xDD\xA7u\xE5\x8D\xD5A\xE0\x8A\x11llS\x81\\\x0B\xD0(\x19/{bh\0\xCD^\xD1\\n\x18~w\xE9\xAE\xE8\x81\x84\xC2\x1FO!\x82\xABX'\xCB;~\x07\xFB\xED\xCDc\xF03\0\x08\x0F^\xA8N\xD1\xDEL\x8E\xDBX\xBEe\x1C%X\x1C5Z\0\x11\xB0\xF96\r\xE5\x08+\xEC\xD6F@\xA2dipfsX\"\x12 C\xE9\x04\x85B\x0C\x807D\xFE\x0B\x9B\xF1\x8A\xB6\xFA\x8CX\xF8Ci\xEA\xC2\x88\xFA\x87d\xEA\x80\x1A!}dsolcC\0\x08\x14\x003"; + const __BYTECODE: &[u8] = b"a\x01@`@R0`\x80R4\x80\x15a\0\x15W`\0\x80\xFD[P`@Qaa\xA48\x03\x80aa\xA4\x839\x81\x01`@\x81\x90Ra\x004\x91a\x01\x87V[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x80Th\x01\0\0\0\0\0\0\0\0\x81\x04`\xFF\x16\x15\x90`\x01`\x01`@\x1B\x03\x16`\0\x81\x15\x80\x15a\0~WP\x82[\x90P`\0\x82`\x01`\x01`@\x1B\x03\x16`\x01\x14\x80\x15a\0\x9AWP0;\x15[\x90P\x81\x15\x80\x15a\0\xA8WP\x80\x15[\x15a\0\xC6W`@Qc\xF9.\xE8\xA9`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x84T`\x01`\x01`@\x1B\x03\x19\x16`\x01\x17\x85U\x83\x15a\0\xF4W\x84T`\xFF`@\x1B\x19\x16h\x01\0\0\0\0\0\0\0\0\x17\x85U[`\x01`\x01`\xA0\x1B\x03\x80\x8B\x16`\xA0R`\xC0\x8A\x90R\x88\x81\x16`\xE0R\x87\x81\x16a\x01\0R\x86\x16a\x01 R\x83\x15a\x01`W\x84T`\xFF`@\x1B\x19\x16\x85U`@Q`\x01\x81R\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x90` \x01`@Q\x80\x91\x03\x90\xA1[PPPPPPPPPPa\x01\xF2V[`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a\x01\x84W`\0\x80\xFD[PV[`\0\x80`\0\x80`\0`\xA0\x86\x88\x03\x12\x15a\x01\x9FW`\0\x80\xFD[\x85Qa\x01\xAA\x81a\x01oV[` \x87\x01Q`@\x88\x01Q\x91\x96P\x94Pa\x01\xC2\x81a\x01oV[``\x87\x01Q\x90\x93Pa\x01\xD3\x81a\x01oV[`\x80\x87\x01Q\x90\x92Pa\x01\xE4\x81a\x01oV[\x80\x91PP\x92\x95P\x92\x95\x90\x93PV[`\x80Q`\xA0Q`\xC0Q`\xE0Qa\x01\0Qa\x01 Qa^\x98a\x03\x0C`\09`\0\x81\x81a\x05\xFE\x01R\x81\x81a\x0Br\x01R\x81\x81a\x0C\x8B\x01R\x81\x81a\x0E\xAC\x01R\x81\x81a\x0F7\x01R\x81\x81a\x177\x01R\x81\x81a\x17\xD4\x01R\x81\x81a\x18\xFE\x01R\x81\x81a\x19\x9B\x01R\x81\x81a\x1C\x96\x01R\x81\x81a\x1EQ\x01R\x81\x81a%\xD3\x01R\x81\x81a'=\x01RaD\xCE\x01R`\0\x81\x81a\x07\xB1\x01R\x81\x81a/e\x01R\x81\x81a3\xAC\x01R\x81\x81a5\x0E\x01R\x81\x81a7\x9D\x01R\x81\x81a:\n\x01R\x81\x81aCL\x01RaF7\x01R`\0\x81\x81a\x0EJ\x01R\x81\x81a\x14u\x01R\x81\x81a>%\x01RaE\xE0\x01R`\0\x81\x81a\x05\xCA\x01Ra\x0Ek\x01R`\0\x81\x81a\x07\x0F\x01R\x81\x81a\x0E'\x01R\x81\x81a\"y\x01Ra=\xF8\x01R`\0\x81\x81a1\xB6\x01R\x81\x81a1\xDF\x01Ra5\xC0\x01Ra^\x98`\0\xF3\xFE`\x80`@R`\x046\x10a\x02\x93W`\x005`\xE0\x1C\x80ceY9{\x11a\x01ZW\x80c\x97Q\xBB\xD3\x11a\0\xC1W\x80c\xD4\xC2B6\x11a\0zW\x80c\xD4\xC2B6\x14a\x08\x86W\x80c\xD5Gt\x1F\x14a\x08\xA6W\x80c\xE6\xAF\xC3\xD9\x14a\x08\xC6W\x80c\xF0`,\xAB\x14a\x08\xE6W\x80c\xF8\xA9H/\x14a\t\x06W\x80c\xFB\xEF\x98m\x14a\t9W`\0\x80\xFD[\x80c\x97Q\xBB\xD3\x14a\x07\x9FW\x80c\xA2\x17\xFD\xDF\x14a\x07\xD3W\x80c\xAD<\xB1\xCC\x14a\x07\xE8W\x80c\xB4\xCFT?\x14a\x08&W\x80c\xC2D\xA7\xB9\x14a\x08FW\x80c\xC4\xD6m\xE8\x14a\x08fW`\0\x80\xFD[\x80cy\xC7n\x1A\x11a\x01\x13W\x80cy\xC7n\x1A\x14a\x06\xC8W\x80c\x84V\xCBY\x14a\x06\xE8W\x80c\x87|\x86\xFB\x14a\x06\xFDW\x80c\x89\x88PI\x14a\x071W\x80c\x8E\xCC\xBD\xAF\x14a\x07_W\x80c\x91\xD1HT\x14a\x07\x7FW`\0\x80\xFD[\x80ceY9{\x14a\x05\xB8W\x80cf\x1D\xE5\xAC\x14a\x05\xECW\x80cl\x8D\xF5\x18\x14a\x068W\x80cm\xA6w\x9B\x14a\x06hW\x80cpS\x8F\xCA\x14a\x06\x88W\x80cx\x7F\xB0K\x14a\x06\xA8W`\0\x80\xFD[\x80c6V\x8A\xBE\x11a\x01\xFEW\x80cO\x1E\xF2\x86\x11a\x01\xB7W\x80cO\x1E\xF2\x86\x14a\x05\x0BW\x80cRy\x86\xD0\x14a\x05\x1EW\x80cR\xD1\x90-\x14a\x05>W\x80cS{[\x7F\x14a\x05SW\x80c\\\x97Z\xBB\x14a\x05sW\x80cd\x17\xFBa\x14a\x05\x98W`\0\x80\xFD[\x80c6V\x8A\xBE\x14a\x049W\x80c?K\xA8:\x14a\x04YW\x80cE\x07R\xB4\x14a\x04nW\x80cG\xE63\x80\x14a\x04\x8EW\x80cIm\xF3\xB1\x14a\x04\xB0W\x80cMFq-\x14a\x04\xDEW`\0\x80\xFD[\x80c$v\x08\x07\x11a\x02PW\x80c$v\x08\x07\x14a\x03}W\x80c$\x8A\x9C\xA3\x14a\x03\x93W\x80c(D8\xA1\x14a\x03\xB3W\x80c-\x001\x8D\x14a\x03\xD5W\x80c//\xF1]\x14a\x04\x03W\x80c1u\x93\xD2\x14a\x04#W`\0\x80\xFD[\x80c\x01\xFF\xC9\xA7\x14a\x02\x98W\x80c\x04K\xC8\xED\x14a\x02\xCDW\x80c\x15\xC9\x8Az\x14a\x02\xEFW\x80c\x16\x0F\xCF\xBA\x14a\x03\x0FW\x80c\x16(\xE0\xF5\x14a\x03=W\x80c }f)\x14a\x03]W[`\0\x80\xFD[4\x80\x15a\x02\xA4W`\0\x80\xFD[Pa\x02\xB8a\x02\xB36`\x04aLPV[a\tNV[`@Q\x90\x15\x15\x81R` \x01[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x02\xD9W`\0\x80\xFD[Pa\x02\xEDa\x02\xE86`\x04aL\xBEV[a\t_V[\0[4\x80\x15a\x02\xFBW`\0\x80\xFD[Pa\x02\xEDa\x03\n6`\x04aM\x91V[a\rWV[4\x80\x15a\x03\x1BW`\0\x80\xFD[Pa\x03/a\x03*6`\x04aNwV[a\x11$V[`@Q\x90\x81R` \x01a\x02\xC4V[4\x80\x15a\x03IW`\0\x80\xFD[Pa\x02\xEDa\x03X6`\x04aO%V[a\x11\xAFV[4\x80\x15a\x03iW`\0\x80\xFD[Pa\x03/a\x03x6`\x04aO%V[a\x12\x83V[4\x80\x15a\x03\x89W`\0\x80\xFD[Pa\x01\xF4Ta\x03/V[4\x80\x15a\x03\x9FW`\0\x80\xFD[Pa\x03/a\x03\xAE6`\x04aO%V[a\x14\xA9V[4\x80\x15a\x03\xBFW`\0\x80\xFD[Pa\x03/`\0\x80Q` a^C\x839\x81Q\x91R\x81V[4\x80\x15a\x03\xE1W`\0\x80\xFD[Pa\x03/a\x03\xF06`\x04aO>V[a\x01\xF7` R`\0\x90\x81R`@\x90 T\x81V[4\x80\x15a\x04\x0FW`\0\x80\xFD[Pa\x02\xEDa\x04\x1E6`\x04aOdV[a\x14\xCBV[4\x80\x15a\x04/W`\0\x80\xFD[Pa\x01\xF5Ta\x03/V[4\x80\x15a\x04EW`\0\x80\xFD[Pa\x02\xEDa\x04T6`\x04aOdV[a\x14\xEDV[4\x80\x15a\x04eW`\0\x80\xFD[Pa\x02\xEDa\x15%V[4\x80\x15a\x04zW`\0\x80\xFD[Pa\x02\xEDa\x04\x896`\x04aL\xBEV[a\x15EV[4\x80\x15a\x04\x9AW`\0\x80\xFD[Pa\x03/`\0\x80Q` a]\xE3\x839\x81Q\x91R\x81V[4\x80\x15a\x04\xBCW`\0\x80\xFD[Pa\x03/a\x04\xCB6`\x04aO>V[a\x01\xF6` R`\0\x90\x81R`@\x90 T\x81V[4\x80\x15a\x04\xEAW`\0\x80\xFD[Pa\x04\xFEa\x04\xF96`\x04aO%V[a\x1AtV[`@Qa\x02\xC4\x91\x90aO\xCCV[a\x02\xEDa\x05\x196`\x04aP\xC5V[a\x1CmV[4\x80\x15a\x05*W`\0\x80\xFD[Pa\x02\xEDa\x0596`\x04aQ\x14V[a\x1C\x8CV[4\x80\x15a\x05JW`\0\x80\xFD[Pa\x03/a\x1D\x81V[4\x80\x15a\x05_W`\0\x80\xFD[Pa\x02\xEDa\x05n6`\x04aQ\xFAV[a\x1D\x9EV[4\x80\x15a\x05\x7FW`\0\x80\xFD[P`\0\x80Q` a^#\x839\x81Q\x91RT`\xFF\x16a\x02\xB8V[4\x80\x15a\x05\xA4W`\0\x80\xFD[Pa\x02\xEDa\x05\xB36`\x04aRfV[a\x1E*V[4\x80\x15a\x05\xC4W`\0\x80\xFD[Pa\x03/\x7F\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\x81V[4\x80\x15a\x05\xF8W`\0\x80\xFD[Pa\x06 \x7F\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\x81V[`@Q`\x01`\x01`\xA0\x1B\x03\x90\x91\x16\x81R` \x01a\x02\xC4V[4\x80\x15a\x06DW`\0\x80\xFD[Pa\x06Xa\x06S6`\x04aO%V[a\x1E\xE3V[`@Qa\x02\xC4\x94\x93\x92\x91\x90aS\x15V[4\x80\x15a\x06tW`\0\x80\xFD[Pa\x03/a\x06\x836`\x04aOdV[a \x16V[4\x80\x15a\x06\x94W`\0\x80\xFD[Pa\x02\xEDa\x06\xA36`\x04aS\xB0V[a qV[4\x80\x15a\x06\xB4W`\0\x80\xFD[Pa\x02\xEDa\x06\xC36`\x04aO%V[a \xA0V[4\x80\x15a\x06\xD4W`\0\x80\xFD[Pa\x02\xEDa\x06\xE36`\x04aT\x15V[a\"LV[4\x80\x15a\x06\xF4W`\0\x80\xFD[Pa\x02\xEDa\"\xBCV[4\x80\x15a\x07\tW`\0\x80\xFD[Pa\x06 \x7F\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\x81V[4\x80\x15a\x07=W`\0\x80\xFD[Pa\x03/a\x07L6`\x04aT\x15V[a\x01\xF8` R`\0\x90\x81R`@\x90 T\x81V[4\x80\x15a\x07kW`\0\x80\xFD[Pa\x02\xEDa\x07z6`\x04aT2V[a\"\xDCV[4\x80\x15a\x07\x8BW`\0\x80\xFD[Pa\x02\xB8a\x07\x9A6`\x04aOdV[a#yV[4\x80\x15a\x07\xABW`\0\x80\xFD[Pa\x06 \x7F\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\x81V[4\x80\x15a\x07\xDFW`\0\x80\xFD[Pa\x03/`\0\x81V[4\x80\x15a\x07\xF4W`\0\x80\xFD[Pa\x08\x19`@Q\x80`@\x01`@R\x80`\x05\x81R` \x01d\x03R\xE3\x02\xE3`\xDC\x1B\x81RP\x81V[`@Qa\x02\xC4\x91\x90aT\\V[4\x80\x15a\x082W`\0\x80\xFD[Pa\x02\xEDa\x08A6`\x04aT2V[a#\xB1V[4\x80\x15a\x08RW`\0\x80\xFD[Pa\x02\xEDa\x08a6`\x04aToV[a$EV[4\x80\x15a\x08rW`\0\x80\xFD[Pa\x02\xEDa\x08\x816`\x04aT\x15V[a$`V[4\x80\x15a\x08\x92W`\0\x80\xFD[Pa\x02\xEDa\x08\xA16`\x04aT\xA1V[a%\xB9V[4\x80\x15a\x08\xB2W`\0\x80\xFD[Pa\x02\xEDa\x08\xC16`\x04aOdV[a&eV[4\x80\x15a\x08\xD2W`\0\x80\xFD[Pa\x02\xEDa\x08\xE16`\x04aT\xE2V[a&\x81V[4\x80\x15a\x08\xF2W`\0\x80\xFD[Pa\x02\xEDa\t\x016`\x04aToV[a(\x94V[4\x80\x15a\t\x12W`\0\x80\xFD[Pa\t&a\t!6`\x04aO%V[a+\xD5V[`@Qa\x02\xC4\x97\x96\x95\x94\x93\x92\x91\x90aU\xCFV[4\x80\x15a\tEW`\0\x80\xFD[Pa\x03/`d\x81V[`\0a\tY\x82a,\xBEV[\x92\x91PPV[`\0a\x01\xF4\x86\x81T\x81\x10a\tuWa\tuaV$V[`\0\x91\x82R` \x91\x82\x90 `@\x80Q`\xE0\x81\x01\x82R`\x07\x90\x93\x02\x90\x91\x01\x80T`\x01`\x01`\xA0\x1B\x03\x90\x81\x16\x84R`\x01\x82\x01T\x94\x84\x01\x94\x90\x94R`\x02\x81\x01T\x91\x83\x01\x91\x90\x91R`\x03\x81\x01T``\x83\x01R`\x04\x81\x01T`\x80\x83\x01R`\x05\x81\x01T\x90\x92\x16`\xA0\x82\x01R`\x06\x82\x01\x80T\x91\x92\x91`\xC0\x84\x01\x91\x90a\t\xF2\x90aV:V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\n\x1E\x90aV:V[\x80\x15a\nkW\x80`\x1F\x10a\n@Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\nkV[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\nNW\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81RPP\x90P\x80`\xC0\x01QQ`\0\x03a\n\x9CW`@Qc\x9D\xB8\xD5\xB1`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\xA0\x81\x01Q`\x01`\x01`\xA0\x1B\x03\x163`\x01`\x01`\xA0\x1B\x03\x16\x14a\n\xD2W`@Qc8\x99:I`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x83\x15a\x0C7Wa\n\xE5\x81` \x01Qa,\xF3V[a\x0B\x02W`@Qcz\xFC\xEF\x7F`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0[\x84\x81\x10\x15a\x0C5W`\0a\x0B;\x87\x87\x84\x81\x81\x10a\x0B$Wa\x0B$aV$V[\x90P` \x02\x81\x01\x90a\x0B6\x91\x90aVnV[a-(V[\x90P\x82` \x01Q\x81\x03a\x0BpW`@QcZ\xB2\xFB\xC9`\xE1\x1B\x81R`\x04\x81\x01\x89\x90R`$\x81\x01\x82\x90R`D\x01[`@Q\x80\x91\x03\x90\xFD[\x7F\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`\x01`\x01`\xA0\x1B\x03\x16c\x14\x13\xA9*\x82a\x0B\xA9\x8Ba-JV[`@Q`\x01`\x01`\xE0\x1B\x03\x19`\xE0\x85\x90\x1B\x16\x81R`\x04\x81\x01\x92\x90\x92R`$\x82\x01R`D\x01`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x0B\xE7W`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x0B\xFBW=`\0\x80>=`\0\xFD[PP`@Q\x83\x92P\x8A\x91P\x7F\xDC\xBE\xB0\xA3\xB1\xAC\"\x82L\xF31\x91q\x12\xBE\x12\x80I\xBAa'\xB2\xB2\x06\xA2\xEE[\x0Fl\xA9|5\x90`\0\x90\xA3P`\x01\x01a\x0B\x05V[P[`\0[\x82\x81\x10\x15a\rNW`\0a\x0CY\x85\x85\x84\x81\x81\x10a\x0B$Wa\x0B$aV$V[\x90P\x82`\x80\x01Q\x81\x03a\x0C\x89W`@QcZ\xB2\xFB\xC9`\xE1\x1B\x81R`\x04\x81\x01\x89\x90R`$\x81\x01\x82\x90R`D\x01a\x0BgV[\x7F\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`\x01`\x01`\xA0\x1B\x03\x16c\x14\x13\xA9*\x82a\x0C\xC2\x8Ba-\x92V[`@Q`\x01`\x01`\xE0\x1B\x03\x19`\xE0\x85\x90\x1B\x16\x81R`\x04\x81\x01\x92\x90\x92R`$\x82\x01R`D\x01`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\r\0W`\0\x80\xFD[PZ\xF1\x15\x80\x15a\r\x14W=`\0\x80>=`\0\xFD[PP`@Q\x83\x92P\x8A\x91P\x7FX\xEE\xC2\xA6\xA4~\x81\x083\"\x82\x9B3\x91\x02\x84|~\x1D\xDD}df\x86\x83\xA4\xB9\x96\xE5\xA0$\x9D\x90`\0\x90\xA3P`\x01\x01a\x0C:V[PPPPPPPV[a\r_a-\xC1V[3\x85\x15\x80a\rkWP\x87\x15[\x80a\r}WP`\x01`\x01`\xA0\x1B\x03\x87\x16\x15[\x15a\r\x9BW`@Qc\x1E\x1D\n\xB5`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x86`\x01`\x01`\xA0\x1B\x03\x16c\x10\xA5By`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\r\xD9W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\r\xFD\x91\x90aV\xB4V[a\x0E\x1AW`@Qcy\xA6}[`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x0E\x8F`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x82\x7F\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\x7F\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\0a.\x0BV[a\x01\xF4Ta\x0E\xA5a\x0E\xA0\x87\x87a-(V[a,\xF3V[\x15a\x0F5W\x7F\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`\x01`\x01`\xA0\x1B\x03\x16c\xFF\x11J\xE1a\x0E\xE2\x83a-JV[\x88\x88`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x0F\x02\x93\x92\x91\x90aV\xFFV[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x0F\x1CW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x0F0W=`\0\x80>=`\0\xFD[PPPP[\x7F\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`\x01`\x01`\xA0\x1B\x03\x16c\xFF\x11J\xE1a\x0Fm\x83a-\x92V[\x86\x86`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x0F\x8D\x93\x92\x91\x90aV\xFFV[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x0F\xA7W`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x0F\xBBW=`\0\x80>=`\0\xFD[PPPPa\x01\xF4`@Q\x80`\xE0\x01`@R\x80\x8A`\x01`\x01`\xA0\x1B\x03\x16\x81R` \x01a\x0F\xE6\x89\x89a-(V[\x81R` \x81\x01\x8A\x90R`@\x01a\x0F\xFD`dCaW/V[\x81R` \x01a\x10\x0C\x87\x87a-(V[\x81R` \x01\x84`\x01`\x01`\xA0\x1B\x03\x16\x81R` \x01\x8C\x8C\x80\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x93\x92\x91\x90\x81\x81R` \x01\x83\x83\x80\x82\x847`\0\x92\x01\x82\x90RP\x93\x90\x94RPP\x83T`\x01\x80\x82\x01\x86U\x94\x82R` \x91\x82\x90 \x84Q`\x07\x90\x92\x02\x01\x80T`\x01`\x01`\xA0\x1B\x03\x19\x90\x81\x16`\x01`\x01`\xA0\x1B\x03\x93\x84\x16\x17\x82U\x92\x85\x01Q\x95\x81\x01\x95\x90\x95U`@\x84\x01Q`\x02\x86\x01U``\x84\x01Q`\x03\x86\x01U`\x80\x84\x01Q`\x04\x86\x01U`\xA0\x84\x01Q`\x05\x86\x01\x80T\x90\x93\x16\x91\x16\x17\x90UP`\xC0\x81\x01Q\x90\x91\x90`\x06\x82\x01\x90a\x10\xE2\x90\x82aW\x90V[PP`@Q\x82\x91P\x7F\xB8Z>yOG^\xD5\xE4\x03}\xC5\xF2\xD5\xC3(\xC8\xD5N\x0C\x1AL\xA5Sc\x82\x90\x15\xE6\xC7\x0C\x89\x90`\0\x90\xA2PPa\x11\x1Aa.rV[PPPPPPPPV[`\0\x80a\x01\xF6`\0\x89`\x02\x81\x11\x15a\x11>Wa\x11>aO\x94V[`\x02\x81\x11\x15a\x11OWa\x11OaO\x94V[\x81R` \x01\x90\x81R` \x01`\0 T\x90P\x80`\0\x14a\x11\x9FW\x80\x83\x86a\x11x`\xC0\x8B\x01\x8BaVnV[a\x11\x83\x92\x91PaW/V[a\x11\x8D\x91\x90aW/V[a\x11\x97\x91\x90aXNV[\x91PPa\x11\xA5V[`\0\x91PP[\x96\x95PPPPPPV[a\x11\xB7a-\xC1V[`\x02a\x11\xC2\x82a\x1AtV[`\x05\x81\x11\x15a\x11\xD3Wa\x11\xD3aO\x94V[\x14a\x11\xF4W`@QcSi\x1DU`\xE1\x1B\x81R`\x04\x81\x01\x82\x90R`$\x01a\x0BgV[`\0a\x01\xF5\x82\x81T\x81\x10a\x12\nWa\x12\naV$V[`\0\x91\x82R` \x90\x91 `\x07`\t\x90\x92\x02\x01\x90\x81\x01\x80T`\xFF\x19\x16`\x04\x17\x90U`\x05\x81\x01T`\x01\x82\x01T\x91\x92Pa\x12L\x91`\x01`\x01`\xA0\x1B\x03\x90\x91\x16\x90a.\x98V[`@Q\x82\x90\x7FZ\xB6\xD2\x180;\xD8\xDC\x01\xC2\xC5\xE8\x12\xDC\xBB\xAD\xCF\xC2\xEB[\x1F\xB9\x11\x11\xE0\xB0\xAE\x87\x88\x8A\xC5h\x90`\0\x90\xA2Pa\x12\x80a.rV[PV[`\0a\x12\x8Da-\xC1V[`\0a\x01\xF5\x83\x81T\x81\x10a\x12\xA3Wa\x12\xA3aV$V[`\0\x91\x82R` \x90\x91 `@\x80Qa\x01`\x81\x01\x90\x91R`\t\x90\x92\x02\x01\x80T`\x80\x83\x01\x90\x81R`\x01\x82\x01T`\xA0\x84\x01R`\x02\x82\x01T`\xC0\x84\x01R`\x03\x82\x01T`\xE0\x84\x01R`\x04\x82\x01Ta\x01\0\x84\x01R`\x05\x82\x01T`\x01`\x01`\xA0\x1B\x03\x16a\x01 \x84\x01R`\x06\x82\x01\x80T\x84\x92\x91\x84\x91a\x01@\x85\x01\x91\x90a\x13 \x90aV:V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\x13L\x90aV:V[\x80\x15a\x13\x99W\x80`\x1F\x10a\x13nWa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\x13\x99V[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\x13|W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPP\x91\x90\x92RPPP\x81R`\x07\x82\x01T` \x90\x91\x01\x90`\xFF\x16`\x05\x81\x11\x15a\x13\xC4Wa\x13\xC4aO\x94V[`\x05\x81\x11\x15a\x13\xD5Wa\x13\xD5aO\x94V[\x81R`\x07\x82\x01T`\x01`\x01`\xA0\x1B\x03a\x01\0\x90\x91\x04\x81\x16` \x83\x01R`\x08\x90\x92\x01T\x90\x91\x16`@\x90\x91\x01R\x90P`\x03a\x14\r\x84a\x1AtV[`\x05\x81\x11\x15a\x14\x1EWa\x14\x1EaO\x94V[\x14a\x14?W`@Qc\r\x94\x85\xF1`\xE0\x1B\x81R`\x04\x81\x01\x84\x90R`$\x01a\x0BgV[``\x81\x01Q`\x01`\x01`\xA0\x1B\x03\x163\x14a\x14oW`@Qc\x10\xDA\x1D\xD3`\xE3\x1B\x81R`\x04\x81\x01\x84\x90R`$\x01a\x0BgV[a\x14\x99\x83\x7F\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\0a.\xD0V[\x91PPa\x14\xA4a.rV[\x91\x90PV[`\0\x90\x81R`\0\x80Q` a^\x03\x839\x81Q\x91R` R`@\x90 `\x01\x01T\x90V[a\x14\xD4\x82a\x14\xA9V[a\x14\xDD\x81a0 V[a\x14\xE7\x83\x83a0*V[PPPPV[`\x01`\x01`\xA0\x1B\x03\x81\x163\x14a\x15\x16W`@Qc3K\xD9\x19`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x15 \x82\x82a0\xCFV[PPPV[`\0\x80Q` a]\xE3\x839\x81Q\x91Ra\x15=\x81a0 V[a\x12\x80a1KV[`\0a\x01\xF4\x86\x81T\x81\x10a\x15[Wa\x15[aV$V[`\0\x91\x82R` \x91\x82\x90 `@\x80Q`\xE0\x81\x01\x82R`\x07\x90\x93\x02\x90\x91\x01\x80T`\x01`\x01`\xA0\x1B\x03\x90\x81\x16\x84R`\x01\x82\x01T\x94\x84\x01\x94\x90\x94R`\x02\x81\x01T\x91\x83\x01\x91\x90\x91R`\x03\x81\x01T``\x83\x01R`\x04\x81\x01T`\x80\x83\x01R`\x05\x81\x01T\x90\x92\x16`\xA0\x82\x01R`\x06\x82\x01\x80T\x91\x92\x91`\xC0\x84\x01\x91\x90a\x15\xD8\x90aV:V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\x16\x04\x90aV:V[\x80\x15a\x16QW\x80`\x1F\x10a\x16&Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\x16QV[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\x164W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81RPP\x90P\x80`\xC0\x01QQ`\0\x03a\x16\x82W`@Qc\x9D\xB8\xD5\xB1`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\xA0\x81\x01Q`\x01`\x01`\xA0\x1B\x03\x163`\x01`\x01`\xA0\x1B\x03\x16\x14a\x16\xB8W`@Qc8\x99:I`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x83\x15a\x18\xAFWa\x16\xCB\x81` \x01Qa,\xF3V[a\x16\xE8W`@Qcz\xFC\xEF\x7F`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0[\x84\x81\x10\x15a\x18\xADW`\0a\x16\xFE\x88a-JV[\x90P`\0a\x17\x17\x88\x88\x85\x81\x81\x10a\x0B$Wa\x0B$aV$V[`@Qc5\xAD\x90\xD3`\xE1\x1B\x81R`\x04\x81\x01\x82\x90R`$\x81\x01\x84\x90R\x90\x91P\x7F\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`\x01`\x01`\xA0\x1B\x03\x16\x90ck[!\xA6\x90`D\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x17\x86W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x17\xAA\x91\x90aV\xB4V[\x15a\x17\xD2W`@Qc\xC6D\xD0G`\xE0\x1B\x81R`\x04\x81\x01\x82\x90R`$\x81\x01\x83\x90R`D\x01a\x0BgV[\x7F\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`\x01`\x01`\xA0\x1B\x03\x16c\xFF\x11J\xE1\x83\x8A\x8A\x87\x81\x81\x10a\x18\x14Wa\x18\x14aV$V[\x90P` \x02\x81\x01\x90a\x18&\x91\x90aVnV[`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x18D\x93\x92\x91\x90aV\xFFV[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x18^W`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x18rW=`\0\x80>=`\0\xFD[PP`@Q\x83\x92P\x8B\x91P\x7F8\xCF^\xF7\xF2\x11\xD49\x83\xAFl\x03\xC4c\x89\x17\xEB\xDE;\x9CR\xD9hf\xF3G%\xC3\x92\x8E:{\x90`\0\x90\xA3PP`\x01\x01a\x16\xEBV[P[`\0[\x82\x81\x10\x15a\rNW`\0a\x18\xC5\x88a-\x92V[\x90P`\0a\x18\xDE\x86\x86\x85\x81\x81\x10a\x0B$Wa\x0B$aV$V[`@Qc5\xAD\x90\xD3`\xE1\x1B\x81R`\x04\x81\x01\x82\x90R`$\x81\x01\x84\x90R\x90\x91P\x7F\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`\x01`\x01`\xA0\x1B\x03\x16\x90ck[!\xA6\x90`D\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x19MW=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x19q\x91\x90aV\xB4V[\x15a\x19\x99W`@Qc\xC6D\xD0G`\xE0\x1B\x81R`\x04\x81\x01\x82\x90R`$\x81\x01\x83\x90R`D\x01a\x0BgV[\x7F\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`\x01`\x01`\xA0\x1B\x03\x16c\xFF\x11J\xE1\x83\x88\x88\x87\x81\x81\x10a\x19\xDBWa\x19\xDBaV$V[\x90P` \x02\x81\x01\x90a\x19\xED\x91\x90aVnV[`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x1A\x0B\x93\x92\x91\x90aV\xFFV[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x1A%W`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x1A9W=`\0\x80>=`\0\xFD[PP`@Q\x83\x92P\x8B\x91P\x7F\xE8\xF7\xC0*\xA8\xD1\xF6M$\\\xCF\x16+\xC7\x7F\x17\x1D\xD86\xDFD\n\xC9\xA6\xB67!D^\xBEU\x89\x90`\0\x90\xA3PP`\x01\x01a\x18\xB2V[`\0\x80a\x01\xF5\x83\x81T\x81\x10a\x1A\x8BWa\x1A\x8BaV$V[`\0\x91\x82R` \x90\x91 `@\x80Qa\x01`\x81\x01\x90\x91R`\t\x90\x92\x02\x01\x80T`\x80\x83\x01\x90\x81R`\x01\x82\x01T`\xA0\x84\x01R`\x02\x82\x01T`\xC0\x84\x01R`\x03\x82\x01T`\xE0\x84\x01R`\x04\x82\x01Ta\x01\0\x84\x01R`\x05\x82\x01T`\x01`\x01`\xA0\x1B\x03\x16a\x01 \x84\x01R`\x06\x82\x01\x80T\x84\x92\x91\x84\x91a\x01@\x85\x01\x91\x90a\x1B\x08\x90aV:V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\x1B4\x90aV:V[\x80\x15a\x1B\x81W\x80`\x1F\x10a\x1BVWa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\x1B\x81V[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\x1BdW\x82\x90\x03`\x1F\x16\x82\x01\x91[PPP\x91\x90\x92RPPP\x81R`\x07\x82\x01T` \x90\x91\x01\x90`\xFF\x16`\x05\x81\x11\x15a\x1B\xACWa\x1B\xACaO\x94V[`\x05\x81\x11\x15a\x1B\xBDWa\x1B\xBDaO\x94V[\x81R`\x07\x82\x01T`\x01`\x01`\xA0\x1B\x03a\x01\0\x90\x91\x04\x81\x16` \x83\x01R`\x08\x90\x92\x01T\x90\x91\x16`@\x90\x91\x01R\x90P`\x01\x81` \x01Q`\x05\x81\x11\x15a\x1C\x02Wa\x1C\x02aO\x94V[\x03a\x1C'W\x80Q`@\x01QC\x10\x15a\x1C\x1EW` \x01Q\x92\x91PPV[P`\x02\x92\x91PPV[`\x03\x81` \x01Q`\x05\x81\x11\x15a\x1C?Wa\x1C?aO\x94V[\x03a\x1CcW\x80Q`\x80\x01QC\x11\x15a\x1CZWP`\x05\x92\x91PPV[P`\x03\x92\x91PPV[` \x01Q\x92\x91PPV[a\x1Cua1\xABV[a\x1C~\x82a2RV[a\x1C\x88\x82\x82a2]V[PPV[a\x1C\x94a-\xC1V[\x7F\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`\x01`\x01`\xA0\x1B\x03\x16cr\x10Z\xAFa\x1C\xDA`\0\x80Q` a^C\x839\x81Q\x91Ra3\x1AV[3`@Q`\x01`\x01`\xE0\x1B\x03\x19`\xE0\x85\x90\x1B\x16\x81R`\x04\x81\x01\x92\x90\x92R`\x01`\x01`\xA0\x1B\x03\x16`$\x82\x01R`D\x01`\0`@Q\x80\x83\x03\x81\x86\x80;\x15\x80\x15a\x1D W`\0\x80\xFD[PZ\xFA\x15\x80\x15a\x1D4W=`\0\x80>=`\0\xFD[PPPPa\x1Dy\x84\x84\x84\x84\x80\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x93\x92\x91\x90\x81\x81R` \x01\x83\x83\x80\x82\x847`\0\x92\x01\x91\x90\x91RPa3/\x92PPPV[a\x14\xE7a.rV[`\0a\x1D\x8Ba5\xB5V[P`\0\x80Q` a]\xC3\x839\x81Q\x91R\x90V[a\x1D\xA6a-\xC1V[\x82Q\x81\x14a\x1D\xC7W`@Qc\xC2\x1F\xE6\xBF`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0[\x83Q\x81\x10\x15a\x1E!Wa\x1E\x19\x84\x82\x81Q\x81\x10a\x1D\xE8Wa\x1D\xE8aV$V[` \x02` \x01\x01Q\x84\x84\x84\x81\x81\x10a\x1E\x02Wa\x1E\x02aV$V[\x90P` \x02\x81\x01\x90a\x1E\x14\x91\x90aVnV[a5\xFEV[`\x01\x01a\x1D\xCAV[Pa\x15 a.rV[`\0\x80Q` a]\xE3\x839\x81Q\x91Ra\x1EB\x81a0 V[0a\x1EO\x85\x85\x85\x84a:\xACV[\x7F\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`\x01`\x01`\xA0\x1B\x03\x16ci\xFD\xBC\xCA\x82`\0a\x1E\x8A\x89a;oV[\x89`@Q\x85c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x1E\xAA\x94\x93\x92\x91\x90aXeV[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x1E\xC4W`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x1E\xD8W=`\0\x80>=`\0\xFD[PPPPPPPPPV[a\x01\xF5\x81\x81T\x81\x10a\x1E\xF4W`\0\x80\xFD[`\0\x91\x82R` \x91\x82\x90 `@\x80Q`\xE0\x81\x01\x82R`\t\x90\x93\x02\x90\x91\x01\x80T\x83R`\x01\x81\x01T\x93\x83\x01\x93\x90\x93R`\x02\x83\x01T\x90\x82\x01R`\x03\x82\x01T``\x82\x01R`\x04\x82\x01T`\x80\x82\x01R`\x05\x82\x01T`\x01`\x01`\xA0\x1B\x03\x16`\xA0\x82\x01R`\x06\x82\x01\x80T\x92\x93P\x90\x91\x83\x91`\xC0\x84\x01\x91a\x1Fl\x90aV:V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\x1F\x98\x90aV:V[\x80\x15a\x1F\xE5W\x80`\x1F\x10a\x1F\xBAWa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\x1F\xE5V[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\x1F\xC8W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPP\x91\x90\x92RPPP`\x07\x82\x01T`\x08\x90\x92\x01T\x90\x91`\xFF\x81\x16\x91`\x01`\x01`\xA0\x1B\x03a\x01\0\x90\x92\x04\x82\x16\x91\x16\x84V[`\0a a-\xC1V[`\x05a +\x84a\x1AtV[`\x05\x81\x11\x15a #\xA9f.\xFC\x9C\"\x9Cj\0\x80T`\x01`@\x1B\x81\x04`\xFF\x16\x15\x90`\x01`\x01`@\x1B\x03\x16`\0\x81\x15\x80\x15a$\xA5WP\x82[\x90P`\0\x82`\x01`\x01`@\x1B\x03\x16`\x01\x14\x80\x15a$\xC1WP0;\x15[\x90P\x81\x15\x80\x15a$\xCFWP\x80\x15[\x15a$\xEDW`@Qc\xF9.\xE8\xA9`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x84Tg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x19\x16`\x01\x17\x85U\x83\x15a%\x17W\x84T`\xFF`@\x1B\x19\x16`\x01`@\x1B\x17\x85U[a%\x1FaB=`\0\xFD[a&n\x82a\x14\xA9V[a&w\x81a0 V[a\x14\xE7\x83\x83a0\xCFV[a&\x89a-\xC1V[\x84Q\x86Q\x14\x15\x80a&\x9BWP\x84Q\x83\x14\x15[\x15a&\xB9W`@Qc\xC2\x1F\xE6\xBF`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0\x86\x86\x86\x86`@Q` \x01a&\xD2\x94\x93\x92\x91\x90aYBV[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 \x90P`\0a&\xF5\x82aB\xAFV[\x90P`\0a'9\x82\x86\x86\x80\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x93\x92\x91\x90\x81\x81R` \x01\x83\x83\x80\x82\x847`\0\x92\x01\x91\x90\x91RPaB\xEA\x92PPPV[\x90P\x7F\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`\x01`\x01`\xA0\x1B\x03\x16cr\x10Z\xAFa'\x81`\0\x80Q` a^C\x839\x81Q\x91Ra3\x1AV[`@Q`\x01`\x01`\xE0\x1B\x03\x19`\xE0\x84\x90\x1B\x16\x81R`\x04\x81\x01\x91\x90\x91R`\x01`\x01`\xA0\x1B\x03\x84\x16`$\x82\x01R`D\x01`\0`@Q\x80\x83\x03\x81\x86\x80;\x15\x80\x15a'\xC7W`\0\x80\xFD[PZ\xFA\x15\x80\x15a'\xDBW=`\0\x80>=`\0\xFD[PPPP`\0[\x89Q\x81\x10\x15a(\x88Wa(\x80\x8A\x82\x81Q\x81\x10a(\0Wa(\0aV$V[` \x02` \x01\x01Q\x8A\x83\x81Q\x81\x10a(\x1AWa(\x1AaV$V[` \x02` \x01\x01Q\x8A\x8A\x85\x81\x81\x10a(4Wa(4aV$V[\x90P` \x02\x81\x01\x90a(F\x91\x90aVnV[\x80\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x93\x92\x91\x90\x81\x81R` \x01\x83\x83\x80\x82\x847`\0\x92\x01\x91\x90\x91RPa3/\x92PPPV[`\x01\x01a'\xE2V[PPPPa \x98a.rV[a(\x9Ca-\xC1V[`\0a\x01\xF5\x84\x81T\x81\x10a(\xB2Wa(\xB2aV$V[`\0\x91\x82R` \x90\x91 `@\x80Qa\x01`\x81\x01\x90\x91R`\t\x90\x92\x02\x01\x80T`\x80\x83\x01\x90\x81R`\x01\x82\x01T`\xA0\x84\x01R`\x02\x82\x01T`\xC0\x84\x01R`\x03\x82\x01T`\xE0\x84\x01R`\x04\x82\x01Ta\x01\0\x84\x01R`\x05\x82\x01T`\x01`\x01`\xA0\x1B\x03\x16a\x01 \x84\x01R`\x06\x82\x01\x80T\x84\x92\x91\x84\x91a\x01@\x85\x01\x91\x90a)/\x90aV:V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta)[\x90aV:V[\x80\x15a)\xA8W\x80`\x1F\x10a)}Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a)\xA8V[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a)\x8BW\x82\x90\x03`\x1F\x16\x82\x01\x91[PPP\x91\x90\x92RPPP\x81R`\x07\x82\x01T` \x90\x91\x01\x90`\xFF\x16`\x05\x81\x11\x15a)\xD3Wa)\xD3aO\x94V[`\x05\x81\x11\x15a)\xE4Wa)\xE4aO\x94V[\x81R`\x07\x82\x01T`\x01`\x01`\xA0\x1B\x03a\x01\0\x90\x91\x04\x81\x16` \x83\x01R`\x08\x90\x92\x01T\x90\x91\x16`@\x90\x91\x01R\x80QQa\x01\xF4\x80T\x92\x93P\x90\x91`\0\x91\x90\x83\x90\x81\x10a*0Wa*0aV$V[`\0\x91\x82R` \x91\x82\x90 `@\x80Q`\xE0\x81\x01\x82R`\x07\x90\x93\x02\x90\x91\x01\x80T`\x01`\x01`\xA0\x1B\x03\x90\x81\x16\x84R`\x01\x82\x01T\x94\x84\x01\x94\x90\x94R`\x02\x81\x01T\x91\x83\x01\x91\x90\x91R`\x03\x81\x01T``\x83\x01R`\x04\x81\x01T`\x80\x83\x01R`\x05\x81\x01T\x90\x92\x16`\xA0\x82\x01R`\x06\x82\x01\x80T\x91\x92\x91`\xC0\x84\x01\x91\x90a*\xAD\x90aV:V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta*\xD9\x90aV:V[\x80\x15a+&W\x80`\x1F\x10a*\xFBWa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a+&V[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a+\tW\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81RPP\x90P`\0\x80a+>\x88\x86aC\x14V[\x91P\x91Pa+\x96\x88\x86`\0\x01Q`\xC0\x01Q\x89\x89\x80\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x93\x92\x91\x90\x81\x81R` \x01\x83\x83\x80\x82\x847`\0\x92\x01\x91\x90\x91RPa+\x91\x92P\x8A\x91Pa-\x92\x90PV[aD-V[a+\xB6W`@Qc@i\xAF=`\xE1\x1B\x81R`\x04\x81\x01\x89\x90R`$\x01a\x0BgV[a+\xC8\x88\x86\x84\x84\x88\x88`@\x01QaE6V[PPPPPa\x15 a.rV[a\x01\xF4\x81\x81T\x81\x10a+\xE6W`\0\x80\xFD[`\0\x91\x82R` \x90\x91 `\x07\x90\x91\x02\x01\x80T`\x01\x82\x01T`\x02\x83\x01T`\x03\x84\x01T`\x04\x85\x01T`\x05\x86\x01T`\x06\x87\x01\x80T`\x01`\x01`\xA0\x1B\x03\x97\x88\x16\x99P\x95\x97\x94\x96\x93\x95\x92\x94\x93\x90\x91\x16\x92\x91a,;\x90aV:V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta,g\x90aV:V[\x80\x15a,\xB4W\x80`\x1F\x10a,\x89Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a,\xB4V[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a,\x97W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x90P\x87V[`\0`\x01`\x01`\xE0\x1B\x03\x19\x82\x16cye\xDB\x0B`\xE0\x1B\x14\x80a\tYWPc\x01\xFF\xC9\xA7`\xE0\x1B`\x01`\x01`\xE0\x1B\x03\x19\x83\x16\x14a\tYV[`\0\x81\x15\x80a-!WP\x7F\xCD.f\xBF\x0B\x91\xEE\xED\xC6\xC6H\xAE\x935\xA7\x8D|\x9AJ\xB0\xEF3a*\x82M\x91\xCD\xC6\x8AO!\x82\x14[\x15\x92\x91PPV[`\0\x80\x80\x80a-9\x85\x87\x01\x87aY\xD7V[\x92P\x92P\x92Pa\x11\xA5\x83\x83\x83aF\xC9V[`@\x80Q` \x81\x01\x82\x90R`\x03``\x82\x01Rb3\xB2\xB7`\xE9\x1B`\x80\x82\x01R\x90\x81\x01\x82\x90R`\0\x90`\xA0\x01[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 \x90P\x91\x90PV[`@\x80Q` \x81\x01\x82\x90R`\x03``\x82\x01Rbivs`\xE8\x1B`\x80\x82\x01R\x90\x81\x01\x82\x90R`\0\x90`\xA0\x01a-uV[\x7F\x9Bw\x9B\x17B-\r\xF9\"#\x01\x8B2\xB4\xD1\xFAF\xE0qr=h\x17\xE2Hm\0;\xEC\xC5_\0\x80T`\x01\x19\x01a.\x05W`@Qc>\xE5\xAE\xB5`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x02\x90UV[`@Q`\x01`\x01`\xA0\x1B\x03\x84\x81\x16`$\x83\x01R\x83\x81\x16`D\x83\x01R`d\x82\x01\x83\x90Ra\x14\xE7\x91\x86\x91\x82\x16\x90c#\xB8r\xDD\x90`\x84\x01[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x91P`\xE0\x1B` \x82\x01\x80Q`\x01`\x01`\xE0\x1B\x03\x83\x81\x83\x16\x17\x83RPPPPaG\x04V[`\x01\x7F\x9Bw\x9B\x17B-\r\xF9\"#\x01\x8B2\xB4\xD1\xFAF\xE0qr=h\x17\xE2Hm\0;\xEC\xC5_\0UV[\x80\x15a\x1C\x88W`\x01`\x01`\xA0\x1B\x03\x82\x16`\0\x90\x81Ra\x01\xF8` R`@\x81 \x80T\x83\x92\x90a.\xC7\x90\x84\x90aW/V[\x90\x91UPPPPV[`\0\x80a\x01\xF5\x84\x81T\x81\x10a.\xE7Wa.\xE7aV$V[`\0\x91\x82R` \x90\x91 `\x07`\t\x90\x92\x02\x01\x90\x81\x01\x80T`\xFF\x19\x16`\x04\x17\x90U\x80T`\x05\x82\x01T`\x01\x83\x01T\x92\x93P\x90\x91a/+\x91`\x01`\x01`\xA0\x1B\x03\x16\x90a.\x98V[`@Q\x85\x90\x7F\xD6\xD7\xF87\xB6\x8A\xE9j\xF4v\xF0D{\xBEK\xE0`\xB2\x06B\xEB\xDFG\x08T\xF7\x01\xCA]\x8F^\xFB\x90`\0\x90\xA2`\x08\x82\x01T`\x01`\x01`\xA0\x1B\x03\x7F\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\x81\x16\x91c\xEA\xAC\xAE\x94\x91\x16\x83a/\x98\x81aGuV[`@Q`\x01`\x01`\xE0\x1B\x03\x19`\xE0\x86\x90\x1B\x16\x81R`\x01`\x01`\xA0\x1B\x03\x93\x84\x16`\x04\x82\x01R`$\x81\x01\x92\x90\x92R`D\x82\x01R\x90\x87\x16`d\x82\x01R`\x84\x01` `@Q\x80\x83\x03\x81`\0\x87Z\xF1\x15\x80\x15a/\xF3W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a0\x17\x91\x90aZhV[\x95\x94PPPPPV[a\x12\x80\x813aG\xA4V[`\0`\0\x80Q` a^\x03\x839\x81Q\x91Ra0E\x84\x84a#yV[a0\xC5W`\0\x84\x81R` \x82\x81R`@\x80\x83 `\x01`\x01`\xA0\x1B\x03\x87\x16\x84R\x90\x91R\x90 \x80T`\xFF\x19\x16`\x01\x17\x90Ua0{3\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x83`\x01`\x01`\xA0\x1B\x03\x16\x85\x7F/\x87\x88\x11~~\xFF\x1D\x82\xE9&\xECyI\x01\xD1|x\x02JP'\t@0E@\xA73eo\r`@Q`@Q\x80\x91\x03\x90\xA4`\x01\x91PPa\tYV[`\0\x91PPa\tYV[`\0`\0\x80Q` a^\x03\x839\x81Q\x91Ra0\xEA\x84\x84a#yV[\x15a0\xC5W`\0\x84\x81R` \x82\x81R`@\x80\x83 `\x01`\x01`\xA0\x1B\x03\x87\x16\x80\x85R\x92R\x80\x83 \x80T`\xFF\x19\x16\x90UQ3\x92\x87\x91\x7F\xF69\x1F\\2\xD9\xC6\x9D*G\xEAg\x0BD)t\xB595\xD1\xED\xC7\xFDd\xEB!\xE0G\xA89\x17\x1B\x91\x90\xA4`\x01\x91PPa\tYV[a1SaG\xDDV[`\0\x80Q` a^#\x839\x81Q\x91R\x80T`\xFF\x19\x16\x81U\x7F]\xB9\xEE\nI[\xF2\xE6\xFF\x9C\x91\xA7\x83L\x1B\xA4\xFD\xD2D\xA5\xE8\xAANS{\xD3\x8A\xEA\xE4\xB0s\xAA3[`@Q`\x01`\x01`\xA0\x1B\x03\x90\x91\x16\x81R` \x01`@Q\x80\x91\x03\x90\xA1PV[0`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x14\x80a22WP\x7F\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`\x01`\x01`\xA0\x1B\x03\x16a2&`\0\x80Q` a]\xC3\x839\x81Q\x91RT`\x01`\x01`\xA0\x1B\x03\x16\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x14\x15[\x15a2PW`@Qcp>F\xDD`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[`\0a\x1C\x88\x81a0 V[\x81`\x01`\x01`\xA0\x1B\x03\x16cR\xD1\x90-`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x92PPP\x80\x15a2\xB7WP`@\x80Q`\x1F=\x90\x81\x01`\x1F\x19\x16\x82\x01\x90\x92Ra2\xB4\x91\x81\x01\x90aZhV[`\x01[a2\xDFW`@QcL\x9C\x8C\xE3`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x83\x16`\x04\x82\x01R`$\x01a\x0BgV[`\0\x80Q` a]\xC3\x839\x81Q\x91R\x81\x14a3\x10W`@Qc*\x87Ri`\xE2\x1B\x81R`\x04\x81\x01\x82\x90R`$\x01a\x0BgV[a\x15 \x83\x83aH\rV[`\0\x81`@Q` \x01a-u\x91\x81R` \x01\x90V[`\x01a3:\x84a\x1AtV[`\x05\x81\x11\x15a3KWa3KaO\x94V[\x14a3iW`@Qc>[N\x85`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0a\x01\xF5\x84\x81T\x81\x10a3\x7FWa3\x7FaV$V[`\0\x91\x82R` \x82 `\t\x90\x91\x02\x01\x80T`@Qc\x1C~\xAEe`\xE0\x1B\x81R\x91\x93P\x82\x91`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x91c\x1C~\xAEe\x91a3\xF5\x91\x89\x91`\x04\x01`\x01`\x01`\xA0\x1B\x03\x92\x90\x92\x16\x82R` \x82\x01R`@\x01\x90V[`@\x80Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a4\x11W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a45\x91\x90aZ\x81V[\x91P\x91P\x81\x83`\0\x01`\x01\x01T\x10\x15a4dW`@Qcb]\xAA\x9D`\xE1\x1B\x81R`\x04\x81\x01\x87\x90R`$\x01a\x0BgV[`\x03\x83\x01T\x81\x11\x15a4\x8CW`@Qc\xF8O\xAAI`\xE0\x1B\x81R`\x04\x81\x01\x87\x90R`$\x01a\x0BgV[`\x07\x83\x01\x80T`\xFF\x19\x16`\x03\x90\x81\x17\x90\x91U\x83\x01Ta4\xAB\x90CaW/V[`\x04\x84\x01U`\x08\x83\x01\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16`\x01`\x01`\xA0\x1B\x03\x87\x16\x17\x90U\x82T`\0\x90a4\xDB\x90aGuV[\x84T`@Qc\xC4\x92\xEE9`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x89\x81\x16`\x04\x83\x01R`$\x82\x01\x92\x90\x92R`D\x81\x01\x83\x90R\x91\x92P\x7F\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\x16\x90c\xC4\x92\xEE9\x90`d\x01`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a5RW`\0\x80\xFD[PZ\xF1\x15\x80\x15a5fW=`\0\x80>=`\0\xFD[PPPP\x85`\x01`\x01`\xA0\x1B\x03\x16\x87\x7Fz|\xD4\x1C\xAD_<\xCC\xFD\xCEH\xDFr\x08E\xB6\xFE\x81g\x85;'\xBA\x03\x1D\x99\x98\xE2\x05\xEB\x1D\xD9\x87`@Qa5\xA4\x91\x90aT\\V[`@Q\x80\x91\x03\x90\xA3PPPPPPPV[0`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x14a2PW`@Qcp>F\xDD`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0a\x01\xF5\x84\x81T\x81\x10a6\x14Wa6\x14aV$V[`\0\x91\x82R` \x90\x91 `@\x80Qa\x01`\x81\x01\x90\x91R`\t\x90\x92\x02\x01\x80T`\x80\x83\x01\x90\x81R`\x01\x82\x01T`\xA0\x84\x01R`\x02\x82\x01T`\xC0\x84\x01R`\x03\x82\x01T`\xE0\x84\x01R`\x04\x82\x01Ta\x01\0\x84\x01R`\x05\x82\x01T`\x01`\x01`\xA0\x1B\x03\x16a\x01 \x84\x01R`\x06\x82\x01\x80T\x84\x92\x91\x84\x91a\x01@\x85\x01\x91\x90a6\x91\x90aV:V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta6\xBD\x90aV:V[\x80\x15a7\nW\x80`\x1F\x10a6\xDFWa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a7\nV[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a6\xEDW\x82\x90\x03`\x1F\x16\x82\x01\x91[PPP\x91\x90\x92RPPP\x81R`\x07\x82\x01T` \x90\x91\x01\x90`\xFF\x16`\x05\x81\x11\x15a75Wa75aO\x94V[`\x05\x81\x11\x15a7FWa7FaO\x94V[\x81R`\x07\x82\x01Ta\x01\0\x90\x04`\x01`\x01`\xA0\x1B\x03\x90\x81\x16` \x83\x01R`\x08\x90\x92\x01T\x82\x16`@\x91\x82\x01R\x82QQ``\x84\x01Q\x91Qc+a\x0C-`\xE0\x1B\x81R\x91\x83\x16`\x04\x83\x01R`$\x82\x01\x81\x90R\x92\x93P`\0\x91\x82\x91\x7F\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\x90\x91\x16\x90c+a\x0C-\x90`D\x01`@\x80Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a7\xE5W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a8\t\x91\x90aZ\xA5V[\x90\x92P\x90P`\x01`\x01`\xA0\x1B\x03\x82\x16a85W`@Qc\x1E\x1D\n\xB5`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x03a8@\x88a\x1AtV[`\x05\x81\x11\x15a8QWa8QaO\x94V[\x14a8rW`@Qc\x16\xF2\xD8?`\xE0\x1B\x81R`\x04\x81\x01\x88\x90R`$\x01a\x0BgV[\x83Q`\xC0\x01Q`@Q`\0\x91a8\x8E\x91\x89\x90\x89\x90` \x01aZ\xD3V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x90Pa\x01\xF4\x84\x81T\x81\x10a8\xB3Wa8\xB3aV$V[`\0\x91\x82R` \x90\x91 `\x07\x90\x91\x02\x01T`@QcG;\x05\x7F`\xE1\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x90\x91\x16\x90c\x8Ev\n\xFE\x90a8\xF1\x90\x84\x90`\x04\x01aT\\V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a9\x0EW=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a92\x91\x90aV\xB4V[a9RW`@Qc^?\xA0Q`\xE0\x1B\x81R`\x04\x81\x01\x89\x90R`$\x01a\x0BgV[`\x04a\x01\xF5\x89\x81T\x81\x10a9hWa9haV$V[`\0\x91\x82R` \x90\x91 `\x07`\t\x90\x92\x02\x01\x01\x80T`\xFF\x19\x16`\x01\x83`\x05\x81\x11\x15a9\x95Wa9\x95aO\x94V[\x02\x17\x90UP\x84Q` \x01Q`\0\x90a9\xAE\x90\x84\x90aZ\xF9V[\x90Pa9\xBA\x84\x84a.\x98V[\x85Q`\xA0\x01Qa9\xCA\x90\x82a.\x98V[`\0a9\xD5\x86aGuV[``\x88\x01Q`@Qc\x98*A]`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x91\x82\x16`\x04\x82\x01R`$\x81\x01\x89\x90R`D\x81\x01\x83\x90R\x91\x92P\x7F\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\x16\x90c\x98*A]\x90`d\x01`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a:NW`\0\x80\xFD[PZ\xF1\x15\x80\x15a:bW=`\0\x80>=`\0\xFD[PPPP\x89\x7F\x8F\xDDxa\x98\x04'\x96\x0FCy\x10\xD2\x0Bx\xBE7P6\xB3\x1F\x97\xEF\"\xA8\x04\x0F \xE4]+\xA2\x8A\x8A`@Qa:\x98\x92\x91\x90a[\x0CV[`@Q\x80\x91\x03\x90\xA2PPPPPPPPPPV[`\0\x84\x82`@Q` \x01a:\xC1\x92\x91\x90a[(V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 \x90P`\0a:\xE4\x82aB\xAFV[\x90P`\0a;(\x82\x87\x87\x80\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x93\x92\x91\x90\x81\x81R` \x01\x83\x83\x80\x82\x847`\0\x92\x01\x91\x90\x91RPaB\xEA\x92PPPV[\x90Pa;3\x87aHcV[`\x01`\x01`\xA0\x1B\x03\x16\x81`\x01`\x01`\xA0\x1B\x03\x16\x14a\rNW`@Qc(\x80\xCB\x7F`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x82\x16`\x04\x82\x01R`$\x01a\x0BgV[```\0\x82\x80` \x01\x90Q\x81\x01\x90a;\x87\x91\x90a[\x97V[P\x94\x99\x98PPPPPPPPPV[`\0\x80Q` a^#\x839\x81Q\x91RT`\xFF\x16\x15a2PW`@Qc\xD9<\x06e`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[` \x87\x015\x15\x80a;\xE4WPa;\xE0`\xC0\x88\x01\x88aVnV[\x15\x90P[\x15a<\x02W`@Qc\x1E\x1D\n\xB5`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x01\xF7`\0\x86`\x02\x81\x11\x15a<\x19Wa<\x19aO\x94V[`\x02\x81\x11\x15a<*Wa<*aO\x94V[\x81R` \x01\x90\x81R` \x01`\0 TCa \x880a=\xEE\x84` \x8E\x015aW/V[`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x92\x91\x90a.\x0BV[a>J\x7F\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\x82a.\x98V[\x81`\xC0\x01QQ`\0\x03a>pW`@Qc\x9D\xB8\xD5\xB1`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x01\xF5T`@\x80Q`\x80\x81\x01\x90\x91R`\0\x90\x80a>\x8C\x8Da\\\x9BV[\x81R` \x01`\x01\x81R3` \x80\x83\x01\x91\x90\x91R`\0`@\x92\x83\x01\x81\x90Ra\x01\xF5\x80T`\x01\x81\x01\x82U\x91R\x83Q\x80Q\x7FsL\xCD\xFE\xCF\x0C\x98\xF1\xF6\x10\xE1>\x82\x1E\xEA\xAB\x95\xDC\x92\x18K\xA0\x90\x03*\xB8\xCFTJ(\xF1g`\t\x90\x93\x02\x92\x83\x01\x90\x81U\x92\x81\x01Q\x7FsL\xCD\xFE\xCF\x0C\x98\xF1\xF6\x10\xE1>\x82\x1E\xEA\xAB\x95\xDC\x92\x18K\xA0\x90\x03*\xB8\xCFTJ(\xF1h\x83\x01U\x92\x83\x01Q\x7FsL\xCD\xFE\xCF\x0C\x98\xF1\xF6\x10\xE1>\x82\x1E\xEA\xAB\x95\xDC\x92\x18K\xA0\x90\x03*\xB8\xCFTJ(\xF1i\x82\x01U``\x83\x01Q\x7FsL\xCD\xFE\xCF\x0C\x98\xF1\xF6\x10\xE1>\x82\x1E\xEA\xAB\x95\xDC\x92\x18K\xA0\x90\x03*\xB8\xCFTJ(\xF1j\x82\x01U`\x80\x83\x01Q\x7FsL\xCD\xFE\xCF\x0C\x98\xF1\xF6\x10\xE1>\x82\x1E\xEA\xAB\x95\xDC\x92\x18K\xA0\x90\x03*\xB8\xCFTJ(\xF1k\x82\x01U`\xA0\x83\x01Q\x7FsL\xCD\xFE\xCF\x0C\x98\xF1\xF6\x10\xE1>\x82\x1E\xEA\xAB\x95\xDC\x92\x18K\xA0\x90\x03*\xB8\xCFTJ(\xF1l\x82\x01\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16`\x01`\x01`\xA0\x1B\x03\x90\x92\x16\x91\x90\x91\x17\x90U`\xC0\x83\x01Q\x93\x94P\x84\x93\x91\x92\x91\x83\x91\x7FsL\xCD\xFE\xCF\x0C\x98\xF1\xF6\x10\xE1>\x82\x1E\xEA\xAB\x95\xDC\x92\x18K\xA0\x90\x03*\xB8\xCFTJ(\xF1m\x01\x90a@\t\x90\x82aW\x90V[PPP` \x82\x01Q`\x07\x82\x01\x80T`\xFF\x19\x16`\x01\x83`\x05\x81\x11\x15a@/Wa@/aO\x94V[\x02\x17\x90UP`@\x82\x01Q`\x07\x82\x01\x80Ta\x01\0`\x01`\xA8\x1B\x03\x19\x16a\x01\0`\x01`\x01`\xA0\x1B\x03\x93\x84\x16\x02\x17\x90U``\x90\x92\x01Q`\x08\x90\x91\x01\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16\x91\x83\x16\x91\x90\x91\x17\x90U\x84Q\x90\x81\x16c\xA6\xDF\xBC\x7Fa@\x93`\xC0\x8F\x01\x8FaVnV[`@Q\x83c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a@\xB0\x92\x91\x90a[\x0CV[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a@\xCDW=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a@\xF1\x91\x90aV\xB4V[aA\x0EW`@Qcy\xA6}[`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[aA\x1B\x85` \x01Qa,\xF3V[\x15aAgW`\x01\x15\x15\x83\x7F{\xBF\xCEe5\x8CD\xB5\x98\xA1\xEE\x0E\xEF\x06<\xE1M\xE0%\x168W\x94\xF6\xB6\x0E\xEAU#\xA96\xE4\x8B\x8B\x8B\x8B`@QaAZ\x94\x93\x92\x91\x90a]#V[`@Q\x80\x91\x03\x90\xA3aA\xB4V[`@\x80Q\x81\x81R`\0\x91\x81\x01\x82\x90R``` \x82\x01\x81\x90R\x81\x01\x82\x90R\x84\x90\x7F{\xBF\xCEe5\x8CD\xB5\x98\xA1\xEE\x0E\xEF\x06<\xE1M\xE0%\x168W\x94\xF6\xB6\x0E\xEAU#\xA96\xE4\x90`\x80\x01`@Q\x80\x91\x03\x90\xA3[PPPPPPPPPPPPV[`@Q`\x01`\x01`\xA0\x1B\x03\x83\x81\x16`$\x83\x01R`D\x82\x01\x83\x90Ra\x15 \x91\x85\x91\x82\x16\x90c\xA9\x05\x9C\xBB\x90`d\x01a.@V[aA\xFBa;\x96V[`\0\x80Q` a^#\x839\x81Q\x91R\x80T`\xFF\x19\x16`\x01\x17\x81U\x7Fb\xE7\x8C\xEA\x01\xBE\xE3 \xCDNB\x02p\xB5\xEAt\0\r\x11\xB0\xC9\xF7GT\xEB\xDB\xFCTK\x05\xA2X3a1\x8DV[a2PaH\x8CV[a.raH\x8CV[`\0\x80Q` a^\x03\x839\x81Q\x91R`\0aBf\x84a\x14\xA9V[`\0\x85\x81R` \x84\x90R`@\x80\x82 `\x01\x01\x86\x90UQ\x91\x92P\x84\x91\x83\x91\x87\x91\x7F\xBDy\xB8o\xFE\n\xB8\xE8waQQB\x17\xCD|\xAC\xD5,\x90\x9FfG\\:\xF4N\x12\x9F\x0B\0\xFF\x91\x90\xA4PPPPV[`@Q\x7F\x19Ethereum Signed Message:\n32\0\0\0\0` \x82\x01R`<\x81\x01\x82\x90R`\0\x90`\\\x01a-uV[`\0\x80`\0\x80aB\xFA\x86\x86aH\xD5V[\x92P\x92P\x92PaC\n\x82\x82aI\"V[P\x90\x94\x93PPPPV[``\x81\x01Q\x81QQ`@Qc+a\x0C-`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x92\x83\x16`\x04\x82\x01R`$\x81\x01\x91\x90\x91R`\0\x91\x82\x91\x82\x91\x82\x91\x7F\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\x90\x91\x16\x90c+a\x0C-\x90`D\x01`@\x80Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15aC\x94W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90aC\xB8\x91\x90aZ\xA5V[\x90\x92P\x90P`\x01`\x01`\xA0\x1B\x03\x82\x16aC\xE4W`@Qc\x1E\x1D\n\xB5`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x03aC\xEF\x87a\x1AtV[`\x05\x81\x11\x15aD\0WaD\0aO\x94V[\x14aD!W`@Qc\x16\xF2\xD8?`\xE0\x1B\x81R`\x04\x81\x01\x87\x90R`$\x01a\x0BgV[\x92P\x90P[\x92P\x92\x90PV[`\0\x80\x85\x85`@Q` \x01aDC\x92\x91\x90a]JV[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 \x90P`\0aDf\x82aB\xAFV[\x90P`\0aDt\x82\x87aB\xEAV[\x90P`\x01`\x01`\xA0\x1B\x03\x81\x16aD\xA8W`@Qc(\x80\xCB\x7F`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x82\x16`\x04\x82\x01R`$\x01a\x0BgV[`@Qcr\x10Z\xAF`\xE0\x1B\x81R`\x04\x81\x01\x86\x90R`\x01`\x01`\xA0\x1B\x03\x82\x81\x16`$\x83\x01R\x7F\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\x16\x90cr\x10Z\xAF\x90`D\x01`\0`@Q\x80\x83\x03\x81\x86\x80;\x15\x80\x15aE\x10W`\0\x80\xFD[PZ\xFA\x15\x80\x15aE$W=`\0\x80>=`\0\xFD[P`\x01\x9B\x9APPPPPPPPPPPV[`\x03aEA\x87a\x1AtV[`\x05\x81\x11\x15aERWaERaO\x94V[\x14aEsW`@Qc\x16\xF2\xD8?`\xE0\x1B\x81R`\x04\x81\x01\x87\x90R`$\x01a\x0BgV[`\x04a\x01\xF5\x87\x81T\x81\x10aE\x89WaE\x89aV$V[`\0\x91\x82R` \x90\x91 `\x07`\t\x90\x92\x02\x01\x01\x80T`\xFF\x19\x16`\x01\x83`\x05\x81\x11\x15aE\xB6WaE\xB6aO\x94V[\x02\x17\x90UP\x84Q` \x01Q`\0\x90aE\xCF\x90\x86\x90aZ\xF9V[\x90PaE\xDB\x84\x86a.\x98V[aF\x05\x7F\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\x82a.\x98V[``\x86\x01Q`@Qc\x98*A]`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x91\x82\x16`\x04\x82\x01R`$\x81\x01\x85\x90R`D\x81\x01\x84\x90R\x7F\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\x90\x91\x16\x90c\x98*A]\x90`d\x01`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15aF}W`\0\x80\xFD[PZ\xF1\x15\x80\x15aF\x91W=`\0\x80>=`\0\xFD[PP`@Q\x89\x92P\x7F\x07\xC3=KV\x06\xE2\xFD \xFB\x9A\xDBp\x06\xCD\xC7\xD4\xAB\x0F0\x80\x90\xDA\xBC\xFDd\xD4\x97\x9C\xD7~*\x91P`\0\x90\xA2PPPPPPPV[`\0\x80\x84\x84\x84`@Q` \x01aF\xE1\x93\x92\x91\x90a]cV[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x80Q` \x90\x91\x01 \x91PP[\x93\x92PPPV[`\0\x80` `\0\x84Q` \x86\x01`\0\x88Z\xF1\x80aG'W`@Q=`\0\x82>=\x81\xFD[PP`\0Q=\x91P\x81\x15aG?W\x80`\x01\x14\x15aGLV[`\x01`\x01`\xA0\x1B\x03\x84\x16;\x15[\x15a\x14\xE7W`@QcRt\xAF\xE7`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x85\x16`\x04\x82\x01R`$\x01a\x0BgV[`\0a\x01\xF4\x82\x81T\x81\x10aG\x8BWaG\x8BaV$V[\x90`\0R` `\0 \x90`\x07\x02\x01`\x02\x01T\x90P\x91\x90PV[aG\xAE\x82\x82a#yV[a\x1C\x88W`@Qc\xE2Q}?`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x82\x16`\x04\x82\x01R`$\x81\x01\x83\x90R`D\x01a\x0BgV[`\0\x80Q` a^#\x839\x81Q\x91RT`\xFF\x16a2PW`@Qc\x8D\xFC +`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[aH\x16\x82aI\xDBV[`@Q`\x01`\x01`\xA0\x1B\x03\x83\x16\x90\x7F\xBC|\xD7Z \xEE'\xFD\x9A\xDE\xBA\xB3 A\xF7U!M\xBCk\xFF\xA9\x0C\xC0\"[9\xDA.\\-;\x90`\0\x90\xA2\x80Q\x15aH[Wa\x15 \x82\x82aJ@V[a\x1C\x88aJ\xADV[`\0\x80\x82\x80` \x01\x90Q\x81\x01\x90aHz\x91\x90a[\x97V[PPPPPP\x91PPaF\xFD\x81aJ\xCCV[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0T`\x01`@\x1B\x90\x04`\xFF\x16a2PW`@Qc\x1A\xFC\xD7\x9F`\xE3\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0\x80`\0\x83Q`A\x03aI\x0FW` \x84\x01Q`@\x85\x01Q``\x86\x01Q`\0\x1AaI\x01\x88\x82\x85\x85aJ\xFCV[\x95P\x95P\x95PPPPaI\x1BV[PP\x81Q`\0\x91P`\x02\x90[\x92P\x92P\x92V[`\0\x82`\x03\x81\x11\x15aI6WaI6aO\x94V[\x03aI?WPPV[`\x01\x82`\x03\x81\x11\x15aISWaISaO\x94V[\x03aIqW`@Qc\xF6E\xEE\xDF`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x02\x82`\x03\x81\x11\x15aI\x85WaI\x85aO\x94V[\x03aI\xA6W`@Qc\xFC\xE6\x98\xF7`\xE0\x1B\x81R`\x04\x81\x01\x82\x90R`$\x01a\x0BgV[`\x03\x82`\x03\x81\x11\x15aI\xBAWaI\xBAaO\x94V[\x03a\x1C\x88W`@Qc5\xE2\xF3\x83`\xE2\x1B\x81R`\x04\x81\x01\x82\x90R`$\x01a\x0BgV[\x80`\x01`\x01`\xA0\x1B\x03\x16;`\0\x03aJ\x11W`@QcL\x9C\x8C\xE3`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x82\x16`\x04\x82\x01R`$\x01a\x0BgV[`\0\x80Q` a]\xC3\x839\x81Q\x91R\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16`\x01`\x01`\xA0\x1B\x03\x92\x90\x92\x16\x91\x90\x91\x17\x90UV[```\0\x80\x84`\x01`\x01`\xA0\x1B\x03\x16\x84`@QaJ]\x91\x90a]\xA6V[`\0`@Q\x80\x83\x03\x81\x85Z\xF4\x91PP=\x80`\0\x81\x14aJ\x98W`@Q\x91P`\x1F\x19`?=\x01\x16\x82\x01`@R=\x82R=`\0` \x84\x01>aJ\x9DV[``\x91P[P\x91P\x91Pa0\x17\x85\x83\x83aK\xCBV[4\x15a2PW`@Qc\xB3\x98\x97\x9F`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0\x81Q`@\x14aJ\xF0W`@Qc\xD2\x833]`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[P\x80Q` \x90\x91\x01 \x90V[`\0\x80\x80\x7F\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF]WnsW\xA4P\x1D\xDF\xE9/Fh\x1B \xA0\x84\x11\x15aK7WP`\0\x91P`\x03\x90P\x82aK\xC1V[`@\x80Q`\0\x80\x82R` \x82\x01\x80\x84R\x8A\x90R`\xFF\x89\x16\x92\x82\x01\x92\x90\x92R``\x81\x01\x87\x90R`\x80\x81\x01\x86\x90R`\x01\x90`\xA0\x01` `@Q` \x81\x03\x90\x80\x84\x03\x90\x85Z\xFA\x15\x80\x15aK\x8BW=`\0\x80>=`\0\xFD[PP`@Q`\x1F\x19\x01Q\x91PP`\x01`\x01`\xA0\x1B\x03\x81\x16aK\xB7WP`\0\x92P`\x01\x91P\x82\x90PaK\xC1V[\x92P`\0\x91P\x81\x90P[\x94P\x94P\x94\x91PPV[``\x82aK\xE0WaK\xDB\x82aL'V[aF\xFDV[\x81Q\x15\x80\x15aK\xF7WP`\x01`\x01`\xA0\x1B\x03\x84\x16;\x15[\x15aL W`@Qc\x99\x96\xB3\x15`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x85\x16`\x04\x82\x01R`$\x01a\x0BgV[P\x80aF\xFDV[\x80Q\x15aL7W\x80Q\x80\x82` \x01\xFD[`@Qc\xD6\xBD\xA2u`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0` \x82\x84\x03\x12\x15aLbW`\0\x80\xFD[\x815`\x01`\x01`\xE0\x1B\x03\x19\x81\x16\x81\x14aF\xFDW`\0\x80\xFD[`\0\x80\x83`\x1F\x84\x01\x12aL\x8CW`\0\x80\xFD[P\x815`\x01`\x01`@\x1B\x03\x81\x11\x15aL\xA3W`\0\x80\xFD[` \x83\x01\x91P\x83` \x82`\x05\x1B\x85\x01\x01\x11\x15aD&W`\0\x80\xFD[`\0\x80`\0\x80`\0``\x86\x88\x03\x12\x15aL\xD6W`\0\x80\xFD[\x855\x94P` \x86\x015`\x01`\x01`@\x1B\x03\x81\x11\x15aL\xF3W`\0\x80\xFD[aL\xFF\x88\x82\x89\x01aLzV[\x90\x95P\x93PP`@\x86\x015`\x01`\x01`@\x1B\x03\x81\x11\x15aM\x1EW`\0\x80\xFD[aM*\x88\x82\x89\x01aLzV[\x96\x99\x95\x98P\x93\x96P\x92\x94\x93\x92PPPV[`\0\x80\x83`\x1F\x84\x01\x12aMMW`\0\x80\xFD[P\x815`\x01`\x01`@\x1B\x03\x81\x11\x15aMdW`\0\x80\xFD[` \x83\x01\x91P\x83` \x82\x85\x01\x01\x11\x15aD&W`\0\x80\xFD[`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a\x12\x80W`\0\x80\xFD[`\0\x80`\0\x80`\0\x80`\0\x80`\xA0\x89\x8B\x03\x12\x15aM\xADW`\0\x80\xFD[\x885`\x01`\x01`@\x1B\x03\x81\x11\x15aM\xC3W`\0\x80\xFD[aM\xCF\x8B\x82\x8C\x01aM;V[\x90\x99P\x97PP` \x89\x015aM\xE3\x81aM|V[\x95P`@\x89\x015\x94P``\x89\x015`\x01`\x01`@\x1B\x03\x81\x11\x15aN\x05W`\0\x80\xFD[aN\x11\x8B\x82\x8C\x01aM;V[\x90\x95P\x93PP`\x80\x89\x015`\x01`\x01`@\x1B\x03\x81\x11\x15aN0W`\0\x80\xFD[aN<\x8B\x82\x8C\x01aM;V[\x99\x9C\x98\x9BP\x96\x99P\x94\x97\x93\x96\x92\x95\x94PPPV[\x805`\x03\x81\x10a\x14\xA4W`\0\x80\xFD[`\0`\xE0\x82\x84\x03\x12\x15aNqW`\0\x80\xFD[P\x91\x90PV[`\0\x80`\0\x80`\0\x80`\x80\x87\x89\x03\x12\x15aN\x90W`\0\x80\xFD[aN\x99\x87aNPV[\x95P` \x87\x015`\x01`\x01`@\x1B\x03\x81\x11\x15aN\xB4W`\0\x80\xFD[aN\xC0\x89\x82\x8A\x01aN_V[\x95PP`@\x87\x015`\x01`\x01`@\x1B\x03\x81\x11\x15aN\xDCW`\0\x80\xFD[aN\xE8\x89\x82\x8A\x01aM;V[\x90\x95P\x93PP``\x87\x015`\x01`\x01`@\x1B\x03\x81\x11\x15aO\x07W`\0\x80\xFD[aO\x13\x89\x82\x8A\x01aM;V[\x97\x9A\x96\x99P\x94\x97P\x92\x95\x93\x94\x92PPPV[`\0` \x82\x84\x03\x12\x15aO7W`\0\x80\xFD[P5\x91\x90PV[`\0` \x82\x84\x03\x12\x15aOPW`\0\x80\xFD[aF\xFD\x82aNPV[\x805a\x14\xA4\x81aM|V[`\0\x80`@\x83\x85\x03\x12\x15aOwW`\0\x80\xFD[\x825\x91P` \x83\x015aO\x89\x81aM|V[\x80\x91PP\x92P\x92\x90PV[cNH{q`\xE0\x1B`\0R`!`\x04R`$`\0\xFD[`\x06\x81\x10aO\xC8WcNH{q`\xE0\x1B`\0R`!`\x04R`$`\0\xFD[\x90RV[` \x81\x01a\tY\x82\x84aO\xAAV[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`@Q`\xE0\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15aP\x12WaP\x12aO\xDAV[`@R\x90V[`@Q`\x1F\x82\x01`\x1F\x19\x16\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15aP@WaP@aO\xDAV[`@R\x91\x90PV[`\0`\x01`\x01`@\x1B\x03\x82\x11\x15aPaWaPaaO\xDAV[P`\x1F\x01`\x1F\x19\x16` \x01\x90V[`\0\x82`\x1F\x83\x01\x12aP\x80W`\0\x80\xFD[\x815aP\x93aP\x8E\x82aPHV[aP\x18V[\x81\x81R\x84` \x83\x86\x01\x01\x11\x15aP\xA8W`\0\x80\xFD[\x81` \x85\x01` \x83\x017`\0\x91\x81\x01` \x01\x91\x90\x91R\x93\x92PPPV[`\0\x80`@\x83\x85\x03\x12\x15aP\xD8W`\0\x80\xFD[\x825aP\xE3\x81aM|V[\x91P` \x83\x015`\x01`\x01`@\x1B\x03\x81\x11\x15aP\xFEW`\0\x80\xFD[aQ\n\x85\x82\x86\x01aPoV[\x91PP\x92P\x92\x90PV[`\0\x80`\0\x80``\x85\x87\x03\x12\x15aQ*W`\0\x80\xFD[\x845\x93P` \x85\x015aQ<\x81aM|V[\x92P`@\x85\x015`\x01`\x01`@\x1B\x03\x81\x11\x15aQWW`\0\x80\xFD[aQc\x87\x82\x88\x01aM;V[\x95\x98\x94\x97P\x95PPPPV[`\0`\x01`\x01`@\x1B\x03\x82\x11\x15aQ\x88WaQ\x88aO\xDAV[P`\x05\x1B` \x01\x90V[`\0\x82`\x1F\x83\x01\x12aQ\xA3W`\0\x80\xFD[\x815aQ\xB1aP\x8E\x82aQoV[\x80\x82\x82R` \x82\x01\x91P` \x83`\x05\x1B\x86\x01\x01\x92P\x85\x83\x11\x15aQ\xD3W`\0\x80\xFD[` \x85\x01[\x83\x81\x10\x15aQ\xF0W\x805\x83R` \x92\x83\x01\x92\x01aQ\xD8V[P\x95\x94PPPPPV[`\0\x80`\0`@\x84\x86\x03\x12\x15aR\x0FW`\0\x80\xFD[\x835`\x01`\x01`@\x1B\x03\x81\x11\x15aR%W`\0\x80\xFD[aR1\x86\x82\x87\x01aQ\x92V[\x93PP` \x84\x015`\x01`\x01`@\x1B\x03\x81\x11\x15aRMW`\0\x80\xFD[aRY\x86\x82\x87\x01aLzV[\x94\x97\x90\x96P\x93\x94PPPPV[`\0\x80`\0`@\x84\x86\x03\x12\x15aR{W`\0\x80\xFD[\x835`\x01`\x01`@\x1B\x03\x81\x11\x15aR\x91W`\0\x80\xFD[aR\x9D\x86\x82\x87\x01aPoV[\x93PP` \x84\x015`\x01`\x01`@\x1B\x03\x81\x11\x15aR\xB9W`\0\x80\xFD[aRY\x86\x82\x87\x01aM;V[`\0[\x83\x81\x10\x15aR\xE0W\x81\x81\x01Q\x83\x82\x01R` \x01aR\xC8V[PP`\0\x91\x01RV[`\0\x81Q\x80\x84RaS\x01\x81` \x86\x01` \x86\x01aR\xC5V[`\x1F\x01`\x1F\x19\x16\x92\x90\x92\x01` \x01\x92\x91PPV[`\x80\x81R\x84Q`\x80\x82\x01R` \x85\x01Q`\xA0\x82\x01R`@\x85\x01Q`\xC0\x82\x01R``\x85\x01Q`\xE0\x82\x01R`\x80\x85\x01Qa\x01\0\x82\x01R`\x01\x80`\xA0\x1B\x03`\xA0\x86\x01Q\x16a\x01 \x82\x01R`\0`\xC0\x86\x01Q`\xE0a\x01@\x84\x01RaSya\x01`\x84\x01\x82aR\xE9V[\x91PPaS\x89` \x83\x01\x86aO\xAAV[`\x01`\x01`\xA0\x1B\x03\x84\x16`@\x83\x01R`\x01`\x01`\xA0\x1B\x03\x83\x16``\x83\x01R\x95\x94PPPPPV[`\0\x80`\0\x80`\0\x80`\x80\x87\x89\x03\x12\x15aS\xC9W`\0\x80\xFD[\x865`\x01`\x01`@\x1B\x03\x81\x11\x15aS\xDFW`\0\x80\xFD[aS\xEB\x89\x82\x8A\x01aN_V[\x96PPaS\xFA` \x88\x01aNPV[\x94P`@\x87\x015`\x01`\x01`@\x1B\x03\x81\x11\x15aN\xDCW`\0\x80\xFD[`\0` \x82\x84\x03\x12\x15aT'W`\0\x80\xFD[\x815aF\xFD\x81aM|V[`\0\x80`@\x83\x85\x03\x12\x15aTEW`\0\x80\xFD[aTN\x83aNPV[\x94` \x93\x90\x93\x015\x93PPPV[` \x81R`\0aF\xFD` \x83\x01\x84aR\xE9V[`\0\x80`\0`@\x84\x86\x03\x12\x15aT\x84W`\0\x80\xFD[\x835\x92P` \x84\x015`\x01`\x01`@\x1B\x03\x81\x11\x15aR\xB9W`\0\x80\xFD[`\0\x80` \x83\x85\x03\x12\x15aT\xB4W`\0\x80\xFD[\x825`\x01`\x01`@\x1B\x03\x81\x11\x15aT\xCAW`\0\x80\xFD[aT\xD6\x85\x82\x86\x01aM;V[\x90\x96\x90\x95P\x93PPPPV[`\0\x80`\0\x80`\0\x80`\x80\x87\x89\x03\x12\x15aT\xFBW`\0\x80\xFD[\x865`\x01`\x01`@\x1B\x03\x81\x11\x15aU\x11W`\0\x80\xFD[aU\x1D\x89\x82\x8A\x01aQ\x92V[\x96PP` \x87\x015`\x01`\x01`@\x1B\x03\x81\x11\x15aU9W`\0\x80\xFD[\x87\x01`\x1F\x81\x01\x89\x13aUJW`\0\x80\xFD[\x805aUXaP\x8E\x82aQoV[\x80\x82\x82R` \x82\x01\x91P` \x83`\x05\x1B\x85\x01\x01\x92P\x8B\x83\x11\x15aUzW`\0\x80\xFD[` \x84\x01\x93P[\x82\x84\x10\x15aU\xA5W\x835aU\x94\x81aM|V[\x82R` \x93\x84\x01\x93\x90\x91\x01\x90aU\x81V[\x97PPPP`@\x87\x015`\x01`\x01`@\x1B\x03\x81\x11\x15aU\xC3W`\0\x80\xFD[aN\xE8\x89\x82\x8A\x01aLzV[`\x01`\x01`\xA0\x1B\x03\x88\x81\x16\x82R` \x82\x01\x88\x90R`@\x82\x01\x87\x90R``\x82\x01\x86\x90R`\x80\x82\x01\x85\x90R\x83\x16`\xA0\x82\x01R`\xE0`\xC0\x82\x01\x81\x90R`\0\x90aV\x17\x90\x83\x01\x84aR\xE9V[\x99\x98PPPPPPPPPV[cNH{q`\xE0\x1B`\0R`2`\x04R`$`\0\xFD[`\x01\x81\x81\x1C\x90\x82\x16\x80aVNW`\x7F\x82\x16\x91P[` \x82\x10\x81\x03aNqWcNH{q`\xE0\x1B`\0R`\"`\x04R`$`\0\xFD[`\0\x80\x835`\x1E\x19\x846\x03\x01\x81\x12aV\x85W`\0\x80\xFD[\x83\x01\x805\x91P`\x01`\x01`@\x1B\x03\x82\x11\x15aV\x9FW`\0\x80\xFD[` \x01\x91P6\x81\x90\x03\x82\x13\x15aD&W`\0\x80\xFD[`\0` \x82\x84\x03\x12\x15aV\xC6W`\0\x80\xFD[\x81Q\x80\x15\x15\x81\x14aF\xFDW`\0\x80\xFD[\x81\x83R\x81\x81` \x85\x017P`\0\x82\x82\x01` \x90\x81\x01\x91\x90\x91R`\x1F\x90\x91\x01`\x1F\x19\x16\x90\x91\x01\x01\x90V[\x83\x81R`@` \x82\x01R`\0a0\x17`@\x83\x01\x84\x86aV\xD6V[cNH{q`\xE0\x1B`\0R`\x11`\x04R`$`\0\xFD[\x80\x82\x01\x80\x82\x11\x15a\tYWa\tYaW\x19V[`\x1F\x82\x11\x15a\x15 W\x80`\0R` `\0 `\x1F\x84\x01`\x05\x1C\x81\x01` \x85\x10\x15aWiWP\x80[`\x1F\x84\x01`\x05\x1C\x82\x01\x91P[\x81\x81\x10\x15aW\x89W`\0\x81U`\x01\x01aWuV[PPPPPV[\x81Q`\x01`\x01`@\x1B\x03\x81\x11\x15aW\xA9WaW\xA9aO\xDAV[aW\xBD\x81aW\xB7\x84TaV:V[\x84aWBV[` `\x1F\x82\x11`\x01\x81\x14aW\xF1W`\0\x83\x15aW\xD9WP\x84\x82\x01Q[`\0\x19`\x03\x85\x90\x1B\x1C\x19\x16`\x01\x84\x90\x1B\x17\x84UaW\x89V[`\0\x84\x81R` \x81 `\x1F\x19\x85\x16\x91[\x82\x81\x10\x15aX!W\x87\x85\x01Q\x82U` \x94\x85\x01\x94`\x01\x90\x92\x01\x91\x01aX\x01V[P\x84\x82\x10\x15aX?W\x86\x84\x01Q`\0\x19`\x03\x87\x90\x1B`\xF8\x16\x1C\x19\x16\x81U[PPPP`\x01\x90\x81\x1B\x01\x90UPV[\x80\x82\x02\x81\x15\x82\x82\x04\x84\x14\x17a\tYWa\tYaW\x19V[`\x01\x80`\xA0\x1B\x03\x85\x16\x81R\x83` \x82\x01R`\x80`@\x82\x01R`\0aX\x8C`\x80\x83\x01\x85aR\xE9V[\x82\x81\x03``\x84\x01RaX\x9E\x81\x85aR\xE9V[\x97\x96PPPPPPPV[`\0\x83\x83\x85R` \x85\x01\x94P` \x84`\x05\x1B\x82\x01\x01\x83`\0[\x86\x81\x10\x15aY6W\x83\x83\x03`\x1F\x19\x01\x88R\x8156\x87\x90\x03`\x1E\x19\x01\x81\x12aX\xE8W`\0\x80\xFD[\x86\x01` \x81\x01\x905`\x01`\x01`@\x1B\x03\x81\x11\x15aY\x04W`\0\x80\xFD[\x806\x03\x82\x13\x15aY\x13W`\0\x80\xFD[aY\x1E\x85\x82\x84aV\xD6V[` \x9A\x8B\x01\x9A\x90\x95P\x93\x90\x93\x01\x92PP`\x01\x01aX\xC2V[P\x90\x96\x95PPPPPPV[``\x80\x82R\x85Q\x90\x82\x01\x81\x90R`\0\x90` \x87\x01\x90`\x80\x84\x01\x90\x83[\x81\x81\x10\x15aY|W\x83Q\x83R` \x93\x84\x01\x93\x90\x92\x01\x91`\x01\x01aY^V[PP\x83\x81\x03` \x80\x86\x01\x91\x90\x91R\x87Q\x80\x83R\x91\x81\x01\x92P\x87\x01\x90`\0[\x81\x81\x10\x15aY\xC1W\x82Q`\x01`\x01`\xA0\x1B\x03\x16\x84R` \x93\x84\x01\x93\x90\x92\x01\x91`\x01\x01aY\x9AV[PPP\x82\x81\x03`@\x84\x01RaX\x9E\x81\x85\x87aX\xA9V[`\0\x80`\0``\x84\x86\x03\x12\x15aY\xECW`\0\x80\xFD[\x835`\x01`\x01`@\x1B\x03\x81\x11\x15aZ\x02W`\0\x80\xFD[aZ\x0E\x86\x82\x87\x01aPoV[\x93PP` \x84\x015`\x01`\x01`@\x1B\x03\x81\x11\x15aZ*W`\0\x80\xFD[aZ6\x86\x82\x87\x01aPoV[\x92PP`@\x84\x015`\x01`\x01`@\x1B\x03\x81\x11\x15aZRW`\0\x80\xFD[aZ^\x86\x82\x87\x01aPoV[\x91PP\x92P\x92P\x92V[`\0` \x82\x84\x03\x12\x15aZzW`\0\x80\xFD[PQ\x91\x90PV[`\0\x80`@\x83\x85\x03\x12\x15aZ\x94W`\0\x80\xFD[PP\x80Q` \x90\x91\x01Q\x90\x92\x90\x91PV[`\0\x80`@\x83\x85\x03\x12\x15aZ\xB8W`\0\x80\xFD[\x82QaZ\xC3\x81aM|V[` \x93\x90\x93\x01Q\x92\x94\x92\x93PPPV[`@\x81R`\0aZ\xE6`@\x83\x01\x86aR\xE9V[\x82\x81\x03` \x84\x01Ra\x11\xA5\x81\x85\x87aV\xD6V[\x81\x81\x03\x81\x81\x11\x15a\tYWa\tYaW\x19V[` \x81R`\0a[ ` \x83\x01\x84\x86aV\xD6V[\x94\x93PPPPV[`@\x81R`\0a[;`@\x83\x01\x85aR\xE9V[\x90P`\x01\x80`\xA0\x1B\x03\x83\x16` \x83\x01R\x93\x92PPPV[`\0\x82`\x1F\x83\x01\x12a[cW`\0\x80\xFD[\x81Qa[qaP\x8E\x82aPHV[\x81\x81R\x84` \x83\x86\x01\x01\x11\x15a[\x86W`\0\x80\xFD[a[ \x82` \x83\x01` \x87\x01aR\xC5V[`\0\x80`\0\x80`\0\x80`\0\x80a\x01\0\x89\x8B\x03\x12\x15a[\xB4W`\0\x80\xFD[\x88Q`\x01`\x01`@\x1B\x03\x81\x11\x15a[\xCAW`\0\x80\xFD[a[\xD6\x8B\x82\x8C\x01a[RV[\x98PP` \x89\x01Q`\x01`\x01`@\x1B\x03\x81\x11\x15a[\xF2W`\0\x80\xFD[a[\xFE\x8B\x82\x8C\x01a[RV[\x97PP`@\x89\x01Q`\x01`\x01`@\x1B\x03\x81\x11\x15a\\\x1AW`\0\x80\xFD[a\\&\x8B\x82\x8C\x01a[RV[\x96PP``\x89\x01Q`\x01`\x01`@\x1B\x03\x81\x11\x15a\\BW`\0\x80\xFD[a\\N\x8B\x82\x8C\x01a[RV[\x95PP`\x80\x89\x01Q`\x01`\x01`@\x1B\x03\x81\x11\x15a\\jW`\0\x80\xFD[a\\v\x8B\x82\x8C\x01a[RV[`\xA0\x8B\x01Q`\xC0\x8C\x01Q`\xE0\x90\x9C\x01Q\x9A\x9D\x99\x9CP\x97\x9A\x96\x99\x90\x98\x90\x95P\x93PPPPV[`\0`\xE0\x826\x03\x12\x15a\\\xADW`\0\x80\xFD[a\\\xB5aO\xF0V[\x825\x81R` \x80\x84\x015\x90\x82\x01R`@\x80\x84\x015\x90\x82\x01R``\x80\x84\x015\x90\x82\x01R`\x80\x80\x84\x015\x90\x82\x01Ra\\\xED`\xA0\x84\x01aOYV[`\xA0\x82\x01R`\xC0\x83\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a]\x0BW`\0\x80\xFD[a]\x176\x82\x86\x01aPoV[`\xC0\x83\x01RP\x92\x91PPV[`@\x81R`\0a]7`@\x83\x01\x86\x88aV\xD6V[\x82\x81\x03` \x84\x01RaX\x9E\x81\x85\x87aV\xD6V[\x82\x81R`@` \x82\x01R`\0a[ `@\x83\x01\x84aR\xE9V[`\0\x84Qa]u\x81\x84` \x89\x01aR\xC5V[\x84Q\x90\x83\x01\x90a]\x89\x81\x83` \x89\x01aR\xC5V[\x84Q\x91\x01\x90a]\x9C\x81\x83` \x88\x01aR\xC5V[\x01\x95\x94PPPPPV[`\0\x82Qa]\xB8\x81\x84` \x87\x01aR\xC5V[\x91\x90\x91\x01\x92\x91PPV\xFE6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBCs\xE5s\xF9VmaA\x8A4\xD5\xDE?\xF4\x93`\xF9\xC5\x1F\xEC7\xF7HeQg\x02\x90\xF6(]\xAB\x02\xDD{\xC7\xDE\xC4\xDC\xEE\xDD\xA7u\xE5\x8D\xD5A\xE0\x8A\x11llS\x81\\\x0B\xD0(\x19/{bh\0\xCD^\xD1\\n\x18~w\xE9\xAE\xE8\x81\x84\xC2\x1FO!\x82\xABX'\xCB;~\x07\xFB\xED\xCDc\xF03\0\x08\x0F^\xA8N\xD1\xDEL\x8E\xDBX\xBEe\x1C%X\x1C5Z\0\x11\xB0\xF96\r\xE5\x08+\xEC\xD6F@\xA2dipfsX\"\x12 \x89\xF9\x14Vd;\x81\x8AYD\xEB\xC4\x89\x8Fs\xDD\x80F\x8C\xE5j\x86s\xCE\x17t\xC3\xB9\xC8\xDDE\xA3dsolcC\0\x08\x1C\x003"; /// The bytecode of the contract. pub static PROOFMARKETPLACE_BYTECODE: ::ethers::core::types::Bytes = ::ethers::core::types::Bytes::from_static(__BYTECODE); #[rustfmt::skip] - const __DEPLOYED_BYTECODE: &[u8] = b"`\x80`@R`\x046\x10a\x02}W`\x005`\xE0\x1C\x80ceY9{\x11a\x01OW\x80c\x91\xD1HT\x11a\0\xC1W\x80c\xD4\xC2B6\x11a\0zW\x80c\xD4\xC2B6\x14a\x08\"W\x80c\xD5Gt\x1F\x14a\x08BW\x80c\xE6\xAF\xC3\xD9\x14a\x08bW\x80c\xF0`,\xAB\x14a\x08\x82W\x80c\xF8\xA9H/\x14a\x08\xA2W\x80c\xFB\xEF\x98m\x14a\x08\xD5W`\0\x80\xFD[\x80c\x91\xD1HT\x14a\x07;W\x80c\x97Q\xBB\xD3\x14a\x07[W\x80c\xA2\x17\xFD\xDF\x14a\x07\x8FW\x80c\xAD<\xB1\xCC\x14a\x07\xA4W\x80c\xC2D\xA7\xB9\x14a\x07\xE2W\x80c\xC4\xD6m\xE8\x14a\x08\x02W`\0\x80\xFD[\x80cx\x7F\xB0K\x11a\x01\x13W\x80cx\x7F\xB0K\x14a\x06dW\x80cy\xC7n\x1A\x14a\x06\x84W\x80c\x84V\xCBY\x14a\x06\xA4W\x80c\x87|\x86\xFB\x14a\x06\xB9W\x80c\x89\x88PI\x14a\x06\xEDW\x80c\x8E\xCC\xBD\xAF\x14a\x07\x1BW`\0\x80\xFD[\x80ceY9{\x14a\x05tW\x80cf\x1D\xE5\xAC\x14a\x05\xA8W\x80cl\x8D\xF5\x18\x14a\x05\xF4W\x80cm\xA6w\x9B\x14a\x06$W\x80cpS\x8F\xCA\x14a\x06DW`\0\x80\xFD[\x80c6V\x8A\xBE\x11a\x01\xF3W\x80cO\x1E\xF2\x86\x11a\x01\xACW\x80cO\x1E\xF2\x86\x14a\x04\xC7W\x80cRy\x86\xD0\x14a\x04\xDAW\x80cR\xD1\x90-\x14a\x04\xFAW\x80cS{[\x7F\x14a\x05\x0FW\x80c\\\x97Z\xBB\x14a\x05/W\x80cd\x17\xFBa\x14a\x05TW`\0\x80\xFD[\x80c6V\x8A\xBE\x14a\x03\xF5W\x80c?K\xA8:\x14a\x04\x15W\x80cE\x07R\xB4\x14a\x04*W\x80cG\xE63\x80\x14a\x04JW\x80cIm\xF3\xB1\x14a\x04lW\x80cMFq-\x14a\x04\x9AW`\0\x80\xFD[\x80c }f)\x11a\x02EW\x80c }f)\x14a\x03GW\x80c$v\x08\x07\x14a\x03gW\x80c$\x8A\x9C\xA3\x14a\x03}W\x80c(D8\xA1\x14a\x03\x9DW\x80c//\xF1]\x14a\x03\xBFW\x80c1u\x93\xD2\x14a\x03\xDFW`\0\x80\xFD[\x80c\x01\xFF\xC9\xA7\x14a\x02\x82W\x80c\x04K\xC8\xED\x14a\x02\xB7W\x80c\x15\xC9\x8Az\x14a\x02\xD9W\x80c\x16\x0F\xCF\xBA\x14a\x02\xF9W\x80c\x16(\xE0\xF5\x14a\x03'W[`\0\x80\xFD[4\x80\x15a\x02\x8EW`\0\x80\xFD[Pa\x02\xA2a\x02\x9D6`\x04aI\x7FV[a\x08\xEAV[`@Q\x90\x15\x15\x81R` \x01[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x02\xC3W`\0\x80\xFD[Pa\x02\xD7a\x02\xD26`\x04aI\xEDV[a\x08\xFBV[\0[4\x80\x15a\x02\xE5W`\0\x80\xFD[Pa\x02\xD7a\x02\xF46`\x04aJ\xBCV[a\x0C\xAFV[4\x80\x15a\x03\x05W`\0\x80\xFD[Pa\x03\x19a\x03\x146`\x04aK\x9AV[a\x10|V[`@Q\x90\x81R` \x01a\x02\xAEV[4\x80\x15a\x033W`\0\x80\xFD[Pa\x02\xD7a\x03B6`\x04aL>V[a\x11\x07V[4\x80\x15a\x03SW`\0\x80\xFD[Pa\x03\x19a\x03b6`\x04aL>V[a\x11\xDBV[4\x80\x15a\x03sW`\0\x80\xFD[Pa\x01\xF4Ta\x03\x19V[4\x80\x15a\x03\x89W`\0\x80\xFD[Pa\x03\x19a\x03\x986`\x04aL>V[a\x14\x01V[4\x80\x15a\x03\xA9W`\0\x80\xFD[Pa\x03\x19`\0\x80Q` a[\x0F\x839\x81Q\x91R\x81V[4\x80\x15a\x03\xCBW`\0\x80\xFD[Pa\x02\xD7a\x03\xDA6`\x04aLbV[a\x14#V[4\x80\x15a\x03\xEBW`\0\x80\xFD[Pa\x01\xF5Ta\x03\x19V[4\x80\x15a\x04\x01W`\0\x80\xFD[Pa\x02\xD7a\x04\x106`\x04aLbV[a\x14EV[4\x80\x15a\x04!W`\0\x80\xFD[Pa\x02\xD7a\x14}V[4\x80\x15a\x046W`\0\x80\xFD[Pa\x02\xD7a\x04E6`\x04aI\xEDV[a\x14\x9DV[4\x80\x15a\x04VW`\0\x80\xFD[Pa\x03\x19`\0\x80Q` aZ\xAF\x839\x81Q\x91R\x81V[4\x80\x15a\x04xW`\0\x80\xFD[Pa\x03\x19a\x04\x876`\x04aL\x92V[a\x01\xF6` R`\0\x90\x81R`@\x90 T\x81V[4\x80\x15a\x04\xA6W`\0\x80\xFD[Pa\x04\xBAa\x04\xB56`\x04aL>V[a\x17\xD6V[`@Qa\x02\xAE\x91\x90aL\xE5V[a\x02\xD7a\x04\xD56`\x04aM\xDEV[a\x19\xCFV[4\x80\x15a\x04\xE6W`\0\x80\xFD[Pa\x02\xD7a\x04\xF56`\x04aN-V[a\x19\xEEV[4\x80\x15a\x05\x06W`\0\x80\xFD[Pa\x03\x19a\x1A\xE3V[4\x80\x15a\x05\x1BW`\0\x80\xFD[Pa\x02\xD7a\x05*6`\x04aO\x11V[a\x1B\0V[4\x80\x15a\x05;W`\0\x80\xFD[P`\0\x80Q` aZ\xEF\x839\x81Q\x91RT`\xFF\x16a\x02\xA2V[4\x80\x15a\x05`W`\0\x80\xFD[Pa\x02\xD7a\x05o6`\x04aOyV[a\x1B\x96V[4\x80\x15a\x05\x80W`\0\x80\xFD[Pa\x03\x19\x7F\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\x81V[4\x80\x15a\x05\xB4W`\0\x80\xFD[Pa\x05\xDC\x7F\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\x81V[`@Q`\x01`\x01`\xA0\x1B\x03\x90\x91\x16\x81R` \x01a\x02\xAEV[4\x80\x15a\x06\0W`\0\x80\xFD[Pa\x06\x14a\x06\x0F6`\x04aL>V[a\x1COV[`@Qa\x02\xAE\x94\x93\x92\x91\x90aP$V[4\x80\x15a\x060W`\0\x80\xFD[Pa\x03\x19a\x06?6`\x04aLbV[a\x1D\x82V[4\x80\x15a\x06PW`\0\x80\xFD[Pa\x02\xD7a\x06_6`\x04aP\xBFV[a\x1D\xDDV[4\x80\x15a\x06pW`\0\x80\xFD[Pa\x02\xD7a\x06\x7F6`\x04aL>V[a\x1E\x0CV[4\x80\x15a\x06\x90W`\0\x80\xFD[Pa\x02\xD7a\x06\x9F6`\x04aQ\tV[a\x1F\xB8V[4\x80\x15a\x06\xB0W`\0\x80\xFD[Pa\x02\xD7a (V[4\x80\x15a\x06\xC5W`\0\x80\xFD[Pa\x05\xDC\x7F\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\x81V[4\x80\x15a\x06\xF9W`\0\x80\xFD[Pa\x03\x19a\x07\x086`\x04aQ\tV[a\x01\xF7` R`\0\x90\x81R`@\x90 T\x81V[4\x80\x15a\x07'W`\0\x80\xFD[Pa\x02\xD7a\x0766`\x04aQ&V[a HV[4\x80\x15a\x07GW`\0\x80\xFD[Pa\x02\xA2a\x07V6`\x04aLbV[a \xE4V[4\x80\x15a\x07gW`\0\x80\xFD[Pa\x05\xDC\x7F\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\x81V[4\x80\x15a\x07\x9BW`\0\x80\xFD[Pa\x03\x19`\0\x81V[4\x80\x15a\x07\xB0W`\0\x80\xFD[Pa\x07\xD5`@Q\x80`@\x01`@R\x80`\x05\x81R` \x01d\x03R\xE3\x02\xE3`\xDC\x1B\x81RP\x81V[`@Qa\x02\xAE\x91\x90aQPV[4\x80\x15a\x07\xEEW`\0\x80\xFD[Pa\x02\xD7a\x07\xFD6`\x04aQcV[a!\x1CV[4\x80\x15a\x08\x0EW`\0\x80\xFD[Pa\x02\xD7a\x08\x1D6`\x04aQ\tV[a!7V[4\x80\x15a\x08.W`\0\x80\xFD[Pa\x02\xD7a\x08=6`\x04aQ\xA1V[a\"\x90V[4\x80\x15a\x08NW`\0\x80\xFD[Pa\x02\xD7a\x08]6`\x04aLbV[a#V[a(\xB6V[`@Qa\x02\xAE\x97\x96\x95\x94\x93\x92\x91\x90aR\xBFV[4\x80\x15a\x08\xE1W`\0\x80\xFD[Pa\x03\x19`d\x81V[`\0a\x08\xF5\x82a)\x9FV[\x92\x91PPV[`\0a\x01\xF4\x86\x81T\x81\x10a\t\x11Wa\t\x11aS\x0FV[`\0\x91\x82R` \x91\x82\x90 `@\x80Q`\xE0\x81\x01\x82R`\x07\x90\x93\x02\x90\x91\x01\x80T`\x01`\x01`\xA0\x1B\x03\x90\x81\x16\x84R`\x01\x82\x01T\x94\x84\x01\x94\x90\x94R`\x02\x81\x01T\x91\x83\x01\x91\x90\x91R`\x03\x81\x01T``\x83\x01R`\x04\x81\x01T`\x80\x83\x01R`\x05\x81\x01T\x90\x92\x16`\xA0\x82\x01R`\x06\x82\x01\x80T\x91\x92\x91`\xC0\x84\x01\x91\x90a\t\x8E\x90aS%V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\t\xBA\x90aS%V[\x80\x15a\n\x07W\x80`\x1F\x10a\t\xDCWa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\n\x07V[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\t\xEAW\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81RPP\x90P\x80`\xC0\x01QQ`\0\x03a\n8W`@Qc\x9D\xB8\xD5\xB1`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\xA0\x81\x01Q`\x01`\x01`\xA0\x1B\x03\x163`\x01`\x01`\xA0\x1B\x03\x16\x14a\nnW`@Qc8\x99:I`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x83\x15a\x0B\xB1Wa\n\x81\x81` \x01Qa)\xD4V[a\n\x9EW`@Qcz\xFC\xEF\x7F`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0[\x84\x81\x10\x15a\x0B\xAFW`\0a\n\xD7\x87\x87\x84\x81\x81\x10a\n\xC0Wa\n\xC0aS\x0FV[\x90P` \x02\x81\x01\x90a\n\xD2\x91\x90aSYV[a*\tV[\x90P\x82` \x01Q\x81\x03a\x0B\x0CW`@QcZ\xB2\xFB\xC9`\xE1\x1B\x81R`\x04\x81\x01\x89\x90R`$\x81\x01\x82\x90R`D\x01[`@Q\x80\x91\x03\x90\xFD[\x7F\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`\x01`\x01`\xA0\x1B\x03\x16c\x14\x13\xA9*\x82a\x0BE\x8Ba*+V[`@Q`\x01`\x01`\xE0\x1B\x03\x19`\xE0\x85\x90\x1B\x16\x81R`\x04\x81\x01\x92\x90\x92R`$\x82\x01R`D\x01`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x0B\x83W`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x0B\x97W=`\0\x80>=`\0\xFD[PPPPP\x80\x80a\x0B\xA7\x90aS\xB5V[\x91PPa\n\xA1V[P[`\0[\x82\x81\x10\x15a\x0C\xA6W`\0a\x0B\xD3\x85\x85\x84\x81\x81\x10a\n\xC0Wa\n\xC0aS\x0FV[\x90P\x82`\x80\x01Q\x81\x03a\x0C\x03W`@QcZ\xB2\xFB\xC9`\xE1\x1B\x81R`\x04\x81\x01\x89\x90R`$\x81\x01\x82\x90R`D\x01a\x0B\x03V[\x7F\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`\x01`\x01`\xA0\x1B\x03\x16c\x14\x13\xA9*\x82a\x0C<\x8Ba*sV[`@Q`\x01`\x01`\xE0\x1B\x03\x19`\xE0\x85\x90\x1B\x16\x81R`\x04\x81\x01\x92\x90\x92R`$\x82\x01R`D\x01`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x0CzW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x0C\x8EW=`\0\x80>=`\0\xFD[PPPPP\x80\x80a\x0C\x9E\x90aS\xB5V[\x91PPa\x0B\xB4V[PPPPPPPV[a\x0C\xB7a*\xA2V[3\x85\x15\x80a\x0C\xC3WP\x87\x15[\x80a\x0C\xD5WP`\x01`\x01`\xA0\x1B\x03\x87\x16\x15[\x15a\x0C\xF3W`@Qc\x1E\x1D\n\xB5`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x86`\x01`\x01`\xA0\x1B\x03\x16c\x10\xA5By`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\r1W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\rU\x91\x90aS\xCEV[a\rrW`@Qcy\xA6}[`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\r\xE7`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x82\x7F\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\x7F\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\0a*\xECV[a\x01\xF4Ta\r\xFDa\r\xF8\x87\x87a*\tV[a)\xD4V[\x15a\x0E\x8DW\x7F\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`\x01`\x01`\xA0\x1B\x03\x16c\xFF\x11J\xE1a\x0E:\x83a*+V[\x88\x88`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x0EZ\x93\x92\x91\x90aT\x19V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x0EtW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x0E\x88W=`\0\x80>=`\0\xFD[PPPP[\x7F\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`\x01`\x01`\xA0\x1B\x03\x16c\xFF\x11J\xE1a\x0E\xC5\x83a*sV[\x86\x86`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x0E\xE5\x93\x92\x91\x90aT\x19V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x0E\xFFW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x0F\x13W=`\0\x80>=`\0\xFD[PPPPa\x01\xF4`@Q\x80`\xE0\x01`@R\x80\x8A`\x01`\x01`\xA0\x1B\x03\x16\x81R` \x01a\x0F>\x89\x89a*\tV[\x81R` \x81\x01\x8A\x90R`@\x01a\x0FU`dCaT3V[\x81R` \x01a\x0Fd\x87\x87a*\tV[\x81R` \x01\x84`\x01`\x01`\xA0\x1B\x03\x16\x81R` \x01\x8C\x8C\x80\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x93\x92\x91\x90\x81\x81R` \x01\x83\x83\x80\x82\x847`\0\x92\x01\x82\x90RP\x93\x90\x94RPP\x83T`\x01\x80\x82\x01\x86U\x94\x82R` \x91\x82\x90 \x84Q`\x07\x90\x92\x02\x01\x80T`\x01`\x01`\xA0\x1B\x03\x19\x90\x81\x16`\x01`\x01`\xA0\x1B\x03\x93\x84\x16\x17\x82U\x92\x85\x01Q\x95\x81\x01\x95\x90\x95U`@\x84\x01Q`\x02\x86\x01U``\x84\x01Q`\x03\x86\x01U`\x80\x84\x01Q`\x04\x86\x01U`\xA0\x84\x01Q`\x05\x86\x01\x80T\x90\x93\x16\x91\x16\x17\x90UP`\xC0\x81\x01Q\x90\x91\x90`\x06\x82\x01\x90a\x10:\x90\x82aT\x8CV[PP`@Q\x82\x91P\x7F\xB8Z>yOG^\xD5\xE4\x03}\xC5\xF2\xD5\xC3(\xC8\xD5N\x0C\x1AL\xA5Sc\x82\x90\x15\xE6\xC7\x0C\x89\x90`\0\x90\xA2PPa\x10ra+SV[PPPPPPPPV[`\0\x80a\x01\xF6`\0\x89`\x02\x81\x11\x15a\x10\x96Wa\x10\x96aL\xADV[`\x02\x81\x11\x15a\x10\xA7Wa\x10\xA7aL\xADV[\x81R` \x01\x90\x81R` \x01`\0 T\x90P\x80`\0\x14a\x10\xF7W\x80\x83\x86a\x10\xD0`\xC0\x8B\x01\x8BaSYV[a\x10\xDB\x92\x91PaT3V[a\x10\xE5\x91\x90aT3V[a\x10\xEF\x91\x90aUKV[\x91PPa\x10\xFDV[`\0\x91PP[\x96\x95PPPPPPV[a\x11\x0Fa*\xA2V[`\x02a\x11\x1A\x82a\x17\xD6V[`\x05\x81\x11\x15a\x11+Wa\x11+aL\xADV[\x14a\x11LW`@QcSi\x1DU`\xE1\x1B\x81R`\x04\x81\x01\x82\x90R`$\x01a\x0B\x03V[`\0a\x01\xF5\x82\x81T\x81\x10a\x11bWa\x11baS\x0FV[`\0\x91\x82R` \x90\x91 `\x07`\t\x90\x92\x02\x01\x90\x81\x01\x80T`\xFF\x19\x16`\x04\x17\x90U`\x05\x81\x01T`\x01\x82\x01T\x91\x92Pa\x11\xA4\x91`\x01`\x01`\xA0\x1B\x03\x90\x91\x16\x90a+yV[`@Q\x82\x90\x7FZ\xB6\xD2\x180;\xD8\xDC\x01\xC2\xC5\xE8\x12\xDC\xBB\xAD\xCF\xC2\xEB[\x1F\xB9\x11\x11\xE0\xB0\xAE\x87\x88\x8A\xC5h\x90`\0\x90\xA2Pa\x11\xD8a+SV[PV[`\0a\x11\xE5a*\xA2V[`\0a\x01\xF5\x83\x81T\x81\x10a\x11\xFBWa\x11\xFBaS\x0FV[`\0\x91\x82R` \x90\x91 `@\x80Qa\x01`\x81\x01\x90\x91R`\t\x90\x92\x02\x01\x80T`\x80\x83\x01\x90\x81R`\x01\x82\x01T`\xA0\x84\x01R`\x02\x82\x01T`\xC0\x84\x01R`\x03\x82\x01T`\xE0\x84\x01R`\x04\x82\x01Ta\x01\0\x84\x01R`\x05\x82\x01T`\x01`\x01`\xA0\x1B\x03\x16a\x01 \x84\x01R`\x06\x82\x01\x80T\x84\x92\x91\x84\x91a\x01@\x85\x01\x91\x90a\x12x\x90aS%V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\x12\xA4\x90aS%V[\x80\x15a\x12\xF1W\x80`\x1F\x10a\x12\xC6Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\x12\xF1V[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\x12\xD4W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPP\x91\x90\x92RPPP\x81R`\x07\x82\x01T` \x90\x91\x01\x90`\xFF\x16`\x05\x81\x11\x15a\x13\x1CWa\x13\x1CaL\xADV[`\x05\x81\x11\x15a\x13-Wa\x13-aL\xADV[\x81R`\x07\x82\x01T`\x01`\x01`\xA0\x1B\x03a\x01\0\x90\x91\x04\x81\x16` \x83\x01R`\x08\x90\x92\x01T\x90\x91\x16`@\x90\x91\x01R\x90P`\x03a\x13e\x84a\x17\xD6V[`\x05\x81\x11\x15a\x13vWa\x13vaL\xADV[\x14a\x13\x97W`@Qc\r\x94\x85\xF1`\xE0\x1B\x81R`\x04\x81\x01\x84\x90R`$\x01a\x0B\x03V[``\x81\x01Q`\x01`\x01`\xA0\x1B\x03\x163\x14a\x13\xC7W`@Qc\x10\xDA\x1D\xD3`\xE3\x1B\x81R`\x04\x81\x01\x84\x90R`$\x01a\x0B\x03V[a\x13\xF1\x83\x7F\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\0a+\xB1V[\x91PPa\x13\xFCa+SV[\x91\x90PV[`\0\x90\x81R`\0\x80Q` aZ\xCF\x839\x81Q\x91R` R`@\x90 `\x01\x01T\x90V[a\x14,\x82a\x14\x01V[a\x145\x81a-\x01V[a\x14?\x83\x83a-\x0BV[PPPPV[`\x01`\x01`\xA0\x1B\x03\x81\x163\x14a\x14nW`@Qc3K\xD9\x19`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x14x\x82\x82a-\xB0V[PPPV[`\0\x80Q` aZ\xAF\x839\x81Q\x91Ra\x14\x95\x81a-\x01V[a\x11\xD8a.,V[`\0a\x01\xF4\x86\x81T\x81\x10a\x14\xB3Wa\x14\xB3aS\x0FV[`\0\x91\x82R` \x91\x82\x90 `@\x80Q`\xE0\x81\x01\x82R`\x07\x90\x93\x02\x90\x91\x01\x80T`\x01`\x01`\xA0\x1B\x03\x90\x81\x16\x84R`\x01\x82\x01T\x94\x84\x01\x94\x90\x94R`\x02\x81\x01T\x91\x83\x01\x91\x90\x91R`\x03\x81\x01T``\x83\x01R`\x04\x81\x01T`\x80\x83\x01R`\x05\x81\x01T\x90\x92\x16`\xA0\x82\x01R`\x06\x82\x01\x80T\x91\x92\x91`\xC0\x84\x01\x91\x90a\x150\x90aS%V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\x15\\\x90aS%V[\x80\x15a\x15\xA9W\x80`\x1F\x10a\x15~Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\x15\xA9V[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\x15\x8CW\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81RPP\x90P\x80`\xC0\x01QQ`\0\x03a\x15\xDAW`@Qc\x9D\xB8\xD5\xB1`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\xA0\x81\x01Q`\x01`\x01`\xA0\x1B\x03\x163`\x01`\x01`\xA0\x1B\x03\x16\x14a\x16\x10W`@Qc8\x99:I`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x83\x15a\x17\x0CWa\x16#\x81` \x01Qa)\xD4V[a\x16@W`@Qcz\xFC\xEF\x7F`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0[\x84\x81\x10\x15a\x17\nW\x7F\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`\x01`\x01`\xA0\x1B\x03\x16c\xFF\x11J\xE1a\x16\x83\x89a*+V[\x88\x88\x85\x81\x81\x10a\x16\x95Wa\x16\x95aS\x0FV[\x90P` \x02\x81\x01\x90a\x16\xA7\x91\x90aSYV[`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x16\xC5\x93\x92\x91\x90aT\x19V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x16\xDFW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x16\xF3W=`\0\x80>=`\0\xFD[PPPP\x80\x80a\x17\x02\x90aS\xB5V[\x91PPa\x16CV[P[`\0[\x82\x81\x10\x15a\x0C\xA6W\x7F\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`\x01`\x01`\xA0\x1B\x03\x16c\xFF\x11J\xE1a\x17O\x89a*sV[\x86\x86\x85\x81\x81\x10a\x17aWa\x17aaS\x0FV[\x90P` \x02\x81\x01\x90a\x17s\x91\x90aSYV[`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x17\x91\x93\x92\x91\x90aT\x19V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x17\xABW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x17\xBFW=`\0\x80>=`\0\xFD[PPPP\x80\x80a\x17\xCE\x90aS\xB5V[\x91PPa\x17\x0FV[`\0\x80a\x01\xF5\x83\x81T\x81\x10a\x17\xEDWa\x17\xEDaS\x0FV[`\0\x91\x82R` \x90\x91 `@\x80Qa\x01`\x81\x01\x90\x91R`\t\x90\x92\x02\x01\x80T`\x80\x83\x01\x90\x81R`\x01\x82\x01T`\xA0\x84\x01R`\x02\x82\x01T`\xC0\x84\x01R`\x03\x82\x01T`\xE0\x84\x01R`\x04\x82\x01Ta\x01\0\x84\x01R`\x05\x82\x01T`\x01`\x01`\xA0\x1B\x03\x16a\x01 \x84\x01R`\x06\x82\x01\x80T\x84\x92\x91\x84\x91a\x01@\x85\x01\x91\x90a\x18j\x90aS%V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\x18\x96\x90aS%V[\x80\x15a\x18\xE3W\x80`\x1F\x10a\x18\xB8Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\x18\xE3V[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\x18\xC6W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPP\x91\x90\x92RPPP\x81R`\x07\x82\x01T` \x90\x91\x01\x90`\xFF\x16`\x05\x81\x11\x15a\x19\x0EWa\x19\x0EaL\xADV[`\x05\x81\x11\x15a\x19\x1FWa\x19\x1FaL\xADV[\x81R`\x07\x82\x01T`\x01`\x01`\xA0\x1B\x03a\x01\0\x90\x91\x04\x81\x16` \x83\x01R`\x08\x90\x92\x01T\x90\x91\x16`@\x90\x91\x01R\x90P`\x01\x81` \x01Q`\x05\x81\x11\x15a\x19dWa\x19daL\xADV[\x03a\x19\x89W\x80Q`@\x01QC\x10\x15a\x19\x80W` \x01Q\x92\x91PPV[P`\x02\x92\x91PPV[`\x03\x81` \x01Q`\x05\x81\x11\x15a\x19\xA1Wa\x19\xA1aL\xADV[\x03a\x19\xC5W\x80Q`\x80\x01QC\x11\x15a\x19\xBCWP`\x05\x92\x91PPV[P`\x03\x92\x91PPV[` \x01Q\x92\x91PPV[a\x19\xD7a.\x8CV[a\x19\xE0\x82a/3V[a\x19\xEA\x82\x82a/>V[PPV[a\x19\xF6a*\xA2V[\x7F\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`\x01`\x01`\xA0\x1B\x03\x16cr\x10Z\xAFa\x1A<`\0\x80Q` a[\x0F\x839\x81Q\x91Ra/\xFBV[3`@Q`\x01`\x01`\xE0\x1B\x03\x19`\xE0\x85\x90\x1B\x16\x81R`\x04\x81\x01\x92\x90\x92R`\x01`\x01`\xA0\x1B\x03\x16`$\x82\x01R`D\x01`\0`@Q\x80\x83\x03\x81\x86\x80;\x15\x80\x15a\x1A\x82W`\0\x80\xFD[PZ\xFA\x15\x80\x15a\x1A\x96W=`\0\x80>=`\0\xFD[PPPPa\x1A\xDB\x84\x84\x84\x84\x80\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x93\x92\x91\x90\x81\x81R` \x01\x83\x83\x80\x82\x847`\0\x92\x01\x91\x90\x91RPa0\x10\x92PPPV[a\x14?a+SV[`\0a\x1A\xEDa2\x96V[P`\0\x80Q` aZ\x8F\x839\x81Q\x91R\x90V[a\x1B\x08a*\xA2V[\x82Q\x81\x14a\x1B)W`@Qc\xC2\x1F\xE6\xBF`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0[\x83Q\x81\x10\x15a\x1B\x8DWa\x1B{\x84\x82\x81Q\x81\x10a\x1BJWa\x1BJaS\x0FV[` \x02` \x01\x01Q\x84\x84\x84\x81\x81\x10a\x1BdWa\x1BdaS\x0FV[\x90P` \x02\x81\x01\x90a\x1Bv\x91\x90aSYV[a2\xDFV[\x80a\x1B\x85\x81aS\xB5V[\x91PPa\x1B,V[Pa\x14xa+SV[`\0\x80Q` aZ\xAF\x839\x81Q\x91Ra\x1B\xAE\x81a-\x01V[0a\x1B\xBB\x85\x85\x85\x84a7\x8DV[\x7F\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`\x01`\x01`\xA0\x1B\x03\x16ci\xFD\xBC\xCA\x82`\0a\x1B\xF6\x89a8PV[\x89`@Q\x85c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x1C\x16\x94\x93\x92\x91\x90aUbV[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x1C0W`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x1CDW=`\0\x80>=`\0\xFD[PPPPPPPPPV[a\x01\xF5\x81\x81T\x81\x10a\x1C`W`\0\x80\xFD[`\0\x91\x82R` \x91\x82\x90 `@\x80Q`\xE0\x81\x01\x82R`\t\x90\x93\x02\x90\x91\x01\x80T\x83R`\x01\x81\x01T\x93\x83\x01\x93\x90\x93R`\x02\x83\x01T\x90\x82\x01R`\x03\x82\x01T``\x82\x01R`\x04\x82\x01T`\x80\x82\x01R`\x05\x82\x01T`\x01`\x01`\xA0\x1B\x03\x16`\xA0\x82\x01R`\x06\x82\x01\x80T\x92\x93P\x90\x91\x83\x91`\xC0\x84\x01\x91a\x1C\xD8\x90aS%V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\x1D\x04\x90aS%V[\x80\x15a\x1DQW\x80`\x1F\x10a\x1D&Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\x1DQV[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\x1D4W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPP\x91\x90\x92RPPP`\x07\x82\x01T`\x08\x90\x92\x01T\x90\x91`\xFF\x81\x16\x91`\x01`\x01`\xA0\x1B\x03a\x01\0\x90\x92\x04\x82\x16\x91\x16\x84V[`\0a\x1D\x8Ca*\xA2V[`\x05a\x1D\x97\x84a\x17\xD6V[`\x05\x81\x11\x15a\x1D\xA8Wa\x1D\xA8aL\xADV[\x14a\x1D\xC9W`@Qc\x16Y\xBE\xD5`\xE3\x1B\x81R`\x04\x81\x01\x84\x90R`$\x01a\x0B\x03V[a\x1D\xD3\x83\x83a+\xB1V[\x90Pa\x08\xF5a+SV[a\x1D\xE5a8wV[a\x1D\xEDa*\xA2V[a\x1D\xFC\x863\x87\x87\x87\x87\x87a8\xA8V[a\x1E\x04a+SV[PPPPPPV[`\0a\x01\xF4\x82\x81T\x81\x10a\x1E\"Wa\x1E\"aS\x0FV[`\0\x91\x82R` \x91\x82\x90 `@\x80Q`\xE0\x81\x01\x82R`\x07\x90\x93\x02\x90\x91\x01\x80T`\x01`\x01`\xA0\x1B\x03\x90\x81\x16\x84R`\x01\x82\x01T\x94\x84\x01\x94\x90\x94R`\x02\x81\x01T\x91\x83\x01\x91\x90\x91R`\x03\x81\x01T``\x83\x01R`\x04\x81\x01T`\x80\x83\x01R`\x05\x81\x01T\x90\x92\x16`\xA0\x82\x01R`\x06\x82\x01\x80T\x91\x92\x91`\xC0\x84\x01\x91\x90a\x1E\x9F\x90aS%V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\x1E\xCB\x90aS%V[\x80\x15a\x1F\x18W\x80`\x1F\x10a\x1E\xEDWa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\x1F\x18V[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\x1E\xFBW\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81RPP\x90P\x80`\xC0\x01QQ`\0\x03a\x1FIW`@Qc\x9D\xB8\xD5\xB1`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\xA0\x81\x01Q`\x01`\x01`\xA0\x1B\x03\x163`\x01`\x01`\xA0\x1B\x03\x16\x14a\x1F\x7FW`@Qc8\x99:I`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x01\xF4\x82\x81T\x81\x10a\x1F\x93Wa\x1F\x93aS\x0FV[`\0\x91\x82R` \x90\x91 `\x05`\x07\x90\x92\x02\x01\x01\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16\x90UPPV[`\x01`\x01`\xA0\x1B\x03\x81\x16`\0\x90\x81Ra\x01\xF7` R`@\x90 T\x80\x15a\x19\xEAWa \x0C`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x83\x83a>bV[P`\x01`\x01`\xA0\x1B\x03\x16`\0\x90\x81Ra\x01\xF7` R`@\x81 UV[`\0\x80Q` aZ\xAF\x839\x81Q\x91Ra @\x81a-\x01V[a\x11\xD8a>\x93V[`\0\x80Q` aZ\xAF\x839\x81Q\x91Ra `\x81a-\x01V[\x81a\x01\xF6`\0\x85`\x02\x81\x11\x15a xWa xaL\xADV[`\x02\x81\x11\x15a \x89Wa \x89aL\xADV[\x81R` \x81\x01\x91\x90\x91R`@\x01`\0 U\x82`\x02\x81\x11\x15a \xACWa \xACaL\xADV[`@Q\x83\x81R\x7F\xC0\xCAkm\xF9\xB5\xA3U\x0E\xD6\xFD\xEF6\xBA\xE8\xA5A`\xC2\xCC\xDA=\xE6\xAA\xC3\xDF\x98Lf\xD3(p\x90` \x01`@Q\x80\x91\x03\x90\xA2PPPV[`\0\x91\x82R`\0\x80Q` aZ\xCF\x839\x81Q\x91R` \x90\x81R`@\x80\x84 `\x01`\x01`\xA0\x1B\x03\x93\x90\x93\x16\x84R\x91\x90R\x90 T`\xFF\x16\x90V[a!$a*\xA2V[a!/\x83\x83\x83a2\xDFV[a\x14xa+SV[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x80T`\x01`@\x1B\x81\x04`\xFF\x16\x15\x90`\x01`\x01`@\x1B\x03\x16`\0\x81\x15\x80\x15a!|WP\x82[\x90P`\0\x82`\x01`\x01`@\x1B\x03\x16`\x01\x14\x80\x15a!\x98WP0;\x15[\x90P\x81\x15\x80\x15a!\xA6WP\x80\x15[\x15a!\xC4W`@Qc\xF9.\xE8\xA9`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x84Tg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x19\x16`\x01\x17\x85U\x83\x15a!\xEEW\x84T`\xFF`@\x1B\x19\x16`\x01`@\x1B\x17\x85U[a!\xF6a>\xDCV[a!\xFEa>\xDCV[a\"\x06a>\xDCV[a\"\x0Ea>\xDCV[a\"\x16a>\xE4V[a\"\x1Ea>\xE4V[a\")`\0\x87a-\x0BV[Pa\"C`\0\x80Q` aZ\xAF\x839\x81Q\x91R`\0a>\xECV[\x83\x15a\x1E\x04W\x84T`\xFF`@\x1B\x19\x16\x85U`@Q`\x01\x81R\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x90` \x01`@Q\x80\x91\x03\x90\xA1PPPPPPV[`\0\x80Q` aZ\xAF\x839\x81Q\x91Ra\"\xA8\x81a-\x01V[\x7F\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`\x01`\x01`\xA0\x1B\x03\x16c\xFF\x11J\xE1a\"\xEE`\0\x80Q` a[\x0F\x839\x81Q\x91Ra/\xFBV[\x85\x85`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a#\x0E\x93\x92\x91\x90aT\x19V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a#(W`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x0C\xA6W=`\0\x80>=`\0\xFD[a#E\x82a\x14\x01V[a#N\x81a-\x01V[a\x14?\x83\x83a-\xB0V[a#`a*\xA2V[\x84Q\x86Q\x14\x15\x80a#rWP\x84Q\x83\x14\x15[\x15a#\x90W`@Qc\xC2\x1F\xE6\xBF`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0\x86\x86\x86\x86`@Q` \x01a#\xA9\x94\x93\x92\x91\x90aV7V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 \x90P`\0a#\xCC\x82a?OV[\x90P`\0a$\x10\x82\x86\x86\x80\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x93\x92\x91\x90\x81\x81R` \x01\x83\x83\x80\x82\x847`\0\x92\x01\x91\x90\x91RPa?\x8A\x92PPPV[\x90P\x7F\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`\x01`\x01`\xA0\x1B\x03\x16cr\x10Z\xAFa$X`\0\x80Q` a[\x0F\x839\x81Q\x91Ra/\xFBV[`@Q`\x01`\x01`\xE0\x1B\x03\x19`\xE0\x84\x90\x1B\x16\x81R`\x04\x81\x01\x91\x90\x91R`\x01`\x01`\xA0\x1B\x03\x84\x16`$\x82\x01R`D\x01`\0`@Q\x80\x83\x03\x81\x86\x80;\x15\x80\x15a$\x9EW`\0\x80\xFD[PZ\xFA\x15\x80\x15a$\xB2W=`\0\x80>=`\0\xFD[PPPP`\0[\x89Q\x81\x10\x15a%iWa%W\x8A\x82\x81Q\x81\x10a$\xD7Wa$\xD7aS\x0FV[` \x02` \x01\x01Q\x8A\x83\x81Q\x81\x10a$\xF1Wa$\xF1aS\x0FV[` \x02` \x01\x01Q\x8A\x8A\x85\x81\x81\x10a%\x0BWa%\x0BaS\x0FV[\x90P` \x02\x81\x01\x90a%\x1D\x91\x90aSYV[\x80\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x93\x92\x91\x90\x81\x81R` \x01\x83\x83\x80\x82\x847`\0\x92\x01\x91\x90\x91RPa0\x10\x92PPPV[\x80a%a\x81aS\xB5V[\x91PPa$\xB9V[PPPPa\x1E\x04a+SV[a%}a*\xA2V[`\0a\x01\xF5\x84\x81T\x81\x10a%\x93Wa%\x93aS\x0FV[`\0\x91\x82R` \x90\x91 `@\x80Qa\x01`\x81\x01\x90\x91R`\t\x90\x92\x02\x01\x80T`\x80\x83\x01\x90\x81R`\x01\x82\x01T`\xA0\x84\x01R`\x02\x82\x01T`\xC0\x84\x01R`\x03\x82\x01T`\xE0\x84\x01R`\x04\x82\x01Ta\x01\0\x84\x01R`\x05\x82\x01T`\x01`\x01`\xA0\x1B\x03\x16a\x01 \x84\x01R`\x06\x82\x01\x80T\x84\x92\x91\x84\x91a\x01@\x85\x01\x91\x90a&\x10\x90aS%V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta&<\x90aS%V[\x80\x15a&\x89W\x80`\x1F\x10a&^Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a&\x89V[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a&lW\x82\x90\x03`\x1F\x16\x82\x01\x91[PPP\x91\x90\x92RPPP\x81R`\x07\x82\x01T` \x90\x91\x01\x90`\xFF\x16`\x05\x81\x11\x15a&\xB4Wa&\xB4aL\xADV[`\x05\x81\x11\x15a&\xC5Wa&\xC5aL\xADV[\x81R`\x07\x82\x01T`\x01`\x01`\xA0\x1B\x03a\x01\0\x90\x91\x04\x81\x16` \x83\x01R`\x08\x90\x92\x01T\x90\x91\x16`@\x90\x91\x01R\x80QQa\x01\xF4\x80T\x92\x93P\x90\x91`\0\x91\x90\x83\x90\x81\x10a'\x11Wa'\x11aS\x0FV[`\0\x91\x82R` \x91\x82\x90 `@\x80Q`\xE0\x81\x01\x82R`\x07\x90\x93\x02\x90\x91\x01\x80T`\x01`\x01`\xA0\x1B\x03\x90\x81\x16\x84R`\x01\x82\x01T\x94\x84\x01\x94\x90\x94R`\x02\x81\x01T\x91\x83\x01\x91\x90\x91R`\x03\x81\x01T``\x83\x01R`\x04\x81\x01T`\x80\x83\x01R`\x05\x81\x01T\x90\x92\x16`\xA0\x82\x01R`\x06\x82\x01\x80T\x91\x92\x91`\xC0\x84\x01\x91\x90a'\x8E\x90aS%V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta'\xBA\x90aS%V[\x80\x15a(\x07W\x80`\x1F\x10a'\xDCWa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a(\x07V[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a'\xEAW\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81RPP\x90P`\0\x80a(\x1F\x88\x86a?\xB4V[\x91P\x91Pa(w\x88\x86`\0\x01Q`\xC0\x01Q\x89\x89\x80\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x93\x92\x91\x90\x81\x81R` \x01\x83\x83\x80\x82\x847`\0\x92\x01\x91\x90\x91RPa(r\x92P\x8A\x91Pa*s\x90PV[a@\xCDV[a(\x97W`@Qc@i\xAF=`\xE1\x1B\x81R`\x04\x81\x01\x89\x90R`$\x01a\x0B\x03V[a(\xA9\x88\x86\x84\x84\x88\x88`@\x01QaA\xD6V[PPPPPa\x14xa+SV[a\x01\xF4\x81\x81T\x81\x10a(\xC7W`\0\x80\xFD[`\0\x91\x82R` \x90\x91 `\x07\x90\x91\x02\x01\x80T`\x01\x82\x01T`\x02\x83\x01T`\x03\x84\x01T`\x04\x85\x01T`\x05\x86\x01T`\x06\x87\x01\x80T`\x01`\x01`\xA0\x1B\x03\x97\x88\x16\x99P\x95\x97\x94\x96\x93\x95\x92\x94\x93\x90\x91\x16\x92\x91a)\x1C\x90aS%V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta)H\x90aS%V[\x80\x15a)\x95W\x80`\x1F\x10a)jWa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a)\x95V[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a)xW\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x90P\x87V[`\0`\x01`\x01`\xE0\x1B\x03\x19\x82\x16cye\xDB\x0B`\xE0\x1B\x14\x80a\x08\xF5WPc\x01\xFF\xC9\xA7`\xE0\x1B`\x01`\x01`\xE0\x1B\x03\x19\x83\x16\x14a\x08\xF5V[`\0\x81\x15\x80a*\x02WP\x7F\xCD.f\xBF\x0B\x91\xEE\xED\xC6\xC6H\xAE\x935\xA7\x8D|\x9AJ\xB0\xEF3a*\x82M\x91\xCD\xC6\x8AO!\x82\x14[\x15\x92\x91PPV[`\0\x80\x80\x80a*\x1A\x85\x87\x01\x87aV\xC3V[\x92P\x92P\x92Pa\x10\xFD\x83\x83\x83aCiV[`@\x80Q` \x81\x01\x82\x90R`\x03``\x82\x01Rb3\xB2\xB7`\xE9\x1B`\x80\x82\x01R\x90\x81\x01\x82\x90R`\0\x90`\xA0\x01[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 \x90P\x91\x90PV[`@\x80Q` \x81\x01\x82\x90R`\x03``\x82\x01Rbivs`\xE8\x1B`\x80\x82\x01R\x90\x81\x01\x82\x90R`\0\x90`\xA0\x01a*VV[\x7F\x9Bw\x9B\x17B-\r\xF9\"#\x01\x8B2\xB4\xD1\xFAF\xE0qr=h\x17\xE2Hm\0;\xEC\xC5_\0\x80T`\x01\x19\x01a*\xE6W`@Qc>\xE5\xAE\xB5`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x02\x90UV[`@Q`\x01`\x01`\xA0\x1B\x03\x84\x81\x16`$\x83\x01R\x83\x81\x16`D\x83\x01R`d\x82\x01\x83\x90Ra\x14?\x91\x86\x91\x82\x16\x90c#\xB8r\xDD\x90`\x84\x01[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x91P`\xE0\x1B` \x82\x01\x80Q`\x01`\x01`\xE0\x1B\x03\x83\x81\x83\x16\x17\x83RPPPPaC\xA4V[`\x01\x7F\x9Bw\x9B\x17B-\r\xF9\"#\x01\x8B2\xB4\xD1\xFAF\xE0qr=h\x17\xE2Hm\0;\xEC\xC5_\0UV[\x80\x15a\x19\xEAW`\x01`\x01`\xA0\x1B\x03\x82\x16`\0\x90\x81Ra\x01\xF7` R`@\x81 \x80T\x83\x92\x90a+\xA8\x90\x84\x90aT3V[\x90\x91UPPPPV[`\0\x80a\x01\xF5\x84\x81T\x81\x10a+\xC8Wa+\xC8aS\x0FV[`\0\x91\x82R` \x90\x91 `\x07`\t\x90\x92\x02\x01\x90\x81\x01\x80T`\xFF\x19\x16`\x04\x17\x90U\x80T`\x05\x82\x01T`\x01\x83\x01T\x92\x93P\x90\x91a,\x0C\x91`\x01`\x01`\xA0\x1B\x03\x16\x90a+yV[`@Q\x85\x90\x7F\xD6\xD7\xF87\xB6\x8A\xE9j\xF4v\xF0D{\xBEK\xE0`\xB2\x06B\xEB\xDFG\x08T\xF7\x01\xCA]\x8F^\xFB\x90`\0\x90\xA2`\x08\x82\x01T`\x01`\x01`\xA0\x1B\x03\x7F\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\x81\x16\x91c\xEA\xAC\xAE\x94\x91\x16\x83a,y\x81aD\x07V[`@Q`\x01`\x01`\xE0\x1B\x03\x19`\xE0\x86\x90\x1B\x16\x81R`\x01`\x01`\xA0\x1B\x03\x93\x84\x16`\x04\x82\x01R`$\x81\x01\x92\x90\x92R`D\x82\x01R\x90\x87\x16`d\x82\x01R`\x84\x01` `@Q\x80\x83\x03\x81`\0\x87Z\xF1\x15\x80\x15a,\xD4W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a,\xF8\x91\x90aWJV[\x95\x94PPPPPV[a\x11\xD8\x813aD6V[`\0`\0\x80Q` aZ\xCF\x839\x81Q\x91Ra-&\x84\x84a \xE4V[a-\xA6W`\0\x84\x81R` \x82\x81R`@\x80\x83 `\x01`\x01`\xA0\x1B\x03\x87\x16\x84R\x90\x91R\x90 \x80T`\xFF\x19\x16`\x01\x17\x90Ua-\\3\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x83`\x01`\x01`\xA0\x1B\x03\x16\x85\x7F/\x87\x88\x11~~\xFF\x1D\x82\xE9&\xECyI\x01\xD1|x\x02JP'\t@0E@\xA73eo\r`@Q`@Q\x80\x91\x03\x90\xA4`\x01\x91PPa\x08\xF5V[`\0\x91PPa\x08\xF5V[`\0`\0\x80Q` aZ\xCF\x839\x81Q\x91Ra-\xCB\x84\x84a \xE4V[\x15a-\xA6W`\0\x84\x81R` \x82\x81R`@\x80\x83 `\x01`\x01`\xA0\x1B\x03\x87\x16\x80\x85R\x92R\x80\x83 \x80T`\xFF\x19\x16\x90UQ3\x92\x87\x91\x7F\xF69\x1F\\2\xD9\xC6\x9D*G\xEAg\x0BD)t\xB595\xD1\xED\xC7\xFDd\xEB!\xE0G\xA89\x17\x1B\x91\x90\xA4`\x01\x91PPa\x08\xF5V[a.4aDoV[`\0\x80Q` aZ\xEF\x839\x81Q\x91R\x80T`\xFF\x19\x16\x81U\x7F]\xB9\xEE\nI[\xF2\xE6\xFF\x9C\x91\xA7\x83L\x1B\xA4\xFD\xD2D\xA5\xE8\xAANS{\xD3\x8A\xEA\xE4\xB0s\xAA3[`@Q`\x01`\x01`\xA0\x1B\x03\x90\x91\x16\x81R` \x01`@Q\x80\x91\x03\x90\xA1PV[0`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x14\x80a/\x13WP\x7F\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`\x01`\x01`\xA0\x1B\x03\x16a/\x07`\0\x80Q` aZ\x8F\x839\x81Q\x91RT`\x01`\x01`\xA0\x1B\x03\x16\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x14\x15[\x15a/1W`@Qcp>F\xDD`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[`\0a\x19\xEA\x81a-\x01V[\x81`\x01`\x01`\xA0\x1B\x03\x16cR\xD1\x90-`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x92PPP\x80\x15a/\x98WP`@\x80Q`\x1F=\x90\x81\x01`\x1F\x19\x16\x82\x01\x90\x92Ra/\x95\x91\x81\x01\x90aWJV[`\x01[a/\xC0W`@QcL\x9C\x8C\xE3`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x83\x16`\x04\x82\x01R`$\x01a\x0B\x03V[`\0\x80Q` aZ\x8F\x839\x81Q\x91R\x81\x14a/\xF1W`@Qc*\x87Ri`\xE2\x1B\x81R`\x04\x81\x01\x82\x90R`$\x01a\x0B\x03V[a\x14x\x83\x83aD\x9FV[`\0\x81`@Q` \x01a*V\x91\x81R` \x01\x90V[`\x01a0\x1B\x84a\x17\xD6V[`\x05\x81\x11\x15a0,Wa0,aL\xADV[\x14a0JW`@Qc>[N\x85`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0a\x01\xF5\x84\x81T\x81\x10a0`Wa0`aS\x0FV[`\0\x91\x82R` \x82 `\t\x90\x91\x02\x01\x80T`@Qc\x1C~\xAEe`\xE0\x1B\x81R\x91\x93P\x82\x91`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x91c\x1C~\xAEe\x91a0\xD6\x91\x89\x91`\x04\x01`\x01`\x01`\xA0\x1B\x03\x92\x90\x92\x16\x82R` \x82\x01R`@\x01\x90V[`@\x80Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a0\xF2W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a1\x16\x91\x90aWcV[\x91P\x91P\x81\x83`\0\x01`\x01\x01T\x10\x15a1EW`@Qcb]\xAA\x9D`\xE1\x1B\x81R`\x04\x81\x01\x87\x90R`$\x01a\x0B\x03V[`\x03\x83\x01T\x81\x11\x15a1mW`@Qc\xF8O\xAAI`\xE0\x1B\x81R`\x04\x81\x01\x87\x90R`$\x01a\x0B\x03V[`\x07\x83\x01\x80T`\xFF\x19\x16`\x03\x90\x81\x17\x90\x91U\x83\x01Ta1\x8C\x90CaT3V[`\x04\x84\x01U`\x08\x83\x01\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16`\x01`\x01`\xA0\x1B\x03\x87\x16\x17\x90U\x82T`\0\x90a1\xBC\x90aD\x07V[\x84T`@Qc\xC4\x92\xEE9`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x89\x81\x16`\x04\x83\x01R`$\x82\x01\x92\x90\x92R`D\x81\x01\x83\x90R\x91\x92P\x7F\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\x16\x90c\xC4\x92\xEE9\x90`d\x01`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a23W`\0\x80\xFD[PZ\xF1\x15\x80\x15a2GW=`\0\x80>=`\0\xFD[PPPP\x85`\x01`\x01`\xA0\x1B\x03\x16\x87\x7Fz|\xD4\x1C\xAD_<\xCC\xFD\xCEH\xDFr\x08E\xB6\xFE\x81g\x85;'\xBA\x03\x1D\x99\x98\xE2\x05\xEB\x1D\xD9\x87`@Qa2\x85\x91\x90aQPV[`@Q\x80\x91\x03\x90\xA3PPPPPPPV[0`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x14a/1W`@Qcp>F\xDD`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0a\x01\xF5\x84\x81T\x81\x10a2\xF5Wa2\xF5aS\x0FV[`\0\x91\x82R` \x90\x91 `@\x80Qa\x01`\x81\x01\x90\x91R`\t\x90\x92\x02\x01\x80T`\x80\x83\x01\x90\x81R`\x01\x82\x01T`\xA0\x84\x01R`\x02\x82\x01T`\xC0\x84\x01R`\x03\x82\x01T`\xE0\x84\x01R`\x04\x82\x01Ta\x01\0\x84\x01R`\x05\x82\x01T`\x01`\x01`\xA0\x1B\x03\x16a\x01 \x84\x01R`\x06\x82\x01\x80T\x84\x92\x91\x84\x91a\x01@\x85\x01\x91\x90a3r\x90aS%V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta3\x9E\x90aS%V[\x80\x15a3\xEBW\x80`\x1F\x10a3\xC0Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a3\xEBV[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a3\xCEW\x82\x90\x03`\x1F\x16\x82\x01\x91[PPP\x91\x90\x92RPPP\x81R`\x07\x82\x01T` \x90\x91\x01\x90`\xFF\x16`\x05\x81\x11\x15a4\x16Wa4\x16aL\xADV[`\x05\x81\x11\x15a4'Wa4'aL\xADV[\x81R`\x07\x82\x01Ta\x01\0\x90\x04`\x01`\x01`\xA0\x1B\x03\x90\x81\x16` \x83\x01R`\x08\x90\x92\x01T\x82\x16`@\x91\x82\x01R\x82QQ``\x84\x01Q\x91Qc+a\x0C-`\xE0\x1B\x81R\x91\x83\x16`\x04\x83\x01R`$\x82\x01\x81\x90R\x92\x93P`\0\x91\x82\x91\x7F\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\x90\x91\x16\x90c+a\x0C-\x90`D\x01`@\x80Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a4\xC6W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a4\xEA\x91\x90aW\x87V[\x90\x92P\x90P`\x01`\x01`\xA0\x1B\x03\x82\x16a5\x16W`@Qc\x1E\x1D\n\xB5`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x03a5!\x88a\x17\xD6V[`\x05\x81\x11\x15a52Wa52aL\xADV[\x14a5SW`@Qc\x16\xF2\xD8?`\xE0\x1B\x81R`\x04\x81\x01\x88\x90R`$\x01a\x0B\x03V[\x83Q`\xC0\x01Q`@Q`\0\x91a5o\x91\x89\x90\x89\x90` \x01aW\xB5V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x90Pa\x01\xF4\x84\x81T\x81\x10a5\x94Wa5\x94aS\x0FV[`\0\x91\x82R` \x90\x91 `\x07\x90\x91\x02\x01T`@QcG;\x05\x7F`\xE1\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x90\x91\x16\x90c\x8Ev\n\xFE\x90a5\xD2\x90\x84\x90`\x04\x01aQPV[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a5\xEFW=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a6\x13\x91\x90aS\xCEV[a63W`@Qc^?\xA0Q`\xE0\x1B\x81R`\x04\x81\x01\x89\x90R`$\x01a\x0B\x03V[`\x04a\x01\xF5\x89\x81T\x81\x10a6IWa6IaS\x0FV[`\0\x91\x82R` \x90\x91 `\x07`\t\x90\x92\x02\x01\x01\x80T`\xFF\x19\x16`\x01\x83`\x05\x81\x11\x15a6vWa6vaL\xADV[\x02\x17\x90UP\x84Q` \x01Q`\0\x90a6\x8F\x90\x84\x90aW\xDBV[\x90Pa6\x9B\x84\x84a+yV[\x85Q`\xA0\x01Qa6\xAB\x90\x82a+yV[`\0a6\xB6\x86aD\x07V[``\x88\x01Q`@Qc\x98*A]`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x91\x82\x16`\x04\x82\x01R`$\x81\x01\x89\x90R`D\x81\x01\x83\x90R\x91\x92P\x7F\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\x16\x90c\x98*A]\x90`d\x01`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a7/W`\0\x80\xFD[PZ\xF1\x15\x80\x15a7CW=`\0\x80>=`\0\xFD[PPPP\x89\x7F\x8F\xDDxa\x98\x04'\x96\x0FCy\x10\xD2\x0Bx\xBE7P6\xB3\x1F\x97\xEF\"\xA8\x04\x0F \xE4]+\xA2\x8A\x8A`@Qa7y\x92\x91\x90aW\xEEV[`@Q\x80\x91\x03\x90\xA2PPPPPPPPPPV[`\0\x84\x82`@Q` \x01a7\xA2\x92\x91\x90aX\nV[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 \x90P`\0a7\xC5\x82a?OV[\x90P`\0a8\t\x82\x87\x87\x80\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x93\x92\x91\x90\x81\x81R` \x01\x83\x83\x80\x82\x847`\0\x92\x01\x91\x90\x91RPa?\x8A\x92PPPV[\x90Pa8\x14\x87aD\xF5V[`\x01`\x01`\xA0\x1B\x03\x16\x81`\x01`\x01`\xA0\x1B\x03\x16\x14a\x0C\xA6W`@Qc(\x80\xCB\x7F`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x82\x16`\x04\x82\x01R`$\x01a\x0B\x03V[```\0\x82\x80` \x01\x90Q\x81\x01\x90a8h\x91\x90aXyV[P\x94\x99\x98PPPPPPPPPV[`\0\x80Q` aZ\xEF\x839\x81Q\x91RT`\xFF\x16\x15a/1W`@Qc\xD9<\x06e`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[` \x87\x015\x15\x80a8\xC5WPa8\xC1`\xC0\x88\x01\x88aSYV[\x15\x90P[\x15a8\xE3W`@Qc\x1E\x1D\n\xB5`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[C\x87`@\x015\x11a9\x07W`@Qct\x19HM`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x82\x81\x11\x15a9)W`@Qc\x06q\n\xFD`\xE3\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0a\x01\xF4\x88`\0\x015\x81T\x81\x10a9CWa9CaS\x0FV[`\0\x91\x82R` \x91\x82\x90 `@\x80Q`\xE0\x81\x01\x82R`\x07\x90\x93\x02\x90\x91\x01\x80T`\x01`\x01`\xA0\x1B\x03\x90\x81\x16\x84R`\x01\x82\x01T\x94\x84\x01\x94\x90\x94R`\x02\x81\x01T\x91\x83\x01\x91\x90\x91R`\x03\x81\x01T``\x83\x01R`\x04\x81\x01T`\x80\x83\x01R`\x05\x81\x01T\x90\x92\x16`\xA0\x82\x01R`\x06\x82\x01\x80T\x91\x92\x91`\xC0\x84\x01\x91\x90a9\xC0\x90aS%V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta9\xEC\x90aS%V[\x80\x15a:9W\x80`\x1F\x10a:\x0EWa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a:9V[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a:\x1CW\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81RPP\x90P\x80``\x01QC\x10\x15a:iW`@Qc/Ki\xD3`\xE2\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0a:y\x87\x8A\x88\x88\x88\x88a\x10|V[\x90Pa:\xC0\x880a:\x8E\x84` \x8E\x015aT3V[`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x92\x91\x90a*\xECV[a:\xEA\x7F\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\x82a+yV[\x81`\xC0\x01QQ`\0\x03a;\x10W`@Qc\x9D\xB8\xD5\xB1`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x01\xF5T`@\x80Q`\x80\x81\x01\x90\x91R`\0\x90\x80a;,\x8DaYgV[\x81R` \x01`\x01\x81R3` \x80\x83\x01\x91\x90\x91R`\0`@\x92\x83\x01\x81\x90Ra\x01\xF5\x80T`\x01\x81\x01\x82U\x91R\x83Q\x80Q\x7FsL\xCD\xFE\xCF\x0C\x98\xF1\xF6\x10\xE1>\x82\x1E\xEA\xAB\x95\xDC\x92\x18K\xA0\x90\x03*\xB8\xCFTJ(\xF1g`\t\x90\x93\x02\x92\x83\x01\x90\x81U\x92\x81\x01Q\x7FsL\xCD\xFE\xCF\x0C\x98\xF1\xF6\x10\xE1>\x82\x1E\xEA\xAB\x95\xDC\x92\x18K\xA0\x90\x03*\xB8\xCFTJ(\xF1h\x83\x01U\x92\x83\x01Q\x7FsL\xCD\xFE\xCF\x0C\x98\xF1\xF6\x10\xE1>\x82\x1E\xEA\xAB\x95\xDC\x92\x18K\xA0\x90\x03*\xB8\xCFTJ(\xF1i\x82\x01U``\x83\x01Q\x7FsL\xCD\xFE\xCF\x0C\x98\xF1\xF6\x10\xE1>\x82\x1E\xEA\xAB\x95\xDC\x92\x18K\xA0\x90\x03*\xB8\xCFTJ(\xF1j\x82\x01U`\x80\x83\x01Q\x7FsL\xCD\xFE\xCF\x0C\x98\xF1\xF6\x10\xE1>\x82\x1E\xEA\xAB\x95\xDC\x92\x18K\xA0\x90\x03*\xB8\xCFTJ(\xF1k\x82\x01U`\xA0\x83\x01Q\x7FsL\xCD\xFE\xCF\x0C\x98\xF1\xF6\x10\xE1>\x82\x1E\xEA\xAB\x95\xDC\x92\x18K\xA0\x90\x03*\xB8\xCFTJ(\xF1l\x82\x01\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16`\x01`\x01`\xA0\x1B\x03\x90\x92\x16\x91\x90\x91\x17\x90U`\xC0\x83\x01Q\x93\x94P\x84\x93\x91\x92\x91\x83\x91\x7FsL\xCD\xFE\xCF\x0C\x98\xF1\xF6\x10\xE1>\x82\x1E\xEA\xAB\x95\xDC\x92\x18K\xA0\x90\x03*\xB8\xCFTJ(\xF1m\x01\x90a<\xA9\x90\x82aT\x8CV[PPP` \x82\x01Q`\x07\x82\x01\x80T`\xFF\x19\x16`\x01\x83`\x05\x81\x11\x15a<\xCFWa<\xCFaL\xADV[\x02\x17\x90UP`@\x82\x01Q`\x07\x82\x01\x80Ta\x01\0`\x01`\xA8\x1B\x03\x19\x16a\x01\0`\x01`\x01`\xA0\x1B\x03\x93\x84\x16\x02\x17\x90U``\x90\x92\x01Q`\x08\x90\x91\x01\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16\x91\x83\x16\x91\x90\x91\x17\x90U\x84Q\x90\x81\x16c\xA6\xDF\xBC\x7Fa=3`\xC0\x8F\x01\x8FaSYV[`@Q\x83c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a=P\x92\x91\x90aW\xEEV[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a=mW=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a=\x91\x91\x90aS\xCEV[a=\xAEW`@Qcy\xA6}[`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a=\xBB\x85` \x01Qa)\xD4V[\x15a>\x07W`\x01\x15\x15\x83\x7F{\xBF\xCEe5\x8CD\xB5\x98\xA1\xEE\x0E\xEF\x06<\xE1M\xE0%\x168W\x94\xF6\xB6\x0E\xEAU#\xA96\xE4\x8B\x8B\x8B\x8B`@Qa=\xFA\x94\x93\x92\x91\x90aY\xEFV[`@Q\x80\x91\x03\x90\xA3a>TV[`@\x80Q\x81\x81R`\0\x91\x81\x01\x82\x90R``` \x82\x01\x81\x90R\x81\x01\x82\x90R\x84\x90\x7F{\xBF\xCEe5\x8CD\xB5\x98\xA1\xEE\x0E\xEF\x06<\xE1M\xE0%\x168W\x94\xF6\xB6\x0E\xEAU#\xA96\xE4\x90`\x80\x01`@Q\x80\x91\x03\x90\xA3[PPPPPPPPPPPPV[`@Q`\x01`\x01`\xA0\x1B\x03\x83\x81\x16`$\x83\x01R`D\x82\x01\x83\x90Ra\x14x\x91\x85\x91\x82\x16\x90c\xA9\x05\x9C\xBB\x90`d\x01a+!V[a>\x9Ba8wV[`\0\x80Q` aZ\xEF\x839\x81Q\x91R\x80T`\xFF\x19\x16`\x01\x17\x81U\x7Fb\xE7\x8C\xEA\x01\xBE\xE3 \xCDNB\x02p\xB5\xEAt\0\r\x11\xB0\xC9\xF7GT\xEB\xDB\xFCTK\x05\xA2X3a.nV[a/1aE\x1EV[a+SaE\x1EV[`\0\x80Q` aZ\xCF\x839\x81Q\x91R`\0a?\x06\x84a\x14\x01V[`\0\x85\x81R` \x84\x90R`@\x80\x82 `\x01\x01\x86\x90UQ\x91\x92P\x84\x91\x83\x91\x87\x91\x7F\xBDy\xB8o\xFE\n\xB8\xE8waQQB\x17\xCD|\xAC\xD5,\x90\x9FfG\\:\xF4N\x12\x9F\x0B\0\xFF\x91\x90\xA4PPPPV[`@Q\x7F\x19Ethereum Signed Message:\n32\0\0\0\0` \x82\x01R`<\x81\x01\x82\x90R`\0\x90`\\\x01a*VV[`\0\x80`\0\x80a?\x9A\x86\x86aEgV[\x92P\x92P\x92Pa?\xAA\x82\x82aE\xB4V[P\x90\x94\x93PPPPV[``\x81\x01Q\x81QQ`@Qc+a\x0C-`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x92\x83\x16`\x04\x82\x01R`$\x81\x01\x91\x90\x91R`\0\x91\x82\x91\x82\x91\x82\x91\x7F\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\x90\x91\x16\x90c+a\x0C-\x90`D\x01`@\x80Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a@4W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a@X\x91\x90aW\x87V[\x90\x92P\x90P`\x01`\x01`\xA0\x1B\x03\x82\x16a@\x84W`@Qc\x1E\x1D\n\xB5`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x03a@\x8F\x87a\x17\xD6V[`\x05\x81\x11\x15a@\xA0Wa@\xA0aL\xADV[\x14a@\xC1W`@Qc\x16\xF2\xD8?`\xE0\x1B\x81R`\x04\x81\x01\x87\x90R`$\x01a\x0B\x03V[\x92P\x90P[\x92P\x92\x90PV[`\0\x80\x85\x85`@Q` \x01a@\xE3\x92\x91\x90aZ\x16V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 \x90P`\0aA\x06\x82a?OV[\x90P`\0aA\x14\x82\x87a?\x8AV[\x90P`\x01`\x01`\xA0\x1B\x03\x81\x16aAHW`@Qc(\x80\xCB\x7F`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x82\x16`\x04\x82\x01R`$\x01a\x0B\x03V[`@Qcr\x10Z\xAF`\xE0\x1B\x81R`\x04\x81\x01\x86\x90R`\x01`\x01`\xA0\x1B\x03\x82\x81\x16`$\x83\x01R\x7F\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\x16\x90cr\x10Z\xAF\x90`D\x01`\0`@Q\x80\x83\x03\x81\x86\x80;\x15\x80\x15aA\xB0W`\0\x80\xFD[PZ\xFA\x15\x80\x15aA\xC4W=`\0\x80>=`\0\xFD[P`\x01\x9B\x9APPPPPPPPPPPV[`\x03aA\xE1\x87a\x17\xD6V[`\x05\x81\x11\x15aA\xF2WaA\xF2aL\xADV[\x14aB\x13W`@Qc\x16\xF2\xD8?`\xE0\x1B\x81R`\x04\x81\x01\x87\x90R`$\x01a\x0B\x03V[`\x04a\x01\xF5\x87\x81T\x81\x10aB)WaB)aS\x0FV[`\0\x91\x82R` \x90\x91 `\x07`\t\x90\x92\x02\x01\x01\x80T`\xFF\x19\x16`\x01\x83`\x05\x81\x11\x15aBVWaBVaL\xADV[\x02\x17\x90UP\x84Q` \x01Q`\0\x90aBo\x90\x86\x90aW\xDBV[\x90PaB{\x84\x86a+yV[aB\xA5\x7F\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\x82a+yV[``\x86\x01Q`@Qc\x98*A]`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x91\x82\x16`\x04\x82\x01R`$\x81\x01\x85\x90R`D\x81\x01\x84\x90R\x7F\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\x90\x91\x16\x90c\x98*A]\x90`d\x01`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15aC\x1DW`\0\x80\xFD[PZ\xF1\x15\x80\x15aC1W=`\0\x80>=`\0\xFD[PP`@Q\x89\x92P\x7F\x07\xC3=KV\x06\xE2\xFD \xFB\x9A\xDBp\x06\xCD\xC7\xD4\xAB\x0F0\x80\x90\xDA\xBC\xFDd\xD4\x97\x9C\xD7~*\x91P`\0\x90\xA2PPPPPPPV[`\0\x80\x84\x84\x84`@Q` \x01aC\x81\x93\x92\x91\x90aZ/V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x80Q` \x90\x91\x01 \x91PP[\x93\x92PPPV[`\0aC\xB9`\x01`\x01`\xA0\x1B\x03\x84\x16\x83aFmV[\x90P\x80Q`\0\x14\x15\x80\x15aC\xDEWP\x80\x80` \x01\x90Q\x81\x01\x90aC\xDC\x91\x90aS\xCEV[\x15[\x15a\x14xW`@QcRt\xAF\xE7`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x84\x16`\x04\x82\x01R`$\x01a\x0B\x03V[`\0a\x01\xF4\x82\x81T\x81\x10aD\x1DWaD\x1DaS\x0FV[\x90`\0R` `\0 \x90`\x07\x02\x01`\x02\x01T\x90P\x91\x90PV[aD@\x82\x82a \xE4V[a\x19\xEAW`@Qc\xE2Q}?`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x82\x16`\x04\x82\x01R`$\x81\x01\x83\x90R`D\x01a\x0B\x03V[`\0\x80Q` aZ\xEF\x839\x81Q\x91RT`\xFF\x16a/1W`@Qc\x8D\xFC +`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[aD\xA8\x82aF{V[`@Q`\x01`\x01`\xA0\x1B\x03\x83\x16\x90\x7F\xBC|\xD7Z \xEE'\xFD\x9A\xDE\xBA\xB3 A\xF7U!M\xBCk\xFF\xA9\x0C\xC0\"[9\xDA.\\-;\x90`\0\x90\xA2\x80Q\x15aD\xEDWa\x14x\x82\x82aF\xE0V[a\x19\xEAaGMV[`\0\x80\x82\x80` \x01\x90Q\x81\x01\x90aE\x0C\x91\x90aXyV[PPPPPP\x91PPaC\x9D\x81aGlV[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0T`\x01`@\x1B\x90\x04`\xFF\x16a/1W`@Qc\x1A\xFC\xD7\x9F`\xE3\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0\x80`\0\x83Q`A\x03aE\xA1W` \x84\x01Q`@\x85\x01Q``\x86\x01Q`\0\x1AaE\x93\x88\x82\x85\x85aG\x9CV[\x95P\x95P\x95PPPPaE\xADV[PP\x81Q`\0\x91P`\x02\x90[\x92P\x92P\x92V[`\0\x82`\x03\x81\x11\x15aE\xC8WaE\xC8aL\xADV[\x03aE\xD1WPPV[`\x01\x82`\x03\x81\x11\x15aE\xE5WaE\xE5aL\xADV[\x03aF\x03W`@Qc\xF6E\xEE\xDF`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x02\x82`\x03\x81\x11\x15aF\x17WaF\x17aL\xADV[\x03aF8W`@Qc\xFC\xE6\x98\xF7`\xE0\x1B\x81R`\x04\x81\x01\x82\x90R`$\x01a\x0B\x03V[`\x03\x82`\x03\x81\x11\x15aFLWaFLaL\xADV[\x03a\x19\xEAW`@Qc5\xE2\xF3\x83`\xE2\x1B\x81R`\x04\x81\x01\x82\x90R`$\x01a\x0B\x03V[``aC\x9D\x83\x83`\0aHkV[\x80`\x01`\x01`\xA0\x1B\x03\x16;`\0\x03aF\xB1W`@QcL\x9C\x8C\xE3`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x82\x16`\x04\x82\x01R`$\x01a\x0B\x03V[`\0\x80Q` aZ\x8F\x839\x81Q\x91R\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16`\x01`\x01`\xA0\x1B\x03\x92\x90\x92\x16\x91\x90\x91\x17\x90UV[```\0\x80\x84`\x01`\x01`\xA0\x1B\x03\x16\x84`@QaF\xFD\x91\x90aZrV[`\0`@Q\x80\x83\x03\x81\x85Z\xF4\x91PP=\x80`\0\x81\x14aG8W`@Q\x91P`\x1F\x19`?=\x01\x16\x82\x01`@R=\x82R=`\0` \x84\x01>aG=V[``\x91P[P\x91P\x91Pa,\xF8\x85\x83\x83aH\xFAV[4\x15a/1W`@Qc\xB3\x98\x97\x9F`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0\x81Q`@\x14aG\x90W`@Qc\xD2\x833]`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[P\x80Q` \x90\x91\x01 \x90V[`\0\x80\x80\x7F\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF]WnsW\xA4P\x1D\xDF\xE9/Fh\x1B \xA0\x84\x11\x15aG\xD7WP`\0\x91P`\x03\x90P\x82aHaV[`@\x80Q`\0\x80\x82R` \x82\x01\x80\x84R\x8A\x90R`\xFF\x89\x16\x92\x82\x01\x92\x90\x92R``\x81\x01\x87\x90R`\x80\x81\x01\x86\x90R`\x01\x90`\xA0\x01` `@Q` \x81\x03\x90\x80\x84\x03\x90\x85Z\xFA\x15\x80\x15aH+W=`\0\x80>=`\0\xFD[PP`@Q`\x1F\x19\x01Q\x91PP`\x01`\x01`\xA0\x1B\x03\x81\x16aHWWP`\0\x92P`\x01\x91P\x82\x90PaHaV[\x92P`\0\x91P\x81\x90P[\x94P\x94P\x94\x91PPV[``\x81G\x10\x15aH\x90W`@Qc\xCDx`Y`\xE0\x1B\x81R0`\x04\x82\x01R`$\x01a\x0B\x03V[`\0\x80\x85`\x01`\x01`\xA0\x1B\x03\x16\x84\x86`@QaH\xAC\x91\x90aZrV[`\0`@Q\x80\x83\x03\x81\x85\x87Z\xF1\x92PPP=\x80`\0\x81\x14aH\xE9W`@Q\x91P`\x1F\x19`?=\x01\x16\x82\x01`@R=\x82R=`\0` \x84\x01>aH\xEEV[``\x91P[P\x91P\x91Pa\x10\xFD\x86\x83\x83[``\x82aI\x0FWaI\n\x82aIVV[aC\x9DV[\x81Q\x15\x80\x15aI&WP`\x01`\x01`\xA0\x1B\x03\x84\x16;\x15[\x15aIOW`@Qc\x99\x96\xB3\x15`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x85\x16`\x04\x82\x01R`$\x01a\x0B\x03V[P\x80aC\x9DV[\x80Q\x15aIfW\x80Q\x80\x82` \x01\xFD[`@Qc\n\x12\xF5!`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0` \x82\x84\x03\x12\x15aI\x91W`\0\x80\xFD[\x815`\x01`\x01`\xE0\x1B\x03\x19\x81\x16\x81\x14aC\x9DW`\0\x80\xFD[`\0\x80\x83`\x1F\x84\x01\x12aI\xBBW`\0\x80\xFD[P\x815`\x01`\x01`@\x1B\x03\x81\x11\x15aI\xD2W`\0\x80\xFD[` \x83\x01\x91P\x83` \x82`\x05\x1B\x85\x01\x01\x11\x15a@\xC6W`\0\x80\xFD[`\0\x80`\0\x80`\0``\x86\x88\x03\x12\x15aJ\x05W`\0\x80\xFD[\x855\x94P` \x86\x015`\x01`\x01`@\x1B\x03\x80\x82\x11\x15aJ#W`\0\x80\xFD[aJ/\x89\x83\x8A\x01aI\xA9V[\x90\x96P\x94P`@\x88\x015\x91P\x80\x82\x11\x15aJHW`\0\x80\xFD[PaJU\x88\x82\x89\x01aI\xA9V[\x96\x99\x95\x98P\x93\x96P\x92\x94\x93\x92PPPV[`\0\x80\x83`\x1F\x84\x01\x12aJxW`\0\x80\xFD[P\x815`\x01`\x01`@\x1B\x03\x81\x11\x15aJ\x8FW`\0\x80\xFD[` \x83\x01\x91P\x83` \x82\x85\x01\x01\x11\x15a@\xC6W`\0\x80\xFD[`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a\x11\xD8W`\0\x80\xFD[`\0\x80`\0\x80`\0\x80`\0\x80`\xA0\x89\x8B\x03\x12\x15aJ\xD8W`\0\x80\xFD[\x885`\x01`\x01`@\x1B\x03\x80\x82\x11\x15aJ\xEFW`\0\x80\xFD[aJ\xFB\x8C\x83\x8D\x01aJfV[\x90\x9AP\x98P` \x8B\x015\x91PaK\x10\x82aJ\xA7V[\x90\x96P`@\x8A\x015\x95P``\x8A\x015\x90\x80\x82\x11\x15aK-W`\0\x80\xFD[aK9\x8C\x83\x8D\x01aJfV[\x90\x96P\x94P`\x80\x8B\x015\x91P\x80\x82\x11\x15aKRW`\0\x80\xFD[PaK_\x8B\x82\x8C\x01aJfV[\x99\x9C\x98\x9BP\x96\x99P\x94\x97\x93\x96\x92\x95\x94PPPV[\x805`\x03\x81\x10a\x13\xFCW`\0\x80\xFD[`\0`\xE0\x82\x84\x03\x12\x15aK\x94W`\0\x80\xFD[P\x91\x90PV[`\0\x80`\0\x80`\0\x80`\x80\x87\x89\x03\x12\x15aK\xB3W`\0\x80\xFD[aK\xBC\x87aKsV[\x95P` \x87\x015`\x01`\x01`@\x1B\x03\x80\x82\x11\x15aK\xD8W`\0\x80\xFD[aK\xE4\x8A\x83\x8B\x01aK\x82V[\x96P`@\x89\x015\x91P\x80\x82\x11\x15aK\xFAW`\0\x80\xFD[aL\x06\x8A\x83\x8B\x01aJfV[\x90\x96P\x94P``\x89\x015\x91P\x80\x82\x11\x15aL\x1FW`\0\x80\xFD[PaL,\x89\x82\x8A\x01aJfV[\x97\x9A\x96\x99P\x94\x97P\x92\x95\x93\x94\x92PPPV[`\0` \x82\x84\x03\x12\x15aLPW`\0\x80\xFD[P5\x91\x90PV[\x805a\x13\xFC\x81aJ\xA7V[`\0\x80`@\x83\x85\x03\x12\x15aLuW`\0\x80\xFD[\x825\x91P` \x83\x015aL\x87\x81aJ\xA7V[\x80\x91PP\x92P\x92\x90PV[`\0` \x82\x84\x03\x12\x15aL\xA4W`\0\x80\xFD[aC\x9D\x82aKsV[cNH{q`\xE0\x1B`\0R`!`\x04R`$`\0\xFD[`\x06\x81\x10aL\xE1WcNH{q`\xE0\x1B`\0R`!`\x04R`$`\0\xFD[\x90RV[` \x81\x01a\x08\xF5\x82\x84aL\xC3V[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`@Q`\xE0\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15aM+WaM+aL\xF3V[`@R\x90V[`@Q`\x1F\x82\x01`\x1F\x19\x16\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15aMYWaMYaL\xF3V[`@R\x91\x90PV[`\0`\x01`\x01`@\x1B\x03\x82\x11\x15aMzWaMzaL\xF3V[P`\x1F\x01`\x1F\x19\x16` \x01\x90V[`\0\x82`\x1F\x83\x01\x12aM\x99W`\0\x80\xFD[\x815aM\xACaM\xA7\x82aMaV[aM1V[\x81\x81R\x84` \x83\x86\x01\x01\x11\x15aM\xC1W`\0\x80\xFD[\x81` \x85\x01` \x83\x017`\0\x91\x81\x01` \x01\x91\x90\x91R\x93\x92PPPV[`\0\x80`@\x83\x85\x03\x12\x15aM\xF1W`\0\x80\xFD[\x825aM\xFC\x81aJ\xA7V[\x91P` \x83\x015`\x01`\x01`@\x1B\x03\x81\x11\x15aN\x17W`\0\x80\xFD[aN#\x85\x82\x86\x01aM\x88V[\x91PP\x92P\x92\x90PV[`\0\x80`\0\x80``\x85\x87\x03\x12\x15aNCW`\0\x80\xFD[\x845\x93P` \x85\x015aNU\x81aJ\xA7V[\x92P`@\x85\x015`\x01`\x01`@\x1B\x03\x81\x11\x15aNpW`\0\x80\xFD[aN|\x87\x82\x88\x01aJfV[\x95\x98\x94\x97P\x95PPPPV[`\0`\x01`\x01`@\x1B\x03\x82\x11\x15aN\xA1WaN\xA1aL\xF3V[P`\x05\x1B` \x01\x90V[`\0\x82`\x1F\x83\x01\x12aN\xBCW`\0\x80\xFD[\x815` aN\xCCaM\xA7\x83aN\x88V[\x82\x81R`\x05\x92\x90\x92\x1B\x84\x01\x81\x01\x91\x81\x81\x01\x90\x86\x84\x11\x15aN\xEBW`\0\x80\xFD[\x82\x86\x01[\x84\x81\x10\x15aO\x06W\x805\x83R\x91\x83\x01\x91\x83\x01aN\xEFV[P\x96\x95PPPPPPV[`\0\x80`\0`@\x84\x86\x03\x12\x15aO&W`\0\x80\xFD[\x835`\x01`\x01`@\x1B\x03\x80\x82\x11\x15aO=W`\0\x80\xFD[aOI\x87\x83\x88\x01aN\xABV[\x94P` \x86\x015\x91P\x80\x82\x11\x15aO_W`\0\x80\xFD[PaOl\x86\x82\x87\x01aI\xA9V[\x94\x97\x90\x96P\x93\x94PPPPV[`\0\x80`\0`@\x84\x86\x03\x12\x15aO\x8EW`\0\x80\xFD[\x835`\x01`\x01`@\x1B\x03\x80\x82\x11\x15aO\xA5W`\0\x80\xFD[aO\xB1\x87\x83\x88\x01aM\x88V[\x94P` \x86\x015\x91P\x80\x82\x11\x15aO\xC7W`\0\x80\xFD[PaOl\x86\x82\x87\x01aJfV[`\0[\x83\x81\x10\x15aO\xEFW\x81\x81\x01Q\x83\x82\x01R` \x01aO\xD7V[PP`\0\x91\x01RV[`\0\x81Q\x80\x84RaP\x10\x81` \x86\x01` \x86\x01aO\xD4V[`\x1F\x01`\x1F\x19\x16\x92\x90\x92\x01` \x01\x92\x91PPV[`\x80\x81R\x84Q`\x80\x82\x01R` \x85\x01Q`\xA0\x82\x01R`@\x85\x01Q`\xC0\x82\x01R``\x85\x01Q`\xE0\x82\x01R`\x80\x85\x01Qa\x01\0\x82\x01R`\x01\x80`\xA0\x1B\x03`\xA0\x86\x01Q\x16a\x01 \x82\x01R`\0`\xC0\x86\x01Q`\xE0a\x01@\x84\x01RaP\x88a\x01`\x84\x01\x82aO\xF8V[\x91PPaP\x98` \x83\x01\x86aL\xC3V[`\x01`\x01`\xA0\x1B\x03\x84\x16`@\x83\x01R`\x01`\x01`\xA0\x1B\x03\x83\x16``\x83\x01R\x95\x94PPPPPV[`\0\x80`\0\x80`\0\x80`\x80\x87\x89\x03\x12\x15aP\xD8W`\0\x80\xFD[\x865`\x01`\x01`@\x1B\x03\x80\x82\x11\x15aP\xEFW`\0\x80\xFD[aP\xFB\x8A\x83\x8B\x01aK\x82V[\x97PaK\xE4` \x8A\x01aKsV[`\0` \x82\x84\x03\x12\x15aQ\x1BW`\0\x80\xFD[\x815aC\x9D\x81aJ\xA7V[`\0\x80`@\x83\x85\x03\x12\x15aQ9W`\0\x80\xFD[aQB\x83aKsV[\x94` \x93\x90\x93\x015\x93PPPV[` \x81R`\0aC\x9D` \x83\x01\x84aO\xF8V[`\0\x80`\0`@\x84\x86\x03\x12\x15aQxW`\0\x80\xFD[\x835\x92P` \x84\x015`\x01`\x01`@\x1B\x03\x81\x11\x15aQ\x95W`\0\x80\xFD[aOl\x86\x82\x87\x01aJfV[`\0\x80` \x83\x85\x03\x12\x15aQ\xB4W`\0\x80\xFD[\x825`\x01`\x01`@\x1B\x03\x81\x11\x15aQ\xCAW`\0\x80\xFD[aQ\xD6\x85\x82\x86\x01aJfV[\x90\x96\x90\x95P\x93PPPPV[`\0\x80`\0\x80`\0\x80`\x80\x87\x89\x03\x12\x15aQ\xFBW`\0\x80\xFD[\x865`\x01`\x01`@\x1B\x03\x80\x82\x11\x15aR\x12W`\0\x80\xFD[aR\x1E\x8A\x83\x8B\x01aN\xABV[\x97P` \x91P\x81\x89\x015\x81\x81\x11\x15aR5W`\0\x80\xFD[\x89\x01`\x1F\x81\x01\x8B\x13aRFW`\0\x80\xFD[\x805aRTaM\xA7\x82aN\x88V[\x81\x81R`\x05\x91\x90\x91\x1B\x82\x01\x84\x01\x90\x84\x81\x01\x90\x8D\x83\x11\x15aRsW`\0\x80\xFD[\x92\x85\x01\x92[\x82\x84\x10\x15aR\x9AW\x835aR\x8B\x81aJ\xA7V[\x82R\x92\x85\x01\x92\x90\x85\x01\x90aRxV[\x99PPPP`@\x89\x015\x91P\x80\x82\x11\x15aR\xB3W`\0\x80\xFD[aL\x06\x8A\x83\x8B\x01aI\xA9V[`\0`\x01\x80`\xA0\x1B\x03\x80\x8A\x16\x83R\x88` \x84\x01R\x87`@\x84\x01R\x86``\x84\x01R\x85`\x80\x84\x01R\x80\x85\x16`\xA0\x84\x01RP`\xE0`\xC0\x83\x01RaS\x02`\xE0\x83\x01\x84aO\xF8V[\x99\x98PPPPPPPPPV[cNH{q`\xE0\x1B`\0R`2`\x04R`$`\0\xFD[`\x01\x81\x81\x1C\x90\x82\x16\x80aS9W`\x7F\x82\x16\x91P[` \x82\x10\x81\x03aK\x94WcNH{q`\xE0\x1B`\0R`\"`\x04R`$`\0\xFD[`\0\x80\x835`\x1E\x19\x846\x03\x01\x81\x12aSpW`\0\x80\xFD[\x83\x01\x805\x91P`\x01`\x01`@\x1B\x03\x82\x11\x15aS\x8AW`\0\x80\xFD[` \x01\x91P6\x81\x90\x03\x82\x13\x15a@\xC6W`\0\x80\xFD[cNH{q`\xE0\x1B`\0R`\x11`\x04R`$`\0\xFD[`\0`\x01\x82\x01aS\xC7WaS\xC7aS\x9FV[P`\x01\x01\x90V[`\0` \x82\x84\x03\x12\x15aS\xE0W`\0\x80\xFD[\x81Q\x80\x15\x15\x81\x14aC\x9DW`\0\x80\xFD[\x81\x83R\x81\x81` \x85\x017P`\0\x82\x82\x01` \x90\x81\x01\x91\x90\x91R`\x1F\x90\x91\x01`\x1F\x19\x16\x90\x91\x01\x01\x90V[\x83\x81R`@` \x82\x01R`\0a,\xF8`@\x83\x01\x84\x86aS\xF0V[\x80\x82\x01\x80\x82\x11\x15a\x08\xF5Wa\x08\xF5aS\x9FV[`\x1F\x82\x11\x15a\x14xW`\0\x81\x81R` \x81 `\x1F\x85\x01`\x05\x1C\x81\x01` \x86\x10\x15aTmWP\x80[`\x1F\x85\x01`\x05\x1C\x82\x01\x91P[\x81\x81\x10\x15a\x1E\x04W\x82\x81U`\x01\x01aTyV[\x81Q`\x01`\x01`@\x1B\x03\x81\x11\x15aT\xA5WaT\xA5aL\xF3V[aT\xB9\x81aT\xB3\x84TaS%V[\x84aTFV[` \x80`\x1F\x83\x11`\x01\x81\x14aT\xEEW`\0\x84\x15aT\xD6WP\x85\x83\x01Q[`\0\x19`\x03\x86\x90\x1B\x1C\x19\x16`\x01\x85\x90\x1B\x17\x85Ua\x1E\x04V[`\0\x85\x81R` \x81 `\x1F\x19\x86\x16\x91[\x82\x81\x10\x15aU\x1DW\x88\x86\x01Q\x82U\x94\x84\x01\x94`\x01\x90\x91\x01\x90\x84\x01aT\xFEV[P\x85\x82\x10\x15aU;W\x87\x85\x01Q`\0\x19`\x03\x88\x90\x1B`\xF8\x16\x1C\x19\x16\x81U[PPPPP`\x01\x90\x81\x1B\x01\x90UPV[\x80\x82\x02\x81\x15\x82\x82\x04\x84\x14\x17a\x08\xF5Wa\x08\xF5aS\x9FV[`\x01\x80`\xA0\x1B\x03\x85\x16\x81R\x83` \x82\x01R`\x80`@\x82\x01R`\0aU\x89`\x80\x83\x01\x85aO\xF8V[\x82\x81\x03``\x84\x01RaU\x9B\x81\x85aO\xF8V[\x97\x96PPPPPPPV[\x81\x83R`\0` \x80\x85\x01\x80\x81\x96P\x85`\x05\x1B\x81\x01\x91P\x84`\0[\x87\x81\x10\x15aV*W\x82\x84\x03\x89R\x815`\x1E\x19\x886\x03\x01\x81\x12aU\xE1W`\0\x80\xFD[\x87\x01\x85\x81\x01\x905`\x01`\x01`@\x1B\x03\x81\x11\x15aU\xFCW`\0\x80\xFD[\x806\x03\x82\x13\x15aV\x0BW`\0\x80\xFD[aV\x16\x86\x82\x84aS\xF0V[\x9A\x87\x01\x9A\x95PPP\x90\x84\x01\x90`\x01\x01aU\xC0V[P\x91\x97\x96PPPPPPPV[``\x80\x82R\x85Q\x90\x82\x01\x81\x90R`\0\x90` \x90`\x80\x84\x01\x90\x82\x89\x01\x84[\x82\x81\x10\x15aVpW\x81Q\x84R\x92\x84\x01\x92\x90\x84\x01\x90`\x01\x01aVTV[PPP\x83\x81\x03\x82\x85\x01R\x86Q\x80\x82R\x87\x83\x01\x91\x83\x01\x90`\0[\x81\x81\x10\x15aV\xAEW\x83Q`\x01`\x01`\xA0\x1B\x03\x16\x83R\x92\x84\x01\x92\x91\x84\x01\x91`\x01\x01aV\x89V[PP\x84\x81\x03`@\x86\x01RaS\x02\x81\x87\x89aU\xA6V[`\0\x80`\0``\x84\x86\x03\x12\x15aV\xD8W`\0\x80\xFD[\x835`\x01`\x01`@\x1B\x03\x80\x82\x11\x15aV\xEFW`\0\x80\xFD[aV\xFB\x87\x83\x88\x01aM\x88V[\x94P` \x86\x015\x91P\x80\x82\x11\x15aW\x11W`\0\x80\xFD[aW\x1D\x87\x83\x88\x01aM\x88V[\x93P`@\x86\x015\x91P\x80\x82\x11\x15aW3W`\0\x80\xFD[PaW@\x86\x82\x87\x01aM\x88V[\x91PP\x92P\x92P\x92V[`\0` \x82\x84\x03\x12\x15aW\\W`\0\x80\xFD[PQ\x91\x90PV[`\0\x80`@\x83\x85\x03\x12\x15aWvW`\0\x80\xFD[PP\x80Q` \x90\x91\x01Q\x90\x92\x90\x91PV[`\0\x80`@\x83\x85\x03\x12\x15aW\x9AW`\0\x80\xFD[\x82QaW\xA5\x81aJ\xA7V[` \x93\x90\x93\x01Q\x92\x94\x92\x93PPPV[`@\x81R`\0aW\xC8`@\x83\x01\x86aO\xF8V[\x82\x81\x03` \x84\x01Ra\x10\xFD\x81\x85\x87aS\xF0V[\x81\x81\x03\x81\x81\x11\x15a\x08\xF5Wa\x08\xF5aS\x9FV[` \x81R`\0aX\x02` \x83\x01\x84\x86aS\xF0V[\x94\x93PPPPV[`@\x81R`\0aX\x1D`@\x83\x01\x85aO\xF8V[\x90P`\x01\x80`\xA0\x1B\x03\x83\x16` \x83\x01R\x93\x92PPPV[`\0\x82`\x1F\x83\x01\x12aXEW`\0\x80\xFD[\x81QaXSaM\xA7\x82aMaV[\x81\x81R\x84` \x83\x86\x01\x01\x11\x15aXhW`\0\x80\xFD[aX\x02\x82` \x83\x01` \x87\x01aO\xD4V[`\0\x80`\0\x80`\0\x80`\0\x80a\x01\0\x89\x8B\x03\x12\x15aX\x96W`\0\x80\xFD[\x88Q`\x01`\x01`@\x1B\x03\x80\x82\x11\x15aX\xADW`\0\x80\xFD[aX\xB9\x8C\x83\x8D\x01aX4V[\x99P` \x8B\x01Q\x91P\x80\x82\x11\x15aX\xCFW`\0\x80\xFD[aX\xDB\x8C\x83\x8D\x01aX4V[\x98P`@\x8B\x01Q\x91P\x80\x82\x11\x15aX\xF1W`\0\x80\xFD[aX\xFD\x8C\x83\x8D\x01aX4V[\x97P``\x8B\x01Q\x91P\x80\x82\x11\x15aY\x13W`\0\x80\xFD[aY\x1F\x8C\x83\x8D\x01aX4V[\x96P`\x80\x8B\x01Q\x91P\x80\x82\x11\x15aY5W`\0\x80\xFD[PaYB\x8B\x82\x8C\x01aX4V[\x94PP`\xA0\x89\x01Q\x92P`\xC0\x89\x01Q\x91P`\xE0\x89\x01Q\x90P\x92\x95\x98P\x92\x95\x98\x90\x93\x96PV[`\0`\xE0\x826\x03\x12\x15aYyW`\0\x80\xFD[aY\x81aM\tV[\x825\x81R` \x83\x015` \x82\x01R`@\x83\x015`@\x82\x01R``\x83\x015``\x82\x01R`\x80\x83\x015`\x80\x82\x01RaY\xB9`\xA0\x84\x01aLWV[`\xA0\x82\x01R`\xC0\x83\x015`\x01`\x01`@\x1B\x03\x81\x11\x15aY\xD7W`\0\x80\xFD[aY\xE36\x82\x86\x01aM\x88V[`\xC0\x83\x01RP\x92\x91PPV[`@\x81R`\0aZ\x03`@\x83\x01\x86\x88aS\xF0V[\x82\x81\x03` \x84\x01RaU\x9B\x81\x85\x87aS\xF0V[\x82\x81R`@` \x82\x01R`\0aX\x02`@\x83\x01\x84aO\xF8V[`\0\x84QaZA\x81\x84` \x89\x01aO\xD4V[\x84Q\x90\x83\x01\x90aZU\x81\x83` \x89\x01aO\xD4V[\x84Q\x91\x01\x90aZh\x81\x83` \x88\x01aO\xD4V[\x01\x95\x94PPPPPV[`\0\x82QaZ\x84\x81\x84` \x87\x01aO\xD4V[\x91\x90\x91\x01\x92\x91PPV\xFE6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBCs\xE5s\xF9VmaA\x8A4\xD5\xDE?\xF4\x93`\xF9\xC5\x1F\xEC7\xF7HeQg\x02\x90\xF6(]\xAB\x02\xDD{\xC7\xDE\xC4\xDC\xEE\xDD\xA7u\xE5\x8D\xD5A\xE0\x8A\x11llS\x81\\\x0B\xD0(\x19/{bh\0\xCD^\xD1\\n\x18~w\xE9\xAE\xE8\x81\x84\xC2\x1FO!\x82\xABX'\xCB;~\x07\xFB\xED\xCDc\xF03\0\x08\x0F^\xA8N\xD1\xDEL\x8E\xDBX\xBEe\x1C%X\x1C5Z\0\x11\xB0\xF96\r\xE5\x08+\xEC\xD6F@\xA2dipfsX\"\x12 C\xE9\x04\x85B\x0C\x807D\xFE\x0B\x9B\xF1\x8A\xB6\xFA\x8CX\xF8Ci\xEA\xC2\x88\xFA\x87d\xEA\x80\x1A!}dsolcC\0\x08\x14\x003"; + const __DEPLOYED_BYTECODE: &[u8] = b"`\x80`@R`\x046\x10a\x02\x93W`\x005`\xE0\x1C\x80ceY9{\x11a\x01ZW\x80c\x97Q\xBB\xD3\x11a\0\xC1W\x80c\xD4\xC2B6\x11a\0zW\x80c\xD4\xC2B6\x14a\x08\x86W\x80c\xD5Gt\x1F\x14a\x08\xA6W\x80c\xE6\xAF\xC3\xD9\x14a\x08\xC6W\x80c\xF0`,\xAB\x14a\x08\xE6W\x80c\xF8\xA9H/\x14a\t\x06W\x80c\xFB\xEF\x98m\x14a\t9W`\0\x80\xFD[\x80c\x97Q\xBB\xD3\x14a\x07\x9FW\x80c\xA2\x17\xFD\xDF\x14a\x07\xD3W\x80c\xAD<\xB1\xCC\x14a\x07\xE8W\x80c\xB4\xCFT?\x14a\x08&W\x80c\xC2D\xA7\xB9\x14a\x08FW\x80c\xC4\xD6m\xE8\x14a\x08fW`\0\x80\xFD[\x80cy\xC7n\x1A\x11a\x01\x13W\x80cy\xC7n\x1A\x14a\x06\xC8W\x80c\x84V\xCBY\x14a\x06\xE8W\x80c\x87|\x86\xFB\x14a\x06\xFDW\x80c\x89\x88PI\x14a\x071W\x80c\x8E\xCC\xBD\xAF\x14a\x07_W\x80c\x91\xD1HT\x14a\x07\x7FW`\0\x80\xFD[\x80ceY9{\x14a\x05\xB8W\x80cf\x1D\xE5\xAC\x14a\x05\xECW\x80cl\x8D\xF5\x18\x14a\x068W\x80cm\xA6w\x9B\x14a\x06hW\x80cpS\x8F\xCA\x14a\x06\x88W\x80cx\x7F\xB0K\x14a\x06\xA8W`\0\x80\xFD[\x80c6V\x8A\xBE\x11a\x01\xFEW\x80cO\x1E\xF2\x86\x11a\x01\xB7W\x80cO\x1E\xF2\x86\x14a\x05\x0BW\x80cRy\x86\xD0\x14a\x05\x1EW\x80cR\xD1\x90-\x14a\x05>W\x80cS{[\x7F\x14a\x05SW\x80c\\\x97Z\xBB\x14a\x05sW\x80cd\x17\xFBa\x14a\x05\x98W`\0\x80\xFD[\x80c6V\x8A\xBE\x14a\x049W\x80c?K\xA8:\x14a\x04YW\x80cE\x07R\xB4\x14a\x04nW\x80cG\xE63\x80\x14a\x04\x8EW\x80cIm\xF3\xB1\x14a\x04\xB0W\x80cMFq-\x14a\x04\xDEW`\0\x80\xFD[\x80c$v\x08\x07\x11a\x02PW\x80c$v\x08\x07\x14a\x03}W\x80c$\x8A\x9C\xA3\x14a\x03\x93W\x80c(D8\xA1\x14a\x03\xB3W\x80c-\x001\x8D\x14a\x03\xD5W\x80c//\xF1]\x14a\x04\x03W\x80c1u\x93\xD2\x14a\x04#W`\0\x80\xFD[\x80c\x01\xFF\xC9\xA7\x14a\x02\x98W\x80c\x04K\xC8\xED\x14a\x02\xCDW\x80c\x15\xC9\x8Az\x14a\x02\xEFW\x80c\x16\x0F\xCF\xBA\x14a\x03\x0FW\x80c\x16(\xE0\xF5\x14a\x03=W\x80c }f)\x14a\x03]W[`\0\x80\xFD[4\x80\x15a\x02\xA4W`\0\x80\xFD[Pa\x02\xB8a\x02\xB36`\x04aLPV[a\tNV[`@Q\x90\x15\x15\x81R` \x01[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x02\xD9W`\0\x80\xFD[Pa\x02\xEDa\x02\xE86`\x04aL\xBEV[a\t_V[\0[4\x80\x15a\x02\xFBW`\0\x80\xFD[Pa\x02\xEDa\x03\n6`\x04aM\x91V[a\rWV[4\x80\x15a\x03\x1BW`\0\x80\xFD[Pa\x03/a\x03*6`\x04aNwV[a\x11$V[`@Q\x90\x81R` \x01a\x02\xC4V[4\x80\x15a\x03IW`\0\x80\xFD[Pa\x02\xEDa\x03X6`\x04aO%V[a\x11\xAFV[4\x80\x15a\x03iW`\0\x80\xFD[Pa\x03/a\x03x6`\x04aO%V[a\x12\x83V[4\x80\x15a\x03\x89W`\0\x80\xFD[Pa\x01\xF4Ta\x03/V[4\x80\x15a\x03\x9FW`\0\x80\xFD[Pa\x03/a\x03\xAE6`\x04aO%V[a\x14\xA9V[4\x80\x15a\x03\xBFW`\0\x80\xFD[Pa\x03/`\0\x80Q` a^C\x839\x81Q\x91R\x81V[4\x80\x15a\x03\xE1W`\0\x80\xFD[Pa\x03/a\x03\xF06`\x04aO>V[a\x01\xF7` R`\0\x90\x81R`@\x90 T\x81V[4\x80\x15a\x04\x0FW`\0\x80\xFD[Pa\x02\xEDa\x04\x1E6`\x04aOdV[a\x14\xCBV[4\x80\x15a\x04/W`\0\x80\xFD[Pa\x01\xF5Ta\x03/V[4\x80\x15a\x04EW`\0\x80\xFD[Pa\x02\xEDa\x04T6`\x04aOdV[a\x14\xEDV[4\x80\x15a\x04eW`\0\x80\xFD[Pa\x02\xEDa\x15%V[4\x80\x15a\x04zW`\0\x80\xFD[Pa\x02\xEDa\x04\x896`\x04aL\xBEV[a\x15EV[4\x80\x15a\x04\x9AW`\0\x80\xFD[Pa\x03/`\0\x80Q` a]\xE3\x839\x81Q\x91R\x81V[4\x80\x15a\x04\xBCW`\0\x80\xFD[Pa\x03/a\x04\xCB6`\x04aO>V[a\x01\xF6` R`\0\x90\x81R`@\x90 T\x81V[4\x80\x15a\x04\xEAW`\0\x80\xFD[Pa\x04\xFEa\x04\xF96`\x04aO%V[a\x1AtV[`@Qa\x02\xC4\x91\x90aO\xCCV[a\x02\xEDa\x05\x196`\x04aP\xC5V[a\x1CmV[4\x80\x15a\x05*W`\0\x80\xFD[Pa\x02\xEDa\x0596`\x04aQ\x14V[a\x1C\x8CV[4\x80\x15a\x05JW`\0\x80\xFD[Pa\x03/a\x1D\x81V[4\x80\x15a\x05_W`\0\x80\xFD[Pa\x02\xEDa\x05n6`\x04aQ\xFAV[a\x1D\x9EV[4\x80\x15a\x05\x7FW`\0\x80\xFD[P`\0\x80Q` a^#\x839\x81Q\x91RT`\xFF\x16a\x02\xB8V[4\x80\x15a\x05\xA4W`\0\x80\xFD[Pa\x02\xEDa\x05\xB36`\x04aRfV[a\x1E*V[4\x80\x15a\x05\xC4W`\0\x80\xFD[Pa\x03/\x7F\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\x81V[4\x80\x15a\x05\xF8W`\0\x80\xFD[Pa\x06 \x7F\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\x81V[`@Q`\x01`\x01`\xA0\x1B\x03\x90\x91\x16\x81R` \x01a\x02\xC4V[4\x80\x15a\x06DW`\0\x80\xFD[Pa\x06Xa\x06S6`\x04aO%V[a\x1E\xE3V[`@Qa\x02\xC4\x94\x93\x92\x91\x90aS\x15V[4\x80\x15a\x06tW`\0\x80\xFD[Pa\x03/a\x06\x836`\x04aOdV[a \x16V[4\x80\x15a\x06\x94W`\0\x80\xFD[Pa\x02\xEDa\x06\xA36`\x04aS\xB0V[a qV[4\x80\x15a\x06\xB4W`\0\x80\xFD[Pa\x02\xEDa\x06\xC36`\x04aO%V[a \xA0V[4\x80\x15a\x06\xD4W`\0\x80\xFD[Pa\x02\xEDa\x06\xE36`\x04aT\x15V[a\"LV[4\x80\x15a\x06\xF4W`\0\x80\xFD[Pa\x02\xEDa\"\xBCV[4\x80\x15a\x07\tW`\0\x80\xFD[Pa\x06 \x7F\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\x81V[4\x80\x15a\x07=W`\0\x80\xFD[Pa\x03/a\x07L6`\x04aT\x15V[a\x01\xF8` R`\0\x90\x81R`@\x90 T\x81V[4\x80\x15a\x07kW`\0\x80\xFD[Pa\x02\xEDa\x07z6`\x04aT2V[a\"\xDCV[4\x80\x15a\x07\x8BW`\0\x80\xFD[Pa\x02\xB8a\x07\x9A6`\x04aOdV[a#yV[4\x80\x15a\x07\xABW`\0\x80\xFD[Pa\x06 \x7F\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\x81V[4\x80\x15a\x07\xDFW`\0\x80\xFD[Pa\x03/`\0\x81V[4\x80\x15a\x07\xF4W`\0\x80\xFD[Pa\x08\x19`@Q\x80`@\x01`@R\x80`\x05\x81R` \x01d\x03R\xE3\x02\xE3`\xDC\x1B\x81RP\x81V[`@Qa\x02\xC4\x91\x90aT\\V[4\x80\x15a\x082W`\0\x80\xFD[Pa\x02\xEDa\x08A6`\x04aT2V[a#\xB1V[4\x80\x15a\x08RW`\0\x80\xFD[Pa\x02\xEDa\x08a6`\x04aToV[a$EV[4\x80\x15a\x08rW`\0\x80\xFD[Pa\x02\xEDa\x08\x816`\x04aT\x15V[a$`V[4\x80\x15a\x08\x92W`\0\x80\xFD[Pa\x02\xEDa\x08\xA16`\x04aT\xA1V[a%\xB9V[4\x80\x15a\x08\xB2W`\0\x80\xFD[Pa\x02\xEDa\x08\xC16`\x04aOdV[a&eV[4\x80\x15a\x08\xD2W`\0\x80\xFD[Pa\x02\xEDa\x08\xE16`\x04aT\xE2V[a&\x81V[4\x80\x15a\x08\xF2W`\0\x80\xFD[Pa\x02\xEDa\t\x016`\x04aToV[a(\x94V[4\x80\x15a\t\x12W`\0\x80\xFD[Pa\t&a\t!6`\x04aO%V[a+\xD5V[`@Qa\x02\xC4\x97\x96\x95\x94\x93\x92\x91\x90aU\xCFV[4\x80\x15a\tEW`\0\x80\xFD[Pa\x03/`d\x81V[`\0a\tY\x82a,\xBEV[\x92\x91PPV[`\0a\x01\xF4\x86\x81T\x81\x10a\tuWa\tuaV$V[`\0\x91\x82R` \x91\x82\x90 `@\x80Q`\xE0\x81\x01\x82R`\x07\x90\x93\x02\x90\x91\x01\x80T`\x01`\x01`\xA0\x1B\x03\x90\x81\x16\x84R`\x01\x82\x01T\x94\x84\x01\x94\x90\x94R`\x02\x81\x01T\x91\x83\x01\x91\x90\x91R`\x03\x81\x01T``\x83\x01R`\x04\x81\x01T`\x80\x83\x01R`\x05\x81\x01T\x90\x92\x16`\xA0\x82\x01R`\x06\x82\x01\x80T\x91\x92\x91`\xC0\x84\x01\x91\x90a\t\xF2\x90aV:V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\n\x1E\x90aV:V[\x80\x15a\nkW\x80`\x1F\x10a\n@Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\nkV[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\nNW\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81RPP\x90P\x80`\xC0\x01QQ`\0\x03a\n\x9CW`@Qc\x9D\xB8\xD5\xB1`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\xA0\x81\x01Q`\x01`\x01`\xA0\x1B\x03\x163`\x01`\x01`\xA0\x1B\x03\x16\x14a\n\xD2W`@Qc8\x99:I`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x83\x15a\x0C7Wa\n\xE5\x81` \x01Qa,\xF3V[a\x0B\x02W`@Qcz\xFC\xEF\x7F`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0[\x84\x81\x10\x15a\x0C5W`\0a\x0B;\x87\x87\x84\x81\x81\x10a\x0B$Wa\x0B$aV$V[\x90P` \x02\x81\x01\x90a\x0B6\x91\x90aVnV[a-(V[\x90P\x82` \x01Q\x81\x03a\x0BpW`@QcZ\xB2\xFB\xC9`\xE1\x1B\x81R`\x04\x81\x01\x89\x90R`$\x81\x01\x82\x90R`D\x01[`@Q\x80\x91\x03\x90\xFD[\x7F\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`\x01`\x01`\xA0\x1B\x03\x16c\x14\x13\xA9*\x82a\x0B\xA9\x8Ba-JV[`@Q`\x01`\x01`\xE0\x1B\x03\x19`\xE0\x85\x90\x1B\x16\x81R`\x04\x81\x01\x92\x90\x92R`$\x82\x01R`D\x01`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x0B\xE7W`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x0B\xFBW=`\0\x80>=`\0\xFD[PP`@Q\x83\x92P\x8A\x91P\x7F\xDC\xBE\xB0\xA3\xB1\xAC\"\x82L\xF31\x91q\x12\xBE\x12\x80I\xBAa'\xB2\xB2\x06\xA2\xEE[\x0Fl\xA9|5\x90`\0\x90\xA3P`\x01\x01a\x0B\x05V[P[`\0[\x82\x81\x10\x15a\rNW`\0a\x0CY\x85\x85\x84\x81\x81\x10a\x0B$Wa\x0B$aV$V[\x90P\x82`\x80\x01Q\x81\x03a\x0C\x89W`@QcZ\xB2\xFB\xC9`\xE1\x1B\x81R`\x04\x81\x01\x89\x90R`$\x81\x01\x82\x90R`D\x01a\x0BgV[\x7F\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`\x01`\x01`\xA0\x1B\x03\x16c\x14\x13\xA9*\x82a\x0C\xC2\x8Ba-\x92V[`@Q`\x01`\x01`\xE0\x1B\x03\x19`\xE0\x85\x90\x1B\x16\x81R`\x04\x81\x01\x92\x90\x92R`$\x82\x01R`D\x01`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\r\0W`\0\x80\xFD[PZ\xF1\x15\x80\x15a\r\x14W=`\0\x80>=`\0\xFD[PP`@Q\x83\x92P\x8A\x91P\x7FX\xEE\xC2\xA6\xA4~\x81\x083\"\x82\x9B3\x91\x02\x84|~\x1D\xDD}df\x86\x83\xA4\xB9\x96\xE5\xA0$\x9D\x90`\0\x90\xA3P`\x01\x01a\x0C:V[PPPPPPPV[a\r_a-\xC1V[3\x85\x15\x80a\rkWP\x87\x15[\x80a\r}WP`\x01`\x01`\xA0\x1B\x03\x87\x16\x15[\x15a\r\x9BW`@Qc\x1E\x1D\n\xB5`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x86`\x01`\x01`\xA0\x1B\x03\x16c\x10\xA5By`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\r\xD9W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\r\xFD\x91\x90aV\xB4V[a\x0E\x1AW`@Qcy\xA6}[`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x0E\x8F`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x82\x7F\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\x7F\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\0a.\x0BV[a\x01\xF4Ta\x0E\xA5a\x0E\xA0\x87\x87a-(V[a,\xF3V[\x15a\x0F5W\x7F\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`\x01`\x01`\xA0\x1B\x03\x16c\xFF\x11J\xE1a\x0E\xE2\x83a-JV[\x88\x88`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x0F\x02\x93\x92\x91\x90aV\xFFV[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x0F\x1CW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x0F0W=`\0\x80>=`\0\xFD[PPPP[\x7F\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`\x01`\x01`\xA0\x1B\x03\x16c\xFF\x11J\xE1a\x0Fm\x83a-\x92V[\x86\x86`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x0F\x8D\x93\x92\x91\x90aV\xFFV[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x0F\xA7W`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x0F\xBBW=`\0\x80>=`\0\xFD[PPPPa\x01\xF4`@Q\x80`\xE0\x01`@R\x80\x8A`\x01`\x01`\xA0\x1B\x03\x16\x81R` \x01a\x0F\xE6\x89\x89a-(V[\x81R` \x81\x01\x8A\x90R`@\x01a\x0F\xFD`dCaW/V[\x81R` \x01a\x10\x0C\x87\x87a-(V[\x81R` \x01\x84`\x01`\x01`\xA0\x1B\x03\x16\x81R` \x01\x8C\x8C\x80\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x93\x92\x91\x90\x81\x81R` \x01\x83\x83\x80\x82\x847`\0\x92\x01\x82\x90RP\x93\x90\x94RPP\x83T`\x01\x80\x82\x01\x86U\x94\x82R` \x91\x82\x90 \x84Q`\x07\x90\x92\x02\x01\x80T`\x01`\x01`\xA0\x1B\x03\x19\x90\x81\x16`\x01`\x01`\xA0\x1B\x03\x93\x84\x16\x17\x82U\x92\x85\x01Q\x95\x81\x01\x95\x90\x95U`@\x84\x01Q`\x02\x86\x01U``\x84\x01Q`\x03\x86\x01U`\x80\x84\x01Q`\x04\x86\x01U`\xA0\x84\x01Q`\x05\x86\x01\x80T\x90\x93\x16\x91\x16\x17\x90UP`\xC0\x81\x01Q\x90\x91\x90`\x06\x82\x01\x90a\x10\xE2\x90\x82aW\x90V[PP`@Q\x82\x91P\x7F\xB8Z>yOG^\xD5\xE4\x03}\xC5\xF2\xD5\xC3(\xC8\xD5N\x0C\x1AL\xA5Sc\x82\x90\x15\xE6\xC7\x0C\x89\x90`\0\x90\xA2PPa\x11\x1Aa.rV[PPPPPPPPV[`\0\x80a\x01\xF6`\0\x89`\x02\x81\x11\x15a\x11>Wa\x11>aO\x94V[`\x02\x81\x11\x15a\x11OWa\x11OaO\x94V[\x81R` \x01\x90\x81R` \x01`\0 T\x90P\x80`\0\x14a\x11\x9FW\x80\x83\x86a\x11x`\xC0\x8B\x01\x8BaVnV[a\x11\x83\x92\x91PaW/V[a\x11\x8D\x91\x90aW/V[a\x11\x97\x91\x90aXNV[\x91PPa\x11\xA5V[`\0\x91PP[\x96\x95PPPPPPV[a\x11\xB7a-\xC1V[`\x02a\x11\xC2\x82a\x1AtV[`\x05\x81\x11\x15a\x11\xD3Wa\x11\xD3aO\x94V[\x14a\x11\xF4W`@QcSi\x1DU`\xE1\x1B\x81R`\x04\x81\x01\x82\x90R`$\x01a\x0BgV[`\0a\x01\xF5\x82\x81T\x81\x10a\x12\nWa\x12\naV$V[`\0\x91\x82R` \x90\x91 `\x07`\t\x90\x92\x02\x01\x90\x81\x01\x80T`\xFF\x19\x16`\x04\x17\x90U`\x05\x81\x01T`\x01\x82\x01T\x91\x92Pa\x12L\x91`\x01`\x01`\xA0\x1B\x03\x90\x91\x16\x90a.\x98V[`@Q\x82\x90\x7FZ\xB6\xD2\x180;\xD8\xDC\x01\xC2\xC5\xE8\x12\xDC\xBB\xAD\xCF\xC2\xEB[\x1F\xB9\x11\x11\xE0\xB0\xAE\x87\x88\x8A\xC5h\x90`\0\x90\xA2Pa\x12\x80a.rV[PV[`\0a\x12\x8Da-\xC1V[`\0a\x01\xF5\x83\x81T\x81\x10a\x12\xA3Wa\x12\xA3aV$V[`\0\x91\x82R` \x90\x91 `@\x80Qa\x01`\x81\x01\x90\x91R`\t\x90\x92\x02\x01\x80T`\x80\x83\x01\x90\x81R`\x01\x82\x01T`\xA0\x84\x01R`\x02\x82\x01T`\xC0\x84\x01R`\x03\x82\x01T`\xE0\x84\x01R`\x04\x82\x01Ta\x01\0\x84\x01R`\x05\x82\x01T`\x01`\x01`\xA0\x1B\x03\x16a\x01 \x84\x01R`\x06\x82\x01\x80T\x84\x92\x91\x84\x91a\x01@\x85\x01\x91\x90a\x13 \x90aV:V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\x13L\x90aV:V[\x80\x15a\x13\x99W\x80`\x1F\x10a\x13nWa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\x13\x99V[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\x13|W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPP\x91\x90\x92RPPP\x81R`\x07\x82\x01T` \x90\x91\x01\x90`\xFF\x16`\x05\x81\x11\x15a\x13\xC4Wa\x13\xC4aO\x94V[`\x05\x81\x11\x15a\x13\xD5Wa\x13\xD5aO\x94V[\x81R`\x07\x82\x01T`\x01`\x01`\xA0\x1B\x03a\x01\0\x90\x91\x04\x81\x16` \x83\x01R`\x08\x90\x92\x01T\x90\x91\x16`@\x90\x91\x01R\x90P`\x03a\x14\r\x84a\x1AtV[`\x05\x81\x11\x15a\x14\x1EWa\x14\x1EaO\x94V[\x14a\x14?W`@Qc\r\x94\x85\xF1`\xE0\x1B\x81R`\x04\x81\x01\x84\x90R`$\x01a\x0BgV[``\x81\x01Q`\x01`\x01`\xA0\x1B\x03\x163\x14a\x14oW`@Qc\x10\xDA\x1D\xD3`\xE3\x1B\x81R`\x04\x81\x01\x84\x90R`$\x01a\x0BgV[a\x14\x99\x83\x7F\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\0a.\xD0V[\x91PPa\x14\xA4a.rV[\x91\x90PV[`\0\x90\x81R`\0\x80Q` a^\x03\x839\x81Q\x91R` R`@\x90 `\x01\x01T\x90V[a\x14\xD4\x82a\x14\xA9V[a\x14\xDD\x81a0 V[a\x14\xE7\x83\x83a0*V[PPPPV[`\x01`\x01`\xA0\x1B\x03\x81\x163\x14a\x15\x16W`@Qc3K\xD9\x19`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x15 \x82\x82a0\xCFV[PPPV[`\0\x80Q` a]\xE3\x839\x81Q\x91Ra\x15=\x81a0 V[a\x12\x80a1KV[`\0a\x01\xF4\x86\x81T\x81\x10a\x15[Wa\x15[aV$V[`\0\x91\x82R` \x91\x82\x90 `@\x80Q`\xE0\x81\x01\x82R`\x07\x90\x93\x02\x90\x91\x01\x80T`\x01`\x01`\xA0\x1B\x03\x90\x81\x16\x84R`\x01\x82\x01T\x94\x84\x01\x94\x90\x94R`\x02\x81\x01T\x91\x83\x01\x91\x90\x91R`\x03\x81\x01T``\x83\x01R`\x04\x81\x01T`\x80\x83\x01R`\x05\x81\x01T\x90\x92\x16`\xA0\x82\x01R`\x06\x82\x01\x80T\x91\x92\x91`\xC0\x84\x01\x91\x90a\x15\xD8\x90aV:V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\x16\x04\x90aV:V[\x80\x15a\x16QW\x80`\x1F\x10a\x16&Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\x16QV[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\x164W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81RPP\x90P\x80`\xC0\x01QQ`\0\x03a\x16\x82W`@Qc\x9D\xB8\xD5\xB1`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\xA0\x81\x01Q`\x01`\x01`\xA0\x1B\x03\x163`\x01`\x01`\xA0\x1B\x03\x16\x14a\x16\xB8W`@Qc8\x99:I`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x83\x15a\x18\xAFWa\x16\xCB\x81` \x01Qa,\xF3V[a\x16\xE8W`@Qcz\xFC\xEF\x7F`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0[\x84\x81\x10\x15a\x18\xADW`\0a\x16\xFE\x88a-JV[\x90P`\0a\x17\x17\x88\x88\x85\x81\x81\x10a\x0B$Wa\x0B$aV$V[`@Qc5\xAD\x90\xD3`\xE1\x1B\x81R`\x04\x81\x01\x82\x90R`$\x81\x01\x84\x90R\x90\x91P\x7F\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`\x01`\x01`\xA0\x1B\x03\x16\x90ck[!\xA6\x90`D\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x17\x86W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x17\xAA\x91\x90aV\xB4V[\x15a\x17\xD2W`@Qc\xC6D\xD0G`\xE0\x1B\x81R`\x04\x81\x01\x82\x90R`$\x81\x01\x83\x90R`D\x01a\x0BgV[\x7F\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`\x01`\x01`\xA0\x1B\x03\x16c\xFF\x11J\xE1\x83\x8A\x8A\x87\x81\x81\x10a\x18\x14Wa\x18\x14aV$V[\x90P` \x02\x81\x01\x90a\x18&\x91\x90aVnV[`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x18D\x93\x92\x91\x90aV\xFFV[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x18^W`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x18rW=`\0\x80>=`\0\xFD[PP`@Q\x83\x92P\x8B\x91P\x7F8\xCF^\xF7\xF2\x11\xD49\x83\xAFl\x03\xC4c\x89\x17\xEB\xDE;\x9CR\xD9hf\xF3G%\xC3\x92\x8E:{\x90`\0\x90\xA3PP`\x01\x01a\x16\xEBV[P[`\0[\x82\x81\x10\x15a\rNW`\0a\x18\xC5\x88a-\x92V[\x90P`\0a\x18\xDE\x86\x86\x85\x81\x81\x10a\x0B$Wa\x0B$aV$V[`@Qc5\xAD\x90\xD3`\xE1\x1B\x81R`\x04\x81\x01\x82\x90R`$\x81\x01\x84\x90R\x90\x91P\x7F\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`\x01`\x01`\xA0\x1B\x03\x16\x90ck[!\xA6\x90`D\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x19MW=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x19q\x91\x90aV\xB4V[\x15a\x19\x99W`@Qc\xC6D\xD0G`\xE0\x1B\x81R`\x04\x81\x01\x82\x90R`$\x81\x01\x83\x90R`D\x01a\x0BgV[\x7F\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`\x01`\x01`\xA0\x1B\x03\x16c\xFF\x11J\xE1\x83\x88\x88\x87\x81\x81\x10a\x19\xDBWa\x19\xDBaV$V[\x90P` \x02\x81\x01\x90a\x19\xED\x91\x90aVnV[`@Q\x84c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x1A\x0B\x93\x92\x91\x90aV\xFFV[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x1A%W`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x1A9W=`\0\x80>=`\0\xFD[PP`@Q\x83\x92P\x8B\x91P\x7F\xE8\xF7\xC0*\xA8\xD1\xF6M$\\\xCF\x16+\xC7\x7F\x17\x1D\xD86\xDFD\n\xC9\xA6\xB67!D^\xBEU\x89\x90`\0\x90\xA3PP`\x01\x01a\x18\xB2V[`\0\x80a\x01\xF5\x83\x81T\x81\x10a\x1A\x8BWa\x1A\x8BaV$V[`\0\x91\x82R` \x90\x91 `@\x80Qa\x01`\x81\x01\x90\x91R`\t\x90\x92\x02\x01\x80T`\x80\x83\x01\x90\x81R`\x01\x82\x01T`\xA0\x84\x01R`\x02\x82\x01T`\xC0\x84\x01R`\x03\x82\x01T`\xE0\x84\x01R`\x04\x82\x01Ta\x01\0\x84\x01R`\x05\x82\x01T`\x01`\x01`\xA0\x1B\x03\x16a\x01 \x84\x01R`\x06\x82\x01\x80T\x84\x92\x91\x84\x91a\x01@\x85\x01\x91\x90a\x1B\x08\x90aV:V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\x1B4\x90aV:V[\x80\x15a\x1B\x81W\x80`\x1F\x10a\x1BVWa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\x1B\x81V[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\x1BdW\x82\x90\x03`\x1F\x16\x82\x01\x91[PPP\x91\x90\x92RPPP\x81R`\x07\x82\x01T` \x90\x91\x01\x90`\xFF\x16`\x05\x81\x11\x15a\x1B\xACWa\x1B\xACaO\x94V[`\x05\x81\x11\x15a\x1B\xBDWa\x1B\xBDaO\x94V[\x81R`\x07\x82\x01T`\x01`\x01`\xA0\x1B\x03a\x01\0\x90\x91\x04\x81\x16` \x83\x01R`\x08\x90\x92\x01T\x90\x91\x16`@\x90\x91\x01R\x90P`\x01\x81` \x01Q`\x05\x81\x11\x15a\x1C\x02Wa\x1C\x02aO\x94V[\x03a\x1C'W\x80Q`@\x01QC\x10\x15a\x1C\x1EW` \x01Q\x92\x91PPV[P`\x02\x92\x91PPV[`\x03\x81` \x01Q`\x05\x81\x11\x15a\x1C?Wa\x1C?aO\x94V[\x03a\x1CcW\x80Q`\x80\x01QC\x11\x15a\x1CZWP`\x05\x92\x91PPV[P`\x03\x92\x91PPV[` \x01Q\x92\x91PPV[a\x1Cua1\xABV[a\x1C~\x82a2RV[a\x1C\x88\x82\x82a2]V[PPV[a\x1C\x94a-\xC1V[\x7F\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`\x01`\x01`\xA0\x1B\x03\x16cr\x10Z\xAFa\x1C\xDA`\0\x80Q` a^C\x839\x81Q\x91Ra3\x1AV[3`@Q`\x01`\x01`\xE0\x1B\x03\x19`\xE0\x85\x90\x1B\x16\x81R`\x04\x81\x01\x92\x90\x92R`\x01`\x01`\xA0\x1B\x03\x16`$\x82\x01R`D\x01`\0`@Q\x80\x83\x03\x81\x86\x80;\x15\x80\x15a\x1D W`\0\x80\xFD[PZ\xFA\x15\x80\x15a\x1D4W=`\0\x80>=`\0\xFD[PPPPa\x1Dy\x84\x84\x84\x84\x80\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x93\x92\x91\x90\x81\x81R` \x01\x83\x83\x80\x82\x847`\0\x92\x01\x91\x90\x91RPa3/\x92PPPV[a\x14\xE7a.rV[`\0a\x1D\x8Ba5\xB5V[P`\0\x80Q` a]\xC3\x839\x81Q\x91R\x90V[a\x1D\xA6a-\xC1V[\x82Q\x81\x14a\x1D\xC7W`@Qc\xC2\x1F\xE6\xBF`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0[\x83Q\x81\x10\x15a\x1E!Wa\x1E\x19\x84\x82\x81Q\x81\x10a\x1D\xE8Wa\x1D\xE8aV$V[` \x02` \x01\x01Q\x84\x84\x84\x81\x81\x10a\x1E\x02Wa\x1E\x02aV$V[\x90P` \x02\x81\x01\x90a\x1E\x14\x91\x90aVnV[a5\xFEV[`\x01\x01a\x1D\xCAV[Pa\x15 a.rV[`\0\x80Q` a]\xE3\x839\x81Q\x91Ra\x1EB\x81a0 V[0a\x1EO\x85\x85\x85\x84a:\xACV[\x7F\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`\x01`\x01`\xA0\x1B\x03\x16ci\xFD\xBC\xCA\x82`\0a\x1E\x8A\x89a;oV[\x89`@Q\x85c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x1E\xAA\x94\x93\x92\x91\x90aXeV[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x1E\xC4W`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x1E\xD8W=`\0\x80>=`\0\xFD[PPPPPPPPPV[a\x01\xF5\x81\x81T\x81\x10a\x1E\xF4W`\0\x80\xFD[`\0\x91\x82R` \x91\x82\x90 `@\x80Q`\xE0\x81\x01\x82R`\t\x90\x93\x02\x90\x91\x01\x80T\x83R`\x01\x81\x01T\x93\x83\x01\x93\x90\x93R`\x02\x83\x01T\x90\x82\x01R`\x03\x82\x01T``\x82\x01R`\x04\x82\x01T`\x80\x82\x01R`\x05\x82\x01T`\x01`\x01`\xA0\x1B\x03\x16`\xA0\x82\x01R`\x06\x82\x01\x80T\x92\x93P\x90\x91\x83\x91`\xC0\x84\x01\x91a\x1Fl\x90aV:V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\x1F\x98\x90aV:V[\x80\x15a\x1F\xE5W\x80`\x1F\x10a\x1F\xBAWa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\x1F\xE5V[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\x1F\xC8W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPP\x91\x90\x92RPPP`\x07\x82\x01T`\x08\x90\x92\x01T\x90\x91`\xFF\x81\x16\x91`\x01`\x01`\xA0\x1B\x03a\x01\0\x90\x92\x04\x82\x16\x91\x16\x84V[`\0a a-\xC1V[`\x05a +\x84a\x1AtV[`\x05\x81\x11\x15a #\xA9f.\xFC\x9C\"\x9Cj\0\x80T`\x01`@\x1B\x81\x04`\xFF\x16\x15\x90`\x01`\x01`@\x1B\x03\x16`\0\x81\x15\x80\x15a$\xA5WP\x82[\x90P`\0\x82`\x01`\x01`@\x1B\x03\x16`\x01\x14\x80\x15a$\xC1WP0;\x15[\x90P\x81\x15\x80\x15a$\xCFWP\x80\x15[\x15a$\xEDW`@Qc\xF9.\xE8\xA9`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x84Tg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x19\x16`\x01\x17\x85U\x83\x15a%\x17W\x84T`\xFF`@\x1B\x19\x16`\x01`@\x1B\x17\x85U[a%\x1FaB=`\0\xFD[a&n\x82a\x14\xA9V[a&w\x81a0 V[a\x14\xE7\x83\x83a0\xCFV[a&\x89a-\xC1V[\x84Q\x86Q\x14\x15\x80a&\x9BWP\x84Q\x83\x14\x15[\x15a&\xB9W`@Qc\xC2\x1F\xE6\xBF`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0\x86\x86\x86\x86`@Q` \x01a&\xD2\x94\x93\x92\x91\x90aYBV[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 \x90P`\0a&\xF5\x82aB\xAFV[\x90P`\0a'9\x82\x86\x86\x80\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x93\x92\x91\x90\x81\x81R` \x01\x83\x83\x80\x82\x847`\0\x92\x01\x91\x90\x91RPaB\xEA\x92PPPV[\x90P\x7F\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`\x01`\x01`\xA0\x1B\x03\x16cr\x10Z\xAFa'\x81`\0\x80Q` a^C\x839\x81Q\x91Ra3\x1AV[`@Q`\x01`\x01`\xE0\x1B\x03\x19`\xE0\x84\x90\x1B\x16\x81R`\x04\x81\x01\x91\x90\x91R`\x01`\x01`\xA0\x1B\x03\x84\x16`$\x82\x01R`D\x01`\0`@Q\x80\x83\x03\x81\x86\x80;\x15\x80\x15a'\xC7W`\0\x80\xFD[PZ\xFA\x15\x80\x15a'\xDBW=`\0\x80>=`\0\xFD[PPPP`\0[\x89Q\x81\x10\x15a(\x88Wa(\x80\x8A\x82\x81Q\x81\x10a(\0Wa(\0aV$V[` \x02` \x01\x01Q\x8A\x83\x81Q\x81\x10a(\x1AWa(\x1AaV$V[` \x02` \x01\x01Q\x8A\x8A\x85\x81\x81\x10a(4Wa(4aV$V[\x90P` \x02\x81\x01\x90a(F\x91\x90aVnV[\x80\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x93\x92\x91\x90\x81\x81R` \x01\x83\x83\x80\x82\x847`\0\x92\x01\x91\x90\x91RPa3/\x92PPPV[`\x01\x01a'\xE2V[PPPPa \x98a.rV[a(\x9Ca-\xC1V[`\0a\x01\xF5\x84\x81T\x81\x10a(\xB2Wa(\xB2aV$V[`\0\x91\x82R` \x90\x91 `@\x80Qa\x01`\x81\x01\x90\x91R`\t\x90\x92\x02\x01\x80T`\x80\x83\x01\x90\x81R`\x01\x82\x01T`\xA0\x84\x01R`\x02\x82\x01T`\xC0\x84\x01R`\x03\x82\x01T`\xE0\x84\x01R`\x04\x82\x01Ta\x01\0\x84\x01R`\x05\x82\x01T`\x01`\x01`\xA0\x1B\x03\x16a\x01 \x84\x01R`\x06\x82\x01\x80T\x84\x92\x91\x84\x91a\x01@\x85\x01\x91\x90a)/\x90aV:V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta)[\x90aV:V[\x80\x15a)\xA8W\x80`\x1F\x10a)}Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a)\xA8V[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a)\x8BW\x82\x90\x03`\x1F\x16\x82\x01\x91[PPP\x91\x90\x92RPPP\x81R`\x07\x82\x01T` \x90\x91\x01\x90`\xFF\x16`\x05\x81\x11\x15a)\xD3Wa)\xD3aO\x94V[`\x05\x81\x11\x15a)\xE4Wa)\xE4aO\x94V[\x81R`\x07\x82\x01T`\x01`\x01`\xA0\x1B\x03a\x01\0\x90\x91\x04\x81\x16` \x83\x01R`\x08\x90\x92\x01T\x90\x91\x16`@\x90\x91\x01R\x80QQa\x01\xF4\x80T\x92\x93P\x90\x91`\0\x91\x90\x83\x90\x81\x10a*0Wa*0aV$V[`\0\x91\x82R` \x91\x82\x90 `@\x80Q`\xE0\x81\x01\x82R`\x07\x90\x93\x02\x90\x91\x01\x80T`\x01`\x01`\xA0\x1B\x03\x90\x81\x16\x84R`\x01\x82\x01T\x94\x84\x01\x94\x90\x94R`\x02\x81\x01T\x91\x83\x01\x91\x90\x91R`\x03\x81\x01T``\x83\x01R`\x04\x81\x01T`\x80\x83\x01R`\x05\x81\x01T\x90\x92\x16`\xA0\x82\x01R`\x06\x82\x01\x80T\x91\x92\x91`\xC0\x84\x01\x91\x90a*\xAD\x90aV:V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta*\xD9\x90aV:V[\x80\x15a+&W\x80`\x1F\x10a*\xFBWa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a+&V[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a+\tW\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81RPP\x90P`\0\x80a+>\x88\x86aC\x14V[\x91P\x91Pa+\x96\x88\x86`\0\x01Q`\xC0\x01Q\x89\x89\x80\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x93\x92\x91\x90\x81\x81R` \x01\x83\x83\x80\x82\x847`\0\x92\x01\x91\x90\x91RPa+\x91\x92P\x8A\x91Pa-\x92\x90PV[aD-V[a+\xB6W`@Qc@i\xAF=`\xE1\x1B\x81R`\x04\x81\x01\x89\x90R`$\x01a\x0BgV[a+\xC8\x88\x86\x84\x84\x88\x88`@\x01QaE6V[PPPPPa\x15 a.rV[a\x01\xF4\x81\x81T\x81\x10a+\xE6W`\0\x80\xFD[`\0\x91\x82R` \x90\x91 `\x07\x90\x91\x02\x01\x80T`\x01\x82\x01T`\x02\x83\x01T`\x03\x84\x01T`\x04\x85\x01T`\x05\x86\x01T`\x06\x87\x01\x80T`\x01`\x01`\xA0\x1B\x03\x97\x88\x16\x99P\x95\x97\x94\x96\x93\x95\x92\x94\x93\x90\x91\x16\x92\x91a,;\x90aV:V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta,g\x90aV:V[\x80\x15a,\xB4W\x80`\x1F\x10a,\x89Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a,\xB4V[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a,\x97W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x90P\x87V[`\0`\x01`\x01`\xE0\x1B\x03\x19\x82\x16cye\xDB\x0B`\xE0\x1B\x14\x80a\tYWPc\x01\xFF\xC9\xA7`\xE0\x1B`\x01`\x01`\xE0\x1B\x03\x19\x83\x16\x14a\tYV[`\0\x81\x15\x80a-!WP\x7F\xCD.f\xBF\x0B\x91\xEE\xED\xC6\xC6H\xAE\x935\xA7\x8D|\x9AJ\xB0\xEF3a*\x82M\x91\xCD\xC6\x8AO!\x82\x14[\x15\x92\x91PPV[`\0\x80\x80\x80a-9\x85\x87\x01\x87aY\xD7V[\x92P\x92P\x92Pa\x11\xA5\x83\x83\x83aF\xC9V[`@\x80Q` \x81\x01\x82\x90R`\x03``\x82\x01Rb3\xB2\xB7`\xE9\x1B`\x80\x82\x01R\x90\x81\x01\x82\x90R`\0\x90`\xA0\x01[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 \x90P\x91\x90PV[`@\x80Q` \x81\x01\x82\x90R`\x03``\x82\x01Rbivs`\xE8\x1B`\x80\x82\x01R\x90\x81\x01\x82\x90R`\0\x90`\xA0\x01a-uV[\x7F\x9Bw\x9B\x17B-\r\xF9\"#\x01\x8B2\xB4\xD1\xFAF\xE0qr=h\x17\xE2Hm\0;\xEC\xC5_\0\x80T`\x01\x19\x01a.\x05W`@Qc>\xE5\xAE\xB5`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x02\x90UV[`@Q`\x01`\x01`\xA0\x1B\x03\x84\x81\x16`$\x83\x01R\x83\x81\x16`D\x83\x01R`d\x82\x01\x83\x90Ra\x14\xE7\x91\x86\x91\x82\x16\x90c#\xB8r\xDD\x90`\x84\x01[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x91P`\xE0\x1B` \x82\x01\x80Q`\x01`\x01`\xE0\x1B\x03\x83\x81\x83\x16\x17\x83RPPPPaG\x04V[`\x01\x7F\x9Bw\x9B\x17B-\r\xF9\"#\x01\x8B2\xB4\xD1\xFAF\xE0qr=h\x17\xE2Hm\0;\xEC\xC5_\0UV[\x80\x15a\x1C\x88W`\x01`\x01`\xA0\x1B\x03\x82\x16`\0\x90\x81Ra\x01\xF8` R`@\x81 \x80T\x83\x92\x90a.\xC7\x90\x84\x90aW/V[\x90\x91UPPPPV[`\0\x80a\x01\xF5\x84\x81T\x81\x10a.\xE7Wa.\xE7aV$V[`\0\x91\x82R` \x90\x91 `\x07`\t\x90\x92\x02\x01\x90\x81\x01\x80T`\xFF\x19\x16`\x04\x17\x90U\x80T`\x05\x82\x01T`\x01\x83\x01T\x92\x93P\x90\x91a/+\x91`\x01`\x01`\xA0\x1B\x03\x16\x90a.\x98V[`@Q\x85\x90\x7F\xD6\xD7\xF87\xB6\x8A\xE9j\xF4v\xF0D{\xBEK\xE0`\xB2\x06B\xEB\xDFG\x08T\xF7\x01\xCA]\x8F^\xFB\x90`\0\x90\xA2`\x08\x82\x01T`\x01`\x01`\xA0\x1B\x03\x7F\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\x81\x16\x91c\xEA\xAC\xAE\x94\x91\x16\x83a/\x98\x81aGuV[`@Q`\x01`\x01`\xE0\x1B\x03\x19`\xE0\x86\x90\x1B\x16\x81R`\x01`\x01`\xA0\x1B\x03\x93\x84\x16`\x04\x82\x01R`$\x81\x01\x92\x90\x92R`D\x82\x01R\x90\x87\x16`d\x82\x01R`\x84\x01` `@Q\x80\x83\x03\x81`\0\x87Z\xF1\x15\x80\x15a/\xF3W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a0\x17\x91\x90aZhV[\x95\x94PPPPPV[a\x12\x80\x813aG\xA4V[`\0`\0\x80Q` a^\x03\x839\x81Q\x91Ra0E\x84\x84a#yV[a0\xC5W`\0\x84\x81R` \x82\x81R`@\x80\x83 `\x01`\x01`\xA0\x1B\x03\x87\x16\x84R\x90\x91R\x90 \x80T`\xFF\x19\x16`\x01\x17\x90Ua0{3\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x83`\x01`\x01`\xA0\x1B\x03\x16\x85\x7F/\x87\x88\x11~~\xFF\x1D\x82\xE9&\xECyI\x01\xD1|x\x02JP'\t@0E@\xA73eo\r`@Q`@Q\x80\x91\x03\x90\xA4`\x01\x91PPa\tYV[`\0\x91PPa\tYV[`\0`\0\x80Q` a^\x03\x839\x81Q\x91Ra0\xEA\x84\x84a#yV[\x15a0\xC5W`\0\x84\x81R` \x82\x81R`@\x80\x83 `\x01`\x01`\xA0\x1B\x03\x87\x16\x80\x85R\x92R\x80\x83 \x80T`\xFF\x19\x16\x90UQ3\x92\x87\x91\x7F\xF69\x1F\\2\xD9\xC6\x9D*G\xEAg\x0BD)t\xB595\xD1\xED\xC7\xFDd\xEB!\xE0G\xA89\x17\x1B\x91\x90\xA4`\x01\x91PPa\tYV[a1SaG\xDDV[`\0\x80Q` a^#\x839\x81Q\x91R\x80T`\xFF\x19\x16\x81U\x7F]\xB9\xEE\nI[\xF2\xE6\xFF\x9C\x91\xA7\x83L\x1B\xA4\xFD\xD2D\xA5\xE8\xAANS{\xD3\x8A\xEA\xE4\xB0s\xAA3[`@Q`\x01`\x01`\xA0\x1B\x03\x90\x91\x16\x81R` \x01`@Q\x80\x91\x03\x90\xA1PV[0`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x14\x80a22WP\x7F\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`\x01`\x01`\xA0\x1B\x03\x16a2&`\0\x80Q` a]\xC3\x839\x81Q\x91RT`\x01`\x01`\xA0\x1B\x03\x16\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x14\x15[\x15a2PW`@Qcp>F\xDD`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[`\0a\x1C\x88\x81a0 V[\x81`\x01`\x01`\xA0\x1B\x03\x16cR\xD1\x90-`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x92PPP\x80\x15a2\xB7WP`@\x80Q`\x1F=\x90\x81\x01`\x1F\x19\x16\x82\x01\x90\x92Ra2\xB4\x91\x81\x01\x90aZhV[`\x01[a2\xDFW`@QcL\x9C\x8C\xE3`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x83\x16`\x04\x82\x01R`$\x01a\x0BgV[`\0\x80Q` a]\xC3\x839\x81Q\x91R\x81\x14a3\x10W`@Qc*\x87Ri`\xE2\x1B\x81R`\x04\x81\x01\x82\x90R`$\x01a\x0BgV[a\x15 \x83\x83aH\rV[`\0\x81`@Q` \x01a-u\x91\x81R` \x01\x90V[`\x01a3:\x84a\x1AtV[`\x05\x81\x11\x15a3KWa3KaO\x94V[\x14a3iW`@Qc>[N\x85`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0a\x01\xF5\x84\x81T\x81\x10a3\x7FWa3\x7FaV$V[`\0\x91\x82R` \x82 `\t\x90\x91\x02\x01\x80T`@Qc\x1C~\xAEe`\xE0\x1B\x81R\x91\x93P\x82\x91`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x91c\x1C~\xAEe\x91a3\xF5\x91\x89\x91`\x04\x01`\x01`\x01`\xA0\x1B\x03\x92\x90\x92\x16\x82R` \x82\x01R`@\x01\x90V[`@\x80Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a4\x11W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a45\x91\x90aZ\x81V[\x91P\x91P\x81\x83`\0\x01`\x01\x01T\x10\x15a4dW`@Qcb]\xAA\x9D`\xE1\x1B\x81R`\x04\x81\x01\x87\x90R`$\x01a\x0BgV[`\x03\x83\x01T\x81\x11\x15a4\x8CW`@Qc\xF8O\xAAI`\xE0\x1B\x81R`\x04\x81\x01\x87\x90R`$\x01a\x0BgV[`\x07\x83\x01\x80T`\xFF\x19\x16`\x03\x90\x81\x17\x90\x91U\x83\x01Ta4\xAB\x90CaW/V[`\x04\x84\x01U`\x08\x83\x01\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16`\x01`\x01`\xA0\x1B\x03\x87\x16\x17\x90U\x82T`\0\x90a4\xDB\x90aGuV[\x84T`@Qc\xC4\x92\xEE9`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x89\x81\x16`\x04\x83\x01R`$\x82\x01\x92\x90\x92R`D\x81\x01\x83\x90R\x91\x92P\x7F\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\x16\x90c\xC4\x92\xEE9\x90`d\x01`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a5RW`\0\x80\xFD[PZ\xF1\x15\x80\x15a5fW=`\0\x80>=`\0\xFD[PPPP\x85`\x01`\x01`\xA0\x1B\x03\x16\x87\x7Fz|\xD4\x1C\xAD_<\xCC\xFD\xCEH\xDFr\x08E\xB6\xFE\x81g\x85;'\xBA\x03\x1D\x99\x98\xE2\x05\xEB\x1D\xD9\x87`@Qa5\xA4\x91\x90aT\\V[`@Q\x80\x91\x03\x90\xA3PPPPPPPV[0`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x14a2PW`@Qcp>F\xDD`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0a\x01\xF5\x84\x81T\x81\x10a6\x14Wa6\x14aV$V[`\0\x91\x82R` \x90\x91 `@\x80Qa\x01`\x81\x01\x90\x91R`\t\x90\x92\x02\x01\x80T`\x80\x83\x01\x90\x81R`\x01\x82\x01T`\xA0\x84\x01R`\x02\x82\x01T`\xC0\x84\x01R`\x03\x82\x01T`\xE0\x84\x01R`\x04\x82\x01Ta\x01\0\x84\x01R`\x05\x82\x01T`\x01`\x01`\xA0\x1B\x03\x16a\x01 \x84\x01R`\x06\x82\x01\x80T\x84\x92\x91\x84\x91a\x01@\x85\x01\x91\x90a6\x91\x90aV:V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta6\xBD\x90aV:V[\x80\x15a7\nW\x80`\x1F\x10a6\xDFWa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a7\nV[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a6\xEDW\x82\x90\x03`\x1F\x16\x82\x01\x91[PPP\x91\x90\x92RPPP\x81R`\x07\x82\x01T` \x90\x91\x01\x90`\xFF\x16`\x05\x81\x11\x15a75Wa75aO\x94V[`\x05\x81\x11\x15a7FWa7FaO\x94V[\x81R`\x07\x82\x01Ta\x01\0\x90\x04`\x01`\x01`\xA0\x1B\x03\x90\x81\x16` \x83\x01R`\x08\x90\x92\x01T\x82\x16`@\x91\x82\x01R\x82QQ``\x84\x01Q\x91Qc+a\x0C-`\xE0\x1B\x81R\x91\x83\x16`\x04\x83\x01R`$\x82\x01\x81\x90R\x92\x93P`\0\x91\x82\x91\x7F\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\x90\x91\x16\x90c+a\x0C-\x90`D\x01`@\x80Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a7\xE5W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a8\t\x91\x90aZ\xA5V[\x90\x92P\x90P`\x01`\x01`\xA0\x1B\x03\x82\x16a85W`@Qc\x1E\x1D\n\xB5`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x03a8@\x88a\x1AtV[`\x05\x81\x11\x15a8QWa8QaO\x94V[\x14a8rW`@Qc\x16\xF2\xD8?`\xE0\x1B\x81R`\x04\x81\x01\x88\x90R`$\x01a\x0BgV[\x83Q`\xC0\x01Q`@Q`\0\x91a8\x8E\x91\x89\x90\x89\x90` \x01aZ\xD3V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x90Pa\x01\xF4\x84\x81T\x81\x10a8\xB3Wa8\xB3aV$V[`\0\x91\x82R` \x90\x91 `\x07\x90\x91\x02\x01T`@QcG;\x05\x7F`\xE1\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x90\x91\x16\x90c\x8Ev\n\xFE\x90a8\xF1\x90\x84\x90`\x04\x01aT\\V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a9\x0EW=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a92\x91\x90aV\xB4V[a9RW`@Qc^?\xA0Q`\xE0\x1B\x81R`\x04\x81\x01\x89\x90R`$\x01a\x0BgV[`\x04a\x01\xF5\x89\x81T\x81\x10a9hWa9haV$V[`\0\x91\x82R` \x90\x91 `\x07`\t\x90\x92\x02\x01\x01\x80T`\xFF\x19\x16`\x01\x83`\x05\x81\x11\x15a9\x95Wa9\x95aO\x94V[\x02\x17\x90UP\x84Q` \x01Q`\0\x90a9\xAE\x90\x84\x90aZ\xF9V[\x90Pa9\xBA\x84\x84a.\x98V[\x85Q`\xA0\x01Qa9\xCA\x90\x82a.\x98V[`\0a9\xD5\x86aGuV[``\x88\x01Q`@Qc\x98*A]`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x91\x82\x16`\x04\x82\x01R`$\x81\x01\x89\x90R`D\x81\x01\x83\x90R\x91\x92P\x7F\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\x16\x90c\x98*A]\x90`d\x01`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a:NW`\0\x80\xFD[PZ\xF1\x15\x80\x15a:bW=`\0\x80>=`\0\xFD[PPPP\x89\x7F\x8F\xDDxa\x98\x04'\x96\x0FCy\x10\xD2\x0Bx\xBE7P6\xB3\x1F\x97\xEF\"\xA8\x04\x0F \xE4]+\xA2\x8A\x8A`@Qa:\x98\x92\x91\x90a[\x0CV[`@Q\x80\x91\x03\x90\xA2PPPPPPPPPPV[`\0\x84\x82`@Q` \x01a:\xC1\x92\x91\x90a[(V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 \x90P`\0a:\xE4\x82aB\xAFV[\x90P`\0a;(\x82\x87\x87\x80\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x93\x92\x91\x90\x81\x81R` \x01\x83\x83\x80\x82\x847`\0\x92\x01\x91\x90\x91RPaB\xEA\x92PPPV[\x90Pa;3\x87aHcV[`\x01`\x01`\xA0\x1B\x03\x16\x81`\x01`\x01`\xA0\x1B\x03\x16\x14a\rNW`@Qc(\x80\xCB\x7F`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x82\x16`\x04\x82\x01R`$\x01a\x0BgV[```\0\x82\x80` \x01\x90Q\x81\x01\x90a;\x87\x91\x90a[\x97V[P\x94\x99\x98PPPPPPPPPV[`\0\x80Q` a^#\x839\x81Q\x91RT`\xFF\x16\x15a2PW`@Qc\xD9<\x06e`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[` \x87\x015\x15\x80a;\xE4WPa;\xE0`\xC0\x88\x01\x88aVnV[\x15\x90P[\x15a<\x02W`@Qc\x1E\x1D\n\xB5`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x01\xF7`\0\x86`\x02\x81\x11\x15a<\x19Wa<\x19aO\x94V[`\x02\x81\x11\x15a<*Wa<*aO\x94V[\x81R` \x01\x90\x81R` \x01`\0 TCa \x880a=\xEE\x84` \x8E\x015aW/V[`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x92\x91\x90a.\x0BV[a>J\x7F\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\x82a.\x98V[\x81`\xC0\x01QQ`\0\x03a>pW`@Qc\x9D\xB8\xD5\xB1`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x01\xF5T`@\x80Q`\x80\x81\x01\x90\x91R`\0\x90\x80a>\x8C\x8Da\\\x9BV[\x81R` \x01`\x01\x81R3` \x80\x83\x01\x91\x90\x91R`\0`@\x92\x83\x01\x81\x90Ra\x01\xF5\x80T`\x01\x81\x01\x82U\x91R\x83Q\x80Q\x7FsL\xCD\xFE\xCF\x0C\x98\xF1\xF6\x10\xE1>\x82\x1E\xEA\xAB\x95\xDC\x92\x18K\xA0\x90\x03*\xB8\xCFTJ(\xF1g`\t\x90\x93\x02\x92\x83\x01\x90\x81U\x92\x81\x01Q\x7FsL\xCD\xFE\xCF\x0C\x98\xF1\xF6\x10\xE1>\x82\x1E\xEA\xAB\x95\xDC\x92\x18K\xA0\x90\x03*\xB8\xCFTJ(\xF1h\x83\x01U\x92\x83\x01Q\x7FsL\xCD\xFE\xCF\x0C\x98\xF1\xF6\x10\xE1>\x82\x1E\xEA\xAB\x95\xDC\x92\x18K\xA0\x90\x03*\xB8\xCFTJ(\xF1i\x82\x01U``\x83\x01Q\x7FsL\xCD\xFE\xCF\x0C\x98\xF1\xF6\x10\xE1>\x82\x1E\xEA\xAB\x95\xDC\x92\x18K\xA0\x90\x03*\xB8\xCFTJ(\xF1j\x82\x01U`\x80\x83\x01Q\x7FsL\xCD\xFE\xCF\x0C\x98\xF1\xF6\x10\xE1>\x82\x1E\xEA\xAB\x95\xDC\x92\x18K\xA0\x90\x03*\xB8\xCFTJ(\xF1k\x82\x01U`\xA0\x83\x01Q\x7FsL\xCD\xFE\xCF\x0C\x98\xF1\xF6\x10\xE1>\x82\x1E\xEA\xAB\x95\xDC\x92\x18K\xA0\x90\x03*\xB8\xCFTJ(\xF1l\x82\x01\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16`\x01`\x01`\xA0\x1B\x03\x90\x92\x16\x91\x90\x91\x17\x90U`\xC0\x83\x01Q\x93\x94P\x84\x93\x91\x92\x91\x83\x91\x7FsL\xCD\xFE\xCF\x0C\x98\xF1\xF6\x10\xE1>\x82\x1E\xEA\xAB\x95\xDC\x92\x18K\xA0\x90\x03*\xB8\xCFTJ(\xF1m\x01\x90a@\t\x90\x82aW\x90V[PPP` \x82\x01Q`\x07\x82\x01\x80T`\xFF\x19\x16`\x01\x83`\x05\x81\x11\x15a@/Wa@/aO\x94V[\x02\x17\x90UP`@\x82\x01Q`\x07\x82\x01\x80Ta\x01\0`\x01`\xA8\x1B\x03\x19\x16a\x01\0`\x01`\x01`\xA0\x1B\x03\x93\x84\x16\x02\x17\x90U``\x90\x92\x01Q`\x08\x90\x91\x01\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16\x91\x83\x16\x91\x90\x91\x17\x90U\x84Q\x90\x81\x16c\xA6\xDF\xBC\x7Fa@\x93`\xC0\x8F\x01\x8FaVnV[`@Q\x83c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a@\xB0\x92\x91\x90a[\x0CV[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a@\xCDW=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a@\xF1\x91\x90aV\xB4V[aA\x0EW`@Qcy\xA6}[`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[aA\x1B\x85` \x01Qa,\xF3V[\x15aAgW`\x01\x15\x15\x83\x7F{\xBF\xCEe5\x8CD\xB5\x98\xA1\xEE\x0E\xEF\x06<\xE1M\xE0%\x168W\x94\xF6\xB6\x0E\xEAU#\xA96\xE4\x8B\x8B\x8B\x8B`@QaAZ\x94\x93\x92\x91\x90a]#V[`@Q\x80\x91\x03\x90\xA3aA\xB4V[`@\x80Q\x81\x81R`\0\x91\x81\x01\x82\x90R``` \x82\x01\x81\x90R\x81\x01\x82\x90R\x84\x90\x7F{\xBF\xCEe5\x8CD\xB5\x98\xA1\xEE\x0E\xEF\x06<\xE1M\xE0%\x168W\x94\xF6\xB6\x0E\xEAU#\xA96\xE4\x90`\x80\x01`@Q\x80\x91\x03\x90\xA3[PPPPPPPPPPPPV[`@Q`\x01`\x01`\xA0\x1B\x03\x83\x81\x16`$\x83\x01R`D\x82\x01\x83\x90Ra\x15 \x91\x85\x91\x82\x16\x90c\xA9\x05\x9C\xBB\x90`d\x01a.@V[aA\xFBa;\x96V[`\0\x80Q` a^#\x839\x81Q\x91R\x80T`\xFF\x19\x16`\x01\x17\x81U\x7Fb\xE7\x8C\xEA\x01\xBE\xE3 \xCDNB\x02p\xB5\xEAt\0\r\x11\xB0\xC9\xF7GT\xEB\xDB\xFCTK\x05\xA2X3a1\x8DV[a2PaH\x8CV[a.raH\x8CV[`\0\x80Q` a^\x03\x839\x81Q\x91R`\0aBf\x84a\x14\xA9V[`\0\x85\x81R` \x84\x90R`@\x80\x82 `\x01\x01\x86\x90UQ\x91\x92P\x84\x91\x83\x91\x87\x91\x7F\xBDy\xB8o\xFE\n\xB8\xE8waQQB\x17\xCD|\xAC\xD5,\x90\x9FfG\\:\xF4N\x12\x9F\x0B\0\xFF\x91\x90\xA4PPPPV[`@Q\x7F\x19Ethereum Signed Message:\n32\0\0\0\0` \x82\x01R`<\x81\x01\x82\x90R`\0\x90`\\\x01a-uV[`\0\x80`\0\x80aB\xFA\x86\x86aH\xD5V[\x92P\x92P\x92PaC\n\x82\x82aI\"V[P\x90\x94\x93PPPPV[``\x81\x01Q\x81QQ`@Qc+a\x0C-`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x92\x83\x16`\x04\x82\x01R`$\x81\x01\x91\x90\x91R`\0\x91\x82\x91\x82\x91\x82\x91\x7F\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\x90\x91\x16\x90c+a\x0C-\x90`D\x01`@\x80Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15aC\x94W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90aC\xB8\x91\x90aZ\xA5V[\x90\x92P\x90P`\x01`\x01`\xA0\x1B\x03\x82\x16aC\xE4W`@Qc\x1E\x1D\n\xB5`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x03aC\xEF\x87a\x1AtV[`\x05\x81\x11\x15aD\0WaD\0aO\x94V[\x14aD!W`@Qc\x16\xF2\xD8?`\xE0\x1B\x81R`\x04\x81\x01\x87\x90R`$\x01a\x0BgV[\x92P\x90P[\x92P\x92\x90PV[`\0\x80\x85\x85`@Q` \x01aDC\x92\x91\x90a]JV[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 \x90P`\0aDf\x82aB\xAFV[\x90P`\0aDt\x82\x87aB\xEAV[\x90P`\x01`\x01`\xA0\x1B\x03\x81\x16aD\xA8W`@Qc(\x80\xCB\x7F`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x82\x16`\x04\x82\x01R`$\x01a\x0BgV[`@Qcr\x10Z\xAF`\xE0\x1B\x81R`\x04\x81\x01\x86\x90R`\x01`\x01`\xA0\x1B\x03\x82\x81\x16`$\x83\x01R\x7F\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\x16\x90cr\x10Z\xAF\x90`D\x01`\0`@Q\x80\x83\x03\x81\x86\x80;\x15\x80\x15aE\x10W`\0\x80\xFD[PZ\xFA\x15\x80\x15aE$W=`\0\x80>=`\0\xFD[P`\x01\x9B\x9APPPPPPPPPPPV[`\x03aEA\x87a\x1AtV[`\x05\x81\x11\x15aERWaERaO\x94V[\x14aEsW`@Qc\x16\xF2\xD8?`\xE0\x1B\x81R`\x04\x81\x01\x87\x90R`$\x01a\x0BgV[`\x04a\x01\xF5\x87\x81T\x81\x10aE\x89WaE\x89aV$V[`\0\x91\x82R` \x90\x91 `\x07`\t\x90\x92\x02\x01\x01\x80T`\xFF\x19\x16`\x01\x83`\x05\x81\x11\x15aE\xB6WaE\xB6aO\x94V[\x02\x17\x90UP\x84Q` \x01Q`\0\x90aE\xCF\x90\x86\x90aZ\xF9V[\x90PaE\xDB\x84\x86a.\x98V[aF\x05\x7F\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\x82a.\x98V[``\x86\x01Q`@Qc\x98*A]`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x91\x82\x16`\x04\x82\x01R`$\x81\x01\x85\x90R`D\x81\x01\x84\x90R\x7F\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\x90\x91\x16\x90c\x98*A]\x90`d\x01`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15aF}W`\0\x80\xFD[PZ\xF1\x15\x80\x15aF\x91W=`\0\x80>=`\0\xFD[PP`@Q\x89\x92P\x7F\x07\xC3=KV\x06\xE2\xFD \xFB\x9A\xDBp\x06\xCD\xC7\xD4\xAB\x0F0\x80\x90\xDA\xBC\xFDd\xD4\x97\x9C\xD7~*\x91P`\0\x90\xA2PPPPPPPV[`\0\x80\x84\x84\x84`@Q` \x01aF\xE1\x93\x92\x91\x90a]cV[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x80Q` \x90\x91\x01 \x91PP[\x93\x92PPPV[`\0\x80` `\0\x84Q` \x86\x01`\0\x88Z\xF1\x80aG'W`@Q=`\0\x82>=\x81\xFD[PP`\0Q=\x91P\x81\x15aG?W\x80`\x01\x14\x15aGLV[`\x01`\x01`\xA0\x1B\x03\x84\x16;\x15[\x15a\x14\xE7W`@QcRt\xAF\xE7`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x85\x16`\x04\x82\x01R`$\x01a\x0BgV[`\0a\x01\xF4\x82\x81T\x81\x10aG\x8BWaG\x8BaV$V[\x90`\0R` `\0 \x90`\x07\x02\x01`\x02\x01T\x90P\x91\x90PV[aG\xAE\x82\x82a#yV[a\x1C\x88W`@Qc\xE2Q}?`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x82\x16`\x04\x82\x01R`$\x81\x01\x83\x90R`D\x01a\x0BgV[`\0\x80Q` a^#\x839\x81Q\x91RT`\xFF\x16a2PW`@Qc\x8D\xFC +`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[aH\x16\x82aI\xDBV[`@Q`\x01`\x01`\xA0\x1B\x03\x83\x16\x90\x7F\xBC|\xD7Z \xEE'\xFD\x9A\xDE\xBA\xB3 A\xF7U!M\xBCk\xFF\xA9\x0C\xC0\"[9\xDA.\\-;\x90`\0\x90\xA2\x80Q\x15aH[Wa\x15 \x82\x82aJ@V[a\x1C\x88aJ\xADV[`\0\x80\x82\x80` \x01\x90Q\x81\x01\x90aHz\x91\x90a[\x97V[PPPPPP\x91PPaF\xFD\x81aJ\xCCV[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0T`\x01`@\x1B\x90\x04`\xFF\x16a2PW`@Qc\x1A\xFC\xD7\x9F`\xE3\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0\x80`\0\x83Q`A\x03aI\x0FW` \x84\x01Q`@\x85\x01Q``\x86\x01Q`\0\x1AaI\x01\x88\x82\x85\x85aJ\xFCV[\x95P\x95P\x95PPPPaI\x1BV[PP\x81Q`\0\x91P`\x02\x90[\x92P\x92P\x92V[`\0\x82`\x03\x81\x11\x15aI6WaI6aO\x94V[\x03aI?WPPV[`\x01\x82`\x03\x81\x11\x15aISWaISaO\x94V[\x03aIqW`@Qc\xF6E\xEE\xDF`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x02\x82`\x03\x81\x11\x15aI\x85WaI\x85aO\x94V[\x03aI\xA6W`@Qc\xFC\xE6\x98\xF7`\xE0\x1B\x81R`\x04\x81\x01\x82\x90R`$\x01a\x0BgV[`\x03\x82`\x03\x81\x11\x15aI\xBAWaI\xBAaO\x94V[\x03a\x1C\x88W`@Qc5\xE2\xF3\x83`\xE2\x1B\x81R`\x04\x81\x01\x82\x90R`$\x01a\x0BgV[\x80`\x01`\x01`\xA0\x1B\x03\x16;`\0\x03aJ\x11W`@QcL\x9C\x8C\xE3`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x82\x16`\x04\x82\x01R`$\x01a\x0BgV[`\0\x80Q` a]\xC3\x839\x81Q\x91R\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16`\x01`\x01`\xA0\x1B\x03\x92\x90\x92\x16\x91\x90\x91\x17\x90UV[```\0\x80\x84`\x01`\x01`\xA0\x1B\x03\x16\x84`@QaJ]\x91\x90a]\xA6V[`\0`@Q\x80\x83\x03\x81\x85Z\xF4\x91PP=\x80`\0\x81\x14aJ\x98W`@Q\x91P`\x1F\x19`?=\x01\x16\x82\x01`@R=\x82R=`\0` \x84\x01>aJ\x9DV[``\x91P[P\x91P\x91Pa0\x17\x85\x83\x83aK\xCBV[4\x15a2PW`@Qc\xB3\x98\x97\x9F`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0\x81Q`@\x14aJ\xF0W`@Qc\xD2\x833]`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[P\x80Q` \x90\x91\x01 \x90V[`\0\x80\x80\x7F\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF]WnsW\xA4P\x1D\xDF\xE9/Fh\x1B \xA0\x84\x11\x15aK7WP`\0\x91P`\x03\x90P\x82aK\xC1V[`@\x80Q`\0\x80\x82R` \x82\x01\x80\x84R\x8A\x90R`\xFF\x89\x16\x92\x82\x01\x92\x90\x92R``\x81\x01\x87\x90R`\x80\x81\x01\x86\x90R`\x01\x90`\xA0\x01` `@Q` \x81\x03\x90\x80\x84\x03\x90\x85Z\xFA\x15\x80\x15aK\x8BW=`\0\x80>=`\0\xFD[PP`@Q`\x1F\x19\x01Q\x91PP`\x01`\x01`\xA0\x1B\x03\x81\x16aK\xB7WP`\0\x92P`\x01\x91P\x82\x90PaK\xC1V[\x92P`\0\x91P\x81\x90P[\x94P\x94P\x94\x91PPV[``\x82aK\xE0WaK\xDB\x82aL'V[aF\xFDV[\x81Q\x15\x80\x15aK\xF7WP`\x01`\x01`\xA0\x1B\x03\x84\x16;\x15[\x15aL W`@Qc\x99\x96\xB3\x15`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x85\x16`\x04\x82\x01R`$\x01a\x0BgV[P\x80aF\xFDV[\x80Q\x15aL7W\x80Q\x80\x82` \x01\xFD[`@Qc\xD6\xBD\xA2u`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0` \x82\x84\x03\x12\x15aLbW`\0\x80\xFD[\x815`\x01`\x01`\xE0\x1B\x03\x19\x81\x16\x81\x14aF\xFDW`\0\x80\xFD[`\0\x80\x83`\x1F\x84\x01\x12aL\x8CW`\0\x80\xFD[P\x815`\x01`\x01`@\x1B\x03\x81\x11\x15aL\xA3W`\0\x80\xFD[` \x83\x01\x91P\x83` \x82`\x05\x1B\x85\x01\x01\x11\x15aD&W`\0\x80\xFD[`\0\x80`\0\x80`\0``\x86\x88\x03\x12\x15aL\xD6W`\0\x80\xFD[\x855\x94P` \x86\x015`\x01`\x01`@\x1B\x03\x81\x11\x15aL\xF3W`\0\x80\xFD[aL\xFF\x88\x82\x89\x01aLzV[\x90\x95P\x93PP`@\x86\x015`\x01`\x01`@\x1B\x03\x81\x11\x15aM\x1EW`\0\x80\xFD[aM*\x88\x82\x89\x01aLzV[\x96\x99\x95\x98P\x93\x96P\x92\x94\x93\x92PPPV[`\0\x80\x83`\x1F\x84\x01\x12aMMW`\0\x80\xFD[P\x815`\x01`\x01`@\x1B\x03\x81\x11\x15aMdW`\0\x80\xFD[` \x83\x01\x91P\x83` \x82\x85\x01\x01\x11\x15aD&W`\0\x80\xFD[`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a\x12\x80W`\0\x80\xFD[`\0\x80`\0\x80`\0\x80`\0\x80`\xA0\x89\x8B\x03\x12\x15aM\xADW`\0\x80\xFD[\x885`\x01`\x01`@\x1B\x03\x81\x11\x15aM\xC3W`\0\x80\xFD[aM\xCF\x8B\x82\x8C\x01aM;V[\x90\x99P\x97PP` \x89\x015aM\xE3\x81aM|V[\x95P`@\x89\x015\x94P``\x89\x015`\x01`\x01`@\x1B\x03\x81\x11\x15aN\x05W`\0\x80\xFD[aN\x11\x8B\x82\x8C\x01aM;V[\x90\x95P\x93PP`\x80\x89\x015`\x01`\x01`@\x1B\x03\x81\x11\x15aN0W`\0\x80\xFD[aN<\x8B\x82\x8C\x01aM;V[\x99\x9C\x98\x9BP\x96\x99P\x94\x97\x93\x96\x92\x95\x94PPPV[\x805`\x03\x81\x10a\x14\xA4W`\0\x80\xFD[`\0`\xE0\x82\x84\x03\x12\x15aNqW`\0\x80\xFD[P\x91\x90PV[`\0\x80`\0\x80`\0\x80`\x80\x87\x89\x03\x12\x15aN\x90W`\0\x80\xFD[aN\x99\x87aNPV[\x95P` \x87\x015`\x01`\x01`@\x1B\x03\x81\x11\x15aN\xB4W`\0\x80\xFD[aN\xC0\x89\x82\x8A\x01aN_V[\x95PP`@\x87\x015`\x01`\x01`@\x1B\x03\x81\x11\x15aN\xDCW`\0\x80\xFD[aN\xE8\x89\x82\x8A\x01aM;V[\x90\x95P\x93PP``\x87\x015`\x01`\x01`@\x1B\x03\x81\x11\x15aO\x07W`\0\x80\xFD[aO\x13\x89\x82\x8A\x01aM;V[\x97\x9A\x96\x99P\x94\x97P\x92\x95\x93\x94\x92PPPV[`\0` \x82\x84\x03\x12\x15aO7W`\0\x80\xFD[P5\x91\x90PV[`\0` \x82\x84\x03\x12\x15aOPW`\0\x80\xFD[aF\xFD\x82aNPV[\x805a\x14\xA4\x81aM|V[`\0\x80`@\x83\x85\x03\x12\x15aOwW`\0\x80\xFD[\x825\x91P` \x83\x015aO\x89\x81aM|V[\x80\x91PP\x92P\x92\x90PV[cNH{q`\xE0\x1B`\0R`!`\x04R`$`\0\xFD[`\x06\x81\x10aO\xC8WcNH{q`\xE0\x1B`\0R`!`\x04R`$`\0\xFD[\x90RV[` \x81\x01a\tY\x82\x84aO\xAAV[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`@Q`\xE0\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15aP\x12WaP\x12aO\xDAV[`@R\x90V[`@Q`\x1F\x82\x01`\x1F\x19\x16\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15aP@WaP@aO\xDAV[`@R\x91\x90PV[`\0`\x01`\x01`@\x1B\x03\x82\x11\x15aPaWaPaaO\xDAV[P`\x1F\x01`\x1F\x19\x16` \x01\x90V[`\0\x82`\x1F\x83\x01\x12aP\x80W`\0\x80\xFD[\x815aP\x93aP\x8E\x82aPHV[aP\x18V[\x81\x81R\x84` \x83\x86\x01\x01\x11\x15aP\xA8W`\0\x80\xFD[\x81` \x85\x01` \x83\x017`\0\x91\x81\x01` \x01\x91\x90\x91R\x93\x92PPPV[`\0\x80`@\x83\x85\x03\x12\x15aP\xD8W`\0\x80\xFD[\x825aP\xE3\x81aM|V[\x91P` \x83\x015`\x01`\x01`@\x1B\x03\x81\x11\x15aP\xFEW`\0\x80\xFD[aQ\n\x85\x82\x86\x01aPoV[\x91PP\x92P\x92\x90PV[`\0\x80`\0\x80``\x85\x87\x03\x12\x15aQ*W`\0\x80\xFD[\x845\x93P` \x85\x015aQ<\x81aM|V[\x92P`@\x85\x015`\x01`\x01`@\x1B\x03\x81\x11\x15aQWW`\0\x80\xFD[aQc\x87\x82\x88\x01aM;V[\x95\x98\x94\x97P\x95PPPPV[`\0`\x01`\x01`@\x1B\x03\x82\x11\x15aQ\x88WaQ\x88aO\xDAV[P`\x05\x1B` \x01\x90V[`\0\x82`\x1F\x83\x01\x12aQ\xA3W`\0\x80\xFD[\x815aQ\xB1aP\x8E\x82aQoV[\x80\x82\x82R` \x82\x01\x91P` \x83`\x05\x1B\x86\x01\x01\x92P\x85\x83\x11\x15aQ\xD3W`\0\x80\xFD[` \x85\x01[\x83\x81\x10\x15aQ\xF0W\x805\x83R` \x92\x83\x01\x92\x01aQ\xD8V[P\x95\x94PPPPPV[`\0\x80`\0`@\x84\x86\x03\x12\x15aR\x0FW`\0\x80\xFD[\x835`\x01`\x01`@\x1B\x03\x81\x11\x15aR%W`\0\x80\xFD[aR1\x86\x82\x87\x01aQ\x92V[\x93PP` \x84\x015`\x01`\x01`@\x1B\x03\x81\x11\x15aRMW`\0\x80\xFD[aRY\x86\x82\x87\x01aLzV[\x94\x97\x90\x96P\x93\x94PPPPV[`\0\x80`\0`@\x84\x86\x03\x12\x15aR{W`\0\x80\xFD[\x835`\x01`\x01`@\x1B\x03\x81\x11\x15aR\x91W`\0\x80\xFD[aR\x9D\x86\x82\x87\x01aPoV[\x93PP` \x84\x015`\x01`\x01`@\x1B\x03\x81\x11\x15aR\xB9W`\0\x80\xFD[aRY\x86\x82\x87\x01aM;V[`\0[\x83\x81\x10\x15aR\xE0W\x81\x81\x01Q\x83\x82\x01R` \x01aR\xC8V[PP`\0\x91\x01RV[`\0\x81Q\x80\x84RaS\x01\x81` \x86\x01` \x86\x01aR\xC5V[`\x1F\x01`\x1F\x19\x16\x92\x90\x92\x01` \x01\x92\x91PPV[`\x80\x81R\x84Q`\x80\x82\x01R` \x85\x01Q`\xA0\x82\x01R`@\x85\x01Q`\xC0\x82\x01R``\x85\x01Q`\xE0\x82\x01R`\x80\x85\x01Qa\x01\0\x82\x01R`\x01\x80`\xA0\x1B\x03`\xA0\x86\x01Q\x16a\x01 \x82\x01R`\0`\xC0\x86\x01Q`\xE0a\x01@\x84\x01RaSya\x01`\x84\x01\x82aR\xE9V[\x91PPaS\x89` \x83\x01\x86aO\xAAV[`\x01`\x01`\xA0\x1B\x03\x84\x16`@\x83\x01R`\x01`\x01`\xA0\x1B\x03\x83\x16``\x83\x01R\x95\x94PPPPPV[`\0\x80`\0\x80`\0\x80`\x80\x87\x89\x03\x12\x15aS\xC9W`\0\x80\xFD[\x865`\x01`\x01`@\x1B\x03\x81\x11\x15aS\xDFW`\0\x80\xFD[aS\xEB\x89\x82\x8A\x01aN_V[\x96PPaS\xFA` \x88\x01aNPV[\x94P`@\x87\x015`\x01`\x01`@\x1B\x03\x81\x11\x15aN\xDCW`\0\x80\xFD[`\0` \x82\x84\x03\x12\x15aT'W`\0\x80\xFD[\x815aF\xFD\x81aM|V[`\0\x80`@\x83\x85\x03\x12\x15aTEW`\0\x80\xFD[aTN\x83aNPV[\x94` \x93\x90\x93\x015\x93PPPV[` \x81R`\0aF\xFD` \x83\x01\x84aR\xE9V[`\0\x80`\0`@\x84\x86\x03\x12\x15aT\x84W`\0\x80\xFD[\x835\x92P` \x84\x015`\x01`\x01`@\x1B\x03\x81\x11\x15aR\xB9W`\0\x80\xFD[`\0\x80` \x83\x85\x03\x12\x15aT\xB4W`\0\x80\xFD[\x825`\x01`\x01`@\x1B\x03\x81\x11\x15aT\xCAW`\0\x80\xFD[aT\xD6\x85\x82\x86\x01aM;V[\x90\x96\x90\x95P\x93PPPPV[`\0\x80`\0\x80`\0\x80`\x80\x87\x89\x03\x12\x15aT\xFBW`\0\x80\xFD[\x865`\x01`\x01`@\x1B\x03\x81\x11\x15aU\x11W`\0\x80\xFD[aU\x1D\x89\x82\x8A\x01aQ\x92V[\x96PP` \x87\x015`\x01`\x01`@\x1B\x03\x81\x11\x15aU9W`\0\x80\xFD[\x87\x01`\x1F\x81\x01\x89\x13aUJW`\0\x80\xFD[\x805aUXaP\x8E\x82aQoV[\x80\x82\x82R` \x82\x01\x91P` \x83`\x05\x1B\x85\x01\x01\x92P\x8B\x83\x11\x15aUzW`\0\x80\xFD[` \x84\x01\x93P[\x82\x84\x10\x15aU\xA5W\x835aU\x94\x81aM|V[\x82R` \x93\x84\x01\x93\x90\x91\x01\x90aU\x81V[\x97PPPP`@\x87\x015`\x01`\x01`@\x1B\x03\x81\x11\x15aU\xC3W`\0\x80\xFD[aN\xE8\x89\x82\x8A\x01aLzV[`\x01`\x01`\xA0\x1B\x03\x88\x81\x16\x82R` \x82\x01\x88\x90R`@\x82\x01\x87\x90R``\x82\x01\x86\x90R`\x80\x82\x01\x85\x90R\x83\x16`\xA0\x82\x01R`\xE0`\xC0\x82\x01\x81\x90R`\0\x90aV\x17\x90\x83\x01\x84aR\xE9V[\x99\x98PPPPPPPPPV[cNH{q`\xE0\x1B`\0R`2`\x04R`$`\0\xFD[`\x01\x81\x81\x1C\x90\x82\x16\x80aVNW`\x7F\x82\x16\x91P[` \x82\x10\x81\x03aNqWcNH{q`\xE0\x1B`\0R`\"`\x04R`$`\0\xFD[`\0\x80\x835`\x1E\x19\x846\x03\x01\x81\x12aV\x85W`\0\x80\xFD[\x83\x01\x805\x91P`\x01`\x01`@\x1B\x03\x82\x11\x15aV\x9FW`\0\x80\xFD[` \x01\x91P6\x81\x90\x03\x82\x13\x15aD&W`\0\x80\xFD[`\0` \x82\x84\x03\x12\x15aV\xC6W`\0\x80\xFD[\x81Q\x80\x15\x15\x81\x14aF\xFDW`\0\x80\xFD[\x81\x83R\x81\x81` \x85\x017P`\0\x82\x82\x01` \x90\x81\x01\x91\x90\x91R`\x1F\x90\x91\x01`\x1F\x19\x16\x90\x91\x01\x01\x90V[\x83\x81R`@` \x82\x01R`\0a0\x17`@\x83\x01\x84\x86aV\xD6V[cNH{q`\xE0\x1B`\0R`\x11`\x04R`$`\0\xFD[\x80\x82\x01\x80\x82\x11\x15a\tYWa\tYaW\x19V[`\x1F\x82\x11\x15a\x15 W\x80`\0R` `\0 `\x1F\x84\x01`\x05\x1C\x81\x01` \x85\x10\x15aWiWP\x80[`\x1F\x84\x01`\x05\x1C\x82\x01\x91P[\x81\x81\x10\x15aW\x89W`\0\x81U`\x01\x01aWuV[PPPPPV[\x81Q`\x01`\x01`@\x1B\x03\x81\x11\x15aW\xA9WaW\xA9aO\xDAV[aW\xBD\x81aW\xB7\x84TaV:V[\x84aWBV[` `\x1F\x82\x11`\x01\x81\x14aW\xF1W`\0\x83\x15aW\xD9WP\x84\x82\x01Q[`\0\x19`\x03\x85\x90\x1B\x1C\x19\x16`\x01\x84\x90\x1B\x17\x84UaW\x89V[`\0\x84\x81R` \x81 `\x1F\x19\x85\x16\x91[\x82\x81\x10\x15aX!W\x87\x85\x01Q\x82U` \x94\x85\x01\x94`\x01\x90\x92\x01\x91\x01aX\x01V[P\x84\x82\x10\x15aX?W\x86\x84\x01Q`\0\x19`\x03\x87\x90\x1B`\xF8\x16\x1C\x19\x16\x81U[PPPP`\x01\x90\x81\x1B\x01\x90UPV[\x80\x82\x02\x81\x15\x82\x82\x04\x84\x14\x17a\tYWa\tYaW\x19V[`\x01\x80`\xA0\x1B\x03\x85\x16\x81R\x83` \x82\x01R`\x80`@\x82\x01R`\0aX\x8C`\x80\x83\x01\x85aR\xE9V[\x82\x81\x03``\x84\x01RaX\x9E\x81\x85aR\xE9V[\x97\x96PPPPPPPV[`\0\x83\x83\x85R` \x85\x01\x94P` \x84`\x05\x1B\x82\x01\x01\x83`\0[\x86\x81\x10\x15aY6W\x83\x83\x03`\x1F\x19\x01\x88R\x8156\x87\x90\x03`\x1E\x19\x01\x81\x12aX\xE8W`\0\x80\xFD[\x86\x01` \x81\x01\x905`\x01`\x01`@\x1B\x03\x81\x11\x15aY\x04W`\0\x80\xFD[\x806\x03\x82\x13\x15aY\x13W`\0\x80\xFD[aY\x1E\x85\x82\x84aV\xD6V[` \x9A\x8B\x01\x9A\x90\x95P\x93\x90\x93\x01\x92PP`\x01\x01aX\xC2V[P\x90\x96\x95PPPPPPV[``\x80\x82R\x85Q\x90\x82\x01\x81\x90R`\0\x90` \x87\x01\x90`\x80\x84\x01\x90\x83[\x81\x81\x10\x15aY|W\x83Q\x83R` \x93\x84\x01\x93\x90\x92\x01\x91`\x01\x01aY^V[PP\x83\x81\x03` \x80\x86\x01\x91\x90\x91R\x87Q\x80\x83R\x91\x81\x01\x92P\x87\x01\x90`\0[\x81\x81\x10\x15aY\xC1W\x82Q`\x01`\x01`\xA0\x1B\x03\x16\x84R` \x93\x84\x01\x93\x90\x92\x01\x91`\x01\x01aY\x9AV[PPP\x82\x81\x03`@\x84\x01RaX\x9E\x81\x85\x87aX\xA9V[`\0\x80`\0``\x84\x86\x03\x12\x15aY\xECW`\0\x80\xFD[\x835`\x01`\x01`@\x1B\x03\x81\x11\x15aZ\x02W`\0\x80\xFD[aZ\x0E\x86\x82\x87\x01aPoV[\x93PP` \x84\x015`\x01`\x01`@\x1B\x03\x81\x11\x15aZ*W`\0\x80\xFD[aZ6\x86\x82\x87\x01aPoV[\x92PP`@\x84\x015`\x01`\x01`@\x1B\x03\x81\x11\x15aZRW`\0\x80\xFD[aZ^\x86\x82\x87\x01aPoV[\x91PP\x92P\x92P\x92V[`\0` \x82\x84\x03\x12\x15aZzW`\0\x80\xFD[PQ\x91\x90PV[`\0\x80`@\x83\x85\x03\x12\x15aZ\x94W`\0\x80\xFD[PP\x80Q` \x90\x91\x01Q\x90\x92\x90\x91PV[`\0\x80`@\x83\x85\x03\x12\x15aZ\xB8W`\0\x80\xFD[\x82QaZ\xC3\x81aM|V[` \x93\x90\x93\x01Q\x92\x94\x92\x93PPPV[`@\x81R`\0aZ\xE6`@\x83\x01\x86aR\xE9V[\x82\x81\x03` \x84\x01Ra\x11\xA5\x81\x85\x87aV\xD6V[\x81\x81\x03\x81\x81\x11\x15a\tYWa\tYaW\x19V[` \x81R`\0a[ ` \x83\x01\x84\x86aV\xD6V[\x94\x93PPPPV[`@\x81R`\0a[;`@\x83\x01\x85aR\xE9V[\x90P`\x01\x80`\xA0\x1B\x03\x83\x16` \x83\x01R\x93\x92PPPV[`\0\x82`\x1F\x83\x01\x12a[cW`\0\x80\xFD[\x81Qa[qaP\x8E\x82aPHV[\x81\x81R\x84` \x83\x86\x01\x01\x11\x15a[\x86W`\0\x80\xFD[a[ \x82` \x83\x01` \x87\x01aR\xC5V[`\0\x80`\0\x80`\0\x80`\0\x80a\x01\0\x89\x8B\x03\x12\x15a[\xB4W`\0\x80\xFD[\x88Q`\x01`\x01`@\x1B\x03\x81\x11\x15a[\xCAW`\0\x80\xFD[a[\xD6\x8B\x82\x8C\x01a[RV[\x98PP` \x89\x01Q`\x01`\x01`@\x1B\x03\x81\x11\x15a[\xF2W`\0\x80\xFD[a[\xFE\x8B\x82\x8C\x01a[RV[\x97PP`@\x89\x01Q`\x01`\x01`@\x1B\x03\x81\x11\x15a\\\x1AW`\0\x80\xFD[a\\&\x8B\x82\x8C\x01a[RV[\x96PP``\x89\x01Q`\x01`\x01`@\x1B\x03\x81\x11\x15a\\BW`\0\x80\xFD[a\\N\x8B\x82\x8C\x01a[RV[\x95PP`\x80\x89\x01Q`\x01`\x01`@\x1B\x03\x81\x11\x15a\\jW`\0\x80\xFD[a\\v\x8B\x82\x8C\x01a[RV[`\xA0\x8B\x01Q`\xC0\x8C\x01Q`\xE0\x90\x9C\x01Q\x9A\x9D\x99\x9CP\x97\x9A\x96\x99\x90\x98\x90\x95P\x93PPPPV[`\0`\xE0\x826\x03\x12\x15a\\\xADW`\0\x80\xFD[a\\\xB5aO\xF0V[\x825\x81R` \x80\x84\x015\x90\x82\x01R`@\x80\x84\x015\x90\x82\x01R``\x80\x84\x015\x90\x82\x01R`\x80\x80\x84\x015\x90\x82\x01Ra\\\xED`\xA0\x84\x01aOYV[`\xA0\x82\x01R`\xC0\x83\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a]\x0BW`\0\x80\xFD[a]\x176\x82\x86\x01aPoV[`\xC0\x83\x01RP\x92\x91PPV[`@\x81R`\0a]7`@\x83\x01\x86\x88aV\xD6V[\x82\x81\x03` \x84\x01RaX\x9E\x81\x85\x87aV\xD6V[\x82\x81R`@` \x82\x01R`\0a[ `@\x83\x01\x84aR\xE9V[`\0\x84Qa]u\x81\x84` \x89\x01aR\xC5V[\x84Q\x90\x83\x01\x90a]\x89\x81\x83` \x89\x01aR\xC5V[\x84Q\x91\x01\x90a]\x9C\x81\x83` \x88\x01aR\xC5V[\x01\x95\x94PPPPPV[`\0\x82Qa]\xB8\x81\x84` \x87\x01aR\xC5V[\x91\x90\x91\x01\x92\x91PPV\xFE6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBCs\xE5s\xF9VmaA\x8A4\xD5\xDE?\xF4\x93`\xF9\xC5\x1F\xEC7\xF7HeQg\x02\x90\xF6(]\xAB\x02\xDD{\xC7\xDE\xC4\xDC\xEE\xDD\xA7u\xE5\x8D\xD5A\xE0\x8A\x11llS\x81\\\x0B\xD0(\x19/{bh\0\xCD^\xD1\\n\x18~w\xE9\xAE\xE8\x81\x84\xC2\x1FO!\x82\xABX'\xCB;~\x07\xFB\xED\xCDc\xF03\0\x08\x0F^\xA8N\xD1\xDEL\x8E\xDBX\xBEe\x1C%X\x1C5Z\0\x11\xB0\xF96\r\xE5\x08+\xEC\xD6F@\xA2dipfsX\"\x12 \x89\xF9\x14Vd;\x81\x8AYD\xEB\xC4\x89\x8Fs\xDD\x80F\x8C\xE5j\x86s\xCE\x17t\xC3\xB9\xC8\xDDE\xA3dsolcC\0\x08\x1C\x003"; /// The deployed bytecode of the contract. pub static PROOFMARKETPLACE_DEPLOYED_BYTECODE: ::ethers::core::types::Bytes = ::ethers::core::types::Bytes::from_static(__DEPLOYED_BYTECODE); @@ -2286,6 +2440,15 @@ pub mod proof_marketplace { .method_hash([248, 169, 72, 47], p0) .expect("method not found (this should never happen)") } + ///Calls the contract's `minProvingTime` (0x2d00318d) function + pub fn min_proving_time( + &self, + p0: u8, + ) -> ::ethers::contract::builders::ContractCall { + self.0 + .method_hash([45, 0, 49, 141], p0) + .expect("method not found (this should never happen)") + } ///Calls the contract's `pause` (0x8456cb59) function pub fn pause(&self) -> ::ethers::contract::builders::ContractCall { self.0 @@ -2424,6 +2587,16 @@ pub mod proof_marketplace { .method_hash([142, 204, 189, 175], (secret_type, cost_per_byte)) .expect("method not found (this should never happen)") } + ///Calls the contract's `updateMinProvingTime` (0xb4cf543f) function + pub fn update_min_proving_time( + &self, + secret_type: u8, + new_proving_time: ::ethers::core::types::U256, + ) -> ::ethers::contract::builders::ContractCall { + self.0 + .method_hash([180, 207, 84, 63], (secret_type, new_proving_time)) + .expect("method not found (this should never happen)") + } ///Calls the contract's `upgradeToAndCall` (0x4f1ef286) function pub fn upgrade_to_and_call( &self, @@ -2444,6 +2617,20 @@ pub mod proof_marketplace { .method_hash([100, 23, 251, 97], (attestation_data, me_signature)) .expect("method not found (this should never happen)") } + ///Gets the contract's `AddExtraIVSImage` event + pub fn add_extra_ivs_image_filter( + &self, + ) -> ::ethers::contract::builders::Event<::std::sync::Arc, M, AddExtraIVSImageFilter> + { + self.0.event() + } + ///Gets the contract's `AddExtraProverImage` event + pub fn add_extra_prover_image_filter( + &self, + ) -> ::ethers::contract::builders::Event<::std::sync::Arc, M, AddExtraProverImageFilter> + { + self.0.event() + } ///Gets the contract's `AskCancelled` event pub fn ask_cancelled_filter( &self, @@ -2498,6 +2685,20 @@ pub mod proof_marketplace { { self.0.event() } + ///Gets the contract's `RemoveExtraIVSImage` event + pub fn remove_extra_ivs_image_filter( + &self, + ) -> ::ethers::contract::builders::Event<::std::sync::Arc, M, RemoveExtraIVSImageFilter> + { + self.0.event() + } + ///Gets the contract's `RemoveExtraProverImage` event + pub fn remove_extra_prover_image_filter( + &self, + ) -> ::ethers::contract::builders::Event<::std::sync::Arc, M, RemoveExtraProverImageFilter> + { + self.0.event() + } ///Gets the contract's `RoleAdminChanged` event pub fn role_admin_changed_filter( &self, @@ -2539,6 +2740,13 @@ pub mod proof_marketplace { { self.0.event() } + ///Gets the contract's `UpdateMinProvingTime` event + pub fn update_min_proving_time_filter( + &self, + ) -> ::ethers::contract::builders::Event<::std::sync::Arc, M, UpdateMinProvingTimeFilter> + { + self.0.event() + } ///Gets the contract's `Upgraded` event pub fn upgraded_filter( &self, @@ -2617,26 +2825,6 @@ pub mod proof_marketplace { pub struct AddressEmptyCode { pub target: ::ethers::core::types::Address, } - ///Custom Error type `AddressInsufficientBalance` with signature `AddressInsufficientBalance(address)` and selector `0xcd786059` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[etherror( - name = "AddressInsufficientBalance", - abi = "AddressInsufficientBalance(address)" - )] - pub struct AddressInsufficientBalance { - pub account: ::ethers::core::types::Address, - } ///Custom Error type `ArityMismatch` with signature `ArityMismatch()` and selector `0xc21fe6bf` #[derive( Clone, @@ -2861,7 +3049,7 @@ pub mod proof_marketplace { )] #[etherror(name = "ExpectedPause", abi = "ExpectedPause()")] pub struct ExpectedPause; - ///Custom Error type `FailedInnerCall` with signature `FailedInnerCall()` and selector `0x1425ea42` + ///Custom Error type `FailedCall` with signature `FailedCall()` and selector `0xd6bda275` #[derive( Clone, ::ethers::contract::EthError, @@ -2874,8 +3062,29 @@ pub mod proof_marketplace { Eq, Hash, )] - #[etherror(name = "FailedInnerCall", abi = "FailedInnerCall()")] - pub struct FailedInnerCall; + #[etherror(name = "FailedCall", abi = "FailedCall()")] + pub struct FailedCall; + ///Custom Error type `ImageAlreadyInFamily` with signature `ImageAlreadyInFamily(bytes32,bytes32)` and selector `0xc644d047` + #[derive( + Clone, + ::ethers::contract::EthError, + ::ethers::contract::EthDisplay, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + #[etherror( + name = "ImageAlreadyInFamily", + abi = "ImageAlreadyInFamily(bytes32,bytes32)" + )] + pub struct ImageAlreadyInFamily { + pub image_id: [u8; 32], + pub family_id: [u8; 32], + } ///Custom Error type `InactiveMarket` with signature `InactiveMarket()` and selector `0xbd2da74c` #[derive( Clone, @@ -3273,7 +3482,6 @@ pub mod proof_marketplace { AccessControlBadConfirmation(AccessControlBadConfirmation), AccessControlUnauthorizedAccount(AccessControlUnauthorizedAccount), AddressEmptyCode(AddressEmptyCode), - AddressInsufficientBalance(AddressInsufficientBalance), ArityMismatch(ArityMismatch), CannotAssignExpiredTasks(CannotAssignExpiredTasks), CannotBeZero(CannotBeZero), @@ -3287,7 +3495,8 @@ pub mod proof_marketplace { ERC1967NonPayable(ERC1967NonPayable), EnforcedPause(EnforcedPause), ExpectedPause(ExpectedPause), - FailedInnerCall(FailedInnerCall), + FailedCall(FailedCall), + ImageAlreadyInFamily(ImageAlreadyInFamily), InactiveMarket(InactiveMarket), InvalidECIESACL(InvalidECIESACL), InvalidEnclaveKey(InvalidEnclaveKey), @@ -3338,11 +3547,6 @@ pub mod proof_marketplace { { return Ok(Self::AddressEmptyCode(decoded)); } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::AddressInsufficientBalance(decoded)); - } if let Ok(decoded) = ::decode(data) { return Ok(Self::ArityMismatch(decoded)); } @@ -3399,8 +3603,13 @@ pub mod proof_marketplace { if let Ok(decoded) = ::decode(data) { return Ok(Self::ExpectedPause(decoded)); } - if let Ok(decoded) = ::decode(data) { - return Ok(Self::FailedInnerCall(decoded)); + if let Ok(decoded) = ::decode(data) { + return Ok(Self::FailedCall(decoded)); + } + if let Ok(decoded) = + ::decode(data) + { + return Ok(Self::ImageAlreadyInFamily(decoded)); } if let Ok(decoded) = ::decode(data) { return Ok(Self::InactiveMarket(decoded)); @@ -3510,9 +3719,6 @@ pub mod proof_marketplace { ::ethers::core::abi::AbiEncode::encode(element) } Self::AddressEmptyCode(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::AddressInsufficientBalance(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } Self::ArityMismatch(element) => ::ethers::core::abi::AbiEncode::encode(element), Self::CannotAssignExpiredTasks(element) => { ::ethers::core::abi::AbiEncode::encode(element) @@ -3542,7 +3748,10 @@ pub mod proof_marketplace { Self::ERC1967NonPayable(element) => ::ethers::core::abi::AbiEncode::encode(element), Self::EnforcedPause(element) => ::ethers::core::abi::AbiEncode::encode(element), Self::ExpectedPause(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::FailedInnerCall(element) => ::ethers::core::abi::AbiEncode::encode(element), + Self::FailedCall(element) => ::ethers::core::abi::AbiEncode::encode(element), + Self::ImageAlreadyInFamily(element) => { + ::ethers::core::abi::AbiEncode::encode(element) + } Self::InactiveMarket(element) => ::ethers::core::abi::AbiEncode::encode(element), Self::InvalidECIESACL(element) => ::ethers::core::abi::AbiEncode::encode(element), Self::InvalidEnclaveKey(element) => ::ethers::core::abi::AbiEncode::encode(element), @@ -3611,10 +3820,6 @@ pub mod proof_marketplace { == ::selector() => { true } - _ if selector - == ::selector() => { - true - } _ if selector == ::selector() => { true @@ -3666,7 +3871,9 @@ pub mod proof_marketplace { true } _ if selector - == ::selector() => { + == ::selector() => true, + _ if selector + == ::selector() => { true } _ if selector @@ -3769,7 +3976,6 @@ pub mod proof_marketplace { ::core::fmt::Display::fmt(element, f) } Self::AddressEmptyCode(element) => ::core::fmt::Display::fmt(element, f), - Self::AddressInsufficientBalance(element) => ::core::fmt::Display::fmt(element, f), Self::ArityMismatch(element) => ::core::fmt::Display::fmt(element, f), Self::CannotAssignExpiredTasks(element) => ::core::fmt::Display::fmt(element, f), Self::CannotBeZero(element) => ::core::fmt::Display::fmt(element, f), @@ -3789,7 +3995,8 @@ pub mod proof_marketplace { Self::ERC1967NonPayable(element) => ::core::fmt::Display::fmt(element, f), Self::EnforcedPause(element) => ::core::fmt::Display::fmt(element, f), Self::ExpectedPause(element) => ::core::fmt::Display::fmt(element, f), - Self::FailedInnerCall(element) => ::core::fmt::Display::fmt(element, f), + Self::FailedCall(element) => ::core::fmt::Display::fmt(element, f), + Self::ImageAlreadyInFamily(element) => ::core::fmt::Display::fmt(element, f), Self::InactiveMarket(element) => ::core::fmt::Display::fmt(element, f), Self::InvalidECIESACL(element) => ::core::fmt::Display::fmt(element, f), Self::InvalidEnclaveKey(element) => ::core::fmt::Display::fmt(element, f), @@ -3846,11 +4053,6 @@ pub mod proof_marketplace { Self::AddressEmptyCode(value) } } - impl ::core::convert::From for ProofMarketplaceErrors { - fn from(value: AddressInsufficientBalance) -> Self { - Self::AddressInsufficientBalance(value) - } - } impl ::core::convert::From for ProofMarketplaceErrors { fn from(value: ArityMismatch) -> Self { Self::ArityMismatch(value) @@ -3916,9 +4118,14 @@ pub mod proof_marketplace { Self::ExpectedPause(value) } } - impl ::core::convert::From for ProofMarketplaceErrors { - fn from(value: FailedInnerCall) -> Self { - Self::FailedInnerCall(value) + impl ::core::convert::From for ProofMarketplaceErrors { + fn from(value: FailedCall) -> Self { + Self::FailedCall(value) + } + } + impl ::core::convert::From for ProofMarketplaceErrors { + fn from(value: ImageAlreadyInFamily) -> Self { + Self::ImageAlreadyInFamily(value) } } impl ::core::convert::From for ProofMarketplaceErrors { @@ -4043,6 +4250,47 @@ pub mod proof_marketplace { Eq, Hash, )] + #[ethevent(name = "AddExtraIVSImage", abi = "AddExtraIVSImage(uint256,bytes32)")] + pub struct AddExtraIVSImageFilter { + #[ethevent(indexed)] + pub market_id: ::ethers::core::types::U256, + #[ethevent(indexed)] + pub image_id: [u8; 32], + } + #[derive( + Clone, + ::ethers::contract::EthEvent, + ::ethers::contract::EthDisplay, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + #[ethevent( + name = "AddExtraProverImage", + abi = "AddExtraProverImage(uint256,bytes32)" + )] + pub struct AddExtraProverImageFilter { + #[ethevent(indexed)] + pub market_id: ::ethers::core::types::U256, + #[ethevent(indexed)] + pub image_id: [u8; 32], + } + #[derive( + Clone, + ::ethers::contract::EthEvent, + ::ethers::contract::EthDisplay, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] #[ethevent(name = "AskCancelled", abi = "AskCancelled(uint256)")] pub struct AskCancelledFilter { #[ethevent(indexed)] @@ -4182,6 +4430,50 @@ pub mod proof_marketplace { Eq, Hash, )] + #[ethevent( + name = "RemoveExtraIVSImage", + abi = "RemoveExtraIVSImage(uint256,bytes32)" + )] + pub struct RemoveExtraIVSImageFilter { + #[ethevent(indexed)] + pub market_id: ::ethers::core::types::U256, + #[ethevent(indexed)] + pub image_id: [u8; 32], + } + #[derive( + Clone, + ::ethers::contract::EthEvent, + ::ethers::contract::EthDisplay, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + #[ethevent( + name = "RemoveExtraProverImage", + abi = "RemoveExtraProverImage(uint256,bytes32)" + )] + pub struct RemoveExtraProverImageFilter { + #[ethevent(indexed)] + pub market_id: ::ethers::core::types::U256, + #[ethevent(indexed)] + pub image_id: [u8; 32], + } + #[derive( + Clone, + ::ethers::contract::EthEvent, + ::ethers::contract::EthDisplay, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] #[ethevent( name = "RoleAdminChanged", abi = "RoleAdminChanged(bytes32,bytes32,bytes32)" @@ -4302,6 +4594,27 @@ pub mod proof_marketplace { Eq, Hash, )] + #[ethevent( + name = "UpdateMinProvingTime", + abi = "UpdateMinProvingTime(uint8,uint256)" + )] + pub struct UpdateMinProvingTimeFilter { + #[ethevent(indexed)] + pub secret_type: u8, + pub new_proving_time: ::ethers::core::types::U256, + } + #[derive( + Clone, + ::ethers::contract::EthEvent, + ::ethers::contract::EthDisplay, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] #[ethevent(name = "Upgraded", abi = "Upgraded(address)")] pub struct UpgradedFilter { #[ethevent(indexed)] @@ -4319,6 +4632,8 @@ pub mod proof_marketplace { Hash, )] pub enum ProofMarketplaceEvents { + AddExtraIVSImageFilter(AddExtraIVSImageFilter), + AddExtraProverImageFilter(AddExtraProverImageFilter), AskCancelledFilter(AskCancelledFilter), AskCreatedFilter(AskCreatedFilter), InitializedFilter(InitializedFilter), @@ -4327,18 +4642,27 @@ pub mod proof_marketplace { PausedFilter(PausedFilter), ProofCreatedFilter(ProofCreatedFilter), ProofNotGeneratedFilter(ProofNotGeneratedFilter), + RemoveExtraIVSImageFilter(RemoveExtraIVSImageFilter), + RemoveExtraProverImageFilter(RemoveExtraProverImageFilter), RoleAdminChangedFilter(RoleAdminChangedFilter), RoleGrantedFilter(RoleGrantedFilter), RoleRevokedFilter(RoleRevokedFilter), TaskCreatedFilter(TaskCreatedFilter), UnpausedFilter(UnpausedFilter), UpdateCostPerBytesFilter(UpdateCostPerBytesFilter), + UpdateMinProvingTimeFilter(UpdateMinProvingTimeFilter), UpgradedFilter(UpgradedFilter), } impl ::ethers::contract::EthLogDecode for ProofMarketplaceEvents { fn decode_log( log: &::ethers::core::abi::RawLog, ) -> ::core::result::Result { + if let Ok(decoded) = AddExtraIVSImageFilter::decode_log(log) { + return Ok(ProofMarketplaceEvents::AddExtraIVSImageFilter(decoded)); + } + if let Ok(decoded) = AddExtraProverImageFilter::decode_log(log) { + return Ok(ProofMarketplaceEvents::AddExtraProverImageFilter(decoded)); + } if let Ok(decoded) = AskCancelledFilter::decode_log(log) { return Ok(ProofMarketplaceEvents::AskCancelledFilter(decoded)); } @@ -4363,6 +4687,14 @@ pub mod proof_marketplace { if let Ok(decoded) = ProofNotGeneratedFilter::decode_log(log) { return Ok(ProofMarketplaceEvents::ProofNotGeneratedFilter(decoded)); } + if let Ok(decoded) = RemoveExtraIVSImageFilter::decode_log(log) { + return Ok(ProofMarketplaceEvents::RemoveExtraIVSImageFilter(decoded)); + } + if let Ok(decoded) = RemoveExtraProverImageFilter::decode_log(log) { + return Ok(ProofMarketplaceEvents::RemoveExtraProverImageFilter( + decoded, + )); + } if let Ok(decoded) = RoleAdminChangedFilter::decode_log(log) { return Ok(ProofMarketplaceEvents::RoleAdminChangedFilter(decoded)); } @@ -4381,6 +4713,9 @@ pub mod proof_marketplace { if let Ok(decoded) = UpdateCostPerBytesFilter::decode_log(log) { return Ok(ProofMarketplaceEvents::UpdateCostPerBytesFilter(decoded)); } + if let Ok(decoded) = UpdateMinProvingTimeFilter::decode_log(log) { + return Ok(ProofMarketplaceEvents::UpdateMinProvingTimeFilter(decoded)); + } if let Ok(decoded) = UpgradedFilter::decode_log(log) { return Ok(ProofMarketplaceEvents::UpgradedFilter(decoded)); } @@ -4390,6 +4725,8 @@ pub mod proof_marketplace { impl ::core::fmt::Display for ProofMarketplaceEvents { fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { match self { + Self::AddExtraIVSImageFilter(element) => ::core::fmt::Display::fmt(element, f), + Self::AddExtraProverImageFilter(element) => ::core::fmt::Display::fmt(element, f), Self::AskCancelledFilter(element) => ::core::fmt::Display::fmt(element, f), Self::AskCreatedFilter(element) => ::core::fmt::Display::fmt(element, f), Self::InitializedFilter(element) => ::core::fmt::Display::fmt(element, f), @@ -4398,16 +4735,31 @@ pub mod proof_marketplace { Self::PausedFilter(element) => ::core::fmt::Display::fmt(element, f), Self::ProofCreatedFilter(element) => ::core::fmt::Display::fmt(element, f), Self::ProofNotGeneratedFilter(element) => ::core::fmt::Display::fmt(element, f), + Self::RemoveExtraIVSImageFilter(element) => ::core::fmt::Display::fmt(element, f), + Self::RemoveExtraProverImageFilter(element) => { + ::core::fmt::Display::fmt(element, f) + } Self::RoleAdminChangedFilter(element) => ::core::fmt::Display::fmt(element, f), Self::RoleGrantedFilter(element) => ::core::fmt::Display::fmt(element, f), Self::RoleRevokedFilter(element) => ::core::fmt::Display::fmt(element, f), Self::TaskCreatedFilter(element) => ::core::fmt::Display::fmt(element, f), Self::UnpausedFilter(element) => ::core::fmt::Display::fmt(element, f), Self::UpdateCostPerBytesFilter(element) => ::core::fmt::Display::fmt(element, f), + Self::UpdateMinProvingTimeFilter(element) => ::core::fmt::Display::fmt(element, f), Self::UpgradedFilter(element) => ::core::fmt::Display::fmt(element, f), } } } + impl ::core::convert::From for ProofMarketplaceEvents { + fn from(value: AddExtraIVSImageFilter) -> Self { + Self::AddExtraIVSImageFilter(value) + } + } + impl ::core::convert::From for ProofMarketplaceEvents { + fn from(value: AddExtraProverImageFilter) -> Self { + Self::AddExtraProverImageFilter(value) + } + } impl ::core::convert::From for ProofMarketplaceEvents { fn from(value: AskCancelledFilter) -> Self { Self::AskCancelledFilter(value) @@ -4448,6 +4800,16 @@ pub mod proof_marketplace { Self::ProofNotGeneratedFilter(value) } } + impl ::core::convert::From for ProofMarketplaceEvents { + fn from(value: RemoveExtraIVSImageFilter) -> Self { + Self::RemoveExtraIVSImageFilter(value) + } + } + impl ::core::convert::From for ProofMarketplaceEvents { + fn from(value: RemoveExtraProverImageFilter) -> Self { + Self::RemoveExtraProverImageFilter(value) + } + } impl ::core::convert::From for ProofMarketplaceEvents { fn from(value: RoleAdminChangedFilter) -> Self { Self::RoleAdminChangedFilter(value) @@ -4478,6 +4840,11 @@ pub mod proof_marketplace { Self::UpdateCostPerBytesFilter(value) } } + impl ::core::convert::From for ProofMarketplaceEvents { + fn from(value: UpdateMinProvingTimeFilter) -> Self { + Self::UpdateMinProvingTimeFilter(value) + } + } impl ::core::convert::From for ProofMarketplaceEvents { fn from(value: UpgradedFilter) -> Self { Self::UpgradedFilter(value) @@ -4977,6 +5344,21 @@ pub mod proof_marketplace { )] #[ethcall(name = "marketData", abi = "marketData(uint256)")] pub struct MarketDataCall(pub ::ethers::core::types::U256); + ///Container type for all input parameters for the `minProvingTime` function with signature `minProvingTime(uint8)` and selector `0x2d00318d` + #[derive( + Clone, + ::ethers::contract::EthCall, + ::ethers::contract::EthDisplay, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + #[ethcall(name = "minProvingTime", abi = "minProvingTime(uint8)")] + pub struct MinProvingTimeCall(pub u8); ///Container type for all input parameters for the `pause` function with signature `pause()` and selector `0x8456cb59` #[derive( Clone, @@ -5245,6 +5627,27 @@ pub mod proof_marketplace { pub secret_type: u8, pub cost_per_byte: ::ethers::core::types::U256, } + ///Container type for all input parameters for the `updateMinProvingTime` function with signature `updateMinProvingTime(uint8,uint256)` and selector `0xb4cf543f` + #[derive( + Clone, + ::ethers::contract::EthCall, + ::ethers::contract::EthDisplay, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + #[ethcall( + name = "updateMinProvingTime", + abi = "updateMinProvingTime(uint8,uint256)" + )] + pub struct UpdateMinProvingTimeCall { + pub secret_type: u8, + pub new_proving_time: ::ethers::core::types::U256, + } ///Container type for all input parameters for the `upgradeToAndCall` function with signature `upgradeToAndCall(address,bytes)` and selector `0x4f1ef286` #[derive( Clone, @@ -5325,6 +5728,7 @@ pub mod proof_marketplace { ListOfAsk(ListOfAskCall), MarketCounter(MarketCounterCall), MarketData(MarketDataCall), + MinProvingTime(MinProvingTimeCall), Pause(PauseCall), Paused(PausedCall), ProxiableUUID(ProxiableUUIDCall), @@ -5340,6 +5744,7 @@ pub mod proof_marketplace { SupportsInterface(SupportsInterfaceCall), Unpause(UnpauseCall), UpdateCostPerBytes(UpdateCostPerBytesCall), + UpdateMinProvingTime(UpdateMinProvingTimeCall), UpgradeToAndCall(UpgradeToAndCallCall), VerifyMatchingEngine(VerifyMatchingEngineCall), } @@ -5465,6 +5870,11 @@ pub mod proof_marketplace { if let Ok(decoded) = ::decode(data) { return Ok(Self::MarketData(decoded)); } + if let Ok(decoded) = + ::decode(data) + { + return Ok(Self::MinProvingTime(decoded)); + } if let Ok(decoded) = ::decode(data) { return Ok(Self::Pause(decoded)); } @@ -5527,6 +5937,11 @@ pub mod proof_marketplace { { return Ok(Self::UpdateCostPerBytes(decoded)); } + if let Ok(decoded) = + ::decode(data) + { + return Ok(Self::UpdateMinProvingTime(decoded)); + } if let Ok(decoded) = ::decode(data) { @@ -5580,6 +5995,7 @@ pub mod proof_marketplace { Self::ListOfAsk(element) => ::ethers::core::abi::AbiEncode::encode(element), Self::MarketCounter(element) => ::ethers::core::abi::AbiEncode::encode(element), Self::MarketData(element) => ::ethers::core::abi::AbiEncode::encode(element), + Self::MinProvingTime(element) => ::ethers::core::abi::AbiEncode::encode(element), Self::Pause(element) => ::ethers::core::abi::AbiEncode::encode(element), Self::Paused(element) => ::ethers::core::abi::AbiEncode::encode(element), Self::ProxiableUUID(element) => ::ethers::core::abi::AbiEncode::encode(element), @@ -5603,6 +6019,9 @@ pub mod proof_marketplace { Self::UpdateCostPerBytes(element) => { ::ethers::core::abi::AbiEncode::encode(element) } + Self::UpdateMinProvingTime(element) => { + ::ethers::core::abi::AbiEncode::encode(element) + } Self::UpgradeToAndCall(element) => ::ethers::core::abi::AbiEncode::encode(element), Self::VerifyMatchingEngine(element) => { ::ethers::core::abi::AbiEncode::encode(element) @@ -5642,6 +6061,7 @@ pub mod proof_marketplace { Self::ListOfAsk(element) => ::core::fmt::Display::fmt(element, f), Self::MarketCounter(element) => ::core::fmt::Display::fmt(element, f), Self::MarketData(element) => ::core::fmt::Display::fmt(element, f), + Self::MinProvingTime(element) => ::core::fmt::Display::fmt(element, f), Self::Pause(element) => ::core::fmt::Display::fmt(element, f), Self::Paused(element) => ::core::fmt::Display::fmt(element, f), Self::ProxiableUUID(element) => ::core::fmt::Display::fmt(element, f), @@ -5657,6 +6077,7 @@ pub mod proof_marketplace { Self::SupportsInterface(element) => ::core::fmt::Display::fmt(element, f), Self::Unpause(element) => ::core::fmt::Display::fmt(element, f), Self::UpdateCostPerBytes(element) => ::core::fmt::Display::fmt(element, f), + Self::UpdateMinProvingTime(element) => ::core::fmt::Display::fmt(element, f), Self::UpgradeToAndCall(element) => ::core::fmt::Display::fmt(element, f), Self::VerifyMatchingEngine(element) => ::core::fmt::Display::fmt(element, f), } @@ -5807,6 +6228,11 @@ pub mod proof_marketplace { Self::MarketData(value) } } + impl ::core::convert::From for ProofMarketplaceCalls { + fn from(value: MinProvingTimeCall) -> Self { + Self::MinProvingTime(value) + } + } impl ::core::convert::From for ProofMarketplaceCalls { fn from(value: PauseCall) -> Self { Self::Pause(value) @@ -5882,6 +6308,11 @@ pub mod proof_marketplace { Self::UpdateCostPerBytes(value) } } + impl ::core::convert::From for ProofMarketplaceCalls { + fn from(value: UpdateMinProvingTimeCall) -> Self { + Self::UpdateMinProvingTime(value) + } + } impl ::core::convert::From for ProofMarketplaceCalls { fn from(value: UpgradeToAndCallCall) -> Self { Self::UpgradeToAndCall(value) @@ -6185,6 +6616,20 @@ pub mod proof_marketplace { pub creator: ::ethers::core::types::Address, pub marketmetadata: ::ethers::core::types::Bytes, } + ///Container type for all return fields from the `minProvingTime` function with signature `minProvingTime(uint8)` and selector `0x2d00318d` + #[derive( + Clone, + ::ethers::contract::EthAbiType, + ::ethers::contract::EthAbiCodec, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + pub struct MinProvingTimeReturn(pub ::ethers::core::types::U256); ///Container type for all return fields from the `paused` function with signature `paused()` and selector `0x5c975abb` #[derive( Clone, @@ -6241,4 +6686,26 @@ pub mod proof_marketplace { Hash, )] pub struct SupportsInterfaceReturn(pub bool); + ///`Ask(uint256,uint256,uint256,uint256,uint256,address,bytes)` + #[derive( + Clone, + ::ethers::contract::EthAbiType, + ::ethers::contract::EthAbiCodec, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + pub struct Ask { + pub market_id: ::ethers::core::types::U256, + pub reward: ::ethers::core::types::U256, + pub expiry: ::ethers::core::types::U256, + pub time_taken_for_proof_generation: ::ethers::core::types::U256, + pub deadline: ::ethers::core::types::U256, + pub refund_address: ::ethers::core::types::Address, + pub prover_data: ::ethers::core::types::Bytes, + } } diff --git a/bindings/src/safe_erc20.rs b/bindings/src/safe_erc20.rs index b34f00d..e6a236b 100644 --- a/bindings/src/safe_erc20.rs +++ b/bindings/src/safe_erc20.rs @@ -68,12 +68,12 @@ pub mod safe_erc20 { pub static SAFEERC20_ABI: ::ethers::contract::Lazy<::ethers::core::abi::Abi> = ::ethers::contract::Lazy::new(__abi); #[rustfmt::skip] - const __BYTECODE: &[u8] = b"`V`7`\x0B\x82\x82\x829\x80Q`\0\x1A`s\x14`*WcNH{q`\xE0\x1B`\0R`\0`\x04R`$`\0\xFD[0`\0R`s\x81S\x82\x81\xF3\xFEs\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x000\x14`\x80`@R`\0\x80\xFD\xFE\xA2dipfsX\"\x12 \xF77$d\x03\xF6B\xDB\x0E\xBC8z\xE59g\xE2\xB4\x8A\xC5\xEF\xF8\xC1\xE6\x88\x8B\xEBO\x86\x81\xE9?1dsolcC\0\x08\x14\x003"; + const __BYTECODE: &[u8] = b"`V`7`\x0B\x82\x82\x829\x80Q`\0\x1A`s\x14`*WcNH{q`\xE0\x1B`\0R`\0`\x04R`$`\0\xFD[0`\0R`s\x81S\x82\x81\xF3\xFEs\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x000\x14`\x80`@R`\0\x80\xFD\xFE\xA2dipfsX\"\x12 AA<\x7F\xE9YR\xF2\xC1\xE0\x0E\xE6\xFC9m\x1E\xFC\xF7\xD3e\xBD\xFE\x1E\x8B\x7F\x86\x9B\xD4[\x1C\x89\xB3dsolcC\0\x08\x1C\x003"; /// The bytecode of the contract. pub static SAFEERC20_BYTECODE: ::ethers::core::types::Bytes = ::ethers::core::types::Bytes::from_static(__BYTECODE); #[rustfmt::skip] - const __DEPLOYED_BYTECODE: &[u8] = b"s\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x000\x14`\x80`@R`\0\x80\xFD\xFE\xA2dipfsX\"\x12 \xF77$d\x03\xF6B\xDB\x0E\xBC8z\xE59g\xE2\xB4\x8A\xC5\xEF\xF8\xC1\xE6\x88\x8B\xEBO\x86\x81\xE9?1dsolcC\0\x08\x14\x003"; + const __DEPLOYED_BYTECODE: &[u8] = b"s\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x000\x14`\x80`@R`\0\x80\xFD\xFE\xA2dipfsX\"\x12 AA<\x7F\xE9YR\xF2\xC1\xE0\x0E\xE6\xFC9m\x1E\xFC\xF7\xD3e\xBD\xFE\x1E\x8B\x7F\x86\x9B\xD4[\x1C\x89\xB3dsolcC\0\x08\x1C\x003"; /// The deployed bytecode of the contract. pub static SAFEERC20_DEPLOYED_BYTECODE: ::ethers::core::types::Bytes = ::ethers::core::types::Bytes::from_static(__DEPLOYED_BYTECODE); diff --git a/bindings/src/shared_types.rs b/bindings/src/shared_types.rs index ea67440..a847df9 100644 --- a/bindings/src/shared_types.rs +++ b/bindings/src/shared_types.rs @@ -36,25 +36,3 @@ pub struct Attestation { pub pcr2: ::ethers::core::types::Bytes, pub timestamp_in_milliseconds: ::ethers::core::types::U256, } -///`Ask(uint256,uint256,uint256,uint256,uint256,address,bytes)` -#[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, -)] -pub struct Ask { - pub market_id: ::ethers::core::types::U256, - pub reward: ::ethers::core::types::U256, - pub expiry: ::ethers::core::types::U256, - pub time_taken_for_proof_generation: ::ethers::core::types::U256, - pub deadline: ::ethers::core::types::U256, - pub refund_address: ::ethers::core::types::Address, - pub prover_data: ::ethers::core::types::Bytes, -} diff --git a/bindings/src/storage_slot.rs b/bindings/src/storage_slot.rs index 11a712c..e8ad23d 100644 --- a/bindings/src/storage_slot.rs +++ b/bindings/src/storage_slot.rs @@ -25,12 +25,12 @@ pub mod storage_slot { pub static STORAGESLOT_ABI: ::ethers::contract::Lazy<::ethers::core::abi::Abi> = ::ethers::contract::Lazy::new(__abi); #[rustfmt::skip] - const __BYTECODE: &[u8] = b"`V`7`\x0B\x82\x82\x829\x80Q`\0\x1A`s\x14`*WcNH{q`\xE0\x1B`\0R`\0`\x04R`$`\0\xFD[0`\0R`s\x81S\x82\x81\xF3\xFEs\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x000\x14`\x80`@R`\0\x80\xFD\xFE\xA2dipfsX\"\x12 \xE0-S\xAD?\xCEA\xBC\xA6\xF5Q\x1E\xB4RO\xCD\xD3\xE6a\x96\xBE\xF0\xE0v\x1F\x99\xAB\xE8\xD6d\xAC8dsolcC\0\x08\x14\x003"; + const __BYTECODE: &[u8] = b"`V`7`\x0B\x82\x82\x829\x80Q`\0\x1A`s\x14`*WcNH{q`\xE0\x1B`\0R`\0`\x04R`$`\0\xFD[0`\0R`s\x81S\x82\x81\xF3\xFEs\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x000\x14`\x80`@R`\0\x80\xFD\xFE\xA2dipfsX\"\x12 \x11\x08\xA7v\xCE\xF1\xCA4|\xBD1\xE8N\xF5PU\x16\x05\xE9u\xA1\xA00V\xD3\x19\xC7\x0Fa\"$\x06dsolcC\0\x08\x1C\x003"; /// The bytecode of the contract. pub static STORAGESLOT_BYTECODE: ::ethers::core::types::Bytes = ::ethers::core::types::Bytes::from_static(__BYTECODE); #[rustfmt::skip] - const __DEPLOYED_BYTECODE: &[u8] = b"s\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x000\x14`\x80`@R`\0\x80\xFD\xFE\xA2dipfsX\"\x12 \xE0-S\xAD?\xCEA\xBC\xA6\xF5Q\x1E\xB4RO\xCD\xD3\xE6a\x96\xBE\xF0\xE0v\x1F\x99\xAB\xE8\xD6d\xAC8dsolcC\0\x08\x14\x003"; + const __DEPLOYED_BYTECODE: &[u8] = b"s\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x000\x14`\x80`@R`\0\x80\xFD\xFE\xA2dipfsX\"\x12 \x11\x08\xA7v\xCE\xF1\xCA4|\xBD1\xE8N\xF5PU\x16\x05\xE9u\xA1\xA00V\xD3\x19\xC7\x0Fa\"$\x06dsolcC\0\x08\x1C\x003"; /// The deployed bytecode of the contract. pub static STORAGESLOT_DEPLOYED_BYTECODE: ::ethers::core::types::Bytes = ::ethers::core::types::Bytes::from_static(__DEPLOYED_BYTECODE); diff --git a/bindings/src/transfer_verifier.rs b/bindings/src/transfer_verifier.rs deleted file mode 100644 index 50c053a..0000000 --- a/bindings/src/transfer_verifier.rs +++ /dev/null @@ -1,203 +0,0 @@ -pub use transfer_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 transfer_verifier { - #[allow(deprecated)] - fn __abi() -> ::ethers::core::abi::Abi { - ::ethers::core::abi::ethabi::Contract { - constructor: ::core::option::Option::None, - functions: ::core::convert::From::from([( - ::std::borrow::ToOwned::to_owned("verifyProof"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("verifyProof"), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("input"), - kind: ::ethers::core::abi::ethabi::ParamType::FixedArray( - ::std::boxed::Box::new( - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ), - 5usize, - ), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256[5]"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("p"), - kind: ::ethers::core::abi::ethabi::ParamType::FixedArray( - ::std::boxed::Box::new( - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ), - 8usize, - ), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256[8]"), - ), - }, - ], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Bool, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bool"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - },], - )]), - events: ::std::collections::BTreeMap::new(), - errors: ::std::collections::BTreeMap::new(), - receive: false, - fallback: false, - } - } - ///The parsed JSON ABI of the contract. - pub static TRANSFERVERIFIER_ABI: ::ethers::contract::Lazy<::ethers::core::abi::Abi> = - ::ethers::contract::Lazy::new(__abi); - #[rustfmt::skip] - const __BYTECODE: &[u8] = b"`\x80`@R4\x80\x15a\0\x10W`\0\x80\xFD[Pa\r\xE1\x80a\0 `\09`\0\xF3\xFE`\x80`@R4\x80\x15a\0\x10W`\0\x80\xFD[P`\x046\x10a\0+W`\x005`\xE0\x1C\x80chDM\xC7\x14a\x000W[`\0\x80\xFD[a\0\xB0`\x04\x806\x03a\x01\xA0\x81\x10\x15a\0GW`\0\x80\xFD[\x81\x01\x90\x80\x80`\xA0\x01\x90`\x05\x80` \x02`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x82`\x05` \x02\x80\x82\x847`\0\x92\x01\x91\x90\x91RPP`@\x80Qa\x01\0\x81\x81\x01\x90\x92R\x92\x95\x94\x93\x81\x81\x01\x93\x92P\x90`\x08\x90\x83\x90\x83\x90\x80\x82\x847`\0\x92\x01\x91\x90\x91RP\x91\x94Pa\0\xC4\x93PPPPV[`@\x80Q\x91\x15\x15\x82RQ\x90\x81\x90\x03` \x01\x90\xF3[`\0\x80[`\x08\x81`\xFF\x16\x10\x15a\x01MW\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDG\x83\x82`\xFF\x16`\x08\x81\x10a\x01\x04W\xFE[` \x02\x01Q\x10a\x01EW`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01\x80\x80` \x01\x82\x81\x03\x82R`\"\x81R` \x01\x80a\r\x8A`\"\x919`@\x01\x91PP`@Q\x80\x91\x03\x90\xFD[`\x01\x01a\0\xC8V[Pa\x01Va\x0B\xD7V[`@\x80Q\x80\x82\x01\x82R\x84Q\x81R` \x80\x86\x01Q\x81\x83\x01R\x90\x83R\x81Q`\x80\x80\x82\x01\x84R``\x80\x88\x01Q\x83\x86\x01\x90\x81R\x88\x86\x01Q\x91\x84\x01\x91\x90\x91R\x82R\x83Q\x80\x85\x01\x85R`\xA0\x88\x01Q\x81R\x90\x87\x01Q\x81\x84\x01R\x81\x83\x01R\x83\x82\x01R\x81Q\x80\x83\x01\x83R`\xC0\x86\x01Q\x81R`\xE0\x86\x01Q\x91\x81\x01\x91\x90\x91R\x90\x82\x01Ra\x01\xD6a\x0C\tV[a\x01\xDEa\x035V[\x90Pa\x01\xE8a\x0CPV[`@Q\x80`@\x01`@R\x80`\0\x81R` \x01`\0\x81RP\x90Pa\x02 \x81\x83`\x80\x01Q`\0`\x06\x81\x10a\x02\x16W\xFE[` \x02\x01Qa\x07\xACV[\x90P`\0[`\x05\x81\x10\x15a\x02\xF6W\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\x87\x82`\x05\x81\x10a\x02[W\xFE[` \x02\x01Q\x10a\x02\xB2W`@\x80QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1F`$\x82\x01R\x7Fverifier-gte-snark-scalar-field\0`D\x82\x01R\x90Q\x90\x81\x90\x03`d\x01\x90\xFD[a\x02\xEC\x82a\x02\xE7\x85`\x80\x01Q\x84`\x01\x01`\x06\x81\x10a\x02\xCCW\xFE[` \x02\x01Q\x8A\x85`\x05\x81\x10a\x02\xDDW\xFE[` \x02\x01Qa\x08LV[a\x07\xACV[\x91P`\x01\x01a\x02%V[Pa\x03+a\x03\x07\x84`\0\x01Qa\x08\xD2V[\x84` \x01Q\x84`\0\x01Q\x85` \x01Q\x85\x87`@\x01Q\x89`@\x01Q\x89``\x01Qa\tyV[\x96\x95PPPPPPV[a\x03=a\x0C\tV[`@\x80Q\x80\x82\x01\x82R\x7F\x17\x83\xC0\\\xFD'\xB8\xE7\xF4FPp\xD9\xDB\xB7<\xF8*\xC3\xFE\x1B\xE6*[p\x8A\xF3\xA3\xA9\xD1>\xCB\x81\x86\x01R\x81\x85\x01R\x82\x86\x01R\x83Q\x80\x85\x01\x85R\x7F\x1D\x9D.\x03\xF3\xE4\xBE\xB0\t\xC9\xA1\xF1\xD0\xC3\xDC\xAF\xCF\xB2\xF1\th\xBB\x02\xD3i\xABdH/\x85\xEEY\x81R\x7F\x19\x0C\x9E\xA0\xE9<\xCE\"<\xE8M\0\xDE\xFE\x06\xB7i\xD3_.W^\x94\xB5\xAE\x8A\xE55\xDD\xAA\xF1/\x81\x85\x01R\x81\x86\x01\x80Q\x91\x90\x91R\x84Q\x80\x86\x01\x86R\x7F%P\x93\x89\x01\xCB\xA1\xBA\x1DQM(\xB2\r9;\x84l\xC4\x9FX\x95/p\xA7\xCF:N\x0B\xF5\xFB\xDC\x81R\x7F\x13n\xC7\xCA\xA3\xCB\x18%b\xBF:\x8F\xAE\xB0\x8D\xD5\xBD\xCAH\x85cuu\xA3\xD2\x0E\x84\t\xAA\x94\xF1:\x81\x86\x01R\x81Q\x85\x01R\x84Q\x80\x86\x01\x86R\x7F\x1A\xC7\x96L\x82\xC8\x03\x19\xD6G\xFE\x9A\x94\x8A\x8E\xFD\x0F0T\xB0{\x9C\x85\xC4\x11>UC\x0F\xC8\x0E\x92\x81R~\xE23\x8B\xE3?|o\xE5 4\xF6b\xE1Gx'5Z\x8D\x1AR\x16Ul\x81\x86\x01R\x81Q\x90\x93\x01\x92\x90\x92R\x83Q\x80\x85\x01\x85R\x7F\x1F\xF8\xE6.{\x7Fu\x0E\xE8\x19\xA2\x87M\xBA\xD8\x073\xD9\xFFT\xB4!>\xE4q)n\xA0\xDA\x9C\x15\x1E\x81R\x7F\x1B7\xD0\xB5\xAD\x96\x93\x0C\xD3\xF2\xE2rzeC\xA2\x10\x17Ej\x07^\xA6n\xA1t\x18\xD1\xFFi\xFFJ\x81\x85\x01R\x82Q\x90\x91\x01R\x82Q\x80\x84\x01\x90\x93R\x7F,\xE54'q\xE9p\x11\x8A\x8F{*\xB4\xA7\x8F\xA9\xEE0\x16h\x12\xF8d'w\xB7\xA7\xD5)w.o\x83R\x7F\nU\x83\xF7\x17\xF3\x90\x83;u\xB1\xAC\x9Cr4\x8A7\xA5s\xD8CL\x83\nS\xDF2\x91\0\xD9\xDBN\x91\x83\x01\x91\x90\x91RQ`\xA0\x01R\x90V[a\x07\xB4a\x0CPV[a\x07\xBCa\x0CjV[\x83Q\x81R` \x80\x85\x01Q\x81\x83\x01R\x83Q`@\x83\x01R\x83\x01Q``\x80\x83\x01\x91\x90\x91R`\0\x90\x83`\xC0\x84`\x06a\x07\xD0Z\x03\xFA\x90P\x80\x80\x15a\x07\xFAWa\x07\xFCV[\xFE[P\x80a\x08DW`@\x80QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x12`$\x82\x01Rq\x1C\x18Z\\\x9A[\x99\xCBXY\x19\x0BY\x98Z[\x19Y`r\x1B`D\x82\x01R\x90Q\x90\x81\x90\x03`d\x01\x90\xFD[PP\x92\x91PPV[a\x08Ta\x0CPV[a\x08\\a\x0C\x88V[\x83Q\x81R` \x80\x85\x01Q\x90\x82\x01R`@\x81\x01\x83\x90R`\0``\x83`\x80\x84`\x07a\x07\xD0Z\x03\xFA\x90P\x80\x80\x15a\x07\xFAWP\x80a\x08DW`@\x80QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x12`$\x82\x01Rq\x1C\x18Z\\\x9A[\x99\xCB[][\x0BY\x98Z[\x19Y`r\x1B`D\x82\x01R\x90Q\x90\x81\x90\x03`d\x01\x90\xFD[a\x08\xDAa\x0CPV[\x81Q\x15\x80\x15a\x08\xEBWP` \x82\x01Q\x15[\x15a\t\nWP`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01Ra\ttV[`@Q\x80`@\x01`@R\x80\x83`\0\x01Q\x81R` \x01\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDG\x84` \x01Q\x81a\tLW\xFE[\x06\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDG\x03\x90R\x90P[\x91\x90PV[`\0a\t\x83a\x0C\xA6V[`@Q\x80`\x80\x01`@R\x80\x8B\x81R` \x01\x89\x81R` \x01\x87\x81R` \x01\x85\x81RP\x90Pa\t\xAEa\x0C\xD3V[P`@\x80Q`\x80\x81\x01\x82R\x8A\x81R` \x81\x01\x89\x90R\x80\x82\x01\x87\x90R``\x80\x82\x01\x86\x90R\x82Q`\x18\x80\x82Ra\x03 \x82\x01\x90\x94R\x91\x92\x91\x82\x81` \x01` \x82\x02\x806\x837\x01\x90PP\x90P`\0[`\x04\x81\x10\x15a\x0BPW`\x06\x81\x02\x85\x82`\x04\x81\x10a\n\x12W\xFE[` \x02\x01QQ\x83Q\x84\x90\x83\x90\x81\x10a\n&W\xFE[` \x02` \x01\x01\x81\x81RPP\x85\x82`\x04\x81\x10a\n>W\xFE[` \x02\x01Q` \x01Q\x83\x82`\x01\x01\x81Q\x81\x10a\nVW\xFE[` \x02` \x01\x01\x81\x81RPP\x84\x82`\x04\x81\x10a\nnW\xFE[` \x02\x01QQQ\x83Q\x84\x90`\x02\x84\x01\x90\x81\x10a\n\x86W\xFE[` \x02` \x01\x01\x81\x81RPP\x84\x82`\x04\x81\x10a\n\x9EW\xFE[` \x02\x01QQ`\x01` \x02\x01Q\x83\x82`\x03\x01\x81Q\x81\x10a\n\xBAW\xFE[` \x02` \x01\x01\x81\x81RPP\x84\x82`\x04\x81\x10a\n\xD2W\xFE[` \x02\x01Q` \x01Q`\0`\x02\x81\x10a\n\xE7W\xFE[` \x02\x01Q\x83\x82`\x04\x01\x81Q\x81\x10a\n\xFBW\xFE[` \x02` \x01\x01\x81\x81RPP\x84\x82`\x04\x81\x10a\x0B\x13W\xFE[` \x02\x01Q` \x01Q`\x01`\x02\x81\x10a\x0B(W\xFE[` \x02\x01Q\x83\x82`\x05\x01\x81Q\x81\x10a\x0BV[`@Q\x80`@\x01`@R\x80`\0\x81R` \x01`\0\x81RP\x90V[`@Q\x80`\x80\x01`@R\x80`\x04\x90` \x82\x02\x806\x837P\x91\x92\x91PPV[`@Q\x80``\x01`@R\x80`\x03\x90` \x82\x02\x806\x837P\x91\x92\x91PPV[`@Q\x80`\x80\x01`@R\x80`\x04\x90[a\x0C\xBDa\x0CPV[\x81R` \x01\x90`\x01\x90\x03\x90\x81a\x0C\xB5W\x90PP\x90V[`@Q\x80`\x80\x01`@R\x80`\x04\x90[a\x0C\xEAa\r\x1EV[\x81R` \x01\x90`\x01\x90\x03\x90\x81a\x0C\xE2W\x90PP\x90V[`@Q\x80` \x01`@R\x80`\x01\x90` \x82\x02\x806\x837P\x91\x92\x91PPV[`@Q\x80`@\x01`@R\x80a\r1a\rkV[\x81R` \x01a\x0C\x04a\rkV[`@Q\x80`\xC0\x01`@R\x80`\x06\x90[a\rUa\x0CPV[\x81R` \x01\x90`\x01\x90\x03\x90\x81a\rMW\x90PP\x90V[`@Q\x80`@\x01`@R\x80`\x02\x90` \x82\x02\x806\x837P\x91\x92\x91PPV\xFEverifier-proof-element-gte-prime-q\xA2dipfsX\"\x12 \xA8\xF4\xA2\xED\xD2\xAB\xE6\xBE\xA2\xEBx\xD7\rZM}\xBB4\xD9\x0E\x16(\xD5]\x97,\xDB\x13\xE9\x8BO\xCFdsolcC\0\x06\x0C\x003"; - /// The bytecode of the contract. - pub static TRANSFERVERIFIER_BYTECODE: ::ethers::core::types::Bytes = - ::ethers::core::types::Bytes::from_static(__BYTECODE); - #[rustfmt::skip] - const __DEPLOYED_BYTECODE: &[u8] = b"`\x80`@R4\x80\x15a\0\x10W`\0\x80\xFD[P`\x046\x10a\0+W`\x005`\xE0\x1C\x80chDM\xC7\x14a\x000W[`\0\x80\xFD[a\0\xB0`\x04\x806\x03a\x01\xA0\x81\x10\x15a\0GW`\0\x80\xFD[\x81\x01\x90\x80\x80`\xA0\x01\x90`\x05\x80` \x02`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x82`\x05` \x02\x80\x82\x847`\0\x92\x01\x91\x90\x91RPP`@\x80Qa\x01\0\x81\x81\x01\x90\x92R\x92\x95\x94\x93\x81\x81\x01\x93\x92P\x90`\x08\x90\x83\x90\x83\x90\x80\x82\x847`\0\x92\x01\x91\x90\x91RP\x91\x94Pa\0\xC4\x93PPPPV[`@\x80Q\x91\x15\x15\x82RQ\x90\x81\x90\x03` \x01\x90\xF3[`\0\x80[`\x08\x81`\xFF\x16\x10\x15a\x01MW\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDG\x83\x82`\xFF\x16`\x08\x81\x10a\x01\x04W\xFE[` \x02\x01Q\x10a\x01EW`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01\x80\x80` \x01\x82\x81\x03\x82R`\"\x81R` \x01\x80a\r\x8A`\"\x919`@\x01\x91PP`@Q\x80\x91\x03\x90\xFD[`\x01\x01a\0\xC8V[Pa\x01Va\x0B\xD7V[`@\x80Q\x80\x82\x01\x82R\x84Q\x81R` \x80\x86\x01Q\x81\x83\x01R\x90\x83R\x81Q`\x80\x80\x82\x01\x84R``\x80\x88\x01Q\x83\x86\x01\x90\x81R\x88\x86\x01Q\x91\x84\x01\x91\x90\x91R\x82R\x83Q\x80\x85\x01\x85R`\xA0\x88\x01Q\x81R\x90\x87\x01Q\x81\x84\x01R\x81\x83\x01R\x83\x82\x01R\x81Q\x80\x83\x01\x83R`\xC0\x86\x01Q\x81R`\xE0\x86\x01Q\x91\x81\x01\x91\x90\x91R\x90\x82\x01Ra\x01\xD6a\x0C\tV[a\x01\xDEa\x035V[\x90Pa\x01\xE8a\x0CPV[`@Q\x80`@\x01`@R\x80`\0\x81R` \x01`\0\x81RP\x90Pa\x02 \x81\x83`\x80\x01Q`\0`\x06\x81\x10a\x02\x16W\xFE[` \x02\x01Qa\x07\xACV[\x90P`\0[`\x05\x81\x10\x15a\x02\xF6W\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\x87\x82`\x05\x81\x10a\x02[W\xFE[` \x02\x01Q\x10a\x02\xB2W`@\x80QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1F`$\x82\x01R\x7Fverifier-gte-snark-scalar-field\0`D\x82\x01R\x90Q\x90\x81\x90\x03`d\x01\x90\xFD[a\x02\xEC\x82a\x02\xE7\x85`\x80\x01Q\x84`\x01\x01`\x06\x81\x10a\x02\xCCW\xFE[` \x02\x01Q\x8A\x85`\x05\x81\x10a\x02\xDDW\xFE[` \x02\x01Qa\x08LV[a\x07\xACV[\x91P`\x01\x01a\x02%V[Pa\x03+a\x03\x07\x84`\0\x01Qa\x08\xD2V[\x84` \x01Q\x84`\0\x01Q\x85` \x01Q\x85\x87`@\x01Q\x89`@\x01Q\x89``\x01Qa\tyV[\x96\x95PPPPPPV[a\x03=a\x0C\tV[`@\x80Q\x80\x82\x01\x82R\x7F\x17\x83\xC0\\\xFD'\xB8\xE7\xF4FPp\xD9\xDB\xB7<\xF8*\xC3\xFE\x1B\xE6*[p\x8A\xF3\xA3\xA9\xD1>\xCB\x81\x86\x01R\x81\x85\x01R\x82\x86\x01R\x83Q\x80\x85\x01\x85R\x7F\x1D\x9D.\x03\xF3\xE4\xBE\xB0\t\xC9\xA1\xF1\xD0\xC3\xDC\xAF\xCF\xB2\xF1\th\xBB\x02\xD3i\xABdH/\x85\xEEY\x81R\x7F\x19\x0C\x9E\xA0\xE9<\xCE\"<\xE8M\0\xDE\xFE\x06\xB7i\xD3_.W^\x94\xB5\xAE\x8A\xE55\xDD\xAA\xF1/\x81\x85\x01R\x81\x86\x01\x80Q\x91\x90\x91R\x84Q\x80\x86\x01\x86R\x7F%P\x93\x89\x01\xCB\xA1\xBA\x1DQM(\xB2\r9;\x84l\xC4\x9FX\x95/p\xA7\xCF:N\x0B\xF5\xFB\xDC\x81R\x7F\x13n\xC7\xCA\xA3\xCB\x18%b\xBF:\x8F\xAE\xB0\x8D\xD5\xBD\xCAH\x85cuu\xA3\xD2\x0E\x84\t\xAA\x94\xF1:\x81\x86\x01R\x81Q\x85\x01R\x84Q\x80\x86\x01\x86R\x7F\x1A\xC7\x96L\x82\xC8\x03\x19\xD6G\xFE\x9A\x94\x8A\x8E\xFD\x0F0T\xB0{\x9C\x85\xC4\x11>UC\x0F\xC8\x0E\x92\x81R~\xE23\x8B\xE3?|o\xE5 4\xF6b\xE1Gx'5Z\x8D\x1AR\x16Ul\x81\x86\x01R\x81Q\x90\x93\x01\x92\x90\x92R\x83Q\x80\x85\x01\x85R\x7F\x1F\xF8\xE6.{\x7Fu\x0E\xE8\x19\xA2\x87M\xBA\xD8\x073\xD9\xFFT\xB4!>\xE4q)n\xA0\xDA\x9C\x15\x1E\x81R\x7F\x1B7\xD0\xB5\xAD\x96\x93\x0C\xD3\xF2\xE2rzeC\xA2\x10\x17Ej\x07^\xA6n\xA1t\x18\xD1\xFFi\xFFJ\x81\x85\x01R\x82Q\x90\x91\x01R\x82Q\x80\x84\x01\x90\x93R\x7F,\xE54'q\xE9p\x11\x8A\x8F{*\xB4\xA7\x8F\xA9\xEE0\x16h\x12\xF8d'w\xB7\xA7\xD5)w.o\x83R\x7F\nU\x83\xF7\x17\xF3\x90\x83;u\xB1\xAC\x9Cr4\x8A7\xA5s\xD8CL\x83\nS\xDF2\x91\0\xD9\xDBN\x91\x83\x01\x91\x90\x91RQ`\xA0\x01R\x90V[a\x07\xB4a\x0CPV[a\x07\xBCa\x0CjV[\x83Q\x81R` \x80\x85\x01Q\x81\x83\x01R\x83Q`@\x83\x01R\x83\x01Q``\x80\x83\x01\x91\x90\x91R`\0\x90\x83`\xC0\x84`\x06a\x07\xD0Z\x03\xFA\x90P\x80\x80\x15a\x07\xFAWa\x07\xFCV[\xFE[P\x80a\x08DW`@\x80QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x12`$\x82\x01Rq\x1C\x18Z\\\x9A[\x99\xCBXY\x19\x0BY\x98Z[\x19Y`r\x1B`D\x82\x01R\x90Q\x90\x81\x90\x03`d\x01\x90\xFD[PP\x92\x91PPV[a\x08Ta\x0CPV[a\x08\\a\x0C\x88V[\x83Q\x81R` \x80\x85\x01Q\x90\x82\x01R`@\x81\x01\x83\x90R`\0``\x83`\x80\x84`\x07a\x07\xD0Z\x03\xFA\x90P\x80\x80\x15a\x07\xFAWP\x80a\x08DW`@\x80QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x12`$\x82\x01Rq\x1C\x18Z\\\x9A[\x99\xCB[][\x0BY\x98Z[\x19Y`r\x1B`D\x82\x01R\x90Q\x90\x81\x90\x03`d\x01\x90\xFD[a\x08\xDAa\x0CPV[\x81Q\x15\x80\x15a\x08\xEBWP` \x82\x01Q\x15[\x15a\t\nWP`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01Ra\ttV[`@Q\x80`@\x01`@R\x80\x83`\0\x01Q\x81R` \x01\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDG\x84` \x01Q\x81a\tLW\xFE[\x06\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDG\x03\x90R\x90P[\x91\x90PV[`\0a\t\x83a\x0C\xA6V[`@Q\x80`\x80\x01`@R\x80\x8B\x81R` \x01\x89\x81R` \x01\x87\x81R` \x01\x85\x81RP\x90Pa\t\xAEa\x0C\xD3V[P`@\x80Q`\x80\x81\x01\x82R\x8A\x81R` \x81\x01\x89\x90R\x80\x82\x01\x87\x90R``\x80\x82\x01\x86\x90R\x82Q`\x18\x80\x82Ra\x03 \x82\x01\x90\x94R\x91\x92\x91\x82\x81` \x01` \x82\x02\x806\x837\x01\x90PP\x90P`\0[`\x04\x81\x10\x15a\x0BPW`\x06\x81\x02\x85\x82`\x04\x81\x10a\n\x12W\xFE[` \x02\x01QQ\x83Q\x84\x90\x83\x90\x81\x10a\n&W\xFE[` \x02` \x01\x01\x81\x81RPP\x85\x82`\x04\x81\x10a\n>W\xFE[` \x02\x01Q` \x01Q\x83\x82`\x01\x01\x81Q\x81\x10a\nVW\xFE[` \x02` \x01\x01\x81\x81RPP\x84\x82`\x04\x81\x10a\nnW\xFE[` \x02\x01QQQ\x83Q\x84\x90`\x02\x84\x01\x90\x81\x10a\n\x86W\xFE[` \x02` \x01\x01\x81\x81RPP\x84\x82`\x04\x81\x10a\n\x9EW\xFE[` \x02\x01QQ`\x01` \x02\x01Q\x83\x82`\x03\x01\x81Q\x81\x10a\n\xBAW\xFE[` \x02` \x01\x01\x81\x81RPP\x84\x82`\x04\x81\x10a\n\xD2W\xFE[` \x02\x01Q` \x01Q`\0`\x02\x81\x10a\n\xE7W\xFE[` \x02\x01Q\x83\x82`\x04\x01\x81Q\x81\x10a\n\xFBW\xFE[` \x02` \x01\x01\x81\x81RPP\x84\x82`\x04\x81\x10a\x0B\x13W\xFE[` \x02\x01Q` \x01Q`\x01`\x02\x81\x10a\x0B(W\xFE[` \x02\x01Q\x83\x82`\x05\x01\x81Q\x81\x10a\x0BV[`@Q\x80`@\x01`@R\x80`\0\x81R` \x01`\0\x81RP\x90V[`@Q\x80`\x80\x01`@R\x80`\x04\x90` \x82\x02\x806\x837P\x91\x92\x91PPV[`@Q\x80``\x01`@R\x80`\x03\x90` \x82\x02\x806\x837P\x91\x92\x91PPV[`@Q\x80`\x80\x01`@R\x80`\x04\x90[a\x0C\xBDa\x0CPV[\x81R` \x01\x90`\x01\x90\x03\x90\x81a\x0C\xB5W\x90PP\x90V[`@Q\x80`\x80\x01`@R\x80`\x04\x90[a\x0C\xEAa\r\x1EV[\x81R` \x01\x90`\x01\x90\x03\x90\x81a\x0C\xE2W\x90PP\x90V[`@Q\x80` \x01`@R\x80`\x01\x90` \x82\x02\x806\x837P\x91\x92\x91PPV[`@Q\x80`@\x01`@R\x80a\r1a\rkV[\x81R` \x01a\x0C\x04a\rkV[`@Q\x80`\xC0\x01`@R\x80`\x06\x90[a\rUa\x0CPV[\x81R` \x01\x90`\x01\x90\x03\x90\x81a\rMW\x90PP\x90V[`@Q\x80`@\x01`@R\x80`\x02\x90` \x82\x02\x806\x837P\x91\x92\x91PPV\xFEverifier-proof-element-gte-prime-q\xA2dipfsX\"\x12 \xA8\xF4\xA2\xED\xD2\xAB\xE6\xBE\xA2\xEBx\xD7\rZM}\xBB4\xD9\x0E\x16(\xD5]\x97,\xDB\x13\xE9\x8BO\xCFdsolcC\0\x06\x0C\x003"; - /// The deployed bytecode of the contract. - pub static TRANSFERVERIFIER_DEPLOYED_BYTECODE: ::ethers::core::types::Bytes = - ::ethers::core::types::Bytes::from_static(__DEPLOYED_BYTECODE); - pub struct TransferVerifier(::ethers::contract::Contract); - impl ::core::clone::Clone for TransferVerifier { - fn clone(&self) -> Self { - Self(::core::clone::Clone::clone(&self.0)) - } - } - impl ::core::ops::Deref for TransferVerifier { - type Target = ::ethers::contract::Contract; - fn deref(&self) -> &Self::Target { - &self.0 - } - } - impl ::core::ops::DerefMut for TransferVerifier { - fn deref_mut(&mut self) -> &mut Self::Target { - &mut self.0 - } - } - impl ::core::fmt::Debug for TransferVerifier { - fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { - f.debug_tuple(::core::stringify!(TransferVerifier)) - .field(&self.address()) - .finish() - } - } - impl TransferVerifier { - /// 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(), - TRANSFERVERIFIER_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( - TRANSFERVERIFIER_ABI.clone(), - TRANSFERVERIFIER_BYTECODE.clone().into(), - client, - ); - let deployer = factory.deploy(constructor_args)?; - let deployer = ::ethers::contract::ContractDeployer::new(deployer); - Ok(deployer) - } - ///Calls the contract's `verifyProof` (0x68444dc7) function - pub fn verify_proof( - &self, - input: [::ethers::core::types::U256; 5], - p: [::ethers::core::types::U256; 8], - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([104, 68, 77, 199], (input, p)) - .expect("method not found (this should never happen)") - } - } - impl From<::ethers::contract::Contract> - for TransferVerifier - { - 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(uint256[5],uint256[8])` and selector `0x68444dc7` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "verifyProof", abi = "verifyProof(uint256[5],uint256[8])")] - pub struct VerifyProofCall { - pub input: [::ethers::core::types::U256; 5], - pub p: [::ethers::core::types::U256; 8], - } - ///Container type for all return fields from the `verifyProof` function with signature `verifyProof(uint256[5],uint256[8])` and selector `0x68444dc7` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct VerifyProofReturn(pub bool); -} diff --git a/bindings/src/transfer_verifier_wrapper.rs b/bindings/src/transfer_verifier_wrapper.rs deleted file mode 100644 index 447a795..0000000 --- a/bindings/src/transfer_verifier_wrapper.rs +++ /dev/null @@ -1,1158 +0,0 @@ -pub use transfer_verifier_wrapper::*; -/// 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 transfer_verifier_wrapper { - pub use super::super::shared_types::*; - #[allow(deprecated)] - fn __abi() -> ::ethers::core::abi::Abi { - ::ethers::core::abi::ethabi::Contract { - constructor: ::core::option::Option::Some(::ethers::core::abi::ethabi::Constructor { - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("_iverifier"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("contract i_transfer_verifier",), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("_sampleInput"), - kind: ::ethers::core::abi::ethabi::ParamType::Bytes, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("_sampleProof"), - kind: ::ethers::core::abi::ethabi::ParamType::Bytes, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes"), - ), - }, - ], - }), - functions: ::core::convert::From::from([ - ( - ::std::borrow::ToOwned::to_owned("checkSampleInputsAndProof"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("checkSampleInputsAndProof",), - inputs: ::std::vec![], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Bool, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bool"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("createRequest"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("createRequest"), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("ask"), - kind: ::ethers::core::abi::ethabi::ParamType::Tuple(::std::vec![ - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ::ethers::core::abi::ethabi::ParamType::Address, - ::ethers::core::abi::ethabi::ParamType::Bytes, - ],), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("struct ProofMarketplace.Ask",), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("secretType"), - kind: ::ethers::core::abi::ethabi::ParamType::Uint(8usize), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned( - "enum ProofMarketplace.SecretType", - ), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("secret_inputs"), - kind: ::ethers::core::abi::ethabi::ParamType::Bytes, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("acl"), - kind: ::ethers::core::abi::ethabi::ParamType::Bytes, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes"), - ), - }, - ], - outputs: ::std::vec![], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("encodeInputAndProofForVerification"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned( - "encodeInputAndProofForVerification", - ), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("inputs"), - kind: ::ethers::core::abi::ethabi::ParamType::FixedArray( - ::std::boxed::Box::new( - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ), - 5usize, - ), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256[5]"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("proof"), - kind: ::ethers::core::abi::ethabi::ParamType::FixedArray( - ::std::boxed::Box::new( - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ), - 8usize, - ), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256[8]"), - ), - }, - ], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Bytes, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::Pure, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("encodeInputs"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("encodeInputs"), - inputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("inputs"), - kind: ::ethers::core::abi::ethabi::ParamType::FixedArray( - ::std::boxed::Box::new( - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ), - 5usize, - ), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256[5]"), - ), - },], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Bytes, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::Pure, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("encodeProof"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("encodeProof"), - inputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("proof"), - kind: ::ethers::core::abi::ethabi::ParamType::FixedArray( - ::std::boxed::Box::new( - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ), - 8usize, - ), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256[8]"), - ), - },], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Bytes, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::Pure, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("iverifier"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("iverifier"), - inputs: ::std::vec![], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("contract i_transfer_verifier",), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("proofMarketplace"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("proofMarketplace"), - inputs: ::std::vec![], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("contract ProofMarketplace",), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("sampleInput"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("sampleInput"), - inputs: ::std::vec![], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Bytes, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("sampleProof"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("sampleProof"), - inputs: ::std::vec![], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Bytes, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("setProofMarketplaceContract"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("setProofMarketplaceContract",), - inputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("_proofMarketplace"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("contract ProofMarketplace",), - ), - },], - outputs: ::std::vec![], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("verify"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("verify"), - inputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("encodedData"), - kind: ::ethers::core::abi::ethabi::ParamType::Bytes, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes"), - ), - },], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Bool, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bool"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("verifyAgainstSampleInputs"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("verifyAgainstSampleInputs",), - inputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("encodedProof"), - kind: ::ethers::core::abi::ethabi::ParamType::Bytes, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes"), - ), - },], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Bool, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bool"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("verifyInputs"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("verifyInputs"), - inputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("inputs"), - kind: ::ethers::core::abi::ethabi::ParamType::Bytes, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes"), - ), - },], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Bool, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bool"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::Pure, - },], - ), - ]), - events: ::std::collections::BTreeMap::new(), - errors: ::std::collections::BTreeMap::new(), - receive: false, - fallback: false, - } - } - ///The parsed JSON ABI of the contract. - pub static TRANSFER_VERIFIER_WRAPPER_ABI: ::ethers::contract::Lazy<::ethers::core::abi::Abi> = - ::ethers::contract::Lazy::new(__abi); - #[rustfmt::skip] - const __BYTECODE: &[u8] = b"`\xA0`@R4\x80\x15b\0\0\x11W`\0\x80\xFD[P`@Qb\0\x18>8\x03\x80b\0\x18>\x839\x81\x01`@\x81\x90Rb\0\x004\x91b\0\x03}V[`\x01`\x01`\xA0\x1B\x03\x83\x16`\x80R`\x01b\0\0O\x83\x82b\0\x04\x96V[P`\x02b\0\0^\x82\x82b\0\x04\x96V[Pb\0\0ib\0\0\xB7V[b\0\0\xAEW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x11`$\x82\x01Rp\x10\xD8[\x89\xDD\x08\x18\x99H\x19\x19\\\x1B\x1B\xDEYY`z\x1B`D\x82\x01R`d\x01`@Q\x80\x91\x03\x90\xFD[PPPb\0\x083V[`\0b\0\x01W`\x02\x80Tb\0\0\xCC\x90b\0\x04\x07V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Tb\0\0\xFA\x90b\0\x04\x07V[\x80\x15b\0\x01KW\x80`\x1F\x10b\0\x01\x1FWa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91b\0\x01KV[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11b\0\x01-W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPb\0\x01\\\x92PPPV[\x90P\x90V[`\0\x80`\x01\x83`@Q` \x01b\0\x01u\x92\x91\x90b\0\x05\x90V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x90Pb\0\x01\x92\x81b\0\x01\x99V[\x93\x92PPPV[`\0b\0\x01\xA5b\0\x02}V[b\0\x01\xAFb\0\x02\x9BV[`\0\x80\x85\x80` \x01\x90Q\x81\x01\x90b\0\x01\xC8\x91\x90b\0\x069V[\x91P\x91P\x81\x80` \x01\x90Q\x81\x01\x90b\0\x01\xE2\x91\x90b\0\x06\xA3V[\x93P\x80\x80` \x01\x90Q\x81\x01\x90b\0\x01\xFA\x91\x90b\0\x07(V[`\x80Q`@QchDM\xC7`\xE0\x1B\x81R\x91\x94P`\x01`\x01`\xA0\x1B\x03\x16\x90chDM\xC7\x90b\0\x02/\x90\x87\x90\x87\x90`\x04\x01b\0\x07\xAEV[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15b\0\x02MW=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90b\0\x02s\x91\x90b\0\x08\x0FV[\x96\x95PPPPPPV[`@Q\x80`\xA0\x01`@R\x80`\x05\x90` \x82\x02\x806\x837P\x91\x92\x91PPV[`@Q\x80a\x01\0\x01`@R\x80`\x08\x90` \x82\x02\x806\x837P\x91\x92\x91PPV[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`\0[\x83\x81\x10\x15b\0\x02\xEDW\x81\x81\x01Q\x83\x82\x01R` \x01b\0\x02\xD3V[PP`\0\x91\x01RV[`\0\x82`\x1F\x83\x01\x12b\0\x03\x08W`\0\x80\xFD[\x81Q`\x01`\x01`@\x1B\x03\x80\x82\x11\x15b\0\x03%Wb\0\x03%b\0\x02\xBAV[`@Q`\x1F\x83\x01`\x1F\x19\x90\x81\x16`?\x01\x16\x81\x01\x90\x82\x82\x11\x81\x83\x10\x17\x15b\0\x03PWb\0\x03Pb\0\x02\xBAV[\x81`@R\x83\x81R\x86` \x85\x88\x01\x01\x11\x15b\0\x03jW`\0\x80\xFD[b\0\x02s\x84` \x83\x01` \x89\x01b\0\x02\xD0V[`\0\x80`\0``\x84\x86\x03\x12\x15b\0\x03\x93W`\0\x80\xFD[\x83Q`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14b\0\x03\xABW`\0\x80\xFD[` \x85\x01Q\x90\x93P`\x01`\x01`@\x1B\x03\x80\x82\x11\x15b\0\x03\xC9W`\0\x80\xFD[b\0\x03\xD7\x87\x83\x88\x01b\0\x02\xF6V[\x93P`@\x86\x01Q\x91P\x80\x82\x11\x15b\0\x03\xEEW`\0\x80\xFD[Pb\0\x03\xFD\x86\x82\x87\x01b\0\x02\xF6V[\x91PP\x92P\x92P\x92V[`\x01\x81\x81\x1C\x90\x82\x16\x80b\0\x04\x1CW`\x7F\x82\x16\x91P[` \x82\x10\x81\x03b\0\x04=WcNH{q`\xE0\x1B`\0R`\"`\x04R`$`\0\xFD[P\x91\x90PV[`\x1F\x82\x11\x15b\0\x04\x91W`\0\x81\x81R` \x81 `\x1F\x85\x01`\x05\x1C\x81\x01` \x86\x10\x15b\0\x04lWP\x80[`\x1F\x85\x01`\x05\x1C\x82\x01\x91P[\x81\x81\x10\x15b\0\x04\x8DW\x82\x81U`\x01\x01b\0\x04xV[PPP[PPPV[\x81Q`\x01`\x01`@\x1B\x03\x81\x11\x15b\0\x04\xB2Wb\0\x04\xB2b\0\x02\xBAV[b\0\x04\xCA\x81b\0\x04\xC3\x84Tb\0\x04\x07V[\x84b\0\x04CV[` \x80`\x1F\x83\x11`\x01\x81\x14b\0\x05\x02W`\0\x84\x15b\0\x04\xE9WP\x85\x83\x01Q[`\0\x19`\x03\x86\x90\x1B\x1C\x19\x16`\x01\x85\x90\x1B\x17\x85Ub\0\x04\x8DV[`\0\x85\x81R` \x81 `\x1F\x19\x86\x16\x91[\x82\x81\x10\x15b\0\x053W\x88\x86\x01Q\x82U\x94\x84\x01\x94`\x01\x90\x91\x01\x90\x84\x01b\0\x05\x12V[P\x85\x82\x10\x15b\0\x05RW\x87\x85\x01Q`\0\x19`\x03\x88\x90\x1B`\xF8\x16\x1C\x19\x16\x81U[PPPPP`\x01\x90\x81\x1B\x01\x90UPV[`\0\x81Q\x80\x84Rb\0\x05|\x81` \x86\x01` \x86\x01b\0\x02\xD0V[`\x1F\x01`\x1F\x19\x16\x92\x90\x92\x01` \x01\x92\x91PPV[`@\x81R`\0\x80\x84Tb\0\x05\xA4\x81b\0\x04\x07V[\x80`@\x86\x01R```\x01\x80\x84\x16`\0\x81\x14b\0\x05\xC9W`\x01\x81\x14b\0\x05\xE4Wb\0\x06\x17V[`\xFF\x19\x85\x16\x88\x84\x01R\x83\x15\x15`\x05\x1B\x88\x01\x83\x01\x95Pb\0\x06\x17V[\x89`\0R` \x80`\0 `\0[\x86\x81\x10\x15b\0\x06\x0EW\x81T\x8B\x82\x01\x87\x01R\x90\x84\x01\x90\x82\x01b\0\x05\xF1V[\x8A\x01\x85\x01\x97PPP[PPPPP\x82\x81\x03` \x84\x01Rb\0\x060\x81\x85b\0\x05bV[\x95\x94PPPPPV[`\0\x80`@\x83\x85\x03\x12\x15b\0\x06MW`\0\x80\xFD[\x82Q`\x01`\x01`@\x1B\x03\x80\x82\x11\x15b\0\x06eW`\0\x80\xFD[b\0\x06s\x86\x83\x87\x01b\0\x02\xF6V[\x93P` \x85\x01Q\x91P\x80\x82\x11\x15b\0\x06\x8AW`\0\x80\xFD[Pb\0\x06\x99\x85\x82\x86\x01b\0\x02\xF6V[\x91PP\x92P\x92\x90PV[`\0`\xA0\x82\x84\x03\x12\x15b\0\x06\xB6W`\0\x80\xFD[\x82`\x1F\x83\x01\x12b\0\x06\xC6W`\0\x80\xFD[`@Q`\xA0\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15b\0\x06\xEBWb\0\x06\xEBb\0\x02\xBAV[`@R\x80`\xA0\x84\x01\x85\x81\x11\x15b\0\x07\x01W`\0\x80\xFD[\x84[\x81\x81\x10\x15b\0\x07\x1DW\x80Q\x83R` \x92\x83\x01\x92\x01b\0\x07\x03V[P\x91\x95\x94PPPPPV[`\0a\x01\0\x80\x83\x85\x03\x12\x15b\0\x07=W`\0\x80\xFD[\x83`\x1F\x84\x01\x12b\0\x07MW`\0\x80\xFD[`@Q\x81\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15b\0\x07qWb\0\x07qb\0\x02\xBAV[`@R\x90\x83\x01\x90\x80\x85\x83\x11\x15b\0\x07\x87W`\0\x80\xFD[\x84[\x83\x81\x10\x15b\0\x07\xA3W\x80Q\x82R` \x91\x82\x01\x91\x01b\0\x07\x89V[P\x90\x95\x94PPPPPV[a\x01\xA0\x81\x01\x81\x84`\0[`\x05\x81\x10\x15b\0\x07\xD9W\x81Q\x83R` \x92\x83\x01\x92\x90\x91\x01\x90`\x01\x01b\0\x07\xB8V[PPP`\xA0\x82\x01\x83`\0[`\x08\x81\x10\x15b\0\x08\x05W\x81Q\x83R` \x92\x83\x01\x92\x90\x91\x01\x90`\x01\x01b\0\x07\xE4V[PPP\x93\x92PPPV[`\0` \x82\x84\x03\x12\x15b\0\x08\"W`\0\x80\xFD[\x81Q\x80\x15\x15\x81\x14b\0\x01\x92W`\0\x80\xFD[`\x80Qa\x0F\xE8b\0\x08V`\09`\0\x81\x81a\x01\xD8\x01Ra\x04b\x01Ra\x0F\xE8`\0\xF3\xFE`\x80`@R4\x80\x15a\0\x10W`\0\x80\xFD[P`\x046\x10a\0\xCFW`\x005`\xE0\x1C\x80c\x8Ev\n\xFE\x11a\0\x8CW\x80c\xA7l\x05Q\x11a\0fW\x80c\xA7l\x05Q\x14a\x01\xA5W\x80c\xD2#^\xAC\x14a\x01\xADW\x80c\xDF\xD4\xAC\x1B\x14a\x01\xC0W\x80c\xE7\xF5\xB8\x1D\x14a\x01\xD3W`\0\x80\xFD[\x80c\x8Ev\n\xFE\x14a\x01lW\x80c\x99fY\x9F\x14a\x01\x7FW\x80c\xA6\xDF\xBC\x7F\x14a\x01\x92W`\0\x80\xFD[\x80c\x02\xF7}\x19\x14a\0\xD4W\x80c\x05m\xE7\x04\x14a\0\xFCW\x80c\x10\xA5By\x14a\x01\x11W\x80cd\xF1\xBC\xC7\x14a\x01\x19W\x80c}\x8A\xD4+\x14a\x019W\x80c\x81\xC4\\p\x14a\x01AW[`\0\x80\xFD[a\0\xE7a\0\xE26`\x04a\x08\x06V[a\x01\xFAV[`@Q\x90\x15\x15\x81R` \x01[`@Q\x80\x91\x03\x90\xF3[a\x01\x0Fa\x01\n6`\x04a\x08\x9EV[a\x022V[\0[a\0\xE7a\x02\xA0V[a\x01,a\x01'6`\x04a\t\x0CV[a\x03:V[`@Qa\0\xF3\x91\x90a\tyV[a\x01,a\x03cV[`\0Ta\x01T\x90`\x01`\x01`\xA0\x1B\x03\x16\x81V[`@Q`\x01`\x01`\xA0\x1B\x03\x90\x91\x16\x81R` \x01a\0\xF3V[a\0\xE7a\x01z6`\x04a\x08\x06V[a\x03\xF1V[a\x01,a\x01\x8D6`\x04a\t\xB7V[a\x04\xE4V[a\0\xE7a\x01\xA06`\x04a\n6V[a\x05!V[a\x01,a\x059V[a\x01\x0Fa\x01\xBB6`\x04a\nxV[a\x05FV[a\x01,a\x01\xCE6`\x04a\x0B-V[a\x06xV[a\x01T\x7F\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\x81V[`\0\x80`\x01\x83`@Q` \x01a\x02\x11\x92\x91\x90a\x0B\x83V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x90Pa\x02+\x81a\x03\xF1V[\x93\x92PPPV[`\0T`\x01`\x01`\xA0\x1B\x03\x16\x15a\x02~W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x0B`$\x82\x01Rj\x10[\x1C\x99XY\x1EH\x14\xD9]`\xAA\x1B`D\x82\x01R`d\x01[`@Q\x80\x91\x03\x90\xFD[`\0\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16`\x01`\x01`\xA0\x1B\x03\x92\x90\x92\x16\x91\x90\x91\x17\x90UV[`\0a\x035`\x02\x80Ta\x02\xB2\x90a\x0BIV[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\x02\xDE\x90a\x0BIV[\x80\x15a\x03+W\x80`\x1F\x10a\x03\0Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\x03+V[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\x03\x0EW\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPPa\x01\xFAV[\x90P\x90V[``\x81`@Q` \x01a\x03M\x91\x90a\x0ClV[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x90P\x91\x90PV[`\x01\x80Ta\x03p\x90a\x0BIV[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\x03\x9C\x90a\x0BIV[\x80\x15a\x03\xE9W\x80`\x1F\x10a\x03\xBEWa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\x03\xE9V[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\x03\xCCW\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81V[`\0a\x03\xFBa\x07\rV[a\x04\x03a\x07+V[`\0\x80\x85\x80` \x01\x90Q\x81\x01\x90a\x04\x1A\x91\x90a\x0C\xC8V[\x91P\x91P\x81\x80` \x01\x90Q\x81\x01\x90a\x042\x91\x90a\r,V[\x93P\x80\x80` \x01\x90Q\x81\x01\x90a\x04H\x91\x90a\r\x81V[`@QchDM\xC7`\xE0\x1B\x81R\x90\x93P`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x90chDM\xC7\x90a\x04\x99\x90\x87\x90\x87\x90`\x04\x01a\x0E\x05V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x04\xB6W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x04\xDA\x91\x90a\x0E!V[\x96\x95PPPPPPV[``a\x04\xEF\x83a\x06xV[a\x04\xF8\x83a\x03:V[`@Q` \x01a\x05\t\x92\x91\x90a\x0ECV[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x90P[\x92\x91PPV[`\0a\x05/\x82\x84\x01\x84a\x0B-V[P`\x01\x93\x92PPPV[`\x02\x80Ta\x03p\x90a\x0BIV[`\0`@Q\x80`\xE0\x01`@R\x80\x88`\0\x015\x81R` \x01\x88` \x015\x81R` \x01\x88`@\x015\x81R` \x01\x88``\x015\x81R` \x01\x88`\x80\x015\x81R` \x01\x88`\xA0\x01` \x81\x01\x90a\x05\x98\x91\x90a\x08\x9EV[`\x01`\x01`\xA0\x1B\x03\x16\x81R` \x01a\x05\xBEa\x01\xCEa\x05\xB9`\xC0\x8C\x01\x8Ca\x0EhV[a\x06\x8BV[\x90R`\0T`@Q\x91\x92P`\x01`\x01`\xA0\x1B\x03\x16\x90cpS\x8F\xCA\x90\x83\x90\x89\x90a\x05\xED\x90\x8A\x90\x8A\x90` \x01a\x0E\xAFV[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x87\x87`@Q` \x01a\x06\x0F\x92\x91\x90a\x0E\xAFV[`@Q` \x81\x83\x03\x03\x81R\x90`@R`@Q\x85c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x06=\x94\x93\x92\x91\x90a\x0F\0V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x06WW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x06kW=`\0\x80>=`\0\xFD[PPPPPPPPPPPV[``\x81`@Q` \x01a\x03M\x91\x90a\x0F\xA4V[a\x06\x93a\x07\rV[a\x06\x9D\x83\x83a\x05!V[a\x07\x01W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`/`$\x82\x01R\x7FTransfer Verifier Wrapper: Inval`D\x82\x01Rn\x1AY\x08\x1A[\x9C\x1D]\x08\x19\x9B\xDC\x9BX]`\x8A\x1B`d\x82\x01R`\x84\x01a\x02uV[a\x02+\x82\x84\x01\x84a\x0B-V[`@Q\x80`\xA0\x01`@R\x80`\x05\x90` \x82\x02\x806\x837P\x91\x92\x91PPV[`@Q\x80a\x01\0\x01`@R\x80`\x08\x90` \x82\x02\x806\x837P\x91\x92\x91PPV[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`@Qa\x01\0\x81\x01g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x82\x82\x10\x17\x15a\x07\x84Wa\x07\x84a\x07JV[`@R\x90V[`@Q`\xA0\x81\x01g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x82\x82\x10\x17\x15a\x07\x84Wa\x07\x84a\x07JV[`@Q`\x1F\x82\x01`\x1F\x19\x16\x81\x01g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x82\x82\x10\x17\x15a\x07\xD6Wa\x07\xD6a\x07JV[`@R\x91\x90PV[`\0g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x15a\x07\xF8Wa\x07\xF8a\x07JV[P`\x1F\x01`\x1F\x19\x16` \x01\x90V[`\0` \x82\x84\x03\x12\x15a\x08\x18W`\0\x80\xFD[\x815g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x08/W`\0\x80\xFD[\x82\x01`\x1F\x81\x01\x84\x13a\x08@W`\0\x80\xFD[\x805a\x08Sa\x08N\x82a\x07\xDEV[a\x07\xADV[\x81\x81R\x85` \x83\x85\x01\x01\x11\x15a\x08hW`\0\x80\xFD[\x81` \x84\x01` \x83\x017`\0\x91\x81\x01` \x01\x91\x90\x91R\x94\x93PPPPV[`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a\x08\x9BW`\0\x80\xFD[PV[`\0` \x82\x84\x03\x12\x15a\x08\xB0W`\0\x80\xFD[\x815a\x02+\x81a\x08\x86V[`\0\x82`\x1F\x83\x01\x12a\x08\xCCW`\0\x80\xFD[a\x08\xD4a\x07`V[\x80a\x01\0\x84\x01\x85\x81\x11\x15a\x08\xE7W`\0\x80\xFD[\x84[\x81\x81\x10\x15a\t\x01W\x805\x84R` \x93\x84\x01\x93\x01a\x08\xE9V[P\x90\x95\x94PPPPPV[`\0a\x01\0\x82\x84\x03\x12\x15a\t\x1FW`\0\x80\xFD[a\x02+\x83\x83a\x08\xBBV[`\0[\x83\x81\x10\x15a\tDW\x81\x81\x01Q\x83\x82\x01R` \x01a\t,V[PP`\0\x91\x01RV[`\0\x81Q\x80\x84Ra\te\x81` \x86\x01` \x86\x01a\t)V[`\x1F\x01`\x1F\x19\x16\x92\x90\x92\x01` \x01\x92\x91PPV[` \x81R`\0a\x02+` \x83\x01\x84a\tMV[`\0\x82`\x1F\x83\x01\x12a\t\x9DW`\0\x80\xFD[a\t\xA5a\x07\x8AV[\x80`\xA0\x84\x01\x85\x81\x11\x15a\x08\xE7W`\0\x80\xFD[`\0\x80a\x01\xA0\x83\x85\x03\x12\x15a\t\xCBW`\0\x80\xFD[a\t\xD5\x84\x84a\t\x8CV[\x91Pa\t\xE4\x84`\xA0\x85\x01a\x08\xBBV[\x90P\x92P\x92\x90PV[`\0\x80\x83`\x1F\x84\x01\x12a\t\xFFW`\0\x80\xFD[P\x815g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\n\x17W`\0\x80\xFD[` \x83\x01\x91P\x83` \x82\x85\x01\x01\x11\x15a\n/W`\0\x80\xFD[\x92P\x92\x90PV[`\0\x80` \x83\x85\x03\x12\x15a\nIW`\0\x80\xFD[\x825g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\n`W`\0\x80\xFD[a\nl\x85\x82\x86\x01a\t\xEDV[\x90\x96\x90\x95P\x93PPPPV[`\0\x80`\0\x80`\0\x80`\x80\x87\x89\x03\x12\x15a\n\x91W`\0\x80\xFD[\x865g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x11\x15a\n\xA9W`\0\x80\xFD[\x90\x88\x01\x90`\xE0\x82\x8B\x03\x12\x15a\n\xBDW`\0\x80\xFD[\x90\x96P` \x88\x015\x90`\x03\x82\x10a\n\xD3W`\0\x80\xFD[\x90\x95P`@\x88\x015\x90\x80\x82\x11\x15a\n\xE9W`\0\x80\xFD[a\n\xF5\x8A\x83\x8B\x01a\t\xEDV[\x90\x96P\x94P``\x89\x015\x91P\x80\x82\x11\x15a\x0B\x0EW`\0\x80\xFD[Pa\x0B\x1B\x89\x82\x8A\x01a\t\xEDV[\x97\x9A\x96\x99P\x94\x97P\x92\x95\x93\x94\x92PPPV[`\0`\xA0\x82\x84\x03\x12\x15a\x0B?W`\0\x80\xFD[a\x02+\x83\x83a\t\x8CV[`\x01\x81\x81\x1C\x90\x82\x16\x80a\x0B]W`\x7F\x82\x16\x91P[` \x82\x10\x81\x03a\x0B}WcNH{q`\xE0\x1B`\0R`\"`\x04R`$`\0\xFD[P\x91\x90PV[`@\x81R`\0\x80\x84T\x81`\x01\x82\x81\x1C\x91P\x80\x83\x16\x80a\x0B\xA3W`\x7F\x83\x16\x92P[` \x80\x84\x10\x82\x03a\x0B\xC2WcNH{q`\xE0\x1B\x86R`\"`\x04R`$\x86\xFD[`@\x88\x01\x84\x90R``\x88\x01\x82\x80\x15a\x0B\xE1W`\x01\x81\x14a\x0B\xF7Wa\x0C\"V[`\xFF\x19\x87\x16\x82R\x85\x15\x15`\x05\x1B\x82\x01\x97Pa\x0C\"V[`\0\x8C\x81R` \x90 `\0[\x87\x81\x10\x15a\x0C\x1CW\x81T\x84\x82\x01R\x90\x86\x01\x90\x84\x01a\x0C\x03V[\x83\x01\x98PP[PP\x87\x86\x03\x81\x89\x01RPPPPPa\x0C:\x81\x85a\tMV[\x95\x94PPPPPV[\x80`\0[`\x08\x81\x10\x15a\x0CfW\x81Q\x84R` \x93\x84\x01\x93\x90\x91\x01\x90`\x01\x01a\x0CGV[PPPPV[a\x01\0\x81\x01a\x05\x1B\x82\x84a\x0CCV[`\0\x82`\x1F\x83\x01\x12a\x0C\x8CW`\0\x80\xFD[\x81Qa\x0C\x9Aa\x08N\x82a\x07\xDEV[\x81\x81R\x84` \x83\x86\x01\x01\x11\x15a\x0C\xAFW`\0\x80\xFD[a\x0C\xC0\x82` \x83\x01` \x87\x01a\t)V[\x94\x93PPPPV[`\0\x80`@\x83\x85\x03\x12\x15a\x0C\xDBW`\0\x80\xFD[\x82Qg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x11\x15a\x0C\xF3W`\0\x80\xFD[a\x0C\xFF\x86\x83\x87\x01a\x0C{V[\x93P` \x85\x01Q\x91P\x80\x82\x11\x15a\r\x15W`\0\x80\xFD[Pa\r\"\x85\x82\x86\x01a\x0C{V[\x91PP\x92P\x92\x90PV[`\0`\xA0\x82\x84\x03\x12\x15a\r>W`\0\x80\xFD[\x82`\x1F\x83\x01\x12a\rMW`\0\x80\xFD[a\rUa\x07\x8AV[\x80`\xA0\x84\x01\x85\x81\x11\x15a\rgW`\0\x80\xFD[\x84[\x81\x81\x10\x15a\t\x01W\x80Q\x84R` \x93\x84\x01\x93\x01a\riV[`\0a\x01\0\x80\x83\x85\x03\x12\x15a\r\x95W`\0\x80\xFD[\x83`\x1F\x84\x01\x12a\r\xA4W`\0\x80\xFD[a\r\xACa\x07`V[\x90\x83\x01\x90\x80\x85\x83\x11\x15a\r\xBEW`\0\x80\xFD[\x84[\x83\x81\x10\x15a\r\xD8W\x80Q\x83R` \x92\x83\x01\x92\x01a\r\xC0V[P\x95\x94PPPPPV[\x80`\0[`\x05\x81\x10\x15a\x0CfW\x81Q\x84R` \x93\x84\x01\x93\x90\x91\x01\x90`\x01\x01a\r\xE6V[a\x01\xA0\x81\x01a\x0E\x14\x82\x85a\r\xE2V[a\x02+`\xA0\x83\x01\x84a\x0CCV[`\0` \x82\x84\x03\x12\x15a\x0E3W`\0\x80\xFD[\x81Q\x80\x15\x15\x81\x14a\x02+W`\0\x80\xFD[`@\x81R`\0a\x0EV`@\x83\x01\x85a\tMV[\x82\x81\x03` \x84\x01Ra\x0C:\x81\x85a\tMV[`\0\x80\x835`\x1E\x19\x846\x03\x01\x81\x12a\x0E\x7FW`\0\x80\xFD[\x83\x01\x805\x91Pg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x15a\x0E\x9AW`\0\x80\xFD[` \x01\x91P6\x81\x90\x03\x82\x13\x15a\n/W`\0\x80\xFD[` \x81R\x81` \x82\x01R\x81\x83`@\x83\x017`\0\x81\x83\x01`@\x90\x81\x01\x91\x90\x91R`\x1F\x90\x92\x01`\x1F\x19\x16\x01\x01\x91\x90PV[`\x03\x81\x10a\x0E\xFCWcNH{q`\xE0\x1B`\0R`!`\x04R`$`\0\xFD[\x90RV[`\x80\x81R\x84Q`\x80\x82\x01R` \x85\x01Q`\xA0\x82\x01R`@\x85\x01Q`\xC0\x82\x01R``\x85\x01Q`\xE0\x82\x01R`\x80\x85\x01Qa\x01\0\x82\x01R`\x01\x80`\xA0\x1B\x03`\xA0\x86\x01Q\x16a\x01 \x82\x01R`\0`\xC0\x86\x01Q`\xE0a\x01@\x84\x01Ra\x0Fda\x01`\x84\x01\x82a\tMV[\x90Pa\x0Fs` \x84\x01\x87a\x0E\xDEV[\x82\x81\x03`@\x84\x01Ra\x0F\x85\x81\x86a\tMV[\x90P\x82\x81\x03``\x84\x01Ra\x0F\x99\x81\x85a\tMV[\x97\x96PPPPPPPV[`\xA0\x81\x01a\x05\x1B\x82\x84a\r\xE2V\xFE\xA2dipfsX\"\x12 9\xE1\xB7\xD1I\xAD\x1E\xA2\x9C\x0B\xCD\xAC\xBD\x18\xFD\xD2\xDCH\x13hr\x86\xE9$\xA1\xCD#H\x03\x8E1\xD9dsolcC\0\x08\x14\x003"; - /// The bytecode of the contract. - pub static TRANSFER_VERIFIER_WRAPPER_BYTECODE: ::ethers::core::types::Bytes = - ::ethers::core::types::Bytes::from_static(__BYTECODE); - #[rustfmt::skip] - const __DEPLOYED_BYTECODE: &[u8] = b"`\x80`@R4\x80\x15a\0\x10W`\0\x80\xFD[P`\x046\x10a\0\xCFW`\x005`\xE0\x1C\x80c\x8Ev\n\xFE\x11a\0\x8CW\x80c\xA7l\x05Q\x11a\0fW\x80c\xA7l\x05Q\x14a\x01\xA5W\x80c\xD2#^\xAC\x14a\x01\xADW\x80c\xDF\xD4\xAC\x1B\x14a\x01\xC0W\x80c\xE7\xF5\xB8\x1D\x14a\x01\xD3W`\0\x80\xFD[\x80c\x8Ev\n\xFE\x14a\x01lW\x80c\x99fY\x9F\x14a\x01\x7FW\x80c\xA6\xDF\xBC\x7F\x14a\x01\x92W`\0\x80\xFD[\x80c\x02\xF7}\x19\x14a\0\xD4W\x80c\x05m\xE7\x04\x14a\0\xFCW\x80c\x10\xA5By\x14a\x01\x11W\x80cd\xF1\xBC\xC7\x14a\x01\x19W\x80c}\x8A\xD4+\x14a\x019W\x80c\x81\xC4\\p\x14a\x01AW[`\0\x80\xFD[a\0\xE7a\0\xE26`\x04a\x08\x06V[a\x01\xFAV[`@Q\x90\x15\x15\x81R` \x01[`@Q\x80\x91\x03\x90\xF3[a\x01\x0Fa\x01\n6`\x04a\x08\x9EV[a\x022V[\0[a\0\xE7a\x02\xA0V[a\x01,a\x01'6`\x04a\t\x0CV[a\x03:V[`@Qa\0\xF3\x91\x90a\tyV[a\x01,a\x03cV[`\0Ta\x01T\x90`\x01`\x01`\xA0\x1B\x03\x16\x81V[`@Q`\x01`\x01`\xA0\x1B\x03\x90\x91\x16\x81R` \x01a\0\xF3V[a\0\xE7a\x01z6`\x04a\x08\x06V[a\x03\xF1V[a\x01,a\x01\x8D6`\x04a\t\xB7V[a\x04\xE4V[a\0\xE7a\x01\xA06`\x04a\n6V[a\x05!V[a\x01,a\x059V[a\x01\x0Fa\x01\xBB6`\x04a\nxV[a\x05FV[a\x01,a\x01\xCE6`\x04a\x0B-V[a\x06xV[a\x01T\x7F\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\x81V[`\0\x80`\x01\x83`@Q` \x01a\x02\x11\x92\x91\x90a\x0B\x83V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x90Pa\x02+\x81a\x03\xF1V[\x93\x92PPPV[`\0T`\x01`\x01`\xA0\x1B\x03\x16\x15a\x02~W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x0B`$\x82\x01Rj\x10[\x1C\x99XY\x1EH\x14\xD9]`\xAA\x1B`D\x82\x01R`d\x01[`@Q\x80\x91\x03\x90\xFD[`\0\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16`\x01`\x01`\xA0\x1B\x03\x92\x90\x92\x16\x91\x90\x91\x17\x90UV[`\0a\x035`\x02\x80Ta\x02\xB2\x90a\x0BIV[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\x02\xDE\x90a\x0BIV[\x80\x15a\x03+W\x80`\x1F\x10a\x03\0Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\x03+V[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\x03\x0EW\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPPa\x01\xFAV[\x90P\x90V[``\x81`@Q` \x01a\x03M\x91\x90a\x0ClV[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x90P\x91\x90PV[`\x01\x80Ta\x03p\x90a\x0BIV[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\x03\x9C\x90a\x0BIV[\x80\x15a\x03\xE9W\x80`\x1F\x10a\x03\xBEWa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\x03\xE9V[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\x03\xCCW\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81V[`\0a\x03\xFBa\x07\rV[a\x04\x03a\x07+V[`\0\x80\x85\x80` \x01\x90Q\x81\x01\x90a\x04\x1A\x91\x90a\x0C\xC8V[\x91P\x91P\x81\x80` \x01\x90Q\x81\x01\x90a\x042\x91\x90a\r,V[\x93P\x80\x80` \x01\x90Q\x81\x01\x90a\x04H\x91\x90a\r\x81V[`@QchDM\xC7`\xE0\x1B\x81R\x90\x93P`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x90chDM\xC7\x90a\x04\x99\x90\x87\x90\x87\x90`\x04\x01a\x0E\x05V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x04\xB6W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x04\xDA\x91\x90a\x0E!V[\x96\x95PPPPPPV[``a\x04\xEF\x83a\x06xV[a\x04\xF8\x83a\x03:V[`@Q` \x01a\x05\t\x92\x91\x90a\x0ECV[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x90P[\x92\x91PPV[`\0a\x05/\x82\x84\x01\x84a\x0B-V[P`\x01\x93\x92PPPV[`\x02\x80Ta\x03p\x90a\x0BIV[`\0`@Q\x80`\xE0\x01`@R\x80\x88`\0\x015\x81R` \x01\x88` \x015\x81R` \x01\x88`@\x015\x81R` \x01\x88``\x015\x81R` \x01\x88`\x80\x015\x81R` \x01\x88`\xA0\x01` \x81\x01\x90a\x05\x98\x91\x90a\x08\x9EV[`\x01`\x01`\xA0\x1B\x03\x16\x81R` \x01a\x05\xBEa\x01\xCEa\x05\xB9`\xC0\x8C\x01\x8Ca\x0EhV[a\x06\x8BV[\x90R`\0T`@Q\x91\x92P`\x01`\x01`\xA0\x1B\x03\x16\x90cpS\x8F\xCA\x90\x83\x90\x89\x90a\x05\xED\x90\x8A\x90\x8A\x90` \x01a\x0E\xAFV[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x87\x87`@Q` \x01a\x06\x0F\x92\x91\x90a\x0E\xAFV[`@Q` \x81\x83\x03\x03\x81R\x90`@R`@Q\x85c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x06=\x94\x93\x92\x91\x90a\x0F\0V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x06WW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x06kW=`\0\x80>=`\0\xFD[PPPPPPPPPPPV[``\x81`@Q` \x01a\x03M\x91\x90a\x0F\xA4V[a\x06\x93a\x07\rV[a\x06\x9D\x83\x83a\x05!V[a\x07\x01W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`/`$\x82\x01R\x7FTransfer Verifier Wrapper: Inval`D\x82\x01Rn\x1AY\x08\x1A[\x9C\x1D]\x08\x19\x9B\xDC\x9BX]`\x8A\x1B`d\x82\x01R`\x84\x01a\x02uV[a\x02+\x82\x84\x01\x84a\x0B-V[`@Q\x80`\xA0\x01`@R\x80`\x05\x90` \x82\x02\x806\x837P\x91\x92\x91PPV[`@Q\x80a\x01\0\x01`@R\x80`\x08\x90` \x82\x02\x806\x837P\x91\x92\x91PPV[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`@Qa\x01\0\x81\x01g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x82\x82\x10\x17\x15a\x07\x84Wa\x07\x84a\x07JV[`@R\x90V[`@Q`\xA0\x81\x01g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x82\x82\x10\x17\x15a\x07\x84Wa\x07\x84a\x07JV[`@Q`\x1F\x82\x01`\x1F\x19\x16\x81\x01g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x82\x82\x10\x17\x15a\x07\xD6Wa\x07\xD6a\x07JV[`@R\x91\x90PV[`\0g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x15a\x07\xF8Wa\x07\xF8a\x07JV[P`\x1F\x01`\x1F\x19\x16` \x01\x90V[`\0` \x82\x84\x03\x12\x15a\x08\x18W`\0\x80\xFD[\x815g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x08/W`\0\x80\xFD[\x82\x01`\x1F\x81\x01\x84\x13a\x08@W`\0\x80\xFD[\x805a\x08Sa\x08N\x82a\x07\xDEV[a\x07\xADV[\x81\x81R\x85` \x83\x85\x01\x01\x11\x15a\x08hW`\0\x80\xFD[\x81` \x84\x01` \x83\x017`\0\x91\x81\x01` \x01\x91\x90\x91R\x94\x93PPPPV[`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a\x08\x9BW`\0\x80\xFD[PV[`\0` \x82\x84\x03\x12\x15a\x08\xB0W`\0\x80\xFD[\x815a\x02+\x81a\x08\x86V[`\0\x82`\x1F\x83\x01\x12a\x08\xCCW`\0\x80\xFD[a\x08\xD4a\x07`V[\x80a\x01\0\x84\x01\x85\x81\x11\x15a\x08\xE7W`\0\x80\xFD[\x84[\x81\x81\x10\x15a\t\x01W\x805\x84R` \x93\x84\x01\x93\x01a\x08\xE9V[P\x90\x95\x94PPPPPV[`\0a\x01\0\x82\x84\x03\x12\x15a\t\x1FW`\0\x80\xFD[a\x02+\x83\x83a\x08\xBBV[`\0[\x83\x81\x10\x15a\tDW\x81\x81\x01Q\x83\x82\x01R` \x01a\t,V[PP`\0\x91\x01RV[`\0\x81Q\x80\x84Ra\te\x81` \x86\x01` \x86\x01a\t)V[`\x1F\x01`\x1F\x19\x16\x92\x90\x92\x01` \x01\x92\x91PPV[` \x81R`\0a\x02+` \x83\x01\x84a\tMV[`\0\x82`\x1F\x83\x01\x12a\t\x9DW`\0\x80\xFD[a\t\xA5a\x07\x8AV[\x80`\xA0\x84\x01\x85\x81\x11\x15a\x08\xE7W`\0\x80\xFD[`\0\x80a\x01\xA0\x83\x85\x03\x12\x15a\t\xCBW`\0\x80\xFD[a\t\xD5\x84\x84a\t\x8CV[\x91Pa\t\xE4\x84`\xA0\x85\x01a\x08\xBBV[\x90P\x92P\x92\x90PV[`\0\x80\x83`\x1F\x84\x01\x12a\t\xFFW`\0\x80\xFD[P\x815g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\n\x17W`\0\x80\xFD[` \x83\x01\x91P\x83` \x82\x85\x01\x01\x11\x15a\n/W`\0\x80\xFD[\x92P\x92\x90PV[`\0\x80` \x83\x85\x03\x12\x15a\nIW`\0\x80\xFD[\x825g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\n`W`\0\x80\xFD[a\nl\x85\x82\x86\x01a\t\xEDV[\x90\x96\x90\x95P\x93PPPPV[`\0\x80`\0\x80`\0\x80`\x80\x87\x89\x03\x12\x15a\n\x91W`\0\x80\xFD[\x865g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x11\x15a\n\xA9W`\0\x80\xFD[\x90\x88\x01\x90`\xE0\x82\x8B\x03\x12\x15a\n\xBDW`\0\x80\xFD[\x90\x96P` \x88\x015\x90`\x03\x82\x10a\n\xD3W`\0\x80\xFD[\x90\x95P`@\x88\x015\x90\x80\x82\x11\x15a\n\xE9W`\0\x80\xFD[a\n\xF5\x8A\x83\x8B\x01a\t\xEDV[\x90\x96P\x94P``\x89\x015\x91P\x80\x82\x11\x15a\x0B\x0EW`\0\x80\xFD[Pa\x0B\x1B\x89\x82\x8A\x01a\t\xEDV[\x97\x9A\x96\x99P\x94\x97P\x92\x95\x93\x94\x92PPPV[`\0`\xA0\x82\x84\x03\x12\x15a\x0B?W`\0\x80\xFD[a\x02+\x83\x83a\t\x8CV[`\x01\x81\x81\x1C\x90\x82\x16\x80a\x0B]W`\x7F\x82\x16\x91P[` \x82\x10\x81\x03a\x0B}WcNH{q`\xE0\x1B`\0R`\"`\x04R`$`\0\xFD[P\x91\x90PV[`@\x81R`\0\x80\x84T\x81`\x01\x82\x81\x1C\x91P\x80\x83\x16\x80a\x0B\xA3W`\x7F\x83\x16\x92P[` \x80\x84\x10\x82\x03a\x0B\xC2WcNH{q`\xE0\x1B\x86R`\"`\x04R`$\x86\xFD[`@\x88\x01\x84\x90R``\x88\x01\x82\x80\x15a\x0B\xE1W`\x01\x81\x14a\x0B\xF7Wa\x0C\"V[`\xFF\x19\x87\x16\x82R\x85\x15\x15`\x05\x1B\x82\x01\x97Pa\x0C\"V[`\0\x8C\x81R` \x90 `\0[\x87\x81\x10\x15a\x0C\x1CW\x81T\x84\x82\x01R\x90\x86\x01\x90\x84\x01a\x0C\x03V[\x83\x01\x98PP[PP\x87\x86\x03\x81\x89\x01RPPPPPa\x0C:\x81\x85a\tMV[\x95\x94PPPPPV[\x80`\0[`\x08\x81\x10\x15a\x0CfW\x81Q\x84R` \x93\x84\x01\x93\x90\x91\x01\x90`\x01\x01a\x0CGV[PPPPV[a\x01\0\x81\x01a\x05\x1B\x82\x84a\x0CCV[`\0\x82`\x1F\x83\x01\x12a\x0C\x8CW`\0\x80\xFD[\x81Qa\x0C\x9Aa\x08N\x82a\x07\xDEV[\x81\x81R\x84` \x83\x86\x01\x01\x11\x15a\x0C\xAFW`\0\x80\xFD[a\x0C\xC0\x82` \x83\x01` \x87\x01a\t)V[\x94\x93PPPPV[`\0\x80`@\x83\x85\x03\x12\x15a\x0C\xDBW`\0\x80\xFD[\x82Qg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x11\x15a\x0C\xF3W`\0\x80\xFD[a\x0C\xFF\x86\x83\x87\x01a\x0C{V[\x93P` \x85\x01Q\x91P\x80\x82\x11\x15a\r\x15W`\0\x80\xFD[Pa\r\"\x85\x82\x86\x01a\x0C{V[\x91PP\x92P\x92\x90PV[`\0`\xA0\x82\x84\x03\x12\x15a\r>W`\0\x80\xFD[\x82`\x1F\x83\x01\x12a\rMW`\0\x80\xFD[a\rUa\x07\x8AV[\x80`\xA0\x84\x01\x85\x81\x11\x15a\rgW`\0\x80\xFD[\x84[\x81\x81\x10\x15a\t\x01W\x80Q\x84R` \x93\x84\x01\x93\x01a\riV[`\0a\x01\0\x80\x83\x85\x03\x12\x15a\r\x95W`\0\x80\xFD[\x83`\x1F\x84\x01\x12a\r\xA4W`\0\x80\xFD[a\r\xACa\x07`V[\x90\x83\x01\x90\x80\x85\x83\x11\x15a\r\xBEW`\0\x80\xFD[\x84[\x83\x81\x10\x15a\r\xD8W\x80Q\x83R` \x92\x83\x01\x92\x01a\r\xC0V[P\x95\x94PPPPPV[\x80`\0[`\x05\x81\x10\x15a\x0CfW\x81Q\x84R` \x93\x84\x01\x93\x90\x91\x01\x90`\x01\x01a\r\xE6V[a\x01\xA0\x81\x01a\x0E\x14\x82\x85a\r\xE2V[a\x02+`\xA0\x83\x01\x84a\x0CCV[`\0` \x82\x84\x03\x12\x15a\x0E3W`\0\x80\xFD[\x81Q\x80\x15\x15\x81\x14a\x02+W`\0\x80\xFD[`@\x81R`\0a\x0EV`@\x83\x01\x85a\tMV[\x82\x81\x03` \x84\x01Ra\x0C:\x81\x85a\tMV[`\0\x80\x835`\x1E\x19\x846\x03\x01\x81\x12a\x0E\x7FW`\0\x80\xFD[\x83\x01\x805\x91Pg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x15a\x0E\x9AW`\0\x80\xFD[` \x01\x91P6\x81\x90\x03\x82\x13\x15a\n/W`\0\x80\xFD[` \x81R\x81` \x82\x01R\x81\x83`@\x83\x017`\0\x81\x83\x01`@\x90\x81\x01\x91\x90\x91R`\x1F\x90\x92\x01`\x1F\x19\x16\x01\x01\x91\x90PV[`\x03\x81\x10a\x0E\xFCWcNH{q`\xE0\x1B`\0R`!`\x04R`$`\0\xFD[\x90RV[`\x80\x81R\x84Q`\x80\x82\x01R` \x85\x01Q`\xA0\x82\x01R`@\x85\x01Q`\xC0\x82\x01R``\x85\x01Q`\xE0\x82\x01R`\x80\x85\x01Qa\x01\0\x82\x01R`\x01\x80`\xA0\x1B\x03`\xA0\x86\x01Q\x16a\x01 \x82\x01R`\0`\xC0\x86\x01Q`\xE0a\x01@\x84\x01Ra\x0Fda\x01`\x84\x01\x82a\tMV[\x90Pa\x0Fs` \x84\x01\x87a\x0E\xDEV[\x82\x81\x03`@\x84\x01Ra\x0F\x85\x81\x86a\tMV[\x90P\x82\x81\x03``\x84\x01Ra\x0F\x99\x81\x85a\tMV[\x97\x96PPPPPPPV[`\xA0\x81\x01a\x05\x1B\x82\x84a\r\xE2V\xFE\xA2dipfsX\"\x12 9\xE1\xB7\xD1I\xAD\x1E\xA2\x9C\x0B\xCD\xAC\xBD\x18\xFD\xD2\xDCH\x13hr\x86\xE9$\xA1\xCD#H\x03\x8E1\xD9dsolcC\0\x08\x14\x003"; - /// The deployed bytecode of the contract. - pub static TRANSFER_VERIFIER_WRAPPER_DEPLOYED_BYTECODE: ::ethers::core::types::Bytes = - ::ethers::core::types::Bytes::from_static(__DEPLOYED_BYTECODE); - pub struct transfer_verifier_wrapper(::ethers::contract::Contract); - impl ::core::clone::Clone for transfer_verifier_wrapper { - fn clone(&self) -> Self { - Self(::core::clone::Clone::clone(&self.0)) - } - } - impl ::core::ops::Deref for transfer_verifier_wrapper { - type Target = ::ethers::contract::Contract; - fn deref(&self) -> &Self::Target { - &self.0 - } - } - impl ::core::ops::DerefMut for transfer_verifier_wrapper { - fn deref_mut(&mut self) -> &mut Self::Target { - &mut self.0 - } - } - impl ::core::fmt::Debug for transfer_verifier_wrapper { - fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { - f.debug_tuple(::core::stringify!(transfer_verifier_wrapper)) - .field(&self.address()) - .finish() - } - } - impl transfer_verifier_wrapper { - /// 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(), - TRANSFER_VERIFIER_WRAPPER_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( - TRANSFER_VERIFIER_WRAPPER_ABI.clone(), - TRANSFER_VERIFIER_WRAPPER_BYTECODE.clone().into(), - client, - ); - let deployer = factory.deploy(constructor_args)?; - let deployer = ::ethers::contract::ContractDeployer::new(deployer); - Ok(deployer) - } - ///Calls the contract's `checkSampleInputsAndProof` (0x10a54279) function - pub fn check_sample_inputs_and_proof( - &self, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([16, 165, 66, 121], ()) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `createRequest` (0xd2235eac) function - pub fn create_request( - &self, - ask: Ask, - secret_type: u8, - secret_inputs: ::ethers::core::types::Bytes, - acl: ::ethers::core::types::Bytes, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([210, 35, 94, 172], (ask, secret_type, secret_inputs, acl)) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `encodeInputAndProofForVerification` (0x9966599f) function - pub fn encode_input_and_proof_for_verification( - &self, - inputs: [::ethers::core::types::U256; 5], - proof: [::ethers::core::types::U256; 8], - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([153, 102, 89, 159], (inputs, proof)) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `encodeInputs` (0xdfd4ac1b) function - pub fn encode_inputs( - &self, - inputs: [::ethers::core::types::U256; 5], - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([223, 212, 172, 27], inputs) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `encodeProof` (0x64f1bcc7) function - pub fn encode_proof( - &self, - proof: [::ethers::core::types::U256; 8], - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([100, 241, 188, 199], proof) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `iverifier` (0xe7f5b81d) function - pub fn iverifier( - &self, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([231, 245, 184, 29], ()) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `proofMarketplace` (0x81c45c70) function - pub fn proof_marketplace( - &self, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([129, 196, 92, 112], ()) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `sampleInput` (0x7d8ad42b) function - pub fn sample_input( - &self, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([125, 138, 212, 43], ()) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `sampleProof` (0xa76c0551) function - pub fn sample_proof( - &self, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([167, 108, 5, 81], ()) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `setProofMarketplaceContract` (0x056de704) function - pub fn set_proof_marketplace_contract( - &self, - proof_marketplace: ::ethers::core::types::Address, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([5, 109, 231, 4], proof_marketplace) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `verify` (0x8e760afe) function - pub fn verify( - &self, - encoded_data: ::ethers::core::types::Bytes, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([142, 118, 10, 254], encoded_data) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `verifyAgainstSampleInputs` (0x02f77d19) function - pub fn verify_against_sample_inputs( - &self, - encoded_proof: ::ethers::core::types::Bytes, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([2, 247, 125, 25], encoded_proof) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `verifyInputs` (0xa6dfbc7f) function - pub fn verify_inputs( - &self, - inputs: ::ethers::core::types::Bytes, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([166, 223, 188, 127], inputs) - .expect("method not found (this should never happen)") - } - } - impl From<::ethers::contract::Contract> - for transfer_verifier_wrapper - { - fn from(contract: ::ethers::contract::Contract) -> Self { - Self::new(contract.address(), contract.client()) - } - } - ///Container type for all input parameters for the `checkSampleInputsAndProof` function with signature `checkSampleInputsAndProof()` and selector `0x10a54279` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall( - name = "checkSampleInputsAndProof", - abi = "checkSampleInputsAndProof()" - )] - pub struct CheckSampleInputsAndProofCall; - ///Container type for all input parameters for the `createRequest` function with signature `createRequest((uint256,uint256,uint256,uint256,uint256,address,bytes),uint8,bytes,bytes)` and selector `0xd2235eac` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall( - name = "createRequest", - abi = "createRequest((uint256,uint256,uint256,uint256,uint256,address,bytes),uint8,bytes,bytes)" - )] - pub struct CreateRequestCall { - pub ask: Ask, - pub secret_type: u8, - pub secret_inputs: ::ethers::core::types::Bytes, - pub acl: ::ethers::core::types::Bytes, - } - ///Container type for all input parameters for the `encodeInputAndProofForVerification` function with signature `encodeInputAndProofForVerification(uint256[5],uint256[8])` and selector `0x9966599f` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall( - name = "encodeInputAndProofForVerification", - abi = "encodeInputAndProofForVerification(uint256[5],uint256[8])" - )] - pub struct EncodeInputAndProofForVerificationCall { - pub inputs: [::ethers::core::types::U256; 5], - pub proof: [::ethers::core::types::U256; 8], - } - ///Container type for all input parameters for the `encodeInputs` function with signature `encodeInputs(uint256[5])` and selector `0xdfd4ac1b` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "encodeInputs", abi = "encodeInputs(uint256[5])")] - pub struct EncodeInputsCall { - pub inputs: [::ethers::core::types::U256; 5], - } - ///Container type for all input parameters for the `encodeProof` function with signature `encodeProof(uint256[8])` and selector `0x64f1bcc7` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "encodeProof", abi = "encodeProof(uint256[8])")] - pub struct EncodeProofCall { - pub proof: [::ethers::core::types::U256; 8], - } - ///Container type for all input parameters for the `iverifier` function with signature `iverifier()` and selector `0xe7f5b81d` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "iverifier", abi = "iverifier()")] - pub struct IverifierCall; - ///Container type for all input parameters for the `proofMarketplace` function with signature `proofMarketplace()` and selector `0x81c45c70` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "proofMarketplace", abi = "proofMarketplace()")] - pub struct ProofMarketplaceCall; - ///Container type for all input parameters for the `sampleInput` function with signature `sampleInput()` and selector `0x7d8ad42b` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "sampleInput", abi = "sampleInput()")] - pub struct SampleInputCall; - ///Container type for all input parameters for the `sampleProof` function with signature `sampleProof()` and selector `0xa76c0551` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "sampleProof", abi = "sampleProof()")] - pub struct SampleProofCall; - ///Container type for all input parameters for the `setProofMarketplaceContract` function with signature `setProofMarketplaceContract(address)` and selector `0x056de704` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall( - name = "setProofMarketplaceContract", - abi = "setProofMarketplaceContract(address)" - )] - pub struct SetProofMarketplaceContractCall { - pub proof_marketplace: ::ethers::core::types::Address, - } - ///Container type for all input parameters for the `verify` function with signature `verify(bytes)` and selector `0x8e760afe` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "verify", abi = "verify(bytes)")] - pub struct VerifyCall { - pub encoded_data: ::ethers::core::types::Bytes, - } - ///Container type for all input parameters for the `verifyAgainstSampleInputs` function with signature `verifyAgainstSampleInputs(bytes)` and selector `0x02f77d19` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall( - name = "verifyAgainstSampleInputs", - abi = "verifyAgainstSampleInputs(bytes)" - )] - pub struct VerifyAgainstSampleInputsCall { - pub encoded_proof: ::ethers::core::types::Bytes, - } - ///Container type for all input parameters for the `verifyInputs` function with signature `verifyInputs(bytes)` and selector `0xa6dfbc7f` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "verifyInputs", abi = "verifyInputs(bytes)")] - pub struct VerifyInputsCall { - pub inputs: ::ethers::core::types::Bytes, - } - ///Container type for all of the contract's call - #[derive( - Clone, - ::ethers::contract::EthAbiType, - serde::Serialize, - serde::Deserialize, - Debug, - PartialEq, - Eq, - Hash, - )] - pub enum transfer_verifier_wrapperCalls { - CheckSampleInputsAndProof(CheckSampleInputsAndProofCall), - CreateRequest(CreateRequestCall), - EncodeInputAndProofForVerification(EncodeInputAndProofForVerificationCall), - EncodeInputs(EncodeInputsCall), - EncodeProof(EncodeProofCall), - Iverifier(IverifierCall), - ProofMarketplace(ProofMarketplaceCall), - SampleInput(SampleInputCall), - SampleProof(SampleProofCall), - SetProofMarketplaceContract(SetProofMarketplaceContractCall), - Verify(VerifyCall), - VerifyAgainstSampleInputs(VerifyAgainstSampleInputsCall), - VerifyInputs(VerifyInputsCall), - } - impl ::ethers::core::abi::AbiDecode for transfer_verifier_wrapperCalls { - fn decode( - data: impl AsRef<[u8]>, - ) -> ::core::result::Result { - let data = data.as_ref(); - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::CheckSampleInputsAndProof(decoded)); - } - if let Ok(decoded) = ::decode(data) - { - return Ok(Self::CreateRequest(decoded)); - } - if let Ok(decoded) = - ::decode( - data, - ) - { - return Ok(Self::EncodeInputAndProofForVerification(decoded)); - } - if let Ok(decoded) = ::decode(data) - { - return Ok(Self::EncodeInputs(decoded)); - } - if let Ok(decoded) = ::decode(data) { - return Ok(Self::EncodeProof(decoded)); - } - if let Ok(decoded) = ::decode(data) { - return Ok(Self::Iverifier(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::ProofMarketplace(decoded)); - } - if let Ok(decoded) = ::decode(data) { - return Ok(Self::SampleInput(decoded)); - } - if let Ok(decoded) = ::decode(data) { - return Ok(Self::SampleProof(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::SetProofMarketplaceContract(decoded)); - } - if let Ok(decoded) = ::decode(data) { - return Ok(Self::Verify(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::VerifyAgainstSampleInputs(decoded)); - } - if let Ok(decoded) = ::decode(data) - { - return Ok(Self::VerifyInputs(decoded)); - } - Err(::ethers::core::abi::Error::InvalidData.into()) - } - } - impl ::ethers::core::abi::AbiEncode for transfer_verifier_wrapperCalls { - fn encode(self) -> Vec { - match self { - Self::CheckSampleInputsAndProof(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::CreateRequest(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::EncodeInputAndProofForVerification(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::EncodeInputs(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::EncodeProof(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::Iverifier(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::ProofMarketplace(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::SampleInput(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::SampleProof(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::SetProofMarketplaceContract(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::Verify(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::VerifyAgainstSampleInputs(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::VerifyInputs(element) => ::ethers::core::abi::AbiEncode::encode(element), - } - } - } - impl ::core::fmt::Display for transfer_verifier_wrapperCalls { - fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { - match self { - Self::CheckSampleInputsAndProof(element) => ::core::fmt::Display::fmt(element, f), - Self::CreateRequest(element) => ::core::fmt::Display::fmt(element, f), - Self::EncodeInputAndProofForVerification(element) => { - ::core::fmt::Display::fmt(element, f) - } - Self::EncodeInputs(element) => ::core::fmt::Display::fmt(element, f), - Self::EncodeProof(element) => ::core::fmt::Display::fmt(element, f), - Self::Iverifier(element) => ::core::fmt::Display::fmt(element, f), - Self::ProofMarketplace(element) => ::core::fmt::Display::fmt(element, f), - Self::SampleInput(element) => ::core::fmt::Display::fmt(element, f), - Self::SampleProof(element) => ::core::fmt::Display::fmt(element, f), - Self::SetProofMarketplaceContract(element) => ::core::fmt::Display::fmt(element, f), - Self::Verify(element) => ::core::fmt::Display::fmt(element, f), - Self::VerifyAgainstSampleInputs(element) => ::core::fmt::Display::fmt(element, f), - Self::VerifyInputs(element) => ::core::fmt::Display::fmt(element, f), - } - } - } - impl ::core::convert::From for transfer_verifier_wrapperCalls { - fn from(value: CheckSampleInputsAndProofCall) -> Self { - Self::CheckSampleInputsAndProof(value) - } - } - impl ::core::convert::From for transfer_verifier_wrapperCalls { - fn from(value: CreateRequestCall) -> Self { - Self::CreateRequest(value) - } - } - impl ::core::convert::From - for transfer_verifier_wrapperCalls - { - fn from(value: EncodeInputAndProofForVerificationCall) -> Self { - Self::EncodeInputAndProofForVerification(value) - } - } - impl ::core::convert::From for transfer_verifier_wrapperCalls { - fn from(value: EncodeInputsCall) -> Self { - Self::EncodeInputs(value) - } - } - impl ::core::convert::From for transfer_verifier_wrapperCalls { - fn from(value: EncodeProofCall) -> Self { - Self::EncodeProof(value) - } - } - impl ::core::convert::From for transfer_verifier_wrapperCalls { - fn from(value: IverifierCall) -> Self { - Self::Iverifier(value) - } - } - impl ::core::convert::From for transfer_verifier_wrapperCalls { - fn from(value: ProofMarketplaceCall) -> Self { - Self::ProofMarketplace(value) - } - } - impl ::core::convert::From for transfer_verifier_wrapperCalls { - fn from(value: SampleInputCall) -> Self { - Self::SampleInput(value) - } - } - impl ::core::convert::From for transfer_verifier_wrapperCalls { - fn from(value: SampleProofCall) -> Self { - Self::SampleProof(value) - } - } - impl ::core::convert::From for transfer_verifier_wrapperCalls { - fn from(value: SetProofMarketplaceContractCall) -> Self { - Self::SetProofMarketplaceContract(value) - } - } - impl ::core::convert::From for transfer_verifier_wrapperCalls { - fn from(value: VerifyCall) -> Self { - Self::Verify(value) - } - } - impl ::core::convert::From for transfer_verifier_wrapperCalls { - fn from(value: VerifyAgainstSampleInputsCall) -> Self { - Self::VerifyAgainstSampleInputs(value) - } - } - impl ::core::convert::From for transfer_verifier_wrapperCalls { - fn from(value: VerifyInputsCall) -> Self { - Self::VerifyInputs(value) - } - } - ///Container type for all return fields from the `checkSampleInputsAndProof` function with signature `checkSampleInputsAndProof()` and selector `0x10a54279` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct CheckSampleInputsAndProofReturn(pub bool); - ///Container type for all return fields from the `encodeInputAndProofForVerification` function with signature `encodeInputAndProofForVerification(uint256[5],uint256[8])` and selector `0x9966599f` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct EncodeInputAndProofForVerificationReturn(pub ::ethers::core::types::Bytes); - ///Container type for all return fields from the `encodeInputs` function with signature `encodeInputs(uint256[5])` and selector `0xdfd4ac1b` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct EncodeInputsReturn(pub ::ethers::core::types::Bytes); - ///Container type for all return fields from the `encodeProof` function with signature `encodeProof(uint256[8])` and selector `0x64f1bcc7` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct EncodeProofReturn(pub ::ethers::core::types::Bytes); - ///Container type for all return fields from the `iverifier` function with signature `iverifier()` and selector `0xe7f5b81d` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct IverifierReturn(pub ::ethers::core::types::Address); - ///Container type for all return fields from the `proofMarketplace` function with signature `proofMarketplace()` and selector `0x81c45c70` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct ProofMarketplaceReturn(pub ::ethers::core::types::Address); - ///Container type for all return fields from the `sampleInput` function with signature `sampleInput()` and selector `0x7d8ad42b` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct SampleInputReturn(pub ::ethers::core::types::Bytes); - ///Container type for all return fields from the `sampleProof` function with signature `sampleProof()` and selector `0xa76c0551` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct SampleProofReturn(pub ::ethers::core::types::Bytes); - ///Container type for all return fields from the `verify` function with signature `verify(bytes)` and selector `0x8e760afe` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct VerifyReturn(pub bool); - ///Container type for all return fields from the `verifyAgainstSampleInputs` function with signature `verifyAgainstSampleInputs(bytes)` and selector `0x02f77d19` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct VerifyAgainstSampleInputsReturn(pub bool); - ///Container type for all return fields from the `verifyInputs` function with signature `verifyInputs(bytes)` and selector `0xa6dfbc7f` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct VerifyInputsReturn(pub bool); -} diff --git a/bindings/src/uc.rs b/bindings/src/uc.rs deleted file mode 100644 index 6c3e04f..0000000 --- a/bindings/src/uc.rs +++ /dev/null @@ -1,1181 +0,0 @@ -pub use uc::*; -/// 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 uc { - #[allow(deprecated)] - fn __abi() -> ::ethers::core::abi::Abi { - ::ethers::core::abi::ethabi::Contract { - constructor: ::core::option::Option::Some(::ethers::core::abi::ethabi::Constructor { - inputs: ::std::vec![], - }), - functions: ::core::convert::From::from([ - ( - ::std::borrow::ToOwned::to_owned("UPGRADE_INTERFACE_VERSION"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("UPGRADE_INTERFACE_VERSION",), - inputs: ::std::vec![], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::String, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("string"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("initialize"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("initialize"), - inputs: ::std::vec![], - outputs: ::std::vec![], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("my_operation1"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("my_operation1"), - inputs: ::std::vec![], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("my_operation2"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("my_operation2"), - inputs: ::std::vec![], - outputs: ::std::vec![], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("proxiableUUID"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("proxiableUUID"), - inputs: ::std::vec![], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::FixedBytes(32usize,), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes32"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("slot1"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("slot1"), - inputs: ::std::vec![], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("supportsInterface"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("supportsInterface"), - inputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("interfaceId"), - kind: ::ethers::core::abi::ethabi::ParamType::FixedBytes(4usize,), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes4"), - ), - },], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Bool, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bool"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("upgradeToAndCall"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("upgradeToAndCall"), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("newImplementation"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("data"), - kind: ::ethers::core::abi::ethabi::ParamType::Bytes, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes"), - ), - }, - ], - outputs: ::std::vec![], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::Payable, - },], - ), - ]), - events: ::core::convert::From::from([ - ( - ::std::borrow::ToOwned::to_owned("Initialized"), - ::std::vec![::ethers::core::abi::ethabi::Event { - name: ::std::borrow::ToOwned::to_owned("Initialized"), - inputs: ::std::vec![::ethers::core::abi::ethabi::EventParam { - name: ::std::borrow::ToOwned::to_owned("version"), - kind: ::ethers::core::abi::ethabi::ParamType::Uint(64usize), - indexed: false, - },], - anonymous: false, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("Upgraded"), - ::std::vec![::ethers::core::abi::ethabi::Event { - name: ::std::borrow::ToOwned::to_owned("Upgraded"), - inputs: ::std::vec![::ethers::core::abi::ethabi::EventParam { - name: ::std::borrow::ToOwned::to_owned("implementation"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - indexed: true, - },], - anonymous: false, - },], - ), - ]), - errors: ::core::convert::From::from([ - ( - ::std::borrow::ToOwned::to_owned("AddressEmptyCode"), - ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("AddressEmptyCode"), - inputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("target"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - },], - },], - ), - ( - ::std::borrow::ToOwned::to_owned("ERC1967InvalidImplementation"), - ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("ERC1967InvalidImplementation",), - inputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("implementation"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - },], - },], - ), - ( - ::std::borrow::ToOwned::to_owned("ERC1967NonPayable"), - ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("ERC1967NonPayable"), - inputs: ::std::vec![], - },], - ), - ( - ::std::borrow::ToOwned::to_owned("FailedInnerCall"), - ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("FailedInnerCall"), - inputs: ::std::vec![], - },], - ), - ( - ::std::borrow::ToOwned::to_owned("InvalidInitialization"), - ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("InvalidInitialization",), - inputs: ::std::vec![], - },], - ), - ( - ::std::borrow::ToOwned::to_owned("NotInitializing"), - ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("NotInitializing"), - inputs: ::std::vec![], - },], - ), - ( - ::std::borrow::ToOwned::to_owned("UUPSUnauthorizedCallContext"), - ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("UUPSUnauthorizedCallContext",), - inputs: ::std::vec![], - },], - ), - ( - ::std::borrow::ToOwned::to_owned("UUPSUnsupportedProxiableUUID"), - ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("UUPSUnsupportedProxiableUUID",), - inputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("slot"), - kind: ::ethers::core::abi::ethabi::ParamType::FixedBytes(32usize,), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes32"), - ), - },], - },], - ), - ]), - receive: false, - fallback: false, - } - } - ///The parsed JSON ABI of the contract. - pub static UC_ABI: ::ethers::contract::Lazy<::ethers::core::abi::Abi> = - ::ethers::contract::Lazy::new(__abi); - #[rustfmt::skip] - const __BYTECODE: &[u8] = b"`\xA0`@R0`\x80R4\x80\x15a\0\x14W`\0\x80\xFD[P\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x80Th\x01\0\0\0\0\0\0\0\0\x81\x04`\xFF\x16\x15\x90`\x01`\x01`@\x1B\x03\x16`\0\x81\x15\x80\x15a\0_WP\x82[\x90P`\0\x82`\x01`\x01`@\x1B\x03\x16`\x01\x14\x80\x15a\0{WP0;\x15[\x90P\x81\x15\x80\x15a\0\x89WP\x80\x15[\x15a\0\xA7W`@Qc\xF9.\xE8\xA9`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x84T`\x01`\x01`@\x1B\x03\x19\x16`\x01\x17\x85U\x83\x15a\0\xD5W\x84T`\xFF`@\x1B\x19\x16h\x01\0\0\0\0\0\0\0\0\x17\x85U[\x83\x15a\x01\x1BW\x84T`\xFF`@\x1B\x19\x16\x85U`@Q`\x01\x81R\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x90` \x01`@Q\x80\x91\x03\x90\xA1[PPPPP`\x80Qa\x08Da\x01I`\09`\0\x81\x81a\x02\xD0\x01R\x81\x81a\x02\xF9\x01Ra\x04<\x01Ra\x08D`\0\xF3\xFE`\x80`@R`\x046\x10a\0{W`\x005`\xE0\x1C\x80c\x81)\xFC\x1C\x11a\0NW\x80c\x81)\xFC\x1C\x14a\x01\x15W\x80c\xAD<\xB1\xCC\x14a\x01*W\x80c\xBC.f\xE6\x14a\x01hW\x80c\xEE\xFBDa\x14a\x01tW`\0\x80\xFD[\x80c\x01\xFF\xC9\xA7\x14a\0\x80W\x80c\x1FE|\xB5\x14a\0\xC6W\x80cO\x1E\xF2\x86\x14a\0\xEBW\x80cR\xD1\x90-\x14a\x01\0W[`\0\x80\xFD[4\x80\x15a\0\x8CW`\0\x80\xFD[Pa\0\xB1a\0\x9B6`\x04a\x06RV[`\x01`\x01`\xE0\x1B\x03\x19\x16c\x01\xFF\xC9\xA7`\xE0\x1B\x14\x90V[`@Q\x90\x15\x15\x81R` \x01[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\0\xD2W`\0\x80\xFD[Pa\0\xDDa\x01\xF4T\x81V[`@Q\x90\x81R` \x01a\0\xBDV[a\0\xFEa\0\xF96`\x04a\x06\x92V[a\x01\x8AV[\0[4\x80\x15a\x01\x0CW`\0\x80\xFD[Pa\0\xDDa\x01\xA0V[4\x80\x15a\x01!W`\0\x80\xFD[Pa\0\xFEa\x01\xBDV[4\x80\x15a\x016W`\0\x80\xFD[Pa\x01[`@Q\x80`@\x01`@R\x80`\x05\x81R` \x01d\x03R\xE3\x02\xE3`\xDC\x1B\x81RP\x81V[`@Qa\0\xBD\x91\x90a\x07\x86V[4\x80\x15a\0\xFEW`\0\x80\xFD[4\x80\x15a\x01\x80W`\0\x80\xFD[Pa\x01\xF4Ta\0\xDDV[a\x01\x92a\x02\xC5V[a\x01\x9C\x82\x82a\x03jV[PPV[`\0a\x01\xAAa\x041V[P`\0\x80Q` a\x07\xEF\x839\x81Q\x91R\x90V[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x80T`\x01`@\x1B\x81\x04`\xFF\x16\x15\x90g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16`\0\x81\x15\x80\x15a\x02\x03WP\x82[\x90P`\0\x82g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16`\x01\x14\x80\x15a\x02 WP0;\x15[\x90P\x81\x15\x80\x15a\x02.WP\x80\x15[\x15a\x02LW`@Qc\xF9.\xE8\xA9`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x84Tg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x19\x16`\x01\x17\x85U\x83\x15a\x02vW\x84T`\xFF`@\x1B\x19\x16`\x01`@\x1B\x17\x85U[\x83\x15a\x02\xBCW\x84T`\xFF`@\x1B\x19\x16\x85U`@Q`\x01\x81R\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x90` \x01`@Q\x80\x91\x03\x90\xA1[PPPPPV[V[0`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x14\x80a\x03LWP\x7F\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`\x01`\x01`\xA0\x1B\x03\x16a\x03@`\0\x80Q` a\x07\xEF\x839\x81Q\x91RT`\x01`\x01`\xA0\x1B\x03\x16\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x14\x15[\x15a\x02\xC3W`@Qcp>F\xDD`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x81`\x01`\x01`\xA0\x1B\x03\x16cR\xD1\x90-`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x92PPP\x80\x15a\x03\xC4WP`@\x80Q`\x1F=\x90\x81\x01`\x1F\x19\x16\x82\x01\x90\x92Ra\x03\xC1\x91\x81\x01\x90a\x07\xB9V[`\x01[a\x03\xF1W`@QcL\x9C\x8C\xE3`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x83\x16`\x04\x82\x01R`$\x01[`@Q\x80\x91\x03\x90\xFD[`\0\x80Q` a\x07\xEF\x839\x81Q\x91R\x81\x14a\x04\"W`@Qc*\x87Ri`\xE2\x1B\x81R`\x04\x81\x01\x82\x90R`$\x01a\x03\xE8V[a\x04,\x83\x83a\x04zV[PPPV[0`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x14a\x02\xC3W`@Qcp>F\xDD`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x04\x83\x82a\x04\xD0V[`@Q`\x01`\x01`\xA0\x1B\x03\x83\x16\x90\x7F\xBC|\xD7Z \xEE'\xFD\x9A\xDE\xBA\xB3 A\xF7U!M\xBCk\xFF\xA9\x0C\xC0\"[9\xDA.\\-;\x90`\0\x90\xA2\x80Q\x15a\x04\xC8Wa\x04,\x82\x82a\x055V[a\x01\x9Ca\x05\xABV[\x80`\x01`\x01`\xA0\x1B\x03\x16;`\0\x03a\x05\x06W`@QcL\x9C\x8C\xE3`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x82\x16`\x04\x82\x01R`$\x01a\x03\xE8V[`\0\x80Q` a\x07\xEF\x839\x81Q\x91R\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16`\x01`\x01`\xA0\x1B\x03\x92\x90\x92\x16\x91\x90\x91\x17\x90UV[```\0\x80\x84`\x01`\x01`\xA0\x1B\x03\x16\x84`@Qa\x05R\x91\x90a\x07\xD2V[`\0`@Q\x80\x83\x03\x81\x85Z\xF4\x91PP=\x80`\0\x81\x14a\x05\x8DW`@Q\x91P`\x1F\x19`?=\x01\x16\x82\x01`@R=\x82R=`\0` \x84\x01>a\x05\x92V[``\x91P[P\x91P\x91Pa\x05\xA2\x85\x83\x83a\x05\xCAV[\x95\x94PPPPPV[4\x15a\x02\xC3W`@Qc\xB3\x98\x97\x9F`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[``\x82a\x05\xDFWa\x05\xDA\x82a\x06)V[a\x06\"V[\x81Q\x15\x80\x15a\x05\xF6WP`\x01`\x01`\xA0\x1B\x03\x84\x16;\x15[\x15a\x06\x1FW`@Qc\x99\x96\xB3\x15`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x85\x16`\x04\x82\x01R`$\x01a\x03\xE8V[P\x80[\x93\x92PPPV[\x80Q\x15a\x069W\x80Q\x80\x82` \x01\xFD[`@Qc\n\x12\xF5!`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0` \x82\x84\x03\x12\x15a\x06dW`\0\x80\xFD[\x815`\x01`\x01`\xE0\x1B\x03\x19\x81\x16\x81\x14a\x06\"W`\0\x80\xFD[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`\0\x80`@\x83\x85\x03\x12\x15a\x06\xA5W`\0\x80\xFD[\x825`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a\x06\xBCW`\0\x80\xFD[\x91P` \x83\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x11\x15a\x06\xD9W`\0\x80\xFD[\x81\x85\x01\x91P\x85`\x1F\x83\x01\x12a\x06\xEDW`\0\x80\xFD[\x815\x81\x81\x11\x15a\x06\xFFWa\x06\xFFa\x06|V[`@Q`\x1F\x82\x01`\x1F\x19\x90\x81\x16`?\x01\x16\x81\x01\x90\x83\x82\x11\x81\x83\x10\x17\x15a\x07'Wa\x07'a\x06|V[\x81`@R\x82\x81R\x88` \x84\x87\x01\x01\x11\x15a\x07@W`\0\x80\xFD[\x82` \x86\x01` \x83\x017`\0` \x84\x83\x01\x01R\x80\x95PPPPPP\x92P\x92\x90PV[`\0[\x83\x81\x10\x15a\x07}W\x81\x81\x01Q\x83\x82\x01R` \x01a\x07eV[PP`\0\x91\x01RV[` \x81R`\0\x82Q\x80` \x84\x01Ra\x07\xA5\x81`@\x85\x01` \x87\x01a\x07bV[`\x1F\x01`\x1F\x19\x16\x91\x90\x91\x01`@\x01\x92\x91PPV[`\0` \x82\x84\x03\x12\x15a\x07\xCBW`\0\x80\xFD[PQ\x91\x90PV[`\0\x82Qa\x07\xE4\x81\x84` \x87\x01a\x07bV[\x91\x90\x91\x01\x92\x91PPV\xFE6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC\xA2dipfsX\"\x12 \r\x0By\x99\x98\x8D\xAE\t\x14q\x81\xB3\xAF*\x989\x9F\xAC\x81.\xCA\xA1\x98No\x03\xD7\xF8\xF3\\\xD1ldsolcC\0\x08\x14\x003"; - /// The bytecode of the contract. - pub static UC_BYTECODE: ::ethers::core::types::Bytes = - ::ethers::core::types::Bytes::from_static(__BYTECODE); - #[rustfmt::skip] - const __DEPLOYED_BYTECODE: &[u8] = b"`\x80`@R`\x046\x10a\0{W`\x005`\xE0\x1C\x80c\x81)\xFC\x1C\x11a\0NW\x80c\x81)\xFC\x1C\x14a\x01\x15W\x80c\xAD<\xB1\xCC\x14a\x01*W\x80c\xBC.f\xE6\x14a\x01hW\x80c\xEE\xFBDa\x14a\x01tW`\0\x80\xFD[\x80c\x01\xFF\xC9\xA7\x14a\0\x80W\x80c\x1FE|\xB5\x14a\0\xC6W\x80cO\x1E\xF2\x86\x14a\0\xEBW\x80cR\xD1\x90-\x14a\x01\0W[`\0\x80\xFD[4\x80\x15a\0\x8CW`\0\x80\xFD[Pa\0\xB1a\0\x9B6`\x04a\x06RV[`\x01`\x01`\xE0\x1B\x03\x19\x16c\x01\xFF\xC9\xA7`\xE0\x1B\x14\x90V[`@Q\x90\x15\x15\x81R` \x01[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\0\xD2W`\0\x80\xFD[Pa\0\xDDa\x01\xF4T\x81V[`@Q\x90\x81R` \x01a\0\xBDV[a\0\xFEa\0\xF96`\x04a\x06\x92V[a\x01\x8AV[\0[4\x80\x15a\x01\x0CW`\0\x80\xFD[Pa\0\xDDa\x01\xA0V[4\x80\x15a\x01!W`\0\x80\xFD[Pa\0\xFEa\x01\xBDV[4\x80\x15a\x016W`\0\x80\xFD[Pa\x01[`@Q\x80`@\x01`@R\x80`\x05\x81R` \x01d\x03R\xE3\x02\xE3`\xDC\x1B\x81RP\x81V[`@Qa\0\xBD\x91\x90a\x07\x86V[4\x80\x15a\0\xFEW`\0\x80\xFD[4\x80\x15a\x01\x80W`\0\x80\xFD[Pa\x01\xF4Ta\0\xDDV[a\x01\x92a\x02\xC5V[a\x01\x9C\x82\x82a\x03jV[PPV[`\0a\x01\xAAa\x041V[P`\0\x80Q` a\x07\xEF\x839\x81Q\x91R\x90V[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x80T`\x01`@\x1B\x81\x04`\xFF\x16\x15\x90g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16`\0\x81\x15\x80\x15a\x02\x03WP\x82[\x90P`\0\x82g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16`\x01\x14\x80\x15a\x02 WP0;\x15[\x90P\x81\x15\x80\x15a\x02.WP\x80\x15[\x15a\x02LW`@Qc\xF9.\xE8\xA9`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x84Tg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x19\x16`\x01\x17\x85U\x83\x15a\x02vW\x84T`\xFF`@\x1B\x19\x16`\x01`@\x1B\x17\x85U[\x83\x15a\x02\xBCW\x84T`\xFF`@\x1B\x19\x16\x85U`@Q`\x01\x81R\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x90` \x01`@Q\x80\x91\x03\x90\xA1[PPPPPV[V[0`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x14\x80a\x03LWP\x7F\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`\x01`\x01`\xA0\x1B\x03\x16a\x03@`\0\x80Q` a\x07\xEF\x839\x81Q\x91RT`\x01`\x01`\xA0\x1B\x03\x16\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x14\x15[\x15a\x02\xC3W`@Qcp>F\xDD`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x81`\x01`\x01`\xA0\x1B\x03\x16cR\xD1\x90-`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x92PPP\x80\x15a\x03\xC4WP`@\x80Q`\x1F=\x90\x81\x01`\x1F\x19\x16\x82\x01\x90\x92Ra\x03\xC1\x91\x81\x01\x90a\x07\xB9V[`\x01[a\x03\xF1W`@QcL\x9C\x8C\xE3`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x83\x16`\x04\x82\x01R`$\x01[`@Q\x80\x91\x03\x90\xFD[`\0\x80Q` a\x07\xEF\x839\x81Q\x91R\x81\x14a\x04\"W`@Qc*\x87Ri`\xE2\x1B\x81R`\x04\x81\x01\x82\x90R`$\x01a\x03\xE8V[a\x04,\x83\x83a\x04zV[PPPV[0`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x14a\x02\xC3W`@Qcp>F\xDD`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x04\x83\x82a\x04\xD0V[`@Q`\x01`\x01`\xA0\x1B\x03\x83\x16\x90\x7F\xBC|\xD7Z \xEE'\xFD\x9A\xDE\xBA\xB3 A\xF7U!M\xBCk\xFF\xA9\x0C\xC0\"[9\xDA.\\-;\x90`\0\x90\xA2\x80Q\x15a\x04\xC8Wa\x04,\x82\x82a\x055V[a\x01\x9Ca\x05\xABV[\x80`\x01`\x01`\xA0\x1B\x03\x16;`\0\x03a\x05\x06W`@QcL\x9C\x8C\xE3`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x82\x16`\x04\x82\x01R`$\x01a\x03\xE8V[`\0\x80Q` a\x07\xEF\x839\x81Q\x91R\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16`\x01`\x01`\xA0\x1B\x03\x92\x90\x92\x16\x91\x90\x91\x17\x90UV[```\0\x80\x84`\x01`\x01`\xA0\x1B\x03\x16\x84`@Qa\x05R\x91\x90a\x07\xD2V[`\0`@Q\x80\x83\x03\x81\x85Z\xF4\x91PP=\x80`\0\x81\x14a\x05\x8DW`@Q\x91P`\x1F\x19`?=\x01\x16\x82\x01`@R=\x82R=`\0` \x84\x01>a\x05\x92V[``\x91P[P\x91P\x91Pa\x05\xA2\x85\x83\x83a\x05\xCAV[\x95\x94PPPPPV[4\x15a\x02\xC3W`@Qc\xB3\x98\x97\x9F`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[``\x82a\x05\xDFWa\x05\xDA\x82a\x06)V[a\x06\"V[\x81Q\x15\x80\x15a\x05\xF6WP`\x01`\x01`\xA0\x1B\x03\x84\x16;\x15[\x15a\x06\x1FW`@Qc\x99\x96\xB3\x15`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x85\x16`\x04\x82\x01R`$\x01a\x03\xE8V[P\x80[\x93\x92PPPV[\x80Q\x15a\x069W\x80Q\x80\x82` \x01\xFD[`@Qc\n\x12\xF5!`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0` \x82\x84\x03\x12\x15a\x06dW`\0\x80\xFD[\x815`\x01`\x01`\xE0\x1B\x03\x19\x81\x16\x81\x14a\x06\"W`\0\x80\xFD[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`\0\x80`@\x83\x85\x03\x12\x15a\x06\xA5W`\0\x80\xFD[\x825`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a\x06\xBCW`\0\x80\xFD[\x91P` \x83\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x11\x15a\x06\xD9W`\0\x80\xFD[\x81\x85\x01\x91P\x85`\x1F\x83\x01\x12a\x06\xEDW`\0\x80\xFD[\x815\x81\x81\x11\x15a\x06\xFFWa\x06\xFFa\x06|V[`@Q`\x1F\x82\x01`\x1F\x19\x90\x81\x16`?\x01\x16\x81\x01\x90\x83\x82\x11\x81\x83\x10\x17\x15a\x07'Wa\x07'a\x06|V[\x81`@R\x82\x81R\x88` \x84\x87\x01\x01\x11\x15a\x07@W`\0\x80\xFD[\x82` \x86\x01` \x83\x017`\0` \x84\x83\x01\x01R\x80\x95PPPPPP\x92P\x92\x90PV[`\0[\x83\x81\x10\x15a\x07}W\x81\x81\x01Q\x83\x82\x01R` \x01a\x07eV[PP`\0\x91\x01RV[` \x81R`\0\x82Q\x80` \x84\x01Ra\x07\xA5\x81`@\x85\x01` \x87\x01a\x07bV[`\x1F\x01`\x1F\x19\x16\x91\x90\x91\x01`@\x01\x92\x91PPV[`\0` \x82\x84\x03\x12\x15a\x07\xCBW`\0\x80\xFD[PQ\x91\x90PV[`\0\x82Qa\x07\xE4\x81\x84` \x87\x01a\x07bV[\x91\x90\x91\x01\x92\x91PPV\xFE6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC\xA2dipfsX\"\x12 \r\x0By\x99\x98\x8D\xAE\t\x14q\x81\xB3\xAF*\x989\x9F\xAC\x81.\xCA\xA1\x98No\x03\xD7\xF8\xF3\\\xD1ldsolcC\0\x08\x14\x003"; - /// The deployed bytecode of the contract. - pub static UC_DEPLOYED_BYTECODE: ::ethers::core::types::Bytes = - ::ethers::core::types::Bytes::from_static(__DEPLOYED_BYTECODE); - pub struct UC(::ethers::contract::Contract); - impl ::core::clone::Clone for UC { - fn clone(&self) -> Self { - Self(::core::clone::Clone::clone(&self.0)) - } - } - impl ::core::ops::Deref for UC { - type Target = ::ethers::contract::Contract; - fn deref(&self) -> &Self::Target { - &self.0 - } - } - impl ::core::ops::DerefMut for UC { - fn deref_mut(&mut self) -> &mut Self::Target { - &mut self.0 - } - } - impl ::core::fmt::Debug for UC { - fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { - f.debug_tuple(::core::stringify!(UC)) - .field(&self.address()) - .finish() - } - } - impl UC { - /// 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(), - UC_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( - UC_ABI.clone(), - UC_BYTECODE.clone().into(), - client, - ); - let deployer = factory.deploy(constructor_args)?; - let deployer = ::ethers::contract::ContractDeployer::new(deployer); - Ok(deployer) - } - ///Calls the contract's `UPGRADE_INTERFACE_VERSION` (0xad3cb1cc) function - pub fn upgrade_interface_version( - &self, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([173, 60, 177, 204], ()) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `initialize` (0x8129fc1c) function - pub fn initialize(&self) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([129, 41, 252, 28], ()) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `my_operation1` (0xeefb4461) function - pub fn my_operation_1( - &self, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([238, 251, 68, 97], ()) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `my_operation2` (0xbc2e66e6) function - pub fn my_operation_2(&self) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([188, 46, 102, 230], ()) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `proxiableUUID` (0x52d1902d) function - pub fn proxiable_uuid(&self) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([82, 209, 144, 45], ()) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `slot1` (0x1f457cb5) function - pub fn slot_1( - &self, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([31, 69, 124, 181], ()) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `supportsInterface` (0x01ffc9a7) function - pub fn supports_interface( - &self, - interface_id: [u8; 4], - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([1, 255, 201, 167], interface_id) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `upgradeToAndCall` (0x4f1ef286) function - pub fn upgrade_to_and_call( - &self, - new_implementation: ::ethers::core::types::Address, - data: ::ethers::core::types::Bytes, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([79, 30, 242, 134], (new_implementation, data)) - .expect("method not found (this should never happen)") - } - ///Gets the contract's `Initialized` event - pub fn initialized_filter( - &self, - ) -> ::ethers::contract::builders::Event<::std::sync::Arc, M, InitializedFilter> - { - self.0.event() - } - ///Gets the contract's `Upgraded` event - pub fn upgraded_filter( - &self, - ) -> ::ethers::contract::builders::Event<::std::sync::Arc, M, UpgradedFilter> { - 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, UCEvents> { - self.0 - .event_with_filter(::core::default::Default::default()) - } - } - impl From<::ethers::contract::Contract> for UC { - fn from(contract: ::ethers::contract::Contract) -> Self { - Self::new(contract.address(), contract.client()) - } - } - ///Custom Error type `AddressEmptyCode` with signature `AddressEmptyCode(address)` and selector `0x9996b315` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[etherror(name = "AddressEmptyCode", abi = "AddressEmptyCode(address)")] - pub struct AddressEmptyCode { - pub target: ::ethers::core::types::Address, - } - ///Custom Error type `ERC1967InvalidImplementation` with signature `ERC1967InvalidImplementation(address)` and selector `0x4c9c8ce3` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[etherror( - name = "ERC1967InvalidImplementation", - abi = "ERC1967InvalidImplementation(address)" - )] - pub struct ERC1967InvalidImplementation { - pub implementation: ::ethers::core::types::Address, - } - ///Custom Error type `ERC1967NonPayable` with signature `ERC1967NonPayable()` and selector `0xb398979f` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[etherror(name = "ERC1967NonPayable", abi = "ERC1967NonPayable()")] - pub struct ERC1967NonPayable; - ///Custom Error type `FailedInnerCall` with signature `FailedInnerCall()` and selector `0x1425ea42` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[etherror(name = "FailedInnerCall", abi = "FailedInnerCall()")] - pub struct FailedInnerCall; - ///Custom Error type `InvalidInitialization` with signature `InvalidInitialization()` and selector `0xf92ee8a9` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[etherror(name = "InvalidInitialization", abi = "InvalidInitialization()")] - pub struct InvalidInitialization; - ///Custom Error type `NotInitializing` with signature `NotInitializing()` and selector `0xd7e6bcf8` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[etherror(name = "NotInitializing", abi = "NotInitializing()")] - pub struct NotInitializing; - ///Custom Error type `UUPSUnauthorizedCallContext` with signature `UUPSUnauthorizedCallContext()` and selector `0xe07c8dba` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[etherror( - name = "UUPSUnauthorizedCallContext", - abi = "UUPSUnauthorizedCallContext()" - )] - pub struct UUPSUnauthorizedCallContext; - ///Custom Error type `UUPSUnsupportedProxiableUUID` with signature `UUPSUnsupportedProxiableUUID(bytes32)` and selector `0xaa1d49a4` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[etherror( - name = "UUPSUnsupportedProxiableUUID", - abi = "UUPSUnsupportedProxiableUUID(bytes32)" - )] - pub struct UUPSUnsupportedProxiableUUID { - pub slot: [u8; 32], - } - ///Container type for all of the contract's custom errors - #[derive( - Clone, - ::ethers::contract::EthAbiType, - serde::Serialize, - serde::Deserialize, - Debug, - PartialEq, - Eq, - Hash, - )] - pub enum UCErrors { - AddressEmptyCode(AddressEmptyCode), - ERC1967InvalidImplementation(ERC1967InvalidImplementation), - ERC1967NonPayable(ERC1967NonPayable), - FailedInnerCall(FailedInnerCall), - InvalidInitialization(InvalidInitialization), - NotInitializing(NotInitializing), - UUPSUnauthorizedCallContext(UUPSUnauthorizedCallContext), - UUPSUnsupportedProxiableUUID(UUPSUnsupportedProxiableUUID), - /// The standard solidity revert string, with selector - /// Error(string) -- 0x08c379a0 - RevertString(::std::string::String), - } - impl ::ethers::core::abi::AbiDecode for UCErrors { - fn decode( - data: impl AsRef<[u8]>, - ) -> ::core::result::Result { - let data = data.as_ref(); - if let Ok(decoded) = - <::std::string::String as ::ethers::core::abi::AbiDecode>::decode(data) - { - return Ok(Self::RevertString(decoded)); - } - if let Ok(decoded) = ::decode(data) - { - return Ok(Self::AddressEmptyCode(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::ERC1967InvalidImplementation(decoded)); - } - if let Ok(decoded) = ::decode(data) - { - return Ok(Self::ERC1967NonPayable(decoded)); - } - if let Ok(decoded) = ::decode(data) { - return Ok(Self::FailedInnerCall(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::InvalidInitialization(decoded)); - } - if let Ok(decoded) = ::decode(data) { - return Ok(Self::NotInitializing(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::UUPSUnauthorizedCallContext(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::UUPSUnsupportedProxiableUUID(decoded)); - } - Err(::ethers::core::abi::Error::InvalidData.into()) - } - } - impl ::ethers::core::abi::AbiEncode for UCErrors { - fn encode(self) -> ::std::vec::Vec { - match self { - Self::AddressEmptyCode(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::ERC1967InvalidImplementation(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::ERC1967NonPayable(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::FailedInnerCall(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::InvalidInitialization(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::NotInitializing(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::UUPSUnauthorizedCallContext(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::UUPSUnsupportedProxiableUUID(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::RevertString(s) => ::ethers::core::abi::AbiEncode::encode(s), - } - } - } - impl ::ethers::contract::ContractRevert for UCErrors { - fn valid_selector(selector: [u8; 4]) -> bool { - match selector { - [0x08, 0xc3, 0x79, 0xa0] => true, - _ if selector == ::selector() => { - true - } - _ if selector - == ::selector( - ) => - { - true - } - _ if selector - == ::selector() => - { - true - } - _ if selector == ::selector() => { - true - } - _ if selector - == ::selector() => - { - true - } - _ if selector == ::selector() => { - true - } - _ if selector - == ::selector( - ) => - { - true - } - _ if selector - == ::selector( - ) => - { - true - } - _ => false, - } - } - } - impl ::core::fmt::Display for UCErrors { - fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { - match self { - Self::AddressEmptyCode(element) => ::core::fmt::Display::fmt(element, f), - Self::ERC1967InvalidImplementation(element) => { - ::core::fmt::Display::fmt(element, f) - } - Self::ERC1967NonPayable(element) => ::core::fmt::Display::fmt(element, f), - Self::FailedInnerCall(element) => ::core::fmt::Display::fmt(element, f), - Self::InvalidInitialization(element) => ::core::fmt::Display::fmt(element, f), - Self::NotInitializing(element) => ::core::fmt::Display::fmt(element, f), - Self::UUPSUnauthorizedCallContext(element) => ::core::fmt::Display::fmt(element, f), - Self::UUPSUnsupportedProxiableUUID(element) => { - ::core::fmt::Display::fmt(element, f) - } - Self::RevertString(s) => ::core::fmt::Display::fmt(s, f), - } - } - } - impl ::core::convert::From<::std::string::String> for UCErrors { - fn from(value: String) -> Self { - Self::RevertString(value) - } - } - impl ::core::convert::From for UCErrors { - fn from(value: AddressEmptyCode) -> Self { - Self::AddressEmptyCode(value) - } - } - impl ::core::convert::From for UCErrors { - fn from(value: ERC1967InvalidImplementation) -> Self { - Self::ERC1967InvalidImplementation(value) - } - } - impl ::core::convert::From for UCErrors { - fn from(value: ERC1967NonPayable) -> Self { - Self::ERC1967NonPayable(value) - } - } - impl ::core::convert::From for UCErrors { - fn from(value: FailedInnerCall) -> Self { - Self::FailedInnerCall(value) - } - } - impl ::core::convert::From for UCErrors { - fn from(value: InvalidInitialization) -> Self { - Self::InvalidInitialization(value) - } - } - impl ::core::convert::From for UCErrors { - fn from(value: NotInitializing) -> Self { - Self::NotInitializing(value) - } - } - impl ::core::convert::From for UCErrors { - fn from(value: UUPSUnauthorizedCallContext) -> Self { - Self::UUPSUnauthorizedCallContext(value) - } - } - impl ::core::convert::From for UCErrors { - fn from(value: UUPSUnsupportedProxiableUUID) -> Self { - Self::UUPSUnsupportedProxiableUUID(value) - } - } - #[derive( - Clone, - ::ethers::contract::EthEvent, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethevent(name = "Initialized", abi = "Initialized(uint64)")] - pub struct InitializedFilter { - pub version: u64, - } - #[derive( - Clone, - ::ethers::contract::EthEvent, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethevent(name = "Upgraded", abi = "Upgraded(address)")] - pub struct UpgradedFilter { - #[ethevent(indexed)] - pub implementation: ::ethers::core::types::Address, - } - ///Container type for all of the contract's events - #[derive( - Clone, - ::ethers::contract::EthAbiType, - serde::Serialize, - serde::Deserialize, - Debug, - PartialEq, - Eq, - Hash, - )] - pub enum UCEvents { - InitializedFilter(InitializedFilter), - UpgradedFilter(UpgradedFilter), - } - impl ::ethers::contract::EthLogDecode for UCEvents { - fn decode_log( - log: &::ethers::core::abi::RawLog, - ) -> ::core::result::Result { - if let Ok(decoded) = InitializedFilter::decode_log(log) { - return Ok(UCEvents::InitializedFilter(decoded)); - } - if let Ok(decoded) = UpgradedFilter::decode_log(log) { - return Ok(UCEvents::UpgradedFilter(decoded)); - } - Err(::ethers::core::abi::Error::InvalidData) - } - } - impl ::core::fmt::Display for UCEvents { - fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { - match self { - Self::InitializedFilter(element) => ::core::fmt::Display::fmt(element, f), - Self::UpgradedFilter(element) => ::core::fmt::Display::fmt(element, f), - } - } - } - impl ::core::convert::From for UCEvents { - fn from(value: InitializedFilter) -> Self { - Self::InitializedFilter(value) - } - } - impl ::core::convert::From for UCEvents { - fn from(value: UpgradedFilter) -> Self { - Self::UpgradedFilter(value) - } - } - ///Container type for all input parameters for the `UPGRADE_INTERFACE_VERSION` function with signature `UPGRADE_INTERFACE_VERSION()` and selector `0xad3cb1cc` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall( - name = "UPGRADE_INTERFACE_VERSION", - abi = "UPGRADE_INTERFACE_VERSION()" - )] - pub struct UpgradeInterfaceVersionCall; - ///Container type for all input parameters for the `initialize` function with signature `initialize()` and selector `0x8129fc1c` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "initialize", abi = "initialize()")] - pub struct InitializeCall; - ///Container type for all input parameters for the `my_operation1` function with signature `my_operation1()` and selector `0xeefb4461` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "my_operation1", abi = "my_operation1()")] - pub struct MyOperation1Call; - ///Container type for all input parameters for the `my_operation2` function with signature `my_operation2()` and selector `0xbc2e66e6` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "my_operation2", abi = "my_operation2()")] - pub struct MyOperation2Call; - ///Container type for all input parameters for the `proxiableUUID` function with signature `proxiableUUID()` and selector `0x52d1902d` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "proxiableUUID", abi = "proxiableUUID()")] - pub struct ProxiableUUIDCall; - ///Container type for all input parameters for the `slot1` function with signature `slot1()` and selector `0x1f457cb5` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "slot1", abi = "slot1()")] - pub struct Slot1Call; - ///Container type for all input parameters for the `supportsInterface` function with signature `supportsInterface(bytes4)` and selector `0x01ffc9a7` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "supportsInterface", abi = "supportsInterface(bytes4)")] - pub struct SupportsInterfaceCall { - pub interface_id: [u8; 4], - } - ///Container type for all input parameters for the `upgradeToAndCall` function with signature `upgradeToAndCall(address,bytes)` and selector `0x4f1ef286` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "upgradeToAndCall", abi = "upgradeToAndCall(address,bytes)")] - pub struct UpgradeToAndCallCall { - pub new_implementation: ::ethers::core::types::Address, - pub data: ::ethers::core::types::Bytes, - } - ///Container type for all of the contract's call - #[derive( - Clone, - ::ethers::contract::EthAbiType, - serde::Serialize, - serde::Deserialize, - Debug, - PartialEq, - Eq, - Hash, - )] - pub enum UCCalls { - UpgradeInterfaceVersion(UpgradeInterfaceVersionCall), - Initialize(InitializeCall), - MyOperation1(MyOperation1Call), - MyOperation2(MyOperation2Call), - ProxiableUUID(ProxiableUUIDCall), - Slot1(Slot1Call), - SupportsInterface(SupportsInterfaceCall), - UpgradeToAndCall(UpgradeToAndCallCall), - } - impl ::ethers::core::abi::AbiDecode for UCCalls { - fn decode( - data: impl AsRef<[u8]>, - ) -> ::core::result::Result { - let data = data.as_ref(); - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::UpgradeInterfaceVersion(decoded)); - } - if let Ok(decoded) = ::decode(data) { - return Ok(Self::Initialize(decoded)); - } - if let Ok(decoded) = ::decode(data) - { - return Ok(Self::MyOperation1(decoded)); - } - if let Ok(decoded) = ::decode(data) - { - return Ok(Self::MyOperation2(decoded)); - } - if let Ok(decoded) = ::decode(data) - { - return Ok(Self::ProxiableUUID(decoded)); - } - if let Ok(decoded) = ::decode(data) { - return Ok(Self::Slot1(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::SupportsInterface(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::UpgradeToAndCall(decoded)); - } - Err(::ethers::core::abi::Error::InvalidData.into()) - } - } - impl ::ethers::core::abi::AbiEncode for UCCalls { - fn encode(self) -> Vec { - match self { - Self::UpgradeInterfaceVersion(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::Initialize(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::MyOperation1(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::MyOperation2(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::ProxiableUUID(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::Slot1(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::SupportsInterface(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::UpgradeToAndCall(element) => ::ethers::core::abi::AbiEncode::encode(element), - } - } - } - impl ::core::fmt::Display for UCCalls { - fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { - match self { - Self::UpgradeInterfaceVersion(element) => ::core::fmt::Display::fmt(element, f), - Self::Initialize(element) => ::core::fmt::Display::fmt(element, f), - Self::MyOperation1(element) => ::core::fmt::Display::fmt(element, f), - Self::MyOperation2(element) => ::core::fmt::Display::fmt(element, f), - Self::ProxiableUUID(element) => ::core::fmt::Display::fmt(element, f), - Self::Slot1(element) => ::core::fmt::Display::fmt(element, f), - Self::SupportsInterface(element) => ::core::fmt::Display::fmt(element, f), - Self::UpgradeToAndCall(element) => ::core::fmt::Display::fmt(element, f), - } - } - } - impl ::core::convert::From for UCCalls { - fn from(value: UpgradeInterfaceVersionCall) -> Self { - Self::UpgradeInterfaceVersion(value) - } - } - impl ::core::convert::From for UCCalls { - fn from(value: InitializeCall) -> Self { - Self::Initialize(value) - } - } - impl ::core::convert::From for UCCalls { - fn from(value: MyOperation1Call) -> Self { - Self::MyOperation1(value) - } - } - impl ::core::convert::From for UCCalls { - fn from(value: MyOperation2Call) -> Self { - Self::MyOperation2(value) - } - } - impl ::core::convert::From for UCCalls { - fn from(value: ProxiableUUIDCall) -> Self { - Self::ProxiableUUID(value) - } - } - impl ::core::convert::From for UCCalls { - fn from(value: Slot1Call) -> Self { - Self::Slot1(value) - } - } - impl ::core::convert::From for UCCalls { - fn from(value: SupportsInterfaceCall) -> Self { - Self::SupportsInterface(value) - } - } - impl ::core::convert::From for UCCalls { - fn from(value: UpgradeToAndCallCall) -> Self { - Self::UpgradeToAndCall(value) - } - } - ///Container type for all return fields from the `UPGRADE_INTERFACE_VERSION` function with signature `UPGRADE_INTERFACE_VERSION()` and selector `0xad3cb1cc` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct UpgradeInterfaceVersionReturn(pub ::std::string::String); - ///Container type for all return fields from the `my_operation1` function with signature `my_operation1()` and selector `0xeefb4461` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct MyOperation1Return(pub ::ethers::core::types::U256); - ///Container type for all return fields from the `proxiableUUID` function with signature `proxiableUUID()` and selector `0x52d1902d` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct ProxiableUUIDReturn(pub [u8; 32]); - ///Container type for all return fields from the `slot1` function with signature `slot1()` and selector `0x1f457cb5` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct Slot1Return(pub ::ethers::core::types::U256); - ///Container type for all return fields from the `supportsInterface` function with signature `supportsInterface(bytes4)` and selector `0x01ffc9a7` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct SupportsInterfaceReturn(pub bool); -} diff --git a/bindings/src/uc_rekt.rs b/bindings/src/uc_rekt.rs deleted file mode 100644 index cd6d093..0000000 --- a/bindings/src/uc_rekt.rs +++ /dev/null @@ -1,1353 +0,0 @@ -pub use uc_rekt::*; -/// 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 uc_rekt { - #[allow(deprecated)] - fn __abi() -> ::ethers::core::abi::Abi { - ::ethers::core::abi::ethabi::Contract { - constructor: ::core::option::Option::Some(::ethers::core::abi::ethabi::Constructor { - inputs: ::std::vec![], - }), - functions: ::core::convert::From::from([ - ( - ::std::borrow::ToOwned::to_owned("UPGRADE_INTERFACE_VERSION"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("UPGRADE_INTERFACE_VERSION",), - inputs: ::std::vec![], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::String, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("string"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("initialize"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("initialize"), - inputs: ::std::vec![], - outputs: ::std::vec![], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("my_operation1"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("my_operation1"), - inputs: ::std::vec![], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("my_operation2"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("my_operation2"), - inputs: ::std::vec![], - outputs: ::std::vec![], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("proxiableUUID"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("proxiableUUID"), - inputs: ::std::vec![], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::FixedBytes(32usize,), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes32"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("rektSlot"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("rektSlot"), - inputs: ::std::vec![], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Bool, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bool"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("rektSlot2"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("rektSlot2"), - inputs: ::std::vec![], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Uint(96usize), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint96"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("slot1"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("slot1"), - inputs: ::std::vec![], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("supportsInterface"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("supportsInterface"), - inputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("interfaceId"), - kind: ::ethers::core::abi::ethabi::ParamType::FixedBytes(4usize,), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes4"), - ), - },], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Bool, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bool"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("upgradeToAndCall"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("upgradeToAndCall"), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("newImplementation"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("data"), - kind: ::ethers::core::abi::ethabi::ParamType::Bytes, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes"), - ), - }, - ], - outputs: ::std::vec![], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::Payable, - },], - ), - ]), - events: ::core::convert::From::from([ - ( - ::std::borrow::ToOwned::to_owned("Initialized"), - ::std::vec![::ethers::core::abi::ethabi::Event { - name: ::std::borrow::ToOwned::to_owned("Initialized"), - inputs: ::std::vec![::ethers::core::abi::ethabi::EventParam { - name: ::std::borrow::ToOwned::to_owned("version"), - kind: ::ethers::core::abi::ethabi::ParamType::Uint(64usize), - indexed: false, - },], - anonymous: false, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("Upgraded"), - ::std::vec![::ethers::core::abi::ethabi::Event { - name: ::std::borrow::ToOwned::to_owned("Upgraded"), - inputs: ::std::vec![::ethers::core::abi::ethabi::EventParam { - name: ::std::borrow::ToOwned::to_owned("implementation"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - indexed: true, - },], - anonymous: false, - },], - ), - ]), - errors: ::core::convert::From::from([ - ( - ::std::borrow::ToOwned::to_owned("AddressEmptyCode"), - ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("AddressEmptyCode"), - inputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("target"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - },], - },], - ), - ( - ::std::borrow::ToOwned::to_owned("ERC1967InvalidImplementation"), - ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("ERC1967InvalidImplementation",), - inputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("implementation"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - },], - },], - ), - ( - ::std::borrow::ToOwned::to_owned("ERC1967NonPayable"), - ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("ERC1967NonPayable"), - inputs: ::std::vec![], - },], - ), - ( - ::std::borrow::ToOwned::to_owned("FailedInnerCall"), - ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("FailedInnerCall"), - inputs: ::std::vec![], - },], - ), - ( - ::std::borrow::ToOwned::to_owned("InvalidInitialization"), - ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("InvalidInitialization",), - inputs: ::std::vec![], - },], - ), - ( - ::std::borrow::ToOwned::to_owned("NotInitializing"), - ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("NotInitializing"), - inputs: ::std::vec![], - },], - ), - ( - ::std::borrow::ToOwned::to_owned("ReentrancyGuardReentrantCall"), - ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("ReentrancyGuardReentrantCall",), - inputs: ::std::vec![], - },], - ), - ( - ::std::borrow::ToOwned::to_owned("UUPSUnauthorizedCallContext"), - ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("UUPSUnauthorizedCallContext",), - inputs: ::std::vec![], - },], - ), - ( - ::std::borrow::ToOwned::to_owned("UUPSUnsupportedProxiableUUID"), - ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("UUPSUnsupportedProxiableUUID",), - inputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("slot"), - kind: ::ethers::core::abi::ethabi::ParamType::FixedBytes(32usize,), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes32"), - ), - },], - },], - ), - ]), - receive: false, - fallback: false, - } - } - ///The parsed JSON ABI of the contract. - pub static UC_REKT_ABI: ::ethers::contract::Lazy<::ethers::core::abi::Abi> = - ::ethers::contract::Lazy::new(__abi); - #[rustfmt::skip] - const __BYTECODE: &[u8] = b"`\xA0`@R0`\x80R4\x80\x15a\0\x14W`\0\x80\xFD[P\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x80Th\x01\0\0\0\0\0\0\0\0\x81\x04`\xFF\x16\x15\x90`\x01`\x01`@\x1B\x03\x16`\0\x81\x15\x80\x15a\0_WP\x82[\x90P`\0\x82`\x01`\x01`@\x1B\x03\x16`\x01\x14\x80\x15a\0{WP0;\x15[\x90P\x81\x15\x80\x15a\0\x89WP\x80\x15[\x15a\0\xA7W`@Qc\xF9.\xE8\xA9`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x84T`\x01`\x01`@\x1B\x03\x19\x16`\x01\x17\x85U\x83\x15a\0\xD5W\x84T`\xFF`@\x1B\x19\x16h\x01\0\0\0\0\0\0\0\0\x17\x85U[\x83\x15a\x01\x1BW\x84T`\xFF`@\x1B\x19\x16\x85U`@Q`\x01\x81R\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x90` \x01`@Q\x80\x91\x03\x90\xA1[PPPPP`\x80Qa\x08\xBBa\x01I`\09`\0\x81\x81a\x03G\x01R\x81\x81a\x03p\x01Ra\x04\xB3\x01Ra\x08\xBB`\0\xF3\xFE`\x80`@R`\x046\x10a\0\x91W`\x005`\xE0\x1C\x80c\x81)\xFC\x1C\x11a\0YW\x80c\x81)\xFC\x1C\x14a\x01EW\x80c\xA8\xD2\x1B\x9D\x14a\x01ZW\x80c\xAD<\xB1\xCC\x14a\x01\xA1W\x80c\xBC.f\xE6\x14a\x01\xDFW\x80c\xEE\xFBDa\x14a\x01\xEBW`\0\x80\xFD[\x80c\x01\xFF\xC9\xA7\x14a\0\x96W\x80c\x1FE|\xB5\x14a\0\xDCW\x80c04\x08\xD6\x14a\x01\x01W\x80cO\x1E\xF2\x86\x14a\x01\x1BW\x80cR\xD1\x90-\x14a\x010W[`\0\x80\xFD[4\x80\x15a\0\xA2W`\0\x80\xFD[Pa\0\xC7a\0\xB16`\x04a\x06\xC9V[`\x01`\x01`\xE0\x1B\x03\x19\x16c\x01\xFF\xC9\xA7`\xE0\x1B\x14\x90V[`@Q\x90\x15\x15\x81R` \x01[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\0\xE8W`\0\x80\xFD[Pa\0\xF3a\x01\xC2T\x81V[`@Q\x90\x81R` \x01a\0\xD3V[4\x80\x15a\x01\rW`\0\x80\xFD[P`\0Ta\0\xC7\x90`\xFF\x16\x81V[a\x01.a\x01)6`\x04a\x07\tV[a\x02\x01V[\0[4\x80\x15a\x01#\xA9f.\xFC\x9C\"\x9Cj\0\x80T`\x01`@\x1B\x81\x04`\xFF\x16\x15\x90g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16`\0\x81\x15\x80\x15a\x02zWP\x82[\x90P`\0\x82g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16`\x01\x14\x80\x15a\x02\x97WP0;\x15[\x90P\x81\x15\x80\x15a\x02\xA5WP\x80\x15[\x15a\x02\xC3W`@Qc\xF9.\xE8\xA9`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x84Tg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x19\x16`\x01\x17\x85U\x83\x15a\x02\xEDW\x84T`\xFF`@\x1B\x19\x16`\x01`@\x1B\x17\x85U[\x83\x15a\x033W\x84T`\xFF`@\x1B\x19\x16\x85U`@Q`\x01\x81R\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x90` \x01`@Q\x80\x91\x03\x90\xA1[PPPPPV[V[0`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x14\x80a\x03\xC3WP\x7F\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`\x01`\x01`\xA0\x1B\x03\x16a\x03\xB7`\0\x80Q` a\x08f\x839\x81Q\x91RT`\x01`\x01`\xA0\x1B\x03\x16\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x14\x15[\x15a\x03:W`@Qcp>F\xDD`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x81`\x01`\x01`\xA0\x1B\x03\x16cR\xD1\x90-`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x92PPP\x80\x15a\x04;WP`@\x80Q`\x1F=\x90\x81\x01`\x1F\x19\x16\x82\x01\x90\x92Ra\x048\x91\x81\x01\x90a\x080V[`\x01[a\x04hW`@QcL\x9C\x8C\xE3`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x83\x16`\x04\x82\x01R`$\x01[`@Q\x80\x91\x03\x90\xFD[`\0\x80Q` a\x08f\x839\x81Q\x91R\x81\x14a\x04\x99W`@Qc*\x87Ri`\xE2\x1B\x81R`\x04\x81\x01\x82\x90R`$\x01a\x04_V[a\x04\xA3\x83\x83a\x04\xF1V[PPPV[0`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x14a\x03:W`@Qcp>F\xDD`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x04\xFA\x82a\x05GV[`@Q`\x01`\x01`\xA0\x1B\x03\x83\x16\x90\x7F\xBC|\xD7Z \xEE'\xFD\x9A\xDE\xBA\xB3 A\xF7U!M\xBCk\xFF\xA9\x0C\xC0\"[9\xDA.\\-;\x90`\0\x90\xA2\x80Q\x15a\x05?Wa\x04\xA3\x82\x82a\x05\xACV[a\x02\x13a\x06\"V[\x80`\x01`\x01`\xA0\x1B\x03\x16;`\0\x03a\x05}W`@QcL\x9C\x8C\xE3`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x82\x16`\x04\x82\x01R`$\x01a\x04_V[`\0\x80Q` a\x08f\x839\x81Q\x91R\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16`\x01`\x01`\xA0\x1B\x03\x92\x90\x92\x16\x91\x90\x91\x17\x90UV[```\0\x80\x84`\x01`\x01`\xA0\x1B\x03\x16\x84`@Qa\x05\xC9\x91\x90a\x08IV[`\0`@Q\x80\x83\x03\x81\x85Z\xF4\x91PP=\x80`\0\x81\x14a\x06\x04W`@Q\x91P`\x1F\x19`?=\x01\x16\x82\x01`@R=\x82R=`\0` \x84\x01>a\x06\tV[``\x91P[P\x91P\x91Pa\x06\x19\x85\x83\x83a\x06AV[\x95\x94PPPPPV[4\x15a\x03:W`@Qc\xB3\x98\x97\x9F`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[``\x82a\x06VWa\x06Q\x82a\x06\xA0V[a\x06\x99V[\x81Q\x15\x80\x15a\x06mWP`\x01`\x01`\xA0\x1B\x03\x84\x16;\x15[\x15a\x06\x96W`@Qc\x99\x96\xB3\x15`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x85\x16`\x04\x82\x01R`$\x01a\x04_V[P\x80[\x93\x92PPPV[\x80Q\x15a\x06\xB0W\x80Q\x80\x82` \x01\xFD[`@Qc\n\x12\xF5!`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0` \x82\x84\x03\x12\x15a\x06\xDBW`\0\x80\xFD[\x815`\x01`\x01`\xE0\x1B\x03\x19\x81\x16\x81\x14a\x06\x99W`\0\x80\xFD[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`\0\x80`@\x83\x85\x03\x12\x15a\x07\x1CW`\0\x80\xFD[\x825`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a\x073W`\0\x80\xFD[\x91P` \x83\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x11\x15a\x07PW`\0\x80\xFD[\x81\x85\x01\x91P\x85`\x1F\x83\x01\x12a\x07dW`\0\x80\xFD[\x815\x81\x81\x11\x15a\x07vWa\x07va\x06\xF3V[`@Q`\x1F\x82\x01`\x1F\x19\x90\x81\x16`?\x01\x16\x81\x01\x90\x83\x82\x11\x81\x83\x10\x17\x15a\x07\x9EWa\x07\x9Ea\x06\xF3V[\x81`@R\x82\x81R\x88` \x84\x87\x01\x01\x11\x15a\x07\xB7W`\0\x80\xFD[\x82` \x86\x01` \x83\x017`\0` \x84\x83\x01\x01R\x80\x95PPPPPP\x92P\x92\x90PV[`\0[\x83\x81\x10\x15a\x07\xF4W\x81\x81\x01Q\x83\x82\x01R` \x01a\x07\xDCV[PP`\0\x91\x01RV[` \x81R`\0\x82Q\x80` \x84\x01Ra\x08\x1C\x81`@\x85\x01` \x87\x01a\x07\xD9V[`\x1F\x01`\x1F\x19\x16\x91\x90\x91\x01`@\x01\x92\x91PPV[`\0` \x82\x84\x03\x12\x15a\x08BW`\0\x80\xFD[PQ\x91\x90PV[`\0\x82Qa\x08[\x81\x84` \x87\x01a\x07\xD9V[\x91\x90\x91\x01\x92\x91PPV\xFE6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC\xA2dipfsX\"\x12 \xA0\xF7\xB4\xB0D\x91X\xC2\x8B\xC9qP(\xB24\xA5\xD5\xC8\x0F)L\x99\xA1\x8DC\xBB|\x1E\xB3\xE1@0dsolcC\0\x08\x14\x003"; - /// The bytecode of the contract. - pub static UC_REKT_BYTECODE: ::ethers::core::types::Bytes = - ::ethers::core::types::Bytes::from_static(__BYTECODE); - #[rustfmt::skip] - const __DEPLOYED_BYTECODE: &[u8] = b"`\x80`@R`\x046\x10a\0\x91W`\x005`\xE0\x1C\x80c\x81)\xFC\x1C\x11a\0YW\x80c\x81)\xFC\x1C\x14a\x01EW\x80c\xA8\xD2\x1B\x9D\x14a\x01ZW\x80c\xAD<\xB1\xCC\x14a\x01\xA1W\x80c\xBC.f\xE6\x14a\x01\xDFW\x80c\xEE\xFBDa\x14a\x01\xEBW`\0\x80\xFD[\x80c\x01\xFF\xC9\xA7\x14a\0\x96W\x80c\x1FE|\xB5\x14a\0\xDCW\x80c04\x08\xD6\x14a\x01\x01W\x80cO\x1E\xF2\x86\x14a\x01\x1BW\x80cR\xD1\x90-\x14a\x010W[`\0\x80\xFD[4\x80\x15a\0\xA2W`\0\x80\xFD[Pa\0\xC7a\0\xB16`\x04a\x06\xC9V[`\x01`\x01`\xE0\x1B\x03\x19\x16c\x01\xFF\xC9\xA7`\xE0\x1B\x14\x90V[`@Q\x90\x15\x15\x81R` \x01[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\0\xE8W`\0\x80\xFD[Pa\0\xF3a\x01\xC2T\x81V[`@Q\x90\x81R` \x01a\0\xD3V[4\x80\x15a\x01\rW`\0\x80\xFD[P`\0Ta\0\xC7\x90`\xFF\x16\x81V[a\x01.a\x01)6`\x04a\x07\tV[a\x02\x01V[\0[4\x80\x15a\x01#\xA9f.\xFC\x9C\"\x9Cj\0\x80T`\x01`@\x1B\x81\x04`\xFF\x16\x15\x90g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16`\0\x81\x15\x80\x15a\x02zWP\x82[\x90P`\0\x82g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16`\x01\x14\x80\x15a\x02\x97WP0;\x15[\x90P\x81\x15\x80\x15a\x02\xA5WP\x80\x15[\x15a\x02\xC3W`@Qc\xF9.\xE8\xA9`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x84Tg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x19\x16`\x01\x17\x85U\x83\x15a\x02\xEDW\x84T`\xFF`@\x1B\x19\x16`\x01`@\x1B\x17\x85U[\x83\x15a\x033W\x84T`\xFF`@\x1B\x19\x16\x85U`@Q`\x01\x81R\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x90` \x01`@Q\x80\x91\x03\x90\xA1[PPPPPV[V[0`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x14\x80a\x03\xC3WP\x7F\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`\x01`\x01`\xA0\x1B\x03\x16a\x03\xB7`\0\x80Q` a\x08f\x839\x81Q\x91RT`\x01`\x01`\xA0\x1B\x03\x16\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x14\x15[\x15a\x03:W`@Qcp>F\xDD`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x81`\x01`\x01`\xA0\x1B\x03\x16cR\xD1\x90-`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x92PPP\x80\x15a\x04;WP`@\x80Q`\x1F=\x90\x81\x01`\x1F\x19\x16\x82\x01\x90\x92Ra\x048\x91\x81\x01\x90a\x080V[`\x01[a\x04hW`@QcL\x9C\x8C\xE3`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x83\x16`\x04\x82\x01R`$\x01[`@Q\x80\x91\x03\x90\xFD[`\0\x80Q` a\x08f\x839\x81Q\x91R\x81\x14a\x04\x99W`@Qc*\x87Ri`\xE2\x1B\x81R`\x04\x81\x01\x82\x90R`$\x01a\x04_V[a\x04\xA3\x83\x83a\x04\xF1V[PPPV[0`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x14a\x03:W`@Qcp>F\xDD`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x04\xFA\x82a\x05GV[`@Q`\x01`\x01`\xA0\x1B\x03\x83\x16\x90\x7F\xBC|\xD7Z \xEE'\xFD\x9A\xDE\xBA\xB3 A\xF7U!M\xBCk\xFF\xA9\x0C\xC0\"[9\xDA.\\-;\x90`\0\x90\xA2\x80Q\x15a\x05?Wa\x04\xA3\x82\x82a\x05\xACV[a\x02\x13a\x06\"V[\x80`\x01`\x01`\xA0\x1B\x03\x16;`\0\x03a\x05}W`@QcL\x9C\x8C\xE3`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x82\x16`\x04\x82\x01R`$\x01a\x04_V[`\0\x80Q` a\x08f\x839\x81Q\x91R\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16`\x01`\x01`\xA0\x1B\x03\x92\x90\x92\x16\x91\x90\x91\x17\x90UV[```\0\x80\x84`\x01`\x01`\xA0\x1B\x03\x16\x84`@Qa\x05\xC9\x91\x90a\x08IV[`\0`@Q\x80\x83\x03\x81\x85Z\xF4\x91PP=\x80`\0\x81\x14a\x06\x04W`@Q\x91P`\x1F\x19`?=\x01\x16\x82\x01`@R=\x82R=`\0` \x84\x01>a\x06\tV[``\x91P[P\x91P\x91Pa\x06\x19\x85\x83\x83a\x06AV[\x95\x94PPPPPV[4\x15a\x03:W`@Qc\xB3\x98\x97\x9F`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[``\x82a\x06VWa\x06Q\x82a\x06\xA0V[a\x06\x99V[\x81Q\x15\x80\x15a\x06mWP`\x01`\x01`\xA0\x1B\x03\x84\x16;\x15[\x15a\x06\x96W`@Qc\x99\x96\xB3\x15`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x85\x16`\x04\x82\x01R`$\x01a\x04_V[P\x80[\x93\x92PPPV[\x80Q\x15a\x06\xB0W\x80Q\x80\x82` \x01\xFD[`@Qc\n\x12\xF5!`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0` \x82\x84\x03\x12\x15a\x06\xDBW`\0\x80\xFD[\x815`\x01`\x01`\xE0\x1B\x03\x19\x81\x16\x81\x14a\x06\x99W`\0\x80\xFD[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`\0\x80`@\x83\x85\x03\x12\x15a\x07\x1CW`\0\x80\xFD[\x825`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a\x073W`\0\x80\xFD[\x91P` \x83\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x11\x15a\x07PW`\0\x80\xFD[\x81\x85\x01\x91P\x85`\x1F\x83\x01\x12a\x07dW`\0\x80\xFD[\x815\x81\x81\x11\x15a\x07vWa\x07va\x06\xF3V[`@Q`\x1F\x82\x01`\x1F\x19\x90\x81\x16`?\x01\x16\x81\x01\x90\x83\x82\x11\x81\x83\x10\x17\x15a\x07\x9EWa\x07\x9Ea\x06\xF3V[\x81`@R\x82\x81R\x88` \x84\x87\x01\x01\x11\x15a\x07\xB7W`\0\x80\xFD[\x82` \x86\x01` \x83\x017`\0` \x84\x83\x01\x01R\x80\x95PPPPPP\x92P\x92\x90PV[`\0[\x83\x81\x10\x15a\x07\xF4W\x81\x81\x01Q\x83\x82\x01R` \x01a\x07\xDCV[PP`\0\x91\x01RV[` \x81R`\0\x82Q\x80` \x84\x01Ra\x08\x1C\x81`@\x85\x01` \x87\x01a\x07\xD9V[`\x1F\x01`\x1F\x19\x16\x91\x90\x91\x01`@\x01\x92\x91PPV[`\0` \x82\x84\x03\x12\x15a\x08BW`\0\x80\xFD[PQ\x91\x90PV[`\0\x82Qa\x08[\x81\x84` \x87\x01a\x07\xD9V[\x91\x90\x91\x01\x92\x91PPV\xFE6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC\xA2dipfsX\"\x12 \xA0\xF7\xB4\xB0D\x91X\xC2\x8B\xC9qP(\xB24\xA5\xD5\xC8\x0F)L\x99\xA1\x8DC\xBB|\x1E\xB3\xE1@0dsolcC\0\x08\x14\x003"; - /// The deployed bytecode of the contract. - pub static UC_REKT_DEPLOYED_BYTECODE: ::ethers::core::types::Bytes = - ::ethers::core::types::Bytes::from_static(__DEPLOYED_BYTECODE); - pub struct UC_Rekt(::ethers::contract::Contract); - impl ::core::clone::Clone for UC_Rekt { - fn clone(&self) -> Self { - Self(::core::clone::Clone::clone(&self.0)) - } - } - impl ::core::ops::Deref for UC_Rekt { - type Target = ::ethers::contract::Contract; - fn deref(&self) -> &Self::Target { - &self.0 - } - } - impl ::core::ops::DerefMut for UC_Rekt { - fn deref_mut(&mut self) -> &mut Self::Target { - &mut self.0 - } - } - impl ::core::fmt::Debug for UC_Rekt { - fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { - f.debug_tuple(::core::stringify!(UC_Rekt)) - .field(&self.address()) - .finish() - } - } - impl UC_Rekt { - /// 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(), - UC_REKT_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( - UC_REKT_ABI.clone(), - UC_REKT_BYTECODE.clone().into(), - client, - ); - let deployer = factory.deploy(constructor_args)?; - let deployer = ::ethers::contract::ContractDeployer::new(deployer); - Ok(deployer) - } - ///Calls the contract's `UPGRADE_INTERFACE_VERSION` (0xad3cb1cc) function - pub fn upgrade_interface_version( - &self, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([173, 60, 177, 204], ()) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `initialize` (0x8129fc1c) function - pub fn initialize(&self) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([129, 41, 252, 28], ()) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `my_operation1` (0xeefb4461) function - pub fn my_operation_1( - &self, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([238, 251, 68, 97], ()) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `my_operation2` (0xbc2e66e6) function - pub fn my_operation_2(&self) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([188, 46, 102, 230], ()) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `proxiableUUID` (0x52d1902d) function - pub fn proxiable_uuid(&self) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([82, 209, 144, 45], ()) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `rektSlot` (0x303408d6) function - pub fn rekt_slot(&self) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([48, 52, 8, 214], ()) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `rektSlot2` (0xa8d21b9d) function - pub fn rekt_slot_2(&self) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([168, 210, 27, 157], ()) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `slot1` (0x1f457cb5) function - pub fn slot_1( - &self, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([31, 69, 124, 181], ()) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `supportsInterface` (0x01ffc9a7) function - pub fn supports_interface( - &self, - interface_id: [u8; 4], - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([1, 255, 201, 167], interface_id) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `upgradeToAndCall` (0x4f1ef286) function - pub fn upgrade_to_and_call( - &self, - new_implementation: ::ethers::core::types::Address, - data: ::ethers::core::types::Bytes, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([79, 30, 242, 134], (new_implementation, data)) - .expect("method not found (this should never happen)") - } - ///Gets the contract's `Initialized` event - pub fn initialized_filter( - &self, - ) -> ::ethers::contract::builders::Event<::std::sync::Arc, M, InitializedFilter> - { - self.0.event() - } - ///Gets the contract's `Upgraded` event - pub fn upgraded_filter( - &self, - ) -> ::ethers::contract::builders::Event<::std::sync::Arc, M, UpgradedFilter> { - 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, UC_RektEvents> { - self.0 - .event_with_filter(::core::default::Default::default()) - } - } - impl From<::ethers::contract::Contract> for UC_Rekt { - fn from(contract: ::ethers::contract::Contract) -> Self { - Self::new(contract.address(), contract.client()) - } - } - ///Custom Error type `AddressEmptyCode` with signature `AddressEmptyCode(address)` and selector `0x9996b315` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[etherror(name = "AddressEmptyCode", abi = "AddressEmptyCode(address)")] - pub struct AddressEmptyCode { - pub target: ::ethers::core::types::Address, - } - ///Custom Error type `ERC1967InvalidImplementation` with signature `ERC1967InvalidImplementation(address)` and selector `0x4c9c8ce3` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[etherror( - name = "ERC1967InvalidImplementation", - abi = "ERC1967InvalidImplementation(address)" - )] - pub struct ERC1967InvalidImplementation { - pub implementation: ::ethers::core::types::Address, - } - ///Custom Error type `ERC1967NonPayable` with signature `ERC1967NonPayable()` and selector `0xb398979f` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[etherror(name = "ERC1967NonPayable", abi = "ERC1967NonPayable()")] - pub struct ERC1967NonPayable; - ///Custom Error type `FailedInnerCall` with signature `FailedInnerCall()` and selector `0x1425ea42` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[etherror(name = "FailedInnerCall", abi = "FailedInnerCall()")] - pub struct FailedInnerCall; - ///Custom Error type `InvalidInitialization` with signature `InvalidInitialization()` and selector `0xf92ee8a9` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[etherror(name = "InvalidInitialization", abi = "InvalidInitialization()")] - pub struct InvalidInitialization; - ///Custom Error type `NotInitializing` with signature `NotInitializing()` and selector `0xd7e6bcf8` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[etherror(name = "NotInitializing", abi = "NotInitializing()")] - pub struct NotInitializing; - ///Custom Error type `ReentrancyGuardReentrantCall` with signature `ReentrancyGuardReentrantCall()` and selector `0x3ee5aeb5` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[etherror( - name = "ReentrancyGuardReentrantCall", - abi = "ReentrancyGuardReentrantCall()" - )] - pub struct ReentrancyGuardReentrantCall; - ///Custom Error type `UUPSUnauthorizedCallContext` with signature `UUPSUnauthorizedCallContext()` and selector `0xe07c8dba` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[etherror( - name = "UUPSUnauthorizedCallContext", - abi = "UUPSUnauthorizedCallContext()" - )] - pub struct UUPSUnauthorizedCallContext; - ///Custom Error type `UUPSUnsupportedProxiableUUID` with signature `UUPSUnsupportedProxiableUUID(bytes32)` and selector `0xaa1d49a4` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[etherror( - name = "UUPSUnsupportedProxiableUUID", - abi = "UUPSUnsupportedProxiableUUID(bytes32)" - )] - pub struct UUPSUnsupportedProxiableUUID { - pub slot: [u8; 32], - } - ///Container type for all of the contract's custom errors - #[derive( - Clone, - ::ethers::contract::EthAbiType, - serde::Serialize, - serde::Deserialize, - Debug, - PartialEq, - Eq, - Hash, - )] - pub enum UC_RektErrors { - AddressEmptyCode(AddressEmptyCode), - ERC1967InvalidImplementation(ERC1967InvalidImplementation), - ERC1967NonPayable(ERC1967NonPayable), - FailedInnerCall(FailedInnerCall), - InvalidInitialization(InvalidInitialization), - NotInitializing(NotInitializing), - ReentrancyGuardReentrantCall(ReentrancyGuardReentrantCall), - UUPSUnauthorizedCallContext(UUPSUnauthorizedCallContext), - UUPSUnsupportedProxiableUUID(UUPSUnsupportedProxiableUUID), - /// The standard solidity revert string, with selector - /// Error(string) -- 0x08c379a0 - RevertString(::std::string::String), - } - impl ::ethers::core::abi::AbiDecode for UC_RektErrors { - fn decode( - data: impl AsRef<[u8]>, - ) -> ::core::result::Result { - let data = data.as_ref(); - if let Ok(decoded) = - <::std::string::String as ::ethers::core::abi::AbiDecode>::decode(data) - { - return Ok(Self::RevertString(decoded)); - } - if let Ok(decoded) = ::decode(data) - { - return Ok(Self::AddressEmptyCode(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::ERC1967InvalidImplementation(decoded)); - } - if let Ok(decoded) = ::decode(data) - { - return Ok(Self::ERC1967NonPayable(decoded)); - } - if let Ok(decoded) = ::decode(data) { - return Ok(Self::FailedInnerCall(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::InvalidInitialization(decoded)); - } - if let Ok(decoded) = ::decode(data) { - return Ok(Self::NotInitializing(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::ReentrancyGuardReentrantCall(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::UUPSUnauthorizedCallContext(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::UUPSUnsupportedProxiableUUID(decoded)); - } - Err(::ethers::core::abi::Error::InvalidData.into()) - } - } - impl ::ethers::core::abi::AbiEncode for UC_RektErrors { - fn encode(self) -> ::std::vec::Vec { - match self { - Self::AddressEmptyCode(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::ERC1967InvalidImplementation(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::ERC1967NonPayable(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::FailedInnerCall(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::InvalidInitialization(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::NotInitializing(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::ReentrancyGuardReentrantCall(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::UUPSUnauthorizedCallContext(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::UUPSUnsupportedProxiableUUID(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::RevertString(s) => ::ethers::core::abi::AbiEncode::encode(s), - } - } - } - impl ::ethers::contract::ContractRevert for UC_RektErrors { - fn valid_selector(selector: [u8; 4]) -> bool { - match selector { - [0x08, 0xc3, 0x79, 0xa0] => true, - _ if selector == ::selector() => { - true - } - _ if selector - == ::selector( - ) => - { - true - } - _ if selector - == ::selector() => - { - true - } - _ if selector == ::selector() => { - true - } - _ if selector - == ::selector() => - { - true - } - _ if selector == ::selector() => { - true - } - _ if selector - == ::selector( - ) => - { - true - } - _ if selector - == ::selector( - ) => - { - true - } - _ if selector - == ::selector( - ) => - { - true - } - _ => false, - } - } - } - impl ::core::fmt::Display for UC_RektErrors { - fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { - match self { - Self::AddressEmptyCode(element) => ::core::fmt::Display::fmt(element, f), - Self::ERC1967InvalidImplementation(element) => { - ::core::fmt::Display::fmt(element, f) - } - Self::ERC1967NonPayable(element) => ::core::fmt::Display::fmt(element, f), - Self::FailedInnerCall(element) => ::core::fmt::Display::fmt(element, f), - Self::InvalidInitialization(element) => ::core::fmt::Display::fmt(element, f), - Self::NotInitializing(element) => ::core::fmt::Display::fmt(element, f), - Self::ReentrancyGuardReentrantCall(element) => { - ::core::fmt::Display::fmt(element, f) - } - Self::UUPSUnauthorizedCallContext(element) => ::core::fmt::Display::fmt(element, f), - Self::UUPSUnsupportedProxiableUUID(element) => { - ::core::fmt::Display::fmt(element, f) - } - Self::RevertString(s) => ::core::fmt::Display::fmt(s, f), - } - } - } - impl ::core::convert::From<::std::string::String> for UC_RektErrors { - fn from(value: String) -> Self { - Self::RevertString(value) - } - } - impl ::core::convert::From for UC_RektErrors { - fn from(value: AddressEmptyCode) -> Self { - Self::AddressEmptyCode(value) - } - } - impl ::core::convert::From for UC_RektErrors { - fn from(value: ERC1967InvalidImplementation) -> Self { - Self::ERC1967InvalidImplementation(value) - } - } - impl ::core::convert::From for UC_RektErrors { - fn from(value: ERC1967NonPayable) -> Self { - Self::ERC1967NonPayable(value) - } - } - impl ::core::convert::From for UC_RektErrors { - fn from(value: FailedInnerCall) -> Self { - Self::FailedInnerCall(value) - } - } - impl ::core::convert::From for UC_RektErrors { - fn from(value: InvalidInitialization) -> Self { - Self::InvalidInitialization(value) - } - } - impl ::core::convert::From for UC_RektErrors { - fn from(value: NotInitializing) -> Self { - Self::NotInitializing(value) - } - } - impl ::core::convert::From for UC_RektErrors { - fn from(value: ReentrancyGuardReentrantCall) -> Self { - Self::ReentrancyGuardReentrantCall(value) - } - } - impl ::core::convert::From for UC_RektErrors { - fn from(value: UUPSUnauthorizedCallContext) -> Self { - Self::UUPSUnauthorizedCallContext(value) - } - } - impl ::core::convert::From for UC_RektErrors { - fn from(value: UUPSUnsupportedProxiableUUID) -> Self { - Self::UUPSUnsupportedProxiableUUID(value) - } - } - #[derive( - Clone, - ::ethers::contract::EthEvent, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethevent(name = "Initialized", abi = "Initialized(uint64)")] - pub struct InitializedFilter { - pub version: u64, - } - #[derive( - Clone, - ::ethers::contract::EthEvent, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethevent(name = "Upgraded", abi = "Upgraded(address)")] - pub struct UpgradedFilter { - #[ethevent(indexed)] - pub implementation: ::ethers::core::types::Address, - } - ///Container type for all of the contract's events - #[derive( - Clone, - ::ethers::contract::EthAbiType, - serde::Serialize, - serde::Deserialize, - Debug, - PartialEq, - Eq, - Hash, - )] - pub enum UC_RektEvents { - InitializedFilter(InitializedFilter), - UpgradedFilter(UpgradedFilter), - } - impl ::ethers::contract::EthLogDecode for UC_RektEvents { - fn decode_log( - log: &::ethers::core::abi::RawLog, - ) -> ::core::result::Result { - if let Ok(decoded) = InitializedFilter::decode_log(log) { - return Ok(UC_RektEvents::InitializedFilter(decoded)); - } - if let Ok(decoded) = UpgradedFilter::decode_log(log) { - return Ok(UC_RektEvents::UpgradedFilter(decoded)); - } - Err(::ethers::core::abi::Error::InvalidData) - } - } - impl ::core::fmt::Display for UC_RektEvents { - fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { - match self { - Self::InitializedFilter(element) => ::core::fmt::Display::fmt(element, f), - Self::UpgradedFilter(element) => ::core::fmt::Display::fmt(element, f), - } - } - } - impl ::core::convert::From for UC_RektEvents { - fn from(value: InitializedFilter) -> Self { - Self::InitializedFilter(value) - } - } - impl ::core::convert::From for UC_RektEvents { - fn from(value: UpgradedFilter) -> Self { - Self::UpgradedFilter(value) - } - } - ///Container type for all input parameters for the `UPGRADE_INTERFACE_VERSION` function with signature `UPGRADE_INTERFACE_VERSION()` and selector `0xad3cb1cc` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall( - name = "UPGRADE_INTERFACE_VERSION", - abi = "UPGRADE_INTERFACE_VERSION()" - )] - pub struct UpgradeInterfaceVersionCall; - ///Container type for all input parameters for the `initialize` function with signature `initialize()` and selector `0x8129fc1c` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "initialize", abi = "initialize()")] - pub struct InitializeCall; - ///Container type for all input parameters for the `my_operation1` function with signature `my_operation1()` and selector `0xeefb4461` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "my_operation1", abi = "my_operation1()")] - pub struct MyOperation1Call; - ///Container type for all input parameters for the `my_operation2` function with signature `my_operation2()` and selector `0xbc2e66e6` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "my_operation2", abi = "my_operation2()")] - pub struct MyOperation2Call; - ///Container type for all input parameters for the `proxiableUUID` function with signature `proxiableUUID()` and selector `0x52d1902d` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "proxiableUUID", abi = "proxiableUUID()")] - pub struct ProxiableUUIDCall; - ///Container type for all input parameters for the `rektSlot` function with signature `rektSlot()` and selector `0x303408d6` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "rektSlot", abi = "rektSlot()")] - pub struct RektSlotCall; - ///Container type for all input parameters for the `rektSlot2` function with signature `rektSlot2()` and selector `0xa8d21b9d` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "rektSlot2", abi = "rektSlot2()")] - pub struct RektSlot2Call; - ///Container type for all input parameters for the `slot1` function with signature `slot1()` and selector `0x1f457cb5` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "slot1", abi = "slot1()")] - pub struct Slot1Call; - ///Container type for all input parameters for the `supportsInterface` function with signature `supportsInterface(bytes4)` and selector `0x01ffc9a7` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "supportsInterface", abi = "supportsInterface(bytes4)")] - pub struct SupportsInterfaceCall { - pub interface_id: [u8; 4], - } - ///Container type for all input parameters for the `upgradeToAndCall` function with signature `upgradeToAndCall(address,bytes)` and selector `0x4f1ef286` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "upgradeToAndCall", abi = "upgradeToAndCall(address,bytes)")] - pub struct UpgradeToAndCallCall { - pub new_implementation: ::ethers::core::types::Address, - pub data: ::ethers::core::types::Bytes, - } - ///Container type for all of the contract's call - #[derive( - Clone, - ::ethers::contract::EthAbiType, - serde::Serialize, - serde::Deserialize, - Debug, - PartialEq, - Eq, - Hash, - )] - pub enum UC_RektCalls { - UpgradeInterfaceVersion(UpgradeInterfaceVersionCall), - Initialize(InitializeCall), - MyOperation1(MyOperation1Call), - MyOperation2(MyOperation2Call), - ProxiableUUID(ProxiableUUIDCall), - RektSlot(RektSlotCall), - RektSlot2(RektSlot2Call), - Slot1(Slot1Call), - SupportsInterface(SupportsInterfaceCall), - UpgradeToAndCall(UpgradeToAndCallCall), - } - impl ::ethers::core::abi::AbiDecode for UC_RektCalls { - fn decode( - data: impl AsRef<[u8]>, - ) -> ::core::result::Result { - let data = data.as_ref(); - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::UpgradeInterfaceVersion(decoded)); - } - if let Ok(decoded) = ::decode(data) { - return Ok(Self::Initialize(decoded)); - } - if let Ok(decoded) = ::decode(data) - { - return Ok(Self::MyOperation1(decoded)); - } - if let Ok(decoded) = ::decode(data) - { - return Ok(Self::MyOperation2(decoded)); - } - if let Ok(decoded) = ::decode(data) - { - return Ok(Self::ProxiableUUID(decoded)); - } - if let Ok(decoded) = ::decode(data) { - return Ok(Self::RektSlot(decoded)); - } - if let Ok(decoded) = ::decode(data) { - return Ok(Self::RektSlot2(decoded)); - } - if let Ok(decoded) = ::decode(data) { - return Ok(Self::Slot1(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::SupportsInterface(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::UpgradeToAndCall(decoded)); - } - Err(::ethers::core::abi::Error::InvalidData.into()) - } - } - impl ::ethers::core::abi::AbiEncode for UC_RektCalls { - fn encode(self) -> Vec { - match self { - Self::UpgradeInterfaceVersion(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::Initialize(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::MyOperation1(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::MyOperation2(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::ProxiableUUID(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::RektSlot(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::RektSlot2(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::Slot1(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::SupportsInterface(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::UpgradeToAndCall(element) => ::ethers::core::abi::AbiEncode::encode(element), - } - } - } - impl ::core::fmt::Display for UC_RektCalls { - fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { - match self { - Self::UpgradeInterfaceVersion(element) => ::core::fmt::Display::fmt(element, f), - Self::Initialize(element) => ::core::fmt::Display::fmt(element, f), - Self::MyOperation1(element) => ::core::fmt::Display::fmt(element, f), - Self::MyOperation2(element) => ::core::fmt::Display::fmt(element, f), - Self::ProxiableUUID(element) => ::core::fmt::Display::fmt(element, f), - Self::RektSlot(element) => ::core::fmt::Display::fmt(element, f), - Self::RektSlot2(element) => ::core::fmt::Display::fmt(element, f), - Self::Slot1(element) => ::core::fmt::Display::fmt(element, f), - Self::SupportsInterface(element) => ::core::fmt::Display::fmt(element, f), - Self::UpgradeToAndCall(element) => ::core::fmt::Display::fmt(element, f), - } - } - } - impl ::core::convert::From for UC_RektCalls { - fn from(value: UpgradeInterfaceVersionCall) -> Self { - Self::UpgradeInterfaceVersion(value) - } - } - impl ::core::convert::From for UC_RektCalls { - fn from(value: InitializeCall) -> Self { - Self::Initialize(value) - } - } - impl ::core::convert::From for UC_RektCalls { - fn from(value: MyOperation1Call) -> Self { - Self::MyOperation1(value) - } - } - impl ::core::convert::From for UC_RektCalls { - fn from(value: MyOperation2Call) -> Self { - Self::MyOperation2(value) - } - } - impl ::core::convert::From for UC_RektCalls { - fn from(value: ProxiableUUIDCall) -> Self { - Self::ProxiableUUID(value) - } - } - impl ::core::convert::From for UC_RektCalls { - fn from(value: RektSlotCall) -> Self { - Self::RektSlot(value) - } - } - impl ::core::convert::From for UC_RektCalls { - fn from(value: RektSlot2Call) -> Self { - Self::RektSlot2(value) - } - } - impl ::core::convert::From for UC_RektCalls { - fn from(value: Slot1Call) -> Self { - Self::Slot1(value) - } - } - impl ::core::convert::From for UC_RektCalls { - fn from(value: SupportsInterfaceCall) -> Self { - Self::SupportsInterface(value) - } - } - impl ::core::convert::From for UC_RektCalls { - fn from(value: UpgradeToAndCallCall) -> Self { - Self::UpgradeToAndCall(value) - } - } - ///Container type for all return fields from the `UPGRADE_INTERFACE_VERSION` function with signature `UPGRADE_INTERFACE_VERSION()` and selector `0xad3cb1cc` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct UpgradeInterfaceVersionReturn(pub ::std::string::String); - ///Container type for all return fields from the `my_operation1` function with signature `my_operation1()` and selector `0xeefb4461` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct MyOperation1Return(pub ::ethers::core::types::U256); - ///Container type for all return fields from the `proxiableUUID` function with signature `proxiableUUID()` and selector `0x52d1902d` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct ProxiableUUIDReturn(pub [u8; 32]); - ///Container type for all return fields from the `rektSlot` function with signature `rektSlot()` and selector `0x303408d6` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct RektSlotReturn(pub bool); - ///Container type for all return fields from the `rektSlot2` function with signature `rektSlot2()` and selector `0xa8d21b9d` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct RektSlot2Return(pub u128); - ///Container type for all return fields from the `slot1` function with signature `slot1()` and selector `0x1f457cb5` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct Slot1Return(pub ::ethers::core::types::U256); - ///Container type for all return fields from the `supportsInterface` function with signature `supportsInterface(bytes4)` and selector `0x01ffc9a7` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct SupportsInterfaceReturn(pub bool); -} diff --git a/bindings/src/uc_with_rg.rs b/bindings/src/uc_with_rg.rs deleted file mode 100644 index 9bebf8c..0000000 --- a/bindings/src/uc_with_rg.rs +++ /dev/null @@ -1,1229 +0,0 @@ -pub use uc_with_rg::*; -/// 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 uc_with_rg { - #[allow(deprecated)] - fn __abi() -> ::ethers::core::abi::Abi { - ::ethers::core::abi::ethabi::Contract { - constructor: ::core::option::Option::Some(::ethers::core::abi::ethabi::Constructor { - inputs: ::std::vec![], - }), - functions: ::core::convert::From::from([ - ( - ::std::borrow::ToOwned::to_owned("UPGRADE_INTERFACE_VERSION"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("UPGRADE_INTERFACE_VERSION",), - inputs: ::std::vec![], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::String, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("string"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("initialize"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("initialize"), - inputs: ::std::vec![], - outputs: ::std::vec![], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("my_operation1"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("my_operation1"), - inputs: ::std::vec![], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("my_operation2"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("my_operation2"), - inputs: ::std::vec![], - outputs: ::std::vec![], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("proxiableUUID"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("proxiableUUID"), - inputs: ::std::vec![], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::FixedBytes(32usize,), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes32"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("slot1"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("slot1"), - inputs: ::std::vec![], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("supportsInterface"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("supportsInterface"), - inputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("interfaceId"), - kind: ::ethers::core::abi::ethabi::ParamType::FixedBytes(4usize,), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes4"), - ), - },], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Bool, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bool"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("upgradeToAndCall"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("upgradeToAndCall"), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("newImplementation"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("data"), - kind: ::ethers::core::abi::ethabi::ParamType::Bytes, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes"), - ), - }, - ], - outputs: ::std::vec![], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::Payable, - },], - ), - ]), - events: ::core::convert::From::from([ - ( - ::std::borrow::ToOwned::to_owned("Initialized"), - ::std::vec![::ethers::core::abi::ethabi::Event { - name: ::std::borrow::ToOwned::to_owned("Initialized"), - inputs: ::std::vec![::ethers::core::abi::ethabi::EventParam { - name: ::std::borrow::ToOwned::to_owned("version"), - kind: ::ethers::core::abi::ethabi::ParamType::Uint(64usize), - indexed: false, - },], - anonymous: false, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("Upgraded"), - ::std::vec![::ethers::core::abi::ethabi::Event { - name: ::std::borrow::ToOwned::to_owned("Upgraded"), - inputs: ::std::vec![::ethers::core::abi::ethabi::EventParam { - name: ::std::borrow::ToOwned::to_owned("implementation"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - indexed: true, - },], - anonymous: false, - },], - ), - ]), - errors: ::core::convert::From::from([ - ( - ::std::borrow::ToOwned::to_owned("AddressEmptyCode"), - ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("AddressEmptyCode"), - inputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("target"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - },], - },], - ), - ( - ::std::borrow::ToOwned::to_owned("ERC1967InvalidImplementation"), - ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("ERC1967InvalidImplementation",), - inputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("implementation"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - },], - },], - ), - ( - ::std::borrow::ToOwned::to_owned("ERC1967NonPayable"), - ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("ERC1967NonPayable"), - inputs: ::std::vec![], - },], - ), - ( - ::std::borrow::ToOwned::to_owned("FailedInnerCall"), - ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("FailedInnerCall"), - inputs: ::std::vec![], - },], - ), - ( - ::std::borrow::ToOwned::to_owned("InvalidInitialization"), - ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("InvalidInitialization",), - inputs: ::std::vec![], - },], - ), - ( - ::std::borrow::ToOwned::to_owned("NotInitializing"), - ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("NotInitializing"), - inputs: ::std::vec![], - },], - ), - ( - ::std::borrow::ToOwned::to_owned("ReentrancyGuardReentrantCall"), - ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("ReentrancyGuardReentrantCall",), - inputs: ::std::vec![], - },], - ), - ( - ::std::borrow::ToOwned::to_owned("UUPSUnauthorizedCallContext"), - ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("UUPSUnauthorizedCallContext",), - inputs: ::std::vec![], - },], - ), - ( - ::std::borrow::ToOwned::to_owned("UUPSUnsupportedProxiableUUID"), - ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("UUPSUnsupportedProxiableUUID",), - inputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("slot"), - kind: ::ethers::core::abi::ethabi::ParamType::FixedBytes(32usize,), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes32"), - ), - },], - },], - ), - ]), - receive: false, - fallback: false, - } - } - ///The parsed JSON ABI of the contract. - pub static UC_WITH_RG_ABI: ::ethers::contract::Lazy<::ethers::core::abi::Abi> = - ::ethers::contract::Lazy::new(__abi); - #[rustfmt::skip] - const __BYTECODE: &[u8] = b"`\xA0`@R0`\x80R4\x80\x15a\0\x14W`\0\x80\xFD[P\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x80Th\x01\0\0\0\0\0\0\0\0\x81\x04`\xFF\x16\x15\x90`\x01`\x01`@\x1B\x03\x16`\0\x81\x15\x80\x15a\0_WP\x82[\x90P`\0\x82`\x01`\x01`@\x1B\x03\x16`\x01\x14\x80\x15a\0{WP0;\x15[\x90P\x81\x15\x80\x15a\0\x89WP\x80\x15[\x15a\0\xA7W`@Qc\xF9.\xE8\xA9`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x84T`\x01`\x01`@\x1B\x03\x19\x16`\x01\x17\x85U\x83\x15a\0\xD5W\x84T`\xFF`@\x1B\x19\x16h\x01\0\0\0\0\0\0\0\0\x17\x85U[\x83\x15a\x01\tW\x84T`\xFF`@\x1B\x19\x16\x85U`@Q`\x01\x81R`\0\x80Q` a\x0C\x14\x839\x81Q\x91R\x90` \x01`@Q\x80\x91\x03\x90\xA1[PPPPP`\0a\x01\x1Ea\x01\xFE` \x1B` \x1CV[\x80T\x90\x91P`\xFFh\x01\0\0\0\0\0\0\0\0\x82\x04\x16\x15\x90`\x01`\x01`@\x1B\x03\x16`\0\x81\x15\x80\x15a\x01JWP\x82[\x90P`\0\x82`\x01`\x01`@\x1B\x03\x16`\x01\x14\x80\x15a\x01fWP0;\x15[\x90P\x81\x15\x80\x15a\x01tWP\x80\x15[\x15a\x01\x92W`@Qc\xF9.\xE8\xA9`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x84T`\x01`\x01`@\x1B\x03\x19\x16`\x01\x17\x85U\x83\x15a\x01\xC0W\x84T`\xFF`@\x1B\x19\x16h\x01\0\0\0\0\0\0\0\0\x17\x85U[\x83\x15a\x01\xF4W\x84T`\xFF`@\x1B\x19\x16\x85U`@Q`\x01\x81R`\0\x80Q` a\x0C\x14\x839\x81Q\x91R\x90` \x01`@Q\x80\x91\x03\x90\xA1[PPPPPa\x02\"V[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x90V[`\x80Qa\t\xC9a\x02K`\09`\0\x81\x81a\x03\x11\x01R\x81\x81a\x03:\x01Ra\x04}\x01Ra\t\xC9`\0\xF3\xFE`\x80`@R`\x046\x10a\0{W`\x005`\xE0\x1C\x80c\x81)\xFC\x1C\x11a\0NW\x80c\x81)\xFC\x1C\x14a\x01\x15W\x80c\xAD<\xB1\xCC\x14a\x01*W\x80c\xBC.f\xE6\x14a\x01hW\x80c\xEE\xFBDa\x14a\x01tW`\0\x80\xFD[\x80c\x01\xFF\xC9\xA7\x14a\0\x80W\x80c\x1FE|\xB5\x14a\0\xC6W\x80cO\x1E\xF2\x86\x14a\0\xEBW\x80cR\xD1\x90-\x14a\x01\0W[`\0\x80\xFD[4\x80\x15a\0\x8CW`\0\x80\xFD[Pa\0\xB1a\0\x9B6`\x04a\x07\xD7V[`\x01`\x01`\xE0\x1B\x03\x19\x16c\x01\xFF\xC9\xA7`\xE0\x1B\x14\x90V[`@Q\x90\x15\x15\x81R` \x01[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\0\xD2W`\0\x80\xFD[Pa\0\xDDa\x01\xF4T\x81V[`@Q\x90\x81R` \x01a\0\xBDV[a\0\xFEa\0\xF96`\x04a\x08\x17V[a\x01\x89V[\0[4\x80\x15a\x01\x0CW`\0\x80\xFD[Pa\0\xDDa\x01\x9FV[4\x80\x15a\x01!W`\0\x80\xFD[Pa\0\xFEa\x01\xBDV[4\x80\x15a\x016W`\0\x80\xFD[Pa\x01[`@Q\x80`@\x01`@R\x80`\x05\x81R` \x01d\x03R\xE3\x02\xE3`\xDC\x1B\x81RP\x81V[`@Qa\0\xBD\x91\x90a\t\x0BV[4\x80\x15a\0\xFEW`\0\x80\xFD[4\x80\x15a\x01\x80W`\0\x80\xFD[Pa\0\xDDa\x02\xCEV[a\x01\x91a\x03\x06V[a\x01\x9B\x82\x82a\x03\xABV[PPV[`\0a\x01\xA9a\x04rV[P`\0\x80Q` a\tt\x839\x81Q\x91R[\x90V[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x80T`\x01`@\x1B\x81\x04`\xFF\x16\x15\x90g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16`\0\x81\x15\x80\x15a\x02\x03WP\x82[\x90P`\0\x82g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16`\x01\x14\x80\x15a\x02 WP0;\x15[\x90P\x81\x15\x80\x15a\x02.WP\x80\x15[\x15a\x02LW`@Qc\xF9.\xE8\xA9`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x84Tg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x19\x16`\x01\x17\x85U\x83\x15a\x02vW\x84T`\xFF`@\x1B\x19\x16`\x01`@\x1B\x17\x85U[a\x02~a\x04\xBBV[\x83\x15a\x02\xC5W\x84T`\xFF`@\x1B\x19\x16\x85U`@Q`\x01\x81R\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x90` \x01[`@Q\x80\x91\x03\x90\xA1[PPPPPV[V[`\0a\x02\xD8a\x05\xB5V[Pa\x01\xF4Ta\x01\xBA`\x01\x7F\x9Bw\x9B\x17B-\r\xF9\"#\x01\x8B2\xB4\xD1\xFAF\xE0qr=h\x17\xE2Hm\0;\xEC\xC5_\0UV[0`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x14\x80a\x03\x8DWP\x7F\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`\x01`\x01`\xA0\x1B\x03\x16a\x03\x81`\0\x80Q` a\tt\x839\x81Q\x91RT`\x01`\x01`\xA0\x1B\x03\x16\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x14\x15[\x15a\x02\xCCW`@Qcp>F\xDD`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x81`\x01`\x01`\xA0\x1B\x03\x16cR\xD1\x90-`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x92PPP\x80\x15a\x04\x05WP`@\x80Q`\x1F=\x90\x81\x01`\x1F\x19\x16\x82\x01\x90\x92Ra\x04\x02\x91\x81\x01\x90a\t>V[`\x01[a\x042W`@QcL\x9C\x8C\xE3`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x83\x16`\x04\x82\x01R`$\x01[`@Q\x80\x91\x03\x90\xFD[`\0\x80Q` a\tt\x839\x81Q\x91R\x81\x14a\x04cW`@Qc*\x87Ri`\xE2\x1B\x81R`\x04\x81\x01\x82\x90R`$\x01a\x04)V[a\x04m\x83\x83a\x05\xFFV[PPPV[0`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x14a\x02\xCCW`@Qcp>F\xDD`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x80T`\x01`@\x1B\x81\x04`\xFF\x16\x15\x90g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16`\0\x81\x15\x80\x15a\x05\x01WP\x82[\x90P`\0\x82g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16`\x01\x14\x80\x15a\x05\x1EWP0;\x15[\x90P\x81\x15\x80\x15a\x05,WP\x80\x15[\x15a\x05JW`@Qc\xF9.\xE8\xA9`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x84Tg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x19\x16`\x01\x17\x85U\x83\x15a\x02~W\x84T`\xFF`@\x1B\x19\x16`\x01`@\x1B\x17\x85U\x83\x15a\x02\xC5W\x84T`\xFF`@\x1B\x19\x16\x85U`@Q`\x01\x81R\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x90` \x01a\x02\xBCV[\x7F\x9Bw\x9B\x17B-\r\xF9\"#\x01\x8B2\xB4\xD1\xFAF\xE0qr=h\x17\xE2Hm\0;\xEC\xC5_\0\x80T`\x01\x19\x01a\x05\xF9W`@Qc>\xE5\xAE\xB5`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x02\x90UV[a\x06\x08\x82a\x06UV[`@Q`\x01`\x01`\xA0\x1B\x03\x83\x16\x90\x7F\xBC|\xD7Z \xEE'\xFD\x9A\xDE\xBA\xB3 A\xF7U!M\xBCk\xFF\xA9\x0C\xC0\"[9\xDA.\\-;\x90`\0\x90\xA2\x80Q\x15a\x06MWa\x04m\x82\x82a\x06\xBAV[a\x01\x9Ba\x070V[\x80`\x01`\x01`\xA0\x1B\x03\x16;`\0\x03a\x06\x8BW`@QcL\x9C\x8C\xE3`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x82\x16`\x04\x82\x01R`$\x01a\x04)V[`\0\x80Q` a\tt\x839\x81Q\x91R\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16`\x01`\x01`\xA0\x1B\x03\x92\x90\x92\x16\x91\x90\x91\x17\x90UV[```\0\x80\x84`\x01`\x01`\xA0\x1B\x03\x16\x84`@Qa\x06\xD7\x91\x90a\tWV[`\0`@Q\x80\x83\x03\x81\x85Z\xF4\x91PP=\x80`\0\x81\x14a\x07\x12W`@Q\x91P`\x1F\x19`?=\x01\x16\x82\x01`@R=\x82R=`\0` \x84\x01>a\x07\x17V[``\x91P[P\x91P\x91Pa\x07'\x85\x83\x83a\x07OV[\x95\x94PPPPPV[4\x15a\x02\xCCW`@Qc\xB3\x98\x97\x9F`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[``\x82a\x07dWa\x07_\x82a\x07\xAEV[a\x07\xA7V[\x81Q\x15\x80\x15a\x07{WP`\x01`\x01`\xA0\x1B\x03\x84\x16;\x15[\x15a\x07\xA4W`@Qc\x99\x96\xB3\x15`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x85\x16`\x04\x82\x01R`$\x01a\x04)V[P\x80[\x93\x92PPPV[\x80Q\x15a\x07\xBEW\x80Q\x80\x82` \x01\xFD[`@Qc\n\x12\xF5!`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0` \x82\x84\x03\x12\x15a\x07\xE9W`\0\x80\xFD[\x815`\x01`\x01`\xE0\x1B\x03\x19\x81\x16\x81\x14a\x07\xA7W`\0\x80\xFD[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`\0\x80`@\x83\x85\x03\x12\x15a\x08*W`\0\x80\xFD[\x825`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a\x08AW`\0\x80\xFD[\x91P` \x83\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x11\x15a\x08^W`\0\x80\xFD[\x81\x85\x01\x91P\x85`\x1F\x83\x01\x12a\x08rW`\0\x80\xFD[\x815\x81\x81\x11\x15a\x08\x84Wa\x08\x84a\x08\x01V[`@Q`\x1F\x82\x01`\x1F\x19\x90\x81\x16`?\x01\x16\x81\x01\x90\x83\x82\x11\x81\x83\x10\x17\x15a\x08\xACWa\x08\xACa\x08\x01V[\x81`@R\x82\x81R\x88` \x84\x87\x01\x01\x11\x15a\x08\xC5W`\0\x80\xFD[\x82` \x86\x01` \x83\x017`\0` \x84\x83\x01\x01R\x80\x95PPPPPP\x92P\x92\x90PV[`\0[\x83\x81\x10\x15a\t\x02W\x81\x81\x01Q\x83\x82\x01R` \x01a\x08\xEAV[PP`\0\x91\x01RV[` \x81R`\0\x82Q\x80` \x84\x01Ra\t*\x81`@\x85\x01` \x87\x01a\x08\xE7V[`\x1F\x01`\x1F\x19\x16\x91\x90\x91\x01`@\x01\x92\x91PPV[`\0` \x82\x84\x03\x12\x15a\tPW`\0\x80\xFD[PQ\x91\x90PV[`\0\x82Qa\ti\x81\x84` \x87\x01a\x08\xE7V[\x91\x90\x91\x01\x92\x91PPV\xFE6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC\xA2dipfsX\"\x12 4\r\xC3\xD3\x94\x02\x10\xEAE\xD0\0\xD7r\xD4s\x04\"j\x95\xA7\xCC\xEA\xD9\xC0W\xF1\xE9\xF4i\x92\x048dsolcC\0\x08\x14\x003\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2"; - /// The bytecode of the contract. - pub static UC_WITH_RG_BYTECODE: ::ethers::core::types::Bytes = - ::ethers::core::types::Bytes::from_static(__BYTECODE); - #[rustfmt::skip] - const __DEPLOYED_BYTECODE: &[u8] = b"`\x80`@R`\x046\x10a\0{W`\x005`\xE0\x1C\x80c\x81)\xFC\x1C\x11a\0NW\x80c\x81)\xFC\x1C\x14a\x01\x15W\x80c\xAD<\xB1\xCC\x14a\x01*W\x80c\xBC.f\xE6\x14a\x01hW\x80c\xEE\xFBDa\x14a\x01tW`\0\x80\xFD[\x80c\x01\xFF\xC9\xA7\x14a\0\x80W\x80c\x1FE|\xB5\x14a\0\xC6W\x80cO\x1E\xF2\x86\x14a\0\xEBW\x80cR\xD1\x90-\x14a\x01\0W[`\0\x80\xFD[4\x80\x15a\0\x8CW`\0\x80\xFD[Pa\0\xB1a\0\x9B6`\x04a\x07\xD7V[`\x01`\x01`\xE0\x1B\x03\x19\x16c\x01\xFF\xC9\xA7`\xE0\x1B\x14\x90V[`@Q\x90\x15\x15\x81R` \x01[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\0\xD2W`\0\x80\xFD[Pa\0\xDDa\x01\xF4T\x81V[`@Q\x90\x81R` \x01a\0\xBDV[a\0\xFEa\0\xF96`\x04a\x08\x17V[a\x01\x89V[\0[4\x80\x15a\x01\x0CW`\0\x80\xFD[Pa\0\xDDa\x01\x9FV[4\x80\x15a\x01!W`\0\x80\xFD[Pa\0\xFEa\x01\xBDV[4\x80\x15a\x016W`\0\x80\xFD[Pa\x01[`@Q\x80`@\x01`@R\x80`\x05\x81R` \x01d\x03R\xE3\x02\xE3`\xDC\x1B\x81RP\x81V[`@Qa\0\xBD\x91\x90a\t\x0BV[4\x80\x15a\0\xFEW`\0\x80\xFD[4\x80\x15a\x01\x80W`\0\x80\xFD[Pa\0\xDDa\x02\xCEV[a\x01\x91a\x03\x06V[a\x01\x9B\x82\x82a\x03\xABV[PPV[`\0a\x01\xA9a\x04rV[P`\0\x80Q` a\tt\x839\x81Q\x91R[\x90V[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x80T`\x01`@\x1B\x81\x04`\xFF\x16\x15\x90g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16`\0\x81\x15\x80\x15a\x02\x03WP\x82[\x90P`\0\x82g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16`\x01\x14\x80\x15a\x02 WP0;\x15[\x90P\x81\x15\x80\x15a\x02.WP\x80\x15[\x15a\x02LW`@Qc\xF9.\xE8\xA9`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x84Tg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x19\x16`\x01\x17\x85U\x83\x15a\x02vW\x84T`\xFF`@\x1B\x19\x16`\x01`@\x1B\x17\x85U[a\x02~a\x04\xBBV[\x83\x15a\x02\xC5W\x84T`\xFF`@\x1B\x19\x16\x85U`@Q`\x01\x81R\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x90` \x01[`@Q\x80\x91\x03\x90\xA1[PPPPPV[V[`\0a\x02\xD8a\x05\xB5V[Pa\x01\xF4Ta\x01\xBA`\x01\x7F\x9Bw\x9B\x17B-\r\xF9\"#\x01\x8B2\xB4\xD1\xFAF\xE0qr=h\x17\xE2Hm\0;\xEC\xC5_\0UV[0`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x14\x80a\x03\x8DWP\x7F\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`\x01`\x01`\xA0\x1B\x03\x16a\x03\x81`\0\x80Q` a\tt\x839\x81Q\x91RT`\x01`\x01`\xA0\x1B\x03\x16\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x14\x15[\x15a\x02\xCCW`@Qcp>F\xDD`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x81`\x01`\x01`\xA0\x1B\x03\x16cR\xD1\x90-`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x92PPP\x80\x15a\x04\x05WP`@\x80Q`\x1F=\x90\x81\x01`\x1F\x19\x16\x82\x01\x90\x92Ra\x04\x02\x91\x81\x01\x90a\t>V[`\x01[a\x042W`@QcL\x9C\x8C\xE3`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x83\x16`\x04\x82\x01R`$\x01[`@Q\x80\x91\x03\x90\xFD[`\0\x80Q` a\tt\x839\x81Q\x91R\x81\x14a\x04cW`@Qc*\x87Ri`\xE2\x1B\x81R`\x04\x81\x01\x82\x90R`$\x01a\x04)V[a\x04m\x83\x83a\x05\xFFV[PPPV[0`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x14a\x02\xCCW`@Qcp>F\xDD`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x80T`\x01`@\x1B\x81\x04`\xFF\x16\x15\x90g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16`\0\x81\x15\x80\x15a\x05\x01WP\x82[\x90P`\0\x82g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16`\x01\x14\x80\x15a\x05\x1EWP0;\x15[\x90P\x81\x15\x80\x15a\x05,WP\x80\x15[\x15a\x05JW`@Qc\xF9.\xE8\xA9`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x84Tg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x19\x16`\x01\x17\x85U\x83\x15a\x02~W\x84T`\xFF`@\x1B\x19\x16`\x01`@\x1B\x17\x85U\x83\x15a\x02\xC5W\x84T`\xFF`@\x1B\x19\x16\x85U`@Q`\x01\x81R\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x90` \x01a\x02\xBCV[\x7F\x9Bw\x9B\x17B-\r\xF9\"#\x01\x8B2\xB4\xD1\xFAF\xE0qr=h\x17\xE2Hm\0;\xEC\xC5_\0\x80T`\x01\x19\x01a\x05\xF9W`@Qc>\xE5\xAE\xB5`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x02\x90UV[a\x06\x08\x82a\x06UV[`@Q`\x01`\x01`\xA0\x1B\x03\x83\x16\x90\x7F\xBC|\xD7Z \xEE'\xFD\x9A\xDE\xBA\xB3 A\xF7U!M\xBCk\xFF\xA9\x0C\xC0\"[9\xDA.\\-;\x90`\0\x90\xA2\x80Q\x15a\x06MWa\x04m\x82\x82a\x06\xBAV[a\x01\x9Ba\x070V[\x80`\x01`\x01`\xA0\x1B\x03\x16;`\0\x03a\x06\x8BW`@QcL\x9C\x8C\xE3`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x82\x16`\x04\x82\x01R`$\x01a\x04)V[`\0\x80Q` a\tt\x839\x81Q\x91R\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16`\x01`\x01`\xA0\x1B\x03\x92\x90\x92\x16\x91\x90\x91\x17\x90UV[```\0\x80\x84`\x01`\x01`\xA0\x1B\x03\x16\x84`@Qa\x06\xD7\x91\x90a\tWV[`\0`@Q\x80\x83\x03\x81\x85Z\xF4\x91PP=\x80`\0\x81\x14a\x07\x12W`@Q\x91P`\x1F\x19`?=\x01\x16\x82\x01`@R=\x82R=`\0` \x84\x01>a\x07\x17V[``\x91P[P\x91P\x91Pa\x07'\x85\x83\x83a\x07OV[\x95\x94PPPPPV[4\x15a\x02\xCCW`@Qc\xB3\x98\x97\x9F`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[``\x82a\x07dWa\x07_\x82a\x07\xAEV[a\x07\xA7V[\x81Q\x15\x80\x15a\x07{WP`\x01`\x01`\xA0\x1B\x03\x84\x16;\x15[\x15a\x07\xA4W`@Qc\x99\x96\xB3\x15`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x85\x16`\x04\x82\x01R`$\x01a\x04)V[P\x80[\x93\x92PPPV[\x80Q\x15a\x07\xBEW\x80Q\x80\x82` \x01\xFD[`@Qc\n\x12\xF5!`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0` \x82\x84\x03\x12\x15a\x07\xE9W`\0\x80\xFD[\x815`\x01`\x01`\xE0\x1B\x03\x19\x81\x16\x81\x14a\x07\xA7W`\0\x80\xFD[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`\0\x80`@\x83\x85\x03\x12\x15a\x08*W`\0\x80\xFD[\x825`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a\x08AW`\0\x80\xFD[\x91P` \x83\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x11\x15a\x08^W`\0\x80\xFD[\x81\x85\x01\x91P\x85`\x1F\x83\x01\x12a\x08rW`\0\x80\xFD[\x815\x81\x81\x11\x15a\x08\x84Wa\x08\x84a\x08\x01V[`@Q`\x1F\x82\x01`\x1F\x19\x90\x81\x16`?\x01\x16\x81\x01\x90\x83\x82\x11\x81\x83\x10\x17\x15a\x08\xACWa\x08\xACa\x08\x01V[\x81`@R\x82\x81R\x88` \x84\x87\x01\x01\x11\x15a\x08\xC5W`\0\x80\xFD[\x82` \x86\x01` \x83\x017`\0` \x84\x83\x01\x01R\x80\x95PPPPPP\x92P\x92\x90PV[`\0[\x83\x81\x10\x15a\t\x02W\x81\x81\x01Q\x83\x82\x01R` \x01a\x08\xEAV[PP`\0\x91\x01RV[` \x81R`\0\x82Q\x80` \x84\x01Ra\t*\x81`@\x85\x01` \x87\x01a\x08\xE7V[`\x1F\x01`\x1F\x19\x16\x91\x90\x91\x01`@\x01\x92\x91PPV[`\0` \x82\x84\x03\x12\x15a\tPW`\0\x80\xFD[PQ\x91\x90PV[`\0\x82Qa\ti\x81\x84` \x87\x01a\x08\xE7V[\x91\x90\x91\x01\x92\x91PPV\xFE6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC\xA2dipfsX\"\x12 4\r\xC3\xD3\x94\x02\x10\xEAE\xD0\0\xD7r\xD4s\x04\"j\x95\xA7\xCC\xEA\xD9\xC0W\xF1\xE9\xF4i\x92\x048dsolcC\0\x08\x14\x003"; - /// The deployed bytecode of the contract. - pub static UC_WITH_RG_DEPLOYED_BYTECODE: ::ethers::core::types::Bytes = - ::ethers::core::types::Bytes::from_static(__DEPLOYED_BYTECODE); - pub struct UC_with_rg(::ethers::contract::Contract); - impl ::core::clone::Clone for UC_with_rg { - fn clone(&self) -> Self { - Self(::core::clone::Clone::clone(&self.0)) - } - } - impl ::core::ops::Deref for UC_with_rg { - type Target = ::ethers::contract::Contract; - fn deref(&self) -> &Self::Target { - &self.0 - } - } - impl ::core::ops::DerefMut for UC_with_rg { - fn deref_mut(&mut self) -> &mut Self::Target { - &mut self.0 - } - } - impl ::core::fmt::Debug for UC_with_rg { - fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { - f.debug_tuple(::core::stringify!(UC_with_rg)) - .field(&self.address()) - .finish() - } - } - impl UC_with_rg { - /// 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(), - UC_WITH_RG_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( - UC_WITH_RG_ABI.clone(), - UC_WITH_RG_BYTECODE.clone().into(), - client, - ); - let deployer = factory.deploy(constructor_args)?; - let deployer = ::ethers::contract::ContractDeployer::new(deployer); - Ok(deployer) - } - ///Calls the contract's `UPGRADE_INTERFACE_VERSION` (0xad3cb1cc) function - pub fn upgrade_interface_version( - &self, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([173, 60, 177, 204], ()) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `initialize` (0x8129fc1c) function - pub fn initialize(&self) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([129, 41, 252, 28], ()) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `my_operation1` (0xeefb4461) function - pub fn my_operation_1( - &self, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([238, 251, 68, 97], ()) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `my_operation2` (0xbc2e66e6) function - pub fn my_operation_2(&self) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([188, 46, 102, 230], ()) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `proxiableUUID` (0x52d1902d) function - pub fn proxiable_uuid(&self) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([82, 209, 144, 45], ()) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `slot1` (0x1f457cb5) function - pub fn slot_1( - &self, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([31, 69, 124, 181], ()) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `supportsInterface` (0x01ffc9a7) function - pub fn supports_interface( - &self, - interface_id: [u8; 4], - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([1, 255, 201, 167], interface_id) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `upgradeToAndCall` (0x4f1ef286) function - pub fn upgrade_to_and_call( - &self, - new_implementation: ::ethers::core::types::Address, - data: ::ethers::core::types::Bytes, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([79, 30, 242, 134], (new_implementation, data)) - .expect("method not found (this should never happen)") - } - ///Gets the contract's `Initialized` event - pub fn initialized_filter( - &self, - ) -> ::ethers::contract::builders::Event<::std::sync::Arc, M, InitializedFilter> - { - self.0.event() - } - ///Gets the contract's `Upgraded` event - pub fn upgraded_filter( - &self, - ) -> ::ethers::contract::builders::Event<::std::sync::Arc, M, UpgradedFilter> { - 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, UC_with_rgEvents> { - self.0 - .event_with_filter(::core::default::Default::default()) - } - } - impl From<::ethers::contract::Contract> for UC_with_rg { - fn from(contract: ::ethers::contract::Contract) -> Self { - Self::new(contract.address(), contract.client()) - } - } - ///Custom Error type `AddressEmptyCode` with signature `AddressEmptyCode(address)` and selector `0x9996b315` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[etherror(name = "AddressEmptyCode", abi = "AddressEmptyCode(address)")] - pub struct AddressEmptyCode { - pub target: ::ethers::core::types::Address, - } - ///Custom Error type `ERC1967InvalidImplementation` with signature `ERC1967InvalidImplementation(address)` and selector `0x4c9c8ce3` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[etherror( - name = "ERC1967InvalidImplementation", - abi = "ERC1967InvalidImplementation(address)" - )] - pub struct ERC1967InvalidImplementation { - pub implementation: ::ethers::core::types::Address, - } - ///Custom Error type `ERC1967NonPayable` with signature `ERC1967NonPayable()` and selector `0xb398979f` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[etherror(name = "ERC1967NonPayable", abi = "ERC1967NonPayable()")] - pub struct ERC1967NonPayable; - ///Custom Error type `FailedInnerCall` with signature `FailedInnerCall()` and selector `0x1425ea42` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[etherror(name = "FailedInnerCall", abi = "FailedInnerCall()")] - pub struct FailedInnerCall; - ///Custom Error type `InvalidInitialization` with signature `InvalidInitialization()` and selector `0xf92ee8a9` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[etherror(name = "InvalidInitialization", abi = "InvalidInitialization()")] - pub struct InvalidInitialization; - ///Custom Error type `NotInitializing` with signature `NotInitializing()` and selector `0xd7e6bcf8` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[etherror(name = "NotInitializing", abi = "NotInitializing()")] - pub struct NotInitializing; - ///Custom Error type `ReentrancyGuardReentrantCall` with signature `ReentrancyGuardReentrantCall()` and selector `0x3ee5aeb5` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[etherror( - name = "ReentrancyGuardReentrantCall", - abi = "ReentrancyGuardReentrantCall()" - )] - pub struct ReentrancyGuardReentrantCall; - ///Custom Error type `UUPSUnauthorizedCallContext` with signature `UUPSUnauthorizedCallContext()` and selector `0xe07c8dba` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[etherror( - name = "UUPSUnauthorizedCallContext", - abi = "UUPSUnauthorizedCallContext()" - )] - pub struct UUPSUnauthorizedCallContext; - ///Custom Error type `UUPSUnsupportedProxiableUUID` with signature `UUPSUnsupportedProxiableUUID(bytes32)` and selector `0xaa1d49a4` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[etherror( - name = "UUPSUnsupportedProxiableUUID", - abi = "UUPSUnsupportedProxiableUUID(bytes32)" - )] - pub struct UUPSUnsupportedProxiableUUID { - pub slot: [u8; 32], - } - ///Container type for all of the contract's custom errors - #[derive( - Clone, - ::ethers::contract::EthAbiType, - serde::Serialize, - serde::Deserialize, - Debug, - PartialEq, - Eq, - Hash, - )] - pub enum UC_with_rgErrors { - AddressEmptyCode(AddressEmptyCode), - ERC1967InvalidImplementation(ERC1967InvalidImplementation), - ERC1967NonPayable(ERC1967NonPayable), - FailedInnerCall(FailedInnerCall), - InvalidInitialization(InvalidInitialization), - NotInitializing(NotInitializing), - ReentrancyGuardReentrantCall(ReentrancyGuardReentrantCall), - UUPSUnauthorizedCallContext(UUPSUnauthorizedCallContext), - UUPSUnsupportedProxiableUUID(UUPSUnsupportedProxiableUUID), - /// The standard solidity revert string, with selector - /// Error(string) -- 0x08c379a0 - RevertString(::std::string::String), - } - impl ::ethers::core::abi::AbiDecode for UC_with_rgErrors { - fn decode( - data: impl AsRef<[u8]>, - ) -> ::core::result::Result { - let data = data.as_ref(); - if let Ok(decoded) = - <::std::string::String as ::ethers::core::abi::AbiDecode>::decode(data) - { - return Ok(Self::RevertString(decoded)); - } - if let Ok(decoded) = ::decode(data) - { - return Ok(Self::AddressEmptyCode(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::ERC1967InvalidImplementation(decoded)); - } - if let Ok(decoded) = ::decode(data) - { - return Ok(Self::ERC1967NonPayable(decoded)); - } - if let Ok(decoded) = ::decode(data) { - return Ok(Self::FailedInnerCall(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::InvalidInitialization(decoded)); - } - if let Ok(decoded) = ::decode(data) { - return Ok(Self::NotInitializing(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::ReentrancyGuardReentrantCall(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::UUPSUnauthorizedCallContext(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::UUPSUnsupportedProxiableUUID(decoded)); - } - Err(::ethers::core::abi::Error::InvalidData.into()) - } - } - impl ::ethers::core::abi::AbiEncode for UC_with_rgErrors { - fn encode(self) -> ::std::vec::Vec { - match self { - Self::AddressEmptyCode(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::ERC1967InvalidImplementation(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::ERC1967NonPayable(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::FailedInnerCall(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::InvalidInitialization(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::NotInitializing(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::ReentrancyGuardReentrantCall(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::UUPSUnauthorizedCallContext(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::UUPSUnsupportedProxiableUUID(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::RevertString(s) => ::ethers::core::abi::AbiEncode::encode(s), - } - } - } - impl ::ethers::contract::ContractRevert for UC_with_rgErrors { - fn valid_selector(selector: [u8; 4]) -> bool { - match selector { - [0x08, 0xc3, 0x79, 0xa0] => true, - _ if selector == ::selector() => { - true - } - _ if selector - == ::selector( - ) => - { - true - } - _ if selector - == ::selector() => - { - true - } - _ if selector == ::selector() => { - true - } - _ if selector - == ::selector() => - { - true - } - _ if selector == ::selector() => { - true - } - _ if selector - == ::selector( - ) => - { - true - } - _ if selector - == ::selector( - ) => - { - true - } - _ if selector - == ::selector( - ) => - { - true - } - _ => false, - } - } - } - impl ::core::fmt::Display for UC_with_rgErrors { - fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { - match self { - Self::AddressEmptyCode(element) => ::core::fmt::Display::fmt(element, f), - Self::ERC1967InvalidImplementation(element) => { - ::core::fmt::Display::fmt(element, f) - } - Self::ERC1967NonPayable(element) => ::core::fmt::Display::fmt(element, f), - Self::FailedInnerCall(element) => ::core::fmt::Display::fmt(element, f), - Self::InvalidInitialization(element) => ::core::fmt::Display::fmt(element, f), - Self::NotInitializing(element) => ::core::fmt::Display::fmt(element, f), - Self::ReentrancyGuardReentrantCall(element) => { - ::core::fmt::Display::fmt(element, f) - } - Self::UUPSUnauthorizedCallContext(element) => ::core::fmt::Display::fmt(element, f), - Self::UUPSUnsupportedProxiableUUID(element) => { - ::core::fmt::Display::fmt(element, f) - } - Self::RevertString(s) => ::core::fmt::Display::fmt(s, f), - } - } - } - impl ::core::convert::From<::std::string::String> for UC_with_rgErrors { - fn from(value: String) -> Self { - Self::RevertString(value) - } - } - impl ::core::convert::From for UC_with_rgErrors { - fn from(value: AddressEmptyCode) -> Self { - Self::AddressEmptyCode(value) - } - } - impl ::core::convert::From for UC_with_rgErrors { - fn from(value: ERC1967InvalidImplementation) -> Self { - Self::ERC1967InvalidImplementation(value) - } - } - impl ::core::convert::From for UC_with_rgErrors { - fn from(value: ERC1967NonPayable) -> Self { - Self::ERC1967NonPayable(value) - } - } - impl ::core::convert::From for UC_with_rgErrors { - fn from(value: FailedInnerCall) -> Self { - Self::FailedInnerCall(value) - } - } - impl ::core::convert::From for UC_with_rgErrors { - fn from(value: InvalidInitialization) -> Self { - Self::InvalidInitialization(value) - } - } - impl ::core::convert::From for UC_with_rgErrors { - fn from(value: NotInitializing) -> Self { - Self::NotInitializing(value) - } - } - impl ::core::convert::From for UC_with_rgErrors { - fn from(value: ReentrancyGuardReentrantCall) -> Self { - Self::ReentrancyGuardReentrantCall(value) - } - } - impl ::core::convert::From for UC_with_rgErrors { - fn from(value: UUPSUnauthorizedCallContext) -> Self { - Self::UUPSUnauthorizedCallContext(value) - } - } - impl ::core::convert::From for UC_with_rgErrors { - fn from(value: UUPSUnsupportedProxiableUUID) -> Self { - Self::UUPSUnsupportedProxiableUUID(value) - } - } - #[derive( - Clone, - ::ethers::contract::EthEvent, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethevent(name = "Initialized", abi = "Initialized(uint64)")] - pub struct InitializedFilter { - pub version: u64, - } - #[derive( - Clone, - ::ethers::contract::EthEvent, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethevent(name = "Upgraded", abi = "Upgraded(address)")] - pub struct UpgradedFilter { - #[ethevent(indexed)] - pub implementation: ::ethers::core::types::Address, - } - ///Container type for all of the contract's events - #[derive( - Clone, - ::ethers::contract::EthAbiType, - serde::Serialize, - serde::Deserialize, - Debug, - PartialEq, - Eq, - Hash, - )] - pub enum UC_with_rgEvents { - InitializedFilter(InitializedFilter), - UpgradedFilter(UpgradedFilter), - } - impl ::ethers::contract::EthLogDecode for UC_with_rgEvents { - fn decode_log( - log: &::ethers::core::abi::RawLog, - ) -> ::core::result::Result { - if let Ok(decoded) = InitializedFilter::decode_log(log) { - return Ok(UC_with_rgEvents::InitializedFilter(decoded)); - } - if let Ok(decoded) = UpgradedFilter::decode_log(log) { - return Ok(UC_with_rgEvents::UpgradedFilter(decoded)); - } - Err(::ethers::core::abi::Error::InvalidData) - } - } - impl ::core::fmt::Display for UC_with_rgEvents { - fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { - match self { - Self::InitializedFilter(element) => ::core::fmt::Display::fmt(element, f), - Self::UpgradedFilter(element) => ::core::fmt::Display::fmt(element, f), - } - } - } - impl ::core::convert::From for UC_with_rgEvents { - fn from(value: InitializedFilter) -> Self { - Self::InitializedFilter(value) - } - } - impl ::core::convert::From for UC_with_rgEvents { - fn from(value: UpgradedFilter) -> Self { - Self::UpgradedFilter(value) - } - } - ///Container type for all input parameters for the `UPGRADE_INTERFACE_VERSION` function with signature `UPGRADE_INTERFACE_VERSION()` and selector `0xad3cb1cc` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall( - name = "UPGRADE_INTERFACE_VERSION", - abi = "UPGRADE_INTERFACE_VERSION()" - )] - pub struct UpgradeInterfaceVersionCall; - ///Container type for all input parameters for the `initialize` function with signature `initialize()` and selector `0x8129fc1c` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "initialize", abi = "initialize()")] - pub struct InitializeCall; - ///Container type for all input parameters for the `my_operation1` function with signature `my_operation1()` and selector `0xeefb4461` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "my_operation1", abi = "my_operation1()")] - pub struct MyOperation1Call; - ///Container type for all input parameters for the `my_operation2` function with signature `my_operation2()` and selector `0xbc2e66e6` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "my_operation2", abi = "my_operation2()")] - pub struct MyOperation2Call; - ///Container type for all input parameters for the `proxiableUUID` function with signature `proxiableUUID()` and selector `0x52d1902d` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "proxiableUUID", abi = "proxiableUUID()")] - pub struct ProxiableUUIDCall; - ///Container type for all input parameters for the `slot1` function with signature `slot1()` and selector `0x1f457cb5` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "slot1", abi = "slot1()")] - pub struct Slot1Call; - ///Container type for all input parameters for the `supportsInterface` function with signature `supportsInterface(bytes4)` and selector `0x01ffc9a7` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "supportsInterface", abi = "supportsInterface(bytes4)")] - pub struct SupportsInterfaceCall { - pub interface_id: [u8; 4], - } - ///Container type for all input parameters for the `upgradeToAndCall` function with signature `upgradeToAndCall(address,bytes)` and selector `0x4f1ef286` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "upgradeToAndCall", abi = "upgradeToAndCall(address,bytes)")] - pub struct UpgradeToAndCallCall { - pub new_implementation: ::ethers::core::types::Address, - pub data: ::ethers::core::types::Bytes, - } - ///Container type for all of the contract's call - #[derive( - Clone, - ::ethers::contract::EthAbiType, - serde::Serialize, - serde::Deserialize, - Debug, - PartialEq, - Eq, - Hash, - )] - pub enum UC_with_rgCalls { - UpgradeInterfaceVersion(UpgradeInterfaceVersionCall), - Initialize(InitializeCall), - MyOperation1(MyOperation1Call), - MyOperation2(MyOperation2Call), - ProxiableUUID(ProxiableUUIDCall), - Slot1(Slot1Call), - SupportsInterface(SupportsInterfaceCall), - UpgradeToAndCall(UpgradeToAndCallCall), - } - impl ::ethers::core::abi::AbiDecode for UC_with_rgCalls { - fn decode( - data: impl AsRef<[u8]>, - ) -> ::core::result::Result { - let data = data.as_ref(); - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::UpgradeInterfaceVersion(decoded)); - } - if let Ok(decoded) = ::decode(data) { - return Ok(Self::Initialize(decoded)); - } - if let Ok(decoded) = ::decode(data) - { - return Ok(Self::MyOperation1(decoded)); - } - if let Ok(decoded) = ::decode(data) - { - return Ok(Self::MyOperation2(decoded)); - } - if let Ok(decoded) = ::decode(data) - { - return Ok(Self::ProxiableUUID(decoded)); - } - if let Ok(decoded) = ::decode(data) { - return Ok(Self::Slot1(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::SupportsInterface(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::UpgradeToAndCall(decoded)); - } - Err(::ethers::core::abi::Error::InvalidData.into()) - } - } - impl ::ethers::core::abi::AbiEncode for UC_with_rgCalls { - fn encode(self) -> Vec { - match self { - Self::UpgradeInterfaceVersion(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::Initialize(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::MyOperation1(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::MyOperation2(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::ProxiableUUID(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::Slot1(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::SupportsInterface(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::UpgradeToAndCall(element) => ::ethers::core::abi::AbiEncode::encode(element), - } - } - } - impl ::core::fmt::Display for UC_with_rgCalls { - fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { - match self { - Self::UpgradeInterfaceVersion(element) => ::core::fmt::Display::fmt(element, f), - Self::Initialize(element) => ::core::fmt::Display::fmt(element, f), - Self::MyOperation1(element) => ::core::fmt::Display::fmt(element, f), - Self::MyOperation2(element) => ::core::fmt::Display::fmt(element, f), - Self::ProxiableUUID(element) => ::core::fmt::Display::fmt(element, f), - Self::Slot1(element) => ::core::fmt::Display::fmt(element, f), - Self::SupportsInterface(element) => ::core::fmt::Display::fmt(element, f), - Self::UpgradeToAndCall(element) => ::core::fmt::Display::fmt(element, f), - } - } - } - impl ::core::convert::From for UC_with_rgCalls { - fn from(value: UpgradeInterfaceVersionCall) -> Self { - Self::UpgradeInterfaceVersion(value) - } - } - impl ::core::convert::From for UC_with_rgCalls { - fn from(value: InitializeCall) -> Self { - Self::Initialize(value) - } - } - impl ::core::convert::From for UC_with_rgCalls { - fn from(value: MyOperation1Call) -> Self { - Self::MyOperation1(value) - } - } - impl ::core::convert::From for UC_with_rgCalls { - fn from(value: MyOperation2Call) -> Self { - Self::MyOperation2(value) - } - } - impl ::core::convert::From for UC_with_rgCalls { - fn from(value: ProxiableUUIDCall) -> Self { - Self::ProxiableUUID(value) - } - } - impl ::core::convert::From for UC_with_rgCalls { - fn from(value: Slot1Call) -> Self { - Self::Slot1(value) - } - } - impl ::core::convert::From for UC_with_rgCalls { - fn from(value: SupportsInterfaceCall) -> Self { - Self::SupportsInterface(value) - } - } - impl ::core::convert::From for UC_with_rgCalls { - fn from(value: UpgradeToAndCallCall) -> Self { - Self::UpgradeToAndCall(value) - } - } - ///Container type for all return fields from the `UPGRADE_INTERFACE_VERSION` function with signature `UPGRADE_INTERFACE_VERSION()` and selector `0xad3cb1cc` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct UpgradeInterfaceVersionReturn(pub ::std::string::String); - ///Container type for all return fields from the `my_operation1` function with signature `my_operation1()` and selector `0xeefb4461` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct MyOperation1Return(pub ::ethers::core::types::U256); - ///Container type for all return fields from the `proxiableUUID` function with signature `proxiableUUID()` and selector `0x52d1902d` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct ProxiableUUIDReturn(pub [u8; 32]); - ///Container type for all return fields from the `slot1` function with signature `slot1()` and selector `0x1f457cb5` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct Slot1Return(pub ::ethers::core::types::U256); - ///Container type for all return fields from the `supportsInterface` function with signature `supportsInterface(bytes4)` and selector `0x01ffc9a7` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct SupportsInterfaceReturn(pub bool); -} diff --git a/bindings/src/ultra_verification_key.rs b/bindings/src/ultra_verification_key.rs deleted file mode 100644 index 2bffd5f..0000000 --- a/bindings/src/ultra_verification_key.rs +++ /dev/null @@ -1,121 +0,0 @@ -pub use ultra_verification_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 ultra_verification_key { - #[allow(deprecated)] - fn __abi() -> ::ethers::core::abi::Abi { - ::ethers::core::abi::ethabi::Contract { - constructor: ::core::option::Option::None, - functions: ::std::collections::BTreeMap::new(), - events: ::std::collections::BTreeMap::new(), - errors: ::std::collections::BTreeMap::new(), - receive: false, - fallback: false, - } - } - ///The parsed JSON ABI of the contract. - pub static ULTRAVERIFICATIONKEY_ABI: ::ethers::contract::Lazy<::ethers::core::abi::Abi> = - ::ethers::contract::Lazy::new(__abi); - #[rustfmt::skip] - const __BYTECODE: &[u8] = b"`V`7`\x0B\x82\x82\x829\x80Q`\0\x1A`s\x14`*WcNH{q`\xE0\x1B`\0R`\0`\x04R`$`\0\xFD[0`\0R`s\x81S\x82\x81\xF3\xFEs\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x000\x14`\x80`@R`\0\x80\xFD\xFE\xA2dipfsX\"\x12 2\x02\x03\x1A\n\xD1|>\x03\xC5\xFC\xAAA\xE7D]\xB27\x8C\xD9\x13arg\xE90(\x15<\x94\x0C\x9AdsolcC\0\x08\x04\x003"; - /// The bytecode of the contract. - pub static ULTRAVERIFICATIONKEY_BYTECODE: ::ethers::core::types::Bytes = - ::ethers::core::types::Bytes::from_static(__BYTECODE); - #[rustfmt::skip] - const __DEPLOYED_BYTECODE: &[u8] = b"s\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x000\x14`\x80`@R`\0\x80\xFD\xFE\xA2dipfsX\"\x12 2\x02\x03\x1A\n\xD1|>\x03\xC5\xFC\xAAA\xE7D]\xB27\x8C\xD9\x13arg\xE90(\x15<\x94\x0C\x9AdsolcC\0\x08\x04\x003"; - /// The deployed bytecode of the contract. - pub static ULTRAVERIFICATIONKEY_DEPLOYED_BYTECODE: ::ethers::core::types::Bytes = - ::ethers::core::types::Bytes::from_static(__DEPLOYED_BYTECODE); - pub struct UltraVerificationKey(::ethers::contract::Contract); - impl ::core::clone::Clone for UltraVerificationKey { - fn clone(&self) -> Self { - Self(::core::clone::Clone::clone(&self.0)) - } - } - impl ::core::ops::Deref for UltraVerificationKey { - type Target = ::ethers::contract::Contract; - fn deref(&self) -> &Self::Target { - &self.0 - } - } - impl ::core::ops::DerefMut for UltraVerificationKey { - fn deref_mut(&mut self) -> &mut Self::Target { - &mut self.0 - } - } - impl ::core::fmt::Debug for UltraVerificationKey { - fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { - f.debug_tuple(::core::stringify!(UltraVerificationKey)) - .field(&self.address()) - .finish() - } - } - impl UltraVerificationKey { - /// 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(), - ULTRAVERIFICATIONKEY_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( - ULTRAVERIFICATIONKEY_ABI.clone(), - ULTRAVERIFICATIONKEY_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 UltraVerificationKey - { - fn from(contract: ::ethers::contract::Contract) -> Self { - Self::new(contract.address(), contract.client()) - } - } -} diff --git a/bindings/src/ultra_verifier.rs b/bindings/src/ultra_verifier.rs deleted file mode 100644 index ba61971..0000000 --- a/bindings/src/ultra_verifier.rs +++ /dev/null @@ -1,633 +0,0 @@ -pub use ultra_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 ultra_verifier { - #[allow(deprecated)] - fn __abi() -> ::ethers::core::abi::Abi { - ::ethers::core::abi::ethabi::Contract { - constructor: ::core::option::Option::None, - functions: ::core::convert::From::from([ - ( - ::std::borrow::ToOwned::to_owned("getVerificationKeyHash"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("getVerificationKeyHash",), - inputs: ::std::vec![], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::FixedBytes(32usize,), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes32"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::Pure, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("verify"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("verify"), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("_proof"), - kind: ::ethers::core::abi::ethabi::ParamType::Bytes, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("_publicInputs"), - kind: ::ethers::core::abi::ethabi::ParamType::Array( - ::std::boxed::Box::new( - ::ethers::core::abi::ethabi::ParamType::FixedBytes(32usize), - ), - ), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes32[]"), - ), - }, - ], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Bool, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bool"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - },], - ), - ]), - events: ::std::collections::BTreeMap::new(), - errors: ::core::convert::From::from([ - ( - ::std::borrow::ToOwned::to_owned("EC_SCALAR_MUL_FAILURE"), - ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("EC_SCALAR_MUL_FAILURE",), - inputs: ::std::vec![], - },], - ), - ( - ::std::borrow::ToOwned::to_owned("MOD_EXP_FAILURE"), - ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("MOD_EXP_FAILURE"), - inputs: ::std::vec![], - },], - ), - ( - ::std::borrow::ToOwned::to_owned("PROOF_FAILURE"), - ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("PROOF_FAILURE"), - inputs: ::std::vec![], - },], - ), - ( - ::std::borrow::ToOwned::to_owned("PUBLIC_INPUT_COUNT_INVALID"), - ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("PUBLIC_INPUT_COUNT_INVALID",), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("expected"), - kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("actual"), - kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256"), - ), - }, - ], - },], - ), - ( - ::std::borrow::ToOwned::to_owned("PUBLIC_INPUT_GE_P"), - ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("PUBLIC_INPUT_GE_P"), - inputs: ::std::vec![], - },], - ), - ( - ::std::borrow::ToOwned::to_owned("PUBLIC_INPUT_INVALID_BN128_G1_POINT"), - ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned( - "PUBLIC_INPUT_INVALID_BN128_G1_POINT", - ), - inputs: ::std::vec![], - },], - ), - ]), - receive: false, - fallback: false, - } - } - ///The parsed JSON ABI of the contract. - pub static ULTRAVERIFIER_ABI: ::ethers::contract::Lazy<::ethers::core::abi::Abi> = - ::ethers::contract::Lazy::new(__abi); - #[rustfmt::skip] - const __BYTECODE: &[u8] = b"`\x80`@R4\x80\x15a\0\x10W`\0\x80\xFD[Pa,\xFA\x80a\0 `\09`\0\xF3\xFE`\x80`@R4\x80\x15a\0\x10W`\0\x80\xFD[P`\x046\x10a\x006W`\x005`\xE0\x1C\x80c\x93\x7Fj\x10\x14a\0;W\x80c\xEAP\xD0\xE4\x14a\0nW[`\0\x80\xFD[`@Q\x7F^5[\xF9\x1F\xE3\xE2\xBC\xC2\xF4!\xEF+\x95\xD0\x01\x16d\xCA\x0E\x84vM\xB7\xE9\xC4\x88N\\q\xB1%\x81R` \x01[`@Q\x80\x91\x03\x90\xF3[a\0\x81a\0|6`\x04a,\x08V[a\0\x91V[`@Q\x90\x15\x15\x81R` \x01a\0eV[b\x02\0\0a\x03\x80R`\x01a\x03\xA0R\x7F\x1B\xF8-\xEB\xA7\xD7I\x02\xC3p\x8C\xC6\xE7\x0Ea\xF3\x05\x12\xEC\xA9VU!\x0E'nXX\xCE\x8FX\xE5a\x03\xC0R\x7F0d6@\xB9\xF8/\x90\xE8;i\x8E^\xA6\x17\x9C|\x05T.\x85\x953\xB4\x8B\x99S\xA2\xF56\x08\x01a\x03\xE0R\x7F\x05\x95%e\x91\xD2+\xF1I\x8B\xDD\xF8\xBD\xC8\x96\xBCT\x92\xEA\xA1=\xF0\x15Re\x15\xCF\xF3\xA8p`aa\x04\0R\x7F\t\xEB\xFD\xACb\x1Dg\xFC\xC8\xE6\xCD2`\xED\x1B\xA3g\xCAL\xBA\xC8^\xD4\xED\x13\xE7\xB4\xA2\xD8\xF1\xFFQa\x04 R\x7F\x18\x15(U\xE6^\xD9\xBEMu\x9Ah\x02\xC9\xDF\x16\xD1{\xBC\x80\xF7\x1B\t:\x81\xCA\x01\xFB\xA1c\xF4\xFAa\x04@R\x7F$\x8E\xEE\x8C`K\x8E\x8Bin\xFD\x14\xE3\x16[kZBK\xAD\x87q9\xE2\x81)\x9B\\d\xD6;xa\x04`R\x7F*\xAA?\xFA`cO\n\x10;\x82p\xD6\xA8\xB0\xCDL\xDE/\x97\xDF\x89\x13\xD5\xEB\xFF\x10@\xC1\xED\xB9la\x04\x80R\x7F\r\xDD\x8D\xF2\xD8\xC6\x19\xC2\x13\x9E\xB2[u\xC3z\xC3`|\xDAN\xD7\xC8\x06\xA8\xD9M\xEDY\xA3\x9C\x84\xE2-\"$\xE3a\x05`R~\x9FS\xFC\xC9\xB3\xCE?\xBD\xA1'Vg\xF6\xFB\xE6\xD6\xC5\xF4\xB8R\x90\xB9\xC6\x8C+\xF1\xA9\xF1\xFE\xE6\x02a\x05\x80R\x7F\x13\xC9\xAD=\x10R\xF8\xE8\xA1;FDF\xFE\xC7j\xAD]\xF0:\\\x83v\x83\xD8\x94\x7F\"D\xB8\x17\xB2a\x05\xA0R\x7F'\x8B)y\xE3V\xFE]\xFD\x10r\xF5\x96+xt\x9C\x03\xA0\x0EQ\x1BM\xDDz\xE9\x8A\x1E\xA1\x14\xD3\x85a\x05\xC0R\x7F\x19\xD2\xFC\xA9H\xE1\xC4\xAC\xB6\x17\xF2>zn\x03\xE6H/\xB7\xC7\x91yH\x1C\x84\xCA\xF6\x82\r\x11!Ja\x05\xE0R\x7F(\xB9U\xAA\xC4\xC0C\xCB\xCF\xDE\x06\xEE\xE5\x9BD6?\x96\xFE\no\xA9;\x0B6\xEF\x07\xFB\xE2\x85\xD4\xC7a\x06\0R\x7F\x16\xE1\xBB\xB0\xA7r\x8D\xCBv\x96\xFD\xF36\x1B9Q\x0CjO\x83\xCC!Y\xF5\xFCe\xCE\xB2\xBE\x05\x99\xF9a\x06 R\x7F\x14\x14\xAFv$q9\xFA\x9E\x8F\xEF\x8B9:>\x03\"~\xE3\xA6\xFE\xDB\x1EU\xF5\xDB\x82\xCB#Rx*a\x06@R\x7F,x\x95\xA6\x8D/\xAB[+\xCEMw\x03\xDA\xEB\xF9\x01\x1Ec\xD6u\xBCh\x98\xC7\xF0`\x87\xD6\xD8=\x99a\x06`R\x7F\x16:\x01J\x9D}_X\xE27\x05\x1C\xED~\xA6\0\x0Bw\xEF\x87\x9A\x19\xDD^P\x08p\x82dt\x1A\xBCa\x06\x80R\x7F,\xED\xA3\x04\x1DOK\x0F\xC2'\xD8\x03\t>;{g\x134.v w\x1B+\x04i\x98\xDB\xF7#\x8Ea\x06\xA0R\x7F\x11\xD1\xE9J\x17\xE4\x9D\xDF\xAB\x99\xCD\t\x0BD #\xF6(\x80\xD7\x0E\x12\x98\xB3\x056%\xAA3X\xE1\x91a\x06\xC0R\x7F\x0C$\xF43e0d\x9F6\xCF\x04\xB1\x9F}\xAD\rm\x80\xB0\xEE\x9Cw(W\xA4\x89\xD4\xFD\xF80]Fa\x06\xE0R\x7F\t\xA78\x1B<\x06\x8B4\xF0\x80\xDC\xB4Nu\xBA\xFD\x84\x18\xDF7(\xE9\xCF\xF5v\xEB\xBA!:\xEA\xEEGa\x07\0R\x7F\x019+\xEE]K\x96v\xD0x\xC1!\xC4\xF3\x03\x19\x80*B<>\x91\xE1\xA6\xD4\xB7(\xF3V&Jua\x07 R\x7F&\xCEd\xA9[1\xC0M\xB0\xD3\x89R\xF7\xD5\x16%\x1Fg\xFC\x97\xCD\xD2\x88\xB5\xCA2\xC0\x9F\xE0\xF5\xFAba\x07@R\x7F\x17\xE3~\xADX\xBCZ\xCF-]\xB4i\xC4\x1B\xED\x12\xC1\x03\x124\xBBzh\x17\xD45\xF84\x04\xEAq\xF8a\x07`R~\\\x8CV\xB3\xC8\xE9\xDF\x1C\xF0\xCB\x1D;V>\x8Dt\xBFl!\x89\xB9\xE8^y\x1E*I\xA3\xBD\xC2\x08a\x07\x80R\x7F\x0Cg\x7F\xAC6g=5\xC8\xD8\x0E\x99(\xF4\x08e\xD8\"\x9A\xF7\xEB\x87\x88L[A\xD1y\xDA\x8F\xB8\0a\x07\xA0R\x7F\x12#\xFCR\x8EIp\xAB\x8F\x92\xF9:=\x0E/]\xF1b\xFA\xAE\x13Inq\xEA\xE1@I\xE6\x82\x8Ava\x07\xC0R\x7F\x03B\xD8\xF2\xE5\xE1q\xE7%\xB0z\xA2\xB9\x03\x9A9[\x90\xF2\xE8j\xCC\x9B:5'pT\x92\x7Fv\x8Ea\x07\xE0R~\xF1iF3\xAFTT\x17\xA1\x17%\x19\xCA\x9D\x98\xEA\xDA\xD9(7e\x890\xD2\">(\xCB\xA7\x9B\x10a\x08\0R\x7F\x05\xEES\xA4\x007\x1A\xE8K\x7F\xC1!\xA5\xB3-\xFEV\n82[\x8Cw$\0\xF5,%[u\xD8\xABa\x08 R\x7F\x14\xEA\x1A\xEF`H\xC9\xB4\xE9\x01\xF7\xD8o\x12\x9F\xC6[\x85\xFCQ\xFC\xC1\xE2\xC2\t4{\x1A\x14af\xFBa\x08@R\x7F\x0Bj\x94\xFE\xDC\xF0\xA3\xE0\xB9\x885\xBF\xA8\xA3\xE3\x06\xE9\xB3\xB2PXh\x03\xE0\xF3\x05\xB2\xB6\x95\xD4G\xBAa\x08`R\x7F\x16.\xBD/\x85d\xF4\xAA\x0BW\0\xB1\x13\x1D\x90\xF7x\x11Cp\xA3^\xF4)S+\xCB\\n\rl;a\x08\x80R\x7F\nGN\xF9\xA3\x8Es\xC8\x9D\xC1\xDFt\x8CG\xFB\xD4\xE8|\x18Y\x98\x10\x05\x05\xB6\xF6\xC7\xFF\x92o\x88Sa\x08\xA0R\x7F-\x19\xDE6Z\xDC\xCD\xAD\x89\x84\xAAWW(\xF7|\x92\x8A\x93\x97\xF2\xA4\xD5_u)\xFEX=So-a\x08\xC0R\x7F\x0C\xCC\xB0\x1D\xAF\"w\x02\x97\x14\x9C\xEB\xEC\xB8F\x166\xAC\xDDjT;\x93y#\xAA\xFD\x9Dy\xBCA\xEBa\x08\xE0R\x7F$6@\x03\xA0c\xCCb\x02\xC4\x86\x8F\xCF#\xFF\xA6\xCB\xAF\xC7\xBD\xB4\x82\xFC\xE5\xF1\x8B,\x0B\xCF=WVa\t\0R\x7F\x14\x0F11\xA3\xBC9\x17\x86\xE8^e\xFC\x95\xCB\x84\x8B9Q2a\t`R\x7F\x1Cy\x05\\#\x19\xD2|V\x06\x17,.\x06\xF27c\xEA\xB5+\xCF\xEAiw\xB3Hg\x80\x0F\t@Ra\t\x80R\x7F#\xFD\x1Db|\xAF\x9Cf\x87f>\xD6\xB1-\rR6\xE1\xF0\x1C\x0C\xFB^D\x84_\xA7r\xFFxF'a\t\xA0R`\0a\t\xC0\x81\x90Ra\t\xE0\x81\x90R\x7F&\x0E\x01\xB2Q\xF6\xF1\xC7\xE7\xFFNX\x07\x91\xDE\xE8\xEAQ\xD8z5\x8E\x03\x8BN\xFE0\xFA\xC0\x93\x83\xC1a\n\0R\x7F\x01\x18\xC4\xD5\xB87\xBC\xC2\xBC\x89\xB5\xB3\x98\xB5\x97N\x9FYD\x07;2\x07\x8B~#\x1F\xEC\x93\x88\x83\xB0a\n R\x7F\x04\xFCci\xF7\x11\x0F\xE3\xD2QV\xC1\xBB\x9Ar\x85\x9C\xF2\xA0FA\xF9\x9B\xA4\xEEA<\x80\xDAj_\xE4a\n@R\x7F\"\xFE\xBD\xA3\xC0\xC0c*VG[B\x14\xE5a^\x11\xE6\xDD?\x96\xE6\xCE\xA2\x85J\x87\xD4\xDA\xCC^Ua\n`R\x7F$L\xF0\x10\xC4<\xA8r7\xD8\xB0\x0B\xF9\xDDP\xC4\xC0\x1C\x7F\x08k\xD4\xE8\xC9 \xE7RQ\xD9o\r\"a4\0Ra\x03\xA0Q\x82\x81\x14a\x08\x84W`@Qcvg\xDC\x9B`\xE0\x1B\x81R`\x04\x81\x01\x82\x90R`$\x81\x01\x84\x90R`D\x01`@Q\x80\x91\x03\x90\xFD[\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDG\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01`$`\x045\x01\x82\x815\x06a\x12 R\x82` \x82\x015\x06a\x12\0R\x82`@\x82\x015\x06a\x12`R\x82``\x82\x015\x06a\x12@R\x82`\x80\x82\x015\x06a\x12\xA0R\x82`\xA0\x82\x015\x06a\x12\x80R\x82`\xC0\x82\x015\x06a\x12\xE0R\x82`\xE0\x82\x015\x06a\x12\xC0R\x82a\x01\0\x82\x015\x06a\x13 R\x82a\x01 \x82\x015\x06a\x13\0R\x82a\x01@\x82\x015\x06a\x13`R\x82a\x01`\x82\x015\x06a\x13@R\x82a\x01\x80\x82\x015\x06a\x13\xA0R\x82a\x01\xA0\x82\x015\x06a\x13\x80R\x82a\x01\xC0\x82\x015\x06a\x13\xE0R\x82a\x01\xE0\x82\x015\x06a\x13\xC0R\x82a\x02\0\x82\x015\x06a\x14 R\x82a\x02 \x82\x015\x06a\x14\0R\x82a\x02@\x82\x015\x06a\x14`R\x82a\x02`\x82\x015\x06a\x14@R\x82a\x02\x80\x82\x015\x06a\x14\xA0R\x82a\x02\xA0\x82\x015\x06a\x14\x80R\x81a\x02\xC0\x82\x015\x06a\x16\0R\x81a\x02\xE0\x82\x015\x06a\x16 R\x81a\x03\0\x82\x015\x06a\x16@R\x81a\x03 \x82\x015\x06a\x16`R\x81a\x03@\x82\x015\x06a\x16\x80R\x81a\x03`\x82\x015\x06a\x16\xA0R\x81a\x03\x80\x82\x015\x06a\x16\xC0R\x81a\x03\xA0\x82\x015\x06a\x16\xE0R\x81a\x03\xC0\x82\x015\x06a\x17\0R\x81a\x03\xE0\x82\x015\x06a\x17 R\x81a\x04\0\x82\x015\x06a\x17@R\x81a\x04 \x82\x015\x06a\x17`R\x81a\x04@\x82\x015\x06a\x17\x80R\x81a\x04`\x82\x015\x06a\x17\xA0R\x81a\x04\x80\x82\x015\x06a\x17\xC0R\x81a\x04\xA0\x82\x015\x06a\x17\xE0R\x81a\x04\xC0\x82\x015\x06a\x18\0R\x81a\x04\xE0\x82\x015\x06a\x19`R\x81a\x05\0\x82\x015\x06a\x19\x80R\x81a\x05 \x82\x015\x06a\x19\xA0R\x81a\x05@\x82\x015\x06a\x19\xC0R\x81a\x05`\x82\x015\x06a\x18@R\x81a\x05\x80\x82\x015\x06a\x18`R\x81a\x05\xA0\x82\x015\x06a\x18\x80R\x81a\x05\xC0\x82\x015\x06a\x18\xA0R\x81a\x05\xE0\x82\x015\x06a\x18\xC0R\x81a\x06\0\x82\x015\x06a\x18\xE0R\x81a\x06 \x82\x015\x06a\x19\0R\x81a\x06@\x82\x015\x06a\x19 R\x81a\x06`\x82\x015\x06a\x19@R\x81a\x06\x80\x82\x015\x06a\x19\xE0R\x81a\x06\xA0\x82\x015\x06a \0R\x81a\x06\xC0\x82\x015\x06a R\x81a\x06\xE0\x82\x015\x06a @R\x81a\x07\0\x82\x015\x06a `R\x81a\x07 \x82\x015\x06a \x80R\x81a\x07@\x82\x015\x06a \xA0R\x81a\x07`\x82\x015\x06a \xC0R\x81a\x07\x80\x82\x015\x06a \xE0R\x81a\x07\xA0\x82\x015\x06a!\0R\x81a\x07\xC0\x82\x015\x06a! R\x82a\x07\xE0\x82\x015\x06a# R\x82a\x08\0\x82\x015\x06a#\0R\x82a\x08 \x82\x015\x06a#`R\x82a\x08@\x82\x015\x06a#@RPa\t\xC0Q\x15a\x0C\xE6W`$\x805\x01\x80a\t\xE0Q`\x05\x1B\x01\x90P\x805` \x82\x015`D\x1B\x81\x01\x90P`@\x82\x015`\x88\x1B\x81\x01\x90P``\x82\x015`\xCC\x1B\x81\x01\x90P`\x80\x82\x015`\xA0\x83\x015`D\x1B\x81\x01\x90P`\xC0\x83\x015`\x88\x1B\x81\x01\x90P`\xE0\x83\x015`\xCC\x1B\x81\x01\x90Pa\x01\0\x83\x015a\x01 \x84\x015`D\x1B\x81\x01\x90Pa\x01@\x84\x015`\x88\x1B\x81\x01\x90Pa\x01`\x84\x015`\xCC\x1B\x81\x01\x90Pa\x01\x80\x84\x015a\x01\xA0\x85\x015`D\x1B\x81\x01\x90Pa\x01\xC0\x85\x015`\x88\x1B\x81\x01\x90Pa\x01\xE0\x85\x015`\xCC\x1B\x81\x01\x90P\x83a5\0R\x82a5 R\x81a5@R\x80a5`R\x86\x81\x10\x87\x84\x10\x16\x87\x83\x10\x88\x86\x10\x16\x16a\x0C\xE0Wcu\xD4\xFAS`\xE1\x1B`\0R`\x04`\0\xFD[PPPPP[a\x03\x80Q`\xE0\x1B`\0Ra\x03\xA0Q`\xE0\x1B`\x04R`\x08`\0 \x80a5\x80R`$\x805\x01` a\x03\xA0Q\x02\x80\x82` a5\x80\x017`\x045`$\x01\x91P`\xC0\x82a5\xA0\x83\x017`\xE0\x01a5\x80 \x83\x81\x06a&`\x81\x90R\x90\x92P\x90P\x82\x81\x80\ta&\x80R\x82\x81a&\x80Q\ta&\xA0RP\x80`\0Ra\x12\xE0Q` Ra\x12\xC0Q`@Ra\x13 Q``Ra\x13\0Q`\x80R`\xA0`\0 \x90P\x81\x81\x06a&\0R\x80`\0R`\x01` SP`!`\0\x90\x81 \x82\x81\x06a& R\x81Ra\x13`Q` Ra\x13@Q`@Ra\x13\xA0Q``Ra\x13\x80Q`\x80R`\xA0\x90 \x81\x81\x06a&@\x81\x90R\x82\x81\x80\ta4 R\x82\x81a4 Q\ta4@R\x82\x81a4@Q\ta4`R\x80a4\x80RP\x80`\0Ra\x13\xE0Q` Ra\x13\xC0Q`@Ra\x14 Q``Ra\x14\0Q`\x80Ra\x14`Q`\xA0Ra\x14@Q`\xC0Ra\x14\xA0Q`\xE0Ra\x14\x80Qa\x01\0Ra\x01 `\0 \x90P\x81\x81\x06a&\xC0R\x80a&\xE0RPa&\0Qa& Qa\x03\xC0Q`\x01\x80\x85`\x01`$\x805\x01` a\x03\xA0Q\x02\x81\x01\x83`\x05\x8A\t\x84`\x0C\x8B\t\x99P[\x81\x83\x10\x15a\x0E\xA6W\x825\x85\x81\x10\x85\x16\x94P\x85\x8A\x82\x08\x90P\x85\x81\x83\x01\x89\t\x97P\x85\x81\x8C\x01\x88\t\x96PP\x84\x88\x82\t\x90P\x84\x88\x8B\t\x99P` \x83\x01\x92Pa\x0EgV[PPP\x80a\x0E\xBFWc7J\x97/`\xE0\x1B`\0R`\x04`\0\xFD[PP\x81a0\0R\x80a0 RPPPPP\x80\x81`\x01a&\0Q\x08a& Q\t\x80a\x03\x80Q`\x01[\x81\x81\x10\x15a\x0E\xFBW\x84\x83\x84\t\x92P\x80\x01a\x0E\xE6V[PPa1\0R\x81\x81\x80\t\x90P\x81\x81\x82\ta1 RPa&\xC0Qa\x03\x80Q\x81\x90`\x01[\x81\x81\x10\x15a\x0F2W\x84\x83\x84\t\x92P\x80\x01a\x0F\x1DV[PP\x80a0@R\x82`\x01\x84\x03\x82\x08\x90Pa4\0Q\x80\x84\x03a\x03\xE0Q\x85\x82\x86\x08\x86\x84\x84\t\x92P\x86\x87\x84\x88\x08\x82\t\x90P\x86\x84\x84\t\x92P\x86\x87\x84\x88\x08\x82\t\x90P\x86\x87\x88\x86\x86\t\x88\x08\x82\t\x90Pa\x03\xC0Q\x92P\x86\x82\x86\t\x91P\x86`\x01\x88\x03\x87\x08\x87\x84\x85\t\x94P\x87`\x01\x89\x03\x89\x89\x8B\x88\x8D\x8B\x8C\t\t\t\x08\x96Pa0 Q\x94P\x84\x93P\x87\x82\x86\t\x94P\x84\x88\x87\x87\t\x95P\x85\x89\x83\x88\t\x96P\x86\x8Aa1 Q\x89\t\x97P\x87` `\0R` \x80R` `@R\x8B\x8B\x8A\t``R`\x02\x8C\x03`\x80R\x8B`\xA0R` `\0`\xC0`\0`\x05Z\xFAa\x10\x0FWc>%)\xEF`\xE2\x1B`\0R`\x04`\0\xFD[`\0Q\x98P\x8B\x81\x8A\t\x90P\x8B\x8B\x8A\t\x98P\x8B\x82\x8A\t\x91P\x8Ba1 Q\x8A\t\x98P\x8B\x83\x8A\t\x92P\x8B\x85\x8A\t\x98P\x8B\x84\x8A\t\x93P\x8B\x8A\x8A\t\x98P\x8B\x88\x8A\t\x97P\x8B\x86\x8A\t\x98P\x8Ba0 Q\x8D\x8B\x8C\t\t\x98P\x8B\x89a0\0Q\ta0`R\x8B\x88\x8B\ta0\x80R\x8B\x84\x87\ta7\x80R\x8B\x83\x88\ta0\xA0R\x8B\x82a1\0Q\ta1@R\x8B\x81\x88\ta0\xC0RPPPPPPPPPPPa&@QPa&\0Qa& Q\x82\x83a\x19\0Q\x84\t\x82a\x16 Q\x01\x01\x84a\x18\xE0Q\x85\t\x83a\x16\0Q\x01\x01\t\x83\x84a\x19@Q\x85\t\x83a\x16`Q\x01\x01\x85a\x19 Q\x86\t\x84a\x16@Q\x01\x01\t\x84\x85\x86\x83\x85\ta\x16\xA0Q\ta4\x80Q\t\x85\x86a\x19\x80Q\x87\t\x85a\x16 Q\x01\x01\x87a\x19`Q\x88\t\x86a\x16\0Q\x01\x01\t\x92P\x85\x86a\x19\xC0Q\x87\t\x85a\x16`Q\x01\x01\x87a\x19\xA0Q\x88\t\x86a\x16@Q\x01\x01\t\x91P\x85\x86\x87\x88\x85\x87\ta \x80Q\ta4\x80Q\t\x87\x03\x82\x08\x90P\x85a&@Qa4\x80Q\ta4\x80R\x85\x86\x87\x88a0`Q\x8A\x03a \x80Q\x08a0\xC0Q\ta4\x80Q\t\x82\x08\x90P\x85a&@Qa4\x80Q\ta4\x80R\x85\x86\x87\x88`\x01\x8A\x03a\x16\xA0Q\x08a0\xA0Q\ta4\x80Q\t\x82\x08a6\0RPPPPP\x80a&@Qa4\x80Q\ta4\x80R\x80a\x17 Qa&`Q\t\x81\x82\x83a Qa\x17\x80Q\ta\x16@Q\x08\x82\x08\x90P\x81a&`Q\x82\t\x90P\x81\x82\x83a \0Qa\x17`Q\ta\x16 Q\x08\x82\x08\x90P\x81a&`Q\x82\t\x90P\x81\x82\x83a\x19\xE0Qa\x17\0Q\ta\x16\0Q\x08\x82\x08\x90P\x81a\x18@Q\x83\x84a&`Qa\x18`Q\t\x85\x86a&\x80Qa\x18\x80Q\t\x87a&\xA0Qa\x18\xA0Q\t\x08\x08\x08\x82a \xC0Q\x84\x85a&`Qa \xE0Q\t\x86\x87a&\x80Qa!\0Q\t\x88a&\xA0Qa! Q\t\x08\x08\x08\x83\x84`\x01a&\0Q\x08a& Q\t\x84a& Q\x86a\x18\xC0Q\x87\t\x08\x93P\x84\x81\x86\x87a&\0Q\x86\t\x86\x08\x08\x92P\x84\x83\x85\t\x93P\x84\x85`\x01a&\0Q\x08\x85\t\x93P\x84a0\xA0Qa&@Q\t\x92P\x84\x83\x85\x08\x93P\x84a\x16\xC0Q\x85\t\x93P\x84\x83\x86\x03\x85\x08\x93P\x84\x81\x86\x87a&\0Qa `Q\ta\x16\x80Q\x08\x08\x92PPP\x82a0\xC0Qa4 Q\t\x83\x81\x85\x03\x83\x08\x91P\x83a \xA0Q\x83\t\x91P\x83\x84a1@Q\x83\t\x83\x08\x91PP\x82a4\x80Q\x84\x83\x86\x03\x85\x08\ta6 RPP\x80a4@Qa4\x80Q\ta4\x80R\x80a\x16\xE0Qa\x16\0Q\t\x81a\x17\0Qa\x16 Q\t\x82a\x17 Qa\x16@Q\t\x83a\x17@Qa\x16`Q\t\x84\x7F\x182'9p\x98\xD0\x14\xDC(\"\xDB@\xC0\xAC.\x94\x19\xF4$<\xDC\xB8H\xA1\xF0\xFA\xC9\xF8\0\0\0\x86\x87`\x03\x89\x03a\x17\xA0Q\x08\x88a\x17`Q\x8Aa\x16 Qa\x16\0Q\t\t\t\t\x85\x86\x87\x88\x89\x85\x8A\x08\x88\x08\x86\x08\x84\x08a\x17\x80Q\x08\x94PPPPP\x81\x82\x83\x84\x85a\x16`Qa\x16\0Q\x08a\x19\xE0Q\x87\x03\x08a\x17`Q\x08\x84`\x02\x86\x03a\x17\xA0Q\x08\ta&@Q\t\x82\x83\x84\x85\x86\x85a @Q\x08\x87`\x01\x89\x03a\x17\xA0Q\x08\t\x85\x08a\x17\xA0Q\ta4\x80Q\ta6@RPP\x80a4 Qa4\x80Q\ta4\x80R`\x02\x81\x03`\x03\x82\x03\x82a\x16\0Q\x84\x03a\x16 Q\x08\x83a\x16 Q\x85\x03a\x16@Q\x08\x84a\x16@Q\x86\x03a\x16`Q\x08\x85a\x16`Q\x87\x03a\x19\xE0Q\x08\x86a4\x80Q\x88\x89\x88\x88\x08\x8A\x8B\x8B\x8A\x08\x8C\x8A\x8E\x03\x8E\x8C\x8D\t\x08\t\t\t\x93P\x86\x87\x88a&@Qa4\x80Q\t\x89\x8A\x89\x88\x08\x8B\x8C\x8C\x8A\x08\x8D\x8A\x8F\x03\x8F\x8C\x8D\t\x08\t\t\t\x85\x08\x93P\x86\x87\x88a4 Qa4\x80Q\t\x89\x8A\x89\x87\x08\x8B\x8C\x8C\x89\x08\x8D\x89\x8F\x03\x8F\x8B\x8C\t\x08\t\t\t\x85\x08\x93P\x86\x87\x88a4@Qa4\x80Q\t\x89\x8A\x89\x86\x08\x8B\x8C\x8C\x88\x08\x8D\x88\x8F\x03\x8F\x8A\x8B\t\x08\t\t\t\x85\x08\x93PPPP\x83a\x17\xC0Q\x82\ta6`RPPa4`Qa4\x80Q\x83\x92P\ta4\x80R\x80a\x17 Q\x82\x83a\x16 Q\x85a \0Qa \0Q\x08\x08\x84a\x16 Qa\x19\xE0Q\x87\x03\t\t\t\x81a\x19\xE0Qa\x19\xE0Q\t\x82\x83a\x16 Q\x85\x03a \0Q\x08\x82\t\x90P\x82a\x17@Q\x82\t\x90P\x82a\x19\xE0Qa\x19\xE0Q\t\x83a\x19\xE0Q\x82\t\x90P\x83\x84\x85a\x16 Qa \0Q\x08\x86a\x16 Qa\x16 Q\t\t\x82\x08\x90P\x83\x84\x85a\x16@Qa\x16@Q\t\x86a @Qa @Q\t\x08\x85\x03\x82\x08\x90P\x83a\x16@Qa @Q\t\x84\x81\x82\x08\x90P\x84a\x16\xE0Q\x82\t\x90P\x84\x85\x83\x83\x08\x86\x85\x87\x08\x08\x92P\x84a4\x80Q\x84\t\x92P\x84\x85a\x16@Qa Q\x08\x86a\x17 Qa\x19\xE0Q\t\t\x93P\x84\x85a \0Q\x87\x03a\x16 Q\x08\x86a\x16\xE0Qa @Q\t\t\x85\x03\x90P\x84\x85\x86a \0Q\x88\x03a\x16 Q\x08a\x16@Q\t\x86\x87a\x16@Qa Q\x08a\x16 Q\t\x87\x03\x08\x91P\x84\x85a&@Qa4\x80Q\t\x86\x84\x88\x85\x89\x08\x08\t\x93PPP\x82a\x17\xE0Q\x84\x84\x84\x08\ta6\x80RPP\x80a4`Qa4\x80Q\ta4\x80R\x80\x81a\x16 Qa\x19\xE0Q\t\x82a \0Qa\x16\0Q\t\x08\x81a Q\x83\x03\x83\x84a\x16@Qa\x16 Q\t\x85a\x16`Qa\x16\0Q\t\x08\x08\x82`\x01`D\x1B\x82\t\x90P\x82a @Q\x84\x03\x82\x08\x90P\x82\x82\x82\x08\x90P\x82a\x17@Q\x82\t\x90P\x82`\x01`D\x1B\x83\t\x91P\x82\x83a \0Qa\x19\xE0Q\t\x83\x08\x91P\x82a\x17 Q\x84\x85a\x16`Qa\x16@Q\x08\x86\x03\x85\x08\t\x83a\x17`Q\x85\x86a @Qa Q\x08\x87\x03\x87a\x16`Q\x88\x08\x08\t\x92P\x83a\x17\0Q\x85\x85\x87\x86\x86\x08\x08\ta6\xC0RPPa \0Q\x82\x91Pa@\0\x90\t\x81a\x19\xE0Q\x82\x08\x90P\x81a@\0\x82\t\x90P\x81a\x16@Q\x82\x08\x90P\x81a@\0\x82\t\x90P\x81a\x16 Q\x82\x08\x90P\x81a@\0\x82\t\x90P\x81a\x16\0Q\x82\x08\x90P\x81a\x16`Q\x83\x03\x82\x08\x90P\x81a\x17@Q\x82\t\x90P\x81a@\0a Q\t\x82a \0Q\x82\x08\x90P\x82a@\0\x82\t\x90P\x82a\x19\xE0Q\x82\x08\x90P\x82a@\0\x82\t\x90P\x82a\x16`Q\x82\x08\x90P\x82a@\0\x82\t\x90P\x82a\x16@Q\x82\x08\x90P\x82a @Q\x84\x03\x82\x08\x90P\x82a\x17`Q\x82\t\x90P\x82a\x17 Q\x84\x83\x85\x08\ta6\xE0RPP\x80a&`Qa\x16@Q\t\x81a\x16 Q\x82\x08\x90P\x81a&`Q\x82\t\x90P\x81a\x16\0Q\x82\x08\x90P\x81a&`Q\x82\t\x90P\x81a\x17\x80Q\x82\x08\x90P\x80\x82a\x16`Q\x84\x03\x83\x08\x91P\x81a7@R\x82a\x16\0Q\x84\x03a\x19\xE0Q\x08\x83a\x16`Q\x85\x03a @Q\x08\x84\x85`\x01\x87\x03\x84\x08\x83\t\x85\x86\x84\x88\x03`\x01\x08\x83\t\x91P\x85\x85\x87a&@Q\x89\x85\x8Ba&@Q\x89\t\x08\t\x08a7 R\x85a&`Qa Q\t\x94P\x85a \0Q\x86\x08\x94P\x85a&`Q\x86\t\x94P\x85a\x19\xE0Q\x86\x08\x94P\x85a&`Q\x86\t\x94P\x85\x85\x87\x03a @Q\x08\x94P\x85a\x16@Q\x87\x03a Q\x08\x91P\x85\x86\x87\x87\x89\x03`\x01\x08\x84\t\x87\x85\x89\x03`\x01\x08\t\x91P\x85\x84\x87\x03a\x16`Q\x08\x86\x87`\x01\x89\x03\x83\x08\x82\t\x90P\x86\x87`\x01\x89\x03\x88\x08\x87\t\x95P\x86a&@Q\x84\t\x92P\x86\x82\x84\x08\x92P\x86a&@Q\x84\t\x92P\x86\x86\x84\x08\x92P\x86a&@Q\x84\t\x92P\x86\x81\x84\x08\x92PP\x81a7\0RPP\x83a\x16 Q\x85\x03a \0Q\x08\x92P\x83a\x16@Q\x85\x03\x85\x86\x84\x88\x03`\x01\x08\x86\t\x08\x92P\x83a\x17\0Qa7 Q\t\x91P\x83\x84a\x17@Q\x85\t\x83\x08\x91P\x83\x84a\x17`Qa7@Q\t\x83\x08\x91P\x83a\x16\xE0Q\x83\t\x91P\x83\x84a\x17\xA0Qa7\0Q\t\x83\x08\x91P\x83a6\xC0Q\x83\x08\x92P\x83a6\xE0Q\x84\x08\x92P\x83a\x18\0Q\x84\t\x92P\x83a4\x80Q\x84\t\x92P\x82a6\xA0R\x83a4@Qa4\x80Q\ta4\x80RPPP\x80a7\x80Q\x82a6\xA0Q\x84a6\x80Q\x86a6`Q\x88a6@Q\x8Aa6 Qa6\0Q\x08\x08\x08\x08\x08\ta7`\x81\x90Ra&\xE0Qa7\xA0\x81\x90Ra7\xC0\x91\x90\x91Ra\x02\xE4`\x045\x01a\x05 \x81a7\xE07PPa\x05`a7\xA0 \x81\x81\x06a'\0R`\0\x81\x90R`\x01` S\x81`!`\0 \x06a' R`\x02` S\x81`!`\0 \x06a'@R`\x03` S\x81`!`\0 \x06a'`R`\x04` S\x81`!`\0 \x06a'\x80R`\x05` S\x81`!`\0 \x06a'\xA0R`\x06` S\x81`!`\0 \x06a'\xC0R`\x07` S\x81`!`\0 \x06a'\xE0R`\x08` S\x81`!`\0 \x06a(\0R`\t` S\x81`!`\0 \x06a( R`\n` S\x81`!`\0 \x06a(@R`\x0B` S\x81`!`\0 \x06a(`R`\x0C` S\x81`!`\0 \x06a(\x80R`\r` S\x81`!`\0 \x06a(\xA0R`\x0E` S\x81`!`\0 \x06a(\xC0R`\x0F` S\x81`!`\0 \x06a(\xE0R`\x10` S\x81`!`\0 \x06a)\0R`\x11` S\x81`!`\0 \x06a) R`\x12` S\x81`!`\0 \x06a)@R`\x13` S\x81`!`\0 \x06a)`R`\x14` S\x81`!`\0 \x06a)\x80R`\x15` S\x81`!`\0 \x06a)\xA0R`\x16` S\x81`!`\0 \x06a)\xC0R`\x17` S\x81`!`\0 \x06a)\xE0R`\x18` S\x81`!`\0 \x06a*\0R`\x19` S\x81`!`\0 \x06a* R`\x1A` S\x81`!`\0 \x06a*@R`\x1B` S\x81`!`\0 \x06a*`R`\x1C` S\x81`!`\0 \x06a*\x80R`\x1D` S\x81`!`\0 \x06a*\xA0R`\x1D` SP`!`\0\x90\x81 \x82\x81\x06a*\xC0R\x81Ra# Q` Ra#\0Q`@Ra#`Q``Ra#@Q`\x80R`\xA0\x81 \x82\x90\x06a+\0Ra\x13\xC0Qa\x13\xE0Q\x84\x82\x80\t\x85`\x03\x87\x83\x86\t\x08\x86\x83\x84\t\x14\x93PP\x81a1`R\x80` a1`\x01RPPa\x14\0Qa\x14 Q\x84\x82\x83\t\x85`\x03\x87\x83\x86\t\x08\x86\x83\x84\t\x14\x84\x16\x93PP\x81`\0R\x80` RPPa0@Q`@R`@a1\xA0```\0`\x07Z\xFA\x16`@a1``\x80\x81`\x06Z\xFA\x81\x16\x90Pa\x14@Qa\x14`Q\x84\x82\x83\t\x85`\x03\x87\x83\x86\t\x08\x86\x83\x84\t\x14\x84\x16\x93PP\x81`\0R\x80` RPP\x81a0@Qa0@Q\t`@R`@a1\xA0```\0`\x07Z\xFA\x16`@a1``\x80\x81`\x06Z\xFA\x81\x16\x90Pa\x14\x80Qa\x14\xA0Q\x84\x82\x83\t\x85`\x03\x87\x83\x86\t\x08\x86\x83\x84\t\x14\x84\x16\x93PP\x81`\0R\x80` RPP\x81a0@Q\x83a0@Qa0@Q\t\t`@R`@a1\xA0```\0`\x07Z\xFA\x16`@a1``\x80\x81`\x06Z\xFA\x81\x16\x90Pa\x12\0Qa\x12 Q\x84\x82\x83\t\x85`\x03\x87\x83\x86\t\x08\x86\x83\x84\t\x14\x84\x16\x93PP\x81`\0R\x80` RPP\x81a'\0Q\x83`\x01a+\0Q\x08\t`@R`@a1\xA0```\0`\x07Z\xFA\x16`@a1``\x80\x81`\x06Z\xFA\x81\x16\x90Pa\x12@Qa\x12`Q\x84\x82\x83\t\x85`\x03\x87\x83\x86\t\x08\x86\x83\x84\t\x14\x84\x16\x93PP\x81`\0R\x80` RPP\x81a' Q\x83`\x01a+\0Q\x08\t`@R`@a1\xA0```\0`\x07Z\xFA\x16`@a1``\x80\x81`\x06Z\xFA\x81\x16\x90Pa\x12\x80Qa\x12\xA0Q\x84\x82\x83\t\x85`\x03\x87\x83\x86\t\x08\x86\x83\x84\t\x14\x84\x16\x93PP\x81`\0R\x80` RPP\x81a'@Q\x83`\x01a+\0Q\x08\t`@R`@a1\xA0```\0`\x07Z\xFA\x16`@a1``\x80\x81`\x06Z\xFA\x81\x16\x90Pa\x12\xC0Qa\x12\xE0Q\x84\x82\x83\t\x85`\x03\x87\x83\x86\t\x08\x86\x83\x84\t\x14\x84\x16\x93PP\x81`\0R\x80` RPP\x81a'`Q\x83`\x01a+\0Q\x08\t`@R`@a1\xA0```\0`\x07Z\xFA\x16`@a1``\x80\x81`\x06Z\xFA\x81\x16\x90Pa\x13\0Qa\x13 Q\x84\x82\x83\t\x85`\x03\x87\x83\x86\t\x08\x86\x83\x84\t\x14\x84\x16\x93PP\x81`\0R\x80` RPP\x81a'\x80Q\x83`\x01a+\0Q\x08\t`@R`@a1\xA0```\0`\x07Z\xFA\x16`@a1``\x80\x81`\x06Z\xFA\x81\x16\x90Pa\x13@Qa\x13`Q\x84\x82\x83\t\x85`\x03\x87\x83\x86\t\x08\x86\x83\x84\t\x14\x84\x16\x93PP\x81`\0R\x80` RPP\x81a'\xA0Q\x83`\x01a+\0Q\x08\t`@R`@a1\xA0```\0`\x07Z\xFA\x16`@a1``\x80\x81`\x06Z\xFA\x81\x16\x90Pa\x13\x80Qa\x13\xA0Q\x84\x82\x83\t\x85`\x03\x87\x83\x86\t\x08\x86\x83\x84\t\x14\x84\x16\x93PP\x81`\0R\x80` RPP\x81a'\xC0Q\x83`\x01a+\0Q\x08\t`@R`@a1\xA0```\0`\x07Z\xFA\x16`@a1``\x80\x81`\x06Z\xFA\x81\x16\x90Pa\x04\0Qa\x04 Q\x84\x82\x83\t\x85`\x03\x87\x83\x86\t\x08\x86\x83\x84\t\x14\x84\x16\x93PP\x81`\0R\x80` RPPa'\xE0Q`@R`@a1\xA0```\0`\x07Z\xFA\x16`@a1``\x80\x81`\x06Z\xFA\x81\x16\x90Pa\x04@Qa\x04`Q\x84\x82\x83\t\x85`\x03\x87\x83\x86\t\x08\x86\x83\x84\t\x14\x84\x16\x93PP\x81`\0R\x80` RPPa(\0Q`@R`@a1\xA0```\0`\x07Z\xFA\x16`@a1``\x80\x81`\x06Z\xFA\x81\x16\x90Pa\x04\x80Qa\x04\xA0Q\x84\x82\x83\t\x85`\x03\x87\x83\x86\t\x08\x86\x83\x84\t\x14\x84\x16\x93PP\x81`\0R\x80` RPPa( Q`@R`@a1\xA0```\0`\x07Z\xFA\x16`@a1``\x80\x81`\x06Z\xFA\x81\x16\x90Pa\x04\xC0Qa\x04\xE0Q\x84\x82\x83\t\x85`\x03\x87\x83\x86\t\x08\x86\x83\x84\t\x14\x84\x16\x93PP\x81`\0R\x80` RPPa(@Q`@R`@a1\xA0```\0`\x07Z\xFA\x16`@a1``\x80\x81`\x06Z\xFA\x81\x16\x90Pa\x05\0Qa\x05 Q\x84\x82\x83\t\x85`\x03\x87\x83\x86\t\x08\x86\x83\x84\t\x14\x84\x16\x93PP\x81`\0R\x80` RPPa(`Q`@R`@a1\xA0```\0`\x07Z\xFA\x16`@a1``\x80\x81`\x06Z\xFA\x81\x16\x90Pa\x05@Qa\x05`Q\x84\x82\x83\t\x85`\x03\x87\x83\x86\t\x08\x86\x83\x84\t\x14\x84\x16\x93PP\x81`\0R\x80` RPPa(\x80Q`@R`@a1\xA0```\0`\x07Z\xFA\x16`@a1``\x80\x81`\x06Z\xFA\x81\x16\x90Pa\x05\x80Qa\x05\xA0Q\x84\x82\x83\t\x85`\x03\x87\x83\x86\t\x08\x86\x83\x84\t\x14\x84\x16\x93PP\x81`\0R\x80` RPPa(\xA0Q`@R`@a1\xA0```\0`\x07Z\xFA\x16`@a1``\x80\x81`\x06Z\xFA\x81\x16\x90Pa\x05\xC0Qa\x05\xE0Q\x84\x82\x83\t\x85`\x03\x87\x83\x86\t\x08\x86\x83\x84\t\x14\x84\x16\x93PP\x81`\0R\x80` RPPa(\xC0Q`@R`@a1\xA0```\0`\x07Z\xFA\x16`@a1``\x80\x81`\x06Z\xFA\x81\x16\x90Pa\x06\0Qa\x06 Q\x84\x82\x83\t\x85`\x03\x87\x83\x86\t\x08\x86\x83\x84\t\x14\x84\x16\x93PP\x81`\0R\x80` RPPa(\xE0Q`@R`@a1\xA0```\0`\x07Z\xFA\x16`@a1``\x80\x81`\x06Z\xFA\x81\x16\x90Pa\x06@Qa\x06`Q\x84\x82\x83\t\x85`\x03\x87\x83\x86\t\x08\x86\x83\x84\t\x14\x84\x16\x93PP\x81`\0R\x80` RPPa)\0Q`@R`@a1\xA0```\0`\x07Z\xFA\x16`@a1``\x80\x81`\x06Z\xFA\x81\x16\x90Pa\x06\x80Qa\x06\xA0Q\x84\x82\x83\t\x85`\x03\x87\x83\x86\t\x08\x86\x83\x84\t\x14\x84\x16\x93PP\x81`\0R\x80` RPPa) Q`@R`@a1\xA0```\0`\x07Z\xFA\x16`@a1``\x80\x81`\x06Z\xFA\x81\x16\x90Pa\x06\xC0Qa\x06\xE0Q\x84\x82\x83\t\x85`\x03\x87\x83\x86\t\x08\x86\x83\x84\t\x14\x84\x16\x93PP\x81`\0R\x80` RPPa)@Q`@R`@a1\xA0```\0`\x07Z\xFA\x16`@a1``\x80\x81`\x06Z\xFA\x81\x16\x90Pa\x07\0Qa\x07 Q\x84\x82\x83\t\x85`\x03\x87\x83\x86\t\x08\x86\x83\x84\t\x14\x84\x16\x93PP\x81`\0R\x80` RPPa)`Q`@R`@a1\xA0```\0`\x07Z\xFA\x16`@a1``\x80\x81`\x06Z\xFA\x81\x16\x90Pa\x07@Qa\x07`Q\x84\x82\x83\t\x85`\x03\x87\x83\x86\t\x08\x86\x83\x84\t\x14\x84\x16\x93PP\x81`\0R\x80` RPPa)\x80Q`@R`@a1\xA0```\0`\x07Z\xFA\x16`@a1``\x80\x81`\x06Z\xFA\x81\x16\x90Pa\x07\x80Qa\x07\xA0Q\x84\x82\x83\t\x85`\x03\x87\x83\x86\t\x08\x86\x83\x84\t\x14\x84\x16\x93PP\x81`\0R\x80` RPP\x81a)\xA0Q\x83`\x01a+\0Q\x08\t`@R`@a1\xA0```\0`\x07Z\xFA\x16`@a1``\x80\x81`\x06Z\xFA\x81\x16\x90Pa\x07\xC0Qa\x07\xE0Q\x84\x82\x83\t\x85`\x03\x87\x83\x86\t\x08\x86\x83\x84\t\x14\x84\x16\x93PP\x81`\0R\x80` RPP\x81a)\xC0Q\x83`\x01a+\0Q\x08\t`@R`@a1\xA0```\0`\x07Z\xFA\x16`@a1``\x80\x81`\x06Z\xFA\x81\x16\x90Pa\x08\0Qa\x08 Q\x84\x82\x83\t\x85`\x03\x87\x83\x86\t\x08\x86\x83\x84\t\x14\x84\x16\x93PP\x81`\0R\x80` RPP\x81a)\xE0Q\x83`\x01a+\0Q\x08\t`@R`@a1\xA0```\0`\x07Z\xFA\x16`@a1``\x80\x81`\x06Z\xFA\x81\x16\x90Pa\x08@Qa\x08`Q\x84\x82\x83\t\x85`\x03\x87\x83\x86\t\x08\x86\x83\x84\t\x14\x84\x16\x93PP\x81`\0R\x80` RPP\x81a*\0Q\x83`\x01a+\0Q\x08\t`@R`@a1\xA0```\0`\x07Z\xFA\x16`@a1``\x80\x81`\x06Z\xFA\x81\x16\x90Pa\x08\x80Qa\x08\xA0Q\x84\x82\x83\t\x85`\x03\x87\x83\x86\t\x08\x86\x83\x84\t\x14\x84\x16\x93PP\x81`\0R\x80` RPPa* Q`@R`@a1\xA0```\0`\x07Z\xFA\x16`@a1``\x80\x81`\x06Z\xFA\x81\x16\x90Pa\x08\xC0Qa\x08\xE0Q\x84\x82\x83\t\x85`\x03\x87\x83\x86\t\x08\x86\x83\x84\t\x14\x84\x16\x93PP\x81`\0R\x80` RPPa*@Q`@R`@a1\xA0```\0`\x07Z\xFA\x16`@a1``\x80\x81`\x06Z\xFA\x81\x16\x90Pa\t\0Qa\t Q\x84\x82\x83\t\x85`\x03\x87\x83\x86\t\x08\x86\x83\x84\t\x14\x84\x16\x93PP\x81`\0R\x80` RPPa*`Q`@R`@a1\xA0```\0`\x07Z\xFA\x16`@a1``\x80\x81`\x06Z\xFA\x81\x16\x90Pa\t@Qa\t`Q\x84\x82\x83\t\x85`\x03\x87\x83\x86\t\x08\x86\x83\x84\t\x14\x84\x16\x93PP\x81`\0R\x80` RPPa*\x80Q`@R`@a1\xA0```\0`\x07Z\xFA\x16`@a1``\x80\x81`\x06Z\xFA\x81\x16\x90Pa\t\x80Qa\t\xA0Q\x84\x82\x83\t\x85`\x03\x87\x83\x86\t\x08\x86\x83\x84\t\x14\x84\x16\x93PP\x81`\0R\x80` RPPa*\xA0Q`@R`@a1\xA0```\0`\x07Z\xFA\x16`@a1``\x80\x81`\x06Z\xFA\x81\x16\x90P\x81\x82a\x16\0Q\x84a+\0Qa\x19\xE0Q\t\x08a'\0Q\t\x82\x83\x84a\x16 Q\x86a+\0Qa \0Q\t\x08a' Q\t\x82\x08\x90P\x82\x83\x84a\x16@Q\x86a+\0Qa Q\t\x08a'@Q\t\x82\x08\x90P\x82\x83\x84a\x16`Q\x86a+\0Qa @Q\t\x08a'`Q\t\x82\x08\x90P\x82\x83\x84a\x16\x80Q\x86a+\0Qa `Q\t\x08a'\x80Q\t\x82\x08\x90P\x82\x83\x84a\x16\xA0Q\x86a+\0Qa \x80Q\t\x08a'\xA0Q\t\x82\x08\x90P\x82\x83\x84a\x16\xC0Q\x86a+\0Qa \xA0Q\t\x08a'\xC0Q\t\x82\x08\x90P\x82\x83a\x16\xE0Qa'\xE0Q\t\x82\x08\x90P\x82\x83a\x17\0Qa(\0Q\t\x82\x08\x90P\x82\x83a\x17 Qa( Q\t\x82\x08\x90P\x82\x83a\x17@Qa(@Q\t\x82\x08\x90P\x82\x83a\x17`Qa(`Q\t\x82\x08\x90P\x82\x83a\x17\x80Qa(\x80Q\t\x82\x08\x90P\x82\x83a\x17\xA0Qa(\xA0Q\t\x82\x08\x90P\x82\x83a\x17\xC0Qa(\xC0Q\t\x82\x08\x90P\x82\x83a\x17\xE0Qa(\xE0Q\t\x82\x08\x90P\x82\x83a\x18\0Qa)\0Q\t\x82\x08\x90P\x82\x83a\x19`Qa) Q\t\x82\x08\x90P\x82\x83a\x19\x80Qa)@Q\t\x82\x08\x90P\x82\x83a\x19\xA0Qa)`Q\t\x82\x08\x90P\x82\x83a\x19\xC0Qa)\x80Q\t\x82\x08\x90P\x82\x83\x84a\x18@Q\x86a+\0Qa \xC0Q\t\x08a)\xA0Q\t\x82\x08\x90P\x82\x83\x84a\x18`Q\x86a+\0Qa \xE0Q\t\x08a)\xC0Q\t\x82\x08\x90P\x82\x83\x84a\x18\x80Q\x86a+\0Qa!\0Q\t\x08a)\xE0Q\t\x82\x08\x90P\x82\x83\x84a\x18\xA0Q\x86a+\0Qa! Q\t\x08a*\0Q\t\x82\x08\x90P\x82\x83a\x18\xC0Qa* Q\t\x82\x08\x90P\x82\x83a\x18\xE0Qa*@Q\t\x82\x08\x90P\x82\x83a\x19\0Qa*`Q\t\x82\x08\x90P\x82\x83a\x19 Qa*\x80Q\t\x82\x08\x90P\x82\x83a\x19@Qa*\xA0Q\t\x82\x08\x90P\x82a7`Q\x82\x08\x90P`\x01`\0R`\x02` R\x80\x83\x03`@RP`@a1\xA0```\0`\x07Z\xFA\x16`@a1``\x80\x81`\x06Z\xFA\x16a3`\x81\x90Ra+\0Qa&\xC0Qa#\0Qa# Q\x86\x82\x80\t\x87`\x03\x89\x83\x86\t\x08\x88\x83\x84\t\x14\x95PP\x81`\0R\x80` RPP\x80`@R`@a1\xA0```\0`\x07Z\xFA\x83\x16\x92P`@a1``\x80a1``\x06Z\xFA\x83\x16\x92Pa#@Qa#`Q\x86\x82\x83\t\x87`\x03\x89\x83\x86\t\x08\x88\x83\x84\t\x14\x86\x16\x95PP\x81`\0R\x80` RPP\x83a\x03\xC0Q\x85\x83\x85\t\t`@RP`@a1\xA0```\0`\x07Z\xFA\x82\x16\x91P`@a2 `\x80a1``\x06Z\xFA\x82\x16\x91Pa#\0Q`\0Ra# Q` Ra#@Q`@Ra#`Q``R\x80`\x80R`@\x80```@`\x07Z\xFA\x82\x16\x91P`@a1\xE0`\x80`\0`\x06Z\xFA\x82\x16\x91Pa2\0Q\x84\x03a2\0Ra\t\xC0Q\x15a*\xCFWa5\0Qa5 Q\x85\x82\x83\t\x86`\x03\x88\x83\x86\t\x08\x87\x83\x84\t\x14\x85\x16\x94PP\x81`\0R\x80` RPP\x82\x81\x82\t`@R`@``\x80`\0`\x07Z\xFA\x82\x16\x91Pa5@Qa5`Q\x85\x82\x83\t\x86`\x03\x88\x83\x86\t\x08\x87\x83\x84\t\x14\x85\x16\x94PP\x81`\0R\x80` RPP`@`\0```\0`\x07Z\xFA\x82\x16\x91Pa2 Q`\xA0Ra2@Q`\xC0R`@a2 `\x80```\x06Z\xFA\x82\x16\x91Pa1\xE0Q`@Ra2\0Q``R`@a1\xE0`\x80`\0`\x06Z\xFA\x82\x16\x91P[P\x80a*\xE6Wc\xF7U\xF3i`\xE0\x1B`\0R`\x04`\0\xFD[\x80a3\x80Ra2 Q`\0Ra2@Q` R\x7F\x19\x8E\x93\x93\x92\rH:r`\xBF\xB71\xFB]%\xF1\xAAI35\xA9\xE7\x12\x97\xE4\x85\xB7\xAE\xF3\x12\xC2`@R\x7F\x18\0\xDE\xEF\x12\x1F\x1EvBj\0f^\\DygC\"\xD4\xF7^\xDA\xDDF\xDE\xBD\\\xD9\x92\xF6\xED``R\x7F\t\x06\x89\xD0X_\xF0u\xEC\x9E\x99\xADi\x0C3\x95\xBCK13p\xB3\x8E\xF3U\xAC\xDA\xDC\xD1\"\x97[`\x80R\x7F\x12\xC8^\xA5\xDB\x8Cm\xEBJ\xABq\x80\x8D\xCB@\x8F\xE3\xD1\xE7i\x0CC\xD3{L\xE6\xCC\x01f\xFA}\xAA`\xA0Ra1\xE0Q`\xC0Ra2\0Q`\xE0Ra\n\0Qa\x01\0Ra\n Qa\x01 Ra\n@Qa\x01@Ra\n`Qa\x01`R` `\0a\x01\x80`\0`\x08Z\xFA\x90P\x80a3\xA0R`\0Qa3\xC0RPPPa3`Qa3\x80Qa3\xC0Qa3\xA0Q\x16\x16\x16a+\xFDWc\x01\xC4\x7F;`\xE2\x1B`\0R`\x04`\0\xFD[`\x01`\0R` `\0\xF3[`\0\x80`\0\x80`@\x85\x87\x03\x12\x15a,\x1DW\x83\x84\xFD[\x845g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x11\x15a,4W\x85\x86\xFD[\x81\x87\x01\x91P\x87`\x1F\x83\x01\x12a,GW\x85\x86\xFD[\x815\x81\x81\x11\x15a,UW\x86\x87\xFD[\x88` \x82\x85\x01\x01\x11\x15a,fW\x86\x87\xFD[` \x92\x83\x01\x96P\x94P\x90\x86\x015\x90\x80\x82\x11\x15a,\x80W\x83\x84\xFD[\x81\x87\x01\x91P\x87`\x1F\x83\x01\x12a,\x93W\x83\x84\xFD[\x815\x81\x81\x11\x15a,\xA1W\x84\x85\xFD[\x88` \x82`\x05\x1B\x85\x01\x01\x11\x15a,\xB5W\x84\x85\xFD[\x95\x98\x94\x97PP` \x01\x94PPPV\xFE\xA2dipfsX\"\x12 i\\O>\x85\x893C\x8D\xE4em\xDF\xB86x\xCA\xA0\xF3\xC2;\xD8\xC7\xFFB\xCA\xBB9\xA0qv\xA1dsolcC\0\x08\x04\x003"; - /// The bytecode of the contract. - pub static ULTRAVERIFIER_BYTECODE: ::ethers::core::types::Bytes = - ::ethers::core::types::Bytes::from_static(__BYTECODE); - #[rustfmt::skip] - const __DEPLOYED_BYTECODE: &[u8] = b"`\x80`@R4\x80\x15a\0\x10W`\0\x80\xFD[P`\x046\x10a\x006W`\x005`\xE0\x1C\x80c\x93\x7Fj\x10\x14a\0;W\x80c\xEAP\xD0\xE4\x14a\0nW[`\0\x80\xFD[`@Q\x7F^5[\xF9\x1F\xE3\xE2\xBC\xC2\xF4!\xEF+\x95\xD0\x01\x16d\xCA\x0E\x84vM\xB7\xE9\xC4\x88N\\q\xB1%\x81R` \x01[`@Q\x80\x91\x03\x90\xF3[a\0\x81a\0|6`\x04a,\x08V[a\0\x91V[`@Q\x90\x15\x15\x81R` \x01a\0eV[b\x02\0\0a\x03\x80R`\x01a\x03\xA0R\x7F\x1B\xF8-\xEB\xA7\xD7I\x02\xC3p\x8C\xC6\xE7\x0Ea\xF3\x05\x12\xEC\xA9VU!\x0E'nXX\xCE\x8FX\xE5a\x03\xC0R\x7F0d6@\xB9\xF8/\x90\xE8;i\x8E^\xA6\x17\x9C|\x05T.\x85\x953\xB4\x8B\x99S\xA2\xF56\x08\x01a\x03\xE0R\x7F\x05\x95%e\x91\xD2+\xF1I\x8B\xDD\xF8\xBD\xC8\x96\xBCT\x92\xEA\xA1=\xF0\x15Re\x15\xCF\xF3\xA8p`aa\x04\0R\x7F\t\xEB\xFD\xACb\x1Dg\xFC\xC8\xE6\xCD2`\xED\x1B\xA3g\xCAL\xBA\xC8^\xD4\xED\x13\xE7\xB4\xA2\xD8\xF1\xFFQa\x04 R\x7F\x18\x15(U\xE6^\xD9\xBEMu\x9Ah\x02\xC9\xDF\x16\xD1{\xBC\x80\xF7\x1B\t:\x81\xCA\x01\xFB\xA1c\xF4\xFAa\x04@R\x7F$\x8E\xEE\x8C`K\x8E\x8Bin\xFD\x14\xE3\x16[kZBK\xAD\x87q9\xE2\x81)\x9B\\d\xD6;xa\x04`R\x7F*\xAA?\xFA`cO\n\x10;\x82p\xD6\xA8\xB0\xCDL\xDE/\x97\xDF\x89\x13\xD5\xEB\xFF\x10@\xC1\xED\xB9la\x04\x80R\x7F\r\xDD\x8D\xF2\xD8\xC6\x19\xC2\x13\x9E\xB2[u\xC3z\xC3`|\xDAN\xD7\xC8\x06\xA8\xD9M\xEDY\xA3\x9C\x84\xE2-\"$\xE3a\x05`R~\x9FS\xFC\xC9\xB3\xCE?\xBD\xA1'Vg\xF6\xFB\xE6\xD6\xC5\xF4\xB8R\x90\xB9\xC6\x8C+\xF1\xA9\xF1\xFE\xE6\x02a\x05\x80R\x7F\x13\xC9\xAD=\x10R\xF8\xE8\xA1;FDF\xFE\xC7j\xAD]\xF0:\\\x83v\x83\xD8\x94\x7F\"D\xB8\x17\xB2a\x05\xA0R\x7F'\x8B)y\xE3V\xFE]\xFD\x10r\xF5\x96+xt\x9C\x03\xA0\x0EQ\x1BM\xDDz\xE9\x8A\x1E\xA1\x14\xD3\x85a\x05\xC0R\x7F\x19\xD2\xFC\xA9H\xE1\xC4\xAC\xB6\x17\xF2>zn\x03\xE6H/\xB7\xC7\x91yH\x1C\x84\xCA\xF6\x82\r\x11!Ja\x05\xE0R\x7F(\xB9U\xAA\xC4\xC0C\xCB\xCF\xDE\x06\xEE\xE5\x9BD6?\x96\xFE\no\xA9;\x0B6\xEF\x07\xFB\xE2\x85\xD4\xC7a\x06\0R\x7F\x16\xE1\xBB\xB0\xA7r\x8D\xCBv\x96\xFD\xF36\x1B9Q\x0CjO\x83\xCC!Y\xF5\xFCe\xCE\xB2\xBE\x05\x99\xF9a\x06 R\x7F\x14\x14\xAFv$q9\xFA\x9E\x8F\xEF\x8B9:>\x03\"~\xE3\xA6\xFE\xDB\x1EU\xF5\xDB\x82\xCB#Rx*a\x06@R\x7F,x\x95\xA6\x8D/\xAB[+\xCEMw\x03\xDA\xEB\xF9\x01\x1Ec\xD6u\xBCh\x98\xC7\xF0`\x87\xD6\xD8=\x99a\x06`R\x7F\x16:\x01J\x9D}_X\xE27\x05\x1C\xED~\xA6\0\x0Bw\xEF\x87\x9A\x19\xDD^P\x08p\x82dt\x1A\xBCa\x06\x80R\x7F,\xED\xA3\x04\x1DOK\x0F\xC2'\xD8\x03\t>;{g\x134.v w\x1B+\x04i\x98\xDB\xF7#\x8Ea\x06\xA0R\x7F\x11\xD1\xE9J\x17\xE4\x9D\xDF\xAB\x99\xCD\t\x0BD #\xF6(\x80\xD7\x0E\x12\x98\xB3\x056%\xAA3X\xE1\x91a\x06\xC0R\x7F\x0C$\xF43e0d\x9F6\xCF\x04\xB1\x9F}\xAD\rm\x80\xB0\xEE\x9Cw(W\xA4\x89\xD4\xFD\xF80]Fa\x06\xE0R\x7F\t\xA78\x1B<\x06\x8B4\xF0\x80\xDC\xB4Nu\xBA\xFD\x84\x18\xDF7(\xE9\xCF\xF5v\xEB\xBA!:\xEA\xEEGa\x07\0R\x7F\x019+\xEE]K\x96v\xD0x\xC1!\xC4\xF3\x03\x19\x80*B<>\x91\xE1\xA6\xD4\xB7(\xF3V&Jua\x07 R\x7F&\xCEd\xA9[1\xC0M\xB0\xD3\x89R\xF7\xD5\x16%\x1Fg\xFC\x97\xCD\xD2\x88\xB5\xCA2\xC0\x9F\xE0\xF5\xFAba\x07@R\x7F\x17\xE3~\xADX\xBCZ\xCF-]\xB4i\xC4\x1B\xED\x12\xC1\x03\x124\xBBzh\x17\xD45\xF84\x04\xEAq\xF8a\x07`R~\\\x8CV\xB3\xC8\xE9\xDF\x1C\xF0\xCB\x1D;V>\x8Dt\xBFl!\x89\xB9\xE8^y\x1E*I\xA3\xBD\xC2\x08a\x07\x80R\x7F\x0Cg\x7F\xAC6g=5\xC8\xD8\x0E\x99(\xF4\x08e\xD8\"\x9A\xF7\xEB\x87\x88L[A\xD1y\xDA\x8F\xB8\0a\x07\xA0R\x7F\x12#\xFCR\x8EIp\xAB\x8F\x92\xF9:=\x0E/]\xF1b\xFA\xAE\x13Inq\xEA\xE1@I\xE6\x82\x8Ava\x07\xC0R\x7F\x03B\xD8\xF2\xE5\xE1q\xE7%\xB0z\xA2\xB9\x03\x9A9[\x90\xF2\xE8j\xCC\x9B:5'pT\x92\x7Fv\x8Ea\x07\xE0R~\xF1iF3\xAFTT\x17\xA1\x17%\x19\xCA\x9D\x98\xEA\xDA\xD9(7e\x890\xD2\">(\xCB\xA7\x9B\x10a\x08\0R\x7F\x05\xEES\xA4\x007\x1A\xE8K\x7F\xC1!\xA5\xB3-\xFEV\n82[\x8Cw$\0\xF5,%[u\xD8\xABa\x08 R\x7F\x14\xEA\x1A\xEF`H\xC9\xB4\xE9\x01\xF7\xD8o\x12\x9F\xC6[\x85\xFCQ\xFC\xC1\xE2\xC2\t4{\x1A\x14af\xFBa\x08@R\x7F\x0Bj\x94\xFE\xDC\xF0\xA3\xE0\xB9\x885\xBF\xA8\xA3\xE3\x06\xE9\xB3\xB2PXh\x03\xE0\xF3\x05\xB2\xB6\x95\xD4G\xBAa\x08`R\x7F\x16.\xBD/\x85d\xF4\xAA\x0BW\0\xB1\x13\x1D\x90\xF7x\x11Cp\xA3^\xF4)S+\xCB\\n\rl;a\x08\x80R\x7F\nGN\xF9\xA3\x8Es\xC8\x9D\xC1\xDFt\x8CG\xFB\xD4\xE8|\x18Y\x98\x10\x05\x05\xB6\xF6\xC7\xFF\x92o\x88Sa\x08\xA0R\x7F-\x19\xDE6Z\xDC\xCD\xAD\x89\x84\xAAWW(\xF7|\x92\x8A\x93\x97\xF2\xA4\xD5_u)\xFEX=So-a\x08\xC0R\x7F\x0C\xCC\xB0\x1D\xAF\"w\x02\x97\x14\x9C\xEB\xEC\xB8F\x166\xAC\xDDjT;\x93y#\xAA\xFD\x9Dy\xBCA\xEBa\x08\xE0R\x7F$6@\x03\xA0c\xCCb\x02\xC4\x86\x8F\xCF#\xFF\xA6\xCB\xAF\xC7\xBD\xB4\x82\xFC\xE5\xF1\x8B,\x0B\xCF=WVa\t\0R\x7F\x14\x0F11\xA3\xBC9\x17\x86\xE8^e\xFC\x95\xCB\x84\x8B9Q2a\t`R\x7F\x1Cy\x05\\#\x19\xD2|V\x06\x17,.\x06\xF27c\xEA\xB5+\xCF\xEAiw\xB3Hg\x80\x0F\t@Ra\t\x80R\x7F#\xFD\x1Db|\xAF\x9Cf\x87f>\xD6\xB1-\rR6\xE1\xF0\x1C\x0C\xFB^D\x84_\xA7r\xFFxF'a\t\xA0R`\0a\t\xC0\x81\x90Ra\t\xE0\x81\x90R\x7F&\x0E\x01\xB2Q\xF6\xF1\xC7\xE7\xFFNX\x07\x91\xDE\xE8\xEAQ\xD8z5\x8E\x03\x8BN\xFE0\xFA\xC0\x93\x83\xC1a\n\0R\x7F\x01\x18\xC4\xD5\xB87\xBC\xC2\xBC\x89\xB5\xB3\x98\xB5\x97N\x9FYD\x07;2\x07\x8B~#\x1F\xEC\x93\x88\x83\xB0a\n R\x7F\x04\xFCci\xF7\x11\x0F\xE3\xD2QV\xC1\xBB\x9Ar\x85\x9C\xF2\xA0FA\xF9\x9B\xA4\xEEA<\x80\xDAj_\xE4a\n@R\x7F\"\xFE\xBD\xA3\xC0\xC0c*VG[B\x14\xE5a^\x11\xE6\xDD?\x96\xE6\xCE\xA2\x85J\x87\xD4\xDA\xCC^Ua\n`R\x7F$L\xF0\x10\xC4<\xA8r7\xD8\xB0\x0B\xF9\xDDP\xC4\xC0\x1C\x7F\x08k\xD4\xE8\xC9 \xE7RQ\xD9o\r\"a4\0Ra\x03\xA0Q\x82\x81\x14a\x08\x84W`@Qcvg\xDC\x9B`\xE0\x1B\x81R`\x04\x81\x01\x82\x90R`$\x81\x01\x84\x90R`D\x01`@Q\x80\x91\x03\x90\xFD[\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDG\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01`$`\x045\x01\x82\x815\x06a\x12 R\x82` \x82\x015\x06a\x12\0R\x82`@\x82\x015\x06a\x12`R\x82``\x82\x015\x06a\x12@R\x82`\x80\x82\x015\x06a\x12\xA0R\x82`\xA0\x82\x015\x06a\x12\x80R\x82`\xC0\x82\x015\x06a\x12\xE0R\x82`\xE0\x82\x015\x06a\x12\xC0R\x82a\x01\0\x82\x015\x06a\x13 R\x82a\x01 \x82\x015\x06a\x13\0R\x82a\x01@\x82\x015\x06a\x13`R\x82a\x01`\x82\x015\x06a\x13@R\x82a\x01\x80\x82\x015\x06a\x13\xA0R\x82a\x01\xA0\x82\x015\x06a\x13\x80R\x82a\x01\xC0\x82\x015\x06a\x13\xE0R\x82a\x01\xE0\x82\x015\x06a\x13\xC0R\x82a\x02\0\x82\x015\x06a\x14 R\x82a\x02 \x82\x015\x06a\x14\0R\x82a\x02@\x82\x015\x06a\x14`R\x82a\x02`\x82\x015\x06a\x14@R\x82a\x02\x80\x82\x015\x06a\x14\xA0R\x82a\x02\xA0\x82\x015\x06a\x14\x80R\x81a\x02\xC0\x82\x015\x06a\x16\0R\x81a\x02\xE0\x82\x015\x06a\x16 R\x81a\x03\0\x82\x015\x06a\x16@R\x81a\x03 \x82\x015\x06a\x16`R\x81a\x03@\x82\x015\x06a\x16\x80R\x81a\x03`\x82\x015\x06a\x16\xA0R\x81a\x03\x80\x82\x015\x06a\x16\xC0R\x81a\x03\xA0\x82\x015\x06a\x16\xE0R\x81a\x03\xC0\x82\x015\x06a\x17\0R\x81a\x03\xE0\x82\x015\x06a\x17 R\x81a\x04\0\x82\x015\x06a\x17@R\x81a\x04 \x82\x015\x06a\x17`R\x81a\x04@\x82\x015\x06a\x17\x80R\x81a\x04`\x82\x015\x06a\x17\xA0R\x81a\x04\x80\x82\x015\x06a\x17\xC0R\x81a\x04\xA0\x82\x015\x06a\x17\xE0R\x81a\x04\xC0\x82\x015\x06a\x18\0R\x81a\x04\xE0\x82\x015\x06a\x19`R\x81a\x05\0\x82\x015\x06a\x19\x80R\x81a\x05 \x82\x015\x06a\x19\xA0R\x81a\x05@\x82\x015\x06a\x19\xC0R\x81a\x05`\x82\x015\x06a\x18@R\x81a\x05\x80\x82\x015\x06a\x18`R\x81a\x05\xA0\x82\x015\x06a\x18\x80R\x81a\x05\xC0\x82\x015\x06a\x18\xA0R\x81a\x05\xE0\x82\x015\x06a\x18\xC0R\x81a\x06\0\x82\x015\x06a\x18\xE0R\x81a\x06 \x82\x015\x06a\x19\0R\x81a\x06@\x82\x015\x06a\x19 R\x81a\x06`\x82\x015\x06a\x19@R\x81a\x06\x80\x82\x015\x06a\x19\xE0R\x81a\x06\xA0\x82\x015\x06a \0R\x81a\x06\xC0\x82\x015\x06a R\x81a\x06\xE0\x82\x015\x06a @R\x81a\x07\0\x82\x015\x06a `R\x81a\x07 \x82\x015\x06a \x80R\x81a\x07@\x82\x015\x06a \xA0R\x81a\x07`\x82\x015\x06a \xC0R\x81a\x07\x80\x82\x015\x06a \xE0R\x81a\x07\xA0\x82\x015\x06a!\0R\x81a\x07\xC0\x82\x015\x06a! R\x82a\x07\xE0\x82\x015\x06a# R\x82a\x08\0\x82\x015\x06a#\0R\x82a\x08 \x82\x015\x06a#`R\x82a\x08@\x82\x015\x06a#@RPa\t\xC0Q\x15a\x0C\xE6W`$\x805\x01\x80a\t\xE0Q`\x05\x1B\x01\x90P\x805` \x82\x015`D\x1B\x81\x01\x90P`@\x82\x015`\x88\x1B\x81\x01\x90P``\x82\x015`\xCC\x1B\x81\x01\x90P`\x80\x82\x015`\xA0\x83\x015`D\x1B\x81\x01\x90P`\xC0\x83\x015`\x88\x1B\x81\x01\x90P`\xE0\x83\x015`\xCC\x1B\x81\x01\x90Pa\x01\0\x83\x015a\x01 \x84\x015`D\x1B\x81\x01\x90Pa\x01@\x84\x015`\x88\x1B\x81\x01\x90Pa\x01`\x84\x015`\xCC\x1B\x81\x01\x90Pa\x01\x80\x84\x015a\x01\xA0\x85\x015`D\x1B\x81\x01\x90Pa\x01\xC0\x85\x015`\x88\x1B\x81\x01\x90Pa\x01\xE0\x85\x015`\xCC\x1B\x81\x01\x90P\x83a5\0R\x82a5 R\x81a5@R\x80a5`R\x86\x81\x10\x87\x84\x10\x16\x87\x83\x10\x88\x86\x10\x16\x16a\x0C\xE0Wcu\xD4\xFAS`\xE1\x1B`\0R`\x04`\0\xFD[PPPPP[a\x03\x80Q`\xE0\x1B`\0Ra\x03\xA0Q`\xE0\x1B`\x04R`\x08`\0 \x80a5\x80R`$\x805\x01` a\x03\xA0Q\x02\x80\x82` a5\x80\x017`\x045`$\x01\x91P`\xC0\x82a5\xA0\x83\x017`\xE0\x01a5\x80 \x83\x81\x06a&`\x81\x90R\x90\x92P\x90P\x82\x81\x80\ta&\x80R\x82\x81a&\x80Q\ta&\xA0RP\x80`\0Ra\x12\xE0Q` Ra\x12\xC0Q`@Ra\x13 Q``Ra\x13\0Q`\x80R`\xA0`\0 \x90P\x81\x81\x06a&\0R\x80`\0R`\x01` SP`!`\0\x90\x81 \x82\x81\x06a& R\x81Ra\x13`Q` Ra\x13@Q`@Ra\x13\xA0Q``Ra\x13\x80Q`\x80R`\xA0\x90 \x81\x81\x06a&@\x81\x90R\x82\x81\x80\ta4 R\x82\x81a4 Q\ta4@R\x82\x81a4@Q\ta4`R\x80a4\x80RP\x80`\0Ra\x13\xE0Q` Ra\x13\xC0Q`@Ra\x14 Q``Ra\x14\0Q`\x80Ra\x14`Q`\xA0Ra\x14@Q`\xC0Ra\x14\xA0Q`\xE0Ra\x14\x80Qa\x01\0Ra\x01 `\0 \x90P\x81\x81\x06a&\xC0R\x80a&\xE0RPa&\0Qa& Qa\x03\xC0Q`\x01\x80\x85`\x01`$\x805\x01` a\x03\xA0Q\x02\x81\x01\x83`\x05\x8A\t\x84`\x0C\x8B\t\x99P[\x81\x83\x10\x15a\x0E\xA6W\x825\x85\x81\x10\x85\x16\x94P\x85\x8A\x82\x08\x90P\x85\x81\x83\x01\x89\t\x97P\x85\x81\x8C\x01\x88\t\x96PP\x84\x88\x82\t\x90P\x84\x88\x8B\t\x99P` \x83\x01\x92Pa\x0EgV[PPP\x80a\x0E\xBFWc7J\x97/`\xE0\x1B`\0R`\x04`\0\xFD[PP\x81a0\0R\x80a0 RPPPPP\x80\x81`\x01a&\0Q\x08a& Q\t\x80a\x03\x80Q`\x01[\x81\x81\x10\x15a\x0E\xFBW\x84\x83\x84\t\x92P\x80\x01a\x0E\xE6V[PPa1\0R\x81\x81\x80\t\x90P\x81\x81\x82\ta1 RPa&\xC0Qa\x03\x80Q\x81\x90`\x01[\x81\x81\x10\x15a\x0F2W\x84\x83\x84\t\x92P\x80\x01a\x0F\x1DV[PP\x80a0@R\x82`\x01\x84\x03\x82\x08\x90Pa4\0Q\x80\x84\x03a\x03\xE0Q\x85\x82\x86\x08\x86\x84\x84\t\x92P\x86\x87\x84\x88\x08\x82\t\x90P\x86\x84\x84\t\x92P\x86\x87\x84\x88\x08\x82\t\x90P\x86\x87\x88\x86\x86\t\x88\x08\x82\t\x90Pa\x03\xC0Q\x92P\x86\x82\x86\t\x91P\x86`\x01\x88\x03\x87\x08\x87\x84\x85\t\x94P\x87`\x01\x89\x03\x89\x89\x8B\x88\x8D\x8B\x8C\t\t\t\x08\x96Pa0 Q\x94P\x84\x93P\x87\x82\x86\t\x94P\x84\x88\x87\x87\t\x95P\x85\x89\x83\x88\t\x96P\x86\x8Aa1 Q\x89\t\x97P\x87` `\0R` \x80R` `@R\x8B\x8B\x8A\t``R`\x02\x8C\x03`\x80R\x8B`\xA0R` `\0`\xC0`\0`\x05Z\xFAa\x10\x0FWc>%)\xEF`\xE2\x1B`\0R`\x04`\0\xFD[`\0Q\x98P\x8B\x81\x8A\t\x90P\x8B\x8B\x8A\t\x98P\x8B\x82\x8A\t\x91P\x8Ba1 Q\x8A\t\x98P\x8B\x83\x8A\t\x92P\x8B\x85\x8A\t\x98P\x8B\x84\x8A\t\x93P\x8B\x8A\x8A\t\x98P\x8B\x88\x8A\t\x97P\x8B\x86\x8A\t\x98P\x8Ba0 Q\x8D\x8B\x8C\t\t\x98P\x8B\x89a0\0Q\ta0`R\x8B\x88\x8B\ta0\x80R\x8B\x84\x87\ta7\x80R\x8B\x83\x88\ta0\xA0R\x8B\x82a1\0Q\ta1@R\x8B\x81\x88\ta0\xC0RPPPPPPPPPPPa&@QPa&\0Qa& Q\x82\x83a\x19\0Q\x84\t\x82a\x16 Q\x01\x01\x84a\x18\xE0Q\x85\t\x83a\x16\0Q\x01\x01\t\x83\x84a\x19@Q\x85\t\x83a\x16`Q\x01\x01\x85a\x19 Q\x86\t\x84a\x16@Q\x01\x01\t\x84\x85\x86\x83\x85\ta\x16\xA0Q\ta4\x80Q\t\x85\x86a\x19\x80Q\x87\t\x85a\x16 Q\x01\x01\x87a\x19`Q\x88\t\x86a\x16\0Q\x01\x01\t\x92P\x85\x86a\x19\xC0Q\x87\t\x85a\x16`Q\x01\x01\x87a\x19\xA0Q\x88\t\x86a\x16@Q\x01\x01\t\x91P\x85\x86\x87\x88\x85\x87\ta \x80Q\ta4\x80Q\t\x87\x03\x82\x08\x90P\x85a&@Qa4\x80Q\ta4\x80R\x85\x86\x87\x88a0`Q\x8A\x03a \x80Q\x08a0\xC0Q\ta4\x80Q\t\x82\x08\x90P\x85a&@Qa4\x80Q\ta4\x80R\x85\x86\x87\x88`\x01\x8A\x03a\x16\xA0Q\x08a0\xA0Q\ta4\x80Q\t\x82\x08a6\0RPPPPP\x80a&@Qa4\x80Q\ta4\x80R\x80a\x17 Qa&`Q\t\x81\x82\x83a Qa\x17\x80Q\ta\x16@Q\x08\x82\x08\x90P\x81a&`Q\x82\t\x90P\x81\x82\x83a \0Qa\x17`Q\ta\x16 Q\x08\x82\x08\x90P\x81a&`Q\x82\t\x90P\x81\x82\x83a\x19\xE0Qa\x17\0Q\ta\x16\0Q\x08\x82\x08\x90P\x81a\x18@Q\x83\x84a&`Qa\x18`Q\t\x85\x86a&\x80Qa\x18\x80Q\t\x87a&\xA0Qa\x18\xA0Q\t\x08\x08\x08\x82a \xC0Q\x84\x85a&`Qa \xE0Q\t\x86\x87a&\x80Qa!\0Q\t\x88a&\xA0Qa! Q\t\x08\x08\x08\x83\x84`\x01a&\0Q\x08a& Q\t\x84a& Q\x86a\x18\xC0Q\x87\t\x08\x93P\x84\x81\x86\x87a&\0Q\x86\t\x86\x08\x08\x92P\x84\x83\x85\t\x93P\x84\x85`\x01a&\0Q\x08\x85\t\x93P\x84a0\xA0Qa&@Q\t\x92P\x84\x83\x85\x08\x93P\x84a\x16\xC0Q\x85\t\x93P\x84\x83\x86\x03\x85\x08\x93P\x84\x81\x86\x87a&\0Qa `Q\ta\x16\x80Q\x08\x08\x92PPP\x82a0\xC0Qa4 Q\t\x83\x81\x85\x03\x83\x08\x91P\x83a \xA0Q\x83\t\x91P\x83\x84a1@Q\x83\t\x83\x08\x91PP\x82a4\x80Q\x84\x83\x86\x03\x85\x08\ta6 RPP\x80a4@Qa4\x80Q\ta4\x80R\x80a\x16\xE0Qa\x16\0Q\t\x81a\x17\0Qa\x16 Q\t\x82a\x17 Qa\x16@Q\t\x83a\x17@Qa\x16`Q\t\x84\x7F\x182'9p\x98\xD0\x14\xDC(\"\xDB@\xC0\xAC.\x94\x19\xF4$<\xDC\xB8H\xA1\xF0\xFA\xC9\xF8\0\0\0\x86\x87`\x03\x89\x03a\x17\xA0Q\x08\x88a\x17`Q\x8Aa\x16 Qa\x16\0Q\t\t\t\t\x85\x86\x87\x88\x89\x85\x8A\x08\x88\x08\x86\x08\x84\x08a\x17\x80Q\x08\x94PPPPP\x81\x82\x83\x84\x85a\x16`Qa\x16\0Q\x08a\x19\xE0Q\x87\x03\x08a\x17`Q\x08\x84`\x02\x86\x03a\x17\xA0Q\x08\ta&@Q\t\x82\x83\x84\x85\x86\x85a @Q\x08\x87`\x01\x89\x03a\x17\xA0Q\x08\t\x85\x08a\x17\xA0Q\ta4\x80Q\ta6@RPP\x80a4 Qa4\x80Q\ta4\x80R`\x02\x81\x03`\x03\x82\x03\x82a\x16\0Q\x84\x03a\x16 Q\x08\x83a\x16 Q\x85\x03a\x16@Q\x08\x84a\x16@Q\x86\x03a\x16`Q\x08\x85a\x16`Q\x87\x03a\x19\xE0Q\x08\x86a4\x80Q\x88\x89\x88\x88\x08\x8A\x8B\x8B\x8A\x08\x8C\x8A\x8E\x03\x8E\x8C\x8D\t\x08\t\t\t\x93P\x86\x87\x88a&@Qa4\x80Q\t\x89\x8A\x89\x88\x08\x8B\x8C\x8C\x8A\x08\x8D\x8A\x8F\x03\x8F\x8C\x8D\t\x08\t\t\t\x85\x08\x93P\x86\x87\x88a4 Qa4\x80Q\t\x89\x8A\x89\x87\x08\x8B\x8C\x8C\x89\x08\x8D\x89\x8F\x03\x8F\x8B\x8C\t\x08\t\t\t\x85\x08\x93P\x86\x87\x88a4@Qa4\x80Q\t\x89\x8A\x89\x86\x08\x8B\x8C\x8C\x88\x08\x8D\x88\x8F\x03\x8F\x8A\x8B\t\x08\t\t\t\x85\x08\x93PPPP\x83a\x17\xC0Q\x82\ta6`RPPa4`Qa4\x80Q\x83\x92P\ta4\x80R\x80a\x17 Q\x82\x83a\x16 Q\x85a \0Qa \0Q\x08\x08\x84a\x16 Qa\x19\xE0Q\x87\x03\t\t\t\x81a\x19\xE0Qa\x19\xE0Q\t\x82\x83a\x16 Q\x85\x03a \0Q\x08\x82\t\x90P\x82a\x17@Q\x82\t\x90P\x82a\x19\xE0Qa\x19\xE0Q\t\x83a\x19\xE0Q\x82\t\x90P\x83\x84\x85a\x16 Qa \0Q\x08\x86a\x16 Qa\x16 Q\t\t\x82\x08\x90P\x83\x84\x85a\x16@Qa\x16@Q\t\x86a @Qa @Q\t\x08\x85\x03\x82\x08\x90P\x83a\x16@Qa @Q\t\x84\x81\x82\x08\x90P\x84a\x16\xE0Q\x82\t\x90P\x84\x85\x83\x83\x08\x86\x85\x87\x08\x08\x92P\x84a4\x80Q\x84\t\x92P\x84\x85a\x16@Qa Q\x08\x86a\x17 Qa\x19\xE0Q\t\t\x93P\x84\x85a \0Q\x87\x03a\x16 Q\x08\x86a\x16\xE0Qa @Q\t\t\x85\x03\x90P\x84\x85\x86a \0Q\x88\x03a\x16 Q\x08a\x16@Q\t\x86\x87a\x16@Qa Q\x08a\x16 Q\t\x87\x03\x08\x91P\x84\x85a&@Qa4\x80Q\t\x86\x84\x88\x85\x89\x08\x08\t\x93PPP\x82a\x17\xE0Q\x84\x84\x84\x08\ta6\x80RPP\x80a4`Qa4\x80Q\ta4\x80R\x80\x81a\x16 Qa\x19\xE0Q\t\x82a \0Qa\x16\0Q\t\x08\x81a Q\x83\x03\x83\x84a\x16@Qa\x16 Q\t\x85a\x16`Qa\x16\0Q\t\x08\x08\x82`\x01`D\x1B\x82\t\x90P\x82a @Q\x84\x03\x82\x08\x90P\x82\x82\x82\x08\x90P\x82a\x17@Q\x82\t\x90P\x82`\x01`D\x1B\x83\t\x91P\x82\x83a \0Qa\x19\xE0Q\t\x83\x08\x91P\x82a\x17 Q\x84\x85a\x16`Qa\x16@Q\x08\x86\x03\x85\x08\t\x83a\x17`Q\x85\x86a @Qa Q\x08\x87\x03\x87a\x16`Q\x88\x08\x08\t\x92P\x83a\x17\0Q\x85\x85\x87\x86\x86\x08\x08\ta6\xC0RPPa \0Q\x82\x91Pa@\0\x90\t\x81a\x19\xE0Q\x82\x08\x90P\x81a@\0\x82\t\x90P\x81a\x16@Q\x82\x08\x90P\x81a@\0\x82\t\x90P\x81a\x16 Q\x82\x08\x90P\x81a@\0\x82\t\x90P\x81a\x16\0Q\x82\x08\x90P\x81a\x16`Q\x83\x03\x82\x08\x90P\x81a\x17@Q\x82\t\x90P\x81a@\0a Q\t\x82a \0Q\x82\x08\x90P\x82a@\0\x82\t\x90P\x82a\x19\xE0Q\x82\x08\x90P\x82a@\0\x82\t\x90P\x82a\x16`Q\x82\x08\x90P\x82a@\0\x82\t\x90P\x82a\x16@Q\x82\x08\x90P\x82a @Q\x84\x03\x82\x08\x90P\x82a\x17`Q\x82\t\x90P\x82a\x17 Q\x84\x83\x85\x08\ta6\xE0RPP\x80a&`Qa\x16@Q\t\x81a\x16 Q\x82\x08\x90P\x81a&`Q\x82\t\x90P\x81a\x16\0Q\x82\x08\x90P\x81a&`Q\x82\t\x90P\x81a\x17\x80Q\x82\x08\x90P\x80\x82a\x16`Q\x84\x03\x83\x08\x91P\x81a7@R\x82a\x16\0Q\x84\x03a\x19\xE0Q\x08\x83a\x16`Q\x85\x03a @Q\x08\x84\x85`\x01\x87\x03\x84\x08\x83\t\x85\x86\x84\x88\x03`\x01\x08\x83\t\x91P\x85\x85\x87a&@Q\x89\x85\x8Ba&@Q\x89\t\x08\t\x08a7 R\x85a&`Qa Q\t\x94P\x85a \0Q\x86\x08\x94P\x85a&`Q\x86\t\x94P\x85a\x19\xE0Q\x86\x08\x94P\x85a&`Q\x86\t\x94P\x85\x85\x87\x03a @Q\x08\x94P\x85a\x16@Q\x87\x03a Q\x08\x91P\x85\x86\x87\x87\x89\x03`\x01\x08\x84\t\x87\x85\x89\x03`\x01\x08\t\x91P\x85\x84\x87\x03a\x16`Q\x08\x86\x87`\x01\x89\x03\x83\x08\x82\t\x90P\x86\x87`\x01\x89\x03\x88\x08\x87\t\x95P\x86a&@Q\x84\t\x92P\x86\x82\x84\x08\x92P\x86a&@Q\x84\t\x92P\x86\x86\x84\x08\x92P\x86a&@Q\x84\t\x92P\x86\x81\x84\x08\x92PP\x81a7\0RPP\x83a\x16 Q\x85\x03a \0Q\x08\x92P\x83a\x16@Q\x85\x03\x85\x86\x84\x88\x03`\x01\x08\x86\t\x08\x92P\x83a\x17\0Qa7 Q\t\x91P\x83\x84a\x17@Q\x85\t\x83\x08\x91P\x83\x84a\x17`Qa7@Q\t\x83\x08\x91P\x83a\x16\xE0Q\x83\t\x91P\x83\x84a\x17\xA0Qa7\0Q\t\x83\x08\x91P\x83a6\xC0Q\x83\x08\x92P\x83a6\xE0Q\x84\x08\x92P\x83a\x18\0Q\x84\t\x92P\x83a4\x80Q\x84\t\x92P\x82a6\xA0R\x83a4@Qa4\x80Q\ta4\x80RPPP\x80a7\x80Q\x82a6\xA0Q\x84a6\x80Q\x86a6`Q\x88a6@Q\x8Aa6 Qa6\0Q\x08\x08\x08\x08\x08\ta7`\x81\x90Ra&\xE0Qa7\xA0\x81\x90Ra7\xC0\x91\x90\x91Ra\x02\xE4`\x045\x01a\x05 \x81a7\xE07PPa\x05`a7\xA0 \x81\x81\x06a'\0R`\0\x81\x90R`\x01` S\x81`!`\0 \x06a' R`\x02` S\x81`!`\0 \x06a'@R`\x03` S\x81`!`\0 \x06a'`R`\x04` S\x81`!`\0 \x06a'\x80R`\x05` S\x81`!`\0 \x06a'\xA0R`\x06` S\x81`!`\0 \x06a'\xC0R`\x07` S\x81`!`\0 \x06a'\xE0R`\x08` S\x81`!`\0 \x06a(\0R`\t` S\x81`!`\0 \x06a( R`\n` S\x81`!`\0 \x06a(@R`\x0B` S\x81`!`\0 \x06a(`R`\x0C` S\x81`!`\0 \x06a(\x80R`\r` S\x81`!`\0 \x06a(\xA0R`\x0E` S\x81`!`\0 \x06a(\xC0R`\x0F` S\x81`!`\0 \x06a(\xE0R`\x10` S\x81`!`\0 \x06a)\0R`\x11` S\x81`!`\0 \x06a) R`\x12` S\x81`!`\0 \x06a)@R`\x13` S\x81`!`\0 \x06a)`R`\x14` S\x81`!`\0 \x06a)\x80R`\x15` S\x81`!`\0 \x06a)\xA0R`\x16` S\x81`!`\0 \x06a)\xC0R`\x17` S\x81`!`\0 \x06a)\xE0R`\x18` S\x81`!`\0 \x06a*\0R`\x19` S\x81`!`\0 \x06a* R`\x1A` S\x81`!`\0 \x06a*@R`\x1B` S\x81`!`\0 \x06a*`R`\x1C` S\x81`!`\0 \x06a*\x80R`\x1D` S\x81`!`\0 \x06a*\xA0R`\x1D` SP`!`\0\x90\x81 \x82\x81\x06a*\xC0R\x81Ra# Q` Ra#\0Q`@Ra#`Q``Ra#@Q`\x80R`\xA0\x81 \x82\x90\x06a+\0Ra\x13\xC0Qa\x13\xE0Q\x84\x82\x80\t\x85`\x03\x87\x83\x86\t\x08\x86\x83\x84\t\x14\x93PP\x81a1`R\x80` a1`\x01RPPa\x14\0Qa\x14 Q\x84\x82\x83\t\x85`\x03\x87\x83\x86\t\x08\x86\x83\x84\t\x14\x84\x16\x93PP\x81`\0R\x80` RPPa0@Q`@R`@a1\xA0```\0`\x07Z\xFA\x16`@a1``\x80\x81`\x06Z\xFA\x81\x16\x90Pa\x14@Qa\x14`Q\x84\x82\x83\t\x85`\x03\x87\x83\x86\t\x08\x86\x83\x84\t\x14\x84\x16\x93PP\x81`\0R\x80` RPP\x81a0@Qa0@Q\t`@R`@a1\xA0```\0`\x07Z\xFA\x16`@a1``\x80\x81`\x06Z\xFA\x81\x16\x90Pa\x14\x80Qa\x14\xA0Q\x84\x82\x83\t\x85`\x03\x87\x83\x86\t\x08\x86\x83\x84\t\x14\x84\x16\x93PP\x81`\0R\x80` RPP\x81a0@Q\x83a0@Qa0@Q\t\t`@R`@a1\xA0```\0`\x07Z\xFA\x16`@a1``\x80\x81`\x06Z\xFA\x81\x16\x90Pa\x12\0Qa\x12 Q\x84\x82\x83\t\x85`\x03\x87\x83\x86\t\x08\x86\x83\x84\t\x14\x84\x16\x93PP\x81`\0R\x80` RPP\x81a'\0Q\x83`\x01a+\0Q\x08\t`@R`@a1\xA0```\0`\x07Z\xFA\x16`@a1``\x80\x81`\x06Z\xFA\x81\x16\x90Pa\x12@Qa\x12`Q\x84\x82\x83\t\x85`\x03\x87\x83\x86\t\x08\x86\x83\x84\t\x14\x84\x16\x93PP\x81`\0R\x80` RPP\x81a' Q\x83`\x01a+\0Q\x08\t`@R`@a1\xA0```\0`\x07Z\xFA\x16`@a1``\x80\x81`\x06Z\xFA\x81\x16\x90Pa\x12\x80Qa\x12\xA0Q\x84\x82\x83\t\x85`\x03\x87\x83\x86\t\x08\x86\x83\x84\t\x14\x84\x16\x93PP\x81`\0R\x80` RPP\x81a'@Q\x83`\x01a+\0Q\x08\t`@R`@a1\xA0```\0`\x07Z\xFA\x16`@a1``\x80\x81`\x06Z\xFA\x81\x16\x90Pa\x12\xC0Qa\x12\xE0Q\x84\x82\x83\t\x85`\x03\x87\x83\x86\t\x08\x86\x83\x84\t\x14\x84\x16\x93PP\x81`\0R\x80` RPP\x81a'`Q\x83`\x01a+\0Q\x08\t`@R`@a1\xA0```\0`\x07Z\xFA\x16`@a1``\x80\x81`\x06Z\xFA\x81\x16\x90Pa\x13\0Qa\x13 Q\x84\x82\x83\t\x85`\x03\x87\x83\x86\t\x08\x86\x83\x84\t\x14\x84\x16\x93PP\x81`\0R\x80` RPP\x81a'\x80Q\x83`\x01a+\0Q\x08\t`@R`@a1\xA0```\0`\x07Z\xFA\x16`@a1``\x80\x81`\x06Z\xFA\x81\x16\x90Pa\x13@Qa\x13`Q\x84\x82\x83\t\x85`\x03\x87\x83\x86\t\x08\x86\x83\x84\t\x14\x84\x16\x93PP\x81`\0R\x80` RPP\x81a'\xA0Q\x83`\x01a+\0Q\x08\t`@R`@a1\xA0```\0`\x07Z\xFA\x16`@a1``\x80\x81`\x06Z\xFA\x81\x16\x90Pa\x13\x80Qa\x13\xA0Q\x84\x82\x83\t\x85`\x03\x87\x83\x86\t\x08\x86\x83\x84\t\x14\x84\x16\x93PP\x81`\0R\x80` RPP\x81a'\xC0Q\x83`\x01a+\0Q\x08\t`@R`@a1\xA0```\0`\x07Z\xFA\x16`@a1``\x80\x81`\x06Z\xFA\x81\x16\x90Pa\x04\0Qa\x04 Q\x84\x82\x83\t\x85`\x03\x87\x83\x86\t\x08\x86\x83\x84\t\x14\x84\x16\x93PP\x81`\0R\x80` RPPa'\xE0Q`@R`@a1\xA0```\0`\x07Z\xFA\x16`@a1``\x80\x81`\x06Z\xFA\x81\x16\x90Pa\x04@Qa\x04`Q\x84\x82\x83\t\x85`\x03\x87\x83\x86\t\x08\x86\x83\x84\t\x14\x84\x16\x93PP\x81`\0R\x80` RPPa(\0Q`@R`@a1\xA0```\0`\x07Z\xFA\x16`@a1``\x80\x81`\x06Z\xFA\x81\x16\x90Pa\x04\x80Qa\x04\xA0Q\x84\x82\x83\t\x85`\x03\x87\x83\x86\t\x08\x86\x83\x84\t\x14\x84\x16\x93PP\x81`\0R\x80` RPPa( Q`@R`@a1\xA0```\0`\x07Z\xFA\x16`@a1``\x80\x81`\x06Z\xFA\x81\x16\x90Pa\x04\xC0Qa\x04\xE0Q\x84\x82\x83\t\x85`\x03\x87\x83\x86\t\x08\x86\x83\x84\t\x14\x84\x16\x93PP\x81`\0R\x80` RPPa(@Q`@R`@a1\xA0```\0`\x07Z\xFA\x16`@a1``\x80\x81`\x06Z\xFA\x81\x16\x90Pa\x05\0Qa\x05 Q\x84\x82\x83\t\x85`\x03\x87\x83\x86\t\x08\x86\x83\x84\t\x14\x84\x16\x93PP\x81`\0R\x80` RPPa(`Q`@R`@a1\xA0```\0`\x07Z\xFA\x16`@a1``\x80\x81`\x06Z\xFA\x81\x16\x90Pa\x05@Qa\x05`Q\x84\x82\x83\t\x85`\x03\x87\x83\x86\t\x08\x86\x83\x84\t\x14\x84\x16\x93PP\x81`\0R\x80` RPPa(\x80Q`@R`@a1\xA0```\0`\x07Z\xFA\x16`@a1``\x80\x81`\x06Z\xFA\x81\x16\x90Pa\x05\x80Qa\x05\xA0Q\x84\x82\x83\t\x85`\x03\x87\x83\x86\t\x08\x86\x83\x84\t\x14\x84\x16\x93PP\x81`\0R\x80` RPPa(\xA0Q`@R`@a1\xA0```\0`\x07Z\xFA\x16`@a1``\x80\x81`\x06Z\xFA\x81\x16\x90Pa\x05\xC0Qa\x05\xE0Q\x84\x82\x83\t\x85`\x03\x87\x83\x86\t\x08\x86\x83\x84\t\x14\x84\x16\x93PP\x81`\0R\x80` RPPa(\xC0Q`@R`@a1\xA0```\0`\x07Z\xFA\x16`@a1``\x80\x81`\x06Z\xFA\x81\x16\x90Pa\x06\0Qa\x06 Q\x84\x82\x83\t\x85`\x03\x87\x83\x86\t\x08\x86\x83\x84\t\x14\x84\x16\x93PP\x81`\0R\x80` RPPa(\xE0Q`@R`@a1\xA0```\0`\x07Z\xFA\x16`@a1``\x80\x81`\x06Z\xFA\x81\x16\x90Pa\x06@Qa\x06`Q\x84\x82\x83\t\x85`\x03\x87\x83\x86\t\x08\x86\x83\x84\t\x14\x84\x16\x93PP\x81`\0R\x80` RPPa)\0Q`@R`@a1\xA0```\0`\x07Z\xFA\x16`@a1``\x80\x81`\x06Z\xFA\x81\x16\x90Pa\x06\x80Qa\x06\xA0Q\x84\x82\x83\t\x85`\x03\x87\x83\x86\t\x08\x86\x83\x84\t\x14\x84\x16\x93PP\x81`\0R\x80` RPPa) Q`@R`@a1\xA0```\0`\x07Z\xFA\x16`@a1``\x80\x81`\x06Z\xFA\x81\x16\x90Pa\x06\xC0Qa\x06\xE0Q\x84\x82\x83\t\x85`\x03\x87\x83\x86\t\x08\x86\x83\x84\t\x14\x84\x16\x93PP\x81`\0R\x80` RPPa)@Q`@R`@a1\xA0```\0`\x07Z\xFA\x16`@a1``\x80\x81`\x06Z\xFA\x81\x16\x90Pa\x07\0Qa\x07 Q\x84\x82\x83\t\x85`\x03\x87\x83\x86\t\x08\x86\x83\x84\t\x14\x84\x16\x93PP\x81`\0R\x80` RPPa)`Q`@R`@a1\xA0```\0`\x07Z\xFA\x16`@a1``\x80\x81`\x06Z\xFA\x81\x16\x90Pa\x07@Qa\x07`Q\x84\x82\x83\t\x85`\x03\x87\x83\x86\t\x08\x86\x83\x84\t\x14\x84\x16\x93PP\x81`\0R\x80` RPPa)\x80Q`@R`@a1\xA0```\0`\x07Z\xFA\x16`@a1``\x80\x81`\x06Z\xFA\x81\x16\x90Pa\x07\x80Qa\x07\xA0Q\x84\x82\x83\t\x85`\x03\x87\x83\x86\t\x08\x86\x83\x84\t\x14\x84\x16\x93PP\x81`\0R\x80` RPP\x81a)\xA0Q\x83`\x01a+\0Q\x08\t`@R`@a1\xA0```\0`\x07Z\xFA\x16`@a1``\x80\x81`\x06Z\xFA\x81\x16\x90Pa\x07\xC0Qa\x07\xE0Q\x84\x82\x83\t\x85`\x03\x87\x83\x86\t\x08\x86\x83\x84\t\x14\x84\x16\x93PP\x81`\0R\x80` RPP\x81a)\xC0Q\x83`\x01a+\0Q\x08\t`@R`@a1\xA0```\0`\x07Z\xFA\x16`@a1``\x80\x81`\x06Z\xFA\x81\x16\x90Pa\x08\0Qa\x08 Q\x84\x82\x83\t\x85`\x03\x87\x83\x86\t\x08\x86\x83\x84\t\x14\x84\x16\x93PP\x81`\0R\x80` RPP\x81a)\xE0Q\x83`\x01a+\0Q\x08\t`@R`@a1\xA0```\0`\x07Z\xFA\x16`@a1``\x80\x81`\x06Z\xFA\x81\x16\x90Pa\x08@Qa\x08`Q\x84\x82\x83\t\x85`\x03\x87\x83\x86\t\x08\x86\x83\x84\t\x14\x84\x16\x93PP\x81`\0R\x80` RPP\x81a*\0Q\x83`\x01a+\0Q\x08\t`@R`@a1\xA0```\0`\x07Z\xFA\x16`@a1``\x80\x81`\x06Z\xFA\x81\x16\x90Pa\x08\x80Qa\x08\xA0Q\x84\x82\x83\t\x85`\x03\x87\x83\x86\t\x08\x86\x83\x84\t\x14\x84\x16\x93PP\x81`\0R\x80` RPPa* Q`@R`@a1\xA0```\0`\x07Z\xFA\x16`@a1``\x80\x81`\x06Z\xFA\x81\x16\x90Pa\x08\xC0Qa\x08\xE0Q\x84\x82\x83\t\x85`\x03\x87\x83\x86\t\x08\x86\x83\x84\t\x14\x84\x16\x93PP\x81`\0R\x80` RPPa*@Q`@R`@a1\xA0```\0`\x07Z\xFA\x16`@a1``\x80\x81`\x06Z\xFA\x81\x16\x90Pa\t\0Qa\t Q\x84\x82\x83\t\x85`\x03\x87\x83\x86\t\x08\x86\x83\x84\t\x14\x84\x16\x93PP\x81`\0R\x80` RPPa*`Q`@R`@a1\xA0```\0`\x07Z\xFA\x16`@a1``\x80\x81`\x06Z\xFA\x81\x16\x90Pa\t@Qa\t`Q\x84\x82\x83\t\x85`\x03\x87\x83\x86\t\x08\x86\x83\x84\t\x14\x84\x16\x93PP\x81`\0R\x80` RPPa*\x80Q`@R`@a1\xA0```\0`\x07Z\xFA\x16`@a1``\x80\x81`\x06Z\xFA\x81\x16\x90Pa\t\x80Qa\t\xA0Q\x84\x82\x83\t\x85`\x03\x87\x83\x86\t\x08\x86\x83\x84\t\x14\x84\x16\x93PP\x81`\0R\x80` RPPa*\xA0Q`@R`@a1\xA0```\0`\x07Z\xFA\x16`@a1``\x80\x81`\x06Z\xFA\x81\x16\x90P\x81\x82a\x16\0Q\x84a+\0Qa\x19\xE0Q\t\x08a'\0Q\t\x82\x83\x84a\x16 Q\x86a+\0Qa \0Q\t\x08a' Q\t\x82\x08\x90P\x82\x83\x84a\x16@Q\x86a+\0Qa Q\t\x08a'@Q\t\x82\x08\x90P\x82\x83\x84a\x16`Q\x86a+\0Qa @Q\t\x08a'`Q\t\x82\x08\x90P\x82\x83\x84a\x16\x80Q\x86a+\0Qa `Q\t\x08a'\x80Q\t\x82\x08\x90P\x82\x83\x84a\x16\xA0Q\x86a+\0Qa \x80Q\t\x08a'\xA0Q\t\x82\x08\x90P\x82\x83\x84a\x16\xC0Q\x86a+\0Qa \xA0Q\t\x08a'\xC0Q\t\x82\x08\x90P\x82\x83a\x16\xE0Qa'\xE0Q\t\x82\x08\x90P\x82\x83a\x17\0Qa(\0Q\t\x82\x08\x90P\x82\x83a\x17 Qa( Q\t\x82\x08\x90P\x82\x83a\x17@Qa(@Q\t\x82\x08\x90P\x82\x83a\x17`Qa(`Q\t\x82\x08\x90P\x82\x83a\x17\x80Qa(\x80Q\t\x82\x08\x90P\x82\x83a\x17\xA0Qa(\xA0Q\t\x82\x08\x90P\x82\x83a\x17\xC0Qa(\xC0Q\t\x82\x08\x90P\x82\x83a\x17\xE0Qa(\xE0Q\t\x82\x08\x90P\x82\x83a\x18\0Qa)\0Q\t\x82\x08\x90P\x82\x83a\x19`Qa) Q\t\x82\x08\x90P\x82\x83a\x19\x80Qa)@Q\t\x82\x08\x90P\x82\x83a\x19\xA0Qa)`Q\t\x82\x08\x90P\x82\x83a\x19\xC0Qa)\x80Q\t\x82\x08\x90P\x82\x83\x84a\x18@Q\x86a+\0Qa \xC0Q\t\x08a)\xA0Q\t\x82\x08\x90P\x82\x83\x84a\x18`Q\x86a+\0Qa \xE0Q\t\x08a)\xC0Q\t\x82\x08\x90P\x82\x83\x84a\x18\x80Q\x86a+\0Qa!\0Q\t\x08a)\xE0Q\t\x82\x08\x90P\x82\x83\x84a\x18\xA0Q\x86a+\0Qa! Q\t\x08a*\0Q\t\x82\x08\x90P\x82\x83a\x18\xC0Qa* Q\t\x82\x08\x90P\x82\x83a\x18\xE0Qa*@Q\t\x82\x08\x90P\x82\x83a\x19\0Qa*`Q\t\x82\x08\x90P\x82\x83a\x19 Qa*\x80Q\t\x82\x08\x90P\x82\x83a\x19@Qa*\xA0Q\t\x82\x08\x90P\x82a7`Q\x82\x08\x90P`\x01`\0R`\x02` R\x80\x83\x03`@RP`@a1\xA0```\0`\x07Z\xFA\x16`@a1``\x80\x81`\x06Z\xFA\x16a3`\x81\x90Ra+\0Qa&\xC0Qa#\0Qa# Q\x86\x82\x80\t\x87`\x03\x89\x83\x86\t\x08\x88\x83\x84\t\x14\x95PP\x81`\0R\x80` RPP\x80`@R`@a1\xA0```\0`\x07Z\xFA\x83\x16\x92P`@a1``\x80a1``\x06Z\xFA\x83\x16\x92Pa#@Qa#`Q\x86\x82\x83\t\x87`\x03\x89\x83\x86\t\x08\x88\x83\x84\t\x14\x86\x16\x95PP\x81`\0R\x80` RPP\x83a\x03\xC0Q\x85\x83\x85\t\t`@RP`@a1\xA0```\0`\x07Z\xFA\x82\x16\x91P`@a2 `\x80a1``\x06Z\xFA\x82\x16\x91Pa#\0Q`\0Ra# Q` Ra#@Q`@Ra#`Q``R\x80`\x80R`@\x80```@`\x07Z\xFA\x82\x16\x91P`@a1\xE0`\x80`\0`\x06Z\xFA\x82\x16\x91Pa2\0Q\x84\x03a2\0Ra\t\xC0Q\x15a*\xCFWa5\0Qa5 Q\x85\x82\x83\t\x86`\x03\x88\x83\x86\t\x08\x87\x83\x84\t\x14\x85\x16\x94PP\x81`\0R\x80` RPP\x82\x81\x82\t`@R`@``\x80`\0`\x07Z\xFA\x82\x16\x91Pa5@Qa5`Q\x85\x82\x83\t\x86`\x03\x88\x83\x86\t\x08\x87\x83\x84\t\x14\x85\x16\x94PP\x81`\0R\x80` RPP`@`\0```\0`\x07Z\xFA\x82\x16\x91Pa2 Q`\xA0Ra2@Q`\xC0R`@a2 `\x80```\x06Z\xFA\x82\x16\x91Pa1\xE0Q`@Ra2\0Q``R`@a1\xE0`\x80`\0`\x06Z\xFA\x82\x16\x91P[P\x80a*\xE6Wc\xF7U\xF3i`\xE0\x1B`\0R`\x04`\0\xFD[\x80a3\x80Ra2 Q`\0Ra2@Q` R\x7F\x19\x8E\x93\x93\x92\rH:r`\xBF\xB71\xFB]%\xF1\xAAI35\xA9\xE7\x12\x97\xE4\x85\xB7\xAE\xF3\x12\xC2`@R\x7F\x18\0\xDE\xEF\x12\x1F\x1EvBj\0f^\\DygC\"\xD4\xF7^\xDA\xDDF\xDE\xBD\\\xD9\x92\xF6\xED``R\x7F\t\x06\x89\xD0X_\xF0u\xEC\x9E\x99\xADi\x0C3\x95\xBCK13p\xB3\x8E\xF3U\xAC\xDA\xDC\xD1\"\x97[`\x80R\x7F\x12\xC8^\xA5\xDB\x8Cm\xEBJ\xABq\x80\x8D\xCB@\x8F\xE3\xD1\xE7i\x0CC\xD3{L\xE6\xCC\x01f\xFA}\xAA`\xA0Ra1\xE0Q`\xC0Ra2\0Q`\xE0Ra\n\0Qa\x01\0Ra\n Qa\x01 Ra\n@Qa\x01@Ra\n`Qa\x01`R` `\0a\x01\x80`\0`\x08Z\xFA\x90P\x80a3\xA0R`\0Qa3\xC0RPPPa3`Qa3\x80Qa3\xC0Qa3\xA0Q\x16\x16\x16a+\xFDWc\x01\xC4\x7F;`\xE2\x1B`\0R`\x04`\0\xFD[`\x01`\0R` `\0\xF3[`\0\x80`\0\x80`@\x85\x87\x03\x12\x15a,\x1DW\x83\x84\xFD[\x845g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x11\x15a,4W\x85\x86\xFD[\x81\x87\x01\x91P\x87`\x1F\x83\x01\x12a,GW\x85\x86\xFD[\x815\x81\x81\x11\x15a,UW\x86\x87\xFD[\x88` \x82\x85\x01\x01\x11\x15a,fW\x86\x87\xFD[` \x92\x83\x01\x96P\x94P\x90\x86\x015\x90\x80\x82\x11\x15a,\x80W\x83\x84\xFD[\x81\x87\x01\x91P\x87`\x1F\x83\x01\x12a,\x93W\x83\x84\xFD[\x815\x81\x81\x11\x15a,\xA1W\x84\x85\xFD[\x88` \x82`\x05\x1B\x85\x01\x01\x11\x15a,\xB5W\x84\x85\xFD[\x95\x98\x94\x97PP` \x01\x94PPPV\xFE\xA2dipfsX\"\x12 i\\O>\x85\x893C\x8D\xE4em\xDF\xB86x\xCA\xA0\xF3\xC2;\xD8\xC7\xFFB\xCA\xBB9\xA0qv\xA1dsolcC\0\x08\x04\x003"; - /// The deployed bytecode of the contract. - pub static ULTRAVERIFIER_DEPLOYED_BYTECODE: ::ethers::core::types::Bytes = - ::ethers::core::types::Bytes::from_static(__DEPLOYED_BYTECODE); - pub struct UltraVerifier(::ethers::contract::Contract); - impl ::core::clone::Clone for UltraVerifier { - fn clone(&self) -> Self { - Self(::core::clone::Clone::clone(&self.0)) - } - } - impl ::core::ops::Deref for UltraVerifier { - type Target = ::ethers::contract::Contract; - fn deref(&self) -> &Self::Target { - &self.0 - } - } - impl ::core::ops::DerefMut for UltraVerifier { - fn deref_mut(&mut self) -> &mut Self::Target { - &mut self.0 - } - } - impl ::core::fmt::Debug for UltraVerifier { - fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { - f.debug_tuple(::core::stringify!(UltraVerifier)) - .field(&self.address()) - .finish() - } - } - impl UltraVerifier { - /// 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(), - ULTRAVERIFIER_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( - ULTRAVERIFIER_ABI.clone(), - ULTRAVERIFIER_BYTECODE.clone().into(), - client, - ); - let deployer = factory.deploy(constructor_args)?; - let deployer = ::ethers::contract::ContractDeployer::new(deployer); - Ok(deployer) - } - ///Calls the contract's `getVerificationKeyHash` (0x937f6a10) function - pub fn get_verification_key_hash( - &self, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([147, 127, 106, 16], ()) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `verify` (0xea50d0e4) function - pub fn verify( - &self, - proof: ::ethers::core::types::Bytes, - public_inputs: ::std::vec::Vec<[u8; 32]>, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([234, 80, 208, 228], (proof, public_inputs)) - .expect("method not found (this should never happen)") - } - } - impl From<::ethers::contract::Contract> - for UltraVerifier - { - fn from(contract: ::ethers::contract::Contract) -> Self { - Self::new(contract.address(), contract.client()) - } - } - ///Custom Error type `EC_SCALAR_MUL_FAILURE` with signature `EC_SCALAR_MUL_FAILURE()` and selector `0xf755f369` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[etherror(name = "EC_SCALAR_MUL_FAILURE", abi = "EC_SCALAR_MUL_FAILURE()")] - pub struct EC_SCALAR_MUL_FAILURE; - ///Custom Error type `MOD_EXP_FAILURE` with signature `MOD_EXP_FAILURE()` and selector `0xf894a7bc` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[etherror(name = "MOD_EXP_FAILURE", abi = "MOD_EXP_FAILURE()")] - pub struct MOD_EXP_FAILURE; - ///Custom Error type `PROOF_FAILURE` with signature `PROOF_FAILURE()` and selector `0x0711fcec` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[etherror(name = "PROOF_FAILURE", abi = "PROOF_FAILURE()")] - pub struct PROOF_FAILURE; - ///Custom Error type `PUBLIC_INPUT_COUNT_INVALID` with signature `PUBLIC_INPUT_COUNT_INVALID(uint256,uint256)` and selector `0x7667dc9b` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[etherror( - name = "PUBLIC_INPUT_COUNT_INVALID", - abi = "PUBLIC_INPUT_COUNT_INVALID(uint256,uint256)" - )] - pub struct PUBLIC_INPUT_COUNT_INVALID { - pub expected: ::ethers::core::types::U256, - pub actual: ::ethers::core::types::U256, - } - ///Custom Error type `PUBLIC_INPUT_GE_P` with signature `PUBLIC_INPUT_GE_P()` and selector `0x374a972f` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[etherror(name = "PUBLIC_INPUT_GE_P", abi = "PUBLIC_INPUT_GE_P()")] - pub struct PUBLIC_INPUT_GE_P; - ///Custom Error type `PUBLIC_INPUT_INVALID_BN128_G1_POINT` with signature `PUBLIC_INPUT_INVALID_BN128_G1_POINT()` and selector `0xeba9f4a6` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[etherror( - name = "PUBLIC_INPUT_INVALID_BN128_G1_POINT", - abi = "PUBLIC_INPUT_INVALID_BN128_G1_POINT()" - )] - pub struct PUBLIC_INPUT_INVALID_BN128_G1_POINT; - ///Container type for all of the contract's custom errors - #[derive( - Clone, - ::ethers::contract::EthAbiType, - serde::Serialize, - serde::Deserialize, - Debug, - PartialEq, - Eq, - Hash, - )] - pub enum UltraVerifierErrors { - EC_SCALAR_MUL_FAILURE(EC_SCALAR_MUL_FAILURE), - MOD_EXP_FAILURE(MOD_EXP_FAILURE), - PROOF_FAILURE(PROOF_FAILURE), - PUBLIC_INPUT_COUNT_INVALID(PUBLIC_INPUT_COUNT_INVALID), - PUBLIC_INPUT_GE_P(PUBLIC_INPUT_GE_P), - PUBLIC_INPUT_INVALID_BN128_G1_POINT(PUBLIC_INPUT_INVALID_BN128_G1_POINT), - /// The standard solidity revert string, with selector - /// Error(string) -- 0x08c379a0 - RevertString(::std::string::String), - } - impl ::ethers::core::abi::AbiDecode for UltraVerifierErrors { - fn decode( - data: impl AsRef<[u8]>, - ) -> ::core::result::Result { - let data = data.as_ref(); - if let Ok(decoded) = - <::std::string::String as ::ethers::core::abi::AbiDecode>::decode(data) - { - return Ok(Self::RevertString(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::EC_SCALAR_MUL_FAILURE(decoded)); - } - if let Ok(decoded) = ::decode(data) { - return Ok(Self::MOD_EXP_FAILURE(decoded)); - } - if let Ok(decoded) = ::decode(data) { - return Ok(Self::PROOF_FAILURE(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::PUBLIC_INPUT_COUNT_INVALID(decoded)); - } - if let Ok(decoded) = ::decode(data) - { - return Ok(Self::PUBLIC_INPUT_GE_P(decoded)); - } - if let Ok(decoded) = - ::decode( - data, - ) - { - return Ok(Self::PUBLIC_INPUT_INVALID_BN128_G1_POINT(decoded)); - } - Err(::ethers::core::abi::Error::InvalidData.into()) - } - } - impl ::ethers::core::abi::AbiEncode for UltraVerifierErrors { - fn encode(self) -> ::std::vec::Vec { - match self { - Self::EC_SCALAR_MUL_FAILURE(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::MOD_EXP_FAILURE(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::PROOF_FAILURE(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::PUBLIC_INPUT_COUNT_INVALID(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::PUBLIC_INPUT_GE_P(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::PUBLIC_INPUT_INVALID_BN128_G1_POINT(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::RevertString(s) => ::ethers::core::abi::AbiEncode::encode(s), - } - } - } - impl ::ethers::contract::ContractRevert for UltraVerifierErrors { - fn valid_selector(selector: [u8; 4]) -> bool { - match selector { - [0x08, 0xc3, 0x79, 0xa0] => true, - _ if selector - == ::selector() => { - true - } - _ if selector - == ::selector() => { - true - } - _ if selector - == ::selector() => { - true - } - _ if selector - == ::selector() => { - true - } - _ if selector - == ::selector() => { - true - } - _ if selector - == ::selector() => { - true - } - _ => false, - } - } - } - impl ::core::fmt::Display for UltraVerifierErrors { - fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { - match self { - Self::EC_SCALAR_MUL_FAILURE(element) => ::core::fmt::Display::fmt(element, f), - Self::MOD_EXP_FAILURE(element) => ::core::fmt::Display::fmt(element, f), - Self::PROOF_FAILURE(element) => ::core::fmt::Display::fmt(element, f), - Self::PUBLIC_INPUT_COUNT_INVALID(element) => ::core::fmt::Display::fmt(element, f), - Self::PUBLIC_INPUT_GE_P(element) => ::core::fmt::Display::fmt(element, f), - Self::PUBLIC_INPUT_INVALID_BN128_G1_POINT(element) => { - ::core::fmt::Display::fmt(element, f) - } - Self::RevertString(s) => ::core::fmt::Display::fmt(s, f), - } - } - } - impl ::core::convert::From<::std::string::String> for UltraVerifierErrors { - fn from(value: String) -> Self { - Self::RevertString(value) - } - } - impl ::core::convert::From for UltraVerifierErrors { - fn from(value: EC_SCALAR_MUL_FAILURE) -> Self { - Self::EC_SCALAR_MUL_FAILURE(value) - } - } - impl ::core::convert::From for UltraVerifierErrors { - fn from(value: MOD_EXP_FAILURE) -> Self { - Self::MOD_EXP_FAILURE(value) - } - } - impl ::core::convert::From for UltraVerifierErrors { - fn from(value: PROOF_FAILURE) -> Self { - Self::PROOF_FAILURE(value) - } - } - impl ::core::convert::From for UltraVerifierErrors { - fn from(value: PUBLIC_INPUT_COUNT_INVALID) -> Self { - Self::PUBLIC_INPUT_COUNT_INVALID(value) - } - } - impl ::core::convert::From for UltraVerifierErrors { - fn from(value: PUBLIC_INPUT_GE_P) -> Self { - Self::PUBLIC_INPUT_GE_P(value) - } - } - impl ::core::convert::From for UltraVerifierErrors { - fn from(value: PUBLIC_INPUT_INVALID_BN128_G1_POINT) -> Self { - Self::PUBLIC_INPUT_INVALID_BN128_G1_POINT(value) - } - } - ///Container type for all input parameters for the `getVerificationKeyHash` function with signature `getVerificationKeyHash()` and selector `0x937f6a10` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "getVerificationKeyHash", abi = "getVerificationKeyHash()")] - pub struct GetVerificationKeyHashCall; - ///Container type for all input parameters for the `verify` function with signature `verify(bytes,bytes32[])` and selector `0xea50d0e4` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "verify", abi = "verify(bytes,bytes32[])")] - pub struct VerifyCall { - pub proof: ::ethers::core::types::Bytes, - pub public_inputs: ::std::vec::Vec<[u8; 32]>, - } - ///Container type for all of the contract's call - #[derive( - Clone, - ::ethers::contract::EthAbiType, - serde::Serialize, - serde::Deserialize, - Debug, - PartialEq, - Eq, - Hash, - )] - pub enum UltraVerifierCalls { - GetVerificationKeyHash(GetVerificationKeyHashCall), - Verify(VerifyCall), - } - impl ::ethers::core::abi::AbiDecode for UltraVerifierCalls { - fn decode( - data: impl AsRef<[u8]>, - ) -> ::core::result::Result { - let data = data.as_ref(); - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::GetVerificationKeyHash(decoded)); - } - if let Ok(decoded) = ::decode(data) { - return Ok(Self::Verify(decoded)); - } - Err(::ethers::core::abi::Error::InvalidData.into()) - } - } - impl ::ethers::core::abi::AbiEncode for UltraVerifierCalls { - fn encode(self) -> Vec { - match self { - Self::GetVerificationKeyHash(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::Verify(element) => ::ethers::core::abi::AbiEncode::encode(element), - } - } - } - impl ::core::fmt::Display for UltraVerifierCalls { - fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { - match self { - Self::GetVerificationKeyHash(element) => ::core::fmt::Display::fmt(element, f), - Self::Verify(element) => ::core::fmt::Display::fmt(element, f), - } - } - } - impl ::core::convert::From for UltraVerifierCalls { - fn from(value: GetVerificationKeyHashCall) -> Self { - Self::GetVerificationKeyHash(value) - } - } - impl ::core::convert::From for UltraVerifierCalls { - fn from(value: VerifyCall) -> Self { - Self::Verify(value) - } - } - ///Container type for all return fields from the `getVerificationKeyHash` function with signature `getVerificationKeyHash()` and selector `0x937f6a10` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct GetVerificationKeyHashReturn(pub [u8; 32]); - ///Container type for all return fields from the `verify` function with signature `verify(bytes,bytes32[])` and selector `0xea50d0e4` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct VerifyReturn(pub bool); -} diff --git a/bindings/src/uups_upgradeable.rs b/bindings/src/uups_upgradeable.rs index 2a2c304..4d84b42 100644 --- a/bindings/src/uups_upgradeable.rs +++ b/bindings/src/uups_upgradeable.rs @@ -134,9 +134,9 @@ pub mod uups_upgradeable { },], ), ( - ::std::borrow::ToOwned::to_owned("FailedInnerCall"), + ::std::borrow::ToOwned::to_owned("FailedCall"), ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("FailedInnerCall"), + name: ::std::borrow::ToOwned::to_owned("FailedCall"), inputs: ::std::vec![], },], ), @@ -324,7 +324,7 @@ pub mod uups_upgradeable { )] #[etherror(name = "ERC1967NonPayable", abi = "ERC1967NonPayable()")] pub struct ERC1967NonPayable; - ///Custom Error type `FailedInnerCall` with signature `FailedInnerCall()` and selector `0x1425ea42` + ///Custom Error type `FailedCall` with signature `FailedCall()` and selector `0xd6bda275` #[derive( Clone, ::ethers::contract::EthError, @@ -337,8 +337,8 @@ pub mod uups_upgradeable { Eq, Hash, )] - #[etherror(name = "FailedInnerCall", abi = "FailedInnerCall()")] - pub struct FailedInnerCall; + #[etherror(name = "FailedCall", abi = "FailedCall()")] + pub struct FailedCall; ///Custom Error type `InvalidInitialization` with signature `InvalidInitialization()` and selector `0xf92ee8a9` #[derive( Clone, @@ -422,7 +422,7 @@ pub mod uups_upgradeable { AddressEmptyCode(AddressEmptyCode), ERC1967InvalidImplementation(ERC1967InvalidImplementation), ERC1967NonPayable(ERC1967NonPayable), - FailedInnerCall(FailedInnerCall), + FailedCall(FailedCall), InvalidInitialization(InvalidInitialization), NotInitializing(NotInitializing), UUPSUnauthorizedCallContext(UUPSUnauthorizedCallContext), @@ -454,8 +454,8 @@ pub mod uups_upgradeable { { return Ok(Self::ERC1967NonPayable(decoded)); } - if let Ok(decoded) = ::decode(data) { - return Ok(Self::FailedInnerCall(decoded)); + if let Ok(decoded) = ::decode(data) { + return Ok(Self::FailedCall(decoded)); } if let Ok(decoded) = ::decode(data) @@ -486,7 +486,7 @@ pub mod uups_upgradeable { ::ethers::core::abi::AbiEncode::encode(element) } Self::ERC1967NonPayable(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::FailedInnerCall(element) => ::ethers::core::abi::AbiEncode::encode(element), + Self::FailedCall(element) => ::ethers::core::abi::AbiEncode::encode(element), Self::InvalidInitialization(element) => { ::ethers::core::abi::AbiEncode::encode(element) } @@ -519,9 +519,7 @@ pub mod uups_upgradeable { { true } - _ if selector == ::selector() => { - true - } + _ if selector == ::selector() => true, _ if selector == ::selector() => { @@ -554,7 +552,7 @@ pub mod uups_upgradeable { ::core::fmt::Display::fmt(element, f) } Self::ERC1967NonPayable(element) => ::core::fmt::Display::fmt(element, f), - Self::FailedInnerCall(element) => ::core::fmt::Display::fmt(element, f), + Self::FailedCall(element) => ::core::fmt::Display::fmt(element, f), Self::InvalidInitialization(element) => ::core::fmt::Display::fmt(element, f), Self::NotInitializing(element) => ::core::fmt::Display::fmt(element, f), Self::UUPSUnauthorizedCallContext(element) => ::core::fmt::Display::fmt(element, f), @@ -585,9 +583,9 @@ pub mod uups_upgradeable { Self::ERC1967NonPayable(value) } } - impl ::core::convert::From for UUPSUpgradeableErrors { - fn from(value: FailedInnerCall) -> Self { - Self::FailedInnerCall(value) + impl ::core::convert::From for UUPSUpgradeableErrors { + fn from(value: FailedCall) -> Self { + Self::FailedCall(value) } } impl ::core::convert::From for UUPSUpgradeableErrors { diff --git a/bindings/src/xor_2_verifier_wrapper.rs b/bindings/src/xor_2_verifier_wrapper.rs deleted file mode 100644 index 4fc7115..0000000 --- a/bindings/src/xor_2_verifier_wrapper.rs +++ /dev/null @@ -1,1231 +0,0 @@ -pub use xor_2_verifier_wrapper::*; -/// 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 xor_2_verifier_wrapper { - pub use super::super::shared_types::*; - #[allow(deprecated)] - fn __abi() -> ::ethers::core::abi::Abi { - ::ethers::core::abi::ethabi::Contract { - constructor: ::core::option::Option::Some(::ethers::core::abi::ethabi::Constructor { - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("_iverifier"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("contract i_xor2_verifier"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("_sampleInput"), - kind: ::ethers::core::abi::ethabi::ParamType::Bytes, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("_sampleProof"), - kind: ::ethers::core::abi::ethabi::ParamType::Bytes, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes"), - ), - }, - ], - }), - functions: ::core::convert::From::from([ - ( - ::std::borrow::ToOwned::to_owned("checkSampleInputsAndProof"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("checkSampleInputsAndProof",), - inputs: ::std::vec![], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Bool, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bool"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("createRequest"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("createRequest"), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("ask"), - kind: ::ethers::core::abi::ethabi::ParamType::Tuple(::std::vec![ - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ::ethers::core::abi::ethabi::ParamType::Address, - ::ethers::core::abi::ethabi::ParamType::Bytes, - ],), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("struct ProofMarketplace.Ask",), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("secretType"), - kind: ::ethers::core::abi::ethabi::ParamType::Uint(8usize), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned( - "enum ProofMarketplace.SecretType", - ), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("secret_inputs"), - kind: ::ethers::core::abi::ethabi::ParamType::Bytes, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("acl"), - kind: ::ethers::core::abi::ethabi::ParamType::Bytes, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes"), - ), - }, - ], - outputs: ::std::vec![], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("encodeInputAndProofForVerification"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned( - "encodeInputAndProofForVerification", - ), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("inputs"), - kind: ::ethers::core::abi::ethabi::ParamType::FixedArray( - ::std::boxed::Box::new( - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ), - 1usize, - ), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256[1]"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("a"), - kind: ::ethers::core::abi::ethabi::ParamType::FixedArray( - ::std::boxed::Box::new( - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ), - 2usize, - ), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256[2]"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("b"), - kind: ::ethers::core::abi::ethabi::ParamType::FixedArray( - ::std::boxed::Box::new( - ::ethers::core::abi::ethabi::ParamType::FixedArray( - ::std::boxed::Box::new( - ::ethers::core::abi::ethabi::ParamType::Uint( - 256usize - ), - ), - 2usize, - ), - ), - 2usize, - ), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256[2][2]"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("c"), - kind: ::ethers::core::abi::ethabi::ParamType::FixedArray( - ::std::boxed::Box::new( - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ), - 2usize, - ), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256[2]"), - ), - }, - ], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Bytes, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::Pure, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("encodeInputs"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("encodeInputs"), - inputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("inputs"), - kind: ::ethers::core::abi::ethabi::ParamType::FixedArray( - ::std::boxed::Box::new( - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ), - 1usize, - ), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256[1]"), - ), - },], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Bytes, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::Pure, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("encodeProof"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("encodeProof"), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("a"), - kind: ::ethers::core::abi::ethabi::ParamType::FixedArray( - ::std::boxed::Box::new( - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ), - 2usize, - ), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256[2]"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("b"), - kind: ::ethers::core::abi::ethabi::ParamType::FixedArray( - ::std::boxed::Box::new( - ::ethers::core::abi::ethabi::ParamType::FixedArray( - ::std::boxed::Box::new( - ::ethers::core::abi::ethabi::ParamType::Uint( - 256usize - ), - ), - 2usize, - ), - ), - 2usize, - ), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256[2][2]"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("c"), - kind: ::ethers::core::abi::ethabi::ParamType::FixedArray( - ::std::boxed::Box::new( - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ), - 2usize, - ), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256[2]"), - ), - }, - ], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Bytes, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::Pure, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("iverifier"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("iverifier"), - inputs: ::std::vec![], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("contract i_xor2_verifier"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("proofMarketplace"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("proofMarketplace"), - inputs: ::std::vec![], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("contract ProofMarketplace",), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("sampleInput"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("sampleInput"), - inputs: ::std::vec![], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Bytes, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("sampleProof"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("sampleProof"), - inputs: ::std::vec![], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Bytes, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("setProofMarketplaceContract"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("setProofMarketplaceContract",), - inputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("_proofMarketplace"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("contract ProofMarketplace",), - ), - },], - outputs: ::std::vec![], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("verify"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("verify"), - inputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("encodedData"), - kind: ::ethers::core::abi::ethabi::ParamType::Bytes, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes"), - ), - },], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Bool, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bool"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("verifyAgainstSampleInputs"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("verifyAgainstSampleInputs",), - inputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("encodedProof"), - kind: ::ethers::core::abi::ethabi::ParamType::Bytes, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes"), - ), - },], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Bool, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bool"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("verifyInputs"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("verifyInputs"), - inputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("inputs"), - kind: ::ethers::core::abi::ethabi::ParamType::Bytes, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes"), - ), - },], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Bool, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bool"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::Pure, - },], - ), - ]), - events: ::std::collections::BTreeMap::new(), - errors: ::std::collections::BTreeMap::new(), - receive: false, - fallback: false, - } - } - ///The parsed JSON ABI of the contract. - pub static XOR2_VERIFIER_WRAPPER_ABI: ::ethers::contract::Lazy<::ethers::core::abi::Abi> = - ::ethers::contract::Lazy::new(__abi); - #[rustfmt::skip] - const __BYTECODE: &[u8] = b"`\xA0`@R4\x80\x15b\0\0\x11W`\0\x80\xFD[P`@Qb\0\x15\xB88\x03\x80b\0\x15\xB8\x839\x81\x01`@\x81\x90Rb\0\x004\x91b\0\x01-V[`\x01`\x01`\xA0\x1B\x03\x83\x16`\x80R`\x01b\0\0O\x83\x82b\0\x02FV[P`\x02b\0\0^\x82\x82b\0\x02FV[PPPPb\0\x03\x12V[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`\0\x82`\x1F\x83\x01\x12b\0\0\x90W`\0\x80\xFD[\x81Q`\x01`\x01`@\x1B\x03\x80\x82\x11\x15b\0\0\xADWb\0\0\xADb\0\0hV[`@Q`\x1F\x83\x01`\x1F\x19\x90\x81\x16`?\x01\x16\x81\x01\x90\x82\x82\x11\x81\x83\x10\x17\x15b\0\0\xD8Wb\0\0\xD8b\0\0hV[\x81`@R\x83\x81R` \x92P\x86\x83\x85\x88\x01\x01\x11\x15b\0\0\xF5W`\0\x80\xFD[`\0\x91P[\x83\x82\x10\x15b\0\x01\x19W\x85\x82\x01\x83\x01Q\x81\x83\x01\x84\x01R\x90\x82\x01\x90b\0\0\xFAV[`\0\x93\x81\x01\x90\x92\x01\x92\x90\x92R\x94\x93PPPPV[`\0\x80`\0``\x84\x86\x03\x12\x15b\0\x01CW`\0\x80\xFD[\x83Q`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14b\0\x01[W`\0\x80\xFD[` \x85\x01Q\x90\x93P`\x01`\x01`@\x1B\x03\x80\x82\x11\x15b\0\x01yW`\0\x80\xFD[b\0\x01\x87\x87\x83\x88\x01b\0\0~V[\x93P`@\x86\x01Q\x91P\x80\x82\x11\x15b\0\x01\x9EW`\0\x80\xFD[Pb\0\x01\xAD\x86\x82\x87\x01b\0\0~V[\x91PP\x92P\x92P\x92V[`\x01\x81\x81\x1C\x90\x82\x16\x80b\0\x01\xCCW`\x7F\x82\x16\x91P[` \x82\x10\x81\x03b\0\x01\xEDWcNH{q`\xE0\x1B`\0R`\"`\x04R`$`\0\xFD[P\x91\x90PV[`\x1F\x82\x11\x15b\0\x02AW`\0\x81\x81R` \x81 `\x1F\x85\x01`\x05\x1C\x81\x01` \x86\x10\x15b\0\x02\x1CWP\x80[`\x1F\x85\x01`\x05\x1C\x82\x01\x91P[\x81\x81\x10\x15b\0\x02=W\x82\x81U`\x01\x01b\0\x02(V[PPP[PPPV[\x81Q`\x01`\x01`@\x1B\x03\x81\x11\x15b\0\x02bWb\0\x02bb\0\0hV[b\0\x02z\x81b\0\x02s\x84Tb\0\x01\xB7V[\x84b\0\x01\xF3V[` \x80`\x1F\x83\x11`\x01\x81\x14b\0\x02\xB2W`\0\x84\x15b\0\x02\x99WP\x85\x83\x01Q[`\0\x19`\x03\x86\x90\x1B\x1C\x19\x16`\x01\x85\x90\x1B\x17\x85Ub\0\x02=V[`\0\x85\x81R` \x81 `\x1F\x19\x86\x16\x91[\x82\x81\x10\x15b\0\x02\xE3W\x88\x86\x01Q\x82U\x94\x84\x01\x94`\x01\x90\x91\x01\x90\x84\x01b\0\x02\xC2V[P\x85\x82\x10\x15b\0\x03\x02W\x87\x85\x01Q`\0\x19`\x03\x88\x90\x1B`\xF8\x16\x1C\x19\x16\x81U[PPPPP`\x01\x90\x81\x1B\x01\x90UPV[`\x80Qa\x12\x83b\0\x035`\09`\0\x81\x81a\x01\xC8\x01Ra\x04\x92\x01Ra\x12\x83`\0\xF3\xFE`\x80`@R4\x80\x15a\0\x10W`\0\x80\xFD[P`\x046\x10a\0\xCEW`\x005`\xE0\x1C\x80c\x8Ev\n\xFE\x11a\0\x8CW\x80c\xA7l\x05Q\x11a\0fW\x80c\xA7l\x05Q\x14a\x01\xA8W\x80c\xD2#^\xAC\x14a\x01\xB0W\x80c\xE7\xF5\xB8\x1D\x14a\x01\xC3W\x80c\xEC#\xA9\xED\x14a\x01\xEAW`\0\x80\xFD[\x80c\x8Ev\n\xFE\x14a\x01oW\x80c\x9B\xBC\xADx\x14a\x01\x82W\x80c\xA6\xDF\xBC\x7F\x14a\x01\x95W`\0\x80\xFD[\x80bkO\xB0\x14a\0\xD3W\x80c\x02\xF7}\x19\x14a\0\xFCW\x80c\x05m\xE7\x04\x14a\x01\x1FW\x80c\x10\xA5By\x14a\x014W\x80c}\x8A\xD4+\x14a\x01V[`@Q\x90\x15\x15\x81R` \x01a\0\xF3V[a\x012a\x01-6`\x04a\n\xB3V[a\x02vV[\0[a\x01\x0Fa\x02\xE4V[a\0\xE6a\x03~V[`\0Ta\x01W\x90`\x01`\x01`\xA0\x1B\x03\x16\x81V[`@Q`\x01`\x01`\xA0\x1B\x03\x90\x91\x16\x81R` \x01a\0\xF3V[a\x01\x0Fa\x01}6`\x04a\n\x1BV[a\x04\x0CV[a\0\xE6a\x01\x906`\x04a\n\xD0V[a\x05\x1AV[a\x01\x0Fa\x01\xA36`\x04a\x0B5V[a\x05CV[a\0\xE6a\x05]V[a\x012a\x01\xBE6`\x04a\x0BwV[a\x05jV[a\x01W\x7F\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\x81V[a\0\xE6a\x01\xF86`\x04a\x0C,V[a\x06\x9CV[``a\x02\x08\x85a\x05\x1AV[a\x02\x13\x85\x85\x85a\x06\x9CV[`@Q` \x01a\x02$\x92\x91\x90a\x0CsV[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x90P[\x94\x93PPPPV[`\0\x80`\x01\x83`@Q` \x01a\x02U\x92\x91\x90a\x0C\xDBV[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x90Pa\x02o\x81a\x04\x0CV[\x93\x92PPPV[`\0T`\x01`\x01`\xA0\x1B\x03\x16\x15a\x02\xC2W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x0B`$\x82\x01Rj\x10[\x1C\x99XY\x1EH\x14\xD9]`\xAA\x1B`D\x82\x01R`d\x01[`@Q\x80\x91\x03\x90\xFD[`\0\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16`\x01`\x01`\xA0\x1B\x03\x92\x90\x92\x16\x91\x90\x91\x17\x90UV[`\0a\x03y`\x02\x80Ta\x02\xF6\x90a\x0C\xA1V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\x03\"\x90a\x0C\xA1V[\x80\x15a\x03oW\x80`\x1F\x10a\x03DWa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\x03oV[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\x03RW\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPPa\x02>V[\x90P\x90V[`\x01\x80Ta\x03\x8B\x90a\x0C\xA1V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\x03\xB7\x90a\x0C\xA1V[\x80\x15a\x04\x04W\x80`\x1F\x10a\x03\xD9Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\x04\x04V[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\x03\xE7W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81V[`\0a\x04\x16a\x07KV[a\x04\x1Ea\x07iV[a\x04&a\x07KV[a\x04.a\x07\x96V[`\0\x80\x87\x80` \x01\x90Q\x81\x01\x90a\x04E\x91\x90a\r\xD7V[\x91P\x91P\x81\x80` \x01\x90Q\x81\x01\x90a\x04]\x91\x90a\x0E;V[\x92P\x80\x80` \x01\x90Q\x81\x01\x90a\x04s\x91\x90a\x0E\xE0V[`@QcCu;M`\xE0\x1B\x81R\x92\x98P\x90\x96P\x94P`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x90cCu;M\x90a\x04\xCD\x90\x89\x90\x89\x90\x89\x90\x89\x90`\x04\x01a\x0F\xE7V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x04\xEAW=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x05\x0E\x91\x90a\x10\x1EV[\x98\x97PPPPPPPPV[``\x81`@Q` \x01a\x05-\x91\x90a\x10@V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x90P\x91\x90PV[`\0a\x05Q\x82\x84\x01\x84a\x10NV[P`\x01\x90P[\x92\x91PPV[`\x02\x80Ta\x03\x8B\x90a\x0C\xA1V[`\0`@Q\x80`\xE0\x01`@R\x80\x88`\0\x015\x81R` \x01\x88` \x015\x81R` \x01\x88`@\x015\x81R` \x01\x88``\x015\x81R` \x01\x88`\x80\x015\x81R` \x01\x88`\xA0\x01` \x81\x01\x90a\x05\xBC\x91\x90a\n\xB3V[`\x01`\x01`\xA0\x1B\x03\x16\x81R` \x01a\x05\xE2a\x01\x90a\x05\xDD`\xC0\x8C\x01\x8Ca\x10\xE8V[a\x06\xCBV[\x90R`\0T`@Q\x91\x92P`\x01`\x01`\xA0\x1B\x03\x16\x90cpS\x8F\xCA\x90\x83\x90\x89\x90a\x06\x11\x90\x8A\x90\x8A\x90` \x01a\x11/V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x87\x87`@Q` \x01a\x063\x92\x91\x90a\x11/V[`@Q` \x81\x83\x03\x03\x81R\x90`@R`@Q\x85c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x06a\x94\x93\x92\x91\x90a\x11\x80V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x06{W`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x06\x8FW=`\0\x80>=`\0\xFD[PPPPPPPPPPPV[``\x83\x83\x83`@Q` \x01a\x06\xB3\x93\x92\x91\x90a\x12$V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x90P\x93\x92PPPV[a\x06\xD3a\x07\x96V[a\x06\xDD\x83\x83a\x05CV[a\x07?W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`-`$\x82\x01R\x7FCircom Verifier Wrapper: Invalid`D\x82\x01Rl\x08\x1A[\x9C\x1D]\x08\x19\x9B\xDC\x9BX]`\x9A\x1B`d\x82\x01R`\x84\x01a\x02\xB9V[a\x02o\x82\x84\x01\x84a\n\xD0V[`@Q\x80`@\x01`@R\x80`\x02\x90` \x82\x02\x806\x837P\x91\x92\x91PPV[`@Q\x80`@\x01`@R\x80`\x02\x90[a\x07\x80a\x07KV[\x81R` \x01\x90`\x01\x90\x03\x90\x81a\x07xW\x90PP\x90V[`@Q\x80` \x01`@R\x80`\x01\x90` \x82\x02\x806\x837P\x91\x92\x91PPV[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`@Q` \x81\x01g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x82\x82\x10\x17\x15a\x07\xEDWa\x07\xEDa\x07\xB4V[`@R\x90V[`@\x80Q\x90\x81\x01g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x82\x82\x10\x17\x15a\x07\xEDWa\x07\xEDa\x07\xB4V[`@Q`\x1F\x82\x01`\x1F\x19\x16\x81\x01g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x82\x82\x10\x17\x15a\x08?Wa\x08?a\x07\xB4V[`@R\x91\x90PV[`\0\x82`\x1F\x83\x01\x12a\x08XW`\0\x80\xFD[a\x08`a\x07\xCAV[\x80` \x80\x85\x01\x86\x81\x11\x15a\x08sW`\0\x80\xFD[\x85[\x81\x81\x10\x15a\x08\x8CW\x805\x85R\x93\x82\x01\x93\x82\x01a\x08uV[P\x91\x96\x95PPPPPPV[`\0\x82`\x1F\x83\x01\x12a\x08\xA9W`\0\x80\xFD[a\x08\xB1a\x07\xF3V[\x80`@\x84\x01\x85\x81\x11\x15a\x08\xC3W`\0\x80\xFD[\x84[\x81\x81\x10\x15a\x08\xDDW\x805\x84R` \x93\x84\x01\x93\x01a\x08\xC5V[P\x90\x95\x94PPPPPV[`\0\x82`\x1F\x83\x01\x12a\x08\xF9W`\0\x80\xFD[a\t\x01a\x07\xF3V[\x80`\x80\x84\x01\x85\x81\x11\x15a\t\x13W`\0\x80\xFD[\x84[\x81\x81\x10\x15a\x08\xDDWa\t'\x87\x82a\x08\x98V[\x84R` \x90\x93\x01\x92`@\x01a\t\x15V[`\0\x80`\0\x80a\x01 \x85\x87\x03\x12\x15a\tNW`\0\x80\xFD[a\tX\x86\x86a\x08GV[\x93Pa\tg\x86` \x87\x01a\x08\x98V[\x92Pa\tv\x86``\x87\x01a\x08\xE8V[\x91Pa\t\x85\x86`\xE0\x87\x01a\x08\x98V[\x90P\x92\x95\x91\x94P\x92PV[`\0[\x83\x81\x10\x15a\t\xABW\x81\x81\x01Q\x83\x82\x01R` \x01a\t\x93V[PP`\0\x91\x01RV[`\0\x81Q\x80\x84Ra\t\xCC\x81` \x86\x01` \x86\x01a\t\x90V[`\x1F\x01`\x1F\x19\x16\x92\x90\x92\x01` \x01\x92\x91PPV[` \x81R`\0a\x02o` \x83\x01\x84a\t\xB4V[`\0g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x15a\n\rWa\n\ra\x07\xB4V[P`\x1F\x01`\x1F\x19\x16` \x01\x90V[`\0` \x82\x84\x03\x12\x15a\n-W`\0\x80\xFD[\x815g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\nDW`\0\x80\xFD[\x82\x01`\x1F\x81\x01\x84\x13a\nUW`\0\x80\xFD[\x805a\nha\nc\x82a\t\xF3V[a\x08\x16V[\x81\x81R\x85` \x83\x85\x01\x01\x11\x15a\n}W`\0\x80\xFD[\x81` \x84\x01` \x83\x017`\0\x91\x81\x01` \x01\x91\x90\x91R\x94\x93PPPPV[`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a\n\xB0W`\0\x80\xFD[PV[`\0` \x82\x84\x03\x12\x15a\n\xC5W`\0\x80\xFD[\x815a\x02o\x81a\n\x9BV[`\0` \x82\x84\x03\x12\x15a\n\xE2W`\0\x80\xFD[a\x02o\x83\x83a\x08GV[`\0\x80\x83`\x1F\x84\x01\x12a\n\xFEW`\0\x80\xFD[P\x815g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x0B\x16W`\0\x80\xFD[` \x83\x01\x91P\x83` \x82\x85\x01\x01\x11\x15a\x0B.W`\0\x80\xFD[\x92P\x92\x90PV[`\0\x80` \x83\x85\x03\x12\x15a\x0BHW`\0\x80\xFD[\x825g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x0B_W`\0\x80\xFD[a\x0Bk\x85\x82\x86\x01a\n\xECV[\x90\x96\x90\x95P\x93PPPPV[`\0\x80`\0\x80`\0\x80`\x80\x87\x89\x03\x12\x15a\x0B\x90W`\0\x80\xFD[\x865g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x11\x15a\x0B\xA8W`\0\x80\xFD[\x90\x88\x01\x90`\xE0\x82\x8B\x03\x12\x15a\x0B\xBCW`\0\x80\xFD[\x90\x96P` \x88\x015\x90`\x03\x82\x10a\x0B\xD2W`\0\x80\xFD[\x90\x95P`@\x88\x015\x90\x80\x82\x11\x15a\x0B\xE8W`\0\x80\xFD[a\x0B\xF4\x8A\x83\x8B\x01a\n\xECV[\x90\x96P\x94P``\x89\x015\x91P\x80\x82\x11\x15a\x0C\rW`\0\x80\xFD[Pa\x0C\x1A\x89\x82\x8A\x01a\n\xECV[\x97\x9A\x96\x99P\x94\x97P\x92\x95\x93\x94\x92PPPV[`\0\x80`\0a\x01\0\x84\x86\x03\x12\x15a\x0CBW`\0\x80\xFD[a\x0CL\x85\x85a\x08\x98V[\x92Pa\x0C[\x85`@\x86\x01a\x08\xE8V[\x91Pa\x0Cj\x85`\xC0\x86\x01a\x08\x98V[\x90P\x92P\x92P\x92V[`@\x81R`\0a\x0C\x86`@\x83\x01\x85a\t\xB4V[\x82\x81\x03` \x84\x01Ra\x0C\x98\x81\x85a\t\xB4V[\x95\x94PPPPPV[`\x01\x81\x81\x1C\x90\x82\x16\x80a\x0C\xB5W`\x7F\x82\x16\x91P[` \x82\x10\x81\x03a\x0C\xD5WcNH{q`\xE0\x1B`\0R`\"`\x04R`$`\0\xFD[P\x91\x90PV[`@\x81R`\0\x80\x84T\x81`\x01\x82\x81\x1C\x91P\x80\x83\x16\x80a\x0C\xFBW`\x7F\x83\x16\x92P[` \x80\x84\x10\x82\x03a\r\x1AWcNH{q`\xE0\x1B\x86R`\"`\x04R`$\x86\xFD[`@\x88\x01\x84\x90R``\x88\x01\x82\x80\x15a\r9W`\x01\x81\x14a\rOWa\rzV[`\xFF\x19\x87\x16\x82R\x85\x15\x15`\x05\x1B\x82\x01\x97Pa\rzV[`\0\x8C\x81R` \x90 `\0[\x87\x81\x10\x15a\rtW\x81T\x84\x82\x01R\x90\x86\x01\x90\x84\x01a\r[V[\x83\x01\x98PP[PP\x87\x86\x03\x81\x89\x01RPPPPPa\x0C\x98\x81\x85a\t\xB4V[`\0\x82`\x1F\x83\x01\x12a\r\xA3W`\0\x80\xFD[\x81Qa\r\xB1a\nc\x82a\t\xF3V[\x81\x81R\x84` \x83\x86\x01\x01\x11\x15a\r\xC6W`\0\x80\xFD[a\x026\x82` \x83\x01` \x87\x01a\t\x90V[`\0\x80`@\x83\x85\x03\x12\x15a\r\xEAW`\0\x80\xFD[\x82Qg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x11\x15a\x0E\x02W`\0\x80\xFD[a\x0E\x0E\x86\x83\x87\x01a\r\x92V[\x93P` \x85\x01Q\x91P\x80\x82\x11\x15a\x0E$W`\0\x80\xFD[Pa\x0E1\x85\x82\x86\x01a\r\x92V[\x91PP\x92P\x92\x90PV[`\0` \x80\x83\x85\x03\x12\x15a\x0ENW`\0\x80\xFD[\x83`\x1F\x84\x01\x12a\x0E]W`\0\x80\xFD[a\x0Eea\x07\xCAV[\x80\x82\x85\x01\x86\x81\x11\x15a\x0EvW`\0\x80\xFD[\x85[\x81\x81\x10\x15a\x0E\x8FW\x80Q\x84R\x92\x84\x01\x92\x84\x01a\x0ExV[P\x90\x96\x95PPPPPPV[`\0\x82`\x1F\x83\x01\x12a\x0E\xACW`\0\x80\xFD[a\x0E\xB4a\x07\xF3V[\x80`@\x84\x01\x85\x81\x11\x15a\x0E\xC6W`\0\x80\xFD[\x84[\x81\x81\x10\x15a\x08\xDDW\x80Q\x84R` \x93\x84\x01\x93\x01a\x0E\xC8V[`\0\x80`\0a\x01\0\x84\x86\x03\x12\x15a\x0E\xF6W`\0\x80\xFD[a\x0F\0\x85\x85a\x0E\x9BV[\x92P`@\x85`_\x86\x01\x12a\x0F\x13W`\0\x80\xFD[a\x0F\x1Ba\x07\xF3V[\x80`\xC0\x87\x01\x88\x81\x11\x15a\x0F-W`\0\x80\xFD[\x83\x88\x01[\x81\x81\x10\x15a\x0FRWa\x0FC\x8A\x82a\x0E\x9BV[\x84R` \x90\x93\x01\x92\x84\x01a\x0F1V[P\x81\x95Pa\x0F`\x89\x82a\x0E\x9BV[\x94PPPPP\x92P\x92P\x92V[\x80`\0[`\x02\x81\x10\x15a\x0F\x90W\x81Q\x84R` \x93\x84\x01\x93\x90\x91\x01\x90`\x01\x01a\x0FqV[PPPPV[\x80`\0[`\x02\x81\x10\x15a\x0F\x90Wa\x0F\xAE\x84\x83Qa\x0FmV[`@\x93\x90\x93\x01\x92` \x91\x90\x91\x01\x90`\x01\x01a\x0F\x9AV[\x80`\0[`\x01\x81\x10\x15a\x0F\x90W\x81Q\x84R` \x93\x84\x01\x93\x90\x91\x01\x90`\x01\x01a\x0F\xC8V[a\x01 \x81\x01a\x0F\xF6\x82\x87a\x0FmV[a\x10\x03`@\x83\x01\x86a\x0F\x96V[a\x10\x10`\xC0\x83\x01\x85a\x0FmV[a\x0C\x98a\x01\0\x83\x01\x84a\x0F\xC4V[`\0` \x82\x84\x03\x12\x15a\x100W`\0\x80\xFD[\x81Q\x80\x15\x15\x81\x14a\x02oW`\0\x80\xFD[` \x81\x01a\x05W\x82\x84a\x0F\xC4V[`\0` \x80\x83\x85\x03\x12\x15a\x10aW`\0\x80\xFD[\x825g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x11\x15a\x10yW`\0\x80\xFD[\x81\x85\x01\x91P\x85`\x1F\x83\x01\x12a\x10\x8DW`\0\x80\xFD[\x815\x81\x81\x11\x15a\x10\x9FWa\x10\x9Fa\x07\xB4V[\x80`\x05\x1B\x91Pa\x10\xB0\x84\x83\x01a\x08\x16V[\x81\x81R\x91\x83\x01\x84\x01\x91\x84\x81\x01\x90\x88\x84\x11\x15a\x10\xCAW`\0\x80\xFD[\x93\x85\x01\x93[\x83\x85\x10\x15a\x05\x0EW\x845\x82R\x93\x85\x01\x93\x90\x85\x01\x90a\x10\xCFV[`\0\x80\x835`\x1E\x19\x846\x03\x01\x81\x12a\x10\xFFW`\0\x80\xFD[\x83\x01\x805\x91Pg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x15a\x11\x1AW`\0\x80\xFD[` \x01\x91P6\x81\x90\x03\x82\x13\x15a\x0B.W`\0\x80\xFD[` \x81R\x81` \x82\x01R\x81\x83`@\x83\x017`\0\x81\x83\x01`@\x90\x81\x01\x91\x90\x91R`\x1F\x90\x92\x01`\x1F\x19\x16\x01\x01\x91\x90PV[`\x03\x81\x10a\x11|WcNH{q`\xE0\x1B`\0R`!`\x04R`$`\0\xFD[\x90RV[`\x80\x81R\x84Q`\x80\x82\x01R` \x85\x01Q`\xA0\x82\x01R`@\x85\x01Q`\xC0\x82\x01R``\x85\x01Q`\xE0\x82\x01R`\x80\x85\x01Qa\x01\0\x82\x01R`\x01\x80`\xA0\x1B\x03`\xA0\x86\x01Q\x16a\x01 \x82\x01R`\0`\xC0\x86\x01Q`\xE0a\x01@\x84\x01Ra\x11\xE4a\x01`\x84\x01\x82a\t\xB4V[\x90Pa\x11\xF3` \x84\x01\x87a\x11^V[\x82\x81\x03`@\x84\x01Ra\x12\x05\x81\x86a\t\xB4V[\x90P\x82\x81\x03``\x84\x01Ra\x12\x19\x81\x85a\t\xB4V[\x97\x96PPPPPPPV[a\x01\0\x81\x01a\x123\x82\x86a\x0FmV[a\x12@`@\x83\x01\x85a\x0F\x96V[a\x026`\xC0\x83\x01\x84a\x0FmV\xFE\xA2dipfsX\"\x12 K\xB4\xB1\xDCw3\x14cO\x10\x83\x1D(\xFF\x8C\x1C\x96\xC3\x1B\xF2\x87\x87\xEF\xCD\xB8\xE1\x026\x14\xE2\xED:dsolcC\0\x08\x14\x003"; - /// The bytecode of the contract. - pub static XOR2_VERIFIER_WRAPPER_BYTECODE: ::ethers::core::types::Bytes = - ::ethers::core::types::Bytes::from_static(__BYTECODE); - #[rustfmt::skip] - const __DEPLOYED_BYTECODE: &[u8] = b"`\x80`@R4\x80\x15a\0\x10W`\0\x80\xFD[P`\x046\x10a\0\xCEW`\x005`\xE0\x1C\x80c\x8Ev\n\xFE\x11a\0\x8CW\x80c\xA7l\x05Q\x11a\0fW\x80c\xA7l\x05Q\x14a\x01\xA8W\x80c\xD2#^\xAC\x14a\x01\xB0W\x80c\xE7\xF5\xB8\x1D\x14a\x01\xC3W\x80c\xEC#\xA9\xED\x14a\x01\xEAW`\0\x80\xFD[\x80c\x8Ev\n\xFE\x14a\x01oW\x80c\x9B\xBC\xADx\x14a\x01\x82W\x80c\xA6\xDF\xBC\x7F\x14a\x01\x95W`\0\x80\xFD[\x80bkO\xB0\x14a\0\xD3W\x80c\x02\xF7}\x19\x14a\0\xFCW\x80c\x05m\xE7\x04\x14a\x01\x1FW\x80c\x10\xA5By\x14a\x014W\x80c}\x8A\xD4+\x14a\x01V[`@Q\x90\x15\x15\x81R` \x01a\0\xF3V[a\x012a\x01-6`\x04a\n\xB3V[a\x02vV[\0[a\x01\x0Fa\x02\xE4V[a\0\xE6a\x03~V[`\0Ta\x01W\x90`\x01`\x01`\xA0\x1B\x03\x16\x81V[`@Q`\x01`\x01`\xA0\x1B\x03\x90\x91\x16\x81R` \x01a\0\xF3V[a\x01\x0Fa\x01}6`\x04a\n\x1BV[a\x04\x0CV[a\0\xE6a\x01\x906`\x04a\n\xD0V[a\x05\x1AV[a\x01\x0Fa\x01\xA36`\x04a\x0B5V[a\x05CV[a\0\xE6a\x05]V[a\x012a\x01\xBE6`\x04a\x0BwV[a\x05jV[a\x01W\x7F\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\x81V[a\0\xE6a\x01\xF86`\x04a\x0C,V[a\x06\x9CV[``a\x02\x08\x85a\x05\x1AV[a\x02\x13\x85\x85\x85a\x06\x9CV[`@Q` \x01a\x02$\x92\x91\x90a\x0CsV[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x90P[\x94\x93PPPPV[`\0\x80`\x01\x83`@Q` \x01a\x02U\x92\x91\x90a\x0C\xDBV[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x90Pa\x02o\x81a\x04\x0CV[\x93\x92PPPV[`\0T`\x01`\x01`\xA0\x1B\x03\x16\x15a\x02\xC2W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x0B`$\x82\x01Rj\x10[\x1C\x99XY\x1EH\x14\xD9]`\xAA\x1B`D\x82\x01R`d\x01[`@Q\x80\x91\x03\x90\xFD[`\0\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16`\x01`\x01`\xA0\x1B\x03\x92\x90\x92\x16\x91\x90\x91\x17\x90UV[`\0a\x03y`\x02\x80Ta\x02\xF6\x90a\x0C\xA1V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\x03\"\x90a\x0C\xA1V[\x80\x15a\x03oW\x80`\x1F\x10a\x03DWa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\x03oV[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\x03RW\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPPa\x02>V[\x90P\x90V[`\x01\x80Ta\x03\x8B\x90a\x0C\xA1V[\x80`\x1F\x01` \x80\x91\x04\x02` \x01`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x81\x81R` \x01\x82\x80Ta\x03\xB7\x90a\x0C\xA1V[\x80\x15a\x04\x04W\x80`\x1F\x10a\x03\xD9Wa\x01\0\x80\x83T\x04\x02\x83R\x91` \x01\x91a\x04\x04V[\x82\x01\x91\x90`\0R` `\0 \x90[\x81T\x81R\x90`\x01\x01\x90` \x01\x80\x83\x11a\x03\xE7W\x82\x90\x03`\x1F\x16\x82\x01\x91[PPPPP\x81V[`\0a\x04\x16a\x07KV[a\x04\x1Ea\x07iV[a\x04&a\x07KV[a\x04.a\x07\x96V[`\0\x80\x87\x80` \x01\x90Q\x81\x01\x90a\x04E\x91\x90a\r\xD7V[\x91P\x91P\x81\x80` \x01\x90Q\x81\x01\x90a\x04]\x91\x90a\x0E;V[\x92P\x80\x80` \x01\x90Q\x81\x01\x90a\x04s\x91\x90a\x0E\xE0V[`@QcCu;M`\xE0\x1B\x81R\x92\x98P\x90\x96P\x94P`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x90cCu;M\x90a\x04\xCD\x90\x89\x90\x89\x90\x89\x90\x89\x90`\x04\x01a\x0F\xE7V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x04\xEAW=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x05\x0E\x91\x90a\x10\x1EV[\x98\x97PPPPPPPPV[``\x81`@Q` \x01a\x05-\x91\x90a\x10@V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x90P\x91\x90PV[`\0a\x05Q\x82\x84\x01\x84a\x10NV[P`\x01\x90P[\x92\x91PPV[`\x02\x80Ta\x03\x8B\x90a\x0C\xA1V[`\0`@Q\x80`\xE0\x01`@R\x80\x88`\0\x015\x81R` \x01\x88` \x015\x81R` \x01\x88`@\x015\x81R` \x01\x88``\x015\x81R` \x01\x88`\x80\x015\x81R` \x01\x88`\xA0\x01` \x81\x01\x90a\x05\xBC\x91\x90a\n\xB3V[`\x01`\x01`\xA0\x1B\x03\x16\x81R` \x01a\x05\xE2a\x01\x90a\x05\xDD`\xC0\x8C\x01\x8Ca\x10\xE8V[a\x06\xCBV[\x90R`\0T`@Q\x91\x92P`\x01`\x01`\xA0\x1B\x03\x16\x90cpS\x8F\xCA\x90\x83\x90\x89\x90a\x06\x11\x90\x8A\x90\x8A\x90` \x01a\x11/V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x87\x87`@Q` \x01a\x063\x92\x91\x90a\x11/V[`@Q` \x81\x83\x03\x03\x81R\x90`@R`@Q\x85c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01a\x06a\x94\x93\x92\x91\x90a\x11\x80V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x06{W`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x06\x8FW=`\0\x80>=`\0\xFD[PPPPPPPPPPPV[``\x83\x83\x83`@Q` \x01a\x06\xB3\x93\x92\x91\x90a\x12$V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x90P\x93\x92PPPV[a\x06\xD3a\x07\x96V[a\x06\xDD\x83\x83a\x05CV[a\x07?W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`-`$\x82\x01R\x7FCircom Verifier Wrapper: Invalid`D\x82\x01Rl\x08\x1A[\x9C\x1D]\x08\x19\x9B\xDC\x9BX]`\x9A\x1B`d\x82\x01R`\x84\x01a\x02\xB9V[a\x02o\x82\x84\x01\x84a\n\xD0V[`@Q\x80`@\x01`@R\x80`\x02\x90` \x82\x02\x806\x837P\x91\x92\x91PPV[`@Q\x80`@\x01`@R\x80`\x02\x90[a\x07\x80a\x07KV[\x81R` \x01\x90`\x01\x90\x03\x90\x81a\x07xW\x90PP\x90V[`@Q\x80` \x01`@R\x80`\x01\x90` \x82\x02\x806\x837P\x91\x92\x91PPV[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`@Q` \x81\x01g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x82\x82\x10\x17\x15a\x07\xEDWa\x07\xEDa\x07\xB4V[`@R\x90V[`@\x80Q\x90\x81\x01g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x82\x82\x10\x17\x15a\x07\xEDWa\x07\xEDa\x07\xB4V[`@Q`\x1F\x82\x01`\x1F\x19\x16\x81\x01g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x82\x82\x10\x17\x15a\x08?Wa\x08?a\x07\xB4V[`@R\x91\x90PV[`\0\x82`\x1F\x83\x01\x12a\x08XW`\0\x80\xFD[a\x08`a\x07\xCAV[\x80` \x80\x85\x01\x86\x81\x11\x15a\x08sW`\0\x80\xFD[\x85[\x81\x81\x10\x15a\x08\x8CW\x805\x85R\x93\x82\x01\x93\x82\x01a\x08uV[P\x91\x96\x95PPPPPPV[`\0\x82`\x1F\x83\x01\x12a\x08\xA9W`\0\x80\xFD[a\x08\xB1a\x07\xF3V[\x80`@\x84\x01\x85\x81\x11\x15a\x08\xC3W`\0\x80\xFD[\x84[\x81\x81\x10\x15a\x08\xDDW\x805\x84R` \x93\x84\x01\x93\x01a\x08\xC5V[P\x90\x95\x94PPPPPV[`\0\x82`\x1F\x83\x01\x12a\x08\xF9W`\0\x80\xFD[a\t\x01a\x07\xF3V[\x80`\x80\x84\x01\x85\x81\x11\x15a\t\x13W`\0\x80\xFD[\x84[\x81\x81\x10\x15a\x08\xDDWa\t'\x87\x82a\x08\x98V[\x84R` \x90\x93\x01\x92`@\x01a\t\x15V[`\0\x80`\0\x80a\x01 \x85\x87\x03\x12\x15a\tNW`\0\x80\xFD[a\tX\x86\x86a\x08GV[\x93Pa\tg\x86` \x87\x01a\x08\x98V[\x92Pa\tv\x86``\x87\x01a\x08\xE8V[\x91Pa\t\x85\x86`\xE0\x87\x01a\x08\x98V[\x90P\x92\x95\x91\x94P\x92PV[`\0[\x83\x81\x10\x15a\t\xABW\x81\x81\x01Q\x83\x82\x01R` \x01a\t\x93V[PP`\0\x91\x01RV[`\0\x81Q\x80\x84Ra\t\xCC\x81` \x86\x01` \x86\x01a\t\x90V[`\x1F\x01`\x1F\x19\x16\x92\x90\x92\x01` \x01\x92\x91PPV[` \x81R`\0a\x02o` \x83\x01\x84a\t\xB4V[`\0g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x15a\n\rWa\n\ra\x07\xB4V[P`\x1F\x01`\x1F\x19\x16` \x01\x90V[`\0` \x82\x84\x03\x12\x15a\n-W`\0\x80\xFD[\x815g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\nDW`\0\x80\xFD[\x82\x01`\x1F\x81\x01\x84\x13a\nUW`\0\x80\xFD[\x805a\nha\nc\x82a\t\xF3V[a\x08\x16V[\x81\x81R\x85` \x83\x85\x01\x01\x11\x15a\n}W`\0\x80\xFD[\x81` \x84\x01` \x83\x017`\0\x91\x81\x01` \x01\x91\x90\x91R\x94\x93PPPPV[`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a\n\xB0W`\0\x80\xFD[PV[`\0` \x82\x84\x03\x12\x15a\n\xC5W`\0\x80\xFD[\x815a\x02o\x81a\n\x9BV[`\0` \x82\x84\x03\x12\x15a\n\xE2W`\0\x80\xFD[a\x02o\x83\x83a\x08GV[`\0\x80\x83`\x1F\x84\x01\x12a\n\xFEW`\0\x80\xFD[P\x815g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x0B\x16W`\0\x80\xFD[` \x83\x01\x91P\x83` \x82\x85\x01\x01\x11\x15a\x0B.W`\0\x80\xFD[\x92P\x92\x90PV[`\0\x80` \x83\x85\x03\x12\x15a\x0BHW`\0\x80\xFD[\x825g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x0B_W`\0\x80\xFD[a\x0Bk\x85\x82\x86\x01a\n\xECV[\x90\x96\x90\x95P\x93PPPPV[`\0\x80`\0\x80`\0\x80`\x80\x87\x89\x03\x12\x15a\x0B\x90W`\0\x80\xFD[\x865g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x11\x15a\x0B\xA8W`\0\x80\xFD[\x90\x88\x01\x90`\xE0\x82\x8B\x03\x12\x15a\x0B\xBCW`\0\x80\xFD[\x90\x96P` \x88\x015\x90`\x03\x82\x10a\x0B\xD2W`\0\x80\xFD[\x90\x95P`@\x88\x015\x90\x80\x82\x11\x15a\x0B\xE8W`\0\x80\xFD[a\x0B\xF4\x8A\x83\x8B\x01a\n\xECV[\x90\x96P\x94P``\x89\x015\x91P\x80\x82\x11\x15a\x0C\rW`\0\x80\xFD[Pa\x0C\x1A\x89\x82\x8A\x01a\n\xECV[\x97\x9A\x96\x99P\x94\x97P\x92\x95\x93\x94\x92PPPV[`\0\x80`\0a\x01\0\x84\x86\x03\x12\x15a\x0CBW`\0\x80\xFD[a\x0CL\x85\x85a\x08\x98V[\x92Pa\x0C[\x85`@\x86\x01a\x08\xE8V[\x91Pa\x0Cj\x85`\xC0\x86\x01a\x08\x98V[\x90P\x92P\x92P\x92V[`@\x81R`\0a\x0C\x86`@\x83\x01\x85a\t\xB4V[\x82\x81\x03` \x84\x01Ra\x0C\x98\x81\x85a\t\xB4V[\x95\x94PPPPPV[`\x01\x81\x81\x1C\x90\x82\x16\x80a\x0C\xB5W`\x7F\x82\x16\x91P[` \x82\x10\x81\x03a\x0C\xD5WcNH{q`\xE0\x1B`\0R`\"`\x04R`$`\0\xFD[P\x91\x90PV[`@\x81R`\0\x80\x84T\x81`\x01\x82\x81\x1C\x91P\x80\x83\x16\x80a\x0C\xFBW`\x7F\x83\x16\x92P[` \x80\x84\x10\x82\x03a\r\x1AWcNH{q`\xE0\x1B\x86R`\"`\x04R`$\x86\xFD[`@\x88\x01\x84\x90R``\x88\x01\x82\x80\x15a\r9W`\x01\x81\x14a\rOWa\rzV[`\xFF\x19\x87\x16\x82R\x85\x15\x15`\x05\x1B\x82\x01\x97Pa\rzV[`\0\x8C\x81R` \x90 `\0[\x87\x81\x10\x15a\rtW\x81T\x84\x82\x01R\x90\x86\x01\x90\x84\x01a\r[V[\x83\x01\x98PP[PP\x87\x86\x03\x81\x89\x01RPPPPPa\x0C\x98\x81\x85a\t\xB4V[`\0\x82`\x1F\x83\x01\x12a\r\xA3W`\0\x80\xFD[\x81Qa\r\xB1a\nc\x82a\t\xF3V[\x81\x81R\x84` \x83\x86\x01\x01\x11\x15a\r\xC6W`\0\x80\xFD[a\x026\x82` \x83\x01` \x87\x01a\t\x90V[`\0\x80`@\x83\x85\x03\x12\x15a\r\xEAW`\0\x80\xFD[\x82Qg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x11\x15a\x0E\x02W`\0\x80\xFD[a\x0E\x0E\x86\x83\x87\x01a\r\x92V[\x93P` \x85\x01Q\x91P\x80\x82\x11\x15a\x0E$W`\0\x80\xFD[Pa\x0E1\x85\x82\x86\x01a\r\x92V[\x91PP\x92P\x92\x90PV[`\0` \x80\x83\x85\x03\x12\x15a\x0ENW`\0\x80\xFD[\x83`\x1F\x84\x01\x12a\x0E]W`\0\x80\xFD[a\x0Eea\x07\xCAV[\x80\x82\x85\x01\x86\x81\x11\x15a\x0EvW`\0\x80\xFD[\x85[\x81\x81\x10\x15a\x0E\x8FW\x80Q\x84R\x92\x84\x01\x92\x84\x01a\x0ExV[P\x90\x96\x95PPPPPPV[`\0\x82`\x1F\x83\x01\x12a\x0E\xACW`\0\x80\xFD[a\x0E\xB4a\x07\xF3V[\x80`@\x84\x01\x85\x81\x11\x15a\x0E\xC6W`\0\x80\xFD[\x84[\x81\x81\x10\x15a\x08\xDDW\x80Q\x84R` \x93\x84\x01\x93\x01a\x0E\xC8V[`\0\x80`\0a\x01\0\x84\x86\x03\x12\x15a\x0E\xF6W`\0\x80\xFD[a\x0F\0\x85\x85a\x0E\x9BV[\x92P`@\x85`_\x86\x01\x12a\x0F\x13W`\0\x80\xFD[a\x0F\x1Ba\x07\xF3V[\x80`\xC0\x87\x01\x88\x81\x11\x15a\x0F-W`\0\x80\xFD[\x83\x88\x01[\x81\x81\x10\x15a\x0FRWa\x0FC\x8A\x82a\x0E\x9BV[\x84R` \x90\x93\x01\x92\x84\x01a\x0F1V[P\x81\x95Pa\x0F`\x89\x82a\x0E\x9BV[\x94PPPPP\x92P\x92P\x92V[\x80`\0[`\x02\x81\x10\x15a\x0F\x90W\x81Q\x84R` \x93\x84\x01\x93\x90\x91\x01\x90`\x01\x01a\x0FqV[PPPPV[\x80`\0[`\x02\x81\x10\x15a\x0F\x90Wa\x0F\xAE\x84\x83Qa\x0FmV[`@\x93\x90\x93\x01\x92` \x91\x90\x91\x01\x90`\x01\x01a\x0F\x9AV[\x80`\0[`\x01\x81\x10\x15a\x0F\x90W\x81Q\x84R` \x93\x84\x01\x93\x90\x91\x01\x90`\x01\x01a\x0F\xC8V[a\x01 \x81\x01a\x0F\xF6\x82\x87a\x0FmV[a\x10\x03`@\x83\x01\x86a\x0F\x96V[a\x10\x10`\xC0\x83\x01\x85a\x0FmV[a\x0C\x98a\x01\0\x83\x01\x84a\x0F\xC4V[`\0` \x82\x84\x03\x12\x15a\x100W`\0\x80\xFD[\x81Q\x80\x15\x15\x81\x14a\x02oW`\0\x80\xFD[` \x81\x01a\x05W\x82\x84a\x0F\xC4V[`\0` \x80\x83\x85\x03\x12\x15a\x10aW`\0\x80\xFD[\x825g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x11\x15a\x10yW`\0\x80\xFD[\x81\x85\x01\x91P\x85`\x1F\x83\x01\x12a\x10\x8DW`\0\x80\xFD[\x815\x81\x81\x11\x15a\x10\x9FWa\x10\x9Fa\x07\xB4V[\x80`\x05\x1B\x91Pa\x10\xB0\x84\x83\x01a\x08\x16V[\x81\x81R\x91\x83\x01\x84\x01\x91\x84\x81\x01\x90\x88\x84\x11\x15a\x10\xCAW`\0\x80\xFD[\x93\x85\x01\x93[\x83\x85\x10\x15a\x05\x0EW\x845\x82R\x93\x85\x01\x93\x90\x85\x01\x90a\x10\xCFV[`\0\x80\x835`\x1E\x19\x846\x03\x01\x81\x12a\x10\xFFW`\0\x80\xFD[\x83\x01\x805\x91Pg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x15a\x11\x1AW`\0\x80\xFD[` \x01\x91P6\x81\x90\x03\x82\x13\x15a\x0B.W`\0\x80\xFD[` \x81R\x81` \x82\x01R\x81\x83`@\x83\x017`\0\x81\x83\x01`@\x90\x81\x01\x91\x90\x91R`\x1F\x90\x92\x01`\x1F\x19\x16\x01\x01\x91\x90PV[`\x03\x81\x10a\x11|WcNH{q`\xE0\x1B`\0R`!`\x04R`$`\0\xFD[\x90RV[`\x80\x81R\x84Q`\x80\x82\x01R` \x85\x01Q`\xA0\x82\x01R`@\x85\x01Q`\xC0\x82\x01R``\x85\x01Q`\xE0\x82\x01R`\x80\x85\x01Qa\x01\0\x82\x01R`\x01\x80`\xA0\x1B\x03`\xA0\x86\x01Q\x16a\x01 \x82\x01R`\0`\xC0\x86\x01Q`\xE0a\x01@\x84\x01Ra\x11\xE4a\x01`\x84\x01\x82a\t\xB4V[\x90Pa\x11\xF3` \x84\x01\x87a\x11^V[\x82\x81\x03`@\x84\x01Ra\x12\x05\x81\x86a\t\xB4V[\x90P\x82\x81\x03``\x84\x01Ra\x12\x19\x81\x85a\t\xB4V[\x97\x96PPPPPPPV[a\x01\0\x81\x01a\x123\x82\x86a\x0FmV[a\x12@`@\x83\x01\x85a\x0F\x96V[a\x026`\xC0\x83\x01\x84a\x0FmV\xFE\xA2dipfsX\"\x12 K\xB4\xB1\xDCw3\x14cO\x10\x83\x1D(\xFF\x8C\x1C\x96\xC3\x1B\xF2\x87\x87\xEF\xCD\xB8\xE1\x026\x14\xE2\xED:dsolcC\0\x08\x14\x003"; - /// The deployed bytecode of the contract. - pub static XOR2_VERIFIER_WRAPPER_DEPLOYED_BYTECODE: ::ethers::core::types::Bytes = - ::ethers::core::types::Bytes::from_static(__DEPLOYED_BYTECODE); - pub struct xor2_verifier_wrapper(::ethers::contract::Contract); - impl ::core::clone::Clone for xor2_verifier_wrapper { - fn clone(&self) -> Self { - Self(::core::clone::Clone::clone(&self.0)) - } - } - impl ::core::ops::Deref for xor2_verifier_wrapper { - type Target = ::ethers::contract::Contract; - fn deref(&self) -> &Self::Target { - &self.0 - } - } - impl ::core::ops::DerefMut for xor2_verifier_wrapper { - fn deref_mut(&mut self) -> &mut Self::Target { - &mut self.0 - } - } - impl ::core::fmt::Debug for xor2_verifier_wrapper { - fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { - f.debug_tuple(::core::stringify!(xor2_verifier_wrapper)) - .field(&self.address()) - .finish() - } - } - impl xor2_verifier_wrapper { - /// 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(), - XOR2_VERIFIER_WRAPPER_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( - XOR2_VERIFIER_WRAPPER_ABI.clone(), - XOR2_VERIFIER_WRAPPER_BYTECODE.clone().into(), - client, - ); - let deployer = factory.deploy(constructor_args)?; - let deployer = ::ethers::contract::ContractDeployer::new(deployer); - Ok(deployer) - } - ///Calls the contract's `checkSampleInputsAndProof` (0x10a54279) function - pub fn check_sample_inputs_and_proof( - &self, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([16, 165, 66, 121], ()) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `createRequest` (0xd2235eac) function - pub fn create_request( - &self, - ask: Ask, - secret_type: u8, - secret_inputs: ::ethers::core::types::Bytes, - acl: ::ethers::core::types::Bytes, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([210, 35, 94, 172], (ask, secret_type, secret_inputs, acl)) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `encodeInputAndProofForVerification` (0x006b4fb0) function - pub fn encode_input_and_proof_for_verification( - &self, - inputs: [::ethers::core::types::U256; 1], - a: [::ethers::core::types::U256; 2], - b: [[::ethers::core::types::U256; 2]; 2], - c: [::ethers::core::types::U256; 2], - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([0, 107, 79, 176], (inputs, a, b, c)) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `encodeInputs` (0x9bbcad78) function - pub fn encode_inputs( - &self, - inputs: [::ethers::core::types::U256; 1], - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([155, 188, 173, 120], inputs) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `encodeProof` (0xec23a9ed) function - pub fn encode_proof( - &self, - a: [::ethers::core::types::U256; 2], - b: [[::ethers::core::types::U256; 2]; 2], - c: [::ethers::core::types::U256; 2], - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([236, 35, 169, 237], (a, b, c)) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `iverifier` (0xe7f5b81d) function - pub fn iverifier( - &self, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([231, 245, 184, 29], ()) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `proofMarketplace` (0x81c45c70) function - pub fn proof_marketplace( - &self, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([129, 196, 92, 112], ()) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `sampleInput` (0x7d8ad42b) function - pub fn sample_input( - &self, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([125, 138, 212, 43], ()) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `sampleProof` (0xa76c0551) function - pub fn sample_proof( - &self, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([167, 108, 5, 81], ()) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `setProofMarketplaceContract` (0x056de704) function - pub fn set_proof_marketplace_contract( - &self, - proof_marketplace: ::ethers::core::types::Address, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([5, 109, 231, 4], proof_marketplace) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `verify` (0x8e760afe) function - pub fn verify( - &self, - encoded_data: ::ethers::core::types::Bytes, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([142, 118, 10, 254], encoded_data) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `verifyAgainstSampleInputs` (0x02f77d19) function - pub fn verify_against_sample_inputs( - &self, - encoded_proof: ::ethers::core::types::Bytes, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([2, 247, 125, 25], encoded_proof) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `verifyInputs` (0xa6dfbc7f) function - pub fn verify_inputs( - &self, - inputs: ::ethers::core::types::Bytes, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([166, 223, 188, 127], inputs) - .expect("method not found (this should never happen)") - } - } - impl From<::ethers::contract::Contract> - for xor2_verifier_wrapper - { - fn from(contract: ::ethers::contract::Contract) -> Self { - Self::new(contract.address(), contract.client()) - } - } - ///Container type for all input parameters for the `checkSampleInputsAndProof` function with signature `checkSampleInputsAndProof()` and selector `0x10a54279` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall( - name = "checkSampleInputsAndProof", - abi = "checkSampleInputsAndProof()" - )] - pub struct CheckSampleInputsAndProofCall; - ///Container type for all input parameters for the `createRequest` function with signature `createRequest((uint256,uint256,uint256,uint256,uint256,address,bytes),uint8,bytes,bytes)` and selector `0xd2235eac` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall( - name = "createRequest", - abi = "createRequest((uint256,uint256,uint256,uint256,uint256,address,bytes),uint8,bytes,bytes)" - )] - pub struct CreateRequestCall { - pub ask: Ask, - pub secret_type: u8, - pub secret_inputs: ::ethers::core::types::Bytes, - pub acl: ::ethers::core::types::Bytes, - } - ///Container type for all input parameters for the `encodeInputAndProofForVerification` function with signature `encodeInputAndProofForVerification(uint256[1],uint256[2],uint256[2][2],uint256[2])` and selector `0x006b4fb0` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall( - name = "encodeInputAndProofForVerification", - abi = "encodeInputAndProofForVerification(uint256[1],uint256[2],uint256[2][2],uint256[2])" - )] - pub struct EncodeInputAndProofForVerificationCall { - pub inputs: [::ethers::core::types::U256; 1], - pub a: [::ethers::core::types::U256; 2], - pub b: [[::ethers::core::types::U256; 2]; 2], - pub c: [::ethers::core::types::U256; 2], - } - ///Container type for all input parameters for the `encodeInputs` function with signature `encodeInputs(uint256[1])` and selector `0x9bbcad78` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "encodeInputs", abi = "encodeInputs(uint256[1])")] - pub struct EncodeInputsCall { - pub inputs: [::ethers::core::types::U256; 1], - } - ///Container type for all input parameters for the `encodeProof` function with signature `encodeProof(uint256[2],uint256[2][2],uint256[2])` and selector `0xec23a9ed` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall( - name = "encodeProof", - abi = "encodeProof(uint256[2],uint256[2][2],uint256[2])" - )] - pub struct EncodeProofCall { - pub a: [::ethers::core::types::U256; 2], - pub b: [[::ethers::core::types::U256; 2]; 2], - pub c: [::ethers::core::types::U256; 2], - } - ///Container type for all input parameters for the `iverifier` function with signature `iverifier()` and selector `0xe7f5b81d` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "iverifier", abi = "iverifier()")] - pub struct IverifierCall; - ///Container type for all input parameters for the `proofMarketplace` function with signature `proofMarketplace()` and selector `0x81c45c70` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "proofMarketplace", abi = "proofMarketplace()")] - pub struct ProofMarketplaceCall; - ///Container type for all input parameters for the `sampleInput` function with signature `sampleInput()` and selector `0x7d8ad42b` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "sampleInput", abi = "sampleInput()")] - pub struct SampleInputCall; - ///Container type for all input parameters for the `sampleProof` function with signature `sampleProof()` and selector `0xa76c0551` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "sampleProof", abi = "sampleProof()")] - pub struct SampleProofCall; - ///Container type for all input parameters for the `setProofMarketplaceContract` function with signature `setProofMarketplaceContract(address)` and selector `0x056de704` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall( - name = "setProofMarketplaceContract", - abi = "setProofMarketplaceContract(address)" - )] - pub struct SetProofMarketplaceContractCall { - pub proof_marketplace: ::ethers::core::types::Address, - } - ///Container type for all input parameters for the `verify` function with signature `verify(bytes)` and selector `0x8e760afe` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "verify", abi = "verify(bytes)")] - pub struct VerifyCall { - pub encoded_data: ::ethers::core::types::Bytes, - } - ///Container type for all input parameters for the `verifyAgainstSampleInputs` function with signature `verifyAgainstSampleInputs(bytes)` and selector `0x02f77d19` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall( - name = "verifyAgainstSampleInputs", - abi = "verifyAgainstSampleInputs(bytes)" - )] - pub struct VerifyAgainstSampleInputsCall { - pub encoded_proof: ::ethers::core::types::Bytes, - } - ///Container type for all input parameters for the `verifyInputs` function with signature `verifyInputs(bytes)` and selector `0xa6dfbc7f` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "verifyInputs", abi = "verifyInputs(bytes)")] - pub struct VerifyInputsCall { - pub inputs: ::ethers::core::types::Bytes, - } - ///Container type for all of the contract's call - #[derive( - Clone, - ::ethers::contract::EthAbiType, - serde::Serialize, - serde::Deserialize, - Debug, - PartialEq, - Eq, - Hash, - )] - pub enum xor2_verifier_wrapperCalls { - CheckSampleInputsAndProof(CheckSampleInputsAndProofCall), - CreateRequest(CreateRequestCall), - EncodeInputAndProofForVerification(EncodeInputAndProofForVerificationCall), - EncodeInputs(EncodeInputsCall), - EncodeProof(EncodeProofCall), - Iverifier(IverifierCall), - ProofMarketplace(ProofMarketplaceCall), - SampleInput(SampleInputCall), - SampleProof(SampleProofCall), - SetProofMarketplaceContract(SetProofMarketplaceContractCall), - Verify(VerifyCall), - VerifyAgainstSampleInputs(VerifyAgainstSampleInputsCall), - VerifyInputs(VerifyInputsCall), - } - impl ::ethers::core::abi::AbiDecode for xor2_verifier_wrapperCalls { - fn decode( - data: impl AsRef<[u8]>, - ) -> ::core::result::Result { - let data = data.as_ref(); - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::CheckSampleInputsAndProof(decoded)); - } - if let Ok(decoded) = ::decode(data) - { - return Ok(Self::CreateRequest(decoded)); - } - if let Ok(decoded) = - ::decode( - data, - ) - { - return Ok(Self::EncodeInputAndProofForVerification(decoded)); - } - if let Ok(decoded) = ::decode(data) - { - return Ok(Self::EncodeInputs(decoded)); - } - if let Ok(decoded) = ::decode(data) { - return Ok(Self::EncodeProof(decoded)); - } - if let Ok(decoded) = ::decode(data) { - return Ok(Self::Iverifier(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::ProofMarketplace(decoded)); - } - if let Ok(decoded) = ::decode(data) { - return Ok(Self::SampleInput(decoded)); - } - if let Ok(decoded) = ::decode(data) { - return Ok(Self::SampleProof(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::SetProofMarketplaceContract(decoded)); - } - if let Ok(decoded) = ::decode(data) { - return Ok(Self::Verify(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::VerifyAgainstSampleInputs(decoded)); - } - if let Ok(decoded) = ::decode(data) - { - return Ok(Self::VerifyInputs(decoded)); - } - Err(::ethers::core::abi::Error::InvalidData.into()) - } - } - impl ::ethers::core::abi::AbiEncode for xor2_verifier_wrapperCalls { - fn encode(self) -> Vec { - match self { - Self::CheckSampleInputsAndProof(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::CreateRequest(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::EncodeInputAndProofForVerification(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::EncodeInputs(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::EncodeProof(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::Iverifier(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::ProofMarketplace(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::SampleInput(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::SampleProof(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::SetProofMarketplaceContract(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::Verify(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::VerifyAgainstSampleInputs(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::VerifyInputs(element) => ::ethers::core::abi::AbiEncode::encode(element), - } - } - } - impl ::core::fmt::Display for xor2_verifier_wrapperCalls { - fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { - match self { - Self::CheckSampleInputsAndProof(element) => ::core::fmt::Display::fmt(element, f), - Self::CreateRequest(element) => ::core::fmt::Display::fmt(element, f), - Self::EncodeInputAndProofForVerification(element) => { - ::core::fmt::Display::fmt(element, f) - } - Self::EncodeInputs(element) => ::core::fmt::Display::fmt(element, f), - Self::EncodeProof(element) => ::core::fmt::Display::fmt(element, f), - Self::Iverifier(element) => ::core::fmt::Display::fmt(element, f), - Self::ProofMarketplace(element) => ::core::fmt::Display::fmt(element, f), - Self::SampleInput(element) => ::core::fmt::Display::fmt(element, f), - Self::SampleProof(element) => ::core::fmt::Display::fmt(element, f), - Self::SetProofMarketplaceContract(element) => ::core::fmt::Display::fmt(element, f), - Self::Verify(element) => ::core::fmt::Display::fmt(element, f), - Self::VerifyAgainstSampleInputs(element) => ::core::fmt::Display::fmt(element, f), - Self::VerifyInputs(element) => ::core::fmt::Display::fmt(element, f), - } - } - } - impl ::core::convert::From for xor2_verifier_wrapperCalls { - fn from(value: CheckSampleInputsAndProofCall) -> Self { - Self::CheckSampleInputsAndProof(value) - } - } - impl ::core::convert::From for xor2_verifier_wrapperCalls { - fn from(value: CreateRequestCall) -> Self { - Self::CreateRequest(value) - } - } - impl ::core::convert::From for xor2_verifier_wrapperCalls { - fn from(value: EncodeInputAndProofForVerificationCall) -> Self { - Self::EncodeInputAndProofForVerification(value) - } - } - impl ::core::convert::From for xor2_verifier_wrapperCalls { - fn from(value: EncodeInputsCall) -> Self { - Self::EncodeInputs(value) - } - } - impl ::core::convert::From for xor2_verifier_wrapperCalls { - fn from(value: EncodeProofCall) -> Self { - Self::EncodeProof(value) - } - } - impl ::core::convert::From for xor2_verifier_wrapperCalls { - fn from(value: IverifierCall) -> Self { - Self::Iverifier(value) - } - } - impl ::core::convert::From for xor2_verifier_wrapperCalls { - fn from(value: ProofMarketplaceCall) -> Self { - Self::ProofMarketplace(value) - } - } - impl ::core::convert::From for xor2_verifier_wrapperCalls { - fn from(value: SampleInputCall) -> Self { - Self::SampleInput(value) - } - } - impl ::core::convert::From for xor2_verifier_wrapperCalls { - fn from(value: SampleProofCall) -> Self { - Self::SampleProof(value) - } - } - impl ::core::convert::From for xor2_verifier_wrapperCalls { - fn from(value: SetProofMarketplaceContractCall) -> Self { - Self::SetProofMarketplaceContract(value) - } - } - impl ::core::convert::From for xor2_verifier_wrapperCalls { - fn from(value: VerifyCall) -> Self { - Self::Verify(value) - } - } - impl ::core::convert::From for xor2_verifier_wrapperCalls { - fn from(value: VerifyAgainstSampleInputsCall) -> Self { - Self::VerifyAgainstSampleInputs(value) - } - } - impl ::core::convert::From for xor2_verifier_wrapperCalls { - fn from(value: VerifyInputsCall) -> Self { - Self::VerifyInputs(value) - } - } - ///Container type for all return fields from the `checkSampleInputsAndProof` function with signature `checkSampleInputsAndProof()` and selector `0x10a54279` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct CheckSampleInputsAndProofReturn(pub bool); - ///Container type for all return fields from the `encodeInputAndProofForVerification` function with signature `encodeInputAndProofForVerification(uint256[1],uint256[2],uint256[2][2],uint256[2])` and selector `0x006b4fb0` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct EncodeInputAndProofForVerificationReturn(pub ::ethers::core::types::Bytes); - ///Container type for all return fields from the `encodeInputs` function with signature `encodeInputs(uint256[1])` and selector `0x9bbcad78` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct EncodeInputsReturn(pub ::ethers::core::types::Bytes); - ///Container type for all return fields from the `encodeProof` function with signature `encodeProof(uint256[2],uint256[2][2],uint256[2])` and selector `0xec23a9ed` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct EncodeProofReturn(pub ::ethers::core::types::Bytes); - ///Container type for all return fields from the `iverifier` function with signature `iverifier()` and selector `0xe7f5b81d` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct IverifierReturn(pub ::ethers::core::types::Address); - ///Container type for all return fields from the `proofMarketplace` function with signature `proofMarketplace()` and selector `0x81c45c70` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct ProofMarketplaceReturn(pub ::ethers::core::types::Address); - ///Container type for all return fields from the `sampleInput` function with signature `sampleInput()` and selector `0x7d8ad42b` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct SampleInputReturn(pub ::ethers::core::types::Bytes); - ///Container type for all return fields from the `sampleProof` function with signature `sampleProof()` and selector `0xa76c0551` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct SampleProofReturn(pub ::ethers::core::types::Bytes); - ///Container type for all return fields from the `verify` function with signature `verify(bytes)` and selector `0x8e760afe` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct VerifyReturn(pub bool); - ///Container type for all return fields from the `verifyAgainstSampleInputs` function with signature `verifyAgainstSampleInputs(bytes)` and selector `0x02f77d19` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct VerifyAgainstSampleInputsReturn(pub bool); - ///Container type for all return fields from the `verifyInputs` function with signature `verifyInputs(bytes)` and selector `0xa6dfbc7f` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct VerifyInputsReturn(pub bool); -} diff --git a/bindings/src/xor_verifier.rs b/bindings/src/xor_verifier.rs deleted file mode 100644 index db2aa2b..0000000 --- a/bindings/src/xor_verifier.rs +++ /dev/null @@ -1,239 +0,0 @@ -pub use xor_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 xor_verifier { - #[allow(deprecated)] - fn __abi() -> ::ethers::core::abi::Abi { - ::ethers::core::abi::ethabi::Contract { - constructor: ::core::option::Option::None, - functions: ::core::convert::From::from([( - ::std::borrow::ToOwned::to_owned("verifyProof"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("verifyProof"), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("a"), - kind: ::ethers::core::abi::ethabi::ParamType::FixedArray( - ::std::boxed::Box::new( - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ), - 2usize, - ), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256[2]"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("b"), - kind: ::ethers::core::abi::ethabi::ParamType::FixedArray( - ::std::boxed::Box::new( - ::ethers::core::abi::ethabi::ParamType::FixedArray( - ::std::boxed::Box::new( - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ), - 2usize, - ), - ), - 2usize, - ), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256[2][2]"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("c"), - kind: ::ethers::core::abi::ethabi::ParamType::FixedArray( - ::std::boxed::Box::new( - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ), - 2usize, - ), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256[2]"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("input"), - kind: ::ethers::core::abi::ethabi::ParamType::FixedArray( - ::std::boxed::Box::new( - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ), - 1usize, - ), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256[1]"), - ), - }, - ], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("r"), - kind: ::ethers::core::abi::ethabi::ParamType::Bool, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bool"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - },], - )]), - events: ::std::collections::BTreeMap::new(), - errors: ::std::collections::BTreeMap::new(), - receive: false, - fallback: false, - } - } - ///The parsed JSON ABI of the contract. - pub static XORVERIFIER_ABI: ::ethers::contract::Lazy<::ethers::core::abi::Abi> = - ::ethers::contract::Lazy::new(__abi); - #[rustfmt::skip] - const __BYTECODE: &[u8] = b"`\x80`@R4\x80\x15a\0\x10W`\0\x80\xFD[Pa\x0E\xA2\x80a\0 `\09`\0\xF3\xFE`\x80`@R4\x80\x15a\0\x10W`\0\x80\xFD[P`\x046\x10a\0+W`\x005`\xE0\x1C\x80cCu;M\x14a\x000W[`\0\x80\xFD[a\x01,`\x04\x806\x03a\x01 \x81\x10\x15a\0GW`\0\x80\xFD[`@\x80Q\x80\x82\x01\x82R\x91\x83\x01\x92\x91\x81\x83\x01\x91\x83\x90`\x02\x90\x83\x90\x83\x90\x80\x82\x847`\0\x92\x01\x82\x90RP`@\x80Q\x80\x82\x01\x90\x91R\x93\x96\x95\x94`\x80\x81\x01\x94\x93P\x91P`\x02\x90\x83[\x82\x82\x10\x15a\0\xC8W`@\x80Q\x80\x82\x01\x82R\x90\x80\x84\x02\x86\x01\x90`\x02\x90\x83\x90\x83\x90\x80\x82\x847`\0\x92\x01\x91\x90\x91RPPP\x81R`\x01\x90\x91\x01\x90` \x01a\0\x8AV[PP`@\x80Q\x80\x82\x01\x82R\x93\x96\x95\x94\x81\x81\x01\x94\x93P\x91P`\x02\x90\x83\x90\x83\x90\x80\x82\x847`\0\x92\x01\x91\x90\x91RPP`@\x80Q` \x81\x81\x01\x90\x92R\x92\x95\x94\x93\x81\x81\x01\x93\x92P\x90`\x01\x90\x83\x90\x83\x90\x80\x82\x847`\0\x92\x01\x91\x90\x91RP\x91\x94Pa\x01@\x93PPPPV[`@\x80Q\x91\x15\x15\x82RQ\x90\x81\x90\x03` \x01\x90\xF3[`\0a\x01Ja\rAV[`@\x80Q\x80\x82\x01\x82R\x87Q\x81R` \x80\x89\x01Q\x81\x83\x01R\x90\x83R\x81Q`\x80\x81\x01\x83R\x87QQ\x81\x84\x01\x90\x81R\x88Q\x83\x01Q``\x80\x84\x01\x91\x90\x91R\x90\x82R\x83Q\x80\x85\x01\x85R\x89\x84\x01\x80QQ\x82RQ\x84\x01Q\x81\x85\x01R\x82\x84\x01R\x84\x83\x01\x91\x90\x91R\x82Q\x80\x84\x01\x84R\x87Q\x81R\x87\x83\x01Q\x81\x84\x01R\x84\x84\x01R\x82Q`\x01\x80\x82R\x81\x85\x01\x90\x94R\x90\x92\x90\x91\x82\x81\x01\x90\x806\x837\x01\x90PP\x90P`\0[`\x01\x81\x10\x15a\x02\x1AW\x84\x81`\x01\x81\x10a\x01\xF6W\xFE[` \x02\x01Q\x82\x82\x81Q\x81\x10a\x02\x07W\xFE[` \x90\x81\x02\x91\x90\x91\x01\x01R`\x01\x01a\x01\xE1V[Pa\x02%\x81\x83a\x02CV[a\x024W`\x01\x92PPPa\x02;V[`\0\x92PPP[\x94\x93PPPPV[`\0\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01a\x02na\rsV[a\x02va\x04\x1FV[\x90P\x80`\x80\x01QQ\x85Q`\x01\x01\x14a\x02\xCAW`@\x80QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x12`$\x82\x01Rq\x1D\x99\\\x9AY\x9AY\\\x8BX\x98Y\x0BZ[\x9C\x1D]`r\x1B`D\x82\x01R\x90Q\x90\x81\x90\x03`d\x01\x90\xFD[a\x02\xD2a\r\xBAV[`@Q\x80`@\x01`@R\x80`\0\x81R` \x01`\0\x81RP\x90P`\0[\x86Q\x81\x10\x15a\x03\xA8W\x83\x87\x82\x81Q\x81\x10a\x03\x04W\xFE[` \x02` \x01\x01Q\x10a\x03^W`@\x80QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1F`$\x82\x01R\x7Fverifier-gte-snark-scalar-field\0`D\x82\x01R\x90Q\x90\x81\x90\x03`d\x01\x90\xFD[a\x03\x9E\x82a\x03\x99\x85`\x80\x01Q\x84`\x01\x01\x81Q\x81\x10a\x03xW\xFE[` \x02` \x01\x01Q\x8A\x85\x81Q\x81\x10a\x03\x8CW\xFE[` \x02` \x01\x01Qa\x07\xA0V[a\x085V[\x91P`\x01\x01a\x02\xEEV[Pa\x03\xCB\x81\x83`\x80\x01Q`\0\x81Q\x81\x10a\x03\xBEW\xFE[` \x02` \x01\x01Qa\x085V[\x90Pa\x04\x01a\x03\xDD\x86`\0\x01Qa\x08\xC6V[\x86` \x01Q\x84`\0\x01Q\x85` \x01Q\x85\x87`@\x01Q\x8B`@\x01Q\x89``\x01Qa\tRV[a\x04\x11W`\x01\x93PPPPa\x04\x19V[`\0\x93PPPP[\x92\x91PPV[a\x04'a\rsV[`@\x80Q\x80\x82\x01\x82R\x7F\x1D\x1FC\x1C\xB7WP\xD3?O\xB9\x97\xE0\x10\x1FW\x0B\xAD\x12\xEB\x8E\x85\xCCfv+k\x08`)\xE7Z\x81R\x7F\x1C\0\r\x12\xC6\xD7\xA9\x81\xD9\xE5,o\xEB\xF5\x85\x1C\xAEjJ\xC5(\x9F\x02\xF0t\xB1F}\x08\x9B\x12v` \x80\x83\x01\x91\x90\x91R\x90\x83R\x81Q`\x80\x80\x82\x01\x84R\x7F+ \x7F\xA4{\xD0\xEB.?n\xB1~-\xBFK\n\xD6v\x06\xDA\xB6\x99\x18\x87\x95\x1D\x0Ej{\xCAd\xA8\x82\x85\x01\x90\x81R\x7F\x1E>\x89wVD\x15\"3B\xD0\xB7\xB0g\xC1\xCD\xE9S9\xDF\xF3\x07\xFB`bFgBx\x14D\xEB``\x80\x85\x01\x91\x90\x91R\x90\x83R\x84Q\x80\x86\x01\x86R\x7F\x16_A\x8F\x08\xE4\xEF5j\xCB\x14!%\xE3#\x1E{H\xE6\xC2!F\xA8\x1C3\xE7\xBC7\x87v\x83\\\x81R\x7F%~\0\x07\xDA|\x8A\xB8\xAE\xB0}\xF4\x02\x04\xD3\xC0\xE4,\xAB\x8C\x802F\xF2UW\xE4\xBC\xD9\x8DV\x96\x81\x86\x01R\x83\x85\x01R\x85\x84\x01\x92\x90\x92R\x83Q\x80\x82\x01\x85R\x7F\x19\x8E\x93\x93\x92\rH:r`\xBF\xB71\xFB]%\xF1\xAAI35\xA9\xE7\x12\x97\xE4\x85\xB7\xAE\xF3\x12\xC2\x81\x86\x01\x90\x81R\x7F\x18\0\xDE\xEF\x12\x1F\x1EvBj\0f^\\DygC\"\xD4\xF7^\xDA\xDDF\xDE\xBD\\\xD9\x92\xF6\xED\x82\x85\x01R\x81R\x84Q\x80\x86\x01\x86R\x7F\t\x06\x89\xD0X_\xF0u\xEC\x9E\x99\xADi\x0C3\x95\xBCK13p\xB3\x8E\xF3U\xAC\xDA\xDC\xD1\"\x97[\x81R\x7F\x12\xC8^\xA5\xDB\x8Cm\xEBJ\xABq\x80\x8D\xCB@\x8F\xE3\xD1\xE7i\x0CC\xD3{L\xE6\xCC\x01f\xFA}\xAA\x81\x86\x01R\x81\x85\x01R\x85\x85\x01R\x83Q\x90\x81\x01\x84R\x7F\x1E\x91#\xAF\x85\x93\xCB\xF1\xBB\xFFt\xDBS\xB6f\xDD\xCD\x99Y)\xFA\xBA\xF7>\x0F\xD3\x15\xD3\xF5ZL\x02\x81\x85\x01\x90\x81R\x7F\x03K/\x96g?\x16\xCBlT\xECc\xC4\x89\xCF(F\xE8pw\x96\xC0\x89\x1Eh!\x15\xC80\xC7\x0E\xCB\x82\x84\x01R\x81R\x83Q\x80\x85\x01\x85R\x7F+\x911\x8F\xD4G\xF5Y6\xBA\xF1\x89YT?\xAE\x8E\xB3%4\x81\xC3\x94\xD8V\xC4\x9C\xD2d\xACYX\x81R\x7F'\x15\x99\xA19.|v\x11`\xC7x\x91\x06\xCE\x10h\x05\x15_~\xC9l\x03\x82\x90i\x8F\x1C\xB7\x15\xC4\x81\x85\x01R\x81\x84\x01R\x81\x85\x01R\x82Q`\x02\x80\x82R\x91\x81\x01\x90\x93R\x90\x82\x01[a\x06\xA8a\r\xBAV[\x81R` \x01\x90`\x01\x90\x03\x90\x81a\x06\xA0WPP`\x80\x82\x01\x90\x81R`@\x80Q\x80\x82\x01\x90\x91R\x7F%y\xC7\xCA\x03\xEF\xA64\x9CC\xAAV\xCA\x18l\xADu4\xA8p]\xB9\xC1\x8E\xC9\"\x02\xD8\x81e\xC0L\x81R\x7F\x04\xE8$\xD0\xF4\x0E\xD2p\xF7\x03\x82\x16}\x94C\xAC-(5%\xB9\x19\t:\xD5)\x8B#[L\x9E\x87` \x82\x01R\x90Q\x80Q`\0\x90a\x07!W\xFE[` \x02` \x01\x01\x81\x90RP`@Q\x80`@\x01`@R\x80\x7F\x12\x1F\xCC:4^\xFE\xE7>\x13\x12\xA9\x9D\xA0wq\xF5\xD8\xF6\xAD\x9AMz\x97}\xFBT\xEF9\xA9\xEAC\x81R` \x01\x7F\x1AW\n\xBDV\xB5r\x1F\x9B\xF9\x04BL\xFC\xD6^M\xC0\x03h\\\xA6\xCBWF\xDC\xC7\xB0\xF6\x87\x93]\x81RP\x81`\x80\x01Q`\x01\x81Q\x81\x10a\x07\x92W\xFE[` \x02` \x01\x01\x81\x90RP\x90V[a\x07\xA8a\r\xBAV[a\x07\xB0a\r\xD4V[\x83Q\x81R` \x80\x85\x01Q\x90\x82\x01R`@\x81\x01\x83\x90R`\0``\x83`\x80\x84`\x07a\x07\xD0Z\x03\xFA\x90P\x80\x80\x15a\x07\xE3Wa\x07\xE5V[\xFE[P\x80a\x08-W`@\x80QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x12`$\x82\x01Rq\x1C\x18Z\\\x9A[\x99\xCB[][\x0BY\x98Z[\x19Y`r\x1B`D\x82\x01R\x90Q\x90\x81\x90\x03`d\x01\x90\xFD[PP\x92\x91PPV[a\x08=a\r\xBAV[a\x08Ea\r\xF2V[\x83Q\x81R` \x80\x85\x01Q\x81\x83\x01R\x83Q`@\x83\x01R\x83\x01Q``\x80\x83\x01\x91\x90\x91R`\0\x90\x83`\xC0\x84`\x06a\x07\xD0Z\x03\xFA\x90P\x80\x80\x15a\x07\xE3WP\x80a\x08-W`@\x80QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x12`$\x82\x01Rq\x1C\x18Z\\\x9A[\x99\xCBXY\x19\x0BY\x98Z[\x19Y`r\x1B`D\x82\x01R\x90Q\x90\x81\x90\x03`d\x01\x90\xFD[a\x08\xCEa\r\xBAV[\x81Q\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDG\x90\x15\x80\x15a\t\x01WP` \x83\x01Q\x15[\x15a\t!WPP`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01Ra\tMV[`@Q\x80`@\x01`@R\x80\x84`\0\x01Q\x81R` \x01\x82\x85` \x01Q\x81a\tCW\xFE[\x06\x83\x03\x81RP\x91PP[\x91\x90PV[`@\x80Q`\x04\x80\x82R`\xA0\x82\x01\x90\x92R`\0\x91``\x91\x90\x81` \x01[a\tva\r\xBAV[\x81R` \x01\x90`\x01\x90\x03\x90\x81a\tnWPP`@\x80Q`\x04\x80\x82R`\xA0\x82\x01\x90\x92R\x91\x92P``\x91\x90` \x82\x01[a\t\xACa\x0E\x10V[\x81R` \x01\x90`\x01\x90\x03\x90\x81a\t\xA4W\x90PP\x90P\x8A\x82`\0\x81Q\x81\x10a\t\xCFW\xFE[` \x02` \x01\x01\x81\x90RP\x88\x82`\x01\x81Q\x81\x10a\t\xE8W\xFE[` \x02` \x01\x01\x81\x90RP\x86\x82`\x02\x81Q\x81\x10a\n\x01W\xFE[` \x02` \x01\x01\x81\x90RP\x84\x82`\x03\x81Q\x81\x10a\n\x1AW\xFE[` \x02` \x01\x01\x81\x90RP\x89\x81`\0\x81Q\x81\x10a\n3W\xFE[` \x02` \x01\x01\x81\x90RP\x87\x81`\x01\x81Q\x81\x10a\nLW\xFE[` \x02` \x01\x01\x81\x90RP\x85\x81`\x02\x81Q\x81\x10a\neW\xFE[` \x02` \x01\x01\x81\x90RP\x83\x81`\x03\x81Q\x81\x10a\n~W\xFE[` \x02` \x01\x01\x81\x90RPa\n\x93\x82\x82a\n\xA2V[\x9B\x9APPPPPPPPPPPV[`\0\x81Q\x83Q\x14a\n\xF3W`@\x80QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x16`$\x82\x01Ru\x1C\x18Z\\\x9A[\x99\xCB[\x19[\x99\xDD\x1A\x1C\xCBY\x98Z[\x19Y`R\x1B`D\x82\x01R\x90Q\x90\x81\x90\x03`d\x01\x90\xFD[\x82Q`\x06\x81\x02``\x81g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x80\x15a\x0B\x12W`\0\x80\xFD[P`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a\x0B\x02dsolcC\0\x06\x0C\x003"; - /// The bytecode of the contract. - pub static XORVERIFIER_BYTECODE: ::ethers::core::types::Bytes = - ::ethers::core::types::Bytes::from_static(__BYTECODE); - #[rustfmt::skip] - const __DEPLOYED_BYTECODE: &[u8] = b"`\x80`@R4\x80\x15a\0\x10W`\0\x80\xFD[P`\x046\x10a\0+W`\x005`\xE0\x1C\x80cCu;M\x14a\x000W[`\0\x80\xFD[a\x01,`\x04\x806\x03a\x01 \x81\x10\x15a\0GW`\0\x80\xFD[`@\x80Q\x80\x82\x01\x82R\x91\x83\x01\x92\x91\x81\x83\x01\x91\x83\x90`\x02\x90\x83\x90\x83\x90\x80\x82\x847`\0\x92\x01\x82\x90RP`@\x80Q\x80\x82\x01\x90\x91R\x93\x96\x95\x94`\x80\x81\x01\x94\x93P\x91P`\x02\x90\x83[\x82\x82\x10\x15a\0\xC8W`@\x80Q\x80\x82\x01\x82R\x90\x80\x84\x02\x86\x01\x90`\x02\x90\x83\x90\x83\x90\x80\x82\x847`\0\x92\x01\x91\x90\x91RPPP\x81R`\x01\x90\x91\x01\x90` \x01a\0\x8AV[PP`@\x80Q\x80\x82\x01\x82R\x93\x96\x95\x94\x81\x81\x01\x94\x93P\x91P`\x02\x90\x83\x90\x83\x90\x80\x82\x847`\0\x92\x01\x91\x90\x91RPP`@\x80Q` \x81\x81\x01\x90\x92R\x92\x95\x94\x93\x81\x81\x01\x93\x92P\x90`\x01\x90\x83\x90\x83\x90\x80\x82\x847`\0\x92\x01\x91\x90\x91RP\x91\x94Pa\x01@\x93PPPPV[`@\x80Q\x91\x15\x15\x82RQ\x90\x81\x90\x03` \x01\x90\xF3[`\0a\x01Ja\rAV[`@\x80Q\x80\x82\x01\x82R\x87Q\x81R` \x80\x89\x01Q\x81\x83\x01R\x90\x83R\x81Q`\x80\x81\x01\x83R\x87QQ\x81\x84\x01\x90\x81R\x88Q\x83\x01Q``\x80\x84\x01\x91\x90\x91R\x90\x82R\x83Q\x80\x85\x01\x85R\x89\x84\x01\x80QQ\x82RQ\x84\x01Q\x81\x85\x01R\x82\x84\x01R\x84\x83\x01\x91\x90\x91R\x82Q\x80\x84\x01\x84R\x87Q\x81R\x87\x83\x01Q\x81\x84\x01R\x84\x84\x01R\x82Q`\x01\x80\x82R\x81\x85\x01\x90\x94R\x90\x92\x90\x91\x82\x81\x01\x90\x806\x837\x01\x90PP\x90P`\0[`\x01\x81\x10\x15a\x02\x1AW\x84\x81`\x01\x81\x10a\x01\xF6W\xFE[` \x02\x01Q\x82\x82\x81Q\x81\x10a\x02\x07W\xFE[` \x90\x81\x02\x91\x90\x91\x01\x01R`\x01\x01a\x01\xE1V[Pa\x02%\x81\x83a\x02CV[a\x024W`\x01\x92PPPa\x02;V[`\0\x92PPP[\x94\x93PPPPV[`\0\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01a\x02na\rsV[a\x02va\x04\x1FV[\x90P\x80`\x80\x01QQ\x85Q`\x01\x01\x14a\x02\xCAW`@\x80QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x12`$\x82\x01Rq\x1D\x99\\\x9AY\x9AY\\\x8BX\x98Y\x0BZ[\x9C\x1D]`r\x1B`D\x82\x01R\x90Q\x90\x81\x90\x03`d\x01\x90\xFD[a\x02\xD2a\r\xBAV[`@Q\x80`@\x01`@R\x80`\0\x81R` \x01`\0\x81RP\x90P`\0[\x86Q\x81\x10\x15a\x03\xA8W\x83\x87\x82\x81Q\x81\x10a\x03\x04W\xFE[` \x02` \x01\x01Q\x10a\x03^W`@\x80QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1F`$\x82\x01R\x7Fverifier-gte-snark-scalar-field\0`D\x82\x01R\x90Q\x90\x81\x90\x03`d\x01\x90\xFD[a\x03\x9E\x82a\x03\x99\x85`\x80\x01Q\x84`\x01\x01\x81Q\x81\x10a\x03xW\xFE[` \x02` \x01\x01Q\x8A\x85\x81Q\x81\x10a\x03\x8CW\xFE[` \x02` \x01\x01Qa\x07\xA0V[a\x085V[\x91P`\x01\x01a\x02\xEEV[Pa\x03\xCB\x81\x83`\x80\x01Q`\0\x81Q\x81\x10a\x03\xBEW\xFE[` \x02` \x01\x01Qa\x085V[\x90Pa\x04\x01a\x03\xDD\x86`\0\x01Qa\x08\xC6V[\x86` \x01Q\x84`\0\x01Q\x85` \x01Q\x85\x87`@\x01Q\x8B`@\x01Q\x89``\x01Qa\tRV[a\x04\x11W`\x01\x93PPPPa\x04\x19V[`\0\x93PPPP[\x92\x91PPV[a\x04'a\rsV[`@\x80Q\x80\x82\x01\x82R\x7F\x1D\x1FC\x1C\xB7WP\xD3?O\xB9\x97\xE0\x10\x1FW\x0B\xAD\x12\xEB\x8E\x85\xCCfv+k\x08`)\xE7Z\x81R\x7F\x1C\0\r\x12\xC6\xD7\xA9\x81\xD9\xE5,o\xEB\xF5\x85\x1C\xAEjJ\xC5(\x9F\x02\xF0t\xB1F}\x08\x9B\x12v` \x80\x83\x01\x91\x90\x91R\x90\x83R\x81Q`\x80\x80\x82\x01\x84R\x7F+ \x7F\xA4{\xD0\xEB.?n\xB1~-\xBFK\n\xD6v\x06\xDA\xB6\x99\x18\x87\x95\x1D\x0Ej{\xCAd\xA8\x82\x85\x01\x90\x81R\x7F\x1E>\x89wVD\x15\"3B\xD0\xB7\xB0g\xC1\xCD\xE9S9\xDF\xF3\x07\xFB`bFgBx\x14D\xEB``\x80\x85\x01\x91\x90\x91R\x90\x83R\x84Q\x80\x86\x01\x86R\x7F\x16_A\x8F\x08\xE4\xEF5j\xCB\x14!%\xE3#\x1E{H\xE6\xC2!F\xA8\x1C3\xE7\xBC7\x87v\x83\\\x81R\x7F%~\0\x07\xDA|\x8A\xB8\xAE\xB0}\xF4\x02\x04\xD3\xC0\xE4,\xAB\x8C\x802F\xF2UW\xE4\xBC\xD9\x8DV\x96\x81\x86\x01R\x83\x85\x01R\x85\x84\x01\x92\x90\x92R\x83Q\x80\x82\x01\x85R\x7F\x19\x8E\x93\x93\x92\rH:r`\xBF\xB71\xFB]%\xF1\xAAI35\xA9\xE7\x12\x97\xE4\x85\xB7\xAE\xF3\x12\xC2\x81\x86\x01\x90\x81R\x7F\x18\0\xDE\xEF\x12\x1F\x1EvBj\0f^\\DygC\"\xD4\xF7^\xDA\xDDF\xDE\xBD\\\xD9\x92\xF6\xED\x82\x85\x01R\x81R\x84Q\x80\x86\x01\x86R\x7F\t\x06\x89\xD0X_\xF0u\xEC\x9E\x99\xADi\x0C3\x95\xBCK13p\xB3\x8E\xF3U\xAC\xDA\xDC\xD1\"\x97[\x81R\x7F\x12\xC8^\xA5\xDB\x8Cm\xEBJ\xABq\x80\x8D\xCB@\x8F\xE3\xD1\xE7i\x0CC\xD3{L\xE6\xCC\x01f\xFA}\xAA\x81\x86\x01R\x81\x85\x01R\x85\x85\x01R\x83Q\x90\x81\x01\x84R\x7F\x1E\x91#\xAF\x85\x93\xCB\xF1\xBB\xFFt\xDBS\xB6f\xDD\xCD\x99Y)\xFA\xBA\xF7>\x0F\xD3\x15\xD3\xF5ZL\x02\x81\x85\x01\x90\x81R\x7F\x03K/\x96g?\x16\xCBlT\xECc\xC4\x89\xCF(F\xE8pw\x96\xC0\x89\x1Eh!\x15\xC80\xC7\x0E\xCB\x82\x84\x01R\x81R\x83Q\x80\x85\x01\x85R\x7F+\x911\x8F\xD4G\xF5Y6\xBA\xF1\x89YT?\xAE\x8E\xB3%4\x81\xC3\x94\xD8V\xC4\x9C\xD2d\xACYX\x81R\x7F'\x15\x99\xA19.|v\x11`\xC7x\x91\x06\xCE\x10h\x05\x15_~\xC9l\x03\x82\x90i\x8F\x1C\xB7\x15\xC4\x81\x85\x01R\x81\x84\x01R\x81\x85\x01R\x82Q`\x02\x80\x82R\x91\x81\x01\x90\x93R\x90\x82\x01[a\x06\xA8a\r\xBAV[\x81R` \x01\x90`\x01\x90\x03\x90\x81a\x06\xA0WPP`\x80\x82\x01\x90\x81R`@\x80Q\x80\x82\x01\x90\x91R\x7F%y\xC7\xCA\x03\xEF\xA64\x9CC\xAAV\xCA\x18l\xADu4\xA8p]\xB9\xC1\x8E\xC9\"\x02\xD8\x81e\xC0L\x81R\x7F\x04\xE8$\xD0\xF4\x0E\xD2p\xF7\x03\x82\x16}\x94C\xAC-(5%\xB9\x19\t:\xD5)\x8B#[L\x9E\x87` \x82\x01R\x90Q\x80Q`\0\x90a\x07!W\xFE[` \x02` \x01\x01\x81\x90RP`@Q\x80`@\x01`@R\x80\x7F\x12\x1F\xCC:4^\xFE\xE7>\x13\x12\xA9\x9D\xA0wq\xF5\xD8\xF6\xAD\x9AMz\x97}\xFBT\xEF9\xA9\xEAC\x81R` \x01\x7F\x1AW\n\xBDV\xB5r\x1F\x9B\xF9\x04BL\xFC\xD6^M\xC0\x03h\\\xA6\xCBWF\xDC\xC7\xB0\xF6\x87\x93]\x81RP\x81`\x80\x01Q`\x01\x81Q\x81\x10a\x07\x92W\xFE[` \x02` \x01\x01\x81\x90RP\x90V[a\x07\xA8a\r\xBAV[a\x07\xB0a\r\xD4V[\x83Q\x81R` \x80\x85\x01Q\x90\x82\x01R`@\x81\x01\x83\x90R`\0``\x83`\x80\x84`\x07a\x07\xD0Z\x03\xFA\x90P\x80\x80\x15a\x07\xE3Wa\x07\xE5V[\xFE[P\x80a\x08-W`@\x80QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x12`$\x82\x01Rq\x1C\x18Z\\\x9A[\x99\xCB[][\x0BY\x98Z[\x19Y`r\x1B`D\x82\x01R\x90Q\x90\x81\x90\x03`d\x01\x90\xFD[PP\x92\x91PPV[a\x08=a\r\xBAV[a\x08Ea\r\xF2V[\x83Q\x81R` \x80\x85\x01Q\x81\x83\x01R\x83Q`@\x83\x01R\x83\x01Q``\x80\x83\x01\x91\x90\x91R`\0\x90\x83`\xC0\x84`\x06a\x07\xD0Z\x03\xFA\x90P\x80\x80\x15a\x07\xE3WP\x80a\x08-W`@\x80QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x12`$\x82\x01Rq\x1C\x18Z\\\x9A[\x99\xCBXY\x19\x0BY\x98Z[\x19Y`r\x1B`D\x82\x01R\x90Q\x90\x81\x90\x03`d\x01\x90\xFD[a\x08\xCEa\r\xBAV[\x81Q\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDG\x90\x15\x80\x15a\t\x01WP` \x83\x01Q\x15[\x15a\t!WPP`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01Ra\tMV[`@Q\x80`@\x01`@R\x80\x84`\0\x01Q\x81R` \x01\x82\x85` \x01Q\x81a\tCW\xFE[\x06\x83\x03\x81RP\x91PP[\x91\x90PV[`@\x80Q`\x04\x80\x82R`\xA0\x82\x01\x90\x92R`\0\x91``\x91\x90\x81` \x01[a\tva\r\xBAV[\x81R` \x01\x90`\x01\x90\x03\x90\x81a\tnWPP`@\x80Q`\x04\x80\x82R`\xA0\x82\x01\x90\x92R\x91\x92P``\x91\x90` \x82\x01[a\t\xACa\x0E\x10V[\x81R` \x01\x90`\x01\x90\x03\x90\x81a\t\xA4W\x90PP\x90P\x8A\x82`\0\x81Q\x81\x10a\t\xCFW\xFE[` \x02` \x01\x01\x81\x90RP\x88\x82`\x01\x81Q\x81\x10a\t\xE8W\xFE[` \x02` \x01\x01\x81\x90RP\x86\x82`\x02\x81Q\x81\x10a\n\x01W\xFE[` \x02` \x01\x01\x81\x90RP\x84\x82`\x03\x81Q\x81\x10a\n\x1AW\xFE[` \x02` \x01\x01\x81\x90RP\x89\x81`\0\x81Q\x81\x10a\n3W\xFE[` \x02` \x01\x01\x81\x90RP\x87\x81`\x01\x81Q\x81\x10a\nLW\xFE[` \x02` \x01\x01\x81\x90RP\x85\x81`\x02\x81Q\x81\x10a\neW\xFE[` \x02` \x01\x01\x81\x90RP\x83\x81`\x03\x81Q\x81\x10a\n~W\xFE[` \x02` \x01\x01\x81\x90RPa\n\x93\x82\x82a\n\xA2V[\x9B\x9APPPPPPPPPPPV[`\0\x81Q\x83Q\x14a\n\xF3W`@\x80QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x16`$\x82\x01Ru\x1C\x18Z\\\x9A[\x99\xCB[\x19[\x99\xDD\x1A\x1C\xCBY\x98Z[\x19Y`R\x1B`D\x82\x01R\x90Q\x90\x81\x90\x03`d\x01\x90\xFD[\x82Q`\x06\x81\x02``\x81g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x80\x15a\x0B\x12W`\0\x80\xFD[P`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a\x0B\x02dsolcC\0\x06\x0C\x003"; - /// The deployed bytecode of the contract. - pub static XORVERIFIER_DEPLOYED_BYTECODE: ::ethers::core::types::Bytes = - ::ethers::core::types::Bytes::from_static(__DEPLOYED_BYTECODE); - pub struct XorVerifier(::ethers::contract::Contract); - impl ::core::clone::Clone for XorVerifier { - fn clone(&self) -> Self { - Self(::core::clone::Clone::clone(&self.0)) - } - } - impl ::core::ops::Deref for XorVerifier { - type Target = ::ethers::contract::Contract; - fn deref(&self) -> &Self::Target { - &self.0 - } - } - impl ::core::ops::DerefMut for XorVerifier { - fn deref_mut(&mut self) -> &mut Self::Target { - &mut self.0 - } - } - impl ::core::fmt::Debug for XorVerifier { - fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { - f.debug_tuple(::core::stringify!(XorVerifier)) - .field(&self.address()) - .finish() - } - } - impl XorVerifier { - /// 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(), - XORVERIFIER_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( - XORVERIFIER_ABI.clone(), - XORVERIFIER_BYTECODE.clone().into(), - client, - ); - let deployer = factory.deploy(constructor_args)?; - let deployer = ::ethers::contract::ContractDeployer::new(deployer); - Ok(deployer) - } - ///Calls the contract's `verifyProof` (0x43753b4d) function - pub fn verify_proof( - &self, - a: [::ethers::core::types::U256; 2], - b: [[::ethers::core::types::U256; 2]; 2], - c: [::ethers::core::types::U256; 2], - input: [::ethers::core::types::U256; 1], - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([67, 117, 59, 77], (a, b, c, input)) - .expect("method not found (this should never happen)") - } - } - impl From<::ethers::contract::Contract> for XorVerifier { - 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(uint256[2],uint256[2][2],uint256[2],uint256[1])` and selector `0x43753b4d` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall( - name = "verifyProof", - abi = "verifyProof(uint256[2],uint256[2][2],uint256[2],uint256[1])" - )] - pub struct VerifyProofCall { - pub a: [::ethers::core::types::U256; 2], - pub b: [[::ethers::core::types::U256; 2]; 2], - pub c: [::ethers::core::types::U256; 2], - pub input: [::ethers::core::types::U256; 1], - } - ///Container type for all return fields from the `verifyProof` function with signature `verifyProof(uint256[2],uint256[2][2],uint256[2],uint256[1])` and selector `0x43753b4d` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct VerifyProofReturn { - pub r: bool, - } -} diff --git a/bindings/src/zkb_verifier.rs b/bindings/src/zkb_verifier.rs deleted file mode 100644 index c0a7cb4..0000000 --- a/bindings/src/zkb_verifier.rs +++ /dev/null @@ -1,201 +0,0 @@ -pub use zkb_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 zkb_verifier { - #[allow(deprecated)] - fn __abi() -> ::ethers::core::abi::Abi { - ::ethers::core::abi::ethabi::Contract { - constructor: ::core::option::Option::None, - functions: ::core::convert::From::from([( - ::std::borrow::ToOwned::to_owned("verifyProof"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("verifyProof"), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("input"), - kind: ::ethers::core::abi::ethabi::ParamType::FixedArray( - ::std::boxed::Box::new( - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ), - 5usize, - ), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256[5]"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("p"), - kind: ::ethers::core::abi::ethabi::ParamType::FixedArray( - ::std::boxed::Box::new( - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ), - 8usize, - ), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256[8]"), - ), - }, - ], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Bool, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bool"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - },], - )]), - events: ::std::collections::BTreeMap::new(), - errors: ::std::collections::BTreeMap::new(), - receive: false, - fallback: false, - } - } - ///The parsed JSON ABI of the contract. - pub static ZKBVERIFIER_ABI: ::ethers::contract::Lazy<::ethers::core::abi::Abi> = - ::ethers::contract::Lazy::new(__abi); - #[rustfmt::skip] - const __BYTECODE: &[u8] = b"`\x80`@R4\x80\x15a\0\x10W`\0\x80\xFD[Pa\r\xE2\x80a\0 `\09`\0\xF3\xFE`\x80`@R4\x80\x15a\0\x10W`\0\x80\xFD[P`\x046\x10a\0+W`\x005`\xE0\x1C\x80chDM\xC7\x14a\x000W[`\0\x80\xFD[a\0\xB0`\x04\x806\x03a\x01\xA0\x81\x10\x15a\0GW`\0\x80\xFD[\x81\x01\x90\x80\x80`\xA0\x01\x90`\x05\x80` \x02`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x82`\x05` \x02\x80\x82\x847`\0\x92\x01\x91\x90\x91RPP`@\x80Qa\x01\0\x81\x81\x01\x90\x92R\x92\x95\x94\x93\x81\x81\x01\x93\x92P\x90`\x08\x90\x83\x90\x83\x90\x80\x82\x847`\0\x92\x01\x91\x90\x91RP\x91\x94Pa\0\xC4\x93PPPPV[`@\x80Q\x91\x15\x15\x82RQ\x90\x81\x90\x03` \x01\x90\xF3[`\0\x80[`\x08\x81`\xFF\x16\x10\x15a\x01MW\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDG\x83\x82`\xFF\x16`\x08\x81\x10a\x01\x04W\xFE[` \x02\x01Q\x10a\x01EW`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01\x80\x80` \x01\x82\x81\x03\x82R`\"\x81R` \x01\x80a\r\x8B`\"\x919`@\x01\x91PP`@Q\x80\x91\x03\x90\xFD[`\x01\x01a\0\xC8V[Pa\x01Va\x0B\xD8V[`@\x80Q\x80\x82\x01\x82R\x84Q\x81R` \x80\x86\x01Q\x81\x83\x01R\x90\x83R\x81Q`\x80\x80\x82\x01\x84R``\x80\x88\x01Q\x83\x86\x01\x90\x81R\x88\x86\x01Q\x91\x84\x01\x91\x90\x91R\x82R\x83Q\x80\x85\x01\x85R`\xA0\x88\x01Q\x81R\x90\x87\x01Q\x81\x84\x01R\x81\x83\x01R\x83\x82\x01R\x81Q\x80\x83\x01\x83R`\xC0\x86\x01Q\x81R`\xE0\x86\x01Q\x91\x81\x01\x91\x90\x91R\x90\x82\x01Ra\x01\xD6a\x0C\nV[a\x01\xDEa\x035V[\x90Pa\x01\xE8a\x0CQV[`@Q\x80`@\x01`@R\x80`\0\x81R` \x01`\0\x81RP\x90Pa\x02 \x81\x83`\x80\x01Q`\0`\x06\x81\x10a\x02\x16W\xFE[` \x02\x01Qa\x07\xADV[\x90P`\0[`\x05\x81\x10\x15a\x02\xF6W\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\x87\x82`\x05\x81\x10a\x02[W\xFE[` \x02\x01Q\x10a\x02\xB2W`@\x80QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1F`$\x82\x01R\x7Fverifier-gte-snark-scalar-field\0`D\x82\x01R\x90Q\x90\x81\x90\x03`d\x01\x90\xFD[a\x02\xEC\x82a\x02\xE7\x85`\x80\x01Q\x84`\x01\x01`\x06\x81\x10a\x02\xCCW\xFE[` \x02\x01Q\x8A\x85`\x05\x81\x10a\x02\xDDW\xFE[` \x02\x01Qa\x08MV[a\x07\xADV[\x91P`\x01\x01a\x02%V[Pa\x03+a\x03\x07\x84`\0\x01Qa\x08\xD3V[\x84` \x01Q\x84`\0\x01Q\x85` \x01Q\x85\x87`@\x01Q\x89`@\x01Q\x89``\x01Qa\tzV[\x96\x95PPPPPPV[a\x03=a\x0C\nV[`@\x80Q\x80\x82\x01\x82R\x7F&(\x9C\xD8\xAB\xD1\xFA*\x98\xD4c\xC9\x9B,'\xF4\xD9?\xC0\x0E98\r#J\xC12!\xAE\x9B\x04\xA1\x81R\x7F\x0Et\xE5Bm\xB6\xB0{L_\xDE\xB9\xC8E\xCDz\xD2h\xE0\x17\xEC\x85-V\x9C{x\x89\xA1!\xC60` \x80\x83\x01\x91\x90\x91R\x90\x83R\x81Q`\x80\x80\x82\x01\x84R\x7F\x18\x88\xEC\xD7\xB2\xC8\xCF\xEBhz\xD2\xA24\xC8[\x82\x91V\xA80\xE7\xEC\x17\xE8\xF8\xFA6p\x19\x1F\xBB\xD4\x82\x85\x01\x90\x81R\x7F\rJ\x12\xA0\x9A\x90\xD3C\xC5\xBF'\x8D\xACb\xA5\xBB\xDF\xD2>y`\x0F\x91\x99G\x0E\x1D%\xE8q\xD0\xD4``\x80\x85\x01\x91\x90\x91R\x90\x83R\x84Q\x80\x86\x01\x86R\x7F*\t\x1F\xD6\xEB\x11~9OV\xD1r\x80\x02\xCB\xC2\xAC\r\x80\xB1\x81\xA4\xC7e\xDF\x0Em\xF8\xE1\xC8^G\x81R\x7F\x19\x03\xBD:\x84:!\xC3\x0F(\x9C\x0C\x16\x84\x0B\t\xD0Y\xBF|F)\x8CY\xD3\xE3\xF1A\x826~X\x81\x86\x01R\x83\x85\x01R\x85\x84\x01\x92\x90\x92R\x83Q\x80\x82\x01\x85R\x7F\x19\x8E\x93\x93\x92\rH:r`\xBF\xB71\xFB]%\xF1\xAAI35\xA9\xE7\x12\x97\xE4\x85\xB7\xAE\xF3\x12\xC2\x81\x86\x01\x90\x81R\x7F\x18\0\xDE\xEF\x12\x1F\x1EvBj\0f^\\DygC\"\xD4\xF7^\xDA\xDDF\xDE\xBD\\\xD9\x92\xF6\xED\x82\x85\x01R\x81R\x84Q\x80\x86\x01\x86R\x7F\t\x06\x89\xD0X_\xF0u\xEC\x9E\x99\xADi\x0C3\x95\xBCK13p\xB3\x8E\xF3U\xAC\xDA\xDC\xD1\"\x97[\x81R\x7F\x12\xC8^\xA5\xDB\x8Cm\xEBJ\xABq\x80\x8D\xCB@\x8F\xE3\xD1\xE7i\x0CC\xD3{L\xE6\xCC\x01f\xFA}\xAA\x81\x86\x01R\x81\x85\x01R\x85\x85\x01R\x83Q\x80\x82\x01\x85R\x7F(\xBB\x9Bu\xD5\xE8\xB3!Z\x84>\xB2>\xC1\xB5<\"d\xB6\xCC\x1B\xBC\xBBG\xA9\xF7\x0F\"\xCDK\xFB\xD6\x81\x86\x01\x90\x81R\x7F\x10x\xC3\x11\xC3\x95?\xAE/\xFFw4\xCB\xFCb\xC9by\xFC_\xFA(/\xEF\x0E\xA7f\xB7d\xA7\xD4\xAC\x82\x85\x01R\x81R\x84Q\x80\x86\x01\x86R\x7F (\xCE\x02k\xC8=?\xE9\xAB^\xD8\xD8\xB0P.\x1B\xD5\x984\xEB\x1D/\x8D\x8E\xDC\xC8\t\xD6\x9F\xB4\xB7\x81R\x7F\x1A\x02Yd:t\xAA[\xB3\x0E\xB2\xD3\xBF\xEED\x17\xEF\xF3\\n\x95\xE9N\x11\xF5\xF8\xE5\x96]\r>d\x81\x86\x01R\x81\x85\x01R\x82\x86\x01R\x83Q\x80\x85\x01\x85R\x7F\rP\xB8\xCEIs\x18\xB9\x04e\xD6V\xDC\x94B\x82>\x02\xC7\xEC\x85\xAC\xD1\xF6\x952\x9E\xE6P\xFA\x17\xB2\x81R\x7F\x1D5\xAE\xE55\xBEy\x85zb\xE5\x9B\xD7G2\xEB\xA4@\xEB\xF2\xB00\xAE\xC5\xE4\xBD\x01gD\xD6\xC2G\x81\x85\x01R\x81\x86\x01\x80Q\x91\x90\x91R\x84Q\x80\x86\x01\x86R\x7F\x1B\xFB\x0C>'z\xD4en\x83\x86\xC2d\xA1\xEAnt\xF4A\t\xC3\xC5'%_I\x02\xB6n\x04rs\x81R\x7F\r{;\xF0\xD9\x84\x8BS[\xF3G-\xCBs\xEDm\xB7\xD5-\xD0\x7F\xCE\xF7\xBE\xEF\xD5\xFE\xC4d\xD2\x92\\\x81\x86\x01R\x81Q\x85\x01R\x84Q\x80\x86\x01\x86R\x7F\x1C\xCCQ\xAD2\xBB5\x96\xA2v\xC5pU\xC2\xB5\xFD(d+\x8D\xF1>\xB1\xD4\xFA\xE8\x18\xBF\xF1\x91\xF5\xA4\x81R\x7F\x0E\x1E\xA7\")\xEE[U\x05\xD6\x8F\xF7E'\xEF\x8D\xAB; Tw\x8A\xDE\xF5z1\x83T\x8C#\xDAp\x81\x86\x01R\x81Q\x86\x01R\x84Q\x80\x86\x01\x86R\x7F\x1FH\xEE\xE9y\x8D\ts\x87\x14\x18B\xCA\xA4\x9B8\xA8v\xA2;5h\xBB\xC2\xBE\xC8\x9E\xF0\x1E\0.\xD7\x81R\x7F(\xE4H\x93d[d\x13\xB1\x02\xD1\x1C\x96R\x17\xEF#\x1E-}\x8Cn\xF2\xD4\xAE.\xD3\x17{\xA1~k\x81\x86\x01R\x81Q\x90\x93\x01\x92\x90\x92R\x83Q\x80\x85\x01\x85R\x7F\x1EY\xE3Lw\xDD\xF0W\xEF\x1C^4\"E\\G\xB7|\xFA\xF7\xC9\tB\xC6%\x0BB\xCFBV\xCA\x89\x81R\x7F'\xAAn\xC4\x9Du7>\xE3jn\xC3\x12\xD7\xF3\xDC\xE5\x9D\xDB\xB0\xB5\x82~f7\xFE\xB1\xCD\xA9\xFFAj\x81\x85\x01R\x82Q\x90\x91\x01R\x82Q\x80\x84\x01\x90\x93R\x7F\x19\xFEA\x86w\xE7CP>\xD2C\xFBN\xF3\x13\x97m\xD3\x10\xE0sfZ\xBE\xC5b\x14n\xBEhUY\x83R\x7F\x0Cd\xF6\xE1\xA0\xFD\x0E\x0F8`=\xF6\n\x84\xDD\xE2\x99\xD7\x0Ft\xAC\x83H\xD45\xE0r\x02\xCCWs\x9B\x91\x83\x01\x91\x90\x91RQ`\xA0\x01R\x90V[a\x07\xB5a\x0CQV[a\x07\xBDa\x0CkV[\x83Q\x81R` \x80\x85\x01Q\x81\x83\x01R\x83Q`@\x83\x01R\x83\x01Q``\x80\x83\x01\x91\x90\x91R`\0\x90\x83`\xC0\x84`\x06a\x07\xD0Z\x03\xFA\x90P\x80\x80\x15a\x07\xFBWa\x07\xFDV[\xFE[P\x80a\x08EW`@\x80QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x12`$\x82\x01Rq\x1C\x18Z\\\x9A[\x99\xCBXY\x19\x0BY\x98Z[\x19Y`r\x1B`D\x82\x01R\x90Q\x90\x81\x90\x03`d\x01\x90\xFD[PP\x92\x91PPV[a\x08Ua\x0CQV[a\x08]a\x0C\x89V[\x83Q\x81R` \x80\x85\x01Q\x90\x82\x01R`@\x81\x01\x83\x90R`\0``\x83`\x80\x84`\x07a\x07\xD0Z\x03\xFA\x90P\x80\x80\x15a\x07\xFBWP\x80a\x08EW`@\x80QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x12`$\x82\x01Rq\x1C\x18Z\\\x9A[\x99\xCB[][\x0BY\x98Z[\x19Y`r\x1B`D\x82\x01R\x90Q\x90\x81\x90\x03`d\x01\x90\xFD[a\x08\xDBa\x0CQV[\x81Q\x15\x80\x15a\x08\xECWP` \x82\x01Q\x15[\x15a\t\x0BWP`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01Ra\tuV[`@Q\x80`@\x01`@R\x80\x83`\0\x01Q\x81R` \x01\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDG\x84` \x01Q\x81a\tMW\xFE[\x06\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDG\x03\x90R\x90P[\x91\x90PV[`\0a\t\x84a\x0C\xA7V[`@Q\x80`\x80\x01`@R\x80\x8B\x81R` \x01\x89\x81R` \x01\x87\x81R` \x01\x85\x81RP\x90Pa\t\xAFa\x0C\xD4V[P`@\x80Q`\x80\x81\x01\x82R\x8A\x81R` \x81\x01\x89\x90R\x80\x82\x01\x87\x90R``\x80\x82\x01\x86\x90R\x82Q`\x18\x80\x82Ra\x03 \x82\x01\x90\x94R\x91\x92\x91\x82\x81` \x01` \x82\x02\x806\x837\x01\x90PP\x90P`\0[`\x04\x81\x10\x15a\x0BQW`\x06\x81\x02\x85\x82`\x04\x81\x10a\n\x13W\xFE[` \x02\x01QQ\x83Q\x84\x90\x83\x90\x81\x10a\n'W\xFE[` \x02` \x01\x01\x81\x81RPP\x85\x82`\x04\x81\x10a\n?W\xFE[` \x02\x01Q` \x01Q\x83\x82`\x01\x01\x81Q\x81\x10a\nWW\xFE[` \x02` \x01\x01\x81\x81RPP\x84\x82`\x04\x81\x10a\noW\xFE[` \x02\x01QQQ\x83Q\x84\x90`\x02\x84\x01\x90\x81\x10a\n\x87W\xFE[` \x02` \x01\x01\x81\x81RPP\x84\x82`\x04\x81\x10a\n\x9FW\xFE[` \x02\x01QQ`\x01` \x02\x01Q\x83\x82`\x03\x01\x81Q\x81\x10a\n\xBBW\xFE[` \x02` \x01\x01\x81\x81RPP\x84\x82`\x04\x81\x10a\n\xD3W\xFE[` \x02\x01Q` \x01Q`\0`\x02\x81\x10a\n\xE8W\xFE[` \x02\x01Q\x83\x82`\x04\x01\x81Q\x81\x10a\n\xFCW\xFE[` \x02` \x01\x01\x81\x81RPP\x84\x82`\x04\x81\x10a\x0B\x14W\xFE[` \x02\x01Q` \x01Q`\x01`\x02\x81\x10a\x0B)W\xFE[` \x02\x01Q\x83\x82`\x05\x01\x81Q\x81\x10a\x0B=W\xFE[` \x90\x81\x02\x91\x90\x91\x01\x01RP`\x01\x01a\t\xFAV[Pa\x0BZa\r\x01V[`\0` \x82` \x86\x02` \x86\x01`\x08a\x07\xD0Z\x03\xFA\x90P\x80\x80\x15a\x07\xFBWP\x80a\x0B\xC3W`@\x80QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x15`$\x82\x01Rt\x1C\x18Z\\\x9A[\x99\xCB[\xDC\x18\xDB\xD9\x19KY\x98Z[\x19Y`Z\x1B`D\x82\x01R\x90Q\x90\x81\x90\x03`d\x01\x90\xFD[PQ\x15\x15\x9D\x9CPPPPPPPPPPPPPV[`@Q\x80``\x01`@R\x80a\x0B\xEBa\x0CQV[\x81R` \x01a\x0B\xF8a\r\x1FV[\x81R` \x01a\x0C\x05a\x0CQV[\x90R\x90V[`@Q\x80`\xA0\x01`@R\x80a\x0C\x1Da\x0CQV[\x81R` \x01a\x0C*a\r\x1FV[\x81R` \x01a\x0C7a\r\x1FV[\x81R` \x01a\x0CDa\r\x1FV[\x81R` \x01a\x0C\x05a\r?V[`@Q\x80`@\x01`@R\x80`\0\x81R` \x01`\0\x81RP\x90V[`@Q\x80`\x80\x01`@R\x80`\x04\x90` \x82\x02\x806\x837P\x91\x92\x91PPV[`@Q\x80``\x01`@R\x80`\x03\x90` \x82\x02\x806\x837P\x91\x92\x91PPV[`@Q\x80`\x80\x01`@R\x80`\x04\x90[a\x0C\xBEa\x0CQV[\x81R` \x01\x90`\x01\x90\x03\x90\x81a\x0C\xB6W\x90PP\x90V[`@Q\x80`\x80\x01`@R\x80`\x04\x90[a\x0C\xEBa\r\x1FV[\x81R` \x01\x90`\x01\x90\x03\x90\x81a\x0C\xE3W\x90PP\x90V[`@Q\x80` \x01`@R\x80`\x01\x90` \x82\x02\x806\x837P\x91\x92\x91PPV[`@Q\x80`@\x01`@R\x80a\r2a\rlV[\x81R` \x01a\x0C\x05a\rlV[`@Q\x80`\xC0\x01`@R\x80`\x06\x90[a\rVa\x0CQV[\x81R` \x01\x90`\x01\x90\x03\x90\x81a\rNW\x90PP\x90V[`@Q\x80`@\x01`@R\x80`\x02\x90` \x82\x02\x806\x837P\x91\x92\x91PPV\xFEverifier-proof-element-gte-prime-q\xA2dipfsX\"\x12 \xB4\x86\x8C\xE3[6\xB0\xCD\xBBF\x97\\w\xF3\xBE\x0E\xE2\xD3.\xB3\x9E<\xE9\x18\xFCi\x9E\x9DU\x10\xF7%dsolcC\0\x06\x0C\x003"; - /// The bytecode of the contract. - pub static ZKBVERIFIER_BYTECODE: ::ethers::core::types::Bytes = - ::ethers::core::types::Bytes::from_static(__BYTECODE); - #[rustfmt::skip] - const __DEPLOYED_BYTECODE: &[u8] = b"`\x80`@R4\x80\x15a\0\x10W`\0\x80\xFD[P`\x046\x10a\0+W`\x005`\xE0\x1C\x80chDM\xC7\x14a\x000W[`\0\x80\xFD[a\0\xB0`\x04\x806\x03a\x01\xA0\x81\x10\x15a\0GW`\0\x80\xFD[\x81\x01\x90\x80\x80`\xA0\x01\x90`\x05\x80` \x02`@Q\x90\x81\x01`@R\x80\x92\x91\x90\x82`\x05` \x02\x80\x82\x847`\0\x92\x01\x91\x90\x91RPP`@\x80Qa\x01\0\x81\x81\x01\x90\x92R\x92\x95\x94\x93\x81\x81\x01\x93\x92P\x90`\x08\x90\x83\x90\x83\x90\x80\x82\x847`\0\x92\x01\x91\x90\x91RP\x91\x94Pa\0\xC4\x93PPPPV[`@\x80Q\x91\x15\x15\x82RQ\x90\x81\x90\x03` \x01\x90\xF3[`\0\x80[`\x08\x81`\xFF\x16\x10\x15a\x01MW\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDG\x83\x82`\xFF\x16`\x08\x81\x10a\x01\x04W\xFE[` \x02\x01Q\x10a\x01EW`@QbF\x1B\xCD`\xE5\x1B\x81R`\x04\x01\x80\x80` \x01\x82\x81\x03\x82R`\"\x81R` \x01\x80a\r\x8B`\"\x919`@\x01\x91PP`@Q\x80\x91\x03\x90\xFD[`\x01\x01a\0\xC8V[Pa\x01Va\x0B\xD8V[`@\x80Q\x80\x82\x01\x82R\x84Q\x81R` \x80\x86\x01Q\x81\x83\x01R\x90\x83R\x81Q`\x80\x80\x82\x01\x84R``\x80\x88\x01Q\x83\x86\x01\x90\x81R\x88\x86\x01Q\x91\x84\x01\x91\x90\x91R\x82R\x83Q\x80\x85\x01\x85R`\xA0\x88\x01Q\x81R\x90\x87\x01Q\x81\x84\x01R\x81\x83\x01R\x83\x82\x01R\x81Q\x80\x83\x01\x83R`\xC0\x86\x01Q\x81R`\xE0\x86\x01Q\x91\x81\x01\x91\x90\x91R\x90\x82\x01Ra\x01\xD6a\x0C\nV[a\x01\xDEa\x035V[\x90Pa\x01\xE8a\x0CQV[`@Q\x80`@\x01`@R\x80`\0\x81R` \x01`\0\x81RP\x90Pa\x02 \x81\x83`\x80\x01Q`\0`\x06\x81\x10a\x02\x16W\xFE[` \x02\x01Qa\x07\xADV[\x90P`\0[`\x05\x81\x10\x15a\x02\xF6W\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\x87\x82`\x05\x81\x10a\x02[W\xFE[` \x02\x01Q\x10a\x02\xB2W`@\x80QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1F`$\x82\x01R\x7Fverifier-gte-snark-scalar-field\0`D\x82\x01R\x90Q\x90\x81\x90\x03`d\x01\x90\xFD[a\x02\xEC\x82a\x02\xE7\x85`\x80\x01Q\x84`\x01\x01`\x06\x81\x10a\x02\xCCW\xFE[` \x02\x01Q\x8A\x85`\x05\x81\x10a\x02\xDDW\xFE[` \x02\x01Qa\x08MV[a\x07\xADV[\x91P`\x01\x01a\x02%V[Pa\x03+a\x03\x07\x84`\0\x01Qa\x08\xD3V[\x84` \x01Q\x84`\0\x01Q\x85` \x01Q\x85\x87`@\x01Q\x89`@\x01Q\x89``\x01Qa\tzV[\x96\x95PPPPPPV[a\x03=a\x0C\nV[`@\x80Q\x80\x82\x01\x82R\x7F&(\x9C\xD8\xAB\xD1\xFA*\x98\xD4c\xC9\x9B,'\xF4\xD9?\xC0\x0E98\r#J\xC12!\xAE\x9B\x04\xA1\x81R\x7F\x0Et\xE5Bm\xB6\xB0{L_\xDE\xB9\xC8E\xCDz\xD2h\xE0\x17\xEC\x85-V\x9C{x\x89\xA1!\xC60` \x80\x83\x01\x91\x90\x91R\x90\x83R\x81Q`\x80\x80\x82\x01\x84R\x7F\x18\x88\xEC\xD7\xB2\xC8\xCF\xEBhz\xD2\xA24\xC8[\x82\x91V\xA80\xE7\xEC\x17\xE8\xF8\xFA6p\x19\x1F\xBB\xD4\x82\x85\x01\x90\x81R\x7F\rJ\x12\xA0\x9A\x90\xD3C\xC5\xBF'\x8D\xACb\xA5\xBB\xDF\xD2>y`\x0F\x91\x99G\x0E\x1D%\xE8q\xD0\xD4``\x80\x85\x01\x91\x90\x91R\x90\x83R\x84Q\x80\x86\x01\x86R\x7F*\t\x1F\xD6\xEB\x11~9OV\xD1r\x80\x02\xCB\xC2\xAC\r\x80\xB1\x81\xA4\xC7e\xDF\x0Em\xF8\xE1\xC8^G\x81R\x7F\x19\x03\xBD:\x84:!\xC3\x0F(\x9C\x0C\x16\x84\x0B\t\xD0Y\xBF|F)\x8CY\xD3\xE3\xF1A\x826~X\x81\x86\x01R\x83\x85\x01R\x85\x84\x01\x92\x90\x92R\x83Q\x80\x82\x01\x85R\x7F\x19\x8E\x93\x93\x92\rH:r`\xBF\xB71\xFB]%\xF1\xAAI35\xA9\xE7\x12\x97\xE4\x85\xB7\xAE\xF3\x12\xC2\x81\x86\x01\x90\x81R\x7F\x18\0\xDE\xEF\x12\x1F\x1EvBj\0f^\\DygC\"\xD4\xF7^\xDA\xDDF\xDE\xBD\\\xD9\x92\xF6\xED\x82\x85\x01R\x81R\x84Q\x80\x86\x01\x86R\x7F\t\x06\x89\xD0X_\xF0u\xEC\x9E\x99\xADi\x0C3\x95\xBCK13p\xB3\x8E\xF3U\xAC\xDA\xDC\xD1\"\x97[\x81R\x7F\x12\xC8^\xA5\xDB\x8Cm\xEBJ\xABq\x80\x8D\xCB@\x8F\xE3\xD1\xE7i\x0CC\xD3{L\xE6\xCC\x01f\xFA}\xAA\x81\x86\x01R\x81\x85\x01R\x85\x85\x01R\x83Q\x80\x82\x01\x85R\x7F(\xBB\x9Bu\xD5\xE8\xB3!Z\x84>\xB2>\xC1\xB5<\"d\xB6\xCC\x1B\xBC\xBBG\xA9\xF7\x0F\"\xCDK\xFB\xD6\x81\x86\x01\x90\x81R\x7F\x10x\xC3\x11\xC3\x95?\xAE/\xFFw4\xCB\xFCb\xC9by\xFC_\xFA(/\xEF\x0E\xA7f\xB7d\xA7\xD4\xAC\x82\x85\x01R\x81R\x84Q\x80\x86\x01\x86R\x7F (\xCE\x02k\xC8=?\xE9\xAB^\xD8\xD8\xB0P.\x1B\xD5\x984\xEB\x1D/\x8D\x8E\xDC\xC8\t\xD6\x9F\xB4\xB7\x81R\x7F\x1A\x02Yd:t\xAA[\xB3\x0E\xB2\xD3\xBF\xEED\x17\xEF\xF3\\n\x95\xE9N\x11\xF5\xF8\xE5\x96]\r>d\x81\x86\x01R\x81\x85\x01R\x82\x86\x01R\x83Q\x80\x85\x01\x85R\x7F\rP\xB8\xCEIs\x18\xB9\x04e\xD6V\xDC\x94B\x82>\x02\xC7\xEC\x85\xAC\xD1\xF6\x952\x9E\xE6P\xFA\x17\xB2\x81R\x7F\x1D5\xAE\xE55\xBEy\x85zb\xE5\x9B\xD7G2\xEB\xA4@\xEB\xF2\xB00\xAE\xC5\xE4\xBD\x01gD\xD6\xC2G\x81\x85\x01R\x81\x86\x01\x80Q\x91\x90\x91R\x84Q\x80\x86\x01\x86R\x7F\x1B\xFB\x0C>'z\xD4en\x83\x86\xC2d\xA1\xEAnt\xF4A\t\xC3\xC5'%_I\x02\xB6n\x04rs\x81R\x7F\r{;\xF0\xD9\x84\x8BS[\xF3G-\xCBs\xEDm\xB7\xD5-\xD0\x7F\xCE\xF7\xBE\xEF\xD5\xFE\xC4d\xD2\x92\\\x81\x86\x01R\x81Q\x85\x01R\x84Q\x80\x86\x01\x86R\x7F\x1C\xCCQ\xAD2\xBB5\x96\xA2v\xC5pU\xC2\xB5\xFD(d+\x8D\xF1>\xB1\xD4\xFA\xE8\x18\xBF\xF1\x91\xF5\xA4\x81R\x7F\x0E\x1E\xA7\")\xEE[U\x05\xD6\x8F\xF7E'\xEF\x8D\xAB; Tw\x8A\xDE\xF5z1\x83T\x8C#\xDAp\x81\x86\x01R\x81Q\x86\x01R\x84Q\x80\x86\x01\x86R\x7F\x1FH\xEE\xE9y\x8D\ts\x87\x14\x18B\xCA\xA4\x9B8\xA8v\xA2;5h\xBB\xC2\xBE\xC8\x9E\xF0\x1E\0.\xD7\x81R\x7F(\xE4H\x93d[d\x13\xB1\x02\xD1\x1C\x96R\x17\xEF#\x1E-}\x8Cn\xF2\xD4\xAE.\xD3\x17{\xA1~k\x81\x86\x01R\x81Q\x90\x93\x01\x92\x90\x92R\x83Q\x80\x85\x01\x85R\x7F\x1EY\xE3Lw\xDD\xF0W\xEF\x1C^4\"E\\G\xB7|\xFA\xF7\xC9\tB\xC6%\x0BB\xCFBV\xCA\x89\x81R\x7F'\xAAn\xC4\x9Du7>\xE3jn\xC3\x12\xD7\xF3\xDC\xE5\x9D\xDB\xB0\xB5\x82~f7\xFE\xB1\xCD\xA9\xFFAj\x81\x85\x01R\x82Q\x90\x91\x01R\x82Q\x80\x84\x01\x90\x93R\x7F\x19\xFEA\x86w\xE7CP>\xD2C\xFBN\xF3\x13\x97m\xD3\x10\xE0sfZ\xBE\xC5b\x14n\xBEhUY\x83R\x7F\x0Cd\xF6\xE1\xA0\xFD\x0E\x0F8`=\xF6\n\x84\xDD\xE2\x99\xD7\x0Ft\xAC\x83H\xD45\xE0r\x02\xCCWs\x9B\x91\x83\x01\x91\x90\x91RQ`\xA0\x01R\x90V[a\x07\xB5a\x0CQV[a\x07\xBDa\x0CkV[\x83Q\x81R` \x80\x85\x01Q\x81\x83\x01R\x83Q`@\x83\x01R\x83\x01Q``\x80\x83\x01\x91\x90\x91R`\0\x90\x83`\xC0\x84`\x06a\x07\xD0Z\x03\xFA\x90P\x80\x80\x15a\x07\xFBWa\x07\xFDV[\xFE[P\x80a\x08EW`@\x80QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x12`$\x82\x01Rq\x1C\x18Z\\\x9A[\x99\xCBXY\x19\x0BY\x98Z[\x19Y`r\x1B`D\x82\x01R\x90Q\x90\x81\x90\x03`d\x01\x90\xFD[PP\x92\x91PPV[a\x08Ua\x0CQV[a\x08]a\x0C\x89V[\x83Q\x81R` \x80\x85\x01Q\x90\x82\x01R`@\x81\x01\x83\x90R`\0``\x83`\x80\x84`\x07a\x07\xD0Z\x03\xFA\x90P\x80\x80\x15a\x07\xFBWP\x80a\x08EW`@\x80QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x12`$\x82\x01Rq\x1C\x18Z\\\x9A[\x99\xCB[][\x0BY\x98Z[\x19Y`r\x1B`D\x82\x01R\x90Q\x90\x81\x90\x03`d\x01\x90\xFD[a\x08\xDBa\x0CQV[\x81Q\x15\x80\x15a\x08\xECWP` \x82\x01Q\x15[\x15a\t\x0BWP`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01Ra\tuV[`@Q\x80`@\x01`@R\x80\x83`\0\x01Q\x81R` \x01\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDG\x84` \x01Q\x81a\tMW\xFE[\x06\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDG\x03\x90R\x90P[\x91\x90PV[`\0a\t\x84a\x0C\xA7V[`@Q\x80`\x80\x01`@R\x80\x8B\x81R` \x01\x89\x81R` \x01\x87\x81R` \x01\x85\x81RP\x90Pa\t\xAFa\x0C\xD4V[P`@\x80Q`\x80\x81\x01\x82R\x8A\x81R` \x81\x01\x89\x90R\x80\x82\x01\x87\x90R``\x80\x82\x01\x86\x90R\x82Q`\x18\x80\x82Ra\x03 \x82\x01\x90\x94R\x91\x92\x91\x82\x81` \x01` \x82\x02\x806\x837\x01\x90PP\x90P`\0[`\x04\x81\x10\x15a\x0BQW`\x06\x81\x02\x85\x82`\x04\x81\x10a\n\x13W\xFE[` \x02\x01QQ\x83Q\x84\x90\x83\x90\x81\x10a\n'W\xFE[` \x02` \x01\x01\x81\x81RPP\x85\x82`\x04\x81\x10a\n?W\xFE[` \x02\x01Q` \x01Q\x83\x82`\x01\x01\x81Q\x81\x10a\nWW\xFE[` \x02` \x01\x01\x81\x81RPP\x84\x82`\x04\x81\x10a\noW\xFE[` \x02\x01QQQ\x83Q\x84\x90`\x02\x84\x01\x90\x81\x10a\n\x87W\xFE[` \x02` \x01\x01\x81\x81RPP\x84\x82`\x04\x81\x10a\n\x9FW\xFE[` \x02\x01QQ`\x01` \x02\x01Q\x83\x82`\x03\x01\x81Q\x81\x10a\n\xBBW\xFE[` \x02` \x01\x01\x81\x81RPP\x84\x82`\x04\x81\x10a\n\xD3W\xFE[` \x02\x01Q` \x01Q`\0`\x02\x81\x10a\n\xE8W\xFE[` \x02\x01Q\x83\x82`\x04\x01\x81Q\x81\x10a\n\xFCW\xFE[` \x02` \x01\x01\x81\x81RPP\x84\x82`\x04\x81\x10a\x0B\x14W\xFE[` \x02\x01Q` \x01Q`\x01`\x02\x81\x10a\x0B)W\xFE[` \x02\x01Q\x83\x82`\x05\x01\x81Q\x81\x10a\x0B=W\xFE[` \x90\x81\x02\x91\x90\x91\x01\x01RP`\x01\x01a\t\xFAV[Pa\x0BZa\r\x01V[`\0` \x82` \x86\x02` \x86\x01`\x08a\x07\xD0Z\x03\xFA\x90P\x80\x80\x15a\x07\xFBWP\x80a\x0B\xC3W`@\x80QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x15`$\x82\x01Rt\x1C\x18Z\\\x9A[\x99\xCB[\xDC\x18\xDB\xD9\x19KY\x98Z[\x19Y`Z\x1B`D\x82\x01R\x90Q\x90\x81\x90\x03`d\x01\x90\xFD[PQ\x15\x15\x9D\x9CPPPPPPPPPPPPPV[`@Q\x80``\x01`@R\x80a\x0B\xEBa\x0CQV[\x81R` \x01a\x0B\xF8a\r\x1FV[\x81R` \x01a\x0C\x05a\x0CQV[\x90R\x90V[`@Q\x80`\xA0\x01`@R\x80a\x0C\x1Da\x0CQV[\x81R` \x01a\x0C*a\r\x1FV[\x81R` \x01a\x0C7a\r\x1FV[\x81R` \x01a\x0CDa\r\x1FV[\x81R` \x01a\x0C\x05a\r?V[`@Q\x80`@\x01`@R\x80`\0\x81R` \x01`\0\x81RP\x90V[`@Q\x80`\x80\x01`@R\x80`\x04\x90` \x82\x02\x806\x837P\x91\x92\x91PPV[`@Q\x80``\x01`@R\x80`\x03\x90` \x82\x02\x806\x837P\x91\x92\x91PPV[`@Q\x80`\x80\x01`@R\x80`\x04\x90[a\x0C\xBEa\x0CQV[\x81R` \x01\x90`\x01\x90\x03\x90\x81a\x0C\xB6W\x90PP\x90V[`@Q\x80`\x80\x01`@R\x80`\x04\x90[a\x0C\xEBa\r\x1FV[\x81R` \x01\x90`\x01\x90\x03\x90\x81a\x0C\xE3W\x90PP\x90V[`@Q\x80` \x01`@R\x80`\x01\x90` \x82\x02\x806\x837P\x91\x92\x91PPV[`@Q\x80`@\x01`@R\x80a\r2a\rlV[\x81R` \x01a\x0C\x05a\rlV[`@Q\x80`\xC0\x01`@R\x80`\x06\x90[a\rVa\x0CQV[\x81R` \x01\x90`\x01\x90\x03\x90\x81a\rNW\x90PP\x90V[`@Q\x80`@\x01`@R\x80`\x02\x90` \x82\x02\x806\x837P\x91\x92\x91PPV\xFEverifier-proof-element-gte-prime-q\xA2dipfsX\"\x12 \xB4\x86\x8C\xE3[6\xB0\xCD\xBBF\x97\\w\xF3\xBE\x0E\xE2\xD3.\xB3\x9E<\xE9\x18\xFCi\x9E\x9DU\x10\xF7%dsolcC\0\x06\x0C\x003"; - /// The deployed bytecode of the contract. - pub static ZKBVERIFIER_DEPLOYED_BYTECODE: ::ethers::core::types::Bytes = - ::ethers::core::types::Bytes::from_static(__DEPLOYED_BYTECODE); - pub struct ZkbVerifier(::ethers::contract::Contract); - impl ::core::clone::Clone for ZkbVerifier { - fn clone(&self) -> Self { - Self(::core::clone::Clone::clone(&self.0)) - } - } - impl ::core::ops::Deref for ZkbVerifier { - type Target = ::ethers::contract::Contract; - fn deref(&self) -> &Self::Target { - &self.0 - } - } - impl ::core::ops::DerefMut for ZkbVerifier { - fn deref_mut(&mut self) -> &mut Self::Target { - &mut self.0 - } - } - impl ::core::fmt::Debug for ZkbVerifier { - fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { - f.debug_tuple(::core::stringify!(ZkbVerifier)) - .field(&self.address()) - .finish() - } - } - impl ZkbVerifier { - /// 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(), - ZKBVERIFIER_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( - ZKBVERIFIER_ABI.clone(), - ZKBVERIFIER_BYTECODE.clone().into(), - client, - ); - let deployer = factory.deploy(constructor_args)?; - let deployer = ::ethers::contract::ContractDeployer::new(deployer); - Ok(deployer) - } - ///Calls the contract's `verifyProof` (0x68444dc7) function - pub fn verify_proof( - &self, - input: [::ethers::core::types::U256; 5], - p: [::ethers::core::types::U256; 8], - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([104, 68, 77, 199], (input, p)) - .expect("method not found (this should never happen)") - } - } - impl From<::ethers::contract::Contract> for ZkbVerifier { - 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(uint256[5],uint256[8])` and selector `0x68444dc7` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "verifyProof", abi = "verifyProof(uint256[5],uint256[8])")] - pub struct VerifyProofCall { - pub input: [::ethers::core::types::U256; 5], - pub p: [::ethers::core::types::U256; 8], - } - ///Container type for all return fields from the `verifyProof` function with signature `verifyProof(uint256[5],uint256[8])` and selector `0x68444dc7` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct VerifyProofReturn(pub bool); -} diff --git a/generator/Cargo.toml b/generator/Cargo.toml index 6dba711..9104013 100644 --- a/generator/Cargo.toml +++ b/generator/Cargo.toml @@ -4,8 +4,11 @@ version = "0.1.0" edition = "2021" [dependencies] +async-trait = "0.1.81" bindings = { path = "../bindings", package = "foundry-contracts" } ethers ={version = "2.0.10", features = ["abigen", "ws", "rustls"] } -serde = { version = "1.0", features = ["derive"] } +kalypso_helper = { path = "../helper", package = "helper" } +rand = "0.8" reqwest = { version = "0.12.4", features = ["json"] } -async-trait = "0.1.81" +serde = { version = "1.0", features = ["derive"] } +serde_json="1.0" \ No newline at end of file diff --git a/generator/src/lib.rs b/generator/src/lib.rs index 1c4313d..833d689 100644 --- a/generator/src/lib.rs +++ b/generator/src/lib.rs @@ -1,41 +1,109 @@ pub mod models; +use std::time::Instant; + use async_trait::async_trait; -use ethers::core::types::U256; +use ethers::core::k256::sha2::{Digest, Sha256}; use reqwest::{Client, StatusCode}; -use serde::Serialize; +use serde::{de::DeserializeOwned, Serialize}; -pub enum RequestType { +pub enum RequestType { GET, POST(T), } -pub struct Request { +pub struct Request { pub request_type: RequestType, pub service_endpoint: String, + pub expected_status_code: reqwest::StatusCode, + pub info: String, + + pub _marker: std::marker::PhantomData, +} + +impl Request +where + T: Serialize, +{ + fn hash_payload(&self) -> Option { + if let RequestType::POST(ref payload) = self.request_type { + // Serialize the payload to JSON and compute its hash + let serialized_payload = serde_json::to_string(payload).ok()?; + let mut hasher = Sha256::new(); + hasher.update(serialized_payload); + Some(format!("{:x}", hasher.finalize())) + } else { + None + } + } } #[async_trait] pub trait Run { - async fn execute(&self, server_url: &str) -> Option; + async fn execute(&self, server_url: &str) -> Option<(StatusCode, bool, String, u128)>; fn name(&self) -> String; + fn request_info(&self) -> String; + fn expected_status_code(&self) -> reqwest::StatusCode; + fn hash_payload(&self) -> Option; + fn info(&self) -> String; } #[async_trait] -impl Run for Request +impl Run for Request where T: Serialize + Send + Sync, + R: Serialize + DeserializeOwned + Send + Sync, { - async fn execute(&self, server_url: &str) -> Option { + fn info(&self) -> String { + self.info.clone() + } + + fn hash_payload(&self) -> Option { + self.hash_payload() + } + + fn expected_status_code(&self) -> reqwest::StatusCode { + self.expected_status_code + } + + fn request_info(&self) -> String { + match &self.request_type { + RequestType::GET => format!( + "GET {} - Expected Status Code: {}", + self.service_endpoint, self.expected_status_code + ), + RequestType::POST(_) => format!( + "POST {} - Expected Status Code: {}", + self.service_endpoint, self.expected_status_code + ), + } + } + + async fn execute(&self, server_url: &str) -> Option<(StatusCode, bool, String, u128)> { let client = Client::new(); let url = format!("{}{}", server_url, self.service_endpoint); + let start_time = Instant::now(); + let response = match &self.request_type { RequestType::GET => client.get(&url).send().await, RequestType::POST(payload) => client.post(&url).json(payload).send().await, }; + let elapsed_time = start_time.elapsed().as_millis(); + match response { - Ok(data) => Some(data.status()), + Ok(data) => { + let status = data.status(); + match data.json::().await { + Ok(_) => Some((status, true, "".into(), elapsed_time)), + Err(_) => Some(( + status, + false, + std::any::type_name::().into(), + elapsed_time, + )), + } + } Err(_) => None, } } @@ -61,52 +129,74 @@ impl ServiceChecker { pub async fn check_all_services(&self) { for service in &self.services { let status_code = service.execute(&self.server_url).await; + println!("\nService: {}", service.name()); + println!("Info: {}", service.info()); + + // Print the payload hash for POST requests + if let Some(hash) = service.hash_payload() { + println!("Payload Hash: {}", hash); + } + match status_code { - Some(code) => { - println!("Service: {}. Status Code: {}", service.name(), code); + Some((code, is_type_ok, expected_type_name, elapsed_time)) => { + println!("Status Code: {}", code); + println!("Time Taken: {} ms", elapsed_time); + + if !is_type_ok { + println!("Mismatch Detected:"); + println!(" Expected Response Type: {}", expected_type_name); + } + + if !is_type_ok || code != service.expected_status_code() { + println!("Expectation:"); + println!(" {}", service.request_info()); + } } None => { - println!("Service: {}, Status Code: (Service Error)", service.name()); + println!("Status Code: Service Error (Fix Needed in API)"); + println!("Expectation:"); + println!(" {}", service.request_info()); } } + + println!(); } } } // ------------------------------------------- ###### -------------------------------------------// -pub fn get_test_request() -> Request<()> { +pub fn get_test_request() -> Request<(), R> { Request { request_type: RequestType::GET, service_endpoint: "/api/test".into(), + _marker: std::marker::PhantomData::, + expected_status_code: StatusCode::OK, + info: "Checks server reach".into(), } } -pub fn get_benchmark_request() -> Request<()> { +pub fn get_benchmark_request() -> Request<(), R> { Request { request_type: RequestType::GET, service_endpoint: "/api/benchmark".into(), + _marker: std::marker::PhantomData::, + expected_status_code: StatusCode::OK, + info: "Generate benchmark info for the prover".into(), } } -pub fn generate_proof_request( - ask_input_payload: Option, -) -> Request { +pub fn generate_proof_request( + input_payload: Option, + expected_status_code: StatusCode, + info: String, +) -> Request { Request { - request_type: RequestType::POST(ask_input_payload.unwrap_or_else(|| { - models::AskInputPayload { - ask: bindings::shared_types::Ask { - market_id: U256::from_dec_str("1").unwrap(), - reward: U256::from(1), - expiry: U256::from(1), - time_taken_for_proof_generation: U256::from(1), - deadline: U256::from(1), - refund_address: "0000dead0000dead0000dead0000dead0000dead".parse().unwrap(), - prover_data: vec![1, 2, 3, 4].into(), - }, - private_input: vec![1, 2, 3, 4], - ask_id: 1, - } + request_type: RequestType::POST(input_payload.unwrap_or_else(|| { + models::InputPayload::from_plain_secrets("public".into(), "secrets".into()) })), service_endpoint: "/api/generateProof".into(), + _marker: std::marker::PhantomData::, + expected_status_code, + info, } } diff --git a/generator/src/models.rs b/generator/src/models.rs index ef8693f..2f0d237 100644 --- a/generator/src/models.rs +++ b/generator/src/models.rs @@ -1,9 +1,89 @@ -use bindings::shared_types::Ask; use serde::{Deserialize, Serialize}; #[derive(Serialize, Debug, Deserialize, Clone)] -pub struct AskInputPayload { - pub ask: Ask, - pub private_input: Vec, - pub ask_id: u64, +pub struct InputPayload { + public: Vec, + secrets: Option, +} + +impl InputPayload { + pub fn only_public_inputs(public: Vec) -> Self { + InputPayload { + public, + secrets: None, + } + } + + pub fn from_plain_secrets(public: Vec, secrets: Vec) -> Self { + InputPayload { + public, + secrets: Some(Secrets::PlainSecrets(secrets)), + } + } + + pub fn from_encrypted_secrets(public: Vec, encrypted_data: Vec, acl: Vec) -> Self { + InputPayload { + public, + secrets: Some(Secrets::EncryptedSecrets(EncryptedSecret { + encrypted_data, + acl, + })), + } + } + + pub fn get_public(&self) -> Vec { + self.public.clone() + } + + pub fn get_plain_secrets(&self) -> Result, Box> { + match self.secrets.clone().unwrap() { + Secrets::PlainSecrets(data) => Ok(data), + Secrets::EncryptedSecrets(_) => Err("Fetching Plain texts not supported".into()), + } + } + + pub fn get_plain_secrets_from_encrypted_secrets( + &self, + decryption_key: Vec, + ) -> Result, Box> { + match self.secrets.clone().unwrap() { + Secrets::PlainSecrets(_) => Err("Can't decrypt the plain text".into()), + Secrets::EncryptedSecrets(data) => { + kalypso_helper::secret_inputs_helpers::decrypt_data_with_ecies_and_aes( + &data.encrypted_data, + &data.acl, + &decryption_key, + None, + ) + } + } + } +} + +#[derive(Serialize, Debug, Deserialize, Clone)] +enum Secrets { + PlainSecrets(Vec), + EncryptedSecrets(EncryptedSecret), +} + +#[derive(Serialize, Debug, Deserialize, Clone)] +struct EncryptedSecret { + encrypted_data: Vec, + acl: Vec, +} + +#[derive(Serialize, Debug, Deserialize, Clone)] +pub struct GenerateProofResponse { + pub proof: Vec, +} + +#[derive(Serialize, Debug, Deserialize, Clone)] +pub struct TestResponse { + pub data: String, +} + +#[derive(Serialize, Debug, Deserialize, Clone)] +pub struct BenchmarkResponse { + pub data: String, + pub time_in_ms: u128, } diff --git a/generator_client/Cargo.toml b/generator_client/Cargo.toml index 6254ba2..c564ef7 100644 --- a/generator_client/Cargo.toml +++ b/generator_client/Cargo.toml @@ -7,18 +7,20 @@ edition = "2021" [dependencies] serde_json="1.0" +actix-web = "4.5.1" +anyhow = "1.0.86" bindings = { path = "../bindings", package = "foundry-contracts" } -serde = { version = "1.0", features = ["derive"] } -tokio = { version = "1.16.1", features = ["full"] } -actix-web = "4.3.0" dotenv = "0.15.0" -validator = { version = "0.18.1", features = ["derive"] } ecies = {version = "0.2.6", features = ["std"]} -openssl = { version = "0.10", features = ["vendored"] } env_logger = "0.11" -log = "0.4" -hex = "0.4" +ethers = {version = "2.0.8", features = ["abigen", "ws", "rustls"] } futures-util = "0.3" -secp256k1 = "0.29.0" +helper = {path = "../helper", package = "helper"} +hex = "0.4" +log = "0.4" +openssl = { version = "0.10", features = ["vendored"] } reqwest = "0.12.4" -ethers = {version = "2.0.8", features = ["abigen", "ws", "rustls"] } \ No newline at end of file +secp256k1 = "0.29.0" +serde = { version = "1.0", features = ["derive"] } +tokio = { version = "1.16.1", features = ["full"] } +validator = { version = "0.18.1", features = ["derive"] } \ No newline at end of file diff --git a/generator_client/src/client.rs b/generator_client/src/client.rs new file mode 100644 index 0000000..c55393c --- /dev/null +++ b/generator_client/src/client.rs @@ -0,0 +1,59 @@ +use std::sync::{Arc, Mutex}; + +use crate::handler; +use actix_web::web::Data; +use actix_web::{App, HttpServer}; + +pub struct GeneratorClient { + enclave_key: Arc>>, + port: u16, +} + +impl GeneratorClient { + pub fn new(enclave_key: String, port: u16) -> Self { + let enclave_key = hex::decode(enclave_key).unwrap(); + let enclave_key = Arc::new(Mutex::new(enclave_key)); + GeneratorClient { enclave_key, port } + } + + pub async fn start(self, enable_ssc: bool) -> anyhow::Result<()> { + let server = HttpServer::new(move || { + App::new() + .app_data(Data::new(self.enclave_key.clone())) + .configure(handler::routes) + }); + + if enable_ssc { + let tls_config = helper::ssc::create_random_rustls_server_config(); + // Error handling for TLS configuration + if let Err(err) = tls_config { + log::error!("Failed to create TLS config: {}", err); + return Err(anyhow::Error::from(err)); + } + + let tls_config = tls_config.unwrap(); + + // Bind the server using Rustls for HTTPS + let server = server.bind_rustls(format!("0.0.0.0:{}", self.port), tls_config); + if let Err(err) = server { + log::error!("Failed to bind server with Rustls: {}", err); + return Err(anyhow::Error::from(err)); + } + + // Run the server and await + server.unwrap().run().await?; + } else { + // Bind the server using plain HTTP + let server = server.bind(format!("0.0.0.0:{}", self.port)); + if let Err(err) = server { + log::error!("Failed to bind server with HTTP: {}", err); + return Err(anyhow::Error::from(err)); + } + + // Run the server and await + server.unwrap().run().await?; + } + + Ok(()) + } +} diff --git a/generator_client/src/handler.rs b/generator_client/src/handler.rs index 6bc6d39..5e2fd7c 100644 --- a/generator_client/src/handler.rs +++ b/generator_client/src/handler.rs @@ -1,23 +1,25 @@ use std::io::ErrorKind; +use std::sync::{Arc, Mutex}; +use crate::handler_funcs::generator_config_setup::_generator_config_setup; +use crate::handler_funcs::update_generator_config::_update_generator_config; +use crate::handler_funcs::update_runtime_config::_udpate_runtime_config; use crate::kalypso::{ - add_new_generator, benchmark, contract_validation, generate_config_file, generate_runtime_file, - get_public_keys_for_a_generator, read_generator_config_file, read_runtime_config_file, - runtime_config_validation, sign_addy, sign_attest, update_generator_config_file, - update_runtime_config_file, update_runtime_config_with_new_data, + add_new_generator, benchmark, contract_validation, get_public_keys_for_a_generator, + read_generator_config_file, read_runtime_config_file, update_generator_config_file, }; use crate::model::{ AddNewGenerator, GeneratorConfigSetupRequestBody, GetGeneratorPublicKeys, RemoveGenerator, - SignAddress, SignAttestation, SupervisordInputBody, SupervisordResponse, UpdateGeneratorConfig, - UpdateRuntimeConfig, + SupervisordInputBody, SupervisordResponse, UpdateGeneratorConfig, UpdateRuntimeConfig, }; -use crate::response::response; use crate::supervisord::{get_program_status, start_program, stop_program}; use actix_web::http::StatusCode; +use actix_web::web::Data; use actix_web::{delete, get, post, put, web, Responder}; -use ethers::types::BigEndianHash; +use helper::response::response; +use helper::sch_payload::{SCHPayload, ToPayload, ToSchResponse}; use serde::Deserialize; -use serde_json::{json, Value}; +use serde_json::Value; use validator::Validate; #[derive(Deserialize)] @@ -248,6 +250,7 @@ async fn get_program_status_handler(program_name: web::Query) -> im #[post("/generatorConfigSetup")] async fn generate_config_setup( jsonbody: web::Json, + ecies_priv_key: Data>>>, ) -> impl Responder { //Validating the main JSON body let json_input = &jsonbody; @@ -259,101 +262,61 @@ async fn generate_config_setup( Some(Value::String(err.to_string())), ); } + let ecies_priv_key = { ecies_priv_key.lock().unwrap().clone() }; + let result = _generator_config_setup(json_input, ecies_priv_key).await; - //Validating the generator config - let generator_config_body = json_input.0.generator_config.as_ref().unwrap(); - if generator_config_body.len() > 1 { + if result.is_ok() { + response("Config done", StatusCode::OK, None) + } else { return response( - "Only one generator supported", + result.unwrap_err().to_string().as_ref(), StatusCode::BAD_REQUEST, None, ); } - for generator in generator_config_body { - if generator.supported_markets.as_ref().unwrap().len() > 1 { - return response( - "Only one market is supported for every generator", - StatusCode::BAD_REQUEST, - None, - ); - } - if let Err(err) = generator.validate() { - log::error!("{}", err); - return response( - "Invalid payload", - StatusCode::BAD_REQUEST, - Some(Value::String(err.to_string())), - ); - } - } - - //Validating the runtime config - let runtime_config_body = json_input.0.runtime_config.as_ref().unwrap(); - if let Err(err) = runtime_config_body.validate() { - log::error!("{}", err); - return response( - "Invalid payload", - StatusCode::BAD_REQUEST, - Some(Value::String(err.to_string())), - ); - } - - let private_key = runtime_config_body.private_key.as_ref().unwrap(); +} - let chain_id = runtime_config_body.chain_id.as_ref().unwrap(); +// Generate config setup +#[post("/generatorConfigSetupEncrypted")] +async fn generate_config_setup_encrypted( + jsonbody: web::Json, + ecies_priv_key: Data>>>, +) -> impl Responder { + //Validating the main JSON body + let ecies_priv_key = { ecies_priv_key.lock().unwrap().clone() }; - let rpc_url = runtime_config_body.ws_url.as_ref().unwrap(); + let generate_config_setup_request_body: GeneratorConfigSetupRequestBody = + match jsonbody.0.to_payload(&ecies_priv_key) { + Ok(data) => data, + Err(e) => { + log::error!("{}", &e.to_string()); + return response(&e.to_string(), StatusCode::BAD_REQUEST, None); + } + }; + let result = + _generator_config_setup(&generate_config_setup_request_body, ecies_priv_key.clone()).await; - //Validating the runtime config to check if the runtime address has enough gas. - let validation_status = runtime_config_validation(private_key, rpc_url, chain_id).await; - let validation_status_result = match validation_status { - Ok(data) => data, - Err(e) => { - log::error!("{}", e); - return response( - "There was an issue while validating the request", - StatusCode::INTERNAL_SERVER_ERROR, - None, - ); - } - }; - if !validation_status_result { + if result.is_ok() { + let result = result.unwrap(); + let sch_response = match jsonbody.0.to_sch_response(result, ecies_priv_key).await { + Ok(data) => data, + Err(e) => { + log::error!("{}", &e.to_string()); + return response(&e.to_string(), StatusCode::BAD_REQUEST, None); + } + }; + return response( + "Config done", + StatusCode::OK, + Some(serde_json::to_value(&sch_response).unwrap()), + ); + } else { return response( - "Runtime private_key doesn't have enough balance, minimum balance required is 0.05ETH", + result.unwrap_err().to_string().as_ref(), StatusCode::BAD_REQUEST, None, ); } - - //Generating the generator config file - let generate_config_file = generate_config_file(generator_config_body).await; - match generate_config_file { - Ok(data) => data, - Err(e) => { - log::error!("{}", e); - return response( - "There was an issue in generator setup", - StatusCode::INTERNAL_SERVER_ERROR, - None, - ); - } - }; - - //Generating the runtime config file - let runtime_config_file = generate_runtime_file(runtime_config_body).await; - match runtime_config_file { - Ok(data) => data, - Err(e) => { - log::error!("{}", e); - return response( - "There was an issue in runtime setup", - StatusCode::INTERNAL_SERVER_ERROR, - None, - ); - } - }; - - response("Config done", StatusCode::OK, None) } // Update runtime config @@ -368,94 +331,67 @@ async fn update_runtime_config(jsonbody: web::Json) -> impl Some(Value::String(err.to_string())), ); } - let config_file_call = read_runtime_config_file().await; - let config_file = match config_file_call { - Ok(data) => data, - Err(e) => { - log::error!("{}", e); - return response( - "There was an issue while updating the generator config file", - StatusCode::INTERNAL_SERVER_ERROR, - None, - ); - } - }; - // Checking if the provided private_key has enough gas - let private_key = match &jsonbody.private_key { - Some(data) => data, - None => &config_file.runtime_config.private_key, - }; - let chain_id = match &jsonbody.chain_id { - Some(data) => data, - None => &config_file.runtime_config.chain_id, - }; - let ws_rpc_url = match &jsonbody.ws_url { - Some(data) => data, - None => &config_file.runtime_config.ws_url, - }; + let result = _udpate_runtime_config(json_input.0.clone()).await; - let validation_status = runtime_config_validation(private_key, ws_rpc_url, chain_id).await; - let validation_status_result = match validation_status { - Ok(data) => data, - Err(e) => { - log::error!("{}", e); - return response( - "There was an issue while updating the runtime config, Please make sure if you are providing a new RPC url it is a valid one.", - StatusCode::INTERNAL_SERVER_ERROR, - None, - ); - } - }; - if !validation_status_result { + if result.is_ok() { + response("Runtime config updated", StatusCode::OK, None) + } else { return response( - "Runtime private_key doesn't have enough balance, minimum balance required is 0.05ETH", + result.unwrap_err().to_string().as_ref(), StatusCode::BAD_REQUEST, None, ); } +} - //Updating the runtime config file - let updated_runtime_config_data_call = - update_runtime_config_with_new_data(json_input, config_file).await; - let updated_runtime_config_data = match updated_runtime_config_data_call { - Ok(data) => data, - Err(e) => { - log::error!("{}", e); - return response( - "There was an issue in updating the config file", - StatusCode::INTERNAL_SERVER_ERROR, - None, - ); - } - }; +// Update runtime config encrypted +#[put("/updateRuntimeConfigEncrypted")] +async fn update_runtime_config_encrypted( + jsonbody: web::Json, + ecies_priv_key: Data>>>, +) -> impl Responder { + let ecies_priv_key = { ecies_priv_key.lock().unwrap().clone() }; - let update_config_file = update_runtime_config_file(updated_runtime_config_data).await; - match update_config_file { - Ok(data) => data, - Err(e) => { - log::error!("{}", e); - if e.kind() == ErrorKind::NotFound { - return response( - "There was an issue in updating the config file, since the config file was not found", - StatusCode::NOT_FOUND, - None, - ); + let update_runtime_config_request_body: UpdateRuntimeConfig = + match jsonbody.0.to_payload(&ecies_priv_key) { + Ok(data) => data, + Err(e) => { + log::error!("{}", &e.to_string()); + return response(&e.to_string(), StatusCode::BAD_REQUEST, None); } - return response( - "There was an issue in updating the config file", - StatusCode::INTERNAL_SERVER_ERROR, - None, - ); - } - } + }; + let result = _udpate_runtime_config(update_runtime_config_request_body.clone()).await; + + if result.is_ok() { + let result = result.unwrap(); + let sch_response = match jsonbody.0.to_sch_response(result, ecies_priv_key).await { + Ok(data) => data, + Err(e) => { + log::error!("{}", &e.to_string()); + return response(&e.to_string(), StatusCode::BAD_REQUEST, None); + } + }; - response("Runtime config updated", StatusCode::OK, None) + return response( + "Runtime config updated", + StatusCode::OK, + Some(serde_json::to_value(&sch_response).unwrap()), + ); + } else { + return response( + result.unwrap_err().to_string().as_ref(), + StatusCode::BAD_REQUEST, + None, + ); + } } -// Update runtime config #[post("/addNewGenerator")] -async fn add_new_generator_config(jsonbody: web::Json) -> impl Responder { +async fn add_new_generator_config( + jsonbody: web::Json, + ecies_priv_key: Data>>>, +) -> impl Responder { let json_input = &jsonbody; if let Err(err) = json_input.validate() { log::error!("{}", err); @@ -492,7 +428,13 @@ async fn add_new_generator_config(jsonbody: web::Json) -> impl ); } - let updated_generator_config_data_call = add_new_generator(json_input, config_file).await; + let ecies_priv_key = { + let key = ecies_priv_key.lock().unwrap().clone(); + hex::encode(key) + }; + + let updated_generator_config_data_call = + add_new_generator(json_input, ecies_priv_key, config_file).await; let updated_generator_config_data = match updated_generator_config_data_call { Ok(data) => data, Err(e) => { @@ -606,75 +548,47 @@ async fn update_generator_config(jsonbody: web::Json) -> ); } - if json_input.supported_markets.as_ref().unwrap().len() > 1 { + let result = _update_generator_config(&json_input).await; + + if result.is_ok() { + response("Generator config updated", StatusCode::OK, None) + } else { return response( - "Only one market is supported for every generator", + result.unwrap_err().to_string().as_ref(), StatusCode::BAD_REQUEST, None, ); } +} - let config_file_call = read_generator_config_file().await; - let mut config_file = match config_file_call { - Ok(data) => data, - Err(e) => { - log::error!("{}", e); - return response( - "There was an issue while updating the generator config file", - StatusCode::INTERNAL_SERVER_ERROR, - None, - ); - } - }; - - //Finding the generator to update - let generator_to_be_updated = json_input.address.as_ref().unwrap(); - let finding_generator_index = config_file - .generator_config - .iter() - .position(|x| &x.address == generator_to_be_updated); +// Update generator config Encrypted +#[put("/updateGeneratorConfigEncrypted")] +async fn update_generator_config_encrypted( + jsonbody: web::Json, + ecies_priv_key: Data>>>, +) -> impl Responder { + let ecies_priv_key = { ecies_priv_key.lock().unwrap().clone() }; - let generator_index = match finding_generator_index { - Some(data) => data, - None => { - return response( - "No generator found for the provided address", - StatusCode::NOT_FOUND, - None, - ); - } - }; + let update_generator_config_request_body: UpdateGeneratorConfig = + match jsonbody.0.to_payload(&ecies_priv_key) { + Ok(data) => data, + Err(e) => { + log::error!("{}", &e.to_string()); + return response(&e.to_string(), StatusCode::BAD_REQUEST, None); + } + }; - //Checking the input for changes - if let Some(new_supported_markets) = &json_input.supported_markets { - config_file.generator_config[generator_index].supported_markets = - new_supported_markets.to_vec() - } - if let Some(new_data) = &json_input.data { - config_file.generator_config[generator_index].data = new_data.to_string() - } + let result = _update_generator_config(&update_generator_config_request_body).await; - //Updating the config file - let update_config_file = update_generator_config_file(config_file).await; - match update_config_file { - Ok(data) => data, - Err(e) => { - log::error!("{}", e); - if e.kind() == ErrorKind::NotFound { - return response( - "There was an issue in updating the config file, since the config file was not found", - StatusCode::NOT_FOUND, - None, - ); - } - return response( - "There was an issue in updating the config file", - StatusCode::INTERNAL_SERVER_ERROR, - None, - ); - } + if result.is_ok() { + response("Generator config updated", StatusCode::OK, None) + } else { + return response( + result.unwrap_err().to_string().as_ref(), + StatusCode::BAD_REQUEST, + None, + ); } - response("Generator config updated", StatusCode::OK, None) } // Update generator config @@ -746,51 +660,6 @@ async fn fetch_generator_public_keys( ) } -// Sign Address -#[post("/signAddress")] -async fn sign_address(jsonbody: web::Json) -> impl Responder { - //Validating inputs - let json_input = &jsonbody.0; - if let Err(err) = json_input.validate() { - log::error!("{}", err); - return response( - "Invalid payload", - StatusCode::BAD_REQUEST, - Some(Value::String(err.to_string())), - ); - } - let addy_to_be_signed = json_input.address.as_ref().unwrap(); - let signed = sign_addy(addy_to_be_signed).await.unwrap(); - let signature = json!({ - "r": ethers::types::H256::from_uint(&signed.r), - "s": ethers::types::H256::from_uint(&signed.s), - "v": signed.v - }); - response("Address signed", StatusCode::OK, Some(signature)) -} - -// Sign Attestaion -#[post("/signAttestation")] -async fn sign_attestation(jsonbody: web::Json) -> impl Responder { - // Validating inputs - let json_input = &jsonbody.0; - if let Err(err) = json_input.validate() { - log::error!("{}", err); - return response( - "Invalid attestation", - StatusCode::BAD_REQUEST, - Some(Value::String(err.to_string())), - ); - } - let signed = sign_attest(jsonbody.0).await.unwrap(); - let signature = json!({ - "r": ethers::types::H256::from_uint(&signed.r), - "s": ethers::types::H256::from_uint(&signed.s), - "v": signed.v - }); - response("Attestation signed", StatusCode::OK, Some(signature)) -} - // Get program status from the supervisord #[get("/benchmark")] async fn benchmark_generator(benchmark_params: web::Query) -> impl Responder { @@ -865,13 +734,15 @@ pub fn routes(conf: &mut web::ServiceConfig) { .service(restart_program_handler) .service(get_program_status_handler) .service(generate_config_setup) + .service(generate_config_setup_encrypted) .service(update_runtime_config) - // .service(add_new_generator_config) - // .service(remove_generator_from_config) + .service(update_runtime_config_encrypted) .service(update_generator_config) .service(fetch_generator_public_keys) - .service(sign_address) - .service(sign_attestation) - .service(benchmark_generator); + .service(benchmark_generator) + .service(helper::common_handlers::sign_address) + .service(helper::common_handlers::sign_attestation) + .service(helper::common_handlers::sign_address_encrypted) + .service(helper::common_handlers::sign_attestation_encrypted); conf.service(scope); } diff --git a/generator_client/src/handler_funcs/generator_config_setup.rs b/generator_client/src/handler_funcs/generator_config_setup.rs new file mode 100644 index 0000000..537a94f --- /dev/null +++ b/generator_client/src/handler_funcs/generator_config_setup.rs @@ -0,0 +1,94 @@ +use serde_json::{json, Value}; +use validator::Validate; + +use crate::{ + kalypso::{generate_config_file, generate_runtime_file, runtime_config_validation}, + model::GeneratorConfigSetupRequestBody, +}; + +pub async fn _generator_config_setup( + json_input: &GeneratorConfigSetupRequestBody, + ecies_priv_key: Vec, +) -> anyhow::Result { + //Validating the generator config + let generator_config_body = json_input.generator_config.as_ref().unwrap(); + if generator_config_body.len() > 1 { + return Err(anyhow::Error::msg( + "Only one generator supported".to_string(), + )); + } + for generator in generator_config_body { + if generator.supported_markets.as_ref().unwrap().len() > 1 { + return Err(anyhow::Error::msg( + "Only one market is supported for every generator".to_string(), + )); + } + if let Err(err) = generator.validate() { + log::error!("{}", err); + return Err(anyhow::Error::msg( + "Invalid Payload: Generator Setup Config".to_string(), + )); + } + } + + //Validating the runtime config + let runtime_config_body = json_input.runtime_config.as_ref().unwrap(); + if let Err(err) = runtime_config_body.validate() { + log::error!("{}", err); + return Err(anyhow::Error::msg( + "Invalid Payload: Runtime Config".to_string(), + )); + } + + let private_key = runtime_config_body.private_key.as_ref().unwrap(); + + let chain_id = runtime_config_body.chain_id.as_ref().unwrap(); + + let rpc_url = runtime_config_body.ws_url.as_ref().unwrap(); + + //Validating the runtime config to check if the runtime address has enough gas. + let validation_status = runtime_config_validation(private_key, rpc_url, chain_id).await; + let validation_status_result = match validation_status { + Ok(data) => data, + Err(e) => { + log::error!("{}", e); + return Err(anyhow::Error::msg( + "There was an issue while validating the request".to_string(), + )); + } + }; + if !validation_status_result { + return Err(anyhow::Error::msg( + "Runtime private_key doesn't have enough balance, minimum balance required is 0.05ETH" + .to_string(), + )); + } + + let ecies_priv_key = { hex::encode(ecies_priv_key) }; + + //Generating the generator config file + let generate_config_file = generate_config_file(generator_config_body, ecies_priv_key).await; + match generate_config_file { + Ok(data) => data, + Err(e) => { + log::error!("{}", e); + return Err(anyhow::Error::msg( + "There was an issue in generator setup".to_string(), + )); + } + }; + + //Generating the runtime config file + let runtime_config_file = generate_runtime_file(runtime_config_body).await; + match runtime_config_file { + Ok(data) => data, + Err(e) => { + log::error!("{}", e); + return Err(anyhow::Error::msg( + "There was an issue in runtime setup".to_string(), + )); + } + }; + + Ok(json!({})) +} diff --git a/generator_client/src/handler_funcs/mod.rs b/generator_client/src/handler_funcs/mod.rs new file mode 100644 index 0000000..273a38a --- /dev/null +++ b/generator_client/src/handler_funcs/mod.rs @@ -0,0 +1,3 @@ +pub mod generator_config_setup; +pub mod update_generator_config; +pub mod update_runtime_config; diff --git a/generator_client/src/handler_funcs/update_generator_config.rs b/generator_client/src/handler_funcs/update_generator_config.rs new file mode 100644 index 0000000..ad0a080 --- /dev/null +++ b/generator_client/src/handler_funcs/update_generator_config.rs @@ -0,0 +1,66 @@ +use crate::{ + kalypso::{read_generator_config_file, update_generator_config_file}, + model::UpdateGeneratorConfig, +}; +use std::io::ErrorKind; + +pub async fn _update_generator_config(json_input: &UpdateGeneratorConfig) -> anyhow::Result<()> { + if json_input.supported_markets.as_ref().unwrap().len() > 1 { + return Err(anyhow::Error::msg( + "Only one market is supported for every generator".to_string(), + )); + } + + let config_file_call = read_generator_config_file().await; + let mut config_file = match config_file_call { + Ok(data) => data, + Err(e) => { + log::error!("{}", e); + return Err(anyhow::Error::msg( + "There was an issue while updating the generator config file".to_string(), + )); + } + }; + + //Finding the generator to update + let generator_to_be_updated = json_input.address.as_ref().unwrap(); + let finding_generator_index = config_file + .generator_config + .iter() + .position(|x| &x.address == generator_to_be_updated); + + let generator_index = match finding_generator_index { + Some(data) => data, + None => { + return Err(anyhow::Error::msg( + "No generator found for the provided address".to_string(), + )); + } + }; + + //Checking the input for changes + if let Some(new_supported_markets) = &json_input.supported_markets { + config_file.generator_config[generator_index].supported_markets = + new_supported_markets.to_vec() + } + if let Some(new_data) = &json_input.data { + config_file.generator_config[generator_index].data = new_data.to_string() + } + + //Updating the config file + let update_config_file = update_generator_config_file(config_file).await; + match update_config_file { + Ok(data) => data, + Err(e) => { + log::error!("{}", e); + if e.kind() == ErrorKind::NotFound { + return Err(anyhow::Error::msg("There was an issue in updating the config file, since the config file was not found".to_string())); + } + return Err(anyhow::Error::msg( + "There was an issue in updating the config file".to_string(), + )); + } + } + + Ok(()) +} diff --git a/generator_client/src/handler_funcs/update_runtime_config.rs b/generator_client/src/handler_funcs/update_runtime_config.rs new file mode 100644 index 0000000..cde15fb --- /dev/null +++ b/generator_client/src/handler_funcs/update_runtime_config.rs @@ -0,0 +1,81 @@ +use serde_json::{json, Value}; + +use crate::{ + kalypso::{ + read_runtime_config_file, runtime_config_validation, update_runtime_config_file, + update_runtime_config_with_new_data, + }, + model::UpdateRuntimeConfig, +}; +use std::io::ErrorKind; + +pub async fn _udpate_runtime_config(jsonbody: UpdateRuntimeConfig) -> anyhow::Result { + let config_file_call = read_runtime_config_file().await; + let config_file = match config_file_call { + Ok(data) => data, + Err(e) => { + log::error!("{}", e); + return Err(anyhow::Error::msg( + "There was an issue while updating the generator config file".to_string(), + )); + } + }; + + // Checking if the provided private_key has enough gas + let private_key = match &jsonbody.private_key { + Some(data) => data, + None => &config_file.runtime_config.private_key, + }; + let chain_id = match &jsonbody.chain_id { + Some(data) => data, + None => &config_file.runtime_config.chain_id, + }; + let ws_rpc_url = match &jsonbody.ws_url { + Some(data) => data, + None => &config_file.runtime_config.ws_url, + }; + + let validation_status = runtime_config_validation(private_key, ws_rpc_url, chain_id).await; + let validation_status_result = match validation_status { + Ok(data) => data, + Err(e) => { + log::error!("{}", e); + return Err(anyhow::Error::msg("There was an issue while updating the runtime config, Please make sure if you are providing a new RPC url it is a valid one.".to_string())); + } + }; + if !validation_status_result { + return Err(anyhow::Error::msg( + "Runtime private_key doesn't have enough balance, minimum balance required is 0.05ETH" + .to_string(), + )); + } + + //Updating the runtime config file + let updated_runtime_config_data_call = + update_runtime_config_with_new_data(&jsonbody, config_file).await; + let updated_runtime_config_data = match updated_runtime_config_data_call { + Ok(data) => data, + Err(e) => { + log::error!("{}", e); + return Err(anyhow::Error::msg( + "There was an issue in updating the config file".to_string(), + )); + } + }; + + let update_config_file = update_runtime_config_file(updated_runtime_config_data).await; + match update_config_file { + Ok(data) => data, + Err(e) => { + log::error!("{}", e); + if e.kind() == ErrorKind::NotFound { + return Err(anyhow::Error::msg("There was an issue in updating the config file, since the config file was not found".to_string())); + } + return Err(anyhow::Error::msg( + "There was an issue in updating the config file".to_string(), + )); + } + } + + Ok(json!({})) +} diff --git a/generator_client/src/kalypso.rs b/generator_client/src/kalypso.rs index b662c57..d2018c3 100644 --- a/generator_client/src/kalypso.rs +++ b/generator_client/src/kalypso.rs @@ -15,7 +15,7 @@ use tokio::io::AsyncReadExt; use crate::model::{ AddNewGenerator, GeneratorConfig, GeneratorConfigFile, GeneratorPublicKeys, RuntimeConfig, RuntimeConfigFile, SetupRequestBodyGeneratorConfig, SetupRequestBodyRuntimeConfig, - SignAttestation, UpdateRuntimeConfig, ValidationResponse, + UpdateRuntimeConfig, ValidationResponse, }; macro_rules! update_field { @@ -60,6 +60,7 @@ pub async fn get_public_keys_for_a_generator( //Generate Config file pub async fn generate_config_file( generator_config_body: &Vec, + ecies_private_key: String, ) -> Result<(), Box> { // Create config_file_folder let folder_path = "../generator_config"; @@ -71,13 +72,6 @@ pub async fn generate_config_file( .expect("Unable to create new folder"); } - //Using the enclave secp secret for ecies private key - let read_secp_private_key = fs::read("/app/secp.sec").await?; - let secp_private_key = secp256k1::SecretKey::from_slice(&read_secp_private_key) - .unwrap() - .display_secret() - .to_string(); - //Structure data let config_file_path = folder_path.to_string() + "/generator_config.json"; let mut generator_config: Vec = Vec::new(); @@ -85,7 +79,7 @@ pub async fn generate_config_file( let generator_data = GeneratorConfig { address: generator.address.as_ref().unwrap().to_string(), data: generator.data.as_ref().unwrap().to_string(), - ecies_private_key: secp_private_key.clone(), + ecies_private_key: ecies_private_key.clone(), supported_markets: generator.supported_markets.as_ref().unwrap().to_vec(), }; generator_config.push(generator_data); @@ -171,7 +165,7 @@ pub async fn generate_runtime_file( } pub async fn update_runtime_config_with_new_data( - json_input: &Json, + json_input: &UpdateRuntimeConfig, mut config_file: RuntimeConfigFile, ) -> Result> { let config = &mut config_file.runtime_config; @@ -235,22 +229,16 @@ pub async fn read_generator_config_file() -> Result, + ecies_private_key: String, mut config_file: GeneratorConfigFile, ) -> Result> { //Updating the existing generator list let new_generator = &json_input.0; - //Using the enclave secp secret for ecies private key - let read_secp_private_key = fs::read("/app/secp.sec").await?; - let secp_private_key = secp256k1::SecretKey::from_slice(&read_secp_private_key) - .unwrap() - .display_secret() - .to_string(); - let new_generator_data = GeneratorConfig { address: new_generator.address.as_ref().unwrap().to_string(), data: new_generator.data.as_ref().unwrap().to_string(), - ecies_private_key: secp_private_key, + ecies_private_key: ecies_private_key.clone(), supported_markets: new_generator.supported_markets.as_ref().unwrap().to_vec(), }; config_file.generator_config.push(new_generator_data); @@ -421,45 +409,6 @@ pub async fn contract_validation() -> Result Result> { - //Using the enclave secp secret for ecies private key - let read_secp_private_key = fs::read("/app/secp.sec").await?; - let secp_private_key = secp256k1::SecretKey::from_slice(&read_secp_private_key) - .unwrap() - .display_secret() - .to_string(); - let signer = secp_private_key.parse::().unwrap(); - let values = vec![ethers::abi::Token::Address(Address::from_str(address)?)]; - let encoded = ethers::abi::encode(&values); - let digest = ethers::utils::keccak256(encoded); - let signature = signer.sign_message(ethers::types::H256(digest)).await?; - Ok(signature) -} - -pub async fn sign_attest( - attestation: SignAttestation, -) -> Result> { - // Using enclave private key for signature - let secp_file = fs::read("/app/secp.sec").await?; - let secp_private_key = secp256k1::SecretKey::from_slice(&secp_file) - .unwrap() - .display_secret() - .to_string(); - let signer = secp_private_key.parse::().unwrap(); - let attestation_bytes = attestation.attestation.unwrap(); - let attestation_string: Vec<&str> = attestation_bytes.split('x').collect(); - let attestation_decoded = hex::decode(attestation_string[1]).unwrap(); - let address = attestation.address.unwrap(); - let values = vec![ - ethers::abi::Token::Bytes(attestation_decoded), - ethers::abi::Token::Address(Address::from_str(&address)?), - ]; - let encoded = ethers::abi::encode(&values); - let digest = ethers::utils::keccak256(encoded); - let signature = signer.sign_message(ethers::types::H256(digest)).await?; - Ok(signature) -} - //Benchmark proof generation. Return proof generation time in ms. pub async fn benchmark(endpoint: String) -> Result> { let client = reqwest::Client::new(); diff --git a/generator_client/src/lib.rs b/generator_client/src/lib.rs new file mode 100644 index 0000000..9dc76f6 --- /dev/null +++ b/generator_client/src/lib.rs @@ -0,0 +1,6 @@ +pub mod client; +mod handler; +mod handler_funcs; +mod kalypso; +mod model; +mod supervisord; diff --git a/generator_client/src/main.rs b/generator_client/src/main.rs index bf19a99..7fd3e49 100644 --- a/generator_client/src/main.rs +++ b/generator_client/src/main.rs @@ -1,30 +1,23 @@ -mod handler; -mod kalypso; -mod model; -mod response; -mod supervisord; - -use actix_web::{App, HttpServer}; use dotenv::dotenv; +use generator_client::client; +use tokio::fs; use std::env; -#[actix_web::main] +#[tokio::main] async fn main() -> std::io::Result<()> { dotenv().ok(); env_logger::init_from_env(env_logger::Env::new().default_filter_or("info")); let port: u16 = env::var("PORT") - .unwrap_or_else(|_| panic!("PORT must be provided in the .env file")) + .unwrap_or_else(|_| "1500".to_string()) .parse::() .expect("PORT must be a valid number"); - let server = HttpServer::new(move || App::new().configure(handler::routes)) - .bind(("0.0.0.0", port)) - .unwrap_or_else(|_| panic!("Can not bind to {}", &port)) - .run(); + let enclave_key = fs::read("/app/secp.sec").await?; + let server = client::GeneratorClient::new(hex::encode(enclave_key), port); - log::info!("generator-client started on port {}", port); + server.start(false).await.unwrap(); - server.await + Ok(()) } diff --git a/generator_client/src/model.rs b/generator_client/src/model.rs index 6b1022b..6ae7a9e 100644 --- a/generator_client/src/model.rs +++ b/generator_client/src/model.rs @@ -125,7 +125,7 @@ pub struct GetRsaPublicKeyRequest { pub generator_address: Option, } -#[derive(Serialize, Debug, Validate, Deserialize)] +#[derive(Serialize, Debug, Validate, Deserialize, Clone)] pub struct UpdateRuntimeConfig { #[validate(contains(pattern = "wss", message = "wss url is required"))] pub ws_url: Option, @@ -165,7 +165,7 @@ pub struct RemoveGenerator { pub address: Option, } -#[derive(Serialize, Debug, Validate, Deserialize)] +#[derive(Serialize, Debug, Validate, Deserialize, Clone)] pub struct UpdateGeneratorConfig { #[validate( contains(pattern = "0x", message = "The address should start with 0x"), diff --git a/helper/Cargo.toml b/helper/Cargo.toml index ba00c91..687bea7 100644 --- a/helper/Cargo.toml +++ b/helper/Cargo.toml @@ -6,13 +6,26 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] +actix-extensible-rate-limit = "0.3.1" +actix-web = "4.5.1" +aes-gcm = "0.10.3" +anyhow = "1.0.86" +chrono = { version = "0.4", features = ["serde"] } ecies = {version = "0.2.6", features = ["std"]} -openssl = { version = "0.10.57", features = ["vendored"] } ethers = { version = "2", features = ["rustls"] } -aes-gcm = "0.10.3" +flate2 = "1.0.28" +futures = "0.3" hex = "0.4.3" -serde = "1.0.178" +log = "0.4" +openssl = { version = "0.10.57", features = ["vendored"] } +secp256k1 = "0.30.0" +serde = "1.0" +serde_json = "1.0" +validator = { version = "0.18.1", features = ["derive"] } +rustls = "0.20" +tokio = { version = "1", features = ["full"] } +actix-cors = {version = "0.7.0", optional=true } -[lib] -name = "helper" -path = "lib.rs" +[features] +default = [] +enable_cors = ["actix-cors"] \ No newline at end of file diff --git a/helper/lib.rs b/helper/lib.rs deleted file mode 100644 index 0022d2d..0000000 --- a/helper/lib.rs +++ /dev/null @@ -1 +0,0 @@ -pub mod secret_inputs_helpers; diff --git a/helper/src/attestation_helpers.rs b/helper/src/attestation_helpers.rs new file mode 100644 index 0000000..ea1af90 --- /dev/null +++ b/helper/src/attestation_helpers.rs @@ -0,0 +1,78 @@ +use ethers::abi::Token; +use ethers::core::types::Bytes; +use ethers::signers::{LocalWallet, Signer}; +use ethers::types::{H256, U256}; +use ethers::utils::keccak256; +use secp256k1::SecretKey; + +pub async fn convert_to_tee_attested_proofs( + public_inputs: Bytes, + proof: Bytes, + signer: S, +) -> Result> +where + S: Signer + Clone, +{ + let value = vec![ + Token::Bytes(public_inputs.to_vec()), + Token::Bytes(proof.to_vec()), + ]; + + let encoded = ethers::abi::encode(&value); + let digest = keccak256(encoded); + + let signature = signer.sign_message(H256(digest)).await.unwrap(); + + let value = vec![ + Token::Bytes(public_inputs.to_vec()), + Token::Bytes(proof.to_vec()), + Token::Bytes(signature.to_vec()), + ]; + let encoded = ethers::abi::encode(&value); + Ok(encoded.into()) +} + +pub async fn convert_to_tee_attested_proofs_with_enclave_key( + public_inputs: Bytes, + proof: Bytes, + secp_private_key: Vec, +) -> Result> { + let secp_private_key = SecretKey::from_slice(&secp_private_key) + .unwrap() + .display_secret() + .to_string(); + let signer_wallet = secp_private_key.parse::().unwrap(); + + convert_to_tee_attested_proofs(public_inputs, proof, signer_wallet).await +} + +pub async fn generate_invalid_input_attestation( + ask_id: U256, + public_inputs: Bytes, + signer: S, +) -> String +where + S: Signer + Clone, +{ + let value = vec![Token::Uint(ask_id), Token::Bytes(public_inputs.to_vec())]; + let encoded = ethers::abi::encode(&value); + let digest = keccak256(encoded); + + let signature = signer.sign_message(H256(digest)).await.unwrap(); + + signature.to_string() +} + +pub async fn generate_invalid_input_attestation_with_private_key( + ask_id: U256, + public_inputs: Bytes, + secp_private_key: Vec, +) -> String { + let secp_private_key = secp256k1::SecretKey::from_slice(&secp_private_key) + .unwrap() + .display_secret() + .to_string(); + let signer_wallet = secp_private_key.parse::().unwrap(); + + generate_invalid_input_attestation(ask_id, public_inputs, signer_wallet).await +} diff --git a/helper/src/common_handlers.rs b/helper/src/common_handlers.rs new file mode 100644 index 0000000..b1a0e48 --- /dev/null +++ b/helper/src/common_handlers.rs @@ -0,0 +1,231 @@ +use crate::response::response; +use crate::sch_payload::{SCHPayload, ToPayload, ToSchResponse}; +use actix_web::http::StatusCode; +use actix_web::web::Data; +use actix_web::{post, web, Responder}; +use ethers::prelude::*; +use serde::{Deserialize, Serialize}; +use serde_json::{json, Value}; +use std::str::FromStr; +use std::sync::{Arc, Mutex}; +use validator::Validate; + +#[derive(Serialize, Debug, Validate, Deserialize)] +pub struct SignAddress { + #[validate(required(message = "address was not provided in the JSON body"))] + pub address: Option, +} + +#[derive(Serialize, Debug, Validate, Deserialize, Clone)] +pub struct SignAttestation { + #[validate(required(message = "attestation bytes were not provided in the JSON body"))] + pub attestation: Option, + #[validate(required(message = "address was not provided in the JSON body"))] + pub address: Option, +} + +impl SignAttestation { + #[allow(unused)] + pub fn new(attestation: &str, address: &str) -> SignAttestation { + SignAttestation { + attestation: Some(attestation.to_string()), + address: Some(address.to_string()), + } + } +} + +// Sign Address +#[post("/signAddress")] +async fn sign_address( + jsonbody: web::Json, + ecies_priv_key: Data>>>, +) -> impl Responder { + //Validating inputs + let json_input = &jsonbody.0; + if let Err(err) = json_input.validate() { + log::error!("{}", err); + return response( + "Invalid payload", + StatusCode::BAD_REQUEST, + Some(Value::String(err.to_string())), + ); + } + + let ecies_priv_key = { ecies_priv_key.lock().unwrap().clone() }; + + let signed_address = _sign_address(json_input, &ecies_priv_key).await; + + if signed_address.is_some() { + response("Address signed", StatusCode::OK, signed_address) + } else { + response("Address signing failed", StatusCode::BAD_REQUEST, None) + } +} + +// Sign Address Encrypted +#[post("/signAddressEncrypted")] +async fn sign_address_encrypted( + jsonbody: web::Json, + ecies_priv_key: Data>>>, +) -> impl Responder { + let ecies_priv_key = { ecies_priv_key.lock().unwrap().clone() }; + + let json_input: SignAddress = match jsonbody.0.to_payload(&ecies_priv_key) { + Ok(data) => data, + Err(e) => { + log::error!("{}", &e.to_string()); + return response(&e.to_string(), StatusCode::BAD_REQUEST, None); + } + }; + + let signed_address = _sign_address(&json_input, &ecies_priv_key).await; + + if signed_address.is_some() { + let signed_address = signed_address.unwrap(); + let sch_response = match jsonbody + .0 + .to_sch_response(signed_address, ecies_priv_key.clone()) + .await + { + Ok(data) => data, + Err(e) => { + log::error!("{}", &e.to_string()); + return response(&e.to_string(), StatusCode::BAD_REQUEST, None); + } + }; + + return response( + "Address signed", + StatusCode::OK, + Some(serde_json::to_value(&sch_response).unwrap()), + ); + } else { + return response("Address signing failed", StatusCode::BAD_REQUEST, None); + } +} + +async fn _sign_address(body: &SignAddress, ecies_priv_key: &Vec) -> Option { + let addy_to_be_signed = body.address.as_ref().unwrap(); + let ecies_priv_key = hex::encode(ecies_priv_key); + let signed = sign_addy(ecies_priv_key, addy_to_be_signed).await.unwrap(); + let signature = json!({ + "r": ethers::types::H256::from_uint(&signed.r), + "s": ethers::types::H256::from_uint(&signed.s), + "v": signed.v + }); + + Some(signature) +} + +// Sign Attestaion +#[post("/signAttestation")] +async fn sign_attestation( + jsonbody: web::Json, + ecies_priv_key: Data>>>, +) -> impl Responder { + // Validating inputs + let json_input = &jsonbody.0; + if let Err(err) = json_input.validate() { + log::error!("{}", err); + return response( + "Invalid attestation", + StatusCode::BAD_REQUEST, + Some(Value::String(err.to_string())), + ); + } + + let ecies_priv_key = { ecies_priv_key.lock().unwrap().clone() }; + + let signed_attestation = _sign_attestation(json_input, &ecies_priv_key).await; + + if signed_attestation.is_some() { + return response("Attestation signed", StatusCode::OK, signed_attestation); + } else { + return response("Attestation signing failed", StatusCode::BAD_REQUEST, None); + } +} + +// Sign Attestaion Encrypted +#[post("/signAttestationEncrypted")] +async fn sign_attestation_encrypted( + jsonbody: web::Json, + ecies_priv_key: Data>>>, +) -> impl Responder { + let ecies_priv_key = { ecies_priv_key.lock().unwrap().clone() }; + + let json_input: SignAttestation = match jsonbody.0.to_payload(&ecies_priv_key) { + Ok(data) => data, + Err(e) => { + log::error!("{}", &e.to_string()); + return response(&e.to_string(), StatusCode::BAD_REQUEST, None); + } + }; + + let signed_attestation = _sign_attestation(&json_input, &ecies_priv_key).await; + + if signed_attestation.is_some() { + let signed_attestation = signed_attestation.unwrap(); + let sch_response = match jsonbody + .0 + .to_sch_response(signed_attestation, ecies_priv_key.clone()) + .await + { + Ok(data) => data, + Err(e) => { + log::error!("{}", &e.to_string()); + return response(&e.to_string(), StatusCode::BAD_REQUEST, None); + } + }; + + return response( + "Attestation signed", + StatusCode::OK, + Some(serde_json::to_value(&sch_response).unwrap()), + ); + } else { + return response("Attestation signing failed", StatusCode::BAD_REQUEST, None); + } +} + +async fn _sign_attestation(body: &SignAttestation, ecies_priv_key: &Vec) -> Option { + let ecies_priv_key = hex::encode(ecies_priv_key); + let signed = sign_attest(ecies_priv_key, body.clone()).await.unwrap(); + let signature = json!({ + "r": ethers::types::H256::from_uint(&signed.r), + "s": ethers::types::H256::from_uint(&signed.s), + "v": signed.v + }); + + Some(signature) +} + +async fn sign_addy( + ecies_private_key: String, + address: &str, +) -> Result> { + let signer = ecies_private_key.clone().parse::().unwrap(); + let values = vec![ethers::abi::Token::Address(Address::from_str(address)?)]; + let encoded = ethers::abi::encode(&values); + let digest = ethers::utils::keccak256(encoded); + let signature = signer.sign_message(ethers::types::H256(digest)).await?; + Ok(signature) +} + +async fn sign_attest( + ecies_private_key: String, + attestation: SignAttestation, +) -> Result> { + let signer = ecies_private_key.parse::().unwrap(); + let attestation_bytes = attestation.attestation.unwrap(); + let attestation_string: Vec<&str> = attestation_bytes.split('x').collect(); + let attestation_decoded = hex::decode(attestation_string[1]).unwrap(); + let address = attestation.address.unwrap(); + let values = vec![ + ethers::abi::Token::Bytes(attestation_decoded), + ethers::abi::Token::Address(Address::from_str(&address)?), + ]; + let encoded = ethers::abi::encode(&values); + let digest = ethers::utils::keccak256(encoded); + let signature = signer.sign_message(ethers::types::H256(digest)).await?; + Ok(signature) +} diff --git a/helper/src/custom_logger.rs b/helper/src/custom_logger.rs new file mode 100644 index 0000000..4eee258 --- /dev/null +++ b/helper/src/custom_logger.rs @@ -0,0 +1,26 @@ +use std::sync::{Arc, Mutex}; + +pub struct CustomLogger { + storage: Arc>>, +} + +impl CustomLogger { + pub fn new(storage: Arc>>) -> Self { + Self { storage } + } +} + +impl log::Log for CustomLogger { + fn enabled(&self, metadata: &log::Metadata) -> bool { + metadata.level() <= log::Level::Info + } + + fn log(&self, record: &log::Record) { + if self.enabled(record.metadata()) { + let mut logs = self.storage.lock().unwrap(); + logs.push(format!("[{}] {}", record.level(), record.args())); + } + } + + fn flush(&self) {} +} diff --git a/helper/src/lib.rs b/helper/src/lib.rs new file mode 100644 index 0000000..a69a2f1 --- /dev/null +++ b/helper/src/lib.rs @@ -0,0 +1,8 @@ +pub mod attestation_helpers; +pub mod common_handlers; +pub mod custom_logger; +pub mod middlewares; +pub mod response; +pub mod sch_payload; +pub mod secret_inputs_helpers; +pub mod ssc; diff --git a/helper/src/middlewares/dirty_cors.rs b/helper/src/middlewares/dirty_cors.rs new file mode 100644 index 0000000..15c96ee --- /dev/null +++ b/helper/src/middlewares/dirty_cors.rs @@ -0,0 +1,10 @@ +use actix_cors::Cors; + +pub fn get_dirty_cors() -> Cors { + Cors::default() + .allow_any_origin() + .allow_any_method() + .allow_any_header() + .supports_credentials() + .max_age(3600) +} diff --git a/helper/src/middlewares/mod.rs b/helper/src/middlewares/mod.rs new file mode 100644 index 0000000..31531e1 --- /dev/null +++ b/helper/src/middlewares/mod.rs @@ -0,0 +1,5 @@ +pub mod ratelimiter; +pub mod request_limiter; + +#[cfg(feature = "enable_cors")] +pub mod dirty_cors; diff --git a/matching_engine/src/middlewares/ratelimiter.rs b/helper/src/middlewares/ratelimiter.rs similarity index 54% rename from matching_engine/src/middlewares/ratelimiter.rs rename to helper/src/middlewares/ratelimiter.rs index ed68e8f..6581767 100644 --- a/matching_engine/src/middlewares/ratelimiter.rs +++ b/helper/src/middlewares/ratelimiter.rs @@ -6,13 +6,26 @@ use actix_web::dev::ServiceRequest; use std::future::Ready; use std::time::Duration; -pub fn get_rate_limiter() -> RateLimiter< +/// Creates a new RateLimiter with specified duration and maximum requests. +/// +/// # Arguments +/// +/// * `duration` - The time window for rate limiting. +/// * `max_requests` - The maximum number of requests allowed within the duration. +/// +/// # Returns +/// +/// A configured RateLimiter instance. +pub fn get_rate_limiter( + duration: Duration, + max_requests: u64, +) -> RateLimiter< InMemoryBackend, SimpleOutput, impl Fn(&ServiceRequest) -> Ready> + 'static, > { let backend = InMemoryBackend::builder().build(); - let input = SimpleInputFunctionBuilder::new(Duration::from_secs(1), 5) + let input = SimpleInputFunctionBuilder::new(duration, max_requests) .real_ip_key() .build(); diff --git a/helper/src/middlewares/request_limiter.rs b/helper/src/middlewares/request_limiter.rs new file mode 100644 index 0000000..2bc3192 --- /dev/null +++ b/helper/src/middlewares/request_limiter.rs @@ -0,0 +1,101 @@ +// src/middlewares/request_limiter.rs + +use actix_web::{ + body::EitherBody, + dev::{Service, ServiceRequest, ServiceResponse, Transform}, + Error, HttpResponse, +}; +use futures::future::{ok, Ready}; +use std::future::Future; +use std::pin::Pin; +use std::sync::Arc; +use tokio::sync::Semaphore; + +/// Middleware to limit the number of concurrent requests. +#[derive(Clone)] +pub struct ConcurrencyLimiter { + semaphore: Arc, +} + +impl ConcurrencyLimiter { + /// Creates a new `ConcurrencyLimiter` with the specified maximum number of concurrent requests. + pub fn new(max_concurrent: usize) -> Self { + ConcurrencyLimiter { + semaphore: Arc::new(Semaphore::new(max_concurrent)), + } + } +} + +impl Transform for ConcurrencyLimiter +where + S: Service, Error = Error> + 'static, + S::Future: 'static, + B: 'static, +{ + type Response = ServiceResponse>; + type Error = Error; + type InitError = (); + type Transform = ConcurrencyLimiterMiddleware; + type Future = Ready>; + + fn new_transform(&self, service: S) -> Self::Future { + ok(ConcurrencyLimiterMiddleware { + service: Arc::new(service), + semaphore: self.semaphore.clone(), + }) + } +} + +/// Middleware service that enforces concurrency limits. +pub struct ConcurrencyLimiterMiddleware { + service: Arc, + semaphore: Arc, +} + +impl Service for ConcurrencyLimiterMiddleware +where + S: Service, Error = Error> + 'static, + S::Future: 'static, + B: 'static, +{ + type Response = ServiceResponse>; + type Error = Error; + type Future = Pin>>>; + + fn poll_ready( + &self, + ctx: &mut std::task::Context<'_>, + ) -> std::task::Poll> { + self.service.poll_ready(ctx) + } + + fn call(&self, req: ServiceRequest) -> Self::Future { + let semaphore = self.semaphore.clone(); + let service = self.service.clone(); + + match semaphore.try_acquire_owned() { + Ok(permit) => { + // If a permit is acquired, proceed with the request + Box::pin(async move { + // Hold the permit for the duration of the request + let _permit = permit; + + // Process the request + let res = service.call(req).await?; + + // Map the response body to EitherBody::Left + Ok(res.map_into_left_body()) + }) + } + Err(_) => { + // If no permits are available, reject the request with 503 + Box::pin(async move { + let response = HttpResponse::ServiceUnavailable() + .body("Too many concurrent requests. Please try again later.") + .map_into_right_body(); + Ok(req.into_response(response)) + }) + } + } + } +} diff --git a/generator_client/src/response.rs b/helper/src/response.rs similarity index 100% rename from generator_client/src/response.rs rename to helper/src/response.rs diff --git a/helper/src/sch_payload.rs b/helper/src/sch_payload.rs new file mode 100644 index 0000000..cbf0c81 --- /dev/null +++ b/helper/src/sch_payload.rs @@ -0,0 +1,150 @@ +use crate::secret_inputs_helpers::{decrypt_ecies, encrypt_ecies}; +use anyhow::Context; +use ethers::abi::{encode, Token}; +use ethers::core::utils::keccak256; +use ethers::prelude::*; +use rand::rngs::OsRng; +use rand::RngCore; +use serde::{Deserialize, Serialize}; +use serde_json::Value; + +#[derive(Serialize, Debug, Clone, Deserialize)] +pub struct SCHPayload { + request: Vec, + response_key: Vec, + signature: Vec, +} + +pub trait ToPayload { + fn to_payload(&self, ecies_priv_key: &Vec) -> anyhow::Result; +} + +impl ToPayload for SCHPayload +where + T: for<'de> Deserialize<'de>, +{ + fn to_payload(&self, ecies_priv_key: &Vec) -> anyhow::Result { + let sch_payload = self.verify()?.decrypt(ecies_priv_key)?; + let request_str = std::str::from_utf8(&sch_payload.request) + .context("Failed to convert request to UTF-8 string")?; + + let payload: T = serde_json::from_str(request_str) + .context("Failed to deserialize request into payload")?; + + Ok(payload) + } +} + +impl SCHPayload { + fn verify(&self) -> anyhow::Result { + let response_key = self.response_key.clone(); + let request = self.request.clone(); + + let tokens = vec![ + Token::Bytes(request.clone()), + Token::Bytes(response_key.clone()), + ]; + + let encoded = encode(&tokens); + + let digest = keccak256(&encoded); + + let signature = match Signature::try_from(&self.signature[..]) { + Ok(data) => data, + Err(e) => return Err(anyhow::Error::msg(e.to_string())), + }; + + let recovered_address = match signature.recover(ethers::utils::hash_message(digest)) { + Ok(data) => data, + Err(e) => return Err(anyhow::Error::msg(e.to_string())), + }; + + let hash = keccak256(&response_key[1..]); + let expected_address = H160::from_slice(&hash[12..]).into(); + + if recovered_address == expected_address { + Ok(self.clone()) + } else { + Err(anyhow::Error::msg( + "Signature verification failed.".to_string(), + )) + } + } + + fn decrypt(&self, ecies_private_key: &[u8]) -> anyhow::Result { + let request = match decrypt_ecies(ecies_private_key, &self.request) { + Ok(data) => data, + Err(e) => return Err(anyhow::Error::msg(e.to_string())), + }; + + Ok(SCHPayload { + request, + response_key: self.response_key.clone(), + signature: self.signature.clone(), + }) + } +} + +#[derive(Serialize, Debug, Clone, Deserialize)] +pub struct SCHResponse { + response: Vec, + salt: Vec, + signature: Vec, +} + +pub trait ToSchResponse { + fn to_sch_response( + &self, + response_payload: Value, + enclave_key: Vec, + ) -> impl std::future::Future> + Send; +} + +impl ToSchResponse for SCHPayload { + async fn to_sch_response( + &self, + response_payload: Value, + enclave_key: Vec, + ) -> anyhow::Result { + let json_str = serde_json::to_string(&response_payload) + .context("Failed to serialize response payload to JSON")?; + + let utf8_bytes = json_str.as_bytes().to_vec(); + + let encrypted_data = match encrypt_ecies(&self.response_key, &utf8_bytes) { + Ok(data) => data, + Err(e) => return Err(anyhow::Error::msg(e.to_string())), + }; + + let salt = { + let mut salt = vec![0u8; 64]; + OsRng.fill_bytes(&mut salt); + salt + }; + + let values = vec![ + ethers::abi::Token::Bytes(encrypted_data.clone()), + ethers::abi::Token::Bytes(salt.clone()), + ]; + + let encoded = ethers::abi::encode(&values); + let digest = ethers::utils::keccak256(encoded); + + let enclave_key = hex::encode(&enclave_key); + let enclave_signer = enclave_key.parse::().unwrap(); + + let signature = match enclave_signer + .sign_message(ethers::types::H256(digest)) + .await + { + Ok(data) => data, + Err(e) => return Err(anyhow::Error::msg(e.to_string())), + }; + + Ok(SCHResponse { + response: encrypted_data, + salt, + signature: signature.to_vec(), + }) + } +} diff --git a/helper/secret_inputs_helpers.rs b/helper/src/secret_inputs_helpers.rs similarity index 93% rename from helper/secret_inputs_helpers.rs rename to helper/src/secret_inputs_helpers.rs index 0246430..0b928fb 100644 --- a/helper/secret_inputs_helpers.rs +++ b/helper/src/secret_inputs_helpers.rs @@ -3,7 +3,7 @@ use aes_gcm::{ aead::{Aead, Payload}, Aes256Gcm, Key, Nonce, }; -use ecies::{decrypt, encrypt}; +use ecies::{decrypt, encrypt, PublicKey, SecretKey}; use ethers::core::types::U256; use openssl::rand; use openssl::rand::rand_bytes; @@ -53,6 +53,18 @@ pub fn decrypt_aes(encrypted_data: &[u8], secret_key: &[u8]) -> Result, Ok(decrypted) } +pub fn flatten(compressed_data: &[u8]) -> Result, Box> { + use flate2::read::ZlibDecoder; + use std::io::Read; + + let mut decoder = ZlibDecoder::new(compressed_data); + let mut decoded_secret_input: Vec = Vec::new(); + + decoder.read_to_end(&mut decoded_secret_input)?; + + Ok(decoded_secret_input) +} + #[allow(unused)] pub fn decrypt_aes_gcm( encrypted_data: &[u8], @@ -166,12 +178,13 @@ pub fn decrypt_data_with_ecies_and_aes( encrypted_data: &[u8], acl_data: &[u8], private_key: &[u8], - market_id: U256, + market_id: Option, ) -> Result, Box> { let decrypted_secret_key = decrypt(private_key, acl_data); match decrypted_secret_key { Ok(secret_key) => { - let decrypted_data = try_decrypt(encrypted_data, &secret_key, market_id).unwrap(); + let decrypted_data = + try_decrypt(encrypted_data, &secret_key, market_id.unwrap()).unwrap(); Ok(decrypted_data) } @@ -198,6 +211,13 @@ pub fn u256_to_u8_vector(u256_num: U256) -> Vec { result } +pub fn get_uncompressed_ecies_pubkey(private_key: &[u8; 32]) -> Vec { + let sk = SecretKey::parse(private_key).unwrap(); + let public_key = PublicKey::from_secret_key(&sk); + let public_key = public_key.serialize(); + public_key.into() +} + #[cfg(test)] mod tests { use super::{ diff --git a/helper/src/ssc.rs b/helper/src/ssc.rs new file mode 100644 index 0000000..69124bf --- /dev/null +++ b/helper/src/ssc.rs @@ -0,0 +1,72 @@ +use openssl::hash::MessageDigest; +use openssl::pkey::PKey; +use openssl::rsa::Rsa; +use openssl::x509::X509Builder; +use openssl::x509::X509Name; + +pub struct CertInfo { + pub cert_pem: Vec, + pub key_der: Vec, // Use DER format for Rustls +} + +pub fn generate_self_signed_cert() -> CertInfo { + // Generate RSA key + let rsa = Rsa::generate(2048).unwrap(); + let pkey = PKey::from_rsa(rsa).unwrap(); + + // Create X509 builder and build self-signed cert + let mut builder = X509Builder::new().unwrap(); + + // Set certificate name + let mut name_builder = X509Name::builder().unwrap(); + name_builder + .append_entry_by_text("CN", "localhost") + .unwrap(); + let name = name_builder.build(); + + builder.set_subject_name(&name).unwrap(); + builder.set_issuer_name(&name).unwrap(); + builder.set_pubkey(&pkey).unwrap(); + + // Set certificate validity + let now = openssl::asn1::Asn1Time::days_from_now(0).unwrap(); // Valid from now + let expire = openssl::asn1::Asn1Time::days_from_now(365).unwrap(); // Valid for 1 year + builder.set_not_before(&now).unwrap(); + builder.set_not_after(&expire).unwrap(); + + // Sign the certificate with SHA-256 + builder.sign(&pkey, MessageDigest::sha256()).unwrap(); + + // Convert certificate and key to correct formats + let cert = builder.build(); + let cert_pem = cert.to_pem().unwrap(); // Certificate in PEM format + let key_der = pkey.private_key_to_der().unwrap(); // Private key in DER format + + CertInfo { cert_pem, key_der } +} + +use rustls::{Certificate, PrivateKey, ServerConfig}; + +pub fn create_rustls_server_config( + cert_pem: Vec, + key_pem: Vec, +) -> Result { + let cert_chain = vec![Certificate(cert_pem)]; + let private_key = PrivateKey(key_pem); + + ServerConfig::builder() + .with_safe_defaults() + .with_no_client_auth() + .with_single_cert(cert_chain, private_key) +} + +pub fn create_random_rustls_server_config() -> Result { + let cert_info = generate_self_signed_cert(); + let cert_chain = vec![Certificate(cert_info.cert_pem)]; + let private_key = PrivateKey(cert_info.key_der); + + ServerConfig::builder() + .with_safe_defaults() + .with_no_client_auth() + .with_single_cert(cert_chain, private_key) +} diff --git a/integration_check_data_template/ivsCustomData/check_encrypted_input_payload.json b/integration_check_data_template/ivsCustomData/check_encrypted_input_payload.json index ca5965e..9e26dfe 100644 --- a/integration_check_data_template/ivsCustomData/check_encrypted_input_payload.json +++ b/integration_check_data_template/ivsCustomData/check_encrypted_input_payload.json @@ -1,6 +1 @@ -{ - "acl": "044cc115f26549194601f625b05a8956e15d2284f30c35b797e8e9d22066ea9178d03cb255ab432a1b82e020849ca11195001bcbce844e78136b0311bff7bf9242c3184365548cd3a609584b07a0e7269be6c017791f1136d768b2495f5a895de9c5d0329549b39ebf403667f080c900bfddb0308c60d3d2206430cf7da283e0d6", - "encrypted_secrets": "8dfe1c2056d343bdf6476557e46e21df23ee9020acc425fec5885abba06788af2c915f9fcea0691d1817c563a3d2b608f1d56e6db895757cffe2e894268978cb4ccdbee3c2291366b11e2b030431dd3856657c42e20340b4aa015563d7fa8a3b8a579d267ff5adcc97ec90bfb1a100c98c602ed75c212308098736d1026cc0be610063f3efe6c7ea12dfbad1ff6a12c84b059af43dd81450e4fad810296926ccf01905fcec13cae87897c10b12003b5265c062ac12293a2b0fbf6576c628de123d7497b5342440b3e84b50bc6ff9f87697302c86d04875ca9be427d22d328f343bafc728ebb38e5d3a86587b90b7de549660383dfb645fb0e8ddebc7ac0ae6f8ac04cd327818c3cd77167875eb5f9280289a274e7326abf885657cd8318c42263141f088b20aad13700a717d774820a2ba2d57f2807d095ee06a91a95906bdc5f3f84051514a63c89b4863956b0791f23951f65f3645360759b1bc8b363d6616ccb66ddf802cb1daa7b53d41d629c9e9d048a0797003dc5967b2c3c14033d53b9483022f1d070b5bdecbf3ada9bd0dcf3d814af298353ff2a0205056233880db8e0fbb6b3763f9bfd83b70ac2a79332982fa54f3bba58182cf5f8d14c4c2b514c3ec834f9f26ab808ef935aa24fb309dedaeb11b32ada0fe33691e7301394d4a5032cf9d2346683cb48d5cc8018c5b4a4c73aa8f1cf72b47fd6fda913026269e9fb4de8d9cb7033ea6afc626e4613dfe504f9f7b651b94e02703ba5b4cf872d425923fdc4634a566767e0e39d112ad7531ed91fad572bf6bbaf377b901418e31796f1d5b05a540417ae745db4361025a94b4db2c09e5510bcb826027653c4afef135e8e11f193b1178eacc219ab9cb7ed119ed1b1c0d6942f2e7f9a08ef313372c75078c30f128ca04690b6a0db3027494d92e1fc3d6cf8464aca3a0612246ec2119bba57f1163cfa7af1fc10dcc05ee8b843c2973701a9ef6852ad10454cdb19526dccdf52a07fd511d42a599bcb4e403f046246b73ec4eac328d08abed96e685441089c6adb307a57a854582e2859daf2f8c25cc41b37d5e7e1d9e9d7933424e73e4f1faa6bf3922bcb7fde4a359b4d18c09c0427b40d1e79a04d7e68d1e0b2225623b94c5c134dafe032d6b130043b40a97a938047f5a6a54acc0119811fe3f7c205b745261a3bb7b00f6a96f2d5449b27536007a6caa5af419ed756b7fcbb39f0b0b3663c82b15db11dd3e405119aa9f5af19cd7cc5936df6c89ae09efb91c4db08cdff7408e32e0dd539e4d2c6811281d4fb7dbe8a661bacc570c1e43b3131199db613b33258c516dd7f322536796ced670e66b9da7f5ae46e5a8908a53b65d6971c862e30057af8818f7bfc957052bbe2ff842db9080017c0e4737d0a092a14e7e466b68acb3c023f9e6ad17a1a914989eae2c0179861ece8f15dcd0bb1d703a71cb0769965f14c4ded619a9eabef822b886f91122d43a6fc8bf7461ea07a300e12aea59f62391c98bc0c97022e633e8ad2266ab2ec4e48d2e86a0759c3bba22c28c378939584e068b519c3d6d45c725f2a5a5fc5e3b685690fabb18ef4df4dc2c8eb8ca9e290fee4c87abb8f63a773c3db792d51b9bbd349c51e55dd1c50b7a360be7e3e75747c2a0089a8537e3d6ac85d45d66be846d45dc673cb4120a9d6cd1eb6ffcc0b190023a49fa8067b86e9480c370bdfcf03de354883252fc92c9e4a7c421bf21b7dd14aaf3660c24f2f961edd52cfcf05f0b72fd2a3b0af46e600ca6b05857f79b96cbcd73c0b27b5634e0c4649d11c3dd8fec71ac1f85175cb857d1cf8fbe075a1c643416915a4090ef7158e5a0fb1f2dfe4d6100c587f162678da5fbf0aca4a6af6977685b1c40f1ffb129b46ecf0e330c5d6362a3e8d4bbc0fac186729286681303e7fff80fd919ce5c97270936f3e72f052005de0556fa76c9d1ec7a5a31b750082ed595e3c0b445cf58c7d8a06cf02772af0ff6377aa96aa7e5708a9b9e2ad18d8010eb21e4c8564bab8bbf8f645ef1a331bd13576718100d9f1c899d7f6908e1fd856d0e00d48da65304152c0d6409bc4e191923c8e5260301e586442deeebe96140228abb43a98a9c312fc7b7b163b8a243cce52151f79d5fce989cf5ca6df7344aab90cc7cc6edbeb7890a8522b1b92800d724cec8623fb77ae70aa20bba89554770d10bf766598c395f32829b89b98470c51a561fe3b2279518aca655c188ab6b5a73b911187a642351cfd575987a17967ba65ff60de5db69d2f789249589e1320e35129f243437472ee98aceb254137c826241e9dae8081d1a6588d2ba3646ed89d4c97a2404272634a3e054bac1c35d6ee3b4a3ebda49880e134ebbe5e8f60c8dfc92817a85da764ad84c332863c05f2c46276304d740c0c8387cfa0371a1bff317d99ab980af7e2e68a3901e58dda22d23ee4257809feb525d2023510f4e053bc86919e8feeef6c7694493dbb0caaea8ac8de4076f602ca929f59dd31e87f165e972768a849ca5d0329cd06f9e1947e9fee573f151eaf3bcaa0c598dc6536a5508cdc6d3ebab51d58af9f51555ed586268c1e5e72a03bc03fa62899d06dfa0a4df8228506308639c69e6b737f66a21e4c993d0162cadd7013e5b59604309c415e45b806d3b87fe704ea6ddec111e4386ed53fd061f6d3be29e4e91b6d8b1c89e4917b10278b12a1956f91366aa43cd87b55e7b44767210ef9a246581da3e3d869dd91a3bd63592c8fd66b6fa8fdfdf6cea7988aad409f3f741ea4e0f0d71fa1e577f4f632ae9122fc82f42a190a0ce5d0753ca1253398d27fb9498af05ad99abb1d897fc897a9481dd1bb9d88b8dea00b1db06a4e78debe0708af28d399b4ee3862141864d902c1f31ea57e6aaa6cb948bfbb8e64f03dfcbd9cd7a6c81b99c1779082e1dce0bccf62ae478e3223767ed37bd0ab86bd80506a2dc87b025a289fc45487cca1cf43a1f043946f14e48a2d040f6d28a0d0108249a4da79a6241effc24d553fb50e11ea64306b445d8b2f00a3951f555815e9c58c3191b5003c07f6d661e0a8d195cd9b51fa9ebb8717ea794639066dea895b7d049184e0c97f2d68e2bd665ae9bbca416667f1bb7edbc37cec8d62f742efffcc23d02e49cba036af80cd4bf00b0b785eef1501b6607dc596c6bd824bd20004fc50ec139e2b780d67c1525a15c0a1b8cf0cc0f84e2a0f513a8261d58de1ce7a59587e6d7427a9ca5176e7b9df7eab9d1d349b20d3c68745bac4af61f0898bdbe1b262451a8a22aba0861ff9fa89706388ed95cf3267507d5d22548a7f812e97b8657933bbf0986816e8638cf579a751a5bee459ed07705df619124a818d12285fa4c23e4302940c22f225fa081587a9b1e6f22a1d5ca7bc94b4a4217b6def147afc1c9dcfae7d6c20affec7d1dfa88e48544b9a93a28d9b664fd405f09166ecddb4a9ed6358b5546c6915496fb359e6b7710facd171011f0d4f075c120b4370954ca79c8893509b5a4c369cf3adb84243bc3e77181ab6b99232252ed3d80bf9d48189d2d87aa530751819fd9a991b638a7247935a6aed6ad02f440750f0fdd9078d7528570cf4524777359b58a282a167fb1f4e5e06a8206710f7c8bf5679aaf079f2bdaab866f7ac584068cf5fafecfc195cd83e75c22aea0c0277acc058fa0163c070447dc00b6c0c4e92dd9ae9ca05a3f6abe5e38ad2392a2ad29b4d9fb0cb8000fda0e360281ff049c2121f905a53f041fbaa7c4a108ec4394342192ef94143bfaef3612a6e14b5ebecb4a1cd329e61ae52ce4572e22e2398c3e20d982f7843192f0b7153f2dc5a601f19e49067a9970617dc0c2af89630ace4ddd7594d4d5a4404fc8916de850ceb8cbdf02c586a4118a8436ab3f4f28d820c5dcf1e2b56729df16b97378094c64b0eb4add5a78c52bbf9bb5f18cec41d1ba0e46f460ce1aa4ea19c170f50d7e04c9d8d3a42a68cc2d68336f8f748b65334c19b1a675eeb8a6601ee892311fa284b5bde527d357cd7de803d2ceecef9e711a684877845e0008c8d7eaf1a2666ce0d90c5ec8457a5d738b1b8520f30a695d90db27e2c926b425a88b0b95d744664a53de61d9604f632444144d8f2a020a930990ba7d6b311384ebd76a185b40aec5ff508ac71b92cf04e3a838462ac94b780af2390cb764fa1e0fce5b2578381dbfb395f75a707407daca90e53efbd17dd4a17989c016683c6bcb044ef352dee40cd2e9b1809aa220d738efc5ee661ca9278cc5b46e5af75a183c6581aa91142f51b3f29ac0ddacc26383a3863499dce3896ed916a397cad15833b7437572afdc395822c2f40ecbb9e537569d5e2ef8f6f2be1f12de4647a4fca6aad9efa274d41fcd5013e261baa894187605edc4ab0ab4f94c29bd400880febe16ddcc894d4ef24504d071d9d32a0c1db2406cb5b8bcc01d38a78fabbac33828261ad1617ac0687c207abfed0a4e1df7e7a990436cff4fa4a2aac5ba02cbbcd59730411c26487165400542a243d93874ba523ac73eb31e095881227cf0ef96a49a5f982d5c1bd0b620821ca5c63b2276211c5b7aed9794d782d1964bf8660c3041336a59db980e037217bc754bc80cdd85478447c2c9f5885899359cfae943e5d3f997ac493326a41425402429fc3e3c2f37f9cec239e9b0f69d4729d1682eccf877482929d3efcb1259fec794786d53bedb6de5e73de5a770dccaa7851391721600380d9ec08c5197e0ccc109740f4c530a21d9b43192476952a9b794a907f645c207b14edeb70b884f343e97de23d31fb9e929d18bd1d01908c88445025a5639c16294c03d540f57fe683d77ac69d83017f74730e16acc37050b8f80485e396fcea137af32634f0df4f13619aa3e71e011231d04a86c251fcd6e73c9f8e65d49af071bfaa62e7bb1523304dd564ea1adef09e4aaeb78fa429d9d7e7365bf1b5c5b66dc8e72394b26a7658f128cc0822391bd5295ca532b2e0c5fa632730d9c7667c1811d5b506264d145fbcc7b2b654b67d6549cbf2d3a66d8c80166b9315bbf717e04aa3d948a27617dd99f8eb4edec9a72e3d649597ecd42de41d05101a2221c3e3b575573a953ad566b3d57aeeed7c94dd7cfa87a2cf4f3475ea0ed410defa004183fc7dbc9c3147c6e405dcaf800e166d4f052b87b7dd3d8df2a0ea73b4ba1e544549bb291761fbeb1640cc3480aaec86d9d55b789b353f01338b17301bc4af5ebb4f195fc2589e4149b6fa90d7fc9bc06b05205f93759f8878f4c630d0a309078db643bce380be8a0eb2190b7b1209cd84c68028ca8ed30c7f3077d2cdd50ffe5fc28637f3d7d2a6f44d347abd40924ebe0b449cfa31fd3fcfff1eb12da37ab513b21c5db04194d1eb0d362caf3102f62cd005283272cd5c00cb2cb4454cda292e1fe0bd3819fcc8b9cd5d5d53026f0b192b57df11f8e108c214ae10a924f0ef6da0d75fbd70e12aa9ea1cbe12dc4a70c0e4135821ae4d97d1bf585affa6677914ef1ea4abf3053aba57fa8a26480cd2f491f8345649d8b9a29875bb65fd46fac052d763364465fae3ea128502a196a6a1cede2d61d3bf392fcca48c42ac02d7590b27d23f363464dfad440625de476ab408831b1d83d18ca18cb3b21a34f9824f39bc439e5741bddcc2c8b63ec7a855c7b323b554648582b841028db3ff4050d97867dd703c379ab730936cfe3c6eda5d016d79fb41ce4f70f93da4b59de4992ea3727ec87eac4d9844f5110d4fe63a7db7cfd336ac39fb9a88768308d42b863809d29debe5afb8ed7c200971facfcf2c3bc4fb11d26b6f0e3b5126fe7f5ad4b5bc3b6e1f9cca7824f42115f1a7abd7b5d5258d3f1fc15e7a4b66ad6a8c21139b2bd0135a59ae68eb76816f1e5db217d8990af25fed90638d71d27c60848598b1c07e4e81ce7aa955f146a087c3259ea700fa369bfb4d318ddd1f0fd253c3915d684ec1d1beee5b73f9580a89b9852b2392821e07adb12513f0b4299668e135dfaa67eb816dd6192dad2a7ddf1fcfbd2b0efe40fe5c98195b149224a6ea3aa0a6b54717232ec1deda6d292999979a58c7dc77184efd212a2cb96d188271c2ba9c42178d3c9445367aa5a840626a47ca78eebbc750080fba8fcb326446ba16e011c5b3bfdf1169380156e4dd19ab02299b35f450aba7b97f83b3e3c71b876865db211d5a8ac94e9bba054ce45e1ade9249c795824895d94967ac08a3b57ea5bace001f4afa5992b029aa461b73efb52090060992c7ca9ce772585d2adcd7cc7adb23a784984eb0de96ccfa6e07818968c95aecff992b665a6967bdfa82531e80778f958c191cb7e875ac51d956ffec54a59d0527738fa6cf7620691946ad42d2eadcd0fedff67956da1204d696fd47c77893a84c961495b2ac71ce71643d3f45771ed974a6213c880dda7dde10bbda6ecd326dabb50cb0c81593cb6338a3a97ec3fcf4e403692f5bd843b7d03521b95c91376b37a6faba18507e08a7724db3c547affb7c15390ba311c644fd86551be7a1dceeb433540a239a549772612e8ecbd244b56382bbdb82dcbbb9ca4e79b19b682f2375188cdf3ef5d4b65f535bce5f8d4b70e7d46c880ba4164a2e4424e37e3a31a3f9ff036ef82a808b4cff9b75649a98967857942945360c6fb62d2de2d84a7acb1dbe62b5609824f77777c301f2f5e6706a093fa39f5457b257b81cbaff7abefe972ce5833e5be3c2fd9b57cb4a6bcbf6dd72c1da4c3f3d246775de5de1b2fecd3e05a745bf88d7e86f6a3f8a9d3637bb7ceb8dc3cd928a2037a67d974c21508adb9c13acae1a04f27428e50bbc7a3239b4376ee9310a9b5546d51aa7a8eb256537b5e4a61b007fa7d5af0c21040f9f75792b91c9b525dd2f21c7476af431cfbb53fba2896894ba4ec3e40e5e9a0cb9fd407af5e45a25b401a508b8645485707c0a9d59fdd3f2fa4809c344d4abe821715de69180d3c93695338152934512f491570d89157005dc677f66c9c1457720e4f538b1bc07ba3d40ec32331eb93b84b06a3db2ed0a5f27b146ccc567b4c3d195358e8a8c3b25efd2f85fdd8a8d458d6ff0351035c671df1aa63176ee2e417f7bf4ce9cf70a0cf4dc4cc715f69a56e325848ec196595930965904ee00e03d153a1c47af27861abec82a425769efda4d856c16afe7274b6dd5fd757344537f531efe699345b44a1b392ca45920a316f8c4eec0455022dd6719d6e39c84c07070bcff72e838b681907e83c370d499cc09f51a57c991bd9a195c0d44ee1f90a3dd9804846be29ed54bd166eca7167c946e510735b1b8a4ac62d4d9b671df3e7d176c63f07afc8fdb46cf804c2afcb2a4152ac17d24dad3c916e672579c0627de26c2d03c1dee3555b9049e7bed5ebf0ebd2ed381cf3d7c973cff8b44e63928672ab2bb66285bf09a0a1c118ac4aa7052578be42ec5a6027d85f184e4dac8c6b15f39de676b85374efeb85f99363b2f13d9f399eeae114e5c46d39dd17818eaa3b01e11f4cce04fa6dc0a3274d866905e16f60303e75e10313503d83594979c0a39768c24b8b3c1bfef398245f6d9c2d62d058a67713bb6b26fbcec8c643ff42829a6b05f5b93f8615fd3c82993bc9aa91bfeb998883018237a47637ee5f4d2b97d6cc3005706588f2e81011dae4227313c2fd0d6d5cdcbc43b61ce2ab12b6150936bfd186ce22808f4ffb894f113632058c169dbf2a427be1d0321af1c1f3591332514ec03819b271b5f912c73959fd5a7095662c6eaeb2a910daad8ae47a4744ae7b333c1ebb6fa1676938307e72913b63bb4d0cacfbf86bfb0a7de4e77ad2a6da0fd3fe3d06c84cb102403a5e9374d1ed04f522135feee1bd99dea6e4f421db2e1cddad8d35531a31fa9fd426459218f679497d0a8acf06ffe08c250ae7d63676611d19129b2627ac94ff35c92c9dabe3016b45027976b7e483f737a6aaaf1f673be4d910cf201f650e178ed42224bf14eaddfcee01d36a7f2c8ec4b3749125bb076d9f7dc59ded7e2c0266ba88f4cb9decdf73723b3737c7391bae83883a9f3ce69616b9d50af2f59b90f760752613a72bf785d9b931b12ccc5824e5dd432a40275cbc08f78b75fd4910d4f5e0e17130fdc29627d1f99394c55bf4afd4538fa62adcb8af0410a6be0d5454563d9d1a364b10312b8735f447a0e99d44a3c692b345c89610453a76c2d7432dc51cdb9a9d1f28f9ab41d6ff1d62c5395dbb877a76359e19dfb7dcef5282306bffdf8704e1026e4512b2fe2767dcb933cfcf17b3c76287cee0b14ec682707b17f743ae9904d7aaf4b2fe78910e67c238ac70184c4308b8b5d3c68eac2a79aa198569d352e86cb48c8cb8614da90fe61ea4888888c4dfb802d0235fa66b60a790cb6da0c776fe19c8a4b28851dec7ab339ee0247dd747459fc4ec43697b19a7df1f0d3e30cfedbd0377886b192f3361b3c9731694e12296e89efde40ebfd8bd77a8b2f0ffc7b9d8c11a71a1f5f1df26e3f40e7002a4251b88afff2ca3a7519a1a68af4f0505fff58d7d182262404770b0f68d8573144abda4f3e0771301e5e4895f4c2054165c41e68e6c85fe71dd2d9336ca3a521720b2417a8d4e3859050aa0f81b5e717b9e6e75864b142daf35834b5155e223f214b510b7077b8cbec37bfd1d624a6e345023f17cfbca09ba556467beb77fc1695f3673ec3a5e6a3dcb4d67180c16ead3d6082f796f74b048bd228619f095d1fd2ae06d66fbca4ff29b69bb4dd83c44566f50a69b6ff5dedc0fc13f9a3357cf49a5a0296ee318a80ac1d125cea515ed7e7536fc07b3f867f86f70a4a98da7feb9daaee886a6947cf7dbd905539040a68511a2939dc5380c7792292ba664abd1ee280bcc5595ea1eaf5410ece78829050de2aa7857bf07767d0416988b13696e94200b2c786e33601930df9b0b7eea7632e452bd7eab09995b57498f68a34df626fff26a4dbc179d5b43ae2a7144d9b39577a035d150a073ec08672e1753ae39110f5e99ed2f472eaa2bf6820dbd30b59a60ff47fa168d2dee59a551204128b331be52f9c2598a23403bca9a086eb6774d66b9939666eab4ce75a3fc7fdfdbd7d63f6c37fe7995aa4432667a4f62152b5bc09b187926417dde52f35275a38b4900f64658d6678ef4947cdd7cfd3d956133365afb537b96fe372efd41c41e3afcad0b8f88c76a746ed2db6abc1c55841d755792f3049afce3a995f67cd5d29476f7b230e0b09508a22b9d92eb842e0e56704c29e322b23d925196a27324697ead0f16ff56bafa1edf928393819a01a5b00e5a24dbd1884d517250a9715ee9567abcb8af7d31eb78b9d6472ce418fd111931540815ef77416a4ae8dda051990336fdd9afa9e6edcdacb8ccc6f82390e2c7e52f71fa001f2bc7a8c428e233f95842b99d9c4094662707e80ec937554e928432bbaa3cdb680e0fbc5c8a562fcba7c3d194f2f136abebb723634ecb6a9408a3215f865e6d3a65a3d9ef9e058a769c54a354527330233df5c1b02a14c27e25cc587b8009615cd0bb7f76326e4cb171ddb5e66db28c9ba4ca7615b1d37b0410032f31603f497220b3c2337153e0e46a7970954542dd1df634f6d19967f7c32d23a204e0935858e666e703d8761703e90118fadc70719cdcc14372936e36e0918a7962444174711c62cbf97f7cfeed95a9da00081bd9779f2ca36cf4df35a8ac7f88c7cb73c332809367dcf498ca6dd375a55ac02718ce0154b2a6a4e7da0fd2db2f9dfce1ccede0519d39303d6193d882e63977de7c5a87eca6e86c737eea5e88564a311a2bb85e7bdfb3f4097f33faa4ca17b6b736e05219bd95fd85fdda532b08695b894efeca58983079641546d27b88470d3e896de51359014533868bc7092b802eeb7457d0d98c8ea4c674ce7e4c3e79b1cbdb30de3c6cf1ec729eaf966181fcca78703754d60da4065bf59c9bbcd417aa44cf081467d57eea01871b4ea9f2c4b958bf3e868a76dfbb0b67da7b0f9dd313b5924d4f014ece5e509a96b5fe6b3f6138914a09407918c0ac6e51cafa17f5bcc789fe9c5aaf013cda9e49a8ffec2c456caa69b7a3e86862252646bc428d2be43f3b6e748a3643e3bde6afbd39eeeb6deb1ca51fdaafc896fc1eef53b478c13e7c9ba3fd6f1459ab663693c9d11fa64da0f0e21645d8f5b8990ffd2b770108b219cdf64e52a8ddafa439e4d658f45809c8308f32d584085d912f649ffaa10473577943784e0d77269594a603d4ade9c85add02b7bf68c985e060b2bffa1dfee35726ce49a59f407f47c8c803de1340a20e902e6999074b3939634da6a7a525e13eea9e81152f8801c07858deba744d30b0f8746c1c013e5365e9a7ea9e1a1c78b44f9faef90eb34c7d29157585b8b46aff51bb5a4ba33d3110cbb589ec11ad612a66922b220dcb1cb768637d7f48585c37b98b07c19b5d813360f3781de476c626dbc4b80b8c7a80870617cdbc8440b386f13d634e62521c6fc0715e46753fe54f788fcb717ec4f701cf0d90784f4d273864e8658b873f343aaa087f7e97d1aa428cc11638f6fa228d1bf6b74386bb3d7484c46fc46c27c6406612efb39debfaff49fe6d6c6425f7ec7019e8a87ddae3917b0b1535844cc4a1990ce6ffb6314fbbe45f2213159b02216b0e8e3592a0a8d8353725ad59d2e4a5fc22bcac947c9cb9ee8d835cb0d422a577b810b2c4f8f8d201307516ee069a047690331c1da8d24ab214f2065be5512cb8c5d2215b0e99fa2ed7eadb068e49b2a3483e90c77ba6fdeafe8f37aca21ccdcad5a537958352eec00a6744b943a4e905b8c329e3043a479d255ee00799498e9ea28226afa6a1e31d89efc52c48db0aa34adbdd429516640000ec7e098fa624ad88a35c54c27677c99dcebba1c0b59195a8ad0488eddeaab2d30ab0e9f1bb0bf79b74e06ad82a5c86115de604fb5f853b773913c534828e4b5f028c93680d8a50892c0fde2aca9db6d08abb7b1230ce204dbe3b1cffe83c717d1494abc001bd0d78a7864c3c5112f3df451bbb9f2b0566fb9f5539144f61ae91d1b0dac0d3337f76b2a0a8302fecb53ef44e341b2d394719f9aed1bc2be6405ac76cf674036372d660e79529ffba0a60725aa3c623f03c80b1a171254d174e0dbaf602c8f88a889aba5abd8e18b39f22f72f2f8cdf044aa00c83e2ed377f72658e5f2fb2d31cfd3d69af91d9245e0af805547ab570dcfcf86c7b1014bb49b0d4caf2ab2b9447d6f970232c75352bca7d9c93db8aed89d89bf1f3382533afc25d536ef348efd79d1266270bb76d4999a10bd3e698537b5435cbf038bd6e3dd89f049c2a52c7c4e3a2eedface005e438a7c7efd3d096ab1dfd3b3034180c2b83309e9d8e46e87bcaf1e7652655191b3f7fa890e32859da9f0c9120cd7d7e00650c7190e3c7f98ab3229aad83486abc631f25aeda2e08d52fb5297523eb2bef97df562cb7705d4d9b4f40358e48110f7e28085f4fa00e5d855ad5c5a9f5cd48fde06d8b08cfdbae2da1b842e7be96ffdb153f8b87c755f60453e69ec96804fc232fbd28606e204596bb5cf7cf09d68e6f34070cd043f4064b45669c5b3c505c95b8360b95c1d63f38e5860c128defb0e0280cab3c8d234e88a2ddf687294bdc025b714970aee7dfc56c15d0449be3b2535098e0f07913eeac8aeff5b8fa80176df83fec8b7edcc2adf022b5a5cb46753207eda2efe83a3cbb26549db3f26162d55da15ecdfc2d892c987c6863d8ecc76c06aba8424b42a0d456c7b6120a681ec829751cd61a20f305fa65da14cd517ac810944452a267aad3b104e22d4f268eff0b1a147c368935f35efc75a7e2537f2d71d2fd6a3c1e87360247b7bfdbf707b71796b97587480075ef7ed4430bfd82f03be12e811c91c64dd094a6e8b32e9828fd565f8b0d317cd217aae930bc2c310f1c353141f759b82a51876ae579e1e3769a12359d069798b8fe5590939a063588762bc3d94be0e17b2d27aef2e5459ccf7d93b255649fb75aac137467de82c79566fa58d57ea4e70b5ab43055c0b15b9d2c74da2fd1271f8e60cae0b67c011accdf1944e6729d2e18445dc4a1b8f588008cc454ba28633c5e7e42632ef55d48c1bba683b8fcc2f73ea9c23a4deca4e32abf867bcfd1f5e658943084ccdfc8abdaa4500191461143f6ca1e1505b5027abb7aaa2c13515d58cf6a31f52af1f73ad28ff0ee19487a3abb0fe68b72efe95ce5365702d26269fbce0282680c89448a78c9619da6fc5db3052961597fd8f777e2f5c832575c31add5b4146b7c2a74da3c1bc44af24c4e0aa6aaa87268cc45033530bae262e51957a519affee2f20896d0d9e7a23b4485a874cf1e4803ebbcaa5f7ec8e7c8501b0f54657e8b459759bc21c7a627ed60643352c60f31fa4fee106c6e44065cb4ed9645adda05a7572dbe181cb220763943cf65c18390ecf495908221c7d781ec258a7bc9bd830e59c0c9452b61692e7c3829e97074f17d710b11143033babccbf0e15c387f8603ff0a20f2ab5ef984cc32cf0481cb8d8af9dadfaee63c2df2ad10e9382c4927b81350d878ed2e349488c1dba63706a60e9cbf78a2dcc72294ce766a0e6363450d96eee4177e5ab16fb6f7866dac26658de78a2910d010bf156c702cef9e2c20d0f0ef61dd5397b4bdf8b08393db959735d6b1d704e63a2c144dc6e7869fe4068ea57c096a4f6796eca5f4142d959821c34767d930c72525e37109ddc7dfe372171cfea060445bc51ff27d56ac9f503aa39697b2007b5b41343bb2d375381ccf420bf85b0621343067c519a32e5bf79068440170297a73b33b3760583d404917e721a61b3dfd811e8339b65342ba2158293d5c23b410794c9dc0413c675b0e07faf43ab67710aa6397822474fd53aaf5584c8ca6e1503e262f9cce65058a0c80309833ca328e5d0d3b3f0571833a8781c8869430855226b84ccd9da79a5a0fbb2d73130e5dd3c3f110e3422f9124eb4e3514eb7abc181ace5cc7e9777ca521c195c927079a645e3310e20417b4df47124765442da359c99d56b9871c89fbfb1c019b0f908137472d5d124c7268afce314dc0b14611a4bdef5c2f93ab7920ab25aefb7aee8d70e91c95555a8901bcac77236d8dea28a2597a512c4055f5fa3069dc60a0ad66d2733c8da391f72a016cb0d0d332d1571a0f3dcdc7de9839c94b0a4c51c121b1a0ac45580ca9d09b0e2be42133d01be6632f489a83766eb8db89828ef19a0ce6181de0c40ba02b74a8f2afdba06c5634858dd6afc56b00ce2c432f1ca343c758fc2d649ae5225b05b45fcdc2c0e465677c6dd5d5fc955692660051797398ca5021935516a41e41228653abfca3aa1a32758ada13a6845c803850b76088ac0a485059db7484b859c926d20c7dbd68172c5dfc4fb5da24cbdb8bbbc2cbb5e6ad31013252ce7b935136f7ac5809585b79ee88e06ad70d55391ce8bfa95050c4b74fd488157746803587f5cb2f2bec53de2dfd1898de3063e8fc768c7d7e5379287c2fee6066774c65a2716564872ff17f59ef9e33326b86aaa9365c6141e175b2317593871661bb3a239808eb2a115ea56a4b9654137b205eb78ebf302ef53867fb0c12a364b542bc591fd8900878e863b8a895f9f7a3349d0e40c23c98f7ede52beec2c63f5a87580a3244750fa50a3db9d6db2d17668a06efac17588c0b29e4f7b1482c6f6f4a759d6a19779ff41bfa87b8c844952416def0e0b7de35e33cc224a59a81e7d1e3d145e9046337a87a9868934cde6c1b414265246f3b3a3e87a7161dcc21b24f4f304edc5318b91b662690d96761a7bce3242a71c90adef02a51ba958326b38d1dcf846a483390407d8de66402a2ff7dbd1d1d8190def23d18bdc06b4783747861d4d79211f7b8184f933bfd35eeb5593e16060d4d31cbb240a64874ae6a7d0b2edc494ea8669fc71a7e0c31334408bb0377f935915ce51bbb0f0ceb8987851cfce25fe3f0eb2cb62c6b1a4c18f18c925dd11824b842b95b7cc1b1eeec4bb142b4b5a755f033eb1a7090e9bcdc37e885ead66c47cd0884487bbb7f548ef83962394d8dee804c0afbeeb06c4321ffbe74eccac894b979f7d1be55a2fdafdafe015f0e044c0669093bf52d0f92af4eb95f4b961f6f80ffe218de8833292f86ffecc3369f244746ebd4a1a59a7a7dd018807a844ec3d715b84455ccf95f06c76555b1ee86e7ef0568f5023a451fd053aedfbc66dff9bc16ca04ea43a6be526e66e66f6065d8e23af9fdbc1859882776b72846563f698d7891793c9852e6d69abdcd2d6e4aa7bb7564f443eeab8256dc5b8aa822c7823e130fadd06f839331b98b12db5788dc42fe22c37c7578846e1a94ec2661fdb56ce2e9f3078b43daf0c874da79f3f8f5e6a9540e71788dd54563ed688665f877ab48b327af2bd4b7aaddb1c2ea2ad7cbc0243235a6e6d4ff9f7cc94190f55319d80886b93eeee3b8a4f8dbcbfc83b8a9423346ae9fd49c7fed8c47a84fb37171bd690524f65ca941e95f3b3528b285a86a5e0f3bcdbd23e6929d483b0ad0a177505a382c43b42ea7bf2d91e40f01cc1f12517e0d348ea0ddccc0e4baf200c4126bd50be998d1705d80b30204763a11e6293a9cfe82334331b87d80340a9440a4821489cd20ed9e90e980f8c9628d4e7aedc6eb1505b523910e81999ee73a7813593341585d70f4b23c17d6c9ed9e1de505ebce70e2bfbc9740bd178364fbb0e404e96cbb126bc0f8c038ba6c657691550c10771acb33ee3680bc7010510ffadbb9e85749a8d3f13d07f7f573bcd91f68ef5879cf889d06e8a2081b6700c311df4fed12a4c9bf2f0455a7b21a6ad39eb6af7d38b5d416d4ca2794d23c98327dabd25198462edb28b6210eb5a5695438910c4e40702569694a2846c7a8f62401270b31a1655c852a123d782a982c6e1140d7266487706bb6cbbf6a8a0f91f1e92b944df6dfce9db92774abd28ddea21462dc38f1fd84914ca02c2c5972b2a0f0a86570d9b0f55420e9eecd14518d255cc25e993c95e964a116a41c87e15319e9d143c5c83362e4b72f130a85233f713e03271df521e731771446f708c4d9e513dc8795859cbb5df37635e8ed7058dcaca63a145920a45065c85fcfa6b57bc69d83a68e6032ff7f5c49c688beeef9122a077815ed86c83394b9714d059fc27c9bd85048aac21c5a1aa4be8ae4144b6b329ae0e172f65eb1a9690d8f8d1cfb32b69264734883e4bd313c82c4b2f427a01e73a3a0b4f96002bdc4ec3285cf790b617fb260bb083bfc224da4b7b222ab01623b03d37333baf8352eba1e04c836e1b7f8af98ffb4c3dd2fff00a59f9dbdd443e47931a803d0a8fd14c3959d39c03fa661c7770f36bc5ebdee0897547d6b6af6862605e47879e67f973532bd782a05674c452c5b64b8aed8778968a52b1618a6043d36fb7a3cc837a4117eca145faae4595675688311b196bff0ec058ca760578074088d3b6221e2911c01137c782701cefa39092ff8f4e45b76d92608879c1c9b2d38f3e12e89f666a176de2e26a2d4906a46d324ae6b0a2bc31577578052abac0c0cccbfa81de76ccc65a5b581e24cf126bdb538677bd5f041005820371764e67aa19b26ce209204c5a9e90b7215bd0b2f065c90fe42d5cc6e8aef9d5e00ddb37f0fa993fa931a44b22599d0470e5c014b7035a2f097eb396a85a067d8725c71c45baa053787002a09dbef085f7bca21422969256346d11478b12aae5ba9257a189476ad4b0067b9f96c1aab63ee84176740ae313c5965245cd8b0d8f80189701baf26fdbcf865d9f27e2f8e507595086923ecb0795d427d2a059fb14bf3d8179a21779ff6919e7151536e20111ab4a39d9d688417206942a60a2605a029d130823b12cb06efa30ae354982ea38a161117476b49291146573c731a40664437760b761ec9972ec6b25ab7d2e8b919aa50aa7e1e9e0845deeac4bc2014f5efad29bc0409f1778d35ad9b5988d1f472efbf87e6f0ad23e6a46aec3087cf0ada2fbab873e1f3934b37f417ec46e3eb3b372b2ab21318eef20ca0636e10576713450c5e4c1049c571931c754a83c10eaa67fb43ad6e5be9219f3e248c3af064d5f6a6aaf2ed34912222cab2c1995d322f7cdbfe394eecb8281a2016271bc72480173bd2042d5a5447c8950851c11c4c5752080e855d8c37b28d529c8d48e121055317d8dbbce01cdf315adbff22ade496cd7abc25caccde3c1c8bd5ca8dbc5553162d810396088dd7461868621ba0222d4684493c719b6e6016506d6220ef3ef13964f2d0c061d3bd2ab197a9ba8edc6a49fe53e82e3ac90463ab863036791db9ef979381aa8e3f367f1cd8e84f9031e5dc1196a0183c84ca4780173161abccbd7fa2a3ec1858815efd12c60f83cab3ae65be04bf641eb1abe29836d8f7b58c02e9800e24229f40ba05a5d3b1d93f84ec19d01fa109c5fe", - "me_decryption_url": "http://13.201.131.193:3000/decryptRequest", - "market_id": "19" -} \ No newline at end of file +{} \ No newline at end of file diff --git a/integration_check_data_template/ivsCustomData/check_input_payload.json b/integration_check_data_template/ivsCustomData/check_input_payload.json index 3c05fd4..9e26dfe 100644 --- a/integration_check_data_template/ivsCustomData/check_input_payload.json +++ b/integration_check_data_template/ivsCustomData/check_input_payload.json @@ -1,3 +1 @@ -{ - "secrets": "{\"requests\":[{\"signer\":\"aleo1va0hzrcsj569gz0gd0mvue7xk54vku626nsmvl86s7j490x7yupq89l82z\",\"network\":\"3u16\",\"program\":\"helper.aleo\",\"function\":\"mint_private\",\"input_ids\":[{\"type\":\"private\",\"id\":\"2119022232637469517769612248338146747626940866497985352395192790312706094600field\"},{\"type\":\"private\",\"id\":\"4880926126276258484665592398547215886446115564089911400932944041324777310813field\"}],\"inputs\":[\"aleo1va0hzrcsj569gz0gd0mvue7xk54vku626nsmvl86s7j490x7yupq89l82z\",\"5u64\"],\"signature\":\"sign1day3wzkz7ak2mqpfrk9j7aa7xg99fepm7wjntm8wqt0whp6rkypt32cqjeg2dl24pej94cs3q67pr47pr9cwvx8l0gy5s27sks2dwqty2qu0tlnxr7ela83s343w068heyc2cn2wl9x25v8w4k2sw3epqrcu849m2fpwl3h3ha7937jn03jggereel46r70frhttx8a055gq6w36y9f\",\"sk_tag\":\"7864463876068565184851806140958199371028060526101288629538544050754304575293field\",\"tvk\":\"5737405572331238816265796954514691577620628972228851493620850866643807180948field\",\"tcm\":\"1232725861640111515409587915013863143461230830102695540609496146135143898378field\"},{\"signer\":\"aleo1va0hzrcsj569gz0gd0mvue7xk54vku626nsmvl86s7j490x7yupq89l82z\",\"network\":\"3u16\",\"program\":\"helper.aleo\",\"function\":\"verify_balance\",\"input_ids\":[{\"type\":\"public\",\"id\":\"6331174351210455039038567628669183647380498611086023741152406457895134775277field\"}],\"inputs\":[\"aleo1va0hzrcsj569gz0gd0mvue7xk54vku626nsmvl86s7j490x7yupq89l82z\"],\"signature\":\"sign18thz22uf30ffey22zlc9625lqa95nz5e2ymqhnu6mjjrpx0neypwfx6wafnenmypyj7maam2hkwdwq9tzt0aknhpd4jlt5jr9za4kqry2qu0tlnxr7ela83s343w068heyc2cn2wl9x25v8w4k2sw3epqrcu849m2fpwl3h3ha7937jn03jggereel46r70frhttx8a055gq6dpshk9\",\"sk_tag\":\"7864463876068565184851806140958199371028060526101288629538544050754304575293field\",\"tvk\":\"139069695717442364411157918708992098920714432693075886992812334768602376186field\",\"tcm\":\"619166013881537707299155495914654062255956138204475727657855439558826252354field\"},{\"signer\":\"aleo1va0hzrcsj569gz0gd0mvue7xk54vku626nsmvl86s7j490x7yupq89l82z\",\"network\":\"3u16\",\"program\":\"helper.aleo\",\"function\":\"transfer_relayer_private\",\"input_ids\":[{\"type\":\"private\",\"id\":\"2958096692154117626107666915647513789818336608911680275975415448303949208711field\"},{\"type\":\"record\",\"commitment\":\"5335346064932106289235860037336990934827544015627478527548416121107335388847field\",\"gamma\":\"7964514869270162278026239608775105009251967765557830808856694054804297604974group\",\"serial_number\":\"754284848336441949799074449531225175557548013204739038474416376781539818320field\",\"tag\":\"1718609672787758795403718083327746749683937239879659005152187610737490688210field\"}],\"inputs\":[\"1u64\",\"{\\n owner: aleo1va0hzrcsj569gz0gd0mvue7xk54vku626nsmvl86s7j490x7yupq89l82z.private,\\n amount: 5u64.private,\\n _nonce: 6369389907387330283333164611228209204080572155357718098600735198684806530582group.public\\n}\"],\"signature\":\"sign1rj7tz4z5em8yvspslvck7ddd05urr800p3dpefun5fusgw6pqvpfe0hx2fvn48jz76cd7hxtcvjsc83r4cge8z7h8uq3g6yxzs8xupry2qu0tlnxr7ela83s343w068heyc2cn2wl9x25v8w4k2sw3epqrcu849m2fpwl3h3ha7937jn03jggereel46r70frhttx8a055gq6x06f5h\",\"sk_tag\":\"7864463876068565184851806140958199371028060526101288629538544050754304575293field\",\"tvk\":\"2096661658441052166764768053172912092887144401988116925183125851032449353822field\",\"tcm\":\"4722488883717030051174380715803112050527299919947286407435800322899378553657field\"},{\"signer\":\"aleo1va0hzrcsj569gz0gd0mvue7xk54vku626nsmvl86s7j490x7yupq89l82z\",\"network\":\"3u16\",\"program\":\"fees.aleo\",\"function\":\"fees\",\"input_ids\":[{\"type\":\"public\",\"id\":\"7522883969428764010755996984057627394529347480992729194468180399112220535344field\"}],\"inputs\":[\"1u64\"],\"signature\":\"sign1qkg6n5pfl02jprk5swc4pp3zu6l2879dflmlwr85f4gzp40y5cq4ycqfxqzh3uvryhqrnmfwwvlf7e8jtu5f8s4g5cp89t5rdf8v7qny2qu0tlnxr7ela83s343w068heyc2cn2wl9x25v8w4k2sw3epqrcu849m2fpwl3h3ha7937jn03jggereel46r70frhttx8a055gq62km7es\",\"sk_tag\":\"7864463876068565184851806140958199371028060526101288629538544050754304575293field\",\"tvk\":\"3210770313524943329861664622910496748058275696424058644314954216812186031168field\",\"tcm\":\"478993136303904733120572119050713946527134441825480037135346130990269773743field\"},{\"signer\":\"aleo1va0hzrcsj569gz0gd0mvue7xk54vku626nsmvl86s7j490x7yupq89l82z\",\"network\":\"3u16\",\"program\":\"multi_txn_t1.aleo\",\"function\":\"transfer_private\",\"input_ids\":[{\"type\":\"private\",\"id\":\"1466274837066332294463021248440642967279101054942487982764442375255523045699field\"},{\"type\":\"private\",\"id\":\"5404161138127331419732996945202414982286371156569849630471024524076509398724field\"},{\"type\":\"public\",\"id\":\"4702055359438902755311415659532134304690638130410856769780317718553162923845field\"}],\"inputs\":[\"aleo1rn636g94mx3qqhf7m79nsne3llv4dqs25707yhwcrk92p0kwrc9qe392wg\",\"3u64\",\"2u64\"],\"signature\":\"sign1zzcpgsm4cny9zxuzc8ltslu3t95fypu6hmgn8nr0qq7lalx0pqpr0meupnm0hu443ag95t6a57vw24dyd32576sex85qljfv98pqcqty2qu0tlnxr7ela83s343w068heyc2cn2wl9x25v8w4k2sw3epqrcu849m2fpwl3h3ha7937jn03jggereel46r70frhttx8a055gq67ftyd5\",\"sk_tag\":\"7864463876068565184851806140958199371028060526101288629538544050754304575293field\",\"tvk\":\"2649894414026030654342952585295673218980225387948831370784196015285437795983field\",\"tcm\":\"4184102195091691820816690149046866705880779840572425682225820515050621308820field\"}],\"transitions\":[{\"id\":\"au1rzek55vtu2sv53ezfsp6gm5n7gndfjpupwy0r42tp7eq0ksmhcrsufus4t\",\"program\":\"helper.aleo\",\"function\":\"mint_private\",\"inputs\":[{\"type\":\"private\",\"id\":\"2119022232637469517769612248338146747626940866497985352395192790312706094600field\",\"value\":\"ciphertext1qgqrwgwjhr3hx9pfnauyk7zv23ks6yza64wakm4qlhrrqctcvnx7qy99wlk4vpn9pnxlnqsxe9525stapd9cggd9lq2ws9jtva7w76vyzgekxcch\"},{\"type\":\"private\",\"id\":\"4880926126276258484665592398547215886446115564089911400932944041324777310813field\",\"value\":\"ciphertext1qyqx20cjeljt5ffr652luycx5pg904vcj0rmjdkwc8jr72w5ffxxuygynnng3\"}],\"outputs\":[{\"type\":\"record\",\"id\":\"5335346064932106289235860037336990934827544015627478527548416121107335388847field\",\"checksum\":\"556808889612608976846957787573135377965401971046945878757358788724137000954field\",\"value\":\"record1qyqspxrcxzjf2kp47egu8kke0z5t222ngessjtmgkmygal96pl8z7tc9qyrxzmt0w4h8ggcqqgqsq5tczu25e05p06d9kxnm8nsmtuws2vjz7hy4gqt5fqyhx9vlqwswzerd5c95q0xjf4jqltsrtxk4su0pudjwxrdxs7hpflqng6hjzs8qyhqz4q\"}],\"tpk\":\"6054198799514115770296949837167811627821559440293540481263309762527381781399group\",\"tcm\":\"1232725861640111515409587915013863143461230830102695540609496146135143898378field\"},{\"id\":\"au1t7wdvg7qssgs5f9sm82sgkydy7uw6l93lgr9sd93y4fnhrypvsrqzfv8ze\",\"program\":\"helper.aleo\",\"function\":\"verify_balance\",\"inputs\":[{\"type\":\"public\",\"id\":\"6331174351210455039038567628669183647380498611086023741152406457895134775277field\",\"value\":\"aleo1va0hzrcsj569gz0gd0mvue7xk54vku626nsmvl86s7j490x7yupq89l82z\"}],\"outputs\":[{\"type\":\"future\",\"id\":\"1566875161342285462137705070931295925683351168652789564040704977289017589626field\",\"value\":\"{\\n program_id: helper.aleo,\\n function_name: verify_balance,\\n arguments: [\\n aleo1va0hzrcsj569gz0gd0mvue7xk54vku626nsmvl86s7j490x7yupq89l82z\\n ]\\n}\"}],\"tpk\":\"4056968789007407609694460226483745467145815102218868908387448471210504851845group\",\"tcm\":\"619166013881537707299155495914654062255956138204475727657855439558826252354field\"},{\"id\":\"au12ygm2f8qeqd0xnjzm2a7kgvtx4z88sm7jvqyg8twmpa97j0zuqzsplc7mw\",\"program\":\"helper.aleo\",\"function\":\"transfer_relayer_private\",\"inputs\":[{\"type\":\"private\",\"id\":\"2958096692154117626107666915647513789818336608911680275975415448303949208711field\",\"value\":\"ciphertext1qyqw8ewftprs692a32ftkf00yfsyhjzew8psf6a0tpmah7rtlqxfxzsgn3han\"},{\"type\":\"record\",\"id\":\"754284848336441949799074449531225175557548013204739038474416376781539818320field\",\"tag\":\"1718609672787758795403718083327746749683937239879659005152187610737490688210field\"}],\"outputs\":[{\"type\":\"record\",\"id\":\"6029927754202837890269223875279246503886568107240541753810624530931073247325field\",\"checksum\":\"7853402538772391831161045751869164101041884502068458061845207973234618652679field\",\"value\":\"record1qyqsp0apate08r0le7xnypsd886p6y2jdwnrdzsrdc590zumllmv85syqyrxzmt0w4h8ggcqqgqsqacg2pvq0l4fpxeh0emc5kjt7ey4kp7dx6cyhsk7t97xxlkfj3qfcphvt2ksj79fq8e8hwxcl9x7n7xh5etspcjlzzjh0qu3p4s7rgxs60trvs\"},{\"type\":\"record\",\"id\":\"5245699967874660246131795063524038561728918391598974305971468848452772658365field\",\"checksum\":\"1869329987179765294357094836395673054369192962919216352507756279385378838998field\",\"value\":\"record1qyqspcvs4n3294wjxy7g3klsu5rl29j3tq95dfv697zpwwnmz9al0kgzqyrxzmt0w4h8ggcqqgqspdrv2pr2mul0q9yn0pf40npunzmdac44auqy6pu7trk48gn9xqq9wu6csh5x3275nr7xsjdwej3wa2tgshlsv5ukjw779gw4u2vkdgzspustvt\"}],\"tpk\":\"7667474773412625555170591547984022368634886409251768858598791746111632591976group\",\"tcm\":\"4722488883717030051174380715803112050527299919947286407435800322899378553657field\"},{\"id\":\"au1mchy3mltwrpvarf992ynyjaylqwf2zx44he6xeyhcxqw2wcxcggsk2xzu3\",\"program\":\"fees.aleo\",\"function\":\"fees\",\"inputs\":[{\"type\":\"public\",\"id\":\"7522883969428764010755996984057627394529347480992729194468180399112220535344field\",\"value\":\"1u64\"}],\"outputs\":[{\"type\":\"future\",\"id\":\"6727984849281114709575622621628247171834412683580058728910461049814662358137field\",\"value\":\"{\\n program_id: fees.aleo,\\n function_name: fees,\\n arguments: [\\n aleo1y2ke48sqyas0u7vp4spspnxusdq7ns0xnvvrf4juuvrdskk64szswahj5r,\\n 1u64\\n ]\\n}\"}],\"tpk\":\"3728877933311344319406899438797759591876952139137018280177989840869567654334group\",\"tcm\":\"478993136303904733120572119050713946527134441825480037135346130990269773743field\"},{\"id\":\"au1wfytlpddkf8c935v2rdzjqsd80ulgdkcl623pfwe2e2xftay0ggsnegyxh\",\"program\":\"multi_txn_t1.aleo\",\"function\":\"transfer_private\",\"inputs\":[{\"type\":\"private\",\"id\":\"1466274837066332294463021248440642967279101054942487982764442375255523045699field\",\"value\":\"ciphertext1qgqt94g5tclepdfrnnm758nv96nea2h7gt2kyzsjev23j6cwdf50gzsp29addr68wlwd7yd8eaz5m3hunwtlq3jtc68xe8d5akcear3vzgn4fc7z\"},{\"type\":\"private\",\"id\":\"5404161138127331419732996945202414982286371156569849630471024524076509398724field\",\"value\":\"ciphertext1qyqd2lwx4xeun8da5wt9yml7pxg8hvtphffjlxccrkd7eep3gnac6ygw2ctyg\"},{\"type\":\"public\",\"id\":\"4702055359438902755311415659532134304690638130410856769780317718553162923845field\",\"value\":\"2u64\"}],\"outputs\":[{\"type\":\"record\",\"id\":\"4766215325324729944262816911923802134306113366483082736466670957732505766115field\",\"checksum\":\"3263071123105519685923111125637439330752402308997520717538098743640202651650field\",\"value\":\"record1qyqspzstak4mqkhpmjnfwa8x9cetl8wetyvawu9kuuuchsje2m6w88gqqyrxzmt0w4h8ggcqqgqsqmclumq5hvzlycsl5xv8tah4judvr439pcpzu2huvsm6ta8wlsgtkferat5y4jtps3q9z2r02x5u2ewepx4qvydxwm4uyzdvhvlzxv8srwek6p\"},{\"type\":\"record\",\"id\":\"7133371181030102755701203181534845287488729764971733969582529573027050285614field\",\"checksum\":\"3370765274362748458476621033502706267207549879483024250265308325339900278612field\",\"value\":\"record1qyqsph6p3zam6zpuhg4nur3zj4gm5jqt6880z0pc93qm4tuq2lukysgwqyrxzmt0w4h8ggcqqgqsq3yy0wrl3hc52lg93nzjg2gw5s7ve4f4np8mz3x2e5ddtg5x6qg9a447z9rd794f8wxjj4wq57yqju92uthv8qmf45ez4k8vas2kpgrs2x0hee\"},{\"type\":\"future\",\"id\":\"8195709144445687573599233441589157814673966964400126465279115830264197301697field\",\"value\":\"{\\n program_id: multi_txn_t1.aleo,\\n function_name: transfer_private,\\n arguments: [\\n {\\n program_id: helper.aleo,\\n function_name: verify_balance,\\n arguments: [\\n aleo1va0hzrcsj569gz0gd0mvue7xk54vku626nsmvl86s7j490x7yupq89l82z\\n ]\\n },\\n {\\n program_id: fees.aleo,\\n function_name: fees,\\n arguments: [\\n aleo1y2ke48sqyas0u7vp4spspnxusdq7ns0xnvvrf4juuvrdskk64szswahj5r,\\n 1u64\\n ]\\n }\\n \\n ]\\n}\"}],\"tpk\":\"1996834967290224516278861808508543192098955880988727674199793285415627963129group\",\"tcm\":\"4184102195091691820816690149046866705880779840572425682225820515050621308820field\"}]}" - } \ No newline at end of file +{} \ No newline at end of file diff --git a/integration_check_data_template/ivsCustomData/generate_verify_inputs_and_secrets_request_payload.json b/integration_check_data_template/ivsCustomData/check_invalid_input_payload.json similarity index 100% rename from integration_check_data_template/ivsCustomData/generate_verify_inputs_and_secrets_request_payload.json rename to integration_check_data_template/ivsCustomData/check_invalid_input_payload.json diff --git a/integration_check_data_template/ivsCustomData/get_attestation_for_invalid_inputs_payload.json b/integration_check_data_template/ivsCustomData/get_attestation_for_invalid_inputs_payload.json deleted file mode 100644 index 4842ffa..0000000 --- a/integration_check_data_template/ivsCustomData/get_attestation_for_invalid_inputs_payload.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "ask": { - "market_id": "0x1", - "reward": "0x1", - "expiry": "0x1", - "time_taken_for_proof_generation": "0x1", - "deadline": "0x1", - "refund_address": "0x0000dead0000dead0000dead0000dead0000dead", - "prover_data": "0x01020304" - }, - "encrypted_secret": "6778dc919562c99819e6235b4b4b3039b686479e4fc1236cbdaa84ca8c299c70ef94cbfc15899e9cf407514b929e89d05f7776d3dbaba796f0519a43e65cc1010919a8253aae22e88817b659beabcd7a5fe11d831a3dffda50f2275def4433ec160f1348b6c5c8ad38d0bf782348f46ba98c2fcbd766281232ee5598d51c977c5528674dc79b765d2d339e84605f4d55f8ffedc8a88640c85cae500ed7739135720ee6941e66fb07635b9dac366b234295a282b39aa0e893eb5c4fd907a67c9d5a8dd456d129611f09c3d9dbfea75c23ac1cd4133073ab00054d348c06fc0a8d98ee51e79c2e349e8ff5b688af4d27c83269ebe27d5d8ee42477c3c804e53855ada77cf49a0482406f51eb2f0badcfba4bbfce2d20928e565b492f4b49eaca1f033ebe674951038b62412fe7b826955613a6b5df70a6b47e64983325ea63ea5ff4202fcedc01f04f0e8707c5f33c01fa5c957a6e3ce707062a029d419622c0d9238d39d7c4bfe02d6af66ba683b0722b40e8c0a57e635fde85703771425fffe59c9360681a589bf04a544943426775d59f64a5458ac94840e54d534b4242bb16ad02db31a728160e1a5265a3dcdc9f4431e6d40147bb21fa3673aef82999a1460ca9806810942edb7bc553a0b2b4130460bc70842b339ca1291baa0ee353c6bf965c17dc1f9a5437f5bf73b9c565f6e820ca3f873aee1f37a966786b57ca18caf06b244577ca78838f688f52c577d082f95088de3be8642f8b662b0f8ba9d53571390b1b983e9efb98af135627881f220002b09b0e6da74ebe12a05d7b9f1c10c05f9920f38087c946d37ffdded56f16065538ea8b03457a5de368d9febedf863349aca74cfcc50b52ccbbd2b993950e2e0130b32eb414e823b8be4eae45621b5fedfdbb19c02c54e2d7f1d8813892b84cc1241ded9e8edbd4dc34da150533036b21fc994ceb83836135bab1e3dd02803a2d6eec0db6b2f03616c40f3747844a5cb98562abd22f50ffc99c2aff6db3d9e6d533092c0e8a1a92b0c957670e6f0e704f87ab8a4dcdf5f027461fa1cd51da1b9f4fadb5e98401f19049703e9c5b137bf74e7c32c0ba74a627b8c1ee006eab49cf2db9e020bd955bfb0284eb587e9efa423d36d4d70a1d03b1c1d0477d0e93d8e03c742e3263ffd7227f2834cad17ecb91bf2300576e31784e7a480d623e99d17f96cbbf6b5c089c3d7a68a7221a13dc4da115140ff6ed2930e7835f03be6b5a292e6c63a1042b4466b7f9c1059eb66b52379499f7da7f840d8c2468e9aae3a770435d0a203e5dba91359bbb543ab3354e35b2e571c78bebcaba7b5eadcc34e3f39540591e72dd97583f6f734e761dd21366497c0039166b6e8cbbab3a34228633f60e494156e5bb16bba9953808c3a4daceb6d82dbc4533190fde42b7b4e1dd191410ad14cf004e31dfacac4fb1d8ce85941e85e36a621acb2f207d1f95a6caeda32cb8a34700e186a530d1028bb0022864d727b8a3bdbb539679f08b892bbcad1e63336af9de770dacb8b456c5c4fd2457838f88688cb55a7fd639948236ec5bed84761b855380c7cda3e74f4912edc7b616a8a1e79b73bf2ae0675e5bf3f43296ce4ee641cec9b08d110b0602c02939156217fb0d2e55b896f0d24f15c06d6871f9db4d839dca5be0ed1054bca1847f59e7a30dede9986abbfc6bd84eb5c0391f7101a4b029a4f1acf363b770bbed50ec616d38f1ab3723a649dafdde1d3b6bfe7652546d9afcd78c26684452b086a4430f7f772cbd9ad56ebc6c7eaf1ad045f2bbda3ead2be8d424c6c83c69b210bb6026f498c04946a05b78b21ae81e9d76d6f39e39422638a678fb4c7405cd86e0e557688d8ad6d614c7f160f617063d7f61f6ec2f19a26fa2f5cd6e1dc6c6788356b03ebf0539c5a8e4ddd155a1067c29b50057b8b1ef32fdec9d7e1a2914b53a80ba1a60097969e77355a4c35911a1999c0ffa2ad2c7e612fbf254606a1708ef00c55f3535fd4bb6686d9893794d2168ef5b33c0ed26a4d79ef5120f144cf3f7d9661b03373a95df39ee4fa8ae42a96d9b4c20855721ef35b94022673e4645b56b3cfa732461b681e969ccc1c437d35175bfbb412f23fe9f466a9733dc424d5a0502e8538d5899679f0896f4c5b1477f9e6519d53d91fde1f39ee18e61371bb454b7734e49da06a7d822655491effed68b0ab7fad07a295a4e4b1516a99c876f66edafc7d2e78bff072f6d92f36f2813b0d275c9fa6e964bed640720b2c60f58878ae768f6859dd1b67dff8bee5df8de8c1f3763bea09be7c01f717f260a6d25e38b222d025736547fe06240908d17f38209e9111da55af87e5dace6b19fa4aa640cf5a62639cedee93360ff578e23c31d1b5dd12fa43ad414bf3f0822f55fe347118cb5f6c26f47f7e873c0337c65aa553bf936fd60f527362c251374b36e1ba919c98894b2dc4fb7b26042f84efc0bb191da684f5ff018c05fade183b345861b23ab0126a2e23a00748a624ac07417178e96f9640bd09cc8f22ee987753d745d0613ee29413633db33759844ce4bd3fa4e487633e4da000cb7e5c0bf92355e4ef272605a625ee7ac74112acf14e472dda92ba72ec7be2d8a05539fd170378865333d350e04955b258709b0efa5e027733f566322de053c648628082376580f8c04a05930759a2472432fb39c3699b376fa741068aed85849c280915c9031e4f53946fb29d9b6e837b431ee2e4858afe3bcdf019a8712325efd044ab6abbf29d4a2e4c4f9549f03b4078f778da9c541fc08f5330f2abcdba4c9c4646abf38bbbcaf1e4cb49a08048835844b5405a3209c2ca692eb946aff4ec845fb61db19221e5cd4e578dc4ef91136b5f32cf4696af6069ae90d5fe6e24aa6cc591482026dfb94fe3b06e008ec02e6ffbeed54160a1bfe34577b2b62d91aa53a4890536fb3a076587d61666396f002ecbccd6afe54f01a46cb9f7e4ce76b6572ee23dcb2507963e554c890251cdd59524d189a32ece25795fee19912a29643d8a54854e62c6685d1867e09e2bc2323c33d19b509f758b018aee0cc4b2bfd799a472c4547c191b25bd5700695c3863503aeb7930333b254c1023b612d61a3ba6bc608679128ce2c4ee52e6f8b0e7d170222530cc23a938a3420868d99c25075ff3f23ff428c285b101bf643a4a8178404a4ccdfb56c053cbb915951b4838c25757115f0ed828f0d48edc048142637974ff2908032c448e0c4c861e5b336c5e2fe514740267cf33d65628a8f55022ad6e0327250f2d1a2e7b627c54670e859e90a31c39a6326ec981b08e8caa5cde06eb047419fb802cd930954f283b9896ed06466da39fef87b23c3c4a1dff52411d1af029c3879a9c53cb2975ee8a42cc42788ab2b6e3f76658ab43cff2cd4811ca86e6e54c8e0cdd76904fe407f8fbbc052bd6074c6626f3684db47a171e262e402b65efac00bb3f54d5928bc7cbddcddaef7d4a96d1882fab892730a16a971bccd4eac449f28bae5abc4a2d827906a2d34d380d0ebc7583ffe7dc9163f69a709bd68f455237114a78102fc6afc86ecc9f49ce8be546c1fcdad33e768f93448f23436b3445679487893b94b01c64533151df14c3547e77bf2f6da58350e3c95a2c1e22299f96da2b8c487c9a91d0694198ed6542e613ec787c6ba99a0277ce1182a492205797ea08abe69d9dbfc6e8055a22247fd0e55dba5dbac0432df2c43160386d4565b13a5cfe60e9c4b7a6558da87b4fd4594ffe68ee25664f682cee2e98991c709744709915aa01ecf26aeaa00a12f49a7b5d415521081b3d356b84d0433e1fd80f834cc4c2ab25265bef6e7e26aaa1d704b36d92ac499edd217aee8f2ca461f71cabaaa76c7f9a76a01eaf7e48189ec5de995e30ebd92f44cef4293e1699100aa62353eb0f8038031170513255fcf5556336c1c6a7204667959bdecdf28fd2d6f2cc7d0c2deaa38909af287c21b645f622258e1716f2184558bb57843abff0c51a33cf17362ced4f551c81ee9cefc76ec39021620687817c33265e7ec2316c9870b8dc97f3cdda6858ac1d4476679ef36312005e30b08f4e785d110f4fc0139cfc905667406a01a8f86010a3b386d8ed696bda9da0efe39fce8f3a40c10271e22cee55322a6c271d63801f846e7f62eff0f9b7df2c9a1ea02be055e65148d09ba94d02127067ccdd44e9bf7b4bb0141f0ccd52fccd31f8a9f38c9491b09d59de06f6d261a41d1e59207888cd97b378fb03496013e8bd266e84fad87ab0622ad2a32faf60a3896438d30a4f3b382d119d16b2d362cd142cf10239c21c4311f7da88474e10819ecfeeef9927e8d80bba84a3a04cc6f5c28d57ce8fe222bf42f3842acd7a620f5f8bbd0aab5f7bacd4ad8e15e2348e134ba01c4419a27da5dc3af7367904c268883d363b46d551305ec371c5452cc56ff5c0463b27834dd51d51762fa12fe89caf3cf9d7bbfaf8ed709d4ad06aa6892e8bf5936521c3d0033498891d1a7a4e8dd5680c9c27a732fc016210649ca8306816cb11114827399eb6aacc6f78f3440fc10e0b854e102fc91d0f39fa00a3834dd120daa919244fa402d8286679f006b28e487d3a848ca64b1ddebd6c4f960df9d064e287f6eed64153935edd7435ad44e9ad1318ef66818be16f897f567054e1d0bf564812fe31aa05c595a5bd1b2f0a3e35781178278b3ae4a8d44cdeadd7fc4cf5b1b1026b14b2d46080f8d514e5617f6c9be391a1859d1787e807424b7717004971834c5e1d00711aafb1ea29ff8fadc9ed65b4a433b1b6ff6e9faeeee66d114ff132ca42ef3a00570908ddc429335cee1b9a686640140e4c49962190bbf2ca6c3aa39563deb9b58f76666f234b02d902375812a5fa5737541d255be2e831e23043b6a8047b2d25d2d397ba2e46987822f0d3277c7d91f592386253cec279e39b6c754da84e9c7626dfbfccf0a478feed5f1358101779a95aefbff92c49be9164dd20e77452ef9640bd3f10c3c201b875b875e81accf34ccaa56b0d6ffbb7e003e1dea3022f17cf707ea46461e3ee21e2bae03e574950ba1e611f82e7043127b1520833d3da83ff7d422c1cd541e1ea97cf718b0f0a2938430315acd32bbbc682a3ed4bfce058ab30d9012f782cc2203c02097d583a458a5d333c95e54dc5584b1e1b624f733e5f45183266d4e0ffde31e04cece11965dce8c5140f8a5c9086895fe6ec0dcd5cab4c0e31b4794eabe168964b9bc1bec1dfc3f84356300b5db81f7a12336883190c3d52622b9037c254ce98031a829f3d86f413f14e3ecd7b4257693501fe9d3371d9352bf49f8d2a247886507d622abcd6df215bb112612fcd033c0d761da39009fb1b280bff7b320b707f20effce4b59acff1b1025542566cf699273576620fa3498e7b99152f65d4a0b822fb438c955d1b4441d5959cd6519edeee55e4237c973bff42a860be20a9170a56908948050288fe2156b1526a150be44027c28539d70349fdad44dbbeab299d902d81a94cf4b081672b64f2a162dfe2a864ea5ed80b5932a53b24d540d58bbcce493c44e1b3ae80a7a4c73ffb1cb827357dd54c5b97101c36e329ba8408dff71c5769700ffeac22aed59d13ed00bce5a3b52bb53dc3e14046f929f8f96053fda38295cbbcbd80583fe9ff3576a77d6e402a698618ebfe816eb476214524d7174c2d9411db83ab94c6b33b5082bf40a4ce669a229f0742bcb4215e80a23da5e1e731fdf2239b525a7b684d32ad7affa37a7d30ee7054abffe67285e31fe34d1e2e742346f2c77ca9d0a46a4752190827a89f9205321dae4c96f51fb0a17738540f67602989147c8bb664b66794cdeceff09308ebff78da9fdf9b034d4018b52955b1f8a953e52960fb71ac8689ce9a853caad2389a3db7051185596e2afb9ad1c946fae173e9dd5fbccb6349b5dcc2dceeade98abe6f92f119298780b837e7bac9c65e225f8625dc353039ce581763745185561ea51d01775b8e80317172d46fff90b9add775105f2a2b0d8d67651c8ce6304e1892b9ec1d8307f0eea2c7db0259af2c3d1931c6dbe25222336c4f2462666cf1f58447bc3f2bb3febf451444a813ba1f0d87913b15ce749ace254163a9500b110407dde68d4444e2ee99ebeab6cdef56ed81c9bc63342c8a639a63bcf2f059d9251ed07b524262c8f95b6c129e8be22e5afb0496545c0013f949b06f218a83353b43ea7f6a26a773ec0c64039750b4e913dcf996580f2ce29b43d71de7e17b890ce5039b0fed84eb7aff6fd7d37b10d7fb0916b07032d6291c5e6d6677af76d8d5e8b41bca915215c67c5b95ac2227029a128de6cf056d9e1b8ec6bfaebbd3306b30f35be88c94443ba19808babc0279d948fc49739fd6e959863c2527a58d519a225968d702800266e5b9724c5ce107f1b4b381fae4cc6d03c9f34875ad017ac7d2e0f7bf8bc93ee3937e91a5ea0fdee2811fd1ae5e2c54ac495cf7d2dfc383a0d4658df0298b266b692fb200aae21d2c8264d7d94403cb3a41b8d1ea4f75a84655f3f99ce77086d9379c6bd19ec95105d2ef2142f1576fe6a49b3d939ab4c45bb5d84b77508ae58be7841932d3345c30e19a967033ad894d07e05998231b75fd1a07d40617505bc21505451a1c075dea55b899e29ae28975041833138d9299a77062ec3678e554636654745c201ab48d52e5b2c6d394826dad4525c45246b38ff5bca8a521a62f321410c8d8ce222d0d9b428fdd4ee675986876ede2a8f4a0572c232af9ab8575b10a71e4f9ba9b9eba3b39d070e2efe9143af9fb512cade48a677e2e3b78ccf339a72894d82ef69ddeb27d0daf7b7cc4677ef2bb8f84b5a2ae526e28a5df99479896f21c2dce82b72f52bc02e802b58f7e59ef5a2bd876f5ab78c97bb4bd7b333b5a64abc789cdb7be620273e81e376066f4039137e2b7681aaff0dacbc83fe4808c4ede1f592337edba12a4b13a08be9d262762f33dcab7e0ce592d7c8fd33e92be60fe573ff431b0d2c4b91e804148ca415e33f4f14d173ac5969fddfca097daf3c53bdf0aa8c3769c1a4be8fc69b92c9ec84423d149cc0dbcaeb9ab2c1ff75c0cde757e4dd248c4269d2cb5ff4e0cee1c84051946f5141db70f5e131390b31deb92124a9d7777617205ff880f07c83a0d79920b50a5f1a231c89d5b031e4740d0f56d47488f587bcb822ac6f5dba263c9130ceb85db740d32eedb432f6c6acc680620492c43937632856379799a6f703d54ab747306de85a59e9bd6b8f29752f52aa28a4dd49d82a2b6c6b5a18c83ec69d46260f8813dc6f4155f3feef9a787325e6f924f4fe9ecbe6eeb2429ff697f85731183472b4ab8e2ede80ad17584cb581c9802a64bdce2ea65fc0a7ae2f0776fff673ff9a266548069857eb46930670aeae7ee737650aa95668238cfab7940fe59c19b57454f3b0a9903341d0e0fedd4acc34a801d9fc5da41b53f04e4d2c8924e77b72321ffbda72251bcbb1f69236f4885381e7a04783bb80e3b9352451a349d9f7c6baa2c5d9c6e334c8ec499c54f86f9af91d2370db27f32b59ab3c1df2e27434560dd9697364a6710f3e2611902688bb5225207c258670596df0562e73a8586d9b7ef353f62b588ee90860baf03f66bc12098cad9a2072e92cf903053e19803cf2d410e4a809b58d467aeeeaa79aa45db607ab93a78ffc31309caa41796014c30248570b2cb75f8f4b6b8eb847c196f3494c2d0346b1f6dad0a3c3f922387f2779e958cddd0708160adeb0186c94b4d176e290acffd0c0acd4bfc46e28d4151f48eaddfc3a66f6af7ffe89545eb70c8b17db327bb925b20f2ed5f2b6ff12247779a6385d8d1ffc3c0680556137fa046b016869983bbc388cdb2568f871fa6330ac4a44fc8c21cff2005edc25841bf6acbeddaa4d859ca15aa229b79a8d78a8f7c60b97ee25d3c34468e7611b7c127de61d9bd9f90c09c750e633883da7ab71154d32eadae52489707433d07cafa627eadce484dfecc72b02d97ff1791237e1f3444665639634f85aced82446b4056f0d5fea1ff287c0ca56f569dd4300c6f4f41a87635a01fea753861a17e9300f2e1208f9545b0457f4684057e4750d78eb18c17b5eaf8cd080d704aa458b1f8b2f113a1da4ce00e327b504f8281425af8a8779945022b42762240e9dca2500204d84d047890e82f780f2eaf207bf25577fd665a274da8331925c64041069ee72ca95223b4a6a051fd423bb251bef6706d802929e6c93279ef78dd631889312a34dccc100a4a5223e4bbdc74f3eaea65eed2327a56b6a68c442c60365d1ca886e66d89014c5b4f7af4fe74c92aaf19105fddf406a5578e91c51bc2143e94b0bb273339f180890db6fcc477bb4ef43027303b0f99c8c861f024d2d5dad532ad8dffa9b82af244009312e969fff06e029c63dc6db67628bed5637026fc57a93523f4e23c7548ac3571f6153a1055d5acfdb83023b9aba5caaf6827593c0a96c4d00c1eb4309a8b40ea57a2dc59b1238e3a6ea90d0c0d500ccadd7ddef8e2476a9a3e3895262eb469b96a65d08aace23bce98448a11c57e3c4ac3e969e2c7493528f7b083c74c09cd4484cee4d541b943da5eb4331e9e7fb182e43ec421696a241418219f28823e878aa577db4975310c2e1bc2290b9745ee9432ae512dd4439ec475b2f96de1fb563b1632683282bd1ef2f02da3f9b2e046e31d1f378a83c7ee87eeadb8f049c77051e70e093dd68b7638259d6c00d69d4ba2459e829c4727545bb3e2e28c371e8fadee7d5f3c2ae4f12b2b752695cd9cac1f350280167e2156b04940af186459b1f4ef6d96391e96ce66a3f6e6ddcbb89575fd5102e5fcbe1ec66d832d96bae81d84816d092487475bfcb5700114df3c20629ded6e3d3db5448398fec8fe70826a9410194d9a1d743c7bef7ae2c436ce6de8e5bf6482da1131bf120fdc8ca5730d9c2981c606b0730a9d7208fe13f027a21ea64cb0058bde8517ebb1e9bad558e2fe3de72204446d614d3d57be5d41f4b67b2ecbc3aa8e44b754ce7e2f1cf713832978bd66298be0c1472c3b99bc64fd884beb517f2efe54c76b65b8985a6c862ec7c33b4c38a2ce60d8f43a20bd0842df1ed6ec223550adf09b921f5c8bbccba9a42518bd4117c7c5fe0c0ca44e150d98ceb4d9277e8738c058fa25beeecb24ca92193a522fd9c9408f8292774a62569ab9852a9f73acdf448974999a7dda93f80146a54518e4d9eadd450ea2708efd066435667db86273598f4b8994b3c147cdccd477f874f01374029296cab84583486c6b9b351924c4288bbd68b3f3e634a17646c46fa1ce03a016b7012d2818e6efd2abf5c24e6e44711dd7aabb17854cc30dc26d77097853d0e8efee562c9c1ecfcc5bb0b9736f5e1d1d8a5366da857581f6452e2e8037cdbea16cf58f74a410d51236d3f88985cbb481b3817af8774c77aab220ee4f3dcfa226b5c2476edb979327ff0c13f5dd4ddace23a87ef6c3ef50166fd732e5cb32cfae8830ef03c30c694e29fadb3b0020b02e1f58f1f0a4ef4fadcba4928f02dede28209f1913eb10b2273dd2957e062ad16779d6152627a2f4d7020ae473ba5f29494e613855e12ca87825bcb97a1b54005a966e5ccdbb0098cdf43fa444df32131715f032c970a4fca9beb6b5f67c002cb128a0cf94892c6158f221c6fd1db4de51607673e86c023071fbf071fdfd762235bfb07f62087d8b3483e1ee5a9ddaaf098bfe4ed08663d462ede251948fcf3df171f87a975de4632655307d2ea7452986677cd57ea0486e06682e1a7bafc76bc9d55eb8aaf9fd9da63c371a818442e8520ccb344a4cd540976bb26776e8ba7bbfa28a759bf61c141ad8400c0a914f9e4ada1177f54d315795146858c8491ab15e0df2d9db1fd6a5615a72b10dfc06ac3419a28d726c534401b98b6957b83a74d4f513ff1b994f7db0d2a4cd3b6629f55346bf1ffd4825bc6d2dad0917f5f47585a3cbc19fd2380512ceafaca53d98927dc492741bee4acc8e0a7aec1f60751f5777079870b4a7b5c846608ff8696b759bca4a4d9e1f424fe4714f0f8375f7c61b84b7a0e20c6469adf6b3491ef0b76f7bcea732c2298d6ad5246ca20576bcc3b8a921c9c5cb96440221884dd4e3f356f5bc0bd334ec5058cd3cc87f73471c67c340bc4aa28171a169c45b1d46bf4a8711ea8547da62767b7dcf6dec7898df5aa145dddfc3241a2a79a2e8e605da5d0a646a4c06e4bdad9a557ca528f839fec379f243a4892043c4f7bdc7a1b305fe22d0050d1c57ad720bc8a7957f33beef8c561c3ab163569baf10a569691f28f96ae46b0386f3b32da2322a366c8991a2d480d24c93744dc38bbf4112b5a351a6738e6aa4eb53b606a545277aec6c77f3c8203e013e6346d11cf2e2ca6a04a55ec394f71a8e0e88ef7c3e27e91742eeddbb9de24b8dc26ee1287ce1b78a0fbc9f57766ae2f789f8d77172c99410405293975e01ffdf2ad2b6f019b6338859a8be0762e05ab27613319a331d6bfde25bb0fc34e49ddda82f025155e2c8103a9252b2cc49581383f4388709f9ddbeaa2c3b94f6283c9bce145b808893a277fa56a543d32482ce8a81a7ae475f5441f82c20592bdf78e82b04958ea281f6569c893fb32fd2bc5de8d4152edbfb18087608646fdde8fb5b85b1fbb4714a472e1ca7f58c25f4d54312670a80d6f163676f95856e68c4addcdafcb983debf5e09112f40003d459ed93711b0ed544d95fd79f9696081fcd52480b720fb5f2bae95413f5fb53b5caee6ebc6dc6b64767def92a40c624c5cc0986e7ce15820cbdf0fb1517c94ef10d55799d9dcccdb0dc7dad14d52cbd1e0d37edc0884fcada435cedf11e10acdf49af6ee01f823d69e38f29eb2d4d3a0945c474381d463875fb79827070129da10f3142ccb04e3e67b8107bb9c34c4f362d5f8430419a481e4e843bec9cae48bfeb6ecf67d82b7d6d287d4d219db73563137920bbfa7f9fb825e8016c20a720b6e5a4860c8a282da0a9aedc85bb7fb6941add873cb324177bb731fed86caa183f44d7a3321bdbb1c91bba2942c285033b2f1f5c71566aba0aa2c8862ac2ceb140979b63410f840b34c4aba652d3e4f94f5af19cb64c215dca55ed9e8c31f2d25509eea5608ee2107afb9c42e92bc1acd42fef887a5349203c5defb0629c27800b28e2982cd05ae7108f9255a85c51ba1c384385a7acdec06ade3047b4a2319b60d59a55214f51a30532d168e1b24fc8bb7c2c984cd2016d29f2e93b3d9e96c4ece4b9312c8084efaba680b031a45b2e58c02d156ea4d73f757087d10dabf8d82df49886b1f7b735bcc28b44740dba5cb4ad31100398b9ca2c7f427e7237e44604ee29c355c79ddbefea5b01609d46f844edf251b37ca8f3037e77b3327ff1071510ac4cf7687f4de6111cd5261be592376346b242f3accff01c067cc164666afce262ab25d98e2d1299483df0941a2b1e6be5346afd66999faf14bfb43efd828f0e46ddd0e0a0f9dddbbbc44688c0338712399a99b3bfa02009ad6ebffe7b291132eae036792b442541ee28a3a8ba31e00880004d0c65bb81652df8739585d7c2a6fa213418ba10451d3fce36ea0b2bf3c5ebb8f30176fead35f8e9bda26e8e0d877fc5278502b04f55b434b3430c3ec390fcae950047791e7b1456257b37d63048c684533ebc18ef22f513905b145daac3426dfe5d00c4ee866dd8bd47b5487f8ed4ac926e30dd374faae7b08a14d80a8a3051d0bde085520859d9d42268d57490c6c0530eedb9e090f8422d825f07512c4f949734b914394b614f6e71ef9a980f8dfdca2cb91b25ec53a98437ce1117b1b72afa5bd659bf6b48e6ea3870c51967a3c200d437b520b043543a1cf7a49401c7269b6df4026ce895f3e7aa40ef463909bd9f293a593e465cbbb58e179a3d6def0561b342b2860f250a89854cb816c0e2e8b8130ea4d22c6d9df0d08f8ba4daba90677f1345f5881eaba626ca9dcb46309afe06e9862de227de6fce12e2402287a6aafe977befd22cdc041e51e46661124a51b541dc4b36b6b6fdcd599a301610ffcbf78b759a8f9bc236a47f7e793ffe700a99cbe9dc903ed4d6a48479ee7cbfea8df3decffb84a78646f8b30a3fb75df57d3333e0550a0059b12457f8da9efc53bcfa41ca1782fa7a6230acd3d7cbd1d7bd272512cd7e4b71cae6247dcf2893e79f45e7fd0baad76967693aed8f631c8a74eab1bc3114726583fd6dbd69a361f5bda024c774ee75b051c9304989d8c461fb4cb565c4ad9dbc09138aabd77463848ff357c530bb9c047a7b42369f89108d025bf63d635c09c48b383dd1161d4e2db33bfc1254dff8bff7689e5d98aed5e3dbfe0a640e55a450d07c5a2564102fb7fa5999ca5727328840ce77565de01670b6411577ae2a9d5e622e55c8646fe930f7f5e3e3dcd0067b17402e8245c08d015524cc8c308f0b75a5172800fc5184b18b2117f95fe72e4c100fa3bfff23cf549fedec93ff75b4c0899ede06723b943091ff638d9b79703663b2c0721aa244c97c162ed0083bb1c5cd84b04addef0df037ba21640f5940ba98b3b79f7c9bd3a5b0f87e19a1b793a0597f222b07b127faefb5944aa9a8b423dc0fb354c0a1c15cd5029831936b9e2f3c1ae1b8d4dd748aee30529cc3d6c02e626c153f138b5c2748afad690be6896991a694de2207cf110e300a88dd94d9426b75e59d02b4209194100a17bf03d5d4bdf4f1a58f445f09fd867f963da553c7e12cbd598f5f4fecb58bdc9c68433f877c87b3327e6f0902da1d1f8f898f4e8942a672b50646545545997cf3b5347fd463e1fc28b498d7fbf3418190ee9b2d0ad0b2feccba3cafb087d808a1ef29d14feb28d3a17c41fd4185c166ed3b4aa8a0b3bf6805916120df8d0ee65a9b2d6e257133310279abe6f2a77b47740bb39bf703177a185d6b7b8c676f19b6aa9282175175a4c84f447846f5c904aa8dde37b13d6a0f4de6117e45e9a4f8c02e55faf709266a25ee211fa75684d98cf112156c43a71cbb592d5548ac24ff385ffb404c31b439ed46a50a8675d591a2b57498ea8d7c600b1a521853026fbdcdde1491ce3dd6cb8414cff92e93056ea7b730a0dec8eee0bc57c075ae6df81888a3cbd7519ef180942dce25569ca555a732d28342c30c333ee641f61a7d9c6d76afd4ab46a0dea05d9fbdd1fba944eda5ebc663bb9066af176584c13ca7e05fdd92f66a7a32a56399880ffb4ea1536258567de1e598aa83aa410f5230ff332045a2b32c2ad65999da5859cc171b746c7d8e6551c922220f8adf9b96f52e6a2e1f7ffb2ca0de03e15a0ed193038c8415762bd219049a52602f968bfa0cea267e4231ba6d7687e60d61530831905252b95679c5cf09596655bd678418b22790937aa74aca188ca91b3e9d870dc5f87a1a72c552cf6092436bb18fab71fa65d3e6a7cd69d4929427cab81f1b9af304f2c1eac1bcf023fe3a1ce3b6c0feb44eb691173c01bbef595389e6c8d6ce25faa5c83efb16f98cdc87018441839a8a5719cf8389cc90fcc386af229149956ff0ec7fb82b435ec8311cb30ad9b187381734e9b6f15d119febecfd7f9fb77f31da92211b5e2a7545b21a25749d2107ace03357391d1908e4e5d47961757da87543c749dbe4e09e8b6731b4f75405401c838324a4b2ca0f171e5fffbcb44efa5353c586b2fedbf8c0960b41164e769ec9941cfd442e59e5093fc233fd193d40154bef59ee0a1ed939e479a1bdf960945d0bbe1d479290a04bd36bc9daff050fcdb897ed1927e24dadabfc1253b05e64ca5380a7827da3a7ae7eea7e59244a75a0536c6156a3326f6d502e2c60374b82247954013024bf104350b0e4285c66ba32bcd31e821b7f91a32bc7a178b9499de954145c71b467c2d2dbf8c18a5e359c34b5a95dae79b15da415020852fbfef45f9ee24def6e64a38f50e98d1215c8072568cd81a08e438e586b3f204340573875fed6f5d16c38407f64d26ab8226c18215c8348452be1fc0e4d61130384c054a95ca9776a49a9b96e6e13958686a2416fa17f6442a4c0186f8f31801f0eeecfde34884cdabec21a54a14b33d7f43f0d519d0b46753edc1a30d054c626902b29c171931ff400e46aecb52f7b4636a12a912ddf414d2385efccf07009e0a092938ebe1b1fa9899e97e67b3ec8d4eb0a645319d02b28a3d2d2555d706391ffe99576901cab9b6510e32500da3674e9992033ef0d3600e1d8233ad93c24da3ca193afd747a464e94e2a446a93bc4e18c57c3898627758cfe6923ca5056b1c0cd8294aa93f880c95a11cc81a60496882c3d7c5617636b0dca6a40afa267a16ce4fddd53cc6ddb8beaf7bdf6b4a3e5c7223e048a5ab652941aba07dddb89726f901bf75b64f0417ac17b49c7a44bf0e53a225337943960f7184beb31feab4200653cdb17814424f3791d3c23e24de0dd06bf6f1cf21dadfb58384f8785410d8eb4ad2571aec9c8d86d719e42702b55ac8e6a4df3331e4cb9edcc639e03bdb4cc437a0a5be65fbc10a9ca355a3e91821a939e2bbe1ae3e51f28430969329562b1fd2d2440e18e0bf0a356aeeeb9ca4ce68706209c0d7d39caf0cf1de1d5c96b794294ae48a3f25af116094de10840fd0d8787f2ff535cdeb6d9a529dee33f05e28c3eca131e208c0f80d7c8f5810d2bcd95471898e8b896b515137f2f987a3dc7ad5fb67347655456c2fc4135d87fe6f0587623eebc191fecf875a0c342c7fce6c023fcf7934c98de04f06a6d62185f5f83805030b4f897c8e00757de876e76fa5528bd734b375b3e2a16a5fcb45f1427b7d1a6b87779ca52edcc453518a42cb7a9ba55062b61133f0437b7462ee8d13b67361b5b10d708b522ba65f9ac5495cd7e0307bd71b30b5eea327c624dd7b0f33471dd90745935abbf87c94d91dde2615ee017f86ddd42457c6c850f08e450139568801315ba740aa3eb023d0e970497533663b0a690120fc0558939ee54a6a3b04bc6b17888e9179816cd4e74a210391fbe01a404effbbca61d82731345eeae215ba37014e11b0a680a479c5fa2662586f317f32390b01b2ee75d8f5a993f51017399f665c5ddd49daadef6f92702b001656b4d73ab22b18ebb6e33bda01793f7fd25acda9c0db3905d94922a80bd8c6a6776e7c191f6564433b85b9f5f33e9f1dc4630d0909837cf011592fd89a5fcb616f13893187a9b8ccef34da7d8eaa10544897bcb705fad101243eaeafb4788428e089503e5d0b0bad12273aa4d427f267c238e8cc728677c270446be4bd47fee324e26360b15f510cc0207776f734f545c03daee266d300d29f6691e532716b6de343a862944a7342b082e13270f58cecc838b1dbe26978bc103a7c7dcc30f4ae6a6b789e0b98f045cf31948b934b079a5b7c1e30bf35cc361deea15208fdb4489232e2602fd403a4c51f7212490c7394ce6fbe159c146bb81865210b283f122f5f16593d9d5819bd00833c42a968dae9873d9126f07df196b2d2b43393a37b923faf832e7543988f06e172cca251112fcbf688f67c91c039c729b56bf78bdf04127877bf6d676ef98e3b7b17881a304910e8812848da76fb32c274b60dd65ddd8f8af53d835a7075ef2c01071c7ca7834adca71292e5b757d7144ae0d93855204c0c12e51e98580429735df994303570bdf485cc8724a957bed451f97eaf4bd8a181612f39284a760b258a71062897711c98a042812e974f1993550f71a03209c8d133a0fd4368c58742c5ff1d9d8386df1c1171d89f271180091cc748bc3acb189f121f551d6e8040dbb79ae2f011fa7457e1386805afeb46ce037597226162db3e7c1af4d1d10f829541af6bd5786708f60b28d048e14ec6119f33fe8552876aab329a67239b0958cfba40d484bca15a58a943c09575bb714f40d6d6a703ce8e746bb97a9e3e15f29f944324bdce5982fab7218033fb8b92936222d240fddfabbc55dd7baedf01a3b0ff27f549f497e2ff2e46e83f945514a2f56209c0eafd3f6790eebb40041aaf25b44d265f001285ce217e99501c2d1bac88692d01c759177451481bdffa6587dee4457b960119c85af443961f71b6c13e789651a74f99065c5a087463d5576322fe9d85a681de3e7dfaf73e0f3bca76fe228aa2502a7c439985c80ce4dc514db73cccd1457399c608d89eecccebea9f3cf85879452f57d116e5111e54ac317aa28442e07858763687236160420dded0ceeb553eb7a82481e3fdc98b5ae9944978498940541c321cdaa96e8124676e08caab6ca1761566dd70556666baf69bb7bb49789adbd6c8b5daf63615e88ac21d58d8f8d883e7b69b0a46746ffabf212521f83744be23059be38b7bbaf86fea49b22ce375eb1df21e97b0649b396d24606c89ff43a84d5cf35d2e2d7d5b1997ce6976", - "acl": "045ed9c3e7bb1cf416f08c7194d67f7ef4a368665380f1e1c08835d02d180065000bd55e7dcfef9eafd67b67cee69365b1d0a737ec7baeb3e658b70a4eed27d59bc867232ea6217d43d383fd9dad2379a87d137d71a95f8daa2721256ffd9a112cb03604a3977bb63c0780f25795f4851e812e608d29237cf5f04d9023e649818a", - "ask_id": 1 -} \ No newline at end of file diff --git a/integration_check_data_template/ivsCustomData/verify_inputs_and_proof_payload.json b/integration_check_data_template/ivsCustomData/verify_inputs_and_proof_payload.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/integration_check_data_template/ivsCustomData/verify_inputs_and_proof_payload.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/integration_check_data_template/proverCustomData/generate_proof_payload.json b/integration_check_data_template/proverCustomData/generate_proof_payload.json index 80f8b4f..9e26dfe 100644 --- a/integration_check_data_template/proverCustomData/generate_proof_payload.json +++ b/integration_check_data_template/proverCustomData/generate_proof_payload.json @@ -1,11604 +1 @@ -{ - "ask": { - "market_id": "0x1", - "reward": "0x1", - "expiry": "0x1", - "time_taken_for_proof_generation": "0x1", - "deadline": "0x1", - "refund_address": "0x0000dead0000dead0000dead0000dead0000dead", - "prover_data": "0x01020304" - }, - "private_input": [ - 123, - 34, - 114, - 101, - 113, - 117, - 101, - 115, - 116, - 115, - 34, - 58, - 91, - 123, - 34, - 115, - 105, - 103, - 110, - 101, - 114, - 34, - 58, - 34, - 97, - 108, - 101, - 111, - 49, - 118, - 97, - 48, - 104, - 122, - 114, - 99, - 115, - 106, - 53, - 54, - 57, - 103, - 122, - 48, - 103, - 100, - 48, - 109, - 118, - 117, - 101, - 55, - 120, - 107, - 53, - 52, - 118, - 107, - 117, - 54, - 50, - 54, - 110, - 115, - 109, - 118, - 108, - 56, - 54, - 115, - 55, - 106, - 52, - 57, - 48, - 120, - 55, - 121, - 117, - 112, - 113, - 56, - 57, - 108, - 56, - 50, - 122, - 34, - 44, - 34, - 110, - 101, - 116, - 119, - 111, - 114, - 107, - 34, - 58, - 34, - 51, - 117, - 49, - 54, - 34, - 44, - 34, - 112, - 114, - 111, - 103, - 114, - 97, - 109, - 34, - 58, - 34, - 104, - 101, - 108, - 112, - 101, - 114, - 46, - 97, - 108, - 101, - 111, - 34, - 44, - 34, - 102, - 117, - 110, - 99, - 116, - 105, - 111, - 110, - 34, - 58, - 34, - 109, - 105, - 110, - 116, - 95, - 112, - 114, - 105, - 118, - 97, - 116, - 101, - 34, - 44, - 34, - 105, - 110, - 112, - 117, - 116, - 95, - 105, - 100, - 115, - 34, - 58, - 91, - 123, - 34, - 116, - 121, - 112, - 101, - 34, - 58, - 34, - 112, - 114, - 105, - 118, - 97, - 116, - 101, - 34, - 44, - 34, - 105, - 100, - 34, - 58, - 34, - 50, - 49, - 49, - 57, - 48, - 50, - 50, - 50, - 51, - 50, - 54, - 51, - 55, - 52, - 54, - 57, - 53, - 49, - 55, - 55, - 54, - 57, - 54, - 49, - 50, - 50, - 52, - 56, - 51, - 51, - 56, - 49, - 52, - 54, - 55, - 52, - 55, - 54, - 50, - 54, - 57, - 52, - 48, - 56, - 54, - 54, - 52, - 57, - 55, - 57, - 56, - 53, - 51, - 53, - 50, - 51, - 57, - 53, - 49, - 57, - 50, - 55, - 57, - 48, - 51, - 49, - 50, - 55, - 48, - 54, - 48, - 57, - 52, - 54, - 48, - 48, - 102, - 105, - 101, - 108, - 100, - 34, - 125, - 44, - 123, - 34, - 116, - 121, - 112, - 101, - 34, - 58, - 34, - 112, - 114, - 105, - 118, - 97, - 116, - 101, - 34, - 44, - 34, - 105, - 100, - 34, - 58, - 34, - 52, - 56, - 56, - 48, - 57, - 50, - 54, - 49, - 50, - 54, - 50, - 55, - 54, - 50, - 53, - 56, - 52, - 56, - 52, - 54, - 54, - 53, - 53, - 57, - 50, - 51, - 57, - 56, - 53, - 52, - 55, - 50, - 49, - 53, - 56, - 56, - 54, - 52, - 52, - 54, - 49, - 49, - 53, - 53, - 54, - 52, - 48, - 56, - 57, - 57, - 49, - 49, - 52, - 48, - 48, - 57, - 51, - 50, - 57, - 52, - 52, - 48, - 52, - 49, - 51, - 50, - 52, - 55, - 55, - 55, - 51, - 49, - 48, - 56, - 49, - 51, - 102, - 105, - 101, - 108, - 100, - 34, - 125, - 93, - 44, - 34, - 105, - 110, - 112, - 117, - 116, - 115, - 34, - 58, - 91, - 34, - 97, - 108, - 101, - 111, - 49, - 118, - 97, - 48, - 104, - 122, - 114, - 99, - 115, - 106, - 53, - 54, - 57, - 103, - 122, - 48, - 103, - 100, - 48, - 109, - 118, - 117, - 101, - 55, - 120, - 107, - 53, - 52, - 118, - 107, - 117, - 54, - 50, - 54, - 110, - 115, - 109, - 118, - 108, - 56, - 54, - 115, - 55, - 106, - 52, - 57, - 48, - 120, - 55, - 121, - 117, - 112, - 113, - 56, - 57, - 108, - 56, - 50, - 122, - 34, - 44, - 34, - 53, - 117, - 54, - 52, - 34, - 93, - 44, - 34, - 115, - 105, - 103, - 110, - 97, - 116, - 117, - 114, - 101, - 34, - 58, - 34, - 115, - 105, - 103, - 110, - 49, - 100, - 97, - 121, - 51, - 119, - 122, - 107, - 122, - 55, - 97, - 107, - 50, - 109, - 113, - 112, - 102, - 114, - 107, - 57, - 106, - 55, - 97, - 97, - 55, - 120, - 103, - 57, - 57, - 102, - 101, - 112, - 109, - 55, - 119, - 106, - 110, - 116, - 109, - 56, - 119, - 113, - 116, - 48, - 119, - 104, - 112, - 54, - 114, - 107, - 121, - 112, - 116, - 51, - 50, - 99, - 113, - 106, - 101, - 103, - 50, - 100, - 108, - 50, - 52, - 112, - 101, - 106, - 57, - 52, - 99, - 115, - 51, - 113, - 54, - 55, - 112, - 114, - 52, - 55, - 112, - 114, - 57, - 99, - 119, - 118, - 120, - 56, - 108, - 48, - 103, - 121, - 53, - 115, - 50, - 55, - 115, - 107, - 115, - 50, - 100, - 119, - 113, - 116, - 121, - 50, - 113, - 117, - 48, - 116, - 108, - 110, - 120, - 114, - 55, - 101, - 108, - 97, - 56, - 51, - 115, - 51, - 52, - 51, - 119, - 48, - 54, - 56, - 104, - 101, - 121, - 99, - 50, - 99, - 110, - 50, - 119, - 108, - 57, - 120, - 50, - 53, - 118, - 56, - 119, - 52, - 107, - 50, - 115, - 119, - 51, - 101, - 112, - 113, - 114, - 99, - 117, - 56, - 52, - 57, - 109, - 50, - 102, - 112, - 119, - 108, - 51, - 104, - 51, - 104, - 97, - 55, - 57, - 51, - 55, - 106, - 110, - 48, - 51, - 106, - 103, - 103, - 101, - 114, - 101, - 101, - 108, - 52, - 54, - 114, - 55, - 48, - 102, - 114, - 104, - 116, - 116, - 120, - 56, - 97, - 48, - 53, - 53, - 103, - 113, - 54, - 119, - 51, - 54, - 121, - 57, - 102, - 34, - 44, - 34, - 115, - 107, - 95, - 116, - 97, - 103, - 34, - 58, - 34, - 55, - 56, - 54, - 52, - 52, - 54, - 51, - 56, - 55, - 54, - 48, - 54, - 56, - 53, - 54, - 53, - 49, - 56, - 52, - 56, - 53, - 49, - 56, - 48, - 54, - 49, - 52, - 48, - 57, - 53, - 56, - 49, - 57, - 57, - 51, - 55, - 49, - 48, - 50, - 56, - 48, - 54, - 48, - 53, - 50, - 54, - 49, - 48, - 49, - 50, - 56, - 56, - 54, - 50, - 57, - 53, - 51, - 56, - 53, - 52, - 52, - 48, - 53, - 48, - 55, - 53, - 52, - 51, - 48, - 52, - 53, - 55, - 53, - 50, - 57, - 51, - 102, - 105, - 101, - 108, - 100, - 34, - 44, - 34, - 116, - 118, - 107, - 34, - 58, - 34, - 53, - 55, - 51, - 55, - 52, - 48, - 53, - 53, - 55, - 50, - 51, - 51, - 49, - 50, - 51, - 56, - 56, - 49, - 54, - 50, - 54, - 53, - 55, - 57, - 54, - 57, - 53, - 52, - 53, - 49, - 52, - 54, - 57, - 49, - 53, - 55, - 55, - 54, - 50, - 48, - 54, - 50, - 56, - 57, - 55, - 50, - 50, - 50, - 56, - 56, - 53, - 49, - 52, - 57, - 51, - 54, - 50, - 48, - 56, - 53, - 48, - 56, - 54, - 54, - 54, - 52, - 51, - 56, - 48, - 55, - 49, - 56, - 48, - 57, - 52, - 56, - 102, - 105, - 101, - 108, - 100, - 34, - 44, - 34, - 116, - 99, - 109, - 34, - 58, - 34, - 49, - 50, - 51, - 50, - 55, - 50, - 53, - 56, - 54, - 49, - 54, - 52, - 48, - 49, - 49, - 49, - 53, - 49, - 53, - 52, - 48, - 57, - 53, - 56, - 55, - 57, - 49, - 53, - 48, - 49, - 51, - 56, - 54, - 51, - 49, - 52, - 51, - 52, - 54, - 49, - 50, - 51, - 48, - 56, - 51, - 48, - 49, - 48, - 50, - 54, - 57, - 53, - 53, - 52, - 48, - 54, - 48, - 57, - 52, - 57, - 54, - 49, - 52, - 54, - 49, - 51, - 53, - 49, - 52, - 51, - 56, - 57, - 56, - 51, - 55, - 56, - 102, - 105, - 101, - 108, - 100, - 34, - 125, - 44, - 123, - 34, - 115, - 105, - 103, - 110, - 101, - 114, - 34, - 58, - 34, - 97, - 108, - 101, - 111, - 49, - 118, - 97, - 48, - 104, - 122, - 114, - 99, - 115, - 106, - 53, - 54, - 57, - 103, - 122, - 48, - 103, - 100, - 48, - 109, - 118, - 117, - 101, - 55, - 120, - 107, - 53, - 52, - 118, - 107, - 117, - 54, - 50, - 54, - 110, - 115, - 109, - 118, - 108, - 56, - 54, - 115, - 55, - 106, - 52, - 57, - 48, - 120, - 55, - 121, - 117, - 112, - 113, - 56, - 57, - 108, - 56, - 50, - 122, - 34, - 44, - 34, - 110, - 101, - 116, - 119, - 111, - 114, - 107, - 34, - 58, - 34, - 51, - 117, - 49, - 54, - 34, - 44, - 34, - 112, - 114, - 111, - 103, - 114, - 97, - 109, - 34, - 58, - 34, - 104, - 101, - 108, - 112, - 101, - 114, - 46, - 97, - 108, - 101, - 111, - 34, - 44, - 34, - 102, - 117, - 110, - 99, - 116, - 105, - 111, - 110, - 34, - 58, - 34, - 118, - 101, - 114, - 105, - 102, - 121, - 95, - 98, - 97, - 108, - 97, - 110, - 99, - 101, - 34, - 44, - 34, - 105, - 110, - 112, - 117, - 116, - 95, - 105, - 100, - 115, - 34, - 58, - 91, - 123, - 34, - 116, - 121, - 112, - 101, - 34, - 58, - 34, - 112, - 117, - 98, - 108, - 105, - 99, - 34, - 44, - 34, - 105, - 100, - 34, - 58, - 34, - 54, - 51, - 51, - 49, - 49, - 55, - 52, - 51, - 53, - 49, - 50, - 49, - 48, - 52, - 53, - 53, - 48, - 51, - 57, - 48, - 51, - 56, - 53, - 54, - 55, - 54, - 50, - 56, - 54, - 54, - 57, - 49, - 56, - 51, - 54, - 52, - 55, - 51, - 56, - 48, - 52, - 57, - 56, - 54, - 49, - 49, - 48, - 56, - 54, - 48, - 50, - 51, - 55, - 52, - 49, - 49, - 53, - 50, - 52, - 48, - 54, - 52, - 53, - 55, - 56, - 57, - 53, - 49, - 51, - 52, - 55, - 55, - 53, - 50, - 55, - 55, - 102, - 105, - 101, - 108, - 100, - 34, - 125, - 93, - 44, - 34, - 105, - 110, - 112, - 117, - 116, - 115, - 34, - 58, - 91, - 34, - 97, - 108, - 101, - 111, - 49, - 118, - 97, - 48, - 104, - 122, - 114, - 99, - 115, - 106, - 53, - 54, - 57, - 103, - 122, - 48, - 103, - 100, - 48, - 109, - 118, - 117, - 101, - 55, - 120, - 107, - 53, - 52, - 118, - 107, - 117, - 54, - 50, - 54, - 110, - 115, - 109, - 118, - 108, - 56, - 54, - 115, - 55, - 106, - 52, - 57, - 48, - 120, - 55, - 121, - 117, - 112, - 113, - 56, - 57, - 108, - 56, - 50, - 122, - 34, - 93, - 44, - 34, - 115, - 105, - 103, - 110, - 97, - 116, - 117, - 114, - 101, - 34, - 58, - 34, - 115, - 105, - 103, - 110, - 49, - 56, - 116, - 104, - 122, - 50, - 50, - 117, - 102, - 51, - 48, - 102, - 102, - 101, - 121, - 50, - 50, - 122, - 108, - 99, - 57, - 54, - 50, - 53, - 108, - 113, - 97, - 57, - 53, - 110, - 122, - 53, - 101, - 50, - 121, - 109, - 113, - 104, - 110, - 117, - 54, - 109, - 106, - 106, - 114, - 112, - 120, - 48, - 110, - 101, - 121, - 112, - 119, - 102, - 120, - 54, - 119, - 97, - 102, - 110, - 101, - 110, - 109, - 121, - 112, - 121, - 106, - 55, - 109, - 97, - 97, - 109, - 50, - 104, - 107, - 119, - 100, - 119, - 113, - 57, - 116, - 122, - 116, - 48, - 97, - 107, - 110, - 104, - 112, - 100, - 52, - 106, - 108, - 116, - 53, - 106, - 114, - 57, - 122, - 97, - 52, - 107, - 113, - 114, - 121, - 50, - 113, - 117, - 48, - 116, - 108, - 110, - 120, - 114, - 55, - 101, - 108, - 97, - 56, - 51, - 115, - 51, - 52, - 51, - 119, - 48, - 54, - 56, - 104, - 101, - 121, - 99, - 50, - 99, - 110, - 50, - 119, - 108, - 57, - 120, - 50, - 53, - 118, - 56, - 119, - 52, - 107, - 50, - 115, - 119, - 51, - 101, - 112, - 113, - 114, - 99, - 117, - 56, - 52, - 57, - 109, - 50, - 102, - 112, - 119, - 108, - 51, - 104, - 51, - 104, - 97, - 55, - 57, - 51, - 55, - 106, - 110, - 48, - 51, - 106, - 103, - 103, - 101, - 114, - 101, - 101, - 108, - 52, - 54, - 114, - 55, - 48, - 102, - 114, - 104, - 116, - 116, - 120, - 56, - 97, - 48, - 53, - 53, - 103, - 113, - 54, - 100, - 112, - 115, - 104, - 107, - 57, - 34, - 44, - 34, - 115, - 107, - 95, - 116, - 97, - 103, - 34, - 58, - 34, - 55, - 56, - 54, - 52, - 52, - 54, - 51, - 56, - 55, - 54, - 48, - 54, - 56, - 53, - 54, - 53, - 49, - 56, - 52, - 56, - 53, - 49, - 56, - 48, - 54, - 49, - 52, - 48, - 57, - 53, - 56, - 49, - 57, - 57, - 51, - 55, - 49, - 48, - 50, - 56, - 48, - 54, - 48, - 53, - 50, - 54, - 49, - 48, - 49, - 50, - 56, - 56, - 54, - 50, - 57, - 53, - 51, - 56, - 53, - 52, - 52, - 48, - 53, - 48, - 55, - 53, - 52, - 51, - 48, - 52, - 53, - 55, - 53, - 50, - 57, - 51, - 102, - 105, - 101, - 108, - 100, - 34, - 44, - 34, - 116, - 118, - 107, - 34, - 58, - 34, - 49, - 51, - 57, - 48, - 54, - 57, - 54, - 57, - 53, - 55, - 49, - 55, - 52, - 52, - 50, - 51, - 54, - 52, - 52, - 49, - 49, - 49, - 53, - 55, - 57, - 49, - 56, - 55, - 48, - 56, - 57, - 57, - 50, - 48, - 57, - 56, - 57, - 50, - 48, - 55, - 49, - 52, - 52, - 51, - 50, - 54, - 57, - 51, - 48, - 55, - 53, - 56, - 56, - 54, - 57, - 57, - 50, - 56, - 49, - 50, - 51, - 51, - 52, - 55, - 54, - 56, - 54, - 48, - 50, - 51, - 55, - 54, - 49, - 56, - 54, - 102, - 105, - 101, - 108, - 100, - 34, - 44, - 34, - 116, - 99, - 109, - 34, - 58, - 34, - 54, - 49, - 57, - 49, - 54, - 54, - 48, - 49, - 51, - 56, - 56, - 49, - 53, - 51, - 55, - 55, - 48, - 55, - 50, - 57, - 57, - 49, - 53, - 53, - 52, - 57, - 53, - 57, - 49, - 52, - 54, - 53, - 52, - 48, - 54, - 50, - 50, - 53, - 53, - 57, - 53, - 54, - 49, - 51, - 56, - 50, - 48, - 52, - 52, - 55, - 53, - 55, - 50, - 55, - 54, - 53, - 55, - 56, - 53, - 53, - 52, - 51, - 57, - 53, - 53, - 56, - 56, - 50, - 54, - 50, - 53, - 50, - 51, - 53, - 52, - 102, - 105, - 101, - 108, - 100, - 34, - 125, - 44, - 123, - 34, - 115, - 105, - 103, - 110, - 101, - 114, - 34, - 58, - 34, - 97, - 108, - 101, - 111, - 49, - 118, - 97, - 48, - 104, - 122, - 114, - 99, - 115, - 106, - 53, - 54, - 57, - 103, - 122, - 48, - 103, - 100, - 48, - 109, - 118, - 117, - 101, - 55, - 120, - 107, - 53, - 52, - 118, - 107, - 117, - 54, - 50, - 54, - 110, - 115, - 109, - 118, - 108, - 56, - 54, - 115, - 55, - 106, - 52, - 57, - 48, - 120, - 55, - 121, - 117, - 112, - 113, - 56, - 57, - 108, - 56, - 50, - 122, - 34, - 44, - 34, - 110, - 101, - 116, - 119, - 111, - 114, - 107, - 34, - 58, - 34, - 51, - 117, - 49, - 54, - 34, - 44, - 34, - 112, - 114, - 111, - 103, - 114, - 97, - 109, - 34, - 58, - 34, - 104, - 101, - 108, - 112, - 101, - 114, - 46, - 97, - 108, - 101, - 111, - 34, - 44, - 34, - 102, - 117, - 110, - 99, - 116, - 105, - 111, - 110, - 34, - 58, - 34, - 116, - 114, - 97, - 110, - 115, - 102, - 101, - 114, - 95, - 114, - 101, - 108, - 97, - 121, - 101, - 114, - 95, - 112, - 114, - 105, - 118, - 97, - 116, - 101, - 34, - 44, - 34, - 105, - 110, - 112, - 117, - 116, - 95, - 105, - 100, - 115, - 34, - 58, - 91, - 123, - 34, - 116, - 121, - 112, - 101, - 34, - 58, - 34, - 112, - 114, - 105, - 118, - 97, - 116, - 101, - 34, - 44, - 34, - 105, - 100, - 34, - 58, - 34, - 50, - 57, - 53, - 56, - 48, - 57, - 54, - 54, - 57, - 50, - 49, - 53, - 52, - 49, - 49, - 55, - 54, - 50, - 54, - 49, - 48, - 55, - 54, - 54, - 54, - 57, - 49, - 53, - 54, - 52, - 55, - 53, - 49, - 51, - 55, - 56, - 57, - 56, - 49, - 56, - 51, - 51, - 54, - 54, - 48, - 56, - 57, - 49, - 49, - 54, - 56, - 48, - 50, - 55, - 53, - 57, - 55, - 53, - 52, - 49, - 53, - 52, - 52, - 56, - 51, - 48, - 51, - 57, - 52, - 57, - 50, - 48, - 56, - 55, - 49, - 49, - 102, - 105, - 101, - 108, - 100, - 34, - 125, - 44, - 123, - 34, - 116, - 121, - 112, - 101, - 34, - 58, - 34, - 114, - 101, - 99, - 111, - 114, - 100, - 34, - 44, - 34, - 99, - 111, - 109, - 109, - 105, - 116, - 109, - 101, - 110, - 116, - 34, - 58, - 34, - 53, - 51, - 51, - 53, - 51, - 52, - 54, - 48, - 54, - 52, - 57, - 51, - 50, - 49, - 48, - 54, - 50, - 56, - 57, - 50, - 51, - 53, - 56, - 54, - 48, - 48, - 51, - 55, - 51, - 51, - 54, - 57, - 57, - 48, - 57, - 51, - 52, - 56, - 50, - 55, - 53, - 52, - 52, - 48, - 49, - 53, - 54, - 50, - 55, - 52, - 55, - 56, - 53, - 50, - 55, - 53, - 52, - 56, - 52, - 49, - 54, - 49, - 50, - 49, - 49, - 48, - 55, - 51, - 51, - 53, - 51, - 56, - 56, - 56, - 52, - 55, - 102, - 105, - 101, - 108, - 100, - 34, - 44, - 34, - 103, - 97, - 109, - 109, - 97, - 34, - 58, - 34, - 55, - 57, - 54, - 52, - 53, - 49, - 52, - 56, - 54, - 57, - 50, - 55, - 48, - 49, - 54, - 50, - 50, - 55, - 56, - 48, - 50, - 54, - 50, - 51, - 57, - 54, - 48, - 56, - 55, - 55, - 53, - 49, - 48, - 53, - 48, - 48, - 57, - 50, - 53, - 49, - 57, - 54, - 55, - 55, - 54, - 53, - 53, - 53, - 55, - 56, - 51, - 48, - 56, - 48, - 56, - 56, - 53, - 54, - 54, - 57, - 52, - 48, - 53, - 52, - 56, - 48, - 52, - 50, - 57, - 55, - 54, - 48, - 52, - 57, - 55, - 52, - 103, - 114, - 111, - 117, - 112, - 34, - 44, - 34, - 115, - 101, - 114, - 105, - 97, - 108, - 95, - 110, - 117, - 109, - 98, - 101, - 114, - 34, - 58, - 34, - 55, - 53, - 52, - 50, - 56, - 52, - 56, - 52, - 56, - 51, - 51, - 54, - 52, - 52, - 49, - 57, - 52, - 57, - 55, - 57, - 57, - 48, - 55, - 52, - 52, - 52, - 57, - 53, - 51, - 49, - 50, - 50, - 53, - 49, - 55, - 53, - 53, - 53, - 55, - 53, - 52, - 56, - 48, - 49, - 51, - 50, - 48, - 52, - 55, - 51, - 57, - 48, - 51, - 56, - 52, - 55, - 52, - 52, - 49, - 54, - 51, - 55, - 54, - 55, - 56, - 49, - 53, - 51, - 57, - 56, - 49, - 56, - 51, - 50, - 48, - 102, - 105, - 101, - 108, - 100, - 34, - 44, - 34, - 116, - 97, - 103, - 34, - 58, - 34, - 49, - 55, - 49, - 56, - 54, - 48, - 57, - 54, - 55, - 50, - 55, - 56, - 55, - 55, - 53, - 56, - 55, - 57, - 53, - 52, - 48, - 51, - 55, - 49, - 56, - 48, - 56, - 51, - 51, - 50, - 55, - 55, - 52, - 54, - 55, - 52, - 57, - 54, - 56, - 51, - 57, - 51, - 55, - 50, - 51, - 57, - 56, - 55, - 57, - 54, - 53, - 57, - 48, - 48, - 53, - 49, - 53, - 50, - 49, - 56, - 55, - 54, - 49, - 48, - 55, - 51, - 55, - 52, - 57, - 48, - 54, - 56, - 56, - 50, - 49, - 48, - 102, - 105, - 101, - 108, - 100, - 34, - 125, - 93, - 44, - 34, - 105, - 110, - 112, - 117, - 116, - 115, - 34, - 58, - 91, - 34, - 49, - 117, - 54, - 52, - 34, - 44, - 34, - 123, - 92, - 110, - 32, - 32, - 111, - 119, - 110, - 101, - 114, - 58, - 32, - 97, - 108, - 101, - 111, - 49, - 118, - 97, - 48, - 104, - 122, - 114, - 99, - 115, - 106, - 53, - 54, - 57, - 103, - 122, - 48, - 103, - 100, - 48, - 109, - 118, - 117, - 101, - 55, - 120, - 107, - 53, - 52, - 118, - 107, - 117, - 54, - 50, - 54, - 110, - 115, - 109, - 118, - 108, - 56, - 54, - 115, - 55, - 106, - 52, - 57, - 48, - 120, - 55, - 121, - 117, - 112, - 113, - 56, - 57, - 108, - 56, - 50, - 122, - 46, - 112, - 114, - 105, - 118, - 97, - 116, - 101, - 44, - 92, - 110, - 32, - 32, - 97, - 109, - 111, - 117, - 110, - 116, - 58, - 32, - 53, - 117, - 54, - 52, - 46, - 112, - 114, - 105, - 118, - 97, - 116, - 101, - 44, - 92, - 110, - 32, - 32, - 95, - 110, - 111, - 110, - 99, - 101, - 58, - 32, - 54, - 51, - 54, - 57, - 51, - 56, - 57, - 57, - 48, - 55, - 51, - 56, - 55, - 51, - 51, - 48, - 50, - 56, - 51, - 51, - 51, - 51, - 49, - 54, - 52, - 54, - 49, - 49, - 50, - 50, - 56, - 50, - 48, - 57, - 50, - 48, - 52, - 48, - 56, - 48, - 53, - 55, - 50, - 49, - 53, - 53, - 51, - 53, - 55, - 55, - 49, - 56, - 48, - 57, - 56, - 54, - 48, - 48, - 55, - 51, - 53, - 49, - 57, - 56, - 54, - 56, - 52, - 56, - 48, - 54, - 53, - 51, - 48, - 53, - 56, - 50, - 103, - 114, - 111, - 117, - 112, - 46, - 112, - 117, - 98, - 108, - 105, - 99, - 92, - 110, - 125, - 34, - 93, - 44, - 34, - 115, - 105, - 103, - 110, - 97, - 116, - 117, - 114, - 101, - 34, - 58, - 34, - 115, - 105, - 103, - 110, - 49, - 114, - 106, - 55, - 116, - 122, - 52, - 122, - 53, - 101, - 109, - 56, - 121, - 118, - 115, - 112, - 115, - 108, - 118, - 99, - 107, - 55, - 100, - 100, - 100, - 48, - 53, - 117, - 114, - 114, - 56, - 48, - 48, - 112, - 51, - 100, - 112, - 101, - 102, - 117, - 110, - 53, - 102, - 117, - 115, - 103, - 119, - 54, - 112, - 113, - 118, - 112, - 102, - 101, - 48, - 104, - 120, - 50, - 102, - 118, - 110, - 52, - 56, - 106, - 122, - 55, - 54, - 99, - 100, - 55, - 104, - 120, - 116, - 99, - 118, - 106, - 115, - 99, - 56, - 51, - 114, - 52, - 99, - 103, - 101, - 56, - 122, - 55, - 104, - 56, - 117, - 113, - 51, - 103, - 54, - 121, - 120, - 122, - 115, - 56, - 120, - 117, - 112, - 114, - 121, - 50, - 113, - 117, - 48, - 116, - 108, - 110, - 120, - 114, - 55, - 101, - 108, - 97, - 56, - 51, - 115, - 51, - 52, - 51, - 119, - 48, - 54, - 56, - 104, - 101, - 121, - 99, - 50, - 99, - 110, - 50, - 119, - 108, - 57, - 120, - 50, - 53, - 118, - 56, - 119, - 52, - 107, - 50, - 115, - 119, - 51, - 101, - 112, - 113, - 114, - 99, - 117, - 56, - 52, - 57, - 109, - 50, - 102, - 112, - 119, - 108, - 51, - 104, - 51, - 104, - 97, - 55, - 57, - 51, - 55, - 106, - 110, - 48, - 51, - 106, - 103, - 103, - 101, - 114, - 101, - 101, - 108, - 52, - 54, - 114, - 55, - 48, - 102, - 114, - 104, - 116, - 116, - 120, - 56, - 97, - 48, - 53, - 53, - 103, - 113, - 54, - 120, - 48, - 54, - 102, - 53, - 104, - 34, - 44, - 34, - 115, - 107, - 95, - 116, - 97, - 103, - 34, - 58, - 34, - 55, - 56, - 54, - 52, - 52, - 54, - 51, - 56, - 55, - 54, - 48, - 54, - 56, - 53, - 54, - 53, - 49, - 56, - 52, - 56, - 53, - 49, - 56, - 48, - 54, - 49, - 52, - 48, - 57, - 53, - 56, - 49, - 57, - 57, - 51, - 55, - 49, - 48, - 50, - 56, - 48, - 54, - 48, - 53, - 50, - 54, - 49, - 48, - 49, - 50, - 56, - 56, - 54, - 50, - 57, - 53, - 51, - 56, - 53, - 52, - 52, - 48, - 53, - 48, - 55, - 53, - 52, - 51, - 48, - 52, - 53, - 55, - 53, - 50, - 57, - 51, - 102, - 105, - 101, - 108, - 100, - 34, - 44, - 34, - 116, - 118, - 107, - 34, - 58, - 34, - 50, - 48, - 57, - 54, - 54, - 54, - 49, - 54, - 53, - 56, - 52, - 52, - 49, - 48, - 53, - 50, - 49, - 54, - 54, - 55, - 54, - 52, - 55, - 54, - 56, - 48, - 53, - 51, - 49, - 55, - 50, - 57, - 49, - 50, - 48, - 57, - 50, - 56, - 56, - 55, - 49, - 52, - 52, - 52, - 48, - 49, - 57, - 56, - 56, - 49, - 49, - 54, - 57, - 50, - 53, - 49, - 56, - 51, - 49, - 50, - 53, - 56, - 53, - 49, - 48, - 51, - 50, - 52, - 52, - 57, - 51, - 53, - 51, - 56, - 50, - 50, - 102, - 105, - 101, - 108, - 100, - 34, - 44, - 34, - 116, - 99, - 109, - 34, - 58, - 34, - 52, - 55, - 50, - 50, - 52, - 56, - 56, - 56, - 56, - 51, - 55, - 49, - 55, - 48, - 51, - 48, - 48, - 53, - 49, - 49, - 55, - 52, - 51, - 56, - 48, - 55, - 49, - 53, - 56, - 48, - 51, - 49, - 49, - 50, - 48, - 53, - 48, - 53, - 50, - 55, - 50, - 57, - 57, - 57, - 49, - 57, - 57, - 52, - 55, - 50, - 56, - 54, - 52, - 48, - 55, - 52, - 51, - 53, - 56, - 48, - 48, - 51, - 50, - 50, - 56, - 57, - 57, - 51, - 55, - 56, - 53, - 53, - 51, - 54, - 53, - 55, - 102, - 105, - 101, - 108, - 100, - 34, - 125, - 44, - 123, - 34, - 115, - 105, - 103, - 110, - 101, - 114, - 34, - 58, - 34, - 97, - 108, - 101, - 111, - 49, - 118, - 97, - 48, - 104, - 122, - 114, - 99, - 115, - 106, - 53, - 54, - 57, - 103, - 122, - 48, - 103, - 100, - 48, - 109, - 118, - 117, - 101, - 55, - 120, - 107, - 53, - 52, - 118, - 107, - 117, - 54, - 50, - 54, - 110, - 115, - 109, - 118, - 108, - 56, - 54, - 115, - 55, - 106, - 52, - 57, - 48, - 120, - 55, - 121, - 117, - 112, - 113, - 56, - 57, - 108, - 56, - 50, - 122, - 34, - 44, - 34, - 110, - 101, - 116, - 119, - 111, - 114, - 107, - 34, - 58, - 34, - 51, - 117, - 49, - 54, - 34, - 44, - 34, - 112, - 114, - 111, - 103, - 114, - 97, - 109, - 34, - 58, - 34, - 102, - 101, - 101, - 115, - 46, - 97, - 108, - 101, - 111, - 34, - 44, - 34, - 102, - 117, - 110, - 99, - 116, - 105, - 111, - 110, - 34, - 58, - 34, - 102, - 101, - 101, - 115, - 34, - 44, - 34, - 105, - 110, - 112, - 117, - 116, - 95, - 105, - 100, - 115, - 34, - 58, - 91, - 123, - 34, - 116, - 121, - 112, - 101, - 34, - 58, - 34, - 112, - 117, - 98, - 108, - 105, - 99, - 34, - 44, - 34, - 105, - 100, - 34, - 58, - 34, - 55, - 53, - 50, - 50, - 56, - 56, - 51, - 57, - 54, - 57, - 52, - 50, - 56, - 55, - 54, - 52, - 48, - 49, - 48, - 55, - 53, - 53, - 57, - 57, - 54, - 57, - 56, - 52, - 48, - 53, - 55, - 54, - 50, - 55, - 51, - 57, - 52, - 53, - 50, - 57, - 51, - 52, - 55, - 52, - 56, - 48, - 57, - 57, - 50, - 55, - 50, - 57, - 49, - 57, - 52, - 52, - 54, - 56, - 49, - 56, - 48, - 51, - 57, - 57, - 49, - 49, - 50, - 50, - 50, - 48, - 53, - 51, - 53, - 51, - 52, - 52, - 102, - 105, - 101, - 108, - 100, - 34, - 125, - 93, - 44, - 34, - 105, - 110, - 112, - 117, - 116, - 115, - 34, - 58, - 91, - 34, - 49, - 117, - 54, - 52, - 34, - 93, - 44, - 34, - 115, - 105, - 103, - 110, - 97, - 116, - 117, - 114, - 101, - 34, - 58, - 34, - 115, - 105, - 103, - 110, - 49, - 113, - 107, - 103, - 54, - 110, - 53, - 112, - 102, - 108, - 48, - 50, - 106, - 112, - 114, - 107, - 53, - 115, - 119, - 99, - 52, - 112, - 112, - 51, - 122, - 117, - 54, - 108, - 50, - 56, - 55, - 57, - 100, - 102, - 108, - 109, - 108, - 119, - 114, - 56, - 53, - 102, - 52, - 103, - 122, - 112, - 52, - 48, - 121, - 53, - 99, - 113, - 52, - 121, - 99, - 113, - 102, - 120, - 113, - 122, - 104, - 51, - 117, - 118, - 114, - 121, - 104, - 113, - 114, - 110, - 109, - 102, - 119, - 119, - 118, - 108, - 102, - 55, - 101, - 56, - 106, - 116, - 117, - 53, - 102, - 56, - 115, - 52, - 103, - 53, - 99, - 112, - 56, - 57, - 116, - 53, - 114, - 100, - 102, - 56, - 118, - 55, - 113, - 110, - 121, - 50, - 113, - 117, - 48, - 116, - 108, - 110, - 120, - 114, - 55, - 101, - 108, - 97, - 56, - 51, - 115, - 51, - 52, - 51, - 119, - 48, - 54, - 56, - 104, - 101, - 121, - 99, - 50, - 99, - 110, - 50, - 119, - 108, - 57, - 120, - 50, - 53, - 118, - 56, - 119, - 52, - 107, - 50, - 115, - 119, - 51, - 101, - 112, - 113, - 114, - 99, - 117, - 56, - 52, - 57, - 109, - 50, - 102, - 112, - 119, - 108, - 51, - 104, - 51, - 104, - 97, - 55, - 57, - 51, - 55, - 106, - 110, - 48, - 51, - 106, - 103, - 103, - 101, - 114, - 101, - 101, - 108, - 52, - 54, - 114, - 55, - 48, - 102, - 114, - 104, - 116, - 116, - 120, - 56, - 97, - 48, - 53, - 53, - 103, - 113, - 54, - 50, - 107, - 109, - 55, - 101, - 115, - 34, - 44, - 34, - 115, - 107, - 95, - 116, - 97, - 103, - 34, - 58, - 34, - 55, - 56, - 54, - 52, - 52, - 54, - 51, - 56, - 55, - 54, - 48, - 54, - 56, - 53, - 54, - 53, - 49, - 56, - 52, - 56, - 53, - 49, - 56, - 48, - 54, - 49, - 52, - 48, - 57, - 53, - 56, - 49, - 57, - 57, - 51, - 55, - 49, - 48, - 50, - 56, - 48, - 54, - 48, - 53, - 50, - 54, - 49, - 48, - 49, - 50, - 56, - 56, - 54, - 50, - 57, - 53, - 51, - 56, - 53, - 52, - 52, - 48, - 53, - 48, - 55, - 53, - 52, - 51, - 48, - 52, - 53, - 55, - 53, - 50, - 57, - 51, - 102, - 105, - 101, - 108, - 100, - 34, - 44, - 34, - 116, - 118, - 107, - 34, - 58, - 34, - 51, - 50, - 49, - 48, - 55, - 55, - 48, - 51, - 49, - 51, - 53, - 50, - 52, - 57, - 52, - 51, - 51, - 50, - 57, - 56, - 54, - 49, - 54, - 54, - 52, - 54, - 50, - 50, - 57, - 49, - 48, - 52, - 57, - 54, - 55, - 52, - 56, - 48, - 53, - 56, - 50, - 55, - 53, - 54, - 57, - 54, - 52, - 50, - 52, - 48, - 53, - 56, - 54, - 52, - 52, - 51, - 49, - 52, - 57, - 53, - 52, - 50, - 49, - 54, - 56, - 49, - 50, - 49, - 56, - 54, - 48, - 51, - 49, - 49, - 54, - 56, - 102, - 105, - 101, - 108, - 100, - 34, - 44, - 34, - 116, - 99, - 109, - 34, - 58, - 34, - 52, - 55, - 56, - 57, - 57, - 51, - 49, - 51, - 54, - 51, - 48, - 51, - 57, - 48, - 52, - 55, - 51, - 51, - 49, - 50, - 48, - 53, - 55, - 50, - 49, - 49, - 57, - 48, - 53, - 48, - 55, - 49, - 51, - 57, - 52, - 54, - 53, - 50, - 55, - 49, - 51, - 52, - 52, - 52, - 49, - 56, - 50, - 53, - 52, - 56, - 48, - 48, - 51, - 55, - 49, - 51, - 53, - 51, - 52, - 54, - 49, - 51, - 48, - 57, - 57, - 48, - 50, - 54, - 57, - 55, - 55, - 51, - 55, - 52, - 51, - 102, - 105, - 101, - 108, - 100, - 34, - 125, - 44, - 123, - 34, - 115, - 105, - 103, - 110, - 101, - 114, - 34, - 58, - 34, - 97, - 108, - 101, - 111, - 49, - 118, - 97, - 48, - 104, - 122, - 114, - 99, - 115, - 106, - 53, - 54, - 57, - 103, - 122, - 48, - 103, - 100, - 48, - 109, - 118, - 117, - 101, - 55, - 120, - 107, - 53, - 52, - 118, - 107, - 117, - 54, - 50, - 54, - 110, - 115, - 109, - 118, - 108, - 56, - 54, - 115, - 55, - 106, - 52, - 57, - 48, - 120, - 55, - 121, - 117, - 112, - 113, - 56, - 57, - 108, - 56, - 50, - 122, - 34, - 44, - 34, - 110, - 101, - 116, - 119, - 111, - 114, - 107, - 34, - 58, - 34, - 51, - 117, - 49, - 54, - 34, - 44, - 34, - 112, - 114, - 111, - 103, - 114, - 97, - 109, - 34, - 58, - 34, - 109, - 117, - 108, - 116, - 105, - 95, - 116, - 120, - 110, - 95, - 116, - 49, - 46, - 97, - 108, - 101, - 111, - 34, - 44, - 34, - 102, - 117, - 110, - 99, - 116, - 105, - 111, - 110, - 34, - 58, - 34, - 116, - 114, - 97, - 110, - 115, - 102, - 101, - 114, - 95, - 112, - 114, - 105, - 118, - 97, - 116, - 101, - 34, - 44, - 34, - 105, - 110, - 112, - 117, - 116, - 95, - 105, - 100, - 115, - 34, - 58, - 91, - 123, - 34, - 116, - 121, - 112, - 101, - 34, - 58, - 34, - 112, - 114, - 105, - 118, - 97, - 116, - 101, - 34, - 44, - 34, - 105, - 100, - 34, - 58, - 34, - 49, - 52, - 54, - 54, - 50, - 55, - 52, - 56, - 51, - 55, - 48, - 54, - 54, - 51, - 51, - 50, - 50, - 57, - 52, - 52, - 54, - 51, - 48, - 50, - 49, - 50, - 52, - 56, - 52, - 52, - 48, - 54, - 52, - 50, - 57, - 54, - 55, - 50, - 55, - 57, - 49, - 48, - 49, - 48, - 53, - 52, - 57, - 52, - 50, - 52, - 56, - 55, - 57, - 56, - 50, - 55, - 54, - 52, - 52, - 52, - 50, - 51, - 55, - 53, - 50, - 53, - 53, - 53, - 50, - 51, - 48, - 52, - 53, - 54, - 57, - 57, - 102, - 105, - 101, - 108, - 100, - 34, - 125, - 44, - 123, - 34, - 116, - 121, - 112, - 101, - 34, - 58, - 34, - 112, - 114, - 105, - 118, - 97, - 116, - 101, - 34, - 44, - 34, - 105, - 100, - 34, - 58, - 34, - 53, - 52, - 48, - 52, - 49, - 54, - 49, - 49, - 51, - 56, - 49, - 50, - 55, - 51, - 51, - 49, - 52, - 49, - 57, - 55, - 51, - 50, - 57, - 57, - 54, - 57, - 52, - 53, - 50, - 48, - 50, - 52, - 49, - 52, - 57, - 56, - 50, - 50, - 56, - 54, - 51, - 55, - 49, - 49, - 53, - 54, - 53, - 54, - 57, - 56, - 52, - 57, - 54, - 51, - 48, - 52, - 55, - 49, - 48, - 50, - 52, - 53, - 50, - 52, - 48, - 55, - 54, - 53, - 48, - 57, - 51, - 57, - 56, - 55, - 50, - 52, - 102, - 105, - 101, - 108, - 100, - 34, - 125, - 44, - 123, - 34, - 116, - 121, - 112, - 101, - 34, - 58, - 34, - 112, - 117, - 98, - 108, - 105, - 99, - 34, - 44, - 34, - 105, - 100, - 34, - 58, - 34, - 52, - 55, - 48, - 50, - 48, - 53, - 53, - 51, - 53, - 57, - 52, - 51, - 56, - 57, - 48, - 50, - 55, - 53, - 53, - 51, - 49, - 49, - 52, - 49, - 53, - 54, - 53, - 57, - 53, - 51, - 50, - 49, - 51, - 52, - 51, - 48, - 52, - 54, - 57, - 48, - 54, - 51, - 56, - 49, - 51, - 48, - 52, - 49, - 48, - 56, - 53, - 54, - 55, - 54, - 57, - 55, - 56, - 48, - 51, - 49, - 55, - 55, - 49, - 56, - 53, - 53, - 51, - 49, - 54, - 50, - 57, - 50, - 51, - 56, - 52, - 53, - 102, - 105, - 101, - 108, - 100, - 34, - 125, - 93, - 44, - 34, - 105, - 110, - 112, - 117, - 116, - 115, - 34, - 58, - 91, - 34, - 97, - 108, - 101, - 111, - 49, - 114, - 110, - 54, - 51, - 54, - 103, - 57, - 52, - 109, - 120, - 51, - 113, - 113, - 104, - 102, - 55, - 109, - 55, - 57, - 110, - 115, - 110, - 101, - 51, - 108, - 108, - 118, - 52, - 100, - 113, - 115, - 50, - 53, - 55, - 48, - 55, - 121, - 104, - 119, - 99, - 114, - 107, - 57, - 50, - 112, - 48, - 107, - 119, - 114, - 99, - 57, - 113, - 101, - 51, - 57, - 50, - 119, - 103, - 34, - 44, - 34, - 51, - 117, - 54, - 52, - 34, - 44, - 34, - 50, - 117, - 54, - 52, - 34, - 93, - 44, - 34, - 115, - 105, - 103, - 110, - 97, - 116, - 117, - 114, - 101, - 34, - 58, - 34, - 115, - 105, - 103, - 110, - 49, - 122, - 122, - 99, - 112, - 103, - 115, - 109, - 52, - 99, - 110, - 121, - 57, - 122, - 120, - 117, - 122, - 99, - 56, - 108, - 116, - 115, - 108, - 117, - 51, - 116, - 57, - 53, - 102, - 121, - 112, - 117, - 54, - 104, - 109, - 103, - 110, - 56, - 110, - 114, - 48, - 113, - 113, - 55, - 108, - 97, - 108, - 120, - 48, - 112, - 113, - 112, - 114, - 48, - 109, - 101, - 117, - 112, - 110, - 109, - 48, - 104, - 117, - 52, - 52, - 51, - 97, - 103, - 57, - 53, - 116, - 54, - 97, - 53, - 55, - 118, - 119, - 50, - 52, - 100, - 121, - 100, - 51, - 50, - 53, - 55, - 54, - 115, - 101, - 120, - 56, - 53, - 113, - 108, - 106, - 102, - 118, - 57, - 56, - 112, - 113, - 99, - 113, - 116, - 121, - 50, - 113, - 117, - 48, - 116, - 108, - 110, - 120, - 114, - 55, - 101, - 108, - 97, - 56, - 51, - 115, - 51, - 52, - 51, - 119, - 48, - 54, - 56, - 104, - 101, - 121, - 99, - 50, - 99, - 110, - 50, - 119, - 108, - 57, - 120, - 50, - 53, - 118, - 56, - 119, - 52, - 107, - 50, - 115, - 119, - 51, - 101, - 112, - 113, - 114, - 99, - 117, - 56, - 52, - 57, - 109, - 50, - 102, - 112, - 119, - 108, - 51, - 104, - 51, - 104, - 97, - 55, - 57, - 51, - 55, - 106, - 110, - 48, - 51, - 106, - 103, - 103, - 101, - 114, - 101, - 101, - 108, - 52, - 54, - 114, - 55, - 48, - 102, - 114, - 104, - 116, - 116, - 120, - 56, - 97, - 48, - 53, - 53, - 103, - 113, - 54, - 55, - 102, - 116, - 121, - 100, - 53, - 34, - 44, - 34, - 115, - 107, - 95, - 116, - 97, - 103, - 34, - 58, - 34, - 55, - 56, - 54, - 52, - 52, - 54, - 51, - 56, - 55, - 54, - 48, - 54, - 56, - 53, - 54, - 53, - 49, - 56, - 52, - 56, - 53, - 49, - 56, - 48, - 54, - 49, - 52, - 48, - 57, - 53, - 56, - 49, - 57, - 57, - 51, - 55, - 49, - 48, - 50, - 56, - 48, - 54, - 48, - 53, - 50, - 54, - 49, - 48, - 49, - 50, - 56, - 56, - 54, - 50, - 57, - 53, - 51, - 56, - 53, - 52, - 52, - 48, - 53, - 48, - 55, - 53, - 52, - 51, - 48, - 52, - 53, - 55, - 53, - 50, - 57, - 51, - 102, - 105, - 101, - 108, - 100, - 34, - 44, - 34, - 116, - 118, - 107, - 34, - 58, - 34, - 50, - 54, - 52, - 57, - 56, - 57, - 52, - 52, - 49, - 52, - 48, - 50, - 54, - 48, - 51, - 48, - 54, - 53, - 52, - 51, - 52, - 50, - 57, - 53, - 50, - 53, - 56, - 53, - 50, - 57, - 53, - 54, - 55, - 51, - 50, - 49, - 56, - 57, - 56, - 48, - 50, - 50, - 53, - 51, - 56, - 55, - 57, - 52, - 56, - 56, - 51, - 49, - 51, - 55, - 48, - 55, - 56, - 52, - 49, - 57, - 54, - 48, - 49, - 53, - 50, - 56, - 53, - 52, - 51, - 55, - 55, - 57, - 53, - 57, - 56, - 51, - 102, - 105, - 101, - 108, - 100, - 34, - 44, - 34, - 116, - 99, - 109, - 34, - 58, - 34, - 52, - 49, - 56, - 52, - 49, - 48, - 50, - 49, - 57, - 53, - 48, - 57, - 49, - 54, - 57, - 49, - 56, - 50, - 48, - 56, - 49, - 54, - 54, - 57, - 48, - 49, - 52, - 57, - 48, - 52, - 54, - 56, - 54, - 54, - 55, - 48, - 53, - 56, - 56, - 48, - 55, - 55, - 57, - 56, - 52, - 48, - 53, - 55, - 50, - 52, - 50, - 53, - 54, - 56, - 50, - 50, - 50, - 53, - 56, - 50, - 48, - 53, - 49, - 53, - 48, - 53, - 48, - 54, - 50, - 49, - 51, - 48, - 56, - 56, - 50, - 48, - 102, - 105, - 101, - 108, - 100, - 34, - 125, - 93, - 44, - 34, - 116, - 114, - 97, - 110, - 115, - 105, - 116, - 105, - 111, - 110, - 115, - 34, - 58, - 91, - 123, - 34, - 105, - 100, - 34, - 58, - 34, - 97, - 117, - 49, - 114, - 122, - 101, - 107, - 53, - 53, - 118, - 116, - 117, - 50, - 115, - 118, - 53, - 51, - 101, - 122, - 102, - 115, - 112, - 54, - 103, - 109, - 53, - 110, - 55, - 103, - 110, - 100, - 102, - 106, - 112, - 117, - 112, - 119, - 121, - 48, - 114, - 52, - 50, - 116, - 112, - 55, - 101, - 113, - 48, - 107, - 115, - 109, - 104, - 99, - 114, - 115, - 117, - 102, - 117, - 115, - 52, - 116, - 34, - 44, - 34, - 112, - 114, - 111, - 103, - 114, - 97, - 109, - 34, - 58, - 34, - 104, - 101, - 108, - 112, - 101, - 114, - 46, - 97, - 108, - 101, - 111, - 34, - 44, - 34, - 102, - 117, - 110, - 99, - 116, - 105, - 111, - 110, - 34, - 58, - 34, - 109, - 105, - 110, - 116, - 95, - 112, - 114, - 105, - 118, - 97, - 116, - 101, - 34, - 44, - 34, - 105, - 110, - 112, - 117, - 116, - 115, - 34, - 58, - 91, - 123, - 34, - 116, - 121, - 112, - 101, - 34, - 58, - 34, - 112, - 114, - 105, - 118, - 97, - 116, - 101, - 34, - 44, - 34, - 105, - 100, - 34, - 58, - 34, - 50, - 49, - 49, - 57, - 48, - 50, - 50, - 50, - 51, - 50, - 54, - 51, - 55, - 52, - 54, - 57, - 53, - 49, - 55, - 55, - 54, - 57, - 54, - 49, - 50, - 50, - 52, - 56, - 51, - 51, - 56, - 49, - 52, - 54, - 55, - 52, - 55, - 54, - 50, - 54, - 57, - 52, - 48, - 56, - 54, - 54, - 52, - 57, - 55, - 57, - 56, - 53, - 51, - 53, - 50, - 51, - 57, - 53, - 49, - 57, - 50, - 55, - 57, - 48, - 51, - 49, - 50, - 55, - 48, - 54, - 48, - 57, - 52, - 54, - 48, - 48, - 102, - 105, - 101, - 108, - 100, - 34, - 44, - 34, - 118, - 97, - 108, - 117, - 101, - 34, - 58, - 34, - 99, - 105, - 112, - 104, - 101, - 114, - 116, - 101, - 120, - 116, - 49, - 113, - 103, - 113, - 114, - 119, - 103, - 119, - 106, - 104, - 114, - 51, - 104, - 120, - 57, - 112, - 102, - 110, - 97, - 117, - 121, - 107, - 55, - 122, - 118, - 50, - 51, - 107, - 115, - 54, - 121, - 122, - 97, - 54, - 52, - 119, - 97, - 107, - 109, - 52, - 113, - 108, - 104, - 114, - 114, - 113, - 99, - 116, - 99, - 118, - 110, - 120, - 55, - 113, - 121, - 57, - 57, - 119, - 108, - 107, - 52, - 118, - 112, - 110, - 57, - 112, - 110, - 120, - 108, - 110, - 113, - 115, - 120, - 101, - 57, - 53, - 50, - 53, - 115, - 116, - 97, - 112, - 100, - 57, - 99, - 103, - 103, - 100, - 57, - 108, - 113, - 50, - 119, - 115, - 57, - 106, - 116, - 118, - 97, - 55, - 119, - 55, - 54, - 118, - 121, - 122, - 103, - 101, - 107, - 120, - 99, - 99, - 104, - 34, - 125, - 44, - 123, - 34, - 116, - 121, - 112, - 101, - 34, - 58, - 34, - 112, - 114, - 105, - 118, - 97, - 116, - 101, - 34, - 44, - 34, - 105, - 100, - 34, - 58, - 34, - 52, - 56, - 56, - 48, - 57, - 50, - 54, - 49, - 50, - 54, - 50, - 55, - 54, - 50, - 53, - 56, - 52, - 56, - 52, - 54, - 54, - 53, - 53, - 57, - 50, - 51, - 57, - 56, - 53, - 52, - 55, - 50, - 49, - 53, - 56, - 56, - 54, - 52, - 52, - 54, - 49, - 49, - 53, - 53, - 54, - 52, - 48, - 56, - 57, - 57, - 49, - 49, - 52, - 48, - 48, - 57, - 51, - 50, - 57, - 52, - 52, - 48, - 52, - 49, - 51, - 50, - 52, - 55, - 55, - 55, - 51, - 49, - 48, - 56, - 49, - 51, - 102, - 105, - 101, - 108, - 100, - 34, - 44, - 34, - 118, - 97, - 108, - 117, - 101, - 34, - 58, - 34, - 99, - 105, - 112, - 104, - 101, - 114, - 116, - 101, - 120, - 116, - 49, - 113, - 121, - 113, - 120, - 50, - 48, - 99, - 106, - 101, - 108, - 106, - 116, - 53, - 102, - 102, - 114, - 54, - 53, - 50, - 108, - 117, - 121, - 99, - 120, - 53, - 112, - 103, - 57, - 48, - 52, - 118, - 99, - 106, - 48, - 114, - 109, - 106, - 100, - 107, - 119, - 99, - 56, - 106, - 114, - 55, - 50, - 119, - 53, - 102, - 102, - 120, - 120, - 117, - 121, - 103, - 121, - 110, - 110, - 110, - 103, - 51, - 34, - 125, - 93, - 44, - 34, - 111, - 117, - 116, - 112, - 117, - 116, - 115, - 34, - 58, - 91, - 123, - 34, - 116, - 121, - 112, - 101, - 34, - 58, - 34, - 114, - 101, - 99, - 111, - 114, - 100, - 34, - 44, - 34, - 105, - 100, - 34, - 58, - 34, - 53, - 51, - 51, - 53, - 51, - 52, - 54, - 48, - 54, - 52, - 57, - 51, - 50, - 49, - 48, - 54, - 50, - 56, - 57, - 50, - 51, - 53, - 56, - 54, - 48, - 48, - 51, - 55, - 51, - 51, - 54, - 57, - 57, - 48, - 57, - 51, - 52, - 56, - 50, - 55, - 53, - 52, - 52, - 48, - 49, - 53, - 54, - 50, - 55, - 52, - 55, - 56, - 53, - 50, - 55, - 53, - 52, - 56, - 52, - 49, - 54, - 49, - 50, - 49, - 49, - 48, - 55, - 51, - 51, - 53, - 51, - 56, - 56, - 56, - 52, - 55, - 102, - 105, - 101, - 108, - 100, - 34, - 44, - 34, - 99, - 104, - 101, - 99, - 107, - 115, - 117, - 109, - 34, - 58, - 34, - 53, - 53, - 54, - 56, - 48, - 56, - 56, - 56, - 57, - 54, - 49, - 50, - 54, - 48, - 56, - 57, - 55, - 54, - 56, - 52, - 54, - 57, - 53, - 55, - 55, - 56, - 55, - 53, - 55, - 51, - 49, - 51, - 53, - 51, - 55, - 55, - 57, - 54, - 53, - 52, - 48, - 49, - 57, - 55, - 49, - 48, - 52, - 54, - 57, - 52, - 53, - 56, - 55, - 56, - 55, - 53, - 55, - 51, - 53, - 56, - 55, - 56, - 56, - 55, - 50, - 52, - 49, - 51, - 55, - 48, - 48, - 48, - 57, - 53, - 52, - 102, - 105, - 101, - 108, - 100, - 34, - 44, - 34, - 118, - 97, - 108, - 117, - 101, - 34, - 58, - 34, - 114, - 101, - 99, - 111, - 114, - 100, - 49, - 113, - 121, - 113, - 115, - 112, - 120, - 114, - 99, - 120, - 122, - 106, - 102, - 50, - 107, - 112, - 52, - 55, - 101, - 103, - 117, - 56, - 107, - 107, - 101, - 48, - 122, - 53, - 116, - 50, - 50, - 50, - 110, - 103, - 101, - 115, - 115, - 106, - 116, - 109, - 103, - 107, - 109, - 121, - 103, - 97, - 108, - 57, - 54, - 112, - 108, - 56, - 122, - 55, - 116, - 99, - 57, - 113, - 121, - 114, - 120, - 122, - 109, - 116, - 48, - 119, - 52, - 104, - 56, - 103, - 103, - 99, - 113, - 113, - 103, - 113, - 115, - 113, - 53, - 116, - 99, - 122, - 117, - 50, - 53, - 101, - 48, - 53, - 112, - 48, - 54, - 100, - 57, - 107, - 120, - 110, - 109, - 56, - 110, - 115, - 109, - 116, - 117, - 119, - 115, - 50, - 118, - 106, - 122, - 55, - 104, - 121, - 52, - 103, - 113, - 116, - 53, - 102, - 113, - 121, - 104, - 120, - 57, - 118, - 108, - 113, - 119, - 115, - 119, - 122, - 101, - 114, - 100, - 53, - 99, - 57, - 53, - 113, - 48, - 120, - 106, - 102, - 52, - 106, - 113, - 108, - 116, - 115, - 114, - 116, - 120, - 107, - 52, - 115, - 117, - 48, - 112, - 117, - 100, - 106, - 119, - 120, - 114, - 100, - 120, - 115, - 55, - 104, - 112, - 102, - 108, - 113, - 110, - 103, - 54, - 104, - 106, - 122, - 115, - 56, - 113, - 121, - 104, - 113, - 122, - 52, - 113, - 34, - 125, - 93, - 44, - 34, - 116, - 112, - 107, - 34, - 58, - 34, - 54, - 48, - 53, - 52, - 49, - 57, - 56, - 55, - 57, - 57, - 53, - 49, - 52, - 49, - 49, - 53, - 55, - 55, - 48, - 50, - 57, - 54, - 57, - 52, - 57, - 56, - 51, - 55, - 49, - 54, - 55, - 56, - 49, - 49, - 54, - 50, - 55, - 56, - 50, - 49, - 53, - 53, - 57, - 52, - 52, - 48, - 50, - 57, - 51, - 53, - 52, - 48, - 52, - 56, - 49, - 50, - 54, - 51, - 51, - 48, - 57, - 55, - 54, - 50, - 53, - 50, - 55, - 51, - 56, - 49, - 55, - 56, - 49, - 51, - 57, - 57, - 103, - 114, - 111, - 117, - 112, - 34, - 44, - 34, - 116, - 99, - 109, - 34, - 58, - 34, - 49, - 50, - 51, - 50, - 55, - 50, - 53, - 56, - 54, - 49, - 54, - 52, - 48, - 49, - 49, - 49, - 53, - 49, - 53, - 52, - 48, - 57, - 53, - 56, - 55, - 57, - 49, - 53, - 48, - 49, - 51, - 56, - 54, - 51, - 49, - 52, - 51, - 52, - 54, - 49, - 50, - 51, - 48, - 56, - 51, - 48, - 49, - 48, - 50, - 54, - 57, - 53, - 53, - 52, - 48, - 54, - 48, - 57, - 52, - 57, - 54, - 49, - 52, - 54, - 49, - 51, - 53, - 49, - 52, - 51, - 56, - 57, - 56, - 51, - 55, - 56, - 102, - 105, - 101, - 108, - 100, - 34, - 125, - 44, - 123, - 34, - 105, - 100, - 34, - 58, - 34, - 97, - 117, - 49, - 116, - 55, - 119, - 100, - 118, - 103, - 55, - 113, - 115, - 115, - 103, - 115, - 53, - 102, - 57, - 115, - 109, - 56, - 50, - 115, - 103, - 107, - 121, - 100, - 121, - 55, - 117, - 119, - 54, - 108, - 57, - 51, - 108, - 103, - 114, - 57, - 115, - 100, - 57, - 51, - 121, - 52, - 102, - 110, - 104, - 114, - 121, - 112, - 118, - 115, - 114, - 113, - 122, - 102, - 118, - 56, - 122, - 101, - 34, - 44, - 34, - 112, - 114, - 111, - 103, - 114, - 97, - 109, - 34, - 58, - 34, - 104, - 101, - 108, - 112, - 101, - 114, - 46, - 97, - 108, - 101, - 111, - 34, - 44, - 34, - 102, - 117, - 110, - 99, - 116, - 105, - 111, - 110, - 34, - 58, - 34, - 118, - 101, - 114, - 105, - 102, - 121, - 95, - 98, - 97, - 108, - 97, - 110, - 99, - 101, - 34, - 44, - 34, - 105, - 110, - 112, - 117, - 116, - 115, - 34, - 58, - 91, - 123, - 34, - 116, - 121, - 112, - 101, - 34, - 58, - 34, - 112, - 117, - 98, - 108, - 105, - 99, - 34, - 44, - 34, - 105, - 100, - 34, - 58, - 34, - 54, - 51, - 51, - 49, - 49, - 55, - 52, - 51, - 53, - 49, - 50, - 49, - 48, - 52, - 53, - 53, - 48, - 51, - 57, - 48, - 51, - 56, - 53, - 54, - 55, - 54, - 50, - 56, - 54, - 54, - 57, - 49, - 56, - 51, - 54, - 52, - 55, - 51, - 56, - 48, - 52, - 57, - 56, - 54, - 49, - 49, - 48, - 56, - 54, - 48, - 50, - 51, - 55, - 52, - 49, - 49, - 53, - 50, - 52, - 48, - 54, - 52, - 53, - 55, - 56, - 57, - 53, - 49, - 51, - 52, - 55, - 55, - 53, - 50, - 55, - 55, - 102, - 105, - 101, - 108, - 100, - 34, - 44, - 34, - 118, - 97, - 108, - 117, - 101, - 34, - 58, - 34, - 97, - 108, - 101, - 111, - 49, - 118, - 97, - 48, - 104, - 122, - 114, - 99, - 115, - 106, - 53, - 54, - 57, - 103, - 122, - 48, - 103, - 100, - 48, - 109, - 118, - 117, - 101, - 55, - 120, - 107, - 53, - 52, - 118, - 107, - 117, - 54, - 50, - 54, - 110, - 115, - 109, - 118, - 108, - 56, - 54, - 115, - 55, - 106, - 52, - 57, - 48, - 120, - 55, - 121, - 117, - 112, - 113, - 56, - 57, - 108, - 56, - 50, - 122, - 34, - 125, - 93, - 44, - 34, - 111, - 117, - 116, - 112, - 117, - 116, - 115, - 34, - 58, - 91, - 123, - 34, - 116, - 121, - 112, - 101, - 34, - 58, - 34, - 102, - 117, - 116, - 117, - 114, - 101, - 34, - 44, - 34, - 105, - 100, - 34, - 58, - 34, - 49, - 53, - 54, - 54, - 56, - 55, - 53, - 49, - 54, - 49, - 51, - 52, - 50, - 50, - 56, - 53, - 52, - 54, - 50, - 49, - 51, - 55, - 55, - 48, - 53, - 48, - 55, - 48, - 57, - 51, - 49, - 50, - 57, - 53, - 57, - 50, - 53, - 54, - 56, - 51, - 51, - 53, - 49, - 49, - 54, - 56, - 54, - 53, - 50, - 55, - 56, - 57, - 53, - 54, - 52, - 48, - 52, - 48, - 55, - 48, - 52, - 57, - 55, - 55, - 50, - 56, - 57, - 48, - 49, - 55, - 53, - 56, - 57, - 54, - 50, - 54, - 102, - 105, - 101, - 108, - 100, - 34, - 44, - 34, - 118, - 97, - 108, - 117, - 101, - 34, - 58, - 34, - 123, - 92, - 110, - 32, - 32, - 112, - 114, - 111, - 103, - 114, - 97, - 109, - 95, - 105, - 100, - 58, - 32, - 104, - 101, - 108, - 112, - 101, - 114, - 46, - 97, - 108, - 101, - 111, - 44, - 92, - 110, - 32, - 32, - 102, - 117, - 110, - 99, - 116, - 105, - 111, - 110, - 95, - 110, - 97, - 109, - 101, - 58, - 32, - 118, - 101, - 114, - 105, - 102, - 121, - 95, - 98, - 97, - 108, - 97, - 110, - 99, - 101, - 44, - 92, - 110, - 32, - 32, - 97, - 114, - 103, - 117, - 109, - 101, - 110, - 116, - 115, - 58, - 32, - 91, - 92, - 110, - 32, - 32, - 32, - 32, - 97, - 108, - 101, - 111, - 49, - 118, - 97, - 48, - 104, - 122, - 114, - 99, - 115, - 106, - 53, - 54, - 57, - 103, - 122, - 48, - 103, - 100, - 48, - 109, - 118, - 117, - 101, - 55, - 120, - 107, - 53, - 52, - 118, - 107, - 117, - 54, - 50, - 54, - 110, - 115, - 109, - 118, - 108, - 56, - 54, - 115, - 55, - 106, - 52, - 57, - 48, - 120, - 55, - 121, - 117, - 112, - 113, - 56, - 57, - 108, - 56, - 50, - 122, - 92, - 110, - 32, - 32, - 93, - 92, - 110, - 125, - 34, - 125, - 93, - 44, - 34, - 116, - 112, - 107, - 34, - 58, - 34, - 52, - 48, - 53, - 54, - 57, - 54, - 56, - 55, - 56, - 57, - 48, - 48, - 55, - 52, - 48, - 55, - 54, - 48, - 57, - 54, - 57, - 52, - 52, - 54, - 48, - 50, - 50, - 54, - 52, - 56, - 51, - 55, - 52, - 53, - 52, - 54, - 55, - 49, - 52, - 53, - 56, - 49, - 53, - 49, - 48, - 50, - 50, - 49, - 56, - 56, - 54, - 56, - 57, - 48, - 56, - 51, - 56, - 55, - 52, - 52, - 56, - 52, - 55, - 49, - 50, - 49, - 48, - 53, - 48, - 52, - 56, - 53, - 49, - 56, - 52, - 53, - 103, - 114, - 111, - 117, - 112, - 34, - 44, - 34, - 116, - 99, - 109, - 34, - 58, - 34, - 54, - 49, - 57, - 49, - 54, - 54, - 48, - 49, - 51, - 56, - 56, - 49, - 53, - 51, - 55, - 55, - 48, - 55, - 50, - 57, - 57, - 49, - 53, - 53, - 52, - 57, - 53, - 57, - 49, - 52, - 54, - 53, - 52, - 48, - 54, - 50, - 50, - 53, - 53, - 57, - 53, - 54, - 49, - 51, - 56, - 50, - 48, - 52, - 52, - 55, - 53, - 55, - 50, - 55, - 54, - 53, - 55, - 56, - 53, - 53, - 52, - 51, - 57, - 53, - 53, - 56, - 56, - 50, - 54, - 50, - 53, - 50, - 51, - 53, - 52, - 102, - 105, - 101, - 108, - 100, - 34, - 125, - 44, - 123, - 34, - 105, - 100, - 34, - 58, - 34, - 97, - 117, - 49, - 50, - 121, - 103, - 109, - 50, - 102, - 56, - 113, - 101, - 113, - 100, - 48, - 120, - 110, - 106, - 122, - 109, - 50, - 97, - 55, - 107, - 103, - 118, - 116, - 120, - 52, - 122, - 56, - 56, - 115, - 109, - 55, - 106, - 118, - 113, - 121, - 103, - 56, - 116, - 119, - 109, - 112, - 97, - 57, - 55, - 106, - 48, - 122, - 117, - 113, - 122, - 115, - 112, - 108, - 99, - 55, - 109, - 119, - 34, - 44, - 34, - 112, - 114, - 111, - 103, - 114, - 97, - 109, - 34, - 58, - 34, - 104, - 101, - 108, - 112, - 101, - 114, - 46, - 97, - 108, - 101, - 111, - 34, - 44, - 34, - 102, - 117, - 110, - 99, - 116, - 105, - 111, - 110, - 34, - 58, - 34, - 116, - 114, - 97, - 110, - 115, - 102, - 101, - 114, - 95, - 114, - 101, - 108, - 97, - 121, - 101, - 114, - 95, - 112, - 114, - 105, - 118, - 97, - 116, - 101, - 34, - 44, - 34, - 105, - 110, - 112, - 117, - 116, - 115, - 34, - 58, - 91, - 123, - 34, - 116, - 121, - 112, - 101, - 34, - 58, - 34, - 112, - 114, - 105, - 118, - 97, - 116, - 101, - 34, - 44, - 34, - 105, - 100, - 34, - 58, - 34, - 50, - 57, - 53, - 56, - 48, - 57, - 54, - 54, - 57, - 50, - 49, - 53, - 52, - 49, - 49, - 55, - 54, - 50, - 54, - 49, - 48, - 55, - 54, - 54, - 54, - 57, - 49, - 53, - 54, - 52, - 55, - 53, - 49, - 51, - 55, - 56, - 57, - 56, - 49, - 56, - 51, - 51, - 54, - 54, - 48, - 56, - 57, - 49, - 49, - 54, - 56, - 48, - 50, - 55, - 53, - 57, - 55, - 53, - 52, - 49, - 53, - 52, - 52, - 56, - 51, - 48, - 51, - 57, - 52, - 57, - 50, - 48, - 56, - 55, - 49, - 49, - 102, - 105, - 101, - 108, - 100, - 34, - 44, - 34, - 118, - 97, - 108, - 117, - 101, - 34, - 58, - 34, - 99, - 105, - 112, - 104, - 101, - 114, - 116, - 101, - 120, - 116, - 49, - 113, - 121, - 113, - 119, - 56, - 101, - 119, - 102, - 116, - 112, - 114, - 115, - 54, - 57, - 50, - 97, - 51, - 50, - 102, - 116, - 107, - 102, - 48, - 48, - 121, - 102, - 115, - 121, - 104, - 106, - 122, - 101, - 119, - 56, - 112, - 115, - 102, - 54, - 97, - 48, - 116, - 112, - 109, - 97, - 104, - 55, - 114, - 116, - 108, - 113, - 120, - 102, - 120, - 122, - 115, - 103, - 110, - 51, - 104, - 97, - 110, - 34, - 125, - 44, - 123, - 34, - 116, - 121, - 112, - 101, - 34, - 58, - 34, - 114, - 101, - 99, - 111, - 114, - 100, - 34, - 44, - 34, - 105, - 100, - 34, - 58, - 34, - 55, - 53, - 52, - 50, - 56, - 52, - 56, - 52, - 56, - 51, - 51, - 54, - 52, - 52, - 49, - 57, - 52, - 57, - 55, - 57, - 57, - 48, - 55, - 52, - 52, - 52, - 57, - 53, - 51, - 49, - 50, - 50, - 53, - 49, - 55, - 53, - 53, - 53, - 55, - 53, - 52, - 56, - 48, - 49, - 51, - 50, - 48, - 52, - 55, - 51, - 57, - 48, - 51, - 56, - 52, - 55, - 52, - 52, - 49, - 54, - 51, - 55, - 54, - 55, - 56, - 49, - 53, - 51, - 57, - 56, - 49, - 56, - 51, - 50, - 48, - 102, - 105, - 101, - 108, - 100, - 34, - 44, - 34, - 116, - 97, - 103, - 34, - 58, - 34, - 49, - 55, - 49, - 56, - 54, - 48, - 57, - 54, - 55, - 50, - 55, - 56, - 55, - 55, - 53, - 56, - 55, - 57, - 53, - 52, - 48, - 51, - 55, - 49, - 56, - 48, - 56, - 51, - 51, - 50, - 55, - 55, - 52, - 54, - 55, - 52, - 57, - 54, - 56, - 51, - 57, - 51, - 55, - 50, - 51, - 57, - 56, - 55, - 57, - 54, - 53, - 57, - 48, - 48, - 53, - 49, - 53, - 50, - 49, - 56, - 55, - 54, - 49, - 48, - 55, - 51, - 55, - 52, - 57, - 48, - 54, - 56, - 56, - 50, - 49, - 48, - 102, - 105, - 101, - 108, - 100, - 34, - 125, - 93, - 44, - 34, - 111, - 117, - 116, - 112, - 117, - 116, - 115, - 34, - 58, - 91, - 123, - 34, - 116, - 121, - 112, - 101, - 34, - 58, - 34, - 114, - 101, - 99, - 111, - 114, - 100, - 34, - 44, - 34, - 105, - 100, - 34, - 58, - 34, - 54, - 48, - 50, - 57, - 57, - 50, - 55, - 55, - 53, - 52, - 50, - 48, - 50, - 56, - 51, - 55, - 56, - 57, - 48, - 50, - 54, - 57, - 50, - 50, - 51, - 56, - 55, - 53, - 50, - 55, - 57, - 50, - 52, - 54, - 53, - 48, - 51, - 56, - 56, - 54, - 53, - 54, - 56, - 49, - 48, - 55, - 50, - 52, - 48, - 53, - 52, - 49, - 55, - 53, - 51, - 56, - 49, - 48, - 54, - 50, - 52, - 53, - 51, - 48, - 57, - 51, - 49, - 48, - 55, - 51, - 50, - 52, - 55, - 51, - 50, - 53, - 102, - 105, - 101, - 108, - 100, - 34, - 44, - 34, - 99, - 104, - 101, - 99, - 107, - 115, - 117, - 109, - 34, - 58, - 34, - 55, - 56, - 53, - 51, - 52, - 48, - 50, - 53, - 51, - 56, - 55, - 55, - 50, - 51, - 57, - 49, - 56, - 51, - 49, - 49, - 54, - 49, - 48, - 52, - 53, - 55, - 53, - 49, - 56, - 54, - 57, - 49, - 54, - 52, - 49, - 48, - 49, - 48, - 52, - 49, - 56, - 56, - 52, - 53, - 48, - 50, - 48, - 54, - 56, - 52, - 53, - 56, - 48, - 54, - 49, - 56, - 52, - 53, - 50, - 48, - 55, - 57, - 55, - 51, - 50, - 51, - 52, - 54, - 49, - 56, - 54, - 53, - 50, - 54, - 55, - 57, - 102, - 105, - 101, - 108, - 100, - 34, - 44, - 34, - 118, - 97, - 108, - 117, - 101, - 34, - 58, - 34, - 114, - 101, - 99, - 111, - 114, - 100, - 49, - 113, - 121, - 113, - 115, - 112, - 48, - 97, - 112, - 97, - 116, - 101, - 48, - 56, - 114, - 48, - 108, - 101, - 55, - 120, - 110, - 121, - 112, - 115, - 100, - 56, - 56, - 54, - 112, - 54, - 121, - 50, - 106, - 100, - 119, - 110, - 114, - 100, - 122, - 115, - 114, - 100, - 99, - 53, - 57, - 48, - 122, - 117, - 109, - 108, - 108, - 109, - 118, - 56, - 53, - 115, - 121, - 113, - 121, - 114, - 120, - 122, - 109, - 116, - 48, - 119, - 52, - 104, - 56, - 103, - 103, - 99, - 113, - 113, - 103, - 113, - 115, - 113, - 97, - 99, - 103, - 50, - 112, - 118, - 113, - 48, - 108, - 52, - 102, - 112, - 120, - 101, - 104, - 48, - 101, - 109, - 99, - 53, - 107, - 106, - 116, - 55, - 101, - 121, - 52, - 107, - 112, - 55, - 100, - 120, - 54, - 99, - 121, - 104, - 115, - 107, - 55, - 116, - 57, - 55, - 120, - 120, - 108, - 107, - 102, - 106, - 51, - 113, - 102, - 99, - 112, - 104, - 118, - 116, - 50, - 107, - 115, - 106, - 55, - 57, - 102, - 113, - 56, - 101, - 56, - 104, - 119, - 120, - 99, - 108, - 57, - 120, - 55, - 110, - 55, - 120, - 104, - 53, - 101, - 116, - 115, - 112, - 99, - 106, - 108, - 122, - 122, - 106, - 104, - 48, - 113, - 117, - 51, - 112, - 52, - 115, - 55, - 114, - 103, - 120, - 115, - 54, - 48, - 116, - 114, - 118, - 115, - 34, - 125, - 44, - 123, - 34, - 116, - 121, - 112, - 101, - 34, - 58, - 34, - 114, - 101, - 99, - 111, - 114, - 100, - 34, - 44, - 34, - 105, - 100, - 34, - 58, - 34, - 53, - 50, - 52, - 53, - 54, - 57, - 57, - 57, - 54, - 55, - 56, - 55, - 52, - 54, - 54, - 48, - 50, - 52, - 54, - 49, - 51, - 49, - 55, - 57, - 53, - 48, - 54, - 51, - 53, - 50, - 52, - 48, - 51, - 56, - 53, - 54, - 49, - 55, - 50, - 56, - 57, - 49, - 56, - 51, - 57, - 49, - 53, - 57, - 56, - 57, - 55, - 52, - 51, - 48, - 53, - 57, - 55, - 49, - 52, - 54, - 56, - 56, - 52, - 56, - 52, - 53, - 50, - 55, - 55, - 50, - 54, - 53, - 56, - 51, - 54, - 53, - 102, - 105, - 101, - 108, - 100, - 34, - 44, - 34, - 99, - 104, - 101, - 99, - 107, - 115, - 117, - 109, - 34, - 58, - 34, - 49, - 56, - 54, - 57, - 51, - 50, - 57, - 57, - 56, - 55, - 49, - 55, - 57, - 55, - 54, - 53, - 50, - 57, - 52, - 51, - 53, - 55, - 48, - 57, - 52, - 56, - 51, - 54, - 51, - 57, - 53, - 54, - 55, - 51, - 48, - 53, - 52, - 51, - 54, - 57, - 49, - 57, - 50, - 57, - 54, - 50, - 57, - 49, - 57, - 50, - 49, - 54, - 51, - 53, - 50, - 53, - 48, - 55, - 55, - 53, - 54, - 50, - 55, - 57, - 51, - 56, - 53, - 51, - 55, - 56, - 56, - 51, - 56, - 57, - 57, - 56, - 102, - 105, - 101, - 108, - 100, - 34, - 44, - 34, - 118, - 97, - 108, - 117, - 101, - 34, - 58, - 34, - 114, - 101, - 99, - 111, - 114, - 100, - 49, - 113, - 121, - 113, - 115, - 112, - 99, - 118, - 115, - 52, - 110, - 51, - 50, - 57, - 52, - 119, - 106, - 120, - 121, - 55, - 103, - 51, - 107, - 108, - 115, - 117, - 53, - 114, - 108, - 50, - 57, - 106, - 51, - 116, - 113, - 57, - 53, - 100, - 102, - 118, - 54, - 57, - 55, - 122, - 112, - 119, - 119, - 110, - 109, - 122, - 57, - 97, - 108, - 48, - 107, - 103, - 122, - 113, - 121, - 114, - 120, - 122, - 109, - 116, - 48, - 119, - 52, - 104, - 56, - 103, - 103, - 99, - 113, - 113, - 103, - 113, - 115, - 112, - 100, - 114, - 118, - 50, - 112, - 114, - 50, - 109, - 117, - 108, - 48, - 113, - 57, - 121, - 110, - 48, - 112, - 102, - 52, - 48, - 110, - 112, - 117, - 110, - 122, - 109, - 100, - 97, - 99, - 52, - 52, - 97, - 117, - 113, - 121, - 54, - 112, - 117, - 55, - 116, - 114, - 107, - 52, - 56, - 103, - 110, - 57, - 120, - 113, - 113, - 57, - 119, - 117, - 54, - 99, - 115, - 104, - 53, - 120, - 51, - 50, - 55, - 53, - 110, - 114, - 55, - 120, - 115, - 106, - 100, - 119, - 101, - 106, - 51, - 119, - 97, - 50, - 116, - 103, - 115, - 104, - 108, - 115, - 118, - 53, - 117, - 107, - 106, - 119, - 55, - 55, - 57, - 103, - 119, - 52, - 117, - 50, - 118, - 107, - 100, - 103, - 122, - 115, - 112, - 117, - 115, - 116, - 118, - 116, - 34, - 125, - 93, - 44, - 34, - 116, - 112, - 107, - 34, - 58, - 34, - 55, - 54, - 54, - 55, - 52, - 55, - 52, - 55, - 55, - 51, - 52, - 49, - 50, - 54, - 50, - 53, - 53, - 53, - 53, - 49, - 55, - 48, - 53, - 57, - 49, - 53, - 52, - 55, - 57, - 56, - 52, - 48, - 50, - 50, - 51, - 54, - 56, - 54, - 51, - 52, - 56, - 56, - 54, - 52, - 48, - 57, - 50, - 53, - 49, - 55, - 54, - 56, - 56, - 53, - 56, - 53, - 57, - 56, - 55, - 57, - 49, - 55, - 52, - 54, - 49, - 49, - 49, - 54, - 51, - 50, - 53, - 57, - 49, - 57, - 55, - 54, - 103, - 114, - 111, - 117, - 112, - 34, - 44, - 34, - 116, - 99, - 109, - 34, - 58, - 34, - 52, - 55, - 50, - 50, - 52, - 56, - 56, - 56, - 56, - 51, - 55, - 49, - 55, - 48, - 51, - 48, - 48, - 53, - 49, - 49, - 55, - 52, - 51, - 56, - 48, - 55, - 49, - 53, - 56, - 48, - 51, - 49, - 49, - 50, - 48, - 53, - 48, - 53, - 50, - 55, - 50, - 57, - 57, - 57, - 49, - 57, - 57, - 52, - 55, - 50, - 56, - 54, - 52, - 48, - 55, - 52, - 51, - 53, - 56, - 48, - 48, - 51, - 50, - 50, - 56, - 57, - 57, - 51, - 55, - 56, - 53, - 53, - 51, - 54, - 53, - 55, - 102, - 105, - 101, - 108, - 100, - 34, - 125, - 44, - 123, - 34, - 105, - 100, - 34, - 58, - 34, - 97, - 117, - 49, - 109, - 99, - 104, - 121, - 51, - 109, - 108, - 116, - 119, - 114, - 112, - 118, - 97, - 114, - 102, - 57, - 57, - 50, - 121, - 110, - 121, - 106, - 97, - 121, - 108, - 113, - 119, - 102, - 50, - 122, - 120, - 52, - 52, - 104, - 101, - 54, - 120, - 101, - 121, - 104, - 99, - 120, - 113, - 119, - 50, - 119, - 99, - 120, - 99, - 103, - 103, - 115, - 107, - 50, - 120, - 122, - 117, - 51, - 34, - 44, - 34, - 112, - 114, - 111, - 103, - 114, - 97, - 109, - 34, - 58, - 34, - 102, - 101, - 101, - 115, - 46, - 97, - 108, - 101, - 111, - 34, - 44, - 34, - 102, - 117, - 110, - 99, - 116, - 105, - 111, - 110, - 34, - 58, - 34, - 102, - 101, - 101, - 115, - 34, - 44, - 34, - 105, - 110, - 112, - 117, - 116, - 115, - 34, - 58, - 91, - 123, - 34, - 116, - 121, - 112, - 101, - 34, - 58, - 34, - 112, - 117, - 98, - 108, - 105, - 99, - 34, - 44, - 34, - 105, - 100, - 34, - 58, - 34, - 55, - 53, - 50, - 50, - 56, - 56, - 51, - 57, - 54, - 57, - 52, - 50, - 56, - 55, - 54, - 52, - 48, - 49, - 48, - 55, - 53, - 53, - 57, - 57, - 54, - 57, - 56, - 52, - 48, - 53, - 55, - 54, - 50, - 55, - 51, - 57, - 52, - 53, - 50, - 57, - 51, - 52, - 55, - 52, - 56, - 48, - 57, - 57, - 50, - 55, - 50, - 57, - 49, - 57, - 52, - 52, - 54, - 56, - 49, - 56, - 48, - 51, - 57, - 57, - 49, - 49, - 50, - 50, - 50, - 48, - 53, - 51, - 53, - 51, - 52, - 52, - 102, - 105, - 101, - 108, - 100, - 34, - 44, - 34, - 118, - 97, - 108, - 117, - 101, - 34, - 58, - 34, - 49, - 117, - 54, - 52, - 34, - 125, - 93, - 44, - 34, - 111, - 117, - 116, - 112, - 117, - 116, - 115, - 34, - 58, - 91, - 123, - 34, - 116, - 121, - 112, - 101, - 34, - 58, - 34, - 102, - 117, - 116, - 117, - 114, - 101, - 34, - 44, - 34, - 105, - 100, - 34, - 58, - 34, - 54, - 55, - 50, - 55, - 57, - 56, - 52, - 56, - 52, - 57, - 50, - 56, - 49, - 49, - 49, - 52, - 55, - 48, - 57, - 53, - 55, - 53, - 54, - 50, - 50, - 54, - 50, - 49, - 54, - 50, - 56, - 50, - 52, - 55, - 49, - 55, - 49, - 56, - 51, - 52, - 52, - 49, - 50, - 54, - 56, - 51, - 53, - 56, - 48, - 48, - 53, - 56, - 55, - 50, - 56, - 57, - 49, - 48, - 52, - 54, - 49, - 48, - 52, - 57, - 56, - 49, - 52, - 54, - 54, - 50, - 51, - 53, - 56, - 49, - 51, - 55, - 102, - 105, - 101, - 108, - 100, - 34, - 44, - 34, - 118, - 97, - 108, - 117, - 101, - 34, - 58, - 34, - 123, - 92, - 110, - 32, - 32, - 112, - 114, - 111, - 103, - 114, - 97, - 109, - 95, - 105, - 100, - 58, - 32, - 102, - 101, - 101, - 115, - 46, - 97, - 108, - 101, - 111, - 44, - 92, - 110, - 32, - 32, - 102, - 117, - 110, - 99, - 116, - 105, - 111, - 110, - 95, - 110, - 97, - 109, - 101, - 58, - 32, - 102, - 101, - 101, - 115, - 44, - 92, - 110, - 32, - 32, - 97, - 114, - 103, - 117, - 109, - 101, - 110, - 116, - 115, - 58, - 32, - 91, - 92, - 110, - 32, - 32, - 32, - 32, - 97, - 108, - 101, - 111, - 49, - 121, - 50, - 107, - 101, - 52, - 56, - 115, - 113, - 121, - 97, - 115, - 48, - 117, - 55, - 118, - 112, - 52, - 115, - 112, - 115, - 112, - 110, - 120, - 117, - 115, - 100, - 113, - 55, - 110, - 115, - 48, - 120, - 110, - 118, - 118, - 114, - 102, - 52, - 106, - 117, - 117, - 118, - 114, - 100, - 115, - 107, - 107, - 54, - 52, - 115, - 122, - 115, - 119, - 97, - 104, - 106, - 53, - 114, - 44, - 92, - 110, - 32, - 32, - 32, - 32, - 49, - 117, - 54, - 52, - 92, - 110, - 32, - 32, - 93, - 92, - 110, - 125, - 34, - 125, - 93, - 44, - 34, - 116, - 112, - 107, - 34, - 58, - 34, - 51, - 55, - 50, - 56, - 56, - 55, - 55, - 57, - 51, - 51, - 51, - 49, - 49, - 51, - 52, - 52, - 51, - 49, - 57, - 52, - 48, - 54, - 56, - 57, - 57, - 52, - 51, - 56, - 55, - 57, - 55, - 55, - 53, - 57, - 53, - 57, - 49, - 56, - 55, - 54, - 57, - 53, - 50, - 49, - 51, - 57, - 49, - 51, - 55, - 48, - 49, - 56, - 50, - 56, - 48, - 49, - 55, - 55, - 57, - 56, - 57, - 56, - 52, - 48, - 56, - 54, - 57, - 53, - 54, - 55, - 54, - 53, - 52, - 51, - 51, - 52, - 103, - 114, - 111, - 117, - 112, - 34, - 44, - 34, - 116, - 99, - 109, - 34, - 58, - 34, - 52, - 55, - 56, - 57, - 57, - 51, - 49, - 51, - 54, - 51, - 48, - 51, - 57, - 48, - 52, - 55, - 51, - 51, - 49, - 50, - 48, - 53, - 55, - 50, - 49, - 49, - 57, - 48, - 53, - 48, - 55, - 49, - 51, - 57, - 52, - 54, - 53, - 50, - 55, - 49, - 51, - 52, - 52, - 52, - 49, - 56, - 50, - 53, - 52, - 56, - 48, - 48, - 51, - 55, - 49, - 51, - 53, - 51, - 52, - 54, - 49, - 51, - 48, - 57, - 57, - 48, - 50, - 54, - 57, - 55, - 55, - 51, - 55, - 52, - 51, - 102, - 105, - 101, - 108, - 100, - 34, - 125, - 44, - 123, - 34, - 105, - 100, - 34, - 58, - 34, - 97, - 117, - 49, - 119, - 102, - 121, - 116, - 108, - 112, - 100, - 100, - 107, - 102, - 56, - 99, - 57, - 51, - 53, - 118, - 50, - 114, - 100, - 122, - 106, - 113, - 115, - 100, - 56, - 48, - 117, - 108, - 103, - 100, - 107, - 99, - 108, - 54, - 50, - 51, - 112, - 102, - 119, - 101, - 50, - 101, - 50, - 120, - 102, - 116, - 97, - 121, - 48, - 103, - 103, - 115, - 110, - 101, - 103, - 121, - 120, - 104, - 34, - 44, - 34, - 112, - 114, - 111, - 103, - 114, - 97, - 109, - 34, - 58, - 34, - 109, - 117, - 108, - 116, - 105, - 95, - 116, - 120, - 110, - 95, - 116, - 49, - 46, - 97, - 108, - 101, - 111, - 34, - 44, - 34, - 102, - 117, - 110, - 99, - 116, - 105, - 111, - 110, - 34, - 58, - 34, - 116, - 114, - 97, - 110, - 115, - 102, - 101, - 114, - 95, - 112, - 114, - 105, - 118, - 97, - 116, - 101, - 34, - 44, - 34, - 105, - 110, - 112, - 117, - 116, - 115, - 34, - 58, - 91, - 123, - 34, - 116, - 121, - 112, - 101, - 34, - 58, - 34, - 112, - 114, - 105, - 118, - 97, - 116, - 101, - 34, - 44, - 34, - 105, - 100, - 34, - 58, - 34, - 49, - 52, - 54, - 54, - 50, - 55, - 52, - 56, - 51, - 55, - 48, - 54, - 54, - 51, - 51, - 50, - 50, - 57, - 52, - 52, - 54, - 51, - 48, - 50, - 49, - 50, - 52, - 56, - 52, - 52, - 48, - 54, - 52, - 50, - 57, - 54, - 55, - 50, - 55, - 57, - 49, - 48, - 49, - 48, - 53, - 52, - 57, - 52, - 50, - 52, - 56, - 55, - 57, - 56, - 50, - 55, - 54, - 52, - 52, - 52, - 50, - 51, - 55, - 53, - 50, - 53, - 53, - 53, - 50, - 51, - 48, - 52, - 53, - 54, - 57, - 57, - 102, - 105, - 101, - 108, - 100, - 34, - 44, - 34, - 118, - 97, - 108, - 117, - 101, - 34, - 58, - 34, - 99, - 105, - 112, - 104, - 101, - 114, - 116, - 101, - 120, - 116, - 49, - 113, - 103, - 113, - 116, - 57, - 52, - 103, - 53, - 116, - 99, - 108, - 101, - 112, - 100, - 102, - 114, - 110, - 110, - 109, - 55, - 53, - 56, - 110, - 118, - 57, - 54, - 110, - 101, - 97, - 50, - 104, - 55, - 103, - 116, - 50, - 107, - 121, - 122, - 115, - 106, - 101, - 118, - 50, - 51, - 106, - 54, - 99, - 119, - 100, - 102, - 53, - 48, - 103, - 122, - 115, - 112, - 50, - 57, - 97, - 100, - 100, - 114, - 54, - 56, - 119, - 108, - 119, - 100, - 55, - 121, - 100, - 56, - 101, - 97, - 122, - 53, - 109, - 51, - 104, - 117, - 110, - 119, - 116, - 108, - 113, - 51, - 106, - 116, - 99, - 54, - 56, - 120, - 101, - 56, - 100, - 53, - 97, - 107, - 99, - 101, - 97, - 114, - 51, - 118, - 122, - 103, - 110, - 52, - 102, - 99, - 55, - 122, - 34, - 125, - 44, - 123, - 34, - 116, - 121, - 112, - 101, - 34, - 58, - 34, - 112, - 114, - 105, - 118, - 97, - 116, - 101, - 34, - 44, - 34, - 105, - 100, - 34, - 58, - 34, - 53, - 52, - 48, - 52, - 49, - 54, - 49, - 49, - 51, - 56, - 49, - 50, - 55, - 51, - 51, - 49, - 52, - 49, - 57, - 55, - 51, - 50, - 57, - 57, - 54, - 57, - 52, - 53, - 50, - 48, - 50, - 52, - 49, - 52, - 57, - 56, - 50, - 50, - 56, - 54, - 51, - 55, - 49, - 49, - 53, - 54, - 53, - 54, - 57, - 56, - 52, - 57, - 54, - 51, - 48, - 52, - 55, - 49, - 48, - 50, - 52, - 53, - 50, - 52, - 48, - 55, - 54, - 53, - 48, - 57, - 51, - 57, - 56, - 55, - 50, - 52, - 102, - 105, - 101, - 108, - 100, - 34, - 44, - 34, - 118, - 97, - 108, - 117, - 101, - 34, - 58, - 34, - 99, - 105, - 112, - 104, - 101, - 114, - 116, - 101, - 120, - 116, - 49, - 113, - 121, - 113, - 100, - 50, - 108, - 119, - 120, - 52, - 120, - 101, - 117, - 110, - 56, - 100, - 97, - 53, - 119, - 116, - 57, - 121, - 109, - 108, - 55, - 112, - 120, - 103, - 56, - 104, - 118, - 116, - 112, - 104, - 102, - 102, - 106, - 108, - 120, - 99, - 99, - 114, - 107, - 100, - 55, - 101, - 101, - 112, - 51, - 103, - 110, - 97, - 99, - 54, - 121, - 103, - 119, - 50, - 99, - 116, - 121, - 103, - 34, - 125, - 44, - 123, - 34, - 116, - 121, - 112, - 101, - 34, - 58, - 34, - 112, - 117, - 98, - 108, - 105, - 99, - 34, - 44, - 34, - 105, - 100, - 34, - 58, - 34, - 52, - 55, - 48, - 50, - 48, - 53, - 53, - 51, - 53, - 57, - 52, - 51, - 56, - 57, - 48, - 50, - 55, - 53, - 53, - 51, - 49, - 49, - 52, - 49, - 53, - 54, - 53, - 57, - 53, - 51, - 50, - 49, - 51, - 52, - 51, - 48, - 52, - 54, - 57, - 48, - 54, - 51, - 56, - 49, - 51, - 48, - 52, - 49, - 48, - 56, - 53, - 54, - 55, - 54, - 57, - 55, - 56, - 48, - 51, - 49, - 55, - 55, - 49, - 56, - 53, - 53, - 51, - 49, - 54, - 50, - 57, - 50, - 51, - 56, - 52, - 53, - 102, - 105, - 101, - 108, - 100, - 34, - 44, - 34, - 118, - 97, - 108, - 117, - 101, - 34, - 58, - 34, - 50, - 117, - 54, - 52, - 34, - 125, - 93, - 44, - 34, - 111, - 117, - 116, - 112, - 117, - 116, - 115, - 34, - 58, - 91, - 123, - 34, - 116, - 121, - 112, - 101, - 34, - 58, - 34, - 114, - 101, - 99, - 111, - 114, - 100, - 34, - 44, - 34, - 105, - 100, - 34, - 58, - 34, - 52, - 55, - 54, - 54, - 50, - 49, - 53, - 51, - 50, - 53, - 51, - 50, - 52, - 55, - 50, - 57, - 57, - 52, - 52, - 50, - 54, - 50, - 56, - 49, - 54, - 57, - 49, - 49, - 57, - 50, - 51, - 56, - 48, - 50, - 49, - 51, - 52, - 51, - 48, - 54, - 49, - 49, - 51, - 51, - 54, - 54, - 52, - 56, - 51, - 48, - 56, - 50, - 55, - 51, - 54, - 52, - 54, - 54, - 54, - 55, - 48, - 57, - 53, - 55, - 55, - 51, - 50, - 53, - 48, - 53, - 55, - 54, - 54, - 49, - 49, - 53, - 102, - 105, - 101, - 108, - 100, - 34, - 44, - 34, - 99, - 104, - 101, - 99, - 107, - 115, - 117, - 109, - 34, - 58, - 34, - 51, - 50, - 54, - 51, - 48, - 55, - 49, - 49, - 50, - 51, - 49, - 48, - 53, - 53, - 49, - 57, - 54, - 56, - 53, - 57, - 50, - 51, - 49, - 49, - 49, - 49, - 50, - 53, - 54, - 51, - 55, - 52, - 51, - 57, - 51, - 51, - 48, - 55, - 53, - 50, - 52, - 48, - 50, - 51, - 48, - 56, - 57, - 57, - 55, - 53, - 50, - 48, - 55, - 49, - 55, - 53, - 51, - 56, - 48, - 57, - 56, - 55, - 52, - 51, - 54, - 52, - 48, - 50, - 48, - 50, - 54, - 53, - 49, - 54, - 53, - 48, - 102, - 105, - 101, - 108, - 100, - 34, - 44, - 34, - 118, - 97, - 108, - 117, - 101, - 34, - 58, - 34, - 114, - 101, - 99, - 111, - 114, - 100, - 49, - 113, - 121, - 113, - 115, - 112, - 122, - 115, - 116, - 97, - 107, - 52, - 109, - 113, - 107, - 104, - 112, - 109, - 106, - 110, - 102, - 119, - 97, - 56, - 120, - 57, - 99, - 101, - 116, - 108, - 56, - 119, - 101, - 116, - 121, - 118, - 97, - 119, - 117, - 57, - 107, - 117, - 117, - 117, - 99, - 104, - 115, - 106, - 101, - 50, - 109, - 54, - 119, - 56, - 56, - 103, - 113, - 113, - 121, - 114, - 120, - 122, - 109, - 116, - 48, - 119, - 52, - 104, - 56, - 103, - 103, - 99, - 113, - 113, - 103, - 113, - 115, - 113, - 109, - 99, - 108, - 117, - 109, - 113, - 53, - 104, - 118, - 122, - 108, - 121, - 99, - 115, - 108, - 53, - 120, - 118, - 56, - 116, - 97, - 104, - 52, - 106, - 117, - 100, - 118, - 114, - 52, - 51, - 57, - 112, - 99, - 112, - 122, - 117, - 50, - 104, - 117, - 118, - 115, - 109, - 54, - 116, - 97, - 56, - 119, - 108, - 115, - 103, - 116, - 107, - 102, - 101, - 114, - 97, - 116, - 53, - 121, - 52, - 106, - 116, - 112, - 115, - 51, - 113, - 57, - 122, - 50, - 114, - 48, - 50, - 120, - 53, - 117, - 50, - 101, - 119, - 101, - 112, - 120, - 52, - 113, - 118, - 121, - 100, - 120, - 119, - 109, - 52, - 117, - 121, - 122, - 100, - 118, - 104, - 118, - 108, - 122, - 120, - 118, - 56, - 115, - 114, - 119, - 101, - 107, - 54, - 112, - 34, - 125, - 44, - 123, - 34, - 116, - 121, - 112, - 101, - 34, - 58, - 34, - 114, - 101, - 99, - 111, - 114, - 100, - 34, - 44, - 34, - 105, - 100, - 34, - 58, - 34, - 55, - 49, - 51, - 51, - 51, - 55, - 49, - 49, - 56, - 49, - 48, - 51, - 48, - 49, - 48, - 50, - 55, - 53, - 53, - 55, - 48, - 49, - 50, - 48, - 51, - 49, - 56, - 49, - 53, - 51, - 52, - 56, - 52, - 53, - 50, - 56, - 55, - 52, - 56, - 56, - 55, - 50, - 57, - 55, - 54, - 52, - 57, - 55, - 49, - 55, - 51, - 51, - 57, - 54, - 57, - 53, - 56, - 50, - 53, - 50, - 57, - 53, - 55, - 51, - 48, - 50, - 55, - 48, - 53, - 48, - 50, - 56, - 53, - 54, - 49, - 52, - 102, - 105, - 101, - 108, - 100, - 34, - 44, - 34, - 99, - 104, - 101, - 99, - 107, - 115, - 117, - 109, - 34, - 58, - 34, - 51, - 51, - 55, - 48, - 55, - 54, - 53, - 50, - 55, - 52, - 51, - 54, - 50, - 55, - 52, - 56, - 52, - 53, - 56, - 52, - 55, - 54, - 54, - 50, - 49, - 48, - 51, - 51, - 53, - 48, - 50, - 55, - 48, - 54, - 50, - 54, - 55, - 50, - 48, - 55, - 53, - 52, - 57, - 56, - 55, - 57, - 52, - 56, - 51, - 48, - 50, - 52, - 50, - 53, - 48, - 50, - 54, - 53, - 51, - 48, - 56, - 51, - 50, - 53, - 51, - 51, - 57, - 57, - 48, - 48, - 50, - 55, - 56, - 54, - 49, - 50, - 102, - 105, - 101, - 108, - 100, - 34, - 44, - 34, - 118, - 97, - 108, - 117, - 101, - 34, - 58, - 34, - 114, - 101, - 99, - 111, - 114, - 100, - 49, - 113, - 121, - 113, - 115, - 112, - 104, - 54, - 112, - 51, - 122, - 97, - 109, - 54, - 122, - 112, - 117, - 104, - 103, - 52, - 110, - 117, - 114, - 51, - 122, - 106, - 52, - 103, - 109, - 53, - 106, - 113, - 116, - 54, - 56, - 56, - 48, - 122, - 48, - 112, - 99, - 57, - 51, - 113, - 109, - 52, - 116, - 117, - 113, - 50, - 108, - 117, - 107, - 121, - 115, - 103, - 119, - 113, - 121, - 114, - 120, - 122, - 109, - 116, - 48, - 119, - 52, - 104, - 56, - 103, - 103, - 99, - 113, - 113, - 103, - 113, - 115, - 113, - 51, - 121, - 121, - 48, - 119, - 114, - 108, - 51, - 104, - 99, - 53, - 50, - 108, - 103, - 57, - 51, - 110, - 122, - 106, - 103, - 50, - 103, - 119, - 53, - 115, - 55, - 118, - 101, - 52, - 102, - 52, - 110, - 112, - 56, - 109, - 122, - 51, - 120, - 50, - 101, - 53, - 100, - 100, - 116, - 103, - 53, - 120, - 54, - 113, - 103, - 57, - 97, - 52, - 52, - 55, - 122, - 57, - 114, - 100, - 55, - 57, - 52, - 102, - 56, - 119, - 120, - 106, - 106, - 52, - 119, - 113, - 53, - 55, - 121, - 113, - 106, - 117, - 57, - 50, - 117, - 116, - 104, - 118, - 56, - 113, - 109, - 102, - 52, - 53, - 101, - 122, - 52, - 107, - 56, - 118, - 97, - 115, - 50, - 107, - 112, - 103, - 114, - 115, - 50, - 120, - 48, - 104, - 101, - 101, - 34, - 125, - 44, - 123, - 34, - 116, - 121, - 112, - 101, - 34, - 58, - 34, - 102, - 117, - 116, - 117, - 114, - 101, - 34, - 44, - 34, - 105, - 100, - 34, - 58, - 34, - 56, - 49, - 57, - 53, - 55, - 48, - 57, - 49, - 52, - 52, - 52, - 52, - 53, - 54, - 56, - 55, - 53, - 55, - 51, - 53, - 57, - 57, - 50, - 51, - 51, - 52, - 52, - 49, - 53, - 56, - 57, - 49, - 53, - 55, - 56, - 49, - 52, - 54, - 55, - 51, - 57, - 54, - 54, - 57, - 54, - 52, - 52, - 48, - 48, - 49, - 50, - 54, - 52, - 54, - 53, - 50, - 55, - 57, - 49, - 49, - 53, - 56, - 51, - 48, - 50, - 54, - 52, - 49, - 57, - 55, - 51, - 48, - 49, - 54, - 57, - 55, - 102, - 105, - 101, - 108, - 100, - 34, - 44, - 34, - 118, - 97, - 108, - 117, - 101, - 34, - 58, - 34, - 123, - 92, - 110, - 32, - 32, - 112, - 114, - 111, - 103, - 114, - 97, - 109, - 95, - 105, - 100, - 58, - 32, - 109, - 117, - 108, - 116, - 105, - 95, - 116, - 120, - 110, - 95, - 116, - 49, - 46, - 97, - 108, - 101, - 111, - 44, - 92, - 110, - 32, - 32, - 102, - 117, - 110, - 99, - 116, - 105, - 111, - 110, - 95, - 110, - 97, - 109, - 101, - 58, - 32, - 116, - 114, - 97, - 110, - 115, - 102, - 101, - 114, - 95, - 112, - 114, - 105, - 118, - 97, - 116, - 101, - 44, - 92, - 110, - 32, - 32, - 97, - 114, - 103, - 117, - 109, - 101, - 110, - 116, - 115, - 58, - 32, - 91, - 92, - 110, - 32, - 32, - 32, - 32, - 123, - 92, - 110, - 32, - 32, - 32, - 32, - 32, - 32, - 112, - 114, - 111, - 103, - 114, - 97, - 109, - 95, - 105, - 100, - 58, - 32, - 104, - 101, - 108, - 112, - 101, - 114, - 46, - 97, - 108, - 101, - 111, - 44, - 92, - 110, - 32, - 32, - 32, - 32, - 32, - 32, - 102, - 117, - 110, - 99, - 116, - 105, - 111, - 110, - 95, - 110, - 97, - 109, - 101, - 58, - 32, - 118, - 101, - 114, - 105, - 102, - 121, - 95, - 98, - 97, - 108, - 97, - 110, - 99, - 101, - 44, - 92, - 110, - 32, - 32, - 32, - 32, - 32, - 32, - 97, - 114, - 103, - 117, - 109, - 101, - 110, - 116, - 115, - 58, - 32, - 91, - 92, - 110, - 32, - 32, - 32, - 32, - 32, - 32, - 32, - 32, - 97, - 108, - 101, - 111, - 49, - 118, - 97, - 48, - 104, - 122, - 114, - 99, - 115, - 106, - 53, - 54, - 57, - 103, - 122, - 48, - 103, - 100, - 48, - 109, - 118, - 117, - 101, - 55, - 120, - 107, - 53, - 52, - 118, - 107, - 117, - 54, - 50, - 54, - 110, - 115, - 109, - 118, - 108, - 56, - 54, - 115, - 55, - 106, - 52, - 57, - 48, - 120, - 55, - 121, - 117, - 112, - 113, - 56, - 57, - 108, - 56, - 50, - 122, - 92, - 110, - 32, - 32, - 32, - 32, - 32, - 32, - 93, - 92, - 110, - 32, - 32, - 32, - 32, - 125, - 44, - 92, - 110, - 32, - 32, - 32, - 32, - 123, - 92, - 110, - 32, - 32, - 32, - 32, - 32, - 32, - 112, - 114, - 111, - 103, - 114, - 97, - 109, - 95, - 105, - 100, - 58, - 32, - 102, - 101, - 101, - 115, - 46, - 97, - 108, - 101, - 111, - 44, - 92, - 110, - 32, - 32, - 32, - 32, - 32, - 32, - 102, - 117, - 110, - 99, - 116, - 105, - 111, - 110, - 95, - 110, - 97, - 109, - 101, - 58, - 32, - 102, - 101, - 101, - 115, - 44, - 92, - 110, - 32, - 32, - 32, - 32, - 32, - 32, - 97, - 114, - 103, - 117, - 109, - 101, - 110, - 116, - 115, - 58, - 32, - 91, - 92, - 110, - 32, - 32, - 32, - 32, - 32, - 32, - 32, - 32, - 97, - 108, - 101, - 111, - 49, - 121, - 50, - 107, - 101, - 52, - 56, - 115, - 113, - 121, - 97, - 115, - 48, - 117, - 55, - 118, - 112, - 52, - 115, - 112, - 115, - 112, - 110, - 120, - 117, - 115, - 100, - 113, - 55, - 110, - 115, - 48, - 120, - 110, - 118, - 118, - 114, - 102, - 52, - 106, - 117, - 117, - 118, - 114, - 100, - 115, - 107, - 107, - 54, - 52, - 115, - 122, - 115, - 119, - 97, - 104, - 106, - 53, - 114, - 44, - 92, - 110, - 32, - 32, - 32, - 32, - 32, - 32, - 32, - 32, - 49, - 117, - 54, - 52, - 92, - 110, - 32, - 32, - 32, - 32, - 32, - 32, - 93, - 92, - 110, - 32, - 32, - 32, - 32, - 125, - 92, - 110, - 32, - 32, - 92, - 110, - 32, - 32, - 93, - 92, - 110, - 125, - 34, - 125, - 93, - 44, - 34, - 116, - 112, - 107, - 34, - 58, - 34, - 49, - 57, - 57, - 54, - 56, - 51, - 52, - 57, - 54, - 55, - 50, - 57, - 48, - 50, - 50, - 52, - 53, - 49, - 54, - 50, - 55, - 56, - 56, - 54, - 49, - 56, - 48, - 56, - 53, - 48, - 56, - 53, - 52, - 51, - 49, - 57, - 50, - 48, - 57, - 56, - 57, - 53, - 53, - 56, - 56, - 48, - 57, - 56, - 56, - 55, - 50, - 55, - 54, - 55, - 52, - 49, - 57, - 57, - 55, - 57, - 51, - 50, - 56, - 53, - 52, - 49, - 53, - 54, - 50, - 55, - 57, - 54, - 51, - 49, - 50, - 57, - 103, - 114, - 111, - 117, - 112, - 34, - 44, - 34, - 116, - 99, - 109, - 34, - 58, - 34, - 52, - 49, - 56, - 52, - 49, - 48, - 50, - 49, - 57, - 53, - 48, - 57, - 49, - 54, - 57, - 49, - 56, - 50, - 48, - 56, - 49, - 54, - 54, - 57, - 48, - 49, - 52, - 57, - 48, - 52, - 54, - 56, - 54, - 54, - 55, - 48, - 53, - 56, - 56, - 48, - 55, - 55, - 57, - 56, - 52, - 48, - 53, - 55, - 50, - 52, - 50, - 53, - 54, - 56, - 50, - 50, - 50, - 53, - 56, - 50, - 48, - 53, - 49, - 53, - 48, - 53, - 48, - 54, - 50, - 49, - 51, - 48, - 56, - 56, - 50, - 48, - 102, - 105, - 101, - 108, - 100, - 34, - 125, - 93, - 125 - ], - "ask_id": 1 -} \ No newline at end of file +{} \ No newline at end of file diff --git a/integration_checks/Cargo.toml b/integration_checks/Cargo.toml index 732f8db..7e6060f 100644 --- a/integration_checks/Cargo.toml +++ b/integration_checks/Cargo.toml @@ -6,7 +6,9 @@ edition = "2021" [dependencies] clap = "4.5.11" generator ={ path = "../generator", package = "generator" } -tokio = { version = "1.16.1", features = ["full"] } ivs ={ path = "../ivs", package = "ivs" } +matching_engine = { path = "../matching_engine", package = "matching_engine" } +reqwest = { version = "0.12.4", features = ["json"] } serde = { version = "1.0", features = ["derive"] } serde_json="1.0" +tokio = { version = "1.16.1", features = ["full"] } diff --git a/integration_checks/src/main.rs b/integration_checks/src/main.rs index aa2c06c..6da50c9 100644 --- a/integration_checks/src/main.rs +++ b/integration_checks/src/main.rs @@ -1,4 +1,5 @@ use clap::{arg, Command}; +use reqwest::StatusCode; use serde::de::DeserializeOwned; use std::{error::Error, fmt::Debug, str::FromStr}; @@ -7,6 +8,7 @@ use std::{error::Error, fmt::Debug, str::FromStr}; enum ToolType { Prover, Ivs, + MatchingEngine, } impl FromStr for ToolType { @@ -16,6 +18,7 @@ impl FromStr for ToolType { match s.to_lowercase().as_str() { "prover" => Ok(ToolType::Prover), "ivs" => Ok(ToolType::Ivs), + "matching_engine" => Ok(ToolType::MatchingEngine), _ => Err("Invalid type. Must be 'prover' or 'ivs'.".into()), } } @@ -29,7 +32,7 @@ async fn main() -> Result<(), Box> { .about("A CLI tool that takes checks whether kalypso executables are built correctly") .arg(arg!([url] "Sets the URL to use").required(true)) .arg( - arg!([type] "Sets the type (prover or ivs)") + arg!([type] "Sets the type (matching_engine, prover or ivs)") .required(true) .value_parser(parse_tool_type), ) @@ -44,20 +47,64 @@ async fn main() -> Result<(), Box> { let _ = match tool_type { ToolType::Prover => test_generator_services(url).await, ToolType::Ivs => test_ivs_services(url).await, + ToolType::MatchingEngine => test_matching_engine_services(url).await, }; Ok(()) } +async fn test_matching_engine_services(matching_engine_url: &String) -> Result<(), Box> { + let matching_engine_service_checker = generator::ServiceChecker { + server_url: matching_engine_url.into(), + services: vec![ + Box::new(matching_engine::get_welcome_request::< + matching_engine::models::WelcomeResponse, + >()), + Box::new(matching_engine::get_latest_block_request::< + matching_engine::models::GetLatestBlockNumberResponse, + >()), + Box::new(matching_engine::get_status_request::< + matching_engine::models::GetStatusResponse, + >()), + Box::new(matching_engine::get_single_ask_status_request::< + matching_engine::models::GetAskStatusResponse, + >( + None, + StatusCode::OK, + "Checks a default preloaded ask".into(), + )), + Box::new(matching_engine::get_single_market_info::< + matching_engine::models::MarketInfoResponse, + >( + None, + StatusCode::OK, + "Checks a default preloaded Market".into(), + )), + Box::new(matching_engine::get_key_balance_request::< + matching_engine::models::BalanceResponse, + >()), + ], + }; + + matching_engine_service_checker.check_all_services().await; + Ok(()) +} + async fn test_generator_services(generator_url: &String) -> Result<(), Box> { let generator_service = generator::ServiceChecker { server_url: generator_url.into(), services: vec![ - Box::new(generator::get_test_request()), - Box::new(generator::get_benchmark_request()), - Box::new(generator::generate_proof_request( + Box::new(generator::get_test_request::()), + Box::new(generator::get_benchmark_request::< + generator::models::BenchmarkResponse, + >()), + Box::new(generator::generate_proof_request::< + generator::models::GenerateProofResponse, + >( create_payload("./integration_checks/proverCustomData/generate_proof_payload.json") .await, + StatusCode::OK, + "Should generate proof for this valid proof payload".into(), )), ], }; @@ -66,23 +113,81 @@ async fn test_generator_services(generator_url: &String) -> Result<(), Box Result<(), Box> { - let generator_service = generator::ServiceChecker { + let ivs_service_checker = generator::ServiceChecker { server_url: ivs_url.into(), services: vec![ - Box::new(ivs::get_test_request()), - Box::new(ivs::generate_check_input_request( - create_payload("integration_checks/ivsCustomData/check_input_payload.json").await, + Box::new(ivs::get_test_request::()), + Box::new( + ivs::generate_input_request::( + create_payload("./integration_checks/ivsCustomData/1_check_valid_input_payload.json") + .await, + StatusCode::OK, "Should check this valid payload".into() + ), + ), + Box::new( + ivs::generate_input_request::( + create_payload( + "./integration_checks/ivsCustomData/2_check_invalid_input_payload.json", + ) + .await, + StatusCode::OK, "Should check this invalid payload".into() + ), + ), + Box::new(ivs::generate_invalid_input_request::< + ivs::models::CheckInputResponse, + >( + create_payload( + "./integration_checks/ivsCustomData/3_get_attestation_for_valid_input.json", + ) + .await, + StatusCode::OK, "Should not fetch attestation for this valid input".into() )), - Box::new(ivs::generate_get_attestation_for_invalid_input_request( - create_payload("./integration_checks/ivsCustomData/get_attestation_for_invalid_inputs_payload.json").await, + Box::new(ivs::generate_invalid_input_request::< + generator::models::GenerateProofResponse, + >( + create_payload( + "./integration_checks/ivsCustomData/4_get_attestation_for_invalid_inputs_payload.json", + ) + .await, + StatusCode::OK, "Should fetch attestation for this invalid input".into() )), - Box::new(ivs::generate_check_encrypted_inputs_request( - create_payload("./integration_checks/ivsCustomData/check_encrypted_input_payload.json").await) - ), - Box::new(ivs::generate_verify_inputs_and_secrets_request(None)), + Box::new(ivs::generate_check_encrypted_inputs_request::< + ivs::models::CheckInputResponse, + >( + create_payload( + "./integration_checks/ivsCustomData/5_check_encrypted_input_payload.json", + ) + .await, + StatusCode::OK, "Should be able to check these valid encrypted inputs".into() + )), + Box::new(ivs::generate_check_encrypted_inputs_request::< + ivs::models::CheckInputResponse, + >( + create_payload( + "./integration_checks/ivsCustomData/6_check_encrypted_invalid_input_payload.json", + ) + .await, + StatusCode::OK, "Should be able to check these invalid encrypted inputs".into() + )), + Box::new(ivs::generate_verify_inputs_and_proof_request::< + ivs::models::VerifyInputAndProofResponse, + >( + create_payload( + "./integration_checks/ivsCustomData/7_verify_inputs_and_proof_payload.json", + ) + .await, + StatusCode::OK, "Should be able to verify inputs and generated proof".into() + )), + Box::new(ivs::generate_signed_inputs_and_proof_request::< + generator::models::GenerateProofResponse + >( + create_payload( + "./integration_checks/ivsCustomData/8_sign_inputs_and_proof_payload.json", + ) + .await, StatusCode::OK, "Should be able to sign proofs".into())) ], }; - generator_service.check_all_services().await; + ivs_service_checker.check_all_services().await; Ok(()) } fn parse_tool_type(value: &str) -> Result { diff --git a/ivs/Cargo.toml b/ivs/Cargo.toml index 28df433..fb32efa 100644 --- a/ivs/Cargo.toml +++ b/ivs/Cargo.toml @@ -5,6 +5,9 @@ edition = "2021" [dependencies] bindings = { path = "../bindings", package = "foundry-contracts" } -ethers ={version = "2.0.10", features = ["abigen", "ws", "rustls"] } -serde = { version = "1.0", features = ["derive"] } -generator_models = { path = "../generator", package = "generator" } \ No newline at end of file +ethers ={version = "2", features = ["abigen", "ws", "rustls"] } +generator_models = { path = "../generator", package = "generator" } +kalypso_helper = { path = "../helper", package = "helper" } +rand = "0.8" +reqwest = { version = "0.12.4", features = ["json"] } +serde = { version = "1.0", features = ["derive"] } \ No newline at end of file diff --git a/ivs/src/lib.rs b/ivs/src/lib.rs index f9d4625..fc484ec 100644 --- a/ivs/src/lib.rs +++ b/ivs/src/lib.rs @@ -1,55 +1,63 @@ pub mod models; -use ethers::core::types::U256; use generator_models::Request; use generator_models::RequestType; -use models::EncryptedInputPayload; +use reqwest::StatusCode; -pub fn get_test_request() -> Request<()> { +pub fn get_test_request() -> Request<(), R> { Request { request_type: RequestType::GET, service_endpoint: "/api/test".into(), + _marker: std::marker::PhantomData::, + expected_status_code: StatusCode::OK, + info: "Checks server reach".into(), } } -pub fn generate_check_input_request( - secret_input_paylod: Option, -) -> Request { +pub fn generate_input_request( + secret_input_paylod: Option, + expected_status_code: StatusCode, + info: String, +) -> Request { Request { request_type: RequestType::POST(secret_input_paylod.unwrap_or_else(|| { - models::SecretInputPayload { - secrets: "secret".into(), - } + generator_models::models::InputPayload::from_plain_secrets( + "public".into(), + "secrets".into(), + ) })), service_endpoint: "/api/checkInput".into(), + _marker: std::marker::PhantomData::, + expected_status_code, + info, } } -pub fn generate_get_attestation_for_invalid_input_request( - ask_payload: Option, -) -> Request { +pub fn generate_invalid_input_request( + secret_input_paylod: Option, + expected_status_code: StatusCode, + info: String, +) -> Request { Request { - request_type: RequestType::POST(ask_payload.unwrap_or_else(|| models::AskPayload { - ask: bindings::shared_types::Ask { - market_id: U256::from_dec_str("1").unwrap(), - reward: U256::from(1), - expiry: U256::from(1), - time_taken_for_proof_generation: U256::from(1), - deadline: U256::from(1), - refund_address: "0000dead0000dead0000dead0000dead0000dead".parse().unwrap(), - prover_data: vec![1, 2, 3, 4].into(), - }, - encrypted_secret: "encrypted secret".into(), - acl: "acl".into(), - ask_id: 1, + request_type: RequestType::POST(secret_input_paylod.unwrap_or_else(|| { + models::InvalidInputPayload::from_plain_secrets( + "1".into(), + "public".into(), + "secrets".into(), + ) })), service_endpoint: "/api/getAttestationForInvalidInputs".into(), + _marker: std::marker::PhantomData::, + expected_status_code, + info, } } -pub fn generate_check_encrypted_inputs_request( - encrypted_payload: Option, -) -> Request { +pub fn generate_check_encrypted_inputs_request( + encrypted_payload: Option, + expected_status_code: StatusCode, + info: String, +) -> Request { Request { request_type: RequestType::POST(encrypted_payload.unwrap_or_else(|| { models::EncryptedInputPayload { @@ -57,22 +65,51 @@ pub fn generate_check_encrypted_inputs_request( encrypted_secrets: "encrypted_secrets".into(), me_decryption_url: "matching_engine_decryption_url".into(), market_id: "market_id".into(), + public_inputs: Some(vec![1, 2, 3, 4]), } })), service_endpoint: "/api/checkEncryptedInputs".into(), + _marker: std::marker::PhantomData::, + expected_status_code, + info, + } +} + +pub fn generate_verify_inputs_and_proof_request( + verify_input_and_secret_payload: Option, + expected_status_code: StatusCode, + info: String, +) -> Request { + Request { + request_type: RequestType::POST(verify_input_and_secret_payload.unwrap_or_else(|| { + models::VerifyInputsAndProof { + proof: "proof".into(), + public_input: Some("public_inputs".into()), + private_input: vec![1, 2, 3, 4].into(), + } + })), + service_endpoint: "/api/verifyInputsAndProof".into(), + _marker: std::marker::PhantomData::, + expected_status_code, + info, } } -pub fn generate_verify_inputs_and_secrets_request( - verify_input_and_secret_payload: Option, -) -> Request { +pub fn generate_signed_inputs_and_proof_request( + verify_input_and_secret_payload: Option, + expected_status_code: StatusCode, + info: String, +) -> Request { Request { request_type: RequestType::POST(verify_input_and_secret_payload.unwrap_or_else(|| { - models::VerifyInputsAndSecrets { - public: "public".into(), - secrets: Some("secrets".into()), + models::SignInputsAndProofForNonConfidentialInput { + proof: "proof".into(), + public_input: "public_inputs".into(), } })), - service_endpoint: "/api/verifyInputsAndSecrets".into(), + service_endpoint: "/api/signInputsAndProofForNonConfidentialInputs".into(), + _marker: std::marker::PhantomData::, + expected_status_code, + info, } } diff --git a/ivs/src/models.rs b/ivs/src/models.rs index 79309a5..f3adfa0 100644 --- a/ivs/src/models.rs +++ b/ivs/src/models.rs @@ -1,29 +1,119 @@ +use ethers::types::U256; use serde::{Deserialize, Serialize}; #[derive(Serialize, Debug, Deserialize, Clone)] -pub struct SecretInputPayload { - pub secrets: String, +pub struct InvalidInputPayload { + ask_id: ethers::types::U256, + public: Vec, + secrets: Option, +} + +impl InvalidInputPayload { + pub fn only_ask_id(&self) -> U256 { + self.ask_id + } + + pub fn only_public_inputs(ask_id: U256, public: Vec) -> Self { + InvalidInputPayload { + ask_id, + public, + secrets: None, + } + } + + pub fn from_plain_secrets(ask_id: U256, public: Vec, secrets: Vec) -> Self { + InvalidInputPayload { + ask_id, + public, + secrets: Some(Secrets::PlainSecrets(secrets)), + } + } + + pub fn encrypted_secrets( + ask_id: U256, + public: Vec, + encrypted_data: Vec, + acl: Vec, + ) -> Self { + InvalidInputPayload { + ask_id, + public, + secrets: Some(Secrets::EncryptedSecrets(EncryptedSecret { + encrypted_data, + acl, + })), + } + } + + pub fn get_public(&self) -> Vec { + self.public.clone() + } + + pub fn get_plain_secrets(&self) -> Result, Box> { + match self.secrets.clone().unwrap() { + Secrets::PlainSecrets(data) => Ok(data), + Secrets::EncryptedSecrets(_) => Err("Fetching Plain texts not supported".into()), + } + } + + pub fn get_plain_secrets_from_encrypted_secrets( + &self, + decryption_key: Vec, + ) -> Result, Box> { + match self.secrets.clone().unwrap() { + Secrets::PlainSecrets(_) => Err("Can't decrypt the plain text".into()), + Secrets::EncryptedSecrets(data) => { + kalypso_helper::secret_inputs_helpers::decrypt_data_with_ecies_and_aes( + &data.encrypted_data, + &data.acl, + &decryption_key, + None, + ) + } + } + } +} + +#[derive(Serialize, Debug, Deserialize, Clone)] +enum Secrets { + PlainSecrets(Vec), + EncryptedSecrets(EncryptedSecret), +} + +#[derive(Serialize, Debug, Deserialize, Clone)] +struct EncryptedSecret { + encrypted_data: Vec, + acl: Vec, +} + +#[derive(Serialize, Debug, Deserialize, Clone)] +pub struct CheckInputResponse { + pub valid: bool, } #[derive(Serialize, Debug, Deserialize, Clone)] pub struct EncryptedInputPayload { - pub acl: String, - pub encrypted_secrets: String, + pub acl: Vec, + pub public_inputs: Option>, + pub encrypted_secrets: Vec, pub me_decryption_url: String, pub market_id: String, } -use bindings::shared_types::Ask; #[derive(Serialize, Debug, Deserialize, Clone)] -pub struct AskPayload { - pub ask: Ask, - pub encrypted_secret: String, - pub acl: String, - pub ask_id: u64, +pub struct VerifyInputsAndProof { + pub public_input: Option>, + pub private_input: Option>, + pub proof: Vec, +} + +#[derive(Serialize, Debug, Deserialize, Clone)] +pub struct VerifyInputAndProofResponse { + pub is_input_and_proof_valid: bool, } #[derive(Serialize, Debug, Deserialize, Clone)] -pub struct VerifyInputsAndSecrets { - pub public: String, - pub secrets: Option, +pub struct SignInputsAndProofForNonConfidentialInput { + pub public_input: Vec, + pub proof: Vec, } diff --git a/ivs_client/Cargo.toml b/ivs_client/Cargo.toml index 62e8a19..7af6553 100644 --- a/ivs_client/Cargo.toml +++ b/ivs_client/Cargo.toml @@ -6,20 +6,20 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -serde_json="1.0" -serde = { version = "1.0", features = ["derive"] } -tokio = { version = "1.16.1", features = ["full"] } -actix-web = "4.3.0" -openssl = { version = "0.10", features = ["vendored"] } -ecies = {version = "0.2.6", features = ["std"]} +actix-web = { version="4.5.1", features = ["rustls"] } +anyhow = "1.0.86" dotenv = "0.15.0" -validator = { version = "0.18.1", features = ["derive"] } +ecies = {version = "0.2.6", features = ["std"]} env_logger = "0.11.3" -log = "0.4" -hex = "0.4" +ethers = {version = "2", features = ["abigen", "ws", "rustls"] } futures-util = "0.3" +helper = {path = "../helper", package = "helper"} +hex = "0.4" +log = "0.4" +openssl = { version = "0.10", features = ["vendored"] } secp256k1 = "0.29.0" -ethers = {version = "2.0.8", features = ["abigen", "ws", "rustls"] } -uuid = { version = "1.4.1",features = ["v4","fast-rng","macro-diagnostics"] } -actix-web-lab="0.20.2" +serde = { version = "1.0", features = ["derive"] } serde_bytes = "0.11.14" +serde_json="1.0" +tokio = { version = "1.16.1", features = ["full"] } +uuid = { version = "1.4.1",features = ["v4","fast-rng","macro-diagnostics"] } \ No newline at end of file diff --git a/ivs_client/src/handler.rs b/ivs_client/src/handler.rs index 5b71daa..a4a4c01 100644 --- a/ivs_client/src/handler.rs +++ b/ivs_client/src/handler.rs @@ -1,40 +1,11 @@ -use crate::kalypso::{ - generate_api_key, generate_ivs_config_file, get_public_keys_for_ivs, sign_addy, sign_attest, -}; -use crate::model::{SignAddress, SignAttestation, SupervisordResponse}; -use crate::response::response; +use crate::kalypso::{generate_ivs_config_file, get_public_keys_for_ivs}; +use crate::model::SupervisordResponse; use crate::supervisord::{get_ivs_status, start_ivs, stop_ivs}; use actix_web::http::StatusCode; use actix_web::{get, post, web, Responder}; +use helper::response::response; -use ethers::types::BigEndianHash; -use serde_json::{json, Value}; -use validator::Validate; - -// Generate API key -#[post("/generateApiKey")] -async fn generate_api_key_handler() -> impl Responder { - let api_key_response = match generate_api_key().await { - Ok(data) => data, - Err(e) => { - log::error!("{}", e); - return response( - "There was an issue in generating the API key", - StatusCode::INTERNAL_SERVER_ERROR, - None, - ); - } - }; - if !api_key_response.status { - return response(&api_key_response.message, StatusCode::UNAUTHORIZED, None); - } - - response( - &api_key_response.message, - StatusCode::OK, - Some(Value::String(api_key_response.api_key)), - ) -} +use serde_json::Value; // Start input verifier #[post("/startInputVerifier")] @@ -201,62 +172,18 @@ async fn fetch_input_verifier_public_keys() -> impl Responder { ) } -// Sign Address -#[post("/signAddress")] -async fn sign_address(jsonbody: web::Json) -> impl Responder { - //Validating inputs - let json_input = &jsonbody.0; - if let Err(err) = json_input.validate() { - log::error!("{}", err); - return response( - "Invalid payload", - StatusCode::BAD_REQUEST, - Some(Value::String(err.to_string())), - ); - } - let addy_to_be_signed = json_input.address.as_ref().unwrap(); - let signed = sign_addy(addy_to_be_signed).await.unwrap(); - let signature = json!({ - "r": ethers::types::H256::from_uint(&signed.r), - "s": ethers::types::H256::from_uint(&signed.s), - "v": signed.v - }); - response("Address signed", StatusCode::OK, Some(signature)) -} - -// Sign Attestaion -#[post("/signAttestation")] -async fn sign_attestation(jsonbody: web::Json) -> impl Responder { - // Validating inputs - let json_input = &jsonbody.0; - if let Err(err) = json_input.validate() { - log::error!("{}", err); - return response( - "Invalid attestation", - StatusCode::BAD_REQUEST, - Some(Value::String(err.to_string())), - ); - } - let signed = sign_attest(jsonbody.0).await.unwrap(); - let signature = json!({ - "r": ethers::types::H256::from_uint(&signed.r), - "s": ethers::types::H256::from_uint(&signed.s), - "v": signed.v - }); - response("Attestation signed", StatusCode::OK, Some(signature)) -} - // Routes pub fn routes(conf: &mut web::ServiceConfig) { let scope = web::scope("/api") - .service(generate_api_key_handler) .service(start_input_verifier_handler) .service(stop_input_verifier_handler) .service(restart_input_verifier_handler) .service(get_input_verifier_status_handler) .service(generate_config_setup) .service(fetch_input_verifier_public_keys) - .service(sign_address) - .service(sign_attestation); + .service(helper::common_handlers::sign_address) + .service(helper::common_handlers::sign_attestation) + .service(helper::common_handlers::sign_address_encrypted) + .service(helper::common_handlers::sign_attestation_encrypted); conf.service(scope); } diff --git a/ivs_client/src/kalypso.rs b/ivs_client/src/kalypso.rs index 0f23910..3af9ef4 100644 --- a/ivs_client/src/kalypso.rs +++ b/ivs_client/src/kalypso.rs @@ -6,77 +6,9 @@ use serde_bytes::ByteBuf; use tokio::fs; use tokio::fs::File; use tokio::io::AsyncReadExt; -use uuid::Uuid; -use crate::model::{ - ApiGenerationResponse, ApiKeyFile, IvsConfig, IvsPublicKeys, SignAttestation, VerifyApiResponse, -}; - -//generating API key -pub async fn generate_api_key() -> Result> { - //Checking if the config folder is already generated, if not creating a new one - let folder_path = "../ivs_config"; - if fs::metadata(&folder_path).await.is_ok() { - log::info!("ivs_config folder already exists!"); - } else { - fs::create_dir(&folder_path) - .await - .expect("Unable to create new folder"); - } - - //Checking if the API key was already generated - if fs::metadata("../ivs_config/api_key.json").await.is_ok() { - log::info!("api_key.json already exists!"); - return Ok(ApiGenerationResponse { - api_key: "".to_string(), - status: false, - message: "API was already generated. It cannot be generated again".to_string(), - }); - } - - let api_key = Uuid::new_v4(); - let api_key_file = ApiKeyFile { - api_key: api_key.to_string(), - }; - let json_string = serde_json::to_string(&api_key_file)?; - let mut file = File::create("../ivs_config/api_key.json").await?; - tokio::io::AsyncWriteExt::write_all(&mut file, json_string.as_bytes()).await?; - Ok(ApiGenerationResponse { - api_key: api_key.to_string(), - status: true, - message: "API key generated. Please save this API key somewhere safe, it cannot be generated again.".to_string(), - }) -} - -#[allow(unused)] -pub async fn verify_api_key( - request_api_key: &str, -) -> Result> { - //Checking if the API key was already generated - if fs::metadata("../ivs_config/api_key.json").await.is_err() { - return Ok(VerifyApiResponse { - status: false, - message: "api_key is not generated".to_string(), - }); - } - let file = File::open("../ivs_config/api_key.json").await?; - let mut buf_reader = tokio::io::BufReader::new(file); - - let mut content = String::new(); - buf_reader.read_to_string(&mut content).await?; - - let api_key_data: ApiKeyFile = serde_json::from_str(&content)?; - if api_key_data.api_key != request_api_key { - return Ok(VerifyApiResponse { - status: false, - message: "Authentication failed, wrong API key provided".to_string(), - }); - } - Ok(VerifyApiResponse { - status: true, - message: "authenticated".to_string(), - }) -} +use crate::model::{IvsConfig, IvsPublicKeys}; +use helper::common_handlers::SignAttestation; // Get ECIES public key pub async fn get_public_keys_for_ivs() -> Result> { @@ -146,34 +78,8 @@ pub async fn read_ivs_config_file() -> Result Result> { - //Using the enclave secp secret for ecies private key - let read_secp_private_key = fs::read("/app/secp.sec").await?; - let secp_private_key = secp256k1::SecretKey::from_slice(&read_secp_private_key) - .unwrap() - .display_secret() - .to_string(); - let signer = secp_private_key.parse::().unwrap(); - let values = vec![ethers::abi::Token::Address(Address::from_str(address)?)]; - let encoded = ethers::abi::encode(&values); - let digest = ethers::utils::keccak256(encoded); - let signature = signer.sign_message(ethers::types::H256(digest)).await?; - Ok(signature) -} - -pub async fn sign_attest( - attestation: SignAttestation, -) -> Result> { - // Using enclave private key for signature - let secp_file = fs::read("/app/secp.sec").await?; - let secp_private_key = secp256k1::SecretKey::from_slice(&secp_file) - .unwrap() - .display_secret() - .to_string(); - fetch_signed_attestation(attestation, secp_private_key).await -} - -pub async fn fetch_signed_attestation( +#[allow(unused)] +async fn fetch_signed_attestation( attestation: SignAttestation, private_key: String, ) -> Result> { @@ -198,8 +104,8 @@ pub async fn fetch_signed_attestation( mod tests { use super::fetch_signed_attestation; - use crate::model::SignAttestation; use ethers::types::BigEndianHash; + use helper::common_handlers::SignAttestation; use serde_json::json; #[tokio::test] diff --git a/ivs_client/src/main.rs b/ivs_client/src/main.rs index 1ed4b93..a9e038a 100644 --- a/ivs_client/src/main.rs +++ b/ivs_client/src/main.rs @@ -1,8 +1,6 @@ mod handler; mod kalypso; -mod middleware; mod model; -mod response; mod supervisord; use actix_web::{App, HttpServer}; @@ -11,7 +9,7 @@ use dotenv::dotenv; use std::env; #[actix_web::main] -async fn main() -> std::io::Result<()> { +async fn main() -> anyhow::Result<()> { dotenv().ok(); env_logger::init_from_env(env_logger::Env::new().default_filter_or("info")); @@ -20,12 +18,43 @@ async fn main() -> std::io::Result<()> { .parse::() .expect("PORT must be a valid number"); - let server = HttpServer::new(move || App::new().configure(handler::routes)) - .bind(("0.0.0.0", port)) - .unwrap_or_else(|_| panic!("Can not bind to {}", &port)) - .run(); + let enable_ssc: bool = env::var("ENABLE_SSC") + .ok() + .map(|val| val == "true" || val == "1") + .unwrap_or(false); - log::info!("input-verifier-client started on port {}", port); + let server = HttpServer::new(move || App::new().configure(handler::routes)); - server.await + if enable_ssc { + let tls_config = helper::ssc::create_random_rustls_server_config(); + // Error handling for TLS configuration + if let Err(err) = tls_config { + log::error!("Failed to create TLS config: {}", err); + return Err(anyhow::Error::from(err)); + } + + let tls_config = tls_config.unwrap(); + + // Bind the server using Rustls for HTTPS + let server = server.bind_rustls(format!("0.0.0.0:{}", &port), tls_config); + if let Err(err) = server { + log::error!("Failed to bind server with Rustls: {}", err); + return Err(anyhow::Error::from(err)); + } + + // Run the server and await + server.unwrap().run().await?; + } else { + // Bind the server using plain HTTP + let server = server.bind(format!("0.0.0.0:{}", &port)); + if let Err(err) = server { + log::error!("Failed to bind server with HTTP: {}", err); + return Err(anyhow::Error::from(err)); + } + + // Run the server and await + server.unwrap().run().await?; + } + + Ok(()) } diff --git a/ivs_client/src/middleware.rs b/ivs_client/src/middleware.rs deleted file mode 100644 index e9c5bba..0000000 --- a/ivs_client/src/middleware.rs +++ /dev/null @@ -1,57 +0,0 @@ -use actix_web::{ - body::MessageBody, - dev::{ServiceRequest, ServiceResponse}, - http::StatusCode, - Error, -}; -use actix_web_lab::middleware::Next; - -use crate::{kalypso::verify_api_key, response::response}; - -#[allow(unused)] -pub async fn api_auth( - req: ServiceRequest, - next: Next, -) -> Result, Error> { - if req.path() != "/api/generateApiKey" { - let api_key = req.headers().get("api-key"); - if api_key.is_none() { - let (request, _pl) = req.into_parts(); - let resp = response( - "api-key not provided in the headers", - StatusCode::BAD_REQUEST, - None, - ) - .map_into_right_body(); - return Ok(ServiceResponse::new(request, resp)); - } else { - let api_key_string = api_key.unwrap().to_str().unwrap(); - let authentication_status_call = match verify_api_key(api_key_string).await { - Ok(data) => data, - Err(e) => { - log::error!("{}", e); - let (request, _pl) = req.into_parts(); - let resp = response( - "There was an issue in verifying the api-key provided", - StatusCode::INTERNAL_SERVER_ERROR, - None, - ) - .map_into_right_body(); - return Ok(ServiceResponse::new(request, resp)); - } - }; - if !authentication_status_call.status { - let (request, _pl) = req.into_parts(); - let resp = response( - &authentication_status_call.message, - StatusCode::UNAUTHORIZED, - None, - ) - .map_into_right_body(); - return Ok(ServiceResponse::new(request, resp)); - } - } - } - let res = next.call(req).await?; - Ok(res.map_into_left_body()) -} diff --git a/ivs_client/src/model.rs b/ivs_client/src/model.rs index 7192f11..b866cc8 100644 --- a/ivs_client/src/model.rs +++ b/ivs_client/src/model.rs @@ -1,5 +1,4 @@ use serde::{Deserialize, Serialize}; -use validator::Validate; pub struct SupervisordResponse { pub output: String, @@ -11,17 +10,6 @@ pub struct ApiKeyFile { pub api_key: String, } -pub struct ApiGenerationResponse { - pub api_key: String, - pub status: bool, - pub message: String, -} - -pub struct VerifyApiResponse { - pub status: bool, - pub message: String, -} - #[derive(Serialize, Debug, Deserialize)] pub struct IvsConfig { pub secp256k1_private_key: String, @@ -32,27 +20,3 @@ pub struct IvsPublicKeys { pub ivs_public_key: String, pub ivs_ecies_public_key: String, } - -#[derive(Serialize, Debug, Validate, Deserialize)] -pub struct SignAddress { - #[validate(required(message = "address was not provided in the JSON body"))] - pub address: Option, -} - -#[derive(Serialize, Debug, Validate, Deserialize)] -pub struct SignAttestation { - #[validate(required(message = "attestation bytes were not provided in the JSON body"))] - pub attestation: Option, - #[validate(required(message = "address was not provided in the JSON body"))] - pub address: Option, -} - -impl SignAttestation { - #[allow(unused)] - pub fn new(attestation: &str, address: &str) -> SignAttestation { - SignAttestation { - attestation: Some(attestation.to_string()), - address: Some(address.to_string()), - } - } -} diff --git a/ivs_client/src/response.rs b/ivs_client/src/response.rs deleted file mode 100644 index 4097dc2..0000000 --- a/ivs_client/src/response.rs +++ /dev/null @@ -1,63 +0,0 @@ -use actix_web::http::StatusCode; -use actix_web::HttpResponse; -use serde::Serialize; -use serde_json::Value; - -#[derive(Serialize)] -struct JsonResponse { - status: String, - message: String, - data: Option, -} - -struct ResponseOptions { - data: Option, - message: String, - status_code: StatusCode, -} - -struct ResponseHandler { - options: ResponseOptions, -} - -impl ResponseHandler { - fn new(options: ResponseOptions) -> Self { - ResponseHandler { options } - } - - fn create_json_response(self) -> JsonResponse { - let status = if self.options.status_code == StatusCode::OK { - "success".to_string() - } else { - "error".to_string() - }; - - JsonResponse { - status, - message: self.options.message, - data: self.options.data, - } - } - - fn create_http_response(self) -> HttpResponse { - let status_code = self.options.status_code; - let json_resp = self.create_json_response(); - HttpResponse::build(status_code).json(json_resp) - } -} - -//Generate response -pub fn response( - message: &str, - status_code: StatusCode, - data: Option, -) -> HttpResponse { - let options = ResponseOptions { - data, - message: message.to_string(), - status_code, - }; - - let response_handler = ResponseHandler::new(options); - response_handler.create_http_response() -} diff --git a/kalypso-cli/Cargo.toml b/kalypso-cli/Cargo.toml new file mode 100644 index 0000000..540af37 --- /dev/null +++ b/kalypso-cli/Cargo.toml @@ -0,0 +1,25 @@ +[package] +name = "kalypso-cli" +version = "0.1.0" +edition = "2021" + +[dependencies] +async-trait = "0.1.64" +bytes = "1.0" +bindings = { path = "../bindings", package = "foundry-contracts" } +dotenv = "0.15.0" +dialoguer = "0.10.3" +env_logger = "0.11" +flate2 = "1.0.28" +futures = "0.3" +ethers = { version = "2", features = ["rustls"] } +hex = "0.4.3" +kalypso_helper = {path = "../helper", package = "helper"} +log = "0.4" +openssl = { version = "0.10.57", features = ["vendored"] } +reqwest = { version = "0.11", features = ["stream"] } +serde = { version = "1.0", features = ["derive"] } +serde_json = "1.0" +sha3 = "0.10" +tokio = { version = "1.15.0", features = ["full"] } +url = "2.3.1" \ No newline at end of file diff --git a/kalypso-cli/src/common_deps.rs b/kalypso-cli/src/common_deps.rs new file mode 100644 index 0000000..d601df3 --- /dev/null +++ b/kalypso-cli/src/common_deps.rs @@ -0,0 +1,1017 @@ +// src/common_deps.rs + +use ethers::prelude::*; +use std::future::Future; +use std::sync::Arc; + +macro_rules! get_config_ref { + ($config:expr, $key:expr, $var:ident) => { + let $var = $config.get($key).ok_or(concat!("Missing '", $key, "'"))?; + }; +} + +/// Struct holding common dependencies required by multiple operations +pub struct GeneratorRegister { + pub private_key_signer: LocalWallet, + pub generator_registry: bindings::generator_registry::GeneratorRegistry< + SignerMiddleware, LocalWallet>, + >, + pub reward_address: Address, + pub declared_compute: U256, + pub display_name: String, + pub display_description: String, + pub website: String, + pub twitter: String, +} + +pub struct GeneratorJoinMarket { + pub private_key_signer: LocalWallet, + pub generator_registry: bindings::generator_registry::GeneratorRegistry< + SignerMiddleware, LocalWallet>, + >, + #[allow(unused)] //will be used latter + pub proof_marketplace: bindings::proof_marketplace::ProofMarketplace< + SignerMiddleware, LocalWallet>, + >, + pub market_id: U256, + pub compute_per_request_required: U256, + pub proof_generation_cost: U256, + pub proposed_time: U256, +} + +pub struct StakeForGenerator { + pub private_key_signer: LocalWallet, + pub generator_registry: bindings::generator_registry::GeneratorRegistry< + SignerMiddleware, LocalWallet>, + >, + pub staking_token: bindings::ierc20::IERC20, LocalWallet>>, + pub staking_address: Address, + pub stake: U256, +} + +pub struct CommonDeps; + +impl CommonDeps { + pub async fn send_and_confirm( + send_future: impl Future, E>>, + ) -> Result + where + P: JsonRpcClient + Send + Sync + 'static, + E: std::fmt::Display, + { + // Await the send operation + let pending_tx = send_future + .await + .map_err(|e| format!("Failed to send transaction: {}", e))?; + + // Await the confirmation with at least 1 confirmation + let receipt = pending_tx + .confirmations(1) + .await + .map_err(|e| format!("Failed to confirm transaction: {}", e))? + .ok_or_else(|| "Transaction receipt not found".to_string())?; + + // Extract and return the transaction hash + Ok(format!( + "Transaction: {}", + hex::encode(receipt.transaction_hash) + )) + } + + pub fn stake_for_generator( + config: &std::collections::HashMap, + ) -> Result { + get_config_ref!(config, "private_key", private_key); + get_config_ref!(config, "rpc_url", rpc_url); + get_config_ref!(config, "generator_registry", generator_registry_address); + get_config_ref!(config, "staking_address", staking_address); + get_config_ref!(config, "stake", stake); + get_config_ref!(config, "chain_id", chain_id); + get_config_ref!(config, "staking_token", staking_token); + + let (generator_registry, private_key_signer) = get_generator_registry_instance( + private_key, + chain_id, + generator_registry_address, + rpc_url, + )?; + + let staking_address = staking_address + .parse::
() + .map_err(|e| format!("Invalid Staking Address: {}", e))?; + + let stake = + U256::from_dec_str(stake.as_str()).map_err(|e| format!("Invalid Stake: {}", e))?; + + let (staking_token, _) = + get_token_instance(private_key, chain_id, &staking_token, rpc_url)?; + + Ok(StakeForGenerator { + private_key_signer, + generator_registry, + staking_address, + stake, + staking_token, + }) + } + + pub fn generator_join_market_instance( + config: &std::collections::HashMap, + ) -> Result { + get_config_ref!(config, "private_key", private_key); + get_config_ref!(config, "rpc_url", rpc_url); + get_config_ref!(config, "generator_registry", generator_registry_address); + get_config_ref!(config, "proof_marketplace", proof_marketplace_address); + get_config_ref!(config, "market_id", market_id); + get_config_ref!(config, "chain_id", chain_id); + get_config_ref!(config, "compute_per_request", compute_per_request); + get_config_ref!(config, "proof_generation_cost", proof_generation_cost); + get_config_ref!(config, "proposed_time", proposed_time); + + let (generator_registry, private_key_signer) = get_generator_registry_instance( + private_key, + chain_id, + generator_registry_address, + rpc_url, + )?; + + let (proof_marketplace, _) = get_proof_marketplace_instance( + private_key, + chain_id, + proof_marketplace_address, + rpc_url, + )?; + + let market_id = U256::from_dec_str(market_id.as_str()) + .map_err(|e| format!("Invalid Market Id: {}", e))?; + + let compute_per_request = U256::from_dec_str(compute_per_request.as_str()) + .map_err(|e| format!("Invalid Compute Per Request: {}", e))?; + + let proof_generation_cost = U256::from_dec_str(&proof_generation_cost.as_str()) + .map_err(|e| format!("Invalid Proof Generation Cost: {}", e))?; + + let proposed_time = U256::from_dec_str(&proposed_time.as_str()) + .map_err(|e| format!("Invalid Proposed Time: {}", e))?; + + Ok(GeneratorJoinMarket { + private_key_signer, + generator_registry, + proof_marketplace, + market_id, + compute_per_request_required: compute_per_request, + proof_generation_cost, + proposed_time, + }) + } + + /// Initializes CommonDeps from the provided configuration + pub fn generator_registration_instance( + config: &std::collections::HashMap, + ) -> Result { + // Extract and validate required fields + get_config_ref!(config, "private_key", private_key); + get_config_ref!(config, "rpc_url", rpc_url); + get_config_ref!(config, "generator_registry", generator_registry_address); + get_config_ref!(config, "reward_address", reward_address); + get_config_ref!(config, "chain_id", chain_id); + get_config_ref!(config, "declared_compute", declared_compute); + + get_config_ref!(config, "display_name", display_name); + get_config_ref!(config, "display_description", display_description); + get_config_ref!(config, "website", website); + get_config_ref!(config, "twitter", twitter); + + let (generator_registry, private_key_signer) = get_generator_registry_instance( + private_key, + chain_id, + generator_registry_address, + rpc_url, + )?; + + let reward_address = reward_address + .parse::
() + .map_err(|e| format!("Invalid Reward Address: {}", e))?; + + let declared_compute = U256::from_dec_str(declared_compute.as_str()) + .map_err(|e| format!("Invalid Declared Compute: {}", e))?; + + Ok(GeneratorRegister { + private_key_signer, + generator_registry, + reward_address, + declared_compute, + display_name: display_name.into(), + display_description: display_description.into(), + website: website.into(), + twitter: twitter.into(), + }) + } +} + +fn get_generator_registry_instance( + private_key: &str, + chain_id: &str, + generator_registry_address: &str, + rpc_url: &str, +) -> Result< + ( + bindings::generator_registry::GeneratorRegistry< + SignerMiddleware, LocalWallet>, + >, + LocalWallet, + ), + String, +> { + // Parse the private key into a LocalWallet and set the chain ID + let private_key_signer = private_key + .parse::() + .map_err(|e| format!("Failed to parse private key: {}", e))? + .with_chain_id( + chain_id + .parse::() + .map_err(|e| format!("Invalid chain_id: {}", e))?, + ); + + // Parse the Generator Registry address + let generator_registry_address = generator_registry_address + .parse::
() + .map_err(|e| format!("Invalid Generator Registry address: {}", e))?; + + // Initialize the provider + let provider_http = + Provider::::try_from(rpc_url).map_err(|e| format!("Invalid RPC URL: {}", e))?; + + // Initialize the SignerMiddleware with the provider and signer + let client = SignerMiddleware::new(provider_http.clone(), private_key_signer.clone()); + + let client_arc = Arc::new(client); + + // Initialize the Generator Registry contract instance with the signer-enabled client + let generator_registry = bindings::generator_registry::GeneratorRegistry::new( + generator_registry_address, + client_arc.clone(), + ); + + Ok((generator_registry, private_key_signer)) +} + +fn get_proof_marketplace_instance( + private_key: &str, + chain_id: &str, + proof_marketplace_address: &str, + rpc_url: &str, +) -> Result< + ( + bindings::proof_marketplace::ProofMarketplace< + SignerMiddleware, LocalWallet>, + >, + LocalWallet, + ), + String, +> { + // Parse the private key into a LocalWallet and set the chain ID + let private_key_signer = private_key + .parse::() + .map_err(|e| format!("Failed to parse private key: {}", e))? + .with_chain_id( + chain_id + .parse::() + .map_err(|e| format!("Invalid chain_id: {}", e))?, + ); + + // Parse the Generator Registry address + let proof_marketplace_address = proof_marketplace_address + .parse::
() + .map_err(|e| format!("Invalid Proof Marketplace address: {}", e))?; + + // Initialize the provider + let provider_http = + Provider::::try_from(rpc_url).map_err(|e| format!("Invalid RPC URL: {}", e))?; + + // Initialize the SignerMiddleware with the provider and signer + let client = SignerMiddleware::new(provider_http.clone(), private_key_signer.clone()); + + let client_arc = Arc::new(client); + + // Initialize the Generator Registry contract instance with the signer-enabled client + let proof_marketplace = bindings::proof_marketplace::ProofMarketplace::new( + proof_marketplace_address, + client_arc.clone(), + ); + + Ok((proof_marketplace, private_key_signer)) +} + +fn get_token_instance( + private_key: &str, + chain_id: &str, + token_address: &str, + rpc_url: &str, +) -> Result< + ( + bindings::ierc20::IERC20, LocalWallet>>, + LocalWallet, + ), + String, +> { + // Parse the private key into a LocalWallet and set the chain ID + let private_key_signer = private_key + .parse::() + .map_err(|e| format!("Failed to parse private key: {}", e))? + .with_chain_id( + chain_id + .parse::() + .map_err(|e| format!("Invalid chain_id: {}", e))?, + ); + + // Parse the Generator Registry address + let token_address = token_address + .parse::
() + .map_err(|e| format!("Invalid Token address: {}", e))?; + + // Initialize the provider + let provider_http = + Provider::::try_from(rpc_url).map_err(|e| format!("Invalid RPC URL: {}", e))?; + + // Initialize the SignerMiddleware with the provider and signer + let client = SignerMiddleware::new(provider_http.clone(), private_key_signer.clone()); + + let client_arc = Arc::new(client); + + // Initialize the Generator Registry contract instance with the signer-enabled client + let token_address = bindings::ierc20::IERC20::new(token_address, client_arc.clone()); + + Ok((token_address, private_key_signer)) +} + +pub struct MarketExitInfo { + #[allow(unused)] // will use latter + pub private_key_signer: LocalWallet, + pub generator_registry: bindings::generator_registry::GeneratorRegistry< + SignerMiddleware, LocalWallet>, + >, + pub market_id: U256, +} +impl CommonDeps { + pub fn marketplace_exit_info( + config: &std::collections::HashMap, + ) -> Result { + get_config_ref!(config, "private_key", private_key); + get_config_ref!(config, "rpc_url", rpc_url); + get_config_ref!(config, "generator_registry", generator_registry_address); + get_config_ref!(config, "market_id", market_id); + get_config_ref!(config, "chain_id", chain_id); + + let (generator_registry, private_key_signer) = get_generator_registry_instance( + private_key, + chain_id, + generator_registry_address, + rpc_url, + )?; + + let market_id = U256::from_dec_str(market_id.as_str()) + .map_err(|e| format!("Invalid Market Id: {}", e))?; + + Ok(MarketExitInfo { + private_key_signer, + generator_registry, + market_id, + }) + } +} + +pub struct MarketCreateInfo { + pub private_key_signer: LocalWallet, + pub proof_marketplace: bindings::proof_marketplace::ProofMarketplace< + SignerMiddleware, LocalWallet>, + >, + pub prover_pcrs: Vec, + pub ivs_pcrs: Vec, + pub payment_token: bindings::ierc20::IERC20, LocalWallet>>, + pub verifier_wrapper: Address, +} + +impl CommonDeps { + pub fn market_create_info( + config: &std::collections::HashMap, + ) -> Result { + get_config_ref!(config, "private_key", private_key); + get_config_ref!(config, "rpc_url", rpc_url); + get_config_ref!(config, "proof_marketplace", proof_marketplace_address); + get_config_ref!(config, "chain_id", chain_id); + get_config_ref!(config, "prover_image_id", prover_pcrs); + get_config_ref!(config, "verification_image_id", ivs_pcrs); + get_config_ref!(config, "verifier_wrapper", verifier_wrapper); + get_config_ref!(config, "payment_token", payment_token); + + let (proof_marketplace, private_key_signer) = get_proof_marketplace_instance( + private_key, + chain_id, + proof_marketplace_address, + rpc_url, + )?; + + let prover_pcrs = { + let trimmed_key = if prover_pcrs.starts_with("0x") || prover_pcrs.starts_with("0X") { + &prover_pcrs[2..] + } else { + prover_pcrs + }; + hex::decode(trimmed_key).map_err(|e| format!("Invalid Prover PCRs: {}", e))? + }; + + let ivs_pcrs = { + let trimmed_key = if ivs_pcrs.starts_with("0x") || ivs_pcrs.starts_with("0X") { + &ivs_pcrs[2..] + } else { + ivs_pcrs + }; + hex::decode(trimmed_key).map_err(|e| format!("Invalid IVS PCRs: {}", e))? + }; + + let (payment_token, _) = + get_token_instance(private_key, chain_id, &payment_token, rpc_url)?; + + let verifier_wrapper = verifier_wrapper + .parse::
() + .map_err(|e| format!("Invalid Verifier Wrapper Address: {}", e))?; + + Ok(MarketCreateInfo { + private_key_signer, + proof_marketplace, + prover_pcrs, + ivs_pcrs, + verifier_wrapper, + payment_token, + }) + } +} + +pub struct ComputePcrsInfo { + pub attestation_utility: String, + pub attestation_verifier: String, +} + +impl CommonDeps { + pub fn compute_pcrs_info( + config: &std::collections::HashMap, + ) -> Result { + get_config_ref!(config, "attestation_server_url", attestation_server_url); + get_config_ref!(config, "attestion_verifier_url", attestion_verifier_url); + + Ok(ComputePcrsInfo { + attestation_utility: attestation_server_url.to_string(), + attestation_verifier: attestion_verifier_url.to_string(), + }) + } +} + +pub struct ClaimRewardsInfo { + #[allow(unused)] + pub private_key_signer: LocalWallet, + pub proof_marketplace: bindings::proof_marketplace::ProofMarketplace< + SignerMiddleware, LocalWallet>, + >, + #[allow(unused)] + pub payment_token: bindings::ierc20::IERC20, LocalWallet>>, + pub reward_address: Address, +} + +impl CommonDeps { + pub fn claim_rewards_info( + config: &std::collections::HashMap, + ) -> Result { + get_config_ref!(config, "private_key", private_key); + get_config_ref!(config, "rpc_url", rpc_url); + get_config_ref!(config, "proof_marketplace", proof_marketplace_address); + get_config_ref!(config, "chain_id", chain_id); + get_config_ref!(config, "reward_address", reward_address); + get_config_ref!(config, "payment_token", payment_token); + + let (proof_marketplace, private_key_signer) = get_proof_marketplace_instance( + private_key, + chain_id, + proof_marketplace_address, + rpc_url, + )?; + + let reward_address = reward_address + .parse::
() + .map_err(|e| format!("Invalid Reward Address: {}", e))?; + + let (payment_token, _) = + get_token_instance(private_key, chain_id, &payment_token, rpc_url)?; + + Ok(ClaimRewardsInfo { + private_key_signer, + proof_marketplace, + payment_token, + reward_address, + }) + } +} + +pub struct ReadAttestationInfo { + pub attestation_utility: String, +} + +impl CommonDeps { + pub fn read_attestation_info( + config: &std::collections::HashMap, + ) -> Result { + get_config_ref!(config, "attestation_server_url", attestation_server_url); + + Ok(ReadAttestationInfo { + attestation_utility: attestation_server_url.to_string(), + }) + } +} + +pub struct NonConfidentialRequest { + pub private_key_signer: LocalWallet, + pub proof_marketplace: bindings::proof_marketplace::ProofMarketplace< + SignerMiddleware, LocalWallet>, + >, + pub payment_token: bindings::ierc20::IERC20, LocalWallet>>, + pub max_proof_generation_cost: U256, + pub max_proof_generation_time: U256, + pub inputs: ethers::types::Bytes, + pub market_id: U256, +} + +impl CommonDeps { + pub fn non_confidential_request_info( + config: &std::collections::HashMap, + ) -> Result { + get_config_ref!(config, "private_key", private_key); + get_config_ref!(config, "rpc_url", rpc_url); + get_config_ref!(config, "proof_marketplace", proof_marketplace_address); + get_config_ref!(config, "chain_id", chain_id); + get_config_ref!(config, "payment_token", payment_token); + get_config_ref!(config, "inputs", inputs); + get_config_ref!(config, "market_id", market_id); + + get_config_ref!( + config, + "max_proof_generation_cost", + max_proof_generation_cost + ); + get_config_ref!( + config, + "max_proof_generation_time", + max_proof_generation_time + ); + + let (proof_marketplace, private_key_signer) = get_proof_marketplace_instance( + private_key, + chain_id, + proof_marketplace_address, + rpc_url, + )?; + + let (payment_token, _) = + get_token_instance(private_key, chain_id, &payment_token, rpc_url)?; + + let max_proof_generation_cost = U256::from_dec_str(max_proof_generation_cost.as_str()) + .map_err(|e| format!("Max Proof Generation Cost: {}", e))?; + + let max_proof_generation_time = U256::from_dec_str(max_proof_generation_time.as_str()) + .map_err(|e| format!("Max Proof Generation Time: {}", e))?; + + let trimmed_inputs = if inputs.starts_with("0x") || inputs.starts_with("0X") { + &inputs[2..] + } else { + inputs + }; + if trimmed_inputs.len() % 2 != 0 { + return Err("Hex string has an invalid length".to_string()); + } + + let inputs = hex::decode(trimmed_inputs) + .map_err(|e| format!("Invalid Input Bytes: {}", e))? + .into(); + + let market_id = U256::from_dec_str(market_id.as_str()) + .map_err(|e| format!("Invalid Market Id: {}", e))?; + + Ok(NonConfidentialRequest { + private_key_signer, + proof_marketplace, + payment_token, + max_proof_generation_cost, + max_proof_generation_time, + inputs, + market_id, + }) + } +} + +pub struct DiscardRequestInfo { + #[allow(unused)] + pub private_key_signer: LocalWallet, + pub proof_marketplace: bindings::proof_marketplace::ProofMarketplace< + SignerMiddleware, LocalWallet>, + >, + pub ask_id: U256, +} + +impl CommonDeps { + pub fn discard_request_info( + config: &std::collections::HashMap, + ) -> Result { + get_config_ref!(config, "private_key", private_key); + get_config_ref!(config, "rpc_url", rpc_url); + get_config_ref!(config, "proof_marketplace", proof_marketplace_address); + get_config_ref!(config, "chain_id", chain_id); + get_config_ref!(config, "ask_id", ask_id); + + let (proof_marketplace, private_key_signer) = get_proof_marketplace_instance( + private_key, + chain_id, + proof_marketplace_address, + rpc_url, + )?; + + let ask_id = + U256::from_dec_str(&ask_id.as_str()).map_err(|e| format!("Invalid Ask Id: {}", e))?; + + Ok(DiscardRequestInfo { + private_key_signer, + proof_marketplace, + ask_id, + }) + } +} + +pub struct WhitelistProverImageInfo { + #[allow(unused)] + pub private_key_signer: LocalWallet, + pub proof_marketplace: bindings::proof_marketplace::ProofMarketplace< + SignerMiddleware, LocalWallet>, + >, + pub prover_image_id: Bytes, + pub market_id: U256, +} + +impl CommonDeps { + pub fn whitelist_prover_image_info( + config: &std::collections::HashMap, + ) -> Result { + get_config_ref!(config, "private_key", private_key); + get_config_ref!(config, "rpc_url", rpc_url); + get_config_ref!(config, "proof_marketplace", proof_marketplace_address); + get_config_ref!(config, "chain_id", chain_id); + get_config_ref!(config, "prover_image_id", prover_pcrs); + get_config_ref!(config, "market_id", market_id); + + let (proof_marketplace, private_key_signer) = get_proof_marketplace_instance( + private_key, + chain_id, + proof_marketplace_address, + rpc_url, + )?; + + let prover_pcrs = { + let trimmed_key = if prover_pcrs.starts_with("0x") || prover_pcrs.starts_with("0X") { + &prover_pcrs[2..] + } else { + prover_pcrs + }; + hex::decode(trimmed_key).map_err(|e| format!("Invalid Prover PCRs: {}", e))? + }; + + let market_id = U256::from_dec_str(market_id.as_str()) + .map_err(|e| format!("Invalid Market Id: {}", e))?; + + Ok(WhitelistProverImageInfo { + private_key_signer, + proof_marketplace, + prover_image_id: prover_pcrs.into(), + market_id, + }) + } +} + +pub struct WhitelistVerificationImageInfo { + #[allow(unused)] + pub private_key_signer: LocalWallet, + pub proof_marketplace: bindings::proof_marketplace::ProofMarketplace< + SignerMiddleware, LocalWallet>, + >, + pub verification_image_id: Bytes, + pub market_id: U256, +} + +impl CommonDeps { + pub fn whitelist_verification_image_info( + config: &std::collections::HashMap, + ) -> Result { + get_config_ref!(config, "private_key", private_key); + get_config_ref!(config, "rpc_url", rpc_url); + get_config_ref!(config, "proof_marketplace", proof_marketplace_address); + get_config_ref!(config, "chain_id", chain_id); + get_config_ref!(config, "verification_image_id", ivs_pcrs); + get_config_ref!(config, "market_id", market_id); + + let (proof_marketplace, private_key_signer) = get_proof_marketplace_instance( + private_key, + chain_id, + proof_marketplace_address, + rpc_url, + )?; + + let ivs_pcrs = { + let trimmed_key = if ivs_pcrs.starts_with("0x") || ivs_pcrs.starts_with("0X") { + &ivs_pcrs[2..] + } else { + ivs_pcrs + }; + hex::decode(trimmed_key).map_err(|e| format!("Invalid Prover PCRs: {}", e))? + }; + + let market_id = U256::from_dec_str(market_id.as_str()) + .map_err(|e| format!("Invalid Market Id: {}", e))?; + + Ok(WhitelistVerificationImageInfo { + private_key_signer, + proof_marketplace, + verification_image_id: ivs_pcrs.into(), + market_id, + }) + } +} + +pub struct UpdateEncryptionKeyInfo { + #[allow(unused)] + pub private_key_signer: LocalWallet, + pub generator_registry: bindings::generator_registry::GeneratorRegistry< + SignerMiddleware, LocalWallet>, + >, + pub attestation_utility: String, + pub attestation_verifier: String, + pub enclave_client_url: String, + pub market_id: U256, +} + +impl CommonDeps { + pub fn update_encryption_info( + config: &std::collections::HashMap, + ) -> Result { + get_config_ref!(config, "private_key", private_key); + get_config_ref!(config, "rpc_url", rpc_url); + get_config_ref!(config, "generator_registry", generator_registry_address); + get_config_ref!(config, "chain_id", chain_id); + + get_config_ref!(config, "attestation_server_url", attestation_server_url); + get_config_ref!(config, "attestion_verifier_url", attestion_verifier_url); + get_config_ref!(config, "enclave_client_url", enclave_client_url); + get_config_ref!(config, "market_id", market_id); + + let (generator_registry, private_key_signer) = get_generator_registry_instance( + private_key, + chain_id, + generator_registry_address, + rpc_url, + )?; + + let market_id = U256::from_dec_str(market_id.as_str()) + .map_err(|e| format!("Invalid Market Id: {}", e))?; + + Ok(UpdateEncryptionKeyInfo { + private_key_signer, + generator_registry, + attestation_utility: attestation_server_url.to_string(), + attestation_verifier: attestion_verifier_url.to_string(), + enclave_client_url: enclave_client_url.to_string(), + market_id, + }) + } +} + +pub type AddIvsKeyInfo = UpdateEncryptionKeyInfo; +impl CommonDeps { + pub fn add_ivs_key_info( + config: &std::collections::HashMap, + ) -> Result { + CommonDeps::update_encryption_info(config) + } +} + +pub struct ReadProofInfo { + pub proof_marketplace: bindings::proof_marketplace::ProofMarketplace>, + pub provider_http: Provider, + pub ask_id: U256, +} + +impl CommonDeps { + pub fn read_proof_info( + config: &std::collections::HashMap, + ) -> Result { + get_config_ref!(config, "rpc_url", rpc_url); + get_config_ref!(config, "proof_marketplace", proof_marketplace_address); + get_config_ref!(config, "ask_id", ask_id); + + let ask_id = + U256::from_dec_str(&ask_id.as_str()).map_err(|e| format!("Invalid Ask Id: {}", e))?; + + let (proof_marketplace, provider_http) = + get_proof_marketplace_instance_without_signer(proof_marketplace_address, rpc_url)?; + + Ok(ReadProofInfo { + proof_marketplace, + provider_http, + ask_id, + }) + } +} + +fn get_proof_marketplace_instance_without_signer( + proof_marketplace_address: &str, + rpc_url: &str, +) -> Result< + ( + bindings::proof_marketplace::ProofMarketplace>, + Provider, + ), + String, +> { + let proof_marketplace_address = proof_marketplace_address + .parse::
() + .map_err(|e| format!("Invalid Proof Marketplace address: {}", e))?; + + // Initialize the provider + let provider_http = + Provider::::try_from(rpc_url).map_err(|e| format!("Invalid RPC URL: {}", e))?; + + // Initialize the Generator Registry contract instance with the signer-enabled client + let proof_marketplace = bindings::proof_marketplace::ProofMarketplace::new( + proof_marketplace_address, + provider_http.clone().into(), + ); + + Ok((proof_marketplace, provider_http)) +} + +pub struct ConfidentialRequest { + pub private_key_signer: LocalWallet, + pub proof_marketplace: bindings::proof_marketplace::ProofMarketplace< + SignerMiddleware, LocalWallet>, + >, + pub payment_token: bindings::ierc20::IERC20, LocalWallet>>, + pub max_proof_generation_cost: U256, + pub max_proof_generation_time: U256, + pub inputs: ethers::types::Bytes, + pub private_inputs: ethers::types::Bytes, + pub market_id: U256, + pub entity_registry: bindings::entity_key_registry::EntityKeyRegistry< + SignerMiddleware, LocalWallet>, + >, +} + +impl CommonDeps { + pub fn confidential_request_info( + config: &std::collections::HashMap, + ) -> Result { + get_config_ref!(config, "private_key", private_key); + get_config_ref!(config, "rpc_url", rpc_url); + get_config_ref!(config, "proof_marketplace", proof_marketplace_address); + get_config_ref!(config, "chain_id", chain_id); + get_config_ref!(config, "payment_token", payment_token); + get_config_ref!(config, "inputs", inputs); + get_config_ref!(config, "market_id", market_id); + get_config_ref!(config, "private_inputs", private_inputs); + get_config_ref!(config, "entity_registry", entity_key_registry_address); + + get_config_ref!( + config, + "max_proof_generation_cost", + max_proof_generation_cost + ); + get_config_ref!( + config, + "max_proof_generation_time", + max_proof_generation_time + ); + + let (proof_marketplace, private_key_signer) = get_proof_marketplace_instance( + private_key, + chain_id, + proof_marketplace_address, + rpc_url, + )?; + + let (payment_token, _) = + get_token_instance(private_key, chain_id, &payment_token, rpc_url)?; + + let max_proof_generation_cost = U256::from_dec_str(max_proof_generation_cost.as_str()) + .map_err(|e| format!("Max Proof Generation Cost: {}", e))?; + + let max_proof_generation_time = U256::from_dec_str(max_proof_generation_time.as_str()) + .map_err(|e| format!("Max Proof Generation Time: {}", e))?; + + let inputs = { + let trimmed_inputs = if inputs.starts_with("0x") || inputs.starts_with("0X") { + &inputs[2..] + } else { + inputs + }; + if trimmed_inputs.len() % 2 != 0 { + return Err("Hex string has an invalid length".to_string()); + } + + let inputs = hex::decode(trimmed_inputs) + .map_err(|e| format!("Invalid Input Bytes: {}", e))? + .into(); + + inputs + }; + + let private_inputs = { + let trimmed_inputs = + if private_inputs.starts_with("0x") || private_inputs.starts_with("0X") { + &private_inputs[2..] + } else { + private_inputs + }; + if trimmed_inputs.len() % 2 != 0 { + return Err("Hex string has an invalid length".to_string()); + } + + let private_inputs = hex::decode(trimmed_inputs) + .map_err(|e| format!("Invalid Input Bytes: {}", e))? + .into(); + + private_inputs + }; + + let market_id = U256::from_dec_str(market_id.as_str()) + .map_err(|e| format!("Invalid Market Id: {}", e))?; + + let (entity_registry, _) = get_entity_key_registry_instance( + private_key, + chain_id, + entity_key_registry_address, + rpc_url, + )?; + + Ok(ConfidentialRequest { + private_key_signer, + proof_marketplace, + payment_token, + max_proof_generation_cost, + max_proof_generation_time, + inputs, + market_id, + private_inputs, + entity_registry, + }) + } +} + +fn get_entity_key_registry_instance( + private_key: &str, + chain_id: &str, + entity_key_registry_address: &str, + rpc_url: &str, +) -> Result< + ( + bindings::entity_key_registry::EntityKeyRegistry< + SignerMiddleware, LocalWallet>, + >, + LocalWallet, + ), + String, +> { + // Parse the private key into a LocalWallet and set the chain ID + let private_key_signer = private_key + .parse::() + .map_err(|e| format!("Failed to parse private key: {}", e))? + .with_chain_id( + chain_id + .parse::() + .map_err(|e| format!("Invalid chain_id: {}", e))?, + ); + + // Parse the Generator Registry address + let entity_key_registry_address = entity_key_registry_address + .parse::
() + .map_err(|e| format!("Invalid Entity Key Registry address: {}", e))?; + + // Initialize the provider + let provider_http = + Provider::::try_from(rpc_url).map_err(|e| format!("Invalid RPC URL: {}", e))?; + + // Initialize the SignerMiddleware with the provider and signer + let client = SignerMiddleware::new(provider_http.clone(), private_key_signer.clone()); + + let client_arc = Arc::new(client); + + // Initialize the Generator Registry contract instance with the signer-enabled client + let entity_key_registry = bindings::entity_key_registry::EntityKeyRegistry::new( + entity_key_registry_address, + client_arc.clone(), + ); + + Ok((entity_key_registry, private_key_signer)) +} diff --git a/kalypso-cli/src/config.json b/kalypso-cli/src/config.json new file mode 100644 index 0000000..5f083a2 --- /dev/null +++ b/kalypso-cli/src/config.json @@ -0,0 +1,404 @@ +{ + "prompts": [ + { + "field": "private_key", + "prompt": "Enter your private key", + "secret": true, + "env_var": "PRIVATE_KEY" + }, + { + "field": "rpc_url", + "prompt": "Enter RPC URL", + "secret": false, + "env_var": "RPC_URL" + }, + { + "field": "chain_id", + "prompt": "Enter Chain ID", + "secret": false, + "env_var": "CHAIN_ID" + }, + { + "field": "market_id", + "prompt": "Enter Market ID", + "secret": false, + "env_var": "MARKET_ID" + }, + { + "field": "generator_registry", + "prompt": "Enter Generator Registry Contract Address", + "secret": false, + "env_var": "GENERATOR_REGISTRY_ADDRESS" + }, + { + "field": "proof_marketplace", + "prompt": "Enter Proof Marketplace Contract Address", + "secret": false, + "env_var": "PROOF_MARKETPLACE_ADDRESS" + }, + { + "field": "entity_registry", + "prompt": "Enter Entity Key Registry Contract Address", + "secret": false, + "env_var": "ENTITY_KEY_REGISTRY_ADDRESS" + }, + { + "field": "reward_address", + "prompt": "Enter Reward Address", + "secret": false, + "env_var": "REWARD_ADDRESS" + }, + { + "field": "stake", + "prompt": "Enter Stake", + "secret": false, + "env_var": "STAKE" + }, + { + "field": "declared_compute", + "prompt": "Enter compute you wish to provide", + "secret": false, + "env_var": "DECLARED_COMPUTE" + }, + { + "field": "compute_per_request", + "prompt": "Enter compute your machine requires per request", + "secret": false, + "env_var": "COMPUTE_PER_REQUEST" + }, + { + "field": "proof_generation_cost", + "prompt": "Enter proof generation cost per request", + "secret": false, + "env_var": "PROOF_GENERATION_COST" + }, + { + "field": "proposed_time", + "prompt": "Enter Maximum Time (in blocks) in which you can submit the proof", + "secret": false, + "env_var": "PROPOSED_TIME" + }, + { + "field": "staking_address", + "prompt": "Enter Address to which you want to deposit stake", + "secret": false, + "env_var": "STAKING_ADDRESS" + }, + { + "field": "staking_token", + "prompt": "Enter the staking token address", + "secret": false, + "env_var": "STAKING_TOKEN" + }, + { + "field": "payment_token", + "prompt": "Enter the payment token address", + "secret": false, + "env_var": "PAYMENT_TOKEN" + }, + { + "field": "prover_image_id", + "prompt": "Enter the prover image pcrs", + "secret": false, + "env_var": "PROVER_IMAGE_PCRS" + }, + { + "field": "verification_image_id", + "prompt": "Enter the input_verification image pcrs", + "secret": false, + "env_var": "IVS_IMAGE_PCRS" + }, + { + "field": "verifier_wrapper", + "prompt": "Enter Proof Verifier Contract Address (refer to Kalypso Standard Wrapper Contract)", + "secret": false, + "env_var": "VERIFIER_WRAPPER_ADDRESS" + }, + { + "field": "attestation_server_url", + "prompt": "Enter Attestation Server URL", + "secret": false, + "env_var": "ATTESTATION_UTILITY_URL" + }, + { + "field": "attestion_verifier_url", + "prompt": "Enter Attestation VERIFIER URL", + "secret": false, + "env_var": "ATTESTATION_VERIFIER_URL" + }, + { + "field": "max_proof_generation_cost", + "prompt": "Enter Maximum number of payments token to pay", + "secret": false, + "env_var": "MAX_PROOF_GENERATION_COST" + }, + { + "field": "max_proof_generation_time", + "prompt": "Enter Maximum time in blocks you can wait for proof to be generated", + "secret": false, + "env_var": "MAX_PROOF_GENERATION_TIME" + }, + { + "field": "inputs", + "prompt": "Enter public inputs in hex string. Don't share any secret information in this prompt", + "secret": false, + "env_var": "INPUTS" + }, + { + "field": "private_inputs", + "prompt": "Enter private inputs in hex string", + "secret": true, + "env_var": "PRIVATE_INPUTS" + }, + { + "field": "ask_id", + "prompt": "Enter Ask ID/ Request ID", + "secret": false, + "env_var": "ASK_ID" + }, + { + "field": "enclave_client_url", + "prompt": "Enter enclave client URL", + "secret": false, + "env_var": "ENCLAVE_CLIENT_URL" + }, + { + "field": "display_name", + "prompt": "Enter Display Name", + "secret": false, + "env_var": "DISPLAY_NAME" + }, + { + "field": "display_description", + "prompt": "A brief description of the generator", + "secret": false, + "env_var": "DESCRIPTION" + }, + { + "field": "website", + "prompt": "Website", + "secret": false, + "env_var": "WEBSITE" + }, + { + "field": "twitter", + "prompt": "Twitter", + "secret": false, + "env_var": "TWITTER" + } + ], + "operations": [ + { + "name": "Register", + "description": "Registers a new user", + "required_prompts": [ + "private_key", + "rpc_url", + "chain_id", + "generator_registry", + "reward_address", + "declared_compute", + "display_name", + "display_description", + "website", + "twitter" + ] + }, + { + "name": "Join Marketplace", + "description": "Joins a new marketplace", + "required_prompts": [ + "private_key", + "rpc_url", + "chain_id", + "generator_registry", + "proof_marketplace", + "market_id", + "compute_per_request", + "proof_generation_cost", + "proposed_time" + ] + }, + { + "name": "Request To Leave Marketplace", + "description": "Request Kalypso To Leave Marketplace. If there are not requests operator will automatically exit. Otherwise, operator will have to call 'Leave Marketplace' after some time", + "required_prompts": [ + "private_key", + "rpc_url", + "chain_id", + "generator_registry", + "market_id" + ] + }, + { + "name": "Leave Marketplace", + "description": "Leave Marketplace", + "required_prompts": [ + "private_key", + "rpc_url", + "chain_id", + "generator_registry", + "market_id" + ] + }, + { + "name": "Stake", + "description": "Stake for a generator", + "required_prompts": [ + "private_key", + "rpc_url", + "chain_id", + "staking_token", + "generator_registry", + "staking_address", + "stake" + ] + }, + { + "name": "Create Marketplace", + "description": "Create a new market place in kalypso", + "required_prompts": [ + "private_key", + "rpc_url", + "chain_id", + "proof_marketplace", + "prover_image_id", + "verification_image_id", + "verifier_wrapper", + "payment_token" + ] + }, + { + "name": "Compute PCRs", + "description": "Compute PCRs of a given enclave from it's attestation server", + "required_prompts": ["attestation_server_url", "attestion_verifier_url"] + }, + { + "name": "Read Attestation", + "description": "Read the attestation of the enclave from it's attestation server", + "required_prompts": ["attestation_server_url"] + }, + { + "name": "Non-Confidential Market PCRS", + "description": "Get PCRs for non confidential market", + "required_prompts": [] + }, + { + "name": "Claim Rewards", + "description": "Claim accumulated rewards", + "required_prompts": [ + "private_key", + "rpc_url", + "chain_id", + "proof_marketplace", + "payment_token", + "reward_address" + ] + }, + { + "name": "Create Proof Request (non confidential market)", + "description": "Create a proof request for non confidential market", + "required_prompts": [ + "private_key", + "rpc_url", + "chain_id", + "proof_marketplace", + "market_id", + "payment_token", + "max_proof_generation_cost", + "max_proof_generation_time", + "inputs" + ] + }, + { + "name": "Create Proof Request (confidential market)", + "description": "Create a proof request for confidential market. Private Inputs in this markets are shared with TEE directly and ensured that they don't go chain", + "required_prompts": [ + "private_key", + "rpc_url", + "chain_id", + "proof_marketplace", + "entity_registry", + "market_id", + "payment_token", + "max_proof_generation_cost", + "max_proof_generation_time", + "inputs", + "private_inputs" + ] + }, + { + "name": "Discard Request", + "description": "Discard your own request using Request ID", + "required_prompts": [ + "private_key", + "rpc_url", + "chain_id", + "proof_marketplace", + "ask_id" + ] + }, + { + "name": "Whitelist Prover Image", + "description": "Whitelist Prover Image/PCRs for a market", + "required_prompts": [ + "private_key", + "rpc_url", + "chain_id", + "proof_marketplace", + "market_id", + "prover_image_id" + ] + }, + { + "name": "Whitelist IVS Image", + "description": "Whitelist IVS Image/PCRs for a market", + "required_prompts": [ + "private_key", + "rpc_url", + "chain_id", + "proof_marketplace", + "market_id", + "verification_image_id" + ] + }, + { + "name": "Update Encryption Key", + "description": "Update Encryption Key for confidential markets", + "required_prompts": [ + "private_key", + "rpc_url", + "chain_id", + "generator_registry", + "market_id", + "attestation_server_url", + "attestion_verifier_url", + "enclave_client_url" + ] + }, + { + "name": "Add IVS Key", + "description": "Adds IVS Enclave key and register respective keys with the market", + "required_prompts": [ + "private_key", + "rpc_url", + "chain_id", + "generator_registry", + "market_id", + "attestation_server_url", + "attestion_verifier_url", + "enclave_client_url" + ] + }, + { + "name": "Read Proof Bytes (beta)", + "description": "Read Proof Bytes (beta, operation development in progress).", + "required_prompts": [ + "rpc_url", + "chain_id", + "proof_marketplace", + "ask_id" + ] + } + ] +} diff --git a/kalypso-cli/src/config.rs b/kalypso-cli/src/config.rs new file mode 100644 index 0000000..3f1b806 --- /dev/null +++ b/kalypso-cli/src/config.rs @@ -0,0 +1,99 @@ +// src/config.rs + +use serde::Deserialize; +use std::collections::HashMap; + +/// Struct representing each prompt's configuration +#[derive(Debug, Deserialize)] +pub struct PromptConfig { + pub field: String, + pub prompt: String, + pub secret: bool, + pub env_var: String, +} + +/// Struct representing each operation's configuration +#[derive(Debug, Deserialize, Eq, PartialEq, Clone)] +pub struct OperationConfig { + pub name: String, + pub description: String, + pub required_prompts: Vec, +} + +// Implement sorting by `name` +impl Ord for OperationConfig { + fn cmp(&self, other: &Self) -> std::cmp::Ordering { + self.name.cmp(&other.name) + } +} + +impl PartialOrd for OperationConfig { + fn partial_cmp(&self, other: &Self) -> Option { + Some(self.cmp(other)) + } +} + +/// Struct representing the overall configuration file +#[derive(Debug, Deserialize)] +struct ConfigFile { + pub prompts: Vec, + pub operations: Vec, +} + +/// Main configuration struct +pub struct Config { + pub prompts: HashMap, + pub operations: Vec, +} + +const CONFIG_JSON: &str = include_str!("config.json"); + +impl Config { + /// Loads and parses the configuration from `config.json` and `.env` + pub fn new() -> Self { + dotenv::dotenv().ok(); // Load environment variables from .env + + let config_file: ConfigFile = + serde_json::from_str(&CONFIG_JSON).expect("Invalid JSON in config.json"); + + // Convert prompts to a HashMap for easy access by field name + let prompts_map = config_file + .prompts + .into_iter() + .map(|prompt| (prompt.field.clone(), prompt)) + .collect::>(); + + // Validate that all required prompts for each operation exist + for operation in &config_file.operations { + for prompt_field in &operation.required_prompts { + if !prompts_map.contains_key(prompt_field) { + eprintln!( + "Error: Operation '{}' requires undefined prompt '{}'", + operation.name, prompt_field + ); + std::process::exit(1); + } + } + } + + Config { + prompts: prompts_map, + operations: config_file.operations, + } + } + + /// Retrieve a prompt configuration by field name + pub fn get_prompt(&self, field: &str) -> Option<&PromptConfig> { + self.prompts.get(field) + } + + /// Retrieve all operations + pub fn get_operations(&self) -> &Vec { + &self.operations + } + + /// Get environment variable value by env_var name + pub fn get_env(&self, env_var: &str) -> Option { + std::env::var(env_var).ok() + } +} diff --git a/kalypso-cli/src/main.rs b/kalypso-cli/src/main.rs new file mode 100644 index 0000000..2500fb9 --- /dev/null +++ b/kalypso-cli/src/main.rs @@ -0,0 +1,108 @@ +// src/main.rs + +mod common_deps; +mod config; +mod operations; +mod prompts; + +use config::Config; +use dialoguer::{theme::ColorfulTheme, Select}; +use log::{error, info}; +use operations::get_operation; +use prompts::Prompter; +use std::collections::HashMap; +use std::process; + +#[tokio::main] +async fn main() { + // Initialize the logger + env_logger::init(); + + // Load configuration + let config = Config::new(); + + // Retrieve all operations from the configuration + let operations = { + let operations = config.get_operations(); + let mut operations = operations.clone(); + + operations.sort(); + + operations + }; + + if operations.is_empty() { + error!("No operations defined in config.json."); + eprintln!("Error: No operations available. Please check your configuration."); + process::exit(1); + } + + // Present a selection menu to the user + let operation_names: Vec<&str> = operations.iter().map(|op| op.name.as_str()).collect(); + let selection = Select::with_theme(&ColorfulTheme::default()) + .with_prompt("Select an operation") + .items(&operation_names) + .default(0) + .interact() + .unwrap_or_else(|e| { + error!("Failed to interact with user: {}", e); + eprintln!("Error: Failed to select operation."); + process::exit(1); + }); + + let selected_operation = &operations[selection]; + println!( + "\nYou selected: {} - {}\n", + selected_operation.name, selected_operation.description + ); + + // Initialize the prompter with the configuration + let prompter = Prompter::new(&config); + + // Collect required prompts for the selected operation + let final_config: HashMap = prompter + .prompt(&selected_operation.required_prompts) + .unwrap_or_else(|e| { + error!("Failed to collect prompts: {}", e); + eprintln!("Error: {}", e); + process::exit(1); + }); + + // Retrieve the corresponding operation handler + let operation = get_operation(&selected_operation.name).unwrap_or_else(|| { + error!( + "Operation '{}' is not implemented.", + selected_operation.name + ); + eprintln!( + "Error: Operation '{}' is not implemented.", + selected_operation.name + ); + process::exit(1); + }); + + // Execute the operation + match operation.execute(final_config).await { + Ok(_) => { + println!( + "Operation '{}' completed successfully.", + selected_operation.name + ); + info!( + "Operation '{}' completed successfully.", + selected_operation.name + ); + } + Err(e) => { + error!( + "Error during operation '{}': {}", + selected_operation.name, e + ); + eprintln!( + "Error during operation '{}': {}", + selected_operation.name, e + ); + process::exit(1); + } + } +} diff --git a/kalypso-cli/src/operations/claim_rewards.rs b/kalypso-cli/src/operations/claim_rewards.rs new file mode 100644 index 0000000..f1d7bc0 --- /dev/null +++ b/kalypso-cli/src/operations/claim_rewards.rs @@ -0,0 +1,41 @@ +use std::collections::HashMap; + +use async_trait::async_trait; +use ethers::types::U256; + +use crate::common_deps::CommonDeps; + +use super::Operation; + +pub struct ClaimRewardsInfo; + +#[async_trait] +impl Operation for ClaimRewardsInfo { + async fn execute(&self, config: HashMap) -> Result<(), String> { + let claim_rewards_info = CommonDeps::claim_rewards_info(&config)?; + + let available_rewards = claim_rewards_info + .proof_marketplace + .claimable_amount(claim_rewards_info.reward_address) + .call() + .await + .map_err(|_| "Failed making call to proof marketplace contract".to_string())?; + + if available_rewards.eq(&U256::zero()) { + return Err("No Rewards available to claim".to_string()); + } + + let claim_reward_transaction = CommonDeps::send_and_confirm( + claim_rewards_info + .proof_marketplace + .flush(claim_rewards_info.reward_address) + .send(), + ) + .await + .map_err(|e| format!("Claim Reward Transaction failed: {}", e))?; + + println!("Claim Reward Transaction: {}", claim_reward_transaction); + + Ok(()) + } +} diff --git a/kalypso-cli/src/operations/complete_registration.rs b/kalypso-cli/src/operations/complete_registration.rs new file mode 100644 index 0000000..8bfd752 --- /dev/null +++ b/kalypso-cli/src/operations/complete_registration.rs @@ -0,0 +1,77 @@ +// src/operations/complete_registration.rs + +use crate::common_deps::CommonDeps; +use crate::operations::Operation; +use async_trait::async_trait; +use ethers::signers::Signer; +use ethers::types::Address; +use serde::Serialize; +use std::collections::HashMap; + +/// Struct representing the "Complete Registration" operation +pub struct CompleteRegistration; + +/// Implementation of the Operation trait for CompleteRegistration +#[async_trait] +impl Operation for CompleteRegistration { + async fn execute(&self, config: HashMap) -> Result<(), String> { + // Initialize common dependencies + let generator_info = CommonDeps::generator_registration_instance(&config)?; + + #[derive(Serialize)] + struct Generator { + display_name: String, + display_description: String, + website: String, + twitter: String, + } + + let generator = Generator { + display_name: generator_info.display_name, + display_description: generator_info.display_description, + website: generator_info.website, + twitter: generator_info.twitter, + }; + + let generator_json = serde_json::to_string(&generator) + .map_err(|_| "Failed composing generator metadata".to_string())?; + + let generator_metadata = generator_json.as_bytes(); + + match generator_info + .generator_registry + .generator_registry(generator_info.private_key_signer.address()) + .call() + .await + { + Ok(data) => { + if data.0.eq(&Address::zero()) { + let tx_hash = CommonDeps::send_and_confirm( + generator_info + .generator_registry + .register( + generator_info.reward_address, + generator_info.declared_compute, + 0.into(), + generator_metadata.to_vec().into(), + ) + .send(), + ) + .await?; + + // Print the transaction hash + println!("{}", tx_hash); + } else { + return Err(format!("Generator is already registered")); + } + } + Err(_) => { + return Err(format!( + "Failed making call to generator registry contract." + )); + } + } + + Ok(()) + } +} diff --git a/kalypso-cli/src/operations/compute_pcrs.rs b/kalypso-cli/src/operations/compute_pcrs.rs new file mode 100644 index 0000000..04d41db --- /dev/null +++ b/kalypso-cli/src/operations/compute_pcrs.rs @@ -0,0 +1,327 @@ +use crate::common_deps::CommonDeps; +use crate::operations::Operation; +use async_trait::async_trait; +use bytes::Bytes; +use ethers::types::U256; +use futures::{Stream, StreamExt}; +use reqwest::Client; +use serde::Deserialize; +use std::collections::HashMap; +use std::error::Error; + +pub struct NonConfidentialMarketPcrs; + +#[async_trait] +impl Operation for NonConfidentialMarketPcrs { + async fn execute(&self, _config: HashMap) -> Result<(), String> { + let image_id = non_confidential_market_pcrs(); + print!("Image ID: \n{}", image_id); + + println!("\n\nSave Image For Further"); + + Ok(()) + } +} + +pub struct ComputePcrs; + +#[async_trait] +impl Operation for ComputePcrs { + async fn execute(&self, config: HashMap) -> Result<(), String> { + let compute_pcrs_info = CommonDeps::compute_pcrs_info(&config)?; + let attestation_stream = build_attestation(&compute_pcrs_info.attestation_utility, false) + .await + .map_err(|_| "Failed Building Attestations.".to_string())?; + + let attestation_data: Vec = attestation_stream + .fold(Vec::new(), |mut acc, item| async { + match item { + Ok(bytes) => { + acc.extend_from_slice(&bytes); + acc + } + Err(e) => { + println!("Error while receiving data: {}", e); + acc + } + } + }) + .await; + + println!("Attestation Data Length: {}", attestation_data.len()); + + let image_id = get_image_id( + &compute_pcrs_info.attestation_verifier, + attestation_data, + false, + ) + .await + .map_err(|_| "Failed Computing Image ID".to_string())?; + + print!("Image ID: \n{}", image_id); + + println!("\n\nSave Image For Further"); + + Ok(()) + } +} + +pub async fn build_attestation( + base_url: &str, + print_logs: bool, +) -> Result>, Box> { + let attestation_end_point = utility_url(base_url, "/attestation/raw"); + + if print_logs { + println!("build attestation {}", attestation_end_point); + } + + let client = Client::new(); + let response = client.get(&attestation_end_point).send().await?; + + // Check if the response status is successful (2xx) + if !response.status().is_success() { + println!("status code: {}", response.status()); + return Err("failed building the attestation".into()); + } + + // Get the response body as a stream of bytes + let stream = response.bytes_stream(); + + Ok(stream) +} + +fn utility_url(base_url: &str, path: &str) -> String { + format!("{}{}", base_url, path) +} + +#[derive(Debug, Deserialize)] +struct AttestationVerifierResponse { + signature: String, + secp256k1_public: String, + pcr0: String, + pcr1: String, + pcr2: String, + timestamp: usize, +} + +// Function to get attestation by sending attestation_data to the verifier +pub async fn get_image_id( + base_url: &str, + attestation_data: Vec, + print_logs: bool, +) -> Result> { + // Construct the verify endpoint URL + let verify_endpoint = utility_url(base_url, "/verify/raw"); + + if print_logs { + println!("Sending attestation data to {}", verify_endpoint); + } + + let client = Client::new(); + let response = client + .post(&verify_endpoint) + .header("Content-Type", "application/octet-stream") + .body(attestation_data) + .send() + .await?; + + if !response.status().is_success() { + if print_logs { + println!( + "Attestation verifier responded with status: {}", + response.status() + ); + } + return Err("Failed to verify attestation".into()); + } + + let verifier_response: AttestationVerifierResponse = response.json().await?; + + if print_logs { + println!("Fetched attestation successfully"); + println!("Verifier response: {:?}", verifier_response); + } + + // Extract and process secp256k1_public + let ecies_pubkey = format!("0x{}", verifier_response.secp256k1_public); + if ecies_pubkey.len() != 130 { + return Err("secp pub key length incorrect".into()); + } + + // Decode hex strings to bytes + let signature_bytes = hex::decode(&verifier_response.signature.trim_start_matches("0x"))?; + let pcr0_bytes = hex::decode(&verifier_response.pcr0.trim_start_matches("0x"))?; + let pcr1_bytes = hex::decode(&verifier_response.pcr1.trim_start_matches("0x"))?; + let pcr2_bytes = hex::decode(&verifier_response.pcr2.trim_start_matches("0x"))?; + + let _timestamp_u256 = U256::from(verifier_response.timestamp); + let _signature_vec = signature_bytes; + let _ecies_pubkey_vec = + hex::decode(&verifier_response.secp256k1_public.trim_start_matches("0x"))?; + + let pcr0_vec = pcr0_bytes; + let pcr1_vec = pcr1_bytes; + let pcr2_vec = pcr2_bytes; + + let encoded = ethers::abi::encode(&[ + ethers::abi::Token::Bytes(pcr0_vec.into()), + ethers::abi::Token::Bytes(pcr1_vec.into()), + ethers::abi::Token::Bytes(pcr2_vec.into()), + ]); + + Ok(format!("0x{}", hex::encode(encoded))) +} + +pub struct ReadAttestation; + +#[async_trait] +impl Operation for ReadAttestation { + async fn execute(&self, config: HashMap) -> Result<(), String> { + let read_attestation_info = CommonDeps::read_attestation_info(&config)?; + + let attestation_stream = + build_attestation(&read_attestation_info.attestation_utility, false) + .await + .map_err(|_| "Failed Building Attestations.".to_string())?; + + let attestation_data: Vec = attestation_stream + .fold(Vec::new(), |mut acc, item| async { + match item { + Ok(bytes) => { + acc.extend_from_slice(&bytes); + acc + } + Err(e) => { + println!("Error while receiving data: {}", e); + acc + } + } + }) + .await; + + println!("Attestation Data Length: {}\n", attestation_data.len()); + + let attestation_data = format!("0x{}", hex::encode(attestation_data)); + + print!("Attestation: \n{}", attestation_data); + + println!("\n\nSave Image For Further"); + Ok(()) + } +} + +// Function to get attestation by sending attestation_data to the verifier +pub async fn get_verified_attestation( + base_url: &str, + attestation_data: Vec, + print_logs: bool, +) -> Result, Box> { + // Construct the verify endpoint URL + let verify_endpoint = utility_url(base_url, "/verify/raw"); + + if print_logs { + println!("Sending attestation data to {}", verify_endpoint); + } + + let client = Client::new(); + let response = client + .post(&verify_endpoint) + .header("Content-Type", "application/octet-stream") + .body(attestation_data) + .send() + .await?; + + if !response.status().is_success() { + if print_logs { + println!( + "Attestation verifier responded with status: {}", + response.status() + ); + } + return Err("Failed to verify attestation".into()); + } + + let verifier_response: AttestationVerifierResponse = response.json().await?; + + if print_logs { + println!("Fetched attestation successfully"); + println!("Verifier response: {:?}", verifier_response); + } + + // Extract and process secp256k1_public + let ecies_pubkey = format!("0x{}", verifier_response.secp256k1_public); + if ecies_pubkey.len() != 130 { + return Err("secp pub key length incorrect".into()); + } + + // Decode hex strings to bytes + let signature_bytes = hex::decode(&verifier_response.signature.trim_start_matches("0x"))?; + let pcr0_bytes = hex::decode(&verifier_response.pcr0.trim_start_matches("0x"))?; + let pcr1_bytes = hex::decode(&verifier_response.pcr1.trim_start_matches("0x"))?; + let pcr2_bytes = hex::decode(&verifier_response.pcr2.trim_start_matches("0x"))?; + + let timestamp_u256 = U256::from(verifier_response.timestamp); + let signature_vec = signature_bytes; + let ecies_pubkey_vec = + hex::decode(&verifier_response.secp256k1_public.trim_start_matches("0x"))?; + + let pcr0_vec = pcr0_bytes; + let pcr1_vec = pcr1_bytes; + let pcr2_vec = pcr2_bytes; + + let encoded = ethers::abi::encode(&[ + ethers::abi::Token::Bytes(signature_vec.into()), + ethers::abi::Token::Bytes(ecies_pubkey_vec.into()), + ethers::abi::Token::Bytes(pcr0_vec.into()), + ethers::abi::Token::Bytes(pcr1_vec.into()), + ethers::abi::Token::Bytes(pcr2_vec.into()), + ethers::abi::Token::Uint(timestamp_u256), + ]); + + Ok(encoded) +} + +pub fn non_confidential_market_pcrs() -> String { + let non_confidential_pcrs = non_confidential_pcrs(); + + let encoded = ethers::abi::encode(&[ + ethers::abi::Token::Bytes(non_confidential_pcrs.pcr0_vec), + ethers::abi::Token::Bytes(non_confidential_pcrs.pcr1_vec), + ethers::abi::Token::Bytes(non_confidential_pcrs.pcr2_vec), + ]); + + let image_id = format!("0x{}", hex::encode(encoded)); + + image_id +} + +pub struct PCRS { + pub pcr0_vec: Vec, + pub pcr1_vec: Vec, + pub pcr2_vec: Vec, +} +pub fn non_confidential_pcrs() -> PCRS { + let pcr0_vec = vec![0; 48]; + let pcr1_vec = vec![0; 48]; + let pcr2_vec = vec![0; 48]; + + PCRS { + pcr0_vec, + pcr1_vec, + pcr2_vec, + } +} + +use ethers::types::H256; +use ethers::utils::keccak256; + +pub fn get_kalypso_image_id_from_pcrs(pcr0: Bytes, pcr1: Bytes, pcr2: Bytes) -> H256 { + let mut data = Vec::new(); + data.extend_from_slice(&pcr0); + data.extend_from_slice(&pcr1); + data.extend_from_slice(&pcr2); + + // Compute the keccak256 hash + keccak256(data).into() +} diff --git a/kalypso-cli/src/operations/create_marketplace.rs b/kalypso-cli/src/operations/create_marketplace.rs new file mode 100644 index 0000000..0c2ca9b --- /dev/null +++ b/kalypso-cli/src/operations/create_marketplace.rs @@ -0,0 +1,83 @@ +use crate::{common_deps::CommonDeps, operations::Operation}; +use async_trait::async_trait; +use ethers::{signers::Signer, types::U256}; +use std::collections::HashMap; + +pub struct CreateMarketplace; + +#[async_trait] +impl Operation for CreateMarketplace { + async fn execute(&self, config: HashMap) -> Result<(), String> { + let market_create_info = CommonDeps::market_create_info(&config)?; + + let token_balance = market_create_info + .payment_token + .balance_of(market_create_info.private_key_signer.address()) + .call() + .await + .map_err(|_| "Failed making call to payment token contract.".to_string())?; + + let market_creation_cost = { + let result = market_create_info + .proof_marketplace + .market_creation_cost() + .call() + .await + .map_err(|_| "Failed making call to proof marketplace contract".to_string())?; + + result + 1 + }; + + if market_creation_cost > token_balance { + return Err("Insufficient payment token available".to_string()); + } + + let token_allowance = market_create_info + .payment_token + .allowance( + market_create_info.private_key_signer.address(), + market_create_info.proof_marketplace.address(), + ) + .call() + .await + .map_err(|_| "Failed making call to payment token contract.".to_string())?; + + if token_allowance < market_creation_cost { + let token_approval_transaction = CommonDeps::send_and_confirm( + market_create_info + .payment_token + .approve( + market_create_info.proof_marketplace.address(), + market_creation_cost, + ) + .send(), + ) + .await + .map_err(|e| format!("Token approval failed: {}", e))?; + + println!("Token Approval: {}", token_approval_transaction); + } + + let market_creation_transaction = CommonDeps::send_and_confirm( + market_create_info + .proof_marketplace + .create_marketplace( + vec![12, 23].into(), + market_create_info.verifier_wrapper, + U256::from(10).pow(U256::from(18)), + market_create_info.prover_pcrs.into(), + market_create_info.ivs_pcrs.into(), + ) + .send(), + ) + .await + .map_err(|e| format!("Market Creation Transaction failed: {}", e))?; + + println!( + "Market Creation Transaction: {}", + market_creation_transaction + ); + + Ok(()) + } +} diff --git a/kalypso-cli/src/operations/create_request.rs b/kalypso-cli/src/operations/create_request.rs new file mode 100644 index 0000000..0bcaf1d --- /dev/null +++ b/kalypso-cli/src/operations/create_request.rs @@ -0,0 +1,250 @@ +use std::collections::HashMap; + +use async_trait::async_trait; +use ethers::{signers::Signer, types::U256}; + +use crate::{ + common_deps::CommonDeps, + operations::compute_pcrs::{get_kalypso_image_id_from_pcrs, non_confidential_pcrs}, +}; + +use super::Operation; + +pub struct ConfidentialRequest; + +#[async_trait] +impl Operation for ConfidentialRequest { + async fn execute(&self, config: HashMap) -> Result<(), String> { + let confidential_request_info = CommonDeps::confidential_request_info(&config)?; + let non_confidential_pcrs = non_confidential_pcrs(); + let non_confidential_market_kalypso_image_id = get_kalypso_image_id_from_pcrs( + non_confidential_pcrs.pcr0_vec.into(), + non_confidential_pcrs.pcr1_vec.into(), + non_confidential_pcrs.pcr2_vec.into(), + ); + + let market_data = confidential_request_info + .proof_marketplace + .market_data(confidential_request_info.market_id) + .call() + .await + .map_err(|_| "Failed making call to proof marketplace contract.".to_string())?; + + if market_data.1 == non_confidential_market_kalypso_image_id.0 { + return Err("This market is a confidential market".to_string()); + } + + let token_balance = confidential_request_info + .payment_token + .balance_of(confidential_request_info.private_key_signer.address()) + .call() + .await + .map_err(|_| "Failed making call to payment token contract.".to_string())?; + + if confidential_request_info.max_proof_generation_cost > token_balance { + return Err("Insufficient payment token available".to_string()); + } + + let token_allowance = confidential_request_info + .payment_token + .allowance( + confidential_request_info.private_key_signer.address(), + confidential_request_info.proof_marketplace.address(), + ) + .call() + .await + .map_err(|_| "Failed making call to payment token contract.".to_string())?; + + if token_allowance < confidential_request_info.max_proof_generation_cost { + let token_approval_transaction = CommonDeps::send_and_confirm( + confidential_request_info + .payment_token + .approve( + confidential_request_info.proof_marketplace.address(), + confidential_request_info.max_proof_generation_cost, + ) + .send(), + ) + .await + .map_err(|e| format!("Token approval failed: {}", e))?; + + println!("Token Approval: {}", token_approval_transaction); + } + + let compressed_private_inputs = + compress_data(&confidential_request_info.private_inputs.to_vec()) + .map_err(|_| "Failed private input compression.".to_string())?; + + let matching_engine_key = confidential_request_info + .entity_registry + .pub_key( + confidential_request_info.proof_marketplace.address(), + 0.into(), + ) + .await + .map_err(|e| { + format!( + "Failed Fetching Matching Keys from Entity Key Registry: {}", + e + ) + })?; + + let (encrypted_private_input, acl) = prepare_encrypted_data( + &compressed_private_inputs, + &matching_engine_key.to_vec(), + confidential_request_info.market_id, + ) + .map_err(|_| "Failed Encryption".to_string())?; + + let proof_request_transaction = CommonDeps::send_and_confirm( + confidential_request_info + .proof_marketplace + .create_ask( + bindings::proof_marketplace::Ask { + market_id: confidential_request_info.market_id, + reward: confidential_request_info.max_proof_generation_cost, + expiry: (10000000000000 as u64).into(), + time_taken_for_proof_generation: confidential_request_info + .max_proof_generation_time, + deadline: U256::zero(), + refund_address: confidential_request_info.private_key_signer.address(), + prover_data: confidential_request_info.inputs, + }, + 0.into(), // `secret_type` argument + encrypted_private_input.into(), // `encrypted private_inputs` argument + acl.into(), // `acl` argument + ) + .send(), + ) + .await?; + + // Print the transaction hash + println!("proof request transaction: {}", proof_request_transaction); + + Ok(()) + } +} + +pub struct NonConfidentialRequest; + +#[async_trait] +impl Operation for NonConfidentialRequest { + async fn execute(&self, config: HashMap) -> Result<(), String> { + let non_confidential_request_info = CommonDeps::non_confidential_request_info(&config)?; + let non_confidential_pcrs = non_confidential_pcrs(); + let non_confidential_market_kalypso_image_id = get_kalypso_image_id_from_pcrs( + non_confidential_pcrs.pcr0_vec.into(), + non_confidential_pcrs.pcr1_vec.into(), + non_confidential_pcrs.pcr2_vec.into(), + ); + + let market_data = non_confidential_request_info + .proof_marketplace + .market_data(non_confidential_request_info.market_id) + .call() + .await + .map_err(|_| "Failed making call to proof marketplace contract.".to_string())?; + + if market_data.1 != non_confidential_market_kalypso_image_id.0 { + return Err("This market is not a confidential market".to_string()); + } + + let token_balance = non_confidential_request_info + .payment_token + .balance_of(non_confidential_request_info.private_key_signer.address()) + .call() + .await + .map_err(|_| "Failed making call to payment token contract.".to_string())?; + + if non_confidential_request_info.max_proof_generation_cost > token_balance { + return Err("Insufficient payment token available".to_string()); + } + + let token_allowance = non_confidential_request_info + .payment_token + .allowance( + non_confidential_request_info.private_key_signer.address(), + non_confidential_request_info.proof_marketplace.address(), + ) + .call() + .await + .map_err(|_| "Failed making call to payment token contract.".to_string())?; + + if token_allowance < non_confidential_request_info.max_proof_generation_cost { + let token_approval_transaction = CommonDeps::send_and_confirm( + non_confidential_request_info + .payment_token + .approve( + non_confidential_request_info.proof_marketplace.address(), + non_confidential_request_info.max_proof_generation_cost, + ) + .send(), + ) + .await + .map_err(|e| format!("Token approval failed: {}", e))?; + + println!("Token Approval: {}", token_approval_transaction); + } + + let proof_request_transaction = CommonDeps::send_and_confirm( + non_confidential_request_info + .proof_marketplace + .create_ask( + bindings::proof_marketplace::Ask { + market_id: non_confidential_request_info.market_id, + reward: non_confidential_request_info.max_proof_generation_cost, + expiry: (10000000000000 as u64).into(), + time_taken_for_proof_generation: non_confidential_request_info + .max_proof_generation_time, + deadline: U256::zero(), + refund_address: non_confidential_request_info.private_key_signer.address(), + prover_data: non_confidential_request_info.inputs, + }, + 0.into(), // `secret_type` argument + vec![].into(), // `private_inputs` argument + vec![].into(), // `acl` argument + ) + .send(), + ) + .await?; + + // Print the transaction hash + println!("proof request transaction: {}", proof_request_transaction); + + Ok(()) + } +} + +use flate2::write::ZlibEncoder; +use flate2::Compression; +use std::io::Write; + +fn compress_data(data: &[u8]) -> Result, String> { + let mut encoder = ZlibEncoder::new(Vec::new(), Compression::default()); + encoder + .write_all(data) + .map_err(|_| "Failed Private Input Encoding".to_string())?; + let compressed_data = encoder + .finish() + .map_err(|_| "Failed private input compression".to_string())?; + Ok(compressed_data) +} + +use openssl::rand; +// for kalypso-specific, market_id is associated data +fn prepare_encrypted_data( + data: &[u8], + pubkey: &[u8], + associated_data: U256, +) -> Result<(Vec, Vec), String> { + let mut cipher = vec![0; 32]; + rand::rand_bytes(&mut cipher).map_err(|_| "Failed creating cipher".to_string())?; + + let encrypted_data = + kalypso_helper::secret_inputs_helpers::encrypt_aes_gcm(data, pubkey, associated_data) + .map_err(|_| "Failed making call to payment token contract.".to_string())?; + let acl = kalypso_helper::secret_inputs_helpers::encrypt_ecies(pubkey, &cipher) + .map_err(|_| "Failed encrypting cipher key".to_string())?; + + Ok((encrypted_data, acl)) +} diff --git a/kalypso-cli/src/operations/join_marketplace.rs b/kalypso-cli/src/operations/join_marketplace.rs new file mode 100644 index 0000000..98bb59c --- /dev/null +++ b/kalypso-cli/src/operations/join_marketplace.rs @@ -0,0 +1,67 @@ +use crate::{common_deps::CommonDeps, operations::Operation}; +use async_trait::async_trait; +use ethers::{signers::Signer, types::Address}; +use std::collections::HashMap; + +pub struct JoinMarketplace; + +#[async_trait] +impl Operation for JoinMarketplace { + async fn execute(&self, config: HashMap) -> Result<(), String> { + let generator_join_market = CommonDeps::generator_join_market_instance(&config)?; + + match generator_join_market + .generator_registry + .generator_registry(generator_join_market.private_key_signer.address()) + .call() + .await + { + Ok(data) => { + if data.0.eq(&Address::zero()) { + return Err(format!("Please 'Register' operator first")); + } else { + let info_per_market = generator_join_market + .generator_registry + .generator_info_per_market( + generator_join_market.private_key_signer.address(), + generator_join_market.market_id, + ) + .call() + .await + .map_err(|_| { + "Failed making call to generator registry contract.".to_string() + })?; + + if info_per_market.0 != 0 { + return Err(format!("Generator has already joined the market.")); + } + + let tx_hash = CommonDeps::send_and_confirm( + generator_join_market + .generator_registry + .join_marketplace( + generator_join_market.market_id, + generator_join_market.compute_per_request_required, + generator_join_market.proof_generation_cost, + generator_join_market.proposed_time, + false, + vec![].into(), + vec![].into(), + ) + .send(), + ) + .await?; + + // Print the transaction hash + println!("{}", tx_hash); + } + } + Err(_) => { + return Err(format!( + "Failed making call to generator registry contract." + )); + } + } + Ok(()) + } +} diff --git a/kalypso-cli/src/operations/leave_or_request_leave_marketplace.rs b/kalypso-cli/src/operations/leave_or_request_leave_marketplace.rs new file mode 100644 index 0000000..afc6f16 --- /dev/null +++ b/kalypso-cli/src/operations/leave_or_request_leave_marketplace.rs @@ -0,0 +1,50 @@ +// src/operations/complete_registration.rs + +use crate::common_deps::CommonDeps; +use crate::operations::Operation; +use async_trait::async_trait; +use std::collections::HashMap; + +pub struct RequestMarketPlaceExit; + +#[async_trait] +impl Operation for RequestMarketPlaceExit { + async fn execute(&self, config: HashMap) -> Result<(), String> { + // Initialize common dependencies + let request_exit_info = CommonDeps::marketplace_exit_info(&config)?; + + let tx_hash = CommonDeps::send_and_confirm( + request_exit_info + .generator_registry + .request_for_exit_marketplace(request_exit_info.market_id) + .send(), + ) + .await?; + + // Print the transaction hash + println!("Request Marketplace Exit tx: {}", tx_hash); + Ok(()) + } +} + +pub struct LeaveMarketPlace; + +#[async_trait] +impl Operation for LeaveMarketPlace { + async fn execute(&self, config: HashMap) -> Result<(), String> { + // Initialize common dependencies + let request_exit_info = CommonDeps::marketplace_exit_info(&config)?; + + let tx_hash = CommonDeps::send_and_confirm( + request_exit_info + .generator_registry + .leave_marketplace(request_exit_info.market_id) + .send(), + ) + .await?; + + // Print the transaction hash + println!("Marketplace Exit tx: {}", tx_hash); + Ok(()) + } +} diff --git a/kalypso-cli/src/operations/mod.rs b/kalypso-cli/src/operations/mod.rs new file mode 100644 index 0000000..705d6ca --- /dev/null +++ b/kalypso-cli/src/operations/mod.rs @@ -0,0 +1,77 @@ +// src/operations/mod.rs + +pub mod claim_rewards; +pub mod complete_registration; +pub mod compute_pcrs; +pub mod create_marketplace; +pub mod create_request; +pub mod join_marketplace; +pub mod leave_or_request_leave_marketplace; +pub mod read_proof; +pub mod request; +pub mod stake; +pub mod update_encryption_key; +pub mod whitelist; + +// ... Add other operation modules here + +use async_trait::async_trait; +use std::collections::HashMap; + +/// Trait that all operations must implement +#[async_trait] +pub trait Operation: Send + Sync { + /// Executes the operation with the provided configuration + /// + /// # Arguments + /// + /// * `config` - A HashMap containing prompt values required for the operation + /// + /// # Returns + /// + /// * `Ok(())` if the operation succeeds + /// * `Err(String)` with an error message if the operation fails + async fn execute(&self, config: HashMap) -> Result<(), String>; +} + +/// Factory function to retrieve an operation handler based on its name +/// +/// # Arguments +/// +/// * `name` - The name of the operation as defined in `config.rs` +/// +/// # Returns +/// +/// * `Some(Box)` if the operation is implemented +/// * `None` if the operation is not found +pub fn get_operation(name: &str) -> Option> { + match name { + "Register" => Some(Box::new(complete_registration::CompleteRegistration)), + "Join Marketplace" => Some(Box::new(join_marketplace::JoinMarketplace)), + "Stake" => Some(Box::new(stake::Stake)), + "Request To Leave Marketplace" => Some(Box::new( + leave_or_request_leave_marketplace::RequestMarketPlaceExit, + )), + "Leave Marketplace" => Some(Box::new( + leave_or_request_leave_marketplace::LeaveMarketPlace, + )), + "Create Marketplace" => Some(Box::new(create_marketplace::CreateMarketplace)), + "Read Attestation" => Some(Box::new(compute_pcrs::ReadAttestation)), + "Compute PCRs" => Some(Box::new(compute_pcrs::ComputePcrs)), + "Non-Confidential Market PCRS" => Some(Box::new(compute_pcrs::NonConfidentialMarketPcrs)), + "Claim Rewards" => Some(Box::new(claim_rewards::ClaimRewardsInfo)), + "Create Proof Request (non confidential market)" => { + Some(Box::new(create_request::NonConfidentialRequest)) + } + "Create Proof Request (confidential market)" => { + Some(Box::new(create_request::ConfidentialRequest)) + } + "Discard Request" => Some(Box::new(request::DiscardRequest)), + "Whitelist Prover Image" => Some(Box::new(whitelist::WhitelistProverImage)), + "Whitelist IVS Image" => Some(Box::new(whitelist::WhitelistVerificationImage)), + "Update Encryption Key" => Some(Box::new(update_encryption_key::UpdateEncryptionKey)), + "Add IVS Key" => Some(Box::new(update_encryption_key::AddIvsKey)), + "Read Proof Bytes (beta)" => Some(Box::new(read_proof::ReadProof)), + _ => unimplemented!(), + } +} diff --git a/kalypso-cli/src/operations/read_proof.rs b/kalypso-cli/src/operations/read_proof.rs new file mode 100644 index 0000000..ae19fb5 --- /dev/null +++ b/kalypso-cli/src/operations/read_proof.rs @@ -0,0 +1,35 @@ +use std::collections::HashMap; + +use async_trait::async_trait; +use ethers::providers::Middleware; + +use crate::common_deps::CommonDeps; + +use super::Operation; + +pub struct ReadProof; + +#[async_trait] +impl Operation for ReadProof { + async fn execute(&self, config: HashMap) -> Result<(), String> { + let read_proof_info = CommonDeps::read_proof_info(&config)?; + + let filter = read_proof_info + .proof_marketplace + .proof_created_filter() + .filter + .topic0(read_proof_info.ask_id); + + let logs = read_proof_info + .provider_http + .get_logs(&filter) + .await + .map_err(|e| format!("Failed Reading Proof: {}", e))?; + + for log in logs { + println!("Log: {:?}", log); + } + + Ok(()) + } +} diff --git a/kalypso-cli/src/operations/request.rs b/kalypso-cli/src/operations/request.rs new file mode 100644 index 0000000..a2e9f5c --- /dev/null +++ b/kalypso-cli/src/operations/request.rs @@ -0,0 +1,29 @@ +use std::collections::HashMap; + +use async_trait::async_trait; + +use crate::common_deps::CommonDeps; + +use super::Operation; + +pub struct DiscardRequest; + +#[async_trait] +impl Operation for DiscardRequest { + async fn execute(&self, config: HashMap) -> Result<(), String> { + let discard_request_info = CommonDeps::discard_request_info(&config)?; + + let tx_hash = CommonDeps::send_and_confirm( + discard_request_info + .proof_marketplace + .discard_request(discard_request_info.ask_id) + .send(), + ) + .await?; + + // Print the transaction hash + println!("{}", tx_hash); + + Ok(()) + } +} diff --git a/kalypso-cli/src/operations/stake.rs b/kalypso-cli/src/operations/stake.rs new file mode 100644 index 0000000..a24e0e5 --- /dev/null +++ b/kalypso-cli/src/operations/stake.rs @@ -0,0 +1,84 @@ +use crate::{common_deps::CommonDeps, operations::Operation}; +use async_trait::async_trait; +use ethers::{signers::Signer, types::Address}; +use std::collections::HashMap; + +pub struct Stake; + +/// Implementation of the Operation trait for Stake +#[async_trait] +impl Operation for Stake { + async fn execute(&self, config: HashMap) -> Result<(), String> { + // Initialize dependencies + let stake_for_generator = CommonDeps::stake_for_generator(&config)?; + + // Fetch generator registry data + let data = stake_for_generator + .generator_registry + .generator_registry(stake_for_generator.staking_address) + .call() + .await + .map_err(|_| "Failed making call to generator registry contract.")?; + + // Check if the operator is registered + if data.0 == Address::zero() { + return Err("Please 'Register' operator first".to_string()); + } + + // Fetch token balance + let token_balance = stake_for_generator + .staking_token + .balance_of(stake_for_generator.private_key_signer.address()) + .call() + .await + .map_err(|_| "Failed making call to staking token contract.".to_string())?; + + // Check if the balance is sufficient + if token_balance < stake_for_generator.stake { + return Err("Insufficient staking token available".to_string()); + } + + let token_allowance = stake_for_generator + .staking_token + .allowance( + stake_for_generator.private_key_signer.address(), + stake_for_generator.generator_registry.address(), + ) + .call() + .await + .map_err(|_| "Failed making call to staking token contract.".to_string())?; + + if token_allowance < stake_for_generator.stake { + // Approve tokens for staking + let token_approval_transaction = CommonDeps::send_and_confirm( + stake_for_generator + .staking_token + .approve( + stake_for_generator.generator_registry.address(), + stake_for_generator.stake, + ) + .send(), + ) + .await + .map_err(|e| format!("Token approval failed: {}", e))?; + + println!("Token Approval: {}", token_approval_transaction); + } + + let staking_transaction = CommonDeps::send_and_confirm( + stake_for_generator + .generator_registry + .stake( + stake_for_generator.staking_address, + stake_for_generator.stake, + ) + .send(), + ) + .await + .map_err(|e| format!("Staking Transaction failed: {}", e))?; + + println!("Staking Transaction: {}", staking_transaction); + + Ok(()) + } +} diff --git a/kalypso-cli/src/operations/update_encryption_key.rs b/kalypso-cli/src/operations/update_encryption_key.rs new file mode 100644 index 0000000..81dacdf --- /dev/null +++ b/kalypso-cli/src/operations/update_encryption_key.rs @@ -0,0 +1,297 @@ +use std::collections::HashMap; + +use async_trait::async_trait; +use ethers::signers::Signer; +use futures::StreamExt; + +use crate::{common_deps::CommonDeps, operations::compute_pcrs}; + +use super::Operation; + +pub struct AddIvsKey; +#[async_trait] +impl Operation for AddIvsKey { + async fn execute(&self, config: HashMap) -> Result<(), String> { + let add_ivs_key_info = CommonDeps::add_ivs_key_info(&config)?; + + let attestation_stream = + compute_pcrs::build_attestation(&add_ivs_key_info.attestation_utility, false) + .await + .map_err(|_| "Failed Building Attestations.".to_string())?; + + let attestation_data: Vec = attestation_stream + .fold(Vec::new(), |mut acc, item| async { + match item { + Ok(bytes) => { + acc.extend_from_slice(&bytes); + acc + } + Err(e) => { + println!("Error while receiving data: {}", e); + acc + } + } + }) + .await; + + let verified_attestation = compute_pcrs::get_verified_attestation( + &add_ivs_key_info.attestation_verifier, + attestation_data, + false, + ) + .await + .map_err(|_| "Failed Verifying attestation".to_string())?; + + let mut headers = HeaderMap::new(); + headers.insert("Content-Type", HeaderValue::from_static("application/json")); + + let enclave_signature = get_attestation_signature( + hex::encode(&verified_attestation).as_ref(), + hex::encode( + add_ivs_key_info + .private_key_signer + .address() + .as_bytes() + .to_vec(), + ) + .as_ref(), + false, + &add_ivs_key_info.enclave_client_url, + headers, + ) + .await + .map_err(|_| "Failed Getting Attestation Signature".to_string())?; + + let add_ivskey_transaction = CommonDeps::send_and_confirm( + add_ivs_key_info + .generator_registry + .add_ivs_key( + add_ivs_key_info.market_id, + verified_attestation.into(), + enclave_signature.into(), + ) + .send(), + ) + .await + .map_err(|e| format!("Add IVS KEY Transaction failed: {}", e))?; + + println!("Add IVS Key Transaction: {}", add_ivskey_transaction); + + Ok(()) + } +} + +pub struct UpdateEncryptionKey; + +#[async_trait] +impl Operation for UpdateEncryptionKey { + async fn execute(&self, config: HashMap) -> Result<(), String> { + let update_encryption_info = CommonDeps::update_encryption_info(&config)?; + + let attestation_stream = + compute_pcrs::build_attestation(&update_encryption_info.attestation_utility, false) + .await + .map_err(|_| "Failed Building Attestations.".to_string())?; + + let attestation_data: Vec = attestation_stream + .fold(Vec::new(), |mut acc, item| async { + match item { + Ok(bytes) => { + acc.extend_from_slice(&bytes); + acc + } + Err(e) => { + println!("Error while receiving data: {}", e); + acc + } + } + }) + .await; + + let verified_attestation = compute_pcrs::get_verified_attestation( + &update_encryption_info.attestation_verifier, + attestation_data, + false, + ) + .await + .map_err(|_| "Failed Verifying attestation".to_string())?; + + let mut headers = HeaderMap::new(); + headers.insert("Content-Type", HeaderValue::from_static("application/json")); + + let enclave_signature = get_attestation_signature( + hex::encode(&verified_attestation).as_ref(), + hex::encode( + update_encryption_info + .private_key_signer + .address() + .as_bytes() + .to_vec(), + ) + .as_ref(), + false, + &update_encryption_info.enclave_client_url, + headers, + ) + .await + .map_err(|_| "Failed Getting Attestation Signature".to_string())?; + + let update_encryption_key_transaction = CommonDeps::send_and_confirm( + update_encryption_info + .generator_registry + .update_encryption_key( + update_encryption_info.market_id, + verified_attestation.into(), + enclave_signature.into(), + ) + .send(), + ) + .await + .map_err(|e| format!("Update Encryption Key Transaction failed: {}", e))?; + + println!( + "Update Encryption Key Transaction: {}", + update_encryption_key_transaction + ); + + Ok(()) + } +} + +use reqwest::header::{HeaderMap, HeaderValue}; +use serde::Deserialize; +use std::error::Error; + +#[derive(Deserialize)] +struct SignAddressResponse { + #[allow(unused)] + message: String, + data: SignAddressData, +} + +#[derive(Deserialize)] +struct SignAddressData { + r: String, + s: String, + v: u8, +} + +#[allow(unused)] +pub async fn get_address_signature( + address: &str, + print_logs: bool, + enclave_client_url: &str, + headers: HeaderMap, +) -> Result, Box> { + let full_url = format!("{}/api/signAddress", enclave_client_url); + if print_logs { + println!("Fetching signature from URL: {}", full_url); + } + + let payload = serde_json::json!({ "address": format!("0x{}", address) }); + let client = reqwest::Client::new(); + let response = client + .post(&full_url) + .headers(headers) + .json(&payload) + .send() + .await + .map_err(|e| { + Box::new(std::io::Error::new( + std::io::ErrorKind::Other, + format!("Failed to send request: {}", e), + )) as Box + })?; + + if !response.status().is_success() { + return Err(format!("Error: {}", response.status()).into()); + } + + let response_json: SignAddressResponse = response.json().await?; + let _v = match response_json.data.v { + 27 => "1b", + 28 => "1c", + other => return Err(format!("Unexpected value for v: {}", other).into()), + }; + + let s_clean = response_json + .data + .s + .strip_prefix("0x") + .unwrap_or(&response_json.data.s); + + if !response_json.data.r.starts_with("0x") || s_clean.len() != 64 { + return Err("Invalid `r` or `s` format in response".into()); + } + + let signature_str = format!( + "{}{}{}", + response_json.data.r.trim_start_matches("0x"), + s_clean, + _v + ); + + let signature_hex = signature_str.strip_prefix("0x").unwrap_or(&signature_str); + let signature_bytes = hex::decode(signature_hex)?; + Ok(signature_bytes) +} + +pub async fn get_attestation_signature( + attestation: &str, + address: &str, + print_logs: bool, + enclave_client_url: &str, + headers: HeaderMap, +) -> Result, Box> { + let full_url = format!("{}/api/signAttestation", enclave_client_url); + if print_logs { + println!("Fetching signature from URL: {}", full_url); + } + + let payload = serde_json::json!({ "attestation": format!("0x{}",attestation), "address": format!("0x{}", address) }); + let client = reqwest::Client::new(); + let response = client + .post(&full_url) + .headers(headers) + .json(&payload) + .send() + .await + .map_err(|e| { + Box::new(std::io::Error::new( + std::io::ErrorKind::Other, + format!("Failed to send request: {}", e), + )) as Box + })?; + + if !response.status().is_success() { + return Err(format!("Error: {}", response.status()).into()); + } + + let response_json: SignAddressResponse = response.json().await?; + let _v = match response_json.data.v { + 27 => "1b", + 28 => "1c", + other => return Err(format!("Unexpected value for v: {}", other).into()), + }; + + let s_clean = response_json + .data + .s + .strip_prefix("0x") + .unwrap_or(&response_json.data.s); + + if !response_json.data.r.starts_with("0x") || s_clean.len() != 64 { + return Err("Invalid `r` or `s` format in response".into()); + } + + let signature_str = format!( + "{}{}{}", + response_json.data.r.trim_start_matches("0x"), + s_clean, + _v + ); + + let signature_hex = signature_str.strip_prefix("0x").unwrap_or(&signature_str); + let signature_bytes = hex::decode(signature_hex)?; + Ok(signature_bytes) +} diff --git a/kalypso-cli/src/operations/whitelist.rs b/kalypso-cli/src/operations/whitelist.rs new file mode 100644 index 0000000..75b264e --- /dev/null +++ b/kalypso-cli/src/operations/whitelist.rs @@ -0,0 +1,62 @@ +use std::collections::HashMap; + +use async_trait::async_trait; + +use crate::common_deps::CommonDeps; + +use super::Operation; + +pub struct WhitelistProverImage; + +#[async_trait] +impl Operation for WhitelistProverImage { + async fn execute(&self, config: HashMap) -> Result<(), String> { + let whitelist_prover_info = CommonDeps::whitelist_prover_image_info(&config)?; + + let whitelist_prover_transaction = CommonDeps::send_and_confirm( + whitelist_prover_info + .proof_marketplace + .add_extra_images( + whitelist_prover_info.market_id, + vec![whitelist_prover_info.prover_image_id], + vec![], + ) + .send(), + ) + .await + .map_err(|e| format!("Whitelist Prover Transaction failed: {}", e))?; + + println!( + "Whitelist Prover Transaction: {}", + whitelist_prover_transaction + ); + + Ok(()) + } +} + +pub struct WhitelistVerificationImage; + +#[async_trait] +impl Operation for WhitelistVerificationImage { + async fn execute(&self, config: HashMap) -> Result<(), String> { + let whitelist_ivs_info = CommonDeps::whitelist_verification_image_info(&config)?; + + let whitelist_ivs_transaction = CommonDeps::send_and_confirm( + whitelist_ivs_info + .proof_marketplace + .add_extra_images( + whitelist_ivs_info.market_id, + vec![], + vec![whitelist_ivs_info.verification_image_id], + ) + .send(), + ) + .await + .map_err(|e| format!("Whitelist IVS Transaction failed: {}", e))?; + + println!("Whitelist IVS Transaction: {}", whitelist_ivs_transaction); + + Ok(()) + } +} diff --git a/kalypso-cli/src/prompts.rs b/kalypso-cli/src/prompts.rs new file mode 100644 index 0000000..b77ea96 --- /dev/null +++ b/kalypso-cli/src/prompts.rs @@ -0,0 +1,313 @@ +// src/prompts.rs +use crate::config::Config; +use dialoguer::{Input, Password}; +use ethers::prelude::*; // Import all necessary types and traits +use std::collections::HashMap; +use std::error::Error; + +/// Type alias for validation functions +type Validator = fn(&str) -> Result<(), String>; + +/// Struct responsible for handling user prompts +pub struct Prompter<'a> { + config: &'a Config, + validators: HashMap, +} + +impl<'a> Prompter<'a> { + /// Creates a new Prompter instance with optional validators + pub fn new(config: &'a Config) -> Self { + let mut validators: HashMap = HashMap::new(); + + // Register validators for specific fields + validators.insert("rpc_url".to_string(), validate_rpc_url as Validator); + validators.insert("private_key".to_string(), validate_private_key as Validator); + validators.insert("market_id".to_string(), validate_dec_str_id as Validator); + validators.insert("chain_id".to_string(), validate_dec_str_id as Validator); + + validators.insert( + "generator_registry".to_string(), + validate_eth_address as Validator, + ); + + validators.insert( + "proof_marketplace".to_string(), + validate_eth_address as Validator, + ); + + validators.insert("reward_address".to_string(), validate_eth_address); + validators.insert("declared_compute".to_string(), validate_dec_str_id); + validators.insert("stake".to_string(), validate_dec_str_id); + validators.insert("compute_per_request".to_string(), validate_dec_str_id); + validators.insert("proposed_time".to_string(), validate_dec_str_id); + + validators.insert("staking_address".into(), validate_eth_address); + validators.insert("staking_token".to_string(), validate_eth_address); + validators.insert("payment_token".to_string(), validate_eth_address); + + validators.insert("prover_image_id".to_string(), validate_image_id); + validators.insert("verification_image_id".to_string(), validate_image_id); + validators.insert("verifier_wrapper".to_string(), validate_eth_address); + validators.insert("attestation_server_url".to_string(), validate_rpc_url); + validators.insert("attestion_verifier_url".to_string(), validate_rpc_url); + validators.insert("max_proof_generation_cost".to_string(), validate_dec_str_id); + validators.insert("inputs".to_string(), validate_inputs); + validators.insert("max_proof_generation_time".to_string(), validate_dec_str_id); + validators.insert("ask_id".to_string(), validate_dec_str_id); + validators.insert("enclave_client_url".to_string(), validate_rpc_url); + validators.insert("private_inputs".to_string(), validate_inputs); + validators.insert("entity_registry".to_string(), validate_eth_address); + validators.insert("display_name".to_string(), validate_string); + validators.insert("display_description".to_string(), validate_string); + validators.insert("website".to_string(), validate_string); + validators.insert("twitter".to_string(), validate_string); + + validators.insert( + "confirmation".to_string(), + validate_confirmation as Validator, + ); + // Add other field validators as needed + + Prompter { config, validators } + } + + /// Prompts the user based on the list of required prompt fields + /// + /// Returns a HashMap of field names to user inputs if all validations pass + /// Returns an error string if any prompt fails validation + pub fn prompt( + &self, + required_fields: &[String], + ) -> Result, Box> { + let mut final_config = HashMap::new(); + + for field in required_fields { + if let Some(prompt_config) = self.config.get_prompt(field) { + // Check if the environment variable is set + if let Some(env_val) = self.config.get_env(&prompt_config.env_var) { + println!( + "Using {} from environment variable {}", + prompt_config.field.to_uppercase(), + prompt_config.env_var + ); + final_config.insert(prompt_config.field.clone(), env_val); + } else { + // Prompt the user with optional validation + let input = if prompt_config.secret { + Password::new() + .with_prompt(format!( + "[env_var = {}] {}", + &prompt_config.env_var, &prompt_config.prompt + )) + .interact() + .map_err(|e| format!("Failed to read input for '{}': {}", field, e))? + } else { + Input::new() + .with_prompt(format!( + "[env_var = {}] {}", + &prompt_config.env_var, &prompt_config.prompt + )) + .interact_text() + .map_err(|e| format!("Failed to read input for '{}': {}", field, e))? + }; + + // Validate input if a validator exists + if let Some(validator) = self.validators.get(field) { + validator(&input)?; + } + + final_config.insert(prompt_config.field.clone(), input); + } + } else { + return Err(format!("Prompt configuration for '{}' not found.", field).into()); + } + } + + Ok(final_config) + } +} + +use url::Url; + +/// Validates whether the provided RPC URL is well-formed and uses the HTTP or HTTPS scheme. +/// +/// # Arguments +/// +/// * `url_str` - A string slice that holds the RPC URL to validate. +/// +/// # Returns +/// +/// * `Ok(())` if the URL is valid and uses HTTP or HTTPS. +/// * `Err(String)` with an error message if the URL is invalid. +fn validate_rpc_url(url_str: &str) -> Result<(), String> { + // Attempt to parse the URL + match Url::parse(url_str) { + Ok(url) => { + // Check if the scheme is either HTTP or HTTPS + match url.scheme() { + "http" | "https" => Ok(()), + other => Err(format!( + "Unsupported URL scheme '{}'. Only 'http' and 'https' are allowed.", + other + )), + } + } + Err(e) => Err(format!( + "Invalid RPC URL: {}. Please provide a valid URL.", + e + )), + } +} + +/// Validator for Ethereum Private Keys using the `ethers` crate +/// +/// # Arguments +/// +/// * `key` - A string slice that holds the Ethereum private key to validate +/// +/// # Returns +/// +/// * `Ok(())` if the private key is valid +/// * `Err(String)` with an error message if the private key is invalid +fn validate_private_key(key: &str) -> Result<(), String> { + // Attempt to parse the private key using ethers::prelude::LocalWallet + match key.parse::() { + Ok(_) => Ok(()), + Err(e) => Err(format!( + "Invalid Ethereum private key: {}. Please try again.", + e + )), + } +} + +fn validate_dec_str_id(key: &str) -> Result<(), String> { + match U256::from_dec_str(key) { + Ok(_) => Ok(()), + Err(e) => Err(format!("Invalid Market Id: {}. Please try again.", e)), + } +} + +/// Validator for Confirmation prompts +fn validate_confirmation(response: &str) -> Result<(), String> { + let response_lower = response.to_lowercase(); + if response_lower == "yes" { + Ok(()) + } else { + Err("Confirmation not received. Operation canceled.".to_string()) + } +} + +fn validate_eth_address(key: &str) -> Result<(), String> { + match key.parse::
() { + Ok(_) => Ok(()), + Err(e) => Err(format!( + "Invalid Ethereum Address: {}. Please try again.", + e + )), + } +} + +fn validate_inputs(key: &str) -> Result<(), String> { + let trimmed_key = if key.starts_with("0x") || key.starts_with("0X") { + &key[2..] + } else { + key + }; + if trimmed_key.len() % 2 != 0 { + return Err("Hex string has an invalid length".to_string()); + } + + hex::decode(trimmed_key).map_err(|_| "Invalid Input Bytes".to_string())?; + + Ok(()) +} + +fn validate_image_id(key: &str) -> Result<(), String> { + let trimmed_key = if key.starts_with("0x") || key.starts_with("0X") { + &key[2..] + } else { + key + }; + if trimmed_key.len() % 2 != 0 { + return Err("Hex string has an invalid length".to_string()); + } + + let pcrs = hex::decode(trimmed_key) + .map_err(|_| "Invalid Image ID: Hex decoding failed".to_string())?; + let _image_id = + get_image_id_from_pcrs(&pcrs).map_err(|e| format!("Error computing image ID: {}", e))?; + + Ok(()) +} + +// --- try to find some lib functions for these below rather than writting your own ------------ // +use ethers::abi::{decode, ParamType, Token}; + +fn get_image_id_from_pcrs(pcrs: &[u8]) -> Result<[u8; 32], Box> { + // Define the expected types: three dynamic bytes arrays + let types = vec![ParamType::Bytes, ParamType::Bytes, ParamType::Bytes]; + + // Decode the input `pcrs` according to the specified types + let tokens = decode(&types, pcrs)?; + + if tokens.len() != 3 { + return Err("Expected three PCRs after decoding".into()); + } + + // Extract each PCR as a byte vector + let pcr0 = match &tokens[0] { + Token::Bytes(b) => b, + _ => return Err("PCR0 is not of type bytes".into()), + }; + + let pcr1 = match &tokens[1] { + Token::Bytes(b) => b, + _ => return Err("PCR1 is not of type bytes".into()), + }; + + let pcr2 = match &tokens[2] { + Token::Bytes(b) => b, + _ => return Err("PCR2 is not of type bytes".into()), + }; + + // Compute the image ID using the inner function + let image_id = get_image_id_from_pcrs_inner(pcr0, pcr1, pcr2)?; + + Ok(image_id) +} + +use sha3::{Digest, Keccak256}; + +fn get_image_id_from_pcrs_inner( + pcr0: &[u8], + pcr1: &[u8], + pcr2: &[u8], +) -> Result<[u8; 32], Box> { + // Initialize the Keccak-256 hasher + let mut hasher = Keccak256::new(); + + // Update the hasher with each PCR + hasher.update(pcr0); + hasher.update(pcr1); + hasher.update(pcr2); + + // Finalize the hash computation + let result = hasher.finalize(); + + // Convert the hash result into a fixed-size array + let image_id: [u8; 32] = result + .as_slice() + .try_into() + .map_err(|_| "Hash output is not 32 bytes")?; + + Ok(image_id) +} +// Add more validators as needed + +fn validate_string(key: &str) -> Result<(), String> { + if key.len() > 0 { + return Ok(()); + } + + return Err("cannot be empty".into()); +} diff --git a/listener/Cargo.toml b/listener/Cargo.toml index 02610df..7010b31 100644 --- a/listener/Cargo.toml +++ b/listener/Cargo.toml @@ -6,14 +6,18 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] +actix-web = {version = "4.5.1", features = ["rustls"] } +anyhow = "1.0.86" bindings = { path = "../bindings", package = "foundry-contracts" } -secret_input_helpers = {path = "../helper", package = "helper"} ecies = "0.2.6" -env_logger = "0.11.2" -ethers ={version = "2.0.10", features = ["abigen", "ws", "rustls"] } +env_logger = "0.10" +ethers ={version = "2", features = ["abigen", "ws", "rustls"] } flate2 = "1.0.28" +generator = { path = "../generator", package = "generator" } hex = "0.4" itertools = "0.12.1" +ivs = { path = "../ivs", package = "ivs" } +kalypso_helper = {path = "../helper", package = "helper"} log = "0.4" openssl = { version = "0.10.56", features = ["vendored"] } reqwest = "0.12.4" @@ -22,4 +26,8 @@ serde_json="1.0" tokio = { version = "1.16.1", features = ["full"] } toml = "0.8.2" uuid= {version = "1.4.1", features = ["v4","fast-rng","macro-diagnostics"]} -generator = { path = "../generator", package = "generator" } \ No newline at end of file +warp = "0.3" + +[features] +default = [] +force_transactions = [] \ No newline at end of file diff --git a/listener/src/generator_store.rs b/listener/src/generator_store.rs index 8408e90..0fc9ab8 100644 --- a/listener/src/generator_store.rs +++ b/listener/src/generator_store.rs @@ -5,9 +5,9 @@ use std::collections::HashMap; pub struct Generator { pub address: Address, pub supported_market_ids: Vec, - pub ecies_priv_key: SecretKey, + pub ecies_priv_key: Option, #[allow(unused)] - pub ecies_pub_key: PublicKey, + pub ecies_pub_key: Option, } pub struct GeneratorStore { diff --git a/listener/src/job_creator.rs b/listener/src/job_creator.rs new file mode 100644 index 0000000..ed8f4a4 --- /dev/null +++ b/listener/src/job_creator.rs @@ -0,0 +1,776 @@ +use bindings::proof_marketplace as pmp; +use ethers::prelude::*; +use ethers::types::U256; +use ethers::{abi::Address, providers::Provider}; +use kalypso_helper::custom_logger::CustomLogger; +use openssl::rand::rand_bytes; +use serde::{Deserialize, Serialize}; +use std::collections::HashMap; +use std::sync::atomic::{AtomicBool, Ordering}; +use std::{ + str::FromStr, + sync::{Arc, Mutex}, + thread, + time::Duration, +}; +use uuid::Uuid; + +use tokio::sync::Semaphore; + +use crate::proof_generator::GenerateProofParams; +use crate::server::ListenerHealthCheckServer; +use crate::{ask, generator_store, proof_generator}; +use warp::Filter; + +#[derive(Debug, Serialize, Deserialize)] +pub struct GeneratorConfigModel { + address: String, + ecies_private_key: Option, + data: Option, + supported_markets: Vec, + staked_amount: Option, + min_reward: Option, +} + +impl GeneratorConfigModel { + pub fn new( + address: String, + ecies_private_key: Option, + data: Option, + supported_markets: Vec, + ) -> Self { + Self { + address, + ecies_private_key, + data, + supported_markets, + staked_amount: None, + min_reward: None, + } + } + + pub fn new_multiple( + address: Vec, + ecies_private_key: Vec>, + data: Vec>, + supported_markets: Vec>, + ) -> anyhow::Result> { + // Check that all vectors have the same length + let len = address.len(); + if ecies_private_key.len() != len || data.len() != len || supported_markets.len() != len { + return Err(anyhow::anyhow!( + "Arity mismatch: All input vectors must have the same length." + )); + } + + // Initialize a vector to hold the instances + let mut instances = Vec::with_capacity(len); + + // Iterate over the indices and create instances + for i in 0..len { + let instance = Self::new( + address[i].clone(), + ecies_private_key[i].clone(), + data[i].clone(), + supported_markets[i].clone(), + ); + instances.push(instance); + } + + Ok(instances) + } +} + +#[derive(Debug, Serialize, Deserialize)] +pub struct Config { + generator_config: Vec, +} + +#[derive(Serialize, Debug, Deserialize, Clone)] +pub struct MarketDetails { + pub port: Option, + pub ivs_url: Option, + pub prover_gateway_url: Option, +} + +#[derive(Debug, Serialize, Deserialize)] +struct RuntimeConfigModel { + ws_url: Option, + http_url: String, + private_key: String, + proof_market_place: String, + generator_registry: String, + start_block: u64, + chain_id: u64, + markets: HashMap, +} + +#[derive(Debug, Serialize, Deserialize)] +pub struct RuntimeConfig { + runtime_config: RuntimeConfigModel, +} + +pub struct JobCreator { + config: Config, + runtime_config: RuntimeConfig, + #[allow(unused)] + log_storage: Option>>>, + max_threads: usize, + shared_latest_block: Arc>, + should_stop: Arc, + skip_input_verification: bool, +} + +impl JobCreator { + pub fn new( + config: Config, + runtime_config: RuntimeConfig, + max_threads: usize, + enable_logging_server: bool, + skip_input_verification: bool, + ) -> Self { + Self::initialize( + config, + runtime_config, + enable_logging_server, + skip_input_verification, + max_threads, + ) + } + + fn initialize( + config: Config, + runtime_config: RuntimeConfig, + enable_logging_server: bool, + skip_input_verification: bool, + max_threads: usize, + ) -> Self { + let service_name = Uuid::new_v4().to_string(); + let shared_latest_block = Arc::new(tokio::sync::Mutex::new(U64::zero())); + let should_stop = Arc::new(AtomicBool::new(false)); + let health_check_service = ListenerHealthCheckServer::new( + service_name, + shared_latest_block.clone(), + should_stop.clone(), + ); + + tokio::spawn(health_check_service.start_server(9999, false)); + + if enable_logging_server { + let log_storage = Arc::new(Mutex::new(Vec::new())); + let storage_clone = log_storage.clone(); + + log::set_boxed_logger(Box::new(CustomLogger::new(storage_clone))).unwrap(); + log::set_max_level(log::LevelFilter::Info); + + tokio::spawn(Self::start_logging_server(log_storage.clone())); + Self { + config, + runtime_config, + log_storage: Some(log_storage), + max_threads, + shared_latest_block, + should_stop, + skip_input_verification, + } + } else { + Self { + config, + runtime_config, + log_storage: None, + max_threads, + shared_latest_block, + should_stop, + skip_input_verification, + } + } + } + + fn start_logging_server( + log_storage: Arc>>, + ) -> impl std::future::Future + Send { + let log_route = warp::path::end().map(move || { + let logs = log_storage.lock().unwrap(); + warp::reply::json(&*logs) + }); + + let server = warp::serve(log_route).run(([127, 0, 0, 1], 9999)); + + Box::pin(server) + } + + #[allow(clippy::too_many_arguments)] + pub fn simple_listener_for_non_confidential_prover( + generator_address: String, + supported_market_dec_string: String, + http_rpc_url: String, + gas_key: String, + proof_market_place: String, + generator_registry: String, + start_block: u64, + chain_id: u64, + prover_gateway_url: String, + ivs_url: String, + enable_logging_server: bool, + max_threads: usize, + skip_input_verification: bool, + ) -> Self { + let generator_config_models = vec![GeneratorConfigModel { + address: generator_address, + ecies_private_key: None, + data: None, + supported_markets: vec![supported_market_dec_string.clone()], + staked_amount: None, + min_reward: None, + }]; + let config = Config { + generator_config: generator_config_models, + }; + + let runtime_config_model = RuntimeConfigModel { + ws_url: None, + http_url: http_rpc_url, + private_key: gas_key, + proof_market_place, + generator_registry, + start_block, + chain_id, + markets: { + let mut markets = HashMap::new(); + markets.insert( + supported_market_dec_string, + MarketDetails { + port: None, + ivs_url: Some(ivs_url), + prover_gateway_url: Some(prover_gateway_url), + }, + ); + markets + }, + }; + + let runtime_config = RuntimeConfig { + runtime_config: runtime_config_model, + }; + + Self::initialize( + config, + runtime_config, + enable_logging_server, + skip_input_verification, + max_threads, + ) + } + + #[allow(clippy::too_many_arguments)] + pub fn simple_listener_for_non_confidential_prover_with_multiple_generators( + generator_configs: Vec, + http_rpc_url: String, + gas_key: String, + proof_market_place: String, + generator_registry: String, + start_block: u64, + chain_id: u64, + prover_gateway_url: String, + ivs_url: String, + enable_logging_server: bool, + max_threads: usize, + skip_input_verification: bool, + ) -> Self { + let config = Config { + generator_config: generator_configs, + }; + + let runtime_config_model = RuntimeConfigModel { + ws_url: None, + http_url: http_rpc_url, + private_key: gas_key, + proof_market_place, + generator_registry, + start_block, + chain_id, + markets: { + let mut markets = HashMap::new(); + for generator in config.generator_config.iter() { + for market in &generator.supported_markets { + markets.insert( + market.clone(), + MarketDetails { + port: None, + ivs_url: Some(ivs_url.clone()), + prover_gateway_url: Some(prover_gateway_url.clone()), + }, + ); + } + } + markets + }, + }; + + let runtime_config = RuntimeConfig { + runtime_config: runtime_config_model, + }; + + Self::initialize( + config, + runtime_config, + enable_logging_server, + skip_input_verification, + max_threads, + ) + } + + #[allow(clippy::too_many_arguments)] + pub fn simple_listener_for_confidential_prover( + generator_address: String, + ecies_private_key: String, + supported_market_dec_string: String, + http_rpc_url: String, + gas_key: String, + proof_market_place: String, + generator_registry: String, + start_block: u64, + chain_id: u64, + prover_port: String, + enable_logging_server: bool, + max_threads: usize, + skip_input_verification: bool, + ) -> Self { + let generator_config_models = vec![GeneratorConfigModel { + address: generator_address, + ecies_private_key: Some(ecies_private_key), + data: None, + supported_markets: vec![supported_market_dec_string.clone()], + staked_amount: None, + min_reward: None, + }]; + let config = Config { + generator_config: generator_config_models, + }; + + let runtime_config_model = RuntimeConfigModel { + ws_url: None, + http_url: http_rpc_url, + private_key: gas_key, + proof_market_place, + generator_registry, + start_block, + chain_id, + markets: { + let mut markets = HashMap::new(); + markets.insert( + supported_market_dec_string, + MarketDetails { + port: Some(prover_port), + ivs_url: None, + prover_gateway_url: None, + }, + ); + markets + }, + }; + + let runtime_config = RuntimeConfig { + runtime_config: runtime_config_model, + }; + + Self::initialize( + config, + runtime_config, + enable_logging_server, + skip_input_verification, + max_threads, + ) + } + + pub fn from_config_paths( + generator_config_path: &str, + runtime_config_path: &str, + enable_logging_server: bool, + max_threads: usize, + skip_input_verification: bool, + ) -> anyhow::Result { + let file_content = std::fs::read_to_string(generator_config_path)?; + let config: Config = serde_json::from_str(&file_content)?; + + let file_content = std::fs::read_to_string(runtime_config_path)?; + let runtime_config: RuntimeConfig = serde_json::from_str(&file_content)?; + + Ok(Self::initialize( + config, + runtime_config, + enable_logging_server, + skip_input_verification, + max_threads, + )) + } + + pub async fn run(&self) -> anyhow::Result<()> { + let runtime_config = &self.runtime_config.runtime_config; + + let key = runtime_config.private_key.clone(); + let chain_id = runtime_config.chain_id; + + let http_url = runtime_config.http_url.clone(); + let proof_market_place_var = runtime_config.proof_market_place.clone(); + let markets = Arc::new(runtime_config.markets.clone()); + + let signer = key.parse::().unwrap().with_chain_id(chain_id); + let signer_address = signer.address(); + log::info!("Gas payers address : {:?}", signer.address()); + + let provider_http = Provider::::connect(&http_url) + .await + .with_signer(signer.clone()); + + let client_http = Arc::new(provider_http.clone()); + + let wallet_nonce = provider_http + .get_transaction_count(signer_address, None) + .await? + .as_u64(); + log::info!("Wallet nonce : {}", wallet_nonce); + + let proof_marketplace_address = Address::from_str(&proof_market_place_var)?; + let proof_marketplace_http = Arc::new(pmp::ProofMarketplace::new( + proof_marketplace_address, + Arc::clone(&client_http), + )); + + let submitter_pmp = Arc::new(tokio::sync::Mutex::new(pmp::ProofMarketplace::new( + proof_marketplace_address, + Arc::clone(&client_http), + ))); + + let mut key_store = generator_store::GeneratorStore::new(); + for config in &self.config.generator_config { + let generator_address = match Address::from_str(&config.address) { + Ok(value) => value, + Err(_) => { + log::error!("Invalid Address for generator provided"); + continue; + } + }; + + let existing_generator_data = key_store.get_generator(&generator_address); + if existing_generator_data.is_some() { + return Err(anyhow::anyhow!( + "Generator Address mentioned twice in the network" + )); + } + + let (ecies_secret, ecies_public) = match &config.ecies_private_key { + Some(private_key) => { + let mut original_message = vec![0; 32]; // for example, 32 bytes + rand_bytes(&mut original_message).expect("Failed to generate random bytes"); + + let private_key = hex::decode(private_key).unwrap(); + let ecies_secret_key = ecies::SecretKey::parse_slice(&private_key).unwrap(); + let ecies_public_key = ecies::PublicKey::from_secret_key(&ecies_secret_key); + + let public_key = + ecies::PublicKey::from_secret_key(&ecies_secret_key).serialize(); + let encrypted_message = match ecies::encrypt(&public_key, &original_message) { + Ok(value) => value, + Err(_) => { + log::error!("Unable to encrypt message using public key"); + continue; + } + }; + + let decrypted_message = match ecies::decrypt(&private_key, &encrypted_message) { + Ok(value) => value, + Err(_) => { + log::error!("Unable to decrypt message using private key"); + continue; + } + }; + + if original_message != decrypted_message { + log::error!("The public and private keys do not match!"); + continue; + } + + (Some(ecies_secret_key), Some(ecies_public_key)) + } + _ => (None, None), + }; + + let mut supported_markets: Vec = vec![]; + + for market in config.supported_markets.clone().into_iter() { + let market_temp = U256::from_dec_str(&market).unwrap(); + supported_markets.push(market_temp); + } + + let generator = generator_store::Generator { + address: generator_address, + supported_market_ids: supported_markets, + ecies_priv_key: ecies_secret, + ecies_pub_key: ecies_public, + }; + key_store.add_generator(generator); + } + + log::info!("Total number of generators {:?}", key_store.count()); + + let block_to_use = client_http + .provider() + .get_block_number() + .await + .unwrap_or(4180050.into()); + let runtime_start_block = + U64::from_dec_str(&runtime_config.start_block.to_string()).unwrap_or(block_to_use); + let mut start_block = runtime_start_block; + + let blocks_at_once = 10000; + + let stop_handle = self.should_stop.clone(); + tokio::spawn(async move { + tokio::signal::ctrl_c().await.unwrap(); + stop_handle.store(true, Ordering::Release); + }); + + let proof_semaphore = Arc::new(Semaphore::new(self.max_threads)); // ensures that only `max_threads` number of proofs are flushed to generator + let transaction_semaphore = Arc::new(Semaphore::new(1)); // ensures 1 transaction is published at a time + + loop { + if self.should_stop.load(Ordering::Acquire) { + log::info!("Gracefully shutting down..."); + break; + } + + let latest_block = match provider_http.get_block_number().await { + Ok(data) => data, + Err(err) => { + log::error!("Error fetching latest block number, pausing the listener"); + log::error!("{}", err); + thread::sleep(Duration::from_secs(4)); + continue; + } + }; + + let end = if start_block + blocks_at_once > latest_block { + latest_block - 1 + } else { + start_block + blocks_at_once - 1 + }; + + if start_block > end { + continue; + } + + log::info!( + "Searching for TASKs from Block {} to {}...", + start_block, + end + ); + + let filter = proof_marketplace_http + .task_created_filter() + .filter + .from_block(start_block) + .to_block(end); + + let logs = match client_http.provider().get_logs(&filter).await { + Ok(data) => data, + Err(err) => { + log::error!("Error fetching logs for proof generation"); + log::error!("{}", err); + thread::sleep(Duration::from_secs(4)); + continue; + } + }; + + for log in logs { + let event = proof_marketplace_http.decode_event::( + "TaskCreated", + log.topics, + log.data, + )?; + let generator = match key_store.get_generator(&event.generator) { + Some(gen) => { + let ask_details: &(pmp::Ask, u8, H160, H160) = + &proof_marketplace_http.list_of_ask(event.ask_id).await?; + + log::debug!("Generator Data (on polling): {:?}", &gen); + if gen.supported_market_ids.contains(&ask_details.0.market_id) { + gen + } else { + log::debug!("Skipping ask: {:?}, because Generator: {:?} doesn't support Market: {:?}", event.ask_id, gen.address, ask_details.0.market_id); + continue; + } + } + None => { + log::debug!( + "Skipping ask: {:?}, because it is not assigned to my generators", + event.ask_id + ); + continue; + } + }; + + let ask_state = &proof_marketplace_http.get_ask_state(event.ask_id).await?; + let ask_state = ask::get_ask_state(*ask_state); + log::info!("Ask: {} state: {:?}", event.ask_id, ask_state); + if ask_state == ask::AskState::Assigned { + log::info!( + "Need to generate proof (polling) for ASK ID : {}", + event.ask_id + ); + let gen_ecies_private_key = generator.ecies_priv_key; + + let proof_market_place_clone_http = Arc::clone(&proof_marketplace_http); + let submitter_pmp_clone_http = Arc::clone(&submitter_pmp); + let markets_clone = Arc::clone(&markets); + // code inside thread starts here + + let proof_semaphore = proof_semaphore.clone(); + let transaction_semaphore = transaction_semaphore.clone(); + + let skip_input_verification = self.skip_input_verification.clone(); + tokio::spawn(async move { + log::info!( + "Spin up new thread from proof generation of ask: {}", + event.ask_id + ); + let binding = vec![]; // TODO: figure out way to fetch old keys from KMS, not in scope now + let generate_proof_args = GenerateProofParams { + ask_id: event.ask_id, + new_acl: event.new_acl, + proof_market_place_contract_http: proof_market_place_clone_http, + ecies_private_key: &gen_ecies_private_key, + start_block: &runtime_start_block, + end_block: &latest_block, + markets: &markets_clone, + slave_ecies_private_keys: binding.as_ref(), + skip_input_verification, + }; + + let proof_permit = proof_semaphore + .acquire() + .await + .expect("Failed to acquire proof semaphore"); + + let proof = match proof_generator::generate_proof(generate_proof_args).await + { + Ok(proof) => { + drop(proof_permit); + proof + } + Err(err) => { + drop(proof_permit); + log::error!("Error generating proof for ask: {}", event.ask_id); + log::error!("{}", err.to_string()); + return log::error!("{}", err); + } + }; + + log::info!("{:?}", &proof); + + // Acquire the semaphore permit only before proof submission to prevent nonce conflicts + let transaction_permit = transaction_semaphore + .acquire() + .await + .expect("Failed to acquire transaction semaphore"); + + let proof_transaction = match proof { + crate::proof_generator::prover::Proof::ValidProof(proof) => { + log::info!("Submitting proof on-chain..."); + + let mut tx = submitter_pmp_clone_http + .lock() + .await + .submit_proof(event.ask_id, proof); + + if cfg!(feature = "force_transactions") { + tx = tx.gas(10_000_000); + } + + match tx.clone().send().await { + Ok(submit_response) => match submit_response + .confirmations(10) + .await + { + Ok(confirmation) => confirmation, + Err(e) => { + log::error!("Error awaiting confirmations: {:?}", e); + None + } + }, + Err(e) => { + log::error!("Error submitting proof: {:?}", e); + None + } + } + } + crate::proof_generator::prover::Proof::InvalidProof( + invalid_proof_signature, + ) => { + log::info!("Submitting signature on-chain..."); + let mut tx = submitter_pmp_clone_http + .lock() + .await + .submit_proof_for_invalid_inputs( + event.ask_id, + invalid_proof_signature, + ); + + if cfg!(feature = "force_transactions") { + tx = tx.gas(10_000_000); + } + + match tx.clone().send().await { + Ok(submit_response) => match submit_response + .confirmations(10) + .await + { + Ok(confirmation) => confirmation, + Err(e) => { + log::error!("Error awaiting confirmations: {:?}", e); + None + } + }, + Err(e) => { + log::error!( + "Error submitting invalid proof signature: {:?}", + e + ); + None + } + } + } + }; + + // Release the semaphore after the proof has been submitted + drop(transaction_permit); + + match proof_transaction { + Some(tx_data) => { + log::info!( + "Submitted proof for OLD ask with id : {} via transaction {:?}", + event.ask_id, + tx_data.transaction_hash + ); + } + None => { + log::error!( + "Error in submitting proof for ASK ID : {}", + event.ask_id + ); + } + } + // code inside thread ends here + }); + } + } + + start_block = end + 1; + + { + *self.shared_latest_block.lock().await = start_block + } + } + Ok(()) + } +} diff --git a/listener/src/lib.rs b/listener/src/lib.rs new file mode 100644 index 0000000..3ab6e0d --- /dev/null +++ b/listener/src/lib.rs @@ -0,0 +1,5 @@ +mod ask; +mod generator_store; +pub mod job_creator; +mod proof_generator; +mod server; diff --git a/listener/src/listener.rs b/listener/src/listener.rs deleted file mode 100644 index 709b710..0000000 --- a/listener/src/listener.rs +++ /dev/null @@ -1,324 +0,0 @@ -use crate::MarketDetails; -use bindings::proof_marketplace::ProofMarketplace; -use bindings::shared_types::Ask; -use ethers::prelude::k256::ecdsa::SigningKey; -use ethers::prelude::*; -use flate2::read::ZlibDecoder; -use reqwest::Response; -use secret_input_helpers::secret_inputs_helpers::{ - decrypt_data_with_ecies_and_aes, decrypt_ecies, encrypt_ecies, -}; -use serde::{Deserialize, Serialize}; -use std::collections::HashMap; -use std::io::Read; -use std::sync::Arc; -use std::time::Instant; -use std::{thread, time::Duration}; - -// type ProofMarketPlaceContractWs = -// Arc, Wallet>>>; - -type ProofMarketPlaceContractHttp = - Arc, Wallet>>>; - -pub struct GenerateProofParams<'a> { - pub ask_id: ethers::types::U256, - pub new_acl: ethers::types::Bytes, - pub proof_market_place_contract_http: ProofMarketPlaceContractHttp, - pub ecies_private_key: &'a [u8], - pub start_block: &'a U64, - pub end_block: &'a U64, - pub markets: &'a HashMap, -} - -#[derive(Debug, Clone)] -pub enum Proof { - ValidProof(Bytes), - InvalidProof(Bytes), -} - -#[derive(Deserialize, Debug)] -struct ProofGenerationResponse { - message: String, - data: Bytes, -} - -// Define the response format struct -#[derive(Deserialize)] -struct IvsResponse { - signature: String, - ask_id: u64, -} - -#[derive(Deserialize, Debug)] -struct ApiDataResponse { - ivs_ecies_public_key: String, -} - -#[derive(Deserialize, Debug)] -struct IvsPublicKeyResponse { - data: ApiDataResponse, -} - -//Generating proof for the input -pub async fn generate_proof( - generate_proof_params: GenerateProofParams<'_>, -) -> Result> { - let GenerateProofParams { - proof_market_place_contract_http, - ask_id, - start_block, - end_block, - ecies_private_key, - new_acl, - markets, - } = generate_proof_params; - let client = proof_market_place_contract_http.client(); - let list_of_ask: &Ask = &proof_market_place_contract_http - .list_of_ask(ask_id) - .await? - .0; - let market_id = list_of_ask.market_id; - - let fetching_ask_secret_timer_start = Instant::now(); - log::info!( - "Finding the logs from block {}, for ask: {}", - start_block, - ask_id - ); - - // Looking for ask in a batch range of 9999 blocks, done to avoid the 10000 block limit. - let mut end_block = *end_block; - let start_block = *start_block; - let mut ask_log: Vec = vec![]; - - let blocks_at_once = 9999; - while start_block <= end_block { - let begin = if end_block >= start_block + blocks_at_once { - end_block - blocks_at_once - } else { - start_block - }; - - // Fetching ask Transaction hash - let ask_event_filter = &proof_market_place_contract_http - .ask_created_filter() - .filter - .from_block(begin) - .to_block(end_block) - .topic1(ask_id); - - let logs = client.get_logs(ask_event_filter).await?; - log::info!("Logs found: {:?}", logs.len()); - if logs.len() == 1 { - ask_log = logs; - break; - } - thread::sleep(Duration::from_millis(2000)); // to reduce calls and avoid rate limit (will be problem only for old requests, not new ones) - end_block = begin - 1; - } - - let parsed_ask_created_log = proof_market_place_contract_http - .decode_event::( - "AskCreated", - ask_log[0].topics.clone(), - ask_log[0].data.clone(), - ) - .unwrap(); - - //Checking if the ask has a secret provided - let decoded_secret_input = if parsed_ask_created_log.has_private_inputs { - log::info!("Secret input found"); - // Handling compressed secret inputs - let encrypted_secret_input = parsed_ask_created_log.secret_data.to_vec(); - - let result = decrypt_data_with_ecies_and_aes( - &encrypted_secret_input, - &new_acl, - ecies_private_key, - market_id, - ); - - result.unwrap() - } else { - Vec::new() - }; - - let ask_secret_fetch_time = fetching_ask_secret_timer_start.elapsed().as_millis(); - log::info!( - "Took {} ms for fetching the secret inputs for the ask", - ask_secret_fetch_time - ); - - let mut decoder = ZlibDecoder::new(&decoded_secret_input[..]); - let mut decoded_secret_input: Vec = Vec::new(); - decoder.read_to_end(&mut decoded_secret_input).unwrap(); - - // PRIVATE MARKET - if markets.contains_key(&market_id.to_string()) && parsed_ask_created_log.has_private_inputs { - let generator_port = &markets.get(&market_id.to_string()).unwrap().port; - log::info!( - "Forwarding inputs for market ID : {:#?} to the generator running on port {:#?}", - market_id.to_string(), - generator_port - ); - let proof_generation_response = generate_proof_from_generator( - list_of_ask.clone(), - decoded_secret_input.clone(), - generator_port.to_string(), - ask_id.as_u64(), - ) - .await?; - if proof_generation_response.status().is_success() { - let proof_response: ProofGenerationResponse = proof_generation_response.json().await?; - log::info!("{:#?}", proof_response.message); - return Ok(Proof::ValidProof(proof_response.data)); - } - // else if proof_generation_response.status() == 400 - else { - let proof_response: ProofGenerationResponse = proof_generation_response.json().await?; - log::info!( - "Error message from the generator : {}", - proof_response.message - ); - let signature = &proof_response.data.to_string()[2..]; - log::info!("Signature : {}", signature); - let sign_bytes = hex::decode(signature)?; - return Ok(Proof::InvalidProof(sign_bytes.into())); - } - } - // PUBLIC MARKET - else if markets.contains_key(&market_id.to_string()) - && !parsed_ask_created_log.has_private_inputs - { - let generator_port = &markets.get(&market_id.to_string()).unwrap().port; - let ivs_url = &markets.get(&market_id.to_string()).unwrap().ivs_url; - log::info!( - "Forwarding inputs for market ID : {:#?} to the generator running on port {:#?}", - market_id.to_string(), - generator_port - ); - let proof_generation_response = generate_proof_from_generator( - list_of_ask.clone(), - decoded_secret_input.clone(), - generator_port.to_string(), - ask_id.as_u64(), - ) - .await?; - if proof_generation_response.status().is_success() { - let proof_response: ProofGenerationResponse = proof_generation_response.json().await?; - log::info!("{:#?}", proof_response.message); - return Ok(Proof::ValidProof(proof_response.data)); - } - log::info!("Proof generated is not valid"); - - let fetch_ivs_public_key = fetch_ivs_public_keys(ivs_url.to_string()).await?; - - let fetch_ivs_public_key_response_body: IvsPublicKeyResponse = - fetch_ivs_public_key.json().await?; - - let trimmed_ecies_key = &fetch_ivs_public_key_response_body.data.ivs_ecies_public_key[2..]; - - log::info!("IVS public key data : {:#?}", trimmed_ecies_key); - - let decoded_ecies = &hex::decode(trimmed_ecies_key)?; - log::info!("Decoded the ecies key"); - - let cipher = decrypt_ecies(ecies_private_key, &new_acl)?; - log::info!("Cipher generated"); - let final_acl = encrypt_ecies(decoded_ecies, cipher.as_slice())?; - log::info!("Final ACL generated"); - let encrypted_secret_input = parsed_ask_created_log.secret_data.to_vec(); - log::info!("Encrypted secret input fetched, fetching signature next"); - let invalid_proof_signature = get_proof_for_invalid_request( - ivs_url.to_string(), - ask_id.as_u64(), - hex::encode(encrypted_secret_input), - hex::encode(final_acl), - ) - .await?; - let response_data: IvsResponse = invalid_proof_signature.json().await?; - log::info!( - "Submitting signature for invalid inputs for ASK ID : {}", - response_data.ask_id - ); - let signature = &response_data.signature[2..]; - log::info!("Signature : {}", signature); - let sign_bytes = hex::decode(signature).unwrap(); - return Ok(Proof::InvalidProof(sign_bytes.into())); - } - - Err("Circuit not implemented".into()) -} - -//Get signature for invalid input from IVS -async fn get_proof_for_invalid_request( - ivs_url: String, - ask_id: u64, - secret: String, - acl: String, -) -> Result> { - log::info!("Inside the get proof for invalid request"); - #[derive(Serialize)] - struct Payload { - pub ask_id: u64, - pub acl: String, - pub encrypted_secret: String, - } - - // Create a client instance - let client = reqwest::Client::new(); - - // Create the payload - let payload = Payload { - ask_id, - acl, - encrypted_secret: secret, - }; - log::info!("Payload generated"); - - let ivs_endpoint_to_fetch_signature = format!("{}:3030/checkInputWithSignature", ivs_url); - - // Make the POST request - let res = client - .post(ivs_endpoint_to_fetch_signature) - .json(&payload) - .send() - .await?; - Ok(res) -} - -//Forward input to proof generator -async fn generate_proof_from_generator( - ask: Ask, - private_input: Vec, - port: String, - ask_id: u64, -) -> Result> { - let payload = generator::models::AskInputPayload { - ask, - private_input, - ask_id, - }; - - // Create a client instance - let client = reqwest::Client::new(); - - let endpoint = format!("http://0.0.0.0:{}/api/generateProof", port); - log::info!("endpoint : {}", endpoint); - // Make the POST request - let res = client.post(endpoint).json(&payload).send().await?; - Ok(res) -} - -//Fetch IVS public keys -async fn fetch_ivs_public_keys(ivs_url: String) -> Result> { - // Create a client instance - let client = reqwest::Client::new(); - - let fetch_ivs_public_key_endpoint = - format!("{}:5000/api/fetchInputVerifierPublicKeys", ivs_url); - // Make the POST request - let res = client.post(fetch_ivs_public_key_endpoint).send().await?; - Ok(res) -} diff --git a/listener/src/main.rs b/listener/src/main.rs index c690471..53c8b97 100644 --- a/listener/src/main.rs +++ b/listener/src/main.rs @@ -1,350 +1,27 @@ -use bindings::proof_marketplace as pmp; -use ethers::prelude::*; -use ethers::types::U256; -use ethers::{abi::Address, providers::Provider}; -use listener::GenerateProofParams; -use openssl::rand::rand_bytes; -use std::collections::HashMap; +use std::error::Error; use std::fs; -use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering}; -use std::{error::Error, str::FromStr, sync::Arc, thread, time::Duration}; -mod generator_store; -mod listener; - -mod ask; -use serde::{Deserialize, Serialize}; - -#[derive(Debug, Serialize, Deserialize)] -struct GeneratorConfigModel { - address: String, - ecies_private_key: String, - data: Option, - supported_markets: Vec, - staked_amount: Option, - min_reward: Option, -} - -#[derive(Debug, Serialize, Deserialize)] -struct Config { - generator_config: Vec, -} - -#[derive(Serialize, Debug, Deserialize, Clone)] -pub struct MarketDetails { - pub port: String, - pub ivs_url: String, -} - -#[derive(Debug, Serialize, Deserialize)] -struct RuntimeConfigModel { - ws_url: Option, - http_url: String, - private_key: String, - proof_market_place: String, - generator_registry: String, - start_block: u64, - chain_id: u64, - params_path: String, - markets: HashMap, -} - -#[derive(Debug, Serialize, Deserialize)] -struct RuntimeConfig { - runtime_config: RuntimeConfigModel, -} +use listener::job_creator; #[tokio::main] async fn main() -> Result<(), Box> { env_logger::init_from_env(env_logger::Env::new().default_filter_or("info")); - let generator_config_path = "./generator_config/generator_config.json".to_string(); let alt_generator_config_path = "../generator_config/generator_config.json".to_string(); let file_content = fs::read_to_string(&generator_config_path) .or_else(|_| fs::read_to_string(&alt_generator_config_path))?; println!("{}", &file_content); - let config: Config = serde_json::from_str(&file_content)?; + let config: job_creator::Config = serde_json::from_str(&file_content)?; let runtime_config_path = "./generator_config/runtime_config.json".to_string(); let alt_runtime_config_path = "../generator_config/runtime_config.json".to_string(); let file_content = fs::read_to_string(&runtime_config_path) .or_else(|_| fs::read_to_string(&alt_runtime_config_path))?; println!("{}", &file_content); - let runtime_config: RuntimeConfig = serde_json::from_str(&file_content)?; - let runtime_config = runtime_config.runtime_config; - - let key = runtime_config.private_key; - let chain_id = runtime_config.chain_id; - - let http_url = runtime_config.http_url; - let proof_market_place_var = runtime_config.proof_market_place; - let markets = Arc::new(runtime_config.markets); - - let signer = key.parse::().unwrap().with_chain_id(chain_id); - let signer_address = signer.address(); - log::info!("Gas payers address : {:?}", signer.address()); - - let provider_http = Provider::::connect(&http_url) - .await - .with_signer(signer.clone()); - - let client_http = Arc::new(provider_http.clone()); - - let wallet_nonce = provider_http - .get_transaction_count(signer_address, None) - .await? - .as_u64(); - log::info!("Wallet nonce : {}", wallet_nonce); - - let proof_marketplace_address = Address::from_str(&proof_market_place_var)?; - let proof_marketplace_http = Arc::new(pmp::ProofMarketplace::new( - proof_marketplace_address, - Arc::clone(&client_http), - )); - - let submitter_pmp = Arc::new(tokio::sync::Mutex::new(pmp::ProofMarketplace::new( - proof_marketplace_address, - Arc::clone(&client_http), - ))); - - let mut key_store = generator_store::GeneratorStore::new(); - for config in config.generator_config { - let generator_address = match Address::from_str(&config.address) { - Ok(value) => value, - Err(_) => { - log::error!("Invalid Address for generator provided"); - continue; - } - }; - - let existing_generator_data = key_store.get_generator(&generator_address); - if existing_generator_data.is_some() { - return Err("Generator Address mentioned twice in the network".into()); - } - - let mut original_message = vec![0; 32]; // for example, 32 bytes - rand_bytes(&mut original_message).expect("Failed to generate random bytes"); - - let private_key = hex::decode(&config.ecies_private_key).unwrap(); - let ecies_secret_key = ecies::SecretKey::parse_slice(&private_key).unwrap(); - - let public_key = ecies::PublicKey::from_secret_key(&ecies_secret_key).serialize(); - let encrypted_message = match ecies::encrypt(&public_key, &original_message) { - Ok(value) => value, - Err(_) => { - log::error!("Unable to encrypt message using public key"); - continue; - } - }; - - let decrypted_message = match ecies::decrypt(&private_key, &encrypted_message) { - Ok(value) => value, - Err(_) => { - log::error!("Unable to decrypt message using private key"); - continue; - } - }; - - if original_message != decrypted_message { - log::error!("The public and private keys do not match!"); - continue; - } - - let mut supported_markets: Vec = vec![]; - - for market in config.supported_markets.into_iter() { - let market_temp = U256::from_dec_str(&market).unwrap(); - supported_markets.push(market_temp); - } - - let generator = generator_store::Generator { - address: generator_address, - supported_market_ids: supported_markets, - ecies_priv_key: ecies_secret_key, - ecies_pub_key: ecies::PublicKey::from_secret_key(&ecies_secret_key), - }; - key_store.add_generator(generator); - } - - log::info!("Total number of generators {:?}", key_store.count()); - - let block_to_use = client_http - .provider() - .get_block_number() - .await - .unwrap_or(4180050.into()); - let runtime_start_block = - U64::from_dec_str(&runtime_config.start_block.to_string()).unwrap_or(block_to_use); - let mut start_block = runtime_start_block; - - let blocks_at_once = 10000; - - let should_stop = Arc::new(AtomicBool::new(false)); - let stop_handle = should_stop.clone(); - tokio::spawn(async move { - tokio::signal::ctrl_c().await.unwrap(); - stop_handle.store(true, Ordering::Release); - }); - - let thread_count = Arc::new(AtomicUsize::new(0)); - let max_thread_count = 20; - - loop { - if should_stop.load(Ordering::Acquire) { - log::info!("Gracefully shutting down..."); - break; - } - - if thread_count.load(Ordering::SeqCst) >= max_thread_count { - thread::sleep(Duration::from_millis(60)); - log::warn!( - "Stopped proof generation as {} proof generations in progress", - max_thread_count - ); - continue; - } - - let latest_block = provider_http.get_block_number().await.unwrap(); - - let end = if start_block + blocks_at_once > latest_block { - thread::sleep(Duration::from_millis(2000)); // to reduce calls on eth_latestBlock - latest_block - 1 - } else { - start_block + blocks_at_once - 1 - }; - - log::info!( - "Searching for TASKs from Block {} to {}...", - start_block, - end - ); - - let filter = proof_marketplace_http - .task_created_filter() - .filter - .from_block(start_block) - .to_block(end); - - let logs = client_http.provider().get_logs(&filter).await?; - - for log in logs { - let event = proof_marketplace_http.decode_event::( - "TaskCreated", - log.topics, - log.data, - )?; - let generator = match key_store.get_generator(&event.generator) { - Some(gen) => { - let ask_details: &(pmp::Ask, u8, H160, H160) = - &proof_marketplace_http.list_of_ask(event.ask_id).await?; - - log::debug!("Generator Data (on polling): {:?}", &gen); - if gen.supported_market_ids.contains(&ask_details.0.market_id) { - gen - } else { - log::debug!("Skipping ask: {:?}, because Generator: {:?} doesn't support Market: {:?}", event.ask_id, gen.address, ask_details.0.market_id); - continue; - } - } - None => { - log::debug!( - "Skipping ask: {:?}, because it is not assigned to my generators", - event.ask_id - ); - continue; - } - }; - - let ask_state = &proof_marketplace_http.get_ask_state(event.ask_id).await?; - dbg!(&ask_state); - let ask_state = ask::get_ask_state(*ask_state); - dbg!(ask_state); - if ask_state == ask::AskState::Assigned { - log::info!( - "Need to generate proof (polling) for ASK ID : {}", - event.ask_id - ); - let gen_ecies_private_key = generator.ecies_priv_key.serialize(); - - let proof_market_place_clone_http = Arc::clone(&proof_marketplace_http); - let submitter_pmp_clone_http = Arc::clone(&submitter_pmp); - let markets_clone = Arc::clone(&markets); - // code inside thread starts here - - thread_count.fetch_add(1, Ordering::SeqCst); - let thread_count_clone = Arc::clone(&thread_count); - - tokio::spawn(async move { - log::warn!("Spin up new thread from proof generation calls"); - let generate_proof_args = GenerateProofParams { - ask_id: event.ask_id, - new_acl: event.new_acl, - proof_market_place_contract_http: proof_market_place_clone_http, - ecies_private_key: &gen_ecies_private_key, - start_block: &runtime_start_block, - end_block: &latest_block, - markets: &markets_clone, - }; - - let proof = match listener::generate_proof(generate_proof_args).await { - Ok(proof) => proof, - Err(err) => return log::error!("{}", err), - }; - - log::info!("{:?}", &proof); - - let proof_transaction = match proof { - listener::Proof::ValidProof(proof) => { - log::info!("Submitting proof on-chain..."); - submitter_pmp_clone_http - .lock() - .await - .submit_proof(event.ask_id, proof) - .send() - .await - .unwrap() - .await - .unwrap() - } - listener::Proof::InvalidProof(invalid_proof_signature) => { - log::info!("Submitting signature on-chain..."); - submitter_pmp_clone_http - .lock() - .await - .submit_proof_for_invalid_inputs( - event.ask_id, - invalid_proof_signature, - ) - .send() - .await - .unwrap() - .await - .unwrap() - } - }; - - match proof_transaction { - Some(tx_data) => { - log::info!( - "Submitted proof for OLD ask with id : {} via transaction {:?}", - event.ask_id, - tx_data.transaction_hash - ); - } - None => { - log::error!("Error in submitting proof for ASK ID : {}", event.ask_id); - } - } - - thread_count_clone.fetch_sub(1, Ordering::SeqCst); - // code inside thread ends here - }); - } - } - - start_block = end + 1; - } - + let runtime_config: job_creator::RuntimeConfig = serde_json::from_str(&file_content)?; + let _ = job_creator::JobCreator::new(config, runtime_config, 1, false, false) + .run() + .await; Ok(()) } diff --git a/listener/src/proof_generator/confidential_provers.rs b/listener/src/proof_generator/confidential_provers.rs new file mode 100644 index 0000000..f6316a5 --- /dev/null +++ b/listener/src/proof_generator/confidential_provers.rs @@ -0,0 +1,231 @@ +use ethers::types::{Bytes, U256}; +use std::error::Error; + +use super::prover::{post_request, Prover}; + +pub struct ExternalConfidentialProver { + base: ConfidentialProver, + encryption_key: Vec, + skip_input_verification: bool, +} + +impl ExternalConfidentialProver { + #[allow(unused)] + #[allow(clippy::too_many_arguments)] + pub fn new( + input_verification_executable_check_input_url: String, + input_verification_executable_generate_proof_for_invalid_inputs_url: String, + input_and_proof_verify_url: String, + prover_executable_generate_proof_url: String, + ask_id: U256, + public: Bytes, + secrets: Bytes, + encryption_key: Vec, + skip_input_verification: bool, + ) -> Self { + ExternalConfidentialProver { + base: ConfidentialProver::new( + input_verification_executable_check_input_url, + input_verification_executable_generate_proof_for_invalid_inputs_url, + input_and_proof_verify_url, + prover_executable_generate_proof_url, + ask_id, + public, + secrets, + skip_input_verification, + ), + encryption_key, + skip_input_verification, + } + } + + fn prepare_payload(&self) -> (Vec, Option>, Option>) { + let encrypted_secret_data = + kalypso_helper::secret_inputs_helpers::encrypt_data_with_ecies_and_aes( + &self.base.secrets, + &self.encryption_key, + ) + .unwrap(); + + ( + self.base.public.to_vec(), + Some(encrypted_secret_data.encrypted_data), + Some(encrypted_secret_data.acl_data), + ) + } +} + +impl Prover for ExternalConfidentialProver { + fn should_skip_input_verification(&self) -> bool { + self.skip_input_verification + } + + async fn check_inputs(&self) -> Result> { + let (public, secrets, acl) = self.prepare_payload(); + let payload = generator::models::InputPayload::from_encrypted_secrets( + public, + secrets.unwrap(), + acl.unwrap(), + ); + post_request( + &self.base.client, + &self.base.input_verification_executable_check_input_url, + &payload, + ) + .await + } + + async fn generate_proof( + &self, + ) -> Result> { + let (public, secrets, acl) = self.prepare_payload(); + let payload = generator::models::InputPayload::from_encrypted_secrets( + public, + secrets.unwrap(), + acl.unwrap(), + ); + + post_request( + &self.base.client, + &self.base.prover_executable_generate_proof_url, + &payload, + ) + .await + } + + async fn generate_attestation_for_invalid_inputs( + &self, + ) -> Result> { + let (public, secrets, acl) = self.prepare_payload(); + + let payload = generator::models::InputPayload::from_encrypted_secrets( + public, + secrets.unwrap(), + acl.unwrap(), + ); + + post_request( + &self.base.client, + &self + .base + .input_verification_executable_generate_proof_for_invalid_inputs_url, + &payload, + ) + .await + } + + async fn verify_inputs_and_proof( + &self, + proof: &[u8], + ) -> Result> { + self.base.verify_inputs_and_proof(proof).await + } +} + +pub struct ConfidentialProver { + input_verification_executable_check_input_url: String, + input_verification_executable_generate_proof_for_invalid_inputs_url: String, + input_and_proof_verify_url: String, + prover_executable_generate_proof_url: String, + ask_id: U256, + public: Bytes, + secrets: Bytes, + client: reqwest::Client, + skip_input_verification: bool, +} + +impl ConfidentialProver { + pub fn new( + input_verification_executable_check_input_url: String, + input_verification_executable_generate_proof_for_invalid_inputs_url: String, + input_and_proof_verify_url: String, + prover_executable_generate_proof_url: String, + ask_id: U256, + public: Bytes, + secrets: Bytes, + skip_input_verification: bool, + ) -> Self { + Self { + input_verification_executable_check_input_url, + input_verification_executable_generate_proof_for_invalid_inputs_url, + input_and_proof_verify_url, + prover_executable_generate_proof_url, + ask_id, + public, + secrets, + client: reqwest::Client::new(), + skip_input_verification, + } + } + + fn prepare_payload(&self) -> (Vec, Option>) { + (self.public.to_vec(), Some(self.secrets.to_vec())) + } +} + +type BoxError = Box; + +impl Prover for ConfidentialProver { + fn should_skip_input_verification(&self) -> bool { + self.skip_input_verification + } + + async fn check_inputs(&self) -> Result { + let (public, secrets) = self.prepare_payload(); + let payload = generator::models::InputPayload::from_plain_secrets(public, secrets.unwrap()); + post_request( + &self.client, + &self.input_verification_executable_check_input_url, + &payload, + ) + .await + } + + async fn generate_proof(&self) -> Result { + let (public, secrets) = self.prepare_payload(); + let payload = generator::models::InputPayload::from_plain_secrets(public, secrets.unwrap()); + + post_request( + &self.client, + &self.prover_executable_generate_proof_url, + &payload, + ) + .await + } + + async fn generate_attestation_for_invalid_inputs( + &self, + ) -> Result { + let (public, secrets) = self.prepare_payload(); + + let payload = ivs::models::InvalidInputPayload::from_plain_secrets( + self.ask_id, + public, + secrets.unwrap(), + ); + + post_request( + &self.client, + &self.input_verification_executable_generate_proof_for_invalid_inputs_url, + &payload, + ) + .await + } + + async fn verify_inputs_and_proof( + &self, + proof: &[u8], + ) -> Result> { + let input_and_proof_payload = ivs::models::VerifyInputsAndProof { + public_input: Some(self.public.to_vec()), + private_input: Some(self.secrets.to_vec()), + proof: proof.to_vec(), + }; + post_request( + &self.client, + &self.input_and_proof_verify_url, + &input_and_proof_payload, + ) + .await + } +} diff --git a/listener/src/proof_generator/mod.rs b/listener/src/proof_generator/mod.rs new file mode 100644 index 0000000..0b58e8a --- /dev/null +++ b/listener/src/proof_generator/mod.rs @@ -0,0 +1,249 @@ +use crate::job_creator::MarketDetails; +use bindings::proof_marketplace::Ask; +use bindings::proof_marketplace::{AskCreatedFilter, ProofMarketplace}; +use confidential_provers::ConfidentialProver; +use ethers::prelude::k256::ecdsa::SigningKey; +use ethers::prelude::*; +use flate2::read::ZlibDecoder; + +use kalypso_helper::secret_inputs_helpers::decrypt_data_with_ecies_and_aes; +use non_confidential_prover::NonConfidentialProver; +use prover::{Proof, Prover}; +use std::collections::HashMap; +use std::io::Read; +use std::sync::Arc; +use std::time::Instant; +use std::{thread, time::Duration}; + +mod confidential_provers; +mod non_confidential_prover; +pub mod prover; + +type ProofMarketPlaceContractHttp = + Arc, Wallet>>>; + +#[derive(Clone)] +pub struct GenerateProofParams<'a> { + pub ask_id: ethers::types::U256, + pub new_acl: ethers::types::Bytes, + pub proof_market_place_contract_http: ProofMarketPlaceContractHttp, + pub ecies_private_key: &'a Option, + pub start_block: &'a U64, + pub end_block: &'a U64, + pub markets: &'a HashMap, + pub slave_ecies_private_keys: &'a Vec, + pub skip_input_verification: bool, +} + +//Generating proof for the input +pub async fn generate_proof( + generate_proof_params: GenerateProofParams<'_>, +) -> Result> { + let (public_inputs, decoded_secret_input, market_id, parsed_ask_created_log, markets) = + fetch_decoded_secret(generate_proof_params.clone()) + .await + .unwrap(); + + if !generate_proof_params + .markets + .contains_key(&market_id.to_string()) + { + return Err("Market not being proven for".into()); + } + + if parsed_ask_created_log.has_private_inputs { + // market with confidential inputs + let generator_port = &markets.get(&market_id.to_string()).unwrap().port; + let confidential_prover = ConfidentialProver::new( + format!( + "http://localhost:{}/api/checkInput", + generator_port.clone().unwrap() + ), + format!( + "http://localhost:{}/api/getAttestationForInvalidInputs", + generator_port.clone().unwrap() + ), + format!( + "http://localhost:{}/api/verifyInputsAndProof", + generator_port.clone().unwrap() + ), + format!( + "http://localhost:{}/api/generateProof", + generator_port.clone().unwrap() + ), + parsed_ask_created_log.ask_id, + public_inputs.into(), + decoded_secret_input + .expect("Unable to decode secret for confidential markets") + .into(), + generate_proof_params.skip_input_verification, + ); + + confidential_prover.get_proof().await + } else { + // market without confidential inputs + let ivs_url = &markets.get(&market_id.to_string()).unwrap().ivs_url; + let generator_url = &markets + .get(&market_id.to_string()) + .unwrap() + .prover_gateway_url; + + let non_confidential_prover = NonConfidentialProver::new( + format!("{}/api/checkInput", ivs_url.clone().unwrap()), + format!( + "{}/api/getAttestationForInvalidInputs", + ivs_url.clone().unwrap() + ), + format!("{}/api/verifyInputsAndProof", ivs_url.clone().unwrap()), + generator_url.clone().unwrap().clone(), + parsed_ask_created_log.ask_id, + public_inputs.into(), + generate_proof_params.skip_input_verification, + ); + + non_confidential_prover.get_proof().await + } +} + +type InputAndDecodedSecret<'a> = ( + Vec, + Option>, + U256, + AskCreatedFilter, + &'a HashMap, +); +async fn fetch_decoded_secret( + generate_proof_params: GenerateProofParams<'_>, +) -> Result> { + let GenerateProofParams { + proof_market_place_contract_http, + ask_id, + start_block, + end_block, + ecies_private_key, + new_acl, + markets, + slave_ecies_private_keys, + skip_input_verification: _, + } = generate_proof_params; + let client = proof_market_place_contract_http.client(); + let list_of_ask: &Ask = &proof_market_place_contract_http + .list_of_ask(ask_id) + .await? + .0; + let market_id = list_of_ask.market_id; + + let fetching_ask_secret_timer_start = Instant::now(); + log::info!( + "Finding the logs from block {}, for ask: {}", + start_block, + ask_id + ); + + // Looking for ask in a batch range of 9999 blocks, done to avoid the 10000 block limit. + let mut end_block = *end_block; + let start_block = *start_block; + let mut ask_log: Vec = vec![]; + + let mut retry_times = 0; + let max_retry_times = 20; + let blocks_at_once = 9999; + while start_block <= end_block { + let begin = if end_block >= start_block + blocks_at_once { + end_block - blocks_at_once + } else { + start_block + }; + + // Fetching ask Transaction hash + let ask_event_filter = &proof_market_place_contract_http + .ask_created_filter() + .filter + .from_block(begin) + .to_block(end_block) + .topic1(ask_id); + + let logs = client.get_logs(ask_event_filter).await; + if logs.is_err() { + log::error!("Encoutering error while trying to fetch the inputs"); + if retry_times >= max_retry_times { + log::error!("Max retries exhausted"); + return Err("max retries for fetching the logs done".into()); + } else { + log::warn!("Retrying fetching inputs in 2000ms"); + retry_times += 1; + thread::sleep(Duration::from_millis(2000)); + continue; + } + } + + let logs = logs.unwrap(); + log::info!("Logs found: {:?}", logs.len()); + if logs.len() == 1 { + ask_log = logs; + break; + } + + end_block = begin - 1; + } + + let parsed_ask_created_log = proof_market_place_contract_http + .decode_event::( + "AskCreated", + ask_log[0].topics.clone(), + ask_log[0].data.clone(), + ) + .unwrap(); + + //Checking if the ask has a secret provided + let decoded_secret_input = if parsed_ask_created_log.has_private_inputs { + log::info!("Secret input found"); + // Handling compressed secret inputs + let encrypted_secret_input = parsed_ask_created_log.secret_data.to_vec(); + + let mut result = decrypt_data_with_ecies_and_aes( + &encrypted_secret_input, + &new_acl, + ecies_private_key.unwrap().serialize().as_ref(), + Some(market_id), + ); + + if result.is_err() { + for slave_key in slave_ecies_private_keys { + result = decrypt_data_with_ecies_and_aes( + &encrypted_secret_input, + &new_acl, + slave_key.serialize().as_ref(), + Some(market_id), + ); + + if result.is_ok() { + break; + } + } + } + + let result = result.unwrap(); + let mut decoder = ZlibDecoder::new(&result[..]); + let mut decoded_secret_input: Vec = Vec::new(); + decoder.read_to_end(&mut decoded_secret_input).unwrap(); + Some(decoded_secret_input) + } else { + None + }; + + let ask_secret_fetch_time = fetching_ask_secret_timer_start.elapsed().as_millis(); + log::info!( + "Took {} ms for fetching the secret inputs for the ask: {}", + ask_secret_fetch_time, + ask_id + ); + + Ok(( + list_of_ask.prover_data.to_vec(), + decoded_secret_input, + market_id, + parsed_ask_created_log, + markets, + )) +} diff --git a/listener/src/proof_generator/non_confidential_prover.rs b/listener/src/proof_generator/non_confidential_prover.rs new file mode 100644 index 0000000..c4965df --- /dev/null +++ b/listener/src/proof_generator/non_confidential_prover.rs @@ -0,0 +1,105 @@ +use ethers::types::{Bytes, U256}; +use std::error::Error; + +use super::prover::{post_request, Prover}; + +pub struct NonConfidentialProver { + input_verification_executable_check_input_url: String, + input_verification_executable_generate_proof_for_invalid_inputs_url: String, + input_and_proof_verify_url: String, + prover_executable_generate_proof_url: String, + ask_id: U256, + public: Bytes, + client: reqwest::Client, + skip_input_verification: bool, +} + +impl NonConfidentialProver { + pub fn new( + input_verification_executable_check_input_url: String, + input_verification_executable_generate_proof_for_invalid_inputs_url: String, + input_and_proof_verify_url: String, + prover_executable_generate_proof_url: String, + ask_id: U256, + public: Bytes, + skip_input_verification: bool, + ) -> Self { + Self { + input_verification_executable_check_input_url, + input_verification_executable_generate_proof_for_invalid_inputs_url, + input_and_proof_verify_url, + prover_executable_generate_proof_url, + ask_id, + public, + client: reqwest::Client::new(), + skip_input_verification, + } + } + + fn prepare_payload(&self) -> (Vec, Option>) { + (self.public.to_vec(), None) // No secrets in NonConfidentialProver + } +} + +type BoxError = Box; + +impl Prover for NonConfidentialProver { + fn should_skip_input_verification(&self) -> bool { + self.skip_input_verification + } + async fn check_inputs(&self) -> Result { + let (public, _) = self.prepare_payload(); + let payload = generator::models::InputPayload::only_public_inputs(public); + + post_request( + &self.client, + &self.input_verification_executable_check_input_url, + &payload, + ) + .await + } + + async fn generate_proof(&self) -> Result { + let (public, _) = self.prepare_payload(); + let payload = generator::models::InputPayload::only_public_inputs(public); + + post_request( + &self.client, + &self.prover_executable_generate_proof_url, + &payload, + ) + .await + } + + async fn generate_attestation_for_invalid_inputs( + &self, + ) -> Result { + let (public, _) = self.prepare_payload(); // `secrets` is always `None` + + let payload = ivs::models::InvalidInputPayload::only_public_inputs(self.ask_id, public); + + post_request( + &self.client, + &self.input_verification_executable_generate_proof_for_invalid_inputs_url, + &payload, + ) + .await + } + + async fn verify_inputs_and_proof( + &self, + proof: &[u8], + ) -> Result> { + let input_and_proof_payload = ivs::models::VerifyInputsAndProof { + public_input: Some(self.public.to_vec()), + private_input: None, + proof: proof.to_vec(), + }; + post_request( + &self.client, + &self.input_and_proof_verify_url, + &input_and_proof_payload, + ) + .await + } +} diff --git a/listener/src/proof_generator/prover.rs b/listener/src/proof_generator/prover.rs new file mode 100644 index 0000000..afcfeb4 --- /dev/null +++ b/listener/src/proof_generator/prover.rs @@ -0,0 +1,77 @@ +use ethers::types::Bytes; +use reqwest::Client; +use serde::{de::DeserializeOwned, Serialize}; +use std::error::Error; + +#[derive(Debug, Clone)] +pub enum Proof { + ValidProof(Bytes), + InvalidProof(Bytes), +} + +pub trait Prover { + async fn check_inputs(&self) -> Result>; + async fn generate_proof( + &self, + ) -> Result>; + async fn generate_attestation_for_invalid_inputs( + &self, + ) -> Result>; + async fn verify_inputs_and_proof( + &self, + proof: &[u8], + ) -> Result>; + + fn should_skip_input_verification(&self) -> bool; + + async fn get_proof(&self) -> Result> { + if self.should_skip_input_verification() { + let proof = self.generate_proof().await?; + return Ok(Proof::ValidProof(proof.proof.into())); + } + + let check_input = self.check_inputs().await?; + if check_input.valid { + let proof = self.generate_proof().await?; + let check_proof = self.verify_inputs_and_proof(proof.proof.as_ref()).await; + match check_proof { + Ok(data) => { + if data.is_input_and_proof_valid { + log::info!("is_input_and_proof_valid"); + } else { + log::error!("is_input_and_proof_is_invalid"); + log::warn!("invalid proofs will be rejected in future"); + } + } + _ => { + log::error!("Generated Proof could not be verified against IVS"); + } + } + Ok(Proof::ValidProof(proof.proof.into())) + } else { + let proof = self.generate_attestation_for_invalid_inputs().await?; + Ok(Proof::InvalidProof(proof.proof.into())) + } + } +} + +pub async fn post_request( + client: &Client, + url: &str, + payload: &T, +) -> Result> +where + T: Serialize, + R: DeserializeOwned, +{ + let response = client.post(url).json(payload).send().await?; + + if response.status().is_success() { + log::info!("POST: {} | Response: {}", url, response.status()); + let response_payload = response.json::().await?; + Ok(response_payload) + } else { + log::error!("POST: {} | Response: {}", url, response.status()); + Err(Box::new(response.error_for_status().unwrap_err())) + } +} diff --git a/listener/src/server.rs b/listener/src/server.rs new file mode 100644 index 0000000..7f30760 --- /dev/null +++ b/listener/src/server.rs @@ -0,0 +1,100 @@ +use std::sync::Arc; +use std::time::Duration; + +use actix_web::web::Data; +use actix_web::HttpResponse; +use actix_web::{web, App, HttpServer}; +use ethers::types::U64; +use serde::Serialize; +use std::sync::atomic::{AtomicBool, Ordering}; +use tokio::sync::Mutex; + +pub struct ListenerHealthCheckServer { + shared_latest_block: Arc>, + service_name: Arc>, + should_stop: Arc, +} + +impl ListenerHealthCheckServer { + #[allow(clippy::too_many_arguments)] + pub fn new( + service_name: String, + shared_latest_block: Arc>, + should_stop: Arc, + ) -> Self { + ListenerHealthCheckServer { + shared_latest_block, + service_name: Arc::new(Mutex::new(service_name)), + should_stop, + } + } + + pub async fn start_server(self, port: u16, enable_ssc: bool) -> anyhow::Result<()> { + let server = HttpServer::new(move || { + let rate_limiter = kalypso_helper::middlewares::ratelimiter::get_rate_limiter( + Duration::from_secs(1), + 100 as u64, + ); + App::new() + .wrap(rate_limiter) + .app_data(Data::new(self.shared_latest_block.clone())) + .app_data(Data::new(self.service_name.clone())) + .route("/getLatestBlock", web::get().to(get_latest_block_number)) + }); + + if enable_ssc { + let tls_config = kalypso_helper::ssc::create_random_rustls_server_config(); + // Error handling for TLS configuration + if let Err(err) = tls_config { + log::error!("Failed to create TLS config: {}", err); + self.should_stop.store(true, Ordering::Release); + return Err(anyhow::Error::from(err)); + } + + let tls_config = tls_config.unwrap(); + + // Bind the server using Rustls for HTTPS + let server = server.bind_rustls(format!("0.0.0.0:{}", port), tls_config); + if let Err(err) = server { + log::error!("Failed to bind server with Rustls: {}", err); + self.should_stop.store(true, Ordering::Release); + return Err(anyhow::Error::from(err)); + } + + // Run the server and await + server.unwrap().run().await?; + } else { + // Bind the server using plain HTTP + let server = server.bind(format!("0.0.0.0:{}", port)); + if let Err(err) = server { + log::error!("Failed to bind server with HTTP: {}", err); + self.should_stop.store(true, Ordering::Release); + return Err(anyhow::Error::from(err)); + } + + // Run the server and await + server.unwrap().run().await?; + } + + Ok(()) + } +} + +async fn get_latest_block_number( + _shared_parsed_block: Data>>, + service_name: Data>>, +) -> actix_web::Result { + let latest_parsed_block = _shared_parsed_block.lock().await; + let service_name = service_name.lock().await; + + #[derive(Serialize, Debug, Clone)] + struct GetLatestBlockNumberResponse { + pub service_name: String, + pub block_number: String, + } + + Ok(HttpResponse::Ok().json(GetLatestBlockNumberResponse { + service_name: service_name.to_string(), + block_number: latest_parsed_block.to_string(), + })) +} diff --git a/matching_engine/Cargo.toml b/matching_engine/Cargo.toml index 2667e9d..196e0f7 100644 --- a/matching_engine/Cargo.toml +++ b/matching_engine/Cargo.toml @@ -6,27 +6,34 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -actix-web = "4.4.1" +actix-web = {version = "4.5.1", features = ["rustls"] } +anyhow = "1.0.86" bindings = { path = "../bindings", package = "foundry-contracts" } -secret_input_helpers = {path = "../helper", package = "helper"} dotenv = "0.15.0" -elliptic = "0.5.0" +ecies = {version = "0.2.6", features = ["std"]} env_logger = "0.11.3" -eyre = "0.6" ethers = { version = "2", features = ["rustls"] } +eyre = "0.6" flate2 = "1.0.28" futures-util = "0.3.28" -im = "15.1.0" +hex = "0.4.3" +im = { version = "15.1.0", features = ["serde"] } +kalypso_helper = {path = "../helper", package = "helper"} lazy_static = "1.4.0" -libzeropool-zkbob = "1.3.0" log = "0.4" +once_cell = "1.20.2" +rayon = "1.10.0" reqwest = { version = "0.12.4", features = ["json"] } secp256k1 = "0.29.0" -serde = "1.0.178" +serde = { version = "1.0.178", features = ["derive"] } serde_json = "1.0.104" +service_check_helper = {path = "../generator", package = "generator"} tokio = { version = "1.15.0", features = ["full"] } -hex = "0.4.3" -ecies = {version = "0.2.6", features = ["std"]} -actix-extensible-rate-limit = "0.3.1" -anyhow = "1.0.86" -itertools = "0.13.0" + +[features] +default = ["matching_engine_enable_cors"] +matching_engine_enable_cors = ["kalypso_helper/enable_cors"] +disable_match_creation = [] +use_l1_block_numbers = [] +add_timestamp_to_asks= [] +force_transactions = [] \ No newline at end of file diff --git a/matching_engine/src/ask.rs b/matching_engine/src/ask.rs deleted file mode 100644 index d9c2a86..0000000 --- a/matching_engine/src/ask.rs +++ /dev/null @@ -1,401 +0,0 @@ -use ethers::core::types::U256; -use ethers::prelude::*; -use serde::{Deserialize, Serialize}; -use std::collections::HashMap; - -#[allow(unused)] -pub enum Comparison { - Equal, - LessThan, - GreaterThan, - LessThanOrEqual, - GreaterThanOrEqual, -} - -#[derive(Default, Copy, Clone, PartialEq, Eq, PartialOrd, Serialize, Deserialize, Hash)] -pub enum AskState { - #[default] - Null, - Create, - UnAssigned, - Assigned, - Complete, - DeadlineCrossed, - // added latter and not in contract - InvalidSecret, -} - -impl std::fmt::Debug for AskState { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - let value_str = match self { - AskState::Null => "This is a Null state", - AskState::Create => "The ask was created", - AskState::UnAssigned => "The ask is unassignable (likely because of expiry)", - AskState::Assigned => "The ask is assigned", - AskState::Complete => "The ask is complete", - AskState::DeadlineCrossed => "The ask deadline has been crossed", - AskState::InvalidSecret => "The secret for the ask is invalid", - }; - write!(f, "{}", value_str) - } -} - -pub fn get_ask_state(state: u8) -> AskState { - match state { - 0 => AskState::Null, - 1 => AskState::Create, - 2 => AskState::UnAssigned, - 3 => AskState::Assigned, - 4 => AskState::Complete, - 5 => AskState::DeadlineCrossed, - // added latter and not in contract - 6 => AskState::InvalidSecret, - _ => AskState::Null, - } -} - -#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, PartialOrd)] -pub struct MarketMetadata { - pub market_id: U256, - pub verifier: Address, - pub prover_image_id: [u8; 32], - pub slashing_penalty: U256, - pub activation_block: U256, - pub ivs_image_id: [u8; 32], - pub metadata: Bytes, -} - -#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, PartialOrd)] -pub struct LocalAsk { - pub ask_id: U256, - pub market_id: U256, - pub reward: U256, - pub expiry: U256, - pub proving_time: U256, - pub deadline: U256, - pub prover_refund_address: Address, - pub prover_data: Bytes, - pub has_private_inputs: bool, - pub secret_data: Option, - pub secret_acl: Option, - pub state: Option, - pub generator: Option
, - pub invalid_secret_flag: bool, -} - -#[derive(Debug, Serialize, Deserialize)] -pub struct LocalAskStatus { - pub created: usize, - pub unassigned: usize, - pub assigned: usize, - pub completed: usize, - pub deadline_crossed: usize, - pub invalid_secret: usize, -} - -pub struct LocalAskStore { - asks_by_id: HashMap, - market_id_index: HashMap>, - state_index: HashMap>, -} - -pub struct AskQueryResult { - asks: Option>, -} - -impl AskQueryResult { - #[allow(unused)] - pub fn sort_by_expiry(mut self) -> Self { - if let Some(ref mut asks) = self.asks { - asks.sort_by(|a, b| a.expiry.cmp(&b.expiry)); - } - self - } - - pub fn result(self) -> Option> { - self.asks - } - - pub fn sort_by_ask_id(mut self) -> Self { - if let Some(ref mut asks) = self.asks { - asks.sort_by(|a, b| a.ask_id.cmp(&b.ask_id)); - } - self - } - - #[allow(unused)] - pub fn filter_by_market_id(self, market_id: U256) -> Self { - let filtered = self.asks.map(|asks| { - asks.into_iter() - .filter(|ask| ask.market_id == market_id) - .collect::>() - }); - AskQueryResult { asks: filtered } - } - - #[allow(unused)] - pub fn sort_by_proving_time(mut self) -> Self { - if let Some(ref mut asks) = self.asks { - asks.sort_by(|a, b| a.proving_time.cmp(&b.proving_time)); - } - self - } - - #[allow(unused)] - pub fn sort_by_reward(mut self) -> Self { - if let Some(ref mut asks) = self.asks { - asks.sort_by(|a, b| a.reward.cmp(&b.reward)); - } - self - } - - #[allow(unused)] - pub fn sort_by_deadline(mut self) -> Self { - if let Some(ref mut asks) = self.asks { - asks.sort_by(|a, b| a.deadline.cmp(&b.deadline)); - } - self - } - - #[allow(unused)] - pub fn filter_by_has_private_inputs(self, value: bool) -> Self { - let filtered = self.asks.map(|asks| { - asks.into_iter() - .filter(|ask| ask.has_private_inputs == value) - .collect::>() - }); - AskQueryResult { asks: filtered } - } - - pub fn filter_by_flag(self, value: bool) -> Self { - let filtered = self.asks.map(|asks| { - asks.into_iter() - .filter(|ask| ask.invalid_secret_flag == value) - .collect::>() - }); - AskQueryResult { asks: filtered } - } - - #[allow(unused)] - fn compare(value: U256, other: U256, comparison: &Comparison) -> bool { - match comparison { - Comparison::Equal => value == other, - Comparison::LessThan => value < other, - Comparison::GreaterThan => value > other, - Comparison::LessThanOrEqual => value <= other, - Comparison::GreaterThanOrEqual => value >= other, - } - } - - #[allow(unused)] - pub fn filter_by_expiry(self, value: U256, comparison: Comparison) -> Self { - let filtered = self.asks.map(|asks| { - asks.into_iter() - .filter(|ask| Self::compare(ask.expiry, value, &comparison)) - .collect::>() - }); - AskQueryResult { asks: filtered } - } - - #[allow(unused)] - pub fn filter_by_proving_time(self, value: U256, comparison: Comparison) -> Self { - let filtered = self.asks.map(|asks| { - asks.into_iter() - .filter(|ask| Self::compare(ask.proving_time, value, &comparison)) - .collect::>() - }); - AskQueryResult { asks: filtered } - } - - #[allow(unused)] - pub fn filter_by_reward(self, value: U256, comparison: Comparison) -> Self { - let filtered = self.asks.map(|asks| { - asks.into_iter() - .filter(|ask| Self::compare(ask.reward, value, &comparison)) - .collect::>() - }); - AskQueryResult { asks: filtered } - } - - #[allow(unused)] - pub fn filter_by_deadline(self, value: U256, comparison: Comparison) -> Self { - let filtered = self.asks.map(|asks| { - asks.into_iter() - .filter(|ask| Self::compare(ask.deadline, value, &comparison)) - .collect::>() - }); - AskQueryResult { asks: filtered } - } - - #[allow(unused)] - pub fn filter_by_prover_refund_address(self, address: Address) -> Self { - let filtered = self.asks.map(|asks| { - asks.into_iter() - .filter(|ask| ask.prover_refund_address == address) - .collect::>() - }); - AskQueryResult { asks: filtered } - } - - pub fn get_count(self) -> usize { - self.asks.map(|v| v.len()).unwrap_or(0) - } -} - -impl LocalAskStore { - pub fn new() -> Self { - LocalAskStore { - asks_by_id: HashMap::new(), - market_id_index: HashMap::new(), - state_index: HashMap::new(), - } - } - - pub fn insert(&mut self, ask: LocalAsk) { - self.asks_by_id.insert(ask.ask_id, ask.clone()); - - self.market_id_index - .entry(ask.market_id) - .or_default() - .push(ask.clone()); - - if let Some(state) = ask.state { - self.state_index.entry(state).or_default().push(ask); - } - } - - #[allow(unused)] - pub fn remove_by_ask_id(&mut self, ask_id: &U256) { - if let Some(ask) = self.asks_by_id.remove(ask_id) { - if let Some(vec) = self.market_id_index.get_mut(&ask.market_id) { - vec.retain(|a| a.ask_id != *ask_id); - } - - if let Some(state) = ask.state { - if let Some(vec) = self.state_index.get_mut(&state) { - vec.retain(|a| a.ask_id != *ask_id); - } - } - } - } - - pub fn modify_state(&mut self, ask_id: &U256, new_state: AskState) { - if let Some(ask) = self.asks_by_id.get_mut(ask_id) { - if let Some(old_state) = ask.state.take() { - if let Some(vec) = self.state_index.get_mut(&old_state) { - vec.retain(|a| a.ask_id != *ask_id); - } - } - - ask.state = Some(new_state); - self.state_index - .entry(new_state) - .or_default() - .push(ask.clone()); - } - } - - // pub fn update_task_id(&mut self, ask_id: &U256, new_task_id: Option) { - // if let Some(ask) = self.asks_by_id.get_mut(ask_id) { - // ask.task_id = new_task_id; - // } - // } - - pub fn update_ask_generator(&mut self, ask_id: &U256, new_generator: Option
) { - if let Some(ask) = self.asks_by_id.get_mut(ask_id) { - ask.generator = new_generator; - } - } - - pub fn update_ask_acl(&mut self, ask_id: &U256, new_acl: Option) { - if let Some(ask) = self.asks_by_id.get_mut(ask_id) { - ask.secret_acl = new_acl; - } - } - - pub fn get_by_market_id(&self, market_id: &U256) -> AskQueryResult { - AskQueryResult { - asks: self.market_id_index.get(market_id).cloned(), - } - } - - pub fn get_by_state(&self, state: AskState) -> AskQueryResult { - AskQueryResult { - asks: self.state_index.get(&state).cloned(), - } - } - - #[allow(unused)] - pub fn get_by_ask_id(&self, ask_id: &U256) -> Option<&LocalAsk> { - self.asks_by_id.get(ask_id) - } - - pub fn get_ask_status(&self) -> LocalAskStatus { - let created = self.get_by_state(AskState::Create).get_count(); - let unassigned = self.get_by_state(AskState::UnAssigned).get_count(); - let assigned = self.get_by_state(AskState::Assigned).get_count(); - let completed = self.get_by_state(AskState::Complete).get_count(); - let deadline_crossed = self.get_by_state(AskState::DeadlineCrossed).get_count(); - let invalid_secret = self.get_by_state(AskState::InvalidSecret).get_count(); - - LocalAskStatus { - created, - unassigned, - assigned, - completed, - deadline_crossed, - invalid_secret, - } - } -} - -pub struct MarketMetadataStore { - market_by_id: HashMap, -} - -impl MarketMetadataStore { - pub fn new() -> Self { - MarketMetadataStore { - market_by_id: HashMap::new(), - } - } - - pub fn insert(&mut self, market: MarketMetadata) { - self.market_by_id.insert(market.market_id, market.clone()); - } - - #[allow(unused)] - pub fn remove_by_market_id(&mut self, market_id: &U256) { - self.market_by_id.remove(market_id); - } - - #[allow(unused)] - pub fn get_market_by_market_id(&self, market_id: &U256) -> Option<&MarketMetadata> { - self.market_by_id.get(market_id) - } - - pub fn get_slashing_penalty_by_market_id(&self, market_id: &U256) -> Option { - self.market_by_id - .get(market_id) - .map(|metadata| metadata.slashing_penalty) - } - - #[allow(unused)] - pub fn decode_market_verification_url_by_id(&self, market_id: &U256) -> Option { - let market_metadata = &self.market_by_id.get(market_id).unwrap().metadata; - - let metadata_str = market_metadata.to_string(); - let metadata_trim: Vec<_> = metadata_str.split('x').collect(); - let market_metadata_decoded = hex::decode(metadata_trim[1]).unwrap(); - let metadata_bytes: Bytes = market_metadata_decoded.into(); - - let received_url = String::from_utf8(metadata_bytes.0.to_vec()); - match received_url { - Ok(url) => { - log::debug!("URL: {:?}", url.to_owned()); - Some(url.to_owned()) - } - Err(_) => None, - } - } -} diff --git a/matching_engine/src/ask_lib/ask.rs b/matching_engine/src/ask_lib/ask.rs new file mode 100644 index 0000000..38d7462 --- /dev/null +++ b/matching_engine/src/ask_lib/ask.rs @@ -0,0 +1,115 @@ +use super::ask_status::AskState; +use ethers::core::types::U256; +use ethers::prelude::*; +use serde::{Deserialize, Serialize}; +use std::collections::{BTreeSet, HashMap}; + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, PartialOrd)] +pub struct LocalAsk { + pub ask_id: U256, + pub market_id: U256, + pub reward: U256, + pub expiry: U256, + pub deadline: U256, + pub time_requested_for_proof_generation: U256, + pub prover_refund_address: Address, + pub prover_data: Bytes, + pub has_private_inputs: bool, + pub secret_data: Option, + pub secret_acl: Option, + pub state: Option, + pub generator: Option
, + pub invalid_secret_flag: bool, + pub created_on: U256, +} + +use std::{ + cmp::Ordering, + hash::{Hash, Hasher}, +}; + +impl Hash for LocalAsk { + fn hash(&self, state: &mut H) { + self.ask_id.hash(state); + } +} + +impl Ord for LocalAsk { + fn cmp(&self, other: &Self) -> Ordering { + self.ask_id.cmp(&other.ask_id) // Compare by ask_id + } +} + +// CompletedProofs struct with multiple indexes and a counter +pub struct CompletedProofs { + // Index by address (generator), with sorted sets of LocalAsks + completed_by_generator: HashMap>, + + // Index by market_id, with sorted sets of LocalAsks + completed_by_market: HashMap>, + + // Counter to track total number of completed proofs + counter: usize, +} + +impl CompletedProofs { + pub fn new() -> Self { + Self { + completed_by_generator: HashMap::new(), + completed_by_market: HashMap::new(), + counter: 0, + } + } + + // Insert a new proof + pub fn insert(&mut self, ask: LocalAsk) { + if let Some(generator) = ask.generator { + // Insert into the generator index + let generator_set = self + .completed_by_generator + .entry(generator) + .or_insert_with(BTreeSet::new); + generator_set.insert(ask.clone()); // Clone to insert into multiple indexes + + // Insert into the market index + let market_set = self + .completed_by_market + .entry(ask.market_id) + .or_insert_with(BTreeSet::new); + market_set.insert(ask); // No need to clone again here + + // Increment the counter + self.counter += 1; + } + } + + // Get all proofs for a specific generator (across all markets) + pub fn get_all_proofs_for_generator(&self, generator: &Address) -> Option<&BTreeSet> { + self.completed_by_generator.get(generator) + } + + // Get all proofs for a specific market (across all generators) + pub fn get_all_proofs_for_market(&self, market_id: &U256) -> Option<&BTreeSet> { + self.completed_by_market.get(market_id) + } + + // Get the total number of proofs + pub fn total_proofs(&self) -> usize { + self.counter + } + + pub fn get_recent_completed_proofs(&self, n: usize) -> Vec { + let mut all_proofs: Vec = Vec::new(); + + // Directly access the private field `completed_by_market` + for market_set in self.completed_by_market.values() { + all_proofs.extend(market_set.iter().cloned()); + } + + // Sort the proofs by ask_id in descending order (most recent first) + all_proofs.sort_by(|a, b| b.ask_id.cmp(&a.ask_id)); + + // Return the most recent n proofs + all_proofs.into_iter().take(n).collect() + } +} diff --git a/matching_engine/src/ask_lib/ask_status.rs b/matching_engine/src/ask_lib/ask_status.rs new file mode 100644 index 0000000..13b4f33 --- /dev/null +++ b/matching_engine/src/ask_lib/ask_status.rs @@ -0,0 +1,62 @@ +use serde::{Deserialize, Serialize}; + +#[derive(Default, Copy, Clone, PartialEq, Eq, PartialOrd, Serialize, Deserialize, Hash)] +pub enum AskState { + #[default] + Null, + Create, + UnAssigned, + Assigned, + Complete, + DeadlineCrossed, + // added latter and not in contract + InvalidSecret, +} + +#[allow(unused)] +pub enum Comparison { + Equal, + LessThan, + GreaterThan, + LessThanOrEqual, + GreaterThanOrEqual, +} + +impl std::fmt::Debug for AskState { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + let value_str = match self { + AskState::Null => "This is a Null state", + AskState::Create => "The ask was created", + AskState::UnAssigned => "The ask is unassignable (likely because of expiry)", + AskState::Assigned => "The ask is assigned", + AskState::Complete => "The ask is complete", + AskState::DeadlineCrossed => "The ask deadline has been crossed", + AskState::InvalidSecret => "The secret for the ask is invalid", + }; + write!(f, "{}", value_str) + } +} + +pub fn get_ask_state(state: u8) -> AskState { + match state { + 0 => AskState::Null, + 1 => AskState::Create, + 2 => AskState::UnAssigned, + 3 => AskState::Assigned, + 4 => AskState::Complete, + 5 => AskState::DeadlineCrossed, + // added latter and not in contract + 6 => AskState::InvalidSecret, + _ => AskState::Null, + } +} + +#[derive(Debug, Serialize, Deserialize)] +pub struct LocalAskStatus { + pub created: usize, + pub unassigned: usize, + pub assigned: usize, + pub completed: usize, + pub deadline_crossed: usize, + pub invalid_secret: usize, +} diff --git a/matching_engine/src/ask_lib/ask_store.rs b/matching_engine/src/ask_lib/ask_store.rs new file mode 100644 index 0000000..4c6f601 --- /dev/null +++ b/matching_engine/src/ask_lib/ask_store.rs @@ -0,0 +1,528 @@ +use ethers::core::types::U256; +use ethers::prelude::*; +use rayon::prelude::*; +use serde::{Deserialize, Serialize}; +use std::{collections::HashMap, fmt::Display, fmt::Formatter, fmt::Result}; + +use crate::counters::counters::GenericCounters; + +use super::{ + ask::{CompletedProofs, LocalAsk}, + ask_status::{AskState, Comparison, LocalAskStatus}, +}; + +#[derive(Debug, Serialize, Deserialize, Clone)] +pub enum Proof { + ValidProof(Bytes), + InvalidInputAttestation, + FailedProofGeneration, +} + +impl Display for Proof { + fn fmt(&self, f: &mut Formatter<'_>) -> Result { + match self { + Proof::ValidProof(bytes) => { + write!(f, "valid: {}", hex::encode(bytes)) + } + Proof::InvalidInputAttestation => { + write!(f, "invalid inputs detected") + } + Proof::FailedProofGeneration => { + write!(f, "failed proof generation") + } + } + } +} + +impl Default for Proof { + fn default() -> Self { + Proof::FailedProofGeneration + } +} + +pub struct LocalAskStore { + asks_by_id: HashMap, + market_id_index: HashMap>, + state_index: HashMap>, + proofs: HashMap, + proof_counter_by_market: GenericCounters, // Count by U256(i.e AskId), Also sub-count by U256(i.e marketId) + request_counter_by_requestors: GenericCounters, // Count by Address(i.e requestor), Also sub-count by U256(i.e marketId) + proving_time_taken: HashMap, + proving_cost_taken: HashMap, + proof_transaction: HashMap, + failed_request_counter_by_market: GenericCounters, // Count by U256(i.e AskId), Also sub-count by U256(i.e marketId) + completed_proofs: CompletedProofs, + proof_cycle_completed_on: HashMap, + job_created_on_timestamp: HashMap, + job_matched_on_timestamp: HashMap, + job_completed_on_timestamp: HashMap, +} + +pub struct AskQueryResult { + asks: Option>, +} + +impl AskQueryResult { + #[allow(unused)] + pub fn sort_by_expiry(mut self) -> Self { + if let Some(ref mut asks) = self.asks { + asks.par_sort_by(|a, b| a.expiry.cmp(&b.expiry)); + } + self + } + + pub fn result(self) -> Option> { + self.asks + } + + pub fn sort_by_ask_id(mut self, asc: bool) -> Self { + if let Some(ref mut asks) = self.asks { + if asc { + // Sort in ascending order + asks.par_sort_by(|a, b| a.ask_id.cmp(&b.ask_id)); + } else { + // Sort in descending order + asks.par_sort_by(|a, b| b.ask_id.cmp(&a.ask_id)); + } + } + self + } + + pub fn filter_by_market_id(self, market_id: U256) -> Self { + let filtered = self.asks.map(|asks| { + asks.into_par_iter() // Parallel iterator over asks + .filter(|ask| ask.market_id == market_id) // Filter by market_id + .collect::>() // Collect filtered results + }); + AskQueryResult { asks: filtered } + } + + #[allow(unused)] + pub fn sort_by_reward(mut self) -> Self { + if let Some(ref mut asks) = self.asks { + asks.par_sort_by(|a, b| a.reward.cmp(&b.reward)); + } + self + } + + #[allow(unused)] + pub fn sort_by_deadline(mut self) -> Self { + if let Some(ref mut asks) = self.asks { + asks.par_sort_by(|a, b| a.deadline.cmp(&b.deadline)); + } + self + } + + #[allow(unused)] + pub fn filter_by_has_private_inputs(self, value: bool) -> Self { + let filtered = self.asks.map(|asks| { + asks.into_par_iter() + .filter(|ask| ask.has_private_inputs == value) + .collect::>() + }); + AskQueryResult { asks: filtered } + } + + pub fn filter_by_flag(self, value: bool) -> Self { + let filtered = self.asks.map(|asks| { + asks.into_par_iter() + .filter(|ask| ask.invalid_secret_flag == value) + .collect::>() + }); + AskQueryResult { asks: filtered } + } + + #[allow(unused)] + fn compare(value: U256, other: U256, comparison: &Comparison) -> bool { + match comparison { + Comparison::Equal => value == other, + Comparison::LessThan => value < other, + Comparison::GreaterThan => value > other, + Comparison::LessThanOrEqual => value <= other, + Comparison::GreaterThanOrEqual => value >= other, + } + } + + #[allow(unused)] + pub fn filter_by_expiry(self, value: U256, comparison: Comparison) -> Self { + let filtered = self.asks.map(|asks| { + asks.into_par_iter() + .filter(|ask| Self::compare(ask.expiry, value, &comparison)) + .collect::>() + }); + AskQueryResult { asks: filtered } + } + + #[allow(unused)] + pub fn filter_by_reward(self, value: U256, comparison: Comparison) -> Self { + let filtered = self.asks.map(|asks| { + asks.into_par_iter() + .filter(|ask| Self::compare(ask.reward, value, &comparison)) + .collect::>() + }); + AskQueryResult { asks: filtered } + } + + #[allow(unused)] + pub fn filter_by_deadline(self, value: U256, comparison: Comparison) -> Self { + let filtered = self.asks.map(|asks| { + asks.into_par_iter() + .filter(|ask| Self::compare(ask.deadline, value, &comparison)) + .collect::>() + }); + AskQueryResult { asks: filtered } + } + + #[allow(unused)] + pub fn filter_by_prover_refund_address(self, address: Address) -> Self { + let filtered = self.asks.map(|asks| { + asks.into_par_iter() + .filter(|ask| ask.prover_refund_address == address) + .collect::>() + }); + AskQueryResult { asks: filtered } + } + + pub fn get_count(self) -> usize { + self.asks.map(|v| v.len()).unwrap_or(0) + } +} + +impl Default for LocalAskStore { + fn default() -> Self { + Self::new() + } +} + +impl LocalAskStore { + pub fn new() -> Self { + LocalAskStore { + asks_by_id: HashMap::new(), + market_id_index: HashMap::new(), + state_index: HashMap::new(), + proofs: HashMap::new(), + proof_counter_by_market: GenericCounters::new(), + request_counter_by_requestors: GenericCounters::new(), + proving_cost_taken: HashMap::new(), + proving_time_taken: HashMap::new(), + proof_transaction: HashMap::new(), + failed_request_counter_by_market: GenericCounters::new(), + completed_proofs: CompletedProofs::new(), + proof_cycle_completed_on: HashMap::new(), + job_created_on_timestamp: HashMap::new(), + job_matched_on_timestamp: HashMap::new(), + job_completed_on_timestamp: HashMap::new(), + } + } + + pub fn insert(&mut self, ask: LocalAsk) { + self.asks_by_id.insert(ask.ask_id, ask.clone()); + self.request_counter_by_requestors + .insert(ask.market_id, ask.prover_refund_address); + + self.market_id_index + .entry(ask.market_id) + .or_default() + .push(ask.clone()); + + if let Some(state) = ask.state { + self.state_index.entry(state).or_default().push(ask); + } + } + + pub fn remove_ask_only_if_completed(&mut self, ask_id: &U256) { + if let Some(ask) = self.asks_by_id.remove(ask_id) { + // Check if the ask's state is Some and Complete, else return early + if ask.state != Some(AskState::Complete) { + return; + } + + // Remove from market_id_index if it exists + if let Some(vec) = self.market_id_index.get_mut(&ask.market_id) { + vec.retain(|a| a.ask_id != *ask_id); + } + + // Remove from state_index if it exists + if let Some(state) = ask.state { + if let Some(vec) = self.state_index.get_mut(&state) { + vec.retain(|a| a.ask_id != *ask_id); + } + } + + // Insert the completed ask into the HashSet + self.completed_proofs.insert(ask); + } + } + + pub fn modify_state(&mut self, ask_id: &U256, new_state: AskState) { + if let Some(ask) = self.asks_by_id.get_mut(ask_id) { + if let Some(old_state) = ask.state.take() { + if let Some(vec) = self.state_index.get_mut(&old_state) { + vec.retain(|a| a.ask_id != *ask_id); + } + } + + ask.state = Some(new_state); + self.state_index + .entry(new_state) + .or_default() + .push(ask.clone()); + } + } + + pub fn update_ask_generator(&mut self, ask_id: &U256, new_generator: Option
) { + if let Some(ask) = self.asks_by_id.get_mut(ask_id) { + ask.generator = new_generator; + } + } + + pub fn update_ask_acl(&mut self, ask_id: &U256, new_acl: Option) { + if let Some(ask) = self.asks_by_id.get_mut(ask_id) { + ask.secret_acl = new_acl; + } + } + + pub fn store_valid_proof( + &mut self, + ask_id: &U256, + proof: Bytes, + proof_time: U256, + proof_cost: U256, + proof_transaction: String, + ) { + match self.asks_by_id.get_mut(ask_id) { + Some(ask_data) => { + self.proofs.insert(*ask_id, Proof::ValidProof(proof)); + self.proof_counter_by_market + .insert(ask_data.market_id, ask_data.ask_id); + self.proving_time_taken.insert(*ask_id, proof_time); + self.proving_cost_taken.insert(*ask_id, proof_cost); + self.proof_transaction.insert(*ask_id, proof_transaction); + } + _ => {} + } + } + + pub fn note_invalid_inputs(&mut self, ask_id: &U256, proof_transaction: String) { + match self.asks_by_id.get_mut(ask_id) { + Some(ask_data) => { + self.proofs.insert(*ask_id, Proof::InvalidInputAttestation); + self.failed_request_counter_by_market + .insert(ask_data.market_id, ask_data.ask_id); + self.proof_transaction.insert(*ask_id, proof_transaction); + } + _ => {} + } + } + + pub fn note_proof_denied(&mut self, ask_id: &U256, proof_transaction: String) { + match self.asks_by_id.get_mut(ask_id) { + Some(ask_data) => { + self.proofs.insert(*ask_id, Proof::FailedProofGeneration); + self.failed_request_counter_by_market + .insert(ask_data.market_id, ask_data.ask_id); + self.proof_transaction.insert(*ask_id, proof_transaction); + } + _ => {} + } + } + + pub fn get_proving_time(&self, ask_id: &U256) -> Option { + self.proving_time_taken.get(ask_id).cloned() + } + pub fn get_proving_cost(&self, ask_id: &U256) -> Option { + self.proving_cost_taken.get(ask_id).cloned() + } + + pub fn get_proof_transaction(&self, ask_id: &U256) -> Option { + self.proof_transaction.get(ask_id).cloned() + } + + pub fn get_proof_by_ask_id(&self, ask_id: &U256) -> Option { + self.proofs.get(ask_id).cloned() + } + + pub fn get_by_market_id(&self, market_id: &U256) -> AskQueryResult { + AskQueryResult { + asks: self.market_id_index.get(market_id).cloned(), + } + } + + pub fn get_by_ask_state_except_complete(&self, state: AskState) -> AskQueryResult { + if state == AskState::Complete { + return AskQueryResult { asks: None }; + } + AskQueryResult { + asks: self.state_index.get(&state).cloned(), + } + } + + pub fn get_cleanup_asks(&self) -> AskQueryResult { + AskQueryResult { + asks: self.state_index.get(&AskState::Complete).cloned(), + } + } + + pub fn get_by_ask_id(&self, ask_id: &U256) -> Option { + self.asks_by_id.get(ask_id).cloned() + } + + pub fn get_ask_status(&self) -> LocalAskStatus { + let created = self + .get_by_ask_state_except_complete(AskState::Create) + .get_count(); + let unassigned = self + .get_by_ask_state_except_complete(AskState::UnAssigned) + .get_count(); + let assigned = self + .get_by_ask_state_except_complete(AskState::Assigned) + .get_count(); + let completed = self.completed_proofs.total_proofs(); + let deadline_crossed = self + .get_by_ask_state_except_complete(AskState::DeadlineCrossed) + .get_count(); + let invalid_secret = self + .get_by_ask_state_except_complete(AskState::InvalidSecret) + .get_count(); + + LocalAskStatus { + created, + unassigned, + assigned, + completed, + deadline_crossed, + invalid_secret, + } + } +} + +impl LocalAskStore { + // Get the total number of unique requestors across all markets + pub fn total_requestor_count(&self) -> usize { + self.request_counter_by_requestors.total_count() + } + + // Get the number of requestors for a specific market + pub fn total_requestors_by_market_count(&self, market_id: &U256) -> usize { + self.request_counter_by_requestors.key_count(market_id) + } +} + +impl LocalAskStore { + pub fn get_proof_count(&self, market_id: &U256) -> usize { + self.proof_counter_by_market.key_count(market_id) + } + + pub fn get_total_proof_count(&self) -> usize { + self.proof_counter_by_market.total_count() + } +} + +impl LocalAskStore { + pub fn get_failed_request_count_by_market_id(&self, market_id: &U256) -> usize { + self.failed_request_counter_by_market.key_count(market_id) + } + + pub fn get_failed_request_count(&self) -> usize { + self.failed_request_counter_by_market.total_count() + } +} + +impl LocalAskStore { + pub fn get_recent_completed_proofs(&self, n: usize) -> Vec { + self.completed_proofs.get_recent_completed_proofs(n) + } + + pub fn get_completed_proof_of_generator( + &self, + generator: &Address, + skip: usize, + count: usize, + ) -> Vec { + if let Some(generator_proofs) = self + .completed_proofs + .get_all_proofs_for_generator(generator) + { + // Skip the specified number of results and take 'count' results + generator_proofs + .iter() + .skip(skip) // Skip the first 'skip' elements + .take(count) // Take the next 'count' elements + .cloned() // Clone the elements since we're returning Vec + .collect() + } else { + // If no proofs exist for this generator, return an empty vector + Vec::new() + } + } + + pub fn get_completed_proofs_of_market( + &self, + market_id: &U256, + skip: usize, + count: usize, + ) -> Vec { + if let Some(market_proofs) = self.completed_proofs.get_all_proofs_for_market(market_id) { + // Skip the specified number of results and take 'count' results + market_proofs + .iter() + .skip(skip) // Skip the first 'skip' elements + .take(count) // Take the next 'count' elements + .cloned() // Clone the elements since we're returning Vec + .collect() + } else { + // If no proofs exist for this generator, return an empty vector + Vec::new() + } + } +} + +impl LocalAskStore { + pub fn get_proof_proof_cycle_completed_on(&self, ask_id: &U256) -> Option { + self.proof_cycle_completed_on.get(ask_id).cloned() + } + + pub fn update_proof_proof_cycle_completed_on(&mut self, ask_id: &U256, submitted_on: U256) { + self.proof_cycle_completed_on + .insert(ask_id.clone(), submitted_on); + } +} + +impl LocalAskStore { + pub fn get_job_completed_on_timestamp(&self, ask_id: &U256) -> Option { + self.job_completed_on_timestamp.get(ask_id).cloned() + } + + pub fn update_job_completed_on_timestamp( + &mut self, + ask_id: &U256, + completed_on_timestamp: U256, + ) { + self.job_completed_on_timestamp + .insert(ask_id.clone(), completed_on_timestamp); + } + + pub fn get_job_matched_on_timestamp(&self, ask_id: &U256) -> Option { + self.job_matched_on_timestamp.get(ask_id).cloned() + } + + pub fn update_job_matched_on_timestamp(&mut self, ask_id: &U256, matched_on_timestamp: U256) { + self.job_matched_on_timestamp + .insert(ask_id.clone(), matched_on_timestamp); + } + + pub fn get_job_created_on_timestamp(&self, ask_id: &U256) -> Option { + self.job_created_on_timestamp.get(ask_id).cloned() + } + + pub fn update_job_created_on_timestamp(&mut self, ask_id: &U256, created_on_timestamp: U256) { + self.job_created_on_timestamp + .insert(ask_id.clone(), created_on_timestamp); + } + + pub fn get_overall_proving_time(&self, ask_id: &U256) -> Option { + let created_on = self.get_job_created_on_timestamp(ask_id)?; + let completed_on = self.get_job_completed_on_timestamp(ask_id)?; + Some(completed_on.saturating_sub(created_on)) + } +} diff --git a/matching_engine/src/ask_lib/mod.rs b/matching_engine/src/ask_lib/mod.rs new file mode 100644 index 0000000..414c930 --- /dev/null +++ b/matching_engine/src/ask_lib/mod.rs @@ -0,0 +1,3 @@ +pub mod ask; +pub mod ask_status; +pub mod ask_store; diff --git a/matching_engine/src/costs.rs b/matching_engine/src/costs.rs new file mode 100644 index 0000000..d4c0c2d --- /dev/null +++ b/matching_engine/src/costs.rs @@ -0,0 +1,31 @@ +use ethers::types::U256; +use std::collections::HashMap; + +#[derive(Debug, Default)] +pub struct CostStore { + data: HashMap, +} + +impl CostStore { + // Create a new CostStore + pub fn new() -> Self { + Self { + data: HashMap::new(), + } + } + + // Upsert function: insert or update a key-value pair + pub fn upsert(&mut self, key: u8, value: U256) { + self.data.insert(key, value); + } + + // Remove function: remove a key-value pair by key + pub fn remove(&mut self, key: u8) -> Option { + self.data.remove(&key) + } + + // Get function: retrieve a value by key + pub fn get(&self, key: u8) -> Option { + self.data.get(&key).cloned() + } +} diff --git a/matching_engine/src/counters/counters.rs b/matching_engine/src/counters/counters.rs new file mode 100644 index 0000000..7706e2c --- /dev/null +++ b/matching_engine/src/counters/counters.rs @@ -0,0 +1,81 @@ +use im::HashSet; +use std::collections::HashMap; +use std::hash::Hash; + +pub struct GenericCounters { + total_values: HashSet, // Tracks all unique values (e.g., requestors) across all keys + key_wise: HashMap>, // Maps keys (e.g., markets) to sets of values (e.g., requestors) +} + +impl GenericCounters +where + TKey: Eq + Hash + Clone + Send + Sync, // Key type must implement Eq, Hash, and Clone for use in HashMap + TValue: Eq + Hash + Clone + Send + Sync, // Value type must implement Eq, Hash, and Clone for use in HashSet +{ + pub fn new() -> Self { + GenericCounters { + total_values: HashSet::new(), + key_wise: HashMap::new(), + } + } + + // Insert a value for a specific key + pub fn insert(&mut self, key: TKey, value: TValue) { + // Insert the value into the global set of values + self.total_values.insert(value.clone()); + + // Insert the value into the key-specific set of values + let key_entry = self.key_wise.entry(key).or_insert_with(HashSet::new); + key_entry.insert(value); + } + + // Remove a value from a specific key + #[allow(unused)] + pub fn remove(&mut self, key: TKey, value: &TValue) { + // Remove the value from the key-specific set + if let Some(key_entry) = self.key_wise.get_mut(&key) { + key_entry.remove(value); + + // If the key set is empty, remove the key entry entirely + if key_entry.is_empty() { + self.key_wise.remove(&key); + } + } + + // Optionally: Remove the value from the global set only if they are no longer in any key + if !self.key_wise.values().any(|values| values.contains(value)) { + self.total_values.remove(value); + } + } + + // Get the total number of unique values across all keys + pub fn total_count(&self) -> usize { + self.total_values.len() + } + + // Get the number of values for a specific key + pub fn key_count(&self, key: &TKey) -> usize { + self.key_wise.get(key).map_or(0, |set| set.len()) + } + + // Get the list of values associated with a specific key + #[allow(unused)] + pub fn get_values_by_key(&self, key: &TKey) -> Option<&HashSet> { + self.key_wise.get(key) + } + + // Get all keys that a value is associated with + #[allow(unused)] + pub fn get_keys_by_value(&self, value: &TValue) -> Vec { + self.key_wise + .iter() + .filter_map(|(key, values)| { + if values.contains(value) { + Some(key.clone()) + } else { + None + } + }) + .collect() + } +} diff --git a/matching_engine/src/counters/median_counter.rs b/matching_engine/src/counters/median_counter.rs new file mode 100644 index 0000000..5872801 --- /dev/null +++ b/matching_engine/src/counters/median_counter.rs @@ -0,0 +1,94 @@ +use std::cmp::Reverse; +use std::collections::{BinaryHeap, HashMap}; +use std::hash::Hash; // To use for the min-heap + +// Struct to store two heaps for median calculation +pub struct MedianTracker { + min_heap: BinaryHeap>, // Min-heap to store larger half (smallest on top) + max_heap: BinaryHeap, // Max-heap to store smaller half (largest on top) +} + +impl MedianTracker +where + TValue: Ord + Clone, // Require Ord to maintain heap order and Clone for value extraction +{ + pub fn new() -> Self { + MedianTracker { + min_heap: BinaryHeap::new(), + max_heap: BinaryHeap::new(), + } + } + + // Insert a value and maintain the balance between the heaps + pub fn insert(&mut self, value: TValue) { + if self.max_heap.is_empty() || value <= *self.max_heap.peek().unwrap() { + self.max_heap.push(value); + } else { + self.min_heap.push(Reverse(value)); + } + + // Balance the heaps (make sure max_heap has equal or one more element than min_heap) + if self.max_heap.len() > self.min_heap.len() + 1 { + let moved_value = self.max_heap.pop().unwrap(); + self.min_heap.push(Reverse(moved_value)); + } else if self.min_heap.len() > self.max_heap.len() { + let moved_value = self.min_heap.pop().unwrap().0; + self.max_heap.push(moved_value); + } + } + + // Get the median + pub fn median(&self) -> Option { + if self.max_heap.is_empty() { + return None; + } + + if self.max_heap.len() > self.min_heap.len() { + // Odd number of elements, median is the top of the max-heap + Some(self.max_heap.peek().unwrap().clone()) + } else { + // Even number of elements, median is the average of the two tops + // Here we return the top of the max-heap, you can modify it to suit your case + Some(self.max_heap.peek().unwrap().clone()) + } + } +} + +// Main struct to handle per-key and global median tracking +pub struct MedianCounter { + key_wise: HashMap>, // Per-key median trackers + global_tracker: MedianTracker, // Global median tracker +} + +impl MedianCounter +where + TKey: Eq + Hash + Clone, // Key must be hashable and clonable + TValue: Ord + Clone, // Value must be sortable and clonable +{ + pub fn new() -> Self { + MedianCounter { + key_wise: HashMap::new(), + global_tracker: MedianTracker::new(), + } + } + + // Insert a value for a specific key and update the global tracker + pub fn insert(&mut self, key: TKey, value: TValue) { + // Insert into the global tracker + self.global_tracker.insert(value.clone()); + + // Insert into the key-specific tracker + let key_entry = self.key_wise.entry(key).or_insert_with(MedianTracker::new); + key_entry.insert(value); + } + + // Get the global median + pub fn median_all(&self) -> Option { + self.global_tracker.median() + } + + // Get the median for a specific key + pub fn median_by_key(&self, key: &TKey) -> Option { + self.key_wise.get(key).and_then(|tracker| tracker.median()) + } +} diff --git a/matching_engine/src/counters/mod.rs b/matching_engine/src/counters/mod.rs new file mode 100644 index 0000000..2a68bed --- /dev/null +++ b/matching_engine/src/counters/mod.rs @@ -0,0 +1,2 @@ +pub mod counters; +pub mod median_counter; diff --git a/matching_engine/src/generator.rs b/matching_engine/src/generator.rs deleted file mode 100644 index e4c9e2b..0000000 --- a/matching_engine/src/generator.rs +++ /dev/null @@ -1,696 +0,0 @@ -use ethers::core::types::Address; -use ethers::prelude::*; -use serde::{Deserialize, Serialize}; -use tokio::sync::MutexGuard; - -use rand::Rng; -use std::collections::HashMap; -use std::ops::{Add, AddAssign, Div, Sub, SubAssign}; - -#[derive(Default, PartialEq, Eq, PartialOrd, Serialize, Deserialize, Hash, Copy, Clone)] -pub enum GeneratorState { - #[default] - Null, - Joined, - NoComputeAvailable, - Wip, - RequestedForExit, - PendingConfirmation, // Not present in contracts -} - -impl std::fmt::Debug for GeneratorState { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - let value_str = match self { - GeneratorState::Null => "This is a Null state", - GeneratorState::Joined => "The generator has joined", - GeneratorState::NoComputeAvailable => "The generator has no compute available", - GeneratorState::Wip => "Work in progress state", - GeneratorState::RequestedForExit => "The generator requested for exit", - GeneratorState::PendingConfirmation => "The generator is selected for task", - }; - write!(f, "{}", value_str) - } -} - -#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Clone)] -pub struct Generator { - pub address: Address, - pub reward_address: Address, - pub total_stake: U256, - pub sum_of_compute_allocations: U256, - pub compute_consumed: U256, - pub stake_locked: U256, - pub active_market_places: U256, - pub declared_compute: U256, - pub intended_stake_util: U256, - pub intended_compute_util: U256, - pub generator_data: Option, -} - -#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Clone)] -pub struct GeneratorInfoPerMarket { - pub address: Address, - pub market_id: U256, - pub total_stake: U256, - pub compute_required_per_request: U256, - pub proof_generation_cost: U256, - pub proposed_time: U256, - pub active_requests: U256, - pub proofs_submitted: U256, - pub state: Option, -} - -#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Clone)] -pub struct Key { - pub address: Address, - pub key_index: u64, - pub ecies_pub_key: Option, -} - -#[derive(Debug)] -pub struct KeyStore { - keys: HashMap<(Address, u64), Key>, // Using u64 as a stand-in for uint256. -} - -pub fn get_generator_state(state: u8) -> GeneratorState { - match state { - 0 => GeneratorState::Null, - 1 => GeneratorState::Joined, - 2 => GeneratorState::NoComputeAvailable, - 3 => GeneratorState::Wip, - 4 => GeneratorState::RequestedForExit, - _ => GeneratorState::Null, - } -} - -pub fn sort_by_total_stake( - mut generators: Vec<&GeneratorInfoPerMarket>, -) -> Vec<&GeneratorInfoPerMarket> { - generators.sort_by(|a, b| a.total_stake.cmp(&b.total_stake)); - generators -} - -pub fn sort_by_proof_generation_cost( - mut generators: Vec<&GeneratorInfoPerMarket>, -) -> Vec<&GeneratorInfoPerMarket> { - generators.sort_by(|a, b| a.proof_generation_cost.cmp(&b.proof_generation_cost)); - generators -} - -pub fn sort_by_proposed_time( - mut generators: Vec<&GeneratorInfoPerMarket>, -) -> Vec<&GeneratorInfoPerMarket> { - generators.sort_by(|a, b| a.proposed_time.cmp(&b.proposed_time)); - generators -} - -pub fn sort_by_proofs_submitted( - mut generators: Vec<&GeneratorInfoPerMarket>, -) -> Vec<&GeneratorInfoPerMarket> { - generators.sort_by(|a, b| a.proofs_submitted.cmp(&b.proofs_submitted)); - generators -} - -pub fn idle_generator_selector( - generators: Vec<&GeneratorInfoPerMarket>, -) -> Vec { - // sort generators based on total stake - let vec_by_stake = sort_by_total_stake(generators.clone()); - - // sort generators based on proof generation cost - let vec_by_cost = sort_by_proof_generation_cost(generators.clone()); - - // sort generators based on proofs submitted - let vec_by_proofs = sort_by_proofs_submitted(generators.clone()); - - // sort generator based on proof generation time - let vec_by_time = sort_by_proposed_time(generators.clone()); - - // Calculating generator score and collecting values - let mut generator_percentiles = vec![]; - for elem in generators { - // calculating percentile by total stake - let percentile_by_stake = get_percentile_by_position(&vec_by_stake, elem); - - // calculating percentile by proof generation cost - let percentile_by_cost = get_percentile_by_position(&vec_by_cost, elem); - - // calculating percentile by proofs submitted - let percentile_by_proofs = get_percentile_by_position(&vec_by_proofs, elem); - - // calculating percentile by proof generation time - let percentile_by_time = get_percentile_by_position(&vec_by_time, elem); - - // calculating generator score for each generator - let percentile_weights = vec![ - ((100.0 - percentile_by_time), 40.0), - (percentile_by_stake, 30.0), - (percentile_by_proofs, 20.0), - ((100.0 - percentile_by_cost), 10.0), - ]; - - let generator_score = get_generator_score(percentile_weights); - - // Collecting it in a vector - generator_percentiles.push((elem.clone(), unsafe { - generator_score.floor().to_int_unchecked::() - })); - } - - // Sorting generators based on scores - generator_percentiles.sort_by(|a, b| a.1.cmp(&b.1)); - generator_percentiles.reverse(); - - // Selecting only the generators with 5 highest generator scores - let mut to_return = vec![]; - let mut counter = 5; - for elem in generator_percentiles { - to_return.push(elem.0.clone()); - counter -= 1; - if counter == 0 { - break; - } - } - to_return -} - -fn get_percentile_by_position( - vec: &[&GeneratorInfoPerMarket], - generator: &GeneratorInfoPerMarket, -) -> f64 { - let index = vec.iter().position(|&x| x == generator).unwrap() as f64; - let total_generators = vec.len() as f64; - - (index / total_generators) * 100_f64 -} - -fn get_generator_score(vec: Vec<(f64, f64)>) -> f64 { - let mut sum: f64 = 0.0; - for elem in vec { - sum.add_assign(elem.0 * elem.1); - } - - sum.div(100.0) -} - -pub fn random_generator_selection( - vec: Vec, -) -> Option { - if vec.is_empty() { - None - } else { - let mut rng = rand::thread_rng(); - let element = &vec[rng.gen_range(0..vec.len())]; - Some(element.clone()) - } -} - -#[allow(unused)] -pub fn weighted_generator_selection( - vec: Vec, -) -> Option { - let mut rng = rand::thread_rng(); - let mut generator = vec[0].clone(); - - match vec.len() { - 1 => (), - 2 => { - let mut weights = [0.4, 0.6]; - let mut tmp = 0.0; - for weight in &mut weights[0..2] { - tmp += *weight; - *weight = tmp; - } - - let selector = rng.gen_range(0.0..1.0); - for i in 0..2 { - if selector < weights[i] { - generator = vec[i].clone(); - break; - } - } - } - 3 => { - let mut weights = [0.2, 0.5, 0.3]; - let mut tmp = 0.0; - for weight in &mut weights[0..3] { - tmp += *weight; - *weight = tmp; - } - - let selector = rng.gen_range(0.0..1.0); - for i in 0..3 { - if selector < weights[i] { - generator = vec[i].clone(); - break; - } - } - } - 4 => { - let mut weights = [0.1, 0.3, 0.4, 0.2]; - let mut tmp = 0.0; - for weight in &mut weights[0..4] { - tmp += *weight; - *weight = tmp; - } - - let selector = rng.gen_range(0.0..1.0); - for i in 0..4 { - if selector < weights[i] { - generator = vec[i].clone(); - break; - } - } - } - 5 => { - let mut weights = [0.1, 0.3, 0.2, 0.1, 0.3]; - let mut tmp = 0.0; - for weight in &mut weights[0..5] { - tmp += *weight; - *weight = tmp; - } - - let selector = rng.gen_range(0.0..1.0); - for i in 0..5 { - if selector < weights[i] { - generator = vec[i].clone(); - break; - } - } - } - _ => log::error!("Invalid length of generators"), - } - - Some(generator) -} - -#[derive(Debug, Clone)] -pub struct GeneratorStore { - // Change key to tuple (Address, U256) - generators: HashMap, - generator_markets: HashMap<(Address, U256), GeneratorInfoPerMarket>, - state_index: HashMap>, - address_index: HashMap>, // to easily fetch all generators by address -} - -impl GeneratorStore { - pub fn new() -> Self { - GeneratorStore { - generators: HashMap::new(), - generator_markets: HashMap::new(), - state_index: HashMap::new(), - address_index: HashMap::new(), - } - } - - pub fn all_generators_address(self) -> Vec
{ - self.generators.keys().cloned().collect() - } - - pub fn insert(&mut self, generator: Generator) { - let address = generator.address; - self.generators.insert(address, generator); - } - - pub fn insert_markets(&mut self, generator_market: GeneratorInfoPerMarket) { - let address = generator_market.address; - let market_id = generator_market.market_id; - let compute_allocation = generator_market.compute_required_per_request; - - if let Some(generator) = self.generators.get_mut(&address) { - generator.active_market_places.add_assign(U256::one()); - generator - .sum_of_compute_allocations - .add_assign(compute_allocation); - } - - if let Some(state) = &generator_market.state { - self.state_index - .entry(*state) - .or_default() - .push((address, market_id)); - } - - self.address_index - .entry(address) - .or_default() - .push(market_id); - - self.generator_markets - .insert((address, market_id), generator_market); - } - - pub fn get_by_address_and_market( - &self, - address: &Address, - market_id: &U256, - ) -> Option<&GeneratorInfoPerMarket> { - self.generator_markets.get(&(*address, *market_id)) - } - - pub fn remove_by_address_and_market(&mut self, address: &Address, market_id: &U256) { - if let Some(generator_market) = self.generator_markets.remove(&(*address, *market_id)) { - let compute_allocation = generator_market.compute_required_per_request; - if let Some(state) = &generator_market.state { - if let Some(vec) = self.state_index.get_mut(state) { - vec.retain(|&(a, m)| a != *address || m != *market_id); - } - } - - if let Some(generator) = self.generators.get_mut(address) { - generator - .sum_of_compute_allocations - .sub_assign(compute_allocation); - generator.active_market_places.sub_assign(U256::one()); - } - } - } - - pub fn remove_by_address(&mut self, address: &Address) { - self.generators.remove(address); - } - - pub fn add_extra_stake(&mut self, address: &Address, amount: &U256) { - if let Some(generator) = self.generators.get_mut(address) { - generator.total_stake = generator.total_stake.add(amount); - - if let Some(markets) = self.address_index.get(address) { - for elem in markets { - if let Some(generator_market) = - self.generator_markets.get_mut(&(*address, *elem)) - { - generator_market.total_stake = generator.total_stake; - } - } - } - } - } - - pub fn update_intended_stake_util(&mut self, address: &Address, new_stake_util: U256) { - if let Some(generator) = self.generators.get_mut(address) { - generator.intended_stake_util = new_stake_util; - } - } - - pub fn remove_stake(&mut self, address: &Address, amount: &U256) { - if let Some(generator) = self.generators.get_mut(address) { - generator.total_stake = generator.total_stake.sub(amount); - - if let Some(markets) = self.address_index.get(address) { - for elem in markets { - if let Some(generator_market) = - self.generator_markets.get_mut(&(*address, *elem)) - { - generator_market.total_stake = generator.total_stake; - } - } - } - } - } - - pub fn update_reward_address(&mut self, address: &Address, new_reward_address: Address) { - if let Some(generator) = self.generators.get_mut(address) { - generator.reward_address = new_reward_address; - } - } - - pub fn add_extra_compute(&mut self, address: &Address, compute: U256) { - if let Some(generator) = self.generators.get_mut(address) { - generator.declared_compute = generator.declared_compute.add(compute); - } - } - - pub fn update_intended_compute_util(&mut self, address: &Address, new_compute_util: U256) { - if let Some(generator) = self.generators.get_mut(address) { - generator.intended_compute_util = new_compute_util; - } - } - - pub fn remove_compute(&mut self, address: &Address, compute: U256) { - if let Some(generator) = self.generators.get_mut(address) { - generator.declared_compute = generator.declared_compute.sub(compute); - } - } - - pub fn update_state(&mut self, address: &Address, market_id: &U256, new_state: GeneratorState) { - if let Some(generator_market) = self.generator_markets.get_mut(&(*address, *market_id)) { - if let Some(old_state) = &generator_market.state { - if let Some(vec) = self.state_index.get_mut(old_state) { - vec.retain(|&a| a != (*address, *market_id)); - } - } - - generator_market.state = Some(new_state); - self.state_index - .entry(new_state) - .or_default() - .push((*address, *market_id)); - } - } - - pub fn update_on_assigned_task( - &mut self, - address: &Address, - market_id: &U256, - slashing_penalty: U256, - ) { - if let Some(generator_market) = self.generator_markets.get_mut(&(*address, *market_id)) { - generator_market.active_requests.add_assign(U256::one()); - - if let Some(generator) = self.generators.get_mut(address) { - generator - .compute_consumed - .add_assign(generator_market.compute_required_per_request); - generator.stake_locked.add_assign(slashing_penalty); - } - } - } - - pub fn update_on_submit_proof( - &mut self, - address: &Address, - market_id: &U256, - slashing_penalty: U256, - ) { - if let Some(generator_market) = self.generator_markets.get_mut(&(*address, *market_id)) { - generator_market.active_requests.sub_assign(U256::one()); - generator_market.proofs_submitted.add_assign(U256::one()); - - if let Some(generator) = self.generators.get_mut(address) { - generator - .compute_consumed - .sub_assign(generator_market.compute_required_per_request); - generator.stake_locked.sub_assign(slashing_penalty); - } - } - } - - pub fn update_on_slashing( - &mut self, - address: &Address, - market_id: &U256, - slashing_penalty: U256, - ) { - if let Some(generator_market) = self.generator_markets.get_mut(&(*address, *market_id)) { - generator_market.active_requests.sub_assign(U256::one()); - - if let Some(generator) = self.generators.get_mut(address) { - generator - .compute_consumed - .sub_assign(generator_market.compute_required_per_request); - generator.stake_locked.sub_assign(slashing_penalty); - generator.total_stake.sub_assign(slashing_penalty); - } - } - } - - #[allow(unused)] - pub fn get_all_by_address(&self, address: &Address) -> Vec<&GeneratorInfoPerMarket> { - match self.address_index.get(address) { - Some(market_ids) => market_ids - .iter() - .filter_map(|m_id| self.generator_markets.get(&(*address, *m_id))) - .collect(), - None => Vec::new(), - } - } - - pub fn get_by_address(&self, address: &Address) -> Option<&Generator> { - self.generators.get(address) - } -} - -pub struct GeneratorQueryResult<'a> { - generator_markets: Vec<&'a GeneratorInfoPerMarket>, -} - -impl<'a> GeneratorQueryResult<'a> { - // Initialize with a collection of generators - pub fn new(generator_markets: Vec<&'a GeneratorInfoPerMarket>) -> Self { - Self { generator_markets } - } - - // Filter by reward - pub fn filter_by_reward(mut self, task_reward: U256) -> Self { - log::debug!("Filter by reward"); - self.generator_markets - .retain(|&gen| gen.proof_generation_cost.lt(&task_reward)); - self - } - - // Filter by market ID - pub fn filter_by_market_id(mut self, market_id: U256) -> Self { - log::debug!("Filter by market id"); - self.generator_markets - .retain(|&gen| gen.market_id == market_id); - self - } - - // Filter by state - #[allow(unused)] - pub fn filter_by_state(mut self, state: GeneratorState) -> Self { - self.generator_markets - .retain(|&gen| gen.state == Some(state)); - self - } - - // Final getter to consume the object and retrieve the filtered generators - pub fn result(self) -> Vec<&'a GeneratorInfoPerMarket> { - self.generator_markets - } -} - -// Adding query methods to the `GeneratorStore` -impl GeneratorStore { - #[allow(unused)] - pub fn query(&self) -> GeneratorQueryResult { - GeneratorQueryResult::new(self.generator_markets.values().collect()) - } - - pub fn query_by_state(&self, state: GeneratorState) -> GeneratorQueryResult { - log::debug!("Check query by state"); - let generators_market = match self.state_index.get(&state) { - Some(pairs) => pairs - .iter() - .filter_map(|&(address, market_id)| { - self.generator_markets.get(&(address, market_id)) - }) - .collect(), - None => Vec::new(), - }; - GeneratorQueryResult::new(generators_market) - } - - #[allow(unused)] - pub fn query_by_address(&self, address: Address) -> GeneratorQueryResult { - let generators = match self.address_index.get(&address) { - Some(market_ids) => market_ids - .iter() - .filter_map(|m_id| self.generator_markets.get(&(address, *m_id))) - .collect(), - None => Vec::new(), - }; - GeneratorQueryResult::new(generators) - } - - pub fn filter_by_has_idle_compute( - &self, - generator_query: GeneratorQueryResult, - ) -> GeneratorQueryResult { - let generator_array = generator_query.result(); - let mut generator_result = vec![]; - for elem in generator_array { - if let Some(generator) = self.generators.get(&elem.address) { - let idle_compute = generator.declared_compute.sub(generator.compute_consumed); - let utilization = generator.intended_compute_util; - let exponent: U256 = 1000000000000000000_i64.into(); - if utilization >= exponent && idle_compute.gt(&elem.compute_required_per_request) { - generator_result.push( - self.generator_markets - .get(&(elem.address, elem.market_id)) - .unwrap(), - ); - } - } - } - - GeneratorQueryResult::new(generator_result) - } - - pub fn filter_by_available_stake( - &self, - generator_query: GeneratorQueryResult, - min_stake: U256, - ) -> GeneratorQueryResult { - let generator_array = generator_query.result(); - let mut generator_result = vec![]; - for elem in generator_array { - if let Some(generator) = self.generators.get(&elem.address) { - let remaining_stake = generator.total_stake.sub(generator.stake_locked); - let utilization = generator.intended_stake_util; - let exponent: U256 = 1000000000000000000_i64.into(); - if utilization >= exponent && remaining_stake.gt(&min_stake) { - generator_result.push( - self.generator_markets - .get(&(elem.address, elem.market_id)) - .unwrap(), - ); - } - } - } - GeneratorQueryResult::new(generator_result) - } - - pub fn filter_by_has_private_inputs_support( - &self, - generator_query: GeneratorQueryResult, - key_store: MutexGuard<'_, KeyStore>, - ) -> GeneratorQueryResult { - let generator_array = generator_query.result(); - let mut generator_result = vec![]; - for elem in generator_array { - if let Some(generator) = self.generators.get(&elem.address) { - let ecies_pub_key = - key_store.get_by_address(&generator.address, elem.market_id.as_u64()); - if ecies_pub_key.is_some() { - generator_result.push( - self.generator_markets - .get(&(elem.address, elem.market_id)) - .unwrap(), - ); - } - } - } - GeneratorQueryResult::new(generator_result) - } -} - -impl KeyStore { - pub fn new() -> Self { - KeyStore { - keys: HashMap::new(), - } - } - - // Assuming you now need to pass the u64 value along with the Key - pub fn insert(&mut self, address: Address, value: u64, key: Key) { - self.keys.insert((address, value), key); - } - - // Updated to reflect the tuple key - pub fn get_by_address(&self, address: &Address, value: u64) -> Option<&Key> { - self.keys.get(&(*address, value)) - } - - // Updated to reflect the tuple key - pub fn remove_by_address(&mut self, address: &Address, value: u64) { - self.keys.remove(&(*address, value)); - } - - // Updated to reflect the tuple key - pub fn update_pub_key(&mut self, address: &Address, value: u64, new_pub_key: Option) { - if let Some(key) = self.keys.get_mut(&(*address, value)) { - key.ecies_pub_key = new_pub_key; - } - } -} diff --git a/matching_engine/src/generator_lib/delegation.rs b/matching_engine/src/generator_lib/delegation.rs new file mode 100644 index 0000000..5e5b2f5 --- /dev/null +++ b/matching_engine/src/generator_lib/delegation.rs @@ -0,0 +1,160 @@ +use ethers::prelude::*; +use serde::{Deserialize, Serialize}; +use std::cmp::Ordering; +use std::collections::{BTreeSet, HashMap}; +use std::fmt; +use std::hash::{Hash, Hasher}; + +// Ensure that the path to AddressTokenPair is correct in your project. +use crate::utility::AddressTokenPair; + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct DelegationStore { + by_generator: HashMap>, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct Delegation { + pub delegation: AddressTokenPair, + pub source: Source, + pub operation: Operation, + // block_number | transaction_index | log_index | Source | Operation is unique + pub block_number: U64, + pub transaction_index: U64, + pub log_index: U256, + pub tx: String, +} + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Hash, PartialOrd, Ord)] +pub enum Operation { + Delegate, + UnDelegate, + Slash, +} + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Hash, PartialOrd, Ord)] +pub enum Source { + Native, + Symbiotic, +} + +impl fmt::Display for Operation { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + Operation::Delegate => write!(f, "Delegate"), + Operation::UnDelegate => write!(f, "UnDelegate"), + Operation::Slash => write!(f, "Slash"), + } + } +} + +impl fmt::Display for Source { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + Source::Native => write!(f, "Native"), + Source::Symbiotic => write!(f, "Symbiotic"), + } + } +} + +impl PartialEq for Delegation { + fn eq(&self, other: &Self) -> bool { + self.block_number == other.block_number + && self.transaction_index == other.transaction_index + && self.log_index == other.log_index + && self.source == other.source + && self.operation == other.operation + } +} + +impl Eq for Delegation {} + +impl Hash for Delegation { + fn hash(&self, state: &mut H) { + self.block_number.hash(state); + self.transaction_index.hash(state); + self.log_index.hash(state); + self.source.hash(state); + self.operation.hash(state); + } +} + +impl PartialOrd for Delegation { + fn partial_cmp(&self, other: &Self) -> Option { + Some(self.cmp(other)) + } +} + +impl Ord for Delegation { + fn cmp(&self, other: &Self) -> Ordering { + match self.block_number.cmp(&other.block_number) { + Ordering::Equal => match self.transaction_index.cmp(&other.transaction_index) { + Ordering::Equal => match self.log_index.cmp(&other.log_index) { + Ordering::Equal => match self.source.cmp(&other.source) { + Ordering::Equal => self.operation.cmp(&other.operation), + other_order => other_order, + }, + other_order => other_order, + }, + other_order => other_order, + }, + other_order => other_order, + } + } +} + +impl DelegationStore { + /// Creates a new DelegationStore. + pub fn new() -> Self { + DelegationStore { + by_generator: HashMap::new(), + } + } + + /// Adds a delegation to the store. + /// + /// # Arguments + /// + /// * `generator` - The address of the generator. + /// * `delegation` - The delegation to add. + pub fn add_delegation(&mut self, generator: &Address, delegation: Delegation) { + self.by_generator + .entry(*generator) + .or_insert_with(BTreeSet::new) + .insert(delegation); + } + + /// Retrieves a paginated list of delegations for a given generator. + /// + /// # Arguments + /// + /// * `generator` - The address of the generator whose delegations are to be retrieved. + /// * `skip` - The number of delegations to skip. + /// * `count` - The maximum number of delegations to return. + /// + /// # Returns + /// + /// A `Vec` containing the requested delegations. If the generator + /// does not exist or there are not enough delegations, the returned vector + /// will contain as many delegations as available after skipping. + pub fn get_delegations_by_operations( + &self, + generator: &Address, + operations: Vec, + skip: usize, + count: usize, + ) -> Vec { + // Attempt to retrieve the delegations for the specified generator. + if let Some(delegations_set) = self.by_generator.get(generator) { + delegations_set + .iter() // Create an iterator over &Delegation + .filter(|delegation| operations.contains(&delegation.operation)) // Filter by operations + .skip(skip) // Skip the first `skip` delegations + .take(count) // Take the next `count` delegations + .cloned() // Clone each Delegation to return owned instances + .collect() // Collect into a Vec + } else { + Vec::new() // Generator not found; return an empty Vec + } + } +} diff --git a/matching_engine/src/generator_lib/generator_helper.rs b/matching_engine/src/generator_lib/generator_helper.rs new file mode 100644 index 0000000..a271c23 --- /dev/null +++ b/matching_engine/src/generator_lib/generator_helper.rs @@ -0,0 +1,26 @@ +use super::generator_store::GeneratorInfoPerMarket; +use ethers::core::rand; +use rand::Rng; + +pub fn random_generator_selection( + vec: Vec, +) -> Option { + if vec.is_empty() { + None + } else { + let mut rng = rand::thread_rng(); + let element = &vec[rng.gen_range(0..vec.len())]; + Some(element.clone()) + } +} + +pub fn select_idle_generators( + generators: Vec, +) -> Vec { + let mut to_return = vec![]; + for generator in generators { + to_return.push(generator.clone()); + } + + to_return +} diff --git a/matching_engine/src/generator_lib/generator_query.rs b/matching_engine/src/generator_lib/generator_query.rs new file mode 100644 index 0000000..daf10cd --- /dev/null +++ b/matching_engine/src/generator_lib/generator_query.rs @@ -0,0 +1,72 @@ +use super::{generator_state::GeneratorState, generator_store::GeneratorInfoPerMarket}; +use ethers::prelude::*; + +#[derive(Clone)] +pub struct GeneratorQueryResult<'a> { + generator_markets: Vec<&'a GeneratorInfoPerMarket>, +} + +impl<'a> GeneratorQueryResult<'a> { + // Initialize with a collection of generators + pub fn new(generator_markets: Vec<&'a GeneratorInfoPerMarket>) -> Self { + Self { generator_markets } + } + + // Filter by reward + pub fn filter_by_reward(mut self, task_reward: U256) -> Self { + log::debug!("Filter by reward"); + self.generator_markets = self + .generator_markets + .into_iter() + .filter(|&gen| gen.proof_generation_cost.lt(&task_reward)) + .collect(); + self + } + + pub fn filter_by_time(mut self, task_time: U256) -> Self { + log::debug!("Filter by time"); + self.generator_markets = self + .generator_markets + .into_iter() + .filter(|&gen| gen.proposed_time.lt(&task_time)) + .collect(); + self + } + + // Filter by state + pub fn filter_by_state(mut self, states: Vec) -> Self { + let states_set: std::collections::HashSet<_> = states.into_iter().collect(); // Convert Vec to HashSet for fast lookup + + self.generator_markets = self + .generator_markets + .into_iter() // Use rayon's parallel iterator + .filter(|&gen| { + if let Some(gen_state) = gen.state { + states_set.contains(&gen_state) // Check if the generator state is in the provided states + } else { + false // If the generator has no state, exclude it + } + }) + .collect(); // Collect the filtered generator markets into a Vec + + self + } + + #[allow(unused)] + pub fn filter_by_market_id(mut self, market_id: U256) -> Self { + log::debug!("Filter by market id"); + // Use rayon's par_iter_mut to process the vector in parallel + self.generator_markets = self + .generator_markets + .into_iter() // Convert to a parallel iterator + .filter(|&gen| gen.market_id == market_id) // Filter in parallel + .collect(); // Collect back into a Vec + self + } + + // Final getter to consume the object and retrieve the filtered generators + pub fn result(self) -> Vec { + // Clone the elements or map them to owned values + self.generator_markets.into_iter().cloned().collect() + } +} diff --git a/matching_engine/src/generator_lib/generator_state.rs b/matching_engine/src/generator_lib/generator_state.rs new file mode 100644 index 0000000..a40de7b --- /dev/null +++ b/matching_engine/src/generator_lib/generator_state.rs @@ -0,0 +1,38 @@ +use serde::{Deserialize, Serialize}; + +#[derive(Default, PartialEq, Eq, PartialOrd, Serialize, Deserialize, Hash, Copy, Clone)] +pub enum GeneratorState { + #[default] + Null, + Joined, + NoComputeAvailable, + Wip, + RequestedForExit, + PendingConfirmation, // Not present in contracts +} + +impl std::fmt::Debug for GeneratorState { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + let value_str = match self { + GeneratorState::Null => "This is a Null state", + GeneratorState::Joined => "The generator has joined", + GeneratorState::NoComputeAvailable => "The generator has no compute available", + GeneratorState::Wip => "Work in progress state", + GeneratorState::RequestedForExit => "The generator requested for exit", + GeneratorState::PendingConfirmation => "The generator is selected for task", + }; + write!(f, "{}", value_str) + } +} + +#[allow(unused)] +pub fn get_generator_state(state: u8) -> GeneratorState { + match state { + 0 => GeneratorState::Null, + 1 => GeneratorState::Joined, + 2 => GeneratorState::NoComputeAvailable, + 3 => GeneratorState::Wip, + 4 => GeneratorState::RequestedForExit, + _ => GeneratorState::Null, + } +} diff --git a/matching_engine/src/generator_lib/generator_store.rs b/matching_engine/src/generator_lib/generator_store.rs new file mode 100644 index 0000000..fb53722 --- /dev/null +++ b/matching_engine/src/generator_lib/generator_store.rs @@ -0,0 +1,1380 @@ +use ethers::core::types::Address; +use ethers::prelude::*; +use rayon::prelude::*; +use serde::{Deserialize, Serialize}; +use tokio::sync::RwLockReadGuard; + +use std::collections::HashMap; +use std::ops::{Add, AddAssign, Sub, SubAssign}; +use std::sync::Arc; + +use crate::utility::{AddressTokenPair, TokenTracker}; + +use super::delegation::{Delegation, DelegationStore, Operation}; +use super::generator_query::GeneratorQueryResult; +use super::generator_state::GeneratorState; +use super::key_store::KeyStore; + +/// Represents a range of blocks and the points associated with that range. +struct KalypsoPointRange { + start_block: u64, // Inclusive start of the block range + end_block: u64, // Inclusive end of the block range + points: U256, // Points associated with this block range +} + +static POINTS_RANGES: Lazy> = Lazy::new(|| { + let block_ranges = vec![ + KalypsoPointRange { + start_block: 0, + end_block: 7930000, + points: U256::from_dec_str("11").unwrap().pow(18.into()), + }, + KalypsoPointRange { + start_block: 8930000, + end_block: 9930000, + points: U256::from_dec_str("12").unwrap().pow(18.into()), + }, + KalypsoPointRange { + start_block: 9930000, + end_block: 10930000, + points: U256::from_dec_str("13").unwrap().pow(18.into()), + }, + KalypsoPointRange { + start_block: 9930000, + end_block: u64::MAX, + points: U256::from_dec_str("14").unwrap().pow(18.into()), + }, // Add more KalypsoPointRange entries as needed + ]; + + block_ranges +}); + +fn get_points(block_number: u64) -> U256 { + for range in POINTS_RANGES.iter() { + if block_number >= range.start_block && block_number <= range.end_block { + return range.points; + } + } + // If block_number doesn't fall within any range, return zero points. + U256::zero() +} + +#[derive(Debug, Clone)] +pub struct GeneratorStore { + // Change key to tuple (Address, U256) + generators: HashMap, // Generator -> Details + generator_markets: HashMap<(Address, U256), GeneratorInfoPerMarket>, //[Generator, MarketId] -> MarketWiseInfo + state_index: HashMap>, // State -> [Generator, MarketId] + address_index: HashMap>, // Generator -> [MarketId] participations + earnings: HashMap, // Generator -> TotalEarnings + earnings_per_market: HashMap>, // Generator -> Markets -> Earnings Per Market + slashings: HashMap, // Generator -> Total Slashings + slashing_per_generator_per_market: HashMap>, // Generator -> Markets -> slashings per market + slashing_records: HashMap>, // Generator -> Slashing Record + delegation_store: DelegationStore, + kalypso_points: HashMap, + kalypso_points_per_market: HashMap>, // Generator -> Markets -> Kalypso Points Per Market +} + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, PartialOrd)] +pub struct SlashingRecord { + pub ask_id: U256, + pub slashing_block_number: U64, + pub market_id: U256, + pub slashing_tx: String, + pub price_offered: U256, + pub expected_time: U256, + pub slashing_penalty: AddressTokenPair, + pub slashing_timestamp: U256, +} + +#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Clone)] +pub struct GeneratorInfoPerMarket { + pub address: Address, + pub market_id: U256, + // pub total_stake: TokenTracker, + pub compute_required_per_request: U256, + pub proof_generation_cost: U256, + pub proposed_time: U256, + pub active_requests: U256, + pub proofs_submitted: U256, + pub proofs_slashed: U256, + pub state: Option, +} + +#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone)] +pub struct Generator { + pub address: Address, + pub reward_address: Address, + pub total_stake: TokenTracker, + pub sum_of_compute_allocations: U256, + pub compute_consumed: U256, + pub stake_locked: TokenTracker, + pub active_market_places: U256, + pub declared_compute: U256, + pub intended_stake_util: U256, + pub intended_compute_util: U256, + pub generator_data: Bytes, +} + +#[derive(Serialize, Deserialize, Debug, Clone, Default)] +#[serde(rename_all = "camelCase")] +pub struct GeneratorMeta { + /// The display name of the generator or application. + #[serde(alias = "display_name")] + display_name: Option, + + /// A brief description of the generator or application. + #[serde(alias = "display_description")] + display_description: Option, + + /// The official website URL. + website: Option, + + /// Twitter handle or URL. + twitter: Option, + + /// Discord invite link or server URL. + discord: Option, + + /// URL to the logo image, enhancing brand recognition. + #[serde(alias = "logo_url")] + logo_url: Option, + + /// URL to a banner image for promotional purposes. + #[serde(alias = "banner_url")] + banner_url: Option, + + /// Contact email for support or inquiries. + #[serde(alias = "contact_email")] + contact_email: Option, + + /// GitHub repository URL for open-source projects. + github: Option, + + /// LinkedIn profile or company page URL. + linkedin: Option, + + /// Medium blog URL for updates and articles. + medium: Option, + + /// Reddit community URL. + reddit: Option, + + /// YouTube channel URL for tutorials and updates. + youtube: Option, + + /// Instagram profile URL for visual content. + instagram: Option, + + /// Repository URL, useful if different from GitHub. + #[serde(alias = "repo_url")] + repo_url: Option, + + /// Current version of the generator or application. + version: Option, + + /// Categories that classify the generator or application. + #[serde(default)] + categories: Vec, + + /// Tags for better searchability and organization. + #[serde(default)] + tags: Vec, + + /// License information, e.g., MIT, GPL. + license: Option, + + /// URL to the Terms of Service. + #[serde(alias = "terms_of_service_url")] + terms_of_service_url: Option, + + /// URL to the Privacy Policy. + #[serde(alias = "privacy_policy_url")] + privacy_policy_url: Option, +} + +impl Generator { + pub fn deserialize_generator_bytes(&self) -> GeneratorMeta { + // Convert bytes to a UTF-8 string + let json_str = std::str::from_utf8(&self.generator_data).unwrap_or("{}"); + + // Deserialize JSON string into MarketSetupData struct + serde_json::from_str(json_str).unwrap_or_default() + } +} + +impl Default for GeneratorStore { + fn default() -> Self { + Self::new() + } +} + +// create, update the generator store +impl GeneratorStore { + pub fn new() -> Self { + GeneratorStore { + generators: HashMap::new(), + generator_markets: HashMap::new(), + state_index: HashMap::new(), + address_index: HashMap::new(), + earnings: HashMap::new(), + earnings_per_market: HashMap::new(), + slashings: HashMap::new(), + slashing_per_generator_per_market: HashMap::new(), + slashing_records: HashMap::new(), + delegation_store: DelegationStore::new(), + kalypso_points: HashMap::new(), + kalypso_points_per_market: HashMap::new(), + } + } + + pub fn all_generators_address(&self) -> Vec
{ + self.generators + .par_iter() + .map(|(address, _)| address.clone()) + .collect() + } + + pub fn get_delegations( + &self, + generator_address: &Address, + operations: Vec, + skip: Option, + count: Option, + ) -> Vec { + self.delegation_store.get_delegations_by_operations( + generator_address, + operations, + skip.unwrap_or(0), + count.unwrap_or(100), + ) + } + + pub fn total_stake_across_all_generators(&self) -> TokenTracker { + self.generators + .par_iter() + .map(|(_, data)| data.total_stake.clone()) // Clone if TokenTracker isn't Copy + .reduce( + || TokenTracker::new(), // Identity element + |acc, stake| acc.add(stake), // Combine function + ) + } + + pub fn insert(&mut self, generator: Generator) { + let address = generator.address; + if !self.generators.contains_key(&generator.address) { + self.generators.insert(address, generator); + } + } + + pub fn insert_markets(&mut self, generator_market: GeneratorInfoPerMarket) { + let address = generator_market.address; + let market_id = generator_market.market_id; + let compute_allocation = generator_market.compute_required_per_request; + + if let Some(generator) = self.generators.get_mut(&address) { + generator.active_market_places.add_assign(U256::one()); + generator + .sum_of_compute_allocations + .add_assign(compute_allocation); + } + + if let Some(state) = &generator_market.state { + self.state_index + .entry(*state) + .or_default() + .push((address, market_id)); + } + + self.address_index + .entry(address) + .or_default() + .push(market_id); + + self.generator_markets + .entry((address, market_id)) + .or_insert(generator_market); + } + + pub fn get_by_address_and_market( + &self, + address: &Address, + market_id: &U256, + ) -> Option { + self.generator_markets.get(&(*address, *market_id)).cloned() + } + + pub fn remove_by_address_and_market(&mut self, address: &Address, market_id: &U256) { + if let Some(generator_market) = self.generator_markets.remove(&(*address, *market_id)) { + let compute_allocation = generator_market.compute_required_per_request; + if let Some(state) = &generator_market.state { + if let Some(vec) = self.state_index.get_mut(state) { + vec.retain(|&(a, m)| a != *address || m != *market_id); + } + } + + if let Some(generator) = self.generators.get_mut(address) { + generator + .sum_of_compute_allocations + .sub_assign(compute_allocation); + generator.active_market_places.sub_assign(U256::one()); + } + } + + if let Some(vec) = self.address_index.get_mut(&address) { + vec.retain(|&id| id != market_id.clone()); + if vec.is_empty() { + self.address_index.remove(&address); + } + } + } + + pub fn remove_by_address(&mut self, address: &Address) { + self.generators.remove(address); + } + + pub fn add_extra_stake( + &mut self, + generator_address: &Address, + token_address: &Address, + amount: &U256, + block_number: U64, + transaction_index: U64, + log_index: U256, + tx: String, + ) { + if let Some(generator) = self.generators.get_mut(generator_address) { + generator.total_stake.add_token(token_address, amount); + self.delegation_store.add_delegation( + generator_address, + Delegation { + delegation: (*token_address, *amount), + source: super::delegation::Source::Native, + operation: super::delegation::Operation::Delegate, + block_number, + transaction_index, + log_index, + tx, + }, + ); + } + } + + pub fn update_intended_stake_util(&mut self, address: &Address, new_stake_util: U256) { + if let Some(generator) = self.generators.get_mut(address) { + generator.intended_stake_util = new_stake_util; + } + } + + pub fn remove_stake( + &mut self, + generator_address: &Address, + token_address: &Address, + amount: &U256, + block_number: U64, + transaction_index: U64, + log_index: U256, + tx: String, + operation: super::delegation::Operation, + ) { + if let Some(generator) = self.generators.get_mut(generator_address) { + generator + .total_stake + .sub_token_saturating(token_address, amount); + + self.delegation_store.add_delegation( + generator_address, + Delegation { + delegation: (*token_address, *amount), + source: super::delegation::Source::Native, + operation, + block_number, + transaction_index, + log_index, + tx, + }, + ); + } + } + + pub fn update_reward_address(&mut self, address: &Address, new_reward_address: Address) { + if let Some(generator) = self.generators.get_mut(address) { + generator.reward_address = new_reward_address; + } + } + + pub fn add_extra_compute(&mut self, address: &Address, compute: U256) { + if let Some(generator) = self.generators.get_mut(address) { + generator.declared_compute = generator.declared_compute.add(compute); + } + } + + pub fn update_intended_compute_util(&mut self, address: &Address, new_compute_util: U256) { + if let Some(generator) = self.generators.get_mut(address) { + generator.intended_compute_util = new_compute_util; + } + } + + pub fn remove_compute(&mut self, address: &Address, compute: U256) { + if let Some(generator) = self.generators.get_mut(address) { + generator.declared_compute = generator.declared_compute.sub(compute); + } + } + + pub fn update_state(&mut self, address: &Address, market_id: &U256, new_state: GeneratorState) { + if let Some(generator_market) = self.generator_markets.get_mut(&(*address, *market_id)) { + if let Some(old_state) = &generator_market.state { + if let Some(vec) = self.state_index.get_mut(old_state) { + vec.retain(|&a| a != (*address, *market_id)); + } + } + + generator_market.state = Some(new_state); + self.state_index + .entry(new_state) + .or_default() + .push((*address, *market_id)); + } + } + + pub fn update_on_assigned_task(&mut self, address: &Address, market_id: &U256) { + if let Some(generator_market) = self.generator_markets.get_mut(&(*address, *market_id)) { + generator_market.active_requests.add_assign(U256::one()); + } + } + + pub fn update_on_submit_proof( + &mut self, + address: &Address, + market_id: &U256, + earning: &U256, + block_number: &U64, + ) { + if let Some(generator_market) = self.generator_markets.get_mut(&(*address, *market_id)) { + generator_market.active_requests.sub_assign(U256::one()); + generator_market.proofs_submitted.add_assign(U256::one()); + } + + // Update the total earnings for the address + self.earnings + .entry(*address) + .and_modify(|e| *e = e.saturating_add(*earning)) + .or_insert(*earning); + + // Update the earnings for the specific market + self.earnings_per_market + .entry(*address) + .or_insert_with(HashMap::new) + .entry(*market_id) + .and_modify(|e| *e = e.saturating_add(*earning)) + .or_insert(*earning); + + let kalypso_points_per_proof = get_points(block_number.as_u64()); + self.kalypso_points + .entry(*address) + .and_modify(|e| *e = e.saturating_add(kalypso_points_per_proof)) + .or_insert(kalypso_points_per_proof); + + self.kalypso_points_per_market + .entry(*address) + .or_insert_with(HashMap::new) + .entry(*market_id) + .and_modify(|e| *e = e.saturating_add(kalypso_points_per_proof)) + .or_insert(kalypso_points_per_proof); + } + + pub fn update_on_slashing( + &mut self, + generator_address: &Address, + token_addresses: Vec
, + ask_id: &U256, + market_id: &U256, + slashings: Vec, + slashing_tx: String, + price_offered: &U256, + deadline: &U256, + slashing_block_number: &U64, + slashing_timestamp: &U256, + ) { + if let Some(generator_market) = self + .generator_markets + .get_mut(&(*generator_address, *market_id)) + { + generator_market.active_requests.sub_assign(U256::one()); + generator_market.proofs_slashed.add_assign(U256::one()); + } + + for (token_address, slashing) in token_addresses.iter().zip(slashings.iter()) { + // Update the slashing tracker for each token + self.slashings + .entry(*generator_address) + .and_modify(|tracker| tracker.add_token(token_address, slashing)) // Modify the existing entry + .or_insert_with(|| { + let mut tracker = TokenTracker::new(); // Create a new TokenTracker if none exists + tracker.add_token(token_address, slashing); // Add the slashing amount + tracker + }); + + self.slashing_per_generator_per_market + .entry(*generator_address) + .or_insert_with(HashMap::new) // Create the inner HashMap if it doesn't exist + .entry(*market_id) + .and_modify(|tracker| tracker.add_token(token_address, slashing)) // Modify the existing TokenTracker + .or_insert_with(|| { + let mut tracker = TokenTracker::new(); // Create a new TokenTracker if none exists + tracker.add_token(token_address, slashing); // Add the slashing amount + tracker + }); + } + + // Record the slashing event + for (token_address, slashing) in token_addresses.iter().zip(slashings.iter()) { + self.slashing_records + .entry(*generator_address) + .or_insert_with(Vec::new) + .push(SlashingRecord { + ask_id: ask_id.clone(), + market_id: market_id.clone(), + slashing_tx: slashing_tx.clone(), + price_offered: price_offered.clone(), + expected_time: deadline.clone(), + slashing_penalty: (token_address.clone(), slashing.clone()), + slashing_block_number: slashing_block_number.clone(), + slashing_timestamp: slashing_timestamp.clone(), + }); + } + } + + pub fn update_on_stake_locked( + &mut self, + generator_address: &Address, + token_address: &Address, + stake_locked: U256, + ) { + if let Some(generator) = self.generators.get_mut(generator_address) { + generator + .stake_locked + .add_token(token_address, &stake_locked); + } + } + + pub fn update_on_stake_released( + &mut self, + generator_address: &Address, + token_address: &Address, + stake_released: U256, + ) { + if let Some(generator) = self.generators.get_mut(generator_address) { + generator + .stake_locked + .sub_token_saturating(token_address, &stake_released); + } + } + + pub fn update_on_compute_locked(&mut self, address: &Address, compute_locked: U256) { + if let Some(generator) = self.generators.get_mut(address) { + generator.compute_consumed.add_assign(compute_locked); + } + } + + pub fn update_on_compute_released(&mut self, address: &Address, compute_released: U256) { + if let Some(generator) = self.generators.get_mut(address) { + generator.compute_consumed.sub_assign(compute_released); + } + } + + pub fn get_all_markets_of_generator(&self, address: &Address) -> Vec { + match self.address_index.get(address) { + Some(market_ids) => market_ids + .par_iter() + .filter_map(|m_id| self.generator_markets.get(&(*address, *m_id)).cloned()) + .collect(), + None => Vec::new(), + } + } + + pub fn pause_assignments_across_all_markets(&mut self, address: &Address) { + // Collect the market IDs to be updated first, avoiding an immutable borrow later + let all_market_ids: Vec = self + .get_all_markets_of_generator(address) + .par_iter() + .map(|single_market| single_market.market_id) // Collect U256 (market_id) + .collect(); + + // Now process them with mutable access + for market_id in all_market_ids { + self.update_state(address, &market_id, GeneratorState::PendingConfirmation); + } + } + + pub fn resume_assignments_accross_all_markets(&mut self, address: &Address) { + // Collect the market IDs to be updated first, avoiding an immutable borrow later + let all_market_ids: Vec = self + .get_all_markets_of_generator(address) + .par_iter() + .map(|single_market| single_market.market_id) // Collect U256 (market_id) + .collect(); + + // Now process them with mutable access + for market_id in all_market_ids { + self.update_state(address, &market_id, GeneratorState::Joined); + } + } + + pub fn get_by_address(&self, address: &Address) -> Option { + self.generators.get(address).cloned() + } +} + +impl GeneratorStore { + pub fn get_available_compute(&self, address: Address) -> Option { + self.generators + .get(&address) + .map(|generator| generator.declared_compute.sub(generator.compute_consumed)) + } + + pub fn get_available_stake(&self, generator_address: &Address) -> Option { + self.generators.get(&generator_address).map(|generator| { + generator + .total_stake + .clone() + .sub(generator.stake_locked.clone()) + }) + } + + pub fn get_stake_locked(&self, generator_address: &Address) -> Option { + self.generators + .get(&generator_address) + .map(|generator| generator.stake_locked.clone()) + } + + pub fn get_all_by_market_id(&self, market_id: &U256) -> Vec { + // Clone self and wrap it in an Arc for thread-safe sharing + let self_arc = Arc::new(self.clone()); + + // Retrieve all generator addresses + let all_generators = self_arc.all_generators_address(); + + // Process generators in parallel using Rayon + let generator_for_given_market: Vec = all_generators + .par_iter() + .filter_map(|generator| { + // Clone the Arc to share ownership across threads + let self_clone = Arc::clone(&self_arc); + // Retrieve generator info for the given market + self_clone.get_by_address_and_market(generator, market_id) + }) + .collect(); + + generator_for_given_market + } +} + +// add methods to generate the query +impl GeneratorStore { + #[allow(unused)] + pub fn query(&self) -> GeneratorQueryResult { + GeneratorQueryResult::new(self.generator_markets.values().collect()) + } + + pub fn query_by_market_id(&self, market_id: &U256) -> GeneratorQueryResult { + log::debug!("Check query by market id"); + + let generator_markets: Vec<&GeneratorInfoPerMarket> = self + .generator_markets + .par_iter() // Parallel iterator over the generator_markets HashMap + .filter_map(|((_, gen_market_id), generator_info)| { + // Check if the market_id matches + if gen_market_id == market_id { + Some(generator_info) + } else { + None + } + }) + .collect(); // Collect matching generator markets into a Vec + + GeneratorQueryResult::new(generator_markets) + } + + #[allow(unused)] + pub fn query_by_states(&self, states: Vec) -> GeneratorQueryResult { + log::debug!("Check query by states"); + + let generators_market: Vec<&GeneratorInfoPerMarket> = states + .into_par_iter() // Convert the Vec to a parallel iterator + .filter_map(|state| { + // For each state, get the associated pairs + self.state_index.get(&state) + }) + .flat_map(|pairs| { + // For each pair, iterate in parallel and get the generator markets + pairs.into_par_iter().filter_map(|&(address, market_id)| { + self.generator_markets.get(&(address, market_id)) + }) + }) + .collect(); + + GeneratorQueryResult::new(generators_market) + } + + #[allow(unused)] + pub fn query_by_address(&self, address: Address) -> GeneratorQueryResult { + let generators = match self.address_index.get(&address) { + Some(market_ids) => market_ids + .par_iter() + .filter_map(|m_id| self.generator_markets.get(&(address, *m_id))) + .collect(), + None => Vec::new(), + }; + GeneratorQueryResult::new(generators) + } +} + +// more complex queries, but not a good way to do +impl GeneratorStore { + pub fn filter_by_has_idle_compute( + &self, + generator_query: GeneratorQueryResult, + ) -> GeneratorQueryResult { + let generator_array = generator_query.result(); + + // Use rayon's parallel iterator to process in parallel + let generator_result: Vec<&GeneratorInfoPerMarket> = generator_array + .into_par_iter() // Convert to a parallel iterator + .filter_map(|elem| { + // Try to get the generator from the store + if let Some(generator) = self.generators.get(&elem.address) { + let idle_compute = generator.declared_compute.sub(generator.compute_consumed); + + // Check if the idle compute is greater than or equal to the required compute + if idle_compute.ge(&elem.compute_required_per_request) { + // If so, retrieve the generator market and return it + self.generator_markets.get(&(elem.address, elem.market_id)) + } else { + None // Otherwise, filter it out + } + } else { + None // If generator doesn't exist, filter it out + } + }) + .collect(); // Collect the results into a Vec + + GeneratorQueryResult::new(generator_result) + } + + pub fn filter_by_available_stake( + &self, + generator_query: GeneratorQueryResult, + min_stake: Vec, // Now accepting a vector of AddressTokenPairs + ) -> GeneratorQueryResult { + let generator_array = generator_query.result(); + + // Use rayon's parallel iterator to process in parallel + let generator_result: Vec<&GeneratorInfoPerMarket> = generator_array + .into_par_iter() // Convert the array to a parallel iterator + .filter_map(|elem| { + // Try to get the generator from the store + if let Some(generator) = self.generators.get(&elem.address) { + let remaining_stake = generator + .total_stake + .clone() + .sub(generator.stake_locked.clone()); + + // Check if at least one of the AddressTokenPairs in min_stake meets the condition + let is_valid = min_stake + .iter() + .any(|min_stake_pair| remaining_stake.has_more_than_or_eq(min_stake_pair)); + + // If valid, retrieve the generator market and return it + if is_valid { + self.generator_markets.get(&(elem.address, elem.market_id)) + } else { + None // Otherwise, filter it out + } + } else { + None // If generator doesn't exist, filter it out + } + }) + .collect(); // Collect the results into a Vec + + GeneratorQueryResult::new(generator_result) + } + + pub fn filter_by_has_private_inputs_support( + &self, + generator_query: GeneratorQueryResult, + key_store: RwLockReadGuard<'_, KeyStore>, + ) -> GeneratorQueryResult { + let generator_array = generator_query.result(); + + // Use rayon's parallel iterator to process in parallel + let generator_result: Vec<&GeneratorInfoPerMarket> = generator_array + .into_par_iter() // Convert to a parallel iterator + .filter_map(|elem| { + // Try to get the generator from the store + if let Some(generator) = self.generators.get(&elem.address) { + // Lock the key store and check for ECIES public key + let ecies_pub_key = + key_store.get_by_address(&generator.address, elem.market_id.as_u64()); + if ecies_pub_key.is_some() { + // If the key exists, retrieve the generator market + return self.generator_markets.get(&(elem.address, elem.market_id)); + } + } + None // If no generator or no ECIES public key, filter it out + }) + .collect(); // Collect the results into a Vec + + GeneratorQueryResult::new(generator_result) + } +} + +impl GeneratorStore { + // Get total earnings for a specific address + pub fn get_total_earning(&self, address: &Address) -> Option { + self.earnings.get(address).cloned() + } + + // Get earnings for a specific address and market + pub fn get_earning_per_market(&self, address: &Address, market_id: &U256) -> Option { + self.earnings_per_market + .get(address) + .and_then(|market_earnings| market_earnings.get(market_id).cloned()) + } + + // Get total earnings for a specific address + pub fn get_kalypso_points(&self, address: &Address) -> Option { + self.kalypso_points.get(address).cloned() + } + + // Get earnings for a specific address and market + pub fn get_kalypso_points_per_market( + &self, + address: &Address, + market_id: &U256, + ) -> Option { + self.kalypso_points_per_market + .get(address) + .and_then(|market_earnings| market_earnings.get(market_id).cloned()) + } + + pub fn get_total_slashing(&self, generator_address: &Address) -> Option { + self.slashings.get(generator_address).cloned() + } + + pub fn get_slashing_per_generator_per_market( + &self, + address: &Address, + market_id: &U256, + ) -> Option { + self.slashing_per_generator_per_market + .get(address) + .and_then(|elem| elem.get(market_id).cloned()) + } + + pub fn get_slashing_records(&self, address: &Address) -> Vec { + let data = self.slashing_records.get(address); + if data.is_none() { + return vec![]; + } else { + return data.unwrap().clone(); + } + } +} + +#[cfg(test)] +mod tests { + use crate::{ + generator_lib::generator_helper::select_idle_generators, + utility::{ + TokenTracker, TEST_TOKEN_ADDRESS_ONE, TEST_TOKEN_ADDRESS_ONE_STRING, + TEST_TOKEN_ADDRESS_TWO, TEST_TOKEN_ADDRESS_TWO_STRING, + }, + }; + + use super::{Generator, GeneratorInfoPerMarket, GeneratorState, GeneratorStore}; + use ethers::{ + core::rand::{self, seq::SliceRandom}, + types::{Address, H160, U256}, + }; + + use rand::Rng; + use std::time::Instant; + + #[test] + fn test_insert_remove_generators() { + let mut generator_store = GeneratorStore::new(); + + let generator1 = Generator { + address: Address::random(), + reward_address: Address::random(), + total_stake: TokenTracker::from_address_string_and_dec_string( + vec![TEST_TOKEN_ADDRESS_ONE_STRING.to_string()], + vec!["123123".into()], + ) + .unwrap(), + sum_of_compute_allocations: U256::from_dec_str("12312312").unwrap(), + compute_consumed: U256::from_dec_str("12312").unwrap(), + stake_locked: TokenTracker::from_address_string_and_dec_string( + vec![TEST_TOKEN_ADDRESS_ONE_STRING.to_string()], + vec!["123123".into()], + ) + .unwrap(), + active_market_places: U256::from_dec_str("12").unwrap(), + declared_compute: U256::from_dec_str("123123").unwrap(), + intended_stake_util: U256::from_dec_str("123123").unwrap(), + intended_compute_util: U256::from_dec_str("123123").unwrap(), + generator_data: vec![].into(), + }; + + generator_store.insert(generator1.clone()); + + let generator = generator_store.get_by_address(&generator1.clone().address); + assert!(generator.is_some()); + assert_eq!(generator.unwrap().reward_address, generator1.reward_address); + } + + #[test] + fn test_stake_and_compute() { + let mut generator_store = create_new_store_with_generators(2, None, None, None); + let random_generator = get_random_generator(&generator_store); + + // Perform your stake and compute operations on `generator` + assert_eq!( + random_generator.total_stake, + TokenTracker::from_address_string_and_dec_string( + vec![TEST_TOKEN_ADDRESS_ONE_STRING.to_string()], + vec!["100".into()], + ) + .unwrap() + ); + assert_eq!( + random_generator.sum_of_compute_allocations, + U256::from_dec_str("100").unwrap() + ); + + generator_store + .add_extra_compute(&random_generator.address, U256::from_dec_str("1").unwrap()); + + assert_eq!( + generator_store + .get_by_address(&random_generator.address) + .unwrap() + .declared_compute, + U256::from_dec_str("101").unwrap() + ); + + generator_store.remove_compute(&random_generator.address, U256::from_dec_str("2").unwrap()); + + assert_eq!( + generator_store + .get_by_address(&random_generator.address) + .unwrap() + .declared_compute, + U256::from_dec_str("99").unwrap() + ); + + generator_store.add_extra_stake( + &random_generator.address, + &TEST_TOKEN_ADDRESS_ONE, + &U256::from_dec_str("5").unwrap(), + 0.into(), + 0.into(), + 0.into(), + "".into(), + ); + + assert_eq!( + generator_store + .get_by_address(&random_generator.address) + .unwrap() + .total_stake, + TokenTracker::from_address_string_and_dec_string( + vec![TEST_TOKEN_ADDRESS_ONE_STRING.to_string()], + vec!["105".into()], + ) + .unwrap() + ); + + generator_store.remove_stake( + &random_generator.address, + &TEST_TOKEN_ADDRESS_ONE, + &U256::from_dec_str("15").unwrap(), + 0.into(), + 0.into(), + 0.into(), + "".into(), + crate::generator_lib::delegation::Operation::UnDelegate, + ); + + assert_eq!( + generator_store + .get_by_address(&random_generator.address) + .unwrap() + .total_stake, + TokenTracker::from_address_string_and_dec_string( + vec![TEST_TOKEN_ADDRESS_ONE_STRING.to_string()], + vec!["90".into()], + ) + .unwrap() + ); + + generator_store.add_extra_stake( + &random_generator.address, + &TEST_TOKEN_ADDRESS_TWO, + &U256::from_dec_str("20").unwrap(), + 0.into(), + 0.into(), + 0.into(), + "".into(), + ); + + assert_eq!( + generator_store + .get_by_address(&random_generator.address) + .unwrap() + .total_stake, + TokenTracker::from_address_string_and_dec_string( + vec![ + TEST_TOKEN_ADDRESS_ONE_STRING.to_string(), + TEST_TOKEN_ADDRESS_TWO_STRING.to_string() + ], + vec!["90".into(), "20".into()], + ) + .unwrap() + ); + } + + #[test] + fn test_markets() { + let mut generator_store = create_new_store_with_generators(4, None, None, None); + let random_generator = get_random_generator(&generator_store); + + let random_generator_info_per_market = + get_random_market_info_for_generator(&random_generator.address, "1".into()); + generator_store.insert_markets(random_generator_info_per_market); + + let generator_info_per_market = generator_store.get_by_address_and_market( + &random_generator.address, + &U256::from_dec_str("1").unwrap(), + ); + + assert!(generator_info_per_market.is_some()); + assert_eq!( + generator_info_per_market.unwrap().address, + random_generator.address + ); + + assert_eq!( + generator_store + .get_all_markets_of_generator(&random_generator.address) + .len(), + 1 + ); + + generator_store.remove_by_address_and_market( + &random_generator.address, + &U256::from_dec_str("1").unwrap(), + ); + + let generator_info_per_market = generator_store.get_by_address_and_market( + &random_generator.address, + &U256::from_dec_str("1").unwrap(), + ); + + assert!(generator_info_per_market.is_none()); + } + + #[test] + fn test_matches() { + let mut generator_store = create_new_store_with_generators(4, None, None, None); + + let all_generators = { generator_store.clone().all_generators_address() }; + for generator in all_generators { + let generator = generator_store.get_by_address(&generator).unwrap(); + let random_generator_info_per_market = + get_random_market_info_for_generator(&generator.address, "1".into()); + generator_store.insert_markets(random_generator_info_per_market); + } + + let all_generator_per_market_query = + generator_store.query_by_states(vec![GeneratorState::Joined]); + + assert_eq!(all_generator_per_market_query.clone().result().len(), 4); + + let idle_generators: Vec = select_idle_generators( + all_generator_per_market_query + .clone() + .filter_by_market_id(U256::from_dec_str("1").unwrap()) + .result(), + ); + + assert_eq!(idle_generators.len(), 4); + + for idle_generator in idle_generators { + generator_store.update_on_compute_locked( + &idle_generator.address, + U256::from_dec_str("100").unwrap(), + ); + let available_compute = generator_store + .get_available_compute(idle_generator.address) + .unwrap(); + assert_eq!(available_compute, U256::zero()); + } + + let all_generator_per_market_query = generator_store.filter_by_has_idle_compute( + generator_store.query_by_states(vec![GeneratorState::Joined]), + ); + + assert_eq!(all_generator_per_market_query.clone().result().len(), 0); + } + + #[test] + fn test_matches_2() { + let mut generator_store = create_new_store_with_generators(4, None, None, None); + + let all_generators = { generator_store.clone().all_generators_address() }; + for generator in all_generators { + let generator = generator_store.get_by_address(&generator).unwrap(); + let random_generator_info_per_market = + get_random_market_info_for_generator(&generator.address, "1".into()); + generator_store.insert_markets(random_generator_info_per_market); + } + + let all_generator_per_market_query = + generator_store.query_by_states(vec![GeneratorState::Joined]); + + assert_eq!(all_generator_per_market_query.clone().result().len(), 4); + + let idle_generators: Vec = select_idle_generators( + all_generator_per_market_query + .clone() + .filter_by_market_id(U256::from_dec_str("1").unwrap()) + .result(), + ); + + assert_eq!(idle_generators.len(), 4); + + generator_store.update_on_compute_locked( + &idle_generators[0].address, + U256::from_dec_str("100").unwrap(), + ); + let available_compute = generator_store + .get_available_compute(idle_generators[0].address) + .unwrap(); + assert_eq!(available_compute, U256::zero()); + + let all_generator_per_market_query = generator_store.filter_by_has_idle_compute( + generator_store.query_by_states(vec![GeneratorState::Joined]), + ); + + assert_eq!(all_generator_per_market_query.clone().result().len(), 3); + } + + #[test] + fn test_matches_3() { + let generator_count = 4; + let mut generator_store = + create_new_store_with_generators(generator_count, None, None, None); + + let all_generators = { generator_store.clone().all_generators_address() }; + for generator in all_generators { + let generator = generator_store.get_by_address(&generator).unwrap(); + let random_generator_info_per_market = + get_random_market_info_for_generator(&generator.address, "1".into()); + generator_store.insert_markets(random_generator_info_per_market); + } + + let all_generator_per_market_query = + generator_store.query_by_states(vec![GeneratorState::Joined]); + + assert_eq!( + all_generator_per_market_query.clone().result().len(), + generator_count + ); + + let idle_generators: Vec = select_idle_generators( + all_generator_per_market_query + .clone() + .filter_by_market_id(U256::from_dec_str("1").unwrap()) + .result(), + ); + + assert_eq!(idle_generators.len(), generator_count); + + generator_store.update_on_compute_locked( + &idle_generators[0].address, + U256::from_dec_str("99").unwrap(), + ); + let available_compute = generator_store + .get_available_compute(idle_generators[0].address) + .unwrap(); + assert_eq!(available_compute, U256::one()); + + let all_generator_per_market_query = generator_store.filter_by_has_idle_compute( + generator_store.query_by_states(vec![GeneratorState::Joined]), + ); + + let idle_generators = all_generator_per_market_query.clone().result(); + assert_eq!(idle_generators.len(), 4); + } + + #[test] + fn test_matches_stress() { + let generator_count = 1000; + let markets: Vec = (0..1000) + .flat_map(|index| vec![index.to_string()]) + .collect(); + + let mut generator_store = create_new_store_with_generators( + generator_count, + Some("10000000000000".into()), + Some("10000000000000".into()), + Some("10000000000000".into()), + ); + + let all_generators = { generator_store.clone().all_generators_address() }; + for generator in all_generators { + for market in markets.clone() { + // First borrow: get the generator by address + let generator = generator_store.get_by_address(&generator).unwrap(); + + // Now drop the immutable borrow by extracting necessary info + let random_generator_info_per_market = + get_random_market_info_for_generator(&generator.address, market); + + // Second borrow: insert markets + generator_store.insert_markets(random_generator_info_per_market); + } + } + + assert_eq!( + generator_store + .query_by_states(vec![GeneratorState::Joined]) + .result() + .len(), + generator_count * markets.len() + ); + + assert_eq!( + generator_store + .query_by_states(vec![GeneratorState::Joined]) + .filter_by_market_id(U256::one()) + .result() + .len(), + generator_count + ); + + let compute_locked_on_request = "1".into(); + let stake_locked_on_request = "1".into(); + let total_requests: usize = 16 * 10 * 2; //16 tps, 10 assignments per tx, 2 times + + let start_time = Instant::now(); + for _ in 0..total_requests { + // Clone the result to avoid holding a reference while mutating generator_store + let mut rng = rand::thread_rng(); + let random_market = &markets[rng.gen_range(0..markets.len())]; + let idle_generators: Vec = select_idle_generators( + generator_store + .query_by_market_id(&U256::from_dec_str(random_market).unwrap()) + .filter_by_state(vec![GeneratorState::Joined, GeneratorState::Wip]) + .result(), + ); + + assert_eq!(idle_generators.len(), generator_count); + + for idle_generator in idle_generators { + // Mutable borrow happens here, but no immutable borrow exists at the same time + generator_store.update_on_compute_locked( + &idle_generator.address, + U256::from_dec_str(compute_locked_on_request).unwrap(), + ); + generator_store.update_on_stake_locked( + &idle_generator.address, + &TEST_TOKEN_ADDRESS_ONE, + U256::from_dec_str(stake_locked_on_request).unwrap(), + ); + } + } + let duration = start_time.elapsed(); + println!( + "Stress Test Matching, Requests: {}, Generators x Markets = {} x {}, Took: {:?}", + total_requests, + generator_count, + markets.len(), + duration + ); + } + + fn get_random_market_info_for_generator( + generator: &H160, + market_id: String, + ) -> GeneratorInfoPerMarket { + GeneratorInfoPerMarket { + address: *generator, + market_id: U256::from_dec_str(&market_id).unwrap(), + compute_required_per_request: U256::from_dec_str("1").unwrap(), + proof_generation_cost: U256::from_dec_str("5").unwrap(), + proposed_time: U256::from_dec_str("10").unwrap(), + active_requests: U256::from_dec_str("0").unwrap(), + proofs_submitted: U256::from_dec_str("0").unwrap(), + proofs_slashed: U256::from_dec_str("0").unwrap(), + state: Some(GeneratorState::Joined), + } + } + + fn get_random_generator(generator_store: &GeneratorStore) -> Generator { + let all_generator_addresses = generator_store.clone().all_generators_address(); + let random_generator = all_generator_addresses + .choose(&mut rand::thread_rng()) + .unwrap(); + generator_store + .get_by_address(random_generator) + .unwrap() + .clone() + } + + // helpers in tests. + fn create_new_store_with_generators( + n: usize, + default_total_stake: Option, + default_sum_of_compute_allocations: Option, + default_declared_compute: Option, + ) -> GeneratorStore { + let mut generator_store = GeneratorStore::new(); + let default_total_stake = default_total_stake.unwrap_or_else(|| "100".into()); + let default_sum_of_compute_allocations = + default_sum_of_compute_allocations.unwrap_or_else(|| "100".into()); + let default_declared_compute = default_declared_compute.unwrap_or_else(|| "100".into()); + + for _ in 0..n { + let generator = Generator { + address: Address::random(), + reward_address: Address::random(), + total_stake: TokenTracker::from_address_string_and_dec_string( + vec![TEST_TOKEN_ADDRESS_ONE_STRING.to_string()], + vec![default_total_stake.clone()], + ) + .unwrap(), + sum_of_compute_allocations: U256::from_dec_str(&default_sum_of_compute_allocations) + .unwrap(), + compute_consumed: U256::from_dec_str("0").unwrap(), + stake_locked: TokenTracker::from_address_string_and_dec_string( + vec![TEST_TOKEN_ADDRESS_ONE_STRING.to_string()], + vec!["0".into()], + ) + .unwrap(), + active_market_places: U256::from_dec_str("0").unwrap(), + declared_compute: U256::from_dec_str(&default_declared_compute).unwrap(), + intended_stake_util: U256::from_dec_str("1000000000000000000").unwrap(), + intended_compute_util: U256::from_dec_str("1000000000000000000").unwrap(), + generator_data: vec![].into(), + }; + + generator_store.insert(generator); + } + + generator_store + } +} diff --git a/matching_engine/src/generator_lib/key_store.rs b/matching_engine/src/generator_lib/key_store.rs new file mode 100644 index 0000000..8b3fbb7 --- /dev/null +++ b/matching_engine/src/generator_lib/key_store.rs @@ -0,0 +1,62 @@ +use ethers::core::types::Address; +use ethers::prelude::*; +use serde::{Deserialize, Serialize}; +use std::collections::HashMap; + +#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Clone)] +pub struct Key { + pub address: Address, + key_index: u64, + ecies_pub_key: Option, +} + +impl Key { + pub fn ecies_pub_key(&self) -> Option { + self.ecies_pub_key.clone() + } +} + +impl Key { + pub fn new(address: Address, key_index: u64, ecies_pub_key: Option) -> Self { + Self { + address, + key_index, + ecies_pub_key, + } + } +} + +#[derive(Debug)] +pub struct KeyStore { + keys: HashMap<(Address, u64), Key>, // Using u64 as a stand-in for uint256. +} + +impl KeyStore { + pub fn new() -> Self { + KeyStore { + keys: HashMap::new(), + } + } + + // Assuming you now need to pass the u64 value along with the Key + pub fn insert(&mut self, address: Address, value: u64, key: Key) { + self.keys.insert((address, value), key); + } + + // Updated to reflect the tuple key + pub fn get_by_address(&self, address: &Address, value: u64) -> Option { + self.keys.get(&(*address, value)).cloned() + } + + // Updated to reflect the tuple key + pub fn remove_by_address(&mut self, address: &Address, value: u64) { + self.keys.remove(&(*address, value)); + } + + // Updated to reflect the tuple key + pub fn update_pub_key(&mut self, address: &Address, value: u64, new_pub_key: Option) { + if let Some(key) = self.keys.get_mut(&(*address, value)) { + key.ecies_pub_key = new_pub_key; + } + } +} diff --git a/matching_engine/src/generator_lib/mod.rs b/matching_engine/src/generator_lib/mod.rs new file mode 100644 index 0000000..5479e6d --- /dev/null +++ b/matching_engine/src/generator_lib/mod.rs @@ -0,0 +1,6 @@ +pub mod delegation; +pub mod generator_helper; +pub mod generator_query; +pub mod generator_state; +pub mod generator_store; +pub mod key_store; diff --git a/matching_engine/src/jobs/cleanup.rs b/matching_engine/src/jobs/cleanup.rs deleted file mode 100644 index b30cbfd..0000000 --- a/matching_engine/src/jobs/cleanup.rs +++ /dev/null @@ -1,57 +0,0 @@ -use std::{ - sync::{ - atomic::{AtomicBool, Ordering}, - Arc, - }, - thread, - time::Duration, -}; -use tokio::sync::Mutex; - -use crate::ask::{self, LocalAskStore}; - -use super::ProofMarketplaceInstance; - -pub struct CleanupTool { - should_stop: Arc, - ask_store: Arc>, - #[allow(unused)] - proof_market_place: ProofMarketplaceInstance, -} - -impl CleanupTool { - pub fn new( - should_stop: Arc, - ask_store: Arc>, - proof_market_place: ProofMarketplaceInstance, - ) -> Self { - CleanupTool { - should_stop, - ask_store, - proof_market_place, - } - } - - pub async fn ask_store_cleanup(self) -> anyhow::Result<()> { - loop { - thread::sleep(Duration::from_secs(20)); - if self.should_stop.load(Ordering::Acquire) { - log::info!("Gracefully shutting down..."); - break; - } - let mut ask_store = { self.ask_store.lock().await }; - - // Removing the completed asks - let completed_asks = ask_store.get_by_state(ask::AskState::Complete).result(); - - if completed_asks.is_some() { - for elem in completed_asks.unwrap() { - log::info!("Removed Completed ask:{}", &elem.ask_id); - ask_store.remove_by_ask_id(&elem.ask_id); - } - } - } - - Ok(()) - } -} diff --git a/matching_engine/src/jobs/mod.rs b/matching_engine/src/jobs/mod.rs index 39a24ba..6c4f631 100644 --- a/matching_engine/src/jobs/mod.rs +++ b/matching_engine/src/jobs/mod.rs @@ -1,10 +1,2 @@ -pub mod cleanup; -pub mod parser; -pub mod server; - -use ethers::prelude::*; -use k256::ecdsa::SigningKey; - -pub type ProofMarketplaceInstance = bindings::proof_marketplace::ProofMarketplace< - SignerMiddleware, Wallet>, ->; +pub mod parser; // read + write +pub mod server; // read diff --git a/matching_engine/src/jobs/parser.rs b/matching_engine/src/jobs/parser.rs index 5ef2de7..30bb76f 100644 --- a/matching_engine/src/jobs/parser.rs +++ b/matching_engine/src/jobs/parser.rs @@ -1,9 +1,15 @@ +use crate::ask_lib::ask_status::{get_ask_state, AskState}; +use crate::ask_lib::ask_store::LocalAskStore; +use crate::costs::CostStore; +use crate::generator_lib::generator_store; +use crate::market_metadata::MarketMetadataStore; use anyhow::Result; use ethers::prelude::*; use k256::ecdsa::SigningKey; -use secret_input_helpers::secret_inputs_helpers; +use kalypso_helper::secret_inputs_helpers; use std::collections::HashMap; -use std::ops::{Add, Sub}; +use std::ops::Sub; + use std::{ str::FromStr, sync::{ @@ -13,12 +19,15 @@ use std::{ thread, time::Duration, }; -use tokio::sync::Mutex; +use tokio::sync::RwLock; +use crate::log_processor; use crate::{ - ask::{self, LocalAsk, LocalAskStore, MarketMetadataStore}, - generator::{self, GeneratorState, GeneratorStore, KeyStore}, - log_processor, + ask_lib::ask::LocalAsk, + generator_lib::{ + generator_helper, generator_state::GeneratorState, generator_store::GeneratorStore, + key_store::KeyStore, + }, }; type EntityRegistryInstance = bindings::entity_key_registry::EntityKeyRegistry< @@ -35,7 +44,7 @@ type GeneratorRegistryInstance = bindings::generator_registry::GeneratorRegistry pub struct LogParser { should_stop: Arc, - start_block: Arc>, + start_block: Arc>, block_range: U64, confirmations: U64, proof_marketplace: ProofMarketplaceInstance, @@ -43,11 +52,15 @@ pub struct LogParser { entity_registry: EntityRegistryInstance, provider_http: Arc, Wallet>>, matching_engine_key: Vec, - shared_local_ask_store: Arc>, - shared_generator_store: Arc>, - shared_market_store: Arc>, - shared_key_store: Arc>, + matching_engine_slave_keys: Vec>, + shared_local_ask_store: Arc>, + shared_generator_store: Arc>, + shared_market_store: Arc>, + shared_key_store: Arc>, + shared_cost_store: Arc>, chain_id: String, + max_tasks_size: usize, + rpc_url: String, } impl LogParser { @@ -56,17 +69,19 @@ impl LogParser { should_stop: Arc, rpc_url: String, relayer_signer: Wallet, - start_block: Arc>, + start_block: Arc>, block_range: U64, confirmations: U64, proof_marketplace: ProofMarketplaceInstance, generator_registry: GeneratorRegistryInstance, entity_registry: EntityRegistryInstance, matching_engine_key: String, - shared_local_ask_store: Arc>, - shared_generator_store: Arc>, - shared_market_store: Arc>, - shared_key_store: Arc>, + matching_engine_slave_keys: Vec, + shared_local_ask_store: Arc>, + shared_generator_store: Arc>, + shared_market_store: Arc>, + shared_key_store: Arc>, + shared_cost_store: Arc>, chain_id: String, ) -> Self { let provider_http = Provider::::try_from(&rpc_url) @@ -84,15 +99,23 @@ impl LogParser { entity_registry, provider_http, matching_engine_key: hex::decode(matching_engine_key).unwrap(), + matching_engine_slave_keys: matching_engine_slave_keys + .into_iter() + .map(|s| hex::decode(s).unwrap()) + .collect(), shared_local_ask_store, shared_generator_store, shared_market_store, shared_key_store, + shared_cost_store, chain_id, + max_tasks_size: 10, // TODO: dynamically adjust latter + rpc_url, } } pub async fn parse(&self) -> anyhow::Result<()> { + let mut matches_upto: Option = None; loop { if self.should_stop.load(Ordering::Acquire) { log::info!("Gracefully shutting down..."); @@ -101,8 +124,22 @@ impl LogParser { let (mut start_block, end_block) = match self.get_start_end_block().await { Ok(data) => data, - Err(_) => continue, + Err(_) => { + log::warn!("Could fetch start_block and end_block, pausing ME"); + thread::sleep(Duration::from_secs(5)); + continue; + } }; + + if let Some(matches_upto) = matches_upto.filter(|&m| m == end_block) { + log::warn!( + "All matches made up to {}. Waiting for a few seconds", + matches_upto + ); + thread::sleep(Duration::from_secs(5)); + continue; + } + if start_block + self.confirmations <= end_block { log::info!( "Processing blocks from {:?} to {:?}", @@ -125,9 +162,10 @@ impl LogParser { let logs = match self.provider_http.get_logs(&filter).await { Ok(data) => data, - _ => { - log::error!("Sleeping the thread for logs to avoid rate limit"); - thread::sleep(Duration::from_millis(5000)); + Err(err) => { + log::error!("Error fetching logs, sleeping the thread to avoid rate limit"); + log::error!("{}", err); + thread::sleep(Duration::from_secs(5)); continue; } }; @@ -154,12 +192,15 @@ impl LogParser { if log.address.eq(&proof_marketplace_address) { log_processor::pm::process_proof_market_place_logs( - vec![log.clone()], - self.proof_marketplace.clone(), + log, + &self.proof_marketplace, &self.shared_local_ask_store, &self.shared_generator_store, &self.shared_market_store, + &self.shared_cost_store, &self.matching_engine_key, + &self.matching_engine_slave_keys, + &self.rpc_url, ) .await .unwrap(); @@ -168,9 +209,10 @@ impl LogParser { } if log.address.eq(&generator_registry_address) { log_processor::gr::process_generator_registry_logs( - vec![log.clone()], - self.generator_registry.clone(), + log, + &self.generator_registry, &self.shared_generator_store, + &self.rpc_url, ) .await .unwrap(); @@ -180,8 +222,8 @@ impl LogParser { if log.address.eq(&entity_key_registry_address) { log_processor::er::process_entity_key_registry_logs( - vec![log.clone()], - self.entity_registry.clone(), + log, + &self.entity_registry, &self.shared_key_store, ) .await @@ -197,13 +239,22 @@ impl LogParser { } start_block = end_block + 1; - *self.start_block.lock().await = start_block; + *self.start_block.write().await = start_block; continue; } - match self.create_match(end_block).await { - Ok(_) => continue, - Err(_) => break, - } + + matches_upto = match self.create_match(end_block).await { + Ok(upto) => { + log::info!("Completed match assignment upto: {}", upto); + Some(upto) + } + Err(err) => { + log::error!("{}", err); + log::error!("Match Creation Failed, retyring in couple of seconds"); + thread::sleep(Duration::from_secs(4)); + None + } + }; } Ok(()) } @@ -211,13 +262,14 @@ impl LogParser { async fn get_start_end_block(&self) -> Result<(U64, U64), Box> { let latest_block = match self.provider_http.get_block_number().await { Ok(data) => data, - _ => { - log::error!("Sleeping the thread for latest block fetch to avoid rate limit"); - thread::sleep(Duration::from_millis(5000)); + Err(err) => { + log::error!("Failed fetching the latest block, sleeping to avoid rate limit"); + log::error!("{}", err); + thread::sleep(Duration::from_secs(5)); return Err("Failed fetching latest block number".into()); } }; - let start_block = { *self.start_block.lock().await }; + let start_block = { *self.start_block.read().await }; let end_block = if start_block + self.block_range > latest_block { latest_block - 1 } else { @@ -227,29 +279,63 @@ impl LogParser { Ok((start_block, end_block)) } - async fn create_match(&self, end_block: U64) -> Result<(), Box> { + #[cfg(feature = "disable_match_creation")] + async fn create_match(&self, end_block: U64) -> Result> { + thread::sleep(Duration::from_secs(5)); // just to mimic match creation time and may be free resource for else where + Ok(end_block) + } + + #[cfg(not(feature = "disable_match_creation"))] + async fn create_match(&self, end_block: U64) -> Result> { + use crate::utility::TokenTracker; + log::debug!("processed till {:?}. Waiting for new blocks", end_block); - let mut ask_store = { self.shared_local_ask_store.lock().await }; + let ask_store = { self.shared_local_ask_store.read().await }; + let generator_store = { self.shared_generator_store.read().await }; log::debug!("Trying to fetch available asks"); let available_asks = ask_store - .get_by_state(ask::AskState::Create) + .get_by_ask_state_except_complete(AskState::Create) .filter_by_flag(true) .result(); log::debug!("Complete fetch available asks"); if available_asks.is_none() { - thread::sleep(Duration::from_millis(60)); - return Ok(()); + return Ok(end_block); } let available_asks = available_asks.unwrap(); + if available_asks.is_empty() { + return Ok(end_block); + } log::warn!("available asks: {}", available_asks.len()); let mut task_list = vec![]; + let all_generators = { generator_store.all_generators_address() }; + let mut cached_stake = { + let mut m = HashMap::new(); + for _generator in all_generators.clone() { + let available_stake = generator_store.get_available_stake(&_generator).unwrap(); + m.insert(_generator, available_stake); + } + m + }; + + let mut cached_compute = { + let mut m = HashMap::new(); + for _generator in all_generators.clone() { + let available_compute = generator_store.get_available_compute(_generator).unwrap(); + m.insert(_generator, available_compute); + } + m + }; + for random_pending_ask in available_asks { - log::debug!("Trying to fetch idle generators"); + log::info!( + "Finding matching generator for ask: {}", + random_pending_ask.ask_id + ); let idle_generators = self .get_idle_generators( random_pending_ask.clone(), @@ -259,286 +345,321 @@ impl LogParser { random_pending_ask.reward, ) .await; - log::warn!("idle generators: {}", &idle_generators.len()); - log::debug!("Fetched idle generators"); - if !idle_generators.is_empty() { - let mut generator_store = { self.shared_generator_store.lock().await }; - let key_store = { self.shared_key_store.lock().await }; - let idle_generator = - generator::random_generator_selection(idle_generators).unwrap(); + if idle_generators.is_empty() { + log::warn!( + "Can't find idle-generators for ask {:?}, market_id: {:?}", + random_pending_ask.ask_id, + random_pending_ask.market_id + ); + continue; + } - let mut new_acl = Bytes::from_str("0x").unwrap().to_vec(); + log::info!("idle generators: {}", &idle_generators.len()); - if random_pending_ask.has_private_inputs { - let acl_data = random_pending_ask.secret_acl.clone().unwrap(); + let key_store = { self.shared_key_store.read().await }; + let idle_generator = + generator_helper::random_generator_selection(idle_generators).unwrap(); - let cipher = secret_inputs_helpers::decrypt_ecies( - &self.matching_engine_key.to_vec(), - &acl_data, - )?; + if let Some(&cached_compute_value) = cached_compute.get(&idle_generator.address) { + log::info!( + "Generator: {}, Compute available: {}, vs compute required: {}", + idle_generator.address, + cached_compute_value, + idle_generator.compute_required_per_request + ); + if idle_generator.compute_required_per_request > cached_compute_value { + log::warn!( + "Possible insuff compute if ask: {} is assigned", + random_pending_ask.ask_id + ); + } else { + cached_compute.insert( + idle_generator.address, + cached_compute_value.sub(idle_generator.compute_required_per_request), + ); + } + } - let generator_ecies_pub_key = key_store - .get_by_address(&idle_generator.address, idle_generator.market_id.as_u64()) + if let Some(cached_stake_value) = cached_stake.get(&idle_generator.address) { + let market_id = random_pending_ask.market_id; + let stash_required = { + self.shared_market_store + .try_read() .unwrap() - .ecies_pub_key - .clone() + .get_market_by_market_id(&market_id) .unwrap() - .to_vec(); - new_acl = secret_inputs_helpers::encrypt_ecies( - &generator_ecies_pub_key, - cipher.as_slice(), - )?; - } + .slashing_penalty + }; - // state confirmation - let ask_state = match self - .proof_marketplace - .get_ask_state(random_pending_ask.ask_id) - .await - { - Ok(data) => data, - _ => { - log::error!( - "Skipping ask {} because no status received from chain state", - random_pending_ask.ask_id + log::info!( + "Generator: {}, Stash available: {}, vs stash required: {}", + idle_generator.address, + cached_stake_value.to_string(), + stash_required + ); + + let address_token_pairs = stash_required.to_address_token_pair(); + + if cached_stake_value.has_more_than_or_eq_in_at_least_one(&address_token_pairs) { + if let Some(selected_token) = + cached_stake_value.select_one_random_stakable_pair(&address_token_pairs) + { + let updated_cached_stake = cached_stake_value + .clone() + .sub(TokenTracker::from_address_token_pair(selected_token)); + + log::info!( + "Updated cached stake of generator: {} = {}", + idle_generator.address, + updated_cached_stake ); - thread::sleep(Duration::from_millis(5000)); - continue; + cached_stake.insert(idle_generator.address, updated_cached_stake); } - }; - let ask_state = ask::get_ask_state(ask_state); - - if ask_state != ask::AskState::Create { + } else { log::warn!( - "ask {:?}. {:?}. skipping it", - random_pending_ask.ask_id, - ask_state + "Possible insuff stash if ask: {} is assigned", + random_pending_ask.ask_id ); - ask_store.modify_state(&random_pending_ask.ask_id, ask_state); - continue; } + } - let generator_state = match self - .generator_registry - .get_generator_state(idle_generator.address, idle_generator.market_id) - .await - { - Ok(data) => data, - _ => { - log::error!("Skipping ask {} because no generator {}-market-{} status received from chain state", random_pending_ask.ask_id, idle_generator.address, idle_generator.market_id); - thread::sleep(Duration::from_millis(5000)); - continue; - } - }; - let generator_state = generator::get_generator_state(generator_state.0); + let new_acl = if random_pending_ask.has_private_inputs { + let acl_data = random_pending_ask.secret_acl.clone().unwrap(); - if generator_state != generator::GeneratorState::Joined - && generator_state != generator::GeneratorState::Wip - { - log::warn!( - "Generator {:?}. {:?}", - idle_generator.address, - generator_state - ); - generator_store.update_state( - &idle_generator.address, - &idle_generator.market_id, - generator_state, - ); - } else { - let market_store = { self.shared_market_store.lock().await }; - let slashing_penalty = market_store - .get_slashing_penalty_by_market_id(&idle_generator.market_id) - .unwrap(); - let generator_global = generator_store - .get_by_address(&idle_generator.address) - .unwrap(); - let remaining_stake = generator_global - .total_stake - .sub(generator_global.stake_locked.add(slashing_penalty)); - let remaining_compute = generator_global.declared_compute.sub( - generator_global - .compute_consumed - .add(idle_generator.compute_required_per_request), - ); - if remaining_stake.lt(&slashing_penalty) - || remaining_compute.lt(&idle_generator.compute_required_per_request) - { - generator_store.update_state( - &idle_generator.address, - &idle_generator.market_id, - GeneratorState::PendingConfirmation, - ); + let mut cipher = secret_inputs_helpers::decrypt_ecies( + &self.matching_engine_key.to_vec(), + &acl_data, + ); + + // one of the key will surely dipher it, or else the ask would already have been flagged + if cipher.is_err() { + for slave_key in &self.matching_engine_slave_keys { + cipher = secret_inputs_helpers::decrypt_ecies(slave_key, &acl_data); } } - log::info!( - "Assigned ask: {} to generator: {}, at {:?}", - &random_pending_ask.ask_id, - &idle_generator.address, - // provider_http.get_block_number().await.unwrap() - std::time::Instant::now() - ); - task_list.push((random_pending_ask, idle_generator.clone(), new_acl.clone())); + let generator_ecies_pub_key = key_store + .get_by_address(&idle_generator.address, idle_generator.market_id.as_u64()) + .unwrap() + .ecies_pub_key() + .clone() + .unwrap() + .to_vec(); + secret_inputs_helpers::encrypt_ecies(&generator_ecies_pub_key, cipher?.as_slice())? } else { - log::debug!( - "Can't find idle-generators for ask {:?}, market_id: {:?}", + Bytes::from_str("0x").unwrap().to_vec() + }; + + // state confirmation + let ask_state = match self + .proof_marketplace + .get_ask_state(random_pending_ask.ask_id) + .await + { + Ok(data) => data, + Err(err) => { + log::error!("{}", err); + log::error!( + "Skipping ask {} because no status received from chain state", + random_pending_ask.ask_id + ); + return Err("No ask status received from chain".into()); + } + }; + + let ask_state = get_ask_state(ask_state); + log::info!("ask: {} -- {:?}", random_pending_ask.ask_id, ask_state); + if ask_state != AskState::Create { + log::warn!( + "ask {:?}. {:?}. skipping it", random_pending_ask.ask_id, - random_pending_ask.market_id + ask_state ); + { + // previous ref of ask store won't work because it was readonly, create a write only one that drops here only. + match self.shared_local_ask_store.try_write() { + Ok(mut store) => store.modify_state(&random_pending_ask.ask_id, ask_state), + Err(err) => { + log::error!("{}", err); + log::error!("Failed updating ask store. If repeated issue, there may be another matching running in parallel"); + } + } + } + continue; } - match task_list.len() { - 0 => { - log::warn!("No Matches"); - thread::sleep(Duration::from_millis(60)); - } - _ => { - let mut ask_ids = vec![]; - let mut generators = vec![]; - let mut new_acls = vec![]; - - for pending_task in task_list.clone() { - let pending_ask = pending_task.0; - let idle_generator = pending_task.1; - let new_acl = pending_task.2; - - ask_ids.push(pending_ask.ask_id); - generators.push(idle_generator.address); - new_acls.push(ethers::types::Bytes::from(new_acl)); - } + log::info!( + "Assigned ask: {} to generator: {}, at {:?}", + &random_pending_ask.ask_id, + &idle_generator.address, + // provider_http.get_block_number().await.unwrap() + std::time::Instant::now() + ); + task_list.push((random_pending_ask, idle_generator, new_acl)); - let values = vec![ - ethers::abi::Token::Array( - ask_ids - .clone() - .into_iter() - .map(ethers::abi::Token::Uint) - .collect(), - ), - ethers::abi::Token::Array( - generators - .clone() - .into_iter() - .map(ethers::abi::Token::Address) - .collect(), - ), - ethers::abi::Token::Array( - new_acls - .clone() - .into_iter() - .map(|v| ethers::abi::Token::Bytes(v.to_vec())) - .collect(), - ), - ]; - - let encoded = ethers::abi::encode(&values); - let digest = ethers::utils::keccak256(encoded); - - let matching_engine_key = hex::encode(&self.matching_engine_key); - let matching_engine_signer = matching_engine_key - .parse::() - .unwrap() - .with_chain_id(U64::from_dec_str(&self.chain_id).unwrap().as_u64()); - - let signature = matching_engine_signer - .sign_message(ethers::types::H256(digest)) - .await?; - println!("Signature: {:?}", signature); - log::info!("Tx signed at {:?}", std::time::Instant::now()); - - // todo!("create and broad cast tx"); - // // Assign batch task here - let batch_relay_tx_pending = self.proof_marketplace.relay_batch_assign_tasks( - ask_ids.clone(), - generators.clone(), - new_acls.clone(), - ethers::types::Bytes::from_str(&signature.to_string()).unwrap(), - ); + if task_list.len() >= self.max_tasks_size { + break; + } + } - log::info!("Tx created at {:?}", std::time::Instant::now()); + if task_list.len().eq(&0) { + log::warn!("No Matches"); + return Ok(end_block); + } - let batch_relay_tx = match batch_relay_tx_pending.send().await { - Ok(data) => data.confirmations(10), - _ => { - log::error!("failed sending the transaction"); - thread::sleep(Duration::from_millis(5000)); - continue; - } - }; + let mut ask_ids = vec![]; + let mut generators = vec![]; + let mut new_acls = vec![]; - let batch_relay_tx = batch_relay_tx.await.unwrap().unwrap(); + for pending_task in task_list.clone() { + let pending_ask = pending_task.0; + let idle_generator = pending_task.1; + let new_acl = pending_task.2; - log::info!( - "Relayed {:?} requests tx: {:?}", - ask_ids.clone().len(), - batch_relay_tx.transaction_hash - ); + ask_ids.push(pending_ask.ask_id); + generators.push(idle_generator.address); + new_acls.push(ethers::types::Bytes::from(new_acl)); + } - log::info!("Tx mined at {:?}", std::time::Instant::now()); - } + let values = vec![ + ethers::abi::Token::Array( + ask_ids + .clone() + .into_iter() + .map(ethers::abi::Token::Uint) + .collect(), + ), + ethers::abi::Token::Array( + generators + .clone() + .into_iter() + .map(ethers::abi::Token::Address) + .collect(), + ), + ethers::abi::Token::Array( + new_acls + .clone() + .into_iter() + .map(|v| ethers::abi::Token::Bytes(v.to_vec())) + .collect(), + ), + ]; + + let encoded = ethers::abi::encode(&values); + let digest = ethers::utils::keccak256(encoded); + + let matching_engine_key = hex::encode(&self.matching_engine_key); + let matching_engine_signer = matching_engine_key + .parse::() + .unwrap() + .with_chain_id(U64::from_dec_str(&self.chain_id).unwrap().as_u64()); + + let signature = match matching_engine_signer + .sign_message(ethers::types::H256(digest)) + .await + { + Ok(data) => data, + Err(err) => { + log::error!("{}", err); + return Err("Failed generating signature".into()); } + }; + log::debug!("Signature: {:?}", signature); + log::debug!("Tx signed at {:?}", std::time::Instant::now()); + + // todo!("create and broad cast tx"); + // // Assign batch task here + let mut batch_relay_tx_pending = self.proof_marketplace.relay_batch_assign_tasks( + ask_ids.clone(), + generators.clone(), + new_acls.clone(), + ethers::types::Bytes::from_str(&signature.to_string()).unwrap(), + ); + + log::debug!("Tx created at {:?}", std::time::Instant::now()); + + if cfg!(feature = "force_transactions") { + batch_relay_tx_pending = batch_relay_tx_pending.gas(10_000_000); } + let batch_relay_tx = match batch_relay_tx_pending.send().await { + Ok(data) => data.confirmations(10), + Err(err) => { + log::error!("{}", err); + log::error!("failed sending the transaction"); + thread::sleep(Duration::from_secs(2)); + return Err("Failed creating matching".into()); + } + }; + + let batch_relay_tx = batch_relay_tx.await.unwrap().unwrap(); + + log::info!( + "Relayed {:?} requests tx: {:?}", + ask_ids.clone().len(), + batch_relay_tx.transaction_hash + ); + if self.should_stop.load(Ordering::Acquire) { log::info!("Gracefully shutting down..."); return Err("Stopped Match Making".into()); } - - // to avoid rate limit - thread::sleep(Duration::from_millis(600)); - // timeout.join().unwrap(); - - Ok(()) + Ok(end_block) } + #[cfg(not(feature = "disable_match_creation"))] async fn get_idle_generators( &self, random_pending_ask: LocalAsk, - generator_store: &Arc>, - market_store: &Arc>, - key_store: &Arc>, + generator_store: &Arc>, + market_store: &Arc>, + key_store: &Arc>, task_reward: U256, - ) -> Vec { + ) -> Vec { // Ensure Generator implements Clone - let generator_store = generator_store.lock().await; - let market_metadata_store = market_store.lock().await; - let key_store = key_store.lock().await; - let slashing_penalty = market_metadata_store - .get_slashing_penalty_by_market_id(&random_pending_ask.market_id) - .unwrap(); + let generator_store = generator_store.read().await; + let market_metadata_store = market_store.read().await; + let key_store = key_store.read().await; + let slashing_penalty = + market_metadata_store.get_slashing_penalty_by_market_id(&random_pending_ask.market_id); + let idle_generators = { let generator_query = { if random_pending_ask.has_private_inputs { + let generator_query = generator_store + .query_by_market_id(&random_pending_ask.market_id) + .filter_by_state(vec![GeneratorState::Joined, GeneratorState::Wip]) + .filter_by_reward(task_reward) + .filter_by_time(random_pending_ask.time_requested_for_proof_generation); + + let generator_with_idle_compute = + generator_store.filter_by_has_idle_compute(generator_query); + + let generator_with_available_stake = generator_store + .filter_by_available_stake(generator_with_idle_compute, slashing_penalty); generator_store.filter_by_has_private_inputs_support( - generator_store.filter_by_available_stake( - generator_store.filter_by_has_idle_compute( - generator_store - .query_by_state(GeneratorState::Joined) - .filter_by_market_id(random_pending_ask.market_id) - .filter_by_reward(task_reward), - ), - slashing_penalty, - ), + generator_with_available_stake, key_store, ) } else { - generator_store.filter_by_available_stake( - generator_store.filter_by_has_idle_compute( - generator_store - .query_by_state(GeneratorState::Joined) - .filter_by_market_id(random_pending_ask.market_id) - .filter_by_reward(task_reward), - ), - slashing_penalty, - ) + let generator_query = generator_store + .query_by_market_id(&random_pending_ask.market_id) + .filter_by_state(vec![GeneratorState::Joined, GeneratorState::Wip]) + .filter_by_reward(task_reward) + .filter_by_time(random_pending_ask.time_requested_for_proof_generation); + + let generator_with_idle_compute = + generator_store.filter_by_has_idle_compute(generator_query); + + generator_store + .filter_by_available_stake(generator_with_idle_compute, slashing_penalty) } }; let generators = generator_query.result(); - generator::idle_generator_selector(generators) + generator_helper::select_idle_generators(generators) }; idle_generators } diff --git a/matching_engine/src/jobs/server.rs b/matching_engine/src/jobs/server.rs index 96dcd02..f47b3e4 100644 --- a/matching_engine/src/jobs/server.rs +++ b/matching_engine/src/jobs/server.rs @@ -1,20 +1,24 @@ use std::sync::Arc; +use std::time::Duration; use actix_web::web::Data; -use actix_web::{web, App, HttpServer}; +use actix_web::{App, HttpServer}; use ethers::core::k256::ecdsa::SigningKey; use ethers::middleware::SignerMiddleware; use ethers::providers::{Http, Provider}; use ethers::signers::Wallet; use ethers::types::U64; -use tokio::sync::Mutex; +use kalypso_helper::middlewares::request_limiter::ConcurrencyLimiter; +use std::sync::atomic::{AtomicBool, Ordering}; +use tokio::sync::RwLock; -use crate::ask::{LocalAskStore, MarketMetadataStore}; -use crate::generator::GeneratorStore; -use crate::{middlewares, routes}; +use crate::generator_lib::key_store::KeyStore; +use crate::market_metadata::MarketMetadataStore; +use crate::routes::{get_core_scope, get_stats_scope, ui_scope}; +use crate::{ask_lib::ask_store::LocalAskStore, generator_lib::generator_store::GeneratorStore}; type EntityRegistryInstance = Arc< - Mutex< + RwLock< bindings::entity_key_registry::EntityKeyRegistry< SignerMiddleware, Wallet>, >, @@ -22,71 +26,129 @@ type EntityRegistryInstance = Arc< >; pub struct MatchingEngineServer { - shared_market_data: Arc>, - shared_local_ask_data: Arc>, - shared_parsed_block: Arc>, - shared_matching_key_clone: Arc>>, - clone_shared_entity_key: EntityRegistryInstance, - shared_generator_data: Arc>, + shared_market_data: Arc>, + shared_local_ask_data: Arc>, + shared_parsed_block: Arc>, + shared_matching_key_clone: Arc>>, + shared_entity_key_registry: EntityRegistryInstance, + shared_generator_data: Arc>, + shared_key_data: Arc>, + relayer_key_balance: Arc>, + should_stop: Arc, } impl MatchingEngineServer { + #[allow(clippy::too_many_arguments)] pub fn new( - shared_market_data: Arc>, - shared_local_ask_data: Arc>, - shared_parsed_block: Arc>, - shared_matching_key_clone: Arc>>, - clone_shared_entity_key: EntityRegistryInstance, - shared_generator_data: Arc>, + shared_market_data: Arc>, + shared_local_ask_data: Arc>, + shared_parsed_block: Arc>, + shared_matching_key_clone: Arc>>, + shared_entity_key_registry: EntityRegistryInstance, + shared_generator_data: Arc>, + shared_key_data: Arc>, + relayer_key_balance: Arc>, + should_stop: Arc, ) -> Self { MatchingEngineServer { shared_market_data, shared_local_ask_data, shared_parsed_block, shared_matching_key_clone, - clone_shared_entity_key, + shared_entity_key_registry, shared_generator_data, + shared_key_data, + relayer_key_balance, + should_stop, } } - pub async fn start_server(self) -> anyhow::Result<()> { - HttpServer::new(move || { - App::new() - .wrap(middlewares::ratelimiter::get_rate_limiter()) + pub async fn start_server(self, port: u16, enable_ssc: bool) -> anyhow::Result<()> { + let server = HttpServer::new(move || { + let ui_request_concurrency = ConcurrencyLimiter::new(2); + let ui_rate_limiter = kalypso_helper::middlewares::ratelimiter::get_rate_limiter( + Duration::from_secs(1), + 10 as u64, + ); + + let stats_request_concurrency = ConcurrencyLimiter::new(2); + let stats_rate_limiter = kalypso_helper::middlewares::ratelimiter::get_rate_limiter( + Duration::from_secs(1), + 10 as u64, + ); + + let core_request_concurrency = ConcurrencyLimiter::new(10); + let core_rate_limiter = kalypso_helper::middlewares::ratelimiter::get_rate_limiter( + Duration::from_secs(1), + 10 as u64, + ); + + #[cfg(not(feature = "matching_engine_enable_cors"))] + let matching_engine_server = App::new(); + + #[cfg(feature = "matching_engine_enable_cors")] + let matching_engine_server = + App::new().wrap(kalypso_helper::middlewares::dirty_cors::get_dirty_cors()); + + matching_engine_server .app_data(Data::new(self.shared_market_data.clone())) .app_data(Data::new(self.shared_local_ask_data.clone())) .app_data(Data::new(self.shared_parsed_block.clone())) .app_data(Data::new(self.shared_matching_key_clone.clone())) - .app_data(Data::new(self.clone_shared_entity_key.clone())) + .app_data(Data::new(self.shared_entity_key_registry.clone())) .app_data(Data::new(self.shared_generator_data.clone())) - .route("/welcome", web::get().to(routes::chain_status::welcome)) // Route to welcome endpoint - .route("/getStatus", web::get().to(routes::ask_status::get_status)) // Route to all ask status - .route( - "/getAskStatus", - web::post().to(routes::ask_status::get_ask_status_askid), - ) // Provide specific ask status - .route( - "/getPrivInput", - web::post().to(routes::get_priv_inputs::get_priv_input), - ) // provide private inputs for a specific ask - .route( - "/decryptRequest", - web::post().to(routes::decrypt_request::decrypt_request), - ) // Return decrypted input - .route( - "/getLatestBlock", - web::get().to(routes::chain_status::get_latest_block_number), // Returns the latest Block parsed so far + .app_data(Data::new(self.shared_key_data.clone())) + .app_data(Data::new(self.relayer_key_balance.clone())) + .service( + ui_scope() + .wrap(ui_request_concurrency) + .wrap(ui_rate_limiter), + ) + .service( + get_stats_scope() + .wrap(stats_request_concurrency) + .wrap(stats_rate_limiter), ) - .route( - "/marketInfo", - web::post().to(routes::market_info::market_info), + .service( + get_core_scope() + .wrap(core_request_concurrency) + .wrap(core_rate_limiter), ) - }) - .bind("0.0.0.0:3000") - .unwrap() - .run() - .await - .unwrap(); + }); + + if enable_ssc { + let tls_config = kalypso_helper::ssc::create_random_rustls_server_config(); + // Error handling for TLS configuration + if let Err(err) = tls_config { + log::error!("Failed to create TLS config: {}", err); + self.should_stop.store(true, Ordering::Release); + return Err(anyhow::Error::from(err)); + } + + let tls_config = tls_config.unwrap(); + + // Bind the server using Rustls for HTTPS + let server = server.bind_rustls(format!("0.0.0.0:{}", port), tls_config); + if let Err(err) = server { + log::error!("Failed to bind server with Rustls: {}", err); + self.should_stop.store(true, Ordering::Release); + return Err(anyhow::Error::from(err)); + } + + // Run the server and await + server.unwrap().run().await?; + } else { + // Bind the server using plain HTTP + let server = server.bind(format!("0.0.0.0:{}", port)); + if let Err(err) = server { + log::error!("Failed to bind server with HTTP: {}", err); + self.should_stop.store(true, Ordering::Release); + return Err(anyhow::Error::from(err)); + } + + // Run the server and await + server.unwrap().run().await?; + } Ok(()) } diff --git a/matching_engine/src/lib.rs b/matching_engine/src/lib.rs new file mode 100644 index 0000000..0722ba9 --- /dev/null +++ b/matching_engine/src/lib.rs @@ -0,0 +1,317 @@ +pub mod ask_lib; +pub mod costs; +pub mod counters; +pub mod market_metadata; +pub mod models; +pub mod utility; + +mod generator_lib; +mod jobs; +mod log_processor; +mod routes; + +use ask_lib::ask_store::LocalAskStore; +use market_metadata::MarketMetadataStore; + +use costs::CostStore; +use ethers::prelude::*; +use generator_lib::{generator_store::GeneratorStore, key_store::KeyStore}; +use jobs::{parser::LogParser, server::MatchingEngineServer}; +use models::{GetAskStatus, MarketInfo}; +use reqwest::StatusCode; +use serde::{Deserialize, Serialize}; +use service_check_helper::{Request, RequestType}; +use std::sync::atomic::{AtomicBool, Ordering}; +use std::{str::FromStr, sync::Arc}; +use tokio::sync::RwLock; +use tokio::task::JoinHandle; + +pub fn get_welcome_request() -> Request<(), R> { + Request { + request_type: RequestType::GET, + service_endpoint: "/welcome".into(), + _marker: std::marker::PhantomData::, + expected_status_code: StatusCode::OK, + info: "Checks server reach".into(), + } +} + +pub fn get_latest_block_request() -> Request<(), R> { + Request { + request_type: RequestType::GET, + service_endpoint: "/getLatestBlock".into(), + _marker: std::marker::PhantomData::, + expected_status_code: StatusCode::OK, + info: "Checks upto which block ME has reached".into(), + } +} + +pub fn get_key_balance_request() -> Request<(), R> { + Request { + request_type: RequestType::GET, + service_endpoint: "/getKeyBalance".into(), + _marker: std::marker::PhantomData::, + expected_status_code: StatusCode::OK, + info: "Checks balance of gas key".into(), + } +} + +pub fn get_status_request() -> Request<(), R> { + Request { + request_type: RequestType::GET, + service_endpoint: "/getStatus".into(), + _marker: std::marker::PhantomData::, + expected_status_code: StatusCode::OK, + info: "Checks ME overal status".into(), + } +} + +pub fn get_single_ask_status_request( + input_payload: Option, + expected_status_code: StatusCode, + info: String, +) -> Request { + Request { + request_type: RequestType::POST( + input_payload.unwrap_or_else(|| GetAskStatus { ask_id: "1".into() }), + ), + service_endpoint: "/getAskStatus".into(), + _marker: std::marker::PhantomData::, + expected_status_code, + info, + } +} + +pub fn get_single_market_info( + input_payload: Option, + expected_status_code: StatusCode, + info: String, +) -> Request { + Request { + request_type: RequestType::POST(input_payload.unwrap_or_else(|| MarketInfo { + market_id: "3".into(), + })), + service_endpoint: "/marketInfo".into(), + _marker: std::marker::PhantomData::, + expected_status_code, + info, + } +} + +#[derive(Debug, Serialize, Deserialize, Clone)] +pub struct MatchingEngineConfig { + pub rpc_url: String, + pub chain_id: String, + pub matching_engine_key: String, + pub relayer_private_key: String, + pub proof_market_place: String, + pub generator_registry: String, + pub entity_registry: String, + pub start_block: String, +} + +pub struct MatchingEngine { + config: MatchingEngineConfig, + matching_engine_port: u16, +} + +impl MatchingEngine { + pub fn from_config(config: MatchingEngineConfig, matching_engine_port: Option) -> Self { + Self { + config, + matching_engine_port: matching_engine_port.unwrap_or(3000), + } + } + + #[allow(clippy::too_many_arguments)] + pub fn new( + rpc_url: String, + chain_id: String, + matching_engine_key: String, + relayer_private_key: String, + proof_market_place: String, + generator_registry: String, + entity_registry: String, + start_block: String, + matching_engine_port: Option, + ) -> Self { + let config: MatchingEngineConfig = MatchingEngineConfig { + rpc_url, + chain_id, + matching_engine_key, + relayer_private_key, + proof_market_place, + generator_registry, + entity_registry, + start_block, + }; + + Self::from_config(config, matching_engine_port) + } + + pub async fn run(&self) -> anyhow::Result<()> { + let local_ask_store = LocalAskStore::new(); + let generator_list_store = GeneratorStore::new(); + let key_list_store = KeyStore::new(); + let cost_store = CostStore::new(); + let market_list_store = MarketMetadataStore::new(); + + // wrapping around is case to shared across threads + let shared_local_ask_store = Arc::new(RwLock::new(local_ask_store)); + let shared_generator_store = Arc::new(RwLock::new(generator_list_store)); + let shared_market_store = Arc::new(RwLock::new(market_list_store)); + let shared_key_store = Arc::new(RwLock::new(key_list_store)); + let shared_cost_store = Arc::new(RwLock::new(cost_store)); + let relayer_key_balance = Arc::new(RwLock::new(ethers::types::U256::zero())); + + let rpc_url = self.config.clone().rpc_url; + let chain_id = self.config.clone().chain_id; + + let matching_engine_key = self.config.clone().matching_engine_key; + let matching_engine_signer = matching_engine_key + .parse::() + .unwrap() + .with_chain_id(U64::from_dec_str(&chain_id).unwrap().as_u64()); + + let relayer_key = self.config.clone().relayer_private_key; + let relayer_signer = relayer_key + .parse::() + .unwrap() + .with_chain_id(U64::from_dec_str(&chain_id).unwrap().as_u64()); + + let start_block_string = self.config.clone().start_block; + + log::info!( + "matching engine address {:?}", + matching_engine_signer.clone().address() + ); + + log::info!("relayer address {:?}", relayer_signer.clone().address()); + + let provider_http = Provider::::try_from(&rpc_url) + .unwrap() + // .with_signer(matching_engine_signer.clone()); + .with_signer(relayer_signer.clone()); + // let relay_key_balance = provider_http.get_balance(relayer_signer.address(), None).await;. + + let client = Arc::new(provider_http.clone()); + + // Creating contract instance for proof market place + let proof_market_place_var = self.config.clone().proof_market_place; + let proof_marketplace_address = Address::from_str(&proof_market_place_var).unwrap(); + + let proof_marketplace = bindings::proof_marketplace::ProofMarketplace::new( + proof_marketplace_address, + client.clone(), + ); + + // Creating contract instance for generator registry + let generator_registry_var = self.config.clone().generator_registry; + let generator_registry_address = Address::from_str(&generator_registry_var).unwrap(); + + let generator_registry = bindings::generator_registry::GeneratorRegistry::new( + generator_registry_address, + client.clone(), + ); + + let entity_key_registry_var = self.config.clone().entity_registry; + let entity_key_registry_address = Address::from_str(&entity_key_registry_var).unwrap(); + + let entity_key_registry = bindings::entity_key_registry::EntityKeyRegistry::new( + entity_key_registry_address, + client.clone(), + ); + + let shared_entity_key_registry = bindings::entity_key_registry::EntityKeyRegistry::new( + entity_key_registry_address, + client.clone(), + ); + let shared_entity_key = Arc::new(RwLock::new(shared_entity_key_registry)); + let shared_entity_key_registry = Arc::clone(&shared_entity_key); + + let shared_parsed_block_number_store = Arc::new(RwLock::new( + U64::from_dec_str(&start_block_string).expect("Unable to rad start_block"), + )); + let shared_parsed_block = Arc::clone(&shared_parsed_block_number_store); + + let shared_market_data = Arc::clone(&shared_market_store); + let shared_generator_data = Arc::clone(&shared_generator_store); + let shared_local_ask_data = Arc::clone(&shared_local_ask_store); + + let matching_engine_key_for_server = hex::decode(matching_engine_key.clone()).unwrap(); + let shared_matching_key = Arc::new(RwLock::new(matching_engine_key_for_server)); + let shared_matching_key_clone = Arc::clone(&shared_matching_key); + + let should_stop = Arc::new(AtomicBool::new(false)); + let stop_handle_clone = should_stop.clone(); + + let mut handles = vec![]; + + tokio::spawn(async move { + tokio::signal::ctrl_c().await.unwrap(); + stop_handle_clone.store(true, Ordering::Release); + }); + + let server = MatchingEngineServer::new( + shared_market_data, + shared_local_ask_data, + shared_parsed_block.clone(), + shared_matching_key_clone, + shared_entity_key_registry, + shared_generator_data, + shared_key_store.clone(), + relayer_key_balance.clone(), + should_stop.clone(), + ); + + let matching_engine_port = self.matching_engine_port; + + let server_handle: JoinHandle>> = + tokio::spawn(async move { + server + .start_server(matching_engine_port, false) + .await + .unwrap(); + Ok(()) + }); + handles.push(server_handle); + + let confirmations = 5; // ideally this should be more + let block_range = 20000; // Number of blocks to fetch logs from at once + let should_stop_clone = should_stop.clone(); + let parser = Arc::new(LogParser::new( + should_stop_clone, + rpc_url, + relayer_signer.clone(), + shared_parsed_block, + block_range.into(), + confirmations.into(), + proof_marketplace.clone(), + generator_registry, + entity_key_registry, + matching_engine_key, + vec![], //TODO! fetch these slave keys using Oyster KMS + shared_local_ask_store.clone(), + shared_generator_store, + shared_market_store.clone(), + shared_key_store, + shared_cost_store, + chain_id, + )); + + let parser_handle = tokio::spawn(async move { + parser.parse().await.unwrap(); + Ok(()) + }); + + handles.push(parser_handle); + + for handle in handles { + let _ = handle.await; + } + + println!("All tasks completed or shutdown."); + + Ok(()) + } +} diff --git a/matching_engine/src/log_processor/constants.rs b/matching_engine/src/log_processor/constants.rs index d68f69b..ee83458 100644 --- a/matching_engine/src/log_processor/constants.rs +++ b/matching_engine/src/log_processor/constants.rs @@ -4,13 +4,19 @@ use std::{collections::HashSet, str::FromStr}; // Define the lazy_static set lazy_static! { - pub static ref TOPICS_TO_SKIP: HashSet = { + static ref TOPICS_TO_SKIP: HashSet = { let mut set = HashSet::new(); // Initialize your set here set.insert(H256::from_str("bc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b").unwrap()); // UUPS.Upgraded set.insert(H256::from_str("2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d").unwrap()); // AccessControl.RoleGranted + set.insert(H256::from_str("f6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b").unwrap()); // AccessControl.RoleRevoked set.insert(H256::from_str("bd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff").unwrap()); // AccessControl.RoleAdminChanged - set.insert(H256::from_str("7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498").unwrap()); // Initializable.Initialized + set.insert(H256::from_str("7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498").unwrap()); // Initializable.Initialized(uint8) + set.insert(H256::from_str("c7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2").unwrap()); // Initializable.Initialized(uint64) set }; + + pub static ref PROOF_MARKET_TOPICS_SKIP: HashSet = TOPICS_TO_SKIP.clone(); + pub static ref GENERATOR_REGISTRY_TOPICS_SKIP: HashSet = TOPICS_TO_SKIP.clone(); + pub static ref ENTITY_KEY_REGISTRY_TOPICS_SKIP: HashSet = TOPICS_TO_SKIP.clone(); } diff --git a/matching_engine/src/log_processor/er.rs b/matching_engine/src/log_processor/er.rs index be019c1..1c52ea6 100644 --- a/matching_engine/src/log_processor/er.rs +++ b/matching_engine/src/log_processor/er.rs @@ -1,199 +1,175 @@ -use crate::{generator::*, log_processor::constants}; +use crate::generator_lib::*; +use crate::log_processor::constants; use ecies; use ethers::prelude::{k256::ecdsa::SigningKey, *}; use std::sync::Arc; -use tokio::sync::Mutex; +use tokio::sync::RwLock; pub async fn process_entity_key_registry_logs( - logs: Vec, - entity_key_registry: bindings::entity_key_registry::EntityKeyRegistry< + log: &Log, + entity_key_registry: &bindings::entity_key_registry::EntityKeyRegistry< SignerMiddleware, Wallet>, >, - key_store: &Arc>, + key_store: &Arc>, ) -> Result<(), Box> { - let mut key_store = key_store.lock().await; - for log in &logs { - if constants::TOPICS_TO_SKIP.get(&log.topics[0]).is_some() { - log::warn!("standard topic to skip found, ignoring it"); - continue; - } - - if entity_key_registry - .decode_event::( - "EnclaveImageWhitelisted", - log.topics.clone(), - log.clone().data, - ) - .is_ok() - { - log::warn!("Skipped EnclaveImageWhitelisted event"); - continue; - } + if constants::ENTITY_KEY_REGISTRY_TOPICS_SKIP + .get(&log.topics[0]) + .is_some() + { + log::debug!("standard topic to skip found, ignoring it"); + return Ok(()); + } - if entity_key_registry - .decode_event::( - "EnclaveImageRevoked", - log.topics.clone(), - log.clone().data, - ) - .is_ok() - { - log::warn!("Skipped EnclaveImageRevoked event"); - continue; - } + if entity_key_registry + .decode_event::( + "EnclaveImageWhitelisted", + log.topics.clone(), + log.clone().data, + ) + .is_ok() + { + log::debug!("Skipped EnclaveImageWhitelisted event"); + return Ok(()); + } - if entity_key_registry - .decode_event::( - "EnclaveImageWhitelisted", - log.topics.clone(), - log.clone().data, - ) - .is_ok() - { - log::warn!("Skipped EnclaveImageWhitelisted event"); - continue; - } + if entity_key_registry + .decode_event::( + "EnclaveImageRevoked", + log.topics.clone(), + log.clone().data, + ) + .is_ok() + { + log::warn!("Skipped EnclaveImageRevoked event"); + return Ok(()); + } - if entity_key_registry - .decode_event::( - "EnclaveKeyRevoked", - log.topics.clone(), - log.clone().data, - ) - .is_ok() - { - log::warn!("Skipped EnclaveKeyRevoked event"); - continue; - } + if entity_key_registry + .decode_event::( + "EnclaveImageWhitelisted", + log.topics.clone(), + log.clone().data, + ) + .is_ok() + { + log::debug!("Skipped EnclaveImageWhitelisted event"); + return Ok(()); + } - if entity_key_registry - .decode_event::( - "EnclaveKeyVerified", - log.topics.clone(), - log.clone().data, - ) - .is_ok() - { - log::warn!("Skipped EnclaveKeyVerified event"); - continue; - } + if entity_key_registry + .decode_event::( + "EnclaveKeyRevoked", + log.topics.clone(), + log.clone().data, + ) + .is_ok() + { + log::debug!("Skipped EnclaveKeyRevoked event"); + return Ok(()); + } - if let Ok(parsed_update_key_log) = entity_key_registry - .decode_event::( - "UpdateKey", + if entity_key_registry + .decode_event::( + "EnclaveKeyVerified", log.topics.clone(), log.clone().data, - ) { - log::debug!("{:?}", parsed_update_key_log); - let user = parsed_update_key_log.user; - let key_index = parsed_update_key_log.key_index.as_u64(); - - let generator_pub_key = entity_key_registry - .pub_key(user, key_index.into()) - .call() - .await - .unwrap(); - - let mut extended_pub_key = vec![0x04]; - extended_pub_key.extend_from_slice(&generator_pub_key); - - // Now, `extended_pub_key` is a 65-byte vector with `04` prepended. - let pub_key_array: &[u8; 65] = extended_pub_key.as_slice().try_into().unwrap(); - - let public_key = ecies::PublicKey::parse(pub_key_array); - // let generator_in_all_markets = generator_store.get_all_by_address(&user); - // log::info!("All generators: {:?}", generator_in_all_markets.len()); - // // Collect the data first - // let generators_to_update: Vec<_> = generator_in_all_markets - // .iter() - // .map(|generator| (generator.address, generator.market_id)) - // .collect(); - - match public_key { - Ok(generator_public_key) => { - log::debug!( - "Serialized uncompressed key: {}", - hex::encode(generator_public_key.serialize()) - ); - let get_user_key = key_store.get_by_address(&user, key_index); - match get_user_key { - Some(_) => { - key_store.update_pub_key( - &user, - key_index, - Some((*pub_key_array).into()), - ); - } - None => { - let key = Key { - address: user, - key_index, - ecies_pub_key: Some((*pub_key_array).into()), - }; - key_store.insert(key.address, key_index, key); - } + ) + .is_ok() + { + log::debug!("Skipped EnclaveKeyVerified event"); + return Ok(()); + } + + if let Ok(parsed_update_key_log) = entity_key_registry + .decode_event::( + "UpdateKey", + log.topics.clone(), + log.clone().data, + ) { + log::debug!("{:?}", parsed_update_key_log); + let mut key_store = { key_store.write().await }; + let user = parsed_update_key_log.user; + let key_index = parsed_update_key_log.key_index.as_u64(); + + let generator_pub_key = entity_key_registry + .pub_key(user, key_index.into()) + .call() + .await + .unwrap(); + + let mut extended_pub_key = vec![0x04]; + extended_pub_key.extend_from_slice(&generator_pub_key); + + // Now, `extended_pub_key` is a 65-byte vector with `04` prepended. + let pub_key_array: &[u8; 65] = extended_pub_key.as_slice().try_into().unwrap(); + let public_key = ecies::PublicKey::parse(pub_key_array); + + match public_key { + Ok(generator_public_key) => { + log::debug!( + "Serialized uncompressed key: {}", + hex::encode(generator_public_key.serialize()) + ); + let get_user_key = key_store.get_by_address(&user, key_index); + match get_user_key { + Some(_) => { + key_store.update_pub_key(&user, key_index, Some((*pub_key_array).into())); + } + None => { + let key = + key_store::Key::new(user, key_index, Some((*pub_key_array).into())); + key_store.insert(key.address, key_index, key); } } - Err(_err) => { - log::warn!("Couldn't derive ecies pub key for the generator {:?}", user); - let get_user_key = key_store.get_by_address(&user, key_index); - match get_user_key { - Some(_) => { - key_store.update_pub_key(&user, key_index, None); - } - None => { - let key = Key { - address: user, - key_index, - ecies_pub_key: None, - }; - key_store.insert(user, key_index, key); - } + } + Err(_err) => { + log::warn!("Couldn't derive ecies pub key for the generator {:?}", user); + let get_user_key = key_store.get_by_address(&user, key_index); + match get_user_key { + Some(_) => { + key_store.update_pub_key(&user, key_index, None); + } + None => { + let key = key_store::Key::new(user, key_index, None); + key_store.insert(user, key_index, key); } } - }; - - continue; - } - - if let Ok(parsed_remove_key_log) = entity_key_registry - .decode_event::( - "RemoveKey", - log.topics.clone(), - log.data.clone(), - ) { - log::debug!("{:?}", parsed_remove_key_log); - let user = parsed_remove_key_log.user; - let key_index = parsed_remove_key_log.key_index.as_u64(); - - let get_user_key = key_store.get_by_address(&user, key_index); - if get_user_key.is_some() { - key_store.remove_by_address(&user, key_index); } - continue; - } + }; - if let Ok(initialized_logs) = entity_key_registry.decode_event_raw( - "Initialized", - log.topics.clone(), - log.data.clone(), - ) { - log::warn!("Version: {:?}", initialized_logs); - continue; - } + return Ok(()); + } - if let Ok(attestation_auther_logs) = entity_key_registry.decode_event_raw( - "EnclaveImageAddedToFamily", - log.topics.clone(), - log.data.clone(), - ) { - log::warn!("Attestation Auther logs: {:?}", attestation_auther_logs); - continue; + if let Ok(parsed_remove_key_log) = entity_key_registry + .decode_event::( + "RemoveKey", + log.topics.clone(), + log.data.clone(), + ) { + log::debug!("{:?}", parsed_remove_key_log); + let mut key_store = { key_store.write().await }; + let user = parsed_remove_key_log.user; + let key_index = parsed_remove_key_log.key_index.as_u64(); + + let get_user_key = key_store.get_by_address(&user, key_index); + if get_user_key.is_some() { + key_store.remove_by_address(&user, key_index); } + return Ok(()); + } - log::error!("Unhandled log in entity key registry {:?}", log); - return Err("Unhandled log in entity key registry".into()); + if let Ok(attestation_auther_logs) = + entity_key_registry + .decode_event::( + "EnclaveImageAddedToFamily", + log.topics.clone(), + log.data.clone(), + ) + { + log::debug!("Attestation Auther logs: {:?}", attestation_auther_logs); + return Ok(()); } - Ok(()) + log::error!("Unhandled log in entity key registry {:?}", log); + return Err("Unhandled log in entity key registry".into()); } diff --git a/matching_engine/src/log_processor/gr.rs b/matching_engine/src/log_processor/gr.rs index b4fee60..1a9da9b 100644 --- a/matching_engine/src/log_processor/gr.rs +++ b/matching_engine/src/log_processor/gr.rs @@ -1,422 +1,437 @@ use ethers::prelude::{k256::ecdsa::SigningKey, *}; use std::sync::Arc; -use tokio::sync::Mutex; +use tokio::sync::RwLock; -use crate::{generator::*, log_processor::constants}; +use crate::generator_lib::*; +use crate::log_processor::constants; +use crate::utility::get_l1_block_from_l2_block; +use crate::utility::{tx_to_string, TokenTracker, TEST_TOKEN_ADDRESS_ONE}; pub async fn process_generator_registry_logs( - logs: Vec, - genertor_registry: bindings::generator_registry::GeneratorRegistry< + log: &Log, + genertor_registry: &bindings::generator_registry::GeneratorRegistry< SignerMiddleware, Wallet>, >, - generator_store: &Arc>, + generator_store: &Arc>, + rpc_url: &str, ) -> Result<(), Box> { - let mut generator_store = generator_store.lock().await; - for log in &logs { - if constants::TOPICS_TO_SKIP.get(&log.topics[0]).is_some() { - log::warn!("standard topic to skip found, ignoring it"); - continue; - } - - if let Ok(parsed_registered_generator_log) = genertor_registry.decode_event_raw( - "RegisteredGenerator", - log.topics.clone(), - log.data.clone(), - ) { - log::info!( - "Registered generator {:?} to store", - parsed_registered_generator_log - ); - - let generator_bytes = parsed_registered_generator_log.first().unwrap(); - let compute_bytes = parsed_registered_generator_log.get(1).unwrap(); - let stake_bytes = parsed_registered_generator_log.get(2).unwrap(); - let address = generator_bytes.clone().into_address().unwrap(); - let compute = compute_bytes.clone().into_uint().unwrap(); - let stake = stake_bytes.clone().into_uint().unwrap(); - - let generator_data = genertor_registry - .generator_registry(address) - .call() - .await - .unwrap(); - - let generator = Generator { - address, - reward_address: generator_data.0, - total_stake: stake, - sum_of_compute_allocations: 0.into(), - compute_consumed: 0.into(), - stake_locked: 0.into(), - active_market_places: 0.into(), - declared_compute: compute, - intended_stake_util: 1000000000000000000_i64.into(), - intended_compute_util: 1000000000000000000_i64.into(), - generator_data: Some(generator_data.9), - }; - - generator_store.insert(generator.clone()); - log::debug!("Generator registered {:?}", address.clone()); - - continue; - } - - if let Ok(parsed_deregistered_generator_log) = genertor_registry.decode_event_raw( - "DeregisteredGenerator", + if constants::GENERATOR_REGISTRY_TOPICS_SKIP + .get(&log.topics[0]) + .is_some() + { + log::debug!("standard topic to skip found, ignoring it"); + return Ok(()); + } + + if let Ok(add_ivs_key_log) = genertor_registry + .decode_event::( + "AddIvsKey", log.topics.clone(), log.data.clone(), - ) { - log::debug!( - "Deregistering Generator: {:?}", - parsed_deregistered_generator_log.first().unwrap() - ); - let address = parsed_deregistered_generator_log - .first() - .unwrap() - .clone() - .into_address() - .unwrap(); - - generator_store.remove_by_address(&address); - continue; - } - - if let Ok(generator_reward_address_change_log) = genertor_registry.decode_event_raw( - "ChangedGeneratorRewardAddress", + ) + { + log::debug!( + "Ivs key signer: {:?}, market id: {:?}", + add_ivs_key_log.signer, + add_ivs_key_log.market_id + ); + return Ok(()); + } + + // using here, as above events don' require any write lock + let mut generator_store = { generator_store.write().await }; + + if let Ok(parsed_registered_generator_log) = + genertor_registry.decode_event::( + "RegisteredGenerator", log.topics.clone(), log.data.clone(), - ) { - log::debug!( - "Generator: {:?}, new reward address: {:?}", - generator_reward_address_change_log.first().unwrap(), - generator_reward_address_change_log.get(1).unwrap() - ); - - let address = generator_reward_address_change_log - .first() - .unwrap() - .clone() - .into_address() - .unwrap(); - let reward_address = generator_reward_address_change_log - .get(1) - .unwrap() - .clone() - .into_address() - .unwrap(); - - generator_store.update_reward_address(&address, reward_address); - continue; - } - - if let Ok(parsed_joined_market_place_log) = - genertor_registry.decode_event::( - "JoinedMarketplace", - log.topics.clone(), - log.data.clone(), - ) - { - log::info!( - "Generator: {:?}, joined Market_ID {:?}", - parsed_joined_market_place_log.generator, - parsed_joined_market_place_log.market_id - ); - let address = parsed_joined_market_place_log.generator; - let market_id = parsed_joined_market_place_log.market_id; - - let generator_market_data = genertor_registry - .generator_info_per_market(address, market_id) - .call() - .await - .unwrap(); - - let total_stake = generator_store - .get_by_address(&address) - .unwrap() - .total_stake; - - let generator_market = GeneratorInfoPerMarket { - address: parsed_joined_market_place_log.generator, - market_id: parsed_joined_market_place_log.market_id, - total_stake, - compute_required_per_request: parsed_joined_market_place_log.compute_allocation, - proof_generation_cost: generator_market_data.2, - proposed_time: generator_market_data.3, - active_requests: 0.into(), - proofs_submitted: 0.into(), - state: Some(GeneratorState::Joined), - }; - generator_store.insert_markets(generator_market); - continue; - } - - if let Ok(parsed_requested_for_exit_log) = - genertor_registry - .decode_event::( - "RequestExitMarketplace", - log.topics.clone(), - log.data.clone(), - ) - { - log::debug!( - "Generator: {:?}, request for exit from Market_ID: {:?}", - parsed_requested_for_exit_log.generator, - parsed_requested_for_exit_log.market_id - ); - - let address = parsed_requested_for_exit_log.generator; - let market_id = parsed_requested_for_exit_log.market_id; - - generator_store.update_state(&address, &market_id, GeneratorState::RequestedForExit); - continue; - } - - if let Ok(parsed_left_market_place_log) = - genertor_registry.decode_event::( - "LeftMarketplace", - log.topics.clone(), - log.data.clone(), - ) - { - log::debug!( - "Generator: {:?}, left Market_ID: {:?}", - parsed_left_market_place_log.generator, - parsed_left_market_place_log.market_id - ); - let address = parsed_left_market_place_log.generator; - let market_id = parsed_left_market_place_log.market_id; - - generator_store.remove_by_address_and_market(&address, &market_id); - continue; - } - - if let Ok(add_ivs_key_log) = genertor_registry - .decode_event::( - "AddIvsKey", + ) + { + log::info!( + "Registered generator {:?} to store", + parsed_registered_generator_log + ); + + let address = parsed_registered_generator_log.generator.into(); + let compute = parsed_registered_generator_log.initial_compute.into(); + let stake = parsed_registered_generator_log.initial_stake.into(); + + let generator_data = genertor_registry + .generator_registry(address) + .call() + .await + .unwrap(); + + let generator = generator_store::Generator { + address, + reward_address: generator_data.0, + total_stake: { + let mut total_stake = TokenTracker::new(); + total_stake.add_token(&TEST_TOKEN_ADDRESS_ONE, &stake); + total_stake + }, + sum_of_compute_allocations: 0.into(), + compute_consumed: 0.into(), + stake_locked: TokenTracker::new(), + active_market_places: 0.into(), + declared_compute: compute, + intended_stake_util: 1000000000000000000_i64.into(), + intended_compute_util: 1000000000000000000_i64.into(), + generator_data: generator_data.9, + }; + + generator_store.insert(generator.clone()); + log::debug!("Generator registered {:?}", address.clone()); + + return Ok(()); + } + + if let Ok(parsed_deregistered_generator_log) = genertor_registry.decode_event_raw( + "DeregisteredGenerator", + log.topics.clone(), + log.data.clone(), + ) { + let generator_address = { + let generator_address_token = parsed_deregistered_generator_log.first().unwrap(); + let generator_address = generator_address_token.clone().into_address().unwrap(); + generator_address + }; + + log::debug!("Deregistering Generator: {:?}", generator_address); + let address = generator_address.into(); + + generator_store.remove_by_address(&address); + return Ok(()); + } + + if let Ok(generator_reward_address_change_log) = + genertor_registry + .decode_event::( + "ChangedGeneratorRewardAddress", log.topics.clone(), log.data.clone(), ) - { - log::warn!( - "Ivs key signer: {:?}, market id: {:?}", - add_ivs_key_log.signer, - add_ivs_key_log.market_id - ); - continue; - } - - if let Ok(added_stake_log) = genertor_registry - .decode_event::( - "AddedStake", + { + log::debug!( + "Generator: {:?}, new reward address: {:?}", + generator_reward_address_change_log.generator, + generator_reward_address_change_log.new_reward_address + ); + + let address = generator_reward_address_change_log.generator.into(); + let reward_address = generator_reward_address_change_log + .new_reward_address + .into(); + + generator_store.update_reward_address(&address, reward_address); + return Ok(()); + } + + if let Ok(parsed_joined_market_place_log) = + genertor_registry.decode_event::( + "JoinedMarketplace", + log.topics.clone(), + log.data.clone(), + ) + { + log::info!( + "Generator: {:?}, joined Market_ID {:?}", + parsed_joined_market_place_log.generator, + parsed_joined_market_place_log.market_id + ); + let address = parsed_joined_market_place_log.generator; + let market_id = parsed_joined_market_place_log.market_id; + + let generator_market_data = genertor_registry + .generator_info_per_market(address, market_id) + .call() + .await + .unwrap(); + + let generator_market = generator_store::GeneratorInfoPerMarket { + address: parsed_joined_market_place_log.generator, + market_id: parsed_joined_market_place_log.market_id, + compute_required_per_request: parsed_joined_market_place_log.compute_allocation, + proof_generation_cost: generator_market_data.2, + proposed_time: generator_market_data.3, + active_requests: 0.into(), + proofs_submitted: 0.into(), + proofs_slashed: 0.into(), + state: Some(generator_state::GeneratorState::Joined), + }; + generator_store.insert_markets(generator_market); + return Ok(()); + } + + if let Ok(parsed_requested_for_exit_log) = + genertor_registry + .decode_event::( + "RequestExitMarketplace", log.topics.clone(), log.data.clone(), ) - { - log::debug!("Added stake to Generator: {:?}", added_stake_log.generator); - let address = added_stake_log.generator; - let amount = added_stake_log.amount; - - generator_store.add_extra_stake(&address, &amount); - - continue; - } - - if let Ok(request_stake_decrease_log) = - genertor_registry - .decode_event::( - "RequestStakeDecrease", - log.topics.clone(), - log.data.clone(), - ) - { - log::debug!( - "Request stake decrease for Generator: {:?}", - request_stake_decrease_log.generator - ); - - let address = request_stake_decrease_log.generator; - let new_utilization = request_stake_decrease_log.intended_utilization; - - generator_store.update_intended_stake_util(&address, new_utilization); - continue; - } - - if let Ok(remove_stake_log) = genertor_registry - .decode_event::( + { + log::debug!( + "Generator: {:?}, request for exit from Market_ID: {:?}", + parsed_requested_for_exit_log.generator, + parsed_requested_for_exit_log.market_id + ); + + let address = parsed_requested_for_exit_log.generator; + let market_id = parsed_requested_for_exit_log.market_id; + + generator_store.update_state( + &address, + &market_id, + generator_state::GeneratorState::RequestedForExit, + ); + return Ok(()); + } + + if let Ok(parsed_left_market_place_log) = genertor_registry + .decode_event::( + "LeftMarketplace", + log.topics.clone(), + log.data.clone(), + ) { + log::debug!( + "Generator: {:?}, left Market_ID: {:?}", + parsed_left_market_place_log.generator, + parsed_left_market_place_log.market_id + ); + let address = parsed_left_market_place_log.generator; + let market_id = parsed_left_market_place_log.market_id; + + generator_store.remove_by_address_and_market(&address, &market_id); + return Ok(()); + } + + if let Ok(added_stake_log) = genertor_registry + .decode_event::( + "AddedStake", + log.topics.clone(), + log.data.clone(), + ) + { + log::debug!("Added stake to Generator: {:?}", added_stake_log.generator); + let address = added_stake_log.generator; + let amount = added_stake_log.amount; + + let block_l2: U256 = log.block_number.unwrap().as_u64().into(); + let block_l1: U256 = get_l1_block_from_l2_block(rpc_url, block_l2) + .await + .unwrap_or_default(); + + generator_store.add_extra_stake( + &address, + &TEST_TOKEN_ADDRESS_ONE, + &amount, + U64::from(block_l1.as_u64()), + log.transaction_index.unwrap(), + log.log_index.unwrap(), + tx_to_string(&log.transaction_hash.unwrap()), + ); + + return Ok(()); + } + + if let Ok(request_stake_decrease_log) = genertor_registry + .decode_event::( + "RequestStakeDecrease", + log.topics.clone(), + log.data.clone(), + ) { + log::debug!( + "Request stake decrease for Generator: {:?}", + request_stake_decrease_log.generator + ); + + let address = request_stake_decrease_log.generator; + let new_utilization = request_stake_decrease_log.intended_utilization; + + generator_store.pause_assignments_across_all_markets(&address); + generator_store.update_intended_stake_util(&address, new_utilization); + return Ok(()); + } + + if let Ok(remove_stake_log) = genertor_registry + .decode_event::( "RemovedStake", log.topics.clone(), log.data.clone(), - ) { - log::debug!( - "Remove stake for Generator: {:?}", - remove_stake_log.generator - ); + ) + { + log::debug!( + "Remove stake for Generator: {:?}", + remove_stake_log.generator + ); + + let address = remove_stake_log.generator; + let amount = remove_stake_log.amount; + + let block_l2: U256 = log.block_number.unwrap().as_u64().into(); + let block_l1: U256 = get_l1_block_from_l2_block(rpc_url, block_l2) + .await + .unwrap_or_default(); + + generator_store.remove_stake( + &address, + &TEST_TOKEN_ADDRESS_ONE, + &amount, + U64::from(block_l1.as_u64()), + log.transaction_index.unwrap(), + log.log_index.unwrap(), + tx_to_string(&log.transaction_hash.unwrap()), + delegation::Operation::UnDelegate, + ); + generator_store.resume_assignments_accross_all_markets(&address); + generator_store.update_intended_stake_util(&address, 1000000000000000000_i64.into()); + + return Ok(()); + } - let address = remove_stake_log.generator; - let amount = remove_stake_log.amount; + if let Ok(increase_compute_log) = genertor_registry + .decode_event::( + "IncreasedCompute", + log.topics.clone(), + log.data.clone(), + ) { + log::debug!( + "Increase compute for Generator: {:?}", + increase_compute_log.generator + ); + let address = increase_compute_log.generator; + let compute = increase_compute_log.compute; + + generator_store.add_extra_compute(&address, compute); + return Ok(()); + } - generator_store.remove_stake(&address, &amount); - generator_store.update_intended_stake_util(&address, 1000000000000000000_i64.into()); + if let Ok(request_compute_decrease_log) = + genertor_registry + .decode_event::( + "RequestComputeDecrease", + log.topics.clone(), + log.data.clone(), + ) + { + log::info!( + "Request compute decrease for Generator: {:?}", + request_compute_decrease_log.generator + ); + + let address = request_compute_decrease_log.generator; + let new_utilization = request_compute_decrease_log.intended_utilization; + + generator_store.pause_assignments_across_all_markets(&address); + generator_store.update_intended_compute_util(&address, new_utilization); + return Ok(()); + } - continue; - } + if let Ok(decrease_compute_log) = genertor_registry + .decode_event::( + "DecreaseCompute", + log.topics.clone(), + log.data.clone(), + ) { + log::info!( + "Compute decrease for Generator: {:?} to : {:?}", + decrease_compute_log.generator, + decrease_compute_log.compute + ); + + let address = decrease_compute_log.generator; + let compute = decrease_compute_log.compute; + + generator_store.remove_compute(&address, compute); + generator_store.resume_assignments_accross_all_markets(&address); + generator_store.update_intended_compute_util(&address, 1000000000000000000_i64.into()); + return Ok(()); + } - if let Ok(increase_compute_log) = genertor_registry - .decode_event::( - "IncreasedCompute", - log.topics.clone(), - log.data.clone(), - ) { - log::debug!( - "Increase compute for Generator: {:?}", - increase_compute_log.generator - ); - let address = increase_compute_log.generator; - let compute = increase_compute_log.compute; - - generator_store.add_extra_compute(&address, compute); - continue; - } - - if let Ok(request_compute_decrease_log) = - genertor_registry - .decode_event::( - "RequestComputeDecrease", - log.topics.clone(), - log.data.clone(), - ) - { - log::info!( - "Request compute decrease for Generator: {:?}", - request_compute_decrease_log.generator - ); - - let address = request_compute_decrease_log.generator; - let new_utilization = request_compute_decrease_log.intended_utilization; - - generator_store.update_intended_compute_util(&address, new_utilization); - continue; - } - - if let Ok(decrease_compute_log) = genertor_registry - .decode_event::( - "DecreaseCompute", - log.topics.clone(), - log.data.clone(), - ) { - log::info!( - "Compute decrease for Generator: {:?} to : {:?}", - decrease_compute_log.generator, - decrease_compute_log.compute - ); - - let address = decrease_compute_log.generator; - let compute = decrease_compute_log.compute; - - generator_store.remove_compute(&address, compute); - generator_store.update_intended_compute_util(&address, 1000000000000000000_i64.into()); - continue; - } - - if let Ok(upgraded_logs) = - genertor_registry.decode_event_raw("Upgraded", log.topics.clone(), log.data.clone()) - { - log::debug!("Upgraded: {:?}", upgraded_logs); - continue; - } - - if let Ok(initialized_logs) = - genertor_registry.decode_event_raw("Initialized", log.topics.clone(), log.data.clone()) - { - log::warn!("Version: {:?}", initialized_logs); - continue; - } - - if let Ok(role_granted_logs) = genertor_registry - .decode_event::( - "RoleGranted", - log.topics.clone(), - log.data.clone(), - ) { - log::warn!( - "Role: {:?}, Sender: {:?}", - hex::encode(role_granted_logs.role), - role_granted_logs.sender - ); - continue; - } - - if let Ok(role_revoked_logs) = genertor_registry - .decode_event::( - "RoleRevoked", - log.topics.clone(), - log.data.clone(), - ) { - log::warn!( - "Role: {:?}, Sender: {:?}", - hex::encode(role_revoked_logs.role), - role_revoked_logs.sender - ); - continue; - } - - if let Ok(role_admin_changed_logs) = genertor_registry - .decode_event::( - "RoleAdminChanged", - log.topics.clone(), - log.data.clone(), - ) { - log::warn!( - "New Admin: {:?}, Old Admin: {:?}, Role: {:?}", - role_admin_changed_logs.new_admin_role, - role_admin_changed_logs.previous_admin_role, - role_admin_changed_logs.role - ); - continue; - } - - if let Ok(stake_lock_logs) = genertor_registry - .decode_event::( - "StakeLockImposed", - log.topics.clone(), - log.data.clone(), - ) { - log::warn!("Stake Lock Imposed: {:?}", stake_lock_logs); - continue; - } - - if let Ok(compute_lock_logs) = genertor_registry - .decode_event::( - "ComputeLockImposed", - log.topics.clone(), - log.data.clone(), - ) { - log::warn!("Compute Lock Imposed: {:?}", compute_lock_logs); - continue; - } - - if let Ok(stake_lock_logs) = genertor_registry - .decode_event::( - "StakeLockReleased", - log.topics.clone(), - log.data.clone(), - ) { - log::warn!("Stake Lock Released: {:?}", stake_lock_logs); - continue; - } - - if let Ok(compute_lock_logs) = genertor_registry - .decode_event::( - "ComputeLockReleased", + if let Ok(stake_lock_logs) = genertor_registry + .decode_event::( + "StakeLockImposed", + log.topics.clone(), + log.data.clone(), + ) { + log::debug!("Stake Lock Imposed: {:?}", stake_lock_logs); + let address = stake_lock_logs.generator; + let stake_locked = stake_lock_logs.stake; + + generator_store.update_on_stake_locked(&address, &TEST_TOKEN_ADDRESS_ONE, stake_locked); + return Ok(()); + } + + if let Ok(compute_lock_logs) = genertor_registry + .decode_event::( + "ComputeLockImposed", + log.topics.clone(), + log.data.clone(), + ) { + log::debug!("Compute Lock Imposed: {:?}", compute_lock_logs); + let address = compute_lock_logs.generator; + let compute_locked = compute_lock_logs.compute; + generator_store.update_on_compute_locked(&address, compute_locked); + return Ok(()); + } + + if let Ok(stake_lock_logs) = genertor_registry + .decode_event::( + "StakeLockReleased", + log.topics.clone(), + log.data.clone(), + ) { + log::debug!("Stake Lock Released: {:?}", stake_lock_logs); + let address = stake_lock_logs.generator; + let stake_released = stake_lock_logs.stake; + generator_store.update_on_stake_released(&address, &TEST_TOKEN_ADDRESS_ONE, stake_released); + return Ok(()); + } + + if let Ok(compute_lock_logs) = genertor_registry + .decode_event::( + "ComputeLockReleased", + log.topics.clone(), + log.data.clone(), + ) { + log::debug!("Compute Lock Released: {:?}", compute_lock_logs); + let address = compute_lock_logs.generator; + let compute_released = compute_lock_logs.compute; + generator_store.update_on_compute_released(&address, compute_released); + return Ok(()); + } + + if let Ok(stake_slash_logs) = genertor_registry + .decode_event::( + "StakeSlashed", log.topics.clone(), log.data.clone(), - ) { - log::warn!("Compute Lock Released: {:?}", compute_lock_logs); - continue; - } - - log::warn!("unhandled log in generator registry {:?}", log); - return Err("Unhandled log in generator registry".into()); + ) + { + log::warn!("Stake Slashed: {:?}", stake_slash_logs); + let address = stake_slash_logs.generator; + let stake_slashed = stake_slash_logs.stake; + + let block_l2: U256 = log.block_number.unwrap().as_u64().into(); + let block_l1: U256 = get_l1_block_from_l2_block(rpc_url, block_l2) + .await + .unwrap_or_default(); + + generator_store.remove_stake( + &address, + &TEST_TOKEN_ADDRESS_ONE, + &stake_slashed, + U64::from(block_l1.as_u64()), + log.transaction_index.unwrap(), + log.log_index.unwrap(), + tx_to_string(&log.transaction_hash.unwrap()), + delegation::Operation::Slash, + ); + return Ok(()); } - Ok(()) + + log::error!("unhandled log in generator registry {:?}", log); + return Err("Unhandled log in generator registry".into()); } diff --git a/matching_engine/src/log_processor/pm.rs b/matching_engine/src/log_processor/pm.rs index 704d747..1c6a2ea 100644 --- a/matching_engine/src/log_processor/pm.rs +++ b/matching_engine/src/log_processor/pm.rs @@ -1,373 +1,587 @@ +use crate::ask_lib::ask::LocalAsk; +use crate::ask_lib::ask_status::AskState; +use crate::ask_lib::ask_store::LocalAskStore; +use crate::costs::CostStore; +use crate::utility::get_l1_block_from_l2_block; +use crate::utility::get_timestamp_from_l2block_number; +use crate::utility::tx_to_string; +use crate::utility::TokenTracker; +use crate::utility::TEST_TOKEN_ADDRESS_ONE; use ethers::prelude::{k256::ecdsa::SigningKey, *}; use std::sync::Arc; -use tokio::sync::Mutex; +use tokio::sync::RwLock; -use crate::ask::*; -use crate::generator::*; -use crate::secret_inputs_helpers; +use crate::generator_lib::*; +use crate::market_metadata::*; +use kalypso_helper::secret_inputs_helpers; use bindings::proof_marketplace as pmp; use super::constants; +#[allow(clippy::too_many_arguments)] pub async fn process_proof_market_place_logs( - logs: Vec, - proof_market_place: pmp::ProofMarketplace, Wallet>>, - local_ask_store: &Arc>, - generator_store: &Arc>, - market_store: &Arc>, + log: &Log, + proof_market_place: &pmp::ProofMarketplace< + SignerMiddleware, Wallet>, + >, + local_ask_store: &Arc>, + generator_store: &Arc>, + market_store: &Arc>, + cost_store: &Arc>, matching_engine_key: &[u8], + matchin_engine_slave_keys: &Vec>, + rpc_url: &str, ) -> Result<(), Box> { - let mut local_ask_store = local_ask_store.lock().await; - let mut generator_store = generator_store.lock().await; - let mut market_store = market_store.lock().await; - for log in &logs { - if constants::TOPICS_TO_SKIP.get(&log.topics[0]).is_some() { - log::warn!("standard topic to skip found, ignoring it"); - continue; - } + if constants::PROOF_MARKET_TOPICS_SKIP + .get(&log.topics[0]) + .is_some() + { + log::debug!("standard topic to skip found, ignoring it"); + return Ok(()); + } - if let Ok(parsed_ask_created_log) = proof_market_place - .decode_event::( - "AskCreated", - log.topics.clone(), - log.data.clone(), - ) - { - log::debug!("{:?}", parsed_ask_created_log); - let ask_data: (pmp::Ask, _, _, _) = proof_market_place - .list_of_ask(parsed_ask_created_log.ask_id) - .call() - .await - .unwrap(); - - let mut ask_to_store = LocalAsk { - ask_id: parsed_ask_created_log.ask_id, - market_id: ask_data.0.market_id, - reward: ask_data.0.reward, - expiry: ask_data.0.expiry, - proving_time: ask_data.0.time_taken_for_proof_generation, - deadline: ask_data.0.deadline, - prover_refund_address: ask_data.0.refund_address, - prover_data: ask_data.0.prover_data, - has_private_inputs: parsed_ask_created_log.has_private_inputs, - secret_data: None, - secret_acl: None, - state: Some(AskState::Create), - generator: None, - invalid_secret_flag: false, - }; - - // [matching_engine/src/log_processor/pm.rs:63:17] ask_to_store = LocalAsk { - // ask_id: 220, - // market_id: 6, - // reward: 14500000000000000000, - // expiry: 100050812875, - // proving_time: 100000000000, - // deadline: 0, - // prover_refund_address: 0x2f3f64c69b2954ce2f85d1f92a4151bfc71c78ea, - // prover_data: Bytes(0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000003f616c656f31726e3633366739346d783371716866376d37396e736e65336c6c7634647173323537303779687763726b393270306b7772633971653339327767000000000000000000000000000000000000000000000000000000000000000004337536340000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000043175363400000000000000000000000000000000000000000000000000000000), - // has_private_inputs: false, - // secret_data: None, - // secret_acl: None, - // state: Some( - // The ask was created, - // ), - // generator: None, - // invalid_secret_flag: false, - // } - - if parsed_ask_created_log.has_private_inputs { - ask_to_store.secret_data = Some(parsed_ask_created_log.secret_data); - ask_to_store.secret_acl = Some(parsed_ask_created_log.acl); - let secret_inputs = &ask_to_store.clone().secret_data.unwrap(); - let acl = &ask_to_store.clone().secret_acl.unwrap(); - - let decrypted_secret_data = secret_inputs_helpers::decrypt_data_with_ecies_and_aes( - secret_inputs, - acl, - matching_engine_key, - ask_to_store.market_id, - ); + if let Ok(min_proving_time_log) = proof_market_place + .decode_event::( + "UpdateMinProvingTime", + log.topics.clone(), + log.data.clone(), + ) + { + log::debug!("Min Proving Time as market creation param changed"); + log::debug!( + "Secret: {}, New Min Time: {}", + min_proving_time_log.secret_type, + min_proving_time_log.new_proving_time + ); + return Ok(()); + } - if decrypted_secret_data.is_ok() { - ask_to_store.invalid_secret_flag = true; - log::info!( - "Stored private ask with AskId {:?} to store", - parsed_ask_created_log.ask_id - ); - } else { - ask_to_store.state = Some(AskState::InvalidSecret); - log::error!( - "Stored ask with AskId {:?} to store but flagged = false", - parsed_ask_created_log.ask_id - ); - } - local_ask_store.insert(ask_to_store); - } else { - ask_to_store.invalid_secret_flag = true; - // repeated, try to modify if-else logic and work!.. - log::info!( - "Stored {:?} ask to store, Market: {}", - parsed_ask_created_log.ask_id, - &ask_to_store.market_id - ); - local_ask_store.insert(ask_to_store); - } - continue; - } + if let Ok(upgraded_logs) = proof_market_place.decode_event::( + "Upgraded", + log.topics.clone(), + log.data.clone(), + ) { + log::debug!("Implementation {:?}", upgraded_logs.implementation); + return Ok(()); + } - if let Ok(parsed_task_created_log) = proof_market_place - .decode_event::( - "TaskCreated", - log.topics.clone(), - log.data.clone(), - ) - { - log::debug!("{:?}", parsed_task_created_log); + if let Ok(paused_logs) = proof_market_place.decode_event::( + "Paused", + log.topics.clone(), + log.data.clone(), + ) { + log::debug!("Paused {:?}", paused_logs.account); + return Ok(()); + } - let ask_id = parsed_task_created_log.ask_id; - let generator = parsed_task_created_log.generator; - let new_acl = parsed_task_created_log.new_acl; + if let Ok(unpaused_logs) = proof_market_place.decode_event::( + "Unpaused", + log.topics.clone(), + log.data.clone(), + ) { + log::debug!("Unpaused {:?}", unpaused_logs.account); + return Ok(()); + } - local_ask_store.update_ask_generator(&ask_id, Some(generator)); - local_ask_store.update_ask_acl(&ask_id, Some(new_acl)); + if let Ok(parsed_ask_created_log) = proof_market_place.decode_event::( + "AskCreated", + log.topics.clone(), + log.data.clone(), + ) { + log::debug!("{:?}", parsed_ask_created_log); + let mut local_ask_store = { local_ask_store.write().await }; + let ask_data: (pmp::Ask, _, _, _) = proof_market_place + .list_of_ask(parsed_ask_created_log.ask_id) + .call() + .await + .unwrap(); + + let created_on: U256 = log.block_number.unwrap().as_u64().into(); + let created_on_l1: U256 = get_l1_block_from_l2_block(rpc_url, created_on) + .await + .unwrap_or_default(); + + let mut ask_to_store = LocalAsk { + ask_id: parsed_ask_created_log.ask_id, + market_id: ask_data.0.market_id, + reward: ask_data.0.reward, + expiry: ask_data.0.expiry, + deadline: ask_data.0.deadline, + prover_refund_address: ask_data.0.refund_address, + prover_data: ask_data.0.prover_data, + has_private_inputs: parsed_ask_created_log.has_private_inputs, + secret_data: None, + secret_acl: None, + state: Some(AskState::Create), + generator: None, + invalid_secret_flag: false, + created_on: created_on_l1, + time_requested_for_proof_generation: ask_data.0.time_taken_for_proof_generation, + }; + + if parsed_ask_created_log.has_private_inputs { + ask_to_store.secret_data = Some(parsed_ask_created_log.secret_data); + ask_to_store.secret_acl = Some(parsed_ask_created_log.acl); + let secret_inputs = &ask_to_store.clone().secret_data.unwrap(); + let acl = &ask_to_store.clone().secret_acl.unwrap(); + + let mut decrypted_secret_data = secret_inputs_helpers::decrypt_data_with_ecies_and_aes( + secret_inputs, + acl, + matching_engine_key, + Some(ask_to_store.market_id), + ); - let ask_data: (pmp::Ask, u8, H160, H160) = - proof_market_place.list_of_ask(ask_id).call().await.unwrap(); + if decrypted_secret_data.is_err() { + for slave_key in matchin_engine_slave_keys { + decrypted_secret_data = secret_inputs_helpers::decrypt_data_with_ecies_and_aes( + secret_inputs, + acl, + slave_key, + Some(ask_to_store.market_id), + ); - local_ask_store.modify_state(&ask_id, AskState::Assigned); - generator_store.update_state( - &ask_data.3, - &ask_data.0.market_id, - GeneratorState::Joined, - ); + if decrypted_secret_data.is_ok() { + break; + } + } + } - let slashing_penalty = market_store - .get_slashing_penalty_by_market_id(&ask_data.0.market_id) - .unwrap(); - generator_store.update_on_assigned_task( - &ask_data.3, - &ask_data.0.market_id, - slashing_penalty, + if decrypted_secret_data.is_ok() { + ask_to_store.invalid_secret_flag = true; + log::debug!( + "Stored private ask with AskId {:?} to store", + parsed_ask_created_log.ask_id + ); + } else { + ask_to_store.state = Some(AskState::InvalidSecret).to_owned(); + log::warn!( + "Stored ask with AskId {:?} to store but couldn't infer private inputs", + parsed_ask_created_log.ask_id + ); + } + local_ask_store.insert(ask_to_store.to_owned()); + } else { + ask_to_store.invalid_secret_flag = true; + log::debug!( + "Stored {:?} ask to store, Market: {}", + parsed_ask_created_log.ask_id, + &ask_to_store.market_id ); - - continue; + local_ask_store.insert(ask_to_store.to_owned()); } - if let Ok(parsed_proof_created_log) = proof_market_place - .decode_event::( - "ProofCreated", - log.topics.clone(), - log.data.clone(), - ) - { - log::debug!("{:?}", parsed_proof_created_log); - - let ask_id = parsed_proof_created_log.ask_id; - - let ask_data: (pmp::Ask, u8, H160, H160) = - proof_market_place.list_of_ask(ask_id).call().await.unwrap(); - - local_ask_store.modify_state(&ask_id, AskState::Complete); - let generator_address = ask_data.3; - generator_store.update_state( - &generator_address, - &ask_data.0.market_id, - GeneratorState::Joined, - ); + local_ask_store.update_job_created_on_timestamp( + &parsed_ask_created_log.ask_id, + get_timestamp_from_l2block_number(rpc_url, &created_on) + .await + .unwrap_or_default(), + ); + return Ok(()); + } - let slashing_penalty = market_store - .get_slashing_penalty_by_market_id(&ask_data.0.market_id) - .unwrap(); - generator_store.update_on_submit_proof( - &generator_address, - &ask_data.0.market_id, - slashing_penalty, - ); + if let Ok(parsed_task_created_log) = proof_market_place.decode_event::( + "TaskCreated", + log.topics.clone(), + log.data.clone(), + ) { + log::debug!("{:?}", parsed_task_created_log); + let mut local_ask_store = { local_ask_store.write().await }; - continue; - } + let ask_id = parsed_task_created_log.ask_id; + let generator = parsed_task_created_log.generator; + let new_acl = parsed_task_created_log.new_acl; - if let Ok(new_market_place) = proof_market_place.decode_event_raw( - "MarketplaceCreated", - log.topics.clone(), - log.data.clone(), - ) { - log::info!( - "New market place has been registered {:?}", - new_market_place - ); + local_ask_store.update_ask_generator(&ask_id, Some(generator)); + local_ask_store.update_ask_acl(&ask_id, Some(new_acl)); - let market_id_bytes = new_market_place.first().unwrap(); - let market_id = market_id_bytes.clone().into_uint().unwrap(); + local_ask_store.modify_state(&ask_id, AskState::Assigned); - let market = proof_market_place - .market_data(market_id) - .call() + local_ask_store.update_job_matched_on_timestamp( + &ask_id, + get_timestamp_from_l2block_number(rpc_url, &log.block_number.unwrap().as_u64().into()) .await - .unwrap(); - - let market = MarketMetadata { - market_id, - verifier: market.0, - prover_image_id: market.1, - slashing_penalty: market.2, - activation_block: market.3, - ivs_image_id: market.4, - metadata: market.6, - }; + .unwrap_or_default(), + ); - market_store.insert(market.clone()); - // let verification_url = market_store.decode_market_verification_url_by_id(&market_id); + let market_id = { local_ask_store.get_by_ask_id(&ask_id).unwrap().market_id }; - log::debug!("Market added to store: {:?}", market.market_id); + generator_store + .write() + .await + .update_on_assigned_task(&generator.into(), &market_id); - continue; - } + return Ok(()); + } - if let Ok(ask_cancelled_log) = proof_market_place.decode_event::( - "AskCancelled", + if let Ok(parsed_proof_created_log) = proof_market_place + .decode_event::( + "ProofCreated", log.topics.clone(), log.data.clone(), - ) { - log::debug!("Ask has been cancelled {:?}", ask_cancelled_log.ask_id); - local_ask_store.modify_state(&ask_cancelled_log.ask_id, AskState::Complete); - continue; - } + ) + { + log::debug!("{:?}", parsed_proof_created_log); + let mut local_ask_store = { local_ask_store.write().await }; - if let Ok(ask_not_generated) = proof_market_place.decode_event_raw( - "ProofNotGenerated", - log.topics.clone(), - log.data.clone(), - ) { - let ask_id = { - let ask_id_bytes = ask_not_generated.first().unwrap(); - ask_id_bytes.clone().into_uint().unwrap() - }; - log::warn!( - "Ask's proof not generated {:?}. Generator is likely slashed", - ask_id - ); + let ask_id = parsed_proof_created_log.ask_id; + let proof = parsed_proof_created_log.proof; - local_ask_store.modify_state(&ask_id, AskState::Complete); + let proof_cycle_completed_on: U256 = log.block_number.unwrap().as_u64().into(); + let proof_cycle_completed_on_l1: U256 = + get_l1_block_from_l2_block(rpc_url, proof_cycle_completed_on) + .await + .unwrap_or_default(); - let ask_data: (pmp::Ask, u8, H160, H160) = - proof_market_place.list_of_ask(ask_id).call().await.unwrap(); + local_ask_store.update_proof_proof_cycle_completed_on(&ask_id, proof_cycle_completed_on_l1); + local_ask_store.modify_state(&ask_id, AskState::Complete); - log::debug!("Proof not Generated: update generator state"); - let generator_address = ask_data.3; - generator_store.update_state( - &generator_address, - &ask_data.0.market_id, - GeneratorState::Joined, - ); + local_ask_store.update_job_completed_on_timestamp( + &ask_id, + get_timestamp_from_l2block_number(rpc_url, &proof_cycle_completed_on) + .await + .unwrap_or_default(), + ); + + let (generator_address, market_id) = { + let data = local_ask_store.get_by_ask_id(&ask_id).unwrap(); + let generator_address = data.generator.unwrap().into(); + let market_id = data.market_id; + (generator_address, market_id) + }; + + let proof_generator_cost = generator_store + .read() + .await + .get_by_address_and_market(&generator_address, &market_id) + .map_or(U256::from(0), |generator_info| { + generator_info.proof_generation_cost.clone() + }); + + let created_on = { local_ask_store.get_by_ask_id(&ask_id).unwrap().created_on }; + let proof_time = proof_cycle_completed_on_l1.saturating_sub(created_on); + + local_ask_store.store_valid_proof( + &ask_id, + proof, + proof_time, + proof_generator_cost, + tx_to_string(&log.transaction_hash.unwrap()), + ); + local_ask_store.remove_ask_only_if_completed(&ask_id); - log::debug!("Proof not Generated: update on slashing penalty"); - let slashing_penalty = market_store - .get_slashing_penalty_by_market_id(&ask_data.0.market_id) - .unwrap(); - generator_store.update_on_slashing( + { + generator_store.write().await.update_on_submit_proof( &generator_address, - &ask_data.0.market_id, - slashing_penalty, + &market_id, + &proof_generator_cost, + &proof_cycle_completed_on_l1.as_u64().into(), ); - - log::warn!("Complete Proof not Generated"); - continue; } - if let Ok(invalid_inputs_detected_log) = proof_market_place.decode_event_raw( - "InvalidInputsDetected", - log.topics.clone(), - log.data.clone(), - ) { - let ask_id_bytes = invalid_inputs_detected_log.first().unwrap(); - let ask_id = ask_id_bytes.clone().into_uint().unwrap(); - - log::warn!( - "Ask's inputs were wrong {:?}. Submiting proof of invalid input", - ask_id + { + market_store.write().await.note_proof_submission_stats( + &market_id, + proof_time, + proof_generator_cost, ); - local_ask_store.modify_state(&ask_id, AskState::Complete); - - let ask_data: (pmp::Ask, u8, H160, H160) = - proof_market_place.list_of_ask(ask_id).call().await.unwrap(); + } + return Ok(()); + } - let generator_address = ask_data.3; - generator_store.update_state( - &generator_address, - &ask_data.0.market_id, - GeneratorState::Joined, - ); + if let Ok(new_market_place) = proof_market_place.decode_event_raw( + "MarketplaceCreated", + log.topics.clone(), + log.data.clone(), + ) { + log::warn!("Decode Raw Event is being used to detect MarketplaceCreated"); + log::warn!("fix this to ensure that you receive all errors during compilation"); + log::info!( + "New market place has been registered {:?}", + new_market_place + ); + + let market_id_bytes = new_market_place.first().unwrap(); + let market_id = market_id_bytes.clone().into_uint().unwrap(); + + let market = proof_market_place + .market_data(market_id) + .call() + .await + .unwrap(); + + let market = MarketMetadata { + market_id, + verifier: market.0, + prover_image_id: market.1, + slashing_penalty: { + let mut slashing_penalty = TokenTracker::new(); + slashing_penalty.add_token(&TEST_TOKEN_ADDRESS_ONE, &market.2); + slashing_penalty + }, + activation_block: market.3, + ivs_image_id: market.4, + metadata: market.6, + }; - let slashing_penalty = market_store - .get_slashing_penalty_by_market_id(&ask_data.0.market_id) - .unwrap(); - generator_store.update_on_submit_proof( - &generator_address, - &ask_data.0.market_id, - slashing_penalty, - ); - log::warn!("Complete invalid input proof submitted"); - continue; + { + market_store.write().await.insert(market.clone()); } - if let Ok(update_cost_per_byte_log) = proof_market_place - .decode_event::( - "UpdateCostPerBytes", - log.topics.clone(), - log.data.clone(), - ) - { - let secret_type = update_cost_per_byte_log.secret_type; - let cost_per_byte = update_cost_per_byte_log.cost_per_input_bytes; + log::debug!("Market added to store: {:?}", market.market_id); - log::info!( - "Cost per input byte changed to {:?} for input {:?}", - cost_per_byte, - secret_type - ); - continue; - } + return Ok(()); + } - if let Ok(upgraded_logs) = proof_market_place.decode_event::( - "Upgraded", + if let Ok(prover_image_added_log) = proof_market_place + .decode_event::( + "AddExtraProverImage", log.topics.clone(), log.data.clone(), - ) { - log::debug!("Implementation {:?}", upgraded_logs.implementation); - continue; - } + ) + { + log::warn!( + "Added prover image: {} to marketplace: {}", + hex::encode(prover_image_added_log.image_id), + prover_image_added_log.market_id + ); + log::warn!("Not indexing AddExtraProverImage to market right now"); + return Ok(()); + } - if let Ok(paused_logs) = proof_market_place.decode_event::( - "Paused", + if let Ok(prover_image_removed_log) = proof_market_place + .decode_event::( + "RemoveExtraProverImage", log.topics.clone(), log.data.clone(), - ) { - log::debug!("Paused {:?}", paused_logs.account); - continue; - } + ) + { + log::warn!( + "Removed prover image: {} from marketplace: {}", + hex::encode(prover_image_removed_log.image_id), + prover_image_removed_log.market_id + ); + log::warn!("Not indexing RemoveExtraProverImage to market right now"); + return Ok(()); + } - if let Ok(unpaused_logs) = proof_market_place.decode_event::( - "Unpaused", + if let Ok(ivs_image_added_log) = proof_market_place.decode_event::( + "AddExtraIVSImage", + log.topics.clone(), + log.data.clone(), + ) { + log::warn!( + "Add ivs image: {} to marketplace: {}", + hex::encode(ivs_image_added_log.image_id), + ivs_image_added_log.market_id + ); + log::warn!("Not indexing AddExtraIVSImage from market right now"); + return Ok(()); + } + + if let Ok(ivs_image_removed_log) = proof_market_place + .decode_event::( + "RemoveExtraIVSImage", log.topics.clone(), log.data.clone(), - ) { - log::debug!("Unpaused {:?}", unpaused_logs.account); - continue; - } + ) + { + log::warn!( + "Removed ivs image: {} from marketplace: {}", + hex::encode(ivs_image_removed_log.image_id), + ivs_image_removed_log.market_id + ); + log::warn!("Not indexing RemoveExtraIVSImage from market right now"); + return Ok(()); + } + + if let Ok(ask_cancelled_log) = proof_market_place.decode_event::( + "AskCancelled", + log.topics.clone(), + log.data.clone(), + ) { + log::debug!("Ask has been cancelled {:?}", ask_cancelled_log.ask_id); + let mut local_ask_store = { local_ask_store.write().await }; + + let proof_cycle_completed_on: U256 = log.block_number.unwrap().as_u64().into(); + let proof_cycle_completed_on_l1: U256 = + get_l1_block_from_l2_block(rpc_url, proof_cycle_completed_on) + .await + .unwrap_or_default(); + + local_ask_store.update_proof_proof_cycle_completed_on( + &ask_cancelled_log.ask_id, + proof_cycle_completed_on_l1, + ); + local_ask_store.modify_state(&ask_cancelled_log.ask_id, AskState::Complete); + local_ask_store.remove_ask_only_if_completed(&ask_cancelled_log.ask_id); + return Ok(()); + } + + if let Ok(ask_not_generated) = proof_market_place.decode_event_raw( + "ProofNotGenerated", + log.topics.clone(), + log.data.clone(), + ) { + let ask_id = ask_not_generated + .get(0) + .unwrap() + .clone() + .into_uint() + .unwrap(); + + log::warn!("Decode Raw Event is being used to detect ProofNotGenerated"); + log::warn!("Avoid it get error during compilation itself"); + log::warn!( + "Ask's proof not generated {:?}. Generator is likely slashed", + ask_id + ); + let mut local_ask_store = { local_ask_store.write().await }; + + let proof_cycle_completed_on: U256 = log.block_number.unwrap().as_u64().into(); + let proof_cycle_completed_on_l1: U256 = + get_l1_block_from_l2_block(rpc_url, proof_cycle_completed_on) + .await + .unwrap_or_default(); + + local_ask_store.update_proof_proof_cycle_completed_on(&ask_id, proof_cycle_completed_on_l1); + local_ask_store.modify_state(&ask_id, AskState::Complete); + local_ask_store.note_proof_denied(&ask_id, tx_to_string(&log.transaction_hash.unwrap())); + + log::debug!("Proof not Generated: update generator state"); + let (generator_address, market_id) = { + let data = local_ask_store.get_by_ask_id(&ask_id).unwrap(); + let generator_address = data.generator.unwrap().into(); + let market_id = data.market_id; + (generator_address, market_id) + }; + + let market_data = { + market_store + .read() + .await + .get_market_by_market_id(&market_id) + }; + log::debug!("Proof not Generated: update on slashing penalty"); + + let ask = local_ask_store.get_by_ask_id(&ask_id).unwrap(); + local_ask_store.remove_ask_only_if_completed(&ask_id); + + let slashing_token_pairs = market_data + .unwrap() + .slashing_penalty + .to_address_token_pair(); + + let (slashing_tokens, slashings): (Vec
, Vec) = + slashing_token_pairs.into_iter().unzip(); + + generator_store.write().await.update_on_slashing( + &generator_address, + slashing_tokens, + &ask_id, + &ask.market_id, + slashings, + tx_to_string(&log.transaction_hash.unwrap()), + &ask.reward, + &ask.deadline, + &U64::from(proof_cycle_completed_on_l1.as_u64()), + &get_timestamp_from_l2block_number(rpc_url, &proof_cycle_completed_on) + .await + .unwrap_or_default(), + ); + + log::warn!("Complete Proof not Generated"); + return Ok(()); + } + + if let Ok(invalid_inputs_detected_log) = proof_market_place.decode_event_raw( + "InvalidInputsDetected", + log.topics.clone(), + log.data.clone(), + ) { + log::warn!("Decode Raw Event is being used to detect InvalidInputsDetected"); + log::warn!("fix this to ensure that you receive all errors during compilation"); + + let ask_id = invalid_inputs_detected_log + .get(0) + .unwrap() + .clone() + .into_uint() + .unwrap(); + + log::warn!( + "Ask's inputs were wrong {:?}. Submitted attestation for invalid input", + ask_id + ); + let mut local_ask_store = { local_ask_store.write().await }; + + let proof_cycle_completed_on: U256 = log.block_number.unwrap().as_u64().into(); + let proof_cycle_completed_on_l1: U256 = + get_l1_block_from_l2_block(rpc_url, proof_cycle_completed_on) + .await + .unwrap_or_default(); + local_ask_store.update_proof_proof_cycle_completed_on(&ask_id, proof_cycle_completed_on_l1); + local_ask_store.modify_state(&ask_id, AskState::Complete); + local_ask_store.note_invalid_inputs(&ask_id, tx_to_string(&log.transaction_hash.unwrap())); + + local_ask_store.update_job_completed_on_timestamp( + &ask_id, + get_timestamp_from_l2block_number(rpc_url, &proof_cycle_completed_on) + .await + .unwrap_or_default(), + ); + + let (generator_address, market_id) = { + let data = local_ask_store.get_by_ask_id(&ask_id).unwrap(); + let generator_address = data.generator.unwrap().into(); + let market_id = data.market_id; + (generator_address, market_id) + }; + + local_ask_store.remove_ask_only_if_completed(&ask_id); - if let Ok(initialized_logs) = - proof_market_place.decode_event_raw("Initialized", log.topics.clone(), log.data.clone()) { - log::warn!("Version: {:?}", initialized_logs); - continue; + let proof_generator_cost = generator_store + .read() + .await + .get_by_address_and_market(&generator_address, &market_id) + .map_or(U256::from(0), |generator_info| { + generator_info.proof_generation_cost.clone() + }); + + generator_store.write().await.update_on_submit_proof( + &generator_address, + &market_id, + &proof_generator_cost, + &proof_cycle_completed_on_l1.as_u64().into(), + ); } + log::warn!("Complete: invalid input attestation event operation"); + return Ok(()); + } - log::warn!("unhandled log in proof market place {:?}", log); - return Err("Unhandled log in proof market place".into()); + if let Ok(update_cost_per_byte_log) = proof_market_place + .decode_event::( + "UpdateCostPerBytes", + log.topics.clone(), + log.data.clone(), + ) + { + let secret_type = update_cost_per_byte_log.secret_type; + let cost_per_byte = update_cost_per_byte_log.cost_per_input_bytes; + + cost_store.write().await.upsert(secret_type, cost_per_byte); + + log::info!( + "Cost per input byte changed to {:?} for input {:?}", + cost_per_byte, + secret_type + ); + return Ok(()); } - Ok(()) + + log::error!("unhandled log in proof market place {:?}", log); + return Err("Unhandled log in proof market place".into()); } diff --git a/matching_engine/src/main.rs b/matching_engine/src/main.rs index d05fcd3..26af763 100644 --- a/matching_engine/src/main.rs +++ b/matching_engine/src/main.rs @@ -1,35 +1,7 @@ -use ask::{LocalAskStore, MarketMetadataStore}; -use dotenv::dotenv; -use ethers::prelude::*; -use generator::{GeneratorStore, KeyStore}; -use jobs::cleanup::CleanupTool; -use jobs::parser::LogParser; -use jobs::server::MatchingEngineServer; -use secret_input_helpers::secret_inputs_helpers; -use serde::{Deserialize, Serialize}; -use std::sync::atomic::{AtomicBool, Ordering}; -use std::{fs, str::FromStr, sync::Arc}; -use tokio::sync::Mutex; - -mod ask; -mod generator; -mod jobs; -mod log_processor; -mod middlewares; -mod routes; -mod utility; +use std::fs; -#[derive(Debug, Serialize, Deserialize, Clone)] -struct MatchingEngineConfig { - rpc_url: String, - chain_id: String, - matching_engine_key: String, - relayer_private_key: String, - proof_market_place: String, - generator_registry: String, - entity_registry: String, - start_block: String, -} +use dotenv::dotenv; +use matching_engine::{MatchingEngine, MatchingEngineConfig}; #[tokio::main] async fn main() -> Result<(), Box> { @@ -44,156 +16,12 @@ async fn main() -> Result<(), Box> { .or_else(|_| fs::read_to_string(&alt_matching_engine_config_path))?; let config: MatchingEngineConfig = serde_json::from_str(&file_content)?; - let local_ask_store = LocalAskStore::new(); - let generator_list_store = GeneratorStore::new(); - let key_list_store = KeyStore::new(); - let market_list_store = MarketMetadataStore::new(); - - // wrapping around is case to shared across threads - let shared_local_ask_store = Arc::new(Mutex::new(local_ask_store)); - let shared_generator_store = Arc::new(Mutex::new(generator_list_store)); - let shared_market_store = Arc::new(Mutex::new(market_list_store)); - let shared_key_store = Arc::new(Mutex::new(key_list_store)); - - let rpc_url = config.rpc_url; - let chain_id = config.chain_id; - - let matching_engine_key = config.matching_engine_key; - let matching_engine_signer = matching_engine_key - .parse::() - .unwrap() - .with_chain_id(U64::from_dec_str(&chain_id).unwrap().as_u64()); - - let relayer_key = config.relayer_private_key; - let relayer_signer = relayer_key - .parse::() - .unwrap() - .with_chain_id(U64::from_dec_str(&chain_id).unwrap().as_u64()); - - let start_block_string = config.start_block; - - log::info!( - "matching engine address {:?}", - matching_engine_signer.clone().address() - ); - - log::info!("relayer address {:?}", relayer_signer.clone().address()); - - let provider_http = Provider::::try_from(&rpc_url) - .unwrap() - // .with_signer(matching_engine_signer.clone()); - .with_signer(relayer_signer.clone()); - let client = Arc::new(provider_http.clone()); - - // Creating contract instance for proof market place - let proof_market_place_var = config.proof_market_place; - let proof_marketplace_address = Address::from_str(&proof_market_place_var).unwrap(); - - let proof_marketplace = bindings::proof_marketplace::ProofMarketplace::new( - proof_marketplace_address, - client.clone(), - ); - - // Creating contract instance for generator registry - let generator_registry_var = config.generator_registry; - let generator_registry_address = Address::from_str(&generator_registry_var).unwrap(); - - let generator_registry = bindings::generator_registry::GeneratorRegistry::new( - generator_registry_address, - client.clone(), - ); - - let entity_key_registry_var = config.entity_registry; - let entity_key_registry_address = Address::from_str(&entity_key_registry_var).unwrap(); - - let entity_key_registry = bindings::entity_key_registry::EntityKeyRegistry::new( - entity_key_registry_address, - client.clone(), - ); - - let shared_entity_key_registry = bindings::entity_key_registry::EntityKeyRegistry::new( - entity_key_registry_address, - client.clone(), - ); - let shared_entity_key = Arc::new(Mutex::new(shared_entity_key_registry)); - let clone_shared_entity_key = Arc::clone(&shared_entity_key); - - let shared_parsed_store = Arc::new(Mutex::new( - U64::from_dec_str(&start_block_string).expect("Unable to rad start_block"), - )); - let shared_parsed_block = Arc::clone(&shared_parsed_store); - - let shared_market_data = Arc::clone(&shared_market_store); - let shared_generator_data = Arc::clone(&shared_generator_store); - let shared_local_ask_data = Arc::clone(&shared_local_ask_store); - - let matching_engine_key_for_server = hex::decode(matching_engine_key.clone()).unwrap(); - let shared_matching_key = Arc::new(Mutex::new(matching_engine_key_for_server)); - let shared_matching_key_clone = Arc::clone(&shared_matching_key); - - let should_stop = Arc::new(AtomicBool::new(false)); - let stop_handle = should_stop.clone(); - - let mut handles = vec![]; - - let ctrl_c_handle = tokio::spawn(async move { - tokio::signal::ctrl_c().await.unwrap(); - stop_handle.store(true, Ordering::Release); - Ok(()) - }); - handles.push(ctrl_c_handle); - - let server = MatchingEngineServer::new( - shared_market_data, - shared_local_ask_data, - shared_parsed_block.clone(), - shared_matching_key_clone, - clone_shared_entity_key, - shared_generator_data, - ); - - let server_handle = tokio::spawn(server.start_server()); - handles.push(server_handle); - - let confirmations = 10; // ideally this should be more - let block_range = 20000; // Number of blocks to fetch logs from at once - let parser = Arc::new(LogParser::new( - should_stop.clone(), - rpc_url, - relayer_signer, - shared_parsed_block, - block_range.into(), - confirmations.into(), - proof_marketplace.clone(), - generator_registry, - entity_key_registry, - matching_engine_key, - shared_local_ask_store.clone(), - shared_generator_store, - shared_market_store, - shared_key_store, - chain_id, - )); - - let parser_handle = tokio::spawn(async move { - parser.parse().await.unwrap(); - Ok(()) - }); - - handles.push(parser_handle); - - let cleanup_tool = CleanupTool::new(should_stop, shared_local_ask_store, proof_marketplace); - let cleanup_handle = tokio::spawn(async move { - cleanup_tool.ask_store_cleanup().await.unwrap(); - Ok(()) - }); - handles.push(cleanup_handle); - - for handle in handles { - let _ = handle.await; - } + let indexer_port = + std::env::var("INDEXER_PORT").expect(&format!("{} is not set", "INDEXER_PORT")); + let indexer_port: Option = indexer_port.parse().ok(); - println!("All tasks completed or shutdown."); + let matching_engine = MatchingEngine::from_config(config, indexer_port); + let _ = matching_engine.run().await; Ok(()) } diff --git a/matching_engine/src/market_metadata.rs b/matching_engine/src/market_metadata.rs new file mode 100644 index 0000000..76fac85 --- /dev/null +++ b/matching_engine/src/market_metadata.rs @@ -0,0 +1,209 @@ +use ethers::core::types::U256; +use ethers::prelude::*; +use serde::{Deserialize, Serialize}; +use std::collections::HashMap; + +use crate::{ + counters::median_counter::MedianCounter, + utility::{AddressTokenPair, TokenTracker}, +}; + +#[derive(Debug, Serialize, Deserialize, Clone, Default)] +#[serde(rename_all = "camelCase")] +pub struct MarketSetupData { + /// The display name of the zkApp. + #[serde(alias = "zk_app_name")] + zk_app_name: Option, + + /// URL to the prover code repository or resource. + #[serde(alias = "prover_code")] + prover_code: Option, + + /// URL to the verifier code repository or resource. + #[serde(alias = "verifier_code")] + verifier_code: Option, + + /// URL to the prover Oyster image or related resource. + #[serde(alias = "prover_oyster_image")] + prover_oyster_image: Option, + + /// URL to the input/output verifier, optional for private markets. + #[serde(alias = "input_output_verifier_url")] + input_output_verifier_url: Option, + + /// A brief description of the zkApp. + description: Option, + + /// The version of the zkApp. + version: Option, + + /// URL to the official website of the zkApp. + website: Option, + + /// Twitter handle or URL related to the zkApp. + twitter: Option, + + /// Discord invite link or server URL for the zkApp community. + discord: Option, + + /// GitHub repository URL for the zkApp. + github: Option, + + /// License information for the zkApp (e.g., MIT, GPL). + license: Option, + + /// Categories that classify the zkApp. + #[serde(default)] + categories: Option>, + + /// Tags for better searchability and organization. + #[serde(default)] + tags: Vec, + + /// Contact email for support or inquiries. + contact_email: Option, + + /// URL to the Terms of Service. + #[serde(alias = "terms_of_service_url")] + terms_of_service_url: Option, + + /// URL to the Privacy Policy. + #[serde(alias = "privacy_policy_url")] + privacy_policy_url: Option, +} + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +pub struct MarketMetadata { + pub market_id: U256, + pub verifier: Address, + pub prover_image_id: [u8; 32], + pub slashing_penalty: TokenTracker, + pub activation_block: U256, + pub ivs_image_id: [u8; 32], + pub metadata: Bytes, +} + +impl MarketMetadata { + /// Deserializes the raw metadata bytes into a `MarketSetupData` struct. + /// + /// If deserialization fails at any step, it returns a default `MarketSetupData` instance. + pub fn deserialize_market_bytes(&self) -> MarketSetupData { + // Convert bytes to a UTF-8 string. If conversion fails, use an empty JSON object. + let json_str = std::str::from_utf8(&self.metadata).unwrap_or("{}"); + + // Deserialize JSON string into `MarketSetupData` struct. + // If deserialization fails, return the default `MarketSetupData`. + serde_json::from_str(json_str).unwrap_or_default() + } +} + +pub struct MarketMetadataStore { + market_by_id: HashMap, + median_proof_time_tracker: MedianCounter, // + median_proof_cost_tracker: MedianCounter, // + earnings: HashMap, // market to usdc earning +} + +impl Default for MarketMetadataStore { + fn default() -> Self { + Self::new() + } +} + +impl MarketMetadataStore { + pub fn count_markets(&self) -> usize { + self.market_by_id.len() + } + + pub fn get_all_markets(&self) -> Vec { + self.market_by_id.values().cloned().collect() + } +} + +impl MarketMetadataStore { + pub fn note_proof_submission_stats( + &mut self, + market_id: &U256, + proof_time: U256, + proof_cost: U256, + ) { + // Minimize lock time by splitting into smaller steps + self.median_proof_cost_tracker + .insert(market_id.clone(), proof_cost); + + self.median_proof_time_tracker + .insert(market_id.clone(), proof_time); + + if let Some(existing_earning) = self.earnings.get_mut(market_id) { + *existing_earning = existing_earning.saturating_add(proof_cost); + } else { + self.earnings.insert(*market_id, proof_cost); + } + } + + pub fn get_median_proof_time(&self) -> U256 { + self.median_proof_time_tracker + .median_all() + .unwrap_or_else(U256::zero) + } + + pub fn get_median_proof_time_market_wise(&self, market_id: &U256) -> U256 { + self.median_proof_time_tracker + .median_by_key(market_id) + .unwrap_or_else(U256::zero) + } + + pub fn get_median_proof_cost(&self) -> U256 { + self.median_proof_cost_tracker + .median_all() + .unwrap_or_else(U256::zero) + } + + pub fn get_median_proof_cost_market_wise(&self, market_id: &U256) -> U256 { + self.median_proof_cost_tracker + .median_by_key(market_id) + .unwrap_or_else(U256::zero) + } +} + +impl MarketMetadataStore { + pub fn new() -> Self { + MarketMetadataStore { + market_by_id: HashMap::new(), + median_proof_cost_tracker: MedianCounter::new(), + median_proof_time_tracker: MedianCounter::new(), + earnings: HashMap::new(), + } + } + + pub fn insert(&mut self, market: MarketMetadata) { + // Insert market metadata, minimizing lock time + self.market_by_id.insert(market.market_id, market); + } + + #[allow(unused)] + pub fn remove_by_market_id(&mut self, market_id: &U256) { + // Remove market metadata + self.market_by_id.remove(market_id); + } + + pub fn get_market_by_market_id(&self, market_id: &U256) -> Option { + // Retrieve market metadata without holding a lock for too long + self.market_by_id.get(market_id).cloned() + } + + pub fn get_slashing_penalty_by_market_id(&self, market_id: &U256) -> Vec { + // Safely access market metadata to retrieve the slashing penalty + self.market_by_id + .get(market_id) + .map(|metadata| metadata.slashing_penalty.to_address_token_pair()) + .unwrap_or_default() + } +} + +impl MarketMetadataStore { + pub fn get_earnings(&self, market_id: &U256) -> Option { + // Safely access the earnings map + self.earnings.get(market_id).cloned() + } +} diff --git a/matching_engine/src/middlewares/mod.rs b/matching_engine/src/middlewares/mod.rs deleted file mode 100644 index 8f8380f..0000000 --- a/matching_engine/src/middlewares/mod.rs +++ /dev/null @@ -1 +0,0 @@ -pub mod ratelimiter; diff --git a/matching_engine/src/models.rs b/matching_engine/src/models.rs new file mode 100644 index 0000000..5ae1723 --- /dev/null +++ b/matching_engine/src/models.rs @@ -0,0 +1,115 @@ +use serde::{Deserialize, Serialize}; + +use crate::{ + ask_lib::ask_status::{AskState, LocalAskStatus}, + generator_lib::generator_state::GeneratorState, + utility::TokenTracker, +}; + +#[derive(Deserialize, Serialize, Debug, Clone)] +pub struct DecryptRequest { + pub market_id: String, + pub private_input: String, + pub acl: String, + pub signature: String, + pub ivs_pubkey: String, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct GetRequestResponse { + pub encrypted_data: String, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct WelcomeResponse { + pub status: String, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct GetLatestBlockNumberResponse { + pub block_number: String, +} + +#[derive(Serialize, Deserialize, Debug)] +pub struct GetStatusResponse { + pub local_ask_status: LocalAskStatus, +} + +#[derive(Serialize, Deserialize, Debug)] +pub struct GetAskStatus { + pub ask_id: String, +} + +#[derive(Serialize, Deserialize, Debug)] +pub struct GetAskStatusResponse { + pub state: String, +} + +#[derive(Serialize, Deserialize, Debug)] +pub struct GetProofResponse { + pub status: String, + pub proof: Vec, +} + +#[derive(Serialize, Deserialize, Debug)] +pub struct MarketInfo { + pub market_id: String, +} + +#[derive(Serialize, Deserialize)] +pub struct MarketInfoResponse { + pub market_info: String, + pub asks: Option>, + pub generator_info: Option, +} + +use ethers::core::types::{Address, U256}; + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, PartialOrd)] +pub struct AskInfoToSend { + pub ask_id: U256, + pub market_id: U256, + pub reward: U256, + pub expiry: U256, + pub proving_time: Option, + pub deadline: U256, + pub has_private_inputs: bool, + pub state: Option, + pub generator: Option
, +} + +#[derive(Serialize, Deserialize)] +pub struct GeneratorInfo { + pub generator_address: Address, + pub stake_locked: TokenTracker, + pub total_stake: TokenTracker, + pub compute_consumed: U256, + pub declared_compute: U256, + pub compute_required_per_request: U256, + pub proof_generation_cost: U256, + pub proposed_time: U256, + pub active_requests: U256, + pub proofs_submitted: U256, + pub state: Option, +} + +#[derive(Serialize, Deserialize)] +pub struct GeneratorsInfoForMarket { + pub count: i32, + pub generators: Vec, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct BalanceResponse { + pub balance: Option, + pub status: String, +} + +#[derive(Serialize, Deserialize)] +pub struct MarketStatsResponse { + pub market_info: String, + pub generator_count: Option, + pub proofs_generated: Option, + pub proofs_pending: Option, + pub proofs_in_progress: Option, +} diff --git a/matching_engine/src/routes/ask_status.rs b/matching_engine/src/routes/ask_status.rs index 8fd09ab..ddb54c6 100644 --- a/matching_engine/src/routes/ask_status.rs +++ b/matching_engine/src/routes/ask_status.rs @@ -1,61 +1,134 @@ -use crate::ask::*; +use crate::{ + ask_lib::{ + ask_status::AskState, + ask_store::{LocalAskStore, Proof}, + }, + models::{ + GetAskStatus, GetAskStatusResponse, GetProofResponse, GetStatusResponse, WelcomeResponse, + }, +}; use actix_web::web; use actix_web::web::Data; use actix_web::HttpResponse; use ethers::core::types::U256; -use serde::{Deserialize, Serialize}; use std::sync::Arc; -use tokio::sync::Mutex; +use tokio::sync::RwLock; -#[derive(Serialize)] -struct GetStatusResponse { - local_ask_status: LocalAskStatus, -} - -#[derive(Deserialize)] -pub struct GetAskStatus { - ask_id: String, -} +pub async fn get_status( + _local_ask_store: Data>>, +) -> actix_web::Result { + let local_ask_store = { + match _local_ask_store.try_read() { + Ok(data) => data, + _ => { + return Ok(HttpResponse::Locked().json(WelcomeResponse { + status: "Resource Busy".into(), + })) + } + } + }; -#[derive(Serialize)] -pub struct GetAskStatusResponse { - state: String, + return Ok(HttpResponse::Ok().json(GetStatusResponse { + local_ask_status: local_ask_store.get_ask_status(), + })); } -pub async fn get_status( - _local_ask_store: Data>>, +pub async fn get_ask_proof_by_ask_id( + _payload: web::Json, + _local_ask_store: Data>>, ) -> actix_web::Result { - let local_ask_store = _local_ask_store.lock().await; + let ask_id: String = _payload.ask_id.clone(); + let ask_id_u256: U256 = U256::from_dec_str(&ask_id).expect("Failed to parse string"); + let local_ask_store = { + match _local_ask_store.try_read() { + Ok(data) => data, + _ => { + return Ok(HttpResponse::Locked().json(WelcomeResponse { + status: "Resource Busy".into(), + })) + } + } + }; - Ok(HttpResponse::Ok().json(GetStatusResponse { - local_ask_status: local_ask_store.get_ask_status(), - })) + let proof = local_ask_store.get_proof_by_ask_id(&ask_id_u256); + + match proof { + Some(proof) => match proof { + Proof::ValidProof(valid_proof) => { + return Ok(HttpResponse::Ok().json(GetProofResponse { + status: "Found".into(), + proof: valid_proof.to_vec(), + })) + } + Proof::InvalidInputAttestation => { + return Ok(HttpResponse::NotFound().json(GetProofResponse { + status: "Invalid Inputs Detected".into(), + proof: vec![], + })) + } + Proof::FailedProofGeneration => { + return Ok(HttpResponse::ExpectationFailed().json(GetProofResponse { + status: "Proof Request was not completed by generator".into(), + proof: vec![], + })) + } + }, + _ => { + return Ok(HttpResponse::NotFound().json(GetProofResponse { + status: "Not Found".into(), + proof: vec![], + })) + } + } } pub async fn get_ask_status_askid( _payload: web::Json, - _local_ask_store: Data>>, + _local_ask_store: Data>>, ) -> actix_web::Result { - let local_ask_store = _local_ask_store.lock().await; + let local_ask_store = { + match _local_ask_store.try_read() { + Ok(data) => data, + _ => { + return Ok(HttpResponse::Locked().json(WelcomeResponse { + status: "Resource Busy".into(), + })) + } + } + }; + let ask_id: String = _payload.ask_id.clone(); let ask_id_u256: U256 = U256::from_dec_str(&ask_id).expect("Failed to parse string"); - let local_ask: Option<&LocalAsk> = local_ask_store.get_by_ask_id(&ask_id_u256); + let local_ask = match local_ask_store.get_by_ask_id(&ask_id_u256) { + Some(data) => data, + None => { + return Ok(HttpResponse::NotFound().json(GetAskStatusResponse { + state: "Request Not Found".to_owned(), + })) + } + }; - let ask_state_enum: Option = local_ask.unwrap().state; + let ask_state_enum = match local_ask.state { + Some(data) => data, + None => { + return Ok(HttpResponse::NotFound().json(GetAskStatusResponse { + state: "Request State Not Found".to_owned(), + })) + } + }; let ask_state = match ask_state_enum { - Some(AskState::Null) => "NULL", - Some(AskState::Create) => "Create", - Some(AskState::UnAssigned) => "UnAssigned", - Some(AskState::Assigned) => "Assigned", - Some(AskState::Complete) => "Complete", - Some(AskState::DeadlineCrossed) => "DeadlineCrossed", - Some(AskState::InvalidSecret) => "InvalidSecret", - None => "None", // Handle the None case + AskState::Null => "NULL", + AskState::Create => "Create", + AskState::UnAssigned => "UnAssigned", + AskState::Assigned => "Assigned", + AskState::Complete => "Complete", + AskState::DeadlineCrossed => "DeadlineCrossed", + AskState::InvalidSecret => "InvalidSecret", }; - Ok(HttpResponse::Ok().json(GetAskStatusResponse { + return Ok(HttpResponse::Ok().json(GetAskStatusResponse { state: ask_state.to_owned(), - })) + })); } diff --git a/matching_engine/src/routes/chain_status.rs b/matching_engine/src/routes/chain_status.rs index 1ff0abf..6a71e64 100644 --- a/matching_engine/src/routes/chain_status.rs +++ b/matching_engine/src/routes/chain_status.rs @@ -1,31 +1,58 @@ +use crate::models::{BalanceResponse, GetLatestBlockNumberResponse, WelcomeResponse}; use actix_web::web::Data; use actix_web::HttpResponse; -use serde::Serialize; use std::sync::Arc; -use tokio::sync::Mutex; +use tokio::sync::RwLock; -use ethers::core::types::U64; - -#[derive(Serialize)] -pub struct GetLatestBlockNumberResponse { - block_number: String, -} +use ethers::{core::types::U64, types::U256}; pub async fn get_latest_block_number( - _shared_parsed_block: Data>>, + _shared_parsed_block: Data>>, ) -> actix_web::Result { - let latest_parsed_block = _shared_parsed_block.lock().await; + let latest_parsed_block = { + match _shared_parsed_block.try_read() { + Ok(data) => data, + _ => { + return Ok(HttpResponse::Locked().json(WelcomeResponse { + status: "Resource Busy".into(), + })) + } + } + }; - Ok(HttpResponse::Ok().json(GetLatestBlockNumberResponse { + return Ok(HttpResponse::Ok().json(GetLatestBlockNumberResponse { block_number: latest_parsed_block.to_string(), - })) + })); } -#[derive(Serialize)] -struct WelcomeResponse { - status: &'static str, +pub async fn welcome() -> actix_web::Result { + return Ok(HttpResponse::Ok().json(WelcomeResponse { + status: "ok".into(), + })); } -pub async fn welcome() -> actix_web::Result { - Ok(HttpResponse::Ok().json(WelcomeResponse { status: "ok" })) +pub async fn gas_key_balance(balance: Data>>) -> actix_web::Result { + let threshold = U256::from_dec_str("10000000000000").unwrap(); + let data = { + match balance.try_read() { + Ok(data) => *data, + _ => { + return Ok(HttpResponse::Locked().json(WelcomeResponse { + status: "Resource Busy".into(), + })) + } + } + }; + + if data > threshold { + return Ok(HttpResponse::Ok().json(BalanceResponse { + status: "ok".into(), + balance: Some(data), + })); + } else { + return Ok(HttpResponse::ExpectationFailed().json(BalanceResponse { + status: "less balance".into(), + balance: Some(data), + })); + } } diff --git a/matching_engine/src/routes/decrypt_request.rs b/matching_engine/src/routes/decrypt_request.rs index b966c18..88436e2 100644 --- a/matching_engine/src/routes/decrypt_request.rs +++ b/matching_engine/src/routes/decrypt_request.rs @@ -1,31 +1,22 @@ +use crate::models::{DecryptRequest, GetRequestResponse}; use actix_web::web; use actix_web::web::Data; use actix_web::HttpResponse; use ethers::core::types::U256; -use secret_input_helpers::secret_inputs_helpers; -use serde::Deserialize; +use kalypso_helper::secret_inputs_helpers; use serde_json::json; use std::sync::Arc; -use tokio::sync::Mutex; +use tokio::sync::RwLock; -use crate::ask::*; +use crate::market_metadata::*; use crate::utility; -use super::{EntityRegistryInstance, GetRequestResponse}; - -#[derive(Deserialize)] -pub struct DecryptRequest { - market_id: String, - private_input: String, - acl: String, - signature: String, - ivs_pubkey: String, -} +use super::EntityRegistryInstance; pub async fn decrypt_request( _payload: web::Json, - _market_store: Data>>, - _matching_engine_key: Data>>>, + _market_store: Data>>, + _matching_engine_key: Data>>>, _entity_key_registry: EntityRegistryInstance, ) -> actix_web::Result { let entity_key_registry = _entity_key_registry.lock().await; @@ -69,16 +60,12 @@ pub async fn decrypt_request( .call() .await; - match result { - Ok(_) => { - println!("Image in family"); - } - Err(_) => { - return Ok(HttpResponse::Unauthorized().json(json!({ - "status": "ImageNotInFamily" - }))) - } + if result.is_err() { + return Ok(HttpResponse::Unauthorized().json(json!({ + "status": "ImageNotInFamily" + }))); } + log::debug!("Image in family"); // locks must be dropped.. // let market_store = _market_store.lock().await; @@ -104,21 +91,31 @@ pub async fn decrypt_request( let secret_data = hex::decode(_payload.private_input.clone()).expect("invalid_data"); let acl = hex::decode(_payload.acl.clone()).expect("invalid acl data"); - let matching_engine_key = _matching_engine_key.lock().await; + let matching_engine_key = match _matching_engine_key.try_read() { + Ok(data) => data, + _ => return Ok(HttpResponse::Locked().json(json!({"status": "Resource Busy"}))), + }; let decrypted_secret_data = secret_inputs_helpers::decrypt_data_with_ecies_and_aes( &secret_data, &acl, &matching_engine_key.clone(), - market_id_u256, - ) - .expect("Failed to get decrypted inputs"); + Some(market_id_u256), + ); + + if decrypted_secret_data.is_err() { + return Ok(HttpResponse::BadRequest().json(json!({ + "status": "Cannot decrypt the data" + }))); + } + + let decrypted_secret_data = decrypted_secret_data.unwrap(); let encrypted_ecies_data = secret_inputs_helpers::encrypt_ecies(&ivs_pubkey_vec, &decrypted_secret_data).unwrap(); let serialized = hex::encode(encrypted_ecies_data); - Ok(HttpResponse::Ok().json(GetRequestResponse { + return Ok(HttpResponse::Ok().json(GetRequestResponse { encrypted_data: serialized, - })) + })); } diff --git a/matching_engine/src/routes/get_priv_inputs.rs b/matching_engine/src/routes/get_priv_inputs.rs index d40db3f..efd29f8 100644 --- a/matching_engine/src/routes/get_priv_inputs.rs +++ b/matching_engine/src/routes/get_priv_inputs.rs @@ -1,17 +1,18 @@ use super::EntityRegistryInstance; use super::GetRequestResponse; -use crate::ask::*; +use crate::ask_lib::ask_store::LocalAskStore; +use crate::models::WelcomeResponse; use crate::utility; use actix_web::web; use actix_web::web::Data; use actix_web::HttpResponse; use ethers::core::types::U256; use hex::decode; -use secret_input_helpers::secret_inputs_helpers; +use kalypso_helper::secret_inputs_helpers; use serde::Deserialize; use serde_json::json; use std::sync::Arc; -use tokio::sync::Mutex; +use tokio::sync::RwLock; #[derive(Deserialize)] pub struct GetPrivInput { @@ -22,23 +23,41 @@ pub struct GetPrivInput { pub async fn get_priv_input( _payload: web::Json, - _local_ask_store: Data>>, - _matching_engine_key: Data>>>, + _local_ask_store: Data>>, + _matching_engine_key: Data>>>, _entity_key_registry: EntityRegistryInstance, ) -> actix_web::Result { - let local_ask_store = { _local_ask_store.lock().await }; + let local_ask_store = { + match _local_ask_store.try_read() { + Ok(data) => data, + _ => { + return Ok(HttpResponse::Locked().json(WelcomeResponse { + status: "Resource Busy".into(), + })) + } + } + }; + let ask_id: String = _payload.ask_id.clone(); let ask_id_u256: U256 = U256::from_dec_str(&ask_id).expect("Failed to parse string"); - let local_ask: Option<&LocalAsk> = local_ask_store.get_by_ask_id(&ask_id_u256); - - if !local_ask.unwrap().has_private_inputs { + let local_ask = local_ask_store.get_by_ask_id(&ask_id_u256); + if local_ask.is_none() { + return Ok(HttpResponse::BadRequest().json(json!({ + "status": "invalid" + }))); + } + let local_ask = local_ask.unwrap(); + if !local_ask.has_private_inputs { return Ok(HttpResponse::BadRequest().json(json!({ "status": "invalid" }))); } - let matching_engine_key = _matching_engine_key.lock().await; + let matching_engine_key = match _matching_engine_key.try_read() { + Ok(data) => data, + _ => return Ok(HttpResponse::Locked().json(json!({"status": "resource locked"}))), + }; let entity_key_registry = _entity_key_registry.lock().await; let signer = utility::derive_address_from_signature(&_payload.signature, &_payload.ask_id) .expect("Failed to recover signature"); @@ -80,7 +99,7 @@ pub async fn get_priv_input( match result { Ok(_) => { - println!("Image in family"); + log::debug!("Image in family"); } Err(_) => { return Ok(HttpResponse::Unauthorized().json(json!({ @@ -90,10 +109,10 @@ pub async fn get_priv_input( } let decrypted_secret_data = secret_inputs_helpers::decrypt_data_with_ecies_and_aes( - &local_ask.unwrap().secret_data.clone().unwrap(), - &local_ask.unwrap().secret_acl.clone().unwrap(), + &local_ask.secret_data.clone().unwrap(), + &local_ask.secret_acl.clone().unwrap(), &matching_engine_key.clone(), - local_ask.unwrap().market_id, + Some(local_ask.market_id), ) .expect("Failed to get private inputs for the ask id"); @@ -102,7 +121,7 @@ pub async fn get_priv_input( let serialized = serde_json::to_string(&encrypted_ecies_data).unwrap(); - Ok(HttpResponse::Ok().json(GetRequestResponse { + return Ok(HttpResponse::Ok().json(GetRequestResponse { encrypted_data: serialized, - })) + })); } diff --git a/matching_engine/src/routes/market_info.rs b/matching_engine/src/routes/market_info.rs index 93ac340..7aa1d54 100644 --- a/matching_engine/src/routes/market_info.rs +++ b/matching_engine/src/routes/market_info.rs @@ -1,64 +1,138 @@ -use crate::ask::*; -use crate::generator::{GeneratorState, GeneratorStore}; +use crate::ask_lib::ask::LocalAsk; +use crate::ask_lib::ask_status::AskState; +use crate::ask_lib::ask_store::LocalAskStore; +use crate::generator_lib::generator_store::GeneratorStore; +use crate::models::{ + AskInfoToSend, GeneratorInfo, GeneratorsInfoForMarket, MarketInfo, MarketInfoResponse, + MarketStatsResponse, WelcomeResponse, +}; use actix_web::web; use actix_web::web::Data; use actix_web::HttpResponse; -use ethers::core::types::{Address, U256}; -use serde::{Deserialize, Serialize}; +use ethers::core::types::U256; use std::sync::Arc; -use tokio::sync::Mutex; +use tokio::sync::RwLock; -#[derive(Deserialize)] -pub struct MarketInfo { - market_id: String, -} +pub async fn market_stats( + market_id: web::Path, + _local_ask_store: Data>>, + _generator_store: Data>>, +) -> actix_web::Result { + let local_ask_store = { + match _local_ask_store.try_read() { + Ok(data) => data, + _ => { + return Ok(HttpResponse::Locked().json(WelcomeResponse { + status: "Resource Busy".into(), + })) + } + } + }; -#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, PartialOrd)] -pub struct AskInfoToSend { - pub ask_id: U256, - pub market_id: U256, - pub reward: U256, - pub expiry: U256, - pub proving_time: U256, - pub deadline: U256, - pub has_private_inputs: bool, - pub state: Option, - pub generator: Option
, -} + let local_generator_store = { + match _generator_store.try_read() { + Ok(data) => data, + _ => { + return Ok(HttpResponse::Locked().json(WelcomeResponse { + status: "Resource Busy".into(), + })) + } + } + }; -#[derive(Serialize)] -pub struct MarketInfoResponse { - market_info: String, - asks: Option>, - generator_info: Option, -} + let market_id = market_id.into_inner(); + let market_id_u256 = U256::from_dec_str(&market_id); -#[derive(Serialize)] -pub struct GeneratorInfo { - generator_address: Address, - stake_locked: U256, - total_stake: U256, - compute_consumed: U256, - declared_compute: U256, - compute_required_per_request: U256, - proof_generation_cost: U256, - proposed_time: U256, - active_requests: U256, - proofs_submitted: U256, - state: Option, -} + if market_id_u256.is_err() { + return Ok(HttpResponse::BadRequest().json(MarketStatsResponse { + market_info: "invalid market id".into(), + generator_count: None, + proofs_generated: None, + proofs_pending: None, + proofs_in_progress: None, + })); + } + + let market_id_u256 = market_id_u256.unwrap(); -#[derive(Serialize)] -pub struct GeneratorsInfoForMarket { - count: i32, - generators: Vec, + let proofs_generated = { Some(local_ask_store.get_proof_count(&market_id_u256)) }; + + let proofs_pending = { + let asks = local_ask_store + .get_by_ask_state_except_complete(AskState::Create) + .result(); + if asks.is_none() { + Some(0) + } else { + let asks: Vec = asks + .unwrap() + .into_iter() + .filter(|a| a.market_id.eq(&market_id_u256)) + .collect(); + Some(asks.len()) + } + }; + + let proofs_in_progress = { + let asks = local_ask_store + .get_by_ask_state_except_complete(AskState::Assigned) + .result(); + if asks.is_none() { + Some(0) + } else { + let asks: Vec = asks + .unwrap() + .into_iter() + .filter(|a| a.market_id.eq(&market_id_u256)) + .collect(); + Some(asks.len()) + } + }; + + let generator_count = { + Some( + local_generator_store + .get_all_by_market_id(&market_id_u256) + .len(), + ) + }; + + return Ok(HttpResponse::Ok().json(MarketStatsResponse { + market_info: market_id, + generator_count, + proofs_generated, + proofs_pending, + proofs_in_progress, + })); } pub async fn market_info( _payload: web::Json, - _local_ask_store: Data>>, - _generator_store: Data>>, + _local_ask_store: Data>>, + _generator_store: Data>>, ) -> actix_web::Result { + let local_ask_store = { + match _local_ask_store.try_read() { + Ok(data) => data, + _ => { + return Ok(HttpResponse::Locked().json(WelcomeResponse { + status: "Resource Busy".into(), + })) + } + } + }; + + let local_generator_store = { + match _generator_store.try_read() { + Ok(data) => data, + _ => { + return Ok(HttpResponse::Locked().json(WelcomeResponse { + status: "Resource Busy".into(), + })) + } + } + }; + let market_id: String = _payload.market_id.clone(); let market_id_u256 = U256::from_dec_str(&market_id); @@ -73,11 +147,11 @@ pub async fn market_info( let market_id_u256 = market_id_u256.unwrap(); let asks = { - let local_ask_store = { _local_ask_store.lock().await }; let asks = local_ask_store .get_by_market_id(&market_id_u256) - .sort_by_ask_id() - .result(); + .sort_by_ask_id(true) + .result() + .to_owned(); if asks.is_none() { None @@ -90,7 +164,7 @@ pub async fn market_info( market_id: ask.market_id, reward: ask.reward, expiry: ask.expiry, - proving_time: ask.proving_time, + proving_time: local_ask_store.get_overall_proving_time(&ask.ask_id), deadline: ask.deadline, has_private_inputs: ask.has_private_inputs, state: ask.state, @@ -102,16 +176,15 @@ pub async fn market_info( }; let generator_info = { - let generator_store = { _generator_store.lock().await }; - let all_generators = generator_store.clone().all_generators_address(); + let all_generators = local_generator_store.all_generators_address(); let mut count = 0; let mut generators = vec![]; for generator in all_generators { if let Some(generator_info) = - generator_store.get_by_address_and_market(&generator, &market_id_u256) + local_generator_store.get_by_address_and_market(&generator, &market_id_u256) { - let generator_data = { generator_store.get_by_address(&generator).unwrap() }; + let generator_data = { local_generator_store.get_by_address(&generator).unwrap() }; count += 1; generators.push(GeneratorInfo { generator_address: generator, @@ -131,9 +204,9 @@ pub async fn market_info( Some(GeneratorsInfoForMarket { count, generators }) }; - Ok(HttpResponse::Ok().json(MarketInfoResponse { + return Ok(HttpResponse::Ok().json(MarketInfoResponse { market_info: market_id, asks, generator_info, - })) + })); } diff --git a/matching_engine/src/routes/mod.rs b/matching_engine/src/routes/mod.rs index 248b561..15ab3b9 100644 --- a/matching_engine/src/routes/mod.rs +++ b/matching_engine/src/routes/mod.rs @@ -1,3 +1,4 @@ +use actix_web::web; use actix_web::web::Data; use ethers::core::k256::ecdsa::SigningKey; use ethers::middleware::SignerMiddleware; @@ -8,11 +9,12 @@ use serde::Serialize; use std::sync::Arc; use tokio::sync::Mutex; -pub mod ask_status; -pub mod chain_status; -pub mod decrypt_request; -pub mod get_priv_inputs; -pub mod market_info; +mod ask_status; +mod chain_status; +mod decrypt_request; +mod get_priv_inputs; +mod market_info; +mod ui_routes; type EntityRegistryInstance = Data< Arc< @@ -28,3 +30,67 @@ type EntityRegistryInstance = Data< pub struct GetRequestResponse { encrypted_data: String, } + +pub fn ui_scope() -> actix_web::Scope { + web::scope("/ui") + .route("/welcome", web::get().to(ui_routes::welcome::welcome)) + .route( + "/dashboard", + web::get().to(ui_routes::dashboard::get_dashboard), + ) + .route( + "/generators", + web::get().to(ui_routes::generators::get_generators_all), + ) + .route( + "/generator/{id}", + web::get().to(ui_routes::single_generator::single_generator), + ) + .route( + "/markets", + web::get().to(ui_routes::markets::total_market_info), + ) + .route( + "/market/{id}", + web::get().to(ui_routes::single_market::single_market), + ) +} + +pub fn get_stats_scope() -> actix_web::Scope { + web::scope("/stats") + .route("/welcome", web::get().to(chain_status::welcome)) + .route("/getStatus", web::get().to(ask_status::get_status)) + .route( + "/getKeyBalance", + web::get().to(chain_status::gas_key_balance), + ) + .route( + "/getAskStatus", + web::post().to(ask_status::get_ask_status_askid), + ) + .route( + "/getProof", + web::post().to(ask_status::get_ask_proof_by_ask_id), + ) + .route( + "/getPrivInput", + web::post().to(get_priv_inputs::get_priv_input), + ) + .route( + "/getLatestBlock", + web::get().to(chain_status::get_latest_block_number), + ) + .route("/marketInfo", web::post().to(market_info::market_info)) + .route( + "/marketStats/{marketId}", + web::get().to(market_info::market_stats), + ) +} + +pub fn get_core_scope() -> actix_web::Scope { + web::scope("") // "" means root scope + .route( + "/decryptRequest", + web::post().to(decrypt_request::decrypt_request), + ) +} diff --git a/matching_engine/src/routes/ui_routes/cache.rs b/matching_engine/src/routes/ui_routes/cache.rs new file mode 100644 index 0000000..90d0779 --- /dev/null +++ b/matching_engine/src/routes/ui_routes/cache.rs @@ -0,0 +1,38 @@ +use tokio::time::{Duration, Instant}; + +#[derive(Clone)] +pub struct CachedResponse { + data: Option, + last_update: Instant, +} + +impl CachedResponse { + // Create a new CachedResponse + pub fn new() -> Self { + CachedResponse { + data: None, + last_update: Instant::now(), + } + } + + // Check if the cached response is still valid + pub fn get_if_valid(&self, timeout: Duration) -> Option { + if self.last_update.elapsed() <= timeout { + self.data.clone() // Return the cached data if valid + } else { + None // Cache is outdated + } + } + + // Store a newly computed value in the cache + pub fn store(&mut self, new_data: T) { + self.data = Some(new_data); + self.last_update = Instant::now(); + } + + // Remove cached data + #[allow(unused)] + pub fn clear(&mut self) { + self.data = None; + } +} diff --git a/matching_engine/src/routes/ui_routes/dashboard.rs b/matching_engine/src/routes/ui_routes/dashboard.rs new file mode 100644 index 0000000..fb8ca85 --- /dev/null +++ b/matching_engine/src/routes/ui_routes/dashboard.rs @@ -0,0 +1,269 @@ +use super::cache::CachedResponse; +use crate::models::WelcomeResponse; +use crate::utility::{address_to_string, bytes_to_string, convert_to_option_string}; +use crate::{ + ask_lib::ask_store::LocalAskStore, generator_lib::generator_store::GeneratorStore, + market_metadata::MarketMetadataStore, +}; +use actix_web::web::Data; +use actix_web::HttpResponse; +use ethers::types::U256; +use serde::{Deserialize, Serialize}; +use std::sync::Arc; +use tokio::sync::{RwLock, RwLockReadGuard}; +use tokio::time::Duration; + +#[derive(Serialize, Deserialize, Debug, Clone)] +struct DashboardResponse { + markets_created: usize, + registered_generators: usize, + proofs_generated: usize, + markets: Vec, + recent_proofs: Vec, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +struct Market { + name: String, + token: String, + median_time: String, + median_cost: String, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +struct RecentProof { + market: Market, + requestor: String, + inputs: String, + generator: Generator, + time: String, + cost: String, + proof_link: String, + created_on_timestamp: Option, + matched_on_timestamp: Option, + proof_created_on_timestamp: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +struct Generator { + name: Option, + address: String, +} + +type CachedDashboardResponse = CachedResponse; + +use once_cell::sync::Lazy; + +// Define a global instance of CachedDashboardResponse +static DASHBOARD_RESPONSE: Lazy> = + Lazy::new(|| RwLock::new(CachedDashboardResponse::new())); + +pub async fn get_dashboard( + _local_market_store: Data>>, + _local_ask_store: Data>>, + _local_generator_store: Data>>, +) -> actix_web::Result { + let dashboard_cache = match DASHBOARD_RESPONSE.try_read() { + Ok(data) => data, + _ => { + return Ok(HttpResponse::Locked().json(WelcomeResponse { + status: "Resource Busy".into(), + })) + } + }; + + if let Some(response) = dashboard_cache.get_if_valid(Duration::from_millis(100)) { + // Return the cached response if valid + return Ok(HttpResponse::Ok().json(response)); + } + + drop(dashboard_cache); + + let local_ask_store = { + match _local_ask_store.try_read() { + Ok(data) => data, + _ => { + return Ok(HttpResponse::Locked().json(WelcomeResponse { + status: "Resource Busy".into(), + })) + } + } + }; + + let local_market_store = { + match _local_market_store.try_read() { + Ok(data) => data, + _ => { + return Ok(HttpResponse::Locked().json(WelcomeResponse { + status: "Resource Busy".into(), + })) + } + } + }; + + let local_generator_store = { + match _local_generator_store.try_read() { + Ok(data) => data, + _ => { + return Ok(HttpResponse::Locked().json(WelcomeResponse { + status: "Resource Busy".into(), + })) + } + } + }; + + // Step 2: If the cache is invalid, recompute the response (write lock) + let new_response = + recompute_dashboard_response(local_market_store, local_ask_store, local_generator_store) + .await; + + { + // Store the newly computed response in the cache + match DASHBOARD_RESPONSE.try_write() { + Ok(mut cache_write_lock) => { + cache_write_lock.store(new_response.clone()); + } + _ => { + log::warn!("Failed Caching Dashboard response"); + } + }; + } + + // Return the newly computed response + return Ok(HttpResponse::Ok().json(new_response)); +} + +async fn recompute_dashboard_response<'a>( + local_market_store: RwLockReadGuard<'a, MarketMetadataStore>, + local_ask_store: RwLockReadGuard<'a, LocalAskStore>, + local_generator_store: RwLockReadGuard<'a, GeneratorStore>, +) -> DashboardResponse { + // Step 1: Retrieve all market metadata and count of markets + let (all_markets, count_markets, market_median_map) = { + let all_markets = local_market_store.get_all_markets().clone(); // Clone to release the lock early + let count_markets = local_market_store.count_markets(); + + // Create a map of market_id to (median_time, median_cost) + let mut market_median_map = std::collections::HashMap::new(); + for meta in &all_markets { + let market_id = &meta.market_id; + let median_time = local_market_store + .get_median_proof_time_market_wise(market_id) + .to_string(); + let median_cost = local_market_store + .get_median_proof_cost_market_wise(market_id) + .to_string(); + market_median_map.insert(market_id.clone(), (median_time, median_cost)); + } + + (all_markets, count_markets, market_median_map) + }; + + // Step 2: Construct the `markets` vector + let mut markets = Vec::with_capacity(all_markets.len()); + for meta in &all_markets { + let market_id = &meta.market_id; + if let Some((median_time, median_cost)) = market_median_map.get(market_id) { + let market = Market { + name: market_id.to_string(), + token: "USDC".into(), + median_time: median_time.clone(), + median_cost: median_cost.clone(), + }; + markets.push(market); + } else { + // Handle cases where median data might be missing + markets.push(Market { + name: market_id.to_string(), + token: "USDC".into(), + median_time: "0".into(), + median_cost: "0".into(), + }); + } + } + + // Step 3: Retrieve recent completed proofs and total proof count + let (recent_completed_proofs, total_proof_count) = { + let recent_completed_proofs = local_ask_store.get_recent_completed_proofs(20).clone(); // Clone to release the lock + let total_proof_count = local_ask_store.get_total_proof_count(); + (recent_completed_proofs, total_proof_count) + }; + + // Step 4: Construct the `recent_proofs` vector + let mut recent_proofs = Vec::with_capacity(recent_completed_proofs.len()); + for ask_request in recent_completed_proofs { + let market_id = &ask_request.market_id; + + // Retrieve median data from the precomputed map + let (median_time, median_cost) = market_median_map + .get(market_id) + .map(|(t, c)| (t.clone(), c.clone())) + .unwrap_or(("0".to_string(), "0".to_string())); // Default values if not found + + let market = Market { + name: market_id.to_string(), + token: "USDC".into(), + median_time, + median_cost, + }; + + // Retrieve proof details + let (time, cost, proof_link) = { + ( + local_ask_store + .get_proving_time(&ask_request.ask_id) + .unwrap_or(U256::zero()) + .to_string(), + local_ask_store + .get_proving_cost(&ask_request.ask_id) + .unwrap_or(U256::zero()) + .to_string(), + local_ask_store + .get_proof_transaction(&ask_request.ask_id) + .unwrap_or_default(), + ) + }; + + // Assume that `ask_request.generator` is `Some`, handle `None` if necessary + let generator_address = match ask_request.generator { + Some(addr) => address_to_string(&addr), + None => "Unknown".into(), // Default or handle appropriately + }; + + let proof = RecentProof { + market, + requestor: address_to_string(&ask_request.prover_refund_address), + inputs: bytes_to_string(&ask_request.prover_data), + generator: Generator { + name: None, // Assuming no name is available + address: generator_address, + }, + time, + cost, + proof_link, + created_on_timestamp: convert_to_option_string( + local_ask_store.get_job_created_on_timestamp(&ask_request.ask_id), + ), + matched_on_timestamp: convert_to_option_string( + local_ask_store.get_job_matched_on_timestamp(&ask_request.ask_id), + ), + proof_created_on_timestamp: convert_to_option_string( + local_ask_store.get_job_completed_on_timestamp(&ask_request.ask_id), + ), + }; + + recent_proofs.push(proof); + } + + // Step 5: Retrieve the count of registered generators + let registered_generators = { local_generator_store.all_generators_address().len() }; + + // Step 6: Assemble the final `DashboardResponse` + DashboardResponse { + markets_created: count_markets, + registered_generators, + proofs_generated: total_proof_count, + markets, + recent_proofs, + } +} diff --git a/matching_engine/src/routes/ui_routes/generators.rs b/matching_engine/src/routes/ui_routes/generators.rs new file mode 100644 index 0000000..81d7bb0 --- /dev/null +++ b/matching_engine/src/routes/ui_routes/generators.rs @@ -0,0 +1,204 @@ +use super::cache::CachedResponse; +use crate::generator_lib::generator_store::{GeneratorMeta, GeneratorStore}; +use crate::models::WelcomeResponse; +use crate::utility::{ + address_to_string, TokenAmount, TokenTracker, TEST_TOKEN_ADDRESS_ONE, TEST_TOKEN_ADDRESS_TWO, +}; +use actix_web::web::Data; +use actix_web::HttpResponse; +use serde::{Deserialize, Serialize}; + +use ethers::types::U256; +use std::sync::Arc; +use tokio::sync::{RwLock, RwLockReadGuard}; +use tokio::time::Duration; + +#[derive(Serialize, Deserialize, Debug, Clone)] +struct GeneratorResponse { + result: Vec, + registered_generators: usize, + total_staked: Vec, +} + +type CachedGeneratorResponse = CachedResponse; + +use once_cell::sync::Lazy; + +static GENERATOR_RESPONSE: Lazy> = + Lazy::new(|| RwLock::new(CachedGeneratorResponse::new())); + +#[derive(Serialize, Deserialize, Debug, Clone)] +struct Operator { + details: GeneratorMeta, + address: String, + delegations: Vec, + markets: Vec, + earnings_to_date: String, + proofs_generated: String, + proofs_missed: String, + pending_proofs: String, + current_stake: Vec, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +struct Market { + id: String, + name: String, + token: Vec, +} + +pub async fn get_generators_all( + _local_generator_store: Data>>, +) -> actix_web::Result { + // Step 1: Check if there's a cached response (lock for reading) + + let generator_cache = match GENERATOR_RESPONSE.try_read() { + Ok(data) => data, + _ => { + return Ok(HttpResponse::Locked().json(WelcomeResponse { + status: "Resource Busy".into(), + })) + } + }; + + if let Some(response) = generator_cache.get_if_valid(Duration::from_millis(100)) { + // Return the cached response if valid + return Ok(HttpResponse::Ok().json(response)); + } + + drop(generator_cache); + + let local_generator_store = { + match _local_generator_store.try_read() { + Ok(data) => data, + _ => { + return Ok(HttpResponse::Locked().json(WelcomeResponse { + status: "Resource Busy".into(), + })) + } + } + }; + + // Step 2: If the cache is invalid, recompute the response + let new_response = recompute_generator_response(local_generator_store).await; + + { + // Store the newly computed response in the cache + match GENERATOR_RESPONSE.try_write() { + Ok(mut cache_write_lock) => { + cache_write_lock.store(new_response.clone()); + } + _ => { + log::warn!("Failed Caching generator response"); + } + }; + } + + // Return the newly computed response + return Ok(HttpResponse::Ok().json(new_response)); +} + +async fn recompute_generator_response<'a>( + local_generator_store: RwLockReadGuard<'a, GeneratorStore>, +) -> GeneratorResponse { + // Step 1: Acquire the lock and extract all necessary data + let generator_details = { + let all_generators = { local_generator_store.all_generators_address().to_owned() }; + + // Prepare a vector to hold generator details + let mut generator_details = Vec::with_capacity(all_generators.len()); + + for generator_address in &all_generators { + // Clone generator_address to ensure ownership + let generator_address = generator_address.clone(); + + // Retrieve and clone operator_data + if let Some(operator_data) = local_generator_store.get_by_address(&generator_address) { + // Retrieve and clone all_markets_of_generator + let all_markets_of_generator = local_generator_store + .get_all_markets_of_generator(&generator_address) + .iter() + .cloned() + .collect::>(); // Ensure deep cloning + + // Retrieve and clone total_earning + let total_earning = local_generator_store + .get_total_earning(&generator_address) + .unwrap_or_else(|| U256::zero()) + .clone(); + + // Push the cloned data into generator_details + generator_details.push(( + generator_address, + operator_data, + all_markets_of_generator, + total_earning, + )); + } + } + + generator_details + }; + + // Step 2: Process the data outside the locked scope using explicit loops + let mut result = Vec::with_capacity(generator_details.len()); + let mut total_stake = TokenTracker::new(); + + for (_, operator_data, all_markets_of_generator, total_earning) in generator_details { + total_stake += operator_data.clone().total_stake; + + // Construct the markets + let mut markets = Vec::with_capacity(all_markets_of_generator.len()); + for info_per_market in &all_markets_of_generator { + let market = Market { + name: info_per_market.market_id.to_string(), + token: vec![ + address_to_string(&TEST_TOKEN_ADDRESS_ONE), + address_to_string(&TEST_TOKEN_ADDRESS_TWO), + ], + id: info_per_market.market_id.to_string(), + }; + markets.push(market); + } + + // Calculate proofs_generated, proofs_missed, and pending_proofs + let mut proofs_generated = U256::zero(); + let mut proofs_missed = U256::zero(); + let mut pending_proofs = U256::zero(); + + for info in &all_markets_of_generator { + proofs_generated += info.proofs_submitted; + proofs_missed += info.proofs_slashed; + pending_proofs += info.active_requests; + } + + let delegations = operator_data + .total_stake + .clone() + .to_token_amount() + .to_owned(); + let current_stake = delegations.clone(); + // Construct the Operator struct + let operator = Operator { + details: operator_data.deserialize_generator_bytes(), + address: address_to_string(&operator_data.address), + delegations, + markets, + earnings_to_date: total_earning.to_string(), + proofs_generated: proofs_generated.to_string(), + proofs_missed: proofs_missed.to_string(), + pending_proofs: pending_proofs.to_string(), + current_stake, + }; + + result.push(operator); + } + + let registered_generators = result.len(); + + GeneratorResponse { + result, + registered_generators, + total_staked: total_stake.to_token_amount(), + } +} diff --git a/matching_engine/src/routes/ui_routes/markets.rs b/matching_engine/src/routes/ui_routes/markets.rs new file mode 100644 index 0000000..c20a4ae --- /dev/null +++ b/matching_engine/src/routes/ui_routes/markets.rs @@ -0,0 +1,278 @@ +use super::cache::CachedResponse; +use crate::ask_lib::ask_status::AskState; +use crate::generator_lib::generator_store::GeneratorStore; +use crate::market_metadata::MarketSetupData; +use crate::models::WelcomeResponse; +use crate::utility::{random_usize, TokenAmount}; +use crate::{ask_lib::ask_store::LocalAskStore, market_metadata::MarketMetadataStore}; +use actix_web::web::Data; +use actix_web::HttpResponse; +use ethers::types::U256; +use serde::{Deserialize, Serialize}; +use std::sync::Arc; +use tokio::sync::{RwLock, RwLockReadGuard}; +use tokio::time::Duration; + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct MarketResponse { + result: Vec, + registered_generators: usize, + total_stake: Vec, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct Market { + market_id: String, + name: Option, + hardware_requirement: MinHardware, + total_proofs_generated: String, + requests_in_progress: String, + median_time_per_proof: String, + median_cost_per_proof: String, + failed_requests: String, + total_earnings: String, + slashing_penalty: Vec, + status: bool, + market_setup_data: MarketSetupData, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +struct MinHardware { + instance_type: String, + vcpus: usize, +} + +type CachedMarketResponse = CachedResponse; + +use once_cell::sync::Lazy; + +static MARKET_RESPONSE: Lazy> = + Lazy::new(|| RwLock::new(CachedMarketResponse::new())); + +pub async fn total_market_info( + _local_market_store: Data>>, + _local_ask_store: Data>>, + _local_generator_store: Data>>, +) -> actix_web::Result { + // Step 1: Check if there's a cached response (lock for reading) + + let market_cache = match MARKET_RESPONSE.try_read() { + Ok(data) => data, + _ => { + return Ok(HttpResponse::Locked().json(WelcomeResponse { + status: "Resource Busy".into(), + })) + } + }; + + if let Some(response) = market_cache.get_if_valid(Duration::from_millis(100)) { + // Return the cached response if valid + return Ok(HttpResponse::Ok().json(response)); + } + + drop(market_cache); + + let local_ask_store = { + match _local_ask_store.try_read() { + Ok(data) => data, + _ => { + return Ok(HttpResponse::Locked().json(WelcomeResponse { + status: "Resource Busy".into(), + })) + } + } + }; + + let local_market_store = { + match _local_market_store.try_read() { + Ok(data) => data, + _ => { + return Ok(HttpResponse::Locked().json(WelcomeResponse { + status: "Resource Busy".into(), + })) + } + } + }; + + let local_generator_store = { + match _local_generator_store.try_read() { + Ok(data) => data, + _ => { + return Ok(HttpResponse::Locked().json(WelcomeResponse { + status: "Resource Busy".into(), + })) + } + } + }; + + // Step 2: If the cache is invalid, recompute the response + let new_response = + recompute_market_response(local_market_store, local_ask_store, local_generator_store).await; + + { + // Store the newly computed response in the cache + match MARKET_RESPONSE.try_write() { + Ok(mut cache_write_lock) => { + cache_write_lock.store(new_response.clone()); + } + _ => { + log::warn!("Failed Caching market response"); + } + }; + } + // Return the newly computed response + return Ok(HttpResponse::Ok().json(new_response)); +} + +async fn recompute_market_response<'a>( + local_market_store: RwLockReadGuard<'a, MarketMetadataStore>, + local_ask_store: RwLockReadGuard<'a, LocalAskStore>, + local_generator_store: RwLockReadGuard<'a, GeneratorStore>, +) -> MarketResponse { + log::debug!("Starting recompute_market_response"); + + // Step 1: Acquire both locks and extract all necessary data within a scoped block + let ( + all_markets_meta, + proof_counts_map, + requests_in_progress_map, + median_time_map, + median_cost_map, + failed_requests_map, + total_earnings_map, + slashing_penalty_map, + ) = { + // Extract all market metadata + let all_markets_meta = local_market_store.get_all_markets().to_owned(); // Clone to own the data + + // Initialize HashMaps to store extracted data for quick lookup + let mut proof_counts_map = std::collections::HashMap::new(); + let mut requests_in_progress_map = std::collections::HashMap::new(); + let mut median_time_map = std::collections::HashMap::new(); + let mut median_cost_map = std::collections::HashMap::new(); + let mut failed_requests_map = std::collections::HashMap::new(); + let mut total_earnings_map = std::collections::HashMap::new(); + let mut slashing_penalty_map = std::collections::HashMap::new(); + + // Iterate over each market metadata and extract relevant data + for meta in &all_markets_meta { + let market_id = &meta.market_id; + + // Extract total_proofs_generated + let total_proofs = local_ask_store.get_proof_count(market_id); + proof_counts_map.insert(market_id.clone(), total_proofs.to_string()); + + // Extract requests_in_progress + let requests_in_progress = local_ask_store + .get_by_ask_state_except_complete(AskState::Assigned) + .filter_by_market_id(market_id.clone()) + .get_count(); + requests_in_progress_map.insert(market_id.clone(), requests_in_progress); + + // Extract median_time_per_proof + let median_time = local_market_store + .get_median_proof_time_market_wise(market_id) + .to_owned() + .to_string(); + median_time_map.insert(market_id.clone(), median_time); + + // Extract median_cost_per_proof + let median_cost = local_market_store + .get_median_proof_cost_market_wise(market_id) + .to_owned() + .to_string(); + median_cost_map.insert(market_id.clone(), median_cost); + + // Extract failed_requests + let failed_requests = local_ask_store + .get_failed_request_count_by_market_id(market_id) + .to_owned() + .to_string(); + failed_requests_map.insert(market_id.clone(), failed_requests); + + // Extract total_earnings + let total_earnings = local_market_store + .get_earnings(market_id) + .to_owned() + .unwrap_or(U256::zero()) + .to_string(); + total_earnings_map.insert(market_id.clone(), total_earnings); + + // Extract slashing_penalty + let slashing_penalty = meta.slashing_penalty.clone(); + slashing_penalty_map.insert(market_id.clone(), slashing_penalty); + } + + ( + all_markets_meta, + proof_counts_map, + requests_in_progress_map, + median_time_map, + median_cost_map, + failed_requests_map, + total_earnings_map, + slashing_penalty_map, + ) + }; // Both locks are released here + + log::debug!("Released locks on MarketMetadataStore and LocalAskStore"); + + // Step 2: Process the data using explicit loops without holding any locks + let mut markets = Vec::with_capacity(all_markets_meta.len()); + + for meta in all_markets_meta { + let market_id = meta.market_id.clone(); + + // Retrieve all pre-extracted data from the HashMaps + let total_proofs_generated = proof_counts_map + .get(&market_id) + .cloned() + .unwrap_or_default(); + let requests_in_progress = requests_in_progress_map.get(&market_id).unwrap_or(&0); + let median_time_per_proof = median_time_map.get(&market_id).cloned().unwrap_or_default(); + let median_cost_per_proof = median_cost_map.get(&market_id).cloned().unwrap_or_default(); + let failed_requests = failed_requests_map + .get(&market_id) + .cloned() + .unwrap_or_default(); + let total_earnings = total_earnings_map + .get(&market_id) + .cloned() + .unwrap_or_default(); + let slashing_penalty = slashing_penalty_map + .get(&market_id) + .cloned() + .unwrap_or_default(); + + // Construct the Market struct + let market = Market { + market_id: market_id.clone().to_string(), + name: None, // Adjust as needed + hardware_requirement: MinHardware { + instance_type: "todo".into(), // Replace with actual data + vcpus: random_usize(), // Replace with actual data + }, + total_proofs_generated, + requests_in_progress: requests_in_progress.to_string(), + median_time_per_proof, + median_cost_per_proof, + failed_requests, + total_earnings, + slashing_penalty: slashing_penalty.to_token_amount(), + status: true, // Adjust as needed + market_setup_data: meta.deserialize_market_bytes(), + }; + + markets.push(market); + } + + log::debug!("Finished processing market data"); + + MarketResponse { + result: markets, + registered_generators: local_generator_store.all_generators_address().len(), + total_stake: local_generator_store + .total_stake_across_all_generators() + .to_token_amount(), + } +} diff --git a/matching_engine/src/routes/ui_routes/mod.rs b/matching_engine/src/routes/ui_routes/mod.rs new file mode 100644 index 0000000..f2948fc --- /dev/null +++ b/matching_engine/src/routes/ui_routes/mod.rs @@ -0,0 +1,7 @@ +mod cache; +pub mod dashboard; +pub mod generators; +pub mod markets; +pub mod single_generator; +pub mod single_market; +pub mod welcome; diff --git a/matching_engine/src/routes/ui_routes/single_generator.rs b/matching_engine/src/routes/ui_routes/single_generator.rs new file mode 100644 index 0000000..cb7cef1 --- /dev/null +++ b/matching_engine/src/routes/ui_routes/single_generator.rs @@ -0,0 +1,491 @@ +use crate::ask_lib::ask::LocalAsk; +use crate::ask_lib::ask_store::LocalAskStore; +use crate::generator_lib::delegation::Operation; +use crate::generator_lib::delegation::Source; +use crate::generator_lib::generator_store::GeneratorMeta; +use crate::generator_lib::key_store::Key; +use crate::generator_lib::key_store::KeyStore; +use crate::models::WelcomeResponse; +use crate::utility::address_to_string; +use crate::utility::address_token_pair_to_token_amount; +use crate::utility::bytes_to_string; +use crate::utility::convert_to_option_string; +use crate::utility::random_usize; +use crate::utility::TokenAmount; +use crate::utility::TokenTracker; +use crate::utility::TEST_TOKEN_ADDRESS_ONE; +use crate::utility::TEST_TOKEN_ADDRESS_TWO; +use actix_web::web; +use actix_web::HttpResponse; +use ethers::types::Address; +use ethers::types::U256; +use im::HashMap; +use once_cell::sync::Lazy; +use serde::Deserialize; +use serde::Serialize; +use tokio::sync::RwLock; +use tokio::sync::RwLockReadGuard; +use tokio::time::Duration; + +use crate::ask_lib::ask_status::AskState; +use crate::generator_lib::generator_store::GeneratorStore; +use actix_web::web::Data; +use std::sync::Arc; + +use super::cache::CachedResponse; + +type CachedSingleGeneratorResponse = CachedResponse; + +const DEFAULT_COUNT: &usize = &100; + +struct CachedGeneratorResponse { + data: HashMap, +} + +static SINGLE_GENERATOR_RESPONSE: Lazy> = + Lazy::new(|| RwLock::new(CachedGeneratorResponse::new())); + +impl CachedGeneratorResponse { + pub fn new() -> Self { + Self { + data: HashMap::new(), + } + } + + pub fn get(&self, query: &GeneratorQuery, timeout: Duration) -> Option { + self.data + .get(query) + .and_then(|cache| cache.get_if_valid(timeout)) + } + + pub fn store(&mut self, query: &GeneratorQuery, response: GeneratorResponse) { + // Attempt to get a mutable reference to the cache + if let Some(cache) = self.data.get_mut(query) { + // If the cache exists, store the response mutably + cache.store(response); + } else { + // If the cache does not exist, create a new one + let mut cache = CachedSingleGeneratorResponse::new(); + cache.store(response); + self.data.insert(*query, cache); + } + } +} + +#[derive(Deserialize, Clone, Copy, Serialize, Debug, Hash, Eq, PartialEq)] +pub struct QueryParams { + active_jobs_skip: Option, + active_jobs: Option, + completed_jobs_skip: Option, + completed_jobs: Option, + slashing_history_skip: Option, + slashing_history: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct GeneratorResponse { + operator: Operator, + details: GeneratorMeta, + reward_address: String, + kalypso_points: String, + active_jobs: String, + no_of_markets: String, + total_earnings: String, + total_slashed: Vec, + total_delegations: Vec, + markets: Vec, + active_jobs_list: Vec, + completed_jobs_list: Vec, + slashing_history: Vec, + available_stake: Vec, + stake_locked: Vec, + delegations: Vec, + my_delegations: Vec, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +struct DelegateOperation { + delegation: TokenAmount, + source: String, + operation: String, + block_number: String, + transaction_index: String, + log_index: String, + tx: String, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +struct Slash { + timestamp: String, + market: MarketInfo, + request: String, // Transaction Hash + price_offered: String, + slashing_penalty: TokenAmount, + slasing_epoch_timestamp: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +struct Job { + ask_id: String, + market: MarketInfo, + requestor: String, + inputs: String, + deadline: String, + cost: String, + time_taken_for_proof_generation: Option, + proof: Option, + proof_transaction: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +struct MarketInfo { + name: Option, + id: String, + token: Vec, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +struct Market { + name: Option, + id: String, + earnings_to_date: String, + proofs_missed: String, + proofs_generated: String, + pending_proofs: String, + slashing_penalties_incured: String, + min_hardware_requirement: MinHardware, + enclave_key: Option, + kalypso_points: String, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +struct MinHardware { + instance_type: String, + vcpus: usize, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +struct Operator { + name: Option, + address: String, +} + +#[derive(Serialize, Deserialize, Debug, Copy, Clone, Hash, Eq, PartialEq)] +struct GeneratorQuery { + generator: Address, + query: QueryParams, +} + +pub async fn single_generator( + _local_ask_store: Data>>, + _local_generator_store: Data>>, + _local_key_store: Data>>, + path: web::Path<(String,)>, + query: web::Query, +) -> actix_web::Result { + let generator_id: Address = match path.into_inner().0.parse() { + Ok(data) => data, + _ => { + return Ok(HttpResponse::BadRequest().json(WelcomeResponse { + status: "Invalid Generator Id".into(), + })) + } + }; + + let generator_query = GeneratorQuery { + generator: generator_id, + query: QueryParams { + active_jobs_skip: query.active_jobs_skip, + active_jobs: query.active_jobs, + completed_jobs_skip: query.completed_jobs_skip, + completed_jobs: query.completed_jobs, + slashing_history_skip: query.slashing_history_skip, + slashing_history: query.slashing_history, + }, + }; + + let cached_response = match SINGLE_GENERATOR_RESPONSE.try_read() { + Ok(data) => data.get(&generator_query, Duration::from_millis(100)), + _ => { + return Ok(HttpResponse::Locked().json(WelcomeResponse { + status: "Resource Busy".into(), + })) + } + }; + + if cached_response.is_some() { + return Ok(HttpResponse::Ok().json(cached_response)); + } + + let local_ask_store = { + match _local_ask_store.try_read() { + Ok(data) => data, + _ => { + return Ok(HttpResponse::Locked().json(WelcomeResponse { + status: "Resource Busy".into(), + })) + } + } + }; + + let local_generator_store = { + match _local_generator_store.try_read() { + Ok(data) => data, + _ => { + return Ok(HttpResponse::Locked().json(WelcomeResponse { + status: "Resource Busy".into(), + })) + } + } + }; + + let local_key_store = { + match _local_key_store.try_read() { + Ok(data) => data, + _ => { + return Ok(HttpResponse::Locked().json(WelcomeResponse { + status: "Resource Busy".into(), + })) + } + } + }; + + // Step 1: Recompute the response every time + let new_response = recompute_single_generator_response( + generator_id, + generator_query, + local_ask_store, + local_generator_store, + local_key_store, + ) + .await; + + if new_response.is_none() { + return Ok(HttpResponse::NotFound().json(WelcomeResponse { + status: "Generator Data Not Found".into(), + })); + } + + let new_response = new_response.unwrap(); + + match SINGLE_GENERATOR_RESPONSE.try_write() { + Ok(mut data) => data.store(&generator_query, new_response.clone()), + _ => { + log::warn!("Failed Caching Single Generator response"); + } + } + + // Return the newly computed response + return Ok(HttpResponse::Ok().json(new_response)); +} + +async fn recompute_single_generator_response<'a>( + generator_id: Address, + query: GeneratorQuery, + local_ask_store: RwLockReadGuard<'a, LocalAskStore>, + local_generator_store: RwLockReadGuard<'a, GeneratorStore>, + local_key_store: RwLockReadGuard<'a, KeyStore>, +) -> Option { + let generator_data = local_generator_store.get_by_address(&generator_id); + + if generator_data.is_none() { + return None; + } + + let generator_data = generator_data.unwrap(); + let all_markets_of_generator = + local_generator_store.get_all_markets_of_generator(&generator_id); + + Some(GeneratorResponse { + operator: Operator { + name: None, + address: address_to_string(&generator_id), + }, + details: generator_data.deserialize_generator_bytes(), + kalypso_points: local_generator_store + .get_kalypso_points(&generator_id) + .unwrap_or_default() + .to_string(), + reward_address: address_to_string(&generator_data.reward_address), + active_jobs: all_markets_of_generator + .clone() + .into_iter() + .map(|info| info.active_requests) + .fold(U256::zero(), |a, x| a + x) + .to_string(), + no_of_markets: all_markets_of_generator.len().to_string(), + total_earnings: local_generator_store + .get_total_earning(&generator_id) + .unwrap_or_default() + .to_string(), + total_slashed: local_generator_store + .get_total_slashing(&generator_id) + .unwrap_or_default() + .to_token_amount(), + total_delegations: generator_data.total_stake.to_token_amount(), + available_stake: local_generator_store + .get_available_stake(&generator_id) + .unwrap_or_default() + .to_token_amount(), + stake_locked: local_generator_store + .get_stake_locked(&generator_id) + .unwrap_or_default() + .to_token_amount(), + markets: all_markets_of_generator + .clone() + .into_iter() + .map(|info| Market { + name: None, + id: info.market_id.to_string(), + earnings_to_date: local_generator_store + .get_earning_per_market(&generator_id, &info.market_id) + .unwrap_or_default() + .to_string(), + proofs_missed: info.proofs_slashed.to_string(), + proofs_generated: info.proofs_submitted.to_string(), + slashing_penalties_incured: info.proofs_slashed.to_string(), + pending_proofs: info.active_requests.to_string(), + min_hardware_requirement: MinHardware { + instance_type: "todo".into(), + vcpus: random_usize(), + }, + kalypso_points: local_generator_store + .get_kalypso_points_per_market(&generator_id, &info.market_id) + .unwrap_or_default() + .to_string(), + enclave_key: local_key_store.get_by_address(&info.address, info.market_id.as_u64()), + }) + .collect(), + active_jobs_list: local_ask_store + .get_by_ask_state_except_complete(AskState::Assigned) + .result() + .map(|mut asks| { + asks.sort_by(|a, b| a.ask_id.cmp(&b.ask_id)); + let local_asks = asks + .into_iter() + .filter(|ask| match &ask.generator { + Some(addr) => addr == &generator_id, + None => false, + }) + .collect::>() + .into_iter() + .skip(query.query.active_jobs_skip.unwrap_or_default()) + .take(query.query.active_jobs.unwrap_or_else(|| *DEFAULT_COUNT)) + .collect::>(); + + local_asks + .into_iter() + .map(|a| Job { + ask_id: a.ask_id.to_string(), + market: MarketInfo { + name: None, + id: a.market_id.to_string(), + token: vec![ + address_to_string(&TEST_TOKEN_ADDRESS_ONE), + address_to_string(&TEST_TOKEN_ADDRESS_TWO), + ], + }, + requestor: address_to_string(&a.prover_refund_address), + inputs: bytes_to_string(&a.prover_data), + deadline: a.deadline.to_string(), + cost: a.reward.to_string(), + time_taken_for_proof_generation: None, + proof: None, + proof_transaction: None, + }) + .collect() + }) + .unwrap_or_default(), + completed_jobs_list: local_ask_store + .get_completed_proof_of_generator( + &generator_id, + query.query.completed_jobs_skip.unwrap_or_default(), + query.query.completed_jobs.unwrap_or_else(|| *DEFAULT_COUNT), + ) + .into_iter() + .map(|ask| Job { + ask_id: ask.ask_id.to_string(), + market: MarketInfo { + name: None, + id: ask.market_id.to_string(), + token: vec![ + address_to_string(&TEST_TOKEN_ADDRESS_ONE), + address_to_string(&TEST_TOKEN_ADDRESS_TWO), + ], + }, + requestor: address_to_string(&ask.prover_refund_address), + inputs: bytes_to_string(&ask.prover_data), + deadline: ask.deadline.to_string(), + cost: ask.reward.to_string(), + time_taken_for_proof_generation: Some( + local_ask_store + .get_proving_time(&ask.ask_id) + .unwrap_or_default() + .to_string(), + ), + proof: Some( + local_ask_store + .get_proof_by_ask_id(&ask.ask_id) + .unwrap_or_default() + .to_string(), + ), + proof_transaction: local_ask_store.get_proof_transaction(&ask.ask_id), + }) + .collect::>(), + slashing_history: local_generator_store + .get_slashing_records(&generator_id) + .into_iter() + .map(|record| Slash { + slasing_epoch_timestamp: convert_to_option_string(Some(record.slashing_timestamp)), + timestamp: record.slashing_block_number.to_string(), + market: MarketInfo { + name: None, + id: record.market_id.to_string(), + token: vec![ + address_to_string(&TEST_TOKEN_ADDRESS_ONE), + address_to_string(&TEST_TOKEN_ADDRESS_TWO), + ], + }, + request: record.slashing_tx, + price_offered: record.price_offered.to_string(), + slashing_penalty: address_token_pair_to_token_amount(record.slashing_penalty), + }) + .collect(), + delegations: local_generator_store + .get_delegations( + &generator_id, + vec![Operation::Delegate, Operation::UnDelegate], + None, + None, + ) + .iter() + .map(|element| DelegateOperation { + delegation: address_token_pair_to_token_amount(element.delegation), + source: element.source.to_string(), + operation: element.operation.to_string(), + block_number: element.block_number.to_string(), + transaction_index: element.transaction_index.to_string(), + log_index: element.log_index.to_string(), + tx: element.tx.clone(), + }) + .collect(), + my_delegations: { + let mut token_tracker = TokenTracker::new(); + + local_generator_store + .get_delegations( + &generator_id, + vec![Operation::Delegate, Operation::UnDelegate], + None, + Some(usize::MAX), + ) + .into_iter() + .filter(|delegation| delegation.source == Source::Native) + .for_each(|delegation| { + token_tracker.add_token(&delegation.delegation.0, &delegation.delegation.1) + }); + + token_tracker.to_token_amount() + }, + }) +} diff --git a/matching_engine/src/routes/ui_routes/single_market.rs b/matching_engine/src/routes/ui_routes/single_market.rs new file mode 100644 index 0000000..93a5ece --- /dev/null +++ b/matching_engine/src/routes/ui_routes/single_market.rs @@ -0,0 +1,391 @@ +use crate::ask_lib::ask::LocalAsk; +use crate::ask_lib::ask_status::AskState; +use crate::ask_lib::ask_store::LocalAskStore; +use crate::generator_lib::generator_store::{GeneratorMeta, GeneratorStore}; +use crate::market_metadata::{MarketMetadataStore, MarketSetupData}; +use crate::models::WelcomeResponse; +use crate::utility::{ + address_to_string, address_token_pair_to_token_amount, convert_to_option_string, random_usize, + TokenAmount, TokenTracker, USDC_TOKEN, +}; +use actix_web::web::{self, Data}; +use actix_web::HttpResponse; +use ethers::types::U256; +use im::HashMap; +use once_cell::sync::Lazy; +use rayon::iter::{IntoParallelIterator, ParallelIterator}; +use serde::{Deserialize, Serialize}; +use std::sync::Arc; +use tokio::sync::{RwLock, RwLockReadGuard}; +use tokio::time::Duration; + +const DEFAULT_COUNT: &usize = &100; + +#[derive(Serialize, Deserialize, Debug, Clone)] +struct MinHardware { + instance_type: String, + vcpus: usize, + enclave: bool, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +struct Jobs { + proofs_generated: usize, + proofs_pending: usize, + proofs_in_progress: usize, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +struct RegisteredGenerator { + details: GeneratorMeta, + address: String, + delegations: Vec, + time: String, + cost: TokenAmount, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +struct SingleMarketResponse { + registered_generators: usize, + slashing_penalty: Vec, + median_cost: String, + median_proof_time: String, + total_earnings: String, + total_slashed: Vec, + hardware_requirement: MinHardware, + min_stake: Vec, + jobs: Jobs, + market_setup_data: MarketSetupData, + registered_generator_list: Vec, + unmatched_jobs: Vec, + completed_jobs: Vec, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +struct Job { + requestor: String, + time: String, + cost: TokenAmount, + ask_id: String, + inputs: String, + generator: Option, + status: AskState, + created_on_timestamp: Option, + matched_on_timestamp: Option, + proof_created_on_timestamp: Option, +} + +#[derive(Serialize, Deserialize, Debug, Copy, Clone, Hash, Eq, PartialEq)] +struct MarketQuery { + market: U256, +} + +use super::cache::CachedResponse; + +type CachedSingleMarketResponse = CachedResponse; + +struct CachedMarketResponse { + data: HashMap, +} + +static SINGLE_MARKET_RESPONSE: Lazy> = + Lazy::new(|| RwLock::new(CachedMarketResponse::new())); + +impl CachedMarketResponse { + pub fn new() -> Self { + Self { + data: HashMap::new(), + } + } + + pub fn get(&self, query: &MarketQuery, timeout: Duration) -> Option { + let cache = self.data.get(query); + if cache.is_none() { + None + } else { + cache.unwrap().get_if_valid(timeout) + } + } + + pub fn store(&mut self, query: &MarketQuery, response: SingleMarketResponse) { + // Attempt to get a mutable reference to the cache + if let Some(cache) = self.data.get_mut(query) { + // If the cache exists, store the response mutably + cache.store(response); + } else { + // If the cache does not exist, create a new one + let mut cache = CachedSingleMarketResponse::new(); + cache.store(response); + self.data.insert(*query, cache); + } + } +} + +pub async fn single_market( + _local_market_store: Data>>, + _local_ask_store: Data>>, + _local_generator_store: Data>>, + path: web::Path<(String,)>, + // query: web::Query, // If required add latter +) -> actix_web::Result { + let market_id: U256 = match U256::from_dec_str(&path.0) { + Ok(data) => data, + _ => { + return Ok(HttpResponse::BadRequest().json(WelcomeResponse { + status: "Invalid Market Id".into(), + })) + } + }; + + let market_query = MarketQuery { + market: market_id, + // add queryParams here if required + }; + + let cached_response = match SINGLE_MARKET_RESPONSE.try_read() { + Ok(data) => data.get(&market_query, Duration::from_millis(100)), + _ => { + return Ok(HttpResponse::Locked().json(WelcomeResponse { + status: "Resource Busy".into(), + })) + } + }; + + if cached_response.is_some() { + return Ok(HttpResponse::Ok().json(cached_response.unwrap())); + } + + drop(cached_response); + + let local_ask_store = { + match _local_ask_store.try_read() { + Ok(data) => data, + _ => { + return Ok(HttpResponse::Locked().json(WelcomeResponse { + status: "Resource Busy".into(), + })) + } + } + }; + + let local_market_store = { + match _local_market_store.try_read() { + Ok(data) => data, + _ => { + return Ok(HttpResponse::Locked().json(WelcomeResponse { + status: "Resource Busy".into(), + })) + } + } + }; + + let local_generator_store = { + match _local_generator_store.try_read() { + Ok(data) => data, + _ => { + return Ok(HttpResponse::Locked().json(WelcomeResponse { + status: "Resource Busy".into(), + })) + } + } + }; + + let new_response = recompute_single_market_response( + market_id, + local_market_store, + local_ask_store, + local_generator_store, + ) + .await; + + if new_response.is_none() { + return Ok(HttpResponse::NotFound().json(WelcomeResponse { + status: "Market Data Not Found".into(), + })); + } + + let new_response = new_response.unwrap(); + + match SINGLE_MARKET_RESPONSE.try_write() { + Ok(mut data) => data.store(&market_query, new_response.clone()), + _ => { + log::warn!("Failed Caching Single Market response"); + } + } + + return Ok(HttpResponse::Ok().json(new_response)); +} + +async fn recompute_single_market_response<'a>( + market_id: U256, + local_market_store: RwLockReadGuard<'a, MarketMetadataStore>, + local_ask_store: RwLockReadGuard<'a, LocalAskStore>, + local_generator_store: RwLockReadGuard<'a, GeneratorStore>, +) -> Option { + let marketmetadata = local_market_store.get_market_by_market_id(&market_id); + + if marketmetadata.is_none() { + return None; + } + + let marketmetadata = marketmetadata.unwrap(); + + let median_cost = local_market_store + .get_median_proof_cost_market_wise(&market_id) + .to_string(); + let median_proof_time = local_market_store + .get_median_proof_time_market_wise(&market_id) + .to_string(); + let registered_generators = local_generator_store.get_all_by_market_id(&market_id); + + let local_generator_store_arc = Arc::new(local_generator_store.clone()); + + let slashing_penalty = local_market_store + .get_slashing_penalty_by_market_id(&market_id) + .into_iter() + .map(address_token_pair_to_token_amount) + .collect::>(); + + Some(SingleMarketResponse { + median_cost, + median_proof_time, + registered_generators: registered_generators.len(), + slashing_penalty: slashing_penalty.clone(), + total_earnings: local_market_store + .get_earnings(&market_id) + .unwrap_or_default() + .to_string(), + total_slashed: registered_generators + .into_par_iter() + .map(|elem| { + let store = Arc::clone(&local_generator_store_arc); + match store.get_slashing_per_generator_per_market(&elem.address, &market_id) { + Some(slashed) => slashed, + None => TokenTracker::new(), + } + }) + .reduce(|| TokenTracker::new(), |acc, elem| acc + elem) + .to_token_amount(), + hardware_requirement: MinHardware { + instance_type: "todo".into(), + vcpus: random_usize(), + enclave: true, + }, + min_stake: slashing_penalty, + jobs: Jobs { + proofs_generated: local_ask_store.get_proof_count(&market_id), + proofs_pending: { + let result = local_ask_store + .get_by_ask_state_except_complete(AskState::Create) + .filter_by_market_id(market_id) + .result(); + + if result.is_some() { + result.unwrap().len() + } else { + 0 + } + }, + proofs_in_progress: { + let result = local_ask_store + .get_by_ask_state_except_complete(AskState::Assigned) + .filter_by_market_id(market_id) + .result(); + + if result.is_some() { + result.unwrap().len() + } else { + 0 + } + }, + }, + market_setup_data: marketmetadata.deserialize_market_bytes(), + registered_generator_list: local_generator_store + .get_all_by_market_id(&market_id) + .iter() + .filter_map(|element| { + // Attempt to retrieve generator_info. If None, skip this element. + local_generator_store + .get_by_address(&element.address) + .map(|generator_info| RegisteredGenerator { + details: generator_info.deserialize_generator_bytes(), + address: address_to_string(&element.address), + delegations: generator_info.total_stake.to_token_amount(), + time: element.proposed_time.to_string(), + cost: TokenAmount { + token: address_to_string(&USDC_TOKEN), + amount: element.proof_generation_cost.to_string(), + }, + }) + }) + .collect::>(), + unmatched_jobs: local_ask_store + .get_by_ask_state_except_complete(AskState::Create) + .result() + .map(|mut asks| { + asks.sort_by(|a, b| a.ask_id.cmp(&b.ask_id)); + let local_asks = asks.into_iter().collect::>(); + + local_asks + .into_iter() + .map(|a| Job { + ask_id: a.ask_id.to_string(), + requestor: address_to_string(&a.prover_refund_address), + cost: TokenAmount { + token: address_to_string(&USDC_TOKEN), + amount: a.reward.to_string(), + }, + time: (a.deadline.saturating_sub(a.created_on)).to_string(), + inputs: a.prover_data.to_string(), + generator: None, + status: AskState::Create, + created_on_timestamp: convert_to_option_string( + local_ask_store.get_job_created_on_timestamp(&a.ask_id), + ), + matched_on_timestamp: convert_to_option_string( + local_ask_store.get_job_matched_on_timestamp(&a.ask_id), + ), + proof_created_on_timestamp: convert_to_option_string( + local_ask_store.get_job_completed_on_timestamp(&a.ask_id), + ), + }) + .collect() + }) + .unwrap_or_default(), + + completed_jobs: local_ask_store + .get_completed_proofs_of_market(&market_id, 0, DEFAULT_COUNT.clone()) + .into_iter() + .map(|a| Job { + ask_id: a.ask_id.to_string(), + requestor: address_to_string(&a.prover_refund_address), + cost: TokenAmount { + token: address_to_string(&USDC_TOKEN), + amount: a.reward.to_string(), + }, + time: local_ask_store + .get_proving_time(&a.ask_id) + .unwrap_or_default() + .to_string(), + inputs: a.prover_data.to_string(), + generator: { + if a.generator.is_some() { + Some(address_to_string(&a.generator.unwrap())) + } else { + None + } + }, + status: AskState::Complete, + created_on_timestamp: convert_to_option_string( + local_ask_store.get_job_created_on_timestamp(&a.ask_id), + ), + matched_on_timestamp: convert_to_option_string( + local_ask_store.get_job_matched_on_timestamp(&a.ask_id), + ), + proof_created_on_timestamp: convert_to_option_string( + local_ask_store.get_job_completed_on_timestamp(&a.ask_id), + ), + }) + .collect(), + }) +} diff --git a/matching_engine/src/routes/ui_routes/welcome.rs b/matching_engine/src/routes/ui_routes/welcome.rs new file mode 100644 index 0000000..f1e4ae4 --- /dev/null +++ b/matching_engine/src/routes/ui_routes/welcome.rs @@ -0,0 +1,8 @@ +use crate::models::WelcomeResponse; +use actix_web::HttpResponse; + +pub async fn welcome() -> actix_web::Result { + Ok(HttpResponse::Ok().json(WelcomeResponse { + status: "welcome to ui routes!.".into(), + })) +} diff --git a/matching_engine/src/utility.rs b/matching_engine/src/utility.rs index 52f2085..0fd8752 100644 --- a/matching_engine/src/utility.rs +++ b/matching_engine/src/utility.rs @@ -1,43 +1,38 @@ -use ethers::abi::{encode, Token}; -use ethers::core::utils::hex::FromHex; -use ethers::types::{Signature, SignatureError, H160, U256}; -use ethers::utils::keccak256; -use hex::decode; -use std::error::Error; +use ethers::abi::{encode, Address, Token}; -// fn ecrecover_from_signature(signature: &str, message_hash: &[u8]) -> Option { -// // Parse the signature from a hex string -// let signature = Signature::from_str(signature).ok()?; +#[cfg(any(feature = "use_l1_block_numbers", feature = "add_timestamp_to_asks"))] +use ethers::abi::AbiParser; -// // Use the `recover` function from ethers to recover the public key -// let recovered_key = recover( -// recoverable::Signature { -// r: signature.r(), -// s: signature.s(), -// v: signature.recovery_id().into(), -// }, -// &message_hash, -// ); +use ethers::core::rand::seq::SliceRandom; +use ethers::core::rand::{self, thread_rng}; +use ethers::core::utils::hex::FromHex; -// // Return the result -// recovered_key.ok() -// } +#[cfg(any(feature = "use_l1_block_numbers", feature = "add_timestamp_to_asks"))] +use ethers::prelude::*; -// fn derive_address_from_public_key(public_key: &[u8]) -> String { -// // Step 1: Hash the public key using Keccak-256 -// let hash = keccak256(public_key); +#[cfg(any(feature = "use_l1_block_numbers", feature = "add_timestamp_to_asks"))] +use ethers::types::{Address as OtherAddress, Bytes, TransactionRequest}; -// // Step 2: Take the last 20 bytes of the hash -// let address_bytes = &hash[hash.len() - 20..]; +use ethers::types::{Signature, SignatureError, H160, U256}; -// // Step 3: Convert the bytes to a hexadecimal string -// let address_hex = hex::encode(address_bytes); +use ethers::utils::keccak256; +use hex::decode; +use im::HashMap; +use rand::Rng; +use serde::{Deserialize, Serialize}; +use std::error::Error; -// // Step 4: Prefix with "0x" to represent it as an Ethereum address -// let address = format!("0x{}", address_hex); +pub fn address_to_string(address: &Address) -> String { + format!("0x{}", hex::encode(address.as_bytes())) +} -// address -// } +pub fn tx_to_string(tx: ðers::types::H256) -> String { + format!("0x{}", hex::encode(tx.as_bytes())) +} + +pub fn bytes_to_string(data: ðers::types::Bytes) -> String { + format!("0x{}", hex::encode(data)) +} // Derive Ethereum address from signature and message pub fn derive_address_from_signature( @@ -104,3 +99,375 @@ pub fn public_key_to_address(public_key_hex: &str) -> Result U256 { + // Define lower and upper bounds as u128 + const LOWER_BOUND: u128 = 10u128.pow(18); + const UPPER_BOUND: u128 = 10u128.pow(22); + + // Calculate the range + let range = UPPER_BOUND - LOWER_BOUND; + + // Initialize the random number generator + let mut rng = rand::thread_rng(); + + // Generate a random u128 within [0, range) + let rand_u128: u128 = rng.gen_range(0..range); + + // Shift the random number into the desired range + let result_u128 = rand_u128 + LOWER_BOUND; + + // Convert u128 to U256 + let result = U256::from(result_u128); + + result +} + +pub fn random_usize() -> usize { + let mut rng = rand::thread_rng(); + rng.gen_range(1..=256) +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct TokenAmount { + pub token: String, + pub amount: String, +} + +pub type AddressTokenPair = (Address, U256); + +pub fn address_token_pair_to_token_amount(pair: AddressTokenPair) -> TokenAmount { + TokenAmount { + token: address_to_string(&pair.0), + amount: pair.1.to_string(), + } +} + +#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq, Default)] +pub struct TokenTracker { + tokens: HashMap, +} + +impl TokenTracker { + pub fn new() -> Self { + TokenTracker { + tokens: HashMap::new(), + } + } + + pub fn from_address_token_pair(pair: AddressTokenPair) -> Self { + let mut token_tracker = TokenTracker::new(); + + token_tracker.add_token(&pair.0, &pair.1); + + token_tracker + } + + pub fn from_address_string_and_dec_string( + addresses: Vec, + values: Vec, + ) -> Result { + // Ensure both vectors have the same length + if addresses.len() != values.len() { + return Err(format!( + "Mismatched number of addresses ({}) and values ({}).", + addresses.len(), + values.len() + )); + } + + let mut token_tracker = TokenTracker::new(); + + // Iterate over both addresses and values + for (address_str, value_str) in addresses.iter().zip(values.iter()) { + // Parse the address from a hex string + let address = address_str + .parse() + .map_err(|_| format!("Invalid address format: {}", address_str))?; + + // Parse the value from a decimal string + let amount = U256::from_dec_str(value_str) + .map_err(|_| format!("Invalid decimal value format: {}", value_str))?; + + // Add the token to the tracker + token_tracker.add_token(&address, &amount); + } + + Ok(token_tracker) + } +} + +impl TokenTracker { + pub fn to_address_token_pair(&self) -> Vec { + self.tokens + .iter() + .map(|(address, amount)| (*address, *amount)) // Create AddressTokenPair tuples + .collect() // Collect into a Vec + } + + pub fn to_token_amount(&self) -> Vec { + self.tokens + .iter() + .map(|(token, amount)| TokenAmount { + token: address_to_string(token), + amount: amount.to_string(), + }) + .collect() + } + + pub fn add_token(&mut self, token: &Address, amount: &U256) { + let entry = self.tokens.entry(*token).or_insert(U256::zero()); + *entry += *amount; // Increment the token amount + } + + pub fn sub_token(&mut self, token: &Address, amount: &U256) -> Result<(), String> { + if let Some(entry) = self.tokens.get_mut(token) { + if *entry >= *amount { + *entry -= *amount; // Decrement the token amount + Ok(()) + } else { + Err(format!("Insufficient balance for token: {:?}", token)) + } + } else { + Err(format!("Token not found: {:?}", token)) + } + } + + // Subtract tokens from the tracker, but set balance to 0 in case of underflow + pub fn sub_token_saturating(&mut self, token: &Address, amount: &U256) { + if let Some(entry) = self.tokens.get_mut(token) { + if *entry >= *amount { + *entry -= *amount; // Normal subtraction + } else { + *entry = U256::zero(); // Set to 0 if subtraction would underflow + } + } + } +} + +use std::ops::{Add, AddAssign, Sub}; + +// Implement Add trait for TokenTracker (TokenTracker + TokenTracker) +impl Add for TokenTracker { + type Output = Self; + + fn add(self, other: Self) -> Self { + let mut result = self.clone(); + + // Iterate over the other TokenTracker's tokens + for (address, amount) in other.tokens.iter() { + result.add_token(address, amount); // Use the updated add_token method + } + + result + } +} + +// Implement Sub trait for TokenTracker (TokenTracker - TokenTracker) +impl Sub for TokenTracker { + type Output = Self; + + fn sub(self, other: Self) -> Self { + let mut result = self.clone(); + + // Iterate over the other TokenTracker's tokens + for (address, amount) in other.tokens.iter() { + result.sub_token_saturating(address, amount); // Use the updated sub_token_saturating method + } + + result + } +} + +impl TokenTracker { + // Check if the tracker has more or equal amount than the given address-token pair + pub fn has_more_than_or_eq(&self, address_token_pair: &AddressTokenPair) -> bool { + let (address, amount) = address_token_pair; + if let Some(current_amount) = self.tokens.get(address) { + return current_amount >= amount; + } + false + } + + pub fn has_more_than_or_eq_across_multiple( + &self, + address_token_pairs: &Vec, + ) -> bool { + // Iterate over each pair and ensure all satisfy the `has_more_than_or_eq` condition + address_token_pairs + .iter() + .all(|pair| self.has_more_than_or_eq(pair)) + } + + pub fn has_more_than_or_eq_in_at_least_one( + &self, + address_token_pairs: &Vec, + ) -> bool { + // Iterate over each pair and check if any satisfy the `has_more_than_or_eq` condition + address_token_pairs + .iter() + .any(|pair| self.has_more_than_or_eq(pair)) + } + + pub fn select_one_random_stakable_pair( + &self, + address_token_pairs: &Vec, + ) -> Option { + // Collect all pairs where the tracker has less than the specified amount + let less_pairs: Vec<&AddressTokenPair> = address_token_pairs + .iter() + .filter(|pair| self.has_more_than_or_eq(pair)) + .collect(); + + // If no pairs satisfy the condition, return None + if less_pairs.is_empty() { + return None; + } + + // Initialize the random number generator + let mut rng = thread_rng(); + + // Select a random pair from the filtered list and clone it + less_pairs.choose(&mut rng).cloned().cloned() // Ensure AddressTokenPair implements `Clone` + } + + // Check if the tracker has less or equal amount than the given address-token pair + pub fn has_less_than_or_eq(&self, address_token_pair: &AddressTokenPair) -> bool { + let (address, amount) = address_token_pair; + if let Some(current_amount) = self.tokens.get(address) { + return current_amount <= amount; + } + false + } + + pub fn has_less_than_or_eq_across_multiple( + &self, + address_token_pairs: &Vec, + ) -> bool { + // Iterate over each pair and ensure all satisfy the `has_less_than_or_eq` condition + address_token_pairs + .iter() + .all(|pair| self.has_less_than_or_eq(pair)) + } +} + +use std::fmt; +impl fmt::Display for TokenTracker { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + for (token, amount) in &self.tokens { + writeln!(f, "{:?}: {}", token, amount)?; + } + Ok(()) + } +} + +impl AddAssign for TokenTracker { + fn add_assign(&mut self, other: Self) { + for (address, amount) in other.tokens { + self.add_token(&address, &amount); // Use the add_token method to add tokens + } + } +} + +#[cfg(not(feature = "add_timestamp_to_asks"))] +pub async fn get_timestamp_from_l2block_number(_: &str, _: &U256) -> Option { + None +} + +#[cfg(feature = "add_timestamp_to_asks")] +pub async fn get_timestamp_from_l2block_number(rpc_url: &str, l2_block_num: &U256) -> Option { + let provider = match Provider::::try_from(rpc_url) { + Ok(data) => data, + _ => return None, + }; + + let timestamp = { + let block = provider.get_block(l2_block_num.as_u64()).await; + if block.is_err() { + None + } else { + let block = block.unwrap(); + if block.is_none() { + None + } else { + let block = block.unwrap(); + Some(block.timestamp) + } + } + }; + + timestamp +} + +#[cfg(not(feature = "use_l1_block_numbers"))] +pub async fn get_l1_block_from_l2_block( + _: &str, + l2_block_num: U256, +) -> Result> { + Ok(l2_block_num) +} + +#[cfg(feature = "use_l1_block_numbers")] +pub async fn get_l1_block_from_l2_block(rpc_url: &str, l2_block_num: U256) -> Option { + // Connect to Arbitrum's L2 endpoint + let provider = Provider::::try_from(rpc_url).ok()?; + + // Define ABI for blockL1Num function + let abi = AbiParser::default() + .parse(&["function blockL1Num(uint64 l2BlockNum) view returns (uint256)"]) + .ok()?; + + // Retrieve the function + let function = abi.function("blockL1Num").ok()?; + + // Encode the data for the function call + let data = function.encode_input(&[Token::Uint(l2_block_num)]).ok()?; + + // NodeInterface special address for the call + let node_interface_address = "0x00000000000000000000000000000000000000c8" + .parse::() + .ok()?; + + let data_bytes = Bytes::from(data); + + // Create a TransactionRequest + let tx_request = TransactionRequest::new() + .to(node_interface_address) + .data(data_bytes); + + // Call the function via the provider + let result = provider.call(&tx_request.into(), None).await.ok()?; + + // Decode the result + let decoded_result: U256 = function + .decode_output(&result) + .ok()? + .get(0) + .cloned()? + .into_uint()?; + + Some(decoded_result) +} + +pub const USDC_TOKEN_STRING: &str = "0x6543210965432109654321096543210965432109"; +pub const TEST_TOKEN_ADDRESS_ONE_STRING: &str = "0x9999888899998888999988889999888899998888"; +pub const TEST_TOKEN_ADDRESS_TWO_STRING: &str = "0x1234123412347777666655551234123476547654"; + +use once_cell::sync::Lazy; +pub static TEST_TOKEN_ADDRESS_ONE: Lazy
= + Lazy::new(|| TEST_TOKEN_ADDRESS_ONE_STRING.parse::
().unwrap()); + +pub static TEST_TOKEN_ADDRESS_TWO: Lazy
= + Lazy::new(|| TEST_TOKEN_ADDRESS_TWO_STRING.parse::
().unwrap()); + +pub static USDC_TOKEN: Lazy
= Lazy::new(|| USDC_TOKEN_STRING.parse::
().unwrap()); + +pub fn convert_to_option_string(timestamp: Option) -> Option { + timestamp.and_then(|ts| { + if ts == U256::zero() { + None + } else { + Some(ts.to_string()) + } + }) +} diff --git a/matching_engine_client/Cargo.toml b/matching_engine_client/Cargo.toml index da27127..bb7f41a 100644 --- a/matching_engine_client/Cargo.toml +++ b/matching_engine_client/Cargo.toml @@ -6,21 +6,22 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -serde_json="1.0" +actix-web = { version = "4.5.1", features = ["rustls"] } +anyhow = "1.0.86" bindings = { path = "../bindings", package = "foundry-contracts" } -serde = { version = "1.0", features = ["derive"] } -tokio = { version = "1.16.1", features = ["full"] } -actix-web = "4.3.0" -openssl = { version = "0.10", features = ["vendored"] } -ecies = {version = "0.2.6", features = ["std"]} dotenv = "0.15.0" -validator = { version = "0.18.1", features = ["derive"] } +ecies = {version = "0.2.6", features = ["std"]} env_logger = "0.11.3" -log = "0.4" -hex = "0.4" +ethers = {version = "2", features = ["abigen", "ws", "rustls"] } futures-util = "0.3" +helper = {path = "../helper", package = "helper"} +hex = "0.4" +log = "0.4" +openssl = { version = "0.10", features = ["vendored"] } secp256k1 = "0.29.0" -ethers = {version = "2.0.8", features = ["abigen", "ws", "rustls"] } -uuid = { version = "1.4.1",features = ["v4","fast-rng","macro-diagnostics"] } -actix-web-lab="0.20.2" +serde = { version = "1.0", features = ["derive"] } serde_bytes = "0.11.14" +serde_json="1.0" +tokio = { version = "1.16.1", features = ["full"] } +uuid = { version = "1.4.1",features = ["v4","fast-rng","macro-diagnostics"] } +validator = { version = "0.18.1", features = ["derive"] } \ No newline at end of file diff --git a/matching_engine_client/src/client.rs b/matching_engine_client/src/client.rs new file mode 100644 index 0000000..bc8d36b --- /dev/null +++ b/matching_engine_client/src/client.rs @@ -0,0 +1,59 @@ +use actix_web::web::Data; +use actix_web::{App, HttpServer}; +use std::sync::{Arc, Mutex}; + +use crate::handler; + +pub struct MatchingEngineClient { + enclave_key: Arc>>, + port: u16, +} + +impl MatchingEngineClient { + pub fn new(enclave_key: String, port: u16) -> Self { + let enclave_key = hex::decode(enclave_key).unwrap(); + let enclave_key = Arc::new(Mutex::new(enclave_key)); + MatchingEngineClient { enclave_key, port } + } + + pub async fn start(self, enable_ssc: bool) -> anyhow::Result<()> { + let server = HttpServer::new(move || { + App::new() + .app_data(Data::new(self.enclave_key.clone())) + .configure(handler::routes) + }); + + if enable_ssc { + let tls_config = helper::ssc::create_random_rustls_server_config(); + // Error handling for TLS configuration + if let Err(err) = tls_config { + log::error!("Failed to create TLS config: {}", err); + return Err(anyhow::Error::from(err)); + } + + let tls_config = tls_config.unwrap(); + + // Bind the server using Rustls for HTTPS + let server = server.bind_rustls(format!("0.0.0.0:{}", self.port), tls_config); + if let Err(err) = server { + log::error!("Failed to bind server with Rustls: {}", err); + return Err(anyhow::Error::from(err)); + } + + // Run the server and await + server.unwrap().run().await?; + } else { + // Bind the server using plain HTTP + let server = server.bind(format!("0.0.0.0:{}", self.port)); + if let Err(err) = server { + log::error!("Failed to bind server with HTTP: {}", err); + return Err(anyhow::Error::from(err)); + } + + // Run the server and await + server.unwrap().run().await?; + } + + Ok(()) + } +} diff --git a/matching_engine_client/src/handler.rs b/matching_engine_client/src/handler.rs index 6b87de5..e6652e0 100644 --- a/matching_engine_client/src/handler.rs +++ b/matching_engine_client/src/handler.rs @@ -1,183 +1,200 @@ -use std::io::ErrorKind; +use crate::handler_funcs::generate_config_setup::_generate_config_setup; +use crate::handler_funcs::restart_matching_engine::_restart_matching_engine; +use crate::handler_funcs::start_matching_engine::_start_matching_engine; +use crate::handler_funcs::stop_matching_engine::_stop_matching_engine; +use crate::handler_funcs::update_matching_engine_config::_update_matching_engine_config_setup; -use crate::kalypso::{ - contract_validation, generate_api_key, generate_matching_engine_config_file, - get_matching_engine_ecies_public_key, get_matching_engine_public_key, - matching_engine_config_validation, read_matching_engine_config_file, sign_addy, sign_attest, - update_matching_engine_config_file, update_matching_engine_config_with_new_data, -}; +use crate::kalypso::{get_matching_engine_ecies_public_key, get_matching_engine_public_key}; use crate::model::{ - MatchingEngineConfigSetupRequestBody, MatchingEnginePublicKeys, SignAddress, SignAttestation, - SupervisordResponse, UpdateMatchingEngineConfig, + MatchingEngineConfigSetupRequestBody, MatchingEnginePublicKeys, SupervisordResponse, + UpdateMatchingEngineConfig, }; -use crate::response::response; -use crate::supervisord::{get_matching_engine_status, start_matching_engine, stop_matching_engine}; +use crate::supervisord::get_matching_engine_status; use actix_web::http::StatusCode; +use actix_web::web::Data; use actix_web::{get, post, put, web, Responder}; -use ethers::types::BigEndianHash; -use serde_json::{json, Value}; +use helper::response::response; +use helper::sch_payload::{SCHPayload, ToPayload, ToSchResponse}; +use serde::{Deserialize, Serialize}; +use serde_json::Value; +use std::sync::{Arc, Mutex}; use validator::Validate; -// Generate API key -#[post("/generateApiKey")] -async fn generate_api_key_handler() -> impl Responder { - let api_key_response = match generate_api_key().await { - Ok(data) => data, - Err(e) => { - log::error!("{}", e); - return response( - "There was an issue in generating the API key", - StatusCode::INTERNAL_SERVER_ERROR, - None, - ); - } - }; - if !api_key_response.status { - return response(&api_key_response.message, StatusCode::UNAUTHORIZED, None); - } - - response( - &api_key_response.message, - StatusCode::OK, - Some(Value::String(api_key_response.api_key)), - ) -} +#[derive(Deserialize, Serialize)] +struct EmptyPayload {} // Start matching_engine #[post("/startMatchingEngine")] -async fn start_matching_engine_handler() -> impl Responder { - //Smart contract checks - let validation_status = contract_validation().await; - let validation_status_result = match validation_status { - Ok(data) => data, - Err(e) => { - log::error!("{}", e); - return response( - "There was an issue in validating", - StatusCode::INTERNAL_SERVER_ERROR, - None, - ); - } - }; - if !validation_status_result.status { +async fn start_matching_engine_handler(_payload: web::Json) -> impl Responder { + let result = _start_matching_engine().await; + + if result.is_ok() { + return response("Matching Engine started", StatusCode::OK, None); + } else { return response( - &validation_status_result.message, + result.unwrap_err().to_string().as_ref(), StatusCode::BAD_REQUEST, None, ); } +} + +// Start matching_engine +#[post("/startMatchingEngineEncrypted")] +async fn start_matching_engine_handler_encrypted( + _payload: web::Json, + ecies_priv_key: Data>>>, +) -> impl Responder { + let ecies_priv_key = { ecies_priv_key.lock().unwrap().clone() }; - //Starting the matching_engine with supervisord ctl - let supervisord_response = match start_matching_engine() { + // ensures that you client have received only signed messaged + let _: EmptyPayload = match _payload.0.to_payload(&ecies_priv_key) { Ok(data) => data, Err(e) => { - log::error!("{}", e); - return response( - "There was an error in starting the matching_engine", - StatusCode::INTERNAL_SERVER_ERROR, - None, - ); + log::error!("{}", &e.to_string()); + return response(&e.to_string(), StatusCode::BAD_REQUEST, None); } }; - if !supervisord_response.status { + + let result = _start_matching_engine().await; + + if result.is_ok() { + let result = result.unwrap(); + let sch_response = match _payload.0.to_sch_response(result, ecies_priv_key).await { + Ok(data) => data, + Err(e) => { + log::error!("{}", &e.to_string()); + return response(&e.to_string(), StatusCode::BAD_REQUEST, None); + } + }; return response( - &supervisord_response.output, - StatusCode::INTERNAL_SERVER_ERROR, + "Matching Engine started", + StatusCode::OK, + Some(serde_json::to_value(&sch_response).unwrap()), + ); + } else { + return response( + result.unwrap_err().to_string().as_ref(), + StatusCode::BAD_REQUEST, None, ); } - response("Matching Engine started", StatusCode::OK, None) } //Stop matching_engine #[post("/stopMatchingEngine")] -async fn stop_matching_engine_handler() -> impl Responder { - let supervisord_response = match stop_matching_engine() { - Ok(data) => data, - Err(e) => { - log::error!("{}", e); - return response( - "There was an error in stopping the matching_engine", - StatusCode::INTERNAL_SERVER_ERROR, - None, - ); - } - }; - if !supervisord_response.status { +async fn stop_matching_engine_handler(_payload: web::Json) -> impl Responder { + let result = _stop_matching_engine(); + + if result.is_ok() { + return response("Matching Engine stopped", StatusCode::OK, None); + } else { return response( - &supervisord_response.output, - StatusCode::INTERNAL_SERVER_ERROR, + result.unwrap_err().to_string().as_ref(), + StatusCode::BAD_REQUEST, None, ); } - response("Matching Engine stopped", StatusCode::OK, None) } -//Restart matching_engine -#[post("/restartMatchingEngine")] -async fn restart_matching_engine_handler() -> impl Responder { - //Smart contract checks - let validation_status = contract_validation().await; - let validation_status_result = match validation_status { +#[post("/stopMatchingEngineEncrypted")] +async fn stop_matching_engine_handler_encrypted( + _payload: web::Json, + ecies_priv_key: Data>>>, +) -> impl Responder { + let ecies_priv_key = { ecies_priv_key.lock().unwrap().clone() }; + + // ensures that you client have received only signed messaged + let _: EmptyPayload = match _payload.0.to_payload(&ecies_priv_key) { Ok(data) => data, Err(e) => { - log::error!("{}", e); - return response( - "There was an issue in validating", - StatusCode::INTERNAL_SERVER_ERROR, - None, - ); + log::error!("{}", &e.to_string()); + return response(&e.to_string(), StatusCode::BAD_REQUEST, None); } }; - if !validation_status_result.status { + + let result = _stop_matching_engine(); + + if result.is_ok() { + let result = result.unwrap(); + let sch_response = match _payload.0.to_sch_response(result, ecies_priv_key).await { + Ok(data) => data, + Err(e) => { + log::error!("{}", &e.to_string()); + return response(&e.to_string(), StatusCode::BAD_REQUEST, None); + } + }; return response( - &validation_status_result.message, + "Matching Engine Stopped", + StatusCode::OK, + Some(serde_json::to_value(&sch_response).unwrap()), + ); + } else { + return response( + result.unwrap_err().to_string().as_ref(), StatusCode::BAD_REQUEST, None, ); } +} - // Stopping matching_engine - let stop_supervisord_response = match stop_matching_engine() { - Ok(data) => data, - Err(e) => { - log::error!("{}", e); - return response( - "There was an error in stopping the matching_engine", - StatusCode::INTERNAL_SERVER_ERROR, - None, - ); - } - }; - if !stop_supervisord_response.status { +//Restart matching_engine +#[post("/restartMatchingEngine")] +async fn restart_matching_engine_handler(_payload: web::Json) -> impl Responder { + let result = _restart_matching_engine().await; + + if result.is_ok() { + return response("Matching Engine restarted", StatusCode::OK, None); + } else { return response( - &stop_supervisord_response.output, - StatusCode::INTERNAL_SERVER_ERROR, + result.unwrap_err().to_string().as_ref(), + StatusCode::BAD_REQUEST, None, ); } +} - //Starting matching_engine - let start_supervisord_response = match start_matching_engine() { +//Restart matching_engine +#[post("/restartMatchingEngineEncrypted")] +async fn restart_matching_engine_handler_encrypted( + _payload: web::Json, + ecies_priv_key: Data>>>, +) -> impl Responder { + let ecies_priv_key = { ecies_priv_key.lock().unwrap().clone() }; + + // ensures that you client have received only signed messaged + let _: EmptyPayload = match _payload.0.to_payload(&ecies_priv_key) { Ok(data) => data, Err(e) => { - log::error!("{}", e); - return response( - "There was an error in starting the matching_engine", - StatusCode::INTERNAL_SERVER_ERROR, - None, - ); + log::error!("{}", &e.to_string()); + return response(&e.to_string(), StatusCode::BAD_REQUEST, None); } }; - if !start_supervisord_response.status { + + let result = _restart_matching_engine().await; + + if result.is_ok() { + let result = result.unwrap(); + let sch_response = match _payload.0.to_sch_response(result, ecies_priv_key).await { + Ok(data) => data, + Err(e) => { + log::error!("{}", &e.to_string()); + return response(&e.to_string(), StatusCode::BAD_REQUEST, None); + } + }; return response( - &start_supervisord_response.output, - StatusCode::INTERNAL_SERVER_ERROR, + "Matching Engine restarted", + StatusCode::OK, + Some(serde_json::to_value(&sch_response).unwrap()), + ); + } else { + return response( + result.unwrap_err().to_string().as_ref(), + StatusCode::BAD_REQUEST, None, ); } - response("Matching Engine restarted", StatusCode::OK, None) } // Get matching_engine status from the supervisord @@ -212,6 +229,7 @@ async fn get_matching_engine_status_handler() -> impl Responder { #[post("/matchingEngineConfigSetup")] async fn generate_config_setup( jsonbody: web::Json, + ecies_priv_key: Data>>>, ) -> impl Responder { //Validating the main JSON body let matching_engine_config_body = &jsonbody; @@ -224,52 +242,61 @@ async fn generate_config_setup( ); } - let private_key = matching_engine_config_body - .relayer_private_key - .as_ref() - .unwrap(); + let ecies_priv_key = { ecies_priv_key.lock().unwrap().clone() }; - let chain_id = matching_engine_config_body.chain_id.as_ref().unwrap(); + let result = _generate_config_setup(matching_engine_config_body, ecies_priv_key).await; - let rpc_url = matching_engine_config_body.rpc_url.as_ref().unwrap(); - - //Validating the matching_engine config to check if the matching_engine address has enough gas. - let validation_status = matching_engine_config_validation(private_key, rpc_url, chain_id).await; - let validation_status_result = match validation_status { - Ok(data) => data, - Err(e) => { - log::error!("{}", e); - return response( - "There was an issue while validating the request", - StatusCode::INTERNAL_SERVER_ERROR, - None, - ); - } - }; - if !validation_status_result { + if result.is_ok() { + return response("Config done", StatusCode::OK, None); + } else { return response( - "Matching engine private_key doesn't have enough balance, minimum balance required is 0.05ETH", + result.unwrap_err().to_string().as_ref(), StatusCode::BAD_REQUEST, None, ); } +} - //Generating the matching_engine config file - let matching_engine_config_file = - generate_matching_engine_config_file(matching_engine_config_body).await; - match matching_engine_config_file { - Ok(data) => data, - Err(e) => { - log::error!("{}", e); - return response( - "There was an issue in matching_engine setup", - StatusCode::INTERNAL_SERVER_ERROR, - None, - ); - } - }; +// Generate config setup encrypted +#[post("/matchingEngineConfigSetupEncrypted")] +async fn generate_config_setup_encrypted( + jsonbody: web::Json, + ecies_priv_key: Data>>>, +) -> impl Responder { + let ecies_priv_key = { ecies_priv_key.lock().unwrap().clone() }; + + let matching_engine_config_body: MatchingEngineConfigSetupRequestBody = + match jsonbody.0.to_payload(&ecies_priv_key) { + Ok(data) => data, + Err(e) => { + log::error!("{}", &e.to_string()); + return response(&e.to_string(), StatusCode::BAD_REQUEST, None); + } + }; + + let result = _generate_config_setup(&matching_engine_config_body, ecies_priv_key.clone()).await; - response("Config done", StatusCode::OK, None) + if result.is_ok() { + let result = result.unwrap(); + let sch_response = match jsonbody.0.to_sch_response(result, ecies_priv_key).await { + Ok(data) => data, + Err(e) => { + log::error!("{}", &e.to_string()); + return response(&e.to_string(), StatusCode::BAD_REQUEST, None); + } + }; + return response( + "Config done", + StatusCode::OK, + Some(serde_json::to_value(&sch_response).unwrap()), + ); + } else { + return response( + result.unwrap_err().to_string().as_ref(), + StatusCode::BAD_REQUEST, + None, + ); + } } // Update matching_engine config @@ -278,90 +305,60 @@ async fn update_matching_engine_config( jsonbody: web::Json, ) -> impl Responder { let json_input = &jsonbody; - let config_file_call = read_matching_engine_config_file().await; - let config_file = match config_file_call { - Ok(data) => data, - Err(e) => { - log::error!("{}", e); - return response( - "There was an issue while updating the matching_engine config file", - StatusCode::INTERNAL_SERVER_ERROR, - None, - ); - } - }; - // Checking if the provided private_key has enough gas - let private_key = match &jsonbody.relayer_private_key { - Some(data) => data, - None => &config_file.relayer_private_key, - }; - let chain_id = match &jsonbody.chain_id { - Some(data) => data, - None => &config_file.chain_id, - }; - let rpc_url = match &jsonbody.rpc_url { - Some(data) => data, - None => &config_file.rpc_url, - }; + let result = _update_matching_engine_config_setup(json_input).await; - let validation_status = matching_engine_config_validation(private_key, rpc_url, chain_id).await; - let validation_status_result = match validation_status { - Ok(data) => data, - Err(e) => { - log::error!("{}", e); - return response( - "There was an issue while validating the request", - StatusCode::INTERNAL_SERVER_ERROR, - None, - ); - } - }; - if !validation_status_result { + if result.is_ok() { + response("Matching Engine config updated", StatusCode::OK, None) + } else { return response( - "Matching engine private_key doesn't have enough balance, minimum balance required is 0.05ETH", + result.unwrap_err().to_string().as_ref(), StatusCode::BAD_REQUEST, None, ); } +} - //Updating the matching_engine config file - let updated_matching_engine_config_data_call = - update_matching_engine_config_with_new_data(json_input, config_file).await; - let updated_matching_engine_config_data = match updated_matching_engine_config_data_call { - Ok(data) => data, - Err(e) => { - log::error!("{}", e); - return response( - "There was an issue in updating the config file", - StatusCode::INTERNAL_SERVER_ERROR, - None, - ); - } - }; +// Update matching_engine config encrypted +#[put("/updateMatchingEngineConfigEncrypted")] +async fn update_matching_engine_config_encrypted( + jsonbody: web::Json, + ecies_priv_key: Data>>>, +) -> impl Responder { + let ecies_priv_key = { ecies_priv_key.lock().unwrap().clone() }; + + let update_matching_engine_config_json: UpdateMatchingEngineConfig = + match jsonbody.0.to_payload(&ecies_priv_key) { + Ok(data) => data, + Err(e) => { + log::error!("{}", &e.to_string()); + return response(&e.to_string(), StatusCode::BAD_REQUEST, None); + } + }; - let update_config_file = - update_matching_engine_config_file(updated_matching_engine_config_data).await; - match update_config_file { - Ok(data) => data, - Err(e) => { - log::error!("{}", e); - if e.kind() == ErrorKind::NotFound { - return response( - "There was an issue in updating the config file, since the config file was not found", - StatusCode::NOT_FOUND, - None, - ); + let result = _update_matching_engine_config_setup(&update_matching_engine_config_json).await; + + if result.is_ok() { + let result = result.unwrap(); + let sch_response = match jsonbody.0.to_sch_response(result, ecies_priv_key).await { + Ok(data) => data, + Err(e) => { + log::error!("{}", &e.to_string()); + return response(&e.to_string(), StatusCode::BAD_REQUEST, None); } - return response( - "There was an issue in updating the config file", - StatusCode::INTERNAL_SERVER_ERROR, - None, - ); - } + }; + return response( + "Matching Engine config updated", + StatusCode::OK, + Some(serde_json::to_value(&sch_response).unwrap()), + ); + } else { + return response( + result.unwrap_err().to_string().as_ref(), + StatusCode::BAD_REQUEST, + None, + ); } - - response("Matching Engine config updated", StatusCode::OK, None) } // Get matching_engine status from the supervisord @@ -405,63 +402,25 @@ async fn get_matching_engine_public_keys() -> impl Responder { ) } -// Sign Address -#[post("/signAddress")] -async fn sign_address(jsonbody: web::Json) -> impl Responder { - //Validating inputs - let json_input = &jsonbody.0; - if let Err(err) = json_input.validate() { - log::error!("{}", err); - return response( - "Invalid payload", - StatusCode::BAD_REQUEST, - Some(Value::String(err.to_string())), - ); - } - let addy_to_be_signed = json_input.address.as_ref().unwrap(); - let signed = sign_addy(addy_to_be_signed).await.unwrap(); - let signature = json!({ - "r": ethers::types::H256::from_uint(&signed.r), - "s": ethers::types::H256::from_uint(&signed.s), - "v": signed.v - }); - response("Address signed", StatusCode::OK, Some(signature)) -} - -// Sign Attestaion -#[post("/signAttestation")] -async fn sign_attestation(jsonbody: web::Json) -> impl Responder { - // Validating inputs - let json_input = &jsonbody.0; - if let Err(err) = json_input.validate() { - log::error!("{}", err); - return response( - "Invalid attestation", - StatusCode::BAD_REQUEST, - Some(Value::String(err.to_string())), - ); - } - let signed = sign_attest(jsonbody.0).await.unwrap(); - let signature = json!({ - "r": ethers::types::H256::from_uint(&signed.r), - "s": ethers::types::H256::from_uint(&signed.s), - "v": signed.v - }); - response("Attestation signed", StatusCode::OK, Some(signature)) -} - // Routes pub fn routes(conf: &mut web::ServiceConfig) { let scope = web::scope("/api") - .service(generate_api_key_handler) .service(start_matching_engine_handler) + .service(start_matching_engine_handler_encrypted) .service(stop_matching_engine_handler) + .service(start_matching_engine_handler_encrypted) .service(restart_matching_engine_handler) + .service(restart_matching_engine_handler_encrypted) .service(get_matching_engine_status_handler) .service(generate_config_setup) + .service(generate_config_setup_encrypted) .service(get_matching_engine_public_keys) .service(update_matching_engine_config) - .service(sign_address) - .service(sign_attestation); + .service(update_matching_engine_config_encrypted) + .service(helper::common_handlers::sign_address) + .service(helper::common_handlers::sign_attestation) + .service(helper::common_handlers::sign_address_encrypted) + .service(helper::common_handlers::sign_attestation_encrypted); + conf.service(scope); } diff --git a/matching_engine_client/src/handler_funcs/generate_config_setup.rs b/matching_engine_client/src/handler_funcs/generate_config_setup.rs new file mode 100644 index 0000000..5df9c91 --- /dev/null +++ b/matching_engine_client/src/handler_funcs/generate_config_setup.rs @@ -0,0 +1,43 @@ +use serde_json::{json, Value}; + +use crate::{ + kalypso::{generate_matching_engine_config_file, matching_engine_config_validation}, + model::MatchingEngineConfigSetupRequestBody, +}; + +pub async fn _generate_config_setup( + matching_engine_config_body: &MatchingEngineConfigSetupRequestBody, + ecies_priv_key: Vec, +) -> anyhow::Result { + let chain_id = matching_engine_config_body.chain_id.as_ref().unwrap(); + + let rpc_url = matching_engine_config_body.rpc_url.as_ref().unwrap(); + + let private_key = matching_engine_config_body + .relayer_private_key + .as_ref() + .unwrap(); + + //Validating the matching_engine config to check if the matching_engine address has enough gas. + let validation_status = matching_engine_config_validation(private_key, rpc_url, chain_id).await; + let validation_status_result = match validation_status { + Ok(data) => data, + Err(e) => return Err(anyhow::Error::msg(e.to_string())), + }; + + if !validation_status_result { + return Err(anyhow::Error::msg("Matching engine private_key doesn't have enough balance, minimum balance required is 0.05ETH".to_string())); + } + + let ecies_priv_key = hex::encode(ecies_priv_key); + + //Generating the matching_engine config file + let matching_engine_config_file = + generate_matching_engine_config_file(matching_engine_config_body, ecies_priv_key).await; + match matching_engine_config_file { + Ok(data) => data, + Err(e) => return Err(anyhow::Error::msg(e.to_string())), + }; + + Ok(json!({})) +} diff --git a/matching_engine_client/src/handler_funcs/mod.rs b/matching_engine_client/src/handler_funcs/mod.rs new file mode 100644 index 0000000..bd80805 --- /dev/null +++ b/matching_engine_client/src/handler_funcs/mod.rs @@ -0,0 +1,5 @@ +pub mod generate_config_setup; +pub mod restart_matching_engine; +pub mod start_matching_engine; +pub mod stop_matching_engine; +pub mod update_matching_engine_config; diff --git a/matching_engine_client/src/handler_funcs/restart_matching_engine.rs b/matching_engine_client/src/handler_funcs/restart_matching_engine.rs new file mode 100644 index 0000000..ff7f9f5 --- /dev/null +++ b/matching_engine_client/src/handler_funcs/restart_matching_engine.rs @@ -0,0 +1,56 @@ +use serde_json::{json, Value}; + +use crate::{ + kalypso::contract_validation, + supervisord::{start_matching_engine, stop_matching_engine}, +}; + +pub async fn _restart_matching_engine() -> anyhow::Result { + let validation_status = contract_validation().await; + let validation_status_result = match validation_status { + Ok(data) => data, + Err(e) => { + log::error!("{}", e); + return Err(anyhow::Error::msg( + "There was an issue in validating".to_string(), + )); + } + }; + if !validation_status_result.status { + return Err(anyhow::Error::msg( + validation_status_result.message.to_string(), + )); + } + + // Stopping matching_engine + let stop_supervisord_response = match stop_matching_engine() { + Ok(data) => data, + Err(e) => { + log::error!("{}", e); + return Err(anyhow::Error::msg(e.to_string())); + } + }; + if !stop_supervisord_response.status { + return Err(anyhow::Error::msg( + "stop_supervisord_response.output".to_string(), + )); + } + + //Starting matching_engine + let start_supervisord_response = match start_matching_engine() { + Ok(data) => data, + Err(e) => { + log::error!("{}", e); + return Err(anyhow::Error::msg( + "There was an error in starting the matching_engine".to_string(), + )); + } + }; + if !start_supervisord_response.status { + return Err(anyhow::Error::msg( + start_supervisord_response.output.to_string(), + )); + } + + Ok(json!({})) +} diff --git a/matching_engine_client/src/handler_funcs/start_matching_engine.rs b/matching_engine_client/src/handler_funcs/start_matching_engine.rs new file mode 100644 index 0000000..a37c1ea --- /dev/null +++ b/matching_engine_client/src/handler_funcs/start_matching_engine.rs @@ -0,0 +1,38 @@ +use serde_json::{json, Value}; + +use crate::{kalypso::contract_validation, supervisord::start_matching_engine}; + +pub async fn _start_matching_engine() -> anyhow::Result { + //Smart contract checks + let validation_status = contract_validation().await; + let validation_status_result = match validation_status { + Ok(data) => data, + Err(e) => { + log::error!("{}", e); + return Err(anyhow::Error::msg( + "There was an issue in validating".to_string(), + )); + } + }; + if !validation_status_result.status { + return Err(anyhow::Error::msg( + validation_status_result.message.to_string(), + )); + } + + //Starting the matching_engine with supervisord ctl + let supervisord_response = match start_matching_engine() { + Ok(data) => data, + Err(e) => { + log::error!("{}", e); + return Err(anyhow::Error::msg( + "There was an error in starting the matching_engine".to_string(), + )); + } + }; + if !supervisord_response.status { + return Err(anyhow::Error::msg(supervisord_response.output.to_string())); + } + + Ok(json!({})) +} diff --git a/matching_engine_client/src/handler_funcs/stop_matching_engine.rs b/matching_engine_client/src/handler_funcs/stop_matching_engine.rs new file mode 100644 index 0000000..7f29b3f --- /dev/null +++ b/matching_engine_client/src/handler_funcs/stop_matching_engine.rs @@ -0,0 +1,22 @@ +use serde_json::{json, Value}; + +use crate::supervisord::stop_matching_engine; + +pub fn _stop_matching_engine() -> anyhow::Result { + let supervisord_response = match stop_matching_engine() { + Ok(data) => data, + Err(e) => { + log::error!("{}", e); + return Err(anyhow::Error::msg( + "There was an error in stopping the matching_engine".to_string(), + )); + } + }; + if !supervisord_response.status { + return Err(anyhow::Error::msg( + "supervisord_response.output".to_string(), + )); + } + + Ok(json!({})) +} diff --git a/matching_engine_client/src/handler_funcs/update_matching_engine_config.rs b/matching_engine_client/src/handler_funcs/update_matching_engine_config.rs new file mode 100644 index 0000000..a2e8a3c --- /dev/null +++ b/matching_engine_client/src/handler_funcs/update_matching_engine_config.rs @@ -0,0 +1,60 @@ +use serde_json::{json, Value}; + +use crate::{ + kalypso::{ + matching_engine_config_validation, read_matching_engine_config_file, + update_matching_engine_config_file, update_matching_engine_config_with_new_data, + }, + model::UpdateMatchingEngineConfig, +}; + +pub async fn _update_matching_engine_config_setup( + jsonbody: &UpdateMatchingEngineConfig, +) -> anyhow::Result { + let config_file_call = read_matching_engine_config_file().await; + let config_file = match config_file_call { + Ok(data) => data, + Err(e) => return Err(anyhow::Error::msg(e.to_string())), + }; + + // Checking if the provided private_key has enough gas + let private_key = match &jsonbody.relayer_private_key { + Some(data) => data, + None => &config_file.relayer_private_key, + }; + let chain_id = match &jsonbody.chain_id { + Some(data) => data, + None => &config_file.chain_id, + }; + let rpc_url = match &jsonbody.rpc_url { + Some(data) => data, + None => &config_file.rpc_url, + }; + + let validation_status = matching_engine_config_validation(private_key, rpc_url, chain_id).await; + let validation_status_result = match validation_status { + Ok(data) => data, + Err(e) => return Err(anyhow::Error::msg(e.to_string())), + }; + + if !validation_status_result { + return Err(anyhow::Error::msg("Matching engine private_key doesn't have enough balance, minimum balance required is 0.05ETH".to_string())); + } + + //Updating the matching_engine config file + let updated_matching_engine_config_data_call = + update_matching_engine_config_with_new_data(jsonbody, config_file).await; + let updated_matching_engine_config_data = match updated_matching_engine_config_data_call { + Ok(data) => data, + Err(e) => return Err(anyhow::Error::msg(e.to_string())), + }; + + let update_config_file = + update_matching_engine_config_file(updated_matching_engine_config_data).await; + match update_config_file { + Ok(data) => data, + Err(e) => return Err(anyhow::Error::msg(e.to_string())), + } + + Ok(json!({})) +} diff --git a/matching_engine_client/src/kalypso.rs b/matching_engine_client/src/kalypso.rs index 234b9a1..9fb2897 100644 --- a/matching_engine_client/src/kalypso.rs +++ b/matching_engine_client/src/kalypso.rs @@ -1,7 +1,6 @@ use std::str::FromStr; use std::sync::Arc; -use actix_web::web::Json; use ecies::{PublicKey, SecretKey}; use ethers::prelude::*; use ethers::providers::Provider; @@ -9,11 +8,10 @@ use serde_bytes::ByteBuf; use tokio::fs; use tokio::fs::File; use tokio::io::AsyncReadExt; -use uuid::Uuid; use crate::model::{ - ApiGenerationResponse, ApiKeyFile, MatchingEngineConfig, MatchingEngineConfigSetupRequestBody, - SignAttestation, UpdateMatchingEngineConfig, ValidationResponse, VerifyApiResponse, + ApiKeyFile, MatchingEngineConfig, MatchingEngineConfigSetupRequestBody, + UpdateMatchingEngineConfig, ValidationResponse, VerifyApiResponse, }; macro_rules! update_field { @@ -24,46 +22,7 @@ macro_rules! update_field { }; } -//generating API key -pub async fn generate_api_key() -> Result> { - //Checking if the config folder is already generated, if not creating a new one - let folder_path = "../matching_engine_config"; - if fs::metadata(&folder_path).await.is_ok() { - log::info!("matching_engine_config folder already exists!"); - } else { - fs::create_dir(&folder_path) - .await - .expect("Unable to create new folder"); - } - - //Checking if the API key was already generated - if fs::metadata("../matching_engine_config/api_key.json") - .await - .is_ok() - { - log::info!("api_key.json already exists!"); - return Ok(ApiGenerationResponse { - api_key: "".to_string(), - status: false, - message: "API was already generated. It cannot be generated again".to_string(), - }); - } - - let api_key = Uuid::new_v4(); - let api_key_file = ApiKeyFile { - api_key: api_key.to_string(), - }; - let json_string = serde_json::to_string(&api_key_file)?; - let mut file = File::create("../matching_engine_config/api_key.json").await?; - tokio::io::AsyncWriteExt::write_all(&mut file, json_string.as_bytes()).await?; - Ok(ApiGenerationResponse { - api_key: api_key.to_string(), - status: true, - message: "API key generated. Please save this API key somewhere safe, it cannot be generated again.".to_string(), - }) -} - -//Verify api key +#[allow(unused)] pub async fn verify_api_key( request_api_key: &str, ) -> Result> { @@ -99,6 +58,7 @@ pub async fn verify_api_key( //Generate matching engine config file pub async fn generate_matching_engine_config_file( me_config_body: &MatchingEngineConfigSetupRequestBody, + ecies_private_key: String, ) -> Result<(), Box> { // Create config_file_folder let folder_path = "../matching_engine_config"; @@ -110,14 +70,7 @@ pub async fn generate_matching_engine_config_file( .expect("Unable to create new folder"); } - // Generate a random private key - // Get enclave private key - let key_path = "app/secp.sec"; - let mut file = File::open(key_path).await?; - let mut priv_key = [0u8; 32]; - file.read_exact(&mut priv_key).await?; - - let matching_engine_key = ByteBuf::from(priv_key); + let matching_engine_key = ByteBuf::from(hex::decode(ecies_private_key).unwrap()); //Structure data let config_file_path = folder_path.to_string() + "/matching_engine_config.json"; @@ -160,7 +113,7 @@ pub async fn generate_matching_engine_config_file( } pub async fn update_matching_engine_config_with_new_data( - json_input: &Json, + json_input: &UpdateMatchingEngineConfig, mut config_file: MatchingEngineConfig, ) -> Result> { let config = &mut config_file; @@ -352,42 +305,3 @@ pub async fn contract_validation() -> Result Result> { - //Using the enclave secp secret for ecies private key - let read_secp_private_key = fs::read("/app/secp.sec").await?; - let secp_private_key = secp256k1::SecretKey::from_slice(&read_secp_private_key) - .unwrap() - .display_secret() - .to_string(); - let signer = secp_private_key.parse::().unwrap(); - let values = vec![ethers::abi::Token::Address(Address::from_str(address)?)]; - let encoded = ethers::abi::encode(&values); - let digest = ethers::utils::keccak256(encoded); - let signature = signer.sign_message(ethers::types::H256(digest)).await?; - Ok(signature) -} - -pub async fn sign_attest( - attestation: SignAttestation, -) -> Result> { - // Using enclave private key for signature - let secp_file = fs::read("/app/secp.sec").await?; - let secp_private_key = secp256k1::SecretKey::from_slice(&secp_file) - .unwrap() - .display_secret() - .to_string(); - let signer = secp_private_key.parse::().unwrap(); - let attestation_bytes = attestation.attestation.unwrap(); - let attestation_string: Vec<&str> = attestation_bytes.split('x').collect(); - let attestation_decoded = hex::decode(attestation_string[1]).unwrap(); - let address = attestation.address.unwrap(); - let values = vec![ - ethers::abi::Token::Bytes(attestation_decoded), - ethers::abi::Token::Address(Address::from_str(&address)?), - ]; - let encoded = ethers::abi::encode(&values); - let digest = ethers::utils::keccak256(encoded); - let signature = signer.sign_message(ethers::types::H256(digest)).await?; - Ok(signature) -} diff --git a/matching_engine_client/src/lib.rs b/matching_engine_client/src/lib.rs new file mode 100644 index 0000000..9dc76f6 --- /dev/null +++ b/matching_engine_client/src/lib.rs @@ -0,0 +1,6 @@ +pub mod client; +mod handler; +mod handler_funcs; +mod kalypso; +mod model; +mod supervisord; diff --git a/matching_engine_client/src/main.rs b/matching_engine_client/src/main.rs index 330f0b2..b1e3d66 100644 --- a/matching_engine_client/src/main.rs +++ b/matching_engine_client/src/main.rs @@ -1,12 +1,6 @@ -mod handler; -mod kalypso; -mod middleware; -mod model; -mod response; -mod supervisord; - -use actix_web::{App, HttpServer}; use dotenv::dotenv; +use matching_engine_client::client; +use tokio::fs; use std::env; @@ -16,16 +10,18 @@ async fn main() -> std::io::Result<()> { env_logger::init_from_env(env_logger::Env::new().default_filter_or("info")); let port: u16 = env::var("PORT") - .unwrap_or_else(|_| panic!("PORT must be provided in the .env file")) + .unwrap_or_else(|_| "5000".to_string()) .parse::() .expect("PORT must be a valid number"); - let server = HttpServer::new(move || App::new().configure(handler::routes)) - .bind(("0.0.0.0", port)) - .unwrap_or_else(|_| panic!("Can not bind to {}", &port)) - .run(); + let enclave_key = match fs::read("/app/secp.sec").await { + Ok(key) => key, + Err(_) => fs::read("./app/secp.sec").await?, + }; + + let server = client::MatchingEngineClient::new(hex::encode(enclave_key), port); - log::info!("matching-engine-client started on port {}", port); + server.start(false).await.unwrap(); - server.await + Ok(()) } diff --git a/matching_engine_client/src/middleware.rs b/matching_engine_client/src/middleware.rs index e9c5bba..f5e64e2 100644 --- a/matching_engine_client/src/middleware.rs +++ b/matching_engine_client/src/middleware.rs @@ -6,7 +6,8 @@ use actix_web::{ }; use actix_web_lab::middleware::Next; -use crate::{kalypso::verify_api_key, response::response}; +use crate::kalypso::verify_api_key; +use helper::response::response; #[allow(unused)] pub async fn api_auth( diff --git a/matching_engine_client/src/model.rs b/matching_engine_client/src/model.rs index f9affef..0e24ff0 100644 --- a/matching_engine_client/src/model.rs +++ b/matching_engine_client/src/model.rs @@ -11,14 +11,10 @@ pub struct ApiKeyFile { pub api_key: String, } -pub struct ApiGenerationResponse { - pub api_key: String, - pub status: bool, - pub message: String, -} - pub struct VerifyApiResponse { + #[allow(unused)] pub status: bool, + #[allow(unused)] pub message: String, } diff --git a/matching_engine_client/src/response.rs b/matching_engine_client/src/response.rs deleted file mode 100644 index 4097dc2..0000000 --- a/matching_engine_client/src/response.rs +++ /dev/null @@ -1,63 +0,0 @@ -use actix_web::http::StatusCode; -use actix_web::HttpResponse; -use serde::Serialize; -use serde_json::Value; - -#[derive(Serialize)] -struct JsonResponse { - status: String, - message: String, - data: Option, -} - -struct ResponseOptions { - data: Option, - message: String, - status_code: StatusCode, -} - -struct ResponseHandler { - options: ResponseOptions, -} - -impl ResponseHandler { - fn new(options: ResponseOptions) -> Self { - ResponseHandler { options } - } - - fn create_json_response(self) -> JsonResponse { - let status = if self.options.status_code == StatusCode::OK { - "success".to_string() - } else { - "error".to_string() - }; - - JsonResponse { - status, - message: self.options.message, - data: self.options.data, - } - } - - fn create_http_response(self) -> HttpResponse { - let status_code = self.options.status_code; - let json_resp = self.create_json_response(); - HttpResponse::build(status_code).json(json_resp) - } -} - -//Generate response -pub fn response( - message: &str, - status_code: StatusCode, - data: Option, -) -> HttpResponse { - let options = ResponseOptions { - data, - message: message.to_string(), - status_code, - }; - - let response_handler = ResponseHandler::new(options); - response_handler.create_http_response() -} diff --git a/params/transfer_params.bin b/params/transfer_params.bin deleted file mode 100644 index ee9cae9..0000000 Binary files a/params/transfer_params.bin and /dev/null differ diff --git a/params/transfer_params_prod.bin b/params/transfer_params_prod.bin deleted file mode 100644 index 6502a38..0000000 Binary files a/params/transfer_params_prod.bin and /dev/null differ diff --git a/params/transfer_params_test.bin b/params/transfer_params_test.bin deleted file mode 100644 index e020830..0000000 Binary files a/params/transfer_params_test.bin and /dev/null differ diff --git a/slasher/Cargo.toml b/slasher/Cargo.toml new file mode 100644 index 0000000..aa2a622 --- /dev/null +++ b/slasher/Cargo.toml @@ -0,0 +1,21 @@ +[package] +name = "slasher" +version = "0.1.0" +edition = "2021" + +[dependencies] +anyhow = "1.0.86" +bindings = { path = "../bindings", package = "foundry-contracts" } +dotenv = "0.15.0" +env_logger = "0.11.3" +ethers = { version = "2", features = ["rustls"] } +log = "0.4" +matching_engine_helpers = { path = "../matching_engine", package = "matching_engine" } +reqwest = { version = "0.12.4", features = ["json"] } +serde = { version = "1.0.178", features = ["derive"] } +serde_json = "1.0.104" +tokio = { version = "1.15.0", features = ["full"] } + +[features] +default = [] +force_transactions = [] \ No newline at end of file diff --git a/slasher/src/main.rs b/slasher/src/main.rs new file mode 100644 index 0000000..89aca0c --- /dev/null +++ b/slasher/src/main.rs @@ -0,0 +1,260 @@ +use std::str::FromStr; +use std::{fs, sync::Arc}; + +use anyhow::Result; +use dotenv::dotenv; +use ethers::prelude::*; +use k256::ecdsa::SigningKey; +use matching_engine_helpers::ask_lib::ask_status::AskState; +use reqwest::Client; +use serde::{Deserialize, Serialize}; +use tokio::time::{sleep, Duration}; + +#[tokio::main] +async fn main() -> Result<(), Box> { + dotenv().ok(); + env_logger::init_from_env(env_logger::Env::new().default_filter_or("info")); + + let slashing_config = "../matching_engine_config/matching_engine_config.json".to_string(); + let alt_slashing_config = "./matching_engine_config/matching_engine_config.json".to_string(); + let file_content = fs::read_to_string(&slashing_config) + .or_else(|_| fs::read_to_string(&alt_slashing_config))?; + + let config: SlashingInstanceConfig = serde_json::from_str(&file_content)?; + // slashing_config and matching_engine config are same, hence using same config... + + let indexer_url = std::env::var("INDEXER_URL").expect(&format!("{} is not set", "INDEXER_URL")); + let slashing_instance = SlashingInstance::new(indexer_url.as_ref(), config); + + let _ = slashing_instance.run().await?; + Ok(()) +} + +type ProofMarketplaceInstance = bindings::proof_marketplace::ProofMarketplace< + SignerMiddleware, Wallet>, +>; +pub struct SlashingInstance { + indexer_url: String, + client: Client, + #[allow(unused)] + config: SlashingInstanceConfig, + proof_marketplace: ProofMarketplaceInstance, + reward_address: Address, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct SlashingInstanceConfig { + pub proof_market_place: String, + pub rpc_url: String, + #[serde(alias = "relayer_private_key")] + pub slasher_key: String, + pub chain_id: String, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +struct Operator { + address: String, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +struct OperatorQueryResult { + result: Vec, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +struct ActiveRequest { + ask_id: String, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +struct SingleOperatorQueryResult { + active_jobs_list: Vec, +} + +impl SlashingInstance { + fn new(indexer_url: &str, config: SlashingInstanceConfig) -> Self { + let slasher_key = config.clone().slasher_key; + let slasher_key = slasher_key + .parse::() + .unwrap() + .with_chain_id(U64::from_dec_str(&config.chain_id).unwrap().as_u64()); + + let provider_http = Provider::::try_from(&config.rpc_url) + .unwrap() + .with_signer(slasher_key.clone()); + + let client = Arc::new(provider_http.clone()); + + // Creating contract instance for proof market place + let proof_market_place_var = config.clone().proof_market_place; + let proof_marketplace_address = Address::from_str(&proof_market_place_var).unwrap(); + + let proof_marketplace = bindings::proof_marketplace::ProofMarketplace::new( + proof_marketplace_address, + client.clone(), + ); + + Self { + indexer_url: indexer_url.into(), + client: Client::new(), + config, + proof_marketplace, + reward_address: slasher_key.address(), + } + } + + pub async fn run(&self) -> Result<()> { + loop { + let operators = match self.get_generators().await { + Ok(data) => data, + Err(err) => { + log::error!("{}", err); + vec![] + } + }; + + for operator in operators.iter() { + let active_requests = self.active_requests(operator.address.clone()).await?; + for active_request in active_requests.iter() { + log::warn!( + "Found Active Request with ask_id: {}", + active_request.ask_id + ); + let ask_id = match U256::from_dec_str(&active_request.ask_id) { + Ok(data) => data, + Err(err) => { + log::error!("{}", err.to_string()); + log::error!("Invalid Ask ID received"); + continue; + } + }; + let ask_state = match self.proof_marketplace.get_ask_state(ask_id).await { + Ok(data) => data, + Err(err) => { + log::error!("{}", err.to_string()); + log::error!("Failed Fetching Ask State"); + continue; + } + }; + + let ask_state = + matching_engine_helpers::ask_lib::ask_status::get_ask_state(ask_state); + + if ask_state == AskState::DeadlineCrossed || ask_state == AskState::Assigned { + let mut slashing_transaction = self + .proof_marketplace + .slash_generator(ask_id, self.reward_address); + + if cfg!(feature = "force_transactions") { + slashing_transaction = slashing_transaction.gas(10_000_000); + } + + let slashing_transaction = match slashing_transaction.send().await { + Ok(data) => data.confirmations(10), + Err(err) => { + log::error!("{}", err); + log::error!("failed sending the transaction"); + continue; + } + }; + + let slashing_transaction = match slashing_transaction.await { + Ok(data) => data, + Err(err) => { + log::error!("{}", err.to_string()); + log::error!("Failed broadcasting transaction"); + continue; + } + }; + + let slashing_transaction = match slashing_transaction { + Some(data) => data, + _ => { + log::warn!("Broadcasted transaction, but failed getting receipt"); + continue; + } + }; + + log::info!( + "Slashed Ask: {}, tx: {:?}", + ask_id, + slashing_transaction.transaction_hash + ); + } + + if ask_state == AskState::UnAssigned { + let mut cancellation_transaction = + self.proof_marketplace.cancel_ask(ask_id); + + if cfg!(feature = "force_transactions") { + cancellation_transaction = cancellation_transaction.gas(10_000_000); + } + + let cancellation_transaction = match cancellation_transaction.send().await { + Ok(data) => data.confirmations(10), + Err(err) => { + log::error!("{}", err); + log::error!("failed sending the transaction"); + continue; + } + }; + + let cancellation_transaction = match cancellation_transaction.await { + Ok(data) => data, + Err(err) => { + log::error!("{}", err.to_string()); + log::error!("Failed broadcasting transaction"); + continue; + } + }; + + let cancellation_transaction = match cancellation_transaction { + Some(data) => data, + _ => { + log::warn!("Broadcasted transaction, but failed getting receipt"); + continue; + } + }; + + log::info!( + "Cancelled Ask: {}, tx: {:?}", + ask_id, + cancellation_transaction.transaction_hash + ); + } + } + } + sleep(Duration::from_secs(10)).await; + } + } + + async fn active_requests(&self, operator_address: String) -> Result> { + let url = format!("{}/ui/generator/{}", self.indexer_url, operator_address); + let response = self.client.get(&url).send().await?; + + if response.status().is_success() { + let operator_query_result: SingleOperatorQueryResult = response.json().await?; + return Ok(operator_query_result.active_jobs_list); + } else { + log::error!( + "Failed to fetch generator/{}: HTTP {}", + operator_address, + response.status() + ); + return Ok(vec![]); + } + } + + async fn get_generators(&self) -> Result> { + let url = format!("{}/ui/generators", self.indexer_url); + let response = self.client.get(&url).send().await?; + + if response.status().is_success() { + let operators: OperatorQueryResult = response.json().await?; + return Ok(operators.result); + } else { + log::error!("Failed to fetch generators: HTTP {}", response.status()); + return Ok(vec![]); + } + } +} diff --git a/test_get_PrivInput.sh b/test_get_PrivInput.sh deleted file mode 100644 index 8036881..0000000 --- a/test_get_PrivInput.sh +++ /dev/null @@ -1,16 +0,0 @@ -curl -X POST http://localhost:3000/getPrivInput \ - -H "Content-Type: application/json" \ - -d '{ - "ask_id": "1", - "ivs_pubkey": "04dea308a0d2b8f80f2304818df0eaea9da11d082e58c5018e04d37662b7db2b051d9475505986ed42d099cecbe6f5e5d824ee272d979fae9803190340420dd399", - "signature": "eee8c507bdf5609746c1ffed667862e94c0e5c9017ef9f059e99c822d2fc295a05c8c77de461d66e8a4877b7c7a73989ca1e191caba9e56e094ec03ffb02e1ac28" - }' - - - # it.only("Generate some signature", async() => { - # const askId = "1"; - # const signature = await ivsEnclave.signMessage(askId); - # const ivs_pubkey = ivsEnclave.getUncompressedPubkey(); - - # console.log({askId, ivs_pubkey, signature}) - # }) \ No newline at end of file diff --git a/test_get_ask_status.sh b/test_get_ask_status.sh deleted file mode 100644 index 71a54e2..0000000 --- a/test_get_ask_status.sh +++ /dev/null @@ -1,5 +0,0 @@ -curl -X POST http://localhost:3000/getAskStatus \ - -H "Content-Type: application/json" \ - -d '{ - "ask_id": "1" - }'