From a734d9472d68d92744cd0f7ee7c77e7fdb2c4aa6 Mon Sep 17 00:00:00 2001 From: "enrico.eth" <85900164+enricobottazzi@users.noreply.github.com> Date: Tue, 28 Nov 2023 12:13:51 +0100 Subject: [PATCH] `Mst` efficiency improvement (#188) * feat: tree building rules * feat: add `get_middle_node_hash_preimage` and `get_middle_node_hash_preimage` methods * feat: update `generate_proof` * fix: `generate_proof` * fix: modify middle nodes hashing logic in circuit * feat: update `MerkleProof` * feat: add further constraint on `MstInclusionCircuit` * feat: rm `test_balance_not_in_range` * refactor: update `MerkleProof` * chore: fix `backend` * test: fix `backend` * fix: testing * fix: modify `MstInclusionCircuit` struct * Revert "fix: modify `MstInclusionCircuit` struct" This reverts commit e3ba8e6506c4e8076b1a0eec775931687414f3eb. * chore: update `benches` * fix: move poseidon hasher APIs to `Node` * chore: add guide on `MerkleProof ` * chore: update `where` clause in backend * chore: update comments * chore: move `generate_leaf_hash` outside of `zk_prover` * chore: add `ethers` legacy feature * chore: update verifier contract * fix: removed minting erc20 on the backend test * chore: rm unused imports * feat: remove `Node::leaf()` * feat: rm `Node::middle()` * Revert "feat: remove `Node::leaf()`" This reverts commit ae539a236c2b8c5b7db54ae63669436107964ee1. * chore: DRY code --------- Co-authored-by: sifnoc --- backend/Cargo.lock | 1 + backend/Cargo.toml | 3 +- backend/README.md | 2 +- backend/examples/summa_solvency_flow.rs | 7 +- backend/scripts/update_verifier_contract.sh | 9 +- backend/src/apis/mod.rs | 22 + backend/src/apis/round.rs | 23 +- .../src/contracts/abi/InclusionVerifier.json | 2 +- backend/src/contracts/deployments.json | 2 +- .../contracts/generated/inclusion_verifier.rs | 3950 +++++++++-------- backend/src/tests.rs | 25 +- contracts/src/InclusionVerifier.sol | 2 +- contracts/src/InclusionVerifier.yul | 62 +- zk_prover/README.md | 25 +- zk_prover/benches/full_solvency_flow.rs | 15 +- .../commitment_solidity_calldata.json | 2 +- zk_prover/examples/gen_inclusion_verifier.rs | 4 +- .../inclusion_proof_solidity_calldata.json | 4 +- .../examples/nova_incremental_verifier.rs | 2 +- zk_prover/prints/mst-inclusion-layout.png | Bin 1759345 -> 1914487 bytes zk_prover/src/chips/merkle_sum_tree.rs | 32 +- zk_prover/src/circuits/merkle_sum_tree.rs | 214 +- zk_prover/src/circuits/tests.rs | 183 +- zk_prover/src/merkle_sum_tree/mod.rs | 20 +- zk_prover/src/merkle_sum_tree/mst.rs | 30 +- zk_prover/src/merkle_sum_tree/node.rs | 110 +- zk_prover/src/merkle_sum_tree/tests.rs | 63 +- zk_prover/src/merkle_sum_tree/tree.rs | 163 +- .../src/merkle_sum_tree/utils/build_tree.rs | 17 +- .../utils/generate_leaf_hash.rs | 19 - zk_prover/src/merkle_sum_tree/utils/hash.rs | 36 - zk_prover/src/merkle_sum_tree/utils/mod.rs | 4 - 32 files changed, 2605 insertions(+), 2448 deletions(-) mode change 100644 => 100755 backend/scripts/update_verifier_contract.sh delete mode 100644 zk_prover/src/merkle_sum_tree/utils/generate_leaf_hash.rs delete mode 100644 zk_prover/src/merkle_sum_tree/utils/hash.rs diff --git a/backend/Cargo.lock b/backend/Cargo.lock index 67b7408b..a3cdd3ca 100644 --- a/backend/Cargo.lock +++ b/backend/Cargo.lock @@ -3766,6 +3766,7 @@ dependencies = [ "futures", "halo2_proofs", "num-bigint 0.4.3", + "num-traits", "reqwest", "serde", "serde_json", diff --git a/backend/Cargo.toml b/backend/Cargo.toml index 11918d69..6afe132b 100644 --- a/backend/Cargo.toml +++ b/backend/Cargo.toml @@ -13,12 +13,13 @@ futures = "0.3.28" num-bigint = "0.4.3" serde = { version = "1.0.166", features = ["derive"] } snark-verifier-sdk = { git = "https://github.com/privacy-scaling-explorations/snark-verifier", version = "0.1.1" } -ethers = { version = "2.0.7", default-features = false, features = ["ethers-solc","legacy"] } +ethers = { version = "2.0.7", default-features = false, features = ["ethers-solc", "legacy"] } reqwest = { version = "0.11", features = ["json"] } serde_json = "1.0.64" tokio = { version = "1.7.1", features = ["full"] } base64 = "0.13" bincode = "1.3.3" +num-traits = "0.2.14" [build-dependencies] ethers = { version = "2.0.7", default-features = false, features = ["ethers-solc", "legacy"] } diff --git a/backend/README.md b/backend/README.md index 735a52f4..ced8177a 100644 --- a/backend/README.md +++ b/backend/README.md @@ -62,7 +62,7 @@ We have provided a bash script to automate the process of updating the verifier Ensure you have the necessary permissions to execute the script. ``` -backend $ chmod +x scripts/update_verifier_contract.sh +backend $ scripts/update_verifier_contract.sh ``` ## Summa solvency flow example diff --git a/backend/examples/summa_solvency_flow.rs b/backend/examples/summa_solvency_flow.rs index 92d17cae..0199c5b4 100644 --- a/backend/examples/summa_solvency_flow.rs +++ b/backend/examples/summa_solvency_flow.rs @@ -7,12 +7,13 @@ use serde_json::{from_reader, to_string_pretty}; use summa_backend::{ apis::{ address_ownership::AddressOwnership, + leaf_hash_from_inputs, round::{MstInclusionProof, Round}, }, contracts::signer::{AddressInput, SummaSigner}, tests::initialize_test_env, }; -use summa_solvency::merkle_sum_tree::{utils::generate_leaf_hash, MerkleSumTree}; +use summa_solvency::merkle_sum_tree::MerkleSumTree; const N_ASSETS: usize = 2; const USER_INDEX: usize = 0; @@ -103,12 +104,12 @@ async fn main() -> Result<(), Box> { // It's assumed that both `user_name` and `balances` are provided by the CEX. // The `balances` represent the user's balances on the CEX at `snapshot_time`. let user_name = "dxGaEAii".to_string(); - let balances = vec![11888, 41163]; + let balances = vec!["11888".to_string(), "41163".to_string()]; let leaf_hash = public_inputs[0]; assert_eq!( leaf_hash, - generate_leaf_hash::(user_name.clone(), balances.clone()) + leaf_hash_from_inputs::(user_name.clone(), balances.clone()) ); // Get `mst_root` from contract. the `mst_root` is disptached by CEX with specific time `snapshot_time`. diff --git a/backend/scripts/update_verifier_contract.sh b/backend/scripts/update_verifier_contract.sh old mode 100644 new mode 100755 index 1fed5197..ec0af6bd --- a/backend/scripts/update_verifier_contract.sh +++ b/backend/scripts/update_verifier_contract.sh @@ -6,8 +6,13 @@ echo "1. Building verifier contracts" cd ../zk_prover cargo run --release --example gen_inclusion_verifier +# Generate Commitment for Merkle Sum Tree +echo "2. Generate Commitment for Merkle Sum Tree" +cd ../zk_prover +cargo run --release --example gen_commitment + # Deploy contracts to local environment -echo "2. Deploying contracts to local environment" +echo "3. Deploying contracts to local environment" cd ../contracts npm install npx hardhat node & @@ -16,7 +21,7 @@ sleep 5 npx hardhat run scripts/deploy.ts --network localhost # Generate interface files for Backend -echo "3. Generating interface files for Backend" +echo "4. Generating interface files for Backend" cd ../backend cargo build diff --git a/backend/src/apis/mod.rs b/backend/src/apis/mod.rs index 82fca001..5f82f744 100644 --- a/backend/src/apis/mod.rs +++ b/backend/src/apis/mod.rs @@ -1,3 +1,25 @@ pub mod address_ownership; pub mod csv_parser; pub mod round; + +use ethers::types::U256; +use num_bigint::BigUint; +use num_traits::Num; +use summa_solvency::merkle_sum_tree::Entry; + +pub fn leaf_hash_from_inputs(username: String, balances: Vec) -> U256 +where + [usize; N_ASSETS + 1]: Sized, +{ + // Convert balances to BigUint + let balances: Vec = balances + .iter() + .map(|balance| BigUint::from_str_radix(balance, 10).unwrap()) + .collect(); + + let entry: Entry = Entry::new(username, balances.try_into().unwrap()).unwrap(); + + // Convert Fp to U256 + let hash_str = format!("{:?}", entry.compute_leaf().hash); + U256::from_str_radix(&hash_str, 16).unwrap() +} diff --git a/backend/src/apis/round.rs b/backend/src/apis/round.rs index 88e1c6e7..30e8688b 100644 --- a/backend/src/apis/round.rs +++ b/backend/src/apis/round.rs @@ -53,14 +53,17 @@ impl Round<'_, LEVELS, N_ASSETS, N_BYTES> where [usize; N_ASSETS + 1]: Sized, - [usize; 2 * (1 + N_ASSETS)]: Sized, + [usize; N_ASSETS + 2]: Sized, { pub fn new<'a>( signer: &'a SummaSigner, mst: Box>, params_path: &str, timestamp: u64, - ) -> Result, Box> { + ) -> Result, Box> + where + [(); N_ASSETS + 2]: Sized, + { Ok(Round { timestamp, snapshot: Snapshot::::new(mst, params_path).unwrap(), @@ -109,7 +112,10 @@ where pub fn get_proof_of_inclusion( &self, user_index: usize, - ) -> Result { + ) -> Result + where + [(); N_ASSETS + 2]: Sized, + { Ok(self .snapshot .generate_proof_of_inclusion(user_index) @@ -121,7 +127,7 @@ impl Snapshot where [usize; N_ASSETS + 1]: Sized, - [usize; 2 * (1 + N_ASSETS)]: Sized, + [usize; N_ASSETS + 2]: Sized, { pub fn new( mst: Box>, @@ -146,11 +152,12 @@ where pub fn generate_proof_of_inclusion( &self, user_index: usize, - ) -> Result { + ) -> Result + where + [(); N_ASSETS + 2]: Sized, + { let merkle_proof = self.mst.generate_proof(user_index).unwrap(); - let user_entry = self.mst.get_entry(user_index).clone(); - let circuit = - MstInclusionCircuit::::init(merkle_proof, user_entry); + let circuit = MstInclusionCircuit::::init(merkle_proof); // Currently, default manner of generating a inclusion proof for solidity-verifier. let calldata = gen_proof_solidity_calldata( diff --git a/backend/src/contracts/abi/InclusionVerifier.json b/backend/src/contracts/abi/InclusionVerifier.json index a83673c2..edc6d1a4 100644 --- a/backend/src/contracts/abi/InclusionVerifier.json +++ b/backend/src/contracts/abi/InclusionVerifier.json @@ -1 +1 @@ -{"_format":"hh-sol-artifact-1","contractName":"Verifier","sourceName":"src/InclusionVerifier.sol","abi":[{"inputs":[{"internalType":"uint256[]","name":"pubInputs","type":"uint256[]"},{"internalType":"bytes","name":"proof","type":"bytes"}],"name":"verify","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"bytecode":"0x608060405234801561001057600080fd5b506155e980620000216000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063bd205a9014610030575b600080fd5b61004361003e3660046154ab565b610057565b604051901515815260200160405180910390f35b600060016100636153d4565b6000805160206155948339815191526100d9565b600080516020615574833981519152808310818310169083800960008051602061557483398151915283840960008051602061557483398151915284820990506000805160206155748339815191526003820891909114919091169392505050565b8060208701510660208301528060408701510660408301528060608701510660608301528060808701510660808301527f0aa1294f30774a0392cf024f41480b3c489bd0a6895d82ebaa096ca8edb6bbbc600083015260208501518060a084015260408601518060c0850152846101508284610077565b169450505060608501518060e0840152608086015180610100850152846101778284610077565b169450505060a08501518061012084015260c0860151806101408501528461019f8284610077565b16945050506101606000830120610160830152610160820151818106610180840152806101a08401525060e0850151806101c0840152610100860151806101e0850152846101ed8284610077565b16945050506101208501518061020084015261014086015180610220850152846102178284610077565b60a06101a0870120610240870181905285810661026088015261028087015216945060019150506102a083015360216102808301206102a083018190528181066102c08401526102e0830152610160850151610300830181905261018086015161032084018190528461028a8284610077565b16945050506101a0850151806103408401526101c086015180610360850152846102b48284610077565b16945050506101e085015180610380840152610200860151806103a0850152846102de8284610077565b1694505050610220850151806103c0840152610240860151806103e0850152846103088284610077565b16945050506101206102e083012061040083015261040082015181810661042084015280610440840152506102608501518061046084015261028086015180610480850152846103588284610077565b16945050506102a0850151806104a08401526102c0860151806104c0850152846103828284610077565b16945050506102e0850151806104e084015261030086015180610500850152846103ac8284610077565b16945050506103208501518061052084015261034086015180610540850152846103d68284610077565b16945050506103608501518061056084015261038086015180610580850152846104008284610077565b16945050506101606104408301206105a08301526105a08201518181066105c0840152806105e084015250806103a086015106610600830152806103c086015106610620830152806103e0860151066106408301528061040086015106610660830152806104208601510661068083015280610440860151066106a083015280610460860151066106c083015280610480860151066106e0830152806104a086015106610700830152806104c086015106610720830152806104e0860151066107408301528061050086015106610760830152806105208601510661078083015280610540860151066107a083015280610560860151066107c083015280610580860151066107e0830152806105a086015106610800830152806105c086015106610820830152806105e0860151066108408301528061060086015106610860830152806106208601510661088083015280610640860151066108a083015280610660860151066108c083015280610680860151066108e0830152806106a086015106610900830152806106c086015106610920830152806106e0860151066109408301528061070086015106610960830152806107208601510661098083015280610740860151066109a083015280610760860151066109c083015280610780860151066109e0830152806107a086015106610a00830152806107c086015106610a20830152806107e086015106610a408301526104806105e0830120610a60830152610a60820151818106610a8084015280610aa0840152506001610ac08301536021610aa0830120610ac08301819052818106610ae0840152610b00830152610800850151610b208301819052610820860151610b408401819052846106898284610077565b16945050506060610b00830120610b60830152610b60820151818106610b8084015280610ba08401525061084085015180610bc084015261086086015180610be0850152846106d88284610077565b1694505050806105c08301516105c084015109610c00830181905281908009610c20830181905281908009610c40830181905281908009610c60830181905281908009610c80830181905281908009610ca0830181905281908009610cc0830181905281908009610ce0830181905281908009610d00830181905281908009610d20830181905281908009610d40830152807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000000610d4084015108610d60830152807f305e41e912d579f5b3193badcab128321c8ee1cb70aa396331b979553d820001610d6084015109610d80830152807f22b55603586d5fc42c6c14c2fc27a028c207da8b2c71cb33d549fa4a2be5d302610d8084015109610da0830152807f0daef86f88c440658be430f38559b834662c0dbd4d47a55d6e97fb49c41a2cff6105c084015108610dc0830152807f2498c2d3affa1baaf6419dbccb6a054bb87359c02eade5aeacd86c84757b9051610d8084015109610de0830152807f0bcb8b9f3137847ec20ea7f9b61753116fc08e884b0b8ae29709890f7a846fb06105c084015108610e00830152807f096b9f8b8598b7c387fb69abf236b0d5e04e24d275ee98244443eda5d3bc4035610d8084015109610e20830152807f26f8aee75b98e8663054dc0a8f4aa78747e5c37603cad86cff9e07ee1c43bfcc6105c084015108610e40830152807f28771071ab1633014eae27cfc16d5ebe08a8fe2fc9e85044e4a45f82c14cd825610d8084015109610e60830152807f07ed3e01361b6d2869a21de6c013f99f1f8aea18afd1204c5f3d96112eb327dc6105c084015108610e80830152807f0ae3c95fc03c0a5f2de8a8f46c03ccdfdfed2bb98c9e4ae0b10b15eda4e3b1e3610d8084015109610ea0830152807f2580851320f595ca8a679cc2157d8b7d4846bc8eed1b25b092d6dfa64b1c4e1e6105c084015108610ec0830152807f2afd4e77273f1cb3434a4a667929058c156b21573c3f1efc882e708597d7161a610d8084015109610ee0830152807f0566fffbb9f283767505fb50085852d112c8c6f13d7a5194bbb3850e5828e9e76105c084015108610f00830152806001610d8084015109610f20830152807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000006105c084015108610f40830152807f14c60185e75885d674db4b3f7d4a5694fa6c01aa0f53557b060bc04a4172705f610d8084015109610f60830152807f1b9e4cecf9d91a534374fa77043701c82dc7e69e6a661b163dd63549ae8d8fa26105c084015108610f80830152807f2ad9021ed07c42ab19f77c5cf2cbd2deb135ea330f1b1573bd08d99309c4bb7d610d8084015109610fa0830152807f058b4c5410b55d7e9e58c9598eb5857e76fdfe156a9e5b1d86d91c00e63b44846105c084015108610fc0830152807f1908597d2fc3bc1da312efa344e0fc8a7079300238f2ee35774f117e66fd4467610d8084015109610fe0830152807f175bf4f5b16de40c153d56133ca05bd2b7bab84640c6825bcc92e4158902bb9a6105c084015108611000830152610dc08201518181610e00850151099050806110208401528181610e40850151099050806110408401528181610e80850151099050806110608401528181610ec0850151099050806110808401528181610f00850151099050806110a08401528181610f40850151099050806110c08401528181610f80850151099050806110e08401528181610fc0850151099050806111008401528181611000850151099050806111208401528181610d608501510990508061114084015250602061118083015260206111a083015260206111c08301526111408201516111e08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593efffffff6112008301526000805160206155948339815191526112208301528260016020611160850160c0611180870160055afa141692506111608201516000610d608401519050828261112086015109610d608501528282820991506110008401519050828261110086015109611000850152828282099150610fc0840151905082826110e086015109610fc0850152828282099150610f80840151905082826110c086015109610f80850152828282099150610f40840151905082826110a086015109610f40850152828282099150610f008401519050828261108086015109610f00850152828282099150610ec08401519050828261106086015109610ec0850152828282099150610e808401519050828261104086015109610e80850152828282099150610e408401519050828261102086015109610e40850152828282099150610e0084015190508282610dc086015109610e0085015282828209610dc08501819052610da08501518493509091500961124083015280610e00830151610de08401510961126083015280610e40830151610e208401510961128083015280610e80830151610e60840151096112a083015280610ec0830151610ea0840151096112c083015280610f00830151610ee0840151096112e083015280610f40830151610f208401510961130083015280610f80830151610f608401510961132083015280610fc0830151610fa08401510961134083015280611000830151610fe084015109611360830152806020830151611300840151098181836040860151611320870151090890508181836060860151611340870151090890508181836080860151611360870151090861138084015250610720820151610600830151829190086113a08301819052819080096113c08301819052819080096113e0830152806113e08301516113a084015109611400830152807f066f6f85d6f68a85ec10345351a23a3aaf07f38af8c952a7bceca70bd2af7ad561140084015109611420830152806107408301516106208401510861144083018190528190800961146083018190528190800961148083015280611480830151611440840151096114a0830152807f2b9d4b4110c9ae997782e1509b1d0fdb20a7c02bbd8bea7305462b9f8125b1e86114a0840151096114c0830152806114c0830151611420840151086114e08301528061064083015182036114e08401510861150083018190526107c08301518291096115208301528061152083015161042084015109611540830152807f0cc57cdbb08507d62bf67a4493cc262fb6c09d557013fff1f573f431221f8ff961140084015109611560830152807f1274e649a32ed355a31a6ed69724e1adade857e86eb5c3a121bcd147943203c86114a08401510961158083015280611580830151611560840151086115a08301528061066083015182036115a0840151086115c083018190526107c08301518291096115e0830152806115e08301516115408401510861160083015280611600830151610420840151096116208301528061068083015182036114008401510861164083018190526107e0830151829109611660830152806116608301516116208401510861168083015280611680830151610420840151096116a0830152807f066f6f85d6f68a85ec10345351a23a3aaf07f38af8c952a7bceca70bd2af7ad5610680840151096116c0830152807f2b9d4b4110c9ae997782e1509b1d0fdb20a7c02bbd8bea7305462b9f8125b1e8611440840151096116e0830152806116e08301516116c08401510861170083018190526106e08301518291086117208301819052819080096117408301819052819080096117608301528061176083015161172084015109611780830152807f13abec390ada7f4370819ab1c7846f210554569d9b29d1ea8dbebd0fa8c53e66610640840151096117a0830152807f1eb9e1dc19a33a624c9862a1d97d1510bd521ead5dfe0345aaf6185b1a1e60fe610660840151096117c0830152806117c08301516117a0840151086117e0830152806117e083015182036117808401510861180083018190526107e0830151829109611820830152806118208301516116a0840151086118408301528061184083015161042084015109611860830152807f0cc57cdbb08507d62bf67a4493cc262fb6c09d557013fff1f573f431221f8ff961068084015109611880830152807f1274e649a32ed355a31a6ed69724e1adade857e86eb5c3a121bcd147943203c8611440840151096118a0830152806118a0830151611880840151086118c083018190526107008301518291086118e0830152807f0fc1c9394db89bb2601abc49fdad4f038ce5169030a2ad69763f7875036bcb0261064084015109611900830152807f16a9e98c493a902b9502054edc03e7b22b7eac34345961bc8abced6bd147c8be6106608401510961192083015280611920830151611900840151086119408301528061194083015182036118e08401510861196083018190526107e083015182910961198083015280611980830151611860840151086119a0830152806119a0830151610420840151096119c0830152806107a083015182036001086119e083018190526107a0830151829109611a00830152806107a08301518203600208611a208301819052611a00830151829109611a40830152806107a08301518203600408611a608301819052611a40830151829109611a80830152806106008301516106c084015108611aa0830152806106408301518203611aa084015108611ac08301819052611a80830151829109611ae083015280611ae08301516119c084015108611b0083015280611b0083015161042084015109611b208301528061066083015182036106a084015108611b408301819052611a80830151829109611b6083015280611b60830151611b2084015108611b8083015280611b8083015161042084015109611ba08301528061080083015161150084015109611bc083015280611bc0830151611ba084015108611be083015280611be083015161042084015109611c00830152806108008301516115c084015109611c2083015280611c20830151611c0084015108611c4083015280611c4083015161042084015109611c608301528061082083015161164084015109611c8083015280611c80830151611c6084015108611ca083015280611ca083015161042084015109611cc08301528061082083015161180084015109611ce083015280611ce0830151611cc084015108611d0083015280611d0083015161042084015109611d208301528061082083015161196084015109611d4083015280611d40830151611d2084015108611d6083015280611d6083015161042084015109611d80830152806107a08301518203600308611da08301819052611a40830151829109611dc083015280611dc0830151611ac084015109611de083015280611de0830151611d8084015108611e0083015280611e0083015161042084015109611e2083015280611dc0830151611b4084015109611e4083015280611e40830151611e2084015108611e6083015280611e6083015161042084015109611e80830152806107a0830151611a2084015109611ea083015280611ea0830151611da084015109611ec083015280611ec0830151611a6084015109611ee083015280611ee083015161068084015109611f00830152806106808301518203600108611f208301819052611f00830151829109611f4083015280611f40830151611e8084015108611f6083015280611f6083015161042084015109611f8083015280610680830151600209611fa083015280610600830151820361062084015108611fc08301819052611fa0830151829109611fe083015280610600830151820361064084015108612000830152806120008301518203611fe08401510861202083015280610660830151820361062084015108612040830152806120408301518203612020840151086120608301819052611ee083015182910961208083015280612080830151611f80840151086120a0830152806120a0830151610420840151096120c083015280611a00830151611da0840151096120e0830152806120e0830151611a60840151096121008301528061062083015161060084015108612120830152806106808301518203612120840151086121408301819052612100830151829109612160830152806121608301516120c08401510861218083015280612180830151610420840151096121a083018190526121608301518291086121c0830152806121c0830151610420840151096121e08301528061092083015182036001086122008301819052611300830151829109612220830152806122208301516121e084015108612240830152806122408301516104208401510961226083015261098082015181908009612280830152806109808301518203612280840151086122a083018190526112408301518291096122c0830152806122c0830151612260840151086122e0830152806122e083015161042084015109612300830152806109608301518203610980840151086123208301819052611300830151829109612340830152806123408301516123008401510861236083015280612360830151610420840151096123808301528061124083015182036001086123a083015280611280830151611260840151086123c083018190526112a08301518291086123e083018190526112c083015182910861240083018190526112e08301518291086124208301528061242083015182036123a0840151086124408301528061026083015161086084015109612460830152806124608301516106e08401510861248083018190526102c08301518291086124a083015280610260830151610880840151096124c0830152806124c0830151610600840151086124e083018190526102c083015182910861250083018190526124a0830151829109612520830152806102608301516108a084015109612540830152806125408301516106208401510861256083018190526102c083015182910861258083018190526125208301518291096125a0830152806102608301516108c0840151096125c0830152806125c0830151610700840151086125e083018190526102c083015182910861260083018190526125a0830151829109612620830181905261094083015182910961264083015280610260830151600109612660830152806126608301516105c084015109612680830152806126808301516106e0840151086126a083018190526102c08301518291086126c0830152806102608301517f09226b6e22c6f0ca64ec26aad4c86e715b5f898e5e963f25870e56bbe533e9a2096126e0830152806126e08301516105c084015109612700830152806127008301516106008401510861272083018190526102c083015182910861274083018190526126c0830151829109612760830152806102608301517f13b360d4e82fe915fed16081038f98c211427b87a281bd733c277dbadf10372b09612780830152806127808301516105c0840151096127a0830152806127a0830151610620840151086127c083018190526102c08301518291086127e08301819052612760830151829109612800830152806102608301517f18afdf23e9bd9302673fc1e076a492d4d65bd18ebc4d854ed189139bab313e5209612820830152806128208301516105c084015109612840830152806128408301516107008401510861286083018190526102c083015182910861288083018190526128008301518291096128a083018190526109208301518291096128c0830152806128c08301518203612640840151086128e0830181905261244083015182910961290083015280612900830151612380840151086129208301528061292083015161042084015109612940830152806102608301516108e084015109612960830152806129608301516106808401510861298083018190526102c08301518291086129a083015280610260830151610900840151096129c0830152806129c0830151611380840151086129e083018190526102c0830151829108612a0083018190526129a0830151829109612a2083018190526109a0830151829109612a40830152806102608301517ea136ba13afa6c83eb7b82fb370e228e74155e48fb8f1c1cfc33fb0da8afb4209612a6083015280612a608301516105c084015109612a8083015280612a8083015161068084015108612aa083018190526102c0830151829108612ac0830152806102608301517f2eb9750dce545f17d492058dd201a1251ff3d9077864583d44eaf9be9008699d09612ae083015280612ae08301516105c084015109612b0083015280612b0083015161138084015108612b2083018190526102c0830151829108612b408301819052612ac0830151829109612b608301819052610980830151829109612b8083015280612b808301518203612a4084015108612ba08301819052612440830151829109612bc083015280612bc083015161294084015108612be083015280612be083015161042084015109612c00830152806109c08301518203600108612c208301819052611300830151829109612c4083015280612c40830151612c0084015108612c6083015280612c6083015161042084015109612c808301526109c082015181908009612ca0830152806109c08301518203612ca084015108612cc08301819052611240830151829109612ce083015280612ce0830151612c8084015108612d0083015280612d0083015161042084015109612d2083015280610260830151610a0084015108612d4083018190526109e0830151829109612d60830152806102c0830151610a4084015108612d808301819052612d60830151829109612da08301528061064083015161010009612dc083015280612dc0830151820361060084015108612de08301819052610780830151829109612e008301819052610260830151829108612e2083018190526109c0830151829109612e40830152806102c083015161076084015108612e608301819052612e40830151829109612e8083015280612e808301518203612da084015108612ea08301819052612440830151829109612ec083015280612ec0830151612d2084015108612ee083015280612ee083015161042084015109612f0083015280610a408301518203610a0084015108612f208301819052611300830151829109612f4083015280612f40830151612f0084015108612f6083015280612f6083015161042084015109612f8083015280612440830151612f2084015109612fa083015280610a208301518203610a0084015108612fc08301819052612fa0830151829109612fe083015280612fe0830151612f8084015108613000830152610d40820151819080096130208301819052610d408301518291096130408301819052610d408301518291096130608301819052610d4083015182910961308083015280610d408301516001096130a0830152806130208301516001096130c0830152806130408301516001096130e08301528061306083015160010961310083015280610d6083015161300084015109613120830152806105c0830151610c00840151096131408301528060016105c084015109613160830152806131608301518203610b8084015108613180830152807f14c60185e75885d674db4b3f7d4a5694fa6c01aa0f53557b060bc04a4172705f6105c0840151096131a0830152806131a08301518203610b80840151086131c0830152807f22b55603586d5fc42c6c14c2fc27a028c207da8b2c71cb33d549fa4a2be5d3026105c0840151096131e0830152806131e08301518203610b8084015108613200830152807f2afd4e77273f1cb3434a4a667929058c156b21573c3f1efc882e708597d7161a6105c084015109613220830152806132208301518203610b808401510861324083015280817f21054ce8b3cb9dc9b87af5c70c8f54994090ad8fa7e06caaf989ba5806b6798b610c0085015109610b8084015109818183847f0f5f018a2d66025fffd54fef74f203c3e7a33ab8d1d903e64a583b3be9498676610c00880151096105c087015109089050806132608401525080817f10ac009d2f31395e301635cd6d292978a4012197c24d6e63fb49943a70296136610c0085015109610b8084015109818183847f2696aa2788110c63ebbfd7f92b352ce93b28bbdae57b7cb94bc5885ee439e774610c00880151096105c087015109089050806132808401525080817f2510cae1618713ac17c9ef83f1a67645ed21f454d96bf1f072ca5b463e7f0c28610c0085015109610b8084015109818183847f0d6a07653c64f4112284cb8b23bf73adecaf4ee0fef51998549526f07b6defd7610c00880151096105c087015109086132a08401525061318082015181906001096132c083018190526131c08301518291096132e08301819052613240830151829109613300830152806001610b80840151098181837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000006105c087015109089050806133208401525080817f1d81b9bd5165d63a0d4a8370d37966eb243365d36ca235911564a783f8234cf2610c0085015109610b8084015109818183847f12e294b58fcbc9efab05c245ae07f172040082750d173b002e7d4e0ff7dcb30f610c00880151096105c087015109089050806133408401525080817f142f93c8919700eddb46a823a63f1726c05e6953fd8ba57ddf6ea70e7ebc8dcf610c0085015109610b8084015109818183847f2707d3cc5788c2cfc0ee9e5f5638da3b90cb6d8b97224a4521073ec9f10826fb610c00880151096105c087015109089050806133608401525080817f13d3d4db83b42c4d48afa6b5c9cbe3f49703d0caf1fdc301b0d4d3743ab60833610c0085015109610b8084015109818183847f223ed99d38075819043fa85ed3c54f3bfb5d62312139562ca82d9903b1b52e27610c00880151096105c08701510908613380840152506132008201516132e0830151829190096133a083015280817f1b9e4cecf9d91a534374fa77043701c82dc7e69e6a661b163dd63549ae8d8fa36105c085015109610b8084015109818183847f14c60185e75885d674db4b3f7d4a5694fa6c01aa0f53557b060bc04a4172705e6105c0880151096105c087015109089050806133c08401525080817f14c60185e75885d674db4b3f7d4a5694fa6c01aa0f53557b060bc04a4172705e6105c085015109610b8084015109818183847f1a514dd9f80de355133414990bffdc137169ffbf79f1b0988ce4dc4b27adb4e36105c0880151096105c087015109089050806133e08401525080817f0566fffbb9f283767505fb50085852d112c8c6f13d7a5194bbb3850e5828e9e86105c085015109610b8084015109818183847f2afd4e77273f1cb3434a4a667929058c156b21573c3f1efc882e708597d716196105c0880151096105c087015109089050806134008401525080817f2afd4e77273f1cb3434a4a667929058c156b21573c3f1efc882e708597d716196105c085015109610b8084015109818183847f20198517670312541561a1720d2538ac357df59dafa0d41bd7235a97f2f364376105c0880151096105c08701510908613420840152506132408201516132c08301518291900961344083015261326082015181816132808501510990508061346084015281816132a0850151099050806134808401528181613320850151099050806134a084015281816132c0850151099050806134c08401528181613340850151099050806134e084015281816133608501510990508061350084015281816133808501510990508061352084015281816133a08501510990508061354084015281816133c08501510990508061356084015281816133e08501510990508061358084015281816132e0850151099050806135a08401528181613400850151099050806135c08401528181613420850151099050806135e0840152818161344085015109905080613600840152506020613640830152602061366083015260206136808301526136008201516136a08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593efffffff6136c08301526000805160206155948339815191526136e08301528260016020613620850160c0613640870160055afa141692506136208201516000613440840151905082826135e086015109613440850152828282099150613420840151905082826135c086015109613420850152828282099150613400840151905082826135a0860151096134008501528282820991506132e084015190508282613580860151096132e08501528282820991506133e084015190508282613560860151096133e08501528282820991506133c084015190508282613540860151096133c08501528282820991506133a084015190508282613520860151096133a08501528282820991506133808401519050828261350086015109613380850152828282099150613360840151905082826134e086015109613360850152828282099150613340840151905082826134c0860151096133408501528282820991506132c0840151905082826134a0860151096132c085015282828209915061332084015190508282613480860151096133208501528282820991506132a084015190508282613460860151096132a08501528282820991506132808401519050828261326086015109613280850152828282096132608501819052613280850151909250839150829008905081816132a085015108613700840152506132c0820151613300830151829190096137208301526133208201518061374084015250806133a0830151613300840151096137608301526133408201518181613360850151089050818161338085015108613780840152506132e0820151613300830151829190096137a08301526133c082015181816133e0850151086137c084015250613440820151613300830151829190096137e083015261340082015181816134208501510861380084015250613700820151613740830151829082900990508061382084015281816137808501510990508061384084015281816137c0850151099050806138608401528181613800850151099050806138808401525060206138c083015260206138e083015260206139008301526138808201516139208301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593efffffff61394083015260008051602061559483398151915261396083015282600160206138a0850160c06138c0870160055afa141692506138a0820151600061380084015190508282613860860151096138008501528282820991506137c084015190508282613840860151096137c0850152828282099150613780840151905082826138208601510961378085015282828209915061374084015190508282613700860151096137408501528282820961370085015250506137408201516137208301518291900961398083015280613780830151613760840151096139a0830152806137c08301516137a0840151096139c0830152806138008301516137e0840151096139e0830152610a8082015181908009613a008301819052610a80830151829109613a208301819052610a80830151829109613a408301819052610a80830151829109613a608301819052610a80830151829109613a808301819052610a80830151829109613aa08301819052610a80830151829109613ac08301819052610a80830151829109613ae08301819052610a80830151829109613b008301819052610a80830151829109613b208301819052610a80830151829109613b408301819052610a80830151829109613b608301819052610a80830151829109613b808301819052610a80830151829109613ba08301819052610a80830151829109613bc08301819052610a80830151829109613be08301819052610a80830151829109613c008301819052610a80830151829109613c208301819052610a80830151829109613c408301819052610a80830151829109613c60830152610ae082015181908009613c808301819052610ae0830151829109613ca08301819052610ae0830151829109613cc08301819052610ae0830151829109613ce08301528061326083015161060084015109818183613280860151610640870151090890508181836132a08601516106c08701510908613d0084018190526137008401518392509009613d20830152806001613d20840151830309613d408301528061326083015161062084015109818183613280860151610660870151090890508181836132a08601516106a08701510908613d6084018190526137008401518392509009613d808301819052610a808301518291820309613da083015280610a80830151600109613dc083015280613da0830151613d4084015108613de0830152806001613de084015109613e00830152806001613dc084015109613e2083015280613720830151600109613e408301528061332083015161068084015109613e608301819052613980830151829109613e80830152806001613e80840151830309613ea0830152806001613e4084015109613ec083015280613320830151610a4084015109613ee08301819052613980830151829109613f008301819052610a808301518291820309613f2083015280610a80830151613e4084015109613f4083015280613f20830151613ea084015108613f60830152806133208301516106e084015109613f808301819052613980830151829109613fa08301819052613a008301518291820309613fc083015280613a00830151613e4084015109613fe083015280613fc0830151613f6084015108614000830152806133208301516107008401510961402083018190526139808301518291096140408301819052613a20830151829182030961406083015280613a20830151613e408401510961408083015280614060830151614000840151086140a083015280613320830151610720840151096140c083018190526139808301518291096140e08301819052613a40830151829182030961410083015280613a40830151613e4084015109614120830152806141008301516140a084015108614140830152806133208301516107408401510961416083018190526139808301518291096141808301819052613a6083015182918203096141a083015280613a60830151613e40840151096141c0830152806141a0830151614140840151086141e0830152806133208301516107608401510961420083018190526139808301518291096142208301819052613a80830151829182030961424083015280613a80830151613e4084015109614260830152806142408301516141e08401510861428083015280613320830151610780840151096142a083018190526139808301518291096142c08301819052613aa083015182918203096142e083015280613aa0830151613e4084015109614300830152806142e083015161428084015108614320830152806133208301516107a08401510961434083018190526139808301518291096143608301819052613ac0830151829182030961438083015280613ac0830151613e40840151096143a083015280614380830151614320840151086143c0830152806133208301516107c0840151096143e083018190526139808301518291096144008301819052613ae0830151829182030961442083015280613ae0830151613e4084015109614440830152806144208301516143c084015108614460830152806133208301516107e08401510961448083018190526139808301518291096144a08301819052613b0083015182918203096144c083015280613b00830151613e40840151096144e0830152806144c083015161446084015108614500830152806133208301516108008401510961452083018190526139808301518291096145408301819052613b20830151829182030961456083015280613b20830151613e408401510961458083015280614560830151614500840151086145a083015280613320830151610820840151096145c083018190526139808301518291096145e08301819052613b40830151829182030961460083015280613b40830151613e4084015109614620830152806146008301516145a084015108614640830152806133208301516108608401510961466083018190526139808301518291096146808301819052613b6083015182918203096146a083015280613b60830151613e40840151096146c0830152806146a0830151614640840151086146e0830152806133208301516108808401510961470083018190526139808301518291096147208301819052613b80830151829182030961474083015280613b80830151613e4084015109614760830152806147408301516146e084015108614780830152806133208301516108a0840151096147a083018190526139808301518291096147c08301819052613ba083015182918203096147e083015280613ba0830151613e4084015109614800830152806147e083015161478084015108614820830152806133208301516108c08401510961484083018190526139808301518291096148608301819052613bc0830151829182030961488083015280613bc0830151613e40840151096148a083015280614880830151614820840151086148c0830152806133208301516108e0840151096148e083018190526139808301518291096149008301819052613be0830151829182030961492083015280613be0830151613e4084015109614940830152806149208301516148c084015108614960830152806133208301516109008401510961498083018190526139808301518291096149a08301819052613c0083015182918203096149c083015280613c00830151613e40840151096149e0830152806149c083015161496084015108614a00830152806137208301516130a084015109614a20830152806137208301516130c084015109614a40830152806137208301516130e084015109614a608301528061372083015161310084015109614a808301528061332083015161312084015109614aa08301819052613980830151829109614ac08301819052613c208301518291820309614ae083015280613c20830151613e4084015109614b0083015280613c20830151614a2084015109614b2083015280613c20830151614a4084015109614b4083015280613c20830151614a6084015109614b6083015280613c20830151614a8084015109614b8083015280614ae0830151614a0084015108614ba08301528061332083015161084084015109614bc08301819052613980830151829109614be08301819052613c408301518291820309614c0083015280613c40830151613e4084015109614c2083015280614c00830151614ba084015108614c408301819052610ae0830151829109614c6083015280610ae0830151613ec084015109614c8083015280610ae0830151613f4084015109614ca083015280610ae0830151613fe084015109614cc083015280610ae083015161408084015109614ce083015280610ae083015161412084015109614d0083015280610ae08301516141c084015109614d2083015280610ae083015161426084015109614d4083015280610ae083015161430084015109614d6083015280610ae08301516143a084015109614d8083015280610ae083015161444084015109614da083015280610ae08301516144e084015109614dc083015280610ae083015161458084015109614de083015280610ae083015161462084015109614e0083015280610ae08301516146c084015109614e2083015280610ae083015161476084015109614e4083015280610ae083015161480084015109614e6083015280610ae08301516148a084015109614e8083015280610ae083015161494084015109614ea083015280610ae08301516149e084015109614ec083015280610ae0830151614b0084015109614ee083015280610ae0830151614b2084015109614f0083015280610ae0830151614b4084015109614f2083015280610ae0830151614b6084015109614f4083015280610ae0830151614b8084015109614f6083015280610ae0830151614c2084015109614f8083015280614c60830151613e0084015108614fa083015280613760830151600109614fc08301528061334083015161092084015109818183613360860151610940870151090890508181836133808601516109608701510908614fe084018190526139a08401518392509009615000830152806001615000840151830309615020830152806001614fc08401510961504083015280613c808301516150208401510961506083015280613c808301516150408401510961508083015280615060830151614fa0840151086150a0830152806137a08301516001096150c0830152806133c0830151610980840151098181836133e08601516109a087015109086150e084018190526139c084015183925090096151008301528060016151008401518303096151208301528060016150c084015109615140830152806133c08301516109c0840151098181836133e08601516109e0870151090861516084018190526139c084015183925090096151808301819052610a8083015182918203096151a083015280610a808301516150c0840151096151c0830152806151a0830151615120840151086151e08301819052613ca083015182910961520083015280613ca08301516151408401510961522083015280613ca08301516151c084015109615240830152806152008301516150a084015108615260830152806137e083015160010961528083015280613400830151610a0084015109818183613420860151610a2087015109086152a084018190526139e084015183925090096152c08301528060016152c08401518303096152e08301528060016152808401510961530083015280613cc08301516152e08401510961532083015280613cc08301516153008401510961534083015280615320830151615260840151086153608301528061330083015160010961538083015280610b808301516001096153a083015260016153c0830181815260026153e085015261536084015161540085015284919060409060608160075afa141692506153c08201516154208301526153e082015161544083015260a082015161546083015260c0820151615480830152826001604061542085016080615420870160065afa1416925060e08201516154a08301526101008201516154c0830152613e208201516154e083015282600160406154a0850160606154a0870160075afa141692506154208201516155008301526154408201516155208301526154a08201516155408301526154c0820151615560830152826001604061550085016080615500870160065afa141692506101208201516155808301526101408201516155a0830152614c808201516155c0830152826001604061558085016060615580870160075afa141692506155008201516155e08301526155208201516156008301526155808201516156208301526155a082015161564083015282600160406155e0850160806155e0870160065afa14169250610200820151615660830152610220820151615680830152614ca08201516156a0830152826001604061566085016060615660870160075afa141692506155e08201516156c08301526156008201516156e083015261566082015161570083015261568082015161572083015282600160406156c0850160806156c0870160065afa141692507f291e4db43c260726b91c535917a801bde06be7f7cf45010909762313db4252906157408301527f154e7fe15847ac4d1cd93fa6c8209672cfccf45ad8e13ab82fc6b167ba1994fc615760830152614cc0820151615780830152826001604061574085016060615740870160075afa141692506156c08201516157a08301526156e08201516157c08301526157408201516157e083015261576082015161580083015282600160406157a0850160806157a0870160065afa141692507f176b10d402fac05bfc982234f50b305ad067e122f1682a4b9c4bd98bda91919d6158208301527f1d62e78d655e3fc74188666738fca6524a712f1a3c4ccfdd0fa44f3e2c849c51615840830152614ce0820151615860830152826001604061582085016060615820870160075afa141692506157a08201516158808301526157c08201516158a08301526158208201516158c08301526158408201516158e0830152826001604061588085016080615880870160065afa141692507f019dd7ee531990d335aad8f64c26a1bc072b47a7efd4504404d2e95e202507596159008301527f0c413dd8e50189a05a374679bae72f724f7b71e956c32c0881ea37694276ea83615920830152614d00820151615940830152826001604061590085016060615900870160075afa141692506158808201516159608301526158a08201516159808301526159008201516159a08301526159208201516159c0830152826001604061596085016080615960870160065afa141692507f0730799d5bfec1cefc5aaffcffe3f3dd491b2bfcaf9f553f94de6145ed4742af6159e08301527f24ad4af082e96b14b9a6da80f4fa1334f253c458add531c8d9f8b23c5ecb9c43615a00830152614d20820151615a2083015282600160406159e0850160606159e0870160075afa14169250615960820151615a40830152615980820151615a608301526159e0820151615a80830152615a00820151615aa08301528260016040615a4085016080615a40870160065afa141692507f22e1cdbfffcfcf4f18cf4342edf1fb26c3b6e52ace3d5fadcf5cc2614333baa4615ac08301527f0e28df72dcc69cc6442d72f693661997480a913ac353890efd63a873959727c0615ae0830152614d40820151615b008301528260016040615ac085016060615ac0870160075afa14169250615a40820151615b20830152615a60820151615b40830152615ac0820151615b60830152615ae0820151615b808301528260016040615b2085016080615b20870160065afa141692507f0b30fe9581a6c70064e3b35446b2433842db76e8fad547fbb1ee69916473f7ed615ba08301527f286e0f87d619e3fedac8a3d7442ef34fb6566ce9af5a315758c0c2b8000c36cf615bc0830152614d60820151615be08301528260016040615ba085016060615ba0870160075afa14169250615b20820151615c00830152615b40820151615c20830152615ba0820151615c40830152615bc0820151615c608301528260016040615c0085016080615c00870160065afa141692507f14e66a771ef08cca0551c26b3439d49d391ba21d91b706df2c4b1f177d7759e5615c808301527f0532723a26dc928f43033efaef8e4aa2732772ba414b1dadce1fe7d0b30d99d2615ca0830152614d80820151615cc08301528260016040615c8085016060615c80870160075afa14169250615c00820151615ce0830152615c20820151615d00830152615c80820151615d20830152615ca0820151615d408301528260016040615ce085016080615ce0870160065afa141692507f0474ae1c4230bdcdd25ce460ef73c689e4227edf0ec7c2be85ef8d75592e1b36615d608301527f2fd83e6e07cc35755a04337fd70af8aa31fc74de07a539b8a8756caa60d04890615d80830152614da0820151615da08301528260016040615d6085016060615d60870160075afa14169250615ce0820151615dc0830152615d00820151615de0830152615d60820151615e00830152615d80820151615e208301528260016040615dc085016080615dc0870160065afa141692507f1c6f93aef795f525c8b51bcb0234bb345942cc31782bf75096fff2707f3e4b9f615e408301527f1bf84b761871a3311b096d870534b0a4b095330cd45fbe7bbbf5b353a980c39d615e60830152614dc0820151615e808301528260016040615e4085016060615e40870160075afa14169250615dc0820151615ea0830152615de0820151615ec0830152615e40820151615ee0830152615e60820151615f008301528260016040615ea085016080615ea0870160065afa141692507f07609ba791f0ed5d569091041c800974b8440bc5c0f97d9b6295a1632175116c615f208301527f1cdb0412f38e1a19531afbd1c9603146e7bd1c34a93df6be4c65b126e3537b68615f40830152614de0820151615f608301528260016040615f2085016060615f20870160075afa14169250615ea0820151615f80830152615ec0820151615fa0830152615f20820151615fc0830152615f40820151615fe08301528260016040615f8085016080615f80870160065afa141692507f0e955b89eca5fc34d2172022f89dc467ac2e84c9929e1ce0c2a8ce831c5dd7016160008301527f07cf929adce614b088c82cb3934f1eb7546dd2e48396e914b4ff06ec45de9e8a616020830152614e00820151616040830152826001604061600085016060616000870160075afa14169250615f80820151616060830152615fa08201516160808301526160008201516160a08301526160208201516160c0830152826001604061606085016080616060870160065afa141692507f2d4531a47528e642f8f6954a3f3ff9f6072e38d30e2e0d108d1cac201d4b684d6160e08301527f154c409bbd1760ec55639d32d5817c9399e573b22a8fdda5f707c9b9de1d4ca6616100830152614e2082015161612083015282600160406160e0850160606160e0870160075afa141692506160608201516161408301526160808201516161608301526160e08201516161808301526161008201516161a0830152826001604061614085016080616140870160065afa141692507f2dec3929e07b4276215297f5f653b3ec6bf9b910006678ab3c3d67654001d6da6161c08301527f20b9c7e9a6c29e31e9164962de9a0478aa976e72a2e2d0e9c9ab6fabbb20ba496161e0830152614e4082015161620083015282600160406161c0850160606161c0870160075afa141692506161408201516162208301526161608201516162408301526161c08201516162608301526161e0820151616280830152826001604061622085016080616220870160065afa141692507f0476c7f154f703672add74ffebc6ffa6159b4e527f0a4354b601facd57ff1a1a6162a08301527f27c10290f730edad9bcb2538056f755efea924b0a69d86d5c9c833717e730e286162c0830152614e608201516162e083015282600160406162a0850160606162a0870160075afa141692506162208201516163008301526162408201516163208301526162a08201516163408301526162c0820151616360830152826001604061630085016080616300870160065afa141692507f0743ea40f14084db2673217283aa053f986896ee7c181f52118442e99c4529746163808301527f0203e3493a2594ece57d22cc75dd081ac68271ec7c758153cfd2152bfb5c19e36163a0830152614e808201516163c0830152826001604061638085016060616380870160075afa141692506163008201516163e08301526163208201516164008301526163808201516164208301526163a082015161644083015282600160406163e0850160806163e0870160065afa141692507f1e87eb88577795c9f28c423b4d2c3ec1e890164466ea9742d9996ae5c3b80a2a6164608301527eb004814b24c7c7a9dc56ffa03d4f2b7e0f5605f3bb18deddf9e63978abbc56616480830152614ea08201516164a0830152826001604061646085016060616460870160075afa141692506163e08201516164c08301526164008201516164e083015261646082015161650083015261648082015161652083015282600160406164c0850160806164c0870160065afa141692507f20e2c72c77bcc14c0e9801d47d3ab42674027a82cde0955f1b17e5cad25edfb06165408301527f0350deaf2bcf4305e811ba811ccaae83d66761627e0a4eade1205c1cb0cfcd78616560830152614ec0820151616580830152826001604061654085016060616540870160075afa141692506164c08201516165a08301526164e08201516165c08301526165408201516165e083015261656082015161660083015282600160406165a0850160806165a0870160065afa14169250610460820151616620830152610480820151616640830152614ee0820151616660830152826001604061662085016060616620870160075afa141692506165a08201516166808301526165c08201516166a08301526166208201516166c08301526166408201516166e0830152826001604061668085016080616680870160065afa141692506104a08201516167008301526104c0820151616720830152614f00820151616740830152826001604061670085016060616700870160075afa141692506166808201516167608301526166a08201516167808301526167008201516167a08301526167208201516167c0830152826001604061676085016080616760870160065afa141692506104e08201516167e0830152610500820151616800830152614f2082015161682083015282600160406167e0850160606167e0870160075afa141692506167608201516168408301526167808201516168608301526167e08201516168808301526168008201516168a0830152826001604061684085016080616840870160065afa141692506105208201516168c08301526105408201516168e0830152614f4082015161690083015282600160406168c0850160606168c0870160075afa141692506168408201516169208301526168608201516169408301526168c08201516169608301526168e0820151616980830152826001604061692085016080616920870160065afa141692506105608201516169a08301526105808201516169c0830152614f608201516169e083015282600160406169a0850160606169a0870160075afa14169250616920820151616a00830152616940820151616a208301526169a0820151616a408301526169c0820151616a608301528260016040616a0085016080616a00870160065afa141692506103c0820151616a808301526103e0820151616aa0830152614f80820151616ac08301528260016040616a8085016060616a80870160075afa14169250616a00820151616ae0830152616a20820151616b00830152616a80820151616b20830152616aa0820151616b408301528260016040616ae085016080616ae0870160065afa14169250610300820151616b60830152610320820151616b80830152615080820151616ba08301528260016040616b6085016060616b60870160075afa14169250616ae0820151616bc0830152616b00820151616be0830152616b60820151616c00830152616b80820151616c208301528260016040616bc085016080616bc0870160065afa14169250610340820151616c40830152610360820151616c60830152615220820151616c808301528260016040616c4085016060616c40870160075afa14169250616bc0820151616ca0830152616be0820151616cc0830152616c40820151616ce0830152616c60820151616d008301528260016040616ca085016080616ca0870160065afa14169250610380820151616d208301526103a0820151616d40830152615240820151616d608301528260016040616d2085016060616d20870160075afa14169250616ca0820151616d80830152616cc0820151616da0830152616d20820151616dc0830152616d40820151616de08301528260016040616d8085016080616d80870160065afa141692506101c0820151616e008301526101e0820151616e20830152615340820151616e408301528260016040616e0085016060616e00870160075afa14169250616d80820151616e60830152616da0820151616e80830152616e00820151616ea0830152616e20820151616ec08301528260016040616e6085016080616e60870160065afa14169250610b20820151616ee0830152610b40820151616f008301526153808201518103616f20830152508160016040616ee084016060616ee0860160075afa14169150616e60810151616f40820152616e80810151616f60820152616ee0810151616f80820152616f00810151616fa08201528160016040616f4084016080616f40860160065afa14169150610bc0810151616fc0820152610be0810151616fe08201526153a08101516170008201528160016040616fc084016060616fc0860160075afa14169150616f40810151617020820152616f60810151617040820152616fc0810151617060820152616fe0810151617080820152816001604061702084016080617020860160065afa141691506170208101516170a08201526170408101516170c08201527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c26170e08201527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6171008201527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b6171208201527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa617140820152610bc0810151617160820152610be08101516171808201527f26186a2d65ee4d2f9c9a5b91f86597d35f192cd120caf7e935d8443d1938e23d6171a08201527f30441fd1b5d3370482c42152a8899027716989a6996c2535bc9f7fee8aaef79e6171c08201527f16f363f103c80d7bbc8ad3c6867e0822bbc6000be91a4689755c7df40221c1456171e08201527f2b1cbb3e521edf5a622d82762a44a5e63f1e50b332d71154a4a7958d6011deff61720082015281600160206170a084016101806170a0860160085afa6170a093909301516001149214161691505092915050565b604051806172000160405280610390906020820280368337509192915050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715615433576154336153f4565b604052919050565b600082601f83011261544c57600080fd5b813567ffffffffffffffff811115615466576154666153f4565b615479601f8201601f191660200161540a565b81815284602083860101111561548e57600080fd5b816020850160208301376000918101602001919091529392505050565b600080604083850312156154be57600080fd5b823567ffffffffffffffff808211156154d657600080fd5b818501915085601f8301126154ea57600080fd5b81356020828211156154fe576154fe6153f4565b8160051b61550d82820161540a565b928352848101820192828101908a85111561552757600080fd5b958301955b848710156155455786358252958301959083019061552c565b975050508601359250508082111561555c57600080fd5b506155698582860161543b565b915050925092905056fe30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4730644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001a26469706673582212200887bb7fb7011a424d0cab95c712805d0f3bb55a90eb7817a154209e094c8eb864736f6c63430008120033","deployedBytecode":"0x608060405234801561001057600080fd5b506004361061002b5760003560e01c8063bd205a9014610030575b600080fd5b61004361003e3660046154ab565b610057565b604051901515815260200160405180910390f35b600060016100636153d4565b6000805160206155948339815191526100d9565b600080516020615574833981519152808310818310169083800960008051602061557483398151915283840960008051602061557483398151915284820990506000805160206155748339815191526003820891909114919091169392505050565b8060208701510660208301528060408701510660408301528060608701510660608301528060808701510660808301527f0aa1294f30774a0392cf024f41480b3c489bd0a6895d82ebaa096ca8edb6bbbc600083015260208501518060a084015260408601518060c0850152846101508284610077565b169450505060608501518060e0840152608086015180610100850152846101778284610077565b169450505060a08501518061012084015260c0860151806101408501528461019f8284610077565b16945050506101606000830120610160830152610160820151818106610180840152806101a08401525060e0850151806101c0840152610100860151806101e0850152846101ed8284610077565b16945050506101208501518061020084015261014086015180610220850152846102178284610077565b60a06101a0870120610240870181905285810661026088015261028087015216945060019150506102a083015360216102808301206102a083018190528181066102c08401526102e0830152610160850151610300830181905261018086015161032084018190528461028a8284610077565b16945050506101a0850151806103408401526101c086015180610360850152846102b48284610077565b16945050506101e085015180610380840152610200860151806103a0850152846102de8284610077565b1694505050610220850151806103c0840152610240860151806103e0850152846103088284610077565b16945050506101206102e083012061040083015261040082015181810661042084015280610440840152506102608501518061046084015261028086015180610480850152846103588284610077565b16945050506102a0850151806104a08401526102c0860151806104c0850152846103828284610077565b16945050506102e0850151806104e084015261030086015180610500850152846103ac8284610077565b16945050506103208501518061052084015261034086015180610540850152846103d68284610077565b16945050506103608501518061056084015261038086015180610580850152846104008284610077565b16945050506101606104408301206105a08301526105a08201518181066105c0840152806105e084015250806103a086015106610600830152806103c086015106610620830152806103e0860151066106408301528061040086015106610660830152806104208601510661068083015280610440860151066106a083015280610460860151066106c083015280610480860151066106e0830152806104a086015106610700830152806104c086015106610720830152806104e0860151066107408301528061050086015106610760830152806105208601510661078083015280610540860151066107a083015280610560860151066107c083015280610580860151066107e0830152806105a086015106610800830152806105c086015106610820830152806105e0860151066108408301528061060086015106610860830152806106208601510661088083015280610640860151066108a083015280610660860151066108c083015280610680860151066108e0830152806106a086015106610900830152806106c086015106610920830152806106e0860151066109408301528061070086015106610960830152806107208601510661098083015280610740860151066109a083015280610760860151066109c083015280610780860151066109e0830152806107a086015106610a00830152806107c086015106610a20830152806107e086015106610a408301526104806105e0830120610a60830152610a60820151818106610a8084015280610aa0840152506001610ac08301536021610aa0830120610ac08301819052818106610ae0840152610b00830152610800850151610b208301819052610820860151610b408401819052846106898284610077565b16945050506060610b00830120610b60830152610b60820151818106610b8084015280610ba08401525061084085015180610bc084015261086086015180610be0850152846106d88284610077565b1694505050806105c08301516105c084015109610c00830181905281908009610c20830181905281908009610c40830181905281908009610c60830181905281908009610c80830181905281908009610ca0830181905281908009610cc0830181905281908009610ce0830181905281908009610d00830181905281908009610d20830181905281908009610d40830152807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000000610d4084015108610d60830152807f305e41e912d579f5b3193badcab128321c8ee1cb70aa396331b979553d820001610d6084015109610d80830152807f22b55603586d5fc42c6c14c2fc27a028c207da8b2c71cb33d549fa4a2be5d302610d8084015109610da0830152807f0daef86f88c440658be430f38559b834662c0dbd4d47a55d6e97fb49c41a2cff6105c084015108610dc0830152807f2498c2d3affa1baaf6419dbccb6a054bb87359c02eade5aeacd86c84757b9051610d8084015109610de0830152807f0bcb8b9f3137847ec20ea7f9b61753116fc08e884b0b8ae29709890f7a846fb06105c084015108610e00830152807f096b9f8b8598b7c387fb69abf236b0d5e04e24d275ee98244443eda5d3bc4035610d8084015109610e20830152807f26f8aee75b98e8663054dc0a8f4aa78747e5c37603cad86cff9e07ee1c43bfcc6105c084015108610e40830152807f28771071ab1633014eae27cfc16d5ebe08a8fe2fc9e85044e4a45f82c14cd825610d8084015109610e60830152807f07ed3e01361b6d2869a21de6c013f99f1f8aea18afd1204c5f3d96112eb327dc6105c084015108610e80830152807f0ae3c95fc03c0a5f2de8a8f46c03ccdfdfed2bb98c9e4ae0b10b15eda4e3b1e3610d8084015109610ea0830152807f2580851320f595ca8a679cc2157d8b7d4846bc8eed1b25b092d6dfa64b1c4e1e6105c084015108610ec0830152807f2afd4e77273f1cb3434a4a667929058c156b21573c3f1efc882e708597d7161a610d8084015109610ee0830152807f0566fffbb9f283767505fb50085852d112c8c6f13d7a5194bbb3850e5828e9e76105c084015108610f00830152806001610d8084015109610f20830152807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000006105c084015108610f40830152807f14c60185e75885d674db4b3f7d4a5694fa6c01aa0f53557b060bc04a4172705f610d8084015109610f60830152807f1b9e4cecf9d91a534374fa77043701c82dc7e69e6a661b163dd63549ae8d8fa26105c084015108610f80830152807f2ad9021ed07c42ab19f77c5cf2cbd2deb135ea330f1b1573bd08d99309c4bb7d610d8084015109610fa0830152807f058b4c5410b55d7e9e58c9598eb5857e76fdfe156a9e5b1d86d91c00e63b44846105c084015108610fc0830152807f1908597d2fc3bc1da312efa344e0fc8a7079300238f2ee35774f117e66fd4467610d8084015109610fe0830152807f175bf4f5b16de40c153d56133ca05bd2b7bab84640c6825bcc92e4158902bb9a6105c084015108611000830152610dc08201518181610e00850151099050806110208401528181610e40850151099050806110408401528181610e80850151099050806110608401528181610ec0850151099050806110808401528181610f00850151099050806110a08401528181610f40850151099050806110c08401528181610f80850151099050806110e08401528181610fc0850151099050806111008401528181611000850151099050806111208401528181610d608501510990508061114084015250602061118083015260206111a083015260206111c08301526111408201516111e08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593efffffff6112008301526000805160206155948339815191526112208301528260016020611160850160c0611180870160055afa141692506111608201516000610d608401519050828261112086015109610d608501528282820991506110008401519050828261110086015109611000850152828282099150610fc0840151905082826110e086015109610fc0850152828282099150610f80840151905082826110c086015109610f80850152828282099150610f40840151905082826110a086015109610f40850152828282099150610f008401519050828261108086015109610f00850152828282099150610ec08401519050828261106086015109610ec0850152828282099150610e808401519050828261104086015109610e80850152828282099150610e408401519050828261102086015109610e40850152828282099150610e0084015190508282610dc086015109610e0085015282828209610dc08501819052610da08501518493509091500961124083015280610e00830151610de08401510961126083015280610e40830151610e208401510961128083015280610e80830151610e60840151096112a083015280610ec0830151610ea0840151096112c083015280610f00830151610ee0840151096112e083015280610f40830151610f208401510961130083015280610f80830151610f608401510961132083015280610fc0830151610fa08401510961134083015280611000830151610fe084015109611360830152806020830151611300840151098181836040860151611320870151090890508181836060860151611340870151090890508181836080860151611360870151090861138084015250610720820151610600830151829190086113a08301819052819080096113c08301819052819080096113e0830152806113e08301516113a084015109611400830152807f066f6f85d6f68a85ec10345351a23a3aaf07f38af8c952a7bceca70bd2af7ad561140084015109611420830152806107408301516106208401510861144083018190528190800961146083018190528190800961148083015280611480830151611440840151096114a0830152807f2b9d4b4110c9ae997782e1509b1d0fdb20a7c02bbd8bea7305462b9f8125b1e86114a0840151096114c0830152806114c0830151611420840151086114e08301528061064083015182036114e08401510861150083018190526107c08301518291096115208301528061152083015161042084015109611540830152807f0cc57cdbb08507d62bf67a4493cc262fb6c09d557013fff1f573f431221f8ff961140084015109611560830152807f1274e649a32ed355a31a6ed69724e1adade857e86eb5c3a121bcd147943203c86114a08401510961158083015280611580830151611560840151086115a08301528061066083015182036115a0840151086115c083018190526107c08301518291096115e0830152806115e08301516115408401510861160083015280611600830151610420840151096116208301528061068083015182036114008401510861164083018190526107e0830151829109611660830152806116608301516116208401510861168083015280611680830151610420840151096116a0830152807f066f6f85d6f68a85ec10345351a23a3aaf07f38af8c952a7bceca70bd2af7ad5610680840151096116c0830152807f2b9d4b4110c9ae997782e1509b1d0fdb20a7c02bbd8bea7305462b9f8125b1e8611440840151096116e0830152806116e08301516116c08401510861170083018190526106e08301518291086117208301819052819080096117408301819052819080096117608301528061176083015161172084015109611780830152807f13abec390ada7f4370819ab1c7846f210554569d9b29d1ea8dbebd0fa8c53e66610640840151096117a0830152807f1eb9e1dc19a33a624c9862a1d97d1510bd521ead5dfe0345aaf6185b1a1e60fe610660840151096117c0830152806117c08301516117a0840151086117e0830152806117e083015182036117808401510861180083018190526107e0830151829109611820830152806118208301516116a0840151086118408301528061184083015161042084015109611860830152807f0cc57cdbb08507d62bf67a4493cc262fb6c09d557013fff1f573f431221f8ff961068084015109611880830152807f1274e649a32ed355a31a6ed69724e1adade857e86eb5c3a121bcd147943203c8611440840151096118a0830152806118a0830151611880840151086118c083018190526107008301518291086118e0830152807f0fc1c9394db89bb2601abc49fdad4f038ce5169030a2ad69763f7875036bcb0261064084015109611900830152807f16a9e98c493a902b9502054edc03e7b22b7eac34345961bc8abced6bd147c8be6106608401510961192083015280611920830151611900840151086119408301528061194083015182036118e08401510861196083018190526107e083015182910961198083015280611980830151611860840151086119a0830152806119a0830151610420840151096119c0830152806107a083015182036001086119e083018190526107a0830151829109611a00830152806107a08301518203600208611a208301819052611a00830151829109611a40830152806107a08301518203600408611a608301819052611a40830151829109611a80830152806106008301516106c084015108611aa0830152806106408301518203611aa084015108611ac08301819052611a80830151829109611ae083015280611ae08301516119c084015108611b0083015280611b0083015161042084015109611b208301528061066083015182036106a084015108611b408301819052611a80830151829109611b6083015280611b60830151611b2084015108611b8083015280611b8083015161042084015109611ba08301528061080083015161150084015109611bc083015280611bc0830151611ba084015108611be083015280611be083015161042084015109611c00830152806108008301516115c084015109611c2083015280611c20830151611c0084015108611c4083015280611c4083015161042084015109611c608301528061082083015161164084015109611c8083015280611c80830151611c6084015108611ca083015280611ca083015161042084015109611cc08301528061082083015161180084015109611ce083015280611ce0830151611cc084015108611d0083015280611d0083015161042084015109611d208301528061082083015161196084015109611d4083015280611d40830151611d2084015108611d6083015280611d6083015161042084015109611d80830152806107a08301518203600308611da08301819052611a40830151829109611dc083015280611dc0830151611ac084015109611de083015280611de0830151611d8084015108611e0083015280611e0083015161042084015109611e2083015280611dc0830151611b4084015109611e4083015280611e40830151611e2084015108611e6083015280611e6083015161042084015109611e80830152806107a0830151611a2084015109611ea083015280611ea0830151611da084015109611ec083015280611ec0830151611a6084015109611ee083015280611ee083015161068084015109611f00830152806106808301518203600108611f208301819052611f00830151829109611f4083015280611f40830151611e8084015108611f6083015280611f6083015161042084015109611f8083015280610680830151600209611fa083015280610600830151820361062084015108611fc08301819052611fa0830151829109611fe083015280610600830151820361064084015108612000830152806120008301518203611fe08401510861202083015280610660830151820361062084015108612040830152806120408301518203612020840151086120608301819052611ee083015182910961208083015280612080830151611f80840151086120a0830152806120a0830151610420840151096120c083015280611a00830151611da0840151096120e0830152806120e0830151611a60840151096121008301528061062083015161060084015108612120830152806106808301518203612120840151086121408301819052612100830151829109612160830152806121608301516120c08401510861218083015280612180830151610420840151096121a083018190526121608301518291086121c0830152806121c0830151610420840151096121e08301528061092083015182036001086122008301819052611300830151829109612220830152806122208301516121e084015108612240830152806122408301516104208401510961226083015261098082015181908009612280830152806109808301518203612280840151086122a083018190526112408301518291096122c0830152806122c0830151612260840151086122e0830152806122e083015161042084015109612300830152806109608301518203610980840151086123208301819052611300830151829109612340830152806123408301516123008401510861236083015280612360830151610420840151096123808301528061124083015182036001086123a083015280611280830151611260840151086123c083018190526112a08301518291086123e083018190526112c083015182910861240083018190526112e08301518291086124208301528061242083015182036123a0840151086124408301528061026083015161086084015109612460830152806124608301516106e08401510861248083018190526102c08301518291086124a083015280610260830151610880840151096124c0830152806124c0830151610600840151086124e083018190526102c083015182910861250083018190526124a0830151829109612520830152806102608301516108a084015109612540830152806125408301516106208401510861256083018190526102c083015182910861258083018190526125208301518291096125a0830152806102608301516108c0840151096125c0830152806125c0830151610700840151086125e083018190526102c083015182910861260083018190526125a0830151829109612620830181905261094083015182910961264083015280610260830151600109612660830152806126608301516105c084015109612680830152806126808301516106e0840151086126a083018190526102c08301518291086126c0830152806102608301517f09226b6e22c6f0ca64ec26aad4c86e715b5f898e5e963f25870e56bbe533e9a2096126e0830152806126e08301516105c084015109612700830152806127008301516106008401510861272083018190526102c083015182910861274083018190526126c0830151829109612760830152806102608301517f13b360d4e82fe915fed16081038f98c211427b87a281bd733c277dbadf10372b09612780830152806127808301516105c0840151096127a0830152806127a0830151610620840151086127c083018190526102c08301518291086127e08301819052612760830151829109612800830152806102608301517f18afdf23e9bd9302673fc1e076a492d4d65bd18ebc4d854ed189139bab313e5209612820830152806128208301516105c084015109612840830152806128408301516107008401510861286083018190526102c083015182910861288083018190526128008301518291096128a083018190526109208301518291096128c0830152806128c08301518203612640840151086128e0830181905261244083015182910961290083015280612900830151612380840151086129208301528061292083015161042084015109612940830152806102608301516108e084015109612960830152806129608301516106808401510861298083018190526102c08301518291086129a083015280610260830151610900840151096129c0830152806129c0830151611380840151086129e083018190526102c0830151829108612a0083018190526129a0830151829109612a2083018190526109a0830151829109612a40830152806102608301517ea136ba13afa6c83eb7b82fb370e228e74155e48fb8f1c1cfc33fb0da8afb4209612a6083015280612a608301516105c084015109612a8083015280612a8083015161068084015108612aa083018190526102c0830151829108612ac0830152806102608301517f2eb9750dce545f17d492058dd201a1251ff3d9077864583d44eaf9be9008699d09612ae083015280612ae08301516105c084015109612b0083015280612b0083015161138084015108612b2083018190526102c0830151829108612b408301819052612ac0830151829109612b608301819052610980830151829109612b8083015280612b808301518203612a4084015108612ba08301819052612440830151829109612bc083015280612bc083015161294084015108612be083015280612be083015161042084015109612c00830152806109c08301518203600108612c208301819052611300830151829109612c4083015280612c40830151612c0084015108612c6083015280612c6083015161042084015109612c808301526109c082015181908009612ca0830152806109c08301518203612ca084015108612cc08301819052611240830151829109612ce083015280612ce0830151612c8084015108612d0083015280612d0083015161042084015109612d2083015280610260830151610a0084015108612d4083018190526109e0830151829109612d60830152806102c0830151610a4084015108612d808301819052612d60830151829109612da08301528061064083015161010009612dc083015280612dc0830151820361060084015108612de08301819052610780830151829109612e008301819052610260830151829108612e2083018190526109c0830151829109612e40830152806102c083015161076084015108612e608301819052612e40830151829109612e8083015280612e808301518203612da084015108612ea08301819052612440830151829109612ec083015280612ec0830151612d2084015108612ee083015280612ee083015161042084015109612f0083015280610a408301518203610a0084015108612f208301819052611300830151829109612f4083015280612f40830151612f0084015108612f6083015280612f6083015161042084015109612f8083015280612440830151612f2084015109612fa083015280610a208301518203610a0084015108612fc08301819052612fa0830151829109612fe083015280612fe0830151612f8084015108613000830152610d40820151819080096130208301819052610d408301518291096130408301819052610d408301518291096130608301819052610d4083015182910961308083015280610d408301516001096130a0830152806130208301516001096130c0830152806130408301516001096130e08301528061306083015160010961310083015280610d6083015161300084015109613120830152806105c0830151610c00840151096131408301528060016105c084015109613160830152806131608301518203610b8084015108613180830152807f14c60185e75885d674db4b3f7d4a5694fa6c01aa0f53557b060bc04a4172705f6105c0840151096131a0830152806131a08301518203610b80840151086131c0830152807f22b55603586d5fc42c6c14c2fc27a028c207da8b2c71cb33d549fa4a2be5d3026105c0840151096131e0830152806131e08301518203610b8084015108613200830152807f2afd4e77273f1cb3434a4a667929058c156b21573c3f1efc882e708597d7161a6105c084015109613220830152806132208301518203610b808401510861324083015280817f21054ce8b3cb9dc9b87af5c70c8f54994090ad8fa7e06caaf989ba5806b6798b610c0085015109610b8084015109818183847f0f5f018a2d66025fffd54fef74f203c3e7a33ab8d1d903e64a583b3be9498676610c00880151096105c087015109089050806132608401525080817f10ac009d2f31395e301635cd6d292978a4012197c24d6e63fb49943a70296136610c0085015109610b8084015109818183847f2696aa2788110c63ebbfd7f92b352ce93b28bbdae57b7cb94bc5885ee439e774610c00880151096105c087015109089050806132808401525080817f2510cae1618713ac17c9ef83f1a67645ed21f454d96bf1f072ca5b463e7f0c28610c0085015109610b8084015109818183847f0d6a07653c64f4112284cb8b23bf73adecaf4ee0fef51998549526f07b6defd7610c00880151096105c087015109086132a08401525061318082015181906001096132c083018190526131c08301518291096132e08301819052613240830151829109613300830152806001610b80840151098181837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000006105c087015109089050806133208401525080817f1d81b9bd5165d63a0d4a8370d37966eb243365d36ca235911564a783f8234cf2610c0085015109610b8084015109818183847f12e294b58fcbc9efab05c245ae07f172040082750d173b002e7d4e0ff7dcb30f610c00880151096105c087015109089050806133408401525080817f142f93c8919700eddb46a823a63f1726c05e6953fd8ba57ddf6ea70e7ebc8dcf610c0085015109610b8084015109818183847f2707d3cc5788c2cfc0ee9e5f5638da3b90cb6d8b97224a4521073ec9f10826fb610c00880151096105c087015109089050806133608401525080817f13d3d4db83b42c4d48afa6b5c9cbe3f49703d0caf1fdc301b0d4d3743ab60833610c0085015109610b8084015109818183847f223ed99d38075819043fa85ed3c54f3bfb5d62312139562ca82d9903b1b52e27610c00880151096105c08701510908613380840152506132008201516132e0830151829190096133a083015280817f1b9e4cecf9d91a534374fa77043701c82dc7e69e6a661b163dd63549ae8d8fa36105c085015109610b8084015109818183847f14c60185e75885d674db4b3f7d4a5694fa6c01aa0f53557b060bc04a4172705e6105c0880151096105c087015109089050806133c08401525080817f14c60185e75885d674db4b3f7d4a5694fa6c01aa0f53557b060bc04a4172705e6105c085015109610b8084015109818183847f1a514dd9f80de355133414990bffdc137169ffbf79f1b0988ce4dc4b27adb4e36105c0880151096105c087015109089050806133e08401525080817f0566fffbb9f283767505fb50085852d112c8c6f13d7a5194bbb3850e5828e9e86105c085015109610b8084015109818183847f2afd4e77273f1cb3434a4a667929058c156b21573c3f1efc882e708597d716196105c0880151096105c087015109089050806134008401525080817f2afd4e77273f1cb3434a4a667929058c156b21573c3f1efc882e708597d716196105c085015109610b8084015109818183847f20198517670312541561a1720d2538ac357df59dafa0d41bd7235a97f2f364376105c0880151096105c08701510908613420840152506132408201516132c08301518291900961344083015261326082015181816132808501510990508061346084015281816132a0850151099050806134808401528181613320850151099050806134a084015281816132c0850151099050806134c08401528181613340850151099050806134e084015281816133608501510990508061350084015281816133808501510990508061352084015281816133a08501510990508061354084015281816133c08501510990508061356084015281816133e08501510990508061358084015281816132e0850151099050806135a08401528181613400850151099050806135c08401528181613420850151099050806135e0840152818161344085015109905080613600840152506020613640830152602061366083015260206136808301526136008201516136a08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593efffffff6136c08301526000805160206155948339815191526136e08301528260016020613620850160c0613640870160055afa141692506136208201516000613440840151905082826135e086015109613440850152828282099150613420840151905082826135c086015109613420850152828282099150613400840151905082826135a0860151096134008501528282820991506132e084015190508282613580860151096132e08501528282820991506133e084015190508282613560860151096133e08501528282820991506133c084015190508282613540860151096133c08501528282820991506133a084015190508282613520860151096133a08501528282820991506133808401519050828261350086015109613380850152828282099150613360840151905082826134e086015109613360850152828282099150613340840151905082826134c0860151096133408501528282820991506132c0840151905082826134a0860151096132c085015282828209915061332084015190508282613480860151096133208501528282820991506132a084015190508282613460860151096132a08501528282820991506132808401519050828261326086015109613280850152828282096132608501819052613280850151909250839150829008905081816132a085015108613700840152506132c0820151613300830151829190096137208301526133208201518061374084015250806133a0830151613300840151096137608301526133408201518181613360850151089050818161338085015108613780840152506132e0820151613300830151829190096137a08301526133c082015181816133e0850151086137c084015250613440820151613300830151829190096137e083015261340082015181816134208501510861380084015250613700820151613740830151829082900990508061382084015281816137808501510990508061384084015281816137c0850151099050806138608401528181613800850151099050806138808401525060206138c083015260206138e083015260206139008301526138808201516139208301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593efffffff61394083015260008051602061559483398151915261396083015282600160206138a0850160c06138c0870160055afa141692506138a0820151600061380084015190508282613860860151096138008501528282820991506137c084015190508282613840860151096137c0850152828282099150613780840151905082826138208601510961378085015282828209915061374084015190508282613700860151096137408501528282820961370085015250506137408201516137208301518291900961398083015280613780830151613760840151096139a0830152806137c08301516137a0840151096139c0830152806138008301516137e0840151096139e0830152610a8082015181908009613a008301819052610a80830151829109613a208301819052610a80830151829109613a408301819052610a80830151829109613a608301819052610a80830151829109613a808301819052610a80830151829109613aa08301819052610a80830151829109613ac08301819052610a80830151829109613ae08301819052610a80830151829109613b008301819052610a80830151829109613b208301819052610a80830151829109613b408301819052610a80830151829109613b608301819052610a80830151829109613b808301819052610a80830151829109613ba08301819052610a80830151829109613bc08301819052610a80830151829109613be08301819052610a80830151829109613c008301819052610a80830151829109613c208301819052610a80830151829109613c408301819052610a80830151829109613c60830152610ae082015181908009613c808301819052610ae0830151829109613ca08301819052610ae0830151829109613cc08301819052610ae0830151829109613ce08301528061326083015161060084015109818183613280860151610640870151090890508181836132a08601516106c08701510908613d0084018190526137008401518392509009613d20830152806001613d20840151830309613d408301528061326083015161062084015109818183613280860151610660870151090890508181836132a08601516106a08701510908613d6084018190526137008401518392509009613d808301819052610a808301518291820309613da083015280610a80830151600109613dc083015280613da0830151613d4084015108613de0830152806001613de084015109613e00830152806001613dc084015109613e2083015280613720830151600109613e408301528061332083015161068084015109613e608301819052613980830151829109613e80830152806001613e80840151830309613ea0830152806001613e4084015109613ec083015280613320830151610a4084015109613ee08301819052613980830151829109613f008301819052610a808301518291820309613f2083015280610a80830151613e4084015109613f4083015280613f20830151613ea084015108613f60830152806133208301516106e084015109613f808301819052613980830151829109613fa08301819052613a008301518291820309613fc083015280613a00830151613e4084015109613fe083015280613fc0830151613f6084015108614000830152806133208301516107008401510961402083018190526139808301518291096140408301819052613a20830151829182030961406083015280613a20830151613e408401510961408083015280614060830151614000840151086140a083015280613320830151610720840151096140c083018190526139808301518291096140e08301819052613a40830151829182030961410083015280613a40830151613e4084015109614120830152806141008301516140a084015108614140830152806133208301516107408401510961416083018190526139808301518291096141808301819052613a6083015182918203096141a083015280613a60830151613e40840151096141c0830152806141a0830151614140840151086141e0830152806133208301516107608401510961420083018190526139808301518291096142208301819052613a80830151829182030961424083015280613a80830151613e4084015109614260830152806142408301516141e08401510861428083015280613320830151610780840151096142a083018190526139808301518291096142c08301819052613aa083015182918203096142e083015280613aa0830151613e4084015109614300830152806142e083015161428084015108614320830152806133208301516107a08401510961434083018190526139808301518291096143608301819052613ac0830151829182030961438083015280613ac0830151613e40840151096143a083015280614380830151614320840151086143c0830152806133208301516107c0840151096143e083018190526139808301518291096144008301819052613ae0830151829182030961442083015280613ae0830151613e4084015109614440830152806144208301516143c084015108614460830152806133208301516107e08401510961448083018190526139808301518291096144a08301819052613b0083015182918203096144c083015280613b00830151613e40840151096144e0830152806144c083015161446084015108614500830152806133208301516108008401510961452083018190526139808301518291096145408301819052613b20830151829182030961456083015280613b20830151613e408401510961458083015280614560830151614500840151086145a083015280613320830151610820840151096145c083018190526139808301518291096145e08301819052613b40830151829182030961460083015280613b40830151613e4084015109614620830152806146008301516145a084015108614640830152806133208301516108608401510961466083018190526139808301518291096146808301819052613b6083015182918203096146a083015280613b60830151613e40840151096146c0830152806146a0830151614640840151086146e0830152806133208301516108808401510961470083018190526139808301518291096147208301819052613b80830151829182030961474083015280613b80830151613e4084015109614760830152806147408301516146e084015108614780830152806133208301516108a0840151096147a083018190526139808301518291096147c08301819052613ba083015182918203096147e083015280613ba0830151613e4084015109614800830152806147e083015161478084015108614820830152806133208301516108c08401510961484083018190526139808301518291096148608301819052613bc0830151829182030961488083015280613bc0830151613e40840151096148a083015280614880830151614820840151086148c0830152806133208301516108e0840151096148e083018190526139808301518291096149008301819052613be0830151829182030961492083015280613be0830151613e4084015109614940830152806149208301516148c084015108614960830152806133208301516109008401510961498083018190526139808301518291096149a08301819052613c0083015182918203096149c083015280613c00830151613e40840151096149e0830152806149c083015161496084015108614a00830152806137208301516130a084015109614a20830152806137208301516130c084015109614a40830152806137208301516130e084015109614a608301528061372083015161310084015109614a808301528061332083015161312084015109614aa08301819052613980830151829109614ac08301819052613c208301518291820309614ae083015280613c20830151613e4084015109614b0083015280613c20830151614a2084015109614b2083015280613c20830151614a4084015109614b4083015280613c20830151614a6084015109614b6083015280613c20830151614a8084015109614b8083015280614ae0830151614a0084015108614ba08301528061332083015161084084015109614bc08301819052613980830151829109614be08301819052613c408301518291820309614c0083015280613c40830151613e4084015109614c2083015280614c00830151614ba084015108614c408301819052610ae0830151829109614c6083015280610ae0830151613ec084015109614c8083015280610ae0830151613f4084015109614ca083015280610ae0830151613fe084015109614cc083015280610ae083015161408084015109614ce083015280610ae083015161412084015109614d0083015280610ae08301516141c084015109614d2083015280610ae083015161426084015109614d4083015280610ae083015161430084015109614d6083015280610ae08301516143a084015109614d8083015280610ae083015161444084015109614da083015280610ae08301516144e084015109614dc083015280610ae083015161458084015109614de083015280610ae083015161462084015109614e0083015280610ae08301516146c084015109614e2083015280610ae083015161476084015109614e4083015280610ae083015161480084015109614e6083015280610ae08301516148a084015109614e8083015280610ae083015161494084015109614ea083015280610ae08301516149e084015109614ec083015280610ae0830151614b0084015109614ee083015280610ae0830151614b2084015109614f0083015280610ae0830151614b4084015109614f2083015280610ae0830151614b6084015109614f4083015280610ae0830151614b8084015109614f6083015280610ae0830151614c2084015109614f8083015280614c60830151613e0084015108614fa083015280613760830151600109614fc08301528061334083015161092084015109818183613360860151610940870151090890508181836133808601516109608701510908614fe084018190526139a08401518392509009615000830152806001615000840151830309615020830152806001614fc08401510961504083015280613c808301516150208401510961506083015280613c808301516150408401510961508083015280615060830151614fa0840151086150a0830152806137a08301516001096150c0830152806133c0830151610980840151098181836133e08601516109a087015109086150e084018190526139c084015183925090096151008301528060016151008401518303096151208301528060016150c084015109615140830152806133c08301516109c0840151098181836133e08601516109e0870151090861516084018190526139c084015183925090096151808301819052610a8083015182918203096151a083015280610a808301516150c0840151096151c0830152806151a0830151615120840151086151e08301819052613ca083015182910961520083015280613ca08301516151408401510961522083015280613ca08301516151c084015109615240830152806152008301516150a084015108615260830152806137e083015160010961528083015280613400830151610a0084015109818183613420860151610a2087015109086152a084018190526139e084015183925090096152c08301528060016152c08401518303096152e08301528060016152808401510961530083015280613cc08301516152e08401510961532083015280613cc08301516153008401510961534083015280615320830151615260840151086153608301528061330083015160010961538083015280610b808301516001096153a083015260016153c0830181815260026153e085015261536084015161540085015284919060409060608160075afa141692506153c08201516154208301526153e082015161544083015260a082015161546083015260c0820151615480830152826001604061542085016080615420870160065afa1416925060e08201516154a08301526101008201516154c0830152613e208201516154e083015282600160406154a0850160606154a0870160075afa141692506154208201516155008301526154408201516155208301526154a08201516155408301526154c0820151615560830152826001604061550085016080615500870160065afa141692506101208201516155808301526101408201516155a0830152614c808201516155c0830152826001604061558085016060615580870160075afa141692506155008201516155e08301526155208201516156008301526155808201516156208301526155a082015161564083015282600160406155e0850160806155e0870160065afa14169250610200820151615660830152610220820151615680830152614ca08201516156a0830152826001604061566085016060615660870160075afa141692506155e08201516156c08301526156008201516156e083015261566082015161570083015261568082015161572083015282600160406156c0850160806156c0870160065afa141692507f291e4db43c260726b91c535917a801bde06be7f7cf45010909762313db4252906157408301527f154e7fe15847ac4d1cd93fa6c8209672cfccf45ad8e13ab82fc6b167ba1994fc615760830152614cc0820151615780830152826001604061574085016060615740870160075afa141692506156c08201516157a08301526156e08201516157c08301526157408201516157e083015261576082015161580083015282600160406157a0850160806157a0870160065afa141692507f176b10d402fac05bfc982234f50b305ad067e122f1682a4b9c4bd98bda91919d6158208301527f1d62e78d655e3fc74188666738fca6524a712f1a3c4ccfdd0fa44f3e2c849c51615840830152614ce0820151615860830152826001604061582085016060615820870160075afa141692506157a08201516158808301526157c08201516158a08301526158208201516158c08301526158408201516158e0830152826001604061588085016080615880870160065afa141692507f019dd7ee531990d335aad8f64c26a1bc072b47a7efd4504404d2e95e202507596159008301527f0c413dd8e50189a05a374679bae72f724f7b71e956c32c0881ea37694276ea83615920830152614d00820151615940830152826001604061590085016060615900870160075afa141692506158808201516159608301526158a08201516159808301526159008201516159a08301526159208201516159c0830152826001604061596085016080615960870160065afa141692507f0730799d5bfec1cefc5aaffcffe3f3dd491b2bfcaf9f553f94de6145ed4742af6159e08301527f24ad4af082e96b14b9a6da80f4fa1334f253c458add531c8d9f8b23c5ecb9c43615a00830152614d20820151615a2083015282600160406159e0850160606159e0870160075afa14169250615960820151615a40830152615980820151615a608301526159e0820151615a80830152615a00820151615aa08301528260016040615a4085016080615a40870160065afa141692507f22e1cdbfffcfcf4f18cf4342edf1fb26c3b6e52ace3d5fadcf5cc2614333baa4615ac08301527f0e28df72dcc69cc6442d72f693661997480a913ac353890efd63a873959727c0615ae0830152614d40820151615b008301528260016040615ac085016060615ac0870160075afa14169250615a40820151615b20830152615a60820151615b40830152615ac0820151615b60830152615ae0820151615b808301528260016040615b2085016080615b20870160065afa141692507f0b30fe9581a6c70064e3b35446b2433842db76e8fad547fbb1ee69916473f7ed615ba08301527f286e0f87d619e3fedac8a3d7442ef34fb6566ce9af5a315758c0c2b8000c36cf615bc0830152614d60820151615be08301528260016040615ba085016060615ba0870160075afa14169250615b20820151615c00830152615b40820151615c20830152615ba0820151615c40830152615bc0820151615c608301528260016040615c0085016080615c00870160065afa141692507f14e66a771ef08cca0551c26b3439d49d391ba21d91b706df2c4b1f177d7759e5615c808301527f0532723a26dc928f43033efaef8e4aa2732772ba414b1dadce1fe7d0b30d99d2615ca0830152614d80820151615cc08301528260016040615c8085016060615c80870160075afa14169250615c00820151615ce0830152615c20820151615d00830152615c80820151615d20830152615ca0820151615d408301528260016040615ce085016080615ce0870160065afa141692507f0474ae1c4230bdcdd25ce460ef73c689e4227edf0ec7c2be85ef8d75592e1b36615d608301527f2fd83e6e07cc35755a04337fd70af8aa31fc74de07a539b8a8756caa60d04890615d80830152614da0820151615da08301528260016040615d6085016060615d60870160075afa14169250615ce0820151615dc0830152615d00820151615de0830152615d60820151615e00830152615d80820151615e208301528260016040615dc085016080615dc0870160065afa141692507f1c6f93aef795f525c8b51bcb0234bb345942cc31782bf75096fff2707f3e4b9f615e408301527f1bf84b761871a3311b096d870534b0a4b095330cd45fbe7bbbf5b353a980c39d615e60830152614dc0820151615e808301528260016040615e4085016060615e40870160075afa14169250615dc0820151615ea0830152615de0820151615ec0830152615e40820151615ee0830152615e60820151615f008301528260016040615ea085016080615ea0870160065afa141692507f07609ba791f0ed5d569091041c800974b8440bc5c0f97d9b6295a1632175116c615f208301527f1cdb0412f38e1a19531afbd1c9603146e7bd1c34a93df6be4c65b126e3537b68615f40830152614de0820151615f608301528260016040615f2085016060615f20870160075afa14169250615ea0820151615f80830152615ec0820151615fa0830152615f20820151615fc0830152615f40820151615fe08301528260016040615f8085016080615f80870160065afa141692507f0e955b89eca5fc34d2172022f89dc467ac2e84c9929e1ce0c2a8ce831c5dd7016160008301527f07cf929adce614b088c82cb3934f1eb7546dd2e48396e914b4ff06ec45de9e8a616020830152614e00820151616040830152826001604061600085016060616000870160075afa14169250615f80820151616060830152615fa08201516160808301526160008201516160a08301526160208201516160c0830152826001604061606085016080616060870160065afa141692507f2d4531a47528e642f8f6954a3f3ff9f6072e38d30e2e0d108d1cac201d4b684d6160e08301527f154c409bbd1760ec55639d32d5817c9399e573b22a8fdda5f707c9b9de1d4ca6616100830152614e2082015161612083015282600160406160e0850160606160e0870160075afa141692506160608201516161408301526160808201516161608301526160e08201516161808301526161008201516161a0830152826001604061614085016080616140870160065afa141692507f2dec3929e07b4276215297f5f653b3ec6bf9b910006678ab3c3d67654001d6da6161c08301527f20b9c7e9a6c29e31e9164962de9a0478aa976e72a2e2d0e9c9ab6fabbb20ba496161e0830152614e4082015161620083015282600160406161c0850160606161c0870160075afa141692506161408201516162208301526161608201516162408301526161c08201516162608301526161e0820151616280830152826001604061622085016080616220870160065afa141692507f0476c7f154f703672add74ffebc6ffa6159b4e527f0a4354b601facd57ff1a1a6162a08301527f27c10290f730edad9bcb2538056f755efea924b0a69d86d5c9c833717e730e286162c0830152614e608201516162e083015282600160406162a0850160606162a0870160075afa141692506162208201516163008301526162408201516163208301526162a08201516163408301526162c0820151616360830152826001604061630085016080616300870160065afa141692507f0743ea40f14084db2673217283aa053f986896ee7c181f52118442e99c4529746163808301527f0203e3493a2594ece57d22cc75dd081ac68271ec7c758153cfd2152bfb5c19e36163a0830152614e808201516163c0830152826001604061638085016060616380870160075afa141692506163008201516163e08301526163208201516164008301526163808201516164208301526163a082015161644083015282600160406163e0850160806163e0870160065afa141692507f1e87eb88577795c9f28c423b4d2c3ec1e890164466ea9742d9996ae5c3b80a2a6164608301527eb004814b24c7c7a9dc56ffa03d4f2b7e0f5605f3bb18deddf9e63978abbc56616480830152614ea08201516164a0830152826001604061646085016060616460870160075afa141692506163e08201516164c08301526164008201516164e083015261646082015161650083015261648082015161652083015282600160406164c0850160806164c0870160065afa141692507f20e2c72c77bcc14c0e9801d47d3ab42674027a82cde0955f1b17e5cad25edfb06165408301527f0350deaf2bcf4305e811ba811ccaae83d66761627e0a4eade1205c1cb0cfcd78616560830152614ec0820151616580830152826001604061654085016060616540870160075afa141692506164c08201516165a08301526164e08201516165c08301526165408201516165e083015261656082015161660083015282600160406165a0850160806165a0870160065afa14169250610460820151616620830152610480820151616640830152614ee0820151616660830152826001604061662085016060616620870160075afa141692506165a08201516166808301526165c08201516166a08301526166208201516166c08301526166408201516166e0830152826001604061668085016080616680870160065afa141692506104a08201516167008301526104c0820151616720830152614f00820151616740830152826001604061670085016060616700870160075afa141692506166808201516167608301526166a08201516167808301526167008201516167a08301526167208201516167c0830152826001604061676085016080616760870160065afa141692506104e08201516167e0830152610500820151616800830152614f2082015161682083015282600160406167e0850160606167e0870160075afa141692506167608201516168408301526167808201516168608301526167e08201516168808301526168008201516168a0830152826001604061684085016080616840870160065afa141692506105208201516168c08301526105408201516168e0830152614f4082015161690083015282600160406168c0850160606168c0870160075afa141692506168408201516169208301526168608201516169408301526168c08201516169608301526168e0820151616980830152826001604061692085016080616920870160065afa141692506105608201516169a08301526105808201516169c0830152614f608201516169e083015282600160406169a0850160606169a0870160075afa14169250616920820151616a00830152616940820151616a208301526169a0820151616a408301526169c0820151616a608301528260016040616a0085016080616a00870160065afa141692506103c0820151616a808301526103e0820151616aa0830152614f80820151616ac08301528260016040616a8085016060616a80870160075afa14169250616a00820151616ae0830152616a20820151616b00830152616a80820151616b20830152616aa0820151616b408301528260016040616ae085016080616ae0870160065afa14169250610300820151616b60830152610320820151616b80830152615080820151616ba08301528260016040616b6085016060616b60870160075afa14169250616ae0820151616bc0830152616b00820151616be0830152616b60820151616c00830152616b80820151616c208301528260016040616bc085016080616bc0870160065afa14169250610340820151616c40830152610360820151616c60830152615220820151616c808301528260016040616c4085016060616c40870160075afa14169250616bc0820151616ca0830152616be0820151616cc0830152616c40820151616ce0830152616c60820151616d008301528260016040616ca085016080616ca0870160065afa14169250610380820151616d208301526103a0820151616d40830152615240820151616d608301528260016040616d2085016060616d20870160075afa14169250616ca0820151616d80830152616cc0820151616da0830152616d20820151616dc0830152616d40820151616de08301528260016040616d8085016080616d80870160065afa141692506101c0820151616e008301526101e0820151616e20830152615340820151616e408301528260016040616e0085016060616e00870160075afa14169250616d80820151616e60830152616da0820151616e80830152616e00820151616ea0830152616e20820151616ec08301528260016040616e6085016080616e60870160065afa14169250610b20820151616ee0830152610b40820151616f008301526153808201518103616f20830152508160016040616ee084016060616ee0860160075afa14169150616e60810151616f40820152616e80810151616f60820152616ee0810151616f80820152616f00810151616fa08201528160016040616f4084016080616f40860160065afa14169150610bc0810151616fc0820152610be0810151616fe08201526153a08101516170008201528160016040616fc084016060616fc0860160075afa14169150616f40810151617020820152616f60810151617040820152616fc0810151617060820152616fe0810151617080820152816001604061702084016080617020860160065afa141691506170208101516170a08201526170408101516170c08201527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c26170e08201527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6171008201527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b6171208201527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa617140820152610bc0810151617160820152610be08101516171808201527f26186a2d65ee4d2f9c9a5b91f86597d35f192cd120caf7e935d8443d1938e23d6171a08201527f30441fd1b5d3370482c42152a8899027716989a6996c2535bc9f7fee8aaef79e6171c08201527f16f363f103c80d7bbc8ad3c6867e0822bbc6000be91a4689755c7df40221c1456171e08201527f2b1cbb3e521edf5a622d82762a44a5e63f1e50b332d71154a4a7958d6011deff61720082015281600160206170a084016101806170a0860160085afa6170a093909301516001149214161691505092915050565b604051806172000160405280610390906020820280368337509192915050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715615433576154336153f4565b604052919050565b600082601f83011261544c57600080fd5b813567ffffffffffffffff811115615466576154666153f4565b615479601f8201601f191660200161540a565b81815284602083860101111561548e57600080fd5b816020850160208301376000918101602001919091529392505050565b600080604083850312156154be57600080fd5b823567ffffffffffffffff808211156154d657600080fd5b818501915085601f8301126154ea57600080fd5b81356020828211156154fe576154fe6153f4565b8160051b61550d82820161540a565b928352848101820192828101908a85111561552757600080fd5b958301955b848710156155455786358252958301959083019061552c565b975050508601359250508082111561555c57600080fd5b506155698582860161543b565b915050925092905056fe30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4730644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001a26469706673582212200887bb7fb7011a424d0cab95c712805d0f3bb55a90eb7817a154209e094c8eb864736f6c63430008120033","linkReferences":{},"deployedLinkReferences":{}} \ No newline at end of file +{"_format":"hh-sol-artifact-1","contractName":"Verifier","sourceName":"src/InclusionVerifier.sol","abi":[{"inputs":[{"internalType":"uint256[]","name":"pubInputs","type":"uint256[]"},{"internalType":"bytes","name":"proof","type":"bytes"}],"name":"verify","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"bytecode":"0x608060405234801561001057600080fd5b506155ea80620000216000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063bd205a9014610030575b600080fd5b61004361003e3660046154ac565b610057565b604051901515815260200160405180910390f35b600060016100636153d5565b6000805160206155958339815191526100d9565b600080516020615575833981519152808310818310169083800960008051602061557583398151915283840960008051602061557583398151915284820990506000805160206155758339815191526003820891909114919091169392505050565b8060208701510660208301528060408701510660408301528060608701510660608301528060808701510660808301527f17afb5973c405d2d6ef7a1bbbdc35209ce9098f7618703ae04a9338beaebdc97600083015260208501518060a084015260408601518060c0850152846101508284610077565b169450505060608501518060e0840152608086015180610100850152846101778284610077565b169450505060a08501518061012084015260c0860151806101408501528461019f8284610077565b16945050506101606000830120610160830152610160820151818106610180840152806101a08401525060e0850151806101c0840152610100860151806101e0850152846101ed8284610077565b16945050506101208501518061020084015261014086015180610220850152846102178284610077565b60a06101a0870120610240870181905285810661026088015261028087015216945060019150506102a083015360216102808301206102a083018190528181066102c08401526102e0830152610160850151610300830181905261018086015161032084018190528461028a8284610077565b16945050506101a0850151806103408401526101c086015180610360850152846102b48284610077565b16945050506101e085015180610380840152610200860151806103a0850152846102de8284610077565b1694505050610220850151806103c0840152610240860151806103e0850152846103088284610077565b16945050506101206102e083012061040083015261040082015181810661042084015280610440840152506102608501518061046084015261028086015180610480850152846103588284610077565b16945050506102a0850151806104a08401526102c0860151806104c0850152846103828284610077565b16945050506102e0850151806104e084015261030086015180610500850152846103ac8284610077565b16945050506103208501518061052084015261034086015180610540850152846103d68284610077565b16945050506103608501518061056084015261038086015180610580850152846104008284610077565b16945050506101606104408301206105a08301526105a08201518181066105c0840152806105e084015250806103a086015106610600830152806103c086015106610620830152806103e0860151066106408301528061040086015106610660830152806104208601510661068083015280610440860151066106a083015280610460860151066106c083015280610480860151066106e0830152806104a086015106610700830152806104c086015106610720830152806104e0860151066107408301528061050086015106610760830152806105208601510661078083015280610540860151066107a083015280610560860151066107c083015280610580860151066107e0830152806105a086015106610800830152806105c086015106610820830152806105e0860151066108408301528061060086015106610860830152806106208601510661088083015280610640860151066108a083015280610660860151066108c083015280610680860151066108e0830152806106a086015106610900830152806106c086015106610920830152806106e0860151066109408301528061070086015106610960830152806107208601510661098083015280610740860151066109a083015280610760860151066109c083015280610780860151066109e0830152806107a086015106610a00830152806107c086015106610a20830152806107e086015106610a408301526104806105e0830120610a60830152610a60820151818106610a8084015280610aa0840152506001610ac08301536021610aa0830120610ac08301819052818106610ae0840152610b00830152610800850151610b208301819052610820860151610b408401819052846106898284610077565b16945050506060610b00830120610b60830152610b60820151818106610b8084015280610ba08401525061084085015180610bc084015261086086015180610be0850152846106d88284610077565b1694505050806105c08301516105c084015109610c00830181905281908009610c20830181905281908009610c40830181905281908009610c60830181905281908009610c80830181905281908009610ca0830181905281908009610cc0830181905281908009610ce0830181905281908009610d00830181905281908009610d20830181905281908009610d40830152807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000000610d4084015108610d60830152807f305e41e912d579f5b3193badcab128321c8ee1cb70aa396331b979553d820001610d6084015109610d80830152807f22b55603586d5fc42c6c14c2fc27a028c207da8b2c71cb33d549fa4a2be5d302610d8084015109610da0830152807f0daef86f88c440658be430f38559b834662c0dbd4d47a55d6e97fb49c41a2cff6105c084015108610dc0830152807f2498c2d3affa1baaf6419dbccb6a054bb87359c02eade5aeacd86c84757b9051610d8084015109610de0830152807f0bcb8b9f3137847ec20ea7f9b61753116fc08e884b0b8ae29709890f7a846fb06105c084015108610e00830152807f096b9f8b8598b7c387fb69abf236b0d5e04e24d275ee98244443eda5d3bc4035610d8084015109610e20830152807f26f8aee75b98e8663054dc0a8f4aa78747e5c37603cad86cff9e07ee1c43bfcc6105c084015108610e40830152807f28771071ab1633014eae27cfc16d5ebe08a8fe2fc9e85044e4a45f82c14cd825610d8084015109610e60830152807f07ed3e01361b6d2869a21de6c013f99f1f8aea18afd1204c5f3d96112eb327dc6105c084015108610e80830152807f0ae3c95fc03c0a5f2de8a8f46c03ccdfdfed2bb98c9e4ae0b10b15eda4e3b1e3610d8084015109610ea0830152807f2580851320f595ca8a679cc2157d8b7d4846bc8eed1b25b092d6dfa64b1c4e1e6105c084015108610ec0830152807f2afd4e77273f1cb3434a4a667929058c156b21573c3f1efc882e708597d7161a610d8084015109610ee0830152807f0566fffbb9f283767505fb50085852d112c8c6f13d7a5194bbb3850e5828e9e76105c084015108610f00830152806001610d8084015109610f20830152807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000006105c084015108610f40830152807f14c60185e75885d674db4b3f7d4a5694fa6c01aa0f53557b060bc04a4172705f610d8084015109610f60830152807f1b9e4cecf9d91a534374fa77043701c82dc7e69e6a661b163dd63549ae8d8fa26105c084015108610f80830152807f2ad9021ed07c42ab19f77c5cf2cbd2deb135ea330f1b1573bd08d99309c4bb7d610d8084015109610fa0830152807f058b4c5410b55d7e9e58c9598eb5857e76fdfe156a9e5b1d86d91c00e63b44846105c084015108610fc0830152807f1908597d2fc3bc1da312efa344e0fc8a7079300238f2ee35774f117e66fd4467610d8084015109610fe0830152807f175bf4f5b16de40c153d56133ca05bd2b7bab84640c6825bcc92e4158902bb9a6105c084015108611000830152610dc08201518181610e00850151099050806110208401528181610e40850151099050806110408401528181610e80850151099050806110608401528181610ec0850151099050806110808401528181610f00850151099050806110a08401528181610f40850151099050806110c08401528181610f80850151099050806110e08401528181610fc0850151099050806111008401528181611000850151099050806111208401528181610d608501510990508061114084015250602061118083015260206111a083015260206111c08301526111408201516111e08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593efffffff6112008301526000805160206155958339815191526112208301528260016020611160850160c0611180870160055afa141692506111608201516000610d608401519050828261112086015109610d608501528282820991506110008401519050828261110086015109611000850152828282099150610fc0840151905082826110e086015109610fc0850152828282099150610f80840151905082826110c086015109610f80850152828282099150610f40840151905082826110a086015109610f40850152828282099150610f008401519050828261108086015109610f00850152828282099150610ec08401519050828261106086015109610ec0850152828282099150610e808401519050828261104086015109610e80850152828282099150610e408401519050828261102086015109610e40850152828282099150610e0084015190508282610dc086015109610e0085015282828209610dc08501819052610da08501518493509091500961124083015280610e00830151610de08401510961126083015280610e40830151610e208401510961128083015280610e80830151610e60840151096112a083015280610ec0830151610ea0840151096112c083015280610f00830151610ee0840151096112e083015280610f40830151610f208401510961130083015280610f80830151610f608401510961132083015280610fc0830151610fa08401510961134083015280611000830151610fe084015109611360830152806020830151611300840151098181836040860151611320870151090890508181836060860151611340870151090890508181836080860151611360870151090861138084015250610720820151610600830151829190086113a08301819052819080096113c08301819052819080096113e0830152806113e08301516113a084015109611400830152807f066f6f85d6f68a85ec10345351a23a3aaf07f38af8c952a7bceca70bd2af7ad561140084015109611420830152806107408301516106208401510861144083018190528190800961146083018190528190800961148083015280611480830151611440840151096114a0830152807f2b9d4b4110c9ae997782e1509b1d0fdb20a7c02bbd8bea7305462b9f8125b1e86114a0840151096114c0830152806114c0830151611420840151086114e08301528061064083015182036114e08401510861150083018190526107c08301518291096115208301528061152083015161042084015109611540830152807f0cc57cdbb08507d62bf67a4493cc262fb6c09d557013fff1f573f431221f8ff961140084015109611560830152807f1274e649a32ed355a31a6ed69724e1adade857e86eb5c3a121bcd147943203c86114a08401510961158083015280611580830151611560840151086115a08301528061066083015182036115a0840151086115c083018190526107c08301518291096115e0830152806115e08301516115408401510861160083015280611600830151610420840151096116208301528061068083015182036114008401510861164083018190526107e0830151829109611660830152806116608301516116208401510861168083015280611680830151610420840151096116a0830152807f066f6f85d6f68a85ec10345351a23a3aaf07f38af8c952a7bceca70bd2af7ad5610680840151096116c0830152807f2b9d4b4110c9ae997782e1509b1d0fdb20a7c02bbd8bea7305462b9f8125b1e8611440840151096116e0830152806116e08301516116c08401510861170083018190526106e08301518291086117208301819052819080096117408301819052819080096117608301528061176083015161172084015109611780830152807f13abec390ada7f4370819ab1c7846f210554569d9b29d1ea8dbebd0fa8c53e66610640840151096117a0830152807f1eb9e1dc19a33a624c9862a1d97d1510bd521ead5dfe0345aaf6185b1a1e60fe610660840151096117c0830152806117c08301516117a0840151086117e0830152806117e083015182036117808401510861180083018190526107e0830151829109611820830152806118208301516116a0840151086118408301528061184083015161042084015109611860830152807f0cc57cdbb08507d62bf67a4493cc262fb6c09d557013fff1f573f431221f8ff961068084015109611880830152807f1274e649a32ed355a31a6ed69724e1adade857e86eb5c3a121bcd147943203c8611440840151096118a0830152806118a0830151611880840151086118c083018190526107008301518291086118e0830152807f0fc1c9394db89bb2601abc49fdad4f038ce5169030a2ad69763f7875036bcb0261064084015109611900830152807f16a9e98c493a902b9502054edc03e7b22b7eac34345961bc8abced6bd147c8be6106608401510961192083015280611920830151611900840151086119408301528061194083015182036118e08401510861196083018190526107e083015182910961198083015280611980830151611860840151086119a0830152806119a0830151610420840151096119c0830152806107a083015182036001086119e083018190526107a0830151829109611a00830152806107a08301518203600208611a208301819052611a00830151829109611a40830152806107a08301518203600408611a608301819052611a40830151829109611a80830152806106008301516106c084015108611aa0830152806106408301518203611aa084015108611ac08301819052611a80830151829109611ae083015280611ae08301516119c084015108611b0083015280611b0083015161042084015109611b208301528061066083015182036106a084015108611b408301819052611a80830151829109611b6083015280611b60830151611b2084015108611b8083015280611b8083015161042084015109611ba08301528061080083015161150084015109611bc083015280611bc0830151611ba084015108611be083015280611be083015161042084015109611c00830152806108008301516115c084015109611c2083015280611c20830151611c0084015108611c4083015280611c4083015161042084015109611c608301528061082083015161164084015109611c8083015280611c80830151611c6084015108611ca083015280611ca083015161042084015109611cc08301528061082083015161180084015109611ce083015280611ce0830151611cc084015108611d0083015280611d0083015161042084015109611d208301528061082083015161196084015109611d4083015280611d40830151611d2084015108611d6083015280611d6083015161042084015109611d80830152806107a08301518203600308611da08301819052611a40830151829109611dc083015280611dc0830151611ac084015109611de083015280611de0830151611d8084015108611e0083015280611e0083015161042084015109611e2083015280611dc0830151611b4084015109611e4083015280611e40830151611e2084015108611e6083015280611e6083015161042084015109611e80830152806107a0830151611a2084015109611ea083015280611ea0830151611da084015109611ec083015280611ec0830151611a6084015109611ee083015280611ee083015161068084015109611f00830152806106808301518203600108611f208301819052611f00830151829109611f4083015280611f40830151611e8084015108611f6083015280611f6083015161042084015109611f8083015280610680830151600209611fa083015280610600830151820361062084015108611fc08301819052611fa0830151829109611fe083015280610600830151820361064084015108612000830152806120008301518203611fe08401510861202083015280610660830151820361062084015108612040830152806120408301518203612020840151086120608301819052611ee083015182910961208083015280612080830151611f80840151086120a0830152806120a0830151610420840151096120c083015280611a00830151611da0840151096120e0830152806120e0830151611a60840151096121008301528061062083015161060084015108612120830152806106808301518203612120840151086121408301819052612100830151829109612160830152806121608301516120c08401510861218083015280612180830151610420840151096121a083018190526121608301518291086121c0830152806121c0830151610420840151096121e08301528061092083015182036001086122008301819052611300830151829109612220830152806122208301516121e084015108612240830152806122408301516104208401510961226083015261098082015181908009612280830152806109808301518203612280840151086122a083018190526112408301518291096122c0830152806122c0830151612260840151086122e0830152806122e083015161042084015109612300830152806109608301518203610980840151086123208301819052611300830151829109612340830152806123408301516123008401510861236083015280612360830151610420840151096123808301528061124083015182036001086123a083015280611280830151611260840151086123c083018190526112a08301518291086123e083018190526112c083015182910861240083018190526112e08301518291086124208301528061242083015182036123a0840151086124408301528061026083015161086084015109612460830152806124608301516106e08401510861248083018190526102c08301518291086124a083015280610260830151610880840151096124c0830152806124c0830151610600840151086124e083018190526102c083015182910861250083018190526124a0830151829109612520830152806102608301516108a084015109612540830152806125408301516106208401510861256083018190526102c083015182910861258083018190526125208301518291096125a0830152806102608301516108c0840151096125c0830152806125c0830151610700840151086125e083018190526102c083015182910861260083018190526125a0830151829109612620830181905261094083015182910961264083015280610260830151600109612660830152806126608301516105c084015109612680830152806126808301516106e0840151086126a083018190526102c08301518291086126c0830152806102608301517f09226b6e22c6f0ca64ec26aad4c86e715b5f898e5e963f25870e56bbe533e9a2096126e0830152806126e08301516105c084015109612700830152806127008301516106008401510861272083018190526102c083015182910861274083018190526126c0830151829109612760830152806102608301517f13b360d4e82fe915fed16081038f98c211427b87a281bd733c277dbadf10372b09612780830152806127808301516105c0840151096127a0830152806127a0830151610620840151086127c083018190526102c08301518291086127e08301819052612760830151829109612800830152806102608301517f18afdf23e9bd9302673fc1e076a492d4d65bd18ebc4d854ed189139bab313e5209612820830152806128208301516105c084015109612840830152806128408301516107008401510861286083018190526102c083015182910861288083018190526128008301518291096128a083018190526109208301518291096128c0830152806128c08301518203612640840151086128e0830181905261244083015182910961290083015280612900830151612380840151086129208301528061292083015161042084015109612940830152806102608301516108e084015109612960830152806129608301516106808401510861298083018190526102c08301518291086129a083015280610260830151610900840151096129c0830152806129c0830151611380840151086129e083018190526102c0830151829108612a0083018190526129a0830151829109612a2083018190526109a0830151829109612a40830152806102608301517ea136ba13afa6c83eb7b82fb370e228e74155e48fb8f1c1cfc33fb0da8afb4209612a6083015280612a608301516105c084015109612a8083015280612a8083015161068084015108612aa083018190526102c0830151829108612ac0830152806102608301517f2eb9750dce545f17d492058dd201a1251ff3d9077864583d44eaf9be9008699d09612ae083015280612ae08301516105c084015109612b0083015280612b0083015161138084015108612b2083018190526102c0830151829108612b408301819052612ac0830151829109612b608301819052610980830151829109612b8083015280612b808301518203612a4084015108612ba08301819052612440830151829109612bc083015280612bc083015161294084015108612be083015280612be083015161042084015109612c00830152806109c08301518203600108612c208301819052611300830151829109612c4083015280612c40830151612c0084015108612c6083015280612c6083015161042084015109612c808301526109c082015181908009612ca0830152806109c08301518203612ca084015108612cc08301819052611240830151829109612ce083015280612ce0830151612c8084015108612d0083015280612d0083015161042084015109612d2083015280610260830151610a0084015108612d4083018190526109e0830151829109612d60830152806102c0830151610a4084015108612d808301819052612d60830151829109612da08301528061064083015161010009612dc083015280612dc0830151820361060084015108612de08301819052610780830151829109612e008301819052610260830151829108612e2083018190526109c0830151829109612e40830152806102c083015161076084015108612e608301819052612e40830151829109612e8083015280612e808301518203612da084015108612ea08301819052612440830151829109612ec083015280612ec0830151612d2084015108612ee083015280612ee083015161042084015109612f0083015280610a408301518203610a0084015108612f208301819052611300830151829109612f4083015280612f40830151612f0084015108612f6083015280612f6083015161042084015109612f8083015280612440830151612f2084015109612fa083015280610a208301518203610a0084015108612fc08301819052612fa0830151829109612fe083015280612fe0830151612f8084015108613000830152610d40820151819080096130208301819052610d408301518291096130408301819052610d408301518291096130608301819052610d4083015182910961308083015280610d408301516001096130a0830152806130208301516001096130c0830152806130408301516001096130e08301528061306083015160010961310083015280610d6083015161300084015109613120830152806105c0830151610c00840151096131408301528060016105c084015109613160830152806131608301518203610b8084015108613180830152807f14c60185e75885d674db4b3f7d4a5694fa6c01aa0f53557b060bc04a4172705f6105c0840151096131a0830152806131a08301518203610b80840151086131c0830152807f22b55603586d5fc42c6c14c2fc27a028c207da8b2c71cb33d549fa4a2be5d3026105c0840151096131e0830152806131e08301518203610b8084015108613200830152807f2afd4e77273f1cb3434a4a667929058c156b21573c3f1efc882e708597d7161a6105c084015109613220830152806132208301518203610b808401510861324083015280817f21054ce8b3cb9dc9b87af5c70c8f54994090ad8fa7e06caaf989ba5806b6798b610c0085015109610b8084015109818183847f0f5f018a2d66025fffd54fef74f203c3e7a33ab8d1d903e64a583b3be9498676610c00880151096105c087015109089050806132608401525080817f10ac009d2f31395e301635cd6d292978a4012197c24d6e63fb49943a70296136610c0085015109610b8084015109818183847f2696aa2788110c63ebbfd7f92b352ce93b28bbdae57b7cb94bc5885ee439e774610c00880151096105c087015109089050806132808401525080817f2510cae1618713ac17c9ef83f1a67645ed21f454d96bf1f072ca5b463e7f0c28610c0085015109610b8084015109818183847f0d6a07653c64f4112284cb8b23bf73adecaf4ee0fef51998549526f07b6defd7610c00880151096105c087015109086132a08401525061318082015181906001096132c083018190526131c08301518291096132e08301819052613240830151829109613300830152806001610b80840151098181837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000006105c087015109089050806133208401525080817f1d81b9bd5165d63a0d4a8370d37966eb243365d36ca235911564a783f8234cf2610c0085015109610b8084015109818183847f12e294b58fcbc9efab05c245ae07f172040082750d173b002e7d4e0ff7dcb30f610c00880151096105c087015109089050806133408401525080817f142f93c8919700eddb46a823a63f1726c05e6953fd8ba57ddf6ea70e7ebc8dcf610c0085015109610b8084015109818183847f2707d3cc5788c2cfc0ee9e5f5638da3b90cb6d8b97224a4521073ec9f10826fb610c00880151096105c087015109089050806133608401525080817f13d3d4db83b42c4d48afa6b5c9cbe3f49703d0caf1fdc301b0d4d3743ab60833610c0085015109610b8084015109818183847f223ed99d38075819043fa85ed3c54f3bfb5d62312139562ca82d9903b1b52e27610c00880151096105c08701510908613380840152506132008201516132e0830151829190096133a083015280817f1b9e4cecf9d91a534374fa77043701c82dc7e69e6a661b163dd63549ae8d8fa36105c085015109610b8084015109818183847f14c60185e75885d674db4b3f7d4a5694fa6c01aa0f53557b060bc04a4172705e6105c0880151096105c087015109089050806133c08401525080817f14c60185e75885d674db4b3f7d4a5694fa6c01aa0f53557b060bc04a4172705e6105c085015109610b8084015109818183847f1a514dd9f80de355133414990bffdc137169ffbf79f1b0988ce4dc4b27adb4e36105c0880151096105c087015109089050806133e08401525080817f0566fffbb9f283767505fb50085852d112c8c6f13d7a5194bbb3850e5828e9e86105c085015109610b8084015109818183847f2afd4e77273f1cb3434a4a667929058c156b21573c3f1efc882e708597d716196105c0880151096105c087015109089050806134008401525080817f2afd4e77273f1cb3434a4a667929058c156b21573c3f1efc882e708597d716196105c085015109610b8084015109818183847f20198517670312541561a1720d2538ac357df59dafa0d41bd7235a97f2f364376105c0880151096105c08701510908613420840152506132408201516132c08301518291900961344083015261326082015181816132808501510990508061346084015281816132a0850151099050806134808401528181613320850151099050806134a084015281816132c0850151099050806134c08401528181613340850151099050806134e084015281816133608501510990508061350084015281816133808501510990508061352084015281816133a08501510990508061354084015281816133c08501510990508061356084015281816133e08501510990508061358084015281816132e0850151099050806135a08401528181613400850151099050806135c08401528181613420850151099050806135e0840152818161344085015109905080613600840152506020613640830152602061366083015260206136808301526136008201516136a08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593efffffff6136c08301526000805160206155958339815191526136e08301528260016020613620850160c0613640870160055afa141692506136208201516000613440840151905082826135e086015109613440850152828282099150613420840151905082826135c086015109613420850152828282099150613400840151905082826135a0860151096134008501528282820991506132e084015190508282613580860151096132e08501528282820991506133e084015190508282613560860151096133e08501528282820991506133c084015190508282613540860151096133c08501528282820991506133a084015190508282613520860151096133a08501528282820991506133808401519050828261350086015109613380850152828282099150613360840151905082826134e086015109613360850152828282099150613340840151905082826134c0860151096133408501528282820991506132c0840151905082826134a0860151096132c085015282828209915061332084015190508282613480860151096133208501528282820991506132a084015190508282613460860151096132a08501528282820991506132808401519050828261326086015109613280850152828282096132608501819052613280850151909250839150829008905081816132a085015108613700840152506132c0820151613300830151829190096137208301526133208201518061374084015250806133a0830151613300840151096137608301526133408201518181613360850151089050818161338085015108613780840152506132e0820151613300830151829190096137a08301526133c082015181816133e0850151086137c084015250613440820151613300830151829190096137e083015261340082015181816134208501510861380084015250613700820151613740830151829082900990508061382084015281816137808501510990508061384084015281816137c0850151099050806138608401528181613800850151099050806138808401525060206138c083015260206138e083015260206139008301526138808201516139208301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593efffffff61394083015260008051602061559583398151915261396083015282600160206138a0850160c06138c0870160055afa141692506138a0820151600061380084015190508282613860860151096138008501528282820991506137c084015190508282613840860151096137c0850152828282099150613780840151905082826138208601510961378085015282828209915061374084015190508282613700860151096137408501528282820961370085015250506137408201516137208301518291900961398083015280613780830151613760840151096139a0830152806137c08301516137a0840151096139c0830152806138008301516137e0840151096139e0830152610a8082015181908009613a008301819052610a80830151829109613a208301819052610a80830151829109613a408301819052610a80830151829109613a608301819052610a80830151829109613a808301819052610a80830151829109613aa08301819052610a80830151829109613ac08301819052610a80830151829109613ae08301819052610a80830151829109613b008301819052610a80830151829109613b208301819052610a80830151829109613b408301819052610a80830151829109613b608301819052610a80830151829109613b808301819052610a80830151829109613ba08301819052610a80830151829109613bc08301819052610a80830151829109613be08301819052610a80830151829109613c008301819052610a80830151829109613c208301819052610a80830151829109613c408301819052610a80830151829109613c60830152610ae082015181908009613c808301819052610ae0830151829109613ca08301819052610ae0830151829109613cc08301819052610ae0830151829109613ce08301528061326083015161060084015109818183613280860151610640870151090890508181836132a08601516106c08701510908613d0084018190526137008401518392509009613d20830152806001613d20840151830309613d408301528061326083015161062084015109818183613280860151610660870151090890508181836132a08601516106a08701510908613d6084018190526137008401518392509009613d808301819052610a808301518291820309613da083015280610a80830151600109613dc083015280613da0830151613d4084015108613de0830152806001613de084015109613e00830152806001613dc084015109613e2083015280613720830151600109613e408301528061332083015161068084015109613e608301819052613980830151829109613e80830152806001613e80840151830309613ea0830152806001613e4084015109613ec083015280613320830151610a4084015109613ee08301819052613980830151829109613f008301819052610a808301518291820309613f2083015280610a80830151613e4084015109613f4083015280613f20830151613ea084015108613f60830152806133208301516106e084015109613f808301819052613980830151829109613fa08301819052613a008301518291820309613fc083015280613a00830151613e4084015109613fe083015280613fc0830151613f6084015108614000830152806133208301516107008401510961402083018190526139808301518291096140408301819052613a20830151829182030961406083015280613a20830151613e408401510961408083015280614060830151614000840151086140a083015280613320830151610720840151096140c083018190526139808301518291096140e08301819052613a40830151829182030961410083015280613a40830151613e4084015109614120830152806141008301516140a084015108614140830152806133208301516107408401510961416083018190526139808301518291096141808301819052613a6083015182918203096141a083015280613a60830151613e40840151096141c0830152806141a0830151614140840151086141e0830152806133208301516107608401510961420083018190526139808301518291096142208301819052613a80830151829182030961424083015280613a80830151613e4084015109614260830152806142408301516141e08401510861428083015280613320830151610780840151096142a083018190526139808301518291096142c08301819052613aa083015182918203096142e083015280613aa0830151613e4084015109614300830152806142e083015161428084015108614320830152806133208301516107a08401510961434083018190526139808301518291096143608301819052613ac0830151829182030961438083015280613ac0830151613e40840151096143a083015280614380830151614320840151086143c0830152806133208301516107c0840151096143e083018190526139808301518291096144008301819052613ae0830151829182030961442083015280613ae0830151613e4084015109614440830152806144208301516143c084015108614460830152806133208301516107e08401510961448083018190526139808301518291096144a08301819052613b0083015182918203096144c083015280613b00830151613e40840151096144e0830152806144c083015161446084015108614500830152806133208301516108008401510961452083018190526139808301518291096145408301819052613b20830151829182030961456083015280613b20830151613e408401510961458083015280614560830151614500840151086145a083015280613320830151610820840151096145c083018190526139808301518291096145e08301819052613b40830151829182030961460083015280613b40830151613e4084015109614620830152806146008301516145a084015108614640830152806133208301516108608401510961466083018190526139808301518291096146808301819052613b6083015182918203096146a083015280613b60830151613e40840151096146c0830152806146a0830151614640840151086146e0830152806133208301516108808401510961470083018190526139808301518291096147208301819052613b80830151829182030961474083015280613b80830151613e4084015109614760830152806147408301516146e084015108614780830152806133208301516108a0840151096147a083018190526139808301518291096147c08301819052613ba083015182918203096147e083015280613ba0830151613e4084015109614800830152806147e083015161478084015108614820830152806133208301516108c08401510961484083018190526139808301518291096148608301819052613bc0830151829182030961488083015280613bc0830151613e40840151096148a083015280614880830151614820840151086148c0830152806133208301516108e0840151096148e083018190526139808301518291096149008301819052613be0830151829182030961492083015280613be0830151613e4084015109614940830152806149208301516148c084015108614960830152806133208301516109008401510961498083018190526139808301518291096149a08301819052613c0083015182918203096149c083015280613c00830151613e40840151096149e0830152806149c083015161496084015108614a00830152806137208301516130a084015109614a20830152806137208301516130c084015109614a40830152806137208301516130e084015109614a608301528061372083015161310084015109614a808301528061332083015161312084015109614aa08301819052613980830151829109614ac08301819052613c208301518291820309614ae083015280613c20830151613e4084015109614b0083015280613c20830151614a2084015109614b2083015280613c20830151614a4084015109614b4083015280613c20830151614a6084015109614b6083015280613c20830151614a8084015109614b8083015280614ae0830151614a0084015108614ba08301528061332083015161084084015109614bc08301819052613980830151829109614be08301819052613c408301518291820309614c0083015280613c40830151613e4084015109614c2083015280614c00830151614ba084015108614c408301819052610ae0830151829109614c6083015280610ae0830151613ec084015109614c8083015280610ae0830151613f4084015109614ca083015280610ae0830151613fe084015109614cc083015280610ae083015161408084015109614ce083015280610ae083015161412084015109614d0083015280610ae08301516141c084015109614d2083015280610ae083015161426084015109614d4083015280610ae083015161430084015109614d6083015280610ae08301516143a084015109614d8083015280610ae083015161444084015109614da083015280610ae08301516144e084015109614dc083015280610ae083015161458084015109614de083015280610ae083015161462084015109614e0083015280610ae08301516146c084015109614e2083015280610ae083015161476084015109614e4083015280610ae083015161480084015109614e6083015280610ae08301516148a084015109614e8083015280610ae083015161494084015109614ea083015280610ae08301516149e084015109614ec083015280610ae0830151614b0084015109614ee083015280610ae0830151614b2084015109614f0083015280610ae0830151614b4084015109614f2083015280610ae0830151614b6084015109614f4083015280610ae0830151614b8084015109614f6083015280610ae0830151614c2084015109614f8083015280614c60830151613e0084015108614fa083015280613760830151600109614fc08301528061334083015161092084015109818183613360860151610940870151090890508181836133808601516109608701510908614fe084018190526139a08401518392509009615000830152806001615000840151830309615020830152806001614fc08401510961504083015280613c808301516150208401510961506083015280613c808301516150408401510961508083015280615060830151614fa0840151086150a0830152806137a08301516001096150c0830152806133c0830151610980840151098181836133e08601516109a087015109086150e084018190526139c084015183925090096151008301528060016151008401518303096151208301528060016150c084015109615140830152806133c08301516109c0840151098181836133e08601516109e0870151090861516084018190526139c084015183925090096151808301819052610a8083015182918203096151a083015280610a808301516150c0840151096151c0830152806151a0830151615120840151086151e08301819052613ca083015182910961520083015280613ca08301516151408401510961522083015280613ca08301516151c084015109615240830152806152008301516150a084015108615260830152806137e083015160010961528083015280613400830151610a0084015109818183613420860151610a2087015109086152a084018190526139e084015183925090096152c08301528060016152c08401518303096152e08301528060016152808401510961530083015280613cc08301516152e08401510961532083015280613cc08301516153008401510961534083015280615320830151615260840151086153608301528061330083015160010961538083015280610b808301516001096153a083015260016153c0830181815260026153e085015261536084015161540085015284919060409060608160075afa141692506153c08201516154208301526153e082015161544083015260a082015161546083015260c0820151615480830152826001604061542085016080615420870160065afa1416925060e08201516154a08301526101008201516154c0830152613e208201516154e083015282600160406154a0850160606154a0870160075afa141692506154208201516155008301526154408201516155208301526154a08201516155408301526154c0820151615560830152826001604061550085016080615500870160065afa141692506101208201516155808301526101408201516155a0830152614c808201516155c0830152826001604061558085016060615580870160075afa141692506155008201516155e08301526155208201516156008301526155808201516156208301526155a082015161564083015282600160406155e0850160806155e0870160065afa14169250610200820151615660830152610220820151615680830152614ca08201516156a0830152826001604061566085016060615660870160075afa141692506155e08201516156c08301526156008201516156e083015261566082015161570083015261568082015161572083015282600160406156c0850160806156c0870160065afa141692507f046611b44bb4f4cd8fcf6f82fed641d34961b88a6012df5e0f44d4f40248d57b6157408301527f25b84353a92c37bb156457e31b9133dc81245e1f3774b898f41cf59a7b0adf57615760830152614cc0820151615780830152826001604061574085016060615740870160075afa141692506156c08201516157a08301526156e08201516157c08301526157408201516157e083015261576082015161580083015282600160406157a0850160806157a0870160065afa141692507f259da9f643187930ce1299a3f700a93f17cf3129bffe184a6de1cf19f0b91f7e6158208301527f29fcbc05cd2c0152b3eb21e8fd01a00bc79780f21281598873fb955dba235f7e615840830152614ce0820151615860830152826001604061582085016060615820870160075afa141692506157a08201516158808301526157c08201516158a08301526158208201516158c08301526158408201516158e0830152826001604061588085016080615880870160065afa141692507f2b99cb49ca685626a08c009ea442fc895a2f86cca1f29f18d4b7ec9ece937aa26159008301527f20a45cae33f3917205b76aeb87e409350840664058839b1db76f8761db50fac8615920830152614d00820151615940830152826001604061590085016060615900870160075afa141692506158808201516159608301526158a08201516159808301526159008201516159a08301526159208201516159c0830152826001604061596085016080615960870160065afa141692507f25a265a57942223657b3316c913bffe8db0efedbed9ac878308e1d63d4df61d86159e08301527f0d2f79604094b53fd56a955d2574e241ad67498ab320f2bb764841f5c903bff9615a00830152614d20820151615a2083015282600160406159e0850160606159e0870160075afa14169250615960820151615a40830152615980820151615a608301526159e0820151615a80830152615a00820151615aa08301528260016040615a4085016080615a40870160065afa141692507f22e1cdbfffcfcf4f18cf4342edf1fb26c3b6e52ace3d5fadcf5cc2614333baa4615ac08301527f0e28df72dcc69cc6442d72f693661997480a913ac353890efd63a873959727c0615ae0830152614d40820151615b008301528260016040615ac085016060615ac0870160075afa14169250615a40820151615b20830152615a60820151615b40830152615ac0820151615b60830152615ae0820151615b808301528260016040615b2085016080615b20870160065afa141692507f0160a474a2c8de56950bbe25d6f09002a91f2cc20fbdb15e8413f1176e7f1865615ba08301527f1d0f5797eaaea89e5119e4260db563605a84d004b8efd02c51b960bfecf20e90615bc0830152614d60820151615be08301528260016040615ba085016060615ba0870160075afa14169250615b20820151615c00830152615b40820151615c20830152615ba0820151615c40830152615bc0820151615c608301528260016040615c0085016080615c00870160065afa141692507f02b619a2a245b370b3319e21e0be467256209338cf9546447b875a2779e010d4615c808301527f07d7f03df06345ba2df20bb867841f60ebd25daab5aafa13ddc1413116996802615ca0830152614d80820151615cc08301528260016040615c8085016060615c80870160075afa14169250615c00820151615ce0830152615c20820151615d00830152615c80820151615d20830152615ca0820151615d408301528260016040615ce085016080615ce0870160065afa141692507f203b21a648fbfb96459640bbc5b41852dd1efc1209c89b635ba638dcb929da6b615d608301527f04e7002f06f2091a44afcd311e93c22f46dd9f3207b5bcc34f0ca7652098f097615d80830152614da0820151615da08301528260016040615d6085016060615d60870160075afa14169250615ce0820151615dc0830152615d00820151615de0830152615d60820151615e00830152615d80820151615e208301528260016040615dc085016080615dc0870160065afa141692507f20ab7490b42f3f7b2b0bbe601a09d72ee93f924801d597f48cf2d443751d5f91615e408301527f2bca2f1762946a05fb1632550c6cb12c02d18d9bee5bdd4212ca7342888720fd615e60830152614dc0820151615e808301528260016040615e4085016060615e40870160075afa14169250615dc0820151615ea0830152615de0820151615ec0830152615e40820151615ee0830152615e60820151615f008301528260016040615ea085016080615ea0870160065afa141692507f13caf6fa687a546fd1eeb9e0d43a9f8fe9a3f05322f5edda1b95d50e83839851615f208301527f22e2768775e2d96fd8925c48a99df2b248cb3d893a15b9dca81660b79cc35f4a615f40830152614de0820151615f608301528260016040615f2085016060615f20870160075afa14169250615ea0820151615f80830152615ec0820151615fa0830152615f20820151615fc0830152615f40820151615fe08301528260016040615f8085016080615f80870160065afa141692507f19a074dc6d1a0f1e5589a55d9c4955cf867e2899dbfd46a11c27a84804b5b2396160008301527f26b112fb59a0b875833e52f951b3b010826b169f320d80597f1275544ae24897616020830152614e00820151616040830152826001604061600085016060616000870160075afa14169250615f80820151616060830152615fa08201516160808301526160008201516160a08301526160208201516160c0830152826001604061606085016080616060870160065afa141692507f1c6df6612866079dc2a52525842c8025502eb5a8913c560836c4bc7ab2dc334e6160e08301527f0d36fe2bf6d58291ed035a1f090904639502213a2449227d156ee3f8f6372e2c616100830152614e2082015161612083015282600160406160e0850160606160e0870160075afa141692506160608201516161408301526160808201516161608301526160e08201516161808301526161008201516161a0830152826001604061614085016080616140870160065afa141692507f01add1e14d0a1880ee8e837b20502713d06428d55d61fea8fea89a71648971fa6161c08301527f12c982466ea6dcfada3ad0e277fed44f770466650d4704906a4d34b6b8d8bed16161e0830152614e4082015161620083015282600160406161c0850160606161c0870160075afa141692506161408201516162208301526161608201516162408301526161c08201516162608301526161e0820151616280830152826001604061622085016080616220870160065afa141692507f2faee9fe4eb97b37abb4fdd1b604ed8acf55df0a370bcfe7f5615b7598989d7a6162a08301527f2269aff86c3fd35864f3e2cb39db623e0122a05b6b5f789ff57434e557a90c236162c0830152614e608201516162e083015282600160406162a0850160606162a0870160075afa141692506162208201516163008301526162408201516163208301526162a08201516163408301526162c0820151616360830152826001604061630085016080616300870160065afa141692507f0743ea40f14084db2673217283aa053f986896ee7c181f52118442e99c4529746163808301527f0203e3493a2594ece57d22cc75dd081ac68271ec7c758153cfd2152bfb5c19e36163a0830152614e808201516163c0830152826001604061638085016060616380870160075afa141692506163008201516163e08301526163208201516164008301526163808201516164208301526163a082015161644083015282600160406163e0850160806163e0870160065afa141692507f01b6921cc4c35a03d696e754bac06edba8187499252d98da7e7d40b844f242456164608301527f181dfa294889601a9cc57448d966b9cc60e7795ab336d2078dc43aeb888484fb616480830152614ea08201516164a0830152826001604061646085016060616460870160075afa141692506163e08201516164c08301526164008201516164e083015261646082015161650083015261648082015161652083015282600160406164c0850160806164c0870160065afa141692507f0f0dcdaa6fd2f36460376557f9d6b4b0985b085d2d8ffca7c6c408d8560d5d086165408301527f0bc4e7f7a927678093e4be2bfb543ab7d6267ee943e8ed13369a3b3c9ef23779616560830152614ec0820151616580830152826001604061654085016060616540870160075afa141692506164c08201516165a08301526164e08201516165c08301526165408201516165e083015261656082015161660083015282600160406165a0850160806165a0870160065afa14169250610460820151616620830152610480820151616640830152614ee0820151616660830152826001604061662085016060616620870160075afa141692506165a08201516166808301526165c08201516166a08301526166208201516166c08301526166408201516166e0830152826001604061668085016080616680870160065afa141692506104a08201516167008301526104c0820151616720830152614f00820151616740830152826001604061670085016060616700870160075afa141692506166808201516167608301526166a08201516167808301526167008201516167a08301526167208201516167c0830152826001604061676085016080616760870160065afa141692506104e08201516167e0830152610500820151616800830152614f2082015161682083015282600160406167e0850160606167e0870160075afa141692506167608201516168408301526167808201516168608301526167e08201516168808301526168008201516168a0830152826001604061684085016080616840870160065afa141692506105208201516168c08301526105408201516168e0830152614f4082015161690083015282600160406168c0850160606168c0870160075afa141692506168408201516169208301526168608201516169408301526168c08201516169608301526168e0820151616980830152826001604061692085016080616920870160065afa141692506105608201516169a08301526105808201516169c0830152614f608201516169e083015282600160406169a0850160606169a0870160075afa14169250616920820151616a00830152616940820151616a208301526169a0820151616a408301526169c0820151616a608301528260016040616a0085016080616a00870160065afa141692506103c0820151616a808301526103e0820151616aa0830152614f80820151616ac08301528260016040616a8085016060616a80870160075afa14169250616a00820151616ae0830152616a20820151616b00830152616a80820151616b20830152616aa0820151616b408301528260016040616ae085016080616ae0870160065afa14169250610300820151616b60830152610320820151616b80830152615080820151616ba08301528260016040616b6085016060616b60870160075afa14169250616ae0820151616bc0830152616b00820151616be0830152616b60820151616c00830152616b80820151616c208301528260016040616bc085016080616bc0870160065afa14169250610340820151616c40830152610360820151616c60830152615220820151616c808301528260016040616c4085016060616c40870160075afa14169250616bc0820151616ca0830152616be0820151616cc0830152616c40820151616ce0830152616c60820151616d008301528260016040616ca085016080616ca0870160065afa14169250610380820151616d208301526103a0820151616d40830152615240820151616d608301528260016040616d2085016060616d20870160075afa14169250616ca0820151616d80830152616cc0820151616da0830152616d20820151616dc0830152616d40820151616de08301528260016040616d8085016080616d80870160065afa141692506101c0820151616e008301526101e0820151616e20830152615340820151616e408301528260016040616e0085016060616e00870160075afa14169250616d80820151616e60830152616da0820151616e80830152616e00820151616ea0830152616e20820151616ec08301528260016040616e6085016080616e60870160065afa14169250610b20820151616ee0830152610b40820151616f008301526153808201518103616f20830152508160016040616ee084016060616ee0860160075afa14169150616e60810151616f40820152616e80810151616f60820152616ee0810151616f80820152616f00810151616fa08201528160016040616f4084016080616f40860160065afa14169150610bc0810151616fc0820152610be0810151616fe08201526153a08101516170008201528160016040616fc084016060616fc0860160075afa14169150616f40810151617020820152616f60810151617040820152616fc0810151617060820152616fe0810151617080820152816001604061702084016080617020860160065afa141691506170208101516170a08201526170408101516170c08201527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c26170e08201527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6171008201527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b6171208201527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa617140820152610bc0810151617160820152610be08101516171808201527f26186a2d65ee4d2f9c9a5b91f86597d35f192cd120caf7e935d8443d1938e23d6171a08201527f30441fd1b5d3370482c42152a8899027716989a6996c2535bc9f7fee8aaef79e6171c08201527f16f363f103c80d7bbc8ad3c6867e0822bbc6000be91a4689755c7df40221c1456171e08201527f2b1cbb3e521edf5a622d82762a44a5e63f1e50b332d71154a4a7958d6011deff61720082015281600160206170a084016101806170a0860160085afa6170a093909301516001149214161691505092915050565b604051806172000160405280610390906020820280368337509192915050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715615434576154346153f5565b604052919050565b600082601f83011261544d57600080fd5b813567ffffffffffffffff811115615467576154676153f5565b61547a601f8201601f191660200161540b565b81815284602083860101111561548f57600080fd5b816020850160208301376000918101602001919091529392505050565b600080604083850312156154bf57600080fd5b823567ffffffffffffffff808211156154d757600080fd5b818501915085601f8301126154eb57600080fd5b81356020828211156154ff576154ff6153f5565b8160051b61550e82820161540b565b928352848101820192828101908a85111561552857600080fd5b958301955b848710156155465786358252958301959083019061552d565b975050508601359250508082111561555d57600080fd5b5061556a8582860161543c565b915050925092905056fe30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4730644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001a2646970667358221220f964c2eff2c690734da252f9c4c5e8346ee57d4f780840e636f83cf215278f6764736f6c63430008120033","deployedBytecode":"0x608060405234801561001057600080fd5b506004361061002b5760003560e01c8063bd205a9014610030575b600080fd5b61004361003e3660046154ac565b610057565b604051901515815260200160405180910390f35b600060016100636153d5565b6000805160206155958339815191526100d9565b600080516020615575833981519152808310818310169083800960008051602061557583398151915283840960008051602061557583398151915284820990506000805160206155758339815191526003820891909114919091169392505050565b8060208701510660208301528060408701510660408301528060608701510660608301528060808701510660808301527f17afb5973c405d2d6ef7a1bbbdc35209ce9098f7618703ae04a9338beaebdc97600083015260208501518060a084015260408601518060c0850152846101508284610077565b169450505060608501518060e0840152608086015180610100850152846101778284610077565b169450505060a08501518061012084015260c0860151806101408501528461019f8284610077565b16945050506101606000830120610160830152610160820151818106610180840152806101a08401525060e0850151806101c0840152610100860151806101e0850152846101ed8284610077565b16945050506101208501518061020084015261014086015180610220850152846102178284610077565b60a06101a0870120610240870181905285810661026088015261028087015216945060019150506102a083015360216102808301206102a083018190528181066102c08401526102e0830152610160850151610300830181905261018086015161032084018190528461028a8284610077565b16945050506101a0850151806103408401526101c086015180610360850152846102b48284610077565b16945050506101e085015180610380840152610200860151806103a0850152846102de8284610077565b1694505050610220850151806103c0840152610240860151806103e0850152846103088284610077565b16945050506101206102e083012061040083015261040082015181810661042084015280610440840152506102608501518061046084015261028086015180610480850152846103588284610077565b16945050506102a0850151806104a08401526102c0860151806104c0850152846103828284610077565b16945050506102e0850151806104e084015261030086015180610500850152846103ac8284610077565b16945050506103208501518061052084015261034086015180610540850152846103d68284610077565b16945050506103608501518061056084015261038086015180610580850152846104008284610077565b16945050506101606104408301206105a08301526105a08201518181066105c0840152806105e084015250806103a086015106610600830152806103c086015106610620830152806103e0860151066106408301528061040086015106610660830152806104208601510661068083015280610440860151066106a083015280610460860151066106c083015280610480860151066106e0830152806104a086015106610700830152806104c086015106610720830152806104e0860151066107408301528061050086015106610760830152806105208601510661078083015280610540860151066107a083015280610560860151066107c083015280610580860151066107e0830152806105a086015106610800830152806105c086015106610820830152806105e0860151066108408301528061060086015106610860830152806106208601510661088083015280610640860151066108a083015280610660860151066108c083015280610680860151066108e0830152806106a086015106610900830152806106c086015106610920830152806106e0860151066109408301528061070086015106610960830152806107208601510661098083015280610740860151066109a083015280610760860151066109c083015280610780860151066109e0830152806107a086015106610a00830152806107c086015106610a20830152806107e086015106610a408301526104806105e0830120610a60830152610a60820151818106610a8084015280610aa0840152506001610ac08301536021610aa0830120610ac08301819052818106610ae0840152610b00830152610800850151610b208301819052610820860151610b408401819052846106898284610077565b16945050506060610b00830120610b60830152610b60820151818106610b8084015280610ba08401525061084085015180610bc084015261086086015180610be0850152846106d88284610077565b1694505050806105c08301516105c084015109610c00830181905281908009610c20830181905281908009610c40830181905281908009610c60830181905281908009610c80830181905281908009610ca0830181905281908009610cc0830181905281908009610ce0830181905281908009610d00830181905281908009610d20830181905281908009610d40830152807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000000610d4084015108610d60830152807f305e41e912d579f5b3193badcab128321c8ee1cb70aa396331b979553d820001610d6084015109610d80830152807f22b55603586d5fc42c6c14c2fc27a028c207da8b2c71cb33d549fa4a2be5d302610d8084015109610da0830152807f0daef86f88c440658be430f38559b834662c0dbd4d47a55d6e97fb49c41a2cff6105c084015108610dc0830152807f2498c2d3affa1baaf6419dbccb6a054bb87359c02eade5aeacd86c84757b9051610d8084015109610de0830152807f0bcb8b9f3137847ec20ea7f9b61753116fc08e884b0b8ae29709890f7a846fb06105c084015108610e00830152807f096b9f8b8598b7c387fb69abf236b0d5e04e24d275ee98244443eda5d3bc4035610d8084015109610e20830152807f26f8aee75b98e8663054dc0a8f4aa78747e5c37603cad86cff9e07ee1c43bfcc6105c084015108610e40830152807f28771071ab1633014eae27cfc16d5ebe08a8fe2fc9e85044e4a45f82c14cd825610d8084015109610e60830152807f07ed3e01361b6d2869a21de6c013f99f1f8aea18afd1204c5f3d96112eb327dc6105c084015108610e80830152807f0ae3c95fc03c0a5f2de8a8f46c03ccdfdfed2bb98c9e4ae0b10b15eda4e3b1e3610d8084015109610ea0830152807f2580851320f595ca8a679cc2157d8b7d4846bc8eed1b25b092d6dfa64b1c4e1e6105c084015108610ec0830152807f2afd4e77273f1cb3434a4a667929058c156b21573c3f1efc882e708597d7161a610d8084015109610ee0830152807f0566fffbb9f283767505fb50085852d112c8c6f13d7a5194bbb3850e5828e9e76105c084015108610f00830152806001610d8084015109610f20830152807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000006105c084015108610f40830152807f14c60185e75885d674db4b3f7d4a5694fa6c01aa0f53557b060bc04a4172705f610d8084015109610f60830152807f1b9e4cecf9d91a534374fa77043701c82dc7e69e6a661b163dd63549ae8d8fa26105c084015108610f80830152807f2ad9021ed07c42ab19f77c5cf2cbd2deb135ea330f1b1573bd08d99309c4bb7d610d8084015109610fa0830152807f058b4c5410b55d7e9e58c9598eb5857e76fdfe156a9e5b1d86d91c00e63b44846105c084015108610fc0830152807f1908597d2fc3bc1da312efa344e0fc8a7079300238f2ee35774f117e66fd4467610d8084015109610fe0830152807f175bf4f5b16de40c153d56133ca05bd2b7bab84640c6825bcc92e4158902bb9a6105c084015108611000830152610dc08201518181610e00850151099050806110208401528181610e40850151099050806110408401528181610e80850151099050806110608401528181610ec0850151099050806110808401528181610f00850151099050806110a08401528181610f40850151099050806110c08401528181610f80850151099050806110e08401528181610fc0850151099050806111008401528181611000850151099050806111208401528181610d608501510990508061114084015250602061118083015260206111a083015260206111c08301526111408201516111e08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593efffffff6112008301526000805160206155958339815191526112208301528260016020611160850160c0611180870160055afa141692506111608201516000610d608401519050828261112086015109610d608501528282820991506110008401519050828261110086015109611000850152828282099150610fc0840151905082826110e086015109610fc0850152828282099150610f80840151905082826110c086015109610f80850152828282099150610f40840151905082826110a086015109610f40850152828282099150610f008401519050828261108086015109610f00850152828282099150610ec08401519050828261106086015109610ec0850152828282099150610e808401519050828261104086015109610e80850152828282099150610e408401519050828261102086015109610e40850152828282099150610e0084015190508282610dc086015109610e0085015282828209610dc08501819052610da08501518493509091500961124083015280610e00830151610de08401510961126083015280610e40830151610e208401510961128083015280610e80830151610e60840151096112a083015280610ec0830151610ea0840151096112c083015280610f00830151610ee0840151096112e083015280610f40830151610f208401510961130083015280610f80830151610f608401510961132083015280610fc0830151610fa08401510961134083015280611000830151610fe084015109611360830152806020830151611300840151098181836040860151611320870151090890508181836060860151611340870151090890508181836080860151611360870151090861138084015250610720820151610600830151829190086113a08301819052819080096113c08301819052819080096113e0830152806113e08301516113a084015109611400830152807f066f6f85d6f68a85ec10345351a23a3aaf07f38af8c952a7bceca70bd2af7ad561140084015109611420830152806107408301516106208401510861144083018190528190800961146083018190528190800961148083015280611480830151611440840151096114a0830152807f2b9d4b4110c9ae997782e1509b1d0fdb20a7c02bbd8bea7305462b9f8125b1e86114a0840151096114c0830152806114c0830151611420840151086114e08301528061064083015182036114e08401510861150083018190526107c08301518291096115208301528061152083015161042084015109611540830152807f0cc57cdbb08507d62bf67a4493cc262fb6c09d557013fff1f573f431221f8ff961140084015109611560830152807f1274e649a32ed355a31a6ed69724e1adade857e86eb5c3a121bcd147943203c86114a08401510961158083015280611580830151611560840151086115a08301528061066083015182036115a0840151086115c083018190526107c08301518291096115e0830152806115e08301516115408401510861160083015280611600830151610420840151096116208301528061068083015182036114008401510861164083018190526107e0830151829109611660830152806116608301516116208401510861168083015280611680830151610420840151096116a0830152807f066f6f85d6f68a85ec10345351a23a3aaf07f38af8c952a7bceca70bd2af7ad5610680840151096116c0830152807f2b9d4b4110c9ae997782e1509b1d0fdb20a7c02bbd8bea7305462b9f8125b1e8611440840151096116e0830152806116e08301516116c08401510861170083018190526106e08301518291086117208301819052819080096117408301819052819080096117608301528061176083015161172084015109611780830152807f13abec390ada7f4370819ab1c7846f210554569d9b29d1ea8dbebd0fa8c53e66610640840151096117a0830152807f1eb9e1dc19a33a624c9862a1d97d1510bd521ead5dfe0345aaf6185b1a1e60fe610660840151096117c0830152806117c08301516117a0840151086117e0830152806117e083015182036117808401510861180083018190526107e0830151829109611820830152806118208301516116a0840151086118408301528061184083015161042084015109611860830152807f0cc57cdbb08507d62bf67a4493cc262fb6c09d557013fff1f573f431221f8ff961068084015109611880830152807f1274e649a32ed355a31a6ed69724e1adade857e86eb5c3a121bcd147943203c8611440840151096118a0830152806118a0830151611880840151086118c083018190526107008301518291086118e0830152807f0fc1c9394db89bb2601abc49fdad4f038ce5169030a2ad69763f7875036bcb0261064084015109611900830152807f16a9e98c493a902b9502054edc03e7b22b7eac34345961bc8abced6bd147c8be6106608401510961192083015280611920830151611900840151086119408301528061194083015182036118e08401510861196083018190526107e083015182910961198083015280611980830151611860840151086119a0830152806119a0830151610420840151096119c0830152806107a083015182036001086119e083018190526107a0830151829109611a00830152806107a08301518203600208611a208301819052611a00830151829109611a40830152806107a08301518203600408611a608301819052611a40830151829109611a80830152806106008301516106c084015108611aa0830152806106408301518203611aa084015108611ac08301819052611a80830151829109611ae083015280611ae08301516119c084015108611b0083015280611b0083015161042084015109611b208301528061066083015182036106a084015108611b408301819052611a80830151829109611b6083015280611b60830151611b2084015108611b8083015280611b8083015161042084015109611ba08301528061080083015161150084015109611bc083015280611bc0830151611ba084015108611be083015280611be083015161042084015109611c00830152806108008301516115c084015109611c2083015280611c20830151611c0084015108611c4083015280611c4083015161042084015109611c608301528061082083015161164084015109611c8083015280611c80830151611c6084015108611ca083015280611ca083015161042084015109611cc08301528061082083015161180084015109611ce083015280611ce0830151611cc084015108611d0083015280611d0083015161042084015109611d208301528061082083015161196084015109611d4083015280611d40830151611d2084015108611d6083015280611d6083015161042084015109611d80830152806107a08301518203600308611da08301819052611a40830151829109611dc083015280611dc0830151611ac084015109611de083015280611de0830151611d8084015108611e0083015280611e0083015161042084015109611e2083015280611dc0830151611b4084015109611e4083015280611e40830151611e2084015108611e6083015280611e6083015161042084015109611e80830152806107a0830151611a2084015109611ea083015280611ea0830151611da084015109611ec083015280611ec0830151611a6084015109611ee083015280611ee083015161068084015109611f00830152806106808301518203600108611f208301819052611f00830151829109611f4083015280611f40830151611e8084015108611f6083015280611f6083015161042084015109611f8083015280610680830151600209611fa083015280610600830151820361062084015108611fc08301819052611fa0830151829109611fe083015280610600830151820361064084015108612000830152806120008301518203611fe08401510861202083015280610660830151820361062084015108612040830152806120408301518203612020840151086120608301819052611ee083015182910961208083015280612080830151611f80840151086120a0830152806120a0830151610420840151096120c083015280611a00830151611da0840151096120e0830152806120e0830151611a60840151096121008301528061062083015161060084015108612120830152806106808301518203612120840151086121408301819052612100830151829109612160830152806121608301516120c08401510861218083015280612180830151610420840151096121a083018190526121608301518291086121c0830152806121c0830151610420840151096121e08301528061092083015182036001086122008301819052611300830151829109612220830152806122208301516121e084015108612240830152806122408301516104208401510961226083015261098082015181908009612280830152806109808301518203612280840151086122a083018190526112408301518291096122c0830152806122c0830151612260840151086122e0830152806122e083015161042084015109612300830152806109608301518203610980840151086123208301819052611300830151829109612340830152806123408301516123008401510861236083015280612360830151610420840151096123808301528061124083015182036001086123a083015280611280830151611260840151086123c083018190526112a08301518291086123e083018190526112c083015182910861240083018190526112e08301518291086124208301528061242083015182036123a0840151086124408301528061026083015161086084015109612460830152806124608301516106e08401510861248083018190526102c08301518291086124a083015280610260830151610880840151096124c0830152806124c0830151610600840151086124e083018190526102c083015182910861250083018190526124a0830151829109612520830152806102608301516108a084015109612540830152806125408301516106208401510861256083018190526102c083015182910861258083018190526125208301518291096125a0830152806102608301516108c0840151096125c0830152806125c0830151610700840151086125e083018190526102c083015182910861260083018190526125a0830151829109612620830181905261094083015182910961264083015280610260830151600109612660830152806126608301516105c084015109612680830152806126808301516106e0840151086126a083018190526102c08301518291086126c0830152806102608301517f09226b6e22c6f0ca64ec26aad4c86e715b5f898e5e963f25870e56bbe533e9a2096126e0830152806126e08301516105c084015109612700830152806127008301516106008401510861272083018190526102c083015182910861274083018190526126c0830151829109612760830152806102608301517f13b360d4e82fe915fed16081038f98c211427b87a281bd733c277dbadf10372b09612780830152806127808301516105c0840151096127a0830152806127a0830151610620840151086127c083018190526102c08301518291086127e08301819052612760830151829109612800830152806102608301517f18afdf23e9bd9302673fc1e076a492d4d65bd18ebc4d854ed189139bab313e5209612820830152806128208301516105c084015109612840830152806128408301516107008401510861286083018190526102c083015182910861288083018190526128008301518291096128a083018190526109208301518291096128c0830152806128c08301518203612640840151086128e0830181905261244083015182910961290083015280612900830151612380840151086129208301528061292083015161042084015109612940830152806102608301516108e084015109612960830152806129608301516106808401510861298083018190526102c08301518291086129a083015280610260830151610900840151096129c0830152806129c0830151611380840151086129e083018190526102c0830151829108612a0083018190526129a0830151829109612a2083018190526109a0830151829109612a40830152806102608301517ea136ba13afa6c83eb7b82fb370e228e74155e48fb8f1c1cfc33fb0da8afb4209612a6083015280612a608301516105c084015109612a8083015280612a8083015161068084015108612aa083018190526102c0830151829108612ac0830152806102608301517f2eb9750dce545f17d492058dd201a1251ff3d9077864583d44eaf9be9008699d09612ae083015280612ae08301516105c084015109612b0083015280612b0083015161138084015108612b2083018190526102c0830151829108612b408301819052612ac0830151829109612b608301819052610980830151829109612b8083015280612b808301518203612a4084015108612ba08301819052612440830151829109612bc083015280612bc083015161294084015108612be083015280612be083015161042084015109612c00830152806109c08301518203600108612c208301819052611300830151829109612c4083015280612c40830151612c0084015108612c6083015280612c6083015161042084015109612c808301526109c082015181908009612ca0830152806109c08301518203612ca084015108612cc08301819052611240830151829109612ce083015280612ce0830151612c8084015108612d0083015280612d0083015161042084015109612d2083015280610260830151610a0084015108612d4083018190526109e0830151829109612d60830152806102c0830151610a4084015108612d808301819052612d60830151829109612da08301528061064083015161010009612dc083015280612dc0830151820361060084015108612de08301819052610780830151829109612e008301819052610260830151829108612e2083018190526109c0830151829109612e40830152806102c083015161076084015108612e608301819052612e40830151829109612e8083015280612e808301518203612da084015108612ea08301819052612440830151829109612ec083015280612ec0830151612d2084015108612ee083015280612ee083015161042084015109612f0083015280610a408301518203610a0084015108612f208301819052611300830151829109612f4083015280612f40830151612f0084015108612f6083015280612f6083015161042084015109612f8083015280612440830151612f2084015109612fa083015280610a208301518203610a0084015108612fc08301819052612fa0830151829109612fe083015280612fe0830151612f8084015108613000830152610d40820151819080096130208301819052610d408301518291096130408301819052610d408301518291096130608301819052610d4083015182910961308083015280610d408301516001096130a0830152806130208301516001096130c0830152806130408301516001096130e08301528061306083015160010961310083015280610d6083015161300084015109613120830152806105c0830151610c00840151096131408301528060016105c084015109613160830152806131608301518203610b8084015108613180830152807f14c60185e75885d674db4b3f7d4a5694fa6c01aa0f53557b060bc04a4172705f6105c0840151096131a0830152806131a08301518203610b80840151086131c0830152807f22b55603586d5fc42c6c14c2fc27a028c207da8b2c71cb33d549fa4a2be5d3026105c0840151096131e0830152806131e08301518203610b8084015108613200830152807f2afd4e77273f1cb3434a4a667929058c156b21573c3f1efc882e708597d7161a6105c084015109613220830152806132208301518203610b808401510861324083015280817f21054ce8b3cb9dc9b87af5c70c8f54994090ad8fa7e06caaf989ba5806b6798b610c0085015109610b8084015109818183847f0f5f018a2d66025fffd54fef74f203c3e7a33ab8d1d903e64a583b3be9498676610c00880151096105c087015109089050806132608401525080817f10ac009d2f31395e301635cd6d292978a4012197c24d6e63fb49943a70296136610c0085015109610b8084015109818183847f2696aa2788110c63ebbfd7f92b352ce93b28bbdae57b7cb94bc5885ee439e774610c00880151096105c087015109089050806132808401525080817f2510cae1618713ac17c9ef83f1a67645ed21f454d96bf1f072ca5b463e7f0c28610c0085015109610b8084015109818183847f0d6a07653c64f4112284cb8b23bf73adecaf4ee0fef51998549526f07b6defd7610c00880151096105c087015109086132a08401525061318082015181906001096132c083018190526131c08301518291096132e08301819052613240830151829109613300830152806001610b80840151098181837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000006105c087015109089050806133208401525080817f1d81b9bd5165d63a0d4a8370d37966eb243365d36ca235911564a783f8234cf2610c0085015109610b8084015109818183847f12e294b58fcbc9efab05c245ae07f172040082750d173b002e7d4e0ff7dcb30f610c00880151096105c087015109089050806133408401525080817f142f93c8919700eddb46a823a63f1726c05e6953fd8ba57ddf6ea70e7ebc8dcf610c0085015109610b8084015109818183847f2707d3cc5788c2cfc0ee9e5f5638da3b90cb6d8b97224a4521073ec9f10826fb610c00880151096105c087015109089050806133608401525080817f13d3d4db83b42c4d48afa6b5c9cbe3f49703d0caf1fdc301b0d4d3743ab60833610c0085015109610b8084015109818183847f223ed99d38075819043fa85ed3c54f3bfb5d62312139562ca82d9903b1b52e27610c00880151096105c08701510908613380840152506132008201516132e0830151829190096133a083015280817f1b9e4cecf9d91a534374fa77043701c82dc7e69e6a661b163dd63549ae8d8fa36105c085015109610b8084015109818183847f14c60185e75885d674db4b3f7d4a5694fa6c01aa0f53557b060bc04a4172705e6105c0880151096105c087015109089050806133c08401525080817f14c60185e75885d674db4b3f7d4a5694fa6c01aa0f53557b060bc04a4172705e6105c085015109610b8084015109818183847f1a514dd9f80de355133414990bffdc137169ffbf79f1b0988ce4dc4b27adb4e36105c0880151096105c087015109089050806133e08401525080817f0566fffbb9f283767505fb50085852d112c8c6f13d7a5194bbb3850e5828e9e86105c085015109610b8084015109818183847f2afd4e77273f1cb3434a4a667929058c156b21573c3f1efc882e708597d716196105c0880151096105c087015109089050806134008401525080817f2afd4e77273f1cb3434a4a667929058c156b21573c3f1efc882e708597d716196105c085015109610b8084015109818183847f20198517670312541561a1720d2538ac357df59dafa0d41bd7235a97f2f364376105c0880151096105c08701510908613420840152506132408201516132c08301518291900961344083015261326082015181816132808501510990508061346084015281816132a0850151099050806134808401528181613320850151099050806134a084015281816132c0850151099050806134c08401528181613340850151099050806134e084015281816133608501510990508061350084015281816133808501510990508061352084015281816133a08501510990508061354084015281816133c08501510990508061356084015281816133e08501510990508061358084015281816132e0850151099050806135a08401528181613400850151099050806135c08401528181613420850151099050806135e0840152818161344085015109905080613600840152506020613640830152602061366083015260206136808301526136008201516136a08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593efffffff6136c08301526000805160206155958339815191526136e08301528260016020613620850160c0613640870160055afa141692506136208201516000613440840151905082826135e086015109613440850152828282099150613420840151905082826135c086015109613420850152828282099150613400840151905082826135a0860151096134008501528282820991506132e084015190508282613580860151096132e08501528282820991506133e084015190508282613560860151096133e08501528282820991506133c084015190508282613540860151096133c08501528282820991506133a084015190508282613520860151096133a08501528282820991506133808401519050828261350086015109613380850152828282099150613360840151905082826134e086015109613360850152828282099150613340840151905082826134c0860151096133408501528282820991506132c0840151905082826134a0860151096132c085015282828209915061332084015190508282613480860151096133208501528282820991506132a084015190508282613460860151096132a08501528282820991506132808401519050828261326086015109613280850152828282096132608501819052613280850151909250839150829008905081816132a085015108613700840152506132c0820151613300830151829190096137208301526133208201518061374084015250806133a0830151613300840151096137608301526133408201518181613360850151089050818161338085015108613780840152506132e0820151613300830151829190096137a08301526133c082015181816133e0850151086137c084015250613440820151613300830151829190096137e083015261340082015181816134208501510861380084015250613700820151613740830151829082900990508061382084015281816137808501510990508061384084015281816137c0850151099050806138608401528181613800850151099050806138808401525060206138c083015260206138e083015260206139008301526138808201516139208301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593efffffff61394083015260008051602061559583398151915261396083015282600160206138a0850160c06138c0870160055afa141692506138a0820151600061380084015190508282613860860151096138008501528282820991506137c084015190508282613840860151096137c0850152828282099150613780840151905082826138208601510961378085015282828209915061374084015190508282613700860151096137408501528282820961370085015250506137408201516137208301518291900961398083015280613780830151613760840151096139a0830152806137c08301516137a0840151096139c0830152806138008301516137e0840151096139e0830152610a8082015181908009613a008301819052610a80830151829109613a208301819052610a80830151829109613a408301819052610a80830151829109613a608301819052610a80830151829109613a808301819052610a80830151829109613aa08301819052610a80830151829109613ac08301819052610a80830151829109613ae08301819052610a80830151829109613b008301819052610a80830151829109613b208301819052610a80830151829109613b408301819052610a80830151829109613b608301819052610a80830151829109613b808301819052610a80830151829109613ba08301819052610a80830151829109613bc08301819052610a80830151829109613be08301819052610a80830151829109613c008301819052610a80830151829109613c208301819052610a80830151829109613c408301819052610a80830151829109613c60830152610ae082015181908009613c808301819052610ae0830151829109613ca08301819052610ae0830151829109613cc08301819052610ae0830151829109613ce08301528061326083015161060084015109818183613280860151610640870151090890508181836132a08601516106c08701510908613d0084018190526137008401518392509009613d20830152806001613d20840151830309613d408301528061326083015161062084015109818183613280860151610660870151090890508181836132a08601516106a08701510908613d6084018190526137008401518392509009613d808301819052610a808301518291820309613da083015280610a80830151600109613dc083015280613da0830151613d4084015108613de0830152806001613de084015109613e00830152806001613dc084015109613e2083015280613720830151600109613e408301528061332083015161068084015109613e608301819052613980830151829109613e80830152806001613e80840151830309613ea0830152806001613e4084015109613ec083015280613320830151610a4084015109613ee08301819052613980830151829109613f008301819052610a808301518291820309613f2083015280610a80830151613e4084015109613f4083015280613f20830151613ea084015108613f60830152806133208301516106e084015109613f808301819052613980830151829109613fa08301819052613a008301518291820309613fc083015280613a00830151613e4084015109613fe083015280613fc0830151613f6084015108614000830152806133208301516107008401510961402083018190526139808301518291096140408301819052613a20830151829182030961406083015280613a20830151613e408401510961408083015280614060830151614000840151086140a083015280613320830151610720840151096140c083018190526139808301518291096140e08301819052613a40830151829182030961410083015280613a40830151613e4084015109614120830152806141008301516140a084015108614140830152806133208301516107408401510961416083018190526139808301518291096141808301819052613a6083015182918203096141a083015280613a60830151613e40840151096141c0830152806141a0830151614140840151086141e0830152806133208301516107608401510961420083018190526139808301518291096142208301819052613a80830151829182030961424083015280613a80830151613e4084015109614260830152806142408301516141e08401510861428083015280613320830151610780840151096142a083018190526139808301518291096142c08301819052613aa083015182918203096142e083015280613aa0830151613e4084015109614300830152806142e083015161428084015108614320830152806133208301516107a08401510961434083018190526139808301518291096143608301819052613ac0830151829182030961438083015280613ac0830151613e40840151096143a083015280614380830151614320840151086143c0830152806133208301516107c0840151096143e083018190526139808301518291096144008301819052613ae0830151829182030961442083015280613ae0830151613e4084015109614440830152806144208301516143c084015108614460830152806133208301516107e08401510961448083018190526139808301518291096144a08301819052613b0083015182918203096144c083015280613b00830151613e40840151096144e0830152806144c083015161446084015108614500830152806133208301516108008401510961452083018190526139808301518291096145408301819052613b20830151829182030961456083015280613b20830151613e408401510961458083015280614560830151614500840151086145a083015280613320830151610820840151096145c083018190526139808301518291096145e08301819052613b40830151829182030961460083015280613b40830151613e4084015109614620830152806146008301516145a084015108614640830152806133208301516108608401510961466083018190526139808301518291096146808301819052613b6083015182918203096146a083015280613b60830151613e40840151096146c0830152806146a0830151614640840151086146e0830152806133208301516108808401510961470083018190526139808301518291096147208301819052613b80830151829182030961474083015280613b80830151613e4084015109614760830152806147408301516146e084015108614780830152806133208301516108a0840151096147a083018190526139808301518291096147c08301819052613ba083015182918203096147e083015280613ba0830151613e4084015109614800830152806147e083015161478084015108614820830152806133208301516108c08401510961484083018190526139808301518291096148608301819052613bc0830151829182030961488083015280613bc0830151613e40840151096148a083015280614880830151614820840151086148c0830152806133208301516108e0840151096148e083018190526139808301518291096149008301819052613be0830151829182030961492083015280613be0830151613e4084015109614940830152806149208301516148c084015108614960830152806133208301516109008401510961498083018190526139808301518291096149a08301819052613c0083015182918203096149c083015280613c00830151613e40840151096149e0830152806149c083015161496084015108614a00830152806137208301516130a084015109614a20830152806137208301516130c084015109614a40830152806137208301516130e084015109614a608301528061372083015161310084015109614a808301528061332083015161312084015109614aa08301819052613980830151829109614ac08301819052613c208301518291820309614ae083015280613c20830151613e4084015109614b0083015280613c20830151614a2084015109614b2083015280613c20830151614a4084015109614b4083015280613c20830151614a6084015109614b6083015280613c20830151614a8084015109614b8083015280614ae0830151614a0084015108614ba08301528061332083015161084084015109614bc08301819052613980830151829109614be08301819052613c408301518291820309614c0083015280613c40830151613e4084015109614c2083015280614c00830151614ba084015108614c408301819052610ae0830151829109614c6083015280610ae0830151613ec084015109614c8083015280610ae0830151613f4084015109614ca083015280610ae0830151613fe084015109614cc083015280610ae083015161408084015109614ce083015280610ae083015161412084015109614d0083015280610ae08301516141c084015109614d2083015280610ae083015161426084015109614d4083015280610ae083015161430084015109614d6083015280610ae08301516143a084015109614d8083015280610ae083015161444084015109614da083015280610ae08301516144e084015109614dc083015280610ae083015161458084015109614de083015280610ae083015161462084015109614e0083015280610ae08301516146c084015109614e2083015280610ae083015161476084015109614e4083015280610ae083015161480084015109614e6083015280610ae08301516148a084015109614e8083015280610ae083015161494084015109614ea083015280610ae08301516149e084015109614ec083015280610ae0830151614b0084015109614ee083015280610ae0830151614b2084015109614f0083015280610ae0830151614b4084015109614f2083015280610ae0830151614b6084015109614f4083015280610ae0830151614b8084015109614f6083015280610ae0830151614c2084015109614f8083015280614c60830151613e0084015108614fa083015280613760830151600109614fc08301528061334083015161092084015109818183613360860151610940870151090890508181836133808601516109608701510908614fe084018190526139a08401518392509009615000830152806001615000840151830309615020830152806001614fc08401510961504083015280613c808301516150208401510961506083015280613c808301516150408401510961508083015280615060830151614fa0840151086150a0830152806137a08301516001096150c0830152806133c0830151610980840151098181836133e08601516109a087015109086150e084018190526139c084015183925090096151008301528060016151008401518303096151208301528060016150c084015109615140830152806133c08301516109c0840151098181836133e08601516109e0870151090861516084018190526139c084015183925090096151808301819052610a8083015182918203096151a083015280610a808301516150c0840151096151c0830152806151a0830151615120840151086151e08301819052613ca083015182910961520083015280613ca08301516151408401510961522083015280613ca08301516151c084015109615240830152806152008301516150a084015108615260830152806137e083015160010961528083015280613400830151610a0084015109818183613420860151610a2087015109086152a084018190526139e084015183925090096152c08301528060016152c08401518303096152e08301528060016152808401510961530083015280613cc08301516152e08401510961532083015280613cc08301516153008401510961534083015280615320830151615260840151086153608301528061330083015160010961538083015280610b808301516001096153a083015260016153c0830181815260026153e085015261536084015161540085015284919060409060608160075afa141692506153c08201516154208301526153e082015161544083015260a082015161546083015260c0820151615480830152826001604061542085016080615420870160065afa1416925060e08201516154a08301526101008201516154c0830152613e208201516154e083015282600160406154a0850160606154a0870160075afa141692506154208201516155008301526154408201516155208301526154a08201516155408301526154c0820151615560830152826001604061550085016080615500870160065afa141692506101208201516155808301526101408201516155a0830152614c808201516155c0830152826001604061558085016060615580870160075afa141692506155008201516155e08301526155208201516156008301526155808201516156208301526155a082015161564083015282600160406155e0850160806155e0870160065afa14169250610200820151615660830152610220820151615680830152614ca08201516156a0830152826001604061566085016060615660870160075afa141692506155e08201516156c08301526156008201516156e083015261566082015161570083015261568082015161572083015282600160406156c0850160806156c0870160065afa141692507f046611b44bb4f4cd8fcf6f82fed641d34961b88a6012df5e0f44d4f40248d57b6157408301527f25b84353a92c37bb156457e31b9133dc81245e1f3774b898f41cf59a7b0adf57615760830152614cc0820151615780830152826001604061574085016060615740870160075afa141692506156c08201516157a08301526156e08201516157c08301526157408201516157e083015261576082015161580083015282600160406157a0850160806157a0870160065afa141692507f259da9f643187930ce1299a3f700a93f17cf3129bffe184a6de1cf19f0b91f7e6158208301527f29fcbc05cd2c0152b3eb21e8fd01a00bc79780f21281598873fb955dba235f7e615840830152614ce0820151615860830152826001604061582085016060615820870160075afa141692506157a08201516158808301526157c08201516158a08301526158208201516158c08301526158408201516158e0830152826001604061588085016080615880870160065afa141692507f2b99cb49ca685626a08c009ea442fc895a2f86cca1f29f18d4b7ec9ece937aa26159008301527f20a45cae33f3917205b76aeb87e409350840664058839b1db76f8761db50fac8615920830152614d00820151615940830152826001604061590085016060615900870160075afa141692506158808201516159608301526158a08201516159808301526159008201516159a08301526159208201516159c0830152826001604061596085016080615960870160065afa141692507f25a265a57942223657b3316c913bffe8db0efedbed9ac878308e1d63d4df61d86159e08301527f0d2f79604094b53fd56a955d2574e241ad67498ab320f2bb764841f5c903bff9615a00830152614d20820151615a2083015282600160406159e0850160606159e0870160075afa14169250615960820151615a40830152615980820151615a608301526159e0820151615a80830152615a00820151615aa08301528260016040615a4085016080615a40870160065afa141692507f22e1cdbfffcfcf4f18cf4342edf1fb26c3b6e52ace3d5fadcf5cc2614333baa4615ac08301527f0e28df72dcc69cc6442d72f693661997480a913ac353890efd63a873959727c0615ae0830152614d40820151615b008301528260016040615ac085016060615ac0870160075afa14169250615a40820151615b20830152615a60820151615b40830152615ac0820151615b60830152615ae0820151615b808301528260016040615b2085016080615b20870160065afa141692507f0160a474a2c8de56950bbe25d6f09002a91f2cc20fbdb15e8413f1176e7f1865615ba08301527f1d0f5797eaaea89e5119e4260db563605a84d004b8efd02c51b960bfecf20e90615bc0830152614d60820151615be08301528260016040615ba085016060615ba0870160075afa14169250615b20820151615c00830152615b40820151615c20830152615ba0820151615c40830152615bc0820151615c608301528260016040615c0085016080615c00870160065afa141692507f02b619a2a245b370b3319e21e0be467256209338cf9546447b875a2779e010d4615c808301527f07d7f03df06345ba2df20bb867841f60ebd25daab5aafa13ddc1413116996802615ca0830152614d80820151615cc08301528260016040615c8085016060615c80870160075afa14169250615c00820151615ce0830152615c20820151615d00830152615c80820151615d20830152615ca0820151615d408301528260016040615ce085016080615ce0870160065afa141692507f203b21a648fbfb96459640bbc5b41852dd1efc1209c89b635ba638dcb929da6b615d608301527f04e7002f06f2091a44afcd311e93c22f46dd9f3207b5bcc34f0ca7652098f097615d80830152614da0820151615da08301528260016040615d6085016060615d60870160075afa14169250615ce0820151615dc0830152615d00820151615de0830152615d60820151615e00830152615d80820151615e208301528260016040615dc085016080615dc0870160065afa141692507f20ab7490b42f3f7b2b0bbe601a09d72ee93f924801d597f48cf2d443751d5f91615e408301527f2bca2f1762946a05fb1632550c6cb12c02d18d9bee5bdd4212ca7342888720fd615e60830152614dc0820151615e808301528260016040615e4085016060615e40870160075afa14169250615dc0820151615ea0830152615de0820151615ec0830152615e40820151615ee0830152615e60820151615f008301528260016040615ea085016080615ea0870160065afa141692507f13caf6fa687a546fd1eeb9e0d43a9f8fe9a3f05322f5edda1b95d50e83839851615f208301527f22e2768775e2d96fd8925c48a99df2b248cb3d893a15b9dca81660b79cc35f4a615f40830152614de0820151615f608301528260016040615f2085016060615f20870160075afa14169250615ea0820151615f80830152615ec0820151615fa0830152615f20820151615fc0830152615f40820151615fe08301528260016040615f8085016080615f80870160065afa141692507f19a074dc6d1a0f1e5589a55d9c4955cf867e2899dbfd46a11c27a84804b5b2396160008301527f26b112fb59a0b875833e52f951b3b010826b169f320d80597f1275544ae24897616020830152614e00820151616040830152826001604061600085016060616000870160075afa14169250615f80820151616060830152615fa08201516160808301526160008201516160a08301526160208201516160c0830152826001604061606085016080616060870160065afa141692507f1c6df6612866079dc2a52525842c8025502eb5a8913c560836c4bc7ab2dc334e6160e08301527f0d36fe2bf6d58291ed035a1f090904639502213a2449227d156ee3f8f6372e2c616100830152614e2082015161612083015282600160406160e0850160606160e0870160075afa141692506160608201516161408301526160808201516161608301526160e08201516161808301526161008201516161a0830152826001604061614085016080616140870160065afa141692507f01add1e14d0a1880ee8e837b20502713d06428d55d61fea8fea89a71648971fa6161c08301527f12c982466ea6dcfada3ad0e277fed44f770466650d4704906a4d34b6b8d8bed16161e0830152614e4082015161620083015282600160406161c0850160606161c0870160075afa141692506161408201516162208301526161608201516162408301526161c08201516162608301526161e0820151616280830152826001604061622085016080616220870160065afa141692507f2faee9fe4eb97b37abb4fdd1b604ed8acf55df0a370bcfe7f5615b7598989d7a6162a08301527f2269aff86c3fd35864f3e2cb39db623e0122a05b6b5f789ff57434e557a90c236162c0830152614e608201516162e083015282600160406162a0850160606162a0870160075afa141692506162208201516163008301526162408201516163208301526162a08201516163408301526162c0820151616360830152826001604061630085016080616300870160065afa141692507f0743ea40f14084db2673217283aa053f986896ee7c181f52118442e99c4529746163808301527f0203e3493a2594ece57d22cc75dd081ac68271ec7c758153cfd2152bfb5c19e36163a0830152614e808201516163c0830152826001604061638085016060616380870160075afa141692506163008201516163e08301526163208201516164008301526163808201516164208301526163a082015161644083015282600160406163e0850160806163e0870160065afa141692507f01b6921cc4c35a03d696e754bac06edba8187499252d98da7e7d40b844f242456164608301527f181dfa294889601a9cc57448d966b9cc60e7795ab336d2078dc43aeb888484fb616480830152614ea08201516164a0830152826001604061646085016060616460870160075afa141692506163e08201516164c08301526164008201516164e083015261646082015161650083015261648082015161652083015282600160406164c0850160806164c0870160065afa141692507f0f0dcdaa6fd2f36460376557f9d6b4b0985b085d2d8ffca7c6c408d8560d5d086165408301527f0bc4e7f7a927678093e4be2bfb543ab7d6267ee943e8ed13369a3b3c9ef23779616560830152614ec0820151616580830152826001604061654085016060616540870160075afa141692506164c08201516165a08301526164e08201516165c08301526165408201516165e083015261656082015161660083015282600160406165a0850160806165a0870160065afa14169250610460820151616620830152610480820151616640830152614ee0820151616660830152826001604061662085016060616620870160075afa141692506165a08201516166808301526165c08201516166a08301526166208201516166c08301526166408201516166e0830152826001604061668085016080616680870160065afa141692506104a08201516167008301526104c0820151616720830152614f00820151616740830152826001604061670085016060616700870160075afa141692506166808201516167608301526166a08201516167808301526167008201516167a08301526167208201516167c0830152826001604061676085016080616760870160065afa141692506104e08201516167e0830152610500820151616800830152614f2082015161682083015282600160406167e0850160606167e0870160075afa141692506167608201516168408301526167808201516168608301526167e08201516168808301526168008201516168a0830152826001604061684085016080616840870160065afa141692506105208201516168c08301526105408201516168e0830152614f4082015161690083015282600160406168c0850160606168c0870160075afa141692506168408201516169208301526168608201516169408301526168c08201516169608301526168e0820151616980830152826001604061692085016080616920870160065afa141692506105608201516169a08301526105808201516169c0830152614f608201516169e083015282600160406169a0850160606169a0870160075afa14169250616920820151616a00830152616940820151616a208301526169a0820151616a408301526169c0820151616a608301528260016040616a0085016080616a00870160065afa141692506103c0820151616a808301526103e0820151616aa0830152614f80820151616ac08301528260016040616a8085016060616a80870160075afa14169250616a00820151616ae0830152616a20820151616b00830152616a80820151616b20830152616aa0820151616b408301528260016040616ae085016080616ae0870160065afa14169250610300820151616b60830152610320820151616b80830152615080820151616ba08301528260016040616b6085016060616b60870160075afa14169250616ae0820151616bc0830152616b00820151616be0830152616b60820151616c00830152616b80820151616c208301528260016040616bc085016080616bc0870160065afa14169250610340820151616c40830152610360820151616c60830152615220820151616c808301528260016040616c4085016060616c40870160075afa14169250616bc0820151616ca0830152616be0820151616cc0830152616c40820151616ce0830152616c60820151616d008301528260016040616ca085016080616ca0870160065afa14169250610380820151616d208301526103a0820151616d40830152615240820151616d608301528260016040616d2085016060616d20870160075afa14169250616ca0820151616d80830152616cc0820151616da0830152616d20820151616dc0830152616d40820151616de08301528260016040616d8085016080616d80870160065afa141692506101c0820151616e008301526101e0820151616e20830152615340820151616e408301528260016040616e0085016060616e00870160075afa14169250616d80820151616e60830152616da0820151616e80830152616e00820151616ea0830152616e20820151616ec08301528260016040616e6085016080616e60870160065afa14169250610b20820151616ee0830152610b40820151616f008301526153808201518103616f20830152508160016040616ee084016060616ee0860160075afa14169150616e60810151616f40820152616e80810151616f60820152616ee0810151616f80820152616f00810151616fa08201528160016040616f4084016080616f40860160065afa14169150610bc0810151616fc0820152610be0810151616fe08201526153a08101516170008201528160016040616fc084016060616fc0860160075afa14169150616f40810151617020820152616f60810151617040820152616fc0810151617060820152616fe0810151617080820152816001604061702084016080617020860160065afa141691506170208101516170a08201526170408101516170c08201527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c26170e08201527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6171008201527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b6171208201527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa617140820152610bc0810151617160820152610be08101516171808201527f26186a2d65ee4d2f9c9a5b91f86597d35f192cd120caf7e935d8443d1938e23d6171a08201527f30441fd1b5d3370482c42152a8899027716989a6996c2535bc9f7fee8aaef79e6171c08201527f16f363f103c80d7bbc8ad3c6867e0822bbc6000be91a4689755c7df40221c1456171e08201527f2b1cbb3e521edf5a622d82762a44a5e63f1e50b332d71154a4a7958d6011deff61720082015281600160206170a084016101806170a0860160085afa6170a093909301516001149214161691505092915050565b604051806172000160405280610390906020820280368337509192915050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715615434576154346153f5565b604052919050565b600082601f83011261544d57600080fd5b813567ffffffffffffffff811115615467576154676153f5565b61547a601f8201601f191660200161540b565b81815284602083860101111561548f57600080fd5b816020850160208301376000918101602001919091529392505050565b600080604083850312156154bf57600080fd5b823567ffffffffffffffff808211156154d757600080fd5b818501915085601f8301126154eb57600080fd5b81356020828211156154ff576154ff6153f5565b8160051b61550e82820161540b565b928352848101820192828101908a85111561552857600080fd5b958301955b848710156155465786358252958301959083019061552d565b975050508601359250508082111561555d57600080fd5b5061556a8582860161543c565b915050925092905056fe30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4730644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001a2646970667358221220f964c2eff2c690734da252f9c4c5e8346ee57d4f780840e636f83cf215278f6764736f6c63430008120033","linkReferences":{},"deployedLinkReferences":{}} \ No newline at end of file diff --git a/backend/src/contracts/deployments.json b/backend/src/contracts/deployments.json index fe6ceb32..6896ec0c 100644 --- a/backend/src/contracts/deployments.json +++ b/backend/src/contracts/deployments.json @@ -1 +1 @@ -{"31337":{"address":"0xcf7ed3acca5a467e9e704c703e8d87f634fb0fc9"}} +{"31337":{"address":"0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512"}} \ No newline at end of file diff --git a/backend/src/contracts/generated/inclusion_verifier.rs b/backend/src/contracts/generated/inclusion_verifier.rs index a3ed1c98..fec31af2 100644 --- a/backend/src/contracts/generated/inclusion_verifier.rs +++ b/backend/src/contracts/generated/inclusion_verifier.rs @@ -41,7 +41,7 @@ pub mod inclusion_verifier { 80, 97, 85, - 233, + 234, 128, 98, 0, @@ -114,7 +114,7 @@ pub mod inclusion_verifier { 4, 97, 84, - 171, + 172, 86, 91, 97, @@ -151,7 +151,7 @@ pub mod inclusion_verifier { 99, 97, 83, - 212, + 213, 86, 91, 96, @@ -162,7 +162,7 @@ pub mod inclusion_verifier { 32, 97, 85, - 148, + 149, 131, 57, 129, @@ -182,7 +182,7 @@ pub mod inclusion_verifier { 32, 97, 85, - 116, + 117, 131, 57, 129, @@ -208,7 +208,7 @@ pub mod inclusion_verifier { 32, 97, 85, - 116, + 117, 131, 57, 129, @@ -226,7 +226,7 @@ pub mod inclusion_verifier { 32, 97, 85, - 116, + 117, 131, 57, 129, @@ -246,7 +246,7 @@ pub mod inclusion_verifier { 32, 97, 85, - 116, + 117, 131, 57, 129, @@ -321,38 +321,38 @@ pub mod inclusion_verifier { 1, 82, 127, - 10, - 161, - 41, - 79, - 48, - 119, - 74, - 3, - 146, - 207, - 2, - 79, - 65, - 72, - 11, + 23, + 175, + 181, + 151, 60, - 72, - 155, - 208, - 166, - 137, + 64, 93, - 130, - 235, - 170, - 9, - 108, - 168, - 237, - 182, + 45, + 110, + 247, + 161, 187, - 188, + 189, + 195, + 82, + 9, + 206, + 144, + 152, + 247, + 97, + 135, + 3, + 174, + 4, + 169, + 51, + 139, + 234, + 235, + 220, + 151, 96, 0, 131, @@ -3225,7 +3225,7 @@ pub mod inclusion_verifier { 32, 97, 85, - 148, + 149, 131, 57, 129, @@ -10656,7 +10656,7 @@ pub mod inclusion_verifier { 32, 97, 85, - 148, + 149, 131, 57, 129, @@ -11488,7 +11488,7 @@ pub mod inclusion_verifier { 32, 97, 85, - 148, + 149, 131, 57, 129, @@ -16304,38 +16304,38 @@ pub mod inclusion_verifier { 146, 80, 127, - 41, - 30, - 77, + 4, + 102, + 17, 180, - 60, - 38, - 7, - 38, - 185, - 28, - 83, - 89, - 23, - 168, - 1, - 189, - 224, - 107, - 231, - 247, + 75, + 180, + 244, + 205, + 143, 207, - 69, - 1, - 9, - 9, - 118, - 35, - 19, - 219, - 66, - 82, - 144, + 111, + 130, + 254, + 214, + 65, + 211, + 73, + 97, + 184, + 138, + 96, + 18, + 223, + 94, + 15, + 68, + 212, + 244, + 2, + 72, + 213, + 123, 97, 87, 64, @@ -16343,38 +16343,38 @@ pub mod inclusion_verifier { 1, 82, 127, + 37, + 184, + 67, + 83, + 169, + 44, + 55, + 187, 21, - 78, - 127, - 225, - 88, - 71, - 172, - 77, - 28, - 217, - 63, - 166, - 200, - 32, - 150, - 114, - 207, - 204, - 244, - 90, - 216, - 225, - 58, + 100, + 87, + 227, + 27, + 145, + 51, + 220, + 129, + 36, + 94, + 31, + 55, + 116, 184, - 47, - 198, - 177, - 103, - 186, - 25, - 148, - 252, + 152, + 244, + 28, + 245, + 154, + 123, + 10, + 223, + 87, 97, 87, 96, @@ -16492,38 +16492,38 @@ pub mod inclusion_verifier { 146, 80, 127, - 23, - 107, - 16, - 212, - 2, - 250, - 192, - 91, - 252, - 152, - 34, - 52, - 245, - 11, + 37, + 157, + 169, + 246, + 67, + 24, + 121, 48, - 90, - 208, - 103, + 206, + 18, + 153, + 163, + 247, + 0, + 169, + 63, + 23, + 207, + 49, + 41, + 191, + 254, + 24, + 74, + 109, 225, - 34, - 241, - 104, - 42, - 75, - 156, - 75, - 217, - 139, - 218, - 145, - 145, - 157, + 207, + 25, + 240, + 185, + 31, + 126, 97, 88, 32, @@ -16531,38 +16531,38 @@ pub mod inclusion_verifier { 1, 82, 127, - 29, - 98, - 231, - 141, - 101, - 94, - 63, - 199, - 65, - 136, - 102, - 103, - 56, + 41, 252, - 166, - 82, - 74, - 113, - 47, - 26, - 60, - 76, - 207, - 221, - 15, - 164, - 79, - 62, + 188, + 5, + 205, 44, - 132, - 156, - 81, + 1, + 82, + 179, + 235, + 33, + 232, + 253, + 1, + 160, + 11, + 199, + 151, + 128, + 242, + 18, + 129, + 89, + 136, + 115, + 251, + 149, + 93, + 186, + 35, + 95, + 126, 97, 88, 64, @@ -16680,38 +16680,38 @@ pub mod inclusion_verifier { 146, 80, 127, - 1, - 157, - 215, - 238, - 83, - 25, - 144, - 211, - 53, - 170, - 216, - 246, - 76, + 43, + 153, + 203, + 73, + 202, + 104, + 86, 38, + 160, + 140, + 0, + 158, + 164, + 66, + 252, + 137, + 90, + 47, + 134, + 204, 161, - 188, - 7, - 43, - 71, - 167, - 239, + 242, + 159, + 24, 212, - 80, - 68, - 4, - 210, - 233, - 94, - 32, - 37, - 7, - 89, + 183, + 236, + 158, + 206, + 147, + 122, + 162, 97, 89, 0, @@ -16719,38 +16719,38 @@ pub mod inclusion_verifier { 1, 82, 127, - 12, - 65, - 61, - 216, - 229, - 1, - 137, - 160, - 90, - 55, - 70, - 121, - 186, - 231, - 47, + 32, + 164, + 92, + 174, + 51, + 243, + 145, 114, - 79, - 123, - 113, - 233, - 86, - 195, - 44, + 5, + 183, + 106, + 235, + 135, + 228, + 9, + 53, 8, - 129, - 234, - 55, - 105, - 66, - 118, - 234, + 64, + 102, + 64, + 88, 131, + 155, + 29, + 183, + 111, + 135, + 97, + 219, + 80, + 250, + 200, 97, 89, 32, @@ -16868,38 +16868,38 @@ pub mod inclusion_verifier { 146, 80, 127, - 7, - 48, + 37, + 162, + 101, + 165, 121, - 157, - 91, - 254, - 193, - 206, - 252, - 90, - 175, - 252, + 66, + 34, + 54, + 87, + 179, + 49, + 108, + 145, + 59, 255, - 227, - 243, - 221, - 73, - 27, - 43, - 252, - 175, - 159, - 85, - 63, - 148, - 222, - 97, - 69, + 232, + 219, + 14, + 254, + 219, 237, - 71, - 66, - 175, + 154, + 200, + 120, + 48, + 142, + 29, + 99, + 212, + 223, + 97, + 216, 97, 89, 224, @@ -16907,38 +16907,38 @@ pub mod inclusion_verifier { 1, 82, 127, - 36, + 13, + 47, + 121, + 96, + 64, + 148, + 181, + 63, + 213, + 106, + 149, + 93, + 37, + 116, + 226, + 65, 173, - 74, - 240, - 130, - 233, - 107, - 20, - 185, - 166, - 218, - 128, - 244, - 250, - 19, - 52, + 103, + 73, + 138, + 179, + 32, 242, - 83, - 196, - 88, - 173, - 213, - 49, - 200, - 217, - 248, - 178, - 60, - 94, - 203, - 156, - 67, + 187, + 118, + 72, + 65, + 245, + 201, + 3, + 191, + 249, 97, 90, 0, @@ -17244,38 +17244,38 @@ pub mod inclusion_verifier { 146, 80, 127, - 11, - 48, - 254, + 1, + 96, + 164, + 116, + 162, + 200, + 222, + 86, 149, - 129, - 166, - 199, - 0, - 100, - 227, - 179, - 84, - 70, - 178, - 67, - 56, - 66, - 219, - 118, - 232, - 250, - 213, - 71, - 251, + 11, + 190, + 37, + 214, + 240, + 144, + 2, + 169, + 31, + 44, + 194, + 15, + 189, 177, - 238, - 105, - 145, - 100, - 115, - 247, - 237, + 94, + 132, + 19, + 241, + 23, + 110, + 127, + 24, + 101, 97, 91, 160, @@ -17283,38 +17283,38 @@ pub mod inclusion_verifier { 1, 82, 127, - 40, - 110, + 29, 15, - 135, - 214, + 87, + 151, + 234, + 174, + 168, + 158, + 81, 25, - 227, - 254, - 218, - 200, - 163, - 215, - 68, - 46, - 243, - 79, - 182, - 86, - 108, - 233, - 175, + 228, + 38, + 13, + 181, + 99, + 96, 90, - 49, - 87, - 88, - 192, - 194, + 132, + 208, + 4, 184, - 0, - 12, - 54, - 207, + 239, + 208, + 44, + 81, + 185, + 96, + 191, + 236, + 242, + 14, + 144, 97, 91, 192, @@ -17432,38 +17432,38 @@ pub mod inclusion_verifier { 146, 80, 127, - 20, - 230, - 106, - 119, - 30, - 240, - 140, - 202, - 5, - 81, - 194, - 107, - 52, - 57, - 212, - 157, - 57, - 27, + 2, + 182, + 25, 162, - 29, - 145, - 183, - 6, - 223, - 44, - 75, - 31, - 23, - 125, - 119, - 89, - 229, + 162, + 69, + 179, + 112, + 179, + 49, + 158, + 33, + 224, + 190, + 70, + 114, + 86, + 32, + 147, + 56, + 207, + 149, + 70, + 68, + 123, + 135, + 90, + 39, + 121, + 224, + 16, + 212, 97, 92, 128, @@ -17471,38 +17471,38 @@ pub mod inclusion_verifier { 1, 82, 127, - 5, - 50, - 114, - 58, - 38, - 220, - 146, - 143, - 67, - 3, - 62, - 250, - 239, - 142, - 74, - 162, - 115, - 39, - 114, + 7, + 215, + 240, + 61, + 240, + 99, + 69, 186, - 65, - 75, - 29, - 173, - 206, + 45, + 242, + 11, + 184, + 103, + 132, 31, - 231, - 208, - 179, - 13, - 153, + 96, + 235, 210, + 93, + 170, + 181, + 170, + 250, + 19, + 221, + 193, + 65, + 49, + 22, + 153, + 104, + 2, 97, 92, 160, @@ -17620,38 +17620,38 @@ pub mod inclusion_verifier { 146, 80, 127, - 4, - 116, - 174, - 28, - 66, - 48, - 189, - 205, - 210, - 92, - 228, - 96, - 239, - 115, - 198, - 137, - 228, - 34, - 126, - 223, - 14, - 199, - 194, - 190, - 133, - 239, - 141, - 117, - 89, - 46, - 27, - 54, + 32, + 59, + 33, + 166, + 72, + 251, + 251, + 150, + 69, + 150, + 64, + 187, + 197, + 180, + 24, + 82, + 221, + 30, + 252, + 18, + 9, + 200, + 155, + 99, + 91, + 166, + 56, + 220, + 185, + 41, + 218, + 107, 97, 93, 96, @@ -17659,38 +17659,38 @@ pub mod inclusion_verifier { 1, 82, 127, - 47, - 216, - 62, - 110, - 7, - 204, - 53, - 117, - 90, 4, - 51, - 127, - 215, - 10, - 248, - 170, + 231, + 0, + 47, + 6, + 242, + 9, + 26, + 68, + 175, + 205, 49, - 252, - 116, - 222, + 30, + 147, + 194, + 47, + 70, + 221, + 159, + 50, 7, - 165, - 57, - 184, - 168, - 117, - 108, - 170, - 96, - 208, - 72, - 144, + 181, + 188, + 195, + 79, + 12, + 167, + 101, + 32, + 152, + 240, + 151, 97, 93, 128, @@ -17808,38 +17808,38 @@ pub mod inclusion_verifier { 146, 80, 127, - 28, - 111, - 147, - 174, - 247, - 149, - 245, - 37, - 200, - 181, - 27, - 203, - 2, - 52, - 187, - 52, - 89, - 66, - 204, - 49, - 120, + 32, + 171, + 116, + 144, + 180, + 47, + 63, + 123, 43, - 247, - 80, - 150, - 255, + 11, + 190, + 96, + 26, + 9, + 215, + 46, + 233, + 63, + 146, + 72, + 1, + 213, + 151, + 244, + 140, 242, - 112, - 127, - 62, - 75, - 159, + 212, + 67, + 117, + 29, + 95, + 145, 97, 94, 64, @@ -17847,38 +17847,38 @@ pub mod inclusion_verifier { 1, 82, 127, - 27, - 248, - 75, - 118, - 24, - 113, - 163, - 49, - 27, - 9, - 109, - 135, + 43, + 202, + 47, + 23, + 98, + 148, + 106, 5, - 52, - 176, - 164, - 176, - 149, - 51, + 251, + 22, + 50, + 85, 12, - 212, - 95, - 190, - 123, - 187, - 245, - 179, - 83, - 169, - 128, - 195, - 157, + 108, + 177, + 44, + 2, + 209, + 141, + 155, + 238, + 91, + 221, + 66, + 18, + 202, + 115, + 66, + 136, + 135, + 32, + 253, 97, 94, 96, @@ -17996,38 +17996,38 @@ pub mod inclusion_verifier { 146, 80, 127, - 7, - 96, - 155, - 167, - 145, + 19, + 202, + 246, + 250, + 104, + 122, + 84, + 111, + 209, + 238, + 185, + 224, + 212, + 58, + 159, + 143, + 233, + 163, 240, + 83, + 34, + 245, 237, - 93, - 86, - 144, - 145, - 4, - 28, - 128, - 9, - 116, - 184, - 68, - 11, - 197, - 192, - 249, - 125, - 155, - 98, + 218, + 27, 149, - 161, - 99, - 33, - 117, - 17, - 108, + 213, + 14, + 131, + 131, + 152, + 81, 97, 95, 32, @@ -18035,38 +18035,38 @@ pub mod inclusion_verifier { 1, 82, 127, - 28, - 219, - 4, - 18, - 243, - 142, - 26, - 25, - 83, - 26, - 251, - 209, - 201, - 96, - 49, - 70, - 231, - 189, - 28, - 52, + 34, + 226, + 118, + 135, + 117, + 226, + 217, + 111, + 216, + 146, + 92, + 72, 169, + 157, + 242, + 178, + 72, + 203, 61, - 246, - 190, - 76, - 101, - 177, - 38, - 227, - 83, - 123, - 104, + 137, + 58, + 21, + 185, + 220, + 168, + 22, + 96, + 183, + 156, + 195, + 95, + 74, 97, 95, 64, @@ -18184,38 +18184,38 @@ pub mod inclusion_verifier { 146, 80, 127, - 14, - 149, - 91, + 25, + 160, + 116, + 220, + 109, + 26, + 15, + 30, + 85, 137, - 236, 165, - 252, - 52, - 210, - 23, - 32, - 34, - 248, - 157, - 196, - 103, - 172, - 46, - 132, - 201, - 146, - 158, + 93, + 156, + 73, + 85, + 207, + 134, + 126, + 40, + 153, + 219, + 253, + 70, + 161, 28, - 224, - 194, + 39, 168, - 206, - 131, - 28, - 93, - 215, - 1, + 72, + 4, + 181, + 178, + 57, 97, 96, 0, @@ -18223,38 +18223,38 @@ pub mod inclusion_verifier { 1, 82, 127, - 7, - 207, - 146, - 154, - 220, - 230, - 20, - 176, - 136, - 200, - 44, + 38, + 177, + 18, + 251, + 89, + 160, + 184, + 117, + 131, + 62, + 82, + 249, + 81, 179, - 147, - 79, - 30, - 183, + 176, + 16, + 130, + 107, + 22, + 159, + 50, + 13, + 128, + 89, + 127, + 18, + 117, 84, - 109, - 210, - 228, - 131, - 150, - 233, - 20, - 180, - 255, - 6, - 236, - 69, - 222, - 158, - 138, + 74, + 226, + 72, + 151, 97, 96, 32, @@ -18372,38 +18372,38 @@ pub mod inclusion_verifier { 146, 80, 127, - 45, - 69, - 49, - 164, - 117, - 40, - 230, - 66, - 248, - 246, - 149, - 74, - 63, - 63, - 249, + 28, + 109, 246, + 97, + 40, + 102, 7, + 157, + 194, + 165, + 37, + 37, + 132, + 44, + 128, + 37, + 80, 46, - 56, - 211, - 14, - 46, - 13, - 16, - 141, - 28, - 172, - 32, - 29, - 75, - 104, - 77, + 181, + 168, + 145, + 60, + 86, + 8, + 54, + 196, + 188, + 122, + 178, + 220, + 51, + 78, 97, 96, 224, @@ -18411,38 +18411,38 @@ pub mod inclusion_verifier { 1, 82, 127, - 21, - 76, - 64, - 155, - 189, - 23, - 96, - 236, - 85, - 99, - 157, - 50, + 13, + 54, + 254, + 43, + 246, 213, - 129, - 124, - 147, - 153, - 229, - 115, - 178, - 42, - 143, - 221, - 165, - 247, - 7, - 201, - 185, - 222, - 29, - 76, - 166, + 130, + 145, + 237, + 3, + 90, + 31, + 9, + 9, + 4, + 99, + 149, + 2, + 33, + 58, + 36, + 73, + 34, + 125, + 21, + 110, + 227, + 248, + 246, + 55, + 46, + 44, 97, 97, 0, @@ -18560,38 +18560,38 @@ pub mod inclusion_verifier { 146, 80, 127, - 45, - 236, - 57, - 41, - 224, - 123, - 66, - 118, - 33, - 82, - 151, - 245, - 246, - 83, - 179, - 236, - 107, - 249, - 185, - 16, - 0, - 102, - 120, - 171, - 60, - 61, - 103, - 101, - 64, 1, - 214, - 218, + 173, + 209, + 225, + 77, + 10, + 24, + 128, + 238, + 142, + 131, + 123, + 32, + 80, + 39, + 19, + 208, + 100, + 40, + 213, + 93, + 97, + 254, + 168, + 254, + 168, + 154, + 113, + 100, + 137, + 113, + 250, 97, 97, 192, @@ -18599,38 +18599,38 @@ pub mod inclusion_verifier { 1, 82, 127, - 32, - 185, - 199, - 233, - 166, - 194, - 158, - 49, - 233, - 22, - 73, - 98, - 222, - 154, - 4, - 120, - 170, - 151, + 18, + 201, + 130, + 70, 110, - 114, - 162, - 226, + 166, + 220, + 250, + 218, + 58, 208, - 233, - 201, - 171, - 111, - 171, - 187, - 32, - 186, - 73, + 226, + 119, + 254, + 212, + 79, + 119, + 4, + 102, + 101, + 13, + 71, + 4, + 144, + 106, + 77, + 52, + 182, + 184, + 216, + 190, + 209, 97, 97, 224, @@ -18748,38 +18748,38 @@ pub mod inclusion_verifier { 146, 80, 127, - 4, - 118, - 199, - 241, - 84, - 247, - 3, - 103, - 42, - 221, - 116, - 255, - 235, - 198, - 255, - 166, - 21, - 155, + 47, + 174, + 233, + 254, 78, - 82, - 127, - 10, - 67, - 84, + 185, + 123, + 55, + 171, + 180, + 253, + 209, 182, - 1, - 250, - 205, - 87, - 255, - 26, - 26, + 4, + 237, + 138, + 207, + 85, + 223, + 10, + 55, + 11, + 207, + 231, + 245, + 97, + 91, + 117, + 152, + 152, + 157, + 122, 97, 98, 160, @@ -18787,38 +18787,38 @@ pub mod inclusion_verifier { 1, 82, 127, - 39, - 193, - 2, - 144, - 247, - 48, - 237, - 173, - 155, + 34, + 105, + 175, + 248, + 108, + 63, + 211, + 88, + 100, + 243, + 226, 203, - 37, - 56, - 5, - 111, - 117, - 94, - 254, + 57, + 219, + 98, + 62, + 1, + 34, + 160, + 91, + 107, + 95, + 120, + 159, + 245, + 116, + 52, + 229, + 87, 169, - 36, - 176, - 166, - 157, - 134, - 213, - 201, - 200, - 51, - 113, - 126, - 115, - 14, - 40, + 12, + 35, 97, 98, 192, @@ -19124,76 +19124,77 @@ pub mod inclusion_verifier { 146, 80, 127, - 30, - 135, - 235, - 136, - 87, - 119, - 149, - 201, - 242, - 140, - 66, - 59, - 77, - 44, - 62, - 193, - 232, - 144, - 22, - 68, - 102, - 234, - 151, - 66, - 217, - 153, - 106, - 229, + 1, + 182, + 146, + 28, + 196, 195, + 90, + 3, + 214, + 150, + 231, + 84, + 186, + 192, + 110, + 219, + 168, + 24, + 116, + 153, + 37, + 45, + 152, + 218, + 126, + 125, + 64, 184, - 10, - 42, + 68, + 242, + 66, + 69, 97, 100, 96, 131, 1, 82, - 126, - 176, - 4, - 129, - 75, - 36, - 199, - 199, - 169, - 220, - 86, - 255, - 160, - 61, - 79, - 43, - 126, - 15, - 86, - 5, - 243, - 187, + 127, 24, - 222, - 221, - 249, - 230, - 57, - 120, - 171, - 188, - 86, + 29, + 250, + 41, + 72, + 137, + 96, + 26, + 156, + 197, + 116, + 72, + 217, + 102, + 185, + 204, + 96, + 231, + 121, + 90, + 179, + 54, + 210, + 7, + 141, + 196, + 58, + 235, + 136, + 132, + 132, + 251, 97, 100, 128, @@ -19311,38 +19312,38 @@ pub mod inclusion_verifier { 146, 80, 127, - 32, - 226, - 199, - 44, - 119, - 188, - 193, - 76, - 14, - 152, - 1, - 212, - 125, - 58, - 180, - 38, - 116, - 2, - 122, - 130, + 15, + 13, 205, - 224, - 149, - 95, - 27, - 23, - 229, - 202, + 170, + 111, 210, - 94, - 223, + 243, + 100, + 96, + 55, + 101, + 87, + 249, + 214, + 180, 176, + 152, + 91, + 8, + 93, + 45, + 143, + 252, + 167, + 198, + 196, + 8, + 216, + 86, + 13, + 93, + 8, 97, 101, 64, @@ -19350,38 +19351,38 @@ pub mod inclusion_verifier { 1, 82, 127, - 3, - 80, - 222, - 175, + 11, + 196, + 231, + 247, + 169, + 39, + 103, + 128, + 147, + 228, + 190, 43, - 207, - 67, - 5, - 232, - 17, - 186, - 129, - 28, - 202, - 174, - 131, + 251, + 84, + 58, + 183, 214, - 103, - 97, - 98, + 38, 126, - 10, - 78, - 173, - 225, - 32, - 92, - 28, - 176, - 207, - 205, - 120, + 233, + 67, + 232, + 237, + 19, + 54, + 154, + 59, + 60, + 158, + 242, + 55, + 121, 97, 101, 96, @@ -21600,14 +21601,14 @@ pub mod inclusion_verifier { 21, 97, 84, - 51, + 52, 87, 97, 84, - 51, + 52, 97, 83, - 244, + 245, 86, 91, 96, @@ -21628,7 +21629,7 @@ pub mod inclusion_verifier { 18, 97, 84, - 76, + 77, 87, 96, 0, @@ -21651,19 +21652,19 @@ pub mod inclusion_verifier { 21, 97, 84, - 102, + 103, 87, 97, 84, - 102, + 103, 97, 83, - 244, + 245, 86, 91, 97, 84, - 121, + 122, 96, 31, 130, @@ -21677,7 +21678,7 @@ pub mod inclusion_verifier { 1, 97, 84, - 10, + 11, 86, 91, 129, @@ -21694,7 +21695,7 @@ pub mod inclusion_verifier { 21, 97, 84, - 142, + 143, 87, 96, 0, @@ -21742,7 +21743,7 @@ pub mod inclusion_verifier { 21, 97, 84, - 190, + 191, 87, 96, 0, @@ -21766,7 +21767,7 @@ pub mod inclusion_verifier { 21, 97, 84, - 214, + 215, 87, 96, 0, @@ -21786,7 +21787,7 @@ pub mod inclusion_verifier { 18, 97, 84, - 234, + 235, 87, 96, 0, @@ -21803,14 +21804,14 @@ pub mod inclusion_verifier { 21, 97, 84, - 254, + 255, 87, 97, 84, - 254, + 255, 97, 83, - 244, + 245, 86, 91, 129, @@ -21819,13 +21820,13 @@ pub mod inclusion_verifier { 27, 97, 85, - 13, + 14, 130, 130, 1, 97, 84, - 10, + 11, 86, 91, 146, @@ -21847,7 +21848,7 @@ pub mod inclusion_verifier { 21, 97, 85, - 39, + 40, 87, 96, 0, @@ -21865,7 +21866,7 @@ pub mod inclusion_verifier { 21, 97, 85, - 69, + 70, 87, 134, 53, @@ -21881,7 +21882,7 @@ pub mod inclusion_verifier { 144, 97, 85, - 44, + 45, 86, 91, 151, @@ -21900,7 +21901,7 @@ pub mod inclusion_verifier { 21, 97, 85, - 92, + 93, 87, 96, 0, @@ -21910,14 +21911,14 @@ pub mod inclusion_verifier { 80, 97, 85, - 105, + 106, 133, 130, 134, 1, 97, 84, - 59, + 60, 86, 91, 145, @@ -22004,38 +22005,38 @@ pub mod inclusion_verifier { 34, 18, 32, - 8, - 135, - 187, - 127, - 183, - 1, - 26, - 66, - 77, - 12, - 171, - 149, - 199, - 18, - 128, - 93, - 15, - 59, - 181, - 90, + 249, + 100, + 194, + 239, + 242, + 198, 144, - 235, + 115, + 77, + 162, + 82, + 249, + 196, + 197, + 232, + 52, + 110, + 229, + 125, + 79, 120, - 23, - 161, - 84, - 32, - 158, - 9, - 76, - 142, - 184, + 8, + 64, + 230, + 54, + 248, + 60, + 242, + 21, + 39, + 143, + 103, 100, 115, 111, @@ -22114,7 +22115,7 @@ pub mod inclusion_verifier { 4, 97, 84, - 171, + 172, 86, 91, 97, @@ -22151,7 +22152,7 @@ pub mod inclusion_verifier { 99, 97, 83, - 212, + 213, 86, 91, 96, @@ -22162,7 +22163,7 @@ pub mod inclusion_verifier { 32, 97, 85, - 148, + 149, 131, 57, 129, @@ -22182,7 +22183,7 @@ pub mod inclusion_verifier { 32, 97, 85, - 116, + 117, 131, 57, 129, @@ -22208,7 +22209,7 @@ pub mod inclusion_verifier { 32, 97, 85, - 116, + 117, 131, 57, 129, @@ -22226,7 +22227,7 @@ pub mod inclusion_verifier { 32, 97, 85, - 116, + 117, 131, 57, 129, @@ -22246,7 +22247,7 @@ pub mod inclusion_verifier { 32, 97, 85, - 116, + 117, 131, 57, 129, @@ -22321,38 +22322,38 @@ pub mod inclusion_verifier { 1, 82, 127, - 10, - 161, - 41, - 79, - 48, - 119, - 74, - 3, - 146, - 207, - 2, - 79, - 65, - 72, - 11, + 23, + 175, + 181, + 151, 60, - 72, - 155, - 208, - 166, - 137, + 64, 93, - 130, - 235, - 170, - 9, - 108, - 168, - 237, - 182, + 45, + 110, + 247, + 161, 187, - 188, + 189, + 195, + 82, + 9, + 206, + 144, + 152, + 247, + 97, + 135, + 3, + 174, + 4, + 169, + 51, + 139, + 234, + 235, + 220, + 151, 96, 0, 131, @@ -25225,7 +25226,7 @@ pub mod inclusion_verifier { 32, 97, 85, - 148, + 149, 131, 57, 129, @@ -32656,7 +32657,7 @@ pub mod inclusion_verifier { 32, 97, 85, - 148, + 149, 131, 57, 129, @@ -33488,7 +33489,7 @@ pub mod inclusion_verifier { 32, 97, 85, - 148, + 149, 131, 57, 129, @@ -38304,38 +38305,38 @@ pub mod inclusion_verifier { 146, 80, 127, - 41, - 30, - 77, + 4, + 102, + 17, 180, - 60, - 38, - 7, - 38, - 185, - 28, - 83, - 89, - 23, - 168, - 1, - 189, - 224, - 107, - 231, - 247, + 75, + 180, + 244, + 205, + 143, 207, - 69, - 1, - 9, - 9, - 118, - 35, - 19, - 219, - 66, - 82, - 144, + 111, + 130, + 254, + 214, + 65, + 211, + 73, + 97, + 184, + 138, + 96, + 18, + 223, + 94, + 15, + 68, + 212, + 244, + 2, + 72, + 213, + 123, 97, 87, 64, @@ -38343,38 +38344,38 @@ pub mod inclusion_verifier { 1, 82, 127, + 37, + 184, + 67, + 83, + 169, + 44, + 55, + 187, 21, - 78, - 127, - 225, - 88, - 71, - 172, - 77, - 28, - 217, - 63, - 166, - 200, - 32, - 150, - 114, - 207, - 204, - 244, - 90, - 216, - 225, - 58, + 100, + 87, + 227, + 27, + 145, + 51, + 220, + 129, + 36, + 94, + 31, + 55, + 116, 184, - 47, - 198, - 177, - 103, - 186, - 25, - 148, - 252, + 152, + 244, + 28, + 245, + 154, + 123, + 10, + 223, + 87, 97, 87, 96, @@ -38492,38 +38493,38 @@ pub mod inclusion_verifier { 146, 80, 127, - 23, - 107, - 16, - 212, - 2, - 250, - 192, - 91, - 252, - 152, - 34, - 52, - 245, - 11, + 37, + 157, + 169, + 246, + 67, + 24, + 121, 48, - 90, - 208, - 103, + 206, + 18, + 153, + 163, + 247, + 0, + 169, + 63, + 23, + 207, + 49, + 41, + 191, + 254, + 24, + 74, + 109, 225, - 34, - 241, - 104, - 42, - 75, - 156, - 75, - 217, - 139, - 218, - 145, - 145, - 157, + 207, + 25, + 240, + 185, + 31, + 126, 97, 88, 32, @@ -38531,38 +38532,38 @@ pub mod inclusion_verifier { 1, 82, 127, - 29, - 98, - 231, - 141, - 101, - 94, - 63, - 199, - 65, - 136, - 102, - 103, - 56, + 41, 252, - 166, - 82, - 74, - 113, - 47, - 26, - 60, - 76, - 207, - 221, - 15, - 164, - 79, - 62, + 188, + 5, + 205, 44, - 132, - 156, - 81, + 1, + 82, + 179, + 235, + 33, + 232, + 253, + 1, + 160, + 11, + 199, + 151, + 128, + 242, + 18, + 129, + 89, + 136, + 115, + 251, + 149, + 93, + 186, + 35, + 95, + 126, 97, 88, 64, @@ -38680,38 +38681,38 @@ pub mod inclusion_verifier { 146, 80, 127, - 1, - 157, - 215, - 238, - 83, - 25, - 144, - 211, - 53, - 170, - 216, - 246, - 76, + 43, + 153, + 203, + 73, + 202, + 104, + 86, 38, + 160, + 140, + 0, + 158, + 164, + 66, + 252, + 137, + 90, + 47, + 134, + 204, 161, - 188, - 7, - 43, - 71, - 167, - 239, + 242, + 159, + 24, 212, - 80, - 68, - 4, - 210, - 233, - 94, - 32, - 37, - 7, - 89, + 183, + 236, + 158, + 206, + 147, + 122, + 162, 97, 89, 0, @@ -38719,38 +38720,38 @@ pub mod inclusion_verifier { 1, 82, 127, - 12, - 65, - 61, - 216, - 229, - 1, - 137, - 160, - 90, - 55, - 70, - 121, - 186, - 231, - 47, + 32, + 164, + 92, + 174, + 51, + 243, + 145, 114, - 79, - 123, - 113, - 233, - 86, - 195, - 44, + 5, + 183, + 106, + 235, + 135, + 228, + 9, + 53, 8, - 129, - 234, - 55, - 105, - 66, - 118, - 234, + 64, + 102, + 64, + 88, 131, + 155, + 29, + 183, + 111, + 135, + 97, + 219, + 80, + 250, + 200, 97, 89, 32, @@ -38868,38 +38869,38 @@ pub mod inclusion_verifier { 146, 80, 127, - 7, - 48, + 37, + 162, + 101, + 165, 121, - 157, - 91, - 254, - 193, - 206, - 252, - 90, - 175, - 252, + 66, + 34, + 54, + 87, + 179, + 49, + 108, + 145, + 59, 255, - 227, - 243, - 221, - 73, - 27, - 43, - 252, - 175, - 159, - 85, - 63, - 148, - 222, - 97, - 69, + 232, + 219, + 14, + 254, + 219, 237, - 71, - 66, - 175, + 154, + 200, + 120, + 48, + 142, + 29, + 99, + 212, + 223, + 97, + 216, 97, 89, 224, @@ -38907,38 +38908,38 @@ pub mod inclusion_verifier { 1, 82, 127, - 36, + 13, + 47, + 121, + 96, + 64, + 148, + 181, + 63, + 213, + 106, + 149, + 93, + 37, + 116, + 226, + 65, 173, - 74, - 240, - 130, - 233, - 107, - 20, - 185, - 166, - 218, - 128, - 244, - 250, - 19, - 52, + 103, + 73, + 138, + 179, + 32, 242, - 83, - 196, - 88, - 173, - 213, - 49, - 200, - 217, - 248, - 178, - 60, - 94, - 203, - 156, - 67, + 187, + 118, + 72, + 65, + 245, + 201, + 3, + 191, + 249, 97, 90, 0, @@ -39244,38 +39245,38 @@ pub mod inclusion_verifier { 146, 80, 127, - 11, - 48, - 254, + 1, + 96, + 164, + 116, + 162, + 200, + 222, + 86, 149, - 129, - 166, - 199, - 0, - 100, - 227, - 179, - 84, - 70, - 178, - 67, - 56, - 66, - 219, - 118, - 232, - 250, - 213, - 71, - 251, - 177, - 238, - 105, - 145, - 100, - 115, - 247, - 237, + 11, + 190, + 37, + 214, + 240, + 144, + 2, + 169, + 31, + 44, + 194, + 15, + 189, + 177, + 94, + 132, + 19, + 241, + 23, + 110, + 127, + 24, + 101, 97, 91, 160, @@ -39283,38 +39284,38 @@ pub mod inclusion_verifier { 1, 82, 127, - 40, - 110, + 29, 15, - 135, - 214, + 87, + 151, + 234, + 174, + 168, + 158, + 81, 25, - 227, - 254, - 218, - 200, - 163, - 215, - 68, - 46, - 243, - 79, - 182, - 86, - 108, - 233, - 175, + 228, + 38, + 13, + 181, + 99, + 96, 90, - 49, - 87, - 88, - 192, - 194, + 132, + 208, + 4, 184, - 0, - 12, - 54, - 207, + 239, + 208, + 44, + 81, + 185, + 96, + 191, + 236, + 242, + 14, + 144, 97, 91, 192, @@ -39432,38 +39433,38 @@ pub mod inclusion_verifier { 146, 80, 127, - 20, - 230, - 106, - 119, - 30, - 240, - 140, - 202, - 5, - 81, - 194, - 107, - 52, - 57, - 212, - 157, - 57, - 27, + 2, + 182, + 25, 162, - 29, - 145, - 183, - 6, - 223, - 44, - 75, - 31, - 23, - 125, - 119, - 89, - 229, + 162, + 69, + 179, + 112, + 179, + 49, + 158, + 33, + 224, + 190, + 70, + 114, + 86, + 32, + 147, + 56, + 207, + 149, + 70, + 68, + 123, + 135, + 90, + 39, + 121, + 224, + 16, + 212, 97, 92, 128, @@ -39471,38 +39472,38 @@ pub mod inclusion_verifier { 1, 82, 127, - 5, - 50, - 114, - 58, - 38, - 220, - 146, - 143, - 67, - 3, - 62, - 250, - 239, - 142, - 74, - 162, - 115, - 39, - 114, + 7, + 215, + 240, + 61, + 240, + 99, + 69, 186, - 65, - 75, - 29, - 173, - 206, + 45, + 242, + 11, + 184, + 103, + 132, 31, - 231, - 208, - 179, - 13, - 153, + 96, + 235, 210, + 93, + 170, + 181, + 170, + 250, + 19, + 221, + 193, + 65, + 49, + 22, + 153, + 104, + 2, 97, 92, 160, @@ -39620,38 +39621,38 @@ pub mod inclusion_verifier { 146, 80, 127, - 4, - 116, - 174, - 28, - 66, - 48, - 189, - 205, - 210, - 92, - 228, - 96, - 239, - 115, - 198, - 137, - 228, - 34, - 126, - 223, - 14, - 199, - 194, - 190, - 133, - 239, - 141, - 117, - 89, - 46, - 27, - 54, + 32, + 59, + 33, + 166, + 72, + 251, + 251, + 150, + 69, + 150, + 64, + 187, + 197, + 180, + 24, + 82, + 221, + 30, + 252, + 18, + 9, + 200, + 155, + 99, + 91, + 166, + 56, + 220, + 185, + 41, + 218, + 107, 97, 93, 96, @@ -39659,38 +39660,38 @@ pub mod inclusion_verifier { 1, 82, 127, - 47, - 216, - 62, - 110, - 7, - 204, - 53, - 117, - 90, 4, - 51, - 127, - 215, - 10, - 248, - 170, + 231, + 0, + 47, + 6, + 242, + 9, + 26, + 68, + 175, + 205, 49, - 252, - 116, - 222, + 30, + 147, + 194, + 47, + 70, + 221, + 159, + 50, 7, - 165, - 57, - 184, - 168, - 117, - 108, - 170, - 96, - 208, - 72, - 144, + 181, + 188, + 195, + 79, + 12, + 167, + 101, + 32, + 152, + 240, + 151, 97, 93, 128, @@ -39808,38 +39809,38 @@ pub mod inclusion_verifier { 146, 80, 127, - 28, - 111, - 147, - 174, - 247, - 149, - 245, - 37, - 200, - 181, - 27, - 203, - 2, - 52, - 187, - 52, - 89, - 66, - 204, - 49, - 120, + 32, + 171, + 116, + 144, + 180, + 47, + 63, + 123, 43, - 247, - 80, - 150, - 255, + 11, + 190, + 96, + 26, + 9, + 215, + 46, + 233, + 63, + 146, + 72, + 1, + 213, + 151, + 244, + 140, 242, - 112, - 127, - 62, - 75, - 159, + 212, + 67, + 117, + 29, + 95, + 145, 97, 94, 64, @@ -39847,38 +39848,38 @@ pub mod inclusion_verifier { 1, 82, 127, - 27, - 248, - 75, - 118, - 24, - 113, - 163, - 49, - 27, - 9, - 109, - 135, + 43, + 202, + 47, + 23, + 98, + 148, + 106, 5, - 52, - 176, - 164, - 176, - 149, - 51, + 251, + 22, + 50, + 85, 12, - 212, - 95, - 190, - 123, - 187, - 245, - 179, - 83, - 169, - 128, - 195, - 157, + 108, + 177, + 44, + 2, + 209, + 141, + 155, + 238, + 91, + 221, + 66, + 18, + 202, + 115, + 66, + 136, + 135, + 32, + 253, 97, 94, 96, @@ -39996,38 +39997,38 @@ pub mod inclusion_verifier { 146, 80, 127, - 7, - 96, - 155, - 167, - 145, + 19, + 202, + 246, + 250, + 104, + 122, + 84, + 111, + 209, + 238, + 185, + 224, + 212, + 58, + 159, + 143, + 233, + 163, 240, + 83, + 34, + 245, 237, - 93, - 86, - 144, - 145, - 4, - 28, - 128, - 9, - 116, - 184, - 68, - 11, - 197, - 192, - 249, - 125, - 155, - 98, + 218, + 27, 149, - 161, - 99, - 33, - 117, - 17, - 108, + 213, + 14, + 131, + 131, + 152, + 81, 97, 95, 32, @@ -40035,38 +40036,38 @@ pub mod inclusion_verifier { 1, 82, 127, - 28, - 219, - 4, - 18, - 243, - 142, - 26, - 25, - 83, - 26, - 251, - 209, - 201, - 96, - 49, - 70, - 231, - 189, - 28, - 52, + 34, + 226, + 118, + 135, + 117, + 226, + 217, + 111, + 216, + 146, + 92, + 72, 169, + 157, + 242, + 178, + 72, + 203, 61, - 246, - 190, - 76, - 101, - 177, - 38, - 227, - 83, - 123, - 104, + 137, + 58, + 21, + 185, + 220, + 168, + 22, + 96, + 183, + 156, + 195, + 95, + 74, 97, 95, 64, @@ -40184,38 +40185,38 @@ pub mod inclusion_verifier { 146, 80, 127, - 14, - 149, - 91, + 25, + 160, + 116, + 220, + 109, + 26, + 15, + 30, + 85, 137, - 236, 165, - 252, - 52, - 210, - 23, - 32, - 34, - 248, - 157, - 196, - 103, - 172, - 46, - 132, - 201, - 146, - 158, + 93, + 156, + 73, + 85, + 207, + 134, + 126, + 40, + 153, + 219, + 253, + 70, + 161, 28, - 224, - 194, + 39, 168, - 206, - 131, - 28, - 93, - 215, - 1, + 72, + 4, + 181, + 178, + 57, 97, 96, 0, @@ -40223,38 +40224,38 @@ pub mod inclusion_verifier { 1, 82, 127, - 7, - 207, - 146, - 154, - 220, - 230, - 20, - 176, - 136, - 200, - 44, + 38, + 177, + 18, + 251, + 89, + 160, + 184, + 117, + 131, + 62, + 82, + 249, + 81, 179, - 147, - 79, - 30, - 183, + 176, + 16, + 130, + 107, + 22, + 159, + 50, + 13, + 128, + 89, + 127, + 18, + 117, 84, - 109, - 210, - 228, - 131, - 150, - 233, - 20, - 180, - 255, - 6, - 236, - 69, - 222, - 158, - 138, + 74, + 226, + 72, + 151, 97, 96, 32, @@ -40372,38 +40373,38 @@ pub mod inclusion_verifier { 146, 80, 127, - 45, - 69, - 49, - 164, - 117, - 40, - 230, - 66, - 248, - 246, - 149, - 74, - 63, - 63, - 249, + 28, + 109, 246, + 97, + 40, + 102, 7, + 157, + 194, + 165, + 37, + 37, + 132, + 44, + 128, + 37, + 80, 46, - 56, - 211, - 14, - 46, - 13, - 16, - 141, - 28, - 172, - 32, - 29, - 75, - 104, - 77, + 181, + 168, + 145, + 60, + 86, + 8, + 54, + 196, + 188, + 122, + 178, + 220, + 51, + 78, 97, 96, 224, @@ -40411,38 +40412,38 @@ pub mod inclusion_verifier { 1, 82, 127, - 21, - 76, - 64, - 155, - 189, - 23, - 96, - 236, - 85, - 99, - 157, - 50, + 13, + 54, + 254, + 43, + 246, 213, - 129, - 124, - 147, - 153, - 229, - 115, - 178, - 42, - 143, - 221, - 165, - 247, - 7, - 201, - 185, - 222, - 29, - 76, - 166, + 130, + 145, + 237, + 3, + 90, + 31, + 9, + 9, + 4, + 99, + 149, + 2, + 33, + 58, + 36, + 73, + 34, + 125, + 21, + 110, + 227, + 248, + 246, + 55, + 46, + 44, 97, 97, 0, @@ -40560,38 +40561,38 @@ pub mod inclusion_verifier { 146, 80, 127, - 45, - 236, - 57, - 41, - 224, - 123, - 66, - 118, - 33, - 82, - 151, - 245, - 246, - 83, - 179, - 236, - 107, - 249, - 185, - 16, - 0, - 102, - 120, - 171, - 60, - 61, - 103, - 101, - 64, 1, - 214, - 218, + 173, + 209, + 225, + 77, + 10, + 24, + 128, + 238, + 142, + 131, + 123, + 32, + 80, + 39, + 19, + 208, + 100, + 40, + 213, + 93, + 97, + 254, + 168, + 254, + 168, + 154, + 113, + 100, + 137, + 113, + 250, 97, 97, 192, @@ -40599,38 +40600,38 @@ pub mod inclusion_verifier { 1, 82, 127, - 32, - 185, - 199, - 233, - 166, - 194, - 158, - 49, - 233, - 22, - 73, - 98, - 222, - 154, - 4, - 120, - 170, - 151, + 18, + 201, + 130, + 70, 110, - 114, - 162, - 226, + 166, + 220, + 250, + 218, + 58, 208, - 233, - 201, - 171, - 111, - 171, - 187, - 32, - 186, - 73, + 226, + 119, + 254, + 212, + 79, + 119, + 4, + 102, + 101, + 13, + 71, + 4, + 144, + 106, + 77, + 52, + 182, + 184, + 216, + 190, + 209, 97, 97, 224, @@ -40748,38 +40749,38 @@ pub mod inclusion_verifier { 146, 80, 127, - 4, - 118, - 199, - 241, - 84, - 247, - 3, - 103, - 42, - 221, - 116, - 255, - 235, - 198, - 255, - 166, - 21, - 155, + 47, + 174, + 233, + 254, 78, - 82, - 127, - 10, - 67, - 84, + 185, + 123, + 55, + 171, + 180, + 253, + 209, 182, - 1, - 250, - 205, - 87, - 255, - 26, - 26, + 4, + 237, + 138, + 207, + 85, + 223, + 10, + 55, + 11, + 207, + 231, + 245, + 97, + 91, + 117, + 152, + 152, + 157, + 122, 97, 98, 160, @@ -40787,38 +40788,38 @@ pub mod inclusion_verifier { 1, 82, 127, - 39, - 193, - 2, - 144, - 247, - 48, - 237, - 173, - 155, + 34, + 105, + 175, + 248, + 108, + 63, + 211, + 88, + 100, + 243, + 226, 203, - 37, - 56, - 5, - 111, - 117, - 94, - 254, + 57, + 219, + 98, + 62, + 1, + 34, + 160, + 91, + 107, + 95, + 120, + 159, + 245, + 116, + 52, + 229, + 87, 169, - 36, - 176, - 166, - 157, - 134, - 213, - 201, - 200, - 51, - 113, - 126, - 115, - 14, - 40, + 12, + 35, 97, 98, 192, @@ -41124,76 +41125,77 @@ pub mod inclusion_verifier { 146, 80, 127, - 30, - 135, - 235, - 136, - 87, - 119, - 149, - 201, - 242, - 140, - 66, - 59, - 77, - 44, - 62, - 193, - 232, - 144, - 22, - 68, - 102, - 234, - 151, - 66, - 217, - 153, - 106, - 229, + 1, + 182, + 146, + 28, + 196, 195, + 90, + 3, + 214, + 150, + 231, + 84, + 186, + 192, + 110, + 219, + 168, + 24, + 116, + 153, + 37, + 45, + 152, + 218, + 126, + 125, + 64, 184, - 10, - 42, + 68, + 242, + 66, + 69, 97, 100, 96, 131, 1, 82, - 126, - 176, - 4, - 129, - 75, - 36, - 199, - 199, - 169, - 220, - 86, - 255, - 160, - 61, - 79, - 43, - 126, - 15, - 86, - 5, - 243, - 187, + 127, 24, - 222, - 221, - 249, - 230, - 57, - 120, - 171, - 188, - 86, + 29, + 250, + 41, + 72, + 137, + 96, + 26, + 156, + 197, + 116, + 72, + 217, + 102, + 185, + 204, + 96, + 231, + 121, + 90, + 179, + 54, + 210, + 7, + 141, + 196, + 58, + 235, + 136, + 132, + 132, + 251, 97, 100, 128, @@ -41311,38 +41313,38 @@ pub mod inclusion_verifier { 146, 80, 127, - 32, - 226, - 199, - 44, - 119, - 188, - 193, - 76, - 14, - 152, - 1, - 212, - 125, - 58, - 180, - 38, - 116, - 2, - 122, - 130, + 15, + 13, 205, - 224, - 149, - 95, - 27, - 23, - 229, - 202, + 170, + 111, 210, - 94, - 223, + 243, + 100, + 96, + 55, + 101, + 87, + 249, + 214, + 180, 176, + 152, + 91, + 8, + 93, + 45, + 143, + 252, + 167, + 198, + 196, + 8, + 216, + 86, + 13, + 93, + 8, 97, 101, 64, @@ -41350,38 +41352,38 @@ pub mod inclusion_verifier { 1, 82, 127, - 3, - 80, - 222, - 175, + 11, + 196, + 231, + 247, + 169, + 39, + 103, + 128, + 147, + 228, + 190, 43, - 207, - 67, - 5, - 232, - 17, - 186, - 129, - 28, - 202, - 174, - 131, + 251, + 84, + 58, + 183, 214, - 103, - 97, - 98, + 38, 126, - 10, - 78, - 173, - 225, - 32, - 92, - 28, - 176, - 207, - 205, - 120, + 233, + 67, + 232, + 237, + 19, + 54, + 154, + 59, + 60, + 158, + 242, + 55, + 121, 97, 101, 96, @@ -43600,14 +43602,14 @@ pub mod inclusion_verifier { 21, 97, 84, - 51, + 52, 87, 97, 84, - 51, + 52, 97, 83, - 244, + 245, 86, 91, 96, @@ -43628,7 +43630,7 @@ pub mod inclusion_verifier { 18, 97, 84, - 76, + 77, 87, 96, 0, @@ -43651,19 +43653,19 @@ pub mod inclusion_verifier { 21, 97, 84, - 102, + 103, 87, 97, 84, - 102, + 103, 97, 83, - 244, + 245, 86, 91, 97, 84, - 121, + 122, 96, 31, 130, @@ -43677,7 +43679,7 @@ pub mod inclusion_verifier { 1, 97, 84, - 10, + 11, 86, 91, 129, @@ -43694,7 +43696,7 @@ pub mod inclusion_verifier { 21, 97, 84, - 142, + 143, 87, 96, 0, @@ -43742,7 +43744,7 @@ pub mod inclusion_verifier { 21, 97, 84, - 190, + 191, 87, 96, 0, @@ -43766,7 +43768,7 @@ pub mod inclusion_verifier { 21, 97, 84, - 214, + 215, 87, 96, 0, @@ -43786,7 +43788,7 @@ pub mod inclusion_verifier { 18, 97, 84, - 234, + 235, 87, 96, 0, @@ -43803,14 +43805,14 @@ pub mod inclusion_verifier { 21, 97, 84, - 254, + 255, 87, 97, 84, - 254, + 255, 97, 83, - 244, + 245, 86, 91, 129, @@ -43819,13 +43821,13 @@ pub mod inclusion_verifier { 27, 97, 85, - 13, + 14, 130, 130, 1, 97, 84, - 10, + 11, 86, 91, 146, @@ -43847,7 +43849,7 @@ pub mod inclusion_verifier { 21, 97, 85, - 39, + 40, 87, 96, 0, @@ -43865,7 +43867,7 @@ pub mod inclusion_verifier { 21, 97, 85, - 69, + 70, 87, 134, 53, @@ -43881,7 +43883,7 @@ pub mod inclusion_verifier { 144, 97, 85, - 44, + 45, 86, 91, 151, @@ -43900,7 +43902,7 @@ pub mod inclusion_verifier { 21, 97, 85, - 92, + 93, 87, 96, 0, @@ -43910,14 +43912,14 @@ pub mod inclusion_verifier { 80, 97, 85, - 105, + 106, 133, 130, 134, 1, 97, 84, - 59, + 60, 86, 91, 145, @@ -44004,38 +44006,38 @@ pub mod inclusion_verifier { 34, 18, 32, - 8, - 135, - 187, - 127, - 183, - 1, - 26, - 66, - 77, - 12, - 171, - 149, - 199, - 18, - 128, - 93, - 15, - 59, - 181, - 90, + 249, + 100, + 194, + 239, + 242, + 198, 144, - 235, + 115, + 77, + 162, + 82, + 249, + 196, + 197, + 232, + 52, + 110, + 229, + 125, + 79, 120, - 23, - 161, - 84, - 32, - 158, - 9, - 76, - 142, - 184, + 8, + 64, + 230, + 54, + 248, + 60, + 242, + 21, + 39, + 143, + 103, 100, 115, 111, diff --git a/backend/src/tests.rs b/backend/src/tests.rs index ec0f6173..753153ea 100644 --- a/backend/src/tests.rs +++ b/backend/src/tests.rs @@ -1,7 +1,7 @@ use std::{sync::Arc, time::Duration}; use ethers::{ - prelude::{ContractFactory, SignerMiddleware}, + prelude::SignerMiddleware, providers::{Http, Middleware, Provider}, signers::{LocalWallet, Signer}, types::{H160, U256}, @@ -10,7 +10,6 @@ use ethers::{ use tokio::time; use crate::contracts::generated::{inclusion_verifier::InclusionVerifier, summa_contract::Summa}; -use crate::contracts::mock::mock_erc20::{MockERC20, MOCKERC20_ABI, MOCKERC20_BYTECODE}; // Setup test environment on the anvil instance pub async fn initialize_test_env( @@ -57,26 +56,6 @@ pub async fn initialize_test_env( .await; } - // Mock ERC20 contract deployment - // Creating a factory to deploy a mock ERC20 contract - let factory = ContractFactory::new( - MOCKERC20_ABI.to_owned(), - MOCKERC20_BYTECODE.to_owned(), - Arc::clone(&client), - ); - - // Deploy Mock ERC20 contract - let mock_erc20_deployment = factory.deploy(()).unwrap().send().await.unwrap(); - - // Creating an interface for the deployed mock ERC20 contract - let mock_erc20 = MockERC20::new(mock_erc20_deployment.address(), Arc::clone(&client)); - - // Mint some token to `cex_addr_2` - let mint_call = mock_erc20.mint(cex_addr_2, U256::from(556863)); - assert!(mint_call.send().await.is_ok()); - - time::sleep(Duration::from_millis(500)).await; - if block_time != None { time::sleep(Duration::from_secs(block_time.unwrap())).await; }; @@ -269,7 +248,7 @@ mod test { liability_commitment_logs[0], LiabilitiesCommitmentSubmittedFilter { timestamp: U256::from(1), - mst_root: "0x2E021D9BF99C5BD7267488B6A7A5CF5F7D00222A41B6A9B971899C44089E0C5" + mst_root: "0x18d6ab953235a811edffa4cead74ea045e7cd2085771a2269d59dca054c955b1" .parse() .unwrap(), root_balances: vec![U256::from(556862), U256::from(556862)], diff --git a/contracts/src/InclusionVerifier.sol b/contracts/src/InclusionVerifier.sol index 43f06609..cf3289a9 100644 --- a/contracts/src/InclusionVerifier.sol +++ b/contracts/src/InclusionVerifier.sol @@ -8,4 +8,4 @@ ) public view returns (bool) { bool success = true; bytes32[912] memory transcript; - assembly { let f_p := 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47 let f_q := 0x30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001 function validate_ec_point(x, y) -> valid { { let x_lt_p := lt(x, 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47) let y_lt_p := lt(y, 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47) valid := and(x_lt_p, y_lt_p) } { let y_square := mulmod(y, y, 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47) let x_square := mulmod(x, x, 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47) let x_cube := mulmod(x_square, x, 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47) let x_cube_plus_3 := addmod(x_cube, 3, 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47) let is_affine := eq(x_cube_plus_3, y_square) valid := and(valid, is_affine) } } mstore(add(transcript, 0x20), mod(mload(add(pubInputs, 0x20)), f_q))mstore(add(transcript, 0x40), mod(mload(add(pubInputs, 0x40)), f_q))mstore(add(transcript, 0x60), mod(mload(add(pubInputs, 0x60)), f_q))mstore(add(transcript, 0x80), mod(mload(add(pubInputs, 0x80)), f_q))mstore(add(transcript, 0x0), 4807875969802051575329349424543462078160599761356767644666470846188645432252) { let x := mload(add(proof, 0x20)) mstore(add(transcript, 0xa0), x) let y := mload(add(proof, 0x40)) mstore(add(transcript, 0xc0), y) success := and(validate_ec_point(x, y), success) } { let x := mload(add(proof, 0x60)) mstore(add(transcript, 0xe0), x) let y := mload(add(proof, 0x80)) mstore(add(transcript, 0x100), y) success := and(validate_ec_point(x, y), success) } { let x := mload(add(proof, 0xa0)) mstore(add(transcript, 0x120), x) let y := mload(add(proof, 0xc0)) mstore(add(transcript, 0x140), y) success := and(validate_ec_point(x, y), success) }mstore(add(transcript, 0x160), keccak256(add(transcript, 0x0), 352)){ let hash := mload(add(transcript, 0x160)) mstore(add(transcript, 0x180), mod(hash, f_q)) mstore(add(transcript, 0x1a0), hash) } { let x := mload(add(proof, 0xe0)) mstore(add(transcript, 0x1c0), x) let y := mload(add(proof, 0x100)) mstore(add(transcript, 0x1e0), y) success := and(validate_ec_point(x, y), success) } { let x := mload(add(proof, 0x120)) mstore(add(transcript, 0x200), x) let y := mload(add(proof, 0x140)) mstore(add(transcript, 0x220), y) success := and(validate_ec_point(x, y), success) }mstore(add(transcript, 0x240), keccak256(add(transcript, 0x1a0), 160)){ let hash := mload(add(transcript, 0x240)) mstore(add(transcript, 0x260), mod(hash, f_q)) mstore(add(transcript, 0x280), hash) }mstore8(add(transcript, 0x2a0), 1)mstore(add(transcript, 0x2a0), keccak256(add(transcript, 0x280), 33)){ let hash := mload(add(transcript, 0x2a0)) mstore(add(transcript, 0x2c0), mod(hash, f_q)) mstore(add(transcript, 0x2e0), hash) } { let x := mload(add(proof, 0x160)) mstore(add(transcript, 0x300), x) let y := mload(add(proof, 0x180)) mstore(add(transcript, 0x320), y) success := and(validate_ec_point(x, y), success) } { let x := mload(add(proof, 0x1a0)) mstore(add(transcript, 0x340), x) let y := mload(add(proof, 0x1c0)) mstore(add(transcript, 0x360), y) success := and(validate_ec_point(x, y), success) } { let x := mload(add(proof, 0x1e0)) mstore(add(transcript, 0x380), x) let y := mload(add(proof, 0x200)) mstore(add(transcript, 0x3a0), y) success := and(validate_ec_point(x, y), success) } { let x := mload(add(proof, 0x220)) mstore(add(transcript, 0x3c0), x) let y := mload(add(proof, 0x240)) mstore(add(transcript, 0x3e0), y) success := and(validate_ec_point(x, y), success) }mstore(add(transcript, 0x400), keccak256(add(transcript, 0x2e0), 288)){ let hash := mload(add(transcript, 0x400)) mstore(add(transcript, 0x420), mod(hash, f_q)) mstore(add(transcript, 0x440), hash) } { let x := mload(add(proof, 0x260)) mstore(add(transcript, 0x460), x) let y := mload(add(proof, 0x280)) mstore(add(transcript, 0x480), y) success := and(validate_ec_point(x, y), success) } { let x := mload(add(proof, 0x2a0)) mstore(add(transcript, 0x4a0), x) let y := mload(add(proof, 0x2c0)) mstore(add(transcript, 0x4c0), y) success := and(validate_ec_point(x, y), success) } { let x := mload(add(proof, 0x2e0)) mstore(add(transcript, 0x4e0), x) let y := mload(add(proof, 0x300)) mstore(add(transcript, 0x500), y) success := and(validate_ec_point(x, y), success) } { let x := mload(add(proof, 0x320)) mstore(add(transcript, 0x520), x) let y := mload(add(proof, 0x340)) mstore(add(transcript, 0x540), y) success := and(validate_ec_point(x, y), success) } { let x := mload(add(proof, 0x360)) mstore(add(transcript, 0x560), x) let y := mload(add(proof, 0x380)) mstore(add(transcript, 0x580), y) success := and(validate_ec_point(x, y), success) }mstore(add(transcript, 0x5a0), keccak256(add(transcript, 0x440), 352)){ let hash := mload(add(transcript, 0x5a0)) mstore(add(transcript, 0x5c0), mod(hash, f_q)) mstore(add(transcript, 0x5e0), hash) }mstore(add(transcript, 0x600), mod(mload(add(proof, 0x3a0)), f_q))mstore(add(transcript, 0x620), mod(mload(add(proof, 0x3c0)), f_q))mstore(add(transcript, 0x640), mod(mload(add(proof, 0x3e0)), f_q))mstore(add(transcript, 0x660), mod(mload(add(proof, 0x400)), f_q))mstore(add(transcript, 0x680), mod(mload(add(proof, 0x420)), f_q))mstore(add(transcript, 0x6a0), mod(mload(add(proof, 0x440)), f_q))mstore(add(transcript, 0x6c0), mod(mload(add(proof, 0x460)), f_q))mstore(add(transcript, 0x6e0), mod(mload(add(proof, 0x480)), f_q))mstore(add(transcript, 0x700), mod(mload(add(proof, 0x4a0)), f_q))mstore(add(transcript, 0x720), mod(mload(add(proof, 0x4c0)), f_q))mstore(add(transcript, 0x740), mod(mload(add(proof, 0x4e0)), f_q))mstore(add(transcript, 0x760), mod(mload(add(proof, 0x500)), f_q))mstore(add(transcript, 0x780), mod(mload(add(proof, 0x520)), f_q))mstore(add(transcript, 0x7a0), mod(mload(add(proof, 0x540)), f_q))mstore(add(transcript, 0x7c0), mod(mload(add(proof, 0x560)), f_q))mstore(add(transcript, 0x7e0), mod(mload(add(proof, 0x580)), f_q))mstore(add(transcript, 0x800), mod(mload(add(proof, 0x5a0)), f_q))mstore(add(transcript, 0x820), mod(mload(add(proof, 0x5c0)), f_q))mstore(add(transcript, 0x840), mod(mload(add(proof, 0x5e0)), f_q))mstore(add(transcript, 0x860), mod(mload(add(proof, 0x600)), f_q))mstore(add(transcript, 0x880), mod(mload(add(proof, 0x620)), f_q))mstore(add(transcript, 0x8a0), mod(mload(add(proof, 0x640)), f_q))mstore(add(transcript, 0x8c0), mod(mload(add(proof, 0x660)), f_q))mstore(add(transcript, 0x8e0), mod(mload(add(proof, 0x680)), f_q))mstore(add(transcript, 0x900), mod(mload(add(proof, 0x6a0)), f_q))mstore(add(transcript, 0x920), mod(mload(add(proof, 0x6c0)), f_q))mstore(add(transcript, 0x940), mod(mload(add(proof, 0x6e0)), f_q))mstore(add(transcript, 0x960), mod(mload(add(proof, 0x700)), f_q))mstore(add(transcript, 0x980), mod(mload(add(proof, 0x720)), f_q))mstore(add(transcript, 0x9a0), mod(mload(add(proof, 0x740)), f_q))mstore(add(transcript, 0x9c0), mod(mload(add(proof, 0x760)), f_q))mstore(add(transcript, 0x9e0), mod(mload(add(proof, 0x780)), f_q))mstore(add(transcript, 0xa00), mod(mload(add(proof, 0x7a0)), f_q))mstore(add(transcript, 0xa20), mod(mload(add(proof, 0x7c0)), f_q))mstore(add(transcript, 0xa40), mod(mload(add(proof, 0x7e0)), f_q))mstore(add(transcript, 0xa60), keccak256(add(transcript, 0x5e0), 1152)){ let hash := mload(add(transcript, 0xa60)) mstore(add(transcript, 0xa80), mod(hash, f_q)) mstore(add(transcript, 0xaa0), hash) }mstore8(add(transcript, 0xac0), 1)mstore(add(transcript, 0xac0), keccak256(add(transcript, 0xaa0), 33)){ let hash := mload(add(transcript, 0xac0)) mstore(add(transcript, 0xae0), mod(hash, f_q)) mstore(add(transcript, 0xb00), hash) } { let x := mload(add(proof, 0x800)) mstore(add(transcript, 0xb20), x) let y := mload(add(proof, 0x820)) mstore(add(transcript, 0xb40), y) success := and(validate_ec_point(x, y), success) }mstore(add(transcript, 0xb60), keccak256(add(transcript, 0xb00), 96)){ let hash := mload(add(transcript, 0xb60)) mstore(add(transcript, 0xb80), mod(hash, f_q)) mstore(add(transcript, 0xba0), hash) } { let x := mload(add(proof, 0x840)) mstore(add(transcript, 0xbc0), x) let y := mload(add(proof, 0x860)) mstore(add(transcript, 0xbe0), y) success := and(validate_ec_point(x, y), success) }mstore(add(transcript, 0xc00), mulmod(mload(add(transcript, 0x5c0)), mload(add(transcript, 0x5c0)), f_q))mstore(add(transcript, 0xc20), mulmod(mload(add(transcript, 0xc00)), mload(add(transcript, 0xc00)), f_q))mstore(add(transcript, 0xc40), mulmod(mload(add(transcript, 0xc20)), mload(add(transcript, 0xc20)), f_q))mstore(add(transcript, 0xc60), mulmod(mload(add(transcript, 0xc40)), mload(add(transcript, 0xc40)), f_q))mstore(add(transcript, 0xc80), mulmod(mload(add(transcript, 0xc60)), mload(add(transcript, 0xc60)), f_q))mstore(add(transcript, 0xca0), mulmod(mload(add(transcript, 0xc80)), mload(add(transcript, 0xc80)), f_q))mstore(add(transcript, 0xcc0), mulmod(mload(add(transcript, 0xca0)), mload(add(transcript, 0xca0)), f_q))mstore(add(transcript, 0xce0), mulmod(mload(add(transcript, 0xcc0)), mload(add(transcript, 0xcc0)), f_q))mstore(add(transcript, 0xd00), mulmod(mload(add(transcript, 0xce0)), mload(add(transcript, 0xce0)), f_q))mstore(add(transcript, 0xd20), mulmod(mload(add(transcript, 0xd00)), mload(add(transcript, 0xd00)), f_q))mstore(add(transcript, 0xd40), mulmod(mload(add(transcript, 0xd20)), mload(add(transcript, 0xd20)), f_q))mstore(add(transcript, 0xd60), addmod(mload(add(transcript, 0xd40)), 21888242871839275222246405745257275088548364400416034343698204186575808495616, f_q))mstore(add(transcript, 0xd80), mulmod(mload(add(transcript, 0xd60)), 21877555253249509951141793242451973684696534144361143701928820297812832026625, f_q))mstore(add(transcript, 0xda0), mulmod(mload(add(transcript, 0xd80)), 15699029810934084314820646074566828280617789951162923449200398535581206172418, f_q))mstore(add(transcript, 0xdc0), addmod(mload(add(transcript, 0x5c0)), 6189213060905190907425759670690446807930574449253110894497805650994602323199, f_q))mstore(add(transcript, 0xde0), mulmod(mload(add(transcript, 0xd80)), 16553167948716468074998850291160946772606011499093267774599468837293218566225, f_q))mstore(add(transcript, 0xe00), addmod(mload(add(transcript, 0x5c0)), 5335074923122807147247555454096328315942352901322766569098735349282589929392, f_q))mstore(add(transcript, 0xe20), mulmod(mload(add(transcript, 0xd80)), 4260969412351770314333984243767775737437927068151180798236715529158398853173, f_q))mstore(add(transcript, 0xe40), addmod(mload(add(transcript, 0x5c0)), 17627273459487504907912421501489499351110437332264853545461488657417409642444, f_q))mstore(add(transcript, 0xe60), mulmod(mload(add(transcript, 0xd80)), 18302882236472339419631414285403968768409802182737928837767912484847322191909, f_q))mstore(add(transcript, 0xe80), addmod(mload(add(transcript, 0x5c0)), 3585360635366935802614991459853306320138562217678105505930291701728486303708, f_q))mstore(add(transcript, 0xea0), mulmod(mload(add(transcript, 0xd80)), 4925592601992654644734291590386747644864797672605745962807370354577123815907, f_q))mstore(add(transcript, 0xec0), addmod(mload(add(transcript, 0x5c0)), 16962650269846620577512114154870527443683566727810288380890833831998684679710, f_q))mstore(add(transcript, 0xee0), mulmod(mload(add(transcript, 0xd80)), 19444693496467964793333684482470811869395409953158764080291550423779334624794, f_q))mstore(add(transcript, 0xf00), addmod(mload(add(transcript, 0x5c0)), 2443549375371310428912721262786463219152954447257270263406653762796473870823, f_q))mstore(add(transcript, 0xf20), mulmod(mload(add(transcript, 0xd80)), 1, f_q))mstore(add(transcript, 0xf40), addmod(mload(add(transcript, 0x5c0)), 21888242871839275222246405745257275088548364400416034343698204186575808495616, f_q))mstore(add(transcript, 0xf60), mulmod(mload(add(transcript, 0xd80)), 9396103202274256930945606623206526900461945684265495839012435492634193195103, f_q))mstore(add(transcript, 0xf80), addmod(mload(add(transcript, 0x5c0)), 12492139669565018291300799122050748188086418716150538504685768693941615300514, f_q))mstore(add(transcript, 0xfa0), mulmod(mload(add(transcript, 0xd80)), 19380560087801265747114831706136320509424814679569278834391540198888293317501, f_q))mstore(add(transcript, 0xfc0), addmod(mload(add(transcript, 0x5c0)), 2507682784038009475131574039120954579123549720846755509306663987687515178116, f_q))mstore(add(transcript, 0xfe0), mulmod(mload(add(transcript, 0xd80)), 11322573621548282883955256084347882816245615123967859588024989498742209856615, f_q))mstore(add(transcript, 0x1000), addmod(mload(add(transcript, 0x5c0)), 10565669250290992338291149660909392272302749276448174755673214687833598639002, f_q)){ let prod := mload(add(transcript, 0xdc0)) prod := mulmod(mload(add(transcript, 0xe00)), prod, f_q) mstore(add(transcript, 0x1020), prod) prod := mulmod(mload(add(transcript, 0xe40)), prod, f_q) mstore(add(transcript, 0x1040), prod) prod := mulmod(mload(add(transcript, 0xe80)), prod, f_q) mstore(add(transcript, 0x1060), prod) prod := mulmod(mload(add(transcript, 0xec0)), prod, f_q) mstore(add(transcript, 0x1080), prod) prod := mulmod(mload(add(transcript, 0xf00)), prod, f_q) mstore(add(transcript, 0x10a0), prod) prod := mulmod(mload(add(transcript, 0xf40)), prod, f_q) mstore(add(transcript, 0x10c0), prod) prod := mulmod(mload(add(transcript, 0xf80)), prod, f_q) mstore(add(transcript, 0x10e0), prod) prod := mulmod(mload(add(transcript, 0xfc0)), prod, f_q) mstore(add(transcript, 0x1100), prod) prod := mulmod(mload(add(transcript, 0x1000)), prod, f_q) mstore(add(transcript, 0x1120), prod) prod := mulmod(mload(add(transcript, 0xd60)), prod, f_q) mstore(add(transcript, 0x1140), prod) }mstore(add(transcript, 0x1180), 32)mstore(add(transcript, 0x11a0), 32)mstore(add(transcript, 0x11c0), 32)mstore(add(transcript, 0x11e0), mload(add(transcript, 0x1140)))mstore(add(transcript, 0x1200), 21888242871839275222246405745257275088548364400416034343698204186575808495615)mstore(add(transcript, 0x1220), 21888242871839275222246405745257275088548364400416034343698204186575808495617)success := and(eq(staticcall(gas(), 0x5, add(transcript, 0x1180), 0xc0, add(transcript, 0x1160), 0x20), 1), success){ let inv := mload(add(transcript, 0x1160)) let v v := mload(add(transcript, 0xd60)) mstore(add(transcript, 0xd60), mulmod(mload(add(transcript, 0x1120)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x1000)) mstore(add(transcript, 0x1000), mulmod(mload(add(transcript, 0x1100)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0xfc0)) mstore(add(transcript, 0xfc0), mulmod(mload(add(transcript, 0x10e0)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0xf80)) mstore(add(transcript, 0xf80), mulmod(mload(add(transcript, 0x10c0)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0xf40)) mstore(add(transcript, 0xf40), mulmod(mload(add(transcript, 0x10a0)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0xf00)) mstore(add(transcript, 0xf00), mulmod(mload(add(transcript, 0x1080)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0xec0)) mstore(add(transcript, 0xec0), mulmod(mload(add(transcript, 0x1060)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0xe80)) mstore(add(transcript, 0xe80), mulmod(mload(add(transcript, 0x1040)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0xe40)) mstore(add(transcript, 0xe40), mulmod(mload(add(transcript, 0x1020)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0xe00)) mstore(add(transcript, 0xe00), mulmod(mload(add(transcript, 0xdc0)), inv, f_q)) inv := mulmod(v, inv, f_q) mstore(add(transcript, 0xdc0), inv) }mstore(add(transcript, 0x1240), mulmod(mload(add(transcript, 0xda0)), mload(add(transcript, 0xdc0)), f_q))mstore(add(transcript, 0x1260), mulmod(mload(add(transcript, 0xde0)), mload(add(transcript, 0xe00)), f_q))mstore(add(transcript, 0x1280), mulmod(mload(add(transcript, 0xe20)), mload(add(transcript, 0xe40)), f_q))mstore(add(transcript, 0x12a0), mulmod(mload(add(transcript, 0xe60)), mload(add(transcript, 0xe80)), f_q))mstore(add(transcript, 0x12c0), mulmod(mload(add(transcript, 0xea0)), mload(add(transcript, 0xec0)), f_q))mstore(add(transcript, 0x12e0), mulmod(mload(add(transcript, 0xee0)), mload(add(transcript, 0xf00)), f_q))mstore(add(transcript, 0x1300), mulmod(mload(add(transcript, 0xf20)), mload(add(transcript, 0xf40)), f_q))mstore(add(transcript, 0x1320), mulmod(mload(add(transcript, 0xf60)), mload(add(transcript, 0xf80)), f_q))mstore(add(transcript, 0x1340), mulmod(mload(add(transcript, 0xfa0)), mload(add(transcript, 0xfc0)), f_q))mstore(add(transcript, 0x1360), mulmod(mload(add(transcript, 0xfe0)), mload(add(transcript, 0x1000)), f_q)){ let result := mulmod(mload(add(transcript, 0x1300)), mload(add(transcript, 0x20)), f_q)result := addmod(mulmod(mload(add(transcript, 0x1320)), mload(add(transcript, 0x40)), f_q), result, f_q)result := addmod(mulmod(mload(add(transcript, 0x1340)), mload(add(transcript, 0x60)), f_q), result, f_q)result := addmod(mulmod(mload(add(transcript, 0x1360)), mload(add(transcript, 0x80)), f_q), result, f_q)mstore(add(transcript, 0x1380), result) }mstore(add(transcript, 0x13a0), addmod(mload(add(transcript, 0x600)), mload(add(transcript, 0x720)), f_q))mstore(add(transcript, 0x13c0), mulmod(mload(add(transcript, 0x13a0)), mload(add(transcript, 0x13a0)), f_q))mstore(add(transcript, 0x13e0), mulmod(mload(add(transcript, 0x13c0)), mload(add(transcript, 0x13c0)), f_q))mstore(add(transcript, 0x1400), mulmod(mload(add(transcript, 0x13a0)), mload(add(transcript, 0x13e0)), f_q))mstore(add(transcript, 0x1420), mulmod(mload(add(transcript, 0x1400)), 2910766817845651019878574839501801340070030115151021261302834310722729507541, f_q))mstore(add(transcript, 0x1440), addmod(mload(add(transcript, 0x620)), mload(add(transcript, 0x740)), f_q))mstore(add(transcript, 0x1460), mulmod(mload(add(transcript, 0x1440)), mload(add(transcript, 0x1440)), f_q))mstore(add(transcript, 0x1480), mulmod(mload(add(transcript, 0x1460)), mload(add(transcript, 0x1460)), f_q))mstore(add(transcript, 0x14a0), mulmod(mload(add(transcript, 0x1440)), mload(add(transcript, 0x1480)), f_q))mstore(add(transcript, 0x14c0), mulmod(mload(add(transcript, 0x14a0)), 19727366863391167538122140361473584127147630672623100827934084310230022599144, f_q))mstore(add(transcript, 0x14e0), addmod(mload(add(transcript, 0x1420)), mload(add(transcript, 0x14c0)), f_q))mstore(add(transcript, 0x1500), addmod(mload(add(transcript, 0x14e0)), sub(f_q, mload(add(transcript, 0x640))), f_q))mstore(add(transcript, 0x1520), mulmod(mload(add(transcript, 0x1500)), mload(add(transcript, 0x7c0)), f_q))mstore(add(transcript, 0x1540), mulmod(mload(add(transcript, 0x420)), mload(add(transcript, 0x1520)), f_q))mstore(add(transcript, 0x1560), mulmod(mload(add(transcript, 0x1400)), 5776684794125549462448597414050232243778680302179439492664047328281728356345, f_q))mstore(add(transcript, 0x1580), mulmod(mload(add(transcript, 0x14a0)), 8348174920934122550483593999453880006756108121341067172388445916328941978568, f_q))mstore(add(transcript, 0x15a0), addmod(mload(add(transcript, 0x1560)), mload(add(transcript, 0x1580)), f_q))mstore(add(transcript, 0x15c0), addmod(mload(add(transcript, 0x15a0)), sub(f_q, mload(add(transcript, 0x660))), f_q))mstore(add(transcript, 0x15e0), mulmod(mload(add(transcript, 0x15c0)), mload(add(transcript, 0x7c0)), f_q))mstore(add(transcript, 0x1600), addmod(mload(add(transcript, 0x1540)), mload(add(transcript, 0x15e0)), f_q))mstore(add(transcript, 0x1620), mulmod(mload(add(transcript, 0x420)), mload(add(transcript, 0x1600)), f_q))mstore(add(transcript, 0x1640), addmod(mload(add(transcript, 0x1400)), sub(f_q, mload(add(transcript, 0x680))), f_q))mstore(add(transcript, 0x1660), mulmod(mload(add(transcript, 0x1640)), mload(add(transcript, 0x7e0)), f_q))mstore(add(transcript, 0x1680), addmod(mload(add(transcript, 0x1620)), mload(add(transcript, 0x1660)), f_q))mstore(add(transcript, 0x16a0), mulmod(mload(add(transcript, 0x420)), mload(add(transcript, 0x1680)), f_q))mstore(add(transcript, 0x16c0), mulmod(mload(add(transcript, 0x680)), 2910766817845651019878574839501801340070030115151021261302834310722729507541, f_q))mstore(add(transcript, 0x16e0), mulmod(mload(add(transcript, 0x1440)), 19727366863391167538122140361473584127147630672623100827934084310230022599144, f_q))mstore(add(transcript, 0x1700), addmod(mload(add(transcript, 0x16c0)), mload(add(transcript, 0x16e0)), f_q))mstore(add(transcript, 0x1720), addmod(mload(add(transcript, 0x1700)), mload(add(transcript, 0x6e0)), f_q))mstore(add(transcript, 0x1740), mulmod(mload(add(transcript, 0x1720)), mload(add(transcript, 0x1720)), f_q))mstore(add(transcript, 0x1760), mulmod(mload(add(transcript, 0x1740)), mload(add(transcript, 0x1740)), f_q))mstore(add(transcript, 0x1780), mulmod(mload(add(transcript, 0x1720)), mload(add(transcript, 0x1760)), f_q))mstore(add(transcript, 0x17a0), mulmod(mload(add(transcript, 0x640)), 8897705321156975119607866206188469715432233408805434913352778521345836531302, f_q))mstore(add(transcript, 0x17c0), mulmod(mload(add(transcript, 0x660)), 13897810991298242824030978581179475767377101082166056046492926701399149797630, f_q))mstore(add(transcript, 0x17e0), addmod(mload(add(transcript, 0x17a0)), mload(add(transcript, 0x17c0)), f_q))mstore(add(transcript, 0x1800), addmod(mload(add(transcript, 0x1780)), sub(f_q, mload(add(transcript, 0x17e0))), f_q))mstore(add(transcript, 0x1820), mulmod(mload(add(transcript, 0x1800)), mload(add(transcript, 0x7e0)), f_q))mstore(add(transcript, 0x1840), addmod(mload(add(transcript, 0x16a0)), mload(add(transcript, 0x1820)), f_q))mstore(add(transcript, 0x1860), mulmod(mload(add(transcript, 0x420)), mload(add(transcript, 0x1840)), f_q))mstore(add(transcript, 0x1880), mulmod(mload(add(transcript, 0x680)), 5776684794125549462448597414050232243778680302179439492664047328281728356345, f_q))mstore(add(transcript, 0x18a0), mulmod(mload(add(transcript, 0x1440)), 8348174920934122550483593999453880006756108121341067172388445916328941978568, f_q))mstore(add(transcript, 0x18c0), addmod(mload(add(transcript, 0x1880)), mload(add(transcript, 0x18a0)), f_q))mstore(add(transcript, 0x18e0), addmod(mload(add(transcript, 0x18c0)), mload(add(transcript, 0x700)), f_q))mstore(add(transcript, 0x1900), mulmod(mload(add(transcript, 0x640)), 7127083008168878795310303301757642617203533252990949589494537404444738046722, f_q))mstore(add(transcript, 0x1920), mulmod(mload(add(transcript, 0x660)), 10251091711782631878897995303436082826711938358699127319815611151510940403902, f_q))mstore(add(transcript, 0x1940), addmod(mload(add(transcript, 0x1900)), mload(add(transcript, 0x1920)), f_q))mstore(add(transcript, 0x1960), addmod(mload(add(transcript, 0x18e0)), sub(f_q, mload(add(transcript, 0x1940))), f_q))mstore(add(transcript, 0x1980), mulmod(mload(add(transcript, 0x1960)), mload(add(transcript, 0x7e0)), f_q))mstore(add(transcript, 0x19a0), addmod(mload(add(transcript, 0x1860)), mload(add(transcript, 0x1980)), f_q))mstore(add(transcript, 0x19c0), mulmod(mload(add(transcript, 0x420)), mload(add(transcript, 0x19a0)), f_q))mstore(add(transcript, 0x19e0), addmod(1, sub(f_q, mload(add(transcript, 0x7a0))), f_q))mstore(add(transcript, 0x1a00), mulmod(mload(add(transcript, 0x19e0)), mload(add(transcript, 0x7a0)), f_q))mstore(add(transcript, 0x1a20), addmod(2, sub(f_q, mload(add(transcript, 0x7a0))), f_q))mstore(add(transcript, 0x1a40), mulmod(mload(add(transcript, 0x1a20)), mload(add(transcript, 0x1a00)), f_q))mstore(add(transcript, 0x1a60), addmod(4, sub(f_q, mload(add(transcript, 0x7a0))), f_q))mstore(add(transcript, 0x1a80), mulmod(mload(add(transcript, 0x1a60)), mload(add(transcript, 0x1a40)), f_q))mstore(add(transcript, 0x1aa0), addmod(mload(add(transcript, 0x6c0)), mload(add(transcript, 0x600)), f_q))mstore(add(transcript, 0x1ac0), addmod(mload(add(transcript, 0x1aa0)), sub(f_q, mload(add(transcript, 0x640))), f_q))mstore(add(transcript, 0x1ae0), mulmod(mload(add(transcript, 0x1ac0)), mload(add(transcript, 0x1a80)), f_q))mstore(add(transcript, 0x1b00), addmod(mload(add(transcript, 0x19c0)), mload(add(transcript, 0x1ae0)), f_q))mstore(add(transcript, 0x1b20), mulmod(mload(add(transcript, 0x420)), mload(add(transcript, 0x1b00)), f_q))mstore(add(transcript, 0x1b40), addmod(mload(add(transcript, 0x6a0)), sub(f_q, mload(add(transcript, 0x660))), f_q))mstore(add(transcript, 0x1b60), mulmod(mload(add(transcript, 0x1b40)), mload(add(transcript, 0x1a80)), f_q))mstore(add(transcript, 0x1b80), addmod(mload(add(transcript, 0x1b20)), mload(add(transcript, 0x1b60)), f_q))mstore(add(transcript, 0x1ba0), mulmod(mload(add(transcript, 0x420)), mload(add(transcript, 0x1b80)), f_q))mstore(add(transcript, 0x1bc0), mulmod(mload(add(transcript, 0x1500)), mload(add(transcript, 0x800)), f_q))mstore(add(transcript, 0x1be0), addmod(mload(add(transcript, 0x1ba0)), mload(add(transcript, 0x1bc0)), f_q))mstore(add(transcript, 0x1c00), mulmod(mload(add(transcript, 0x420)), mload(add(transcript, 0x1be0)), f_q))mstore(add(transcript, 0x1c20), mulmod(mload(add(transcript, 0x15c0)), mload(add(transcript, 0x800)), f_q))mstore(add(transcript, 0x1c40), addmod(mload(add(transcript, 0x1c00)), mload(add(transcript, 0x1c20)), f_q))mstore(add(transcript, 0x1c60), mulmod(mload(add(transcript, 0x420)), mload(add(transcript, 0x1c40)), f_q))mstore(add(transcript, 0x1c80), mulmod(mload(add(transcript, 0x1640)), mload(add(transcript, 0x820)), f_q))mstore(add(transcript, 0x1ca0), addmod(mload(add(transcript, 0x1c60)), mload(add(transcript, 0x1c80)), f_q))mstore(add(transcript, 0x1cc0), mulmod(mload(add(transcript, 0x420)), mload(add(transcript, 0x1ca0)), f_q))mstore(add(transcript, 0x1ce0), mulmod(mload(add(transcript, 0x1800)), mload(add(transcript, 0x820)), f_q))mstore(add(transcript, 0x1d00), addmod(mload(add(transcript, 0x1cc0)), mload(add(transcript, 0x1ce0)), f_q))mstore(add(transcript, 0x1d20), mulmod(mload(add(transcript, 0x420)), mload(add(transcript, 0x1d00)), f_q))mstore(add(transcript, 0x1d40), mulmod(mload(add(transcript, 0x1960)), mload(add(transcript, 0x820)), f_q))mstore(add(transcript, 0x1d60), addmod(mload(add(transcript, 0x1d20)), mload(add(transcript, 0x1d40)), f_q))mstore(add(transcript, 0x1d80), mulmod(mload(add(transcript, 0x420)), mload(add(transcript, 0x1d60)), f_q))mstore(add(transcript, 0x1da0), addmod(3, sub(f_q, mload(add(transcript, 0x7a0))), f_q))mstore(add(transcript, 0x1dc0), mulmod(mload(add(transcript, 0x1da0)), mload(add(transcript, 0x1a40)), f_q))mstore(add(transcript, 0x1de0), mulmod(mload(add(transcript, 0x1ac0)), mload(add(transcript, 0x1dc0)), f_q))mstore(add(transcript, 0x1e00), addmod(mload(add(transcript, 0x1d80)), mload(add(transcript, 0x1de0)), f_q))mstore(add(transcript, 0x1e20), mulmod(mload(add(transcript, 0x420)), mload(add(transcript, 0x1e00)), f_q))mstore(add(transcript, 0x1e40), mulmod(mload(add(transcript, 0x1b40)), mload(add(transcript, 0x1dc0)), f_q))mstore(add(transcript, 0x1e60), addmod(mload(add(transcript, 0x1e20)), mload(add(transcript, 0x1e40)), f_q))mstore(add(transcript, 0x1e80), mulmod(mload(add(transcript, 0x420)), mload(add(transcript, 0x1e60)), f_q))mstore(add(transcript, 0x1ea0), mulmod(mload(add(transcript, 0x1a20)), mload(add(transcript, 0x7a0)), f_q))mstore(add(transcript, 0x1ec0), mulmod(mload(add(transcript, 0x1da0)), mload(add(transcript, 0x1ea0)), f_q))mstore(add(transcript, 0x1ee0), mulmod(mload(add(transcript, 0x1a60)), mload(add(transcript, 0x1ec0)), f_q))mstore(add(transcript, 0x1f00), mulmod(mload(add(transcript, 0x680)), mload(add(transcript, 0x1ee0)), f_q))mstore(add(transcript, 0x1f20), addmod(1, sub(f_q, mload(add(transcript, 0x680))), f_q))mstore(add(transcript, 0x1f40), mulmod(mload(add(transcript, 0x1f20)), mload(add(transcript, 0x1f00)), f_q))mstore(add(transcript, 0x1f60), addmod(mload(add(transcript, 0x1e80)), mload(add(transcript, 0x1f40)), f_q))mstore(add(transcript, 0x1f80), mulmod(mload(add(transcript, 0x420)), mload(add(transcript, 0x1f60)), f_q))mstore(add(transcript, 0x1fa0), mulmod(2, mload(add(transcript, 0x680)), f_q))mstore(add(transcript, 0x1fc0), addmod(mload(add(transcript, 0x620)), sub(f_q, mload(add(transcript, 0x600))), f_q))mstore(add(transcript, 0x1fe0), mulmod(mload(add(transcript, 0x1fc0)), mload(add(transcript, 0x1fa0)), f_q))mstore(add(transcript, 0x2000), addmod(mload(add(transcript, 0x640)), sub(f_q, mload(add(transcript, 0x600))), f_q))mstore(add(transcript, 0x2020), addmod(mload(add(transcript, 0x1fe0)), sub(f_q, mload(add(transcript, 0x2000))), f_q))mstore(add(transcript, 0x2040), addmod(mload(add(transcript, 0x620)), sub(f_q, mload(add(transcript, 0x660))), f_q))mstore(add(transcript, 0x2060), addmod(mload(add(transcript, 0x2020)), sub(f_q, mload(add(transcript, 0x2040))), f_q))mstore(add(transcript, 0x2080), mulmod(mload(add(transcript, 0x2060)), mload(add(transcript, 0x1ee0)), f_q))mstore(add(transcript, 0x20a0), addmod(mload(add(transcript, 0x1f80)), mload(add(transcript, 0x2080)), f_q))mstore(add(transcript, 0x20c0), mulmod(mload(add(transcript, 0x420)), mload(add(transcript, 0x20a0)), f_q))mstore(add(transcript, 0x20e0), mulmod(mload(add(transcript, 0x1da0)), mload(add(transcript, 0x1a00)), f_q))mstore(add(transcript, 0x2100), mulmod(mload(add(transcript, 0x1a60)), mload(add(transcript, 0x20e0)), f_q))mstore(add(transcript, 0x2120), addmod(mload(add(transcript, 0x600)), mload(add(transcript, 0x620)), f_q))mstore(add(transcript, 0x2140), addmod(mload(add(transcript, 0x2120)), sub(f_q, mload(add(transcript, 0x680))), f_q))mstore(add(transcript, 0x2160), mulmod(mload(add(transcript, 0x2140)), mload(add(transcript, 0x2100)), f_q))mstore(add(transcript, 0x2180), addmod(mload(add(transcript, 0x20c0)), mload(add(transcript, 0x2160)), f_q))mstore(add(transcript, 0x21a0), mulmod(mload(add(transcript, 0x420)), mload(add(transcript, 0x2180)), f_q))mstore(add(transcript, 0x21c0), addmod(mload(add(transcript, 0x21a0)), mload(add(transcript, 0x2160)), f_q))mstore(add(transcript, 0x21e0), mulmod(mload(add(transcript, 0x420)), mload(add(transcript, 0x21c0)), f_q))mstore(add(transcript, 0x2200), addmod(1, sub(f_q, mload(add(transcript, 0x920))), f_q))mstore(add(transcript, 0x2220), mulmod(mload(add(transcript, 0x2200)), mload(add(transcript, 0x1300)), f_q))mstore(add(transcript, 0x2240), addmod(mload(add(transcript, 0x21e0)), mload(add(transcript, 0x2220)), f_q))mstore(add(transcript, 0x2260), mulmod(mload(add(transcript, 0x420)), mload(add(transcript, 0x2240)), f_q))mstore(add(transcript, 0x2280), mulmod(mload(add(transcript, 0x980)), mload(add(transcript, 0x980)), f_q))mstore(add(transcript, 0x22a0), addmod(mload(add(transcript, 0x2280)), sub(f_q, mload(add(transcript, 0x980))), f_q))mstore(add(transcript, 0x22c0), mulmod(mload(add(transcript, 0x22a0)), mload(add(transcript, 0x1240)), f_q))mstore(add(transcript, 0x22e0), addmod(mload(add(transcript, 0x2260)), mload(add(transcript, 0x22c0)), f_q))mstore(add(transcript, 0x2300), mulmod(mload(add(transcript, 0x420)), mload(add(transcript, 0x22e0)), f_q))mstore(add(transcript, 0x2320), addmod(mload(add(transcript, 0x980)), sub(f_q, mload(add(transcript, 0x960))), f_q))mstore(add(transcript, 0x2340), mulmod(mload(add(transcript, 0x2320)), mload(add(transcript, 0x1300)), f_q))mstore(add(transcript, 0x2360), addmod(mload(add(transcript, 0x2300)), mload(add(transcript, 0x2340)), f_q))mstore(add(transcript, 0x2380), mulmod(mload(add(transcript, 0x420)), mload(add(transcript, 0x2360)), f_q))mstore(add(transcript, 0x23a0), addmod(1, sub(f_q, mload(add(transcript, 0x1240))), f_q))mstore(add(transcript, 0x23c0), addmod(mload(add(transcript, 0x1260)), mload(add(transcript, 0x1280)), f_q))mstore(add(transcript, 0x23e0), addmod(mload(add(transcript, 0x23c0)), mload(add(transcript, 0x12a0)), f_q))mstore(add(transcript, 0x2400), addmod(mload(add(transcript, 0x23e0)), mload(add(transcript, 0x12c0)), f_q))mstore(add(transcript, 0x2420), addmod(mload(add(transcript, 0x2400)), mload(add(transcript, 0x12e0)), f_q))mstore(add(transcript, 0x2440), addmod(mload(add(transcript, 0x23a0)), sub(f_q, mload(add(transcript, 0x2420))), f_q))mstore(add(transcript, 0x2460), mulmod(mload(add(transcript, 0x860)), mload(add(transcript, 0x260)), f_q))mstore(add(transcript, 0x2480), addmod(mload(add(transcript, 0x6e0)), mload(add(transcript, 0x2460)), f_q))mstore(add(transcript, 0x24a0), addmod(mload(add(transcript, 0x2480)), mload(add(transcript, 0x2c0)), f_q))mstore(add(transcript, 0x24c0), mulmod(mload(add(transcript, 0x880)), mload(add(transcript, 0x260)), f_q))mstore(add(transcript, 0x24e0), addmod(mload(add(transcript, 0x600)), mload(add(transcript, 0x24c0)), f_q))mstore(add(transcript, 0x2500), addmod(mload(add(transcript, 0x24e0)), mload(add(transcript, 0x2c0)), f_q))mstore(add(transcript, 0x2520), mulmod(mload(add(transcript, 0x2500)), mload(add(transcript, 0x24a0)), f_q))mstore(add(transcript, 0x2540), mulmod(mload(add(transcript, 0x8a0)), mload(add(transcript, 0x260)), f_q))mstore(add(transcript, 0x2560), addmod(mload(add(transcript, 0x620)), mload(add(transcript, 0x2540)), f_q))mstore(add(transcript, 0x2580), addmod(mload(add(transcript, 0x2560)), mload(add(transcript, 0x2c0)), f_q))mstore(add(transcript, 0x25a0), mulmod(mload(add(transcript, 0x2580)), mload(add(transcript, 0x2520)), f_q))mstore(add(transcript, 0x25c0), mulmod(mload(add(transcript, 0x8c0)), mload(add(transcript, 0x260)), f_q))mstore(add(transcript, 0x25e0), addmod(mload(add(transcript, 0x700)), mload(add(transcript, 0x25c0)), f_q))mstore(add(transcript, 0x2600), addmod(mload(add(transcript, 0x25e0)), mload(add(transcript, 0x2c0)), f_q))mstore(add(transcript, 0x2620), mulmod(mload(add(transcript, 0x2600)), mload(add(transcript, 0x25a0)), f_q))mstore(add(transcript, 0x2640), mulmod(mload(add(transcript, 0x2620)), mload(add(transcript, 0x940)), f_q))mstore(add(transcript, 0x2660), mulmod(1, mload(add(transcript, 0x260)), f_q))mstore(add(transcript, 0x2680), mulmod(mload(add(transcript, 0x5c0)), mload(add(transcript, 0x2660)), f_q))mstore(add(transcript, 0x26a0), addmod(mload(add(transcript, 0x6e0)), mload(add(transcript, 0x2680)), f_q))mstore(add(transcript, 0x26c0), addmod(mload(add(transcript, 0x26a0)), mload(add(transcript, 0x2c0)), f_q))mstore(add(transcript, 0x26e0), mulmod(4131629893567559867359510883348571134090853742863529169391034518566172092834, mload(add(transcript, 0x260)), f_q))mstore(add(transcript, 0x2700), mulmod(mload(add(transcript, 0x5c0)), mload(add(transcript, 0x26e0)), f_q))mstore(add(transcript, 0x2720), addmod(mload(add(transcript, 0x600)), mload(add(transcript, 0x2700)), f_q))mstore(add(transcript, 0x2740), addmod(mload(add(transcript, 0x2720)), mload(add(transcript, 0x2c0)), f_q))mstore(add(transcript, 0x2760), mulmod(mload(add(transcript, 0x2740)), mload(add(transcript, 0x26c0)), f_q))mstore(add(transcript, 0x2780), mulmod(8910878055287538404433155982483128285667088683464058436815641868457422632747, mload(add(transcript, 0x260)), f_q))mstore(add(transcript, 0x27a0), mulmod(mload(add(transcript, 0x5c0)), mload(add(transcript, 0x2780)), f_q))mstore(add(transcript, 0x27c0), addmod(mload(add(transcript, 0x620)), mload(add(transcript, 0x27a0)), f_q))mstore(add(transcript, 0x27e0), addmod(mload(add(transcript, 0x27c0)), mload(add(transcript, 0x2c0)), f_q))mstore(add(transcript, 0x2800), mulmod(mload(add(transcript, 0x27e0)), mload(add(transcript, 0x2760)), f_q))mstore(add(transcript, 0x2820), mulmod(11166246659983828508719468090013646171463329086121580628794302409516816350802, mload(add(transcript, 0x260)), f_q))mstore(add(transcript, 0x2840), mulmod(mload(add(transcript, 0x5c0)), mload(add(transcript, 0x2820)), f_q))mstore(add(transcript, 0x2860), addmod(mload(add(transcript, 0x700)), mload(add(transcript, 0x2840)), f_q))mstore(add(transcript, 0x2880), addmod(mload(add(transcript, 0x2860)), mload(add(transcript, 0x2c0)), f_q))mstore(add(transcript, 0x28a0), mulmod(mload(add(transcript, 0x2880)), mload(add(transcript, 0x2800)), f_q))mstore(add(transcript, 0x28c0), mulmod(mload(add(transcript, 0x28a0)), mload(add(transcript, 0x920)), f_q))mstore(add(transcript, 0x28e0), addmod(mload(add(transcript, 0x2640)), sub(f_q, mload(add(transcript, 0x28c0))), f_q))mstore(add(transcript, 0x2900), mulmod(mload(add(transcript, 0x28e0)), mload(add(transcript, 0x2440)), f_q))mstore(add(transcript, 0x2920), addmod(mload(add(transcript, 0x2380)), mload(add(transcript, 0x2900)), f_q))mstore(add(transcript, 0x2940), mulmod(mload(add(transcript, 0x420)), mload(add(transcript, 0x2920)), f_q))mstore(add(transcript, 0x2960), mulmod(mload(add(transcript, 0x8e0)), mload(add(transcript, 0x260)), f_q))mstore(add(transcript, 0x2980), addmod(mload(add(transcript, 0x680)), mload(add(transcript, 0x2960)), f_q))mstore(add(transcript, 0x29a0), addmod(mload(add(transcript, 0x2980)), mload(add(transcript, 0x2c0)), f_q))mstore(add(transcript, 0x29c0), mulmod(mload(add(transcript, 0x900)), mload(add(transcript, 0x260)), f_q))mstore(add(transcript, 0x29e0), addmod(mload(add(transcript, 0x1380)), mload(add(transcript, 0x29c0)), f_q))mstore(add(transcript, 0x2a00), addmod(mload(add(transcript, 0x29e0)), mload(add(transcript, 0x2c0)), f_q))mstore(add(transcript, 0x2a20), mulmod(mload(add(transcript, 0x2a00)), mload(add(transcript, 0x29a0)), f_q))mstore(add(transcript, 0x2a40), mulmod(mload(add(transcript, 0x2a20)), mload(add(transcript, 0x9a0)), f_q))mstore(add(transcript, 0x2a60), mulmod(284840088355319032285349970403338060113257071685626700086398481893096618818, mload(add(transcript, 0x260)), f_q))mstore(add(transcript, 0x2a80), mulmod(mload(add(transcript, 0x5c0)), mload(add(transcript, 0x2a60)), f_q))mstore(add(transcript, 0x2aa0), addmod(mload(add(transcript, 0x680)), mload(add(transcript, 0x2a80)), f_q))mstore(add(transcript, 0x2ac0), addmod(mload(add(transcript, 0x2aa0)), mload(add(transcript, 0x2c0)), f_q))mstore(add(transcript, 0x2ae0), mulmod(21134065618345176623193549882539580312263652408302468683943992798037078993309, mload(add(transcript, 0x260)), f_q))mstore(add(transcript, 0x2b00), mulmod(mload(add(transcript, 0x5c0)), mload(add(transcript, 0x2ae0)), f_q))mstore(add(transcript, 0x2b20), addmod(mload(add(transcript, 0x1380)), mload(add(transcript, 0x2b00)), f_q))mstore(add(transcript, 0x2b40), addmod(mload(add(transcript, 0x2b20)), mload(add(transcript, 0x2c0)), f_q))mstore(add(transcript, 0x2b60), mulmod(mload(add(transcript, 0x2b40)), mload(add(transcript, 0x2ac0)), f_q))mstore(add(transcript, 0x2b80), mulmod(mload(add(transcript, 0x2b60)), mload(add(transcript, 0x980)), f_q))mstore(add(transcript, 0x2ba0), addmod(mload(add(transcript, 0x2a40)), sub(f_q, mload(add(transcript, 0x2b80))), f_q))mstore(add(transcript, 0x2bc0), mulmod(mload(add(transcript, 0x2ba0)), mload(add(transcript, 0x2440)), f_q))mstore(add(transcript, 0x2be0), addmod(mload(add(transcript, 0x2940)), mload(add(transcript, 0x2bc0)), f_q))mstore(add(transcript, 0x2c00), mulmod(mload(add(transcript, 0x420)), mload(add(transcript, 0x2be0)), f_q))mstore(add(transcript, 0x2c20), addmod(1, sub(f_q, mload(add(transcript, 0x9c0))), f_q))mstore(add(transcript, 0x2c40), mulmod(mload(add(transcript, 0x2c20)), mload(add(transcript, 0x1300)), f_q))mstore(add(transcript, 0x2c60), addmod(mload(add(transcript, 0x2c00)), mload(add(transcript, 0x2c40)), f_q))mstore(add(transcript, 0x2c80), mulmod(mload(add(transcript, 0x420)), mload(add(transcript, 0x2c60)), f_q))mstore(add(transcript, 0x2ca0), mulmod(mload(add(transcript, 0x9c0)), mload(add(transcript, 0x9c0)), f_q))mstore(add(transcript, 0x2cc0), addmod(mload(add(transcript, 0x2ca0)), sub(f_q, mload(add(transcript, 0x9c0))), f_q))mstore(add(transcript, 0x2ce0), mulmod(mload(add(transcript, 0x2cc0)), mload(add(transcript, 0x1240)), f_q))mstore(add(transcript, 0x2d00), addmod(mload(add(transcript, 0x2c80)), mload(add(transcript, 0x2ce0)), f_q))mstore(add(transcript, 0x2d20), mulmod(mload(add(transcript, 0x420)), mload(add(transcript, 0x2d00)), f_q))mstore(add(transcript, 0x2d40), addmod(mload(add(transcript, 0xa00)), mload(add(transcript, 0x260)), f_q))mstore(add(transcript, 0x2d60), mulmod(mload(add(transcript, 0x2d40)), mload(add(transcript, 0x9e0)), f_q))mstore(add(transcript, 0x2d80), addmod(mload(add(transcript, 0xa40)), mload(add(transcript, 0x2c0)), f_q))mstore(add(transcript, 0x2da0), mulmod(mload(add(transcript, 0x2d80)), mload(add(transcript, 0x2d60)), f_q))mstore(add(transcript, 0x2dc0), mulmod(256, mload(add(transcript, 0x640)), f_q))mstore(add(transcript, 0x2de0), addmod(mload(add(transcript, 0x600)), sub(f_q, mload(add(transcript, 0x2dc0))), f_q))mstore(add(transcript, 0x2e00), mulmod(mload(add(transcript, 0x2de0)), mload(add(transcript, 0x780)), f_q))mstore(add(transcript, 0x2e20), addmod(mload(add(transcript, 0x2e00)), mload(add(transcript, 0x260)), f_q))mstore(add(transcript, 0x2e40), mulmod(mload(add(transcript, 0x2e20)), mload(add(transcript, 0x9c0)), f_q))mstore(add(transcript, 0x2e60), addmod(mload(add(transcript, 0x760)), mload(add(transcript, 0x2c0)), f_q))mstore(add(transcript, 0x2e80), mulmod(mload(add(transcript, 0x2e60)), mload(add(transcript, 0x2e40)), f_q))mstore(add(transcript, 0x2ea0), addmod(mload(add(transcript, 0x2da0)), sub(f_q, mload(add(transcript, 0x2e80))), f_q))mstore(add(transcript, 0x2ec0), mulmod(mload(add(transcript, 0x2ea0)), mload(add(transcript, 0x2440)), f_q))mstore(add(transcript, 0x2ee0), addmod(mload(add(transcript, 0x2d20)), mload(add(transcript, 0x2ec0)), f_q))mstore(add(transcript, 0x2f00), mulmod(mload(add(transcript, 0x420)), mload(add(transcript, 0x2ee0)), f_q))mstore(add(transcript, 0x2f20), addmod(mload(add(transcript, 0xa00)), sub(f_q, mload(add(transcript, 0xa40))), f_q))mstore(add(transcript, 0x2f40), mulmod(mload(add(transcript, 0x2f20)), mload(add(transcript, 0x1300)), f_q))mstore(add(transcript, 0x2f60), addmod(mload(add(transcript, 0x2f00)), mload(add(transcript, 0x2f40)), f_q))mstore(add(transcript, 0x2f80), mulmod(mload(add(transcript, 0x420)), mload(add(transcript, 0x2f60)), f_q))mstore(add(transcript, 0x2fa0), mulmod(mload(add(transcript, 0x2f20)), mload(add(transcript, 0x2440)), f_q))mstore(add(transcript, 0x2fc0), addmod(mload(add(transcript, 0xa00)), sub(f_q, mload(add(transcript, 0xa20))), f_q))mstore(add(transcript, 0x2fe0), mulmod(mload(add(transcript, 0x2fc0)), mload(add(transcript, 0x2fa0)), f_q))mstore(add(transcript, 0x3000), addmod(mload(add(transcript, 0x2f80)), mload(add(transcript, 0x2fe0)), f_q))mstore(add(transcript, 0x3020), mulmod(mload(add(transcript, 0xd40)), mload(add(transcript, 0xd40)), f_q))mstore(add(transcript, 0x3040), mulmod(mload(add(transcript, 0x3020)), mload(add(transcript, 0xd40)), f_q))mstore(add(transcript, 0x3060), mulmod(mload(add(transcript, 0x3040)), mload(add(transcript, 0xd40)), f_q))mstore(add(transcript, 0x3080), mulmod(mload(add(transcript, 0x3060)), mload(add(transcript, 0xd40)), f_q))mstore(add(transcript, 0x30a0), mulmod(1, mload(add(transcript, 0xd40)), f_q))mstore(add(transcript, 0x30c0), mulmod(1, mload(add(transcript, 0x3020)), f_q))mstore(add(transcript, 0x30e0), mulmod(1, mload(add(transcript, 0x3040)), f_q))mstore(add(transcript, 0x3100), mulmod(1, mload(add(transcript, 0x3060)), f_q))mstore(add(transcript, 0x3120), mulmod(mload(add(transcript, 0x3000)), mload(add(transcript, 0xd60)), f_q))mstore(add(transcript, 0x3140), mulmod(mload(add(transcript, 0xc00)), mload(add(transcript, 0x5c0)), f_q))mstore(add(transcript, 0x3160), mulmod(mload(add(transcript, 0x5c0)), 1, f_q))mstore(add(transcript, 0x3180), addmod(mload(add(transcript, 0xb80)), sub(f_q, mload(add(transcript, 0x3160))), f_q))mstore(add(transcript, 0x31a0), mulmod(mload(add(transcript, 0x5c0)), 9396103202274256930945606623206526900461945684265495839012435492634193195103, f_q))mstore(add(transcript, 0x31c0), addmod(mload(add(transcript, 0xb80)), sub(f_q, mload(add(transcript, 0x31a0))), f_q))mstore(add(transcript, 0x31e0), mulmod(mload(add(transcript, 0x5c0)), 15699029810934084314820646074566828280617789951162923449200398535581206172418, f_q))mstore(add(transcript, 0x3200), addmod(mload(add(transcript, 0xb80)), sub(f_q, mload(add(transcript, 0x31e0))), f_q))mstore(add(transcript, 0x3220), mulmod(mload(add(transcript, 0x5c0)), 19444693496467964793333684482470811869395409953158764080291550423779334624794, f_q))mstore(add(transcript, 0x3240), addmod(mload(add(transcript, 0xb80)), sub(f_q, mload(add(transcript, 0x3220))), f_q)){ let result := mulmod(mload(add(transcript, 0xb80)), mulmod(mload(add(transcript, 0xc00)), 14935689044936328720213520384837211407239373163407808768092422456738089171339, f_q), f_q)result := addmod(mulmod(mload(add(transcript, 0x5c0)), mulmod(mload(add(transcript, 0xc00)), 6952553826902946502032885360420063681308991237008225575605781729837719324278, f_q), f_q), result, f_q)mstore(add(transcript, 0x3260), result) }{ let result := mulmod(mload(add(transcript, 0xb80)), mulmod(mload(add(transcript, 0xc00)), 7540907510155698387256503820143330389809914548046512731972450943457626251574, f_q), f_q)result := addmod(mulmod(mload(add(transcript, 0x5c0)), mulmod(mload(add(transcript, 0xc00)), 17454089668527239794105182244994964593641145239866915085378986192780276655988, f_q), f_q), result, f_q)mstore(add(transcript, 0x3280), result) }{ let result := mulmod(mload(add(transcript, 0xb80)), mulmod(mload(add(transcript, 0xc00)), 16765245179638222004592619476379737764479697804128512065226459610007790881832, f_q), f_q)result := addmod(mulmod(mload(add(transcript, 0x5c0)), mulmod(mload(add(transcript, 0xc00)), 6067403861988280018436561787453590745850405443026581205331008293509136248791, f_q), f_q), result, f_q)mstore(add(transcript, 0x32a0), result) }mstore(add(transcript, 0x32c0), mulmod(1, mload(add(transcript, 0x3180)), f_q))mstore(add(transcript, 0x32e0), mulmod(mload(add(transcript, 0x32c0)), mload(add(transcript, 0x31c0)), f_q))mstore(add(transcript, 0x3300), mulmod(mload(add(transcript, 0x32e0)), mload(add(transcript, 0x3240)), f_q)){ let result := mulmod(mload(add(transcript, 0xb80)), 1, f_q)result := addmod(mulmod(mload(add(transcript, 0x5c0)), 21888242871839275222246405745257275088548364400416034343698204186575808495616, f_q), result, f_q)mstore(add(transcript, 0x3320), result) }{ let result := mulmod(mload(add(transcript, 0xb80)), mulmod(mload(add(transcript, 0xc00)), 13346277807347402051479003338644866680074640264080882830084838995653627694322, f_q), f_q)result := addmod(mulmod(mload(add(transcript, 0x5c0)), mulmod(mload(add(transcript, 0xc00)), 8541965064491873170767402406612408408473724136335151513613365190922180801295, f_q), f_q), result, f_q)mstore(add(transcript, 0x3340), result) }{ let result := mulmod(mload(add(transcript, 0xb80)), mulmod(mload(add(transcript, 0xc00)), 9130318747744625055991020866335675116974647447373438669980034404542087728591, f_q), f_q)result := addmod(mulmod(mload(add(transcript, 0x5c0)), mulmod(mload(add(transcript, 0xc00)), 17654030801727560324741115319652541746559479525075366613702001578587072243451, f_q), f_q), result, f_q)mstore(add(transcript, 0x3360), result) }{ let result := mulmod(mload(add(transcript, 0xb80)), mulmod(mload(add(transcript, 0xc00)), 8968217942074169282201771672973351205073655055696863512223304343263448008755, f_q), f_q)result := addmod(mulmod(mload(add(transcript, 0x5c0)), mulmod(mload(add(transcript, 0xc00)), 15489683287416706862113636648384499783884413315698913841173435408703605255719, f_q), f_q), result, f_q)mstore(add(transcript, 0x3380), result) }mstore(add(transcript, 0x33a0), mulmod(mload(add(transcript, 0x32e0)), mload(add(transcript, 0x3200)), f_q)){ let result := mulmod(mload(add(transcript, 0xb80)), mulmod(mload(add(transcript, 0x5c0)), 12492139669565018291300799122050748188086418716150538504685768693941615300515, f_q), f_q)result := addmod(mulmod(mload(add(transcript, 0x5c0)), mulmod(mload(add(transcript, 0x5c0)), 9396103202274256930945606623206526900461945684265495839012435492634193195102, f_q), f_q), result, f_q)mstore(add(transcript, 0x33c0), result) }{ let result := mulmod(mload(add(transcript, 0xb80)), mulmod(mload(add(transcript, 0x5c0)), 9396103202274256930945606623206526900461945684265495839012435492634193195102, f_q), f_q)result := addmod(mulmod(mload(add(transcript, 0x5c0)), mulmod(mload(add(transcript, 0x5c0)), 11903785986312266406077180662327481479585495405112251348319099480321708373219, f_q), f_q), result, f_q)mstore(add(transcript, 0x33e0), result) }{ let result := mulmod(mload(add(transcript, 0xb80)), mulmod(mload(add(transcript, 0x5c0)), 2443549375371310428912721262786463219152954447257270263406653762796473870824, f_q), f_q)result := addmod(mulmod(mload(add(transcript, 0x5c0)), mulmod(mload(add(transcript, 0x5c0)), 19444693496467964793333684482470811869395409953158764080291550423779334624793, f_q), f_q), result, f_q)mstore(add(transcript, 0x3400), result) }{ let result := mulmod(mload(add(transcript, 0xb80)), mulmod(mload(add(transcript, 0x5c0)), 19444693496467964793333684482470811869395409953158764080291550423779334624793, f_q), f_q)result := addmod(mulmod(mload(add(transcript, 0x5c0)), mulmod(mload(add(transcript, 0x5c0)), 14519100894475310148599392892084064224530612280553018117484180069202210808887, f_q), f_q), result, f_q)mstore(add(transcript, 0x3420), result) }mstore(add(transcript, 0x3440), mulmod(mload(add(transcript, 0x32c0)), mload(add(transcript, 0x3240)), f_q)){ let prod := mload(add(transcript, 0x3260)) prod := mulmod(mload(add(transcript, 0x3280)), prod, f_q) mstore(add(transcript, 0x3460), prod) prod := mulmod(mload(add(transcript, 0x32a0)), prod, f_q) mstore(add(transcript, 0x3480), prod) prod := mulmod(mload(add(transcript, 0x3320)), prod, f_q) mstore(add(transcript, 0x34a0), prod) prod := mulmod(mload(add(transcript, 0x32c0)), prod, f_q) mstore(add(transcript, 0x34c0), prod) prod := mulmod(mload(add(transcript, 0x3340)), prod, f_q) mstore(add(transcript, 0x34e0), prod) prod := mulmod(mload(add(transcript, 0x3360)), prod, f_q) mstore(add(transcript, 0x3500), prod) prod := mulmod(mload(add(transcript, 0x3380)), prod, f_q) mstore(add(transcript, 0x3520), prod) prod := mulmod(mload(add(transcript, 0x33a0)), prod, f_q) mstore(add(transcript, 0x3540), prod) prod := mulmod(mload(add(transcript, 0x33c0)), prod, f_q) mstore(add(transcript, 0x3560), prod) prod := mulmod(mload(add(transcript, 0x33e0)), prod, f_q) mstore(add(transcript, 0x3580), prod) prod := mulmod(mload(add(transcript, 0x32e0)), prod, f_q) mstore(add(transcript, 0x35a0), prod) prod := mulmod(mload(add(transcript, 0x3400)), prod, f_q) mstore(add(transcript, 0x35c0), prod) prod := mulmod(mload(add(transcript, 0x3420)), prod, f_q) mstore(add(transcript, 0x35e0), prod) prod := mulmod(mload(add(transcript, 0x3440)), prod, f_q) mstore(add(transcript, 0x3600), prod) }mstore(add(transcript, 0x3640), 32)mstore(add(transcript, 0x3660), 32)mstore(add(transcript, 0x3680), 32)mstore(add(transcript, 0x36a0), mload(add(transcript, 0x3600)))mstore(add(transcript, 0x36c0), 21888242871839275222246405745257275088548364400416034343698204186575808495615)mstore(add(transcript, 0x36e0), 21888242871839275222246405745257275088548364400416034343698204186575808495617)success := and(eq(staticcall(gas(), 0x5, add(transcript, 0x3640), 0xc0, add(transcript, 0x3620), 0x20), 1), success){ let inv := mload(add(transcript, 0x3620)) let v v := mload(add(transcript, 0x3440)) mstore(add(transcript, 0x3440), mulmod(mload(add(transcript, 0x35e0)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x3420)) mstore(add(transcript, 0x3420), mulmod(mload(add(transcript, 0x35c0)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x3400)) mstore(add(transcript, 0x3400), mulmod(mload(add(transcript, 0x35a0)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x32e0)) mstore(add(transcript, 0x32e0), mulmod(mload(add(transcript, 0x3580)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x33e0)) mstore(add(transcript, 0x33e0), mulmod(mload(add(transcript, 0x3560)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x33c0)) mstore(add(transcript, 0x33c0), mulmod(mload(add(transcript, 0x3540)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x33a0)) mstore(add(transcript, 0x33a0), mulmod(mload(add(transcript, 0x3520)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x3380)) mstore(add(transcript, 0x3380), mulmod(mload(add(transcript, 0x3500)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x3360)) mstore(add(transcript, 0x3360), mulmod(mload(add(transcript, 0x34e0)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x3340)) mstore(add(transcript, 0x3340), mulmod(mload(add(transcript, 0x34c0)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x32c0)) mstore(add(transcript, 0x32c0), mulmod(mload(add(transcript, 0x34a0)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x3320)) mstore(add(transcript, 0x3320), mulmod(mload(add(transcript, 0x3480)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x32a0)) mstore(add(transcript, 0x32a0), mulmod(mload(add(transcript, 0x3460)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x3280)) mstore(add(transcript, 0x3280), mulmod(mload(add(transcript, 0x3260)), inv, f_q)) inv := mulmod(v, inv, f_q) mstore(add(transcript, 0x3260), inv) }{ let result := mload(add(transcript, 0x3260))result := addmod(mload(add(transcript, 0x3280)), result, f_q)result := addmod(mload(add(transcript, 0x32a0)), result, f_q)mstore(add(transcript, 0x3700), result) }mstore(add(transcript, 0x3720), mulmod(mload(add(transcript, 0x3300)), mload(add(transcript, 0x32c0)), f_q)){ let result := mload(add(transcript, 0x3320))mstore(add(transcript, 0x3740), result) }mstore(add(transcript, 0x3760), mulmod(mload(add(transcript, 0x3300)), mload(add(transcript, 0x33a0)), f_q)){ let result := mload(add(transcript, 0x3340))result := addmod(mload(add(transcript, 0x3360)), result, f_q)result := addmod(mload(add(transcript, 0x3380)), result, f_q)mstore(add(transcript, 0x3780), result) }mstore(add(transcript, 0x37a0), mulmod(mload(add(transcript, 0x3300)), mload(add(transcript, 0x32e0)), f_q)){ let result := mload(add(transcript, 0x33c0))result := addmod(mload(add(transcript, 0x33e0)), result, f_q)mstore(add(transcript, 0x37c0), result) }mstore(add(transcript, 0x37e0), mulmod(mload(add(transcript, 0x3300)), mload(add(transcript, 0x3440)), f_q)){ let result := mload(add(transcript, 0x3400))result := addmod(mload(add(transcript, 0x3420)), result, f_q)mstore(add(transcript, 0x3800), result) }{ let prod := mload(add(transcript, 0x3700)) prod := mulmod(mload(add(transcript, 0x3740)), prod, f_q) mstore(add(transcript, 0x3820), prod) prod := mulmod(mload(add(transcript, 0x3780)), prod, f_q) mstore(add(transcript, 0x3840), prod) prod := mulmod(mload(add(transcript, 0x37c0)), prod, f_q) mstore(add(transcript, 0x3860), prod) prod := mulmod(mload(add(transcript, 0x3800)), prod, f_q) mstore(add(transcript, 0x3880), prod) }mstore(add(transcript, 0x38c0), 32)mstore(add(transcript, 0x38e0), 32)mstore(add(transcript, 0x3900), 32)mstore(add(transcript, 0x3920), mload(add(transcript, 0x3880)))mstore(add(transcript, 0x3940), 21888242871839275222246405745257275088548364400416034343698204186575808495615)mstore(add(transcript, 0x3960), 21888242871839275222246405745257275088548364400416034343698204186575808495617)success := and(eq(staticcall(gas(), 0x5, add(transcript, 0x38c0), 0xc0, add(transcript, 0x38a0), 0x20), 1), success){ let inv := mload(add(transcript, 0x38a0)) let v v := mload(add(transcript, 0x3800)) mstore(add(transcript, 0x3800), mulmod(mload(add(transcript, 0x3860)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x37c0)) mstore(add(transcript, 0x37c0), mulmod(mload(add(transcript, 0x3840)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x3780)) mstore(add(transcript, 0x3780), mulmod(mload(add(transcript, 0x3820)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x3740)) mstore(add(transcript, 0x3740), mulmod(mload(add(transcript, 0x3700)), inv, f_q)) inv := mulmod(v, inv, f_q) mstore(add(transcript, 0x3700), inv) }mstore(add(transcript, 0x3980), mulmod(mload(add(transcript, 0x3720)), mload(add(transcript, 0x3740)), f_q))mstore(add(transcript, 0x39a0), mulmod(mload(add(transcript, 0x3760)), mload(add(transcript, 0x3780)), f_q))mstore(add(transcript, 0x39c0), mulmod(mload(add(transcript, 0x37a0)), mload(add(transcript, 0x37c0)), f_q))mstore(add(transcript, 0x39e0), mulmod(mload(add(transcript, 0x37e0)), mload(add(transcript, 0x3800)), f_q))mstore(add(transcript, 0x3a00), mulmod(mload(add(transcript, 0xa80)), mload(add(transcript, 0xa80)), f_q))mstore(add(transcript, 0x3a20), mulmod(mload(add(transcript, 0x3a00)), mload(add(transcript, 0xa80)), f_q))mstore(add(transcript, 0x3a40), mulmod(mload(add(transcript, 0x3a20)), mload(add(transcript, 0xa80)), f_q))mstore(add(transcript, 0x3a60), mulmod(mload(add(transcript, 0x3a40)), mload(add(transcript, 0xa80)), f_q))mstore(add(transcript, 0x3a80), mulmod(mload(add(transcript, 0x3a60)), mload(add(transcript, 0xa80)), f_q))mstore(add(transcript, 0x3aa0), mulmod(mload(add(transcript, 0x3a80)), mload(add(transcript, 0xa80)), f_q))mstore(add(transcript, 0x3ac0), mulmod(mload(add(transcript, 0x3aa0)), mload(add(transcript, 0xa80)), f_q))mstore(add(transcript, 0x3ae0), mulmod(mload(add(transcript, 0x3ac0)), mload(add(transcript, 0xa80)), f_q))mstore(add(transcript, 0x3b00), mulmod(mload(add(transcript, 0x3ae0)), mload(add(transcript, 0xa80)), f_q))mstore(add(transcript, 0x3b20), mulmod(mload(add(transcript, 0x3b00)), mload(add(transcript, 0xa80)), f_q))mstore(add(transcript, 0x3b40), mulmod(mload(add(transcript, 0x3b20)), mload(add(transcript, 0xa80)), f_q))mstore(add(transcript, 0x3b60), mulmod(mload(add(transcript, 0x3b40)), mload(add(transcript, 0xa80)), f_q))mstore(add(transcript, 0x3b80), mulmod(mload(add(transcript, 0x3b60)), mload(add(transcript, 0xa80)), f_q))mstore(add(transcript, 0x3ba0), mulmod(mload(add(transcript, 0x3b80)), mload(add(transcript, 0xa80)), f_q))mstore(add(transcript, 0x3bc0), mulmod(mload(add(transcript, 0x3ba0)), mload(add(transcript, 0xa80)), f_q))mstore(add(transcript, 0x3be0), mulmod(mload(add(transcript, 0x3bc0)), mload(add(transcript, 0xa80)), f_q))mstore(add(transcript, 0x3c00), mulmod(mload(add(transcript, 0x3be0)), mload(add(transcript, 0xa80)), f_q))mstore(add(transcript, 0x3c20), mulmod(mload(add(transcript, 0x3c00)), mload(add(transcript, 0xa80)), f_q))mstore(add(transcript, 0x3c40), mulmod(mload(add(transcript, 0x3c20)), mload(add(transcript, 0xa80)), f_q))mstore(add(transcript, 0x3c60), mulmod(mload(add(transcript, 0x3c40)), mload(add(transcript, 0xa80)), f_q))mstore(add(transcript, 0x3c80), mulmod(mload(add(transcript, 0xae0)), mload(add(transcript, 0xae0)), f_q))mstore(add(transcript, 0x3ca0), mulmod(mload(add(transcript, 0x3c80)), mload(add(transcript, 0xae0)), f_q))mstore(add(transcript, 0x3cc0), mulmod(mload(add(transcript, 0x3ca0)), mload(add(transcript, 0xae0)), f_q))mstore(add(transcript, 0x3ce0), mulmod(mload(add(transcript, 0x3cc0)), mload(add(transcript, 0xae0)), f_q)){ let result := mulmod(mload(add(transcript, 0x600)), mload(add(transcript, 0x3260)), f_q)result := addmod(mulmod(mload(add(transcript, 0x640)), mload(add(transcript, 0x3280)), f_q), result, f_q)result := addmod(mulmod(mload(add(transcript, 0x6c0)), mload(add(transcript, 0x32a0)), f_q), result, f_q)mstore(add(transcript, 0x3d00), result) }mstore(add(transcript, 0x3d20), mulmod(mload(add(transcript, 0x3d00)), mload(add(transcript, 0x3700)), f_q))mstore(add(transcript, 0x3d40), mulmod(sub(f_q, mload(add(transcript, 0x3d20))), 1, f_q)){ let result := mulmod(mload(add(transcript, 0x620)), mload(add(transcript, 0x3260)), f_q)result := addmod(mulmod(mload(add(transcript, 0x660)), mload(add(transcript, 0x3280)), f_q), result, f_q)result := addmod(mulmod(mload(add(transcript, 0x6a0)), mload(add(transcript, 0x32a0)), f_q), result, f_q)mstore(add(transcript, 0x3d60), result) }mstore(add(transcript, 0x3d80), mulmod(mload(add(transcript, 0x3d60)), mload(add(transcript, 0x3700)), f_q))mstore(add(transcript, 0x3da0), mulmod(sub(f_q, mload(add(transcript, 0x3d80))), mload(add(transcript, 0xa80)), f_q))mstore(add(transcript, 0x3dc0), mulmod(1, mload(add(transcript, 0xa80)), f_q))mstore(add(transcript, 0x3de0), addmod(mload(add(transcript, 0x3d40)), mload(add(transcript, 0x3da0)), f_q))mstore(add(transcript, 0x3e00), mulmod(mload(add(transcript, 0x3de0)), 1, f_q))mstore(add(transcript, 0x3e20), mulmod(mload(add(transcript, 0x3dc0)), 1, f_q))mstore(add(transcript, 0x3e40), mulmod(1, mload(add(transcript, 0x3720)), f_q)){ let result := mulmod(mload(add(transcript, 0x680)), mload(add(transcript, 0x3320)), f_q)mstore(add(transcript, 0x3e60), result) }mstore(add(transcript, 0x3e80), mulmod(mload(add(transcript, 0x3e60)), mload(add(transcript, 0x3980)), f_q))mstore(add(transcript, 0x3ea0), mulmod(sub(f_q, mload(add(transcript, 0x3e80))), 1, f_q))mstore(add(transcript, 0x3ec0), mulmod(mload(add(transcript, 0x3e40)), 1, f_q)){ let result := mulmod(mload(add(transcript, 0xa40)), mload(add(transcript, 0x3320)), f_q)mstore(add(transcript, 0x3ee0), result) }mstore(add(transcript, 0x3f00), mulmod(mload(add(transcript, 0x3ee0)), mload(add(transcript, 0x3980)), f_q))mstore(add(transcript, 0x3f20), mulmod(sub(f_q, mload(add(transcript, 0x3f00))), mload(add(transcript, 0xa80)), f_q))mstore(add(transcript, 0x3f40), mulmod(mload(add(transcript, 0x3e40)), mload(add(transcript, 0xa80)), f_q))mstore(add(transcript, 0x3f60), addmod(mload(add(transcript, 0x3ea0)), mload(add(transcript, 0x3f20)), f_q)){ let result := mulmod(mload(add(transcript, 0x6e0)), mload(add(transcript, 0x3320)), f_q)mstore(add(transcript, 0x3f80), result) }mstore(add(transcript, 0x3fa0), mulmod(mload(add(transcript, 0x3f80)), mload(add(transcript, 0x3980)), f_q))mstore(add(transcript, 0x3fc0), mulmod(sub(f_q, mload(add(transcript, 0x3fa0))), mload(add(transcript, 0x3a00)), f_q))mstore(add(transcript, 0x3fe0), mulmod(mload(add(transcript, 0x3e40)), mload(add(transcript, 0x3a00)), f_q))mstore(add(transcript, 0x4000), addmod(mload(add(transcript, 0x3f60)), mload(add(transcript, 0x3fc0)), f_q)){ let result := mulmod(mload(add(transcript, 0x700)), mload(add(transcript, 0x3320)), f_q)mstore(add(transcript, 0x4020), result) }mstore(add(transcript, 0x4040), mulmod(mload(add(transcript, 0x4020)), mload(add(transcript, 0x3980)), f_q))mstore(add(transcript, 0x4060), mulmod(sub(f_q, mload(add(transcript, 0x4040))), mload(add(transcript, 0x3a20)), f_q))mstore(add(transcript, 0x4080), mulmod(mload(add(transcript, 0x3e40)), mload(add(transcript, 0x3a20)), f_q))mstore(add(transcript, 0x40a0), addmod(mload(add(transcript, 0x4000)), mload(add(transcript, 0x4060)), f_q)){ let result := mulmod(mload(add(transcript, 0x720)), mload(add(transcript, 0x3320)), f_q)mstore(add(transcript, 0x40c0), result) }mstore(add(transcript, 0x40e0), mulmod(mload(add(transcript, 0x40c0)), mload(add(transcript, 0x3980)), f_q))mstore(add(transcript, 0x4100), mulmod(sub(f_q, mload(add(transcript, 0x40e0))), mload(add(transcript, 0x3a40)), f_q))mstore(add(transcript, 0x4120), mulmod(mload(add(transcript, 0x3e40)), mload(add(transcript, 0x3a40)), f_q))mstore(add(transcript, 0x4140), addmod(mload(add(transcript, 0x40a0)), mload(add(transcript, 0x4100)), f_q)){ let result := mulmod(mload(add(transcript, 0x740)), mload(add(transcript, 0x3320)), f_q)mstore(add(transcript, 0x4160), result) }mstore(add(transcript, 0x4180), mulmod(mload(add(transcript, 0x4160)), mload(add(transcript, 0x3980)), f_q))mstore(add(transcript, 0x41a0), mulmod(sub(f_q, mload(add(transcript, 0x4180))), mload(add(transcript, 0x3a60)), f_q))mstore(add(transcript, 0x41c0), mulmod(mload(add(transcript, 0x3e40)), mload(add(transcript, 0x3a60)), f_q))mstore(add(transcript, 0x41e0), addmod(mload(add(transcript, 0x4140)), mload(add(transcript, 0x41a0)), f_q)){ let result := mulmod(mload(add(transcript, 0x760)), mload(add(transcript, 0x3320)), f_q)mstore(add(transcript, 0x4200), result) }mstore(add(transcript, 0x4220), mulmod(mload(add(transcript, 0x4200)), mload(add(transcript, 0x3980)), f_q))mstore(add(transcript, 0x4240), mulmod(sub(f_q, mload(add(transcript, 0x4220))), mload(add(transcript, 0x3a80)), f_q))mstore(add(transcript, 0x4260), mulmod(mload(add(transcript, 0x3e40)), mload(add(transcript, 0x3a80)), f_q))mstore(add(transcript, 0x4280), addmod(mload(add(transcript, 0x41e0)), mload(add(transcript, 0x4240)), f_q)){ let result := mulmod(mload(add(transcript, 0x780)), mload(add(transcript, 0x3320)), f_q)mstore(add(transcript, 0x42a0), result) }mstore(add(transcript, 0x42c0), mulmod(mload(add(transcript, 0x42a0)), mload(add(transcript, 0x3980)), f_q))mstore(add(transcript, 0x42e0), mulmod(sub(f_q, mload(add(transcript, 0x42c0))), mload(add(transcript, 0x3aa0)), f_q))mstore(add(transcript, 0x4300), mulmod(mload(add(transcript, 0x3e40)), mload(add(transcript, 0x3aa0)), f_q))mstore(add(transcript, 0x4320), addmod(mload(add(transcript, 0x4280)), mload(add(transcript, 0x42e0)), f_q)){ let result := mulmod(mload(add(transcript, 0x7a0)), mload(add(transcript, 0x3320)), f_q)mstore(add(transcript, 0x4340), result) }mstore(add(transcript, 0x4360), mulmod(mload(add(transcript, 0x4340)), mload(add(transcript, 0x3980)), f_q))mstore(add(transcript, 0x4380), mulmod(sub(f_q, mload(add(transcript, 0x4360))), mload(add(transcript, 0x3ac0)), f_q))mstore(add(transcript, 0x43a0), mulmod(mload(add(transcript, 0x3e40)), mload(add(transcript, 0x3ac0)), f_q))mstore(add(transcript, 0x43c0), addmod(mload(add(transcript, 0x4320)), mload(add(transcript, 0x4380)), f_q)){ let result := mulmod(mload(add(transcript, 0x7c0)), mload(add(transcript, 0x3320)), f_q)mstore(add(transcript, 0x43e0), result) }mstore(add(transcript, 0x4400), mulmod(mload(add(transcript, 0x43e0)), mload(add(transcript, 0x3980)), f_q))mstore(add(transcript, 0x4420), mulmod(sub(f_q, mload(add(transcript, 0x4400))), mload(add(transcript, 0x3ae0)), f_q))mstore(add(transcript, 0x4440), mulmod(mload(add(transcript, 0x3e40)), mload(add(transcript, 0x3ae0)), f_q))mstore(add(transcript, 0x4460), addmod(mload(add(transcript, 0x43c0)), mload(add(transcript, 0x4420)), f_q)){ let result := mulmod(mload(add(transcript, 0x7e0)), mload(add(transcript, 0x3320)), f_q)mstore(add(transcript, 0x4480), result) }mstore(add(transcript, 0x44a0), mulmod(mload(add(transcript, 0x4480)), mload(add(transcript, 0x3980)), f_q))mstore(add(transcript, 0x44c0), mulmod(sub(f_q, mload(add(transcript, 0x44a0))), mload(add(transcript, 0x3b00)), f_q))mstore(add(transcript, 0x44e0), mulmod(mload(add(transcript, 0x3e40)), mload(add(transcript, 0x3b00)), f_q))mstore(add(transcript, 0x4500), addmod(mload(add(transcript, 0x4460)), mload(add(transcript, 0x44c0)), f_q)){ let result := mulmod(mload(add(transcript, 0x800)), mload(add(transcript, 0x3320)), f_q)mstore(add(transcript, 0x4520), result) }mstore(add(transcript, 0x4540), mulmod(mload(add(transcript, 0x4520)), mload(add(transcript, 0x3980)), f_q))mstore(add(transcript, 0x4560), mulmod(sub(f_q, mload(add(transcript, 0x4540))), mload(add(transcript, 0x3b20)), f_q))mstore(add(transcript, 0x4580), mulmod(mload(add(transcript, 0x3e40)), mload(add(transcript, 0x3b20)), f_q))mstore(add(transcript, 0x45a0), addmod(mload(add(transcript, 0x4500)), mload(add(transcript, 0x4560)), f_q)){ let result := mulmod(mload(add(transcript, 0x820)), mload(add(transcript, 0x3320)), f_q)mstore(add(transcript, 0x45c0), result) }mstore(add(transcript, 0x45e0), mulmod(mload(add(transcript, 0x45c0)), mload(add(transcript, 0x3980)), f_q))mstore(add(transcript, 0x4600), mulmod(sub(f_q, mload(add(transcript, 0x45e0))), mload(add(transcript, 0x3b40)), f_q))mstore(add(transcript, 0x4620), mulmod(mload(add(transcript, 0x3e40)), mload(add(transcript, 0x3b40)), f_q))mstore(add(transcript, 0x4640), addmod(mload(add(transcript, 0x45a0)), mload(add(transcript, 0x4600)), f_q)){ let result := mulmod(mload(add(transcript, 0x860)), mload(add(transcript, 0x3320)), f_q)mstore(add(transcript, 0x4660), result) }mstore(add(transcript, 0x4680), mulmod(mload(add(transcript, 0x4660)), mload(add(transcript, 0x3980)), f_q))mstore(add(transcript, 0x46a0), mulmod(sub(f_q, mload(add(transcript, 0x4680))), mload(add(transcript, 0x3b60)), f_q))mstore(add(transcript, 0x46c0), mulmod(mload(add(transcript, 0x3e40)), mload(add(transcript, 0x3b60)), f_q))mstore(add(transcript, 0x46e0), addmod(mload(add(transcript, 0x4640)), mload(add(transcript, 0x46a0)), f_q)){ let result := mulmod(mload(add(transcript, 0x880)), mload(add(transcript, 0x3320)), f_q)mstore(add(transcript, 0x4700), result) }mstore(add(transcript, 0x4720), mulmod(mload(add(transcript, 0x4700)), mload(add(transcript, 0x3980)), f_q))mstore(add(transcript, 0x4740), mulmod(sub(f_q, mload(add(transcript, 0x4720))), mload(add(transcript, 0x3b80)), f_q))mstore(add(transcript, 0x4760), mulmod(mload(add(transcript, 0x3e40)), mload(add(transcript, 0x3b80)), f_q))mstore(add(transcript, 0x4780), addmod(mload(add(transcript, 0x46e0)), mload(add(transcript, 0x4740)), f_q)){ let result := mulmod(mload(add(transcript, 0x8a0)), mload(add(transcript, 0x3320)), f_q)mstore(add(transcript, 0x47a0), result) }mstore(add(transcript, 0x47c0), mulmod(mload(add(transcript, 0x47a0)), mload(add(transcript, 0x3980)), f_q))mstore(add(transcript, 0x47e0), mulmod(sub(f_q, mload(add(transcript, 0x47c0))), mload(add(transcript, 0x3ba0)), f_q))mstore(add(transcript, 0x4800), mulmod(mload(add(transcript, 0x3e40)), mload(add(transcript, 0x3ba0)), f_q))mstore(add(transcript, 0x4820), addmod(mload(add(transcript, 0x4780)), mload(add(transcript, 0x47e0)), f_q)){ let result := mulmod(mload(add(transcript, 0x8c0)), mload(add(transcript, 0x3320)), f_q)mstore(add(transcript, 0x4840), result) }mstore(add(transcript, 0x4860), mulmod(mload(add(transcript, 0x4840)), mload(add(transcript, 0x3980)), f_q))mstore(add(transcript, 0x4880), mulmod(sub(f_q, mload(add(transcript, 0x4860))), mload(add(transcript, 0x3bc0)), f_q))mstore(add(transcript, 0x48a0), mulmod(mload(add(transcript, 0x3e40)), mload(add(transcript, 0x3bc0)), f_q))mstore(add(transcript, 0x48c0), addmod(mload(add(transcript, 0x4820)), mload(add(transcript, 0x4880)), f_q)){ let result := mulmod(mload(add(transcript, 0x8e0)), mload(add(transcript, 0x3320)), f_q)mstore(add(transcript, 0x48e0), result) }mstore(add(transcript, 0x4900), mulmod(mload(add(transcript, 0x48e0)), mload(add(transcript, 0x3980)), f_q))mstore(add(transcript, 0x4920), mulmod(sub(f_q, mload(add(transcript, 0x4900))), mload(add(transcript, 0x3be0)), f_q))mstore(add(transcript, 0x4940), mulmod(mload(add(transcript, 0x3e40)), mload(add(transcript, 0x3be0)), f_q))mstore(add(transcript, 0x4960), addmod(mload(add(transcript, 0x48c0)), mload(add(transcript, 0x4920)), f_q)){ let result := mulmod(mload(add(transcript, 0x900)), mload(add(transcript, 0x3320)), f_q)mstore(add(transcript, 0x4980), result) }mstore(add(transcript, 0x49a0), mulmod(mload(add(transcript, 0x4980)), mload(add(transcript, 0x3980)), f_q))mstore(add(transcript, 0x49c0), mulmod(sub(f_q, mload(add(transcript, 0x49a0))), mload(add(transcript, 0x3c00)), f_q))mstore(add(transcript, 0x49e0), mulmod(mload(add(transcript, 0x3e40)), mload(add(transcript, 0x3c00)), f_q))mstore(add(transcript, 0x4a00), addmod(mload(add(transcript, 0x4960)), mload(add(transcript, 0x49c0)), f_q))mstore(add(transcript, 0x4a20), mulmod(mload(add(transcript, 0x30a0)), mload(add(transcript, 0x3720)), f_q))mstore(add(transcript, 0x4a40), mulmod(mload(add(transcript, 0x30c0)), mload(add(transcript, 0x3720)), f_q))mstore(add(transcript, 0x4a60), mulmod(mload(add(transcript, 0x30e0)), mload(add(transcript, 0x3720)), f_q))mstore(add(transcript, 0x4a80), mulmod(mload(add(transcript, 0x3100)), mload(add(transcript, 0x3720)), f_q)){ let result := mulmod(mload(add(transcript, 0x3120)), mload(add(transcript, 0x3320)), f_q)mstore(add(transcript, 0x4aa0), result) }mstore(add(transcript, 0x4ac0), mulmod(mload(add(transcript, 0x4aa0)), mload(add(transcript, 0x3980)), f_q))mstore(add(transcript, 0x4ae0), mulmod(sub(f_q, mload(add(transcript, 0x4ac0))), mload(add(transcript, 0x3c20)), f_q))mstore(add(transcript, 0x4b00), mulmod(mload(add(transcript, 0x3e40)), mload(add(transcript, 0x3c20)), f_q))mstore(add(transcript, 0x4b20), mulmod(mload(add(transcript, 0x4a20)), mload(add(transcript, 0x3c20)), f_q))mstore(add(transcript, 0x4b40), mulmod(mload(add(transcript, 0x4a40)), mload(add(transcript, 0x3c20)), f_q))mstore(add(transcript, 0x4b60), mulmod(mload(add(transcript, 0x4a60)), mload(add(transcript, 0x3c20)), f_q))mstore(add(transcript, 0x4b80), mulmod(mload(add(transcript, 0x4a80)), mload(add(transcript, 0x3c20)), f_q))mstore(add(transcript, 0x4ba0), addmod(mload(add(transcript, 0x4a00)), mload(add(transcript, 0x4ae0)), f_q)){ let result := mulmod(mload(add(transcript, 0x840)), mload(add(transcript, 0x3320)), f_q)mstore(add(transcript, 0x4bc0), result) }mstore(add(transcript, 0x4be0), mulmod(mload(add(transcript, 0x4bc0)), mload(add(transcript, 0x3980)), f_q))mstore(add(transcript, 0x4c00), mulmod(sub(f_q, mload(add(transcript, 0x4be0))), mload(add(transcript, 0x3c40)), f_q))mstore(add(transcript, 0x4c20), mulmod(mload(add(transcript, 0x3e40)), mload(add(transcript, 0x3c40)), f_q))mstore(add(transcript, 0x4c40), addmod(mload(add(transcript, 0x4ba0)), mload(add(transcript, 0x4c00)), f_q))mstore(add(transcript, 0x4c60), mulmod(mload(add(transcript, 0x4c40)), mload(add(transcript, 0xae0)), f_q))mstore(add(transcript, 0x4c80), mulmod(mload(add(transcript, 0x3ec0)), mload(add(transcript, 0xae0)), f_q))mstore(add(transcript, 0x4ca0), mulmod(mload(add(transcript, 0x3f40)), mload(add(transcript, 0xae0)), f_q))mstore(add(transcript, 0x4cc0), mulmod(mload(add(transcript, 0x3fe0)), mload(add(transcript, 0xae0)), f_q))mstore(add(transcript, 0x4ce0), mulmod(mload(add(transcript, 0x4080)), mload(add(transcript, 0xae0)), f_q))mstore(add(transcript, 0x4d00), mulmod(mload(add(transcript, 0x4120)), mload(add(transcript, 0xae0)), f_q))mstore(add(transcript, 0x4d20), mulmod(mload(add(transcript, 0x41c0)), mload(add(transcript, 0xae0)), f_q))mstore(add(transcript, 0x4d40), mulmod(mload(add(transcript, 0x4260)), mload(add(transcript, 0xae0)), f_q))mstore(add(transcript, 0x4d60), mulmod(mload(add(transcript, 0x4300)), mload(add(transcript, 0xae0)), f_q))mstore(add(transcript, 0x4d80), mulmod(mload(add(transcript, 0x43a0)), mload(add(transcript, 0xae0)), f_q))mstore(add(transcript, 0x4da0), mulmod(mload(add(transcript, 0x4440)), mload(add(transcript, 0xae0)), f_q))mstore(add(transcript, 0x4dc0), mulmod(mload(add(transcript, 0x44e0)), mload(add(transcript, 0xae0)), f_q))mstore(add(transcript, 0x4de0), mulmod(mload(add(transcript, 0x4580)), mload(add(transcript, 0xae0)), f_q))mstore(add(transcript, 0x4e00), mulmod(mload(add(transcript, 0x4620)), mload(add(transcript, 0xae0)), f_q))mstore(add(transcript, 0x4e20), mulmod(mload(add(transcript, 0x46c0)), mload(add(transcript, 0xae0)), f_q))mstore(add(transcript, 0x4e40), mulmod(mload(add(transcript, 0x4760)), mload(add(transcript, 0xae0)), f_q))mstore(add(transcript, 0x4e60), mulmod(mload(add(transcript, 0x4800)), mload(add(transcript, 0xae0)), f_q))mstore(add(transcript, 0x4e80), mulmod(mload(add(transcript, 0x48a0)), mload(add(transcript, 0xae0)), f_q))mstore(add(transcript, 0x4ea0), mulmod(mload(add(transcript, 0x4940)), mload(add(transcript, 0xae0)), f_q))mstore(add(transcript, 0x4ec0), mulmod(mload(add(transcript, 0x49e0)), mload(add(transcript, 0xae0)), f_q))mstore(add(transcript, 0x4ee0), mulmod(mload(add(transcript, 0x4b00)), mload(add(transcript, 0xae0)), f_q))mstore(add(transcript, 0x4f00), mulmod(mload(add(transcript, 0x4b20)), mload(add(transcript, 0xae0)), f_q))mstore(add(transcript, 0x4f20), mulmod(mload(add(transcript, 0x4b40)), mload(add(transcript, 0xae0)), f_q))mstore(add(transcript, 0x4f40), mulmod(mload(add(transcript, 0x4b60)), mload(add(transcript, 0xae0)), f_q))mstore(add(transcript, 0x4f60), mulmod(mload(add(transcript, 0x4b80)), mload(add(transcript, 0xae0)), f_q))mstore(add(transcript, 0x4f80), mulmod(mload(add(transcript, 0x4c20)), mload(add(transcript, 0xae0)), f_q))mstore(add(transcript, 0x4fa0), addmod(mload(add(transcript, 0x3e00)), mload(add(transcript, 0x4c60)), f_q))mstore(add(transcript, 0x4fc0), mulmod(1, mload(add(transcript, 0x3760)), f_q)){ let result := mulmod(mload(add(transcript, 0x920)), mload(add(transcript, 0x3340)), f_q)result := addmod(mulmod(mload(add(transcript, 0x940)), mload(add(transcript, 0x3360)), f_q), result, f_q)result := addmod(mulmod(mload(add(transcript, 0x960)), mload(add(transcript, 0x3380)), f_q), result, f_q)mstore(add(transcript, 0x4fe0), result) }mstore(add(transcript, 0x5000), mulmod(mload(add(transcript, 0x4fe0)), mload(add(transcript, 0x39a0)), f_q))mstore(add(transcript, 0x5020), mulmod(sub(f_q, mload(add(transcript, 0x5000))), 1, f_q))mstore(add(transcript, 0x5040), mulmod(mload(add(transcript, 0x4fc0)), 1, f_q))mstore(add(transcript, 0x5060), mulmod(mload(add(transcript, 0x5020)), mload(add(transcript, 0x3c80)), f_q))mstore(add(transcript, 0x5080), mulmod(mload(add(transcript, 0x5040)), mload(add(transcript, 0x3c80)), f_q))mstore(add(transcript, 0x50a0), addmod(mload(add(transcript, 0x4fa0)), mload(add(transcript, 0x5060)), f_q))mstore(add(transcript, 0x50c0), mulmod(1, mload(add(transcript, 0x37a0)), f_q)){ let result := mulmod(mload(add(transcript, 0x980)), mload(add(transcript, 0x33c0)), f_q)result := addmod(mulmod(mload(add(transcript, 0x9a0)), mload(add(transcript, 0x33e0)), f_q), result, f_q)mstore(add(transcript, 0x50e0), result) }mstore(add(transcript, 0x5100), mulmod(mload(add(transcript, 0x50e0)), mload(add(transcript, 0x39c0)), f_q))mstore(add(transcript, 0x5120), mulmod(sub(f_q, mload(add(transcript, 0x5100))), 1, f_q))mstore(add(transcript, 0x5140), mulmod(mload(add(transcript, 0x50c0)), 1, f_q)){ let result := mulmod(mload(add(transcript, 0x9c0)), mload(add(transcript, 0x33c0)), f_q)result := addmod(mulmod(mload(add(transcript, 0x9e0)), mload(add(transcript, 0x33e0)), f_q), result, f_q)mstore(add(transcript, 0x5160), result) }mstore(add(transcript, 0x5180), mulmod(mload(add(transcript, 0x5160)), mload(add(transcript, 0x39c0)), f_q))mstore(add(transcript, 0x51a0), mulmod(sub(f_q, mload(add(transcript, 0x5180))), mload(add(transcript, 0xa80)), f_q))mstore(add(transcript, 0x51c0), mulmod(mload(add(transcript, 0x50c0)), mload(add(transcript, 0xa80)), f_q))mstore(add(transcript, 0x51e0), addmod(mload(add(transcript, 0x5120)), mload(add(transcript, 0x51a0)), f_q))mstore(add(transcript, 0x5200), mulmod(mload(add(transcript, 0x51e0)), mload(add(transcript, 0x3ca0)), f_q))mstore(add(transcript, 0x5220), mulmod(mload(add(transcript, 0x5140)), mload(add(transcript, 0x3ca0)), f_q))mstore(add(transcript, 0x5240), mulmod(mload(add(transcript, 0x51c0)), mload(add(transcript, 0x3ca0)), f_q))mstore(add(transcript, 0x5260), addmod(mload(add(transcript, 0x50a0)), mload(add(transcript, 0x5200)), f_q))mstore(add(transcript, 0x5280), mulmod(1, mload(add(transcript, 0x37e0)), f_q)){ let result := mulmod(mload(add(transcript, 0xa00)), mload(add(transcript, 0x3400)), f_q)result := addmod(mulmod(mload(add(transcript, 0xa20)), mload(add(transcript, 0x3420)), f_q), result, f_q)mstore(add(transcript, 0x52a0), result) }mstore(add(transcript, 0x52c0), mulmod(mload(add(transcript, 0x52a0)), mload(add(transcript, 0x39e0)), f_q))mstore(add(transcript, 0x52e0), mulmod(sub(f_q, mload(add(transcript, 0x52c0))), 1, f_q))mstore(add(transcript, 0x5300), mulmod(mload(add(transcript, 0x5280)), 1, f_q))mstore(add(transcript, 0x5320), mulmod(mload(add(transcript, 0x52e0)), mload(add(transcript, 0x3cc0)), f_q))mstore(add(transcript, 0x5340), mulmod(mload(add(transcript, 0x5300)), mload(add(transcript, 0x3cc0)), f_q))mstore(add(transcript, 0x5360), addmod(mload(add(transcript, 0x5260)), mload(add(transcript, 0x5320)), f_q))mstore(add(transcript, 0x5380), mulmod(1, mload(add(transcript, 0x3300)), f_q))mstore(add(transcript, 0x53a0), mulmod(1, mload(add(transcript, 0xb80)), f_q))mstore(add(transcript, 0x53c0), 0x0000000000000000000000000000000000000000000000000000000000000001) mstore(add(transcript, 0x53e0), 0x0000000000000000000000000000000000000000000000000000000000000002)mstore(add(transcript, 0x5400), mload(add(transcript, 0x5360)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x53c0), 0x60, add(transcript, 0x53c0), 0x40), 1), success)mstore(add(transcript, 0x5420), mload(add(transcript, 0x53c0))) mstore(add(transcript, 0x5440), mload(add(transcript, 0x53e0)))mstore(add(transcript, 0x5460), mload(add(transcript, 0xa0))) mstore(add(transcript, 0x5480), mload(add(transcript, 0xc0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5420), 0x80, add(transcript, 0x5420), 0x40), 1), success)mstore(add(transcript, 0x54a0), mload(add(transcript, 0xe0))) mstore(add(transcript, 0x54c0), mload(add(transcript, 0x100)))mstore(add(transcript, 0x54e0), mload(add(transcript, 0x3e20)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x54a0), 0x60, add(transcript, 0x54a0), 0x40), 1), success)mstore(add(transcript, 0x5500), mload(add(transcript, 0x5420))) mstore(add(transcript, 0x5520), mload(add(transcript, 0x5440)))mstore(add(transcript, 0x5540), mload(add(transcript, 0x54a0))) mstore(add(transcript, 0x5560), mload(add(transcript, 0x54c0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5500), 0x80, add(transcript, 0x5500), 0x40), 1), success)mstore(add(transcript, 0x5580), mload(add(transcript, 0x120))) mstore(add(transcript, 0x55a0), mload(add(transcript, 0x140)))mstore(add(transcript, 0x55c0), mload(add(transcript, 0x4c80)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5580), 0x60, add(transcript, 0x5580), 0x40), 1), success)mstore(add(transcript, 0x55e0), mload(add(transcript, 0x5500))) mstore(add(transcript, 0x5600), mload(add(transcript, 0x5520)))mstore(add(transcript, 0x5620), mload(add(transcript, 0x5580))) mstore(add(transcript, 0x5640), mload(add(transcript, 0x55a0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x55e0), 0x80, add(transcript, 0x55e0), 0x40), 1), success)mstore(add(transcript, 0x5660), mload(add(transcript, 0x200))) mstore(add(transcript, 0x5680), mload(add(transcript, 0x220)))mstore(add(transcript, 0x56a0), mload(add(transcript, 0x4ca0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5660), 0x60, add(transcript, 0x5660), 0x40), 1), success)mstore(add(transcript, 0x56c0), mload(add(transcript, 0x55e0))) mstore(add(transcript, 0x56e0), mload(add(transcript, 0x5600)))mstore(add(transcript, 0x5700), mload(add(transcript, 0x5660))) mstore(add(transcript, 0x5720), mload(add(transcript, 0x5680)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x56c0), 0x80, add(transcript, 0x56c0), 0x40), 1), success)mstore(add(transcript, 0x5740), 0x291e4db43c260726b91c535917a801bde06be7f7cf45010909762313db425290) mstore(add(transcript, 0x5760), 0x154e7fe15847ac4d1cd93fa6c8209672cfccf45ad8e13ab82fc6b167ba1994fc)mstore(add(transcript, 0x5780), mload(add(transcript, 0x4cc0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5740), 0x60, add(transcript, 0x5740), 0x40), 1), success)mstore(add(transcript, 0x57a0), mload(add(transcript, 0x56c0))) mstore(add(transcript, 0x57c0), mload(add(transcript, 0x56e0)))mstore(add(transcript, 0x57e0), mload(add(transcript, 0x5740))) mstore(add(transcript, 0x5800), mload(add(transcript, 0x5760)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x57a0), 0x80, add(transcript, 0x57a0), 0x40), 1), success)mstore(add(transcript, 0x5820), 0x176b10d402fac05bfc982234f50b305ad067e122f1682a4b9c4bd98bda91919d) mstore(add(transcript, 0x5840), 0x1d62e78d655e3fc74188666738fca6524a712f1a3c4ccfdd0fa44f3e2c849c51)mstore(add(transcript, 0x5860), mload(add(transcript, 0x4ce0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5820), 0x60, add(transcript, 0x5820), 0x40), 1), success)mstore(add(transcript, 0x5880), mload(add(transcript, 0x57a0))) mstore(add(transcript, 0x58a0), mload(add(transcript, 0x57c0)))mstore(add(transcript, 0x58c0), mload(add(transcript, 0x5820))) mstore(add(transcript, 0x58e0), mload(add(transcript, 0x5840)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5880), 0x80, add(transcript, 0x5880), 0x40), 1), success)mstore(add(transcript, 0x5900), 0x019dd7ee531990d335aad8f64c26a1bc072b47a7efd4504404d2e95e20250759) mstore(add(transcript, 0x5920), 0x0c413dd8e50189a05a374679bae72f724f7b71e956c32c0881ea37694276ea83)mstore(add(transcript, 0x5940), mload(add(transcript, 0x4d00)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5900), 0x60, add(transcript, 0x5900), 0x40), 1), success)mstore(add(transcript, 0x5960), mload(add(transcript, 0x5880))) mstore(add(transcript, 0x5980), mload(add(transcript, 0x58a0)))mstore(add(transcript, 0x59a0), mload(add(transcript, 0x5900))) mstore(add(transcript, 0x59c0), mload(add(transcript, 0x5920)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5960), 0x80, add(transcript, 0x5960), 0x40), 1), success)mstore(add(transcript, 0x59e0), 0x0730799d5bfec1cefc5aaffcffe3f3dd491b2bfcaf9f553f94de6145ed4742af) mstore(add(transcript, 0x5a00), 0x24ad4af082e96b14b9a6da80f4fa1334f253c458add531c8d9f8b23c5ecb9c43)mstore(add(transcript, 0x5a20), mload(add(transcript, 0x4d20)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x59e0), 0x60, add(transcript, 0x59e0), 0x40), 1), success)mstore(add(transcript, 0x5a40), mload(add(transcript, 0x5960))) mstore(add(transcript, 0x5a60), mload(add(transcript, 0x5980)))mstore(add(transcript, 0x5a80), mload(add(transcript, 0x59e0))) mstore(add(transcript, 0x5aa0), mload(add(transcript, 0x5a00)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5a40), 0x80, add(transcript, 0x5a40), 0x40), 1), success)mstore(add(transcript, 0x5ac0), 0x22e1cdbfffcfcf4f18cf4342edf1fb26c3b6e52ace3d5fadcf5cc2614333baa4) mstore(add(transcript, 0x5ae0), 0x0e28df72dcc69cc6442d72f693661997480a913ac353890efd63a873959727c0)mstore(add(transcript, 0x5b00), mload(add(transcript, 0x4d40)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5ac0), 0x60, add(transcript, 0x5ac0), 0x40), 1), success)mstore(add(transcript, 0x5b20), mload(add(transcript, 0x5a40))) mstore(add(transcript, 0x5b40), mload(add(transcript, 0x5a60)))mstore(add(transcript, 0x5b60), mload(add(transcript, 0x5ac0))) mstore(add(transcript, 0x5b80), mload(add(transcript, 0x5ae0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5b20), 0x80, add(transcript, 0x5b20), 0x40), 1), success)mstore(add(transcript, 0x5ba0), 0x0b30fe9581a6c70064e3b35446b2433842db76e8fad547fbb1ee69916473f7ed) mstore(add(transcript, 0x5bc0), 0x286e0f87d619e3fedac8a3d7442ef34fb6566ce9af5a315758c0c2b8000c36cf)mstore(add(transcript, 0x5be0), mload(add(transcript, 0x4d60)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5ba0), 0x60, add(transcript, 0x5ba0), 0x40), 1), success)mstore(add(transcript, 0x5c00), mload(add(transcript, 0x5b20))) mstore(add(transcript, 0x5c20), mload(add(transcript, 0x5b40)))mstore(add(transcript, 0x5c40), mload(add(transcript, 0x5ba0))) mstore(add(transcript, 0x5c60), mload(add(transcript, 0x5bc0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5c00), 0x80, add(transcript, 0x5c00), 0x40), 1), success)mstore(add(transcript, 0x5c80), 0x14e66a771ef08cca0551c26b3439d49d391ba21d91b706df2c4b1f177d7759e5) mstore(add(transcript, 0x5ca0), 0x0532723a26dc928f43033efaef8e4aa2732772ba414b1dadce1fe7d0b30d99d2)mstore(add(transcript, 0x5cc0), mload(add(transcript, 0x4d80)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5c80), 0x60, add(transcript, 0x5c80), 0x40), 1), success)mstore(add(transcript, 0x5ce0), mload(add(transcript, 0x5c00))) mstore(add(transcript, 0x5d00), mload(add(transcript, 0x5c20)))mstore(add(transcript, 0x5d20), mload(add(transcript, 0x5c80))) mstore(add(transcript, 0x5d40), mload(add(transcript, 0x5ca0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5ce0), 0x80, add(transcript, 0x5ce0), 0x40), 1), success)mstore(add(transcript, 0x5d60), 0x0474ae1c4230bdcdd25ce460ef73c689e4227edf0ec7c2be85ef8d75592e1b36) mstore(add(transcript, 0x5d80), 0x2fd83e6e07cc35755a04337fd70af8aa31fc74de07a539b8a8756caa60d04890)mstore(add(transcript, 0x5da0), mload(add(transcript, 0x4da0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5d60), 0x60, add(transcript, 0x5d60), 0x40), 1), success)mstore(add(transcript, 0x5dc0), mload(add(transcript, 0x5ce0))) mstore(add(transcript, 0x5de0), mload(add(transcript, 0x5d00)))mstore(add(transcript, 0x5e00), mload(add(transcript, 0x5d60))) mstore(add(transcript, 0x5e20), mload(add(transcript, 0x5d80)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5dc0), 0x80, add(transcript, 0x5dc0), 0x40), 1), success)mstore(add(transcript, 0x5e40), 0x1c6f93aef795f525c8b51bcb0234bb345942cc31782bf75096fff2707f3e4b9f) mstore(add(transcript, 0x5e60), 0x1bf84b761871a3311b096d870534b0a4b095330cd45fbe7bbbf5b353a980c39d)mstore(add(transcript, 0x5e80), mload(add(transcript, 0x4dc0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5e40), 0x60, add(transcript, 0x5e40), 0x40), 1), success)mstore(add(transcript, 0x5ea0), mload(add(transcript, 0x5dc0))) mstore(add(transcript, 0x5ec0), mload(add(transcript, 0x5de0)))mstore(add(transcript, 0x5ee0), mload(add(transcript, 0x5e40))) mstore(add(transcript, 0x5f00), mload(add(transcript, 0x5e60)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5ea0), 0x80, add(transcript, 0x5ea0), 0x40), 1), success)mstore(add(transcript, 0x5f20), 0x07609ba791f0ed5d569091041c800974b8440bc5c0f97d9b6295a1632175116c) mstore(add(transcript, 0x5f40), 0x1cdb0412f38e1a19531afbd1c9603146e7bd1c34a93df6be4c65b126e3537b68)mstore(add(transcript, 0x5f60), mload(add(transcript, 0x4de0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5f20), 0x60, add(transcript, 0x5f20), 0x40), 1), success)mstore(add(transcript, 0x5f80), mload(add(transcript, 0x5ea0))) mstore(add(transcript, 0x5fa0), mload(add(transcript, 0x5ec0)))mstore(add(transcript, 0x5fc0), mload(add(transcript, 0x5f20))) mstore(add(transcript, 0x5fe0), mload(add(transcript, 0x5f40)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5f80), 0x80, add(transcript, 0x5f80), 0x40), 1), success)mstore(add(transcript, 0x6000), 0x0e955b89eca5fc34d2172022f89dc467ac2e84c9929e1ce0c2a8ce831c5dd701) mstore(add(transcript, 0x6020), 0x07cf929adce614b088c82cb3934f1eb7546dd2e48396e914b4ff06ec45de9e8a)mstore(add(transcript, 0x6040), mload(add(transcript, 0x4e00)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6000), 0x60, add(transcript, 0x6000), 0x40), 1), success)mstore(add(transcript, 0x6060), mload(add(transcript, 0x5f80))) mstore(add(transcript, 0x6080), mload(add(transcript, 0x5fa0)))mstore(add(transcript, 0x60a0), mload(add(transcript, 0x6000))) mstore(add(transcript, 0x60c0), mload(add(transcript, 0x6020)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6060), 0x80, add(transcript, 0x6060), 0x40), 1), success)mstore(add(transcript, 0x60e0), 0x2d4531a47528e642f8f6954a3f3ff9f6072e38d30e2e0d108d1cac201d4b684d) mstore(add(transcript, 0x6100), 0x154c409bbd1760ec55639d32d5817c9399e573b22a8fdda5f707c9b9de1d4ca6)mstore(add(transcript, 0x6120), mload(add(transcript, 0x4e20)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x60e0), 0x60, add(transcript, 0x60e0), 0x40), 1), success)mstore(add(transcript, 0x6140), mload(add(transcript, 0x6060))) mstore(add(transcript, 0x6160), mload(add(transcript, 0x6080)))mstore(add(transcript, 0x6180), mload(add(transcript, 0x60e0))) mstore(add(transcript, 0x61a0), mload(add(transcript, 0x6100)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6140), 0x80, add(transcript, 0x6140), 0x40), 1), success)mstore(add(transcript, 0x61c0), 0x2dec3929e07b4276215297f5f653b3ec6bf9b910006678ab3c3d67654001d6da) mstore(add(transcript, 0x61e0), 0x20b9c7e9a6c29e31e9164962de9a0478aa976e72a2e2d0e9c9ab6fabbb20ba49)mstore(add(transcript, 0x6200), mload(add(transcript, 0x4e40)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x61c0), 0x60, add(transcript, 0x61c0), 0x40), 1), success)mstore(add(transcript, 0x6220), mload(add(transcript, 0x6140))) mstore(add(transcript, 0x6240), mload(add(transcript, 0x6160)))mstore(add(transcript, 0x6260), mload(add(transcript, 0x61c0))) mstore(add(transcript, 0x6280), mload(add(transcript, 0x61e0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6220), 0x80, add(transcript, 0x6220), 0x40), 1), success)mstore(add(transcript, 0x62a0), 0x0476c7f154f703672add74ffebc6ffa6159b4e527f0a4354b601facd57ff1a1a) mstore(add(transcript, 0x62c0), 0x27c10290f730edad9bcb2538056f755efea924b0a69d86d5c9c833717e730e28)mstore(add(transcript, 0x62e0), mload(add(transcript, 0x4e60)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x62a0), 0x60, add(transcript, 0x62a0), 0x40), 1), success)mstore(add(transcript, 0x6300), mload(add(transcript, 0x6220))) mstore(add(transcript, 0x6320), mload(add(transcript, 0x6240)))mstore(add(transcript, 0x6340), mload(add(transcript, 0x62a0))) mstore(add(transcript, 0x6360), mload(add(transcript, 0x62c0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6300), 0x80, add(transcript, 0x6300), 0x40), 1), success)mstore(add(transcript, 0x6380), 0x0743ea40f14084db2673217283aa053f986896ee7c181f52118442e99c452974) mstore(add(transcript, 0x63a0), 0x0203e3493a2594ece57d22cc75dd081ac68271ec7c758153cfd2152bfb5c19e3)mstore(add(transcript, 0x63c0), mload(add(transcript, 0x4e80)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6380), 0x60, add(transcript, 0x6380), 0x40), 1), success)mstore(add(transcript, 0x63e0), mload(add(transcript, 0x6300))) mstore(add(transcript, 0x6400), mload(add(transcript, 0x6320)))mstore(add(transcript, 0x6420), mload(add(transcript, 0x6380))) mstore(add(transcript, 0x6440), mload(add(transcript, 0x63a0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x63e0), 0x80, add(transcript, 0x63e0), 0x40), 1), success)mstore(add(transcript, 0x6460), 0x1e87eb88577795c9f28c423b4d2c3ec1e890164466ea9742d9996ae5c3b80a2a) mstore(add(transcript, 0x6480), 0x00b004814b24c7c7a9dc56ffa03d4f2b7e0f5605f3bb18deddf9e63978abbc56)mstore(add(transcript, 0x64a0), mload(add(transcript, 0x4ea0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6460), 0x60, add(transcript, 0x6460), 0x40), 1), success)mstore(add(transcript, 0x64c0), mload(add(transcript, 0x63e0))) mstore(add(transcript, 0x64e0), mload(add(transcript, 0x6400)))mstore(add(transcript, 0x6500), mload(add(transcript, 0x6460))) mstore(add(transcript, 0x6520), mload(add(transcript, 0x6480)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x64c0), 0x80, add(transcript, 0x64c0), 0x40), 1), success)mstore(add(transcript, 0x6540), 0x20e2c72c77bcc14c0e9801d47d3ab42674027a82cde0955f1b17e5cad25edfb0) mstore(add(transcript, 0x6560), 0x0350deaf2bcf4305e811ba811ccaae83d66761627e0a4eade1205c1cb0cfcd78)mstore(add(transcript, 0x6580), mload(add(transcript, 0x4ec0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6540), 0x60, add(transcript, 0x6540), 0x40), 1), success)mstore(add(transcript, 0x65a0), mload(add(transcript, 0x64c0))) mstore(add(transcript, 0x65c0), mload(add(transcript, 0x64e0)))mstore(add(transcript, 0x65e0), mload(add(transcript, 0x6540))) mstore(add(transcript, 0x6600), mload(add(transcript, 0x6560)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x65a0), 0x80, add(transcript, 0x65a0), 0x40), 1), success)mstore(add(transcript, 0x6620), mload(add(transcript, 0x460))) mstore(add(transcript, 0x6640), mload(add(transcript, 0x480)))mstore(add(transcript, 0x6660), mload(add(transcript, 0x4ee0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6620), 0x60, add(transcript, 0x6620), 0x40), 1), success)mstore(add(transcript, 0x6680), mload(add(transcript, 0x65a0))) mstore(add(transcript, 0x66a0), mload(add(transcript, 0x65c0)))mstore(add(transcript, 0x66c0), mload(add(transcript, 0x6620))) mstore(add(transcript, 0x66e0), mload(add(transcript, 0x6640)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6680), 0x80, add(transcript, 0x6680), 0x40), 1), success)mstore(add(transcript, 0x6700), mload(add(transcript, 0x4a0))) mstore(add(transcript, 0x6720), mload(add(transcript, 0x4c0)))mstore(add(transcript, 0x6740), mload(add(transcript, 0x4f00)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6700), 0x60, add(transcript, 0x6700), 0x40), 1), success)mstore(add(transcript, 0x6760), mload(add(transcript, 0x6680))) mstore(add(transcript, 0x6780), mload(add(transcript, 0x66a0)))mstore(add(transcript, 0x67a0), mload(add(transcript, 0x6700))) mstore(add(transcript, 0x67c0), mload(add(transcript, 0x6720)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6760), 0x80, add(transcript, 0x6760), 0x40), 1), success)mstore(add(transcript, 0x67e0), mload(add(transcript, 0x4e0))) mstore(add(transcript, 0x6800), mload(add(transcript, 0x500)))mstore(add(transcript, 0x6820), mload(add(transcript, 0x4f20)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x67e0), 0x60, add(transcript, 0x67e0), 0x40), 1), success)mstore(add(transcript, 0x6840), mload(add(transcript, 0x6760))) mstore(add(transcript, 0x6860), mload(add(transcript, 0x6780)))mstore(add(transcript, 0x6880), mload(add(transcript, 0x67e0))) mstore(add(transcript, 0x68a0), mload(add(transcript, 0x6800)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6840), 0x80, add(transcript, 0x6840), 0x40), 1), success)mstore(add(transcript, 0x68c0), mload(add(transcript, 0x520))) mstore(add(transcript, 0x68e0), mload(add(transcript, 0x540)))mstore(add(transcript, 0x6900), mload(add(transcript, 0x4f40)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x68c0), 0x60, add(transcript, 0x68c0), 0x40), 1), success)mstore(add(transcript, 0x6920), mload(add(transcript, 0x6840))) mstore(add(transcript, 0x6940), mload(add(transcript, 0x6860)))mstore(add(transcript, 0x6960), mload(add(transcript, 0x68c0))) mstore(add(transcript, 0x6980), mload(add(transcript, 0x68e0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6920), 0x80, add(transcript, 0x6920), 0x40), 1), success)mstore(add(transcript, 0x69a0), mload(add(transcript, 0x560))) mstore(add(transcript, 0x69c0), mload(add(transcript, 0x580)))mstore(add(transcript, 0x69e0), mload(add(transcript, 0x4f60)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x69a0), 0x60, add(transcript, 0x69a0), 0x40), 1), success)mstore(add(transcript, 0x6a00), mload(add(transcript, 0x6920))) mstore(add(transcript, 0x6a20), mload(add(transcript, 0x6940)))mstore(add(transcript, 0x6a40), mload(add(transcript, 0x69a0))) mstore(add(transcript, 0x6a60), mload(add(transcript, 0x69c0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6a00), 0x80, add(transcript, 0x6a00), 0x40), 1), success)mstore(add(transcript, 0x6a80), mload(add(transcript, 0x3c0))) mstore(add(transcript, 0x6aa0), mload(add(transcript, 0x3e0)))mstore(add(transcript, 0x6ac0), mload(add(transcript, 0x4f80)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6a80), 0x60, add(transcript, 0x6a80), 0x40), 1), success)mstore(add(transcript, 0x6ae0), mload(add(transcript, 0x6a00))) mstore(add(transcript, 0x6b00), mload(add(transcript, 0x6a20)))mstore(add(transcript, 0x6b20), mload(add(transcript, 0x6a80))) mstore(add(transcript, 0x6b40), mload(add(transcript, 0x6aa0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6ae0), 0x80, add(transcript, 0x6ae0), 0x40), 1), success)mstore(add(transcript, 0x6b60), mload(add(transcript, 0x300))) mstore(add(transcript, 0x6b80), mload(add(transcript, 0x320)))mstore(add(transcript, 0x6ba0), mload(add(transcript, 0x5080)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6b60), 0x60, add(transcript, 0x6b60), 0x40), 1), success)mstore(add(transcript, 0x6bc0), mload(add(transcript, 0x6ae0))) mstore(add(transcript, 0x6be0), mload(add(transcript, 0x6b00)))mstore(add(transcript, 0x6c00), mload(add(transcript, 0x6b60))) mstore(add(transcript, 0x6c20), mload(add(transcript, 0x6b80)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6bc0), 0x80, add(transcript, 0x6bc0), 0x40), 1), success)mstore(add(transcript, 0x6c40), mload(add(transcript, 0x340))) mstore(add(transcript, 0x6c60), mload(add(transcript, 0x360)))mstore(add(transcript, 0x6c80), mload(add(transcript, 0x5220)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6c40), 0x60, add(transcript, 0x6c40), 0x40), 1), success)mstore(add(transcript, 0x6ca0), mload(add(transcript, 0x6bc0))) mstore(add(transcript, 0x6cc0), mload(add(transcript, 0x6be0)))mstore(add(transcript, 0x6ce0), mload(add(transcript, 0x6c40))) mstore(add(transcript, 0x6d00), mload(add(transcript, 0x6c60)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6ca0), 0x80, add(transcript, 0x6ca0), 0x40), 1), success)mstore(add(transcript, 0x6d20), mload(add(transcript, 0x380))) mstore(add(transcript, 0x6d40), mload(add(transcript, 0x3a0)))mstore(add(transcript, 0x6d60), mload(add(transcript, 0x5240)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6d20), 0x60, add(transcript, 0x6d20), 0x40), 1), success)mstore(add(transcript, 0x6d80), mload(add(transcript, 0x6ca0))) mstore(add(transcript, 0x6da0), mload(add(transcript, 0x6cc0)))mstore(add(transcript, 0x6dc0), mload(add(transcript, 0x6d20))) mstore(add(transcript, 0x6de0), mload(add(transcript, 0x6d40)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6d80), 0x80, add(transcript, 0x6d80), 0x40), 1), success)mstore(add(transcript, 0x6e00), mload(add(transcript, 0x1c0))) mstore(add(transcript, 0x6e20), mload(add(transcript, 0x1e0)))mstore(add(transcript, 0x6e40), mload(add(transcript, 0x5340)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6e00), 0x60, add(transcript, 0x6e00), 0x40), 1), success)mstore(add(transcript, 0x6e60), mload(add(transcript, 0x6d80))) mstore(add(transcript, 0x6e80), mload(add(transcript, 0x6da0)))mstore(add(transcript, 0x6ea0), mload(add(transcript, 0x6e00))) mstore(add(transcript, 0x6ec0), mload(add(transcript, 0x6e20)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6e60), 0x80, add(transcript, 0x6e60), 0x40), 1), success)mstore(add(transcript, 0x6ee0), mload(add(transcript, 0xb20))) mstore(add(transcript, 0x6f00), mload(add(transcript, 0xb40)))mstore(add(transcript, 0x6f20), sub(f_q, mload(add(transcript, 0x5380))))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6ee0), 0x60, add(transcript, 0x6ee0), 0x40), 1), success)mstore(add(transcript, 0x6f40), mload(add(transcript, 0x6e60))) mstore(add(transcript, 0x6f60), mload(add(transcript, 0x6e80)))mstore(add(transcript, 0x6f80), mload(add(transcript, 0x6ee0))) mstore(add(transcript, 0x6fa0), mload(add(transcript, 0x6f00)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6f40), 0x80, add(transcript, 0x6f40), 0x40), 1), success)mstore(add(transcript, 0x6fc0), mload(add(transcript, 0xbc0))) mstore(add(transcript, 0x6fe0), mload(add(transcript, 0xbe0)))mstore(add(transcript, 0x7000), mload(add(transcript, 0x53a0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6fc0), 0x60, add(transcript, 0x6fc0), 0x40), 1), success)mstore(add(transcript, 0x7020), mload(add(transcript, 0x6f40))) mstore(add(transcript, 0x7040), mload(add(transcript, 0x6f60)))mstore(add(transcript, 0x7060), mload(add(transcript, 0x6fc0))) mstore(add(transcript, 0x7080), mload(add(transcript, 0x6fe0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x7020), 0x80, add(transcript, 0x7020), 0x40), 1), success)mstore(add(transcript, 0x70a0), mload(add(transcript, 0x7020))) mstore(add(transcript, 0x70c0), mload(add(transcript, 0x7040)))mstore(add(transcript, 0x70e0), 0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2) mstore(add(transcript, 0x7100), 0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed) mstore(add(transcript, 0x7120), 0x090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b) mstore(add(transcript, 0x7140), 0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa)mstore(add(transcript, 0x7160), mload(add(transcript, 0xbc0))) mstore(add(transcript, 0x7180), mload(add(transcript, 0xbe0)))mstore(add(transcript, 0x71a0), 0x26186a2d65ee4d2f9c9a5b91f86597d35f192cd120caf7e935d8443d1938e23d) mstore(add(transcript, 0x71c0), 0x30441fd1b5d3370482c42152a8899027716989a6996c2535bc9f7fee8aaef79e) mstore(add(transcript, 0x71e0), 0x16f363f103c80d7bbc8ad3c6867e0822bbc6000be91a4689755c7df40221c145) mstore(add(transcript, 0x7200), 0x2b1cbb3e521edf5a622d82762a44a5e63f1e50b332d71154a4a7958d6011deff)success := and(eq(staticcall(gas(), 0x8, add(transcript, 0x70a0), 0x180, add(transcript, 0x70a0), 0x20), 1), success)success := and(eq(mload(add(transcript, 0x70a0)), 1), success)} return success; } } + assembly { let f_p := 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47 let f_q := 0x30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001 function validate_ec_point(x, y) -> valid { { let x_lt_p := lt(x, 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47) let y_lt_p := lt(y, 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47) valid := and(x_lt_p, y_lt_p) } { let y_square := mulmod(y, y, 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47) let x_square := mulmod(x, x, 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47) let x_cube := mulmod(x_square, x, 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47) let x_cube_plus_3 := addmod(x_cube, 3, 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47) let is_affine := eq(x_cube_plus_3, y_square) valid := and(valid, is_affine) } } mstore(add(transcript, 0x20), mod(mload(add(pubInputs, 0x20)), f_q))mstore(add(transcript, 0x40), mod(mload(add(pubInputs, 0x40)), f_q))mstore(add(transcript, 0x60), mod(mload(add(pubInputs, 0x60)), f_q))mstore(add(transcript, 0x80), mod(mload(add(pubInputs, 0x80)), f_q))mstore(add(transcript, 0x0), 10713647047137275325514842673052213194938514302175862889195177290473686162583) { let x := mload(add(proof, 0x20)) mstore(add(transcript, 0xa0), x) let y := mload(add(proof, 0x40)) mstore(add(transcript, 0xc0), y) success := and(validate_ec_point(x, y), success) } { let x := mload(add(proof, 0x60)) mstore(add(transcript, 0xe0), x) let y := mload(add(proof, 0x80)) mstore(add(transcript, 0x100), y) success := and(validate_ec_point(x, y), success) } { let x := mload(add(proof, 0xa0)) mstore(add(transcript, 0x120), x) let y := mload(add(proof, 0xc0)) mstore(add(transcript, 0x140), y) success := and(validate_ec_point(x, y), success) }mstore(add(transcript, 0x160), keccak256(add(transcript, 0x0), 352)){ let hash := mload(add(transcript, 0x160)) mstore(add(transcript, 0x180), mod(hash, f_q)) mstore(add(transcript, 0x1a0), hash) } { let x := mload(add(proof, 0xe0)) mstore(add(transcript, 0x1c0), x) let y := mload(add(proof, 0x100)) mstore(add(transcript, 0x1e0), y) success := and(validate_ec_point(x, y), success) } { let x := mload(add(proof, 0x120)) mstore(add(transcript, 0x200), x) let y := mload(add(proof, 0x140)) mstore(add(transcript, 0x220), y) success := and(validate_ec_point(x, y), success) }mstore(add(transcript, 0x240), keccak256(add(transcript, 0x1a0), 160)){ let hash := mload(add(transcript, 0x240)) mstore(add(transcript, 0x260), mod(hash, f_q)) mstore(add(transcript, 0x280), hash) }mstore8(add(transcript, 0x2a0), 1)mstore(add(transcript, 0x2a0), keccak256(add(transcript, 0x280), 33)){ let hash := mload(add(transcript, 0x2a0)) mstore(add(transcript, 0x2c0), mod(hash, f_q)) mstore(add(transcript, 0x2e0), hash) } { let x := mload(add(proof, 0x160)) mstore(add(transcript, 0x300), x) let y := mload(add(proof, 0x180)) mstore(add(transcript, 0x320), y) success := and(validate_ec_point(x, y), success) } { let x := mload(add(proof, 0x1a0)) mstore(add(transcript, 0x340), x) let y := mload(add(proof, 0x1c0)) mstore(add(transcript, 0x360), y) success := and(validate_ec_point(x, y), success) } { let x := mload(add(proof, 0x1e0)) mstore(add(transcript, 0x380), x) let y := mload(add(proof, 0x200)) mstore(add(transcript, 0x3a0), y) success := and(validate_ec_point(x, y), success) } { let x := mload(add(proof, 0x220)) mstore(add(transcript, 0x3c0), x) let y := mload(add(proof, 0x240)) mstore(add(transcript, 0x3e0), y) success := and(validate_ec_point(x, y), success) }mstore(add(transcript, 0x400), keccak256(add(transcript, 0x2e0), 288)){ let hash := mload(add(transcript, 0x400)) mstore(add(transcript, 0x420), mod(hash, f_q)) mstore(add(transcript, 0x440), hash) } { let x := mload(add(proof, 0x260)) mstore(add(transcript, 0x460), x) let y := mload(add(proof, 0x280)) mstore(add(transcript, 0x480), y) success := and(validate_ec_point(x, y), success) } { let x := mload(add(proof, 0x2a0)) mstore(add(transcript, 0x4a0), x) let y := mload(add(proof, 0x2c0)) mstore(add(transcript, 0x4c0), y) success := and(validate_ec_point(x, y), success) } { let x := mload(add(proof, 0x2e0)) mstore(add(transcript, 0x4e0), x) let y := mload(add(proof, 0x300)) mstore(add(transcript, 0x500), y) success := and(validate_ec_point(x, y), success) } { let x := mload(add(proof, 0x320)) mstore(add(transcript, 0x520), x) let y := mload(add(proof, 0x340)) mstore(add(transcript, 0x540), y) success := and(validate_ec_point(x, y), success) } { let x := mload(add(proof, 0x360)) mstore(add(transcript, 0x560), x) let y := mload(add(proof, 0x380)) mstore(add(transcript, 0x580), y) success := and(validate_ec_point(x, y), success) }mstore(add(transcript, 0x5a0), keccak256(add(transcript, 0x440), 352)){ let hash := mload(add(transcript, 0x5a0)) mstore(add(transcript, 0x5c0), mod(hash, f_q)) mstore(add(transcript, 0x5e0), hash) }mstore(add(transcript, 0x600), mod(mload(add(proof, 0x3a0)), f_q))mstore(add(transcript, 0x620), mod(mload(add(proof, 0x3c0)), f_q))mstore(add(transcript, 0x640), mod(mload(add(proof, 0x3e0)), f_q))mstore(add(transcript, 0x660), mod(mload(add(proof, 0x400)), f_q))mstore(add(transcript, 0x680), mod(mload(add(proof, 0x420)), f_q))mstore(add(transcript, 0x6a0), mod(mload(add(proof, 0x440)), f_q))mstore(add(transcript, 0x6c0), mod(mload(add(proof, 0x460)), f_q))mstore(add(transcript, 0x6e0), mod(mload(add(proof, 0x480)), f_q))mstore(add(transcript, 0x700), mod(mload(add(proof, 0x4a0)), f_q))mstore(add(transcript, 0x720), mod(mload(add(proof, 0x4c0)), f_q))mstore(add(transcript, 0x740), mod(mload(add(proof, 0x4e0)), f_q))mstore(add(transcript, 0x760), mod(mload(add(proof, 0x500)), f_q))mstore(add(transcript, 0x780), mod(mload(add(proof, 0x520)), f_q))mstore(add(transcript, 0x7a0), mod(mload(add(proof, 0x540)), f_q))mstore(add(transcript, 0x7c0), mod(mload(add(proof, 0x560)), f_q))mstore(add(transcript, 0x7e0), mod(mload(add(proof, 0x580)), f_q))mstore(add(transcript, 0x800), mod(mload(add(proof, 0x5a0)), f_q))mstore(add(transcript, 0x820), mod(mload(add(proof, 0x5c0)), f_q))mstore(add(transcript, 0x840), mod(mload(add(proof, 0x5e0)), f_q))mstore(add(transcript, 0x860), mod(mload(add(proof, 0x600)), f_q))mstore(add(transcript, 0x880), mod(mload(add(proof, 0x620)), f_q))mstore(add(transcript, 0x8a0), mod(mload(add(proof, 0x640)), f_q))mstore(add(transcript, 0x8c0), mod(mload(add(proof, 0x660)), f_q))mstore(add(transcript, 0x8e0), mod(mload(add(proof, 0x680)), f_q))mstore(add(transcript, 0x900), mod(mload(add(proof, 0x6a0)), f_q))mstore(add(transcript, 0x920), mod(mload(add(proof, 0x6c0)), f_q))mstore(add(transcript, 0x940), mod(mload(add(proof, 0x6e0)), f_q))mstore(add(transcript, 0x960), mod(mload(add(proof, 0x700)), f_q))mstore(add(transcript, 0x980), mod(mload(add(proof, 0x720)), f_q))mstore(add(transcript, 0x9a0), mod(mload(add(proof, 0x740)), f_q))mstore(add(transcript, 0x9c0), mod(mload(add(proof, 0x760)), f_q))mstore(add(transcript, 0x9e0), mod(mload(add(proof, 0x780)), f_q))mstore(add(transcript, 0xa00), mod(mload(add(proof, 0x7a0)), f_q))mstore(add(transcript, 0xa20), mod(mload(add(proof, 0x7c0)), f_q))mstore(add(transcript, 0xa40), mod(mload(add(proof, 0x7e0)), f_q))mstore(add(transcript, 0xa60), keccak256(add(transcript, 0x5e0), 1152)){ let hash := mload(add(transcript, 0xa60)) mstore(add(transcript, 0xa80), mod(hash, f_q)) mstore(add(transcript, 0xaa0), hash) }mstore8(add(transcript, 0xac0), 1)mstore(add(transcript, 0xac0), keccak256(add(transcript, 0xaa0), 33)){ let hash := mload(add(transcript, 0xac0)) mstore(add(transcript, 0xae0), mod(hash, f_q)) mstore(add(transcript, 0xb00), hash) } { let x := mload(add(proof, 0x800)) mstore(add(transcript, 0xb20), x) let y := mload(add(proof, 0x820)) mstore(add(transcript, 0xb40), y) success := and(validate_ec_point(x, y), success) }mstore(add(transcript, 0xb60), keccak256(add(transcript, 0xb00), 96)){ let hash := mload(add(transcript, 0xb60)) mstore(add(transcript, 0xb80), mod(hash, f_q)) mstore(add(transcript, 0xba0), hash) } { let x := mload(add(proof, 0x840)) mstore(add(transcript, 0xbc0), x) let y := mload(add(proof, 0x860)) mstore(add(transcript, 0xbe0), y) success := and(validate_ec_point(x, y), success) }mstore(add(transcript, 0xc00), mulmod(mload(add(transcript, 0x5c0)), mload(add(transcript, 0x5c0)), f_q))mstore(add(transcript, 0xc20), mulmod(mload(add(transcript, 0xc00)), mload(add(transcript, 0xc00)), f_q))mstore(add(transcript, 0xc40), mulmod(mload(add(transcript, 0xc20)), mload(add(transcript, 0xc20)), f_q))mstore(add(transcript, 0xc60), mulmod(mload(add(transcript, 0xc40)), mload(add(transcript, 0xc40)), f_q))mstore(add(transcript, 0xc80), mulmod(mload(add(transcript, 0xc60)), mload(add(transcript, 0xc60)), f_q))mstore(add(transcript, 0xca0), mulmod(mload(add(transcript, 0xc80)), mload(add(transcript, 0xc80)), f_q))mstore(add(transcript, 0xcc0), mulmod(mload(add(transcript, 0xca0)), mload(add(transcript, 0xca0)), f_q))mstore(add(transcript, 0xce0), mulmod(mload(add(transcript, 0xcc0)), mload(add(transcript, 0xcc0)), f_q))mstore(add(transcript, 0xd00), mulmod(mload(add(transcript, 0xce0)), mload(add(transcript, 0xce0)), f_q))mstore(add(transcript, 0xd20), mulmod(mload(add(transcript, 0xd00)), mload(add(transcript, 0xd00)), f_q))mstore(add(transcript, 0xd40), mulmod(mload(add(transcript, 0xd20)), mload(add(transcript, 0xd20)), f_q))mstore(add(transcript, 0xd60), addmod(mload(add(transcript, 0xd40)), 21888242871839275222246405745257275088548364400416034343698204186575808495616, f_q))mstore(add(transcript, 0xd80), mulmod(mload(add(transcript, 0xd60)), 21877555253249509951141793242451973684696534144361143701928820297812832026625, f_q))mstore(add(transcript, 0xda0), mulmod(mload(add(transcript, 0xd80)), 15699029810934084314820646074566828280617789951162923449200398535581206172418, f_q))mstore(add(transcript, 0xdc0), addmod(mload(add(transcript, 0x5c0)), 6189213060905190907425759670690446807930574449253110894497805650994602323199, f_q))mstore(add(transcript, 0xde0), mulmod(mload(add(transcript, 0xd80)), 16553167948716468074998850291160946772606011499093267774599468837293218566225, f_q))mstore(add(transcript, 0xe00), addmod(mload(add(transcript, 0x5c0)), 5335074923122807147247555454096328315942352901322766569098735349282589929392, f_q))mstore(add(transcript, 0xe20), mulmod(mload(add(transcript, 0xd80)), 4260969412351770314333984243767775737437927068151180798236715529158398853173, f_q))mstore(add(transcript, 0xe40), addmod(mload(add(transcript, 0x5c0)), 17627273459487504907912421501489499351110437332264853545461488657417409642444, f_q))mstore(add(transcript, 0xe60), mulmod(mload(add(transcript, 0xd80)), 18302882236472339419631414285403968768409802182737928837767912484847322191909, f_q))mstore(add(transcript, 0xe80), addmod(mload(add(transcript, 0x5c0)), 3585360635366935802614991459853306320138562217678105505930291701728486303708, f_q))mstore(add(transcript, 0xea0), mulmod(mload(add(transcript, 0xd80)), 4925592601992654644734291590386747644864797672605745962807370354577123815907, f_q))mstore(add(transcript, 0xec0), addmod(mload(add(transcript, 0x5c0)), 16962650269846620577512114154870527443683566727810288380890833831998684679710, f_q))mstore(add(transcript, 0xee0), mulmod(mload(add(transcript, 0xd80)), 19444693496467964793333684482470811869395409953158764080291550423779334624794, f_q))mstore(add(transcript, 0xf00), addmod(mload(add(transcript, 0x5c0)), 2443549375371310428912721262786463219152954447257270263406653762796473870823, f_q))mstore(add(transcript, 0xf20), mulmod(mload(add(transcript, 0xd80)), 1, f_q))mstore(add(transcript, 0xf40), addmod(mload(add(transcript, 0x5c0)), 21888242871839275222246405745257275088548364400416034343698204186575808495616, f_q))mstore(add(transcript, 0xf60), mulmod(mload(add(transcript, 0xd80)), 9396103202274256930945606623206526900461945684265495839012435492634193195103, f_q))mstore(add(transcript, 0xf80), addmod(mload(add(transcript, 0x5c0)), 12492139669565018291300799122050748188086418716150538504685768693941615300514, f_q))mstore(add(transcript, 0xfa0), mulmod(mload(add(transcript, 0xd80)), 19380560087801265747114831706136320509424814679569278834391540198888293317501, f_q))mstore(add(transcript, 0xfc0), addmod(mload(add(transcript, 0x5c0)), 2507682784038009475131574039120954579123549720846755509306663987687515178116, f_q))mstore(add(transcript, 0xfe0), mulmod(mload(add(transcript, 0xd80)), 11322573621548282883955256084347882816245615123967859588024989498742209856615, f_q))mstore(add(transcript, 0x1000), addmod(mload(add(transcript, 0x5c0)), 10565669250290992338291149660909392272302749276448174755673214687833598639002, f_q)){ let prod := mload(add(transcript, 0xdc0)) prod := mulmod(mload(add(transcript, 0xe00)), prod, f_q) mstore(add(transcript, 0x1020), prod) prod := mulmod(mload(add(transcript, 0xe40)), prod, f_q) mstore(add(transcript, 0x1040), prod) prod := mulmod(mload(add(transcript, 0xe80)), prod, f_q) mstore(add(transcript, 0x1060), prod) prod := mulmod(mload(add(transcript, 0xec0)), prod, f_q) mstore(add(transcript, 0x1080), prod) prod := mulmod(mload(add(transcript, 0xf00)), prod, f_q) mstore(add(transcript, 0x10a0), prod) prod := mulmod(mload(add(transcript, 0xf40)), prod, f_q) mstore(add(transcript, 0x10c0), prod) prod := mulmod(mload(add(transcript, 0xf80)), prod, f_q) mstore(add(transcript, 0x10e0), prod) prod := mulmod(mload(add(transcript, 0xfc0)), prod, f_q) mstore(add(transcript, 0x1100), prod) prod := mulmod(mload(add(transcript, 0x1000)), prod, f_q) mstore(add(transcript, 0x1120), prod) prod := mulmod(mload(add(transcript, 0xd60)), prod, f_q) mstore(add(transcript, 0x1140), prod) }mstore(add(transcript, 0x1180), 32)mstore(add(transcript, 0x11a0), 32)mstore(add(transcript, 0x11c0), 32)mstore(add(transcript, 0x11e0), mload(add(transcript, 0x1140)))mstore(add(transcript, 0x1200), 21888242871839275222246405745257275088548364400416034343698204186575808495615)mstore(add(transcript, 0x1220), 21888242871839275222246405745257275088548364400416034343698204186575808495617)success := and(eq(staticcall(gas(), 0x5, add(transcript, 0x1180), 0xc0, add(transcript, 0x1160), 0x20), 1), success){ let inv := mload(add(transcript, 0x1160)) let v v := mload(add(transcript, 0xd60)) mstore(add(transcript, 0xd60), mulmod(mload(add(transcript, 0x1120)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x1000)) mstore(add(transcript, 0x1000), mulmod(mload(add(transcript, 0x1100)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0xfc0)) mstore(add(transcript, 0xfc0), mulmod(mload(add(transcript, 0x10e0)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0xf80)) mstore(add(transcript, 0xf80), mulmod(mload(add(transcript, 0x10c0)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0xf40)) mstore(add(transcript, 0xf40), mulmod(mload(add(transcript, 0x10a0)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0xf00)) mstore(add(transcript, 0xf00), mulmod(mload(add(transcript, 0x1080)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0xec0)) mstore(add(transcript, 0xec0), mulmod(mload(add(transcript, 0x1060)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0xe80)) mstore(add(transcript, 0xe80), mulmod(mload(add(transcript, 0x1040)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0xe40)) mstore(add(transcript, 0xe40), mulmod(mload(add(transcript, 0x1020)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0xe00)) mstore(add(transcript, 0xe00), mulmod(mload(add(transcript, 0xdc0)), inv, f_q)) inv := mulmod(v, inv, f_q) mstore(add(transcript, 0xdc0), inv) }mstore(add(transcript, 0x1240), mulmod(mload(add(transcript, 0xda0)), mload(add(transcript, 0xdc0)), f_q))mstore(add(transcript, 0x1260), mulmod(mload(add(transcript, 0xde0)), mload(add(transcript, 0xe00)), f_q))mstore(add(transcript, 0x1280), mulmod(mload(add(transcript, 0xe20)), mload(add(transcript, 0xe40)), f_q))mstore(add(transcript, 0x12a0), mulmod(mload(add(transcript, 0xe60)), mload(add(transcript, 0xe80)), f_q))mstore(add(transcript, 0x12c0), mulmod(mload(add(transcript, 0xea0)), mload(add(transcript, 0xec0)), f_q))mstore(add(transcript, 0x12e0), mulmod(mload(add(transcript, 0xee0)), mload(add(transcript, 0xf00)), f_q))mstore(add(transcript, 0x1300), mulmod(mload(add(transcript, 0xf20)), mload(add(transcript, 0xf40)), f_q))mstore(add(transcript, 0x1320), mulmod(mload(add(transcript, 0xf60)), mload(add(transcript, 0xf80)), f_q))mstore(add(transcript, 0x1340), mulmod(mload(add(transcript, 0xfa0)), mload(add(transcript, 0xfc0)), f_q))mstore(add(transcript, 0x1360), mulmod(mload(add(transcript, 0xfe0)), mload(add(transcript, 0x1000)), f_q)){ let result := mulmod(mload(add(transcript, 0x1300)), mload(add(transcript, 0x20)), f_q)result := addmod(mulmod(mload(add(transcript, 0x1320)), mload(add(transcript, 0x40)), f_q), result, f_q)result := addmod(mulmod(mload(add(transcript, 0x1340)), mload(add(transcript, 0x60)), f_q), result, f_q)result := addmod(mulmod(mload(add(transcript, 0x1360)), mload(add(transcript, 0x80)), f_q), result, f_q)mstore(add(transcript, 0x1380), result) }mstore(add(transcript, 0x13a0), addmod(mload(add(transcript, 0x600)), mload(add(transcript, 0x720)), f_q))mstore(add(transcript, 0x13c0), mulmod(mload(add(transcript, 0x13a0)), mload(add(transcript, 0x13a0)), f_q))mstore(add(transcript, 0x13e0), mulmod(mload(add(transcript, 0x13c0)), mload(add(transcript, 0x13c0)), f_q))mstore(add(transcript, 0x1400), mulmod(mload(add(transcript, 0x13a0)), mload(add(transcript, 0x13e0)), f_q))mstore(add(transcript, 0x1420), mulmod(mload(add(transcript, 0x1400)), 2910766817845651019878574839501801340070030115151021261302834310722729507541, f_q))mstore(add(transcript, 0x1440), addmod(mload(add(transcript, 0x620)), mload(add(transcript, 0x740)), f_q))mstore(add(transcript, 0x1460), mulmod(mload(add(transcript, 0x1440)), mload(add(transcript, 0x1440)), f_q))mstore(add(transcript, 0x1480), mulmod(mload(add(transcript, 0x1460)), mload(add(transcript, 0x1460)), f_q))mstore(add(transcript, 0x14a0), mulmod(mload(add(transcript, 0x1440)), mload(add(transcript, 0x1480)), f_q))mstore(add(transcript, 0x14c0), mulmod(mload(add(transcript, 0x14a0)), 19727366863391167538122140361473584127147630672623100827934084310230022599144, f_q))mstore(add(transcript, 0x14e0), addmod(mload(add(transcript, 0x1420)), mload(add(transcript, 0x14c0)), f_q))mstore(add(transcript, 0x1500), addmod(mload(add(transcript, 0x14e0)), sub(f_q, mload(add(transcript, 0x640))), f_q))mstore(add(transcript, 0x1520), mulmod(mload(add(transcript, 0x1500)), mload(add(transcript, 0x7c0)), f_q))mstore(add(transcript, 0x1540), mulmod(mload(add(transcript, 0x420)), mload(add(transcript, 0x1520)), f_q))mstore(add(transcript, 0x1560), mulmod(mload(add(transcript, 0x1400)), 5776684794125549462448597414050232243778680302179439492664047328281728356345, f_q))mstore(add(transcript, 0x1580), mulmod(mload(add(transcript, 0x14a0)), 8348174920934122550483593999453880006756108121341067172388445916328941978568, f_q))mstore(add(transcript, 0x15a0), addmod(mload(add(transcript, 0x1560)), mload(add(transcript, 0x1580)), f_q))mstore(add(transcript, 0x15c0), addmod(mload(add(transcript, 0x15a0)), sub(f_q, mload(add(transcript, 0x660))), f_q))mstore(add(transcript, 0x15e0), mulmod(mload(add(transcript, 0x15c0)), mload(add(transcript, 0x7c0)), f_q))mstore(add(transcript, 0x1600), addmod(mload(add(transcript, 0x1540)), mload(add(transcript, 0x15e0)), f_q))mstore(add(transcript, 0x1620), mulmod(mload(add(transcript, 0x420)), mload(add(transcript, 0x1600)), f_q))mstore(add(transcript, 0x1640), addmod(mload(add(transcript, 0x1400)), sub(f_q, mload(add(transcript, 0x680))), f_q))mstore(add(transcript, 0x1660), mulmod(mload(add(transcript, 0x1640)), mload(add(transcript, 0x7e0)), f_q))mstore(add(transcript, 0x1680), addmod(mload(add(transcript, 0x1620)), mload(add(transcript, 0x1660)), f_q))mstore(add(transcript, 0x16a0), mulmod(mload(add(transcript, 0x420)), mload(add(transcript, 0x1680)), f_q))mstore(add(transcript, 0x16c0), mulmod(mload(add(transcript, 0x680)), 2910766817845651019878574839501801340070030115151021261302834310722729507541, f_q))mstore(add(transcript, 0x16e0), mulmod(mload(add(transcript, 0x1440)), 19727366863391167538122140361473584127147630672623100827934084310230022599144, f_q))mstore(add(transcript, 0x1700), addmod(mload(add(transcript, 0x16c0)), mload(add(transcript, 0x16e0)), f_q))mstore(add(transcript, 0x1720), addmod(mload(add(transcript, 0x1700)), mload(add(transcript, 0x6e0)), f_q))mstore(add(transcript, 0x1740), mulmod(mload(add(transcript, 0x1720)), mload(add(transcript, 0x1720)), f_q))mstore(add(transcript, 0x1760), mulmod(mload(add(transcript, 0x1740)), mload(add(transcript, 0x1740)), f_q))mstore(add(transcript, 0x1780), mulmod(mload(add(transcript, 0x1720)), mload(add(transcript, 0x1760)), f_q))mstore(add(transcript, 0x17a0), mulmod(mload(add(transcript, 0x640)), 8897705321156975119607866206188469715432233408805434913352778521345836531302, f_q))mstore(add(transcript, 0x17c0), mulmod(mload(add(transcript, 0x660)), 13897810991298242824030978581179475767377101082166056046492926701399149797630, f_q))mstore(add(transcript, 0x17e0), addmod(mload(add(transcript, 0x17a0)), mload(add(transcript, 0x17c0)), f_q))mstore(add(transcript, 0x1800), addmod(mload(add(transcript, 0x1780)), sub(f_q, mload(add(transcript, 0x17e0))), f_q))mstore(add(transcript, 0x1820), mulmod(mload(add(transcript, 0x1800)), mload(add(transcript, 0x7e0)), f_q))mstore(add(transcript, 0x1840), addmod(mload(add(transcript, 0x16a0)), mload(add(transcript, 0x1820)), f_q))mstore(add(transcript, 0x1860), mulmod(mload(add(transcript, 0x420)), mload(add(transcript, 0x1840)), f_q))mstore(add(transcript, 0x1880), mulmod(mload(add(transcript, 0x680)), 5776684794125549462448597414050232243778680302179439492664047328281728356345, f_q))mstore(add(transcript, 0x18a0), mulmod(mload(add(transcript, 0x1440)), 8348174920934122550483593999453880006756108121341067172388445916328941978568, f_q))mstore(add(transcript, 0x18c0), addmod(mload(add(transcript, 0x1880)), mload(add(transcript, 0x18a0)), f_q))mstore(add(transcript, 0x18e0), addmod(mload(add(transcript, 0x18c0)), mload(add(transcript, 0x700)), f_q))mstore(add(transcript, 0x1900), mulmod(mload(add(transcript, 0x640)), 7127083008168878795310303301757642617203533252990949589494537404444738046722, f_q))mstore(add(transcript, 0x1920), mulmod(mload(add(transcript, 0x660)), 10251091711782631878897995303436082826711938358699127319815611151510940403902, f_q))mstore(add(transcript, 0x1940), addmod(mload(add(transcript, 0x1900)), mload(add(transcript, 0x1920)), f_q))mstore(add(transcript, 0x1960), addmod(mload(add(transcript, 0x18e0)), sub(f_q, mload(add(transcript, 0x1940))), f_q))mstore(add(transcript, 0x1980), mulmod(mload(add(transcript, 0x1960)), mload(add(transcript, 0x7e0)), f_q))mstore(add(transcript, 0x19a0), addmod(mload(add(transcript, 0x1860)), mload(add(transcript, 0x1980)), f_q))mstore(add(transcript, 0x19c0), mulmod(mload(add(transcript, 0x420)), mload(add(transcript, 0x19a0)), f_q))mstore(add(transcript, 0x19e0), addmod(1, sub(f_q, mload(add(transcript, 0x7a0))), f_q))mstore(add(transcript, 0x1a00), mulmod(mload(add(transcript, 0x19e0)), mload(add(transcript, 0x7a0)), f_q))mstore(add(transcript, 0x1a20), addmod(2, sub(f_q, mload(add(transcript, 0x7a0))), f_q))mstore(add(transcript, 0x1a40), mulmod(mload(add(transcript, 0x1a20)), mload(add(transcript, 0x1a00)), f_q))mstore(add(transcript, 0x1a60), addmod(4, sub(f_q, mload(add(transcript, 0x7a0))), f_q))mstore(add(transcript, 0x1a80), mulmod(mload(add(transcript, 0x1a60)), mload(add(transcript, 0x1a40)), f_q))mstore(add(transcript, 0x1aa0), addmod(mload(add(transcript, 0x6c0)), mload(add(transcript, 0x600)), f_q))mstore(add(transcript, 0x1ac0), addmod(mload(add(transcript, 0x1aa0)), sub(f_q, mload(add(transcript, 0x640))), f_q))mstore(add(transcript, 0x1ae0), mulmod(mload(add(transcript, 0x1ac0)), mload(add(transcript, 0x1a80)), f_q))mstore(add(transcript, 0x1b00), addmod(mload(add(transcript, 0x19c0)), mload(add(transcript, 0x1ae0)), f_q))mstore(add(transcript, 0x1b20), mulmod(mload(add(transcript, 0x420)), mload(add(transcript, 0x1b00)), f_q))mstore(add(transcript, 0x1b40), addmod(mload(add(transcript, 0x6a0)), sub(f_q, mload(add(transcript, 0x660))), f_q))mstore(add(transcript, 0x1b60), mulmod(mload(add(transcript, 0x1b40)), mload(add(transcript, 0x1a80)), f_q))mstore(add(transcript, 0x1b80), addmod(mload(add(transcript, 0x1b20)), mload(add(transcript, 0x1b60)), f_q))mstore(add(transcript, 0x1ba0), mulmod(mload(add(transcript, 0x420)), mload(add(transcript, 0x1b80)), f_q))mstore(add(transcript, 0x1bc0), mulmod(mload(add(transcript, 0x1500)), mload(add(transcript, 0x800)), f_q))mstore(add(transcript, 0x1be0), addmod(mload(add(transcript, 0x1ba0)), mload(add(transcript, 0x1bc0)), f_q))mstore(add(transcript, 0x1c00), mulmod(mload(add(transcript, 0x420)), mload(add(transcript, 0x1be0)), f_q))mstore(add(transcript, 0x1c20), mulmod(mload(add(transcript, 0x15c0)), mload(add(transcript, 0x800)), f_q))mstore(add(transcript, 0x1c40), addmod(mload(add(transcript, 0x1c00)), mload(add(transcript, 0x1c20)), f_q))mstore(add(transcript, 0x1c60), mulmod(mload(add(transcript, 0x420)), mload(add(transcript, 0x1c40)), f_q))mstore(add(transcript, 0x1c80), mulmod(mload(add(transcript, 0x1640)), mload(add(transcript, 0x820)), f_q))mstore(add(transcript, 0x1ca0), addmod(mload(add(transcript, 0x1c60)), mload(add(transcript, 0x1c80)), f_q))mstore(add(transcript, 0x1cc0), mulmod(mload(add(transcript, 0x420)), mload(add(transcript, 0x1ca0)), f_q))mstore(add(transcript, 0x1ce0), mulmod(mload(add(transcript, 0x1800)), mload(add(transcript, 0x820)), f_q))mstore(add(transcript, 0x1d00), addmod(mload(add(transcript, 0x1cc0)), mload(add(transcript, 0x1ce0)), f_q))mstore(add(transcript, 0x1d20), mulmod(mload(add(transcript, 0x420)), mload(add(transcript, 0x1d00)), f_q))mstore(add(transcript, 0x1d40), mulmod(mload(add(transcript, 0x1960)), mload(add(transcript, 0x820)), f_q))mstore(add(transcript, 0x1d60), addmod(mload(add(transcript, 0x1d20)), mload(add(transcript, 0x1d40)), f_q))mstore(add(transcript, 0x1d80), mulmod(mload(add(transcript, 0x420)), mload(add(transcript, 0x1d60)), f_q))mstore(add(transcript, 0x1da0), addmod(3, sub(f_q, mload(add(transcript, 0x7a0))), f_q))mstore(add(transcript, 0x1dc0), mulmod(mload(add(transcript, 0x1da0)), mload(add(transcript, 0x1a40)), f_q))mstore(add(transcript, 0x1de0), mulmod(mload(add(transcript, 0x1ac0)), mload(add(transcript, 0x1dc0)), f_q))mstore(add(transcript, 0x1e00), addmod(mload(add(transcript, 0x1d80)), mload(add(transcript, 0x1de0)), f_q))mstore(add(transcript, 0x1e20), mulmod(mload(add(transcript, 0x420)), mload(add(transcript, 0x1e00)), f_q))mstore(add(transcript, 0x1e40), mulmod(mload(add(transcript, 0x1b40)), mload(add(transcript, 0x1dc0)), f_q))mstore(add(transcript, 0x1e60), addmod(mload(add(transcript, 0x1e20)), mload(add(transcript, 0x1e40)), f_q))mstore(add(transcript, 0x1e80), mulmod(mload(add(transcript, 0x420)), mload(add(transcript, 0x1e60)), f_q))mstore(add(transcript, 0x1ea0), mulmod(mload(add(transcript, 0x1a20)), mload(add(transcript, 0x7a0)), f_q))mstore(add(transcript, 0x1ec0), mulmod(mload(add(transcript, 0x1da0)), mload(add(transcript, 0x1ea0)), f_q))mstore(add(transcript, 0x1ee0), mulmod(mload(add(transcript, 0x1a60)), mload(add(transcript, 0x1ec0)), f_q))mstore(add(transcript, 0x1f00), mulmod(mload(add(transcript, 0x680)), mload(add(transcript, 0x1ee0)), f_q))mstore(add(transcript, 0x1f20), addmod(1, sub(f_q, mload(add(transcript, 0x680))), f_q))mstore(add(transcript, 0x1f40), mulmod(mload(add(transcript, 0x1f20)), mload(add(transcript, 0x1f00)), f_q))mstore(add(transcript, 0x1f60), addmod(mload(add(transcript, 0x1e80)), mload(add(transcript, 0x1f40)), f_q))mstore(add(transcript, 0x1f80), mulmod(mload(add(transcript, 0x420)), mload(add(transcript, 0x1f60)), f_q))mstore(add(transcript, 0x1fa0), mulmod(2, mload(add(transcript, 0x680)), f_q))mstore(add(transcript, 0x1fc0), addmod(mload(add(transcript, 0x620)), sub(f_q, mload(add(transcript, 0x600))), f_q))mstore(add(transcript, 0x1fe0), mulmod(mload(add(transcript, 0x1fc0)), mload(add(transcript, 0x1fa0)), f_q))mstore(add(transcript, 0x2000), addmod(mload(add(transcript, 0x640)), sub(f_q, mload(add(transcript, 0x600))), f_q))mstore(add(transcript, 0x2020), addmod(mload(add(transcript, 0x1fe0)), sub(f_q, mload(add(transcript, 0x2000))), f_q))mstore(add(transcript, 0x2040), addmod(mload(add(transcript, 0x620)), sub(f_q, mload(add(transcript, 0x660))), f_q))mstore(add(transcript, 0x2060), addmod(mload(add(transcript, 0x2020)), sub(f_q, mload(add(transcript, 0x2040))), f_q))mstore(add(transcript, 0x2080), mulmod(mload(add(transcript, 0x2060)), mload(add(transcript, 0x1ee0)), f_q))mstore(add(transcript, 0x20a0), addmod(mload(add(transcript, 0x1f80)), mload(add(transcript, 0x2080)), f_q))mstore(add(transcript, 0x20c0), mulmod(mload(add(transcript, 0x420)), mload(add(transcript, 0x20a0)), f_q))mstore(add(transcript, 0x20e0), mulmod(mload(add(transcript, 0x1da0)), mload(add(transcript, 0x1a00)), f_q))mstore(add(transcript, 0x2100), mulmod(mload(add(transcript, 0x1a60)), mload(add(transcript, 0x20e0)), f_q))mstore(add(transcript, 0x2120), addmod(mload(add(transcript, 0x600)), mload(add(transcript, 0x620)), f_q))mstore(add(transcript, 0x2140), addmod(mload(add(transcript, 0x2120)), sub(f_q, mload(add(transcript, 0x680))), f_q))mstore(add(transcript, 0x2160), mulmod(mload(add(transcript, 0x2140)), mload(add(transcript, 0x2100)), f_q))mstore(add(transcript, 0x2180), addmod(mload(add(transcript, 0x20c0)), mload(add(transcript, 0x2160)), f_q))mstore(add(transcript, 0x21a0), mulmod(mload(add(transcript, 0x420)), mload(add(transcript, 0x2180)), f_q))mstore(add(transcript, 0x21c0), addmod(mload(add(transcript, 0x21a0)), mload(add(transcript, 0x2160)), f_q))mstore(add(transcript, 0x21e0), mulmod(mload(add(transcript, 0x420)), mload(add(transcript, 0x21c0)), f_q))mstore(add(transcript, 0x2200), addmod(1, sub(f_q, mload(add(transcript, 0x920))), f_q))mstore(add(transcript, 0x2220), mulmod(mload(add(transcript, 0x2200)), mload(add(transcript, 0x1300)), f_q))mstore(add(transcript, 0x2240), addmod(mload(add(transcript, 0x21e0)), mload(add(transcript, 0x2220)), f_q))mstore(add(transcript, 0x2260), mulmod(mload(add(transcript, 0x420)), mload(add(transcript, 0x2240)), f_q))mstore(add(transcript, 0x2280), mulmod(mload(add(transcript, 0x980)), mload(add(transcript, 0x980)), f_q))mstore(add(transcript, 0x22a0), addmod(mload(add(transcript, 0x2280)), sub(f_q, mload(add(transcript, 0x980))), f_q))mstore(add(transcript, 0x22c0), mulmod(mload(add(transcript, 0x22a0)), mload(add(transcript, 0x1240)), f_q))mstore(add(transcript, 0x22e0), addmod(mload(add(transcript, 0x2260)), mload(add(transcript, 0x22c0)), f_q))mstore(add(transcript, 0x2300), mulmod(mload(add(transcript, 0x420)), mload(add(transcript, 0x22e0)), f_q))mstore(add(transcript, 0x2320), addmod(mload(add(transcript, 0x980)), sub(f_q, mload(add(transcript, 0x960))), f_q))mstore(add(transcript, 0x2340), mulmod(mload(add(transcript, 0x2320)), mload(add(transcript, 0x1300)), f_q))mstore(add(transcript, 0x2360), addmod(mload(add(transcript, 0x2300)), mload(add(transcript, 0x2340)), f_q))mstore(add(transcript, 0x2380), mulmod(mload(add(transcript, 0x420)), mload(add(transcript, 0x2360)), f_q))mstore(add(transcript, 0x23a0), addmod(1, sub(f_q, mload(add(transcript, 0x1240))), f_q))mstore(add(transcript, 0x23c0), addmod(mload(add(transcript, 0x1260)), mload(add(transcript, 0x1280)), f_q))mstore(add(transcript, 0x23e0), addmod(mload(add(transcript, 0x23c0)), mload(add(transcript, 0x12a0)), f_q))mstore(add(transcript, 0x2400), addmod(mload(add(transcript, 0x23e0)), mload(add(transcript, 0x12c0)), f_q))mstore(add(transcript, 0x2420), addmod(mload(add(transcript, 0x2400)), mload(add(transcript, 0x12e0)), f_q))mstore(add(transcript, 0x2440), addmod(mload(add(transcript, 0x23a0)), sub(f_q, mload(add(transcript, 0x2420))), f_q))mstore(add(transcript, 0x2460), mulmod(mload(add(transcript, 0x860)), mload(add(transcript, 0x260)), f_q))mstore(add(transcript, 0x2480), addmod(mload(add(transcript, 0x6e0)), mload(add(transcript, 0x2460)), f_q))mstore(add(transcript, 0x24a0), addmod(mload(add(transcript, 0x2480)), mload(add(transcript, 0x2c0)), f_q))mstore(add(transcript, 0x24c0), mulmod(mload(add(transcript, 0x880)), mload(add(transcript, 0x260)), f_q))mstore(add(transcript, 0x24e0), addmod(mload(add(transcript, 0x600)), mload(add(transcript, 0x24c0)), f_q))mstore(add(transcript, 0x2500), addmod(mload(add(transcript, 0x24e0)), mload(add(transcript, 0x2c0)), f_q))mstore(add(transcript, 0x2520), mulmod(mload(add(transcript, 0x2500)), mload(add(transcript, 0x24a0)), f_q))mstore(add(transcript, 0x2540), mulmod(mload(add(transcript, 0x8a0)), mload(add(transcript, 0x260)), f_q))mstore(add(transcript, 0x2560), addmod(mload(add(transcript, 0x620)), mload(add(transcript, 0x2540)), f_q))mstore(add(transcript, 0x2580), addmod(mload(add(transcript, 0x2560)), mload(add(transcript, 0x2c0)), f_q))mstore(add(transcript, 0x25a0), mulmod(mload(add(transcript, 0x2580)), mload(add(transcript, 0x2520)), f_q))mstore(add(transcript, 0x25c0), mulmod(mload(add(transcript, 0x8c0)), mload(add(transcript, 0x260)), f_q))mstore(add(transcript, 0x25e0), addmod(mload(add(transcript, 0x700)), mload(add(transcript, 0x25c0)), f_q))mstore(add(transcript, 0x2600), addmod(mload(add(transcript, 0x25e0)), mload(add(transcript, 0x2c0)), f_q))mstore(add(transcript, 0x2620), mulmod(mload(add(transcript, 0x2600)), mload(add(transcript, 0x25a0)), f_q))mstore(add(transcript, 0x2640), mulmod(mload(add(transcript, 0x2620)), mload(add(transcript, 0x940)), f_q))mstore(add(transcript, 0x2660), mulmod(1, mload(add(transcript, 0x260)), f_q))mstore(add(transcript, 0x2680), mulmod(mload(add(transcript, 0x5c0)), mload(add(transcript, 0x2660)), f_q))mstore(add(transcript, 0x26a0), addmod(mload(add(transcript, 0x6e0)), mload(add(transcript, 0x2680)), f_q))mstore(add(transcript, 0x26c0), addmod(mload(add(transcript, 0x26a0)), mload(add(transcript, 0x2c0)), f_q))mstore(add(transcript, 0x26e0), mulmod(4131629893567559867359510883348571134090853742863529169391034518566172092834, mload(add(transcript, 0x260)), f_q))mstore(add(transcript, 0x2700), mulmod(mload(add(transcript, 0x5c0)), mload(add(transcript, 0x26e0)), f_q))mstore(add(transcript, 0x2720), addmod(mload(add(transcript, 0x600)), mload(add(transcript, 0x2700)), f_q))mstore(add(transcript, 0x2740), addmod(mload(add(transcript, 0x2720)), mload(add(transcript, 0x2c0)), f_q))mstore(add(transcript, 0x2760), mulmod(mload(add(transcript, 0x2740)), mload(add(transcript, 0x26c0)), f_q))mstore(add(transcript, 0x2780), mulmod(8910878055287538404433155982483128285667088683464058436815641868457422632747, mload(add(transcript, 0x260)), f_q))mstore(add(transcript, 0x27a0), mulmod(mload(add(transcript, 0x5c0)), mload(add(transcript, 0x2780)), f_q))mstore(add(transcript, 0x27c0), addmod(mload(add(transcript, 0x620)), mload(add(transcript, 0x27a0)), f_q))mstore(add(transcript, 0x27e0), addmod(mload(add(transcript, 0x27c0)), mload(add(transcript, 0x2c0)), f_q))mstore(add(transcript, 0x2800), mulmod(mload(add(transcript, 0x27e0)), mload(add(transcript, 0x2760)), f_q))mstore(add(transcript, 0x2820), mulmod(11166246659983828508719468090013646171463329086121580628794302409516816350802, mload(add(transcript, 0x260)), f_q))mstore(add(transcript, 0x2840), mulmod(mload(add(transcript, 0x5c0)), mload(add(transcript, 0x2820)), f_q))mstore(add(transcript, 0x2860), addmod(mload(add(transcript, 0x700)), mload(add(transcript, 0x2840)), f_q))mstore(add(transcript, 0x2880), addmod(mload(add(transcript, 0x2860)), mload(add(transcript, 0x2c0)), f_q))mstore(add(transcript, 0x28a0), mulmod(mload(add(transcript, 0x2880)), mload(add(transcript, 0x2800)), f_q))mstore(add(transcript, 0x28c0), mulmod(mload(add(transcript, 0x28a0)), mload(add(transcript, 0x920)), f_q))mstore(add(transcript, 0x28e0), addmod(mload(add(transcript, 0x2640)), sub(f_q, mload(add(transcript, 0x28c0))), f_q))mstore(add(transcript, 0x2900), mulmod(mload(add(transcript, 0x28e0)), mload(add(transcript, 0x2440)), f_q))mstore(add(transcript, 0x2920), addmod(mload(add(transcript, 0x2380)), mload(add(transcript, 0x2900)), f_q))mstore(add(transcript, 0x2940), mulmod(mload(add(transcript, 0x420)), mload(add(transcript, 0x2920)), f_q))mstore(add(transcript, 0x2960), mulmod(mload(add(transcript, 0x8e0)), mload(add(transcript, 0x260)), f_q))mstore(add(transcript, 0x2980), addmod(mload(add(transcript, 0x680)), mload(add(transcript, 0x2960)), f_q))mstore(add(transcript, 0x29a0), addmod(mload(add(transcript, 0x2980)), mload(add(transcript, 0x2c0)), f_q))mstore(add(transcript, 0x29c0), mulmod(mload(add(transcript, 0x900)), mload(add(transcript, 0x260)), f_q))mstore(add(transcript, 0x29e0), addmod(mload(add(transcript, 0x1380)), mload(add(transcript, 0x29c0)), f_q))mstore(add(transcript, 0x2a00), addmod(mload(add(transcript, 0x29e0)), mload(add(transcript, 0x2c0)), f_q))mstore(add(transcript, 0x2a20), mulmod(mload(add(transcript, 0x2a00)), mload(add(transcript, 0x29a0)), f_q))mstore(add(transcript, 0x2a40), mulmod(mload(add(transcript, 0x2a20)), mload(add(transcript, 0x9a0)), f_q))mstore(add(transcript, 0x2a60), mulmod(284840088355319032285349970403338060113257071685626700086398481893096618818, mload(add(transcript, 0x260)), f_q))mstore(add(transcript, 0x2a80), mulmod(mload(add(transcript, 0x5c0)), mload(add(transcript, 0x2a60)), f_q))mstore(add(transcript, 0x2aa0), addmod(mload(add(transcript, 0x680)), mload(add(transcript, 0x2a80)), f_q))mstore(add(transcript, 0x2ac0), addmod(mload(add(transcript, 0x2aa0)), mload(add(transcript, 0x2c0)), f_q))mstore(add(transcript, 0x2ae0), mulmod(21134065618345176623193549882539580312263652408302468683943992798037078993309, mload(add(transcript, 0x260)), f_q))mstore(add(transcript, 0x2b00), mulmod(mload(add(transcript, 0x5c0)), mload(add(transcript, 0x2ae0)), f_q))mstore(add(transcript, 0x2b20), addmod(mload(add(transcript, 0x1380)), mload(add(transcript, 0x2b00)), f_q))mstore(add(transcript, 0x2b40), addmod(mload(add(transcript, 0x2b20)), mload(add(transcript, 0x2c0)), f_q))mstore(add(transcript, 0x2b60), mulmod(mload(add(transcript, 0x2b40)), mload(add(transcript, 0x2ac0)), f_q))mstore(add(transcript, 0x2b80), mulmod(mload(add(transcript, 0x2b60)), mload(add(transcript, 0x980)), f_q))mstore(add(transcript, 0x2ba0), addmod(mload(add(transcript, 0x2a40)), sub(f_q, mload(add(transcript, 0x2b80))), f_q))mstore(add(transcript, 0x2bc0), mulmod(mload(add(transcript, 0x2ba0)), mload(add(transcript, 0x2440)), f_q))mstore(add(transcript, 0x2be0), addmod(mload(add(transcript, 0x2940)), mload(add(transcript, 0x2bc0)), f_q))mstore(add(transcript, 0x2c00), mulmod(mload(add(transcript, 0x420)), mload(add(transcript, 0x2be0)), f_q))mstore(add(transcript, 0x2c20), addmod(1, sub(f_q, mload(add(transcript, 0x9c0))), f_q))mstore(add(transcript, 0x2c40), mulmod(mload(add(transcript, 0x2c20)), mload(add(transcript, 0x1300)), f_q))mstore(add(transcript, 0x2c60), addmod(mload(add(transcript, 0x2c00)), mload(add(transcript, 0x2c40)), f_q))mstore(add(transcript, 0x2c80), mulmod(mload(add(transcript, 0x420)), mload(add(transcript, 0x2c60)), f_q))mstore(add(transcript, 0x2ca0), mulmod(mload(add(transcript, 0x9c0)), mload(add(transcript, 0x9c0)), f_q))mstore(add(transcript, 0x2cc0), addmod(mload(add(transcript, 0x2ca0)), sub(f_q, mload(add(transcript, 0x9c0))), f_q))mstore(add(transcript, 0x2ce0), mulmod(mload(add(transcript, 0x2cc0)), mload(add(transcript, 0x1240)), f_q))mstore(add(transcript, 0x2d00), addmod(mload(add(transcript, 0x2c80)), mload(add(transcript, 0x2ce0)), f_q))mstore(add(transcript, 0x2d20), mulmod(mload(add(transcript, 0x420)), mload(add(transcript, 0x2d00)), f_q))mstore(add(transcript, 0x2d40), addmod(mload(add(transcript, 0xa00)), mload(add(transcript, 0x260)), f_q))mstore(add(transcript, 0x2d60), mulmod(mload(add(transcript, 0x2d40)), mload(add(transcript, 0x9e0)), f_q))mstore(add(transcript, 0x2d80), addmod(mload(add(transcript, 0xa40)), mload(add(transcript, 0x2c0)), f_q))mstore(add(transcript, 0x2da0), mulmod(mload(add(transcript, 0x2d80)), mload(add(transcript, 0x2d60)), f_q))mstore(add(transcript, 0x2dc0), mulmod(256, mload(add(transcript, 0x640)), f_q))mstore(add(transcript, 0x2de0), addmod(mload(add(transcript, 0x600)), sub(f_q, mload(add(transcript, 0x2dc0))), f_q))mstore(add(transcript, 0x2e00), mulmod(mload(add(transcript, 0x2de0)), mload(add(transcript, 0x780)), f_q))mstore(add(transcript, 0x2e20), addmod(mload(add(transcript, 0x2e00)), mload(add(transcript, 0x260)), f_q))mstore(add(transcript, 0x2e40), mulmod(mload(add(transcript, 0x2e20)), mload(add(transcript, 0x9c0)), f_q))mstore(add(transcript, 0x2e60), addmod(mload(add(transcript, 0x760)), mload(add(transcript, 0x2c0)), f_q))mstore(add(transcript, 0x2e80), mulmod(mload(add(transcript, 0x2e60)), mload(add(transcript, 0x2e40)), f_q))mstore(add(transcript, 0x2ea0), addmod(mload(add(transcript, 0x2da0)), sub(f_q, mload(add(transcript, 0x2e80))), f_q))mstore(add(transcript, 0x2ec0), mulmod(mload(add(transcript, 0x2ea0)), mload(add(transcript, 0x2440)), f_q))mstore(add(transcript, 0x2ee0), addmod(mload(add(transcript, 0x2d20)), mload(add(transcript, 0x2ec0)), f_q))mstore(add(transcript, 0x2f00), mulmod(mload(add(transcript, 0x420)), mload(add(transcript, 0x2ee0)), f_q))mstore(add(transcript, 0x2f20), addmod(mload(add(transcript, 0xa00)), sub(f_q, mload(add(transcript, 0xa40))), f_q))mstore(add(transcript, 0x2f40), mulmod(mload(add(transcript, 0x2f20)), mload(add(transcript, 0x1300)), f_q))mstore(add(transcript, 0x2f60), addmod(mload(add(transcript, 0x2f00)), mload(add(transcript, 0x2f40)), f_q))mstore(add(transcript, 0x2f80), mulmod(mload(add(transcript, 0x420)), mload(add(transcript, 0x2f60)), f_q))mstore(add(transcript, 0x2fa0), mulmod(mload(add(transcript, 0x2f20)), mload(add(transcript, 0x2440)), f_q))mstore(add(transcript, 0x2fc0), addmod(mload(add(transcript, 0xa00)), sub(f_q, mload(add(transcript, 0xa20))), f_q))mstore(add(transcript, 0x2fe0), mulmod(mload(add(transcript, 0x2fc0)), mload(add(transcript, 0x2fa0)), f_q))mstore(add(transcript, 0x3000), addmod(mload(add(transcript, 0x2f80)), mload(add(transcript, 0x2fe0)), f_q))mstore(add(transcript, 0x3020), mulmod(mload(add(transcript, 0xd40)), mload(add(transcript, 0xd40)), f_q))mstore(add(transcript, 0x3040), mulmod(mload(add(transcript, 0x3020)), mload(add(transcript, 0xd40)), f_q))mstore(add(transcript, 0x3060), mulmod(mload(add(transcript, 0x3040)), mload(add(transcript, 0xd40)), f_q))mstore(add(transcript, 0x3080), mulmod(mload(add(transcript, 0x3060)), mload(add(transcript, 0xd40)), f_q))mstore(add(transcript, 0x30a0), mulmod(1, mload(add(transcript, 0xd40)), f_q))mstore(add(transcript, 0x30c0), mulmod(1, mload(add(transcript, 0x3020)), f_q))mstore(add(transcript, 0x30e0), mulmod(1, mload(add(transcript, 0x3040)), f_q))mstore(add(transcript, 0x3100), mulmod(1, mload(add(transcript, 0x3060)), f_q))mstore(add(transcript, 0x3120), mulmod(mload(add(transcript, 0x3000)), mload(add(transcript, 0xd60)), f_q))mstore(add(transcript, 0x3140), mulmod(mload(add(transcript, 0xc00)), mload(add(transcript, 0x5c0)), f_q))mstore(add(transcript, 0x3160), mulmod(mload(add(transcript, 0x5c0)), 1, f_q))mstore(add(transcript, 0x3180), addmod(mload(add(transcript, 0xb80)), sub(f_q, mload(add(transcript, 0x3160))), f_q))mstore(add(transcript, 0x31a0), mulmod(mload(add(transcript, 0x5c0)), 9396103202274256930945606623206526900461945684265495839012435492634193195103, f_q))mstore(add(transcript, 0x31c0), addmod(mload(add(transcript, 0xb80)), sub(f_q, mload(add(transcript, 0x31a0))), f_q))mstore(add(transcript, 0x31e0), mulmod(mload(add(transcript, 0x5c0)), 15699029810934084314820646074566828280617789951162923449200398535581206172418, f_q))mstore(add(transcript, 0x3200), addmod(mload(add(transcript, 0xb80)), sub(f_q, mload(add(transcript, 0x31e0))), f_q))mstore(add(transcript, 0x3220), mulmod(mload(add(transcript, 0x5c0)), 19444693496467964793333684482470811869395409953158764080291550423779334624794, f_q))mstore(add(transcript, 0x3240), addmod(mload(add(transcript, 0xb80)), sub(f_q, mload(add(transcript, 0x3220))), f_q)){ let result := mulmod(mload(add(transcript, 0xb80)), mulmod(mload(add(transcript, 0xc00)), 14935689044936328720213520384837211407239373163407808768092422456738089171339, f_q), f_q)result := addmod(mulmod(mload(add(transcript, 0x5c0)), mulmod(mload(add(transcript, 0xc00)), 6952553826902946502032885360420063681308991237008225575605781729837719324278, f_q), f_q), result, f_q)mstore(add(transcript, 0x3260), result) }{ let result := mulmod(mload(add(transcript, 0xb80)), mulmod(mload(add(transcript, 0xc00)), 7540907510155698387256503820143330389809914548046512731972450943457626251574, f_q), f_q)result := addmod(mulmod(mload(add(transcript, 0x5c0)), mulmod(mload(add(transcript, 0xc00)), 17454089668527239794105182244994964593641145239866915085378986192780276655988, f_q), f_q), result, f_q)mstore(add(transcript, 0x3280), result) }{ let result := mulmod(mload(add(transcript, 0xb80)), mulmod(mload(add(transcript, 0xc00)), 16765245179638222004592619476379737764479697804128512065226459610007790881832, f_q), f_q)result := addmod(mulmod(mload(add(transcript, 0x5c0)), mulmod(mload(add(transcript, 0xc00)), 6067403861988280018436561787453590745850405443026581205331008293509136248791, f_q), f_q), result, f_q)mstore(add(transcript, 0x32a0), result) }mstore(add(transcript, 0x32c0), mulmod(1, mload(add(transcript, 0x3180)), f_q))mstore(add(transcript, 0x32e0), mulmod(mload(add(transcript, 0x32c0)), mload(add(transcript, 0x31c0)), f_q))mstore(add(transcript, 0x3300), mulmod(mload(add(transcript, 0x32e0)), mload(add(transcript, 0x3240)), f_q)){ let result := mulmod(mload(add(transcript, 0xb80)), 1, f_q)result := addmod(mulmod(mload(add(transcript, 0x5c0)), 21888242871839275222246405745257275088548364400416034343698204186575808495616, f_q), result, f_q)mstore(add(transcript, 0x3320), result) }{ let result := mulmod(mload(add(transcript, 0xb80)), mulmod(mload(add(transcript, 0xc00)), 13346277807347402051479003338644866680074640264080882830084838995653627694322, f_q), f_q)result := addmod(mulmod(mload(add(transcript, 0x5c0)), mulmod(mload(add(transcript, 0xc00)), 8541965064491873170767402406612408408473724136335151513613365190922180801295, f_q), f_q), result, f_q)mstore(add(transcript, 0x3340), result) }{ let result := mulmod(mload(add(transcript, 0xb80)), mulmod(mload(add(transcript, 0xc00)), 9130318747744625055991020866335675116974647447373438669980034404542087728591, f_q), f_q)result := addmod(mulmod(mload(add(transcript, 0x5c0)), mulmod(mload(add(transcript, 0xc00)), 17654030801727560324741115319652541746559479525075366613702001578587072243451, f_q), f_q), result, f_q)mstore(add(transcript, 0x3360), result) }{ let result := mulmod(mload(add(transcript, 0xb80)), mulmod(mload(add(transcript, 0xc00)), 8968217942074169282201771672973351205073655055696863512223304343263448008755, f_q), f_q)result := addmod(mulmod(mload(add(transcript, 0x5c0)), mulmod(mload(add(transcript, 0xc00)), 15489683287416706862113636648384499783884413315698913841173435408703605255719, f_q), f_q), result, f_q)mstore(add(transcript, 0x3380), result) }mstore(add(transcript, 0x33a0), mulmod(mload(add(transcript, 0x32e0)), mload(add(transcript, 0x3200)), f_q)){ let result := mulmod(mload(add(transcript, 0xb80)), mulmod(mload(add(transcript, 0x5c0)), 12492139669565018291300799122050748188086418716150538504685768693941615300515, f_q), f_q)result := addmod(mulmod(mload(add(transcript, 0x5c0)), mulmod(mload(add(transcript, 0x5c0)), 9396103202274256930945606623206526900461945684265495839012435492634193195102, f_q), f_q), result, f_q)mstore(add(transcript, 0x33c0), result) }{ let result := mulmod(mload(add(transcript, 0xb80)), mulmod(mload(add(transcript, 0x5c0)), 9396103202274256930945606623206526900461945684265495839012435492634193195102, f_q), f_q)result := addmod(mulmod(mload(add(transcript, 0x5c0)), mulmod(mload(add(transcript, 0x5c0)), 11903785986312266406077180662327481479585495405112251348319099480321708373219, f_q), f_q), result, f_q)mstore(add(transcript, 0x33e0), result) }{ let result := mulmod(mload(add(transcript, 0xb80)), mulmod(mload(add(transcript, 0x5c0)), 2443549375371310428912721262786463219152954447257270263406653762796473870824, f_q), f_q)result := addmod(mulmod(mload(add(transcript, 0x5c0)), mulmod(mload(add(transcript, 0x5c0)), 19444693496467964793333684482470811869395409953158764080291550423779334624793, f_q), f_q), result, f_q)mstore(add(transcript, 0x3400), result) }{ let result := mulmod(mload(add(transcript, 0xb80)), mulmod(mload(add(transcript, 0x5c0)), 19444693496467964793333684482470811869395409953158764080291550423779334624793, f_q), f_q)result := addmod(mulmod(mload(add(transcript, 0x5c0)), mulmod(mload(add(transcript, 0x5c0)), 14519100894475310148599392892084064224530612280553018117484180069202210808887, f_q), f_q), result, f_q)mstore(add(transcript, 0x3420), result) }mstore(add(transcript, 0x3440), mulmod(mload(add(transcript, 0x32c0)), mload(add(transcript, 0x3240)), f_q)){ let prod := mload(add(transcript, 0x3260)) prod := mulmod(mload(add(transcript, 0x3280)), prod, f_q) mstore(add(transcript, 0x3460), prod) prod := mulmod(mload(add(transcript, 0x32a0)), prod, f_q) mstore(add(transcript, 0x3480), prod) prod := mulmod(mload(add(transcript, 0x3320)), prod, f_q) mstore(add(transcript, 0x34a0), prod) prod := mulmod(mload(add(transcript, 0x32c0)), prod, f_q) mstore(add(transcript, 0x34c0), prod) prod := mulmod(mload(add(transcript, 0x3340)), prod, f_q) mstore(add(transcript, 0x34e0), prod) prod := mulmod(mload(add(transcript, 0x3360)), prod, f_q) mstore(add(transcript, 0x3500), prod) prod := mulmod(mload(add(transcript, 0x3380)), prod, f_q) mstore(add(transcript, 0x3520), prod) prod := mulmod(mload(add(transcript, 0x33a0)), prod, f_q) mstore(add(transcript, 0x3540), prod) prod := mulmod(mload(add(transcript, 0x33c0)), prod, f_q) mstore(add(transcript, 0x3560), prod) prod := mulmod(mload(add(transcript, 0x33e0)), prod, f_q) mstore(add(transcript, 0x3580), prod) prod := mulmod(mload(add(transcript, 0x32e0)), prod, f_q) mstore(add(transcript, 0x35a0), prod) prod := mulmod(mload(add(transcript, 0x3400)), prod, f_q) mstore(add(transcript, 0x35c0), prod) prod := mulmod(mload(add(transcript, 0x3420)), prod, f_q) mstore(add(transcript, 0x35e0), prod) prod := mulmod(mload(add(transcript, 0x3440)), prod, f_q) mstore(add(transcript, 0x3600), prod) }mstore(add(transcript, 0x3640), 32)mstore(add(transcript, 0x3660), 32)mstore(add(transcript, 0x3680), 32)mstore(add(transcript, 0x36a0), mload(add(transcript, 0x3600)))mstore(add(transcript, 0x36c0), 21888242871839275222246405745257275088548364400416034343698204186575808495615)mstore(add(transcript, 0x36e0), 21888242871839275222246405745257275088548364400416034343698204186575808495617)success := and(eq(staticcall(gas(), 0x5, add(transcript, 0x3640), 0xc0, add(transcript, 0x3620), 0x20), 1), success){ let inv := mload(add(transcript, 0x3620)) let v v := mload(add(transcript, 0x3440)) mstore(add(transcript, 0x3440), mulmod(mload(add(transcript, 0x35e0)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x3420)) mstore(add(transcript, 0x3420), mulmod(mload(add(transcript, 0x35c0)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x3400)) mstore(add(transcript, 0x3400), mulmod(mload(add(transcript, 0x35a0)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x32e0)) mstore(add(transcript, 0x32e0), mulmod(mload(add(transcript, 0x3580)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x33e0)) mstore(add(transcript, 0x33e0), mulmod(mload(add(transcript, 0x3560)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x33c0)) mstore(add(transcript, 0x33c0), mulmod(mload(add(transcript, 0x3540)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x33a0)) mstore(add(transcript, 0x33a0), mulmod(mload(add(transcript, 0x3520)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x3380)) mstore(add(transcript, 0x3380), mulmod(mload(add(transcript, 0x3500)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x3360)) mstore(add(transcript, 0x3360), mulmod(mload(add(transcript, 0x34e0)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x3340)) mstore(add(transcript, 0x3340), mulmod(mload(add(transcript, 0x34c0)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x32c0)) mstore(add(transcript, 0x32c0), mulmod(mload(add(transcript, 0x34a0)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x3320)) mstore(add(transcript, 0x3320), mulmod(mload(add(transcript, 0x3480)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x32a0)) mstore(add(transcript, 0x32a0), mulmod(mload(add(transcript, 0x3460)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x3280)) mstore(add(transcript, 0x3280), mulmod(mload(add(transcript, 0x3260)), inv, f_q)) inv := mulmod(v, inv, f_q) mstore(add(transcript, 0x3260), inv) }{ let result := mload(add(transcript, 0x3260))result := addmod(mload(add(transcript, 0x3280)), result, f_q)result := addmod(mload(add(transcript, 0x32a0)), result, f_q)mstore(add(transcript, 0x3700), result) }mstore(add(transcript, 0x3720), mulmod(mload(add(transcript, 0x3300)), mload(add(transcript, 0x32c0)), f_q)){ let result := mload(add(transcript, 0x3320))mstore(add(transcript, 0x3740), result) }mstore(add(transcript, 0x3760), mulmod(mload(add(transcript, 0x3300)), mload(add(transcript, 0x33a0)), f_q)){ let result := mload(add(transcript, 0x3340))result := addmod(mload(add(transcript, 0x3360)), result, f_q)result := addmod(mload(add(transcript, 0x3380)), result, f_q)mstore(add(transcript, 0x3780), result) }mstore(add(transcript, 0x37a0), mulmod(mload(add(transcript, 0x3300)), mload(add(transcript, 0x32e0)), f_q)){ let result := mload(add(transcript, 0x33c0))result := addmod(mload(add(transcript, 0x33e0)), result, f_q)mstore(add(transcript, 0x37c0), result) }mstore(add(transcript, 0x37e0), mulmod(mload(add(transcript, 0x3300)), mload(add(transcript, 0x3440)), f_q)){ let result := mload(add(transcript, 0x3400))result := addmod(mload(add(transcript, 0x3420)), result, f_q)mstore(add(transcript, 0x3800), result) }{ let prod := mload(add(transcript, 0x3700)) prod := mulmod(mload(add(transcript, 0x3740)), prod, f_q) mstore(add(transcript, 0x3820), prod) prod := mulmod(mload(add(transcript, 0x3780)), prod, f_q) mstore(add(transcript, 0x3840), prod) prod := mulmod(mload(add(transcript, 0x37c0)), prod, f_q) mstore(add(transcript, 0x3860), prod) prod := mulmod(mload(add(transcript, 0x3800)), prod, f_q) mstore(add(transcript, 0x3880), prod) }mstore(add(transcript, 0x38c0), 32)mstore(add(transcript, 0x38e0), 32)mstore(add(transcript, 0x3900), 32)mstore(add(transcript, 0x3920), mload(add(transcript, 0x3880)))mstore(add(transcript, 0x3940), 21888242871839275222246405745257275088548364400416034343698204186575808495615)mstore(add(transcript, 0x3960), 21888242871839275222246405745257275088548364400416034343698204186575808495617)success := and(eq(staticcall(gas(), 0x5, add(transcript, 0x38c0), 0xc0, add(transcript, 0x38a0), 0x20), 1), success){ let inv := mload(add(transcript, 0x38a0)) let v v := mload(add(transcript, 0x3800)) mstore(add(transcript, 0x3800), mulmod(mload(add(transcript, 0x3860)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x37c0)) mstore(add(transcript, 0x37c0), mulmod(mload(add(transcript, 0x3840)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x3780)) mstore(add(transcript, 0x3780), mulmod(mload(add(transcript, 0x3820)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x3740)) mstore(add(transcript, 0x3740), mulmod(mload(add(transcript, 0x3700)), inv, f_q)) inv := mulmod(v, inv, f_q) mstore(add(transcript, 0x3700), inv) }mstore(add(transcript, 0x3980), mulmod(mload(add(transcript, 0x3720)), mload(add(transcript, 0x3740)), f_q))mstore(add(transcript, 0x39a0), mulmod(mload(add(transcript, 0x3760)), mload(add(transcript, 0x3780)), f_q))mstore(add(transcript, 0x39c0), mulmod(mload(add(transcript, 0x37a0)), mload(add(transcript, 0x37c0)), f_q))mstore(add(transcript, 0x39e0), mulmod(mload(add(transcript, 0x37e0)), mload(add(transcript, 0x3800)), f_q))mstore(add(transcript, 0x3a00), mulmod(mload(add(transcript, 0xa80)), mload(add(transcript, 0xa80)), f_q))mstore(add(transcript, 0x3a20), mulmod(mload(add(transcript, 0x3a00)), mload(add(transcript, 0xa80)), f_q))mstore(add(transcript, 0x3a40), mulmod(mload(add(transcript, 0x3a20)), mload(add(transcript, 0xa80)), f_q))mstore(add(transcript, 0x3a60), mulmod(mload(add(transcript, 0x3a40)), mload(add(transcript, 0xa80)), f_q))mstore(add(transcript, 0x3a80), mulmod(mload(add(transcript, 0x3a60)), mload(add(transcript, 0xa80)), f_q))mstore(add(transcript, 0x3aa0), mulmod(mload(add(transcript, 0x3a80)), mload(add(transcript, 0xa80)), f_q))mstore(add(transcript, 0x3ac0), mulmod(mload(add(transcript, 0x3aa0)), mload(add(transcript, 0xa80)), f_q))mstore(add(transcript, 0x3ae0), mulmod(mload(add(transcript, 0x3ac0)), mload(add(transcript, 0xa80)), f_q))mstore(add(transcript, 0x3b00), mulmod(mload(add(transcript, 0x3ae0)), mload(add(transcript, 0xa80)), f_q))mstore(add(transcript, 0x3b20), mulmod(mload(add(transcript, 0x3b00)), mload(add(transcript, 0xa80)), f_q))mstore(add(transcript, 0x3b40), mulmod(mload(add(transcript, 0x3b20)), mload(add(transcript, 0xa80)), f_q))mstore(add(transcript, 0x3b60), mulmod(mload(add(transcript, 0x3b40)), mload(add(transcript, 0xa80)), f_q))mstore(add(transcript, 0x3b80), mulmod(mload(add(transcript, 0x3b60)), mload(add(transcript, 0xa80)), f_q))mstore(add(transcript, 0x3ba0), mulmod(mload(add(transcript, 0x3b80)), mload(add(transcript, 0xa80)), f_q))mstore(add(transcript, 0x3bc0), mulmod(mload(add(transcript, 0x3ba0)), mload(add(transcript, 0xa80)), f_q))mstore(add(transcript, 0x3be0), mulmod(mload(add(transcript, 0x3bc0)), mload(add(transcript, 0xa80)), f_q))mstore(add(transcript, 0x3c00), mulmod(mload(add(transcript, 0x3be0)), mload(add(transcript, 0xa80)), f_q))mstore(add(transcript, 0x3c20), mulmod(mload(add(transcript, 0x3c00)), mload(add(transcript, 0xa80)), f_q))mstore(add(transcript, 0x3c40), mulmod(mload(add(transcript, 0x3c20)), mload(add(transcript, 0xa80)), f_q))mstore(add(transcript, 0x3c60), mulmod(mload(add(transcript, 0x3c40)), mload(add(transcript, 0xa80)), f_q))mstore(add(transcript, 0x3c80), mulmod(mload(add(transcript, 0xae0)), mload(add(transcript, 0xae0)), f_q))mstore(add(transcript, 0x3ca0), mulmod(mload(add(transcript, 0x3c80)), mload(add(transcript, 0xae0)), f_q))mstore(add(transcript, 0x3cc0), mulmod(mload(add(transcript, 0x3ca0)), mload(add(transcript, 0xae0)), f_q))mstore(add(transcript, 0x3ce0), mulmod(mload(add(transcript, 0x3cc0)), mload(add(transcript, 0xae0)), f_q)){ let result := mulmod(mload(add(transcript, 0x600)), mload(add(transcript, 0x3260)), f_q)result := addmod(mulmod(mload(add(transcript, 0x640)), mload(add(transcript, 0x3280)), f_q), result, f_q)result := addmod(mulmod(mload(add(transcript, 0x6c0)), mload(add(transcript, 0x32a0)), f_q), result, f_q)mstore(add(transcript, 0x3d00), result) }mstore(add(transcript, 0x3d20), mulmod(mload(add(transcript, 0x3d00)), mload(add(transcript, 0x3700)), f_q))mstore(add(transcript, 0x3d40), mulmod(sub(f_q, mload(add(transcript, 0x3d20))), 1, f_q)){ let result := mulmod(mload(add(transcript, 0x620)), mload(add(transcript, 0x3260)), f_q)result := addmod(mulmod(mload(add(transcript, 0x660)), mload(add(transcript, 0x3280)), f_q), result, f_q)result := addmod(mulmod(mload(add(transcript, 0x6a0)), mload(add(transcript, 0x32a0)), f_q), result, f_q)mstore(add(transcript, 0x3d60), result) }mstore(add(transcript, 0x3d80), mulmod(mload(add(transcript, 0x3d60)), mload(add(transcript, 0x3700)), f_q))mstore(add(transcript, 0x3da0), mulmod(sub(f_q, mload(add(transcript, 0x3d80))), mload(add(transcript, 0xa80)), f_q))mstore(add(transcript, 0x3dc0), mulmod(1, mload(add(transcript, 0xa80)), f_q))mstore(add(transcript, 0x3de0), addmod(mload(add(transcript, 0x3d40)), mload(add(transcript, 0x3da0)), f_q))mstore(add(transcript, 0x3e00), mulmod(mload(add(transcript, 0x3de0)), 1, f_q))mstore(add(transcript, 0x3e20), mulmod(mload(add(transcript, 0x3dc0)), 1, f_q))mstore(add(transcript, 0x3e40), mulmod(1, mload(add(transcript, 0x3720)), f_q)){ let result := mulmod(mload(add(transcript, 0x680)), mload(add(transcript, 0x3320)), f_q)mstore(add(transcript, 0x3e60), result) }mstore(add(transcript, 0x3e80), mulmod(mload(add(transcript, 0x3e60)), mload(add(transcript, 0x3980)), f_q))mstore(add(transcript, 0x3ea0), mulmod(sub(f_q, mload(add(transcript, 0x3e80))), 1, f_q))mstore(add(transcript, 0x3ec0), mulmod(mload(add(transcript, 0x3e40)), 1, f_q)){ let result := mulmod(mload(add(transcript, 0xa40)), mload(add(transcript, 0x3320)), f_q)mstore(add(transcript, 0x3ee0), result) }mstore(add(transcript, 0x3f00), mulmod(mload(add(transcript, 0x3ee0)), mload(add(transcript, 0x3980)), f_q))mstore(add(transcript, 0x3f20), mulmod(sub(f_q, mload(add(transcript, 0x3f00))), mload(add(transcript, 0xa80)), f_q))mstore(add(transcript, 0x3f40), mulmod(mload(add(transcript, 0x3e40)), mload(add(transcript, 0xa80)), f_q))mstore(add(transcript, 0x3f60), addmod(mload(add(transcript, 0x3ea0)), mload(add(transcript, 0x3f20)), f_q)){ let result := mulmod(mload(add(transcript, 0x6e0)), mload(add(transcript, 0x3320)), f_q)mstore(add(transcript, 0x3f80), result) }mstore(add(transcript, 0x3fa0), mulmod(mload(add(transcript, 0x3f80)), mload(add(transcript, 0x3980)), f_q))mstore(add(transcript, 0x3fc0), mulmod(sub(f_q, mload(add(transcript, 0x3fa0))), mload(add(transcript, 0x3a00)), f_q))mstore(add(transcript, 0x3fe0), mulmod(mload(add(transcript, 0x3e40)), mload(add(transcript, 0x3a00)), f_q))mstore(add(transcript, 0x4000), addmod(mload(add(transcript, 0x3f60)), mload(add(transcript, 0x3fc0)), f_q)){ let result := mulmod(mload(add(transcript, 0x700)), mload(add(transcript, 0x3320)), f_q)mstore(add(transcript, 0x4020), result) }mstore(add(transcript, 0x4040), mulmod(mload(add(transcript, 0x4020)), mload(add(transcript, 0x3980)), f_q))mstore(add(transcript, 0x4060), mulmod(sub(f_q, mload(add(transcript, 0x4040))), mload(add(transcript, 0x3a20)), f_q))mstore(add(transcript, 0x4080), mulmod(mload(add(transcript, 0x3e40)), mload(add(transcript, 0x3a20)), f_q))mstore(add(transcript, 0x40a0), addmod(mload(add(transcript, 0x4000)), mload(add(transcript, 0x4060)), f_q)){ let result := mulmod(mload(add(transcript, 0x720)), mload(add(transcript, 0x3320)), f_q)mstore(add(transcript, 0x40c0), result) }mstore(add(transcript, 0x40e0), mulmod(mload(add(transcript, 0x40c0)), mload(add(transcript, 0x3980)), f_q))mstore(add(transcript, 0x4100), mulmod(sub(f_q, mload(add(transcript, 0x40e0))), mload(add(transcript, 0x3a40)), f_q))mstore(add(transcript, 0x4120), mulmod(mload(add(transcript, 0x3e40)), mload(add(transcript, 0x3a40)), f_q))mstore(add(transcript, 0x4140), addmod(mload(add(transcript, 0x40a0)), mload(add(transcript, 0x4100)), f_q)){ let result := mulmod(mload(add(transcript, 0x740)), mload(add(transcript, 0x3320)), f_q)mstore(add(transcript, 0x4160), result) }mstore(add(transcript, 0x4180), mulmod(mload(add(transcript, 0x4160)), mload(add(transcript, 0x3980)), f_q))mstore(add(transcript, 0x41a0), mulmod(sub(f_q, mload(add(transcript, 0x4180))), mload(add(transcript, 0x3a60)), f_q))mstore(add(transcript, 0x41c0), mulmod(mload(add(transcript, 0x3e40)), mload(add(transcript, 0x3a60)), f_q))mstore(add(transcript, 0x41e0), addmod(mload(add(transcript, 0x4140)), mload(add(transcript, 0x41a0)), f_q)){ let result := mulmod(mload(add(transcript, 0x760)), mload(add(transcript, 0x3320)), f_q)mstore(add(transcript, 0x4200), result) }mstore(add(transcript, 0x4220), mulmod(mload(add(transcript, 0x4200)), mload(add(transcript, 0x3980)), f_q))mstore(add(transcript, 0x4240), mulmod(sub(f_q, mload(add(transcript, 0x4220))), mload(add(transcript, 0x3a80)), f_q))mstore(add(transcript, 0x4260), mulmod(mload(add(transcript, 0x3e40)), mload(add(transcript, 0x3a80)), f_q))mstore(add(transcript, 0x4280), addmod(mload(add(transcript, 0x41e0)), mload(add(transcript, 0x4240)), f_q)){ let result := mulmod(mload(add(transcript, 0x780)), mload(add(transcript, 0x3320)), f_q)mstore(add(transcript, 0x42a0), result) }mstore(add(transcript, 0x42c0), mulmod(mload(add(transcript, 0x42a0)), mload(add(transcript, 0x3980)), f_q))mstore(add(transcript, 0x42e0), mulmod(sub(f_q, mload(add(transcript, 0x42c0))), mload(add(transcript, 0x3aa0)), f_q))mstore(add(transcript, 0x4300), mulmod(mload(add(transcript, 0x3e40)), mload(add(transcript, 0x3aa0)), f_q))mstore(add(transcript, 0x4320), addmod(mload(add(transcript, 0x4280)), mload(add(transcript, 0x42e0)), f_q)){ let result := mulmod(mload(add(transcript, 0x7a0)), mload(add(transcript, 0x3320)), f_q)mstore(add(transcript, 0x4340), result) }mstore(add(transcript, 0x4360), mulmod(mload(add(transcript, 0x4340)), mload(add(transcript, 0x3980)), f_q))mstore(add(transcript, 0x4380), mulmod(sub(f_q, mload(add(transcript, 0x4360))), mload(add(transcript, 0x3ac0)), f_q))mstore(add(transcript, 0x43a0), mulmod(mload(add(transcript, 0x3e40)), mload(add(transcript, 0x3ac0)), f_q))mstore(add(transcript, 0x43c0), addmod(mload(add(transcript, 0x4320)), mload(add(transcript, 0x4380)), f_q)){ let result := mulmod(mload(add(transcript, 0x7c0)), mload(add(transcript, 0x3320)), f_q)mstore(add(transcript, 0x43e0), result) }mstore(add(transcript, 0x4400), mulmod(mload(add(transcript, 0x43e0)), mload(add(transcript, 0x3980)), f_q))mstore(add(transcript, 0x4420), mulmod(sub(f_q, mload(add(transcript, 0x4400))), mload(add(transcript, 0x3ae0)), f_q))mstore(add(transcript, 0x4440), mulmod(mload(add(transcript, 0x3e40)), mload(add(transcript, 0x3ae0)), f_q))mstore(add(transcript, 0x4460), addmod(mload(add(transcript, 0x43c0)), mload(add(transcript, 0x4420)), f_q)){ let result := mulmod(mload(add(transcript, 0x7e0)), mload(add(transcript, 0x3320)), f_q)mstore(add(transcript, 0x4480), result) }mstore(add(transcript, 0x44a0), mulmod(mload(add(transcript, 0x4480)), mload(add(transcript, 0x3980)), f_q))mstore(add(transcript, 0x44c0), mulmod(sub(f_q, mload(add(transcript, 0x44a0))), mload(add(transcript, 0x3b00)), f_q))mstore(add(transcript, 0x44e0), mulmod(mload(add(transcript, 0x3e40)), mload(add(transcript, 0x3b00)), f_q))mstore(add(transcript, 0x4500), addmod(mload(add(transcript, 0x4460)), mload(add(transcript, 0x44c0)), f_q)){ let result := mulmod(mload(add(transcript, 0x800)), mload(add(transcript, 0x3320)), f_q)mstore(add(transcript, 0x4520), result) }mstore(add(transcript, 0x4540), mulmod(mload(add(transcript, 0x4520)), mload(add(transcript, 0x3980)), f_q))mstore(add(transcript, 0x4560), mulmod(sub(f_q, mload(add(transcript, 0x4540))), mload(add(transcript, 0x3b20)), f_q))mstore(add(transcript, 0x4580), mulmod(mload(add(transcript, 0x3e40)), mload(add(transcript, 0x3b20)), f_q))mstore(add(transcript, 0x45a0), addmod(mload(add(transcript, 0x4500)), mload(add(transcript, 0x4560)), f_q)){ let result := mulmod(mload(add(transcript, 0x820)), mload(add(transcript, 0x3320)), f_q)mstore(add(transcript, 0x45c0), result) }mstore(add(transcript, 0x45e0), mulmod(mload(add(transcript, 0x45c0)), mload(add(transcript, 0x3980)), f_q))mstore(add(transcript, 0x4600), mulmod(sub(f_q, mload(add(transcript, 0x45e0))), mload(add(transcript, 0x3b40)), f_q))mstore(add(transcript, 0x4620), mulmod(mload(add(transcript, 0x3e40)), mload(add(transcript, 0x3b40)), f_q))mstore(add(transcript, 0x4640), addmod(mload(add(transcript, 0x45a0)), mload(add(transcript, 0x4600)), f_q)){ let result := mulmod(mload(add(transcript, 0x860)), mload(add(transcript, 0x3320)), f_q)mstore(add(transcript, 0x4660), result) }mstore(add(transcript, 0x4680), mulmod(mload(add(transcript, 0x4660)), mload(add(transcript, 0x3980)), f_q))mstore(add(transcript, 0x46a0), mulmod(sub(f_q, mload(add(transcript, 0x4680))), mload(add(transcript, 0x3b60)), f_q))mstore(add(transcript, 0x46c0), mulmod(mload(add(transcript, 0x3e40)), mload(add(transcript, 0x3b60)), f_q))mstore(add(transcript, 0x46e0), addmod(mload(add(transcript, 0x4640)), mload(add(transcript, 0x46a0)), f_q)){ let result := mulmod(mload(add(transcript, 0x880)), mload(add(transcript, 0x3320)), f_q)mstore(add(transcript, 0x4700), result) }mstore(add(transcript, 0x4720), mulmod(mload(add(transcript, 0x4700)), mload(add(transcript, 0x3980)), f_q))mstore(add(transcript, 0x4740), mulmod(sub(f_q, mload(add(transcript, 0x4720))), mload(add(transcript, 0x3b80)), f_q))mstore(add(transcript, 0x4760), mulmod(mload(add(transcript, 0x3e40)), mload(add(transcript, 0x3b80)), f_q))mstore(add(transcript, 0x4780), addmod(mload(add(transcript, 0x46e0)), mload(add(transcript, 0x4740)), f_q)){ let result := mulmod(mload(add(transcript, 0x8a0)), mload(add(transcript, 0x3320)), f_q)mstore(add(transcript, 0x47a0), result) }mstore(add(transcript, 0x47c0), mulmod(mload(add(transcript, 0x47a0)), mload(add(transcript, 0x3980)), f_q))mstore(add(transcript, 0x47e0), mulmod(sub(f_q, mload(add(transcript, 0x47c0))), mload(add(transcript, 0x3ba0)), f_q))mstore(add(transcript, 0x4800), mulmod(mload(add(transcript, 0x3e40)), mload(add(transcript, 0x3ba0)), f_q))mstore(add(transcript, 0x4820), addmod(mload(add(transcript, 0x4780)), mload(add(transcript, 0x47e0)), f_q)){ let result := mulmod(mload(add(transcript, 0x8c0)), mload(add(transcript, 0x3320)), f_q)mstore(add(transcript, 0x4840), result) }mstore(add(transcript, 0x4860), mulmod(mload(add(transcript, 0x4840)), mload(add(transcript, 0x3980)), f_q))mstore(add(transcript, 0x4880), mulmod(sub(f_q, mload(add(transcript, 0x4860))), mload(add(transcript, 0x3bc0)), f_q))mstore(add(transcript, 0x48a0), mulmod(mload(add(transcript, 0x3e40)), mload(add(transcript, 0x3bc0)), f_q))mstore(add(transcript, 0x48c0), addmod(mload(add(transcript, 0x4820)), mload(add(transcript, 0x4880)), f_q)){ let result := mulmod(mload(add(transcript, 0x8e0)), mload(add(transcript, 0x3320)), f_q)mstore(add(transcript, 0x48e0), result) }mstore(add(transcript, 0x4900), mulmod(mload(add(transcript, 0x48e0)), mload(add(transcript, 0x3980)), f_q))mstore(add(transcript, 0x4920), mulmod(sub(f_q, mload(add(transcript, 0x4900))), mload(add(transcript, 0x3be0)), f_q))mstore(add(transcript, 0x4940), mulmod(mload(add(transcript, 0x3e40)), mload(add(transcript, 0x3be0)), f_q))mstore(add(transcript, 0x4960), addmod(mload(add(transcript, 0x48c0)), mload(add(transcript, 0x4920)), f_q)){ let result := mulmod(mload(add(transcript, 0x900)), mload(add(transcript, 0x3320)), f_q)mstore(add(transcript, 0x4980), result) }mstore(add(transcript, 0x49a0), mulmod(mload(add(transcript, 0x4980)), mload(add(transcript, 0x3980)), f_q))mstore(add(transcript, 0x49c0), mulmod(sub(f_q, mload(add(transcript, 0x49a0))), mload(add(transcript, 0x3c00)), f_q))mstore(add(transcript, 0x49e0), mulmod(mload(add(transcript, 0x3e40)), mload(add(transcript, 0x3c00)), f_q))mstore(add(transcript, 0x4a00), addmod(mload(add(transcript, 0x4960)), mload(add(transcript, 0x49c0)), f_q))mstore(add(transcript, 0x4a20), mulmod(mload(add(transcript, 0x30a0)), mload(add(transcript, 0x3720)), f_q))mstore(add(transcript, 0x4a40), mulmod(mload(add(transcript, 0x30c0)), mload(add(transcript, 0x3720)), f_q))mstore(add(transcript, 0x4a60), mulmod(mload(add(transcript, 0x30e0)), mload(add(transcript, 0x3720)), f_q))mstore(add(transcript, 0x4a80), mulmod(mload(add(transcript, 0x3100)), mload(add(transcript, 0x3720)), f_q)){ let result := mulmod(mload(add(transcript, 0x3120)), mload(add(transcript, 0x3320)), f_q)mstore(add(transcript, 0x4aa0), result) }mstore(add(transcript, 0x4ac0), mulmod(mload(add(transcript, 0x4aa0)), mload(add(transcript, 0x3980)), f_q))mstore(add(transcript, 0x4ae0), mulmod(sub(f_q, mload(add(transcript, 0x4ac0))), mload(add(transcript, 0x3c20)), f_q))mstore(add(transcript, 0x4b00), mulmod(mload(add(transcript, 0x3e40)), mload(add(transcript, 0x3c20)), f_q))mstore(add(transcript, 0x4b20), mulmod(mload(add(transcript, 0x4a20)), mload(add(transcript, 0x3c20)), f_q))mstore(add(transcript, 0x4b40), mulmod(mload(add(transcript, 0x4a40)), mload(add(transcript, 0x3c20)), f_q))mstore(add(transcript, 0x4b60), mulmod(mload(add(transcript, 0x4a60)), mload(add(transcript, 0x3c20)), f_q))mstore(add(transcript, 0x4b80), mulmod(mload(add(transcript, 0x4a80)), mload(add(transcript, 0x3c20)), f_q))mstore(add(transcript, 0x4ba0), addmod(mload(add(transcript, 0x4a00)), mload(add(transcript, 0x4ae0)), f_q)){ let result := mulmod(mload(add(transcript, 0x840)), mload(add(transcript, 0x3320)), f_q)mstore(add(transcript, 0x4bc0), result) }mstore(add(transcript, 0x4be0), mulmod(mload(add(transcript, 0x4bc0)), mload(add(transcript, 0x3980)), f_q))mstore(add(transcript, 0x4c00), mulmod(sub(f_q, mload(add(transcript, 0x4be0))), mload(add(transcript, 0x3c40)), f_q))mstore(add(transcript, 0x4c20), mulmod(mload(add(transcript, 0x3e40)), mload(add(transcript, 0x3c40)), f_q))mstore(add(transcript, 0x4c40), addmod(mload(add(transcript, 0x4ba0)), mload(add(transcript, 0x4c00)), f_q))mstore(add(transcript, 0x4c60), mulmod(mload(add(transcript, 0x4c40)), mload(add(transcript, 0xae0)), f_q))mstore(add(transcript, 0x4c80), mulmod(mload(add(transcript, 0x3ec0)), mload(add(transcript, 0xae0)), f_q))mstore(add(transcript, 0x4ca0), mulmod(mload(add(transcript, 0x3f40)), mload(add(transcript, 0xae0)), f_q))mstore(add(transcript, 0x4cc0), mulmod(mload(add(transcript, 0x3fe0)), mload(add(transcript, 0xae0)), f_q))mstore(add(transcript, 0x4ce0), mulmod(mload(add(transcript, 0x4080)), mload(add(transcript, 0xae0)), f_q))mstore(add(transcript, 0x4d00), mulmod(mload(add(transcript, 0x4120)), mload(add(transcript, 0xae0)), f_q))mstore(add(transcript, 0x4d20), mulmod(mload(add(transcript, 0x41c0)), mload(add(transcript, 0xae0)), f_q))mstore(add(transcript, 0x4d40), mulmod(mload(add(transcript, 0x4260)), mload(add(transcript, 0xae0)), f_q))mstore(add(transcript, 0x4d60), mulmod(mload(add(transcript, 0x4300)), mload(add(transcript, 0xae0)), f_q))mstore(add(transcript, 0x4d80), mulmod(mload(add(transcript, 0x43a0)), mload(add(transcript, 0xae0)), f_q))mstore(add(transcript, 0x4da0), mulmod(mload(add(transcript, 0x4440)), mload(add(transcript, 0xae0)), f_q))mstore(add(transcript, 0x4dc0), mulmod(mload(add(transcript, 0x44e0)), mload(add(transcript, 0xae0)), f_q))mstore(add(transcript, 0x4de0), mulmod(mload(add(transcript, 0x4580)), mload(add(transcript, 0xae0)), f_q))mstore(add(transcript, 0x4e00), mulmod(mload(add(transcript, 0x4620)), mload(add(transcript, 0xae0)), f_q))mstore(add(transcript, 0x4e20), mulmod(mload(add(transcript, 0x46c0)), mload(add(transcript, 0xae0)), f_q))mstore(add(transcript, 0x4e40), mulmod(mload(add(transcript, 0x4760)), mload(add(transcript, 0xae0)), f_q))mstore(add(transcript, 0x4e60), mulmod(mload(add(transcript, 0x4800)), mload(add(transcript, 0xae0)), f_q))mstore(add(transcript, 0x4e80), mulmod(mload(add(transcript, 0x48a0)), mload(add(transcript, 0xae0)), f_q))mstore(add(transcript, 0x4ea0), mulmod(mload(add(transcript, 0x4940)), mload(add(transcript, 0xae0)), f_q))mstore(add(transcript, 0x4ec0), mulmod(mload(add(transcript, 0x49e0)), mload(add(transcript, 0xae0)), f_q))mstore(add(transcript, 0x4ee0), mulmod(mload(add(transcript, 0x4b00)), mload(add(transcript, 0xae0)), f_q))mstore(add(transcript, 0x4f00), mulmod(mload(add(transcript, 0x4b20)), mload(add(transcript, 0xae0)), f_q))mstore(add(transcript, 0x4f20), mulmod(mload(add(transcript, 0x4b40)), mload(add(transcript, 0xae0)), f_q))mstore(add(transcript, 0x4f40), mulmod(mload(add(transcript, 0x4b60)), mload(add(transcript, 0xae0)), f_q))mstore(add(transcript, 0x4f60), mulmod(mload(add(transcript, 0x4b80)), mload(add(transcript, 0xae0)), f_q))mstore(add(transcript, 0x4f80), mulmod(mload(add(transcript, 0x4c20)), mload(add(transcript, 0xae0)), f_q))mstore(add(transcript, 0x4fa0), addmod(mload(add(transcript, 0x3e00)), mload(add(transcript, 0x4c60)), f_q))mstore(add(transcript, 0x4fc0), mulmod(1, mload(add(transcript, 0x3760)), f_q)){ let result := mulmod(mload(add(transcript, 0x920)), mload(add(transcript, 0x3340)), f_q)result := addmod(mulmod(mload(add(transcript, 0x940)), mload(add(transcript, 0x3360)), f_q), result, f_q)result := addmod(mulmod(mload(add(transcript, 0x960)), mload(add(transcript, 0x3380)), f_q), result, f_q)mstore(add(transcript, 0x4fe0), result) }mstore(add(transcript, 0x5000), mulmod(mload(add(transcript, 0x4fe0)), mload(add(transcript, 0x39a0)), f_q))mstore(add(transcript, 0x5020), mulmod(sub(f_q, mload(add(transcript, 0x5000))), 1, f_q))mstore(add(transcript, 0x5040), mulmod(mload(add(transcript, 0x4fc0)), 1, f_q))mstore(add(transcript, 0x5060), mulmod(mload(add(transcript, 0x5020)), mload(add(transcript, 0x3c80)), f_q))mstore(add(transcript, 0x5080), mulmod(mload(add(transcript, 0x5040)), mload(add(transcript, 0x3c80)), f_q))mstore(add(transcript, 0x50a0), addmod(mload(add(transcript, 0x4fa0)), mload(add(transcript, 0x5060)), f_q))mstore(add(transcript, 0x50c0), mulmod(1, mload(add(transcript, 0x37a0)), f_q)){ let result := mulmod(mload(add(transcript, 0x980)), mload(add(transcript, 0x33c0)), f_q)result := addmod(mulmod(mload(add(transcript, 0x9a0)), mload(add(transcript, 0x33e0)), f_q), result, f_q)mstore(add(transcript, 0x50e0), result) }mstore(add(transcript, 0x5100), mulmod(mload(add(transcript, 0x50e0)), mload(add(transcript, 0x39c0)), f_q))mstore(add(transcript, 0x5120), mulmod(sub(f_q, mload(add(transcript, 0x5100))), 1, f_q))mstore(add(transcript, 0x5140), mulmod(mload(add(transcript, 0x50c0)), 1, f_q)){ let result := mulmod(mload(add(transcript, 0x9c0)), mload(add(transcript, 0x33c0)), f_q)result := addmod(mulmod(mload(add(transcript, 0x9e0)), mload(add(transcript, 0x33e0)), f_q), result, f_q)mstore(add(transcript, 0x5160), result) }mstore(add(transcript, 0x5180), mulmod(mload(add(transcript, 0x5160)), mload(add(transcript, 0x39c0)), f_q))mstore(add(transcript, 0x51a0), mulmod(sub(f_q, mload(add(transcript, 0x5180))), mload(add(transcript, 0xa80)), f_q))mstore(add(transcript, 0x51c0), mulmod(mload(add(transcript, 0x50c0)), mload(add(transcript, 0xa80)), f_q))mstore(add(transcript, 0x51e0), addmod(mload(add(transcript, 0x5120)), mload(add(transcript, 0x51a0)), f_q))mstore(add(transcript, 0x5200), mulmod(mload(add(transcript, 0x51e0)), mload(add(transcript, 0x3ca0)), f_q))mstore(add(transcript, 0x5220), mulmod(mload(add(transcript, 0x5140)), mload(add(transcript, 0x3ca0)), f_q))mstore(add(transcript, 0x5240), mulmod(mload(add(transcript, 0x51c0)), mload(add(transcript, 0x3ca0)), f_q))mstore(add(transcript, 0x5260), addmod(mload(add(transcript, 0x50a0)), mload(add(transcript, 0x5200)), f_q))mstore(add(transcript, 0x5280), mulmod(1, mload(add(transcript, 0x37e0)), f_q)){ let result := mulmod(mload(add(transcript, 0xa00)), mload(add(transcript, 0x3400)), f_q)result := addmod(mulmod(mload(add(transcript, 0xa20)), mload(add(transcript, 0x3420)), f_q), result, f_q)mstore(add(transcript, 0x52a0), result) }mstore(add(transcript, 0x52c0), mulmod(mload(add(transcript, 0x52a0)), mload(add(transcript, 0x39e0)), f_q))mstore(add(transcript, 0x52e0), mulmod(sub(f_q, mload(add(transcript, 0x52c0))), 1, f_q))mstore(add(transcript, 0x5300), mulmod(mload(add(transcript, 0x5280)), 1, f_q))mstore(add(transcript, 0x5320), mulmod(mload(add(transcript, 0x52e0)), mload(add(transcript, 0x3cc0)), f_q))mstore(add(transcript, 0x5340), mulmod(mload(add(transcript, 0x5300)), mload(add(transcript, 0x3cc0)), f_q))mstore(add(transcript, 0x5360), addmod(mload(add(transcript, 0x5260)), mload(add(transcript, 0x5320)), f_q))mstore(add(transcript, 0x5380), mulmod(1, mload(add(transcript, 0x3300)), f_q))mstore(add(transcript, 0x53a0), mulmod(1, mload(add(transcript, 0xb80)), f_q))mstore(add(transcript, 0x53c0), 0x0000000000000000000000000000000000000000000000000000000000000001) mstore(add(transcript, 0x53e0), 0x0000000000000000000000000000000000000000000000000000000000000002)mstore(add(transcript, 0x5400), mload(add(transcript, 0x5360)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x53c0), 0x60, add(transcript, 0x53c0), 0x40), 1), success)mstore(add(transcript, 0x5420), mload(add(transcript, 0x53c0))) mstore(add(transcript, 0x5440), mload(add(transcript, 0x53e0)))mstore(add(transcript, 0x5460), mload(add(transcript, 0xa0))) mstore(add(transcript, 0x5480), mload(add(transcript, 0xc0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5420), 0x80, add(transcript, 0x5420), 0x40), 1), success)mstore(add(transcript, 0x54a0), mload(add(transcript, 0xe0))) mstore(add(transcript, 0x54c0), mload(add(transcript, 0x100)))mstore(add(transcript, 0x54e0), mload(add(transcript, 0x3e20)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x54a0), 0x60, add(transcript, 0x54a0), 0x40), 1), success)mstore(add(transcript, 0x5500), mload(add(transcript, 0x5420))) mstore(add(transcript, 0x5520), mload(add(transcript, 0x5440)))mstore(add(transcript, 0x5540), mload(add(transcript, 0x54a0))) mstore(add(transcript, 0x5560), mload(add(transcript, 0x54c0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5500), 0x80, add(transcript, 0x5500), 0x40), 1), success)mstore(add(transcript, 0x5580), mload(add(transcript, 0x120))) mstore(add(transcript, 0x55a0), mload(add(transcript, 0x140)))mstore(add(transcript, 0x55c0), mload(add(transcript, 0x4c80)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5580), 0x60, add(transcript, 0x5580), 0x40), 1), success)mstore(add(transcript, 0x55e0), mload(add(transcript, 0x5500))) mstore(add(transcript, 0x5600), mload(add(transcript, 0x5520)))mstore(add(transcript, 0x5620), mload(add(transcript, 0x5580))) mstore(add(transcript, 0x5640), mload(add(transcript, 0x55a0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x55e0), 0x80, add(transcript, 0x55e0), 0x40), 1), success)mstore(add(transcript, 0x5660), mload(add(transcript, 0x200))) mstore(add(transcript, 0x5680), mload(add(transcript, 0x220)))mstore(add(transcript, 0x56a0), mload(add(transcript, 0x4ca0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5660), 0x60, add(transcript, 0x5660), 0x40), 1), success)mstore(add(transcript, 0x56c0), mload(add(transcript, 0x55e0))) mstore(add(transcript, 0x56e0), mload(add(transcript, 0x5600)))mstore(add(transcript, 0x5700), mload(add(transcript, 0x5660))) mstore(add(transcript, 0x5720), mload(add(transcript, 0x5680)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x56c0), 0x80, add(transcript, 0x56c0), 0x40), 1), success)mstore(add(transcript, 0x5740), 0x046611b44bb4f4cd8fcf6f82fed641d34961b88a6012df5e0f44d4f40248d57b) mstore(add(transcript, 0x5760), 0x25b84353a92c37bb156457e31b9133dc81245e1f3774b898f41cf59a7b0adf57)mstore(add(transcript, 0x5780), mload(add(transcript, 0x4cc0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5740), 0x60, add(transcript, 0x5740), 0x40), 1), success)mstore(add(transcript, 0x57a0), mload(add(transcript, 0x56c0))) mstore(add(transcript, 0x57c0), mload(add(transcript, 0x56e0)))mstore(add(transcript, 0x57e0), mload(add(transcript, 0x5740))) mstore(add(transcript, 0x5800), mload(add(transcript, 0x5760)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x57a0), 0x80, add(transcript, 0x57a0), 0x40), 1), success)mstore(add(transcript, 0x5820), 0x259da9f643187930ce1299a3f700a93f17cf3129bffe184a6de1cf19f0b91f7e) mstore(add(transcript, 0x5840), 0x29fcbc05cd2c0152b3eb21e8fd01a00bc79780f21281598873fb955dba235f7e)mstore(add(transcript, 0x5860), mload(add(transcript, 0x4ce0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5820), 0x60, add(transcript, 0x5820), 0x40), 1), success)mstore(add(transcript, 0x5880), mload(add(transcript, 0x57a0))) mstore(add(transcript, 0x58a0), mload(add(transcript, 0x57c0)))mstore(add(transcript, 0x58c0), mload(add(transcript, 0x5820))) mstore(add(transcript, 0x58e0), mload(add(transcript, 0x5840)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5880), 0x80, add(transcript, 0x5880), 0x40), 1), success)mstore(add(transcript, 0x5900), 0x2b99cb49ca685626a08c009ea442fc895a2f86cca1f29f18d4b7ec9ece937aa2) mstore(add(transcript, 0x5920), 0x20a45cae33f3917205b76aeb87e409350840664058839b1db76f8761db50fac8)mstore(add(transcript, 0x5940), mload(add(transcript, 0x4d00)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5900), 0x60, add(transcript, 0x5900), 0x40), 1), success)mstore(add(transcript, 0x5960), mload(add(transcript, 0x5880))) mstore(add(transcript, 0x5980), mload(add(transcript, 0x58a0)))mstore(add(transcript, 0x59a0), mload(add(transcript, 0x5900))) mstore(add(transcript, 0x59c0), mload(add(transcript, 0x5920)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5960), 0x80, add(transcript, 0x5960), 0x40), 1), success)mstore(add(transcript, 0x59e0), 0x25a265a57942223657b3316c913bffe8db0efedbed9ac878308e1d63d4df61d8) mstore(add(transcript, 0x5a00), 0x0d2f79604094b53fd56a955d2574e241ad67498ab320f2bb764841f5c903bff9)mstore(add(transcript, 0x5a20), mload(add(transcript, 0x4d20)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x59e0), 0x60, add(transcript, 0x59e0), 0x40), 1), success)mstore(add(transcript, 0x5a40), mload(add(transcript, 0x5960))) mstore(add(transcript, 0x5a60), mload(add(transcript, 0x5980)))mstore(add(transcript, 0x5a80), mload(add(transcript, 0x59e0))) mstore(add(transcript, 0x5aa0), mload(add(transcript, 0x5a00)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5a40), 0x80, add(transcript, 0x5a40), 0x40), 1), success)mstore(add(transcript, 0x5ac0), 0x22e1cdbfffcfcf4f18cf4342edf1fb26c3b6e52ace3d5fadcf5cc2614333baa4) mstore(add(transcript, 0x5ae0), 0x0e28df72dcc69cc6442d72f693661997480a913ac353890efd63a873959727c0)mstore(add(transcript, 0x5b00), mload(add(transcript, 0x4d40)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5ac0), 0x60, add(transcript, 0x5ac0), 0x40), 1), success)mstore(add(transcript, 0x5b20), mload(add(transcript, 0x5a40))) mstore(add(transcript, 0x5b40), mload(add(transcript, 0x5a60)))mstore(add(transcript, 0x5b60), mload(add(transcript, 0x5ac0))) mstore(add(transcript, 0x5b80), mload(add(transcript, 0x5ae0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5b20), 0x80, add(transcript, 0x5b20), 0x40), 1), success)mstore(add(transcript, 0x5ba0), 0x0160a474a2c8de56950bbe25d6f09002a91f2cc20fbdb15e8413f1176e7f1865) mstore(add(transcript, 0x5bc0), 0x1d0f5797eaaea89e5119e4260db563605a84d004b8efd02c51b960bfecf20e90)mstore(add(transcript, 0x5be0), mload(add(transcript, 0x4d60)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5ba0), 0x60, add(transcript, 0x5ba0), 0x40), 1), success)mstore(add(transcript, 0x5c00), mload(add(transcript, 0x5b20))) mstore(add(transcript, 0x5c20), mload(add(transcript, 0x5b40)))mstore(add(transcript, 0x5c40), mload(add(transcript, 0x5ba0))) mstore(add(transcript, 0x5c60), mload(add(transcript, 0x5bc0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5c00), 0x80, add(transcript, 0x5c00), 0x40), 1), success)mstore(add(transcript, 0x5c80), 0x02b619a2a245b370b3319e21e0be467256209338cf9546447b875a2779e010d4) mstore(add(transcript, 0x5ca0), 0x07d7f03df06345ba2df20bb867841f60ebd25daab5aafa13ddc1413116996802)mstore(add(transcript, 0x5cc0), mload(add(transcript, 0x4d80)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5c80), 0x60, add(transcript, 0x5c80), 0x40), 1), success)mstore(add(transcript, 0x5ce0), mload(add(transcript, 0x5c00))) mstore(add(transcript, 0x5d00), mload(add(transcript, 0x5c20)))mstore(add(transcript, 0x5d20), mload(add(transcript, 0x5c80))) mstore(add(transcript, 0x5d40), mload(add(transcript, 0x5ca0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5ce0), 0x80, add(transcript, 0x5ce0), 0x40), 1), success)mstore(add(transcript, 0x5d60), 0x203b21a648fbfb96459640bbc5b41852dd1efc1209c89b635ba638dcb929da6b) mstore(add(transcript, 0x5d80), 0x04e7002f06f2091a44afcd311e93c22f46dd9f3207b5bcc34f0ca7652098f097)mstore(add(transcript, 0x5da0), mload(add(transcript, 0x4da0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5d60), 0x60, add(transcript, 0x5d60), 0x40), 1), success)mstore(add(transcript, 0x5dc0), mload(add(transcript, 0x5ce0))) mstore(add(transcript, 0x5de0), mload(add(transcript, 0x5d00)))mstore(add(transcript, 0x5e00), mload(add(transcript, 0x5d60))) mstore(add(transcript, 0x5e20), mload(add(transcript, 0x5d80)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5dc0), 0x80, add(transcript, 0x5dc0), 0x40), 1), success)mstore(add(transcript, 0x5e40), 0x20ab7490b42f3f7b2b0bbe601a09d72ee93f924801d597f48cf2d443751d5f91) mstore(add(transcript, 0x5e60), 0x2bca2f1762946a05fb1632550c6cb12c02d18d9bee5bdd4212ca7342888720fd)mstore(add(transcript, 0x5e80), mload(add(transcript, 0x4dc0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5e40), 0x60, add(transcript, 0x5e40), 0x40), 1), success)mstore(add(transcript, 0x5ea0), mload(add(transcript, 0x5dc0))) mstore(add(transcript, 0x5ec0), mload(add(transcript, 0x5de0)))mstore(add(transcript, 0x5ee0), mload(add(transcript, 0x5e40))) mstore(add(transcript, 0x5f00), mload(add(transcript, 0x5e60)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5ea0), 0x80, add(transcript, 0x5ea0), 0x40), 1), success)mstore(add(transcript, 0x5f20), 0x13caf6fa687a546fd1eeb9e0d43a9f8fe9a3f05322f5edda1b95d50e83839851) mstore(add(transcript, 0x5f40), 0x22e2768775e2d96fd8925c48a99df2b248cb3d893a15b9dca81660b79cc35f4a)mstore(add(transcript, 0x5f60), mload(add(transcript, 0x4de0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5f20), 0x60, add(transcript, 0x5f20), 0x40), 1), success)mstore(add(transcript, 0x5f80), mload(add(transcript, 0x5ea0))) mstore(add(transcript, 0x5fa0), mload(add(transcript, 0x5ec0)))mstore(add(transcript, 0x5fc0), mload(add(transcript, 0x5f20))) mstore(add(transcript, 0x5fe0), mload(add(transcript, 0x5f40)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5f80), 0x80, add(transcript, 0x5f80), 0x40), 1), success)mstore(add(transcript, 0x6000), 0x19a074dc6d1a0f1e5589a55d9c4955cf867e2899dbfd46a11c27a84804b5b239) mstore(add(transcript, 0x6020), 0x26b112fb59a0b875833e52f951b3b010826b169f320d80597f1275544ae24897)mstore(add(transcript, 0x6040), mload(add(transcript, 0x4e00)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6000), 0x60, add(transcript, 0x6000), 0x40), 1), success)mstore(add(transcript, 0x6060), mload(add(transcript, 0x5f80))) mstore(add(transcript, 0x6080), mload(add(transcript, 0x5fa0)))mstore(add(transcript, 0x60a0), mload(add(transcript, 0x6000))) mstore(add(transcript, 0x60c0), mload(add(transcript, 0x6020)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6060), 0x80, add(transcript, 0x6060), 0x40), 1), success)mstore(add(transcript, 0x60e0), 0x1c6df6612866079dc2a52525842c8025502eb5a8913c560836c4bc7ab2dc334e) mstore(add(transcript, 0x6100), 0x0d36fe2bf6d58291ed035a1f090904639502213a2449227d156ee3f8f6372e2c)mstore(add(transcript, 0x6120), mload(add(transcript, 0x4e20)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x60e0), 0x60, add(transcript, 0x60e0), 0x40), 1), success)mstore(add(transcript, 0x6140), mload(add(transcript, 0x6060))) mstore(add(transcript, 0x6160), mload(add(transcript, 0x6080)))mstore(add(transcript, 0x6180), mload(add(transcript, 0x60e0))) mstore(add(transcript, 0x61a0), mload(add(transcript, 0x6100)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6140), 0x80, add(transcript, 0x6140), 0x40), 1), success)mstore(add(transcript, 0x61c0), 0x01add1e14d0a1880ee8e837b20502713d06428d55d61fea8fea89a71648971fa) mstore(add(transcript, 0x61e0), 0x12c982466ea6dcfada3ad0e277fed44f770466650d4704906a4d34b6b8d8bed1)mstore(add(transcript, 0x6200), mload(add(transcript, 0x4e40)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x61c0), 0x60, add(transcript, 0x61c0), 0x40), 1), success)mstore(add(transcript, 0x6220), mload(add(transcript, 0x6140))) mstore(add(transcript, 0x6240), mload(add(transcript, 0x6160)))mstore(add(transcript, 0x6260), mload(add(transcript, 0x61c0))) mstore(add(transcript, 0x6280), mload(add(transcript, 0x61e0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6220), 0x80, add(transcript, 0x6220), 0x40), 1), success)mstore(add(transcript, 0x62a0), 0x2faee9fe4eb97b37abb4fdd1b604ed8acf55df0a370bcfe7f5615b7598989d7a) mstore(add(transcript, 0x62c0), 0x2269aff86c3fd35864f3e2cb39db623e0122a05b6b5f789ff57434e557a90c23)mstore(add(transcript, 0x62e0), mload(add(transcript, 0x4e60)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x62a0), 0x60, add(transcript, 0x62a0), 0x40), 1), success)mstore(add(transcript, 0x6300), mload(add(transcript, 0x6220))) mstore(add(transcript, 0x6320), mload(add(transcript, 0x6240)))mstore(add(transcript, 0x6340), mload(add(transcript, 0x62a0))) mstore(add(transcript, 0x6360), mload(add(transcript, 0x62c0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6300), 0x80, add(transcript, 0x6300), 0x40), 1), success)mstore(add(transcript, 0x6380), 0x0743ea40f14084db2673217283aa053f986896ee7c181f52118442e99c452974) mstore(add(transcript, 0x63a0), 0x0203e3493a2594ece57d22cc75dd081ac68271ec7c758153cfd2152bfb5c19e3)mstore(add(transcript, 0x63c0), mload(add(transcript, 0x4e80)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6380), 0x60, add(transcript, 0x6380), 0x40), 1), success)mstore(add(transcript, 0x63e0), mload(add(transcript, 0x6300))) mstore(add(transcript, 0x6400), mload(add(transcript, 0x6320)))mstore(add(transcript, 0x6420), mload(add(transcript, 0x6380))) mstore(add(transcript, 0x6440), mload(add(transcript, 0x63a0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x63e0), 0x80, add(transcript, 0x63e0), 0x40), 1), success)mstore(add(transcript, 0x6460), 0x01b6921cc4c35a03d696e754bac06edba8187499252d98da7e7d40b844f24245) mstore(add(transcript, 0x6480), 0x181dfa294889601a9cc57448d966b9cc60e7795ab336d2078dc43aeb888484fb)mstore(add(transcript, 0x64a0), mload(add(transcript, 0x4ea0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6460), 0x60, add(transcript, 0x6460), 0x40), 1), success)mstore(add(transcript, 0x64c0), mload(add(transcript, 0x63e0))) mstore(add(transcript, 0x64e0), mload(add(transcript, 0x6400)))mstore(add(transcript, 0x6500), mload(add(transcript, 0x6460))) mstore(add(transcript, 0x6520), mload(add(transcript, 0x6480)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x64c0), 0x80, add(transcript, 0x64c0), 0x40), 1), success)mstore(add(transcript, 0x6540), 0x0f0dcdaa6fd2f36460376557f9d6b4b0985b085d2d8ffca7c6c408d8560d5d08) mstore(add(transcript, 0x6560), 0x0bc4e7f7a927678093e4be2bfb543ab7d6267ee943e8ed13369a3b3c9ef23779)mstore(add(transcript, 0x6580), mload(add(transcript, 0x4ec0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6540), 0x60, add(transcript, 0x6540), 0x40), 1), success)mstore(add(transcript, 0x65a0), mload(add(transcript, 0x64c0))) mstore(add(transcript, 0x65c0), mload(add(transcript, 0x64e0)))mstore(add(transcript, 0x65e0), mload(add(transcript, 0x6540))) mstore(add(transcript, 0x6600), mload(add(transcript, 0x6560)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x65a0), 0x80, add(transcript, 0x65a0), 0x40), 1), success)mstore(add(transcript, 0x6620), mload(add(transcript, 0x460))) mstore(add(transcript, 0x6640), mload(add(transcript, 0x480)))mstore(add(transcript, 0x6660), mload(add(transcript, 0x4ee0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6620), 0x60, add(transcript, 0x6620), 0x40), 1), success)mstore(add(transcript, 0x6680), mload(add(transcript, 0x65a0))) mstore(add(transcript, 0x66a0), mload(add(transcript, 0x65c0)))mstore(add(transcript, 0x66c0), mload(add(transcript, 0x6620))) mstore(add(transcript, 0x66e0), mload(add(transcript, 0x6640)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6680), 0x80, add(transcript, 0x6680), 0x40), 1), success)mstore(add(transcript, 0x6700), mload(add(transcript, 0x4a0))) mstore(add(transcript, 0x6720), mload(add(transcript, 0x4c0)))mstore(add(transcript, 0x6740), mload(add(transcript, 0x4f00)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6700), 0x60, add(transcript, 0x6700), 0x40), 1), success)mstore(add(transcript, 0x6760), mload(add(transcript, 0x6680))) mstore(add(transcript, 0x6780), mload(add(transcript, 0x66a0)))mstore(add(transcript, 0x67a0), mload(add(transcript, 0x6700))) mstore(add(transcript, 0x67c0), mload(add(transcript, 0x6720)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6760), 0x80, add(transcript, 0x6760), 0x40), 1), success)mstore(add(transcript, 0x67e0), mload(add(transcript, 0x4e0))) mstore(add(transcript, 0x6800), mload(add(transcript, 0x500)))mstore(add(transcript, 0x6820), mload(add(transcript, 0x4f20)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x67e0), 0x60, add(transcript, 0x67e0), 0x40), 1), success)mstore(add(transcript, 0x6840), mload(add(transcript, 0x6760))) mstore(add(transcript, 0x6860), mload(add(transcript, 0x6780)))mstore(add(transcript, 0x6880), mload(add(transcript, 0x67e0))) mstore(add(transcript, 0x68a0), mload(add(transcript, 0x6800)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6840), 0x80, add(transcript, 0x6840), 0x40), 1), success)mstore(add(transcript, 0x68c0), mload(add(transcript, 0x520))) mstore(add(transcript, 0x68e0), mload(add(transcript, 0x540)))mstore(add(transcript, 0x6900), mload(add(transcript, 0x4f40)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x68c0), 0x60, add(transcript, 0x68c0), 0x40), 1), success)mstore(add(transcript, 0x6920), mload(add(transcript, 0x6840))) mstore(add(transcript, 0x6940), mload(add(transcript, 0x6860)))mstore(add(transcript, 0x6960), mload(add(transcript, 0x68c0))) mstore(add(transcript, 0x6980), mload(add(transcript, 0x68e0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6920), 0x80, add(transcript, 0x6920), 0x40), 1), success)mstore(add(transcript, 0x69a0), mload(add(transcript, 0x560))) mstore(add(transcript, 0x69c0), mload(add(transcript, 0x580)))mstore(add(transcript, 0x69e0), mload(add(transcript, 0x4f60)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x69a0), 0x60, add(transcript, 0x69a0), 0x40), 1), success)mstore(add(transcript, 0x6a00), mload(add(transcript, 0x6920))) mstore(add(transcript, 0x6a20), mload(add(transcript, 0x6940)))mstore(add(transcript, 0x6a40), mload(add(transcript, 0x69a0))) mstore(add(transcript, 0x6a60), mload(add(transcript, 0x69c0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6a00), 0x80, add(transcript, 0x6a00), 0x40), 1), success)mstore(add(transcript, 0x6a80), mload(add(transcript, 0x3c0))) mstore(add(transcript, 0x6aa0), mload(add(transcript, 0x3e0)))mstore(add(transcript, 0x6ac0), mload(add(transcript, 0x4f80)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6a80), 0x60, add(transcript, 0x6a80), 0x40), 1), success)mstore(add(transcript, 0x6ae0), mload(add(transcript, 0x6a00))) mstore(add(transcript, 0x6b00), mload(add(transcript, 0x6a20)))mstore(add(transcript, 0x6b20), mload(add(transcript, 0x6a80))) mstore(add(transcript, 0x6b40), mload(add(transcript, 0x6aa0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6ae0), 0x80, add(transcript, 0x6ae0), 0x40), 1), success)mstore(add(transcript, 0x6b60), mload(add(transcript, 0x300))) mstore(add(transcript, 0x6b80), mload(add(transcript, 0x320)))mstore(add(transcript, 0x6ba0), mload(add(transcript, 0x5080)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6b60), 0x60, add(transcript, 0x6b60), 0x40), 1), success)mstore(add(transcript, 0x6bc0), mload(add(transcript, 0x6ae0))) mstore(add(transcript, 0x6be0), mload(add(transcript, 0x6b00)))mstore(add(transcript, 0x6c00), mload(add(transcript, 0x6b60))) mstore(add(transcript, 0x6c20), mload(add(transcript, 0x6b80)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6bc0), 0x80, add(transcript, 0x6bc0), 0x40), 1), success)mstore(add(transcript, 0x6c40), mload(add(transcript, 0x340))) mstore(add(transcript, 0x6c60), mload(add(transcript, 0x360)))mstore(add(transcript, 0x6c80), mload(add(transcript, 0x5220)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6c40), 0x60, add(transcript, 0x6c40), 0x40), 1), success)mstore(add(transcript, 0x6ca0), mload(add(transcript, 0x6bc0))) mstore(add(transcript, 0x6cc0), mload(add(transcript, 0x6be0)))mstore(add(transcript, 0x6ce0), mload(add(transcript, 0x6c40))) mstore(add(transcript, 0x6d00), mload(add(transcript, 0x6c60)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6ca0), 0x80, add(transcript, 0x6ca0), 0x40), 1), success)mstore(add(transcript, 0x6d20), mload(add(transcript, 0x380))) mstore(add(transcript, 0x6d40), mload(add(transcript, 0x3a0)))mstore(add(transcript, 0x6d60), mload(add(transcript, 0x5240)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6d20), 0x60, add(transcript, 0x6d20), 0x40), 1), success)mstore(add(transcript, 0x6d80), mload(add(transcript, 0x6ca0))) mstore(add(transcript, 0x6da0), mload(add(transcript, 0x6cc0)))mstore(add(transcript, 0x6dc0), mload(add(transcript, 0x6d20))) mstore(add(transcript, 0x6de0), mload(add(transcript, 0x6d40)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6d80), 0x80, add(transcript, 0x6d80), 0x40), 1), success)mstore(add(transcript, 0x6e00), mload(add(transcript, 0x1c0))) mstore(add(transcript, 0x6e20), mload(add(transcript, 0x1e0)))mstore(add(transcript, 0x6e40), mload(add(transcript, 0x5340)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6e00), 0x60, add(transcript, 0x6e00), 0x40), 1), success)mstore(add(transcript, 0x6e60), mload(add(transcript, 0x6d80))) mstore(add(transcript, 0x6e80), mload(add(transcript, 0x6da0)))mstore(add(transcript, 0x6ea0), mload(add(transcript, 0x6e00))) mstore(add(transcript, 0x6ec0), mload(add(transcript, 0x6e20)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6e60), 0x80, add(transcript, 0x6e60), 0x40), 1), success)mstore(add(transcript, 0x6ee0), mload(add(transcript, 0xb20))) mstore(add(transcript, 0x6f00), mload(add(transcript, 0xb40)))mstore(add(transcript, 0x6f20), sub(f_q, mload(add(transcript, 0x5380))))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6ee0), 0x60, add(transcript, 0x6ee0), 0x40), 1), success)mstore(add(transcript, 0x6f40), mload(add(transcript, 0x6e60))) mstore(add(transcript, 0x6f60), mload(add(transcript, 0x6e80)))mstore(add(transcript, 0x6f80), mload(add(transcript, 0x6ee0))) mstore(add(transcript, 0x6fa0), mload(add(transcript, 0x6f00)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6f40), 0x80, add(transcript, 0x6f40), 0x40), 1), success)mstore(add(transcript, 0x6fc0), mload(add(transcript, 0xbc0))) mstore(add(transcript, 0x6fe0), mload(add(transcript, 0xbe0)))mstore(add(transcript, 0x7000), mload(add(transcript, 0x53a0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6fc0), 0x60, add(transcript, 0x6fc0), 0x40), 1), success)mstore(add(transcript, 0x7020), mload(add(transcript, 0x6f40))) mstore(add(transcript, 0x7040), mload(add(transcript, 0x6f60)))mstore(add(transcript, 0x7060), mload(add(transcript, 0x6fc0))) mstore(add(transcript, 0x7080), mload(add(transcript, 0x6fe0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x7020), 0x80, add(transcript, 0x7020), 0x40), 1), success)mstore(add(transcript, 0x70a0), mload(add(transcript, 0x7020))) mstore(add(transcript, 0x70c0), mload(add(transcript, 0x7040)))mstore(add(transcript, 0x70e0), 0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2) mstore(add(transcript, 0x7100), 0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed) mstore(add(transcript, 0x7120), 0x090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b) mstore(add(transcript, 0x7140), 0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa)mstore(add(transcript, 0x7160), mload(add(transcript, 0xbc0))) mstore(add(transcript, 0x7180), mload(add(transcript, 0xbe0)))mstore(add(transcript, 0x71a0), 0x26186a2d65ee4d2f9c9a5b91f86597d35f192cd120caf7e935d8443d1938e23d) mstore(add(transcript, 0x71c0), 0x30441fd1b5d3370482c42152a8899027716989a6996c2535bc9f7fee8aaef79e) mstore(add(transcript, 0x71e0), 0x16f363f103c80d7bbc8ad3c6867e0822bbc6000be91a4689755c7df40221c145) mstore(add(transcript, 0x7200), 0x2b1cbb3e521edf5a622d82762a44a5e63f1e50b332d71154a4a7958d6011deff)success := and(eq(staticcall(gas(), 0x8, add(transcript, 0x70a0), 0x180, add(transcript, 0x70a0), 0x20), 1), success)success := and(eq(mload(add(transcript, 0x70a0)), 1), success)} return success; } } diff --git a/contracts/src/InclusionVerifier.yul b/contracts/src/InclusionVerifier.yul index 100166c5..ecedccdf 100644 --- a/contracts/src/InclusionVerifier.yul +++ b/contracts/src/InclusionVerifier.yul @@ -35,7 +35,7 @@ mstore(0x40, mod(calldataload(0x20), f_q)) mstore(0x60, mod(calldataload(0x40), f_q)) mstore(0x80, mod(calldataload(0x60), f_q)) -mstore(0x0, 4807875969802051575329349424543462078160599761356767644666470846188645432252) +mstore(0x0, 10713647047137275325514842673052213194938514302175862889195177290473686162583) { let x := calldataload(0x80) @@ -1221,8 +1221,8 @@ mstore(0x56c0, mload(0x55e0)) mstore(0x5700, mload(0x5660)) mstore(0x5720, mload(0x5680)) success := and(eq(staticcall(gas(), 0x6, 0x56c0, 0x80, 0x56c0, 0x40), 1), success) -mstore(0x5740, 0x291e4db43c260726b91c535917a801bde06be7f7cf45010909762313db425290) - mstore(0x5760, 0x154e7fe15847ac4d1cd93fa6c8209672cfccf45ad8e13ab82fc6b167ba1994fc) +mstore(0x5740, 0x046611b44bb4f4cd8fcf6f82fed641d34961b88a6012df5e0f44d4f40248d57b) + mstore(0x5760, 0x25b84353a92c37bb156457e31b9133dc81245e1f3774b898f41cf59a7b0adf57) mstore(0x5780, mload(0x4cc0)) success := and(eq(staticcall(gas(), 0x7, 0x5740, 0x60, 0x5740, 0x40), 1), success) mstore(0x57a0, mload(0x56c0)) @@ -1230,8 +1230,8 @@ mstore(0x57a0, mload(0x56c0)) mstore(0x57e0, mload(0x5740)) mstore(0x5800, mload(0x5760)) success := and(eq(staticcall(gas(), 0x6, 0x57a0, 0x80, 0x57a0, 0x40), 1), success) -mstore(0x5820, 0x176b10d402fac05bfc982234f50b305ad067e122f1682a4b9c4bd98bda91919d) - mstore(0x5840, 0x1d62e78d655e3fc74188666738fca6524a712f1a3c4ccfdd0fa44f3e2c849c51) +mstore(0x5820, 0x259da9f643187930ce1299a3f700a93f17cf3129bffe184a6de1cf19f0b91f7e) + mstore(0x5840, 0x29fcbc05cd2c0152b3eb21e8fd01a00bc79780f21281598873fb955dba235f7e) mstore(0x5860, mload(0x4ce0)) success := and(eq(staticcall(gas(), 0x7, 0x5820, 0x60, 0x5820, 0x40), 1), success) mstore(0x5880, mload(0x57a0)) @@ -1239,8 +1239,8 @@ mstore(0x5880, mload(0x57a0)) mstore(0x58c0, mload(0x5820)) mstore(0x58e0, mload(0x5840)) success := and(eq(staticcall(gas(), 0x6, 0x5880, 0x80, 0x5880, 0x40), 1), success) -mstore(0x5900, 0x019dd7ee531990d335aad8f64c26a1bc072b47a7efd4504404d2e95e20250759) - mstore(0x5920, 0x0c413dd8e50189a05a374679bae72f724f7b71e956c32c0881ea37694276ea83) +mstore(0x5900, 0x2b99cb49ca685626a08c009ea442fc895a2f86cca1f29f18d4b7ec9ece937aa2) + mstore(0x5920, 0x20a45cae33f3917205b76aeb87e409350840664058839b1db76f8761db50fac8) mstore(0x5940, mload(0x4d00)) success := and(eq(staticcall(gas(), 0x7, 0x5900, 0x60, 0x5900, 0x40), 1), success) mstore(0x5960, mload(0x5880)) @@ -1248,8 +1248,8 @@ mstore(0x5960, mload(0x5880)) mstore(0x59a0, mload(0x5900)) mstore(0x59c0, mload(0x5920)) success := and(eq(staticcall(gas(), 0x6, 0x5960, 0x80, 0x5960, 0x40), 1), success) -mstore(0x59e0, 0x0730799d5bfec1cefc5aaffcffe3f3dd491b2bfcaf9f553f94de6145ed4742af) - mstore(0x5a00, 0x24ad4af082e96b14b9a6da80f4fa1334f253c458add531c8d9f8b23c5ecb9c43) +mstore(0x59e0, 0x25a265a57942223657b3316c913bffe8db0efedbed9ac878308e1d63d4df61d8) + mstore(0x5a00, 0x0d2f79604094b53fd56a955d2574e241ad67498ab320f2bb764841f5c903bff9) mstore(0x5a20, mload(0x4d20)) success := and(eq(staticcall(gas(), 0x7, 0x59e0, 0x60, 0x59e0, 0x40), 1), success) mstore(0x5a40, mload(0x5960)) @@ -1266,8 +1266,8 @@ mstore(0x5b20, mload(0x5a40)) mstore(0x5b60, mload(0x5ac0)) mstore(0x5b80, mload(0x5ae0)) success := and(eq(staticcall(gas(), 0x6, 0x5b20, 0x80, 0x5b20, 0x40), 1), success) -mstore(0x5ba0, 0x0b30fe9581a6c70064e3b35446b2433842db76e8fad547fbb1ee69916473f7ed) - mstore(0x5bc0, 0x286e0f87d619e3fedac8a3d7442ef34fb6566ce9af5a315758c0c2b8000c36cf) +mstore(0x5ba0, 0x0160a474a2c8de56950bbe25d6f09002a91f2cc20fbdb15e8413f1176e7f1865) + mstore(0x5bc0, 0x1d0f5797eaaea89e5119e4260db563605a84d004b8efd02c51b960bfecf20e90) mstore(0x5be0, mload(0x4d60)) success := and(eq(staticcall(gas(), 0x7, 0x5ba0, 0x60, 0x5ba0, 0x40), 1), success) mstore(0x5c00, mload(0x5b20)) @@ -1275,8 +1275,8 @@ mstore(0x5c00, mload(0x5b20)) mstore(0x5c40, mload(0x5ba0)) mstore(0x5c60, mload(0x5bc0)) success := and(eq(staticcall(gas(), 0x6, 0x5c00, 0x80, 0x5c00, 0x40), 1), success) -mstore(0x5c80, 0x14e66a771ef08cca0551c26b3439d49d391ba21d91b706df2c4b1f177d7759e5) - mstore(0x5ca0, 0x0532723a26dc928f43033efaef8e4aa2732772ba414b1dadce1fe7d0b30d99d2) +mstore(0x5c80, 0x02b619a2a245b370b3319e21e0be467256209338cf9546447b875a2779e010d4) + mstore(0x5ca0, 0x07d7f03df06345ba2df20bb867841f60ebd25daab5aafa13ddc1413116996802) mstore(0x5cc0, mload(0x4d80)) success := and(eq(staticcall(gas(), 0x7, 0x5c80, 0x60, 0x5c80, 0x40), 1), success) mstore(0x5ce0, mload(0x5c00)) @@ -1284,8 +1284,8 @@ mstore(0x5ce0, mload(0x5c00)) mstore(0x5d20, mload(0x5c80)) mstore(0x5d40, mload(0x5ca0)) success := and(eq(staticcall(gas(), 0x6, 0x5ce0, 0x80, 0x5ce0, 0x40), 1), success) -mstore(0x5d60, 0x0474ae1c4230bdcdd25ce460ef73c689e4227edf0ec7c2be85ef8d75592e1b36) - mstore(0x5d80, 0x2fd83e6e07cc35755a04337fd70af8aa31fc74de07a539b8a8756caa60d04890) +mstore(0x5d60, 0x203b21a648fbfb96459640bbc5b41852dd1efc1209c89b635ba638dcb929da6b) + mstore(0x5d80, 0x04e7002f06f2091a44afcd311e93c22f46dd9f3207b5bcc34f0ca7652098f097) mstore(0x5da0, mload(0x4da0)) success := and(eq(staticcall(gas(), 0x7, 0x5d60, 0x60, 0x5d60, 0x40), 1), success) mstore(0x5dc0, mload(0x5ce0)) @@ -1293,8 +1293,8 @@ mstore(0x5dc0, mload(0x5ce0)) mstore(0x5e00, mload(0x5d60)) mstore(0x5e20, mload(0x5d80)) success := and(eq(staticcall(gas(), 0x6, 0x5dc0, 0x80, 0x5dc0, 0x40), 1), success) -mstore(0x5e40, 0x1c6f93aef795f525c8b51bcb0234bb345942cc31782bf75096fff2707f3e4b9f) - mstore(0x5e60, 0x1bf84b761871a3311b096d870534b0a4b095330cd45fbe7bbbf5b353a980c39d) +mstore(0x5e40, 0x20ab7490b42f3f7b2b0bbe601a09d72ee93f924801d597f48cf2d443751d5f91) + mstore(0x5e60, 0x2bca2f1762946a05fb1632550c6cb12c02d18d9bee5bdd4212ca7342888720fd) mstore(0x5e80, mload(0x4dc0)) success := and(eq(staticcall(gas(), 0x7, 0x5e40, 0x60, 0x5e40, 0x40), 1), success) mstore(0x5ea0, mload(0x5dc0)) @@ -1302,8 +1302,8 @@ mstore(0x5ea0, mload(0x5dc0)) mstore(0x5ee0, mload(0x5e40)) mstore(0x5f00, mload(0x5e60)) success := and(eq(staticcall(gas(), 0x6, 0x5ea0, 0x80, 0x5ea0, 0x40), 1), success) -mstore(0x5f20, 0x07609ba791f0ed5d569091041c800974b8440bc5c0f97d9b6295a1632175116c) - mstore(0x5f40, 0x1cdb0412f38e1a19531afbd1c9603146e7bd1c34a93df6be4c65b126e3537b68) +mstore(0x5f20, 0x13caf6fa687a546fd1eeb9e0d43a9f8fe9a3f05322f5edda1b95d50e83839851) + mstore(0x5f40, 0x22e2768775e2d96fd8925c48a99df2b248cb3d893a15b9dca81660b79cc35f4a) mstore(0x5f60, mload(0x4de0)) success := and(eq(staticcall(gas(), 0x7, 0x5f20, 0x60, 0x5f20, 0x40), 1), success) mstore(0x5f80, mload(0x5ea0)) @@ -1311,8 +1311,8 @@ mstore(0x5f80, mload(0x5ea0)) mstore(0x5fc0, mload(0x5f20)) mstore(0x5fe0, mload(0x5f40)) success := and(eq(staticcall(gas(), 0x6, 0x5f80, 0x80, 0x5f80, 0x40), 1), success) -mstore(0x6000, 0x0e955b89eca5fc34d2172022f89dc467ac2e84c9929e1ce0c2a8ce831c5dd701) - mstore(0x6020, 0x07cf929adce614b088c82cb3934f1eb7546dd2e48396e914b4ff06ec45de9e8a) +mstore(0x6000, 0x19a074dc6d1a0f1e5589a55d9c4955cf867e2899dbfd46a11c27a84804b5b239) + mstore(0x6020, 0x26b112fb59a0b875833e52f951b3b010826b169f320d80597f1275544ae24897) mstore(0x6040, mload(0x4e00)) success := and(eq(staticcall(gas(), 0x7, 0x6000, 0x60, 0x6000, 0x40), 1), success) mstore(0x6060, mload(0x5f80)) @@ -1320,8 +1320,8 @@ mstore(0x6060, mload(0x5f80)) mstore(0x60a0, mload(0x6000)) mstore(0x60c0, mload(0x6020)) success := and(eq(staticcall(gas(), 0x6, 0x6060, 0x80, 0x6060, 0x40), 1), success) -mstore(0x60e0, 0x2d4531a47528e642f8f6954a3f3ff9f6072e38d30e2e0d108d1cac201d4b684d) - mstore(0x6100, 0x154c409bbd1760ec55639d32d5817c9399e573b22a8fdda5f707c9b9de1d4ca6) +mstore(0x60e0, 0x1c6df6612866079dc2a52525842c8025502eb5a8913c560836c4bc7ab2dc334e) + mstore(0x6100, 0x0d36fe2bf6d58291ed035a1f090904639502213a2449227d156ee3f8f6372e2c) mstore(0x6120, mload(0x4e20)) success := and(eq(staticcall(gas(), 0x7, 0x60e0, 0x60, 0x60e0, 0x40), 1), success) mstore(0x6140, mload(0x6060)) @@ -1329,8 +1329,8 @@ mstore(0x6140, mload(0x6060)) mstore(0x6180, mload(0x60e0)) mstore(0x61a0, mload(0x6100)) success := and(eq(staticcall(gas(), 0x6, 0x6140, 0x80, 0x6140, 0x40), 1), success) -mstore(0x61c0, 0x2dec3929e07b4276215297f5f653b3ec6bf9b910006678ab3c3d67654001d6da) - mstore(0x61e0, 0x20b9c7e9a6c29e31e9164962de9a0478aa976e72a2e2d0e9c9ab6fabbb20ba49) +mstore(0x61c0, 0x01add1e14d0a1880ee8e837b20502713d06428d55d61fea8fea89a71648971fa) + mstore(0x61e0, 0x12c982466ea6dcfada3ad0e277fed44f770466650d4704906a4d34b6b8d8bed1) mstore(0x6200, mload(0x4e40)) success := and(eq(staticcall(gas(), 0x7, 0x61c0, 0x60, 0x61c0, 0x40), 1), success) mstore(0x6220, mload(0x6140)) @@ -1338,8 +1338,8 @@ mstore(0x6220, mload(0x6140)) mstore(0x6260, mload(0x61c0)) mstore(0x6280, mload(0x61e0)) success := and(eq(staticcall(gas(), 0x6, 0x6220, 0x80, 0x6220, 0x40), 1), success) -mstore(0x62a0, 0x0476c7f154f703672add74ffebc6ffa6159b4e527f0a4354b601facd57ff1a1a) - mstore(0x62c0, 0x27c10290f730edad9bcb2538056f755efea924b0a69d86d5c9c833717e730e28) +mstore(0x62a0, 0x2faee9fe4eb97b37abb4fdd1b604ed8acf55df0a370bcfe7f5615b7598989d7a) + mstore(0x62c0, 0x2269aff86c3fd35864f3e2cb39db623e0122a05b6b5f789ff57434e557a90c23) mstore(0x62e0, mload(0x4e60)) success := and(eq(staticcall(gas(), 0x7, 0x62a0, 0x60, 0x62a0, 0x40), 1), success) mstore(0x6300, mload(0x6220)) @@ -1356,8 +1356,8 @@ mstore(0x63e0, mload(0x6300)) mstore(0x6420, mload(0x6380)) mstore(0x6440, mload(0x63a0)) success := and(eq(staticcall(gas(), 0x6, 0x63e0, 0x80, 0x63e0, 0x40), 1), success) -mstore(0x6460, 0x1e87eb88577795c9f28c423b4d2c3ec1e890164466ea9742d9996ae5c3b80a2a) - mstore(0x6480, 0x00b004814b24c7c7a9dc56ffa03d4f2b7e0f5605f3bb18deddf9e63978abbc56) +mstore(0x6460, 0x01b6921cc4c35a03d696e754bac06edba8187499252d98da7e7d40b844f24245) + mstore(0x6480, 0x181dfa294889601a9cc57448d966b9cc60e7795ab336d2078dc43aeb888484fb) mstore(0x64a0, mload(0x4ea0)) success := and(eq(staticcall(gas(), 0x7, 0x6460, 0x60, 0x6460, 0x40), 1), success) mstore(0x64c0, mload(0x63e0)) @@ -1365,8 +1365,8 @@ mstore(0x64c0, mload(0x63e0)) mstore(0x6500, mload(0x6460)) mstore(0x6520, mload(0x6480)) success := and(eq(staticcall(gas(), 0x6, 0x64c0, 0x80, 0x64c0, 0x40), 1), success) -mstore(0x6540, 0x20e2c72c77bcc14c0e9801d47d3ab42674027a82cde0955f1b17e5cad25edfb0) - mstore(0x6560, 0x0350deaf2bcf4305e811ba811ccaae83d66761627e0a4eade1205c1cb0cfcd78) +mstore(0x6540, 0x0f0dcdaa6fd2f36460376557f9d6b4b0985b085d2d8ffca7c6c408d8560d5d08) + mstore(0x6560, 0x0bc4e7f7a927678093e4be2bfb543ab7d6267ee943e8ed13369a3b3c9ef23779) mstore(0x6580, mload(0x4ec0)) success := and(eq(staticcall(gas(), 0x7, 0x6540, 0x60, 0x6540, 0x40), 1), success) mstore(0x65a0, mload(0x64c0)) diff --git a/zk_prover/README.md b/zk_prover/README.md index 36f9116e..c8123d69 100644 --- a/zk_prover/README.md +++ b/zk_prover/README.md @@ -100,9 +100,9 @@ To run the benches You can set the following parameters to run the benches: -- `LEVELS` -> the number of entries in the merkle sum tree. By default it is set to 15, which means that the benches will run for 2^15 entries. +- `LEVELS` -> the number of entries in the merkle sum tree. By default it is set to 20, which means that the benches will run for 2^20 entries. - `SAMPLE_SIZE` -> the number of samples to run for each bench. By default it is set to 10, which is the minimum allowed by criterion.rs -- `N_ASSETS and PATH_NAME` -> the number of assets to be used in the benchmarking. By default it is set to 2. For now you can only switch it between 1 and 2 as these are the only csv folder available. More will be added soon. +- `N_ASSETS and PATH_NAME` -> the number of assets to be used in the benchmarking. By default it is set to 1. For now you can only switch it between 1 and 2 as these are the only csv folder available. More will be added soon. Note that the `k` of the circuit may vary based on the LEVELS @@ -110,18 +110,21 @@ Furthermore the benchmarking function `verify_zk_proof_benchmark` will also prin ## Current Benches -Run on AWS EC2 instance `m7a.8xlarge` with 32 vcores and 128GB RAM +Run on MacBook Pro 2023, M2 Pro, 32GB RAM, 12 cores -Benches run after PR #80 (`add solidity verifier`). In order to achieve small proof size, to be cheap to verify on-chain. +2^20 entries (1048576) users, 1 asset -2^28 entries (268435456) users, one asset. Range is 14 bytes, considering SHIBA INU token supply (110 bits) as the upper bound. +| MST init | +| -------- | +| 73.695 s | -| MST init | -| -------- | -| 7143.9 s | +| MST init (sorted) | +| -------- | +| 73.847 s | For Merkle Sum Tree Proof of Inclusion circuit -| VK Gen | Pk Gen | Proof Generation | Proof Verification | Proof Size (bytes) | -| --------- | --------- | ---------------- | ------------------ | ------------------ | -| 88.92 ms | 135.96 ms | 369.31 ms | 3.65 ms | 1632 | +| VK Gen | Pk Gen | Proof Generation | Proof Verification | Proof Size (bytes) | +| ------------------ | ------------------- | ------------------- | ------------------- | ------------------ | +| 183.25 ms | 116.32 ms | 517.98 ms | 3.3291 ms | 1632 | + diff --git a/zk_prover/benches/full_solvency_flow.rs b/zk_prover/benches/full_solvency_flow.rs index 8b606102..64909236 100644 --- a/zk_prover/benches/full_solvency_flow.rs +++ b/zk_prover/benches/full_solvency_flow.rs @@ -1,9 +1,6 @@ #![feature(generic_const_exprs)] use criterion::{criterion_group, criterion_main, Criterion}; -use halo2_proofs::{ - halo2curves::bn256::Fr as Fp, - plonk::{keygen_pk, keygen_vk}, -}; +use halo2_proofs::plonk::{keygen_pk, keygen_vk}; use snark_verifier_sdk::CircuitExt; use summa_solvency::{ circuits::merkle_sum_tree::MstInclusionCircuit, @@ -12,7 +9,7 @@ use summa_solvency::{ }; const SAMPLE_SIZE: usize = 10; -const LEVELS: usize = 15; +const LEVELS: usize = 20; const N_ASSETS: usize = 1; const PATH_NAME: &str = "one_asset"; const N_BYTES: usize = 14; @@ -112,10 +109,8 @@ fn generate_zk_proof_mst_inclusion_circuit(_c: &mut Criterion) { let user_index = 0; let merkle_proof = merkle_sum_tree.generate_proof(user_index).unwrap(); - let user_entry = merkle_sum_tree.get_entry(user_index); - let circuit = - MstInclusionCircuit::::init(merkle_proof, user_entry.clone()); + let circuit = MstInclusionCircuit::::init(merkle_proof); let bench_name = format!( "generate zk proof - tree of 2 power of {} entries with {} assets mst inclusion circuit", @@ -147,10 +142,8 @@ fn verify_zk_proof_mst_inclusion_circuit(_c: &mut Criterion) { let user_index = 0; let merkle_proof = merkle_sum_tree.generate_proof(user_index).unwrap(); - let user_entry = merkle_sum_tree.get_entry(user_index); - let circuit = - MstInclusionCircuit::::init(merkle_proof, user_entry.clone()); + let circuit = MstInclusionCircuit::::init(merkle_proof); let proof = full_prover(¶ms, &pk, circuit.clone(), circuit.instances()); diff --git a/zk_prover/examples/commitment_solidity_calldata.json b/zk_prover/examples/commitment_solidity_calldata.json index 4f4891d9..90faf8a9 100644 --- a/zk_prover/examples/commitment_solidity_calldata.json +++ b/zk_prover/examples/commitment_solidity_calldata.json @@ -1,5 +1,5 @@ { - "root_hash": "0x2e021d9bf99c5bd7267488b6a7a5cf5f7d00222a41b6a9b971899c44089e0c5", + "root_hash": "0x18d6ab953235a811edffa4cead74ea045e7cd2085771a2269d59dca054c955b1", "root_balances": [ "0x87f3e", "0x87f3e" diff --git a/zk_prover/examples/gen_inclusion_verifier.rs b/zk_prover/examples/gen_inclusion_verifier.rs index 312aace1..65e4e820 100644 --- a/zk_prover/examples/gen_inclusion_verifier.rs +++ b/zk_prover/examples/gen_inclusion_verifier.rs @@ -53,11 +53,9 @@ fn main() { let user_index = 0; let merkle_proof = merkle_sum_tree.generate_proof(user_index).unwrap(); - let user_entry = merkle_sum_tree.get_entry(user_index); // Generate the circuit with the actual inputs - let circuit = - MstInclusionCircuit::::init(merkle_proof, user_entry.clone()); + let circuit = MstInclusionCircuit::::init(merkle_proof); let instances = circuit.instances(); diff --git a/zk_prover/examples/inclusion_proof_solidity_calldata.json b/zk_prover/examples/inclusion_proof_solidity_calldata.json index 591c6a8f..8cc02e35 100644 --- a/zk_prover/examples/inclusion_proof_solidity_calldata.json +++ b/zk_prover/examples/inclusion_proof_solidity_calldata.json @@ -1,8 +1,8 @@ { - "proof": "0x0f10963e904c615d4e300b931c6dd5d05eec2df7afaa82185303e874d3da5de018f95aba51fdffea23246bbf5b2aa5881bc1dc18f3e79d2800e03fe9a5ef0cf310339b53be81d8cb2c43ac5a0f6bcea44c172116e29502b5f4527f7b5bce10c913b9e2004dc58392babac1a80f46129f35131130ff40310d8c7cf56e9f96f4eb191b6800c111533070288a4590ef3beaf9ab506b6ee6cc5292d229bf53663f7b0da4c4956e8c8ec242cca4b33a8e82528ba66db026e82edd787425ca7fc3d731029cd66c1da2304fde313ec53e113f8f9cb41dfae575993c1edb8f4d59a592bc285139d27556c978df7ed87d0ee9a06869e8e43d76cd281ce50e940435092bd429970059380b7b6cf67cc35a503098c7ae7c4451db3d94732c689fee34f32e811e64c25fdb83bc7de1ba2f22ad25267d7476d46f1c2669a8b12dba61ba2e89cd1dda88ff54d7cfad9de0e6d2c63f7c2ed16ce4772673c70081e00d00b15703681ba37b61e27062ef2e4b771052853b2c06c6cf170907b2e7a0982d4a3e36e9682648bab3733590514767b58ff05e78fa21757ad04641312fbd8679a321d3cc60249d152ed8cf0a469c4e35b9646f030361f1f69935acabedad83ae640fd2834c2b6960827a7284fc1086702adde85e9b6e1b90fa8a12713905bf8c9475f0c7e61a90102e9980f0f8e9182190f2df2c668f67b8f40fcb7687bef1e9e54de352341ab8adb97b56744bd9af8d41458ee41c8f188cd32e224c6429751bb8fa3f98bb0bd5645f493d2ecae2e6212d11623289eb6a285b38719aaf5176db4029b00f421ec83ca5f921ec66a52132b650372fe0232dd072cbfa0c6e28646c8a39b7131616eda84fbb854435fccda3f7498a3395a7a91926a5296d01b75a6570b038bb6323b126523805a61ab5e21cbf098b70973a9fa39c3c1558982f4da0dd6a2b55c72d550f8f2792731b1315e52ccc9a6335e33602ed3598dd5055e53cb23a01fa4e15ca49f6bdd5703e8e891e93f63d7c536f9547d0a58b030b0052ad31a10d55052b0bc767bd355b6b8ef5d31c0a0b6dc823f7005fe94f80d7c959a7d5c0a8ad072d7b1641e63bf18a3d9c24da68d605bdcb7c1f2835355d6a27a94e51a19e1aca0529926c39c1d15d119457eb98e4d2a38915484be2592f847cb3c6550a1b19eb25ef1ffa1b04453394f0f917fda0bf47551ec85b2bfd39b3f7b342c27c7a141b1cac9571d4cdc11b5e6cf727d53c057c56348b337167a56e38de1dc81a2968070030f5afe9a16a95f0d8d01369d66eecd37889c37bec4f2bb3f0cb36647a596e10d76324c0487da86313ea54ecf16ce7b0ae95b85b079066d383465214ee8db20dc1a70e3273fab4c463a4363b81e551121f93bfbaab6adc17caf7a935ecb09d009a456d9bb2a3d98b6f6f870b8e14367ac3f130aee15fac79d7360f710feff01d1ccac1e1dcae3108d9d8e0f42bb7e36e9da861f91367244c641413f17e9ad31de7184ebc254ab30a3ee663a8cf8ea48b0265859575a2cbd74d1178953a194a05f622e145a7df1ddce75f5c80d08a824f04d2c8e72eaffb10cc495ad6e04a2e259e97b9c4780a5cd0987e8c826c6dd1480309a04abf2f67c9830f2b20e17450003dc6be8453bd41aa5334fef237c1d2088e0ebbd710b97f0df0bfc659a0bab61277f5a1b76d2cb4260ad71e719fe1c8896ff4696e0edeee2ef146b6a797557c23765898341fff3401a8cd4ee2fa9c82a73e7b5456a11a3747f97f2435fecdd11a91c9729bc9415497f966a7ca5b90e7685ed3fd49f668c6143939dd9df5cb012cd049424bba142e77d56a0bd9f367a3b85efb868bd8ba03134958a4209c7be4157367375508751cf7911ca59a58336f78d76157dc3fa7b4cb5f70b3809a69f6108947e8f7168e63b2fe566c14e8ce7be7854da105691bb2f50d10369c98498b0a5da7d03c2e1c5319847bdaef723336ecd4c3b40ac2575ca9281939fb6160ff183c112df0bcc99ce9fc066616c2d618caecf163806fcd2dc8d379e752af77ad103a546f9e38f920387adfe6280eb9091a2d7ab350938b9a2a323378b7ee508c03de3a104f262cc72154607e46c4b98aa092670edb845da226d02c96ec2b70051dc46cd822871aff0e875f255d10ce8be4deaab62529ae3698b091f8299a41d10765ed0190a5c3f02e598dc0d4553f11ab75b8d3f0165f9920c896d81f1484c21d6d9f5e88229ccec18a829d0f5e878e2dd037d2380dcca4b1d70b167d1285e90c70dcbbe5167790ec1be0ec8d05362cd905d209599195f5ee3c0f47add628f91376a00802ea0094b697d647a1b787f4972798fd860b7b4e8f1a63688bc21c632b46ea113bdd32b84d8b072d5f482fd9cfc438d69e19ce8f19e702a06bd680b208a4c83b94b71fd1eeab82b6b328d0c5423db4248b06c508e6f5e2480a540d62243ae6f83aa6243054dcadc597d7681e2035f80d0a6538ea97cab95a7cd815ad2698426588eb3eb016a4b5dc8c3cbd55ce27eec8287360b6f6e81c1beba80f8629128adbfeaf4c7b34e64bc0a8a8478d032f828e1017fc6a9db982eae8e7432f1bf5ca7149ebceab13825bdb414da57febb4edd3a83e2b0723349d64dcc019721a1274ef097535f7bff2f14f320f5f7a1b75bc6778bf79ccc34f317bbc523c0604274a8be2de38fb9a38be550500ec42fbf74ee00f5f26e8178aef69c89d1a2b25a5a371f8470b93302388079c0003107e0b6068cef7dcd6095f63399d65e8691f670578bc6e050484713524e84ec85fbcf85a876dd8a69faa11d5950afac0ae2ecc55f10ec3b29e20c31adbd14aa640c487d7545eab626d205fdb1edb3ddf0d0687496775644cf73b3ed274b0006353c595d7e468703bff6e4cd20844b0ea0422206d215fab57fd652f63c17c923d3ea28c233106dad004e7c69ca32514d1a719313fcfb4350f4b698b5710cf96279ed4fc6c26bfa6801714e4515d4777be101858d9e2893ade8725ca03d0956c072f57ccc036f77eb41c977c9a3dcc2e5d3f", + "proof": "0x1c7a5d502a29a2c3c3e2d2d518ec2a8543c19bdce5135bbe59e14ef5d178efe9139c3838b4b11d607cc8ee22c32509d3d14227953cb313518d80be18655af6ba245790f70d7dcf5f046fb8580dfc9b13cd24f332e7f2cfc17f591aa3d69f11f4252f8e212b1ccc58ab58aba219d55b5e2f595e357ad30f0dc7d4675c2bdd2d780cacd8f89bcc10d41525a0395a64086b74826bb451a851f1d0379f4764b735400794ffe274246e09667ec9a321c8e9367fe1a4fa3ba21bfded36795e6e9d09bb1524bafd5994754519bdafef12f7191e50df6b1a6dce272ffcefa1d436119e1b057250dfa475092a7f9aafdec82ec0fecc9cc9b3bea3858fbc890bc41d013d402fd44923523a328647a94dedca98ba214ed7369079b114aa1ec4e8ba322628c91b648bc0336a5643a58a00ba809f772e7afaff4e857f25eac8c9458303fb2a5b18961ab5f9e67915a387d986b3b07efb1ecbdde42e4cbe8e3d5af03a59952ac61356f8dcbae85a0978509355d663eb844c5acd48726310c8415c7a3aafe6535a1b0e9765adcb39bc4afdfced654cad6f397d9892ee1ae503884c1db9a0c168af2797b4f4dee6f03f476b01941ceecad88cf3036b0f706d5b7cab16b0a3f71b440bb7c5afaedcd7c00b29aa45261b7e85e76a5777e8c0560439c5a121fa2c3bdd0395ac07afde7f5d1c0cdf752434721295767f238f178d6812bd28b99444047b121546f5a344aaca511e65d52de324bf27e51f432d511af05eb95f37e43aef0f1659bab2049626661782686ad5468d094cd7e301e580754f398ebec01867db1023333e83253fae9f8412781499ec436e0368bdff9da07288e96cc38606bc1f6d227f325d5a1c8757441d2d84a3b2f5afd7092d17df5525edea2b8f0dd69012af063061290aa7ec3ab913d1cf2869be3e739b3d3deacbb6a0f81a185ad42d8d8801147c4f8346d59f98cb77e8b8240988911e89ec7fdb53ad9848f721cf7167eb30124b79fdec15f3993c137462ba73410e3299530163790f0fc433adb808cfc928d38ff9793b82f359d27367c29d4d426e9dff1bc6a4391249df6a478818ac7910c7b98cca67e4bfb8b51e5b1060c3645cb9190abc407ccdd7f556fcb21730d9106a526538708a8202297cf5d454b7b49060b7c5de6d3fc199b376fc071b22830304cdc209c8dcd6f387ca9508e682ed717adba04c0c94e15cfb023f3a32739e1e8803aeb32c8b5dcc0ff1f49c734a50df27ba77beb4b25ed51ecc7642dae797051cfa5298b0c5928587dd3db85d4f701df82f32ea95aef6b8f349f289775cb12657e6d4996793f259ff15db0c84474a130613f1c261908972cd62e8ff8e69730e001a12ce4d710e0367c7f10206852aac0ed64c2b1354ab7030e97e2ccc914729427f7619b8b5f3174c4beed8666b7bc4edfdf9347fc2e48eabd43ddbde5b1b22545e1acd6f2b75161ad7520d8789d8732a4b716c01327c8f04cd05807fe98e0a7c235e358c069e583dca4a1a4651652f33305b2552c2f7233e7c876f55702c2f430c3236e25d642849059e3b3ac44decdbc041bdb3dc40953ba1cc6c3ca73b03dc19085ce3281e342c51f5331e245209afd51743d14495adec32c3679de8962deef6d7a950f0512ab3e7f5fb324b68315bf321d77a0b3d79c943fe1791174f2091f458d2e8a0e0524f4439e8d5f1a9a6ae80337942661f316ae6b619be2c1f2e71f83a586b6de95226f7fe5dc1b24bc82d2ea56d06e37d9f63008388ab9f1311d69721625f59ce4b2047b54ca06f42eaf9745919f8b1da480ad2931a1e63261ec10afd1ef6c9403c088dc958773610059645fab6b09b621adffa689fb6fb822cd3c726bc692e33c6bbb255f6238b9083e802817c59203e294494abf57813340898377954dd72fc368ea59cc7c75cbd098954b58498fcb1cca5d7552ae808e501c30108153b1ee4f77511ba5cff4e5578347413b9a0e9a5317bd194c04797bf11ec726054bda2d4103ab9831ea235f8eef31a6a4103eaed66a22b957bd6ca9c108948fe9c61f804148229c49be669e36e605c75800d69bfac1e856e6c54e72605c473b79cd7ac2883dd5a2bb83ce384c62e4a77ebf210444754645a983acb422214fbbf18f0c418257539a0e113cd1dd974111f23d9cb76f07bd92278321b060ce9a08de60fe584ad879d145cbfd0402776b572b37b8103410c277ca4bbc7201f694bf1f66c90b081200be85f0421c92573660273d303034d7ba80b996eb79230194ca93f1f565261aaa7e2dc4ac5be538503af632c9f3129f6a91e984fc7522d28537a9b256610ee029d6a3741445c939e7801a24c2b2e8a7f3b57d29137d92af9029cda44a25342151145dac9d679e9187c6efe4913ce3b8279f8b9962a1e06698d5777ca294f3d234b86bec1ffb670d61a51c6e9b7015e2a67ff59348df422fba53644e696f92bac9513b14a512c5ad1323cf02c2212af25c31dea96565016af135a3067869dfafa1f72de025b129fc79173da2c2b39ad8c2c01928ee8b92409600b405fb6980cc5cdf0b2b91756cad269889b924c7518a6d822f87193800bc0da2d76c38c1b7604293523827f0356dc594d7a442dba34a5a82a521a38bd11e98aab00ca4a7862552cb7621b5910b449a1ae1a12b26c6d94c7845ccc7d8229232baf261186ee10d14f6b1fb56464090dc1392cbd945609a9fa67beecb7041c015398c138b2359ddfe16745071076693338adba97cc636d71f04b2e0d44ba2a7b0447db18d72189fa27d174d1b379070aefbe30a6522f099025e8562de1a91a9ff2fa4564862f66f1bc37aac344ce2eb6a137b53bf76dce07c3ba31cf4d8c1b784c93768215706873f7c934b39aee003210f81527fd8c1c4845f39830adac02f4ab84229a373628b681f40e0c145277e2aae03438c155079fe26455f031631b0b835dbc2c654236708eb9831082be7976a05dc924ada3e44ebf6043074406248e34900dfc647ed17480f698e93556f2ce5a0cee266378a39fce8e20dd2c6c", "public_inputs": [ "0xe113acd03b98f0bab0ef6f577245d5d008cbcc19ef2dab3608aa4f37f72a407", - "0x2e021d9bf99c5bd7267488b6a7a5cf5f7d00222a41b6a9b971899c44089e0c5", + "0x18d6ab953235a811edffa4cead74ea045e7cd2085771a2269d59dca054c955b1", "0x87f3e", "0x87f3e" ] diff --git a/zk_prover/examples/nova_incremental_verifier.rs b/zk_prover/examples/nova_incremental_verifier.rs index 74ff0a2d..50965d89 100644 --- a/zk_prover/examples/nova_incremental_verifier.rs +++ b/zk_prover/examples/nova_incremental_verifier.rs @@ -13,7 +13,7 @@ use nova_scotia::{ use nova_snark::{provider, CompressedSNARK, PublicParams}; use num_bigint::BigUint; use serde_json::json; -use summa_solvency::merkle_sum_tree::big_intify_username; +use summa_solvency::merkle_sum_tree::utils::big_intify_username; const N_ASSETS: usize = 2; diff --git a/zk_prover/prints/mst-inclusion-layout.png b/zk_prover/prints/mst-inclusion-layout.png index aef3d4d6bdb3886b4c46900e7e3bad6ed4d703c0..c2477faefc942ceabfe9d75e1a44c388cb5f0657 100644 GIT binary patch delta 212475 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

|kaHKM!<)*Ne2E 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%0A2%Yq-3=n@P|>jr4^S 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%0DnSqbuAVUtd`8AWL$A#m@-kb!Yy zS{a#g%TwN!ZX0K)gw@E#==F>a!oY0cS>OrDAdH9y{4CusF=9q&C%itB>aY6Uxmoz5 zblfgt1g@WBYa#{1P(@Dn=I9Fc)$39wY+Mp-f!9hCQ?OOm!A{D|3ceeE)mja8o5BD% z+Fj7Vz{jipyh$QaDoy)fC(ThnI{a-Ir<@bZCi_J4F`rQ^=t_{Ae?4!l?F|C~Uqp>l z3JE1{ki3y77ifT9nFeQ*rPMRK*eW+B5D7a6%*|Z_{0z(qHh}FbtP=hCl}dI{siQ^B zOeyva?p&bKHj%pxm*As_NjM-H43QVv*!kLy@UWn;&%xIBR_@iZIXM)$kOth%BY?Uy>x> zCE2;fo=4d__W&f6A@aWTIl*wS!6mgU5pI6$cwQ zQBQ>7LHx;y6&z~cpngs|zmc!FcS-HQNhqI(SBOA;ajkN&-$AVTF^ne3=2G8sv>%aJ znVk!Gk2i}&8lcdWWE*a$iI&Fi$}>m-nIWJRW0`NVouX`D4{@$6^qCFRsf$jN2+`4& z!>3;-@j9^I0z7)?Yc^&b%v^ouy0z_2)45qKv8wBiiSXVlVsfrs3+;mGfIrnMwr>;i z=-AkMDdn&%*j8X>oPjqKgOsy#>HGBKU()a+w>h@JbUGn9him+2xbZerkcvX9uF6s` zVuTuVgha1Wr2e8x2w{gA;qV>&nn1=b$7t4sRR5*~w)z8B(l~ukULMU-0j*07G*Py0 z2nE2OQB==OR_D@rCch;Gg-N8%Hh)#Ir%L9HuTxBYSGH@!>Ti1z9#xdDsfJB0TCZ2A zq19Q%Yny%i%hnjc$Zb!6)avF*b|15K>KeG3XyV&bXPu_m?}+IhfLlDcvqZmJ;6_Ql z2H#-P1oc=i6shx9sZ7(!A-s)>07+KAE@|A?KGfa?9d4!IPQ)4WKg5PSmStHBI1PH@ zUD*8JUM`{R&e2BINZn+064W+aOv@mS0oV#pM~_I}4n=WIRTlqP8do}J+xj_I{K~$G zvMp!b==$}1EIhr8(z?`eGjv;cujasKpVIyPLeBmgI2E*PjZe!_*t4=fQ^`a_(52SH zBE>$gCMZR2?$qAosvWt*@KM%t_3?sSF%++y8-ws;uYPx^wpZ(C?N+8dnH9Z>Db+&5 zr?*tIWzSy@I(TpVG=l35N0>MG>>MnEv>c{@(#O}UgqAX*5-R;J>K4cHE3|({$;9>q zsKVcGGaBzGD1J*^LX&nm{KH0F5j0zYSxatiiv{b&q0^9E9ASGbKJ``P>g>i%0bDDz zHt$1E<_9F|tug6^Hd9ryCXgB036(Y{RzXknlxN;7wGc+;#C{;+;LmUcO#ATJg4a2F|3E=wZ1w&|)rzRT0-H(Kpn%P_yU3+p*tmk%FtbF$8F{ z+A#SUyiJ8qm|&myyfsGWP@KM<|CM=WF$}mjYPl5)vqz1xsGSqlu282v#R{prH)+4G r6C*MbC*#oWS-3VFH*T_J)`;{aII0gHp;NB!lZ( zYN@75^;?S&U2ADeH6q1;kPH-&DndlmfE*Iea>{{_b7toK4qDglulszS_xU`Z_n&wF z@q?Mk%w*;}_kG>hb=|jR{3FBVlrQGeg4?4GE;zh^Qn7$qGatMX;ySyacN5EN|NTvg zNhY+5LtLqnX*)cYQ@n_njsu|)#T&1NHXZ?GN=676dBb;h2zw||G$K|T7IU*gBf>Q* z(O`nQcX3>nJRE>CVYB8u|3m4e>;qU~jji;P>qJb``Shy;lyK)4W9ors z-imKP^lNT&PthrKDk}hNxZo88ieG2$2Gn2NSPR$25d!t2b;-6J$@m7u+(_s{Q1h_P zNa63FNRL298%3oRIgSjG9Mny?Gr_($DNNcc$`NpU3EgkT_om(NNk4g~4^;Pf%sKTJ zH!sS|U=B7T9I$5u?*WEUALblGBx3u9N1WtRM1w5CDnl?O(U-vHJK{wemA1;^1m~8_ z4h93&fkDs5l<;haxhJfc+BTM8{Y4toIHIkFyDPD}-LdzAYfX`7lBI5-HJuVn%{~rN zJ3N>`$@7`*ihKi*ETAu@1_0f=)cG$gIiq%ravbMSY%D^0DrJe|7T?*!&+nQ zJhrf@G3Rden|3g(#XB7QvC{jUEn4~T&pVM@vK(upqD_Siiff#UV$BN^YOtef=O#p3 zf>`23L;2<ULPrJ7Gu9Cb6U&D)mF@}^E9W{qPNDpM zDXsRD(mQBQyvP|1-cgLM6=@=nktVIe*p(+IKu&`SnaY=6ueXAOI4xjtKYXIsMj!t} z1c_`JiesgC;Tv^E#V;@1H+%TzqY?@35R_?NGbl*iTgqcOrO(sGlQxRb7+|=EmfjfVk?GFSN4@SWqg(uC#Sp$-{`23gu&DPf4q2GScD9iLc6J0GBx4x^| z1T^d20$#S23AN+e@7o&ZT~E6b`(tBA%`jRxzjLce9Y0$s-h0W;jz7`!Xa#p%Npz9V zhVym7s|OaknYhXjw5*`>;}9C&{|2ZFa$UwwriX;2t<3Z-ic32){LP(_<&9aC`9)Pj zbfx$kc-Vs0b-@f)z{ygasIr|(K@2j*Cmyhuh8JdFJ0*X1(3W;PLw|8ClU#wwlu3L@WA zl`M7^{&$lpdjPq3d*v}2RrkjCylFmIqrC z?G-${K$cxEPFkXJj$scu#LX@8-o_;$1n6HI2w4)2N~HVZKsd2c2~t%N2Ma7S|@su zh(oRUYWsTKN2|*Xd{aJZy{Ma7U$Q)ee4#caVx|8QMmG_ME}j~D5X?yZ=%?MgPuIMi z(Y@ackY4eUt(Di&&eql+c1-HXZKwa`HmhQ-b5!WfLUi{VTTR^d-RbQQuhT-qCS(sX z&uOoX-9(*D>ixYxcRQ=Y$PcXxGp%{py6AuH|M6 z!(yJLc3|rFD}qHs5h8&+JV6qNYjwuwBi3tO3Mlm~ux%GL5b&kU(B}-|YST_ppG-Ao zm>TKV;c@(*AFrOrcPR<<7JB>*ge{?e3%aIHkxcRd}!RH&g5ah5wAEVH=9`f&5hwQ6TG zA2YCt@%PIx8RFQY;t`i+qA@XkT4H-xU*FvrXTINK-phUWF4tMlcHUOzG=sOwn2ZJZ zm>R|)yaU5L1%hF=>AS>%E1oPZ-lB63q)3JOBYvv=C^#7B%39H-6DWq4=kjf*#94(h z+oOm$LxRP^8J{RZbQb(?_eUS?6b+?37#kdEi&QwO5i|TQ1uRRX2ZCi%R$!FyCaCFb zs<}Oe_J$}JdUr%$fS7lp*5hp3Vlm=m6XaE8%VUK08ySd2IrKOMAkqKKr?SXU9~uR$ z+U~K6p0arB$3QRkeF5B=?GXr;d`b0Tu6)ad)iNQx8;?v#oV{waue2u6A^^*N@noI) zhsO+ma{ZPdeKKN7%+45|*r}@;a{@}6mp_=(9~elD;Z7fmnQHjChmoV?q;-g$wbHo3 zn;Bj9scKO6qmMsGO$wX^C|261;L(Ur7Fc-E{RJ@NPdBx4Fs&oj5;IXE8ZAX^0G((rTaMZax%%yF^UDc2eUk9daZ#sC z=Hd^a;A3@X(%Hm0UP0@5KY-I*gTdLZ*-X~tnK(n6dTcPcw^dCfp%4vW zYxCTjz`-PXAcX_Ybb2@Cy>#5j8mH<;euQ*gh<( z(F)Lcv%+ZRYa4;q&6Pzh!YPE~A+UM=d zo-EimdY#p%9Sj>?W)vfkl4eA zTeKfG@vsZr9(6Qm4fgO~9SeWwM?&EU5Db(mZmh+Iq*%w=ntS!d&g-4I8%xB9QbzpY z?;>jnnwpkk2$D>#L#NV^%*lIYfb!W)rhA-ZuWnCj2gnus2YqN%;ax*{qEXNFMRDc= zuDy`NDW-C+q4O%Dk3hExcJ}wj^_3#Sk$B&|kq^|4BDDQmvyEpyr&6cd6GgpZg?14_ ze=q#vHHBiTDRy!bum6Gw9(8;{^62&wW$5sgixb|UHOf0+ZRGF%toE-s;&+pHJo{j{ z?FXsh9n_YBm}hfLmm^|(S86;J<7;@f`^kM<(B25t6e1cW)6GNhVz9^J9bNns0nIw4 z6cUlyZHcxKHgQquxXmYSvTe;PD>&9G3;|)Wc9F4TI()$}HgqMy_9a`?0fe;THW)W8 zit#2zU8At8lsob!Vm`^UxeL+EFaX1-yF2H`rBM5Fs4~%YN_-4Hnf$=BPQ?-3%fRv0_CYMb4{kr;7atn+!zy^(%KR{Kv?6)qo^ zD|Ymxsj@Wv+`iH(HP1QHUp4M4t~u-|;%4lM)3HL9hii(fTWD;;m)DHpu<{|?_>*tN zaK)Jei~seaes9MTfp#?`#~Giq!s0;kxk6`(Lff=&-(rz5k;oD3EZ0@5vM@l_Nc)~# z#9n1(-fxiym_o%i>-uJ=5PClx$hpgx8_PB5y2gLRwwbfJ860N1hX=39f4y;v2 zbVt`TjS=J@Ag9OTA{H9*6t_y{bmho04(_9=V+2-F-jg=|kKb}?1hjIPEW{=Ac0QM$ zsb90tMO)J!r=j)q8>`f83|GtRt7~xb58=&WAw%EJLLQaYJY1`fNj9A1d1c-NS@TmJ zdo3> zl`z#%*n~lP6D|pkXz=&;T=g$!nEYC5TVGh%C^AN(h`{k@wK91)y@$lHNsq5%mPpoZ z&V2f^zF!ERsY8bsd;_XcymnZa_!oe6Ar(2FwtDd7d%cQB)0DNL7|R&yKz)RazI{m4yAwfzw@ln>D?Y$tTrOKR?AqCW z#^};`j2}C4M0T|QUb-nL0S$>t8?yRI^q=qAQ?ba>lXkEPY%7?_qIY&iJ3;GQkARs? zsP=qT?xoTguwk)Vi0ku3?qoU+rZeaDSMb~(UAu){y}B}&ZU3Ir)qaK-g^Y0UDFX*T z!FYOzxamWz&*<5&K2i`Zi*BlV3u3jmF68n z6y|o%z!1zPAzs$6Q%^r*~$+9|0N&hio1KRW?ocfm#7_bwxpRU zb>8Av$%O|}#_0d@EqOAh>M}n4v!XW`|-pTGZ=69pDdj zXb(8J-8V46m6bhYW}9B$M@DQbrud9P*Yi)Y;lQS`cR*Q;ejDoFtmI$+8;~ zv&zob-)9M1GO$q&W{`>M6FwFSn^l2X9q@A?sSNW$AT@zW!hD@$a^M@{$z*-1$*TEzQO!uT zymKdpsR=xRm{P$T+dA8o=@aJLCDpNNVR%wrdN&UimAxN%F#i;Poh)8x+{t;o90-=} z#X8&PIs#W7n*p!&-)zx%tMx*QxkVByXbh>TbGQKMQXi(rmf25A?hp`nY(^-!(;2i3 zyx`^$>dtxf;)PQ`)4+z(fB=wt&fk>vyNwjRVW51GIxJasD(@C zi*V27p2`IBTxp{_!}K6&E6ahHwu+8pll;0keV3|deS|@W>dnkc6asU*|Av+z_ECUDLn;m?+rwR zDK~#pLz~d%YK1C<+q+*Tx+6fgPmJcH*Vhnsj)iC2#B*w+m9S1nnqFBCLB>(G{v5x& zsv`5@My>O90)A@OnefTWAzaNG^^gu9y1CWtA$7J}@LZX-L*nd4tp$y5Qmr zCg(o9zuA+qT5r}(WhZ1i_i~BlsHL21t5$6lOy(>4>Uj=RvX;C#w-cN#3HT#^y6|Gs z;);l4s4GU)#fR@8E;o_PU*e!&Odb3 zU`e$bYbkeRrZSUYWEGag4z`eG-su}7a~RbITHMrL+$@!Bh5J)--|1W2Gqgfii7BQJ z|L1>qcx68uH-C@V;}K-&Yd@YffQ|nk#ZSm$`->&^GBus#QrMGoco}W$#M!X&`f|AB z!KDYshVNNCHSjI+3=0`OlHlA}+}Md?jf7T*KeFT~OXR}>Q8eQEws7v`PJmg3Zf1hz{6B}u>ZG(;jS_ER_RAgi^Z#AYNifw zEU$yh^XVa;51#)u?f!wJ6w?>AJ|z;vHIM$fVpbbuhHJL7T`U6We23hGLbwLQB?GyOWg$<>|)c z@AjWrG7)|T@`|k8Pq%X=^NS_0K-zzwSUNWs2*#_y+aEH6sKgru%Y=aik}5aZu1FsN z)%QCn9w;FIh7iTHVylT-1D3t#6~xLPs$(J`uxr-mqU?L~nl1jpX5onV<}(%|i}nPx|qzM}|@$g4Sl> zT^C>=ZDw3MMdIp_N2%$?Lzf0A3j12*5d$Ik3ZpwWB_+jBth1ipsq4f}^RQbAsk1ON z^d+6bI6f~t-P6)p{ZZ;Ji+;#GsfqTI_<>CQu?`9Wo{ZFg9(?%t>4fZ`_cD+HWO0R? zMexr{C~ho}WOlBL01;2G0n0i{30Kn=!uWBGqn*7wlr{TR$?Ug z(dKZ?(PU$NE)0>KoUN6PO*# zFBI}cUY2MCzl5AWzcy0s4AjcDhIfe^{cPJWiJB|7W1=cAm#2OGIH}>01(j^-9(WIz zo|qO2h*0uJxyw~7?f4#ZxmF?I)EKMLRsm95n07y31JRloB?X8Qk*$f9AC!n?d~x0Q zL18K0c>J5l>}H0;$c=m)n(0XA8A=i0@<8VW!;<-lfMNz;@;0%2hlTtff{XI8b{asOG z-Rz``vtYf5;}28V&gEQVI?3m>y8-lsKNHM>)!zypc3-#kcXrA>m|*`#6&urqeI~VH zd9mX=DxXLurOAH=n?pT51gLNDi&Th2#(aZCNL4&HIJ1EzDC0Z6mt4~x?Rk`1HSlsL z1PzmmXpv`D(LQgRsx0AR=OTM5%d2MA+<*y<;k?VCBvc#MYgTYIv`V$q*~*q%w$!+S zSnaNa>JfO+IrZMP@ilGH!t2rUwhTxsx^RfE8ePO9{h@<{+1O9fI(o8^7MHuifz?5Z za-AyKp$XaN64zJMGcvDdq)1`hi7+e2#ygJMas(e7dKRkKb$URV!^)?+q=GrVove-icT;P))R=e&uC(SsktB_W5v=9MyaFzmi@N2k&nG6>$7rPd}vQZax}i z5g78gPJrtf4A9iv(5J!&5=4(6^4-BUy>M2yI$U$TWtKjYJGG`WB*cCM=x)n_>ffkRfVPI!!$A z!Ul>Ts2!w7f{=3ez~B$dwH3+3I}lw4zI){u$<)9CyuS(6I|>Y+1$q8G*OWbeEnBNd zashQR1}m_*pt+@GsI54AIBI=TB20L3nulZSCu2a-J>M6p;oCqf&liTo+ktMg_M@T) z`~R}=@Xlq*QXLB{m3z$r*N@DYO>qIo=X=akj0`%tNIeW6u@F*0 zqQoaS494C3zmvHBU2ygt*LhTzT9BPW|LT2H)a%!qxaKm;87|SxHTcyoJr*ODWfiGb zMXk=xgRfu$@h#tOmf*XV2(ZMQKWXw&N44am&b<;tv)b9AwqNwE!+Nyoyo|s`v2&6` zoL1Y47{pzU(Ag$Ye5K3^2d`acGTlr^lLt3_0ye0E0_KKhwj~NGl=fVP6+`hcsqGxQ z?-@z76mJ5@L+Kkp6f1Z>RdWR-vx2_@&z+v>&uT1HjCQ^R+J_Tun%*1BQGGc|6zeQQ{HbrHlfbu*;!lkc19k^x85II^ zpZMAH|7#lQ4&PI*E^d22Zdk-NUeeh?Lgvq7Id|OCD-?Z@3Sh%!s}||xNf(nY#?+3< ze_oU`DL^e5__z{(z;hm+e^z(RA}E#F!R58oU{`fh%;*MCyN}MAm64G3R$@xxB5?AZ zAt3?g{K5=gvp3mM!F@E*qwOR)aw8Nt0+PoY6hlxl(MjxoUgEGqx{-}RqWmYA#VuJ) zvY4wC4bNg-3_N$$<4x+xCcw^jg^>QL$IH}$CNQUw38)Z+l?C~Sf?YC?S*~9=17-8+VT=4Ng7*64q2`|PLn0^uVDQC{CWRWShJk+#iTCQw)tjRs zIq^}qlLURibaEL0pKBh$bCo;b8^R{4QO9|;F;-&!gl~<51j^G~f$spX-S7$oxpB-_ zK-3)1_qQ*FZneF3YktD%_vOYA9w}&L6l>{2B1RXR^Q&wYytzJBMgdkznwhn${Fi;M08x zj%?X2-+2^S%wIfC&zkwfdVqF;<5Eh%sU+4i@^M{adMpKb#dHnT#iiij4UT_|xqHMkJ^O_cb4!0itNnTK8@9m&%XTEKW#YPx%!;PZm zb($5)LpwwoAex!^uqcBnwNco$m}pRpKa#8a7FUk%PY^u(pV_;Ar^qeS))?cKIdzEb z^^$6=q&q7@|211rfnp&8AL38vRdp&&?+b-ywqd<)s)*|-uT9#i+;@8zCaY)E5NPSh z0|z&F=2P8rfnm3Y$aOkogE@Z;3nrJhLjTtwI$S2tmDlhV|2Fj=x2M zro^e=d+F*Eng_0_09Y8Hcb;Uz7z2J7lp~@VNZLd<>$j{JRhwzX{*t(orpQLs%z^@qKO22AWt-yn5=CT zyNRrxs9qRnNmCD}#SLem6P@#)2>6c|Cs6^8zc@1(d=XDg2wDEStS1jYthNCC1~2BU zwyn?8e^h;-x=;F9YQgbuW-w`nGkZYmN-sa!iQ)Yq^|t3is=)=EtMc&!XJ2x2p9SqR z$C}<+7?YosEJR(v?JD2rK>hcwv#BoINOF&bSOoe*Jg1Uyf`7pRy$s|pXCD;1w?AA> z$!Uwkn%^&zR||A%e1fk|Q(h#+%ZklmEyIPR-fD)m^BOTEwkgxF9%9Kja>0-wuKL8& zK$<+Co``W?IacruDe~vD%pw>T(x8Zmb%u~X!wE)?J(^^WjY}Z?1`iXud;kBbzG~D5)A;vrgXOGa;!i!(l5cM8gg2U znZFM<_){-RUj}c#@5`K9Tc~(gDtzFcQ>!CPJfxX{`8JGe(3q{NHLhhkn{UP6(fallQ6#QR2V|IPID()4M~fD zDSTtJ5jQh#c1n{Rnf!5PAL%@<{J_$Zz(fA>L)}8dcye1$x+~`u!yC)== zo|~9?p;2*tZLBi_nTlL{1bVunqTYM(4#`1<2VAN$4|qow+YU=G%#wpfBIhH8C&3-& zOn;gtE2iLV^D?T#1TOy&Fz*f8z0JE9#*~O27|t+_t1OPMGK4BL=V!m<;X`rXm6`%z z^dU4-!fqDmCU#Hk9;77e;FT9Z78ybW#4Lk~#(elv$qPQ;9p-)=OCH)Fwu2=Z9<14d zTN|&zbY1o1moMuaPhm*F8ou$N6nl+t`B;rZLB5D=~72!SQ> z2-*Zng#D2Umv)s;P_zW?z4Lx}z_j12)I()p!79jAy(B9=&kYV6Chf6gD6{eF7LA&!j?= zS}cQZw>gyms@p_(?tqrHOwm8>ZNm{;j`d$h&Q)t;1iDz3Rn>HA%=8O#X3wf)ew>#( zGrC0TrJp-xx2CdV9}aOhPg~_yoPtKp4H{}tL8s_ZfII4lBzbkiO1{&;wkvqfMnn%b z^t%TG)n~qqK|;s}acs~kI`ptWG8Lo?SfJ=FMfQZ2$S&pk4pIZ7_o1>KqKCsZI_L`w zpVEvWL;61Y_j`M~70tM0=RE>p58da4PE_mShq%RMFWIUga-jQUg)K+NCk zYU3%swT!ex=s%NAz8_L(1pLqZUjl@j;o*bHUdtuTkgrb{l;|g*ayxZ7$g$Dbt~^@< z7Y8d3xz2qZw=xL4R59Q#ngoh*$Z`wY9mvhZ94ubF-_aqppI}>W^6XdcAFw`S-F30% zG6aQu$0rhd6_5DgQYm=#vO5#ma@Bd+LYyESE21)x*?!n4;9)zsQ_x;KaQ{H_4leG= z%hq)dbH_1sV37hpkLU%WK`6i&Vrm>rjbb3m74FWXVY>FDXuh$L2I15aR9v8M!qIwIp$;{!$wzQ(K@dCu^F+uc)y8z`^R+w$q%|ALopDLO28M&s{1}Q-llO z@w`MoOJ}!FSAX|;<~4{zm5{txwbk5@>MtPrYQ(sSH%VigTXlMG9!B{9AYb|h#D+yH z8Zanxiik1AWW2%<9cMeoKz+aXXqQE!Bg_lAlZQ}+OrZbWs{zl|`US+2rsgHdUBq~T z?UXf4@mzCVm#!@i4}tcCa3!s#wNPZI(-BIs24&ol4XI z>0B|=bD{eX^s{hmpGk>F(fg`(rHUzcWPDih-;i)24aJH_X{dv=@<2Z}e#b(LvYjow zMN`32>}9^;fzHS}+(&1t2T4(dPPPK}Xf>a=m|gDvvz6uE5+dIP!|fI-d(1Vpo+t2gl-#HxtX z9g%ImR0TFv`}&azdf9#7C7=@cGQj6A%<`ueH-c9;x`t4PhXJF(kNNmNtlhwr=Q<}u z*bIm}eEgvV=}vV1LYgURpw;1e3JM91ZdNdhs#JovlbHVC*p}HdK-E{iVL?sx0s1`D zB15fdh@Oln`>M7Y zsb^v;jNv-Rw`#|EiQ|aGTuefVV1H;iENC!riR@{3hQ}isfApIbam8pA3VYwAWS2v|)1E1AQ zCg3E^j+h~U8dlEtKnV0(XTJarB)ZNAucE&1dYPfNbQ9YR^}6KC04ak!0lF^Goeupx zSF-G{FIiMKIVK^T#@L-ETYC(({B1JVF%DMv<}kc=ljOj&4T31mrBV4x(a~rI%<&Dt8lYX`scUc zlbShw>nP{I!walt|KO&s|1?tnXN26X|sj);YfLN=N@P)Q`{p}?E~Q8lEBj;N=fz90*NJ- z6hjN*`sM$)9+_hjW4$`886+6JFN6#$)usi!$xEuO#)eNK#Qy$L0v5$t*+x1a28k#Rm{+@d}gt<8KtWuh%^qH%rEwcghl z*=10TXCsgR8Hg7R4ZJtu=iyU(t+j>g&+9LN~ zsG*e(ZOL2q6PzrWET^f#BGT=w>06}eaMUPSLfP9#{fnu=(e2!?zg_v`jSPV_(nfl2 zIha$2b?_XwWC!02>Z682T1vYsSbS^=ydycc`S_4U*vgVOL1na!CsY35d7lyjl_C8F zp5r*QZw*29ws$#qq>z9O7M1VamWlp8<2EI9*tkx!Jgz@NDmT|LvhRF=POVkL93NMW!~0!b?P$A~TW*<{{KMjvAI6kG z8=!las8bFdXvq2*kc_9dbjzA(?J>OQ=t8)2e-s76Lv|{(3Re9nNsp<8`0e8iOUd^X zC>ai3DJp7)$KQX3%>9f?^RFe0e6+Gh# zWO9~He*`j1>KwI2_&j8%6vk+-4Hi}^2<^F!6va?N&tOuVw+jslG0OUtO67wGGoevx zgb)4Y67zi?7O!(CcvGaM2P|fG#?;oc@t22Nx|glnHZQevuee`ywTgE!mZ3lEE^mj7 z2ScQ^blJ(XBBn&t3_0!>;h7{K58ZBt=}+Ziv^}qfofO^B$jPz9BU8&sNyyf%#(sk0 z4I8o6^G-cc9zT#Bd?T=jGUrTGh4GNu(Imlksm()t)2P~XksHaoo!p?_mx z&eT%oSPdzn(GrCndPwCw!lWL9?~v!P@n~Z91zG0!2fPWHrq1gHYRDC_voZreB_(e1 zh(YeEtkHIs$d)G`8msY=@lMd5rv|GX!kZSMdM5@s#ddhnIg=5D9ts*;Qo-3TX%_dL zN^Nomwoo<)@~jk}A}Fh_P<1_NVSw6l_jTVBfmYR`imh;`U!%*DZmThn+u)lIO)@9n zkyZ^cA8)lM#LJ|-pkx}*JA-D;`O~+s(d@V1V~r289pTdj48}Lh_9x7)h3=09G?p95 zG)OeEx}RpQa05Pm?(<~WvRNPg0etf!Jv4M)jUgnz6pyzL@}^a`{HKTEya-xfqz8cH zl|eyXcBNsG!y(Uz9FAqsmVuD9SrfZ-nS zO{f9-8Oe~NB8?KzPtW+{J-+o5hNGVA9Fc|nz=A>WSf_69X^DB2P5?Ww++(eFHBp3$ z`uZh?d0ag-8E&M8%ffe4f26X*GGfXq%)2D!4@%Z|Pp?WCG{juP5oB^6cd|jI|G}%A z8d?ZnPH^{y2Ag~SA30l3`T3 zyHQDmz7EtI7_DmAdFOa!=J`P z%C?<5)8O$!BQ)@d&>-NQ4}K*HZNDE=H3J8kAMP?^*)=lWAyu{e9ATi6BaGj#(gA7jmJSQfO3RbTWuRi~K+W z@rWI#ukRUx(7Rl%JJjQ`)NSR;;TT3|3>OCDS_XEHh2NHn1~afbJB8N9n*MxrpuTd? z2Wc&|n9*g7Yq}oKw)R|TBU+-}S?EYl8l;4q^@R#eQ{2?BXri>oi1mzzC*Y5C>fxlg zVbXpGf3H8x5wkA8cRN=?e6JSB2pa7xif?q<(1#ire{yX(epaYdX=UU2GzxXj`ZEu0 zbvkTNiT}hG7-iWeo&ABNkn^F`u$p6hhvWEEcJ@!+6O_4WPU{M&`S7p+o}mW@XPpTy z{liAvjYaaiTVl**QnPH|RnG`&=>Cp)QCBq5q#_2S#H8d*O!~Md>a0&TrYC4I>?~;&-^u@>1DGT0zP^1RZKT^Luz`qCjP{l zXQCT_rI<*g&T^S=BlV%53>}{Fyq90u)=U4A$Wd_iwA-uRDNvGq%rcRg?h zuE`*Vy4Cpdo}r^$e2v<-lKMcx^S;=LPfYUi8r}Gm)*RA0rhG7!B6eb zgSZ{B=5aAu&pF?psO+x&4*6nZTimcP0k(mhb>|TdSjm!Iq#{U7On_vOYnW{F7Xd#~ zpHuW7i@5qAZlX;z4&C43Q)gMQjgByotzTsCk5yLo4>uUF{tZW>GalsIWOs-ejnvT3 zUQ zcako_IAejrCdK=X$4Bj;K7So2zRDi+6e2tN+q!^>BF zLuJ-VN(LpmLRCavU))7uLNsXPngr97Su|>6>6}`=bvX*F{mJ`m8!WWH`t5>2s=!h& zA69fkLU?C)x8z&5Gjcv?f-N^!tE;)|yrTr_C7gTje{du1n&VPh?F5W0XR3z&?(&{A zUehJ4j>&B{Rsd-ZHNb~|fB5G9D*@hdR4-fl_uLW5f zBo3MuLIsnj#4)0_e;LuONZa!`Kx#84Dj06L4eu8^76W&-vkt;Bo-qP;kV>pSm0-;z zz&LPvuO=Eb77%tR0{x&^IXaYr4H)> zltSnDlQ{d{qWvB3mo?L3pgSW?+ZERK3Kf)H2ncu!;_Qplr%6OiDQv7&ItdTGYiCQB zS14EHy;Q=dlKKnQ%f=5(yAjuHW8EhxbB?jmA+m`M?OW92F!2bv$eM?y#;G$e zBxdK6{gJZbL)3-T5XUcK!7$%ump~%{UQkeSOxO#M_7p`+Q>si~ICCCc?H#Z<0VHO9 z04pnT7+2IxVoOMBqpkq=pEczvz4z_M=5cMhO40|4PtrmFca__uKl)Be8}t<=r8O`9 zH6FYQ?$mgm2t?%XG?6<$LlT!>vZGp%`v~QU)q0a#{ble|A#drfHh+%Xz`w5@OLh%Sowdgc03a#t6n%G zI;x=7^4x#W(tps>Z|H;npr!wyrTDyuQqai~ot`PFfitHV z#zp8XiVq`( z60r;;NpMS-5C;dp_YDIx&Uywch%auFI)7%r31_xAO%XW*s?YmBvUJ1!hw*I{;k&&x za8QD@pjH&@2m1@&@Yx1CwDOK$pC;d+hHK%#qo$IuT% z+=)yP*^Cx-V(QsZb)*Qwt$*x3NBkCMipY6spFg3D?8-l+-Y5P5UaO|Cz}XJJZF7Ha zs_8mEWW=Ktwi40+P$)wtAjQqbab6Z|3NPE-1m0dwVX^mUo+Za)$hJt*ZsQ(fU&a_( z)j>{_b2rVMS2>ED1Nw6JogcP**i9b#RQwnabwKWJZETG$TC<6VEjYOU%>3BN4YI8@ zmto_#!%+(fZ%d9tNwn~t4Gf`Lx@X^#a8tXx;f%u3iD*fAS!8t}gYY47r+Om~kiO+< zFG$7+^vSIcrY6q^yb#Y_3j$svk8o7wo^u@(14&J`7N+WOz}Y=~oEgtXjSKX#Gdy zRwn0fX*)B-Vd~Lq9w7G@SAV}4?p0+`cWk;n^Y5AKA3Fg+Ee$#+`Zswj0?QZB{HCQT zcKoTio-c>bZEydoye|LIw6uSCJrwmlpBuToA|g{Xzj-JYENi0$`^dlhO`E6_i003j zM~4j!bHV;ua4_9VUwe3@Y?_`(Ck5n0I;3EFyqxspVkm!7Nc)~M@#d-iD1+_`@{`{( zJ;-y@p1zaQUm4p$PNY-M-*QPck4V{Zb$@7PE;);i*z|H|)GTN8f5T5IPwi#~0p@I< z#p`ZK6!lwjCbMG?pggCIn^Pile!1tSXT{b_C~OYZLzkIBXZ+_NI-AViAR+2AvYQfa zo_fY~ND|sA45W5?gd&bXZdPfevmMH8Xpa<|l+@f05se?H8bV5VjtX5?UPe?E9EhNX z=5m>$ExM>>PtDs+gLRP6bEu&%WwY4+Ie`u-g>G5Cuq0!3QO6UzH18F>wC;S=`||?4``EE}7Z)IT)7yS~+feO4qvH=m9kh8r zc%JMwMk{W3ro%y6WRKV}atx4qV){e0zO_}9aulcvJwE@xFu{%D0NXctzXl{5s57WD ztp&se?x_!h7)-Y5k^BA*XvkCB7IV`kpt1DK!(P$!n7LzL(mfZ-vhq|}ef`B{C{iiQ zu=eN(X6b$XayW%)%#>-LGGri<$W{9fxLd)7U)-2*8szlQIEw9LS#Zd6Vx;RL*XW1J zlf@+oY{X*8^7~CW1rEML|C>xerBf+;GVQkwP|LT#wcMjEN+zez5cTTV2{=wdmJ99W z&^eMpjQd4ga*Uxk)FJvM-D>o*ECZLT9iHKE(h=+>;ETpcwUm`VfnuHNYq&j6ZrXxO zDV?`f;o;giQvSKhca)s~y%Fw#&qH4I25B(S>Uiy)(F7Fc=K@k@%n%Jn@L)@3!kNlr z4h+=2?#X&ZM7AVRprV;`8}j+_qzHNqMYi*GPAF%xetZ}9&MxPbCvy@c3Ij<$!|%e; zYv22@D2;%<)H^6@tzw`Xwyh)+j9MHeV@(tKPtxVmgD~PkF5CaSX z58w?pRI0%Se-9X~-=oj)SHPvp#r#kV-qXrxK3AYj8lIjMN6~XaX1eCI6*IWM8jFFa!`BIjNr*I-b(h$d8u zVNZo7>|nJvdz2h+fy23SeMK2@-#;jB(pC-cniln-9eZ!%u_7DnS3JmYz~NTVl{2N; zX6aN+^s@;oH~V25KIF$WR7kAXxf9nqq~P-Ez?lpFbxhr#{;c`=a5Xt8YZ!Kk43lE? z=MEqV^9fvj-2J->+9ed0nQ9uzmO6PBzt{6fcLeG<{EG^VHS&N zWnkAPq>ifzT@N?sw3G-t$$>~zuzrpYiw-TT89*}-7!Y`Bcj{Vy_8-JU|1;KSK`b0{io|-b;T$?ZA%V2^+U=A5F=3p9vfFZWl{*qHZ3a1!qA`tbd21(J`V z0Xbc6@hoMfDIE5#j>&oEK{f`K4h9BKUoYTq@^vRIm*mvEpdS4?-r!m;A;5ce#n;mI zjJ=sqIkAR28dmUJ5-U2Z0gj6$!pOu1Ma)k%&jeB8&FOS^xvVO)Nd{;5689|7Ll?OP zC#SgJJsZH%`ELGn_+!t5vvYj>7Ys!7xIt0MDNtanxl{FA>~P_he5LgpzMY&R1I3cP zd-<>tH_F@JZI58*p{A>#_j|X1^|l;yA)Kkak~_7LM@se*XRF%zvl71~!H%e}Vu!dk zS2zWUZSmznWNKiQtY7ij|g_5|!kmH}Up_87-R65T#uXggU_n|q2;x{uI_6P#< zbf*@$`3IrD`wMQ|$N|b=4<o<}~=HCCi0e7M;oguX) zh}MCUUfu-4$`|(R6gd*`U-(zQ7uEr2=|&rep+5;RPY1oq)JPy)daJ~#Z&Hkh=+DIA z{ip>t4|&IF`;)OZ6YS-%U5)$5(Xa(I-GH_@U5`Mwe0o}3;QU{|<-8@$iO|0(nYxyj zSIsj7pv2`o`RxLUlLb3Hwx941e%>)~bF6B-yJuoK0Uh&p*k@QTF?*dsPNy3`Bf49FJJ)ch#-?ZKz)JlIj&X+OQgur*G@)L+ z=&C12{E<`DT(wnWF?s{raKB4O&WHlXFVL8C>eI5x;i>x+gPXSn-iVJKdJUa|GjW&j zjk`(*zizrK0^6HB1AGEqGJoA|8vFu9AAK%G42b()>=jutc4Hi=(@Df zwAlFDd2-4fn|9;j_eOF{Toho}dH>>M6 zbKb81kMVDN9?yTX2<#hmHHL3fR?3*QB#0M{{6Flydsq|q+V9O#6x2Ww!a<4Fw$$1h zT~^U@h;7#@ZC#pWeOkIy5-nR@9wS-}ki+0|RhFfiD(bHlC3UN%E-LX*j0j0kRI~`F zsGJiHLgbVKA;-zgy!W8Bho@^l*Yob{z258EJO5Z412cq~-`sQ0{r!CO5#^*?KVA0_8ik;ZdRsQ?PQ?-uIYSvHX}hfy{g;JFMo~5m$>4WC;Qd{1{#@byq++4^_Edo5l?7w~zHtRM^2~Xs z#*xeKIG>!**_{!?5H&9Jg?TB*mpR|Z#mT%cG`+K7@D~gRNPUOR5CK(gA5K5A5UbC@ z!|C5mi`LamjWKVnfa}gUheL)fGT3Rz-7n&yeD^y~gQa!7zuv;3262tBxitY6GAGf} zQs|P}-cVRz4Enm!=LzDjZ17^$wrA&vj2m3#d%xI(-sFv&hz{6;BggW3KjcmPF116N zzdQ(?8|xp61XOs8_hNLMM6A-bOy z1MDpvuWwwRQeZn+mXW=;W^mCj1Bopy;|& zq}79ic_Sc;U~AS>W)}6%NVXKEZwvg35A_i$*a}}cUDLb}7(P131CFf-nn`rM_#*_s zAvl5hh62NVU~v9}Kl;Uv%8X%~4=_-}P~a=xU5GK85fw~_a_EMRj%w3P2qdjEDUKNy zSWpG9{50L5O7{qoGp9L3m!=YZIRkLki?#*^`h8Tr6Gtmw1lBTaB*LezYlLz4oEKet zWE$^vG~qMUkSY3u2|~N!Vc3iB{dN`nqH@CVDs|)AwQ|*PC}$|Yg3f$Mf2@)c$Am{| z!0rDybIMr8cYLkG56TEvym20Wk8QuXY@trrYTVAFx@F^2gPJX-q%`o5sSeup-)^L9xH&u-ce${Kl%!@1*eurs(Tl~z!8u({B{|RC)BH6F5>py2;0mwx&>lpuRmqOB+goSHI z$s3QPG)fMB8SsaXDPiQlAzm<PLmEQ>e?d&E`0lf193lvvRXLn<2@sIddIAnEJKSA?2UD zhGC%9;mvZ*#q4q1p7SXg-BoIPK>77L@{y6eE>Bqe+@0%PQ z^E&vPz&uxx2^4wazqPR#%B1AN4Vepvw6x=@!eL60SW)?4q@CXBmjFi|$tAyJI4{$j zE*cA-z$w{LvLm5T&G(|Cx-n5SvuY?oOAc~Kn6XaQ=tW6`0H3iyL>Oo!tWX$t+O_#o z$10#3>D>QPxaQK76JXQ%_uYtQInk7rL6J1)cXGrx8%pN>=C+ z{i}VGbe;YvcnEOgM^XBGpkw@HRgm8&&gUp?gP>eueGDB_;|HDM#8Kb_A0 zJc|x7WQS!u!y41PXtW%CF+Ki_)C6L zpO>ao%%y=Qy$I9yLrXT|JpfH;WWPtKi$zxs22D|>t?`Ci*O<-Fdwle4ynciaCqu_S z9Uu1k|C?6xg;nGfZ>Tx~#~|(Kz%i@9mce|Jc4qu~fDr~~1QY1|b)nLB#>d@b6G>@t^k8z!C5oc9YEC@j|%mpx1o=icP zBK!%*fY7}Ojq_+IQ>}ub9!1o1R2L-wnhr35rvP3GsxDP{l<4L=P6RP$JUL2`sXAoL zOsnn@?QCI)t}Qy{M|CyDRPAT(98BNnrYtZ4zg*aAzSbhZ5}s`YWq;te3qe0^JIb2w zlXN&d*zZt#6wG;l7Bn$(C7m%nt#MnhODl?5wtwbp2hQ+_#&c(W);t7MlRa$ta4y>a z(u6RdC$pzf2w{%RXH-2bV6lewB^6~TDh-TJ-93uE=V3^P0lk~R;ovH>l ztheJZxAyB0-{+y zu0MVKUYu~(xk;IrQY>ED($wUBR3|p(Bn<2ZlHq^eRly%kUUJ70zEG!P?mO1#YUE}q zQO4;UU%sWA<6euo89;l0MnbXC`HsLJ7Q0&n3Vs~S9AyF8gA%TW#_;e+e@Cg@)h2hJ z(?vb(0$QS>lG8J3^JQlIcG+ly9l!zY(E2Pjs#|1};)&xd*LIjr zR*ZAI>o5!S5SfeXfi&2c$8qKW&p~PhokqaEeYV5Z1cPi>WDYh+nFc!y&Ay3 ~WE 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

  • r?i7uSQvNWOS>TO6UK1V`$RoSygVw4rBW+7S1o~`a z$n)N7(UNH3kx`?Sv&I8oF>mJL(P%<2GgNtqjLaTCp488mxUxq27bMr?dGL51Je~)S z=fUH7c-sH*cpf~ShyRA>K{6FGNq(g7n`jy<>XQ(SySgXyXuME=E^Y1QV!giu#e5DG z1o~iS`otNjmyN@{`5DsPtF~uc5`pNPez*z`0d$}e2jJt!lVS`7^U^0hd+entxJJ-) z{)aSLadC9?wz(PK?A<#*IsqkX8h3%=2?PI0#|774>4!;L0Jwd3uwD0verQXpFU<*; zi)ntOKKUL7e8#`(gdsy zcUz+bHEAJ`P9A=6>3iel{9@H%=E|h})VO>zySL0hYcITeE;Mbw5czDE=~{$y`?vf1 z;eU6B|I7W2m$=?R?3>=vQ@YO=_rvV`9_BYjy#$*?9eDD;0gv%a9iIjnA;l~hW544c z95H%iHz|3!@+sTBiRe%CX!0jNa%>g#TD{kn0!zZ)6+}Z&ZN=1u0kD^_%@d-Z$#Wh);|e z_X;%zBlSH$#i1Z<-_7UI6A4rlU9CQSo$PwIRffiwN4_w6#0}=cdeE&7(89?4f|=J{xtYVyVxRNPsGn=}I2~`A`9JX&B5O4v=0k8(+qK)WvU#2C$X3%g@Slo zyGY~iPjX%753N#G{lnkSClo?PUi(-&pPt;9k6+7S;m7$Dn$!_6KC|=y7e_JqogoResJvRmI{KEf20Cwtw&LbPRBOb0mg7K$rxH)i99cX`90L%AZ z6f>_wy9!mrMZV?N@bQcWRNL#b#P@KuZ{Dj1Ynd3WP@^R@0t+BojvMjo^dJzRRCY1$ z(x=ESx!5k$^ls9w!6Em5ijEl`MnPYMeLeB_eSiZD%qRe+*B?SpPUK)@F^zUt^&AP1 z+>0d^{E-0F^jTmD$Vp}T-Y|g98!i#r!_IYbiyA`dqC2}36rpqW(-Uo+Az#f7CGXSG zw|pk+(yKz3Z;;#8ad!0G9|vZgTmll34hWvba)zez#YztH2i|-sjN$#A?Q|P6s{vDF zBx?B?*Hbdj(Sspw<<8mTfH!}=P00E19unUwgK63sYP*Qj1^$8>tzM#jtjv9W6!7M+ zkau4%Sv5!9B2wL=Q7Txk9y8XF%_(Z-**VVvZypc{-1>}9KZOsaCrxUJ(-?Erk5kop zQ30tG6odh9UJb4VHqk7j1?G&*#&L4zdpdUtX1)gVA4=&-f8fn00McA;j^tzlab0?6 zR}2oBh!~8rYvMp+k6s%)W+FBsOZYx%p7#uaI z`zLO}H`#sG7SEsJ^{_u=o=`V~vC<+Q9N1_u7-U_3ux3drXlC1aFq(S7$N!8<&-B`{ zW3CWQnC%@h3PR3TFMKsZuE!R~{O#PVF2Ew3*gQ%KOtx$o?t=3QGC@jC_j|&DpT9H6 zhQ`Gm?KuxoaC>~h3Q22WIc|5~T&rooRnEMEj23$MYYUL%X+0k~EF(MUp?bAGISD6{ z9-r|_TM5Ps%h?*sg`X1Qb?&~&Dbfap%D@8H>MH;)1a z{HU+$;&##$E2RMQ@%DMX^V;cSEVq_V4gh5*4l7EbiUmZe^AlSXi~zH(=Vckn{X2bt zA73ToTb6RH4}ia6BwPxL2S+!5o?K84!_e2$SonJ7m9NLV4E$utqbik!o{9ot5_Rj= z(kiv7nlnJpsa;Ygejf$^`O*PMd@qE@M@juK=Tk+K>FJmec!hO;M@u5c43A4$zcgO7 z!+yD+YvvqM2Fu3;c?a=Nm-M=wWyN6TL4W?-NA3&%ie3%z{l>3mj&h4~{8zqfM+m3t zWge=jhidAfntG_Fzf$7-mTJ0TnWsqb6bYUp!BZr7EPCZF9*f>jW>Jqt@BcK5-v0*r z+*2fYItiXmf~S+l}|C z#p6eb@c2}qG$Bz<%Jbo09AI0NG`56yE zwRrp}9zTkzX*vg;Tk0Jd>hYs^{3sqjN`V|E-qRmYGoQ~!qJc8>mo?!}{3vMYVn4fb zU3_rjNi=hs|72y+;lTf|Q{I2%pp&ooMJm6a>tFJgCuQVG8F^Aho|KU%W#ma2{oj}} zN(xuvv&O$M??B^ZC21W0(%AoVLr2K;ud$Kna)2KTo6Vtolc?Eh;`W@_TCigYDAz47 zpnKcz*HK>xINNIW&>FoKjr0$7y@s+nsuP?)IQDqCZd*espE|^8(>Bop!(qO=w@Yri zv|MKaua*+)V$Yr1!=~Ps5qtT>1&y;P7Hd;VI#Y!OAR8oA43|kccsa{{4AV>T2FiVc zL#D1DM|1QQDZcjj^iQIJ*If@{^hrAFYaG#l!$xQ2=*Z z)oQ;h+0w*uw=L!T?vKKCf2RN@GrmNYc}GG0C2+0oc@NJjT_Y< zDsa&PXl_R98ICDb&fZfUL(2r>u>OX2snM(!xMGa>w-qD1X+EL0HJS%Uq#k57=1KvT z6^nAR=Qna(R=%?ylz%+uhx|?%*)EU||Dy%S;yin-^idq9?c2ofSK~9J)eY3OMamTy z&du_Taeo;d9({q%p7P1hboM{6?cXJHY*#cyG-h_n&68NA#4M^+pUfis!o8-fH`637=%OvI;w@cyfO~r%- z#6=@Myo)$N|2p7P?LWk~zDPc1kT%-Uj->bos*ha&K}GXmLn_v{JHOU_P39hDdPPAV zpk>OHpQK$ZQF*(26hzZ>RbMXEVI&4aV}$)|@?k?OcqnvKDs7#j0*bmvzKBJgHj?WV z&U>ou zwoxE@9TkC@XzQBXI!!kO;xtqK=F%SUM8hFpDR+D=r@ZCvS$rYhqdrn~>?^$VGGtGOBO*`UY7`rCB+MKtpr6!31+R@+mpx_W}@IuI+z3|lw^K9Yq#qr-bgjy^Y`Ij_1I84p)|2wiCNf5aDuoTPfn1EDoJaRq+gjtg237at`ffFG4wfCF7L4|SF>Uvy94lsd% zrR%>wkMEun<8DWe6C77>9nq@H)B!(%_Pw-elbql#*o~Q)nxTKhy3HUBN-fz@VQt`S zR3&wy)^V_4iVT^}3a}S!7Rbe=NK{Fi5;CublHi4CFV=uU885FBwQMLZ?Y`U}GZe}( zhgE~zyO=1@Lp*qubb^)CG-SbKo9 zdwTiRe5o}>qd7^((M4AiU`wm{wsBhLF^(0)qTLV(Z*V&0)D0tP;Np-iA83#c3Ny=; zxC5M{W1sZnh=9r9=sb?v{}Rr`Xg}gPV!O_^hwqxha?0@aWOI^pwhlk0CC0Ij>XtJ?O-oo*t=!cF=N-#-QJL6P5SwK9s6Z|hDdN1fL!0=P z!vXv%LfhM>3(n|@6FmUi0jh};SK@bLfLVC%$Mp&2iOX_IMzgPN@=OPvdq6UJW#k@GN+qOeEC7A zk?NUNe-Pc#`h{VYGtFMVBP9DA2a(47_Tk>H1R1UG`@y+eK%J~}{hi@xmx;^DjBnTj zGH?u>J!=?(;-)QBl`$Z~qC=2T^l(^%3ly~wNTYciLepXhvF5!*K z!*d0eSzJjUUvihJ3Nq2>iQM{E4q@d}%n#f@D#Us?ml~eBfUvPB_|L)N%E@m=9Py53 z=0=)M@$vm}trt(7T|-FehD8X!Mcvvs)=bkCmK(I4bFd*$|Lmd7hhm*w@)Bwq zr3U4c6Berm9nr?YH>i8K+V0e(abCW;*XPz%&aJEa$pEj$%jC8Pd?MM1tNFv+G#AdaD>LQMS7*;uYAE zd`HjinhJAQ1K3YqGHuY<+E`=<+n$UK&!&BA0Iw!~0JIegb5!yVKjCnaY091NMrggK z9GzEU*`>p)<-|Ijtw&(((^=1OfKScq+Rp1a#j}MdjUi(U-cuar4br|swQIV%Qw2-6 z4jd$oAiZTTSm2ZyV1XM{wqF_hvQPARnfsEE1o_D=KGn^cpV`;Qlsa=%J^kflmHY#~ zFZo32aLFw&)2$^8MzRrhT09g>nZT&Dd<**Kpszgu6jD4PF%3=G10;mnaih%>+|x_u z9^+sQa~fK&J|W3dV^G_*kOL8phUq0M;LX30c=x01>mj)z?*2m`D1deFR42+!Rx0?B zGrX0HLPnqdOJ0S2vQncTJ!Z6$wSKhQ*Ar#-M43HNW>1va6J_?KlzuK#JW*y(lo>I; zd+r_O+0fCRD6=QZ?1?gaqRgHsvnR^jH|!}AJW=NTxjw&zqIsgso+z^?%It|Ud!o!( zAq~mR%n{Bj^+cIHQRWy=l-Uzy_C%SJF$y^7o+xvrC(7)JGJB%To+z^?%It|USIIq5 zW>1va6J>TBVT}wf!#u6r6J_>9nR~g8AM9cn{>D5}W>1v)-$t30X=}W}^%t|*H!Ap1 zHw%xU71SfEDJ4V4KOG(jQ=<(=w#m$8$Je zJoU7@>fXArik#w&1XSP{q#YeNX4S;1J z&0}0=Tf|uv6-!d38Rh~zMkP})kQR9&j@DACP#oCsphNFVv=kf}Ok%uK89(RF@b2kj0#KQ?i@_t=%y@j zm}R-J)qJf*fF(TJ2+IDzZx<5z_-#j7(|wW-hX?x|YLD_mO`io#j9l4nq->`(ZVPs4 zMKR0v&wTB`86MGi?hIP>zIQk(@%M`es3v>Z^5I;x|D_3GK2Z*2{=g^HFOsXlk+*bA zs5gFSR@4Nvr(ZDdD!zbx)5js_^kC%Eo=;2!~e$-w@PeA{4AUxeg z9GTt=pRi6Ft?rD)1{!pkxTNGTQ*)>*tGys-(m*r7mSd<~by8EW`|WOw6k} z)<%1nqrm9+jE*w!6ubKc3ES4$+ZU=`Q%RGZw1L)5SO;OY(_D30l2Hdn$$`DPfe$a~ z(3_8gCt>*-m!4xjp-Jy>Yi+h0vEpV?Lgx~txK8N4Dj=HWWO-y_O0jrp zOH-5kQJvTbL89F!Dj)pkT^0P% zXEUmp>GuK#iKVk#s@yIcZLk*@o$aBq#id4di)>Onah&Da4)GAhI5%WUEHd{^=HmLZ z7q<1$4mPrrEww78{Q>*-*$!6|46l^MB= z_&1vIM_j2Y-YDLBrY%?1ScJI>scY}7-)_1kcV`K;&PU72n4)tj)G(LY^G^tRQ9Uf@ ze)iFCSFP3Gr>DXta5TPd8q|?{7@0R0svC1vZ#?~d^A{+O2M79ihtLV90}fi4$aUOQ zL{{~p{fHUqpI=S7x#()TO?kr1Y2Rzq#yAIzUEeMLv!>!<8pV*9ob7wXKSyuU8Mg$IZC0 zC$FV~MQU~8t_HUQEqEt548vSYjpc)p_7#^ubxeII>Neit}>iiYm^KkYReki$l&t#7He=G(Cd>$qP)TJ9@%S@~=+w1Mb(i#AoX(=1 zbrfC7gno%qBbPlLq(N z?QAz}>T#U7GKY6*i*TCtVoMBVW>H7zz(a!dG$yG_RAMm`2WrB5ZTHc-%>3BI-a78lOW}@6j=NXjz9Dn`{;LpFxGQk%W~jDw7(VFR zq)a5cIOLp#(<*9fPw(25`(!b*Vt!XXq=FVLRd?j8k)Y<)#{1QSp_<_hNkbpR(}d3;t^A~QM~0C4 z-QdVo51XUaz0)x*lA7YntNS&>)k#~8_d4LRw)%IHReeINU-413HAT`@CG9NK=y9oO z`5G5f+Vj8OjX%L|+^^DD3Z*t&+@7Nvqz~6U5QO}9KR|N8^!BAm{VI(mfMa=+QCfh* z2aZfVflNOpdtf_?i1T|H9h>JD`EHHQHD{+%+|p3qeFZ9sCw0e@*SgjdRNIVIqNw_g4g>Y-+hj4yMv0~4~Dd_)KDm8I1DUufQ6T` z)dttngo|qg$+M_jH zd6+4dLv80#-OD#{Y`Zk$#Z?S(kBqvCjwWpXqFUN6lHRgGFs?<~tS{G9YdX`$GZ0tw z<1sV?@jLuRVdQX~NRyKFfQb#{CLYueKNL{S9A_@y)~v8^J=4u49D==RW#*m@Y69mF zZzuIlf&gzpZ;;-8Y2%S^qXp`o77bO;d2~YC0XE;S)mx+tFYV(RUbhH)w2jwsi2v&B zI;|3)%`wMc)C_Fk^p#q08u+swP_GrYWqUl0vTT;MdF*Gg`Oz-jl$_ z&LSs$&4G|l90nnu?t7>37ZL|nu`RuFGE_1AzJP43QvV34O?@-j&LI1^_zx_R6JcGI zl?&~=8Qx%s-O1uPb`dPdzOsx* zuO$?Yq{4?Sm}7>(vaYE6NcBA_T2&nsjyCrNhGV7rVoOC8b}eO_rivo!f1P$Kb}@#I zfag`?4#FJ80=)NPDJ%oM+coAQ>9A00VM}3w{zUzi>Pmk3kVvh|mvpSfATQg)ch?HY z>*86WU2&PK4Z@DrQ_HGB3ca&R?ReW*iYM4b)ym98?MF7mbG<6F9>K4Y9kHQwkwl3F@ddSh~S~T_j#1PvJ;pV}@mY(wu4^;E4b9j9XST|Q^-Nb2|>-EE7 zFVkUxTZdvbi_%CqImGmFm=kU4)GZ!nIM~n`L z<4!WVisKq#ubM?_yR@}qt(bJgE~{5mK#(Qnss?BEAN}MxoB-@6mu%??DZR81T;1^iJO-i zCsv*A@0+C51sr{2`@m^#Y1)xxXSxT_ma+a(z5#eOS`ZTw7La7IaIym~<)vo65>PrI zQg`Vobnd-TVRs+nyvE7o+2^1cwGpjQs|Zi-qX!#gHiUw`m|# zPmJ)3!XDau9N!w<2e04QXzwI-vIw%KTX$!IDTY$3)KV&=6NwMT~Ch?CUF zR6tPJU0qyicr-hqKx$t<=eC}hT_BBPY=P2+-3TRDLWTGtTlNr2luy!Zb_{=g<=lSR zzK@C?%#_<9r?<69tQ}14MCBg@N4%ONlkOl&XyHcpfMVg+47B88o zmDMJ;q>-c%V_Y)dNOnW{L26^0?~FdfPVhcU4J`(b$s&|-Mo%j3#OUtIb;i6l@I+;*lMO1?{5ya zOBMD}ij`mkw{GJYDmAWkTvZ-cRHc6O_9hG>{k^p9+kIa~etVLMiB9JJtnM{{hxfxf1{-;ypvZx2^dSDV6gx1`ofZsj9w&Fl^LadT`Vf6;>r~Rq;wnH0FSs*Uto)4+qVk* z4&Eb%xmXQ@GBFbd*I^cjfxok0TH8YPqYb{XI@>1LUCM;(oX6yDCT5Q#Is^+u&A-mYTl{nd^PyQ`q>B%r&TU=gOUXbm!W(TPu@#CUFZ| zohN0^%fEb$Y8R5bs{zQuw=*zGK%eDsCImp(dF+?i>-pAluLEl?6a+Y~aYYJ%A2b|; zUQTZdR(3F>3YH|hvqI_k((e49%jHr#RK3XuP8Rnk+46MOX&wH;$OQQXweW=mOS>wH@c<0SrJQ__1W`-&c zk&)Ts$CLW`5?9tpww&bVqy0fa@AzzOLai~uY&3doP=}9KJM#X4!Ja@@bQz1~L(@3! z^K5(+Hk{0{pf8Vwy^4W42Ca){$` z+DjKo$CTfwF2Bui-(!1o%PfoA=WyD6FXU3tCk8z}9u|hR z1F~k6*j=T0$&Tl09EajEcG-K*w`>-*emy%bRW!J3r!uQZmMwD};ycH;@0W=)+k5g^ zlmjZHza|OxFPwPK&Tc9}O&rr{x$dZ9a#JNT%x<@B$s< z2J=wVxxm?hzS+TNd9u`$x;FF|LtrG@axU-_j@QdHjUw~4o^9=U8biO7fEC}udGt2V z0*slpm|du8k5^aDJ*zr*#kc(Si5RO&V+!heeS1j~e7ard(f*HuLb39Dxte))kvWIs zMx=?sK-D$ZI~(Ye`*Di2do|1Y@;AmeV%o3OjyJ_|hTm?9j<)kInOZP2Q>m5Mg~UKz z%nX#DdtE_5fANmO{bO~a>uv=DgA%(=FE!xeTD{w#l;pqgE3AU%p-@^~=eF|E%S*gN zQAM|39E!dW5D~TJf}w<`UyT`sQpau zMaf`B6y(*^*7npFWa;NEPE9dhB9hvh`xg%-pkwz#Uh#=piSF`4LXq)y#HjJ<8tKFI zzfSvX?X0>YBNNS3jh%w7?HT=?w-?&~LLl?`PANlb%B7$qdT;&qd2#{S%_o}$l#P+- z?qCPqZ?<@$H(v-0eM4j@wF0H5?4zPer`Q6w!wphgi9HUHWz2^zM|X~9Xu3`hzha4c zpjw*p+_PVA?mv*hFYqJu%?JKdeY`4A)&{??KC#Yw=UO$#cFum3L)8F7sAA^61er4P zSi}5zZ)D}bDafUu^<|Tj>t=|E6!D+hbKx2z|FmV3++3q`H|bnwLaq>6!*;$fqDtl- zVgqE$d5l5bV@uria`jhrnK9_iYvJLetb2LgAMQp=8Y07|*+C_%(f)~kOVB)K)C)dPCGnV1U!logkD0)%DpL2gyov(&CV!(TQD^C;p-khw zkYZ+VM9d{!k;c`sw`-(m8CjV2>Kq+P9qDM=c*TMY^TL_)=;p!e`zqrk^~odvM{dVS zyK;0=ybG6lmtUP;-b-I-2tr4Zbn)`^HvhvE)py8vW$Z*mx_uXgFx&6SB&OG(!*1H* zr0YPGt_+F@q>BnKQ=nqF5uLmJTY0R!e%00K;vtd7E+hx)$cKFQXD@tXylfX0DP8F7LZ2vqU3Eg=5>&C-k2zk*&3r#) zL&|h?=z|^!g{IsLk9vC(4=>?79@H9Ipi!@}z;!f?H*j6u1I{F-xLES5qKH6~F9yEnbEq1za{a?l_Qk+I_~cciDOKSJDl&8~a>7KkP8m4f z|42=Es}ZrUc~3zX|L25I-#gn0bnXSeNz*6TMU9obo*M1IE~yh~2srWMS=R4T9MFb2 zvRpuvEh}3V5A2&y+uVrF3X1Zh4+9i@IWX$^y47%ouqe2mpU_zn<+j}dM^b)%)w62_ zxf;EBV{8PsTxEZfrY?FL1+w8)xeZ*RZ6 zv=BB+g(Jz-pa|qg`o4*#v7$Z+fn&5M^Ju(Ke=cq9cu6ghfK-XIzm#$g$@uV0-!MyZI&rV`Z!8PK$6;{ndXs={0 zj*i|oH{+YVd*??dpkz(sE=}J;49<&=3$DM?50kV&%lYnLyY3Ox8|7Yb_ij$OTwIW} z?WjKa9=1`t?XNmvVckT%|I)|shJ*zT51`zzJpULs(Dg}jnfb_ujN?4#i@Z((8f}|1 zEr8Nlqiow&SEx4P4?no{z43B>vFb2$Wm0}>T)vszTV|j?4)2}|P1`R-KHFuw7UA6f z?f!oF-`(N=a)09`u6Gdorg!v|?(@a{T)BD=^BbdHf=!|hJo(>%$9SfWUj_Sv6te=E z=#GDI#ORUTq~ztw8y%5s?+aTxNTzb*KEJ7J^S)6}Mtow-xL2q#7^(01X@zoOUEO>h z-M*)y=wI#A*U7GTTV-f`dE^VD|DX1*J*ufQ+e3mzp&F?VL>{r#mQ^26YBi`p+OZv+ zaWu8AO2G%w+w??IZDYS-wQfQvtQpx>njJk za)e{S`k60DdyA1_GNNa>(Ic--|0neBl%F$uD7+FBUI_}X1ciFgD?#xq5)@vYDlbUzf`tE6kl<~r;cctoZL8sJtKn^{ z;cctoZL8sJtKn^{;cctoZL8sJtKn^{;eA{|5E_GN=_BQ2{@u)QC-CjU5sy_yg~Azh z@pF?ykx8Wv=Hp-Ql~Z#&=O4XxCLD&Q$|E`*eFL#YC2kBTzkkk{r;}~wp>W5d$Ycfe>;MO{ND;C%92D?=bmQUvb=@{m)IEJYG6rf zl{fi4$Ne!vqU-I|C35TaG~i3tK4nChzx*=i>gAazayK}G(6kdxUOjOJO1>AIgpAkV zE(GpAubYmw9b%3BKCAI1Xep;Me9jE6=xqw#miM(h4tqkD7#s4N*8*8?U?*RL@+Y&q z^3w<+yDy~%iWlPp4A74hCuz;I*M_fek`BnEUVeNTd}`s5DJNZp(lZ4p-0vSWD_PHMvY1S z{0ZabwCD?O%??L1u1=hZ_*i>PuWN7$ccmH_Q=;k{A=Om$L27qjOI{^jDgIn_`(~aW zw+>2>(|iQnM~y_P+V$bK*=K+DL8vsLzOd0L>1hQBi{IC$>=zC0Ph%aeWI7%xxW z6D=ePU5A)fE!2bxJwT?t5as-y2ILaw1hp~j+L4iyQ^GYn!_AlV*fHkpqASH_SfV*- z{{2p0_dpi^L(YyqRX`Bm2`yGXXSnJs)!8&xuWT#}VOMO~A2~~A0ilOgP^TQ_yqw_6 zQyP6DQt7FOWl#v*rMh2Xy?IRS&X!e}byYI$Zp3n+vS-U8{s`UuD2v~p$k5#rOyt`F zWCmV5Fp~yT;s?`YBi-|V!PfSaqn|C9JO}+-0)ZZ~B=?ZWydnzvH<}X5{_MFUvOMfw z8Nzf!uVd7({<&FGTerOI_pNe=vOUE*La0GM`)blGqA_nT@W!5-PCPxBj2>tTc!gl} zK`&NLn~r|5Xd-E<(_D6{@sF>>W~VcFG9R?5GH@7^lx)n>Eq9~DB_NdD@g|!UkB2Wrz>6T%u z1njy--*L(X)cMEb27?#aSDk)V@4?jq0gtukJ77~wbd=48M6{LIL`qk(PGf#NI~~f33HZPQ-K>( z8^eEuB6bC^RJk^k4=uXgWA)q?6Z_W-!C7MqM6aRmY!96EVok2JtC-h8;@0RrW+pJc zuxY<22W9R@3pPx92OS|#c!_|HphxBgq6nd2qFgtr#J(6qEW`YsdRJwv z?PwG`3mCF=4;00x`ryUf!TT@<)~?Wh)W8Vi-ucNPXk_#>`ZT;v=y>DetVWb`OzxA@yEkNx-{C~|CAqY2O&o|~j8WI%ozG)p z-tTxl1@>b=X0>uMMrPX!-O|^wost{m4J7nBRL%!$(h2 zC%%9hsS{@qOSNkB@?!t61r_SraLa2f%Pz_oRC$l!1PME|DZNQT49cDit-8Idy$hHb zm$U<@hwVS-P2A{yyBeJn$#IH3Hk{prfm!`P<luwx;F0JxEO9*~DRoC-ii&>rUyh3qh!?;w1Hl8uvL4=30XLW>n*|Z|u2Uneww}YF4in8^TEQeP=UX zuYEN%G}PdekdP27C@h@k4k+(93s~UDBvKe7WiC7L+l|GEy!J$%IE_P%bl!xGzj=S< zP7cR8lWCj@e7&Lro#2|NKpI@@O1p?|o6aLSMzFWv; zAlmD@?%$7Dv0{Ai+cTCOMQ-JD@cPzoOae}IK_0Y}vr zkV8!vkoVV9%W1s`{e!V49KN<-x zUuFUSRajD91?odCy9pZU>Ycv_*aY9McR2>TvkPz(omWfcW_|^n8?^&SxYt-Xcd-W= zC&SmFb@uci+&e*7t^z+pJuKHiodOjb(s*L~wPXvr_2%3>23z4D0{+ zc8UWyGAD&trx0XnZrV+QGEIPV?h+Y3fR6xmnSmgF9`GVn#qO(;YO7#aQax}owVsC% z+hIPe$h{!mz0B~jFGLQ?H=?8xUR?sWu87xFg!8d(4-5>1$c!OKTLSOQeDvNS-%tdh zz=9Nkd!_ZiLIB;a4<3A6q6VxP@1~1r_^3Ych%vq z;IchNkfahvUIHSFXQ=@nlX6Q+b0hGb-0&_xvf)foY(J3Ma~qQV3LI@k?z?2{E(9=? zU!RC@>*rDIt2H~~2X^ocBxITmnx^LhpGt}QzShpY7T^`d>20UH484ZUo5BYorgM6EV>D<{P3Zrf8^frrkm>z7`OQh~6?p zr3*nOVS2gG$vE5$p9zR zQicd-QH_*uG9G;ZI#)cktfx`ZgKsBZC*%!<6zoF{{_TrCa^RB)$W`P5645Y(5;d5Y zlXb1h1v@4izZkz*oUyP#2+f!&{5u;8MsXv!21$c^2wzJX$j1x>E7%QS6;aaq&DFri z>k^fB@IlOLx(%3O%`mq#iC*ed;nrKg(LHgx`x&}^SS0BaeC5Ki#|h{?KmQQqJrQx74S62XAbbx&({WJ@1s ztMqVu5g^qBz)l1jF#pp*`7#5(!Er;*;@!`R8@oux@O>cFAAwc)s0PNrC;su9WC!wy z?*5Ag_+NC&*cYTQ8b6fXtmLjO5Tcw)l!%*CyzK^AYU$c@L<#2WyI*4Nz_)p|RmG9v zKIvh7Hf(s73;x{gzJC>eryaLKd@lk=xi;K!H_LrX;99M={>*XW0(UugrBl$m zZ_k;4!1rQW9T4gJfTRbMr(%Lwm7xVs^+QQXi4xRD{`yyHMj@3@VE7~gkR-3QTk-(- zZ~2>47`QHKd@m5Xi}2puHn6+v+EPv# zl~ZPA3#>6QF}61Ffq;IQ_M=g@qwozSb}-&4)E)!w+$heg6epx-eL~Z6Vaib36)*_p zAisz%oCxHlcs+2;UONVws-O1%DZLwDSOF;_rQ6#TEjMaM7%6{N}Wn z7`8;ok>Fl9uX$GuZV$w9=K#Lt6diH2GW(X27=_yFoqHSpJ{h0*bi3B5hMQG;n+b49}Cu!`gG@tlU7*ZDhaaK$I z$}|X$cu>rMsa&EHZ;1qluf|DzX=`2)_k7$q0u0Hzh>OBWTo9h4tH`*S3;)cS$^Wfxc&?A%x|^Ck}Vtcz=1B3AQN)SCE3rqLmjjZtmrg+&=*pPdl2tHFyT{j}*gma=tDL zrgGuh)`Pm9N^NP?DbjZ!@n+qEVCLAG*VlqKv^G=KO{NsfaHpLsl}MT~i`AM~+zvp3 zefWdfIxzm+{nw8>!{8@8ykL3Cr^xN3@)d~Nb&{&OmAwl=z^~@R%N_=Bk?}o@vR2P| zIoj{vK}z#{#fEx9JyWQF_CYX9%yLck{Ch(@k3* zqj?G<;gHIc^t|FlT>_}8zUdo&BYWV(+3a;$+NBCb#s&7egxVS;@9gqFO;=pmIkgov zhJ!fF8;5)+vnIS@h_c^gIxZ#f26pcUP#|dms%I1sZi#9$SQ#i(j+KA_CF<%?@LUhl zOg>DqY-Amr=gBwGhW zuU3eFi*s@U*M;u$KN>U?1xSqUd?MuANpX*>)LKboco?q+f_9%y>Rg2wNR)%4kAmP3 zK~*NU?uQuDqZhGc*b=^FcTvYw~S8aI1PMO6f_q2g>0=2raYPF*Tc5gSJQwY8?KET*A@m49Asg`o07%3!Iw)7}JOB_vir zL6qR&tT?L2V8;dlf|hyU^d=i(Kjq+1TO#HVi8ikk%RCX_1qb$88lo)QDdy{_EygA|L$B^|xY&n}T)LGfoh2gk` zo=7swb`FpO#Z^Wl@{NG^5eXn&UAG!J4(_TDFx5V(J$D~bZ6qOcpU46EGPDb&+t0nM zvr-{j=z=^2$>;4j&ydfo$5 z`su;HI1BMWZ`8YWIS>m(u(T7ZSS*pq+z&9Gj=-7Jahanyfyr6?>NQKe$ng!+37L!a z(i&%RyTD}^ioTv~lj0$XTZy2~0Z4?&b_l8`BVvy@aj{NaTbEU$aN_o#$Tnos>|i0f zHE1a<^#sY*OST=RvYU3Ov{kZhLn17NQa8+Pginz?HDuRAxZ39GM{C?YYWKcIS93&s zpbh>QFR`R{@Y0D~L#A^RQwKP04D3TlvK7lR#>$mBzOqonld|59o+yzx)A+Cwb|GSe z1Fj%Rb2qof%432U>5YsjTdK-Tryzr>NeV?CE8Nf7@Zk%%kOK@FMmA#Q>#sxHtu-ST8ut=K zp2rD95r8{_m|1-bD@e60GF)J~`+M|>kb_$JpC|VEGIVD*k6ValLs992PG830dI4d7 z9O7Qg9J(aMz+yHddTV5OxYP(Jh!tl%PNt;{+~00YXW7qs4k))$ESa=P)vip6>-PfQ zqNiaGy`q~m1EB@o2w1vP+K*>~_#CvrVU1E^T1lkl$0R%Jv#SykYSgM^k^yf1X~(*K z`*|EGbv3eo5tb}B&C?781})1!x1V@6h2OdCtA??*hzQY z7FMV39xMcypwQ`&-YD$HTsUzHol>g=i5Bd35%)oI2l8n# zRyd5<0kE-#0_Z~uKG^b`mphdmRH=SavRGr{8$ogtwmcF7Su5<1RvJ&v!a9nCE3I?L z2s`o4w;Q*`oq9py$_ziKxU@zM`#0c3iLcNCc_{9wnFd(>yGwR6hQ7|NP-|%e(KSJE zcpdvh#i8}VL0=h|>Aa(ZgJz29TxR=FCZZwnAHiCdA-X}wCT8yqGUMO__}DAaq~dlh z9H5Bow-Q>ePi1Q%ht%5(X&L`KoWCdNk$3=eLr@k}X-mltw;q@Bfk2T5X^z4J5`~u_ zF%FU$8}u0>>*+d^DH}52nm$NCGo>D9PiSPNND$XYx%ANhdn%mOtt z0fgkM<#ND{yCK~ePf(ffc~V}eQI9TmEi7p;-t6t2A{UtSDX9peI@ApZw%yE3Tr!tU6gRD(S2^EJT$(w-i>dU7&}PyYvG<`BJXT!f#x&GY@< gJ!#S`Tf#R%o7e&GzFzMGKYw_8-CL!<+jjK70d=_$EdT%j diff --git a/zk_prover/src/chips/merkle_sum_tree.rs b/zk_prover/src/chips/merkle_sum_tree.rs index e47bdd68..ffca1a4a 100644 --- a/zk_prover/src/chips/merkle_sum_tree.rs +++ b/zk_prover/src/chips/merkle_sum_tree.rs @@ -1,4 +1,4 @@ -use halo2_proofs::circuit::{AssignedCell, Layouter, Value}; +use halo2_proofs::circuit::{AssignedCell, Layouter}; use halo2_proofs::halo2curves::bn256::Fr as Fp; use halo2_proofs::plonk::{Advice, Column, ConstraintSystem, Error, Expression, Selector}; use halo2_proofs::poly::Rotation; @@ -88,19 +88,21 @@ impl MerkleSumTreeChip { } } - /// Assign the hashes for node in a region following this layout on 3 advice columns: + /// Swap the values of two cells in a region following this layout on 3 advice columns: /// /// | a | b | c | /// | ------------ | ------------- | ---------- | - /// | `current_hash` | `element_hash` | `swap_bit` | - /// | `current_hash` | `element_hash` | - | + /// | `current_hash` | `sibling_hash` | `1` | + /// | `sibling_hash` | `current_hash` | - | /// /// At row 0 bool_and_swap_selector is enabled - pub fn assign_nodes_hashes_per_level( + /// If swap_bit is 0, the values will remain the same on the next row + /// If swap_bit is 1, the values will be swapped on the next row + pub fn swap_hashes_per_level( &self, mut layouter: impl Layouter, current_hash: &AssignedCell, - element_hash: Fp, + sibling_hash: &AssignedCell, swap_bit_assigned: &AssignedCell, ) -> Result<(AssignedCell, AssignedCell), Error> { layouter.assign_region( @@ -118,11 +120,11 @@ impl MerkleSumTreeChip { )?; // assign the element hash to the column self.config.advice[1] at offset 0 - let r1 = region.assign_advice( - || "element hash", + let r1 = sibling_hash.copy_advice( + || "copy element hash from assigned value", + &mut region, self.config.advice[1], 0, - || Value::known(element_hash), )?; // assign the swap_bit to the column self.config.advice[2] at offset 0 @@ -171,16 +173,18 @@ impl MerkleSumTreeChip { /// /// | a | b | c | /// | ------------ | ------------- | ---------- | - /// | `current_balance` | `element_balance` | `swap_bit` | + /// | `current_balance` | `element_balance` | `0` | /// | `current_balance` | `element_balance` | `sum` | /// /// At row 0 bool_and_swap_selector is enabled. /// At row 1 sum_selector is enabled - pub fn assign_nodes_balance_per_asset( + /// If swap_bit is 0, the values will remain the same on the next row + /// If swap_bit is 1, the values will be swapped on the next row + pub fn swap_balances_per_level( &self, mut layouter: impl Layouter, current_balance: &AssignedCell, - element_balance: Fp, + element_balance: &AssignedCell, swap_bit_assigned: &AssignedCell, ) -> Result< ( @@ -205,11 +209,11 @@ impl MerkleSumTreeChip { )?; // assign the element_balance to the column self.config.advice[1] at offset 0 - let r1 = region.assign_advice( + let r1 = element_balance.copy_advice( || "element balance", + &mut region, self.config.advice[1], 0, - || Value::known(element_balance), )?; // assign the swap_bit to the column self.config.advice[2] at offset 0 diff --git a/zk_prover/src/circuits/merkle_sum_tree.rs b/zk_prover/src/circuits/merkle_sum_tree.rs index 8cbe13d0..75a37c30 100644 --- a/zk_prover/src/circuits/merkle_sum_tree.rs +++ b/zk_prover/src/circuits/merkle_sum_tree.rs @@ -3,7 +3,8 @@ use crate::chips::poseidon::hash::{PoseidonChip, PoseidonConfig}; use crate::chips::poseidon::poseidon_spec::PoseidonSpec; use crate::chips::range::range_check::{RangeCheckChip, RangeCheckConfig}; use crate::circuits::traits::CircuitBase; -use crate::merkle_sum_tree::{big_uint_to_fp, Entry, MerkleProof, Node}; +use crate::merkle_sum_tree::utils::big_uint_to_fp; +use crate::merkle_sum_tree::{Entry, MerkleProof, Node}; use halo2_proofs::circuit::{AssignedCell, Layouter, SimpleFloorPlanner}; use halo2_proofs::halo2curves::bn256::Fr as Fp; use halo2_proofs::plonk::{ @@ -11,7 +12,7 @@ use halo2_proofs::plonk::{ }; use snark_verifier_sdk::CircuitExt; -/// Circuit for verifying inclusion of a leaf_hash inside a merkle sum tree with a given root. +/// Circuit for verifying inclusion of an entry (username, balances) inside a merkle sum tree with a given root. /// /// # Type Parameters /// @@ -22,23 +23,28 @@ use snark_verifier_sdk::CircuitExt; /// # Fields /// /// * `entry`: The entry to be verified inclusion of. -/// * `path_element_hashes`: The hashes of the path elements from the leaf to root. The length of this vector is LEVELS -/// * `path_element_balances`: The balances of the path elements from the leaf to the root. The length of this vector is LEVELS /// * `path_indices`: The boolean indices of the path elements from the leaf to the root. 0 indicates that the element is on the right to the path, 1 indicates that the element is on the left to the path. The length of this vector is LEVELS +/// * `sibling_leaf_node_hash_preimage`: The preimage of the hash that corresponds to the Sibling Leaf Node (part of the Merkle Proof). +/// * `sibling_middle_node_hash_preimages`: The preimages of the hashes that corresponds to the Sibling Middle Nodes (part of the Merkle Proof). +/// * `root`: The root of the Merkle Sum Tree #[derive(Clone)] -pub struct MstInclusionCircuit { +pub struct MstInclusionCircuit +where + [usize; N_ASSETS + 1]: Sized, + [usize; N_ASSETS + 2]: Sized, +{ pub entry: Entry, - pub path_element_hashes: Vec, - pub path_element_balances: Vec<[Fp; N_ASSETS]>, pub path_indices: Vec, + pub sibling_leaf_node_hash_preimage: [Fp; N_ASSETS + 1], + pub sibling_middle_node_hash_preimages: Vec<[Fp; N_ASSETS + 2]>, pub root: Node, } impl CircuitExt for MstInclusionCircuit where - [usize; 2 * (1 + N_ASSETS)]: Sized, [usize; N_ASSETS + 1]: Sized, + [usize; N_ASSETS + 2]: Sized, { /// Returns the number of public inputs of the circuit. It is {2 + N_ASSETS}, namely the leaf hash to be verified inclusion of, the root hash of the merkle sum tree and the root balances of the merkle sum tree. fn num_instance(&self) -> Vec { @@ -54,6 +60,9 @@ where impl CircuitBase for MstInclusionCircuit +where + [usize; N_ASSETS + 1]: Sized, + [usize; N_ASSETS + 2]: Sized, { } @@ -61,34 +70,34 @@ impl MstInclusionCircuit where [usize; N_ASSETS + 1]: Sized, + [usize; N_ASSETS + 2]: Sized, { pub fn init_empty() -> Self { Self { entry: Entry::init_empty(), - path_element_hashes: vec![Fp::zero(); LEVELS], - path_element_balances: vec![[Fp::zero(); N_ASSETS]; LEVELS], path_indices: vec![Fp::zero(); LEVELS], + sibling_leaf_node_hash_preimage: [Fp::zero(); N_ASSETS + 1], + sibling_middle_node_hash_preimages: vec![[Fp::zero(); N_ASSETS + 2]; LEVELS], root: Node::init_empty(), } } /// Initializes the circuit with the merkle proof and the entry of the user of which the inclusion is to be verified. - pub fn init(merkle_proof: MerkleProof, entry: Entry) -> Self + pub fn init(merkle_proof: MerkleProof) -> Self where - [usize; N_ASSETS + 1]:, + [usize; N_ASSETS + 1]: Sized, + [usize; N_ASSETS + 2]: Sized, { assert_eq!(merkle_proof.path_indices.len(), LEVELS); - assert_eq!(merkle_proof.sibling_hashes.len(), LEVELS); - assert_eq!(merkle_proof.sibling_sums.len(), LEVELS); - - // assert that the entry leaf hash matches the leaf hash in the merkle proof - assert_eq!(merkle_proof.leaf.hash, entry.compute_leaf().hash); - + assert_eq!( + merkle_proof.sibling_middle_node_hash_preimages.len(), + LEVELS - 1 + ); Self { - entry, - path_element_hashes: merkle_proof.sibling_hashes, - path_element_balances: merkle_proof.sibling_sums, + entry: merkle_proof.entry, path_indices: merkle_proof.path_indices, + sibling_leaf_node_hash_preimage: merkle_proof.sibling_leaf_node_hash_preimage, + sibling_middle_node_hash_preimages: merkle_proof.sibling_middle_node_hash_preimages, root: merkle_proof.root, } } @@ -103,19 +112,21 @@ where /// # Fields /// /// * `merkle_sum_tree_config`: Configuration for the merkle sum tree -/// * `poseidon_entry_config`: Configuration for the poseidon hash function with WIDTH = 2 and RATE = 1 and input length of 1 + N_ASSETS. Needed to perform the hashing from the entry to the leaf. -/// * `poseidon_middle_config`: Configuration for the poseidon hash function with WIDTH = 2 and RATE = 1 and input length of 2 * (1 + N_ASSETS). Needed to perform hashings from the leaf to the root. +/// * `poseidon_entry_config`: Configuration for the poseidon hash function with WIDTH = 2 and RATE = 1 and input length of N_ASSETS + 1. Needed to perform the hashing from the entry to the leaf. +/// * `poseidon_middle_config`: Configuration for the poseidon hash function with WIDTH = 2 and RATE = 1 and input length of N_ASSETS + 2. Needed to perform hashings from the leaf to the root. /// * `range_check_config`: Configuration for the range check chip /// * `instance`: Instance column used to store the public inputs +/// * `advices`: Advice columns used to store the private inputs #[derive(Debug, Clone)] pub struct MstInclusionConfig where - [usize; 2 * (1 + N_ASSETS)]: Sized, + [usize; N_ASSETS + 1]: Sized, + [usize; N_ASSETS + 2]: Sized, { merkle_sum_tree_config: MerkleSumTreeConfig, - poseidon_entry_config: PoseidonConfig<2, 1, { 1 + N_ASSETS }>, - poseidon_middle_config: PoseidonConfig<2, 1, { 2 * (1 + N_ASSETS) }>, + poseidon_entry_config: PoseidonConfig<2, 1, { N_ASSETS + 1 }>, + poseidon_middle_config: PoseidonConfig<2, 1, { N_ASSETS + 2 }>, range_check_config: RangeCheckConfig, instance: Column, advices: [Column; 3], @@ -123,7 +134,8 @@ where impl MstInclusionConfig where - [usize; 2 * (1 + N_ASSETS)]: Sized, + [usize; N_ASSETS + 1]: Sized, + [usize; N_ASSETS + 2]: Sized, { pub fn configure(meta: &mut ConstraintSystem) -> Self { // the max number of advices columns needed is WIDTH + 1 given requirement of the poseidon config @@ -141,7 +153,7 @@ where // enable constant for the fixed_column[2], this is required for the poseidon chip and the range check chip meta.enable_constant(fixed_columns[2]); - let poseidon_entry_config = PoseidonChip::::configure( + let poseidon_entry_config = PoseidonChip::::configure( meta, advices[0..2].try_into().unwrap(), advices[2], @@ -151,7 +163,7 @@ where // in fact, the poseidon config requires #WIDTH advice columns for state and 1 for partial_sbox, #WIDTH fixed columns for rc_a and #WIDTH for rc_b let poseidon_middle_config = - PoseidonChip::::configure( + PoseidonChip::::configure( meta, advices[0..2].try_into().unwrap(), advices[2], @@ -196,7 +208,7 @@ impl Circuit where [usize; N_ASSETS + 1]: Sized, - [usize; 2 * (1 + N_ASSETS)]: Sized, + [usize; N_ASSETS + 2]: Sized, { type Config = MstInclusionConfig; type FloorPlanner = SimpleFloorPlanner; @@ -219,18 +231,17 @@ where let merkle_sum_tree_chip = MerkleSumTreeChip::::construct(config.merkle_sum_tree_config); - let poseidon_entry_chip = PoseidonChip::::construct( + let poseidon_entry_chip = PoseidonChip::::construct( config.poseidon_entry_config, ); - let poseidon_middle_chip = - PoseidonChip::::construct( - config.poseidon_middle_config, - ); + let poseidon_middle_chip = PoseidonChip::::construct( + config.poseidon_middle_config, + ); let range_check_chip = RangeCheckChip::::construct(config.range_check_config); - // Assign the entry username + // Assign the entry username to the witness let username = self.assign_value_to_witness( layouter.namespace(|| "assign entry username"), big_uint_to_fp(self.entry.username_as_big_uint()), @@ -238,7 +249,7 @@ where config.advices[0], )?; - // Assign the entry balances + // Assign the entry balances to the witness let mut current_balances = vec![]; for i in 0..N_ASSETS { @@ -252,14 +263,14 @@ where } // Perform the hashing to username and balances to obtain the leaf hash - // create an hash_input array of length 1 + N_ASSETS that contains the entry username and the entry balances + // create an hash_input array of length N_ASSETS + 1 that contains the entry username and the entry balances let entry_hasher_input_vec: Vec> = [username] .iter() .chain(current_balances.iter()) .map(|x| x.to_owned()) .collect(); - let entry_hasher_input: [AssignedCell; 1 + N_ASSETS] = + let entry_hasher_input: [AssignedCell; N_ASSETS + 1] = match entry_hasher_input_vec.try_into() { Ok(arr) => arr, Err(_) => panic!("Failed to convert Vec to Array"), @@ -285,7 +296,107 @@ where for level in 0..LEVELS { let namespace_prefix = format!("level {}", level); - // For each level assign the index to the circuit + let sibling_hash: AssignedCell; // hash of the sibling node + let mut sibling_balances: Vec> = vec![]; // balances of the sibling node + + // Perform the hashing of sibling leaf hash preimage to obtain the sibling leaf hash + if level == 0 { + // Assign username from sibling leaf node hash preimage to the circuit + let sibling_leaf_node_username = self.assign_value_to_witness( + layouter.namespace(|| format!("sibling leaf node username")), + self.sibling_leaf_node_hash_preimage[0], + "sibling leaf node username", + config.advices[0], + )?; + + // Assign balances from sibling leaf node hash preimage to the circuit + for asset in 0..N_ASSETS { + let leaf_node_sibling_balance = self.assign_value_to_witness( + layouter.namespace(|| format!("sibling leaf node balance {}", asset)), + self.sibling_leaf_node_hash_preimage[asset + 1], + "sibling leaf balance", + config.advices[1], + )?; + sibling_balances.push(leaf_node_sibling_balance); + } + + // create an hash_input array of length N_ASSETS + 1 that contains the sibling_leaf_node_username and the sibling_balances (the sibling leaf node hash preimage) + let sibling_hasher_input_vec: Vec> = + [sibling_leaf_node_username] + .iter() + .chain(sibling_balances.iter()) + .map(|x| x.to_owned()) + .collect(); + + let sibling_hasher_input: [AssignedCell; N_ASSETS + 1] = + match sibling_hasher_input_vec.try_into() { + Ok(arr) => arr, + Err(_) => panic!("Failed to convert Vec to Array"), + }; + + // compute the sibling hash + let computed_sibling_hash = poseidon_entry_chip.hash( + layouter.namespace(|| format!("{}: perform poseidon hash", namespace_prefix)), + sibling_hasher_input, + )?; + + sibling_hash = computed_sibling_hash; + } + // Other levels + // Assign sibling node hash preimage to the circuit (split it in balances, left child hash and right child hash) + // Perform the hashing of sibling node hash preimage to obtain the sibling node hash + else { + // Assign balances from sibling middle node hash preimage to the circuit + for asset in 0..N_ASSETS { + let middle_node_sibling_balance = self.assign_value_to_witness( + layouter.namespace(|| format!("sibling node balance {}", asset)), + self.sibling_middle_node_hash_preimages[level - 1][asset], + "sibling node balance", + config.advices[1], + )?; + sibling_balances.push(middle_node_sibling_balance); + } + + // Assign middle_node_sibling_child_left_hash from middle node hash preimage to the circuit + let middle_node_sibling_child_left_hash = self.assign_value_to_witness( + layouter.namespace(|| format!("sibling left hash")), + self.sibling_middle_node_hash_preimages[level - 1][N_ASSETS], + "sibling left hash", + config.advices[2], + )?; + + // Assign middle_node_sibling_child_right_hash from middle node hash preimage to the circuit + let middle_node_sibling_child_right_hash = self.assign_value_to_witness( + layouter.namespace(|| format!("sibling right hash")), + self.sibling_middle_node_hash_preimages[level - 1][N_ASSETS + 1], + "sibling right hash", + config.advices[2], + )?; + + // create an hash_input array of length 2 + N_ASSETS that contains the sibling balances, the middle_node_sibling_child_left_hash and the middle_node_sibling_child_right_hash + let sibling_hasher_input_vec: Vec> = sibling_balances + .iter() + .chain([middle_node_sibling_child_left_hash].iter()) + .chain([middle_node_sibling_child_right_hash].iter()) + .map(|x| x.to_owned()) + .collect(); + + let sibling_hasher_input: [AssignedCell; N_ASSETS + 2] = + match sibling_hasher_input_vec.try_into() { + Ok(arr) => arr, + Err(_) => panic!("Failed to convert Vec to Array"), + }; + + // compute the sibling hash + let computed_sibling_hash = poseidon_middle_chip.hash( + layouter.namespace(|| format!("{}: perform poseidon hash", namespace_prefix)), + sibling_hasher_input, + )?; + + sibling_hash = computed_sibling_hash; + }; + + // For each level assign the swap bit to the circuit let swap_bit_level = self.assign_value_to_witness( layouter.namespace(|| format!("{}: assign swap bit", namespace_prefix)), self.path_indices[level], @@ -293,12 +404,12 @@ where config.advices[0], )?; - // For each level assign the hashes to the circuit + // For every level, perform the swap of the hashes (between `current_hash` and `sibling_hash`) according to the swap bit let (hash_left_current, hash_right_current) = merkle_sum_tree_chip - .assign_nodes_hashes_per_level( - layouter.namespace(|| format!("{}: assign nodes hashes", namespace_prefix)), + .swap_hashes_per_level( + layouter.namespace(|| format!("{}: swap hashes", namespace_prefix)), ¤t_hash, - self.path_element_hashes[level], + &sibling_hash, &swap_bit_level, )?; @@ -306,10 +417,10 @@ where let mut left_balances = vec![]; let mut right_balances = vec![]; - // Within each level, assign the balances to the circuit per asset + // For every level, perform the swap of the balances (between `current_balances` and `sibling_balances`) according to the swap bit for asset in 0..N_ASSETS { let (left_balance, right_balance, next_balance) = merkle_sum_tree_chip - .assign_nodes_balance_per_asset( + .swap_balances_per_level( layouter.namespace(|| { format!( "{}: asset {}: assign nodes balance", @@ -317,7 +428,7 @@ where ) }), ¤t_balances[asset], - self.path_element_balances[level][asset], + &sibling_balances[asset], &swap_bit_level, )?; @@ -346,16 +457,15 @@ where right_balances.push(right_balance); } - // create an hash_input array of length 2 * (1 + N_ASSETS) that contains the left hash, the left balances, the right hash and the right balances - let middle_hasher_input_vec: Vec> = [hash_left_current] + // create an hash_input array of length N_ASSETS + 2 that contains the next balances, the left hash and the right hash + let middle_hasher_input_vec: Vec> = next_balances .iter() - .chain(left_balances.iter()) + .chain([hash_left_current].iter()) .chain([hash_right_current].iter()) - .chain(right_balances.iter()) .map(|x| x.to_owned()) .collect(); - let middle_hasher_input: [AssignedCell; 2 * (1 + N_ASSETS)] = + let middle_hasher_input: [AssignedCell; N_ASSETS + 2] = match middle_hasher_input_vec.try_into() { Ok(arr) => arr, Err(_) => panic!("Failed to convert Vec to Array"), diff --git a/zk_prover/src/circuits/tests.rs b/zk_prover/src/circuits/tests.rs index 183868cc..9b35d33f 100644 --- a/zk_prover/src/circuits/tests.rs +++ b/zk_prover/src/circuits/tests.rs @@ -7,14 +7,14 @@ mod test { merkle_sum_tree::MstInclusionCircuit, utils::{full_prover, full_verifier, generate_setup_artifacts}, }, - merkle_sum_tree::{big_uint_to_fp, Entry}, + merkle_sum_tree::Entry, }; use halo2_proofs::{ dev::{FailureLocation, MockProver, VerifyFailure}, halo2curves::bn256::Fr as Fp, plonk::Any, }; - use num_bigint::{BigUint, ToBigUint}; + use num_bigint::ToBigUint; use snark_verifier_sdk::CircuitExt; const N_ASSETS: usize = 2; @@ -31,12 +31,8 @@ mod test { for user_index in 0..16 { // get proof for entry ˆuser_indexˆ let merkle_proof = merkle_sum_tree.generate_proof(user_index).unwrap(); - let user_entry = merkle_sum_tree.get_entry(user_index); - let circuit = MstInclusionCircuit::::init( - merkle_proof, - user_entry.clone(), - ); + let circuit = MstInclusionCircuit::::init(merkle_proof); let valid_prover = MockProver::run(K, &circuit, circuit.instances()).unwrap(); @@ -69,10 +65,7 @@ mod test { let user_entry = merkle_sum_tree.get_entry(user_index); // Only now we can instantiate the circuit with the actual inputs - let circuit = MstInclusionCircuit::::init( - merkle_proof, - user_entry.clone(), - ); + let circuit = MstInclusionCircuit::::init(merkle_proof); // Generate the proof let proof = full_prover(¶ms, &pk, circuit.clone(), circuit.instances()); @@ -105,12 +98,8 @@ mod test { let user_index = 0; let merkle_proof = merkle_sum_tree.generate_proof(user_index).unwrap(); - let user_entry = merkle_sum_tree.get_entry(user_index); - let circuit = MstInclusionCircuit::::init( - merkle_proof, - user_entry.clone(), - ); + let circuit = MstInclusionCircuit::::init(merkle_proof); let mut instances = circuit.instances(); let invalid_root_hash = Fp::from(1000u64); @@ -124,7 +113,7 @@ mod test { VerifyFailure::Permutation { column: (Any::advice(), 0).into(), location: FailureLocation::InRegion { - region: (94, "permute state").into(), + region: (127, "permute state").into(), offset: 36 } }, @@ -150,13 +139,9 @@ mod test { let user_index = 0; let merkle_proof = merkle_sum_tree.generate_proof(user_index).unwrap(); - let user_entry = merkle_sum_tree.get_entry(user_index); // Only now we can instantiate the circuit with the actual inputs - let circuit = MstInclusionCircuit::::init( - merkle_proof, - user_entry.clone(), - ); + let circuit = MstInclusionCircuit::::init(merkle_proof); let invalid_root_hash = Fp::from(1000u64); @@ -183,13 +168,9 @@ mod test { let user_index = 0; let merkle_proof = merkle_sum_tree.generate_proof(user_index).unwrap(); - let user_entry = merkle_sum_tree.get_entry(user_index); // Only now we can instantiate the circuit with the actual inputs - let mut circuit = MstInclusionCircuit::::init( - merkle_proof, - user_entry.clone(), - ); + let mut circuit = MstInclusionCircuit::::init(merkle_proof); let instances = circuit.instances(); @@ -208,28 +189,28 @@ mod test { VerifyFailure::Permutation { column: (Any::advice(), 0).into(), location: FailureLocation::InRegion { - region: (12, "assign nodes hashes per merkle tree level").into(), + region: (22, "assign nodes hashes per merkle tree level").into(), offset: 0 } }, VerifyFailure::Permutation { column: (Any::advice(), 0).into(), location: FailureLocation::InRegion { - region: (94, "permute state").into(), + region: (127, "permute state").into(), offset: 36 } }, VerifyFailure::Permutation { column: (Any::advice(), 0).into(), location: FailureLocation::InRegion { - region: (95, "assign value to perform range check").into(), + region: (128, "assign value to perform range check").into(), offset: 0 } }, VerifyFailure::Permutation { column: (Any::advice(), 0).into(), location: FailureLocation::InRegion { - region: (96, "assign value to perform range check").into(), + region: (129, "assign value to perform range check").into(), offset: 0 } }, @@ -263,13 +244,9 @@ mod test { let user_index = 0; let merkle_proof = merkle_sum_tree.generate_proof(user_index).unwrap(); - let user_entry = merkle_sum_tree.get_entry(user_index); // Only now we can instantiate the circuit with the actual inputs - let circuit = MstInclusionCircuit::::init( - merkle_proof, - user_entry.clone(), - ); + let circuit = MstInclusionCircuit::::init(merkle_proof); let mut instances = circuit.instances(); let invalid_leaf_hash = Fp::from(1000u64); @@ -283,7 +260,7 @@ mod test { VerifyFailure::Permutation { column: (Any::advice(), 0).into(), location: FailureLocation::InRegion { - region: (12, "assign nodes hashes per merkle tree level").into(), + region: (22, "assign nodes hashes per merkle tree level").into(), offset: 0 } }, @@ -305,13 +282,9 @@ mod test { let user_index = 0; let merkle_proof = merkle_sum_tree.generate_proof(user_index).unwrap(); - let user_entry = merkle_sum_tree.get_entry(user_index); // Only now we can instantiate the circuit with the actual inputs - let mut circuit = MstInclusionCircuit::::init( - merkle_proof, - user_entry.clone(), - ); + let mut circuit = MstInclusionCircuit::::init(merkle_proof); let instances = circuit.instances(); @@ -326,7 +299,7 @@ mod test { VerifyFailure::ConstraintNotSatisfied { constraint: ((6, "bool constraint").into(), 0, "").into(), location: FailureLocation::InRegion { - region: (12, "assign nodes hashes per merkle tree level").into(), + region: (22, "assign nodes hashes per merkle tree level").into(), offset: 0 }, cell_values: vec![(((Any::advice(), 2).into(), 0).into(), "0x2".to_string()),] @@ -334,7 +307,7 @@ mod test { VerifyFailure::ConstraintNotSatisfied { constraint: ((6, "bool constraint").into(), 0, "").into(), location: FailureLocation::InRegion { - region: (13, "assign nodes balances per asset").into(), + region: (23, "assign nodes balances per asset").into(), offset: 0 }, cell_values: vec![(((Any::advice(), 2).into(), 0).into(), "0x2".to_string()),] @@ -342,7 +315,7 @@ mod test { VerifyFailure::ConstraintNotSatisfied { constraint: ((6, "bool constraint").into(), 0, "").into(), location: FailureLocation::InRegion { - region: (16, "assign nodes balances per asset").into(), + region: (26, "assign nodes balances per asset").into(), offset: 0 }, cell_values: vec![(((Any::advice(), 2).into(), 0).into(), "0x2".to_string()),] @@ -350,7 +323,7 @@ mod test { VerifyFailure::ConstraintNotSatisfied { constraint: ((7, "swap constraint").into(), 0, "").into(), location: FailureLocation::InRegion { - region: (12, "assign nodes hashes per merkle tree level").into(), + region: (22, "assign nodes hashes per merkle tree level").into(), offset: 0 }, cell_values: vec![ @@ -380,7 +353,7 @@ mod test { VerifyFailure::ConstraintNotSatisfied { constraint: ((7, "swap constraint").into(), 0, "").into(), location: FailureLocation::InRegion { - region: (13, "assign nodes balances per asset").into(), + region: (23, "assign nodes balances per asset").into(), offset: 0 }, cell_values: vec![ @@ -394,7 +367,7 @@ mod test { VerifyFailure::ConstraintNotSatisfied { constraint: ((7, "swap constraint").into(), 0, "").into(), location: FailureLocation::InRegion { - region: (16, "assign nodes balances per asset").into(), + region: (26, "assign nodes balances per asset").into(), offset: 0 }, cell_values: vec![ @@ -408,7 +381,7 @@ mod test { VerifyFailure::Permutation { column: (Any::advice(), 0).into(), location: FailureLocation::InRegion { - region: (94, "permute state").into(), + region: (127, "permute state").into(), offset: 36 } }, @@ -430,13 +403,9 @@ mod test { let user_index = 0; let merkle_proof = merkle_sum_tree.generate_proof(user_index).unwrap(); - let user_entry = merkle_sum_tree.get_entry(user_index); // Only now we can instantiate the circuit with the actual inputs - let mut circuit = MstInclusionCircuit::::init( - merkle_proof, - user_entry.clone(), - ); + let mut circuit = MstInclusionCircuit::::init(merkle_proof); let instances = circuit.instances(); @@ -451,112 +420,14 @@ mod test { VerifyFailure::Permutation { column: (Any::advice(), 0).into(), location: FailureLocation::InRegion { - region: (94, "permute state").into(), - offset: 36 - } - }, - VerifyFailure::Permutation { - column: (Any::Instance, 0).into(), - location: FailureLocation::OutsideRegion { row: 1 } - }, - ]) - ); - } - - // Adding a balance at the verge of overflowing should fail the range check for any following computed sum and, because we are adding a fake balance. - // Furthermore, the public input check on the root hash and on root_balances[0] should fail too - #[test] - fn test_balance_not_in_range() { - let merkle_sum_tree = - MerkleSumTree::::new("src/merkle_sum_tree/csv/entry_16.csv") - .unwrap(); - - let user_index = 0; - - let merkle_proof = merkle_sum_tree.generate_proof(user_index).unwrap(); - let user_entry = merkle_sum_tree.get_entry(user_index); - - // Only now we can instantiate the circuit with the actual inputs - let mut circuit = MstInclusionCircuit::::init( - merkle_proof, - user_entry.clone(), - ); - - let balance = BigUint::from(2u64).pow(N_BYTES as u32 * 8) - BigUint::from(1u64); - - circuit.path_element_balances[0][0] = big_uint_to_fp(&balance); // 2^64 - 1. It means that as soon as it is summed with the other balances, it will overflow - - let invalid_prover = MockProver::run(K, &circuit, circuit.instances()).unwrap(); - - assert_eq!( - invalid_prover.verify(), - Err(vec![ - VerifyFailure::Permutation { - column: (Any::Fixed, 2).into(), - location: FailureLocation::OutsideRegion { row: 431 } - }, - VerifyFailure::Permutation { - column: (Any::Fixed, 2).into(), - location: FailureLocation::OutsideRegion { row: 739 } - }, - VerifyFailure::Permutation { - column: (Any::Fixed, 2).into(), - location: FailureLocation::OutsideRegion { row: 1047 } - }, - VerifyFailure::Permutation { - column: (Any::Fixed, 2).into(), - location: FailureLocation::OutsideRegion { row: 1355 } - }, - VerifyFailure::Permutation { - column: (Any::advice(), 0).into(), - location: FailureLocation::InRegion { - region: (35, "assign value to perform range check").into(), - offset: 14 - } - }, - VerifyFailure::Permutation { - column: (Any::advice(), 0).into(), - location: FailureLocation::InRegion { - region: (56, "assign value to perform range check").into(), - offset: 14 - } - }, - VerifyFailure::Permutation { - column: (Any::advice(), 0).into(), - location: FailureLocation::InRegion { - region: (77, "assign value to perform range check").into(), - offset: 14 - } - }, - VerifyFailure::Permutation { - column: (Any::advice(), 0).into(), - location: FailureLocation::InRegion { - region: (94, "permute state").into(), + region: (127, "permute state").into(), offset: 36 } }, - VerifyFailure::Permutation { - column: (Any::advice(), 0).into(), - location: FailureLocation::InRegion { - region: (95, "assign value to perform range check").into(), - offset: 0 - } - }, - VerifyFailure::Permutation { - column: (Any::advice(), 0).into(), - location: FailureLocation::InRegion { - region: (95, "assign value to perform range check").into(), - offset: 14 - } - }, VerifyFailure::Permutation { column: (Any::Instance, 0).into(), location: FailureLocation::OutsideRegion { row: 1 } }, - VerifyFailure::Permutation { - column: (Any::Instance, 0).into(), - location: FailureLocation::OutsideRegion { row: 2 } - }, ]) ); } @@ -573,12 +444,8 @@ mod test { let user_index = 0; let merkle_proof = merkle_sum_tree.generate_proof(user_index).unwrap(); - let user_entry = merkle_sum_tree.get_entry(user_index); - let circuit = MstInclusionCircuit::::init( - merkle_proof, - user_entry.clone(), - ); + let circuit = MstInclusionCircuit::::init(merkle_proof); let root = BitMapBackend::new("prints/mst-inclusion-layout.png", (2048, 32768)) .into_drawing_area(); diff --git a/zk_prover/src/merkle_sum_tree/mod.rs b/zk_prover/src/merkle_sum_tree/mod.rs index b756d431..4d2e69c6 100644 --- a/zk_prover/src/merkle_sum_tree/mod.rs +++ b/zk_prover/src/merkle_sum_tree/mod.rs @@ -6,12 +6,23 @@ mod tree; pub mod utils; use halo2_proofs::halo2curves::bn256::Fr as Fp; +/// A struct representing a Merkle Proof. +/// +/// Fields: +/// * `entry`: The entry for which the proof is generated +/// * `root`: The root of the Merkle Sum Tree +/// * `sibling_leaf_node_hash_preimage`: The hash preimage of the sibling leaf node. The hash preimage is equal to `[sibling_username, sibling.balance[0], sibling.balance[1], ... sibling.balance[N_ASSETS - 1]]` +/// * `sibling_middle_node_hash_preimages`: The hash preimages of the sibling middle nodes. The hash preimage is equal to `[sibling_left_child.balance[0] + sibling_right_child.balance[0], sibling_left_child.balance[1] + sibling_right_child.balance[1], ..., sibling_left_child.balance[N_ASSETS - 1] + sibling_right_child.balance[N_ASSETS - 1], sibling_left_child.hash, sibling_right_child.hash]` #[derive(Clone, Debug)] -pub struct MerkleProof { - pub leaf: Node, +pub struct MerkleProof +where + [usize; N_ASSETS + 1]: Sized, + [usize; N_ASSETS + 2]: Sized, +{ + pub entry: Entry, pub root: Node, - pub sibling_hashes: Vec, - pub sibling_sums: Vec<[Fp; N_ASSETS]>, + pub sibling_leaf_node_hash_preimage: [Fp; N_ASSETS + 1], + pub sibling_middle_node_hash_preimages: Vec<[Fp; N_ASSETS + 2]>, pub path_indices: Vec, } @@ -20,4 +31,3 @@ pub use mst::Cryptocurrency; pub use mst::MerkleSumTree; pub use node::Node; pub use tree::Tree; -pub use utils::{big_intify_username, big_uint_to_fp}; diff --git a/zk_prover/src/merkle_sum_tree/mst.rs b/zk_prover/src/merkle_sum_tree/mst.rs index c3f5edf9..3ceb94e8 100644 --- a/zk_prover/src/merkle_sum_tree/mst.rs +++ b/zk_prover/src/merkle_sum_tree/mst.rs @@ -2,14 +2,15 @@ use crate::merkle_sum_tree::utils::{ build_leaves_from_entries, build_merkle_tree_from_leaves, parse_csv_to_entries, }; use crate::merkle_sum_tree::{Entry, Node, Tree}; +use halo2_proofs::halo2curves::bn256::Fr as Fp; use num_bigint::BigUint; /// Merkle Sum Tree Data Structure. /// /// A Merkle Sum Tree is a binary Merkle Tree with the following properties: /// * Each Entry of a Merkle Sum Tree is a pair of a username and #N_ASSETS balances. -/// * Each Leaf Node contains a hash and #N_ASSETS balances. The hash is equal to `H(username, balance[0], balance[1], ... balance[N_ASSETS])`. -/// * Each Middle Node contains a hash and #N_ASSETS balances. The hash is equal to `H(LeftChild.hash, LeftChild.balance[0], LeftChild.balance[1], LeftChild.balance[N_ASSETS], RightChild.hash, RightChild.balance[0], RightChild.balance[1], RightChild.balance[N_ASSETS])`. The balances are equal to the sum of the balances of the child nodes per each cryptocurrency. +/// * Each Leaf Node contains a hash and #N_ASSETS balances. The hash is equal to `H(username, balance[0], balance[1], ... balance[N_ASSETS - 1])`. The balances are equal to the balances associated to the entry +/// * Each Middle Node contains a hash and #N_ASSETS balances. The hash is equal to `H(LeftChild.balance[0] + RightChild.balance[0], LeftChild.balance[1] + RightChild.balance[1], ..., LeftChild.balance[N_ASSETS - 1] + RightChild.balance[N_ASSETS - 1], LeftChild.hash, RightChild.hash)`. The balances are equal to the sum of the balances of the child nodes per each cryptocurrency. /// * The Root Node represents the committed state of the Tree and contains the sum of all the entries' balances per each cryptocurrency. /// /// # Type Parameters @@ -49,6 +50,9 @@ impl Tree &self.entries[index] } + fn entries(&self) -> &[Entry] { + &self.entries + } fn cryptocurrencies(&self) -> &[Cryptocurrency] { &self.cryptocurrencies } @@ -69,7 +73,7 @@ impl MerkleSumTree Result> where [usize; N_ASSETS + 1]: Sized, - [usize; 2 * (1 + N_ASSETS)]: Sized, + [usize; N_ASSETS + 2]: Sized, { let (cryptocurrencies, entries) = parse_csv_to_entries::<&str, N_ASSETS, N_BYTES>(path)?; Self::from_entries(entries, cryptocurrencies, false) @@ -83,7 +87,7 @@ impl MerkleSumTree Result> where [usize; N_ASSETS + 1]: Sized, - [usize; 2 * (1 + N_ASSETS)]: Sized, + [usize; N_ASSETS + 2]: Sized, { let (cryptocurrencies, mut entries) = parse_csv_to_entries::<&str, N_ASSETS, N_BYTES>(path)?; @@ -100,7 +104,7 @@ impl MerkleSumTree Result, Box> where [usize; N_ASSETS + 1]: Sized, - [usize; 2 * (1 + N_ASSETS)]: Sized, + [usize; N_ASSETS + 2]: Sized, { let depth = (entries.len() as f64).log2().ceil() as usize; @@ -137,7 +141,7 @@ impl MerkleSumTree Result, Box> where [usize; N_ASSETS + 1]: Sized, - [usize; 2 * (1 + N_ASSETS)]: Sized, + [usize; N_ASSETS + 2]: Sized, { let index = self.index_of_username(username)?; @@ -151,7 +155,15 @@ impl MerkleSumTree::middle(left_child, right_child); + + let mut hash_preimage = [Fp::zero(); N_ASSETS + 2]; + for (i, balance) in hash_preimage.iter_mut().enumerate().take(N_ASSETS) { + *balance = left_child.balances[i] + right_child.balances[i]; + } + hash_preimage[N_ASSETS] = left_child.hash; + hash_preimage[N_ASSETS + 1] = right_child.hash; + + self.nodes[depth][parent_index] = Node::middle_node_from_preimage(&hash_preimage); current_index = parent_index; } @@ -160,10 +172,6 @@ impl MerkleSumTree &[Entry] { - &self.entries - } - /// Returns the index of the leaf with the matching username pub fn index_of_username(&self, username: &str) -> Result> where diff --git a/zk_prover/src/merkle_sum_tree/node.rs b/zk_prover/src/merkle_sum_tree/node.rs index e4d43a84..19da8f0d 100644 --- a/zk_prover/src/merkle_sum_tree/node.rs +++ b/zk_prover/src/merkle_sum_tree/node.rs @@ -1,36 +1,45 @@ +use crate::chips::poseidon::poseidon_spec::PoseidonSpec; +use crate::merkle_sum_tree::utils::big_uint_to_fp; +use halo2_gadgets::poseidon::primitives::{self as poseidon, ConstantLength}; use halo2_proofs::halo2curves::bn256::Fr as Fp; use num_bigint::BigUint; -use super::{ - big_uint_to_fp, - utils::{poseidon_entry, poseidon_node}, -}; - #[derive(Clone, Debug)] pub struct Node { pub hash: Fp, pub balances: [Fp; N_ASSETS], } impl Node { + /// Builds a leaf-level node of the MST + /// The leaf node hash is equal to `H(username, balance[0], balance[1], ... balance[N_ASSETS - 1])` + /// The balances are equal to `balance[0], balance[1], ... balance[N_ASSETS - 1]` + pub fn leaf(username: &BigUint, balances: &[BigUint; N_ASSETS]) -> Node + where + [usize; N_ASSETS + 1]: Sized, + { + let mut hash_preimage = [Fp::zero(); N_ASSETS + 1]; + hash_preimage[0] = big_uint_to_fp(username); + for (i, balance) in hash_preimage.iter_mut().enumerate().skip(1) { + *balance = big_uint_to_fp(&balances[i - 1]); + } + + Node::leaf_node_from_preimage(&hash_preimage) + } /// Builds a "middle" (non-leaf-level) node of the MST + /// The middle node hash is equal to `H(LeftChild.balance[0] + RightChild.balance[0], LeftChild.balance[1] + RightChild.balance[1], ..., LeftChild.balance[N_ASSETS - 1] + RightChild.balance[N_ASSETS - 1], LeftChild.hash, RightChild.hash)` + /// The balances are equal to `LeftChild.balance[0] + RightChild.balance[0], LeftChild.balance[1] + RightChild.balance[1], ..., LeftChild.balance[N_ASSETS - 1] + RightChild.balance[N_ASSETS - 1]` pub fn middle(child_l: &Node, child_r: &Node) -> Node where - [usize; 2 * (1 + N_ASSETS)]: Sized, + [(); N_ASSETS + 2]: Sized, { - let mut balances_sum = [Fp::zero(); N_ASSETS]; - for (i, balance) in balances_sum.iter_mut().enumerate() { + let mut hash_preimage = [Fp::zero(); N_ASSETS + 2]; + for (i, balance) in hash_preimage.iter_mut().enumerate().take(N_ASSETS) { *balance = child_l.balances[i] + child_r.balances[i]; } + hash_preimage[N_ASSETS] = child_l.hash; + hash_preimage[N_ASSETS + 1] = child_r.hash; - Node { - hash: poseidon_node( - child_l.hash, - child_l.balances, - child_r.hash, - child_r.balances, - ), - balances: balances_sum, - } + Node::middle_node_from_preimage(&hash_preimage) } pub fn init_empty() -> Node @@ -43,28 +52,61 @@ impl Node { } } - /// Builds a leaf-level node of the MST - pub fn leaf(username: &BigUint, balances: &[BigUint; N_ASSETS]) -> Node + pub fn leaf_node_from_preimage(preimage: &[Fp; N_ASSETS + 1]) -> Node where [usize; N_ASSETS + 1]: Sized, { Node { - hash: poseidon_entry::( - big_uint_to_fp(username), - balances - .iter() - .map(big_uint_to_fp) - .collect::>() - .try_into() - .unwrap(), + hash: Self::poseidon_hash_leaf(preimage[0], preimage[1..].try_into().unwrap()), + balances: preimage[1..].try_into().unwrap(), + } + } + + /// Builds a middle-level node of the MST + /// The hash preimage must be equal to `LeftChild.balance[0] + RightChild.balance[0], LeftChild.balance[1] + RightChild.balance[1], ..., LeftChild.balance[N_ASSETS - 1] + RightChild.balance[N_ASSETS - 1], LeftChild.hash, RightChild.hash` + /// The balances are equal to `LeftChild.balance[0] + RightChild.balance[0], LeftChild.balance[1] + RightChild.balance[1], ..., LeftChild.balance[N_ASSETS - 1] + RightChild.balance[N_ASSETS - 1]` + pub fn middle_node_from_preimage(preimage: &[Fp; N_ASSETS + 2]) -> Node + where + [usize; N_ASSETS + 2]: Sized, + { + Node { + hash: Self::poseidon_hash_middle( + preimage[0..N_ASSETS].try_into().unwrap(), + preimage[N_ASSETS], + preimage[N_ASSETS + 1], ), - //Map the array of balances using big_int_to_fp: - balances: balances - .iter() - .map(big_uint_to_fp) - .collect::>() - .try_into() - .unwrap(), + balances: preimage[0..N_ASSETS].try_into().unwrap(), } } + + fn poseidon_hash_middle( + balances_sum: [Fp; N_ASSETS], + hash_child_left: Fp, + hash_child_right: Fp, + ) -> Fp + where + [usize; N_ASSETS + 2]: Sized, + { + let mut hash_inputs: [Fp; N_ASSETS + 2] = [Fp::zero(); N_ASSETS + 2]; + + hash_inputs[0..N_ASSETS].copy_from_slice(&balances_sum); + hash_inputs[N_ASSETS] = hash_child_left; + hash_inputs[N_ASSETS + 1] = hash_child_right; + + poseidon::Hash::, 2, 1>::init() + .hash(hash_inputs) + } + + fn poseidon_hash_leaf(username: Fp, balances: [Fp; N_ASSETS]) -> Fp + where + [usize; N_ASSETS + 1]: Sized, + { + let mut hash_inputs: [Fp; N_ASSETS + 1] = [Fp::zero(); N_ASSETS + 1]; + + hash_inputs[0] = username; + hash_inputs[1..N_ASSETS + 1].copy_from_slice(&balances); + + poseidon::Hash::, 2, 1>::init() + .hash(hash_inputs) + } } diff --git a/zk_prover/src/merkle_sum_tree/tests.rs b/zk_prover/src/merkle_sum_tree/tests.rs index 81d0fedf..c00b672b 100644 --- a/zk_prover/src/merkle_sum_tree/tests.rs +++ b/zk_prover/src/merkle_sum_tree/tests.rs @@ -2,8 +2,9 @@ mod test { use crate::merkle_sum_tree::utils::big_uint_to_fp; - use crate::merkle_sum_tree::{Entry, MerkleSumTree, Tree}; + use crate::merkle_sum_tree::{Entry, MerkleSumTree, Node, Tree}; use num_bigint::{BigUint, ToBigUint}; + use rand::Rng as _; const N_ASSETS: usize = 2; const N_BYTES: usize = 8; @@ -56,19 +57,15 @@ mod test { [35479.to_biguint().unwrap(), 35479.to_biguint().unwrap()], ) .unwrap(); - let invalid_leaf = invalid_entry.compute_leaf(); + let invalid_entry = invalid_entry; let mut proof_invalid_1 = proof.clone(); - proof_invalid_1.leaf = invalid_leaf; + proof_invalid_1.entry = invalid_entry; assert!(!merkle_tree.verify_proof(&proof_invalid_1)); // shouldn't verify a proof with a wrong root hash let mut proof_invalid_2 = proof.clone(); proof_invalid_2.root.hash = 0.into(); assert!(!merkle_tree.verify_proof(&proof_invalid_2)); - - // shouldn't verify a proof with a wrong computed balance - let mut proof_invalid_3 = proof; - proof_invalid_3.sibling_sums[0] = [0.into(), 0.into()]; } #[test] @@ -197,4 +194,56 @@ mod test { let fp_3 = fp_2 - fp; assert_eq!(fp_3, 18446744073709551613.into()); } + + #[test] + fn get_middle_node_hash_preimage() { + let merkle_tree = + MerkleSumTree::::new("src/merkle_sum_tree/csv/entry_16.csv") + .unwrap(); + + let depth = *merkle_tree.depth(); + + // The tree has 16 leaves, so the levels are 0, 1, 2, 3, 4. Where level 0 is the leaves and level 4 is the root + // Fetch a random level from 1 to depth + let mut rng = rand::thread_rng(); + let level = rng.gen_range(1..depth); + + // Fetch a random index inside the level. For example level 1 has 8 nodes, so the index can be 0, 1, 2, 3, 4, 5, 6, 7 + let index = rng.gen_range(0..merkle_tree.nodes()[level].len()); + + // Fetch middle node with index from level + let middle_node = merkle_tree.nodes()[level][index].clone(); + + // Fetch the hash preimage of the middle node + let hash_preimage = merkle_tree + .get_middle_node_hash_preimage(level, index) + .unwrap(); + + let computed_middle_node = Node::::middle_node_from_preimage(&hash_preimage); + + // The hash of the middle node should match the hash computed from the hash preimage + assert_eq!(middle_node.hash, computed_middle_node.hash); + } + + #[test] + fn get_leaf_node_hash_preimage() { + let merkle_tree = + MerkleSumTree::::new("src/merkle_sum_tree/csv/entry_16.csv") + .unwrap(); + + // Generate a random number between 0 and 15 + let mut rng = rand::thread_rng(); + let index = rng.gen_range(0..16); + + // Fetch leaf with index + let leaf = merkle_tree.leaves()[index].clone(); + + // Fetch the hash preimage of the leaf + let hash_preimage = merkle_tree.get_leaf_node_hash_preimage(index).unwrap(); + + let computed_leaf = Node::::leaf_node_from_preimage(&hash_preimage); + + // The hash of the leaf should match the hash computed from the hash preimage + assert_eq!(leaf.hash, computed_leaf.hash); + } } diff --git a/zk_prover/src/merkle_sum_tree/tree.rs b/zk_prover/src/merkle_sum_tree/tree.rs index bdec2547..7f7fb3ba 100644 --- a/zk_prover/src/merkle_sum_tree/tree.rs +++ b/zk_prover/src/merkle_sum_tree/tree.rs @@ -1,8 +1,8 @@ +use crate::merkle_sum_tree::utils::big_uint_to_fp; +use crate::merkle_sum_tree::Cryptocurrency; use crate::merkle_sum_tree::{Entry, MerkleProof, Node}; use halo2_proofs::halo2curves::bn256::Fr as Fp; -use crate::merkle_sum_tree::Cryptocurrency; - /// A trait representing the basic operations for a Merkle-Sum-like Tree. pub trait Tree { /// Returns a reference to the root node. @@ -22,44 +22,121 @@ pub trait Tree { fn get_entry(&self, index: usize) -> &Entry; + fn entries(&self) -> &[Entry]; + + /// Returns the hash preimage of a middle node. + fn get_middle_node_hash_preimage( + &self, + level: usize, + index: usize, + ) -> Result<[Fp; N_ASSETS + 2], Box> + where + [usize; N_ASSETS + 2]: Sized, + { + if level == 0 || level > *self.depth() { + return Err(Box::from("Invalid depth")); + } + + self.nodes() + .get(level) + .and_then(|layer| layer.get(index)) + .ok_or_else(|| Box::::from("Node not found"))?; + + // Assuming the left and right children are stored in order + let left_child = &self.nodes()[level - 1][2 * index]; + let right_child = &self.nodes()[level - 1][2 * index + 1]; + + // Constructing preimage + let mut preimage = [Fp::zero(); N_ASSETS + 2]; + + // for each balance in the left and right child, add them together and store in preimage + for (i, balance) in preimage.iter_mut().enumerate().take(N_ASSETS) { + *balance = left_child.balances[i] + right_child.balances[i]; + } + + // Add left and right child hashes to preimage + preimage[N_ASSETS] = left_child.hash; + preimage[N_ASSETS + 1] = right_child.hash; + + Ok(preimage) + } + + /// Returns the hash preimage of a leaf node. + fn get_leaf_node_hash_preimage( + &self, + index: usize, + ) -> Result<[Fp; N_ASSETS + 1], Box> + where + [usize; N_ASSETS + 1]: Sized, + { + // Fetch entry corresponding to index + let entry = self + .entries() + .get(index) + .ok_or_else(|| Box::::from("Node not found"))?; + + // Constructing preimage + let mut preimage = [Fp::zero(); N_ASSETS + 1]; + + // Add username to preimage + preimage[0] = big_uint_to_fp(entry.username_as_big_uint()); + + // Add balances to preimage + for (i, balance) in preimage.iter_mut().enumerate().skip(1).take(N_ASSETS) { + *balance = big_uint_to_fp(&entry.balances()[i - 1]); + } + + Ok(preimage) + } + /// Generates a MerkleProof for the user with the given index. - fn generate_proof(&self, index: usize) -> Result, &'static str> { + fn generate_proof( + &self, + index: usize, + ) -> Result, Box> + where + [usize; N_ASSETS + 1]: Sized, + [usize; N_ASSETS + 2]: Sized, + { let nodes = self.nodes(); let depth = *self.depth(); let root = self.root(); if index >= nodes[0].len() { - return Err("The leaf does not exist in this tree"); + return Err(Box::from("Index out of bounds")); } - let mut sibling_hashes = vec![Fp::from(0); depth]; - let mut sibling_sums = vec![[Fp::from(0); N_ASSETS]; depth]; - let mut path_indices = vec![Fp::from(0); depth]; - let mut current_index = index; + let mut sibling_middle_node_hash_preimages = Vec::with_capacity(depth - 1); - let leaf = &nodes[0][index]; + let sibling_leaf_index = if index % 2 == 0 { index + 1 } else { index - 1 }; + + let sibling_leaf_node_hash_preimage: [Fp; N_ASSETS + 1] = + self.get_leaf_node_hash_preimage(sibling_leaf_index)?; + let mut path_indices = vec![Fp::zero(); depth]; + let mut current_index = index; for level in 0..depth { let position = current_index % 2; - let level_start_index = current_index - position; - let level_end_index = level_start_index + 2; - - path_indices[level] = Fp::from(position as u64); + let sibling_index = current_index - position + (1 - position); - for i in level_start_index..level_end_index { - if i != current_index { - sibling_hashes[level] = nodes[level][i].hash; - sibling_sums[level] = nodes[level][i].balances; - } + if sibling_index < nodes[level].len() && level != 0 { + // Fetch hash preimage for sibling middle nodes + let sibling_node_preimage = + self.get_middle_node_hash_preimage(level, sibling_index)?; + sibling_middle_node_hash_preimages.push(sibling_node_preimage); } + + path_indices[level] = Fp::from(position as u64); current_index /= 2; } + let entry = self.get_entry(index).clone(); + Ok(MerkleProof { - leaf: leaf.clone(), + entry, root: root.clone(), - sibling_hashes, - sibling_sums, + sibling_leaf_node_hash_preimage, + sibling_middle_node_hash_preimages, path_indices, }) } @@ -68,20 +145,46 @@ pub trait Tree { fn verify_proof(&self, proof: &MerkleProof) -> bool where [usize; N_ASSETS + 1]: Sized, - [usize; 2 * (1 + N_ASSETS)]: Sized, + [usize; N_ASSETS + 2]: Sized, { - let mut node = proof.leaf.clone(); + let mut node = proof.entry.compute_leaf(); + + let sibling_leaf_node = + Node::::leaf_node_from_preimage(&proof.sibling_leaf_node_hash_preimage); - for i in 0..proof.sibling_hashes.len() { - let sibling_node = Node { - hash: proof.sibling_hashes[i], - balances: proof.sibling_sums[i], - }; + let mut hash_preimage = [Fp::zero(); N_ASSETS + 2]; + for (i, balance) in hash_preimage.iter_mut().enumerate().take(N_ASSETS) { + *balance = node.balances[i] + sibling_leaf_node.balances[i]; + } + + if proof.path_indices[0] == 0.into() { + hash_preimage[N_ASSETS] = node.hash; + hash_preimage[N_ASSETS + 1] = sibling_leaf_node.hash; + node = Node::middle_node_from_preimage(&hash_preimage); + } else { + hash_preimage[N_ASSETS] = sibling_leaf_node.hash; + hash_preimage[N_ASSETS + 1] = node.hash; + node = Node::middle_node_from_preimage(&hash_preimage); + } + + for i in 1..proof.path_indices.len() { + let sibling_node = Node::::middle_node_from_preimage( + &proof.sibling_middle_node_hash_preimages[i - 1], + ); + + let mut hash_preimage = [Fp::zero(); N_ASSETS + 2]; + for (i, balance) in hash_preimage.iter_mut().enumerate().take(N_ASSETS) { + *balance = node.balances[i] + sibling_node.balances[i]; + } if proof.path_indices[i] == 0.into() { - node = Node::middle(&node, &sibling_node); + hash_preimage[N_ASSETS] = node.hash; + hash_preimage[N_ASSETS + 1] = sibling_node.hash; + node = Node::middle_node_from_preimage(&hash_preimage); } else { - node = Node::middle(&sibling_node, &node); + hash_preimage[N_ASSETS] = sibling_node.hash; + hash_preimage[N_ASSETS + 1] = node.hash; + node = Node::middle_node_from_preimage(&hash_preimage); } } diff --git a/zk_prover/src/merkle_sum_tree/utils/build_tree.rs b/zk_prover/src/merkle_sum_tree/utils/build_tree.rs index 8e186478..8d63e22f 100644 --- a/zk_prover/src/merkle_sum_tree/utils/build_tree.rs +++ b/zk_prover/src/merkle_sum_tree/utils/build_tree.rs @@ -9,7 +9,7 @@ pub fn build_merkle_tree_from_leaves( ) -> Result, Box> where [usize; N_ASSETS + 1]: Sized, - [usize; 2 * (1 + N_ASSETS)]: Sized, + [usize; N_ASSETS + 2]: Sized, { let n = leaves.len(); @@ -65,12 +65,23 @@ where fn build_middle_level(level: usize, tree: &mut [Vec>]) where - [usize; 2 * (1 + N_ASSETS)]: Sized, + [usize; N_ASSETS + 2]: Sized, { let results: Vec> = (0..tree[level - 1].len()) .into_par_iter() .step_by(2) - .map(|index| Node::middle(&tree[level - 1][index], &tree[level - 1][index + 1])) + .map(|index| { + let mut hash_preimage = [Fp::zero(); N_ASSETS + 2]; + + for (i, balance) in hash_preimage.iter_mut().enumerate().take(N_ASSETS) { + *balance = + tree[level - 1][index].balances[i] + tree[level - 1][index + 1].balances[i]; + } + + hash_preimage[N_ASSETS] = tree[level - 1][index].hash; + hash_preimage[N_ASSETS + 1] = tree[level - 1][index + 1].hash; + Node::middle_node_from_preimage(&hash_preimage) + }) .collect(); for (index, new_node) in results.into_iter().enumerate() { diff --git a/zk_prover/src/merkle_sum_tree/utils/generate_leaf_hash.rs b/zk_prover/src/merkle_sum_tree/utils/generate_leaf_hash.rs deleted file mode 100644 index 13b264ba..00000000 --- a/zk_prover/src/merkle_sum_tree/utils/generate_leaf_hash.rs +++ /dev/null @@ -1,19 +0,0 @@ -use ethers::types::U256; -use num_bigint::BigUint; - -use crate::merkle_sum_tree::Entry; - -pub fn generate_leaf_hash(user_name: String, balances: Vec) -> U256 -where - [usize; N_ASSETS + 1]: Sized, -{ - // Convert usize to BigInt for the `Entry` struct - let balances_big_uint: Vec = balances.into_iter().map(BigUint::from).collect(); - - let entry: Entry = - Entry::new(user_name, balances_big_uint.try_into().unwrap()).unwrap(); - - // Convert Fp to U256 - let hash_str = format!("{:?}", entry.compute_leaf().hash); - U256::from_str_radix(&hash_str, 16).unwrap() -} diff --git a/zk_prover/src/merkle_sum_tree/utils/hash.rs b/zk_prover/src/merkle_sum_tree/utils/hash.rs deleted file mode 100644 index bb9b0640..00000000 --- a/zk_prover/src/merkle_sum_tree/utils/hash.rs +++ /dev/null @@ -1,36 +0,0 @@ -use crate::chips::poseidon::poseidon_spec::PoseidonSpec; -use halo2_gadgets::poseidon::primitives::{self as poseidon, ConstantLength}; -use halo2_proofs::halo2curves::bn256::Fr as Fp; - -pub fn poseidon_node( - l1: Fp, - l2: [Fp; N_ASSETS], - r1: Fp, - r2: [Fp; N_ASSETS], -) -> Fp -where - [usize; 2 * (1 + N_ASSETS)]: Sized, -{ - let mut hash_inputs: [Fp; 2 * (1 + N_ASSETS)] = [Fp::zero(); 2 * (1 + N_ASSETS)]; - - hash_inputs[0] = l1; - hash_inputs[1..N_ASSETS + 1].copy_from_slice(&l2); - hash_inputs[N_ASSETS + 1] = r1; - hash_inputs[N_ASSETS + 2..2 * N_ASSETS + 2].copy_from_slice(&r2); - - poseidon::Hash::, 2, 1>::init() - .hash(hash_inputs) -} - -pub fn poseidon_entry(left: Fp, right: [Fp; N_ASSETS]) -> Fp -where - [usize; N_ASSETS + 1]: Sized, -{ - let mut hash_inputs: [Fp; N_ASSETS + 1] = [Fp::zero(); N_ASSETS + 1]; - - hash_inputs[0] = left; - hash_inputs[1..N_ASSETS + 1].copy_from_slice(&right); - - poseidon::Hash::, 2, 1>::init() - .hash(hash_inputs) -} diff --git a/zk_prover/src/merkle_sum_tree/utils/mod.rs b/zk_prover/src/merkle_sum_tree/utils/mod.rs index 210eb55d..c4f0a33e 100644 --- a/zk_prover/src/merkle_sum_tree/utils/mod.rs +++ b/zk_prover/src/merkle_sum_tree/utils/mod.rs @@ -1,11 +1,7 @@ mod build_tree; mod csv_parser; -mod generate_leaf_hash; -mod hash; mod operation_helpers; pub use build_tree::{build_leaves_from_entries, build_merkle_tree_from_leaves}; pub use csv_parser::parse_csv_to_entries; -pub use generate_leaf_hash::generate_leaf_hash; -pub use hash::{poseidon_entry, poseidon_node}; pub use operation_helpers::*;